diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000..4e1edd14
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,12 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+indent_style = tab
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/.gitignore b/.gitignore
index 47ac71d9..702252a3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,5 @@
.DS_Store
node_modules
-/public/img/ignore/
-/public/3dtiles/
-/public/cesium/
-/public/data/
-/public/glb/
/dist
.VSCodeCounter/
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000..10497b11
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 caoqianming
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..e69de29b
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 00000000..e9558405
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ presets: [
+ '@vue/cli-plugin-babel/preset'
+ ]
+}
diff --git a/jsconfig.json b/jsconfig.json
new file mode 100644
index 00000000..654309ec
--- /dev/null
+++ b/jsconfig.json
@@ -0,0 +1,17 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "module": "esnext",
+ "baseUrl": "./",
+ "moduleResolution": "node",
+ "paths": {
+ "@/*": ["src/*"]
+ },
+ "lib": [
+ "esnext",
+ "dom",
+ "dom.iterable",
+ "scripthost"
+ ]
+ }
+}
diff --git a/npm b/npm
new file mode 100644
index 00000000..e69de29b
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..ad3435fc
--- /dev/null
+++ b/package.json
@@ -0,0 +1,77 @@
+{
+ "name": "scui",
+ "version": "1.6.9",
+ "private": true,
+ "scripts": {
+ "serve": "vue-cli-service serve",
+ "build": "vue-cli-service build --report",
+ "lint": "vue-cli-service lint"
+ },
+ "dependencies": {
+ "@element-plus/icons-vue": "2.0.10",
+ "axios": "1.3.4",
+ "core-js": "3.29.0",
+ "cropperjs": "1.5.13",
+ "crypto-browserify": "^3.12.0",
+ "crypto-js": "4.1.1",
+ "d3": "^7.6.1",
+ "dagre": "^0.8.5",
+ "dagre-d3": "^0.6.4",
+ "echarts": "5.4.1",
+ "element-plus": "^2.7.4",
+ "file-saver": "^2.0.5",
+ "node-polyfill-webpack-plugin": "^4.0.0",
+ "nprogress": "0.2.0",
+ "sortablejs": "1.15.0",
+ "tinymce": "6.3.2",
+ "vue": "3.2.47",
+ "vue-i18n": "9.2.2",
+ "vue-router": "4.1.6",
+ "vuedraggable": "4.0.3",
+ "vuex": "4.1.0",
+ "xlsx": "^0.18.5",
+ "xlsx-style": "^0.8.13"
+ },
+ "devDependencies": {
+ "@babel/core": "7.21.00",
+ "@babel/eslint-parser": "7.19.1",
+ "@vue/cli-plugin-babel": "5.0.8",
+ "@vue/cli-plugin-eslint": "5.0.8",
+ "@vue/cli-service": "5.0.8",
+ "eslint": "8.35.0",
+ "eslint-plugin-vue": "9.9.0",
+ "sass": "1.58.3",
+ "sass-loader": "10.1.1"
+ },
+ "eslintConfig": {
+ "root": true,
+ "env": {
+ "node": true
+ },
+ "globals": {
+ "APP_CONFIG": true
+ },
+ "extends": [
+ "plugin:vue/vue3-essential"
+ ],
+ "parserOptions": {
+ "parser": "@babel/eslint-parser"
+ },
+ "rules": {
+ "indent": 0,
+ "no-tabs": 0,
+ "no-mixed-spaces-and-tabs": 0,
+ "vue/no-unused-components": 0,
+ "vue/multi-word-component-names": 0,
+ "no-debugger": "off",
+ "no-console": "off",
+ "no-trailing-spaces": "off"
+ }
+ },
+ "browserslist": [
+ "> 1%",
+ "last 2 versions",
+ "not dead",
+ "not ie 11"
+ ]
+}
diff --git a/public/config.js b/public/config.js
new file mode 100644
index 00000000..306b79f3
--- /dev/null
+++ b/public/config.js
@@ -0,0 +1,11 @@
+
+// 此文件非必要,在生产环境下此文件配置可覆盖运行配置,开发环境下不起效
+// 详情见 src/config/index.js
+
+const APP_CONFIG = {
+ //标题
+ //APP_NAME: "SCUI",
+
+ //接口地址,如遇跨域需使用nginx代理
+ //API_URL: "https://www.fastmock.site/mock/5039c4361c39a7e3252c5b55971f1bd3/api"
+}
diff --git a/public/img/404.png b/public/img/404.png
new file mode 100644
index 00000000..47197ec7
Binary files /dev/null and b/public/img/404.png differ
diff --git a/public/index.html b/public/index.html
new file mode 100644
index 00000000..bdd13ae1
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <%= VUE_APP_TITLE %>
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+ <%= VUE_APP_TITLE %>
+
+
+
+
+
+
+
+
当前使用的浏览器内核版本过低 :(
+
当前版本:-- --
+
最低版本要求:Chrome 71+、Firefox
+ 65+、Safari 12+、Edge 97+。
+
+ 请升级浏览器版本,或更换现代浏览器,如果你使用的是双核浏览器,请切换到极速/高速模式。
+
+
+
+
diff --git a/public/tinymce/langs/zh_CN.js b/public/tinymce/langs/zh_CN.js
new file mode 100644
index 00000000..89b106c2
--- /dev/null
+++ b/public/tinymce/langs/zh_CN.js
@@ -0,0 +1,419 @@
+tinymce.addI18n('zh_CN',{
+"Redo": "\u91cd\u505a",
+"Undo": "\u64a4\u9500",
+"Cut": "\u526a\u5207",
+"Copy": "\u590d\u5236",
+"Paste": "\u7c98\u8d34",
+"Select all": "\u5168\u9009",
+"New document": "\u65b0\u6587\u4ef6",
+"Ok": "\u786e\u5b9a",
+"Cancel": "\u53d6\u6d88",
+"Visual aids": "\u7f51\u683c\u7ebf",
+"Bold": "\u7c97\u4f53",
+"Italic": "\u659c\u4f53",
+"Underline": "\u4e0b\u5212\u7ebf",
+"Strikethrough": "\u5220\u9664\u7ebf",
+"Superscript": "\u4e0a\u6807",
+"Subscript": "\u4e0b\u6807",
+"Clear formatting": "\u6e05\u9664\u683c\u5f0f",
+"Align left": "\u5de6\u8fb9\u5bf9\u9f50",
+"Align center": "\u4e2d\u95f4\u5bf9\u9f50",
+"Align right": "\u53f3\u8fb9\u5bf9\u9f50",
+"Justify": "\u4e24\u7aef\u5bf9\u9f50",
+"Bullet list": "\u9879\u76ee\u7b26\u53f7",
+"Numbered list": "\u7f16\u53f7\u5217\u8868",
+"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb",
+"Increase indent": "\u589e\u52a0\u7f29\u8fdb",
+"Close": "\u5173\u95ed",
+"Formats": "\u683c\u5f0f",
+"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002",
+"Headers": "\u6807\u9898",
+"Header 1": "\u6807\u98981",
+"Header 2": "\u6807\u98982",
+"Header 3": "\u6807\u98983",
+"Header 4": "\u6807\u98984",
+"Header 5": "\u6807\u98985",
+"Header 6": "\u6807\u98986",
+"Headings": "\u6807\u9898",
+"Heading 1": "\u6807\u98981",
+"Heading 2": "\u6807\u98982",
+"Heading 3": "\u6807\u98983",
+"Heading 4": "\u6807\u98984",
+"Heading 5": "\u6807\u98985",
+"Heading 6": "\u6807\u98986",
+"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684",
+"Div": "Div",
+"Pre": "Pre",
+"Code": "\u4ee3\u7801",
+"Paragraph": "\u6bb5\u843d",
+"Blockquote": "\u5f15\u6587\u533a\u5757",
+"Inline": "\u6587\u672c",
+"Blocks": "\u57fa\u5757",
+"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002",
+"Fonts": "\u5b57\u4f53",
+"Font Sizes": "\u5b57\u53f7",
+"Class": "\u7c7b\u578b",
+"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf",
+"OR": "\u6216",
+"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64",
+"Upload": "\u4e0a\u4f20",
+"Block": "\u5757",
+"Align": "\u5bf9\u9f50",
+"Default": "\u9ed8\u8ba4",
+"Circle": "\u7a7a\u5fc3\u5706",
+"Disc": "\u5b9e\u5fc3\u5706",
+"Square": "\u65b9\u5757",
+"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd",
+"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd",
+"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd",
+"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd",
+"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd",
+"Anchor...": "\u951a\u70b9...",
+"Name": "\u540d\u79f0",
+"Id": "\u6807\u8bc6\u7b26",
+"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002",
+"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f",
+"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f",
+"Special character...": "\u7279\u6b8a\u5b57\u7b26...",
+"Source code": "\u6e90\u4ee3\u7801",
+"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b",
+"Language": "\u8bed\u8a00",
+"Code sample...": "\u793a\u4f8b\u4ee3\u7801...",
+"Color Picker": "\u9009\u8272\u5668",
+"R": "R",
+"G": "G",
+"B": "B",
+"Left to right": "\u4ece\u5de6\u5230\u53f3",
+"Right to left": "\u4ece\u53f3\u5230\u5de6",
+"Emoticons...": "\u8868\u60c5\u7b26\u53f7...",
+"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027",
+"Title": "\u6807\u9898",
+"Keywords": "\u5173\u952e\u8bcd",
+"Description": "\u63cf\u8ff0",
+"Robots": "\u673a\u5668\u4eba",
+"Author": "\u4f5c\u8005",
+"Encoding": "\u7f16\u7801",
+"Fullscreen": "\u5168\u5c4f",
+"Action": "\u64cd\u4f5c",
+"Shortcut": "\u5feb\u6377\u952e",
+"Help": "\u5e2e\u52a9",
+"Address": "\u5730\u5740",
+"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f",
+"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f",
+"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84",
+"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355",
+"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
+"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
+"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
+"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):",
+"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a",
+"Learn more...": "\u4e86\u89e3\u66f4\u591a...",
+"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}",
+"Plugins": "\u63d2\u4ef6",
+"Handy Shortcuts": "\u5feb\u6377\u952e",
+"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf",
+"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247",
+"Image description": "\u56fe\u7247\u63cf\u8ff0",
+"Source": "\u5730\u5740",
+"Dimensions": "\u5927\u5c0f",
+"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4",
+"General": "\u666e\u901a",
+"Advanced": "\u9ad8\u7ea7",
+"Style": "\u6837\u5f0f",
+"Vertical space": "\u5782\u76f4\u8fb9\u8ddd",
+"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd",
+"Border": "\u8fb9\u6846",
+"Insert image": "\u63d2\u5165\u56fe\u7247",
+"Image...": "\u56fe\u7247...",
+"Image list": "\u56fe\u7247\u5217\u8868",
+"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c",
+"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c",
+"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c",
+"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c",
+"Edit image": "\u7f16\u8f91\u56fe\u7247",
+"Image options": "\u56fe\u7247\u9009\u9879",
+"Zoom in": "\u653e\u5927",
+"Zoom out": "\u7f29\u5c0f",
+"Crop": "\u88c1\u526a",
+"Resize": "\u8c03\u6574\u5927\u5c0f",
+"Orientation": "\u65b9\u5411",
+"Brightness": "\u4eae\u5ea6",
+"Sharpen": "\u9510\u5316",
+"Contrast": "\u5bf9\u6bd4\u5ea6",
+"Color levels": "\u989c\u8272\u5c42\u6b21",
+"Gamma": "\u4f3d\u9a6c\u503c",
+"Invert": "\u53cd\u8f6c",
+"Apply": "\u5e94\u7528",
+"Back": "\u540e\u9000",
+"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4",
+"Date\/time": "\u65e5\u671f\/\u65f6\u95f4",
+"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
+"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
+"Text to display": "\u663e\u793a\u6587\u5b57",
+"Url": "\u5730\u5740",
+"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...",
+"Current window": "\u5f53\u524d\u7a97\u53e3",
+"None": "\u65e0",
+"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00",
+"Remove link": "\u5220\u9664\u94fe\u63a5",
+"Anchors": "\u951a\u70b9",
+"Link...": "\u94fe\u63a5...",
+"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5",
+"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f",
+"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f",
+"Link list": "\u94fe\u63a5\u5217\u8868",
+"Insert video": "\u63d2\u5165\u89c6\u9891",
+"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891",
+"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53",
+"Alternative source": "\u955c\u50cf",
+"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740",
+"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)",
+"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:",
+"Embed": "\u5185\u5d4c",
+"Media...": "\u591a\u5a92\u4f53...",
+"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c",
+"Page break": "\u5206\u9875\u7b26",
+"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c",
+"Preview": "\u9884\u89c8",
+"Print...": "\u6253\u5370...",
+"Save": "\u4fdd\u5b58",
+"Find": "\u67e5\u627e",
+"Replace with": "\u66ff\u6362\u4e3a",
+"Replace": "\u66ff\u6362",
+"Replace all": "\u5168\u90e8\u66ff\u6362",
+"Previous": "\u4e0a\u4e00\u4e2a",
+"Next": "\u4e0b\u4e00\u4e2a",
+"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...",
+"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.",
+"Match case": "\u533a\u5206\u5927\u5c0f\u5199",
+"Find whole words only": "\u5168\u5b57\u5339\u914d",
+"Spell check": "\u62fc\u5199\u68c0\u67e5",
+"Ignore": "\u5ffd\u7565",
+"Ignore all": "\u5168\u90e8\u5ffd\u7565",
+"Finish": "\u5b8c\u6210",
+"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178",
+"Insert table": "\u63d2\u5165\u8868\u683c",
+"Table properties": "\u8868\u683c\u5c5e\u6027",
+"Delete table": "\u5220\u9664\u8868\u683c",
+"Cell": "\u5355\u5143\u683c",
+"Row": "\u884c",
+"Column": "\u5217",
+"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027",
+"Merge cells": "\u5408\u5e76\u5355\u5143\u683c",
+"Split cell": "\u62c6\u5206\u5355\u5143\u683c",
+"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165",
+"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165",
+"Delete row": "\u5220\u9664\u884c",
+"Row properties": "\u884c\u5c5e\u6027",
+"Cut row": "\u526a\u5207\u884c",
+"Copy row": "\u590d\u5236\u884c",
+"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9",
+"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9",
+"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165",
+"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165",
+"Delete column": "\u5220\u9664\u5217",
+"Cols": "\u5217",
+"Rows": "\u884c",
+"Width": "\u5bbd",
+"Height": "\u9ad8",
+"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd",
+"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd",
+"Show caption": "\u663e\u793a\u6807\u9898",
+"Left": "\u5de6\u5bf9\u9f50",
+"Center": "\u5c45\u4e2d",
+"Right": "\u53f3\u5bf9\u9f50",
+"Cell type": "\u5355\u5143\u683c\u7c7b\u578b",
+"Scope": "\u8303\u56f4",
+"Alignment": "\u5bf9\u9f50\u65b9\u5f0f",
+"H Align": "\u6c34\u5e73\u5bf9\u9f50",
+"V Align": "\u5782\u76f4\u5bf9\u9f50",
+"Top": "\u9876\u90e8\u5bf9\u9f50",
+"Middle": "\u5782\u76f4\u5c45\u4e2d",
+"Bottom": "\u5e95\u90e8\u5bf9\u9f50",
+"Header cell": "\u8868\u5934\u5355\u5143\u683c",
+"Row group": "\u884c\u7ec4",
+"Column group": "\u5217\u7ec4",
+"Row type": "\u884c\u7c7b\u578b",
+"Header": "\u8868\u5934",
+"Body": "\u8868\u4f53",
+"Footer": "\u8868\u5c3e",
+"Border color": "\u8fb9\u6846\u989c\u8272",
+"Insert template...": "\u63d2\u5165\u6a21\u677f...",
+"Templates": "\u6a21\u677f",
+"Template": "\u6a21\u677f",
+"Text color": "\u6587\u5b57\u989c\u8272",
+"Background color": "\u80cc\u666f\u8272",
+"Custom...": "\u81ea\u5b9a\u4e49...",
+"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272",
+"No color": "\u65e0",
+"Remove color": "\u79fb\u9664\u989c\u8272",
+"Table of Contents": "\u5185\u5bb9\u5217\u8868",
+"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846",
+"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26",
+"Word count": "\u5b57\u6570",
+"Count": "\u8ba1\u6570",
+"Document": "\u6587\u6863",
+"Selection": "\u9009\u62e9",
+"Words": "\u5355\u8bcd",
+"Words: {0}": "\u5b57\u6570\uff1a{0}",
+"{0} words": "{0} \u5b57",
+"File": "\u6587\u4ef6",
+"Edit": "\u7f16\u8f91",
+"Insert": "\u63d2\u5165",
+"View": "\u89c6\u56fe",
+"Format": "\u683c\u5f0f",
+"Table": "\u8868\u683c",
+"Tools": "\u5de5\u5177",
+"Powered by {0}": "\u7531{0}\u9a71\u52a8",
+"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9",
+"Image title": "\u56fe\u7247\u6807\u9898",
+"Border width": "\u8fb9\u6846\u5bbd\u5ea6",
+"Border style": "\u8fb9\u6846\u6837\u5f0f",
+"Error": "\u9519\u8bef",
+"Warn": "\u8b66\u544a",
+"Valid": "\u6709\u6548",
+"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846",
+"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002",
+"System Font": "\u7cfb\u7edf\u5b57\u4f53",
+"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}",
+"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}",
+"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}",
+"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}",
+"example": "\u793a\u4f8b",
+"Search": "\u641c\u7d22",
+"All": "\u5168\u90e8",
+"Currency": "\u8d27\u5e01",
+"Text": "\u6587\u5b57",
+"Quotations": "\u5f15\u7528",
+"Mathematical": "\u6570\u5b66",
+"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145",
+"Symbols": "\u7b26\u53f7",
+"Arrows": "\u7bad\u5934",
+"User Defined": "\u81ea\u5b9a\u4e49",
+"dollar sign": "\u7f8e\u5143\u7b26\u53f7",
+"currency sign": "\u8d27\u5e01\u7b26\u53f7",
+"euro-currency sign": "\u6b27\u5143\u7b26\u53f7",
+"colon sign": "\u5192\u53f7",
+"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7",
+"french franc sign": "\u6cd5\u90ce\u7b26\u53f7",
+"lira sign": "\u91cc\u62c9\u7b26\u53f7",
+"mill sign": "\u5bc6\u5c14\u7b26\u53f7",
+"naira sign": "\u5948\u62c9\u7b26\u53f7",
+"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7",
+"rupee sign": "\u5362\u6bd4\u7b26\u53f7",
+"won sign": "\u97e9\u5143\u7b26\u53f7",
+"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7",
+"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7",
+"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7",
+"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7",
+"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7",
+"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7",
+"peso sign": "\u6bd4\u7d22\u7b26\u53f7",
+"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7",
+"austral sign": "\u6fb3\u5143\u7b26\u53f7",
+"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7",
+"cedi sign": "\u585e\u5730\u7b26\u53f7",
+"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7",
+"spesmilo sign": "spesmilo\u7b26\u53f7",
+"tenge sign": "\u575a\u6208\u7b26\u53f7",
+"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4",
+"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9",
+"nordic mark sign": "\u5317\u6b27\u9a6c\u514b",
+"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7",
+"ruble sign": "\u5362\u5e03\u7b26\u53f7",
+"yen character": "\u65e5\u5143\u5b57\u6837",
+"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837",
+"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09",
+"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09",
+"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...",
+"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7",
+"People": "\u4eba\u7c7b",
+"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136",
+"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1",
+"Activity": "\u6d3b\u52a8",
+"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9",
+"Objects": "\u7269\u4ef6",
+"Flags": "\u65d7\u5e1c",
+"Characters": "\u5b57\u7b26",
+"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)",
+"{0} characters": "{0} \u4e2a\u5b57\u7b26",
+"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002",
+"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002",
+"Update": "\u66f4\u65b0",
+"Color swatch": "\u989c\u8272\u6837\u672c",
+"Turquoise": "\u9752\u7eff\u8272",
+"Green": "\u7eff\u8272",
+"Blue": "\u84dd\u8272",
+"Purple": "\u7d2b\u8272",
+"Navy Blue": "\u6d77\u519b\u84dd",
+"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272",
+"Dark Green": "\u6df1\u7eff\u8272",
+"Medium Blue": "\u4e2d\u84dd\u8272",
+"Medium Purple": "\u4e2d\u7d2b\u8272",
+"Midnight Blue": "\u6df1\u84dd\u8272",
+"Yellow": "\u9ec4\u8272",
+"Orange": "\u6a59\u8272",
+"Red": "\u7ea2\u8272",
+"Light Gray": "\u6d45\u7070\u8272",
+"Gray": "\u7070\u8272",
+"Dark Yellow": "\u6697\u9ec4\u8272",
+"Dark Orange": "\u6df1\u6a59\u8272",
+"Dark Red": "\u6df1\u7ea2\u8272",
+"Medium Gray": "\u4e2d\u7070\u8272",
+"Dark Gray": "\u6df1\u7070\u8272",
+"Light Green": "\u6d45\u7eff\u8272",
+"Light Yellow": "\u6d45\u9ec4\u8272",
+"Light Red": "\u6d45\u7ea2\u8272",
+"Light Purple": "\u6d45\u7d2b\u8272",
+"Light Blue": "\u6d45\u84dd\u8272",
+"Dark Purple": "\u6df1\u7d2b\u8272",
+"Dark Blue": "\u6df1\u84dd\u8272",
+"Black": "\u9ed1\u8272",
+"White": "\u767d\u8272",
+"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f",
+"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846",
+"history": "\u5386\u53f2",
+"styles": "\u6837\u5f0f",
+"formatting": "\u683c\u5f0f\u5316",
+"alignment": "\u5bf9\u9f50",
+"indentation": "\u7f29\u8fdb",
+"permanent pen": "\u8bb0\u53f7\u7b14",
+"comments": "\u5907\u6ce8",
+"Format Painter": "\u683c\u5f0f\u5237",
+"Insert\/edit iframe": "\u63d2\u5165\/\u7f16\u8f91\u6846\u67b6",
+"Capitalization": "\u5927\u5199",
+"lowercase": "\u5c0f\u5199",
+"UPPERCASE": "\u5927\u5199",
+"Title Case": "\u9996\u5b57\u6bcd\u5927\u5199",
+"Permanent Pen Properties": "\u6c38\u4e45\u7b14\u5c5e\u6027",
+"Permanent pen properties...": "\u6c38\u4e45\u7b14\u5c5e\u6027...",
+"Font": "\u5b57\u4f53",
+"Size": "\u5b57\u53f7",
+"More...": "\u66f4\u591a...",
+"Spellcheck Language": "\u62fc\u5199\u68c0\u67e5\u8bed\u8a00",
+"Select...": "\u9009\u62e9...",
+"Preferences": "\u9996\u9009\u9879",
+"Yes": "\u662f",
+"No": "\u5426",
+"Keyboard Navigation": "\u952e\u76d8\u6307\u5f15",
+"Version": "\u7248\u672c",
+"Anchor": "\u951a\u70b9",
+"Special character": "\u7279\u6b8a\u7b26\u53f7",
+"Code sample": "\u4ee3\u7801\u793a\u4f8b",
+"Color": "\u989c\u8272",
+"Emoticons": "\u8868\u60c5",
+"Document properties": "\u6587\u6863\u5c5e\u6027",
+"Image": "\u56fe\u7247",
+"Insert link": "\u63d2\u5165\u94fe\u63a5",
+"Target": "\u6253\u5f00\u65b9\u5f0f",
+"Link": "\u94fe\u63a5",
+"Poster": "\u5c01\u9762",
+"Media": "\u5a92\u4f53",
+"Print": "\u6253\u5370",
+"Prev": "\u4e0a\u4e00\u4e2a",
+"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362",
+"Whole words": "\u5168\u5b57\u5339\u914d",
+"Spellcheck": "\u62fc\u5199\u68c0\u67e5",
+"Caption": "\u6807\u9898",
+"Insert template": "\u63d2\u5165\u6a21\u677f"
+});
\ No newline at end of file
diff --git a/public/tinymce/skins/content/dark/content.css b/public/tinymce/skins/content/dark/content.css
new file mode 100644
index 00000000..cfdb62a5
--- /dev/null
+++ b/public/tinymce/skins/content/dark/content.css
@@ -0,0 +1,66 @@
+body {
+ background-color: #222f3e;
+ color: #fff;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+ line-height: 1.4;
+ margin: 1rem;
+}
+a {
+ color: #4099ff;
+}
+table {
+ border-collapse: collapse;
+}
+/* Apply a default padding if legacy cellpadding attribute is missing */
+table:not([cellpadding]) th,
+table:not([cellpadding]) td {
+ padding: 0.4rem;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-width"]) th,
+table[border]:not([border="0"]):not([style*="border-width"]) td {
+ border-width: 1px;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-style"]) th,
+table[border]:not([border="0"]):not([style*="border-style"]) td {
+ border-style: solid;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-color"]) th,
+table[border]:not([border="0"]):not([style*="border-color"]) td {
+ border-color: #6d737b;
+}
+figure {
+ display: table;
+ margin: 1rem auto;
+}
+figure figcaption {
+ color: #8a8f97;
+ display: block;
+ margin-top: 0.25rem;
+ text-align: center;
+}
+hr {
+ border-color: #6d737b;
+ border-style: solid;
+ border-width: 1px 0 0 0;
+}
+code {
+ background-color: #6d737b;
+ border-radius: 3px;
+ padding: 0.1rem 0.2rem;
+}
+.mce-content-body:not([dir=rtl]) blockquote {
+ border-left: 2px solid #6d737b;
+ margin-left: 1.5rem;
+ padding-left: 1rem;
+}
+.mce-content-body[dir=rtl] blockquote {
+ border-right: 2px solid #6d737b;
+ margin-right: 1.5rem;
+ padding-right: 1rem;
+}
diff --git a/public/tinymce/skins/content/dark/content.min.css b/public/tinymce/skins/content/dark/content.min.css
new file mode 100644
index 00000000..c9fe30a0
--- /dev/null
+++ b/public/tinymce/skins/content/dark/content.min.css
@@ -0,0 +1 @@
+body{background-color:#222f3e;color:#fff;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}a{color:#4099ff}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#6d737b}figure{display:table;margin:1rem auto}figure figcaption{color:#8a8f97;display:block;margin-top:.25rem;text-align:center}hr{border-color:#6d737b;border-style:solid;border-width:1px 0 0 0}code{background-color:#6d737b;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #6d737b;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #6d737b;margin-right:1.5rem;padding-right:1rem}
diff --git a/public/tinymce/skins/content/default/content.css b/public/tinymce/skins/content/default/content.css
new file mode 100644
index 00000000..75177873
--- /dev/null
+++ b/public/tinymce/skins/content/default/content.css
@@ -0,0 +1,61 @@
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+ line-height: 1.4;
+ margin: 1rem;
+}
+table {
+ border-collapse: collapse;
+}
+/* Apply a default padding if legacy cellpadding attribute is missing */
+table:not([cellpadding]) th,
+table:not([cellpadding]) td {
+ padding: 0.4rem;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-width"]) th,
+table[border]:not([border="0"]):not([style*="border-width"]) td {
+ border-width: 1px;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-style"]) th,
+table[border]:not([border="0"]):not([style*="border-style"]) td {
+ border-style: solid;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-color"]) th,
+table[border]:not([border="0"]):not([style*="border-color"]) td {
+ border-color: #ccc;
+}
+figure {
+ display: table;
+ margin: 1rem auto;
+}
+figure figcaption {
+ color: #999;
+ display: block;
+ margin-top: 0.25rem;
+ text-align: center;
+}
+hr {
+ border-color: #ccc;
+ border-style: solid;
+ border-width: 1px 0 0 0;
+}
+code {
+ background-color: #e8e8e8;
+ border-radius: 3px;
+ padding: 0.1rem 0.2rem;
+}
+.mce-content-body:not([dir=rtl]) blockquote {
+ border-left: 2px solid #ccc;
+ margin-left: 1.5rem;
+ padding-left: 1rem;
+}
+.mce-content-body[dir=rtl] blockquote {
+ border-right: 2px solid #ccc;
+ margin-right: 1.5rem;
+ padding-right: 1rem;
+}
diff --git a/public/tinymce/skins/content/default/content.min.css b/public/tinymce/skins/content/default/content.min.css
new file mode 100644
index 00000000..54bb28d4
--- /dev/null
+++ b/public/tinymce/skins/content/default/content.min.css
@@ -0,0 +1 @@
+body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}
diff --git a/public/tinymce/skins/content/document/content.css b/public/tinymce/skins/content/document/content.css
new file mode 100644
index 00000000..ee54542c
--- /dev/null
+++ b/public/tinymce/skins/content/document/content.css
@@ -0,0 +1,66 @@
+@media screen {
+ html {
+ background: #f4f4f4;
+ min-height: 100%;
+ }
+}
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+}
+@media screen {
+ body {
+ background-color: #fff;
+ box-shadow: 0 0 4px rgba(0, 0, 0, 0.15);
+ box-sizing: border-box;
+ margin: 1rem auto 0;
+ max-width: 820px;
+ min-height: calc(100vh - 1rem);
+ padding: 4rem 6rem 6rem 6rem;
+ }
+}
+table {
+ border-collapse: collapse;
+}
+/* Apply a default padding if legacy cellpadding attribute is missing */
+table:not([cellpadding]) th,
+table:not([cellpadding]) td {
+ padding: 0.4rem;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-width"]) th,
+table[border]:not([border="0"]):not([style*="border-width"]) td {
+ border-width: 1px;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-style"]) th,
+table[border]:not([border="0"]):not([style*="border-style"]) td {
+ border-style: solid;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-color"]) th,
+table[border]:not([border="0"]):not([style*="border-color"]) td {
+ border-color: #ccc;
+}
+figure figcaption {
+ color: #999;
+ margin-top: 0.25rem;
+ text-align: center;
+}
+hr {
+ border-color: #ccc;
+ border-style: solid;
+ border-width: 1px 0 0 0;
+}
+.mce-content-body:not([dir=rtl]) blockquote {
+ border-left: 2px solid #ccc;
+ margin-left: 1.5rem;
+ padding-left: 1rem;
+}
+.mce-content-body[dir=rtl] blockquote {
+ border-right: 2px solid #ccc;
+ margin-right: 1.5rem;
+ padding-right: 1rem;
+}
diff --git a/public/tinymce/skins/content/document/content.min.css b/public/tinymce/skins/content/document/content.min.css
new file mode 100644
index 00000000..a8b70210
--- /dev/null
+++ b/public/tinymce/skins/content/document/content.min.css
@@ -0,0 +1 @@
+@media screen{html{background:#f4f4f4;min-height:100%}}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif}@media screen{body{background-color:#fff;box-shadow:0 0 4px rgba(0,0,0,.15);box-sizing:border-box;margin:1rem auto 0;max-width:820px;min-height:calc(100vh - 1rem);padding:4rem 6rem 6rem 6rem}}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure figcaption{color:#999;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}
diff --git a/public/tinymce/skins/content/tinymce-5-dark/content.css b/public/tinymce/skins/content/tinymce-5-dark/content.css
new file mode 100644
index 00000000..fee4baf8
--- /dev/null
+++ b/public/tinymce/skins/content/tinymce-5-dark/content.css
@@ -0,0 +1,66 @@
+body {
+ background-color: #2f3742;
+ color: #dfe0e4;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+ line-height: 1.4;
+ margin: 1rem;
+}
+a {
+ color: #4099ff;
+}
+table {
+ border-collapse: collapse;
+}
+/* Apply a default padding if legacy cellpadding attribute is missing */
+table:not([cellpadding]) th,
+table:not([cellpadding]) td {
+ padding: 0.4rem;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-width"]) th,
+table[border]:not([border="0"]):not([style*="border-width"]) td {
+ border-width: 1px;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-style"]) th,
+table[border]:not([border="0"]):not([style*="border-style"]) td {
+ border-style: solid;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-color"]) th,
+table[border]:not([border="0"]):not([style*="border-color"]) td {
+ border-color: #6d737b;
+}
+figure {
+ display: table;
+ margin: 1rem auto;
+}
+figure figcaption {
+ color: #8a8f97;
+ display: block;
+ margin-top: 0.25rem;
+ text-align: center;
+}
+hr {
+ border-color: #6d737b;
+ border-style: solid;
+ border-width: 1px 0 0 0;
+}
+code {
+ background-color: #6d737b;
+ border-radius: 3px;
+ padding: 0.1rem 0.2rem;
+}
+.mce-content-body:not([dir=rtl]) blockquote {
+ border-left: 2px solid #6d737b;
+ margin-left: 1.5rem;
+ padding-left: 1rem;
+}
+.mce-content-body[dir=rtl] blockquote {
+ border-right: 2px solid #6d737b;
+ margin-right: 1.5rem;
+ padding-right: 1rem;
+}
diff --git a/public/tinymce/skins/content/tinymce-5-dark/content.min.css b/public/tinymce/skins/content/tinymce-5-dark/content.min.css
new file mode 100644
index 00000000..33c4009d
--- /dev/null
+++ b/public/tinymce/skins/content/tinymce-5-dark/content.min.css
@@ -0,0 +1 @@
+body{background-color:#2f3742;color:#dfe0e4;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}a{color:#4099ff}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#6d737b}figure{display:table;margin:1rem auto}figure figcaption{color:#8a8f97;display:block;margin-top:.25rem;text-align:center}hr{border-color:#6d737b;border-style:solid;border-width:1px 0 0 0}code{background-color:#6d737b;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #6d737b;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #6d737b;margin-right:1.5rem;padding-right:1rem}
diff --git a/public/tinymce/skins/content/tinymce-5/content.css b/public/tinymce/skins/content/tinymce-5/content.css
new file mode 100644
index 00000000..75177873
--- /dev/null
+++ b/public/tinymce/skins/content/tinymce-5/content.css
@@ -0,0 +1,61 @@
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+ line-height: 1.4;
+ margin: 1rem;
+}
+table {
+ border-collapse: collapse;
+}
+/* Apply a default padding if legacy cellpadding attribute is missing */
+table:not([cellpadding]) th,
+table:not([cellpadding]) td {
+ padding: 0.4rem;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-width"]) th,
+table[border]:not([border="0"]):not([style*="border-width"]) td {
+ border-width: 1px;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-style"]) th,
+table[border]:not([border="0"]):not([style*="border-style"]) td {
+ border-style: solid;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-color"]) th,
+table[border]:not([border="0"]):not([style*="border-color"]) td {
+ border-color: #ccc;
+}
+figure {
+ display: table;
+ margin: 1rem auto;
+}
+figure figcaption {
+ color: #999;
+ display: block;
+ margin-top: 0.25rem;
+ text-align: center;
+}
+hr {
+ border-color: #ccc;
+ border-style: solid;
+ border-width: 1px 0 0 0;
+}
+code {
+ background-color: #e8e8e8;
+ border-radius: 3px;
+ padding: 0.1rem 0.2rem;
+}
+.mce-content-body:not([dir=rtl]) blockquote {
+ border-left: 2px solid #ccc;
+ margin-left: 1.5rem;
+ padding-left: 1rem;
+}
+.mce-content-body[dir=rtl] blockquote {
+ border-right: 2px solid #ccc;
+ margin-right: 1.5rem;
+ padding-right: 1rem;
+}
diff --git a/public/tinymce/skins/content/tinymce-5/content.min.css b/public/tinymce/skins/content/tinymce-5/content.min.css
new file mode 100644
index 00000000..54bb28d4
--- /dev/null
+++ b/public/tinymce/skins/content/tinymce-5/content.min.css
@@ -0,0 +1 @@
+body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}
diff --git a/public/tinymce/skins/content/writer/content.css b/public/tinymce/skins/content/writer/content.css
new file mode 100644
index 00000000..28071d49
--- /dev/null
+++ b/public/tinymce/skins/content/writer/content.css
@@ -0,0 +1,62 @@
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+ line-height: 1.4;
+ margin: 1rem auto;
+ max-width: 900px;
+}
+table {
+ border-collapse: collapse;
+}
+/* Apply a default padding if legacy cellpadding attribute is missing */
+table:not([cellpadding]) th,
+table:not([cellpadding]) td {
+ padding: 0.4rem;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-width"]) th,
+table[border]:not([border="0"]):not([style*="border-width"]) td {
+ border-width: 1px;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-style"]) th,
+table[border]:not([border="0"]):not([style*="border-style"]) td {
+ border-style: solid;
+}
+/* Set default table styles if a table has a positive border attribute
+ and no inline css */
+table[border]:not([border="0"]):not([style*="border-color"]) th,
+table[border]:not([border="0"]):not([style*="border-color"]) td {
+ border-color: #ccc;
+}
+figure {
+ display: table;
+ margin: 1rem auto;
+}
+figure figcaption {
+ color: #999;
+ display: block;
+ margin-top: 0.25rem;
+ text-align: center;
+}
+hr {
+ border-color: #ccc;
+ border-style: solid;
+ border-width: 1px 0 0 0;
+}
+code {
+ background-color: #e8e8e8;
+ border-radius: 3px;
+ padding: 0.1rem 0.2rem;
+}
+.mce-content-body:not([dir=rtl]) blockquote {
+ border-left: 2px solid #ccc;
+ margin-left: 1.5rem;
+ padding-left: 1rem;
+}
+.mce-content-body[dir=rtl] blockquote {
+ border-right: 2px solid #ccc;
+ margin-right: 1.5rem;
+ padding-right: 1rem;
+}
diff --git a/public/tinymce/skins/content/writer/content.min.css b/public/tinymce/skins/content/writer/content.min.css
new file mode 100644
index 00000000..186d62d0
--- /dev/null
+++ b/public/tinymce/skins/content/writer/content.min.css
@@ -0,0 +1 @@
+body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem auto;max-width:900px}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}
diff --git a/public/tinymce/skins/ui/oxide-dark/content.css b/public/tinymce/skins/ui/oxide-dark/content.css
new file mode 100644
index 00000000..0f1bce69
--- /dev/null
+++ b/public/tinymce/skins/ui/oxide-dark/content.css
@@ -0,0 +1,711 @@
+.mce-content-body .mce-item-anchor {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+}
+.mce-content-body .mce-item-anchor:empty {
+ cursor: default;
+ display: inline-block;
+ height: 12px !important;
+ padding: 0 2px;
+ -webkit-user-modify: read-only;
+ -moz-user-modify: read-only;
+ -webkit-user-select: all;
+ -moz-user-select: all;
+ user-select: all;
+ width: 8px !important;
+}
+.mce-content-body .mce-item-anchor:not(:empty) {
+ background-position-x: 2px;
+ display: inline-block;
+ padding-left: 12px;
+}
+.mce-content-body .mce-item-anchor[data-mce-selected] {
+ outline-offset: 1px;
+}
+.tox-comments-visible .tox-comment {
+ background-color: #fff0b7;
+}
+.tox-comments-visible .tox-comment[data-mce-annotation-active="true"]:not([data-mce-selected="inline-boundary"]) {
+ background-color: #ffe168;
+}
+.tox-checklist > li:not(.tox-checklist--hidden) {
+ list-style: none;
+ margin: 0.25em 0;
+}
+.tox-checklist > li:not(.tox-checklist--hidden)::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+ cursor: pointer;
+ height: 1em;
+ margin-left: -1.5em;
+ margin-top: 0.125em;
+ position: absolute;
+ width: 1em;
+}
+.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+}
+[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {
+ margin-left: 0;
+ margin-right: -1.5em;
+}
+/* stylelint-disable */
+/* http://prismjs.com/ */
+/**
+ * Dracula Theme originally by Zeno Rocha [@zenorocha]
+ * https://draculatheme.com/
+ *
+ * Ported for PrismJS by Albert Vallverdu [@byverdu]
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ color: #f8f8f2;
+ background: none;
+ text-shadow: 0 1px rgba(0, 0, 0, 0.3);
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+ -moz-tab-size: 4;
+ tab-size: 4;
+ -webkit-hyphens: none;
+ hyphens: none;
+}
+/* Code blocks */
+pre[class*="language-"] {
+ padding: 1em;
+ margin: 0.5em 0;
+ overflow: auto;
+ border-radius: 0.3em;
+}
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+ background: #282a36;
+}
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+ padding: 0.1em;
+ border-radius: 0.3em;
+ white-space: normal;
+}
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: #6272a4;
+}
+.token.punctuation {
+ color: #f8f8f2;
+}
+.namespace {
+ opacity: 0.7;
+}
+.token.property,
+.token.tag,
+.token.constant,
+.token.symbol,
+.token.deleted {
+ color: #ff79c6;
+}
+.token.boolean,
+.token.number {
+ color: #bd93f9;
+}
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+ color: #50fa7b;
+}
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string,
+.token.variable {
+ color: #f8f8f2;
+}
+.token.atrule,
+.token.attr-value,
+.token.function,
+.token.class-name {
+ color: #f1fa8c;
+}
+.token.keyword {
+ color: #8be9fd;
+}
+.token.regex,
+.token.important {
+ color: #ffb86c;
+}
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+.token.italic {
+ font-style: italic;
+}
+.token.entity {
+ cursor: help;
+}
+/* stylelint-enable */
+.mce-content-body {
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+.mce-content-body .mce-visual-caret {
+ background-color: black;
+ background-color: currentColor;
+ position: absolute;
+}
+.mce-content-body .mce-visual-caret-hidden {
+ display: none;
+}
+.mce-content-body *[data-mce-caret] {
+ left: -1000px;
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ right: auto;
+ top: 0;
+}
+.mce-content-body .mce-offscreen-selection {
+ left: -2000000px;
+ max-width: 1000000px;
+ position: absolute;
+}
+.mce-content-body *[contentEditable=false] {
+ cursor: default;
+}
+.mce-content-body *[contentEditable=true] {
+ cursor: text;
+}
+.tox-cursor-format-painter {
+ cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default;
+}
+.mce-content-body figure.align-left {
+ float: left;
+}
+.mce-content-body figure.align-right {
+ float: right;
+}
+.mce-content-body figure.image.align-center {
+ display: table;
+ margin-left: auto;
+ margin-right: auto;
+}
+.mce-preview-object {
+ border: 1px solid gray;
+ display: inline-block;
+ line-height: 0;
+ margin: 0 2px 0 2px;
+ position: relative;
+}
+.mce-preview-object .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-preview-object[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.mce-object {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+ border: 1px dashed #aaa;
+}
+.mce-pagebreak {
+ border: 1px dashed #aaa;
+ cursor: default;
+ display: block;
+ height: 5px;
+ margin-top: 15px;
+ page-break-before: always;
+ width: 100%;
+}
+@media print {
+ .mce-pagebreak {
+ border: 0;
+ }
+}
+.tiny-pageembed .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tiny-pageembed[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.tiny-pageembed {
+ display: inline-block;
+ position: relative;
+}
+.tiny-pageembed--21by9,
+.tiny-pageembed--16by9,
+.tiny-pageembed--4by3,
+.tiny-pageembed--1by1 {
+ display: block;
+ overflow: hidden;
+ padding: 0;
+ position: relative;
+ width: 100%;
+}
+.tiny-pageembed--21by9 {
+ padding-top: 42.857143%;
+}
+.tiny-pageembed--16by9 {
+ padding-top: 56.25%;
+}
+.tiny-pageembed--4by3 {
+ padding-top: 75%;
+}
+.tiny-pageembed--1by1 {
+ padding-top: 100%;
+}
+.tiny-pageembed--21by9 iframe,
+.tiny-pageembed--16by9 iframe,
+.tiny-pageembed--4by3 iframe,
+.tiny-pageembed--1by1 iframe {
+ border: 0;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-content-body[data-mce-placeholder] {
+ position: relative;
+}
+.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ color: rgba(34, 47, 62, 0.7);
+ content: attr(data-mce-placeholder);
+ position: absolute;
+}
+.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ left: 1px;
+}
+.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {
+ right: 1px;
+}
+.mce-content-body div.mce-resizehandle {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+ z-index: 1298;
+}
+.mce-content-body div.mce-resizehandle:hover {
+ background-color: #4099ff;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(1) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(2) {
+ cursor: nesw-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(3) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(4) {
+ cursor: nesw-resize;
+}
+.mce-content-body .mce-resize-backdrop {
+ z-index: 10000;
+}
+.mce-content-body .mce-clonedresizable {
+ cursor: default;
+ opacity: 0.5;
+ outline: 1px dashed black;
+ position: absolute;
+ z-index: 10001;
+}
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns th,
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns td {
+ border: 0;
+}
+.mce-content-body .mce-resize-helper {
+ background: #555;
+ background: rgba(0, 0, 0, 0.75);
+ border: 1px;
+ border-radius: 3px;
+ color: white;
+ display: none;
+ font-family: sans-serif;
+ font-size: 12px;
+ line-height: 14px;
+ margin: 5px 10px;
+ padding: 5px;
+ position: absolute;
+ white-space: nowrap;
+ z-index: 10002;
+}
+.tox-rtc-user-selection {
+ position: relative;
+}
+.tox-rtc-user-cursor {
+ bottom: 0;
+ cursor: default;
+ position: absolute;
+ top: 0;
+ width: 2px;
+}
+.tox-rtc-user-cursor::before {
+ background-color: inherit;
+ border-radius: 50%;
+ content: '';
+ display: block;
+ height: 8px;
+ position: absolute;
+ right: -3px;
+ top: -3px;
+ width: 8px;
+}
+.tox-rtc-user-cursor:hover::after {
+ background-color: inherit;
+ border-radius: 100px;
+ box-sizing: border-box;
+ color: #fff;
+ content: attr(data-user);
+ display: block;
+ font-size: 12px;
+ font-weight: bold;
+ left: -5px;
+ min-height: 8px;
+ min-width: 8px;
+ padding: 0 12px;
+ position: absolute;
+ top: -11px;
+ white-space: nowrap;
+ z-index: 1000;
+}
+.tox-rtc-user-selection--1 .tox-rtc-user-cursor {
+ background-color: #2dc26b;
+}
+.tox-rtc-user-selection--2 .tox-rtc-user-cursor {
+ background-color: #e03e2d;
+}
+.tox-rtc-user-selection--3 .tox-rtc-user-cursor {
+ background-color: #f1c40f;
+}
+.tox-rtc-user-selection--4 .tox-rtc-user-cursor {
+ background-color: #3598db;
+}
+.tox-rtc-user-selection--5 .tox-rtc-user-cursor {
+ background-color: #b96ad9;
+}
+.tox-rtc-user-selection--6 .tox-rtc-user-cursor {
+ background-color: #e67e23;
+}
+.tox-rtc-user-selection--7 .tox-rtc-user-cursor {
+ background-color: #aaa69d;
+}
+.tox-rtc-user-selection--8 .tox-rtc-user-cursor {
+ background-color: #f368e0;
+}
+.tox-rtc-remote-image {
+ background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;
+ border: 1px solid #ccc;
+ min-height: 240px;
+ min-width: 320px;
+}
+.mce-match-marker {
+ background: #aaa;
+ color: #fff;
+}
+.mce-match-marker-selected {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::-moz-selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-content-body img[data-mce-selected],
+.mce-content-body video[data-mce-selected],
+.mce-content-body audio[data-mce-selected],
+.mce-content-body object[data-mce-selected],
+.mce-content-body embed[data-mce-selected],
+.mce-content-body table[data-mce-selected] {
+ outline: 3px solid #4099ff;
+}
+.mce-content-body hr[data-mce-selected] {
+ outline: 3px solid #4099ff;
+ outline-offset: 1px;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {
+ outline: 3px solid #4099ff;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {
+ outline: 3px solid #4099ff;
+}
+.mce-content-body *[contentEditable=false][data-mce-selected] {
+ cursor: not-allowed;
+ outline: 3px solid #4099ff;
+}
+.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,
+.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {
+ outline: none;
+}
+.mce-content-body *[data-mce-selected="inline-boundary"] {
+ background-color: #4099ff;
+}
+.mce-content-body .mce-edit-focus {
+ outline: 3px solid #4099ff;
+}
+.mce-content-body td[data-mce-selected],
+.mce-content-body th[data-mce-selected] {
+ position: relative;
+}
+.mce-content-body td[data-mce-selected]::-moz-selection,
+.mce-content-body th[data-mce-selected]::-moz-selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected]::selection,
+.mce-content-body th[data-mce-selected]::selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected] *,
+.mce-content-body th[data-mce-selected] * {
+ outline: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.mce-content-body td[data-mce-selected]::after,
+.mce-content-body th[data-mce-selected]::after {
+ background-color: rgba(180, 215, 255, 0.7);
+ border: 1px solid transparent;
+ bottom: -1px;
+ content: '';
+ left: -1px;
+ mix-blend-mode: lighten;
+ position: absolute;
+ right: -1px;
+ top: -1px;
+}
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+ .mce-content-body td[data-mce-selected]::after,
+ .mce-content-body th[data-mce-selected]::after {
+ border-color: rgba(0, 84, 180, 0.7);
+ }
+}
+.mce-content-body img::-moz-selection {
+ background: none;
+}
+.mce-content-body img::selection {
+ background: none;
+}
+.ephox-snooker-resizer-bar {
+ background-color: #4099ff;
+ opacity: 0;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.ephox-snooker-resizer-cols {
+ cursor: col-resize;
+}
+.ephox-snooker-resizer-rows {
+ cursor: row-resize;
+}
+.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {
+ opacity: 1;
+}
+.mce-spellchecker-word {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+ height: 2rem;
+}
+.mce-spellchecker-grammar {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+}
+.mce-toc {
+ border: 1px solid gray;
+}
+.mce-toc h2 {
+ margin: 4px;
+}
+.mce-toc li {
+ list-style-type: none;
+}
+table[style*="border-width: 0px"],
+.mce-item-table:not([border]),
+.mce-item-table[border="0"],
+table[style*="border-width: 0px"] td,
+.mce-item-table:not([border]) td,
+.mce-item-table[border="0"] td,
+table[style*="border-width: 0px"] th,
+.mce-item-table:not([border]) th,
+.mce-item-table[border="0"] th,
+table[style*="border-width: 0px"] caption,
+.mce-item-table:not([border]) caption,
+.mce-item-table[border="0"] caption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks p,
+.mce-visualblocks h1,
+.mce-visualblocks h2,
+.mce-visualblocks h3,
+.mce-visualblocks h4,
+.mce-visualblocks h5,
+.mce-visualblocks h6,
+.mce-visualblocks div:not([data-mce-bogus]),
+.mce-visualblocks section,
+.mce-visualblocks article,
+.mce-visualblocks blockquote,
+.mce-visualblocks address,
+.mce-visualblocks pre,
+.mce-visualblocks figure,
+.mce-visualblocks figcaption,
+.mce-visualblocks hgroup,
+.mce-visualblocks aside,
+.mce-visualblocks ul,
+.mce-visualblocks ol,
+.mce-visualblocks dl {
+ background-repeat: no-repeat;
+ border: 1px dashed #bbb;
+ margin-left: 3px;
+ padding-top: 10px;
+}
+.mce-visualblocks p {
+ background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
+}
+.mce-visualblocks h1 {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
+}
+.mce-visualblocks h2 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
+}
+.mce-visualblocks h3 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
+}
+.mce-visualblocks h4 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
+}
+.mce-visualblocks h5 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
+}
+.mce-visualblocks h6 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
+}
+.mce-visualblocks div:not([data-mce-bogus]) {
+ background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
+}
+.mce-visualblocks section {
+ background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
+}
+.mce-visualblocks article {
+ background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
+}
+.mce-visualblocks blockquote {
+ background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
+}
+.mce-visualblocks address {
+ background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
+}
+.mce-visualblocks pre {
+ background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
+}
+.mce-visualblocks figure {
+ background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
+}
+.mce-visualblocks figcaption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks hgroup {
+ background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
+}
+.mce-visualblocks aside {
+ background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
+}
+.mce-visualblocks ul {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
+}
+.mce-visualblocks ol {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
+}
+.mce-visualblocks dl {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
+}
+.mce-visualblocks:not([dir=rtl]) p,
+.mce-visualblocks:not([dir=rtl]) h1,
+.mce-visualblocks:not([dir=rtl]) h2,
+.mce-visualblocks:not([dir=rtl]) h3,
+.mce-visualblocks:not([dir=rtl]) h4,
+.mce-visualblocks:not([dir=rtl]) h5,
+.mce-visualblocks:not([dir=rtl]) h6,
+.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),
+.mce-visualblocks:not([dir=rtl]) section,
+.mce-visualblocks:not([dir=rtl]) article,
+.mce-visualblocks:not([dir=rtl]) blockquote,
+.mce-visualblocks:not([dir=rtl]) address,
+.mce-visualblocks:not([dir=rtl]) pre,
+.mce-visualblocks:not([dir=rtl]) figure,
+.mce-visualblocks:not([dir=rtl]) figcaption,
+.mce-visualblocks:not([dir=rtl]) hgroup,
+.mce-visualblocks:not([dir=rtl]) aside,
+.mce-visualblocks:not([dir=rtl]) ul,
+.mce-visualblocks:not([dir=rtl]) ol,
+.mce-visualblocks:not([dir=rtl]) dl {
+ margin-left: 3px;
+}
+.mce-visualblocks[dir=rtl] p,
+.mce-visualblocks[dir=rtl] h1,
+.mce-visualblocks[dir=rtl] h2,
+.mce-visualblocks[dir=rtl] h3,
+.mce-visualblocks[dir=rtl] h4,
+.mce-visualblocks[dir=rtl] h5,
+.mce-visualblocks[dir=rtl] h6,
+.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),
+.mce-visualblocks[dir=rtl] section,
+.mce-visualblocks[dir=rtl] article,
+.mce-visualblocks[dir=rtl] blockquote,
+.mce-visualblocks[dir=rtl] address,
+.mce-visualblocks[dir=rtl] pre,
+.mce-visualblocks[dir=rtl] figure,
+.mce-visualblocks[dir=rtl] figcaption,
+.mce-visualblocks[dir=rtl] hgroup,
+.mce-visualblocks[dir=rtl] aside,
+.mce-visualblocks[dir=rtl] ul,
+.mce-visualblocks[dir=rtl] ol,
+.mce-visualblocks[dir=rtl] dl {
+ background-position-x: right;
+ margin-right: 3px;
+}
+.mce-nbsp,
+.mce-shy {
+ background: #aaa;
+}
+.mce-shy::after {
+ content: '-';
+}
+body {
+ font-family: sans-serif;
+}
+table {
+ border-collapse: collapse;
+}
diff --git a/public/tinymce/skins/ui/oxide-dark/content.inline.css b/public/tinymce/skins/ui/oxide-dark/content.inline.css
new file mode 100644
index 00000000..040100bf
--- /dev/null
+++ b/public/tinymce/skins/ui/oxide-dark/content.inline.css
@@ -0,0 +1,724 @@
+.mce-content-body .mce-item-anchor {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+}
+.mce-content-body .mce-item-anchor:empty {
+ cursor: default;
+ display: inline-block;
+ height: 12px !important;
+ padding: 0 2px;
+ -webkit-user-modify: read-only;
+ -moz-user-modify: read-only;
+ -webkit-user-select: all;
+ -moz-user-select: all;
+ user-select: all;
+ width: 8px !important;
+}
+.mce-content-body .mce-item-anchor:not(:empty) {
+ background-position-x: 2px;
+ display: inline-block;
+ padding-left: 12px;
+}
+.mce-content-body .mce-item-anchor[data-mce-selected] {
+ outline-offset: 1px;
+}
+.tox-comments-visible .tox-comment {
+ background-color: #fff0b7;
+}
+.tox-comments-visible .tox-comment[data-mce-annotation-active="true"]:not([data-mce-selected="inline-boundary"]) {
+ background-color: #ffe168;
+}
+.tox-checklist > li:not(.tox-checklist--hidden) {
+ list-style: none;
+ margin: 0.25em 0;
+}
+.tox-checklist > li:not(.tox-checklist--hidden)::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+ cursor: pointer;
+ height: 1em;
+ margin-left: -1.5em;
+ margin-top: 0.125em;
+ position: absolute;
+ width: 1em;
+}
+.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+}
+[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {
+ margin-left: 0;
+ margin-right: -1.5em;
+}
+/* stylelint-disable */
+/* http://prismjs.com/ */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ color: black;
+ background: none;
+ text-shadow: 0 1px white;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ font-size: 1em;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+ -moz-tab-size: 4;
+ tab-size: 4;
+ -webkit-hyphens: none;
+ hyphens: none;
+}
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+@media print {
+ code[class*="language-"],
+ pre[class*="language-"] {
+ text-shadow: none;
+ }
+}
+/* Code blocks */
+pre[class*="language-"] {
+ padding: 1em;
+ margin: 0.5em 0;
+ overflow: auto;
+}
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+ background: #f5f2f0;
+}
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+ padding: 0.1em;
+ border-radius: 0.3em;
+ white-space: normal;
+}
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: slategray;
+}
+.token.punctuation {
+ color: #999;
+}
+.token.namespace {
+ opacity: 0.7;
+}
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+ color: #905;
+}
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+ color: #690;
+}
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+ color: #9a6e3a;
+ /* This background color was intended by the author of this theme. */
+ background: hsla(0, 0%, 100%, 0.5);
+}
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+ color: #07a;
+}
+.token.function,
+.token.class-name {
+ color: #DD4A68;
+}
+.token.regex,
+.token.important,
+.token.variable {
+ color: #e90;
+}
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+.token.italic {
+ font-style: italic;
+}
+.token.entity {
+ cursor: help;
+}
+/* stylelint-enable */
+.mce-content-body {
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+.mce-content-body .mce-visual-caret {
+ background-color: black;
+ background-color: currentColor;
+ position: absolute;
+}
+.mce-content-body .mce-visual-caret-hidden {
+ display: none;
+}
+.mce-content-body *[data-mce-caret] {
+ left: -1000px;
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ right: auto;
+ top: 0;
+}
+.mce-content-body .mce-offscreen-selection {
+ left: -2000000px;
+ max-width: 1000000px;
+ position: absolute;
+}
+.mce-content-body *[contentEditable=false] {
+ cursor: default;
+}
+.mce-content-body *[contentEditable=true] {
+ cursor: text;
+}
+.tox-cursor-format-painter {
+ cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default;
+}
+.mce-content-body figure.align-left {
+ float: left;
+}
+.mce-content-body figure.align-right {
+ float: right;
+}
+.mce-content-body figure.image.align-center {
+ display: table;
+ margin-left: auto;
+ margin-right: auto;
+}
+.mce-preview-object {
+ border: 1px solid gray;
+ display: inline-block;
+ line-height: 0;
+ margin: 0 2px 0 2px;
+ position: relative;
+}
+.mce-preview-object .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-preview-object[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.mce-object {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+ border: 1px dashed #aaa;
+}
+.mce-pagebreak {
+ border: 1px dashed #aaa;
+ cursor: default;
+ display: block;
+ height: 5px;
+ margin-top: 15px;
+ page-break-before: always;
+ width: 100%;
+}
+@media print {
+ .mce-pagebreak {
+ border: 0;
+ }
+}
+.tiny-pageembed .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tiny-pageembed[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.tiny-pageembed {
+ display: inline-block;
+ position: relative;
+}
+.tiny-pageembed--21by9,
+.tiny-pageembed--16by9,
+.tiny-pageembed--4by3,
+.tiny-pageembed--1by1 {
+ display: block;
+ overflow: hidden;
+ padding: 0;
+ position: relative;
+ width: 100%;
+}
+.tiny-pageembed--21by9 {
+ padding-top: 42.857143%;
+}
+.tiny-pageembed--16by9 {
+ padding-top: 56.25%;
+}
+.tiny-pageembed--4by3 {
+ padding-top: 75%;
+}
+.tiny-pageembed--1by1 {
+ padding-top: 100%;
+}
+.tiny-pageembed--21by9 iframe,
+.tiny-pageembed--16by9 iframe,
+.tiny-pageembed--4by3 iframe,
+.tiny-pageembed--1by1 iframe {
+ border: 0;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-content-body[data-mce-placeholder] {
+ position: relative;
+}
+.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ color: rgba(34, 47, 62, 0.7);
+ content: attr(data-mce-placeholder);
+ position: absolute;
+}
+.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ left: 1px;
+}
+.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {
+ right: 1px;
+}
+.mce-content-body div.mce-resizehandle {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+ z-index: 1298;
+}
+.mce-content-body div.mce-resizehandle:hover {
+ background-color: #4099ff;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(1) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(2) {
+ cursor: nesw-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(3) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(4) {
+ cursor: nesw-resize;
+}
+.mce-content-body .mce-resize-backdrop {
+ z-index: 10000;
+}
+.mce-content-body .mce-clonedresizable {
+ cursor: default;
+ opacity: 0.5;
+ outline: 1px dashed black;
+ position: absolute;
+ z-index: 10001;
+}
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns th,
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns td {
+ border: 0;
+}
+.mce-content-body .mce-resize-helper {
+ background: #555;
+ background: rgba(0, 0, 0, 0.75);
+ border: 1px;
+ border-radius: 3px;
+ color: white;
+ display: none;
+ font-family: sans-serif;
+ font-size: 12px;
+ line-height: 14px;
+ margin: 5px 10px;
+ padding: 5px;
+ position: absolute;
+ white-space: nowrap;
+ z-index: 10002;
+}
+.tox-rtc-user-selection {
+ position: relative;
+}
+.tox-rtc-user-cursor {
+ bottom: 0;
+ cursor: default;
+ position: absolute;
+ top: 0;
+ width: 2px;
+}
+.tox-rtc-user-cursor::before {
+ background-color: inherit;
+ border-radius: 50%;
+ content: '';
+ display: block;
+ height: 8px;
+ position: absolute;
+ right: -3px;
+ top: -3px;
+ width: 8px;
+}
+.tox-rtc-user-cursor:hover::after {
+ background-color: inherit;
+ border-radius: 100px;
+ box-sizing: border-box;
+ color: #fff;
+ content: attr(data-user);
+ display: block;
+ font-size: 12px;
+ font-weight: bold;
+ left: -5px;
+ min-height: 8px;
+ min-width: 8px;
+ padding: 0 12px;
+ position: absolute;
+ top: -11px;
+ white-space: nowrap;
+ z-index: 1000;
+}
+.tox-rtc-user-selection--1 .tox-rtc-user-cursor {
+ background-color: #2dc26b;
+}
+.tox-rtc-user-selection--2 .tox-rtc-user-cursor {
+ background-color: #e03e2d;
+}
+.tox-rtc-user-selection--3 .tox-rtc-user-cursor {
+ background-color: #f1c40f;
+}
+.tox-rtc-user-selection--4 .tox-rtc-user-cursor {
+ background-color: #3598db;
+}
+.tox-rtc-user-selection--5 .tox-rtc-user-cursor {
+ background-color: #b96ad9;
+}
+.tox-rtc-user-selection--6 .tox-rtc-user-cursor {
+ background-color: #e67e23;
+}
+.tox-rtc-user-selection--7 .tox-rtc-user-cursor {
+ background-color: #aaa69d;
+}
+.tox-rtc-user-selection--8 .tox-rtc-user-cursor {
+ background-color: #f368e0;
+}
+.tox-rtc-remote-image {
+ background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;
+ border: 1px solid #ccc;
+ min-height: 240px;
+ min-width: 320px;
+}
+.mce-match-marker {
+ background: #aaa;
+ color: #fff;
+}
+.mce-match-marker-selected {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::-moz-selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-content-body img[data-mce-selected],
+.mce-content-body video[data-mce-selected],
+.mce-content-body audio[data-mce-selected],
+.mce-content-body object[data-mce-selected],
+.mce-content-body embed[data-mce-selected],
+.mce-content-body table[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body hr[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+ outline-offset: 1px;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false][data-mce-selected] {
+ cursor: not-allowed;
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,
+.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {
+ outline: none;
+}
+.mce-content-body *[data-mce-selected="inline-boundary"] {
+ background-color: #b4d7ff;
+}
+.mce-content-body .mce-edit-focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body td[data-mce-selected],
+.mce-content-body th[data-mce-selected] {
+ position: relative;
+}
+.mce-content-body td[data-mce-selected]::-moz-selection,
+.mce-content-body th[data-mce-selected]::-moz-selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected]::selection,
+.mce-content-body th[data-mce-selected]::selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected] *,
+.mce-content-body th[data-mce-selected] * {
+ outline: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.mce-content-body td[data-mce-selected]::after,
+.mce-content-body th[data-mce-selected]::after {
+ background-color: rgba(180, 215, 255, 0.7);
+ border: 1px solid rgba(180, 215, 255, 0.7);
+ bottom: -1px;
+ content: '';
+ left: -1px;
+ mix-blend-mode: multiply;
+ position: absolute;
+ right: -1px;
+ top: -1px;
+}
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+ .mce-content-body td[data-mce-selected]::after,
+ .mce-content-body th[data-mce-selected]::after {
+ border-color: rgba(0, 84, 180, 0.7);
+ }
+}
+.mce-content-body img::-moz-selection {
+ background: none;
+}
+.mce-content-body img::selection {
+ background: none;
+}
+.ephox-snooker-resizer-bar {
+ background-color: #b4d7ff;
+ opacity: 0;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.ephox-snooker-resizer-cols {
+ cursor: col-resize;
+}
+.ephox-snooker-resizer-rows {
+ cursor: row-resize;
+}
+.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {
+ opacity: 1;
+}
+.mce-spellchecker-word {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+ height: 2rem;
+}
+.mce-spellchecker-grammar {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+}
+.mce-toc {
+ border: 1px solid gray;
+}
+.mce-toc h2 {
+ margin: 4px;
+}
+.mce-toc li {
+ list-style-type: none;
+}
+table[style*="border-width: 0px"],
+.mce-item-table:not([border]),
+.mce-item-table[border="0"],
+table[style*="border-width: 0px"] td,
+.mce-item-table:not([border]) td,
+.mce-item-table[border="0"] td,
+table[style*="border-width: 0px"] th,
+.mce-item-table:not([border]) th,
+.mce-item-table[border="0"] th,
+table[style*="border-width: 0px"] caption,
+.mce-item-table:not([border]) caption,
+.mce-item-table[border="0"] caption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks p,
+.mce-visualblocks h1,
+.mce-visualblocks h2,
+.mce-visualblocks h3,
+.mce-visualblocks h4,
+.mce-visualblocks h5,
+.mce-visualblocks h6,
+.mce-visualblocks div:not([data-mce-bogus]),
+.mce-visualblocks section,
+.mce-visualblocks article,
+.mce-visualblocks blockquote,
+.mce-visualblocks address,
+.mce-visualblocks pre,
+.mce-visualblocks figure,
+.mce-visualblocks figcaption,
+.mce-visualblocks hgroup,
+.mce-visualblocks aside,
+.mce-visualblocks ul,
+.mce-visualblocks ol,
+.mce-visualblocks dl {
+ background-repeat: no-repeat;
+ border: 1px dashed #bbb;
+ margin-left: 3px;
+ padding-top: 10px;
+}
+.mce-visualblocks p {
+ background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
+}
+.mce-visualblocks h1 {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
+}
+.mce-visualblocks h2 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
+}
+.mce-visualblocks h3 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
+}
+.mce-visualblocks h4 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
+}
+.mce-visualblocks h5 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
+}
+.mce-visualblocks h6 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
+}
+.mce-visualblocks div:not([data-mce-bogus]) {
+ background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
+}
+.mce-visualblocks section {
+ background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
+}
+.mce-visualblocks article {
+ background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
+}
+.mce-visualblocks blockquote {
+ background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
+}
+.mce-visualblocks address {
+ background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
+}
+.mce-visualblocks pre {
+ background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
+}
+.mce-visualblocks figure {
+ background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
+}
+.mce-visualblocks figcaption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks hgroup {
+ background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
+}
+.mce-visualblocks aside {
+ background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
+}
+.mce-visualblocks ul {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
+}
+.mce-visualblocks ol {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
+}
+.mce-visualblocks dl {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
+}
+.mce-visualblocks:not([dir=rtl]) p,
+.mce-visualblocks:not([dir=rtl]) h1,
+.mce-visualblocks:not([dir=rtl]) h2,
+.mce-visualblocks:not([dir=rtl]) h3,
+.mce-visualblocks:not([dir=rtl]) h4,
+.mce-visualblocks:not([dir=rtl]) h5,
+.mce-visualblocks:not([dir=rtl]) h6,
+.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),
+.mce-visualblocks:not([dir=rtl]) section,
+.mce-visualblocks:not([dir=rtl]) article,
+.mce-visualblocks:not([dir=rtl]) blockquote,
+.mce-visualblocks:not([dir=rtl]) address,
+.mce-visualblocks:not([dir=rtl]) pre,
+.mce-visualblocks:not([dir=rtl]) figure,
+.mce-visualblocks:not([dir=rtl]) figcaption,
+.mce-visualblocks:not([dir=rtl]) hgroup,
+.mce-visualblocks:not([dir=rtl]) aside,
+.mce-visualblocks:not([dir=rtl]) ul,
+.mce-visualblocks:not([dir=rtl]) ol,
+.mce-visualblocks:not([dir=rtl]) dl {
+ margin-left: 3px;
+}
+.mce-visualblocks[dir=rtl] p,
+.mce-visualblocks[dir=rtl] h1,
+.mce-visualblocks[dir=rtl] h2,
+.mce-visualblocks[dir=rtl] h3,
+.mce-visualblocks[dir=rtl] h4,
+.mce-visualblocks[dir=rtl] h5,
+.mce-visualblocks[dir=rtl] h6,
+.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),
+.mce-visualblocks[dir=rtl] section,
+.mce-visualblocks[dir=rtl] article,
+.mce-visualblocks[dir=rtl] blockquote,
+.mce-visualblocks[dir=rtl] address,
+.mce-visualblocks[dir=rtl] pre,
+.mce-visualblocks[dir=rtl] figure,
+.mce-visualblocks[dir=rtl] figcaption,
+.mce-visualblocks[dir=rtl] hgroup,
+.mce-visualblocks[dir=rtl] aside,
+.mce-visualblocks[dir=rtl] ul,
+.mce-visualblocks[dir=rtl] ol,
+.mce-visualblocks[dir=rtl] dl {
+ background-position-x: right;
+ margin-right: 3px;
+}
+.mce-nbsp,
+.mce-shy {
+ background: #aaa;
+}
+.mce-shy::after {
+ content: '-';
+}
diff --git a/public/tinymce/skins/ui/oxide-dark/content.inline.min.css b/public/tinymce/skins/ui/oxide-dark/content.inline.min.css
new file mode 100644
index 00000000..d5f05d42
--- /dev/null
+++ b/public/tinymce/skins/ui/oxide-dark/content.inline.min.css
@@ -0,0 +1 @@
+.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center}.mce-content-body .mce-item-anchor:empty{cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor:not(:empty){background-position-x:2px;display:inline-block;padding-left:12px}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment[data-mce-annotation-active=true]:not([data-mce-selected=inline-boundary]){background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}
diff --git a/public/tinymce/skins/ui/oxide-dark/content.min.css b/public/tinymce/skins/ui/oxide-dark/content.min.css
new file mode 100644
index 00000000..a27d11b6
--- /dev/null
+++ b/public/tinymce/skins/ui/oxide-dark/content.min.css
@@ -0,0 +1 @@
+.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center}.mce-content-body .mce-item-anchor:empty{cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor:not(:empty){background-position-x:2px;display:inline-block;padding-left:12px}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment[data-mce-annotation-active=true]:not([data-mce-selected=inline-boundary]){background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#282a36}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6272a4}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#ff79c6}.token.boolean,.token.number{color:#bd93f9}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#50fa7b}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#f1fa8c}.token.keyword{color:#8be9fd}.token.important,.token.regex{color:#ffb86c}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #4099ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #4099ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #4099ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #4099ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #4099ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#4099ff}.mce-content-body .mce-edit-focus{outline:3px solid #4099ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid transparent;bottom:-1px;content:'';left:-1px;mix-blend-mode:lighten;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#4099ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse}
diff --git a/public/tinymce/skins/ui/oxide-dark/skin.css b/public/tinymce/skins/ui/oxide-dark/skin.css
new file mode 100644
index 00000000..aca0fc80
--- /dev/null
+++ b/public/tinymce/skins/ui/oxide-dark/skin.css
@@ -0,0 +1,3041 @@
+.tox {
+ box-shadow: none;
+ box-sizing: content-box;
+ color: #222f3e;
+ cursor: auto;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: normal;
+ -webkit-tap-highlight-color: transparent;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ vertical-align: initial;
+ white-space: normal;
+}
+.tox *:not(svg):not(rect) {
+ box-sizing: inherit;
+ color: inherit;
+ cursor: inherit;
+ direction: inherit;
+ font-family: inherit;
+ font-size: inherit;
+ font-style: inherit;
+ font-weight: inherit;
+ line-height: inherit;
+ -webkit-tap-highlight-color: inherit;
+ text-align: inherit;
+ text-decoration: inherit;
+ text-shadow: inherit;
+ text-transform: inherit;
+ vertical-align: inherit;
+ white-space: inherit;
+}
+.tox *:not(svg):not(rect) {
+ /* stylelint-disable-line no-duplicate-selectors */
+ background: transparent;
+ border: 0;
+ box-shadow: none;
+ float: none;
+ height: auto;
+ margin: 0;
+ max-width: none;
+ outline: 0;
+ padding: 0;
+ position: static;
+ width: auto;
+}
+.tox:not([dir=rtl]) {
+ direction: ltr;
+ text-align: left;
+}
+.tox[dir=rtl] {
+ direction: rtl;
+ text-align: right;
+}
+.tox-tinymce {
+ border: 2px solid #161f29;
+ border-radius: 10px;
+ box-shadow: none;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ overflow: hidden;
+ position: relative;
+ visibility: inherit !important;
+}
+.tox.tox-tinymce-inline {
+ border: none;
+ box-shadow: none;
+ overflow: initial;
+}
+.tox.tox-tinymce-inline .tox-editor-container {
+ overflow: initial;
+}
+.tox.tox-tinymce-inline .tox-editor-header {
+ background-color: #222F3E;
+ border: 2px solid #161f29;
+ border-radius: 10px;
+ box-shadow: none;
+ overflow: hidden;
+}
+.tox-tinymce-aux {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ z-index: 1300;
+}
+.tox-tinymce *:focus,
+.tox-tinymce-aux *:focus {
+ outline: none;
+}
+button::-moz-focus-inner {
+ border: 0;
+}
+.tox[dir=rtl] .tox-icon--flip svg {
+ transform: rotateY(180deg);
+}
+.tox .accessibility-issue__header {
+ align-items: center;
+ display: flex;
+ margin-bottom: 4px;
+}
+.tox .accessibility-issue__description {
+ align-items: stretch;
+ border: 1px solid #161f29;
+ border-radius: 6px;
+ display: flex;
+ justify-content: space-between;
+}
+.tox .accessibility-issue__description > div {
+ padding-bottom: 4px;
+}
+.tox .accessibility-issue__description > div > div {
+ align-items: center;
+ display: flex;
+ margin-bottom: 4px;
+}
+.tox .accessibility-issue__description > *:last-child:not(:only-child) {
+ border-color: #161f29;
+ border-style: solid;
+}
+.tox .accessibility-issue__repair {
+ margin-top: 16px;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description {
+ background-color: rgba(0, 108, 231, 0.5);
+ border-color: rgba(0, 108, 231, 0.4);
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > *:last-child {
+ border-color: rgba(0, 108, 231, 0.4);
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg {
+ fill: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description {
+ background-color: rgba(255, 165, 0, 0.5);
+ border-color: rgba(255, 165, 0, 0.8);
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > *:last-child {
+ border-color: rgba(255, 165, 0, 0.8);
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg {
+ fill: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description {
+ background-color: rgba(204, 0, 0, 0.5);
+ border-color: rgba(204, 0, 0, 0.8);
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > *:last-child {
+ border-color: rgba(204, 0, 0, 0.8);
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg {
+ fill: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description {
+ background-color: rgba(120, 171, 70, 0.5);
+ border-color: rgba(120, 171, 70, 0.8);
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > *:last-child {
+ border-color: rgba(120, 171, 70, 0.8);
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg {
+ fill: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue__header h1,
+.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 {
+ margin-top: 0;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) {
+ margin-left: auto;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description {
+ padding: 4px 4px 4px 8px;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description > *:last-child {
+ border-left-width: 1px;
+ padding-left: 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) {
+ margin-right: auto;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description {
+ padding: 4px 8px 4px 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description > *:last-child {
+ border-right-width: 1px;
+ padding-right: 4px;
+}
+.tox .tox-anchorbar {
+ display: flex;
+ flex: 0 0 auto;
+}
+.tox .tox-bar {
+ display: flex;
+ flex: 0 0 auto;
+}
+.tox .tox-button {
+ background-color: #006ce7;
+ background-image: none;
+ background-position: 0 0;
+ background-repeat: repeat;
+ border-color: #006ce7;
+ border-radius: 6px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #fff;
+ cursor: pointer;
+ display: inline-block;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ line-height: 24px;
+ margin: 0;
+ outline: none;
+ padding: 4px 16px;
+ text-align: center;
+ text-decoration: none;
+ text-transform: none;
+ white-space: nowrap;
+}
+.tox .tox-button[disabled] {
+ background-color: #006ce7;
+ background-image: none;
+ border-color: #006ce7;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-button:focus:not(:disabled) {
+ background-color: #0060ce;
+ background-image: none;
+ border-color: #0060ce;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button:hover:not(:disabled) {
+ background-color: #0060ce;
+ background-image: none;
+ border-color: #0060ce;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button:active:not(:disabled) {
+ background-color: #0054b4;
+ background-image: none;
+ border-color: #0054b4;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--secondary {
+ background-color: #3d546f;
+ background-image: none;
+ background-position: 0 0;
+ background-repeat: repeat;
+ border-color: #3d546f;
+ border-radius: 6px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ color: #fff;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ outline: none;
+ padding: 4px 16px;
+ text-decoration: none;
+ text-transform: none;
+}
+.tox .tox-button--secondary[disabled] {
+ background-color: #3d546f;
+ background-image: none;
+ border-color: #3d546f;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-button--secondary:focus:not(:disabled) {
+ background-color: #34485f;
+ background-image: none;
+ border-color: #34485f;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--secondary:hover:not(:disabled) {
+ background-color: #34485f;
+ background-image: none;
+ border-color: #34485f;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--secondary:active:not(:disabled) {
+ background-color: #2b3b4e;
+ background-image: none;
+ border-color: #2b3b4e;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--icon,
+.tox .tox-button.tox-button--icon,
+.tox .tox-button.tox-button--secondary.tox-button--icon {
+ padding: 4px;
+}
+.tox .tox-button--icon .tox-icon svg,
+.tox .tox-button.tox-button--icon .tox-icon svg,
+.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg {
+ display: block;
+ fill: currentColor;
+}
+.tox .tox-button-link {
+ background: 0;
+ border: none;
+ box-sizing: border-box;
+ cursor: pointer;
+ display: inline-block;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ font-weight: normal;
+ line-height: 1.3;
+ margin: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.tox .tox-button-link--sm {
+ font-size: 14px;
+}
+.tox .tox-button--naked {
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: unset;
+ color: #fff;
+}
+.tox .tox-button--naked[disabled] {
+ background-color: rgba(255, 255, 255, 0.2);
+ border-color: transparent;
+ box-shadow: unset;
+ color: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-button--naked:hover:not(:disabled) {
+ background-color: rgba(255, 255, 255, 0.2);
+ border-color: transparent;
+ box-shadow: unset;
+ color: #fff;
+}
+.tox .tox-button--naked:focus:not(:disabled) {
+ background-color: rgba(255, 255, 255, 0.2);
+ border-color: transparent;
+ box-shadow: unset;
+ color: #fff;
+}
+.tox .tox-button--naked:active:not(:disabled) {
+ background-color: rgba(255, 255, 255, 0.3);
+ border-color: transparent;
+ box-shadow: unset;
+ color: #fff;
+}
+.tox .tox-button--naked .tox-icon svg {
+ fill: currentColor;
+}
+.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) {
+ color: #fff;
+}
+.tox .tox-checkbox {
+ align-items: center;
+ border-radius: 6px;
+ cursor: pointer;
+ display: flex;
+ height: 36px;
+ min-width: 36px;
+}
+.tox .tox-checkbox__input {
+ /* Hide from view but visible to screen readers */
+ height: 1px;
+ overflow: hidden;
+ position: absolute;
+ top: auto;
+ width: 1px;
+}
+.tox .tox-checkbox__icons {
+ align-items: center;
+ border-radius: 6px;
+ box-shadow: 0 0 0 2px transparent;
+ box-sizing: content-box;
+ display: flex;
+ height: 24px;
+ justify-content: center;
+ padding: calc(4px - 1px);
+ width: 24px;
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: block;
+ fill: rgba(255, 255, 255, 0.2);
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ display: none;
+ fill: #006ce7;
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ display: none;
+ fill: #006ce7;
+}
+.tox .tox-checkbox--disabled {
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: none;
+}
+.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ display: block;
+}
+.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: none;
+}
+.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ display: block;
+}
+.tox input.tox-checkbox__input:focus + .tox-checkbox__icons {
+ border-radius: 6px;
+ box-shadow: inset 0 0 0 1px #006ce7;
+ padding: calc(4px - 1px);
+}
+.tox:not([dir=rtl]) .tox-checkbox__label {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-checkbox__input {
+ left: -10000px;
+}
+.tox:not([dir=rtl]) .tox-bar .tox-checkbox {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-checkbox__label {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-checkbox__input {
+ right: -10000px;
+}
+.tox[dir=rtl] .tox-bar .tox-checkbox {
+ margin-right: 4px;
+}
+.tox {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox .tox-collection--toolbar .tox-collection__group {
+ display: flex;
+ padding: 0;
+}
+.tox .tox-collection--grid .tox-collection__group {
+ display: flex;
+ flex-wrap: wrap;
+ max-height: 208px;
+ overflow-x: hidden;
+ overflow-y: auto;
+ padding: 0;
+}
+.tox .tox-collection--list .tox-collection__group {
+ border-bottom-width: 0;
+ border-color: rgba(255, 255, 255, 0.15);
+ border-left-width: 0;
+ border-right-width: 0;
+ border-style: solid;
+ border-top-width: 1px;
+ padding: 4px 0;
+}
+.tox .tox-collection--list .tox-collection__group:first-child {
+ border-top-width: 0;
+}
+.tox .tox-collection__group-heading {
+ background-color: rgba(255, 255, 255, 0.15);
+ color: rgba(255, 255, 255, 0.5);
+ cursor: default;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: normal;
+ margin-bottom: 4px;
+ margin-top: -4px;
+ padding: 4px 8px;
+ text-transform: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.tox .tox-collection__item {
+ align-items: center;
+ border-radius: 3px;
+ color: #fff;
+ display: flex;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.tox .tox-collection--list .tox-collection__item {
+ padding: 4px 8px;
+}
+.tox .tox-collection--toolbar .tox-collection__item {
+ border-radius: 3px;
+ padding: 4px;
+}
+.tox .tox-collection--grid .tox-collection__item {
+ border-radius: 3px;
+ padding: 4px;
+}
+.tox .tox-collection--list .tox-collection__item--enabled {
+ background-color: #2b3b4e;
+ color: #fff;
+}
+.tox .tox-collection--list .tox-collection__item--active {
+ background-color: #3389ec;
+}
+.tox .tox-collection--toolbar .tox-collection__item--enabled {
+ background-color: #599fef;
+ color: #fff;
+}
+.tox .tox-collection--toolbar .tox-collection__item--active {
+ background-color: #3389ec;
+}
+.tox .tox-collection--grid .tox-collection__item--enabled {
+ background-color: #599fef;
+ color: #fff;
+}
+.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ background-color: #3389ec;
+ color: #fff;
+}
+.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ color: #fff;
+}
+.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ color: #fff;
+}
+.tox .tox-collection__item-icon,
+.tox .tox-collection__item-checkmark {
+ align-items: center;
+ display: flex;
+ height: 24px;
+ justify-content: center;
+ width: 24px;
+}
+.tox .tox-collection__item-icon svg,
+.tox .tox-collection__item-checkmark svg {
+ fill: currentColor;
+}
+.tox .tox-collection--toolbar-lg .tox-collection__item-icon {
+ height: 48px;
+ width: 48px;
+}
+.tox .tox-collection__item-label {
+ color: currentColor;
+ display: inline-block;
+ flex: 1;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 24px;
+ text-transform: none;
+ word-break: break-all;
+}
+.tox .tox-collection__item-accessory {
+ color: rgba(255, 255, 255, 0.5);
+ display: inline-block;
+ font-size: 14px;
+ height: 24px;
+ line-height: 24px;
+ text-transform: none;
+}
+.tox .tox-collection__item-caret {
+ align-items: center;
+ display: flex;
+ min-height: 24px;
+}
+.tox .tox-collection__item-caret::after {
+ content: '';
+ font-size: 0;
+ min-height: inherit;
+}
+.tox .tox-collection__item-caret svg {
+ fill: #fff;
+}
+.tox .tox-collection__item--state-disabled {
+ background-color: transparent;
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg {
+ display: none;
+}
+.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory + .tox-collection__item-checkmark {
+ display: none;
+}
+.tox .tox-collection--horizontal {
+ background-color: #2b3b4e;
+ border: 1px solid rgba(255, 255, 255, 0.15);
+ border-radius: 6px;
+ box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15);
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: nowrap;
+ margin-bottom: 0;
+ overflow-x: auto;
+ padding: 0;
+}
+.tox .tox-collection--horizontal .tox-collection__group {
+ align-items: center;
+ display: flex;
+ flex-wrap: nowrap;
+ margin: 0;
+ padding: 0 4px;
+}
+.tox .tox-collection--horizontal .tox-collection__item {
+ height: 28px;
+ margin: 6px 1px 5px 0;
+ padding: 0 4px;
+}
+.tox .tox-collection--horizontal .tox-collection__item-label {
+ white-space: nowrap;
+}
+.tox .tox-collection--horizontal .tox-collection__item-caret {
+ margin-left: 4px;
+}
+.tox .tox-collection__item-container {
+ display: flex;
+}
+.tox .tox-collection__item-container--row {
+ align-items: center;
+ flex: 1 1 auto;
+ flex-direction: row;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--align-left {
+ margin-right: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--align-right {
+ justify-content: flex-end;
+ margin-left: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top {
+ align-items: flex-start;
+ margin-bottom: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle {
+ align-items: center;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom {
+ align-items: flex-end;
+ margin-top: auto;
+}
+.tox .tox-collection__item-container--column {
+ align-self: center;
+ flex: 1 1 auto;
+ flex-direction: column;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--align-left {
+ align-items: flex-start;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--align-right {
+ align-items: flex-end;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top {
+ align-self: flex-start;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle {
+ align-self: center;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom {
+ align-self: flex-end;
+}
+.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) {
+ border-right: 1px solid transparent;
+}
+.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > *:not(:first-child) {
+ margin-left: 8px;
+}
+.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-collection__item-accessory {
+ margin-left: 16px;
+ text-align: right;
+}
+.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret {
+ margin-left: 16px;
+}
+.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) {
+ border-left: 1px solid transparent;
+}
+.tox[dir=rtl] .tox-collection--list .tox-collection__item > *:not(:first-child) {
+ margin-right: 8px;
+}
+.tox[dir=rtl] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-collection__item-accessory {
+ margin-right: 16px;
+ text-align: left;
+}
+.tox[dir=rtl] .tox-collection .tox-collection__item-caret {
+ margin-right: 16px;
+ transform: rotateY(180deg);
+}
+.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret {
+ margin-right: 4px;
+}
+.tox .tox-color-picker-container {
+ display: flex;
+ flex-direction: row;
+ height: 225px;
+ margin: 0;
+}
+.tox .tox-sv-palette {
+ box-sizing: border-box;
+ display: flex;
+ height: 100%;
+}
+.tox .tox-sv-palette-spectrum {
+ height: 100%;
+}
+.tox .tox-sv-palette,
+.tox .tox-sv-palette-spectrum {
+ width: 225px;
+}
+.tox .tox-sv-palette-thumb {
+ background: none;
+ border: 1px solid black;
+ border-radius: 50%;
+ box-sizing: content-box;
+ height: 12px;
+ position: absolute;
+ width: 12px;
+}
+.tox .tox-sv-palette-inner-thumb {
+ border: 1px solid white;
+ border-radius: 50%;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+}
+.tox .tox-hue-slider {
+ box-sizing: border-box;
+ height: 100%;
+ width: 25px;
+}
+.tox .tox-hue-slider-spectrum {
+ background: linear-gradient(to bottom, #f00, #ff0080, #f0f, #8000ff, #00f, #0080ff, #0ff, #00ff80, #0f0, #80ff00, #ff0, #ff8000, #f00);
+ height: 100%;
+ width: 100%;
+}
+.tox .tox-hue-slider,
+.tox .tox-hue-slider-spectrum {
+ width: 20px;
+}
+.tox .tox-hue-slider-thumb {
+ background: white;
+ border: 1px solid black;
+ box-sizing: content-box;
+ height: 4px;
+ width: 100%;
+}
+.tox .tox-rgb-form {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+}
+.tox .tox-rgb-form div {
+ align-items: center;
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 5px;
+ width: inherit;
+}
+.tox .tox-rgb-form input {
+ width: 6em;
+}
+.tox .tox-rgb-form input.tox-invalid {
+ /* Need !important to override Chrome's focus styling unfortunately */
+ border: 1px solid red !important;
+}
+.tox .tox-rgb-form .tox-rgba-preview {
+ border: 1px solid black;
+ flex-grow: 2;
+ margin-bottom: 0;
+}
+.tox:not([dir=rtl]) .tox-sv-palette {
+ margin-right: 15px;
+}
+.tox:not([dir=rtl]) .tox-hue-slider {
+ margin-right: 15px;
+}
+.tox:not([dir=rtl]) .tox-hue-slider-thumb {
+ margin-left: -1px;
+}
+.tox:not([dir=rtl]) .tox-rgb-form label {
+ margin-right: 0.5em;
+}
+.tox[dir=rtl] .tox-sv-palette {
+ margin-left: 15px;
+}
+.tox[dir=rtl] .tox-hue-slider {
+ margin-left: 15px;
+}
+.tox[dir=rtl] .tox-hue-slider-thumb {
+ margin-right: -1px;
+}
+.tox[dir=rtl] .tox-rgb-form label {
+ margin-left: 0.5em;
+}
+.tox .tox-toolbar .tox-swatches,
+.tox .tox-toolbar__primary .tox-swatches,
+.tox .tox-toolbar__overflow .tox-swatches {
+ margin: 5px 0 6px 11px;
+}
+.tox .tox-collection--list .tox-collection__group .tox-swatches-menu {
+ border: 0;
+ margin: -4px -4px;
+}
+.tox .tox-swatches__row {
+ display: flex;
+}
+.tox .tox-swatch {
+ height: 30px;
+ transition: transform 0.15s, box-shadow 0.15s;
+ width: 30px;
+}
+.tox .tox-swatch:hover,
+.tox .tox-swatch:focus {
+ box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset;
+ transform: scale(0.8);
+}
+.tox .tox-swatch--remove {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+}
+.tox .tox-swatch--remove svg path {
+ stroke: #e74c3c;
+}
+.tox .tox-swatches__picker-btn {
+ align-items: center;
+ background-color: transparent;
+ border: 0;
+ cursor: pointer;
+ display: flex;
+ height: 30px;
+ justify-content: center;
+ outline: none;
+ padding: 0;
+ width: 30px;
+}
+.tox .tox-swatches__picker-btn svg {
+ fill: #fff;
+ height: 24px;
+ width: 24px;
+}
+.tox .tox-swatches__picker-btn:hover {
+ background: #3389ec;
+}
+.tox:not([dir=rtl]) .tox-swatches__picker-btn {
+ margin-left: auto;
+}
+.tox[dir=rtl] .tox-swatches__picker-btn {
+ margin-right: auto;
+}
+.tox .tox-comment-thread {
+ background: #2b3b4e;
+ position: relative;
+}
+.tox .tox-comment-thread > *:not(:first-child) {
+ margin-top: 8px;
+}
+.tox .tox-comment {
+ background: #2b3b4e;
+ border: 1px solid #161f29;
+ border-radius: 6px;
+ box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1);
+ padding: 8px 8px 16px 8px;
+ position: relative;
+}
+.tox .tox-comment__header {
+ align-items: center;
+ color: #fff;
+ display: flex;
+ justify-content: space-between;
+}
+.tox .tox-comment__date {
+ color: rgba(255, 255, 255, 0.5);
+ font-size: 12px;
+}
+.tox .tox-comment__body {
+ color: #fff;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ margin-top: 8px;
+ position: relative;
+ text-transform: initial;
+}
+.tox .tox-comment__body textarea {
+ resize: none;
+ white-space: normal;
+ width: 100%;
+}
+.tox .tox-comment__expander {
+ padding-top: 8px;
+}
+.tox .tox-comment__expander p {
+ color: rgba(255, 255, 255, 0.5);
+ font-size: 14px;
+ font-style: normal;
+}
+.tox .tox-comment__body p {
+ margin: 0;
+}
+.tox .tox-comment__buttonspacing {
+ padding-top: 16px;
+ text-align: center;
+}
+.tox .tox-comment-thread__overlay::after {
+ background: #2b3b4e;
+ bottom: 0;
+ content: "";
+ display: flex;
+ left: 0;
+ opacity: 0.9;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 5;
+}
+.tox .tox-comment__reply {
+ display: flex;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ margin-top: 8px;
+}
+.tox .tox-comment__reply > *:first-child {
+ margin-bottom: 8px;
+ width: 100%;
+}
+.tox .tox-comment__edit {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ margin-top: 16px;
+}
+.tox .tox-comment__gradient::after {
+ background: linear-gradient(rgba(43, 59, 78, 0), #2b3b4e);
+ bottom: 0;
+ content: "";
+ display: block;
+ height: 5em;
+ margin-top: -40px;
+ position: absolute;
+ width: 100%;
+}
+.tox .tox-comment__overlay {
+ background: #2b3b4e;
+ bottom: 0;
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ left: 0;
+ opacity: 0.9;
+ position: absolute;
+ right: 0;
+ text-align: center;
+ top: 0;
+ z-index: 5;
+}
+.tox .tox-comment__loading-text {
+ align-items: center;
+ color: #fff;
+ display: flex;
+ flex-direction: column;
+ position: relative;
+}
+.tox .tox-comment__loading-text > div {
+ padding-bottom: 16px;
+}
+.tox .tox-comment__overlaytext {
+ bottom: 0;
+ flex-direction: column;
+ font-size: 14px;
+ left: 0;
+ padding: 1em;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 10;
+}
+.tox .tox-comment__overlaytext p {
+ background-color: #2b3b4e;
+ box-shadow: 0 0 8px 8px #2b3b4e;
+ color: #fff;
+ text-align: center;
+}
+.tox .tox-comment__overlaytext div:nth-of-type(2) {
+ font-size: 0.8em;
+}
+.tox .tox-comment__busy-spinner {
+ align-items: center;
+ background-color: #2b3b4e;
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 20;
+}
+.tox .tox-comment__scroll {
+ display: flex;
+ flex-direction: column;
+ flex-shrink: 1;
+ overflow: auto;
+}
+.tox .tox-conversations {
+ margin: 8px;
+}
+.tox:not([dir=rtl]) .tox-comment__edit {
+ margin-left: 8px;
+}
+.tox:not([dir=rtl]) .tox-comment__buttonspacing > *:last-child,
+.tox:not([dir=rtl]) .tox-comment__edit > *:last-child,
+.tox:not([dir=rtl]) .tox-comment__reply > *:last-child {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-comment__edit {
+ margin-right: 8px;
+}
+.tox[dir=rtl] .tox-comment__buttonspacing > *:last-child,
+.tox[dir=rtl] .tox-comment__edit > *:last-child,
+.tox[dir=rtl] .tox-comment__reply > *:last-child {
+ margin-right: 8px;
+}
+.tox .tox-user {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-user__avatar svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-user__name {
+ color: rgba(255, 255, 255, 0.5);
+ font-size: 12px;
+ font-style: normal;
+ font-weight: bold;
+ text-transform: uppercase;
+}
+.tox:not([dir=rtl]) .tox-user__avatar svg {
+ margin-right: 8px;
+}
+.tox:not([dir=rtl]) .tox-user__avatar + .tox-user__name {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-user__avatar svg {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-user__avatar + .tox-user__name {
+ margin-right: 8px;
+}
+.tox .tox-dialog-wrap {
+ align-items: center;
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: fixed;
+ right: 0;
+ top: 0;
+ z-index: 1100;
+}
+.tox .tox-dialog-wrap__backdrop {
+ background-color: rgba(34, 47, 62, 0.75);
+ bottom: 0;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 1;
+}
+.tox .tox-dialog-wrap__backdrop--opaque {
+ background-color: #222F3E;
+}
+.tox .tox-dialog {
+ background-color: #2b3b4e;
+ border-color: #161f29;
+ border-radius: 10px;
+ border-style: solid;
+ border-width: 0px;
+ box-shadow: 0 16px 16px -10px rgba(34, 47, 62, 0.15), 0 0 40px 1px rgba(34, 47, 62, 0.15);
+ display: flex;
+ flex-direction: column;
+ max-height: 100%;
+ max-width: 480px;
+ overflow: hidden;
+ position: relative;
+ width: 95vw;
+ z-index: 2;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog {
+ align-self: flex-start;
+ margin: 8px auto;
+ width: calc(100vw - 16px);
+ }
+}
+.tox .tox-dialog-inline {
+ z-index: 1100;
+}
+.tox .tox-dialog__header {
+ align-items: center;
+ background-color: #2b3b4e;
+ border-bottom: none;
+ color: #fff;
+ display: flex;
+ font-size: 16px;
+ justify-content: space-between;
+ padding: 8px 16px 0 16px;
+ position: relative;
+}
+.tox .tox-dialog__header .tox-button {
+ z-index: 1;
+}
+.tox .tox-dialog__draghandle {
+ cursor: grab;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tox .tox-dialog__draghandle:active {
+ cursor: grabbing;
+}
+.tox .tox-dialog__dismiss {
+ margin-left: auto;
+}
+.tox .tox-dialog__title {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 20px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ margin: 0;
+ text-transform: none;
+}
+.tox .tox-dialog__body {
+ color: #fff;
+ display: flex;
+ flex: 1;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ min-width: 0;
+ text-align: left;
+ text-transform: none;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog__body {
+ flex-direction: column;
+ }
+}
+.tox .tox-dialog__body-nav {
+ align-items: flex-start;
+ display: flex;
+ flex-direction: column;
+ padding: 16px 16px;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog__body-nav {
+ flex-direction: row;
+ -webkit-overflow-scrolling: touch;
+ overflow-x: auto;
+ padding-bottom: 0;
+ }
+}
+.tox .tox-dialog__body-nav-item {
+ border-bottom: 2px solid transparent;
+ color: rgba(255, 255, 255, 0.5);
+ display: inline-block;
+ font-size: 14px;
+ line-height: 1.3;
+ margin-bottom: 8px;
+ text-decoration: none;
+ white-space: nowrap;
+}
+.tox .tox-dialog__body-nav-item:focus {
+ background-color: rgba(0, 108, 231, 0.1);
+}
+.tox .tox-dialog__body-nav-item--active {
+ border-bottom: 2px solid #006ce7;
+ color: #006ce7;
+}
+.tox .tox-dialog__body-content {
+ box-sizing: border-box;
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ max-height: 650px;
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+ padding: 16px 16px;
+}
+.tox .tox-dialog__body-content > * {
+ margin-bottom: 0;
+ margin-top: 16px;
+}
+.tox .tox-dialog__body-content > *:first-child {
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content > *:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-dialog__body-content > *:only-child {
+ margin-bottom: 0;
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content a {
+ color: #006ce7;
+ cursor: pointer;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content a:hover,
+.tox .tox-dialog__body-content a:focus {
+ color: #0054b4;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content a:active {
+ color: #0054b4;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content svg {
+ fill: #fff;
+}
+.tox .tox-dialog__body-content ul {
+ display: block;
+ list-style-type: disc;
+ margin-bottom: 16px;
+ margin-inline-end: 0;
+ margin-inline-start: 0;
+ padding-inline-start: 2.5rem;
+}
+.tox .tox-dialog__body-content .tox-form__group h1 {
+ color: #fff;
+ font-size: 20px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ margin-bottom: 16px;
+ margin-top: 2rem;
+ text-transform: none;
+}
+.tox .tox-dialog__body-content .tox-form__group h2 {
+ color: #fff;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ margin-bottom: 16px;
+ margin-top: 2rem;
+ text-transform: none;
+}
+.tox .tox-dialog__body-content .tox-form__group p {
+ margin-bottom: 16px;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:first-child,
+.tox .tox-dialog__body-content .tox-form__group h2:first-child,
+.tox .tox-dialog__body-content .tox-form__group p:first-child {
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:last-child,
+.tox .tox-dialog__body-content .tox-form__group h2:last-child,
+.tox .tox-dialog__body-content .tox-form__group p:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:only-child,
+.tox .tox-dialog__body-content .tox-form__group h2:only-child,
+.tox .tox-dialog__body-content .tox-form__group p:only-child {
+ margin-bottom: 0;
+ margin-top: 0;
+}
+.tox .tox-dialog--width-lg {
+ height: 650px;
+ max-width: 1200px;
+}
+.tox .tox-dialog--width-md {
+ max-width: 800px;
+}
+.tox .tox-dialog--width-md .tox-dialog__body-content {
+ overflow: auto;
+}
+.tox .tox-dialog__body-content--centered {
+ text-align: center;
+}
+.tox .tox-dialog__footer {
+ align-items: center;
+ background-color: #2b3b4e;
+ border-top: none;
+ display: flex;
+ justify-content: space-between;
+ padding: 8px 16px;
+}
+.tox .tox-dialog__footer-start,
+.tox .tox-dialog__footer-end {
+ display: flex;
+}
+.tox .tox-dialog__busy-spinner {
+ align-items: center;
+ background-color: rgba(34, 47, 62, 0.75);
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 3;
+}
+.tox .tox-dialog__table {
+ border-collapse: collapse;
+ width: 100%;
+}
+.tox .tox-dialog__table thead th {
+ font-weight: bold;
+ padding-bottom: 8px;
+}
+.tox .tox-dialog__table tbody tr {
+ border-bottom: 1px solid #161f29;
+}
+.tox .tox-dialog__table tbody tr:last-child {
+ border-bottom: none;
+}
+.tox .tox-dialog__table td {
+ padding-bottom: 8px;
+ padding-top: 8px;
+}
+.tox .tox-dialog__popups {
+ position: absolute;
+ width: 100%;
+ z-index: 1100;
+}
+.tox .tox-dialog__body-iframe {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+}
+.tox .tox-dialog__body-iframe .tox-navobj {
+ display: flex;
+ flex: 1;
+}
+.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) {
+ flex: 1;
+ height: 100%;
+}
+.tox .tox-dialog-dock-fadeout {
+ opacity: 0;
+ visibility: hidden;
+}
+.tox .tox-dialog-dock-fadein {
+ opacity: 1;
+ visibility: visible;
+}
+.tox .tox-dialog-dock-transition {
+ transition: visibility 0s linear 0.3s, opacity 0.3s ease;
+}
+.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein {
+ transition-delay: 0s;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav {
+ margin-right: 0;
+ }
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child) {
+ margin-left: 8px;
+ }
+}
+.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start > *,
+.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end > * {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-dialog__body {
+ text-align: right;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav {
+ margin-left: 0;
+ }
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child) {
+ margin-right: 8px;
+ }
+}
+.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start > *,
+.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end > * {
+ margin-right: 8px;
+}
+body.tox-dialog__disable-scroll {
+ overflow: hidden;
+}
+.tox .tox-dropzone-container {
+ display: flex;
+ flex: 1;
+}
+.tox .tox-dropzone {
+ align-items: center;
+ background: #fff;
+ border: 2px dashed #161f29;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ justify-content: center;
+ min-height: 100px;
+ padding: 10px;
+}
+.tox .tox-dropzone p {
+ color: rgba(255, 255, 255, 0.5);
+ margin: 0 0 16px 0;
+}
+.tox .tox-edit-area {
+ display: flex;
+ flex: 1;
+ overflow: hidden;
+ position: relative;
+}
+.tox .tox-edit-area__iframe {
+ background-color: #fff;
+ border: 0;
+ box-sizing: border-box;
+ flex: 1;
+ height: 100%;
+ position: absolute;
+ width: 100%;
+}
+.tox.tox-inline-edit-area {
+ border: 1px dotted #161f29;
+}
+.tox .tox-editor-container {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ overflow: hidden;
+}
+.tox .tox-editor-header {
+ z-index: 1;
+}
+.tox:not(.tox-tinymce-inline) .tox-editor-header {
+ background-color: #222F3E;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.15);
+ box-shadow: none;
+ padding: 4px 0;
+ transition: box-shadow 0.5s;
+}
+.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header {
+ border-top: 1px solid rgba(255, 255, 255, 0.15);
+ box-shadow: none;
+}
+.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header {
+ background-color: #222F3E;
+ box-shadow: none;
+ padding: 4px 0;
+}
+.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header {
+ box-shadow: none;
+}
+.tox-editor-dock-fadeout {
+ opacity: 0;
+ visibility: hidden;
+}
+.tox-editor-dock-fadein {
+ opacity: 1;
+ visibility: visible;
+}
+.tox-editor-dock-transition {
+ transition: visibility 0s linear 0.25s, opacity 0.25s ease;
+}
+.tox-editor-dock-transition.tox-editor-dock-fadein {
+ transition-delay: 0s;
+}
+.tox .tox-control-wrap {
+ flex: 1;
+ position: relative;
+}
+.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,
+.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,
+.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid {
+ display: none;
+}
+.tox .tox-control-wrap svg {
+ display: block;
+}
+.tox .tox-control-wrap__status-icon-wrap {
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-control-wrap__status-icon-invalid svg {
+ fill: #c00;
+}
+.tox .tox-control-wrap__status-icon-unknown svg {
+ fill: orange;
+}
+.tox .tox-control-wrap__status-icon-valid svg {
+ fill: green;
+}
+.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,
+.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,
+.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield {
+ padding-right: 32px;
+}
+.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap {
+ right: 4px;
+}
+.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,
+.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,
+.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield {
+ padding-left: 32px;
+}
+.tox[dir=rtl] .tox-control-wrap__status-icon-wrap {
+ left: 4px;
+}
+.tox .tox-autocompleter {
+ max-width: 25em;
+}
+.tox .tox-autocompleter .tox-menu {
+ border-color: #161f29;
+ box-shadow: none;
+ max-width: 25em;
+}
+.tox .tox-autocompleter .tox-autocompleter-highlight {
+ font-weight: bold;
+}
+.tox .tox-color-input {
+ display: flex;
+ position: relative;
+ z-index: 1;
+}
+.tox .tox-color-input .tox-textfield {
+ z-index: -1;
+}
+.tox .tox-color-input span {
+ border-color: rgba(34, 47, 62, 0.2);
+ border-radius: 6px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ height: 24px;
+ position: absolute;
+ top: 6px;
+ width: 24px;
+}
+.tox .tox-color-input span:hover:not([aria-disabled=true]),
+.tox .tox-color-input span:focus:not([aria-disabled=true]) {
+ border-color: #006ce7;
+ cursor: pointer;
+}
+.tox .tox-color-input span::before {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.25) 25%, transparent 25%), linear-gradient(-45deg, rgba(255, 255, 255, 0.25) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, rgba(255, 255, 255, 0.25) 75%), linear-gradient(-45deg, transparent 75%, rgba(255, 255, 255, 0.25) 75%);
+ background-position: 0 0, 0 6px, 6px -6px, -6px 0;
+ background-size: 12px 12px;
+ border: 1px solid #2b3b4e;
+ border-radius: 6px;
+ box-sizing: border-box;
+ content: '';
+ height: 24px;
+ left: -1px;
+ position: absolute;
+ top: -1px;
+ width: 24px;
+ z-index: -1;
+}
+.tox .tox-color-input span[aria-disabled=true] {
+ cursor: not-allowed;
+}
+.tox:not([dir=rtl]) .tox-color-input {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox:not([dir=rtl]) .tox-color-input .tox-textfield {
+ padding-left: 36px;
+}
+.tox:not([dir=rtl]) .tox-color-input span {
+ left: 6px;
+}
+.tox[dir="rtl"] .tox-color-input {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox[dir="rtl"] .tox-color-input .tox-textfield {
+ padding-right: 36px;
+}
+.tox[dir="rtl"] .tox-color-input span {
+ right: 6px;
+}
+.tox .tox-label,
+.tox .tox-toolbar-label {
+ color: rgba(255, 255, 255, 0.5);
+ display: block;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ padding: 0 8px 0 0;
+ text-transform: none;
+ white-space: nowrap;
+}
+.tox .tox-toolbar-label {
+ padding: 0 8px;
+}
+.tox[dir=rtl] .tox-label {
+ padding: 0 0 0 8px;
+}
+.tox .tox-form {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+}
+.tox .tox-form__group {
+ box-sizing: border-box;
+ margin-bottom: 4px;
+}
+.tox .tox-form-group--maximize {
+ flex: 1;
+}
+.tox .tox-form__group--error {
+ color: #c00;
+}
+.tox .tox-form__group--collection {
+ display: flex;
+}
+.tox .tox-form__grid {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: space-between;
+}
+.tox .tox-form__grid--2col > .tox-form__group {
+ width: calc(50% - (8px / 2));
+}
+.tox .tox-form__grid--3col > .tox-form__group {
+ width: calc(100% / 3 - (8px / 2));
+}
+.tox .tox-form__grid--4col > .tox-form__group {
+ width: calc(25% - (8px / 2));
+}
+.tox .tox-form__controls-h-stack {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-form__group--inline {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-form__group--stretched {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+}
+.tox .tox-form__group--stretched .tox-textarea {
+ flex: 1;
+}
+.tox .tox-form__group--stretched .tox-navobj {
+ display: flex;
+ flex: 1;
+}
+.tox .tox-form__group--stretched .tox-navobj :nth-child(2) {
+ flex: 1;
+ height: 100%;
+}
+.tox:not([dir=rtl]) .tox-form__controls-h-stack > *:not(:first-child) {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-form__controls-h-stack > *:not(:first-child) {
+ margin-right: 4px;
+}
+.tox .tox-lock.tox-locked .tox-lock-icon__unlock,
+.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock {
+ display: none;
+}
+.tox .tox-textfield,
+.tox .tox-toolbar-textfield,
+.tox .tox-listboxfield .tox-listbox--select,
+.tox .tox-textarea {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: #2b3b4e;
+ border-color: #161f29;
+ border-radius: 6px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #fff;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ margin: 0;
+ min-height: 34px;
+ outline: none;
+ padding: 5px 5.5px;
+ resize: none;
+ width: 100%;
+}
+.tox .tox-textfield[disabled],
+.tox .tox-textarea[disabled] {
+ background-color: #222f3e;
+ color: rgba(255, 255, 255, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-textfield:focus,
+.tox .tox-listboxfield .tox-listbox--select:focus,
+.tox .tox-textarea:focus {
+ background-color: #2b3b4e;
+ border-color: #006ce7;
+ box-shadow: 0 0 0 2px rgba(0, 108, 231, 0.25);
+ outline: none;
+}
+.tox .tox-toolbar-textfield {
+ border-width: 0;
+ margin-bottom: 3px;
+ margin-top: 2px;
+ max-width: 250px;
+}
+.tox .tox-naked-btn {
+ background-color: transparent;
+ border: 0;
+ border-color: transparent;
+ box-shadow: unset;
+ color: #006ce7;
+ cursor: pointer;
+ display: block;
+ margin: 0;
+ padding: 0;
+}
+.tox .tox-naked-btn svg {
+ display: block;
+ fill: #fff;
+}
+.tox:not([dir=rtl]) .tox-toolbar-textfield + * {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-toolbar-textfield + * {
+ margin-right: 4px;
+}
+.tox .tox-listboxfield {
+ cursor: pointer;
+ position: relative;
+}
+.tox .tox-listboxfield .tox-listbox--select[disabled] {
+ background-color: #19232e;
+ color: rgba(255, 255, 255, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-listbox__select-label {
+ cursor: default;
+ flex: 1;
+ margin: 0 4px;
+}
+.tox .tox-listbox__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+}
+.tox .tox-listbox__select-chevron svg {
+ fill: #fff;
+}
+.tox .tox-listboxfield .tox-listbox--select {
+ align-items: center;
+ display: flex;
+}
+.tox:not([dir=rtl]) .tox-listboxfield svg {
+ right: 8px;
+}
+.tox[dir=rtl] .tox-listboxfield svg {
+ left: 8px;
+}
+.tox .tox-selectfield {
+ cursor: pointer;
+ position: relative;
+}
+.tox .tox-selectfield select {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: #2b3b4e;
+ border-color: #161f29;
+ border-radius: 6px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #fff;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ margin: 0;
+ min-height: 34px;
+ outline: none;
+ padding: 5px 5.5px;
+ resize: none;
+ width: 100%;
+}
+.tox .tox-selectfield select[disabled] {
+ background-color: #19232e;
+ color: rgba(255, 255, 255, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-selectfield select::-ms-expand {
+ display: none;
+}
+.tox .tox-selectfield select:focus {
+ background-color: #2b3b4e;
+ border-color: #006ce7;
+ box-shadow: 0 0 0 2px rgba(0, 108, 231, 0.25);
+ outline: none;
+}
+.tox .tox-selectfield svg {
+ pointer-events: none;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox:not([dir=rtl]) .tox-selectfield select[size="0"],
+.tox:not([dir=rtl]) .tox-selectfield select[size="1"] {
+ padding-right: 24px;
+}
+.tox:not([dir=rtl]) .tox-selectfield svg {
+ right: 8px;
+}
+.tox[dir=rtl] .tox-selectfield select[size="0"],
+.tox[dir=rtl] .tox-selectfield select[size="1"] {
+ padding-left: 24px;
+}
+.tox[dir=rtl] .tox-selectfield svg {
+ left: 8px;
+}
+.tox .tox-textarea {
+ -webkit-appearance: textarea;
+ -moz-appearance: textarea;
+ appearance: textarea;
+ white-space: pre-wrap;
+}
+.tox-fullscreen {
+ border: 0;
+ height: 100%;
+ margin: 0;
+ overflow: hidden;
+ overscroll-behavior: none;
+ padding: 0;
+ touch-action: pinch-zoom;
+ width: 100%;
+}
+.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {
+ display: none;
+}
+.tox.tox-tinymce.tox-fullscreen,
+.tox-shadowhost.tox-fullscreen {
+ left: 0;
+ position: fixed;
+ top: 0;
+ z-index: 1200;
+}
+.tox.tox-tinymce.tox-fullscreen {
+ background-color: transparent;
+}
+.tox-fullscreen .tox.tox-tinymce-aux,
+.tox-fullscreen ~ .tox.tox-tinymce-aux {
+ z-index: 1201;
+}
+.tox .tox-help__more-link {
+ list-style: none;
+ margin-top: 1em;
+}
+.tox .tox-imagepreview {
+ background-color: #666;
+ height: 380px;
+ overflow: hidden;
+ position: relative;
+ width: 100%;
+}
+.tox .tox-imagepreview.tox-imagepreview__loaded {
+ overflow: auto;
+}
+.tox .tox-imagepreview__container {
+ display: flex;
+ left: 100vw;
+ position: absolute;
+ top: 100vw;
+}
+.tox .tox-imagepreview__image {
+ background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==);
+}
+.tox .tox-image-tools .tox-spacer {
+ flex: 1;
+}
+.tox .tox-image-tools .tox-bar {
+ align-items: center;
+ display: flex;
+ height: 60px;
+ justify-content: center;
+}
+.tox .tox-image-tools .tox-imagepreview,
+.tox .tox-image-tools .tox-imagepreview + .tox-bar {
+ margin-top: 8px;
+}
+.tox .tox-image-tools .tox-croprect-block {
+ background: black;
+ filter: alpha(opacity=50);
+ opacity: 0.5;
+ position: absolute;
+ zoom: 1;
+}
+.tox .tox-image-tools .tox-croprect-handle {
+ border: 2px solid white;
+ height: 20px;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 20px;
+}
+.tox .tox-image-tools .tox-croprect-handle-move {
+ border: 0;
+ cursor: move;
+ position: absolute;
+}
+.tox .tox-image-tools .tox-croprect-handle-nw {
+ border-width: 2px 0 0 2px;
+ cursor: nw-resize;
+ left: 100px;
+ margin: -2px 0 0 -2px;
+ top: 100px;
+}
+.tox .tox-image-tools .tox-croprect-handle-ne {
+ border-width: 2px 2px 0 0;
+ cursor: ne-resize;
+ left: 200px;
+ margin: -2px 0 0 -20px;
+ top: 100px;
+}
+.tox .tox-image-tools .tox-croprect-handle-sw {
+ border-width: 0 0 2px 2px;
+ cursor: sw-resize;
+ left: 100px;
+ margin: -20px 2px 0 -2px;
+ top: 200px;
+}
+.tox .tox-image-tools .tox-croprect-handle-se {
+ border-width: 0 2px 2px 0;
+ cursor: se-resize;
+ left: 200px;
+ margin: -20px 0 0 -20px;
+ top: 200px;
+}
+.tox .tox-insert-table-picker {
+ display: flex;
+ flex-wrap: wrap;
+ width: 170px;
+}
+.tox .tox-insert-table-picker > div {
+ border-color: rgba(255, 255, 255, 0.15);
+ border-style: solid;
+ border-width: 0 1px 1px 0;
+ box-sizing: border-box;
+ height: 17px;
+ width: 17px;
+}
+.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker {
+ margin: -4px -4px;
+}
+.tox .tox-insert-table-picker .tox-insert-table-picker__selected {
+ background-color: rgba(0, 108, 231, 0.5);
+ border-color: rgba(0, 108, 231, 0.5);
+}
+.tox .tox-insert-table-picker__label {
+ color: #fff;
+ display: block;
+ font-size: 14px;
+ padding: 4px;
+ text-align: center;
+ width: 100%;
+}
+.tox:not([dir=rtl]) {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox:not([dir=rtl]) .tox-insert-table-picker > div:nth-child(10n) {
+ border-right: 0;
+}
+.tox[dir=rtl] {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox[dir=rtl] .tox-insert-table-picker > div:nth-child(10n+1) {
+ border-right: 0;
+}
+.tox {
+ /* stylelint-disable */
+ /* stylelint-enable */
+}
+.tox .tox-menu {
+ background-color: #2b3b4e;
+ border: 1px solid rgba(255, 255, 255, 0.15);
+ border-radius: 6px;
+ box-shadow: none;
+ display: inline-block;
+ overflow: hidden;
+ vertical-align: top;
+ z-index: 1150;
+}
+.tox .tox-menu.tox-collection.tox-collection--list {
+ padding: 0 4px;
+}
+.tox .tox-menu.tox-collection.tox-collection--toolbar {
+ padding: 8px;
+}
+.tox .tox-menu.tox-collection.tox-collection--grid {
+ padding: 8px;
+}
+.tox .tox-menu__label h1,
+.tox .tox-menu__label h2,
+.tox .tox-menu__label h3,
+.tox .tox-menu__label h4,
+.tox .tox-menu__label h5,
+.tox .tox-menu__label h6,
+.tox .tox-menu__label p,
+.tox .tox-menu__label blockquote,
+.tox .tox-menu__label code {
+ margin: 0;
+}
+.tox .tox-menubar {
+ background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='transparent'/%3E%3C/svg%3E") left 0 top 0 #222F3E;
+ background-color: #222F3E;
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ padding: 0 11px 0 12px;
+}
+.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar {
+ border-top: 1px solid transparent;
+}
+/* Deprecated. Remove in next major release */
+.tox .tox-mbtn {
+ align-items: center;
+ background: transparent;
+ border: 0;
+ border-radius: 3px;
+ box-shadow: none;
+ color: #fff;
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ height: 28px;
+ justify-content: center;
+ margin: 5px 1px 6px 0;
+ outline: none;
+ overflow: hidden;
+ padding: 0 4px;
+ text-transform: none;
+ width: auto;
+}
+.tox .tox-mbtn[disabled] {
+ background-color: transparent;
+ border: 0;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-mbtn:focus:not(:disabled) {
+ background: #3389ec;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-mbtn--active {
+ background: #599fef;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) {
+ background: #3389ec;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-mbtn__select-label {
+ cursor: default;
+ font-weight: normal;
+ margin: 0 4px;
+}
+.tox .tox-mbtn[disabled] .tox-mbtn__select-label {
+ cursor: not-allowed;
+}
+.tox .tox-mbtn__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+ display: none;
+}
+.tox .tox-notification {
+ border-radius: 6px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ display: grid;
+ font-size: 14px;
+ font-weight: normal;
+ grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr);
+ margin-top: 4px;
+ opacity: 0;
+ padding: 4px;
+ transition: transform 100ms ease-in, opacity 150ms ease-in;
+}
+.tox .tox-notification p {
+ font-size: 14px;
+ font-weight: normal;
+}
+.tox .tox-notification a {
+ cursor: pointer;
+ text-decoration: underline;
+}
+.tox .tox-notification--in {
+ opacity: 1;
+}
+.tox .tox-notification--success {
+ background-color: #334840;
+ border-color: #3c5440;
+ color: #fff;
+}
+.tox .tox-notification--success p {
+ color: #fff;
+}
+.tox .tox-notification--success a {
+ color: #b5d199;
+}
+.tox .tox-notification--success svg {
+ fill: #fff;
+}
+.tox .tox-notification--error {
+ background-color: #442632;
+ border-color: #55212b;
+ color: #fff;
+}
+.tox .tox-notification--error p {
+ color: #fff;
+}
+.tox .tox-notification--error a {
+ color: #e68080;
+}
+.tox .tox-notification--error svg {
+ fill: #fff;
+}
+.tox .tox-notification--warn,
+.tox .tox-notification--warning {
+ background-color: #222F3E;
+ border-color: rgba(255, 255, 255, 0.15);
+ color: #fff0b3;
+}
+.tox .tox-notification--warn p,
+.tox .tox-notification--warning p {
+ color: #fff0b3;
+}
+.tox .tox-notification--warn a,
+.tox .tox-notification--warning a {
+ color: #ffcc00;
+}
+.tox .tox-notification--warn svg,
+.tox .tox-notification--warning svg {
+ fill: #fff0b3;
+}
+.tox .tox-notification--info {
+ background-color: #254161;
+ border-color: #264972;
+ color: #fff;
+}
+.tox .tox-notification--info p {
+ color: #fff;
+}
+.tox .tox-notification--info a {
+ color: #83b7f3;
+}
+.tox .tox-notification--info svg {
+ fill: #fff;
+}
+.tox .tox-notification__body {
+ align-self: center;
+ color: #fff;
+ font-size: 14px;
+ grid-column-end: 3;
+ grid-column-start: 2;
+ grid-row-end: 2;
+ grid-row-start: 1;
+ text-align: center;
+ white-space: normal;
+ word-break: break-all;
+ word-break: break-word;
+}
+.tox .tox-notification__body > * {
+ margin: 0;
+}
+.tox .tox-notification__body > * + * {
+ margin-top: 1rem;
+}
+.tox .tox-notification__icon {
+ align-self: center;
+ grid-column-end: 2;
+ grid-column-start: 1;
+ grid-row-end: 2;
+ grid-row-start: 1;
+ justify-self: end;
+}
+.tox .tox-notification__icon svg {
+ display: block;
+}
+.tox .tox-notification__dismiss {
+ align-self: start;
+ grid-column-end: 4;
+ grid-column-start: 3;
+ grid-row-end: 2;
+ grid-row-start: 1;
+ justify-self: end;
+}
+.tox .tox-notification .tox-progress-bar {
+ grid-column-end: 4;
+ grid-column-start: 1;
+ grid-row-end: 3;
+ grid-row-start: 2;
+ justify-self: center;
+}
+.tox .tox-pop {
+ display: inline-block;
+ position: relative;
+}
+.tox .tox-pop--resizing {
+ transition: width 0.1s ease;
+}
+.tox .tox-pop--resizing .tox-toolbar,
+.tox .tox-pop--resizing .tox-toolbar__group {
+ flex-wrap: nowrap;
+}
+.tox .tox-pop--transition {
+ transition: 0.15s ease;
+ transition-property: left, right, top, bottom;
+}
+.tox .tox-pop--transition::before,
+.tox .tox-pop--transition::after {
+ transition: all 0.15s, visibility 0s, opacity 0.075s ease 0.075s;
+}
+.tox .tox-pop__dialog {
+ background-color: #222F3E;
+ border: 1px solid #161f29;
+ border-radius: 6px;
+ box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15);
+ min-width: 0;
+ overflow: hidden;
+}
+.tox .tox-pop__dialog > *:not(.tox-toolbar) {
+ margin: 4px 4px 4px 8px;
+}
+.tox .tox-pop__dialog .tox-toolbar {
+ background-color: transparent;
+ margin-bottom: -1px;
+}
+.tox .tox-pop::before,
+.tox .tox-pop::after {
+ border-style: solid;
+ content: '';
+ display: block;
+ height: 0;
+ opacity: 1;
+ position: absolute;
+ width: 0;
+}
+.tox .tox-pop.tox-pop--inset::before,
+.tox .tox-pop.tox-pop--inset::after {
+ opacity: 0;
+ transition: all 0s 0.15s, visibility 0s, opacity 0.075s ease;
+}
+.tox .tox-pop.tox-pop--bottom::before,
+.tox .tox-pop.tox-pop--bottom::after {
+ left: 50%;
+ top: 100%;
+}
+.tox .tox-pop.tox-pop--bottom::after {
+ border-color: #222F3E transparent transparent transparent;
+ border-width: 8px;
+ margin-left: -8px;
+ margin-top: -1px;
+}
+.tox .tox-pop.tox-pop--bottom::before {
+ border-color: #161f29 transparent transparent transparent;
+ border-width: 9px;
+ margin-left: -9px;
+}
+.tox .tox-pop.tox-pop--top::before,
+.tox .tox-pop.tox-pop--top::after {
+ left: 50%;
+ top: 0;
+ transform: translateY(-100%);
+}
+.tox .tox-pop.tox-pop--top::after {
+ border-color: transparent transparent #222F3E transparent;
+ border-width: 8px;
+ margin-left: -8px;
+ margin-top: 1px;
+}
+.tox .tox-pop.tox-pop--top::before {
+ border-color: transparent transparent #161f29 transparent;
+ border-width: 9px;
+ margin-left: -9px;
+}
+.tox .tox-pop.tox-pop--left::before,
+.tox .tox-pop.tox-pop--left::after {
+ left: 0;
+ top: calc(50% - 1px);
+ transform: translateY(-50%);
+}
+.tox .tox-pop.tox-pop--left::after {
+ border-color: transparent #222F3E transparent transparent;
+ border-width: 8px;
+ margin-left: -15px;
+}
+.tox .tox-pop.tox-pop--left::before {
+ border-color: transparent #161f29 transparent transparent;
+ border-width: 10px;
+ margin-left: -19px;
+}
+.tox .tox-pop.tox-pop--right::before,
+.tox .tox-pop.tox-pop--right::after {
+ left: 100%;
+ top: calc(50% + 1px);
+ transform: translateY(-50%);
+}
+.tox .tox-pop.tox-pop--right::after {
+ border-color: transparent transparent transparent #222F3E;
+ border-width: 8px;
+ margin-left: -1px;
+}
+.tox .tox-pop.tox-pop--right::before {
+ border-color: transparent transparent transparent #161f29;
+ border-width: 10px;
+ margin-left: -1px;
+}
+.tox .tox-pop.tox-pop--align-left::before,
+.tox .tox-pop.tox-pop--align-left::after {
+ left: 20px;
+}
+.tox .tox-pop.tox-pop--align-right::before,
+.tox .tox-pop.tox-pop--align-right::after {
+ left: calc(100% - 20px);
+}
+.tox .tox-sidebar-wrap {
+ display: flex;
+ flex-direction: row;
+ flex-grow: 1;
+ min-height: 0;
+}
+.tox .tox-sidebar {
+ background-color: #222F3E;
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-end;
+}
+.tox .tox-sidebar__slider {
+ display: flex;
+ overflow: hidden;
+}
+.tox .tox-sidebar__pane-container {
+ display: flex;
+}
+.tox .tox-sidebar__pane {
+ display: flex;
+}
+.tox .tox-sidebar--sliding-closed {
+ opacity: 0;
+}
+.tox .tox-sidebar--sliding-open {
+ opacity: 1;
+}
+.tox .tox-sidebar--sliding-growing,
+.tox .tox-sidebar--sliding-shrinking {
+ transition: width 0.5s ease, opacity 0.5s ease;
+}
+.tox .tox-selector {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ display: inline-block;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+}
+.tox.tox-platform-touch .tox-selector {
+ height: 12px;
+ width: 12px;
+}
+.tox .tox-slider {
+ align-items: center;
+ display: flex;
+ flex: 1;
+ height: 24px;
+ justify-content: center;
+ position: relative;
+}
+.tox .tox-slider__rail {
+ background-color: transparent;
+ border: 1px solid #161f29;
+ border-radius: 6px;
+ height: 10px;
+ min-width: 120px;
+ width: 100%;
+}
+.tox .tox-slider__handle {
+ background-color: #006ce7;
+ border: 2px solid #0054b4;
+ border-radius: 6px;
+ box-shadow: none;
+ height: 24px;
+ left: 50%;
+ position: absolute;
+ top: 50%;
+ transform: translateX(-50%) translateY(-50%);
+ width: 14px;
+}
+.tox .tox-form__controls-h-stack > .tox-slider:not(:first-of-type) {
+ margin-inline-start: 8px;
+}
+.tox .tox-form__controls-h-stack > .tox-form__group + .tox-slider {
+ margin-inline-start: 32px;
+}
+.tox .tox-form__controls-h-stack > .tox-slider + .tox-form__group {
+ margin-inline-start: 32px;
+}
+.tox .tox-source-code {
+ overflow: auto;
+}
+.tox .tox-spinner {
+ display: flex;
+}
+.tox .tox-spinner > div {
+ animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-radius: 100%;
+ height: 8px;
+ width: 8px;
+}
+.tox .tox-spinner > div:nth-child(1) {
+ animation-delay: -0.32s;
+}
+.tox .tox-spinner > div:nth-child(2) {
+ animation-delay: -0.16s;
+}
+@keyframes tam-bouncing-dots {
+ 0%,
+ 80%,
+ 100% {
+ transform: scale(0);
+ }
+ 40% {
+ transform: scale(1);
+ }
+}
+.tox:not([dir=rtl]) .tox-spinner > div:not(:first-child) {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-spinner > div:not(:first-child) {
+ margin-right: 4px;
+}
+.tox .tox-statusbar {
+ align-items: center;
+ background-color: #222F3E;
+ border-top: 1px solid rgba(255, 255, 255, 0.15);
+ color: rgba(255, 255, 255, 0.75);
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 14px;
+ font-weight: normal;
+ height: 25px;
+ overflow: hidden;
+ padding: 0 8px;
+ position: relative;
+ text-transform: none;
+}
+.tox .tox-statusbar__text-container {
+ display: flex;
+ flex: 1 1 auto;
+ justify-content: flex-end;
+ overflow: hidden;
+}
+.tox .tox-statusbar__path {
+ display: flex;
+ flex: 1 1 auto;
+ margin-right: auto;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.tox .tox-statusbar__path > * {
+ display: inline;
+ white-space: nowrap;
+}
+.tox .tox-statusbar__wordcount {
+ flex: 0 0 auto;
+ margin-left: 1ch;
+}
+.tox .tox-statusbar a,
+.tox .tox-statusbar__path-item,
+.tox .tox-statusbar__wordcount {
+ color: rgba(255, 255, 255, 0.75);
+ text-decoration: none;
+}
+.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]) {
+ color: #fff;
+ cursor: pointer;
+}
+.tox .tox-statusbar__branding svg {
+ fill: rgba(255, 255, 255, 0.8);
+ height: 1.14em;
+ vertical-align: -0.28em;
+ width: 3.6em;
+}
+.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled=true]) svg,
+.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled=true]) svg {
+ fill: #fff;
+}
+.tox .tox-statusbar__resize-handle {
+ align-items: flex-end;
+ align-self: stretch;
+ cursor: nwse-resize;
+ display: flex;
+ flex: 0 0 auto;
+ justify-content: flex-end;
+ margin-left: auto;
+ margin-right: -8px;
+ padding-bottom: 3px;
+ padding-left: 1ch;
+ padding-right: 3px;
+}
+.tox .tox-statusbar__resize-handle svg {
+ display: block;
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-statusbar__resize-handle:focus svg {
+ background-color: #434e5b;
+ border-radius: 1px 1px 5px 1px;
+ box-shadow: 0 0 0 2px #434e5b;
+}
+.tox:not([dir=rtl]) .tox-statusbar__path > * {
+ margin-right: 4px;
+}
+.tox:not([dir=rtl]) .tox-statusbar__branding {
+ margin-left: 2ch;
+}
+.tox[dir=rtl] .tox-statusbar {
+ flex-direction: row-reverse;
+}
+.tox[dir=rtl] .tox-statusbar__path > * {
+ margin-left: 4px;
+}
+.tox .tox-throbber {
+ z-index: 1299;
+}
+.tox .tox-throbber__busy-spinner {
+ align-items: center;
+ background-color: rgba(34, 47, 62, 0.6);
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+}
+.tox .tox-tbtn {
+ align-items: center;
+ background: transparent;
+ border: 0;
+ border-radius: 3px;
+ box-shadow: none;
+ color: #fff;
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ height: 28px;
+ justify-content: center;
+ margin: 6px 1px 5px 0;
+ outline: none;
+ overflow: hidden;
+ padding: 0;
+ text-transform: none;
+ width: 34px;
+}
+.tox .tox-tbtn svg {
+ display: block;
+ fill: #fff;
+}
+.tox .tox-tbtn.tox-tbtn-more {
+ padding-left: 5px;
+ padding-right: 5px;
+ width: inherit;
+}
+.tox .tox-tbtn:focus {
+ background: #3389ec;
+ border: 0;
+ box-shadow: none;
+}
+.tox .tox-tbtn:hover {
+ background: #3389ec;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-tbtn:hover svg {
+ fill: #fff;
+}
+.tox .tox-tbtn:active {
+ background: #599fef;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-tbtn:active svg {
+ fill: #fff;
+}
+.tox .tox-tbtn--disabled,
+.tox .tox-tbtn--disabled:hover,
+.tox .tox-tbtn:disabled,
+.tox .tox-tbtn:disabled:hover {
+ background: transparent;
+ border: 0;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-tbtn--disabled svg,
+.tox .tox-tbtn--disabled:hover svg,
+.tox .tox-tbtn:disabled svg,
+.tox .tox-tbtn:disabled:hover svg {
+ /* stylelint-disable-line no-descending-specificity */
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-tbtn--enabled,
+.tox .tox-tbtn--enabled:hover {
+ background: #599fef;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-tbtn--enabled > *,
+.tox .tox-tbtn--enabled:hover > * {
+ transform: none;
+}
+.tox .tox-tbtn--enabled svg,
+.tox .tox-tbtn--enabled:hover svg {
+ /* stylelint-disable-line no-descending-specificity */
+ fill: #fff;
+}
+.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) {
+ color: #fff;
+}
+.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg {
+ fill: #fff;
+}
+.tox .tox-tbtn:active > * {
+ transform: none;
+}
+.tox .tox-tbtn--md {
+ height: 42px;
+ width: 51px;
+}
+.tox .tox-tbtn--lg {
+ flex-direction: column;
+ height: 56px;
+ width: 68px;
+}
+.tox .tox-tbtn--return {
+ align-self: stretch;
+ height: unset;
+ width: 16px;
+}
+.tox .tox-tbtn--labeled {
+ padding: 0 4px;
+ width: unset;
+}
+.tox .tox-tbtn__vlabel {
+ display: block;
+ font-size: 10px;
+ font-weight: normal;
+ letter-spacing: -0.025em;
+ margin-bottom: 4px;
+ white-space: nowrap;
+}
+.tox .tox-tbtn--select {
+ margin: 6px 1px 5px 0;
+ padding: 0 4px;
+ width: auto;
+}
+.tox .tox-tbtn__select-label {
+ cursor: default;
+ font-weight: normal;
+ margin: 0 4px;
+}
+.tox .tox-tbtn__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+}
+.tox .tox-tbtn__select-chevron svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-tbtn--bespoke {
+ background: #2f4055;
+}
+.tox .tox-tbtn--bespoke + .tox-tbtn--bespoke {
+ margin-inline-start: 4px;
+}
+.tox .tox-tbtn--bespoke .tox-tbtn__select-label {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ width: 7em;
+}
+.tox .tox-split-button {
+ border: 0;
+ border-radius: 3px;
+ box-sizing: border-box;
+ display: flex;
+ margin: 6px 1px 5px 0;
+ overflow: hidden;
+}
+.tox .tox-split-button:hover {
+ box-shadow: 0 0 0 1px #3389ec inset;
+}
+.tox .tox-split-button:focus {
+ background: #3389ec;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-split-button > * {
+ border-radius: 0;
+}
+.tox .tox-split-button__chevron {
+ width: 16px;
+}
+.tox .tox-split-button__chevron svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-split-button .tox-tbtn {
+ margin: 0;
+}
+.tox .tox-split-button.tox-tbtn--disabled:hover,
+.tox .tox-split-button.tox-tbtn--disabled:focus,
+.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,
+.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus {
+ background: transparent;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+}
+.tox.tox-platform-touch .tox-split-button .tox-tbtn--select {
+ padding: 0 0px;
+}
+.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child {
+ width: 30px;
+}
+.tox.tox-platform-touch .tox-split-button__chevron {
+ width: 20px;
+}
+.tox .tox-toolbar-overlord {
+ background-color: #222F3E;
+}
+.tox .tox-toolbar,
+.tox .tox-toolbar__primary,
+.tox .tox-toolbar__overflow {
+ background-color: #222F3E;
+ background-image: repeating-linear-gradient(rgba(255, 255, 255, 0.15) 0px 1px, transparent 1px 39px);
+ background-position: center top 40px;
+ background-repeat: no-repeat;
+ background-size: calc(100% - 11px * 2) calc(100% - 41px);
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ padding: 0 0px;
+ transform: perspective(1px);
+}
+.tox .tox-toolbar-overlord > .tox-toolbar,
+.tox .tox-toolbar-overlord > .tox-toolbar__primary,
+.tox .tox-toolbar-overlord > .tox-toolbar__overflow {
+ background-position: center top 0px;
+ background-size: calc(100% - 11px * 2) calc(100% - 0px);
+}
+.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed {
+ height: 0;
+ opacity: 0;
+ padding-bottom: 0;
+ padding-top: 0;
+ visibility: hidden;
+}
+.tox .tox-toolbar__overflow--growing {
+ transition: height 0.3s ease, opacity 0.2s linear 0.1s;
+}
+.tox .tox-toolbar__overflow--shrinking {
+ transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s;
+}
+.tox .tox-menubar + .tox-toolbar,
+.tox .tox-menubar + .tox-toolbar-overlord {
+ border-top: 1px solid transparent;
+ margin-top: 0px;
+ padding-bottom: 1px;
+ padding-top: 1px;
+}
+.tox .tox-toolbar--scrolling {
+ flex-wrap: nowrap;
+ overflow-x: auto;
+}
+.tox .tox-pop .tox-toolbar {
+ border-width: 0;
+}
+.tox .tox-toolbar--no-divider {
+ background-image: none;
+}
+.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child,
+.tox .tox-toolbar-overlord .tox-toolbar__primary {
+ background-position: center top 39px;
+}
+.tox .tox-editor-header > .tox-toolbar--scrolling,
+.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child {
+ background-image: none;
+}
+.tox.tox-tinymce-aux .tox-toolbar__overflow {
+ background-color: #222F3E;
+ background-position: center top 43px;
+ background-size: calc(100% - 8px * 2) calc(100% - 51px);
+ border: none;
+ border-radius: 6px;
+ box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15);
+ padding: 4px 0;
+}
+.tox-pop .tox-pop__dialog {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox-pop .tox-pop__dialog .tox-toolbar {
+ background-position: center top 43px;
+ background-size: calc(100% - 11px * 2) calc(100% - 51px);
+ padding: 4px 0;
+}
+.tox .tox-toolbar__group {
+ align-items: center;
+ display: flex;
+ flex-wrap: wrap;
+ margin: 0 0;
+ padding: 0 11px 0 12px;
+}
+.tox .tox-toolbar__group--pull-right {
+ margin-left: auto;
+}
+.tox .tox-toolbar--scrolling .tox-toolbar__group {
+ flex-shrink: 0;
+ flex-wrap: nowrap;
+}
+.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type) {
+ border-right: 1px solid transparent;
+}
+.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type) {
+ border-left: 1px solid transparent;
+}
+.tox .tox-tooltip {
+ display: inline-block;
+ padding: 8px;
+ position: relative;
+}
+.tox .tox-tooltip__body {
+ background-color: #3d546f;
+ border-radius: 6px;
+ box-shadow: 0 2px 4px rgba(34, 47, 62, 0.3);
+ color: rgba(255, 255, 255, 0.75);
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ padding: 4px 8px;
+ text-transform: none;
+}
+.tox .tox-tooltip__arrow {
+ position: absolute;
+}
+.tox .tox-tooltip--down .tox-tooltip__arrow {
+ border-left: 8px solid transparent;
+ border-right: 8px solid transparent;
+ border-top: 8px solid #3d546f;
+ bottom: 0;
+ left: 50%;
+ position: absolute;
+ transform: translateX(-50%);
+}
+.tox .tox-tooltip--up .tox-tooltip__arrow {
+ border-bottom: 8px solid #3d546f;
+ border-left: 8px solid transparent;
+ border-right: 8px solid transparent;
+ left: 50%;
+ position: absolute;
+ top: 0;
+ transform: translateX(-50%);
+}
+.tox .tox-tooltip--right .tox-tooltip__arrow {
+ border-bottom: 8px solid transparent;
+ border-left: 8px solid #3d546f;
+ border-top: 8px solid transparent;
+ position: absolute;
+ right: 0;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-tooltip--left .tox-tooltip__arrow {
+ border-bottom: 8px solid transparent;
+ border-right: 8px solid #3d546f;
+ border-top: 8px solid transparent;
+ left: 0;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-well {
+ border: 1px solid #161f29;
+ border-radius: 6px;
+ padding: 8px;
+ width: 100%;
+}
+.tox .tox-well > *:first-child {
+ margin-top: 0;
+}
+.tox .tox-well > *:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-well > *:only-child {
+ margin: 0;
+}
+.tox .tox-custom-editor {
+ border: 1px solid #161f29;
+ border-radius: 6px;
+ display: flex;
+ flex: 1;
+ position: relative;
+}
+/* stylelint-disable */
+.tox {
+ /* stylelint-enable */
+}
+.tox .tox-dialog-loading::before {
+ background-color: rgba(0, 0, 0, 0.5);
+ content: "";
+ height: 100%;
+ position: absolute;
+ width: 100%;
+ z-index: 1000;
+}
+.tox .tox-tab {
+ cursor: pointer;
+}
+.tox .tox-dialog__content-js {
+ display: flex;
+ flex: 1;
+}
+.tox .tox-dialog__body-content .tox-collection {
+ display: flex;
+ flex: 1;
+}
+.tox.tox-tinymce-aux .tox-toolbar__overflow {
+ box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.15);
+}
diff --git a/public/tinymce/skins/ui/oxide-dark/skin.min.css b/public/tinymce/skins/ui/oxide-dark/skin.min.css
new file mode 100644
index 00000000..aa0c1f08
--- /dev/null
+++ b/public/tinymce/skins/ui/oxide-dark/skin.min.css
@@ -0,0 +1 @@
+.tox{box-shadow:none;box-sizing:content-box;color:#222f3e;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:2px solid #161f29;border-radius:10px;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox.tox-tinymce-inline{border:none;box-shadow:none;overflow:initial}.tox.tox-tinymce-inline .tox-editor-container{overflow:initial}.tox.tox-tinymce-inline .tox-editor-header{background-color:#222f3e;border:2px solid #161f29;border-radius:10px;box-shadow:none;overflow:hidden}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox[dir=rtl] .tox-icon--flip svg{transform:rotateY(180deg)}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #161f29;border-radius:6px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#161f29;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(0,108,231,.5);border-color:rgba(0,108,231,.4);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:rgba(0,108,231,.4)}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.5);border-color:rgba(255,165,0,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.8)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.5);border-color:rgba(204,0,0,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.8)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.5);border-color:rgba(120,171,70,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.8)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#006ce7;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#006ce7;border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button[disabled]{background-color:#006ce7;background-image:none;border-color:#006ce7;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#0060ce;background-image:none;border-color:#0060ce;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#0060ce;background-image:none;border-color:#0060ce;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#0054b4;background-image:none;border-color:#0054b4;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#3d546f;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#3d546f;border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;color:#fff;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:none}.tox .tox-button--secondary[disabled]{background-color:#3d546f;background-image:none;border-color:#3d546f;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#34485f;background-image:none;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--secondary:hover:not(:disabled){background-color:#34485f;background-image:none;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--secondary:active:not(:disabled){background-color:#2b3b4e;background-image:none;border-color:#2b3b4e;box-shadow:none;color:#fff}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#fff}.tox .tox-button--naked[disabled]{background-color:rgba(255,255,255,.2);border-color:transparent;box-shadow:unset;color:rgba(255,255,255,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:rgba(255,255,255,.2);border-color:transparent;box-shadow:unset;color:#fff}.tox .tox-button--naked:focus:not(:disabled){background-color:rgba(255,255,255,.2);border-color:transparent;box-shadow:unset;color:#fff}.tox .tox-button--naked:active:not(:disabled){background-color:rgba(255,255,255,.3);border-color:transparent;box-shadow:unset;color:#fff}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#fff}.tox .tox-checkbox{align-items:center;border-radius:6px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:6px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(255,255,255,.2)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#006ce7}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#006ce7}.tox .tox-checkbox--disabled{color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(255,255,255,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(255,255,255,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(255,255,255,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:6px;box-shadow:inset 0 0 0 1px #006ce7;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:rgba(255,255,255,.15);border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:rgba(255,255,255,.15);color:rgba(255,255,255,.5);cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;border-radius:3px;color:#fff;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#2b3b4e;color:#fff}.tox .tox-collection--list .tox-collection__item--active{background-color:#3389ec}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#599fef;color:#fff}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#3389ec}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#599fef;color:#fff}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#3389ec;color:#fff}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#fff}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#fff}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(255,255,255,.5);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#fff}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg{fill:rgba(255,255,255,.5)}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#2b3b4e;border:1px solid rgba(255,255,255,.15);border-radius:6px;box-shadow:0 0 2px 0 rgba(34,47,62,.2),0 4px 8px 0 rgba(34,47,62,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:28px;margin:6px 1px 5px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid transparent}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid transparent}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:5px 0 6px 11px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px -4px}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{fill:#fff;height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#3389ec}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#2b3b4e;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#2b3b4e;border:1px solid #161f29;border-radius:6px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#fff;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(255,255,255,.5);font-size:12px}.tox .tox-comment__body{color:#fff;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(255,255,255,.5);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#2b3b4e;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(43,59,78,0),#2b3b4e);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#2b3b4e;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#fff;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#2b3b4e;box-shadow:0 0 8px 8px #2b3b4e;color:#fff;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#2b3b4e;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(255,255,255,.5)}.tox .tox-user__name{color:rgba(255,255,255,.5);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(34,47,62,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#222f3e}.tox .tox-dialog{background-color:#2b3b4e;border-color:#161f29;border-radius:10px;border-style:solid;border-width:0;box-shadow:0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#2b3b4e;border-bottom:none;color:#fff;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#fff;display:flex;flex:1;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(255,255,255,.5);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(0,108,231,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #006ce7;color:#006ce7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#006ce7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#0054b4;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#0054b4;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#fff}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;margin-inline-end:0;margin-inline-start:0;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#fff;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#fff;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#2b3b4e;border-top:none;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(34,47,62,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #161f29}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #161f29;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(255,255,255,.5);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #161f29}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{background-color:#222f3e;border-bottom:1px solid rgba(255,255,255,.15);box-shadow:none;padding:4px 0;transition:box-shadow .5s}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header{border-top:1px solid rgba(255,255,255,.15);box-shadow:none}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:#222f3e;box-shadow:none;padding:4px 0}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header{box-shadow:none}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{border-color:#161f29;box-shadow:none;max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(34,47,62,.2);border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#006ce7;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(255,255,255,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(255,255,255,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(255,255,255,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(255,255,255,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #2b3b4e;border-radius:6px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(255,255,255,.5);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column}.tox .tox-form__group--stretched .tox-textarea{flex:1}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#161f29;border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 5.5px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#222f3e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#2b3b4e;border-color:#006ce7;box-shadow:0 0 0 2px rgba(0,108,231,.25);outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#006ce7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#fff}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#fff}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#161f29;border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 5.5px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#2b3b4e;border-color:#006ce7;box-shadow:0 0 0 2px rgba(0,108,231,.25);outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-imagepreview{background-color:#666;height:380px;overflow:hidden;position:relative;width:100%}.tox .tox-imagepreview.tox-imagepreview__loaded{overflow:auto}.tox .tox-imagepreview__container{display:flex;left:100vw;position:absolute;top:100vw}.tox .tox-imagepreview__image{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools .tox-spacer{flex:1}.tox .tox-image-tools .tox-bar{align-items:center;display:flex;height:60px;justify-content:center}.tox .tox-image-tools .tox-imagepreview,.tox .tox-image-tools .tox-imagepreview+.tox-bar{margin-top:8px}.tox .tox-image-tools .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-image-tools .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-image-tools .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-image-tools .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-image-tools .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-image-tools .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-image-tools .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:rgba(255,255,255,.15);border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px -4px}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(0,108,231,.5);border-color:rgba(0,108,231,.5)}.tox .tox-insert-table-picker__label{color:#fff;display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#2b3b4e;border:1px solid rgba(255,255,255,.15);border-radius:6px;box-shadow:none;display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0 4px}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:8px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:8px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='transparent'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color:#222f3e;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 11px 0 12px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid transparent}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#fff;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:28px;justify-content:center;margin:5px 1px 6px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#3389ec;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn--active{background:#599fef;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#3389ec;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:grid;font-size:14px;font-weight:400;grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{cursor:pointer;text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#334840;border-color:#3c5440;color:#fff}.tox .tox-notification--success p{color:#fff}.tox .tox-notification--success a{color:#b5d199}.tox .tox-notification--success svg{fill:#fff}.tox .tox-notification--error{background-color:#442632;border-color:#55212b;color:#fff}.tox .tox-notification--error p{color:#fff}.tox .tox-notification--error a{color:#e68080}.tox .tox-notification--error svg{fill:#fff}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#222f3e;border-color:rgba(255,255,255,.15);color:#fff0b3}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#fff0b3}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#fc0}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#fff0b3}.tox .tox-notification--info{background-color:#254161;border-color:#264972;color:#fff}.tox .tox-notification--info p{color:#fff}.tox .tox-notification--info a{color:#83b7f3}.tox .tox-notification--info svg{fill:#fff}.tox .tox-notification__body{align-self:center;color:#fff;font-size:14px;grid-column-end:3;grid-column-start:2;grid-row-end:2;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{align-self:center;grid-column-end:2;grid-column-start:1;grid-row-end:2;grid-row-start:1;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{align-self:start;grid-column-end:4;grid-column-start:3;grid-row-end:2;grid-row-start:1;justify-self:end}.tox .tox-notification .tox-progress-bar{grid-column-end:4;grid-column-start:1;grid-row-end:3;grid-row-start:2;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar,.tox .tox-pop--resizing .tox-toolbar__group{flex-wrap:nowrap}.tox .tox-pop--transition{transition:.15s ease;transition-property:left,right,top,bottom}.tox .tox-pop--transition::after,.tox .tox-pop--transition::before{transition:all .15s,visibility 0s,opacity 75ms ease 75ms}.tox .tox-pop__dialog{background-color:#222f3e;border:1px solid #161f29;border-radius:6px;box-shadow:0 0 2px 0 rgba(34,47,62,.2),0 4px 8px 0 rgba(34,47,62,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;opacity:1;position:absolute;width:0}.tox .tox-pop.tox-pop--inset::after,.tox .tox-pop.tox-pop--inset::before{opacity:0;transition:all 0s .15s,visibility 0s,opacity 75ms ease}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#222f3e transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#161f29 transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #222f3e transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #161f29 transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #222f3e transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #161f29 transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #222f3e;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #161f29;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;min-height:0}.tox .tox-sidebar{background-color:#222f3e;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #161f29;border-radius:6px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#006ce7;border:2px solid #0054b4;border-radius:6px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-form__controls-h-stack>.tox-slider:not(:first-of-type){margin-inline-start:8px}.tox .tox-form__controls-h-stack>.tox-form__group+.tox-slider{margin-inline-start:32px}.tox .tox-form__controls-h-stack>.tox-slider+.tox-form__group{margin-inline-start:32px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(255,255,255,.5);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#222f3e;border-top:1px solid rgba(255,255,255,.15);color:rgba(255,255,255,.75);display:flex;flex:0 0 auto;font-size:14px;font-weight:400;height:25px;overflow:hidden;padding:0 8px;position:relative;text-transform:none}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:rgba(255,255,255,.75);text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){color:#fff;cursor:pointer}.tox .tox-statusbar__branding svg{fill:rgba(255,255,255,.8);height:1.14em;vertical-align:-.28em;width:3.6em}.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled=true]) svg,.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled=true]) svg{fill:#fff}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-bottom:3px;padding-left:1ch;padding-right:3px}.tox .tox-statusbar__resize-handle svg{display:block;fill:rgba(255,255,255,.5)}.tox .tox-statusbar__resize-handle:focus svg{background-color:#434e5b;border-radius:1px 1px 5px 1px;box-shadow:0 0 0 2px #434e5b}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:2ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(34,47,62,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#fff;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:28px;justify-content:center;margin:6px 1px 5px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#fff}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#3389ec;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#3389ec;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn:hover svg{fill:#fff}.tox .tox-tbtn:active{background:#599fef;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn:active svg{fill:#fff}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(255,255,255,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#599fef;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#fff}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#fff}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#fff}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:42px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:56px;width:68px}.tox .tox-tbtn--return{align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:6px 1px 5px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(255,255,255,.5)}.tox .tox-tbtn--bespoke{background:#2f4055}.tox .tox-tbtn--bespoke+.tox-tbtn--bespoke{margin-inline-start:4px}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:6px 1px 5px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #3389ec inset}.tox .tox-split-button:focus{background:#3389ec;box-shadow:none;color:#fff}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(255,255,255,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(255,255,255,.5)}.tox.tox-platform-touch .tox-split-button .tox-tbtn--select{padding:0 0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-toolbar-overlord{background-color:#222f3e}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background-color:#222f3e;background-image:repeating-linear-gradient(rgba(255,255,255,.15) 0 1px,transparent 1px 39px);background-position:center top 40px;background-repeat:no-repeat;background-size:calc(100% - 11px * 2) calc(100% - 41px);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0;transform:perspective(1px)}.tox .tox-toolbar-overlord>.tox-toolbar,.tox .tox-toolbar-overlord>.tox-toolbar__overflow,.tox .tox-toolbar-overlord>.tox-toolbar__primary{background-position:center top 0;background-size:calc(100% - 11px * 2) calc(100% - 0px)}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord{border-top:1px solid transparent;margin-top:0;padding-bottom:1px;padding-top:1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child,.tox .tox-toolbar-overlord .tox-toolbar__primary{background-position:center top 39px}.tox .tox-editor-header>.tox-toolbar--scrolling,.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child{background-image:none}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#222f3e;background-position:center top 43px;background-size:calc(100% - 8px * 2) calc(100% - 51px);border:none;border-radius:6px;box-shadow:0 0 2px 0 rgba(34,47,62,.2),0 4px 8px 0 rgba(34,47,62,.15);padding:4px 0}.tox-pop .tox-pop__dialog .tox-toolbar{background-position:center top 43px;background-size:calc(100% - 11px * 2) calc(100% - 51px);padding:4px 0}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 11px 0 12px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid transparent}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid transparent}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#3d546f;border-radius:6px;box-shadow:0 2px 4px rgba(34,47,62,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #3d546f;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #3d546f;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #3d546f;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #3d546f;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #161f29;border-radius:6px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #161f29;border-radius:6px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1}.tox.tox-tinymce-aux .tox-toolbar__overflow{box-shadow:0 0 0 1px rgba(255,255,255,.15)}
diff --git a/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.css b/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.css
new file mode 100644
index 00000000..25b0a371
--- /dev/null
+++ b/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.css
@@ -0,0 +1,30 @@
+body.tox-dialog__disable-scroll {
+ overflow: hidden;
+}
+.tox-fullscreen {
+ border: 0;
+ height: 100%;
+ margin: 0;
+ overflow: hidden;
+ overscroll-behavior: none;
+ padding: 0;
+ touch-action: pinch-zoom;
+ width: 100%;
+}
+.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {
+ display: none;
+}
+.tox.tox-tinymce.tox-fullscreen,
+.tox-shadowhost.tox-fullscreen {
+ left: 0;
+ position: fixed;
+ top: 0;
+ z-index: 1200;
+}
+.tox.tox-tinymce.tox-fullscreen {
+ background-color: transparent;
+}
+.tox-fullscreen .tox.tox-tinymce-aux,
+.tox-fullscreen ~ .tox.tox-tinymce-aux {
+ z-index: 1201;
+}
diff --git a/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css b/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css
new file mode 100644
index 00000000..8745951a
--- /dev/null
+++ b/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css
@@ -0,0 +1 @@
+body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}
diff --git a/public/tinymce/skins/ui/oxide/content.css b/public/tinymce/skins/ui/oxide/content.css
new file mode 100644
index 00000000..d6d40ce5
--- /dev/null
+++ b/public/tinymce/skins/ui/oxide/content.css
@@ -0,0 +1,730 @@
+.mce-content-body .mce-item-anchor {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+}
+.mce-content-body .mce-item-anchor:empty {
+ cursor: default;
+ display: inline-block;
+ height: 12px !important;
+ padding: 0 2px;
+ -webkit-user-modify: read-only;
+ -moz-user-modify: read-only;
+ -webkit-user-select: all;
+ -moz-user-select: all;
+ user-select: all;
+ width: 8px !important;
+}
+.mce-content-body .mce-item-anchor:not(:empty) {
+ background-position-x: 2px;
+ display: inline-block;
+ padding-left: 12px;
+}
+.mce-content-body .mce-item-anchor[data-mce-selected] {
+ outline-offset: 1px;
+}
+.tox-comments-visible .tox-comment {
+ background-color: #fff0b7;
+}
+.tox-comments-visible .tox-comment[data-mce-annotation-active="true"]:not([data-mce-selected="inline-boundary"]) {
+ background-color: #ffe168;
+}
+.tox-checklist > li:not(.tox-checklist--hidden) {
+ list-style: none;
+ margin: 0.25em 0;
+}
+.tox-checklist > li:not(.tox-checklist--hidden)::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+ cursor: pointer;
+ height: 1em;
+ margin-left: -1.5em;
+ margin-top: 0.125em;
+ position: absolute;
+ width: 1em;
+}
+.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+}
+[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {
+ margin-left: 0;
+ margin-right: -1.5em;
+}
+/* stylelint-disable */
+/* http://prismjs.com/ */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ color: black;
+ background: none;
+ text-shadow: 0 1px white;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ font-size: 1em;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+ -moz-tab-size: 4;
+ tab-size: 4;
+ -webkit-hyphens: none;
+ hyphens: none;
+}
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+@media print {
+ code[class*="language-"],
+ pre[class*="language-"] {
+ text-shadow: none;
+ }
+}
+/* Code blocks */
+pre[class*="language-"] {
+ padding: 1em;
+ margin: 0.5em 0;
+ overflow: auto;
+}
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+ background: #f5f2f0;
+}
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+ padding: 0.1em;
+ border-radius: 0.3em;
+ white-space: normal;
+}
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: slategray;
+}
+.token.punctuation {
+ color: #999;
+}
+.token.namespace {
+ opacity: 0.7;
+}
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+ color: #905;
+}
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+ color: #690;
+}
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+ color: #9a6e3a;
+ /* This background color was intended by the author of this theme. */
+ background: hsla(0, 0%, 100%, 0.5);
+}
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+ color: #07a;
+}
+.token.function,
+.token.class-name {
+ color: #DD4A68;
+}
+.token.regex,
+.token.important,
+.token.variable {
+ color: #e90;
+}
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+.token.italic {
+ font-style: italic;
+}
+.token.entity {
+ cursor: help;
+}
+/* stylelint-enable */
+.mce-content-body {
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+.mce-content-body .mce-visual-caret {
+ background-color: black;
+ background-color: currentColor;
+ position: absolute;
+}
+.mce-content-body .mce-visual-caret-hidden {
+ display: none;
+}
+.mce-content-body *[data-mce-caret] {
+ left: -1000px;
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ right: auto;
+ top: 0;
+}
+.mce-content-body .mce-offscreen-selection {
+ left: -2000000px;
+ max-width: 1000000px;
+ position: absolute;
+}
+.mce-content-body *[contentEditable=false] {
+ cursor: default;
+}
+.mce-content-body *[contentEditable=true] {
+ cursor: text;
+}
+.tox-cursor-format-painter {
+ cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default;
+}
+.mce-content-body figure.align-left {
+ float: left;
+}
+.mce-content-body figure.align-right {
+ float: right;
+}
+.mce-content-body figure.image.align-center {
+ display: table;
+ margin-left: auto;
+ margin-right: auto;
+}
+.mce-preview-object {
+ border: 1px solid gray;
+ display: inline-block;
+ line-height: 0;
+ margin: 0 2px 0 2px;
+ position: relative;
+}
+.mce-preview-object .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-preview-object[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.mce-object {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+ border: 1px dashed #aaa;
+}
+.mce-pagebreak {
+ border: 1px dashed #aaa;
+ cursor: default;
+ display: block;
+ height: 5px;
+ margin-top: 15px;
+ page-break-before: always;
+ width: 100%;
+}
+@media print {
+ .mce-pagebreak {
+ border: 0;
+ }
+}
+.tiny-pageembed .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tiny-pageembed[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.tiny-pageembed {
+ display: inline-block;
+ position: relative;
+}
+.tiny-pageembed--21by9,
+.tiny-pageembed--16by9,
+.tiny-pageembed--4by3,
+.tiny-pageembed--1by1 {
+ display: block;
+ overflow: hidden;
+ padding: 0;
+ position: relative;
+ width: 100%;
+}
+.tiny-pageembed--21by9 {
+ padding-top: 42.857143%;
+}
+.tiny-pageembed--16by9 {
+ padding-top: 56.25%;
+}
+.tiny-pageembed--4by3 {
+ padding-top: 75%;
+}
+.tiny-pageembed--1by1 {
+ padding-top: 100%;
+}
+.tiny-pageembed--21by9 iframe,
+.tiny-pageembed--16by9 iframe,
+.tiny-pageembed--4by3 iframe,
+.tiny-pageembed--1by1 iframe {
+ border: 0;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-content-body[data-mce-placeholder] {
+ position: relative;
+}
+.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ color: rgba(34, 47, 62, 0.7);
+ content: attr(data-mce-placeholder);
+ position: absolute;
+}
+.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ left: 1px;
+}
+.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {
+ right: 1px;
+}
+.mce-content-body div.mce-resizehandle {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+ z-index: 1298;
+}
+.mce-content-body div.mce-resizehandle:hover {
+ background-color: #4099ff;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(1) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(2) {
+ cursor: nesw-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(3) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(4) {
+ cursor: nesw-resize;
+}
+.mce-content-body .mce-resize-backdrop {
+ z-index: 10000;
+}
+.mce-content-body .mce-clonedresizable {
+ cursor: default;
+ opacity: 0.5;
+ outline: 1px dashed black;
+ position: absolute;
+ z-index: 10001;
+}
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns th,
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns td {
+ border: 0;
+}
+.mce-content-body .mce-resize-helper {
+ background: #555;
+ background: rgba(0, 0, 0, 0.75);
+ border: 1px;
+ border-radius: 3px;
+ color: white;
+ display: none;
+ font-family: sans-serif;
+ font-size: 12px;
+ line-height: 14px;
+ margin: 5px 10px;
+ padding: 5px;
+ position: absolute;
+ white-space: nowrap;
+ z-index: 10002;
+}
+.tox-rtc-user-selection {
+ position: relative;
+}
+.tox-rtc-user-cursor {
+ bottom: 0;
+ cursor: default;
+ position: absolute;
+ top: 0;
+ width: 2px;
+}
+.tox-rtc-user-cursor::before {
+ background-color: inherit;
+ border-radius: 50%;
+ content: '';
+ display: block;
+ height: 8px;
+ position: absolute;
+ right: -3px;
+ top: -3px;
+ width: 8px;
+}
+.tox-rtc-user-cursor:hover::after {
+ background-color: inherit;
+ border-radius: 100px;
+ box-sizing: border-box;
+ color: #fff;
+ content: attr(data-user);
+ display: block;
+ font-size: 12px;
+ font-weight: bold;
+ left: -5px;
+ min-height: 8px;
+ min-width: 8px;
+ padding: 0 12px;
+ position: absolute;
+ top: -11px;
+ white-space: nowrap;
+ z-index: 1000;
+}
+.tox-rtc-user-selection--1 .tox-rtc-user-cursor {
+ background-color: #2dc26b;
+}
+.tox-rtc-user-selection--2 .tox-rtc-user-cursor {
+ background-color: #e03e2d;
+}
+.tox-rtc-user-selection--3 .tox-rtc-user-cursor {
+ background-color: #f1c40f;
+}
+.tox-rtc-user-selection--4 .tox-rtc-user-cursor {
+ background-color: #3598db;
+}
+.tox-rtc-user-selection--5 .tox-rtc-user-cursor {
+ background-color: #b96ad9;
+}
+.tox-rtc-user-selection--6 .tox-rtc-user-cursor {
+ background-color: #e67e23;
+}
+.tox-rtc-user-selection--7 .tox-rtc-user-cursor {
+ background-color: #aaa69d;
+}
+.tox-rtc-user-selection--8 .tox-rtc-user-cursor {
+ background-color: #f368e0;
+}
+.tox-rtc-remote-image {
+ background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;
+ border: 1px solid #ccc;
+ min-height: 240px;
+ min-width: 320px;
+}
+.mce-match-marker {
+ background: #aaa;
+ color: #fff;
+}
+.mce-match-marker-selected {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::-moz-selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-content-body img[data-mce-selected],
+.mce-content-body video[data-mce-selected],
+.mce-content-body audio[data-mce-selected],
+.mce-content-body object[data-mce-selected],
+.mce-content-body embed[data-mce-selected],
+.mce-content-body table[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body hr[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+ outline-offset: 1px;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false][data-mce-selected] {
+ cursor: not-allowed;
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,
+.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {
+ outline: none;
+}
+.mce-content-body *[data-mce-selected="inline-boundary"] {
+ background-color: #b4d7ff;
+}
+.mce-content-body .mce-edit-focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body td[data-mce-selected],
+.mce-content-body th[data-mce-selected] {
+ position: relative;
+}
+.mce-content-body td[data-mce-selected]::-moz-selection,
+.mce-content-body th[data-mce-selected]::-moz-selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected]::selection,
+.mce-content-body th[data-mce-selected]::selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected] *,
+.mce-content-body th[data-mce-selected] * {
+ outline: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.mce-content-body td[data-mce-selected]::after,
+.mce-content-body th[data-mce-selected]::after {
+ background-color: rgba(180, 215, 255, 0.7);
+ border: 1px solid rgba(180, 215, 255, 0.7);
+ bottom: -1px;
+ content: '';
+ left: -1px;
+ mix-blend-mode: multiply;
+ position: absolute;
+ right: -1px;
+ top: -1px;
+}
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+ .mce-content-body td[data-mce-selected]::after,
+ .mce-content-body th[data-mce-selected]::after {
+ border-color: rgba(0, 84, 180, 0.7);
+ }
+}
+.mce-content-body img::-moz-selection {
+ background: none;
+}
+.mce-content-body img::selection {
+ background: none;
+}
+.ephox-snooker-resizer-bar {
+ background-color: #b4d7ff;
+ opacity: 0;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.ephox-snooker-resizer-cols {
+ cursor: col-resize;
+}
+.ephox-snooker-resizer-rows {
+ cursor: row-resize;
+}
+.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {
+ opacity: 1;
+}
+.mce-spellchecker-word {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+ height: 2rem;
+}
+.mce-spellchecker-grammar {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+}
+.mce-toc {
+ border: 1px solid gray;
+}
+.mce-toc h2 {
+ margin: 4px;
+}
+.mce-toc li {
+ list-style-type: none;
+}
+table[style*="border-width: 0px"],
+.mce-item-table:not([border]),
+.mce-item-table[border="0"],
+table[style*="border-width: 0px"] td,
+.mce-item-table:not([border]) td,
+.mce-item-table[border="0"] td,
+table[style*="border-width: 0px"] th,
+.mce-item-table:not([border]) th,
+.mce-item-table[border="0"] th,
+table[style*="border-width: 0px"] caption,
+.mce-item-table:not([border]) caption,
+.mce-item-table[border="0"] caption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks p,
+.mce-visualblocks h1,
+.mce-visualblocks h2,
+.mce-visualblocks h3,
+.mce-visualblocks h4,
+.mce-visualblocks h5,
+.mce-visualblocks h6,
+.mce-visualblocks div:not([data-mce-bogus]),
+.mce-visualblocks section,
+.mce-visualblocks article,
+.mce-visualblocks blockquote,
+.mce-visualblocks address,
+.mce-visualblocks pre,
+.mce-visualblocks figure,
+.mce-visualblocks figcaption,
+.mce-visualblocks hgroup,
+.mce-visualblocks aside,
+.mce-visualblocks ul,
+.mce-visualblocks ol,
+.mce-visualblocks dl {
+ background-repeat: no-repeat;
+ border: 1px dashed #bbb;
+ margin-left: 3px;
+ padding-top: 10px;
+}
+.mce-visualblocks p {
+ background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
+}
+.mce-visualblocks h1 {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
+}
+.mce-visualblocks h2 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
+}
+.mce-visualblocks h3 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
+}
+.mce-visualblocks h4 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
+}
+.mce-visualblocks h5 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
+}
+.mce-visualblocks h6 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
+}
+.mce-visualblocks div:not([data-mce-bogus]) {
+ background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
+}
+.mce-visualblocks section {
+ background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
+}
+.mce-visualblocks article {
+ background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
+}
+.mce-visualblocks blockquote {
+ background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
+}
+.mce-visualblocks address {
+ background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
+}
+.mce-visualblocks pre {
+ background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
+}
+.mce-visualblocks figure {
+ background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
+}
+.mce-visualblocks figcaption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks hgroup {
+ background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
+}
+.mce-visualblocks aside {
+ background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
+}
+.mce-visualblocks ul {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
+}
+.mce-visualblocks ol {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
+}
+.mce-visualblocks dl {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
+}
+.mce-visualblocks:not([dir=rtl]) p,
+.mce-visualblocks:not([dir=rtl]) h1,
+.mce-visualblocks:not([dir=rtl]) h2,
+.mce-visualblocks:not([dir=rtl]) h3,
+.mce-visualblocks:not([dir=rtl]) h4,
+.mce-visualblocks:not([dir=rtl]) h5,
+.mce-visualblocks:not([dir=rtl]) h6,
+.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),
+.mce-visualblocks:not([dir=rtl]) section,
+.mce-visualblocks:not([dir=rtl]) article,
+.mce-visualblocks:not([dir=rtl]) blockquote,
+.mce-visualblocks:not([dir=rtl]) address,
+.mce-visualblocks:not([dir=rtl]) pre,
+.mce-visualblocks:not([dir=rtl]) figure,
+.mce-visualblocks:not([dir=rtl]) figcaption,
+.mce-visualblocks:not([dir=rtl]) hgroup,
+.mce-visualblocks:not([dir=rtl]) aside,
+.mce-visualblocks:not([dir=rtl]) ul,
+.mce-visualblocks:not([dir=rtl]) ol,
+.mce-visualblocks:not([dir=rtl]) dl {
+ margin-left: 3px;
+}
+.mce-visualblocks[dir=rtl] p,
+.mce-visualblocks[dir=rtl] h1,
+.mce-visualblocks[dir=rtl] h2,
+.mce-visualblocks[dir=rtl] h3,
+.mce-visualblocks[dir=rtl] h4,
+.mce-visualblocks[dir=rtl] h5,
+.mce-visualblocks[dir=rtl] h6,
+.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),
+.mce-visualblocks[dir=rtl] section,
+.mce-visualblocks[dir=rtl] article,
+.mce-visualblocks[dir=rtl] blockquote,
+.mce-visualblocks[dir=rtl] address,
+.mce-visualblocks[dir=rtl] pre,
+.mce-visualblocks[dir=rtl] figure,
+.mce-visualblocks[dir=rtl] figcaption,
+.mce-visualblocks[dir=rtl] hgroup,
+.mce-visualblocks[dir=rtl] aside,
+.mce-visualblocks[dir=rtl] ul,
+.mce-visualblocks[dir=rtl] ol,
+.mce-visualblocks[dir=rtl] dl {
+ background-position-x: right;
+ margin-right: 3px;
+}
+.mce-nbsp,
+.mce-shy {
+ background: #aaa;
+}
+.mce-shy::after {
+ content: '-';
+}
+body {
+ font-family: sans-serif;
+}
+table {
+ border-collapse: collapse;
+}
diff --git a/public/tinymce/skins/ui/oxide/content.inline.css b/public/tinymce/skins/ui/oxide/content.inline.css
new file mode 100644
index 00000000..040100bf
--- /dev/null
+++ b/public/tinymce/skins/ui/oxide/content.inline.css
@@ -0,0 +1,724 @@
+.mce-content-body .mce-item-anchor {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+}
+.mce-content-body .mce-item-anchor:empty {
+ cursor: default;
+ display: inline-block;
+ height: 12px !important;
+ padding: 0 2px;
+ -webkit-user-modify: read-only;
+ -moz-user-modify: read-only;
+ -webkit-user-select: all;
+ -moz-user-select: all;
+ user-select: all;
+ width: 8px !important;
+}
+.mce-content-body .mce-item-anchor:not(:empty) {
+ background-position-x: 2px;
+ display: inline-block;
+ padding-left: 12px;
+}
+.mce-content-body .mce-item-anchor[data-mce-selected] {
+ outline-offset: 1px;
+}
+.tox-comments-visible .tox-comment {
+ background-color: #fff0b7;
+}
+.tox-comments-visible .tox-comment[data-mce-annotation-active="true"]:not([data-mce-selected="inline-boundary"]) {
+ background-color: #ffe168;
+}
+.tox-checklist > li:not(.tox-checklist--hidden) {
+ list-style: none;
+ margin: 0.25em 0;
+}
+.tox-checklist > li:not(.tox-checklist--hidden)::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+ cursor: pointer;
+ height: 1em;
+ margin-left: -1.5em;
+ margin-top: 0.125em;
+ position: absolute;
+ width: 1em;
+}
+.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+}
+[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {
+ margin-left: 0;
+ margin-right: -1.5em;
+}
+/* stylelint-disable */
+/* http://prismjs.com/ */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ color: black;
+ background: none;
+ text-shadow: 0 1px white;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ font-size: 1em;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+ -moz-tab-size: 4;
+ tab-size: 4;
+ -webkit-hyphens: none;
+ hyphens: none;
+}
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+@media print {
+ code[class*="language-"],
+ pre[class*="language-"] {
+ text-shadow: none;
+ }
+}
+/* Code blocks */
+pre[class*="language-"] {
+ padding: 1em;
+ margin: 0.5em 0;
+ overflow: auto;
+}
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+ background: #f5f2f0;
+}
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+ padding: 0.1em;
+ border-radius: 0.3em;
+ white-space: normal;
+}
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: slategray;
+}
+.token.punctuation {
+ color: #999;
+}
+.token.namespace {
+ opacity: 0.7;
+}
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+ color: #905;
+}
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+ color: #690;
+}
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+ color: #9a6e3a;
+ /* This background color was intended by the author of this theme. */
+ background: hsla(0, 0%, 100%, 0.5);
+}
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+ color: #07a;
+}
+.token.function,
+.token.class-name {
+ color: #DD4A68;
+}
+.token.regex,
+.token.important,
+.token.variable {
+ color: #e90;
+}
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+.token.italic {
+ font-style: italic;
+}
+.token.entity {
+ cursor: help;
+}
+/* stylelint-enable */
+.mce-content-body {
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+.mce-content-body .mce-visual-caret {
+ background-color: black;
+ background-color: currentColor;
+ position: absolute;
+}
+.mce-content-body .mce-visual-caret-hidden {
+ display: none;
+}
+.mce-content-body *[data-mce-caret] {
+ left: -1000px;
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ right: auto;
+ top: 0;
+}
+.mce-content-body .mce-offscreen-selection {
+ left: -2000000px;
+ max-width: 1000000px;
+ position: absolute;
+}
+.mce-content-body *[contentEditable=false] {
+ cursor: default;
+}
+.mce-content-body *[contentEditable=true] {
+ cursor: text;
+}
+.tox-cursor-format-painter {
+ cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default;
+}
+.mce-content-body figure.align-left {
+ float: left;
+}
+.mce-content-body figure.align-right {
+ float: right;
+}
+.mce-content-body figure.image.align-center {
+ display: table;
+ margin-left: auto;
+ margin-right: auto;
+}
+.mce-preview-object {
+ border: 1px solid gray;
+ display: inline-block;
+ line-height: 0;
+ margin: 0 2px 0 2px;
+ position: relative;
+}
+.mce-preview-object .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-preview-object[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.mce-object {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+ border: 1px dashed #aaa;
+}
+.mce-pagebreak {
+ border: 1px dashed #aaa;
+ cursor: default;
+ display: block;
+ height: 5px;
+ margin-top: 15px;
+ page-break-before: always;
+ width: 100%;
+}
+@media print {
+ .mce-pagebreak {
+ border: 0;
+ }
+}
+.tiny-pageembed .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tiny-pageembed[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.tiny-pageembed {
+ display: inline-block;
+ position: relative;
+}
+.tiny-pageembed--21by9,
+.tiny-pageembed--16by9,
+.tiny-pageembed--4by3,
+.tiny-pageembed--1by1 {
+ display: block;
+ overflow: hidden;
+ padding: 0;
+ position: relative;
+ width: 100%;
+}
+.tiny-pageembed--21by9 {
+ padding-top: 42.857143%;
+}
+.tiny-pageembed--16by9 {
+ padding-top: 56.25%;
+}
+.tiny-pageembed--4by3 {
+ padding-top: 75%;
+}
+.tiny-pageembed--1by1 {
+ padding-top: 100%;
+}
+.tiny-pageembed--21by9 iframe,
+.tiny-pageembed--16by9 iframe,
+.tiny-pageembed--4by3 iframe,
+.tiny-pageembed--1by1 iframe {
+ border: 0;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-content-body[data-mce-placeholder] {
+ position: relative;
+}
+.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ color: rgba(34, 47, 62, 0.7);
+ content: attr(data-mce-placeholder);
+ position: absolute;
+}
+.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ left: 1px;
+}
+.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {
+ right: 1px;
+}
+.mce-content-body div.mce-resizehandle {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+ z-index: 1298;
+}
+.mce-content-body div.mce-resizehandle:hover {
+ background-color: #4099ff;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(1) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(2) {
+ cursor: nesw-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(3) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(4) {
+ cursor: nesw-resize;
+}
+.mce-content-body .mce-resize-backdrop {
+ z-index: 10000;
+}
+.mce-content-body .mce-clonedresizable {
+ cursor: default;
+ opacity: 0.5;
+ outline: 1px dashed black;
+ position: absolute;
+ z-index: 10001;
+}
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns th,
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns td {
+ border: 0;
+}
+.mce-content-body .mce-resize-helper {
+ background: #555;
+ background: rgba(0, 0, 0, 0.75);
+ border: 1px;
+ border-radius: 3px;
+ color: white;
+ display: none;
+ font-family: sans-serif;
+ font-size: 12px;
+ line-height: 14px;
+ margin: 5px 10px;
+ padding: 5px;
+ position: absolute;
+ white-space: nowrap;
+ z-index: 10002;
+}
+.tox-rtc-user-selection {
+ position: relative;
+}
+.tox-rtc-user-cursor {
+ bottom: 0;
+ cursor: default;
+ position: absolute;
+ top: 0;
+ width: 2px;
+}
+.tox-rtc-user-cursor::before {
+ background-color: inherit;
+ border-radius: 50%;
+ content: '';
+ display: block;
+ height: 8px;
+ position: absolute;
+ right: -3px;
+ top: -3px;
+ width: 8px;
+}
+.tox-rtc-user-cursor:hover::after {
+ background-color: inherit;
+ border-radius: 100px;
+ box-sizing: border-box;
+ color: #fff;
+ content: attr(data-user);
+ display: block;
+ font-size: 12px;
+ font-weight: bold;
+ left: -5px;
+ min-height: 8px;
+ min-width: 8px;
+ padding: 0 12px;
+ position: absolute;
+ top: -11px;
+ white-space: nowrap;
+ z-index: 1000;
+}
+.tox-rtc-user-selection--1 .tox-rtc-user-cursor {
+ background-color: #2dc26b;
+}
+.tox-rtc-user-selection--2 .tox-rtc-user-cursor {
+ background-color: #e03e2d;
+}
+.tox-rtc-user-selection--3 .tox-rtc-user-cursor {
+ background-color: #f1c40f;
+}
+.tox-rtc-user-selection--4 .tox-rtc-user-cursor {
+ background-color: #3598db;
+}
+.tox-rtc-user-selection--5 .tox-rtc-user-cursor {
+ background-color: #b96ad9;
+}
+.tox-rtc-user-selection--6 .tox-rtc-user-cursor {
+ background-color: #e67e23;
+}
+.tox-rtc-user-selection--7 .tox-rtc-user-cursor {
+ background-color: #aaa69d;
+}
+.tox-rtc-user-selection--8 .tox-rtc-user-cursor {
+ background-color: #f368e0;
+}
+.tox-rtc-remote-image {
+ background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;
+ border: 1px solid #ccc;
+ min-height: 240px;
+ min-width: 320px;
+}
+.mce-match-marker {
+ background: #aaa;
+ color: #fff;
+}
+.mce-match-marker-selected {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::-moz-selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-content-body img[data-mce-selected],
+.mce-content-body video[data-mce-selected],
+.mce-content-body audio[data-mce-selected],
+.mce-content-body object[data-mce-selected],
+.mce-content-body embed[data-mce-selected],
+.mce-content-body table[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body hr[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+ outline-offset: 1px;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false][data-mce-selected] {
+ cursor: not-allowed;
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,
+.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {
+ outline: none;
+}
+.mce-content-body *[data-mce-selected="inline-boundary"] {
+ background-color: #b4d7ff;
+}
+.mce-content-body .mce-edit-focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body td[data-mce-selected],
+.mce-content-body th[data-mce-selected] {
+ position: relative;
+}
+.mce-content-body td[data-mce-selected]::-moz-selection,
+.mce-content-body th[data-mce-selected]::-moz-selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected]::selection,
+.mce-content-body th[data-mce-selected]::selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected] *,
+.mce-content-body th[data-mce-selected] * {
+ outline: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.mce-content-body td[data-mce-selected]::after,
+.mce-content-body th[data-mce-selected]::after {
+ background-color: rgba(180, 215, 255, 0.7);
+ border: 1px solid rgba(180, 215, 255, 0.7);
+ bottom: -1px;
+ content: '';
+ left: -1px;
+ mix-blend-mode: multiply;
+ position: absolute;
+ right: -1px;
+ top: -1px;
+}
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+ .mce-content-body td[data-mce-selected]::after,
+ .mce-content-body th[data-mce-selected]::after {
+ border-color: rgba(0, 84, 180, 0.7);
+ }
+}
+.mce-content-body img::-moz-selection {
+ background: none;
+}
+.mce-content-body img::selection {
+ background: none;
+}
+.ephox-snooker-resizer-bar {
+ background-color: #b4d7ff;
+ opacity: 0;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.ephox-snooker-resizer-cols {
+ cursor: col-resize;
+}
+.ephox-snooker-resizer-rows {
+ cursor: row-resize;
+}
+.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {
+ opacity: 1;
+}
+.mce-spellchecker-word {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+ height: 2rem;
+}
+.mce-spellchecker-grammar {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+}
+.mce-toc {
+ border: 1px solid gray;
+}
+.mce-toc h2 {
+ margin: 4px;
+}
+.mce-toc li {
+ list-style-type: none;
+}
+table[style*="border-width: 0px"],
+.mce-item-table:not([border]),
+.mce-item-table[border="0"],
+table[style*="border-width: 0px"] td,
+.mce-item-table:not([border]) td,
+.mce-item-table[border="0"] td,
+table[style*="border-width: 0px"] th,
+.mce-item-table:not([border]) th,
+.mce-item-table[border="0"] th,
+table[style*="border-width: 0px"] caption,
+.mce-item-table:not([border]) caption,
+.mce-item-table[border="0"] caption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks p,
+.mce-visualblocks h1,
+.mce-visualblocks h2,
+.mce-visualblocks h3,
+.mce-visualblocks h4,
+.mce-visualblocks h5,
+.mce-visualblocks h6,
+.mce-visualblocks div:not([data-mce-bogus]),
+.mce-visualblocks section,
+.mce-visualblocks article,
+.mce-visualblocks blockquote,
+.mce-visualblocks address,
+.mce-visualblocks pre,
+.mce-visualblocks figure,
+.mce-visualblocks figcaption,
+.mce-visualblocks hgroup,
+.mce-visualblocks aside,
+.mce-visualblocks ul,
+.mce-visualblocks ol,
+.mce-visualblocks dl {
+ background-repeat: no-repeat;
+ border: 1px dashed #bbb;
+ margin-left: 3px;
+ padding-top: 10px;
+}
+.mce-visualblocks p {
+ background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
+}
+.mce-visualblocks h1 {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
+}
+.mce-visualblocks h2 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
+}
+.mce-visualblocks h3 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
+}
+.mce-visualblocks h4 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
+}
+.mce-visualblocks h5 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
+}
+.mce-visualblocks h6 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
+}
+.mce-visualblocks div:not([data-mce-bogus]) {
+ background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
+}
+.mce-visualblocks section {
+ background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
+}
+.mce-visualblocks article {
+ background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
+}
+.mce-visualblocks blockquote {
+ background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
+}
+.mce-visualblocks address {
+ background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
+}
+.mce-visualblocks pre {
+ background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
+}
+.mce-visualblocks figure {
+ background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
+}
+.mce-visualblocks figcaption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks hgroup {
+ background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
+}
+.mce-visualblocks aside {
+ background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
+}
+.mce-visualblocks ul {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
+}
+.mce-visualblocks ol {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
+}
+.mce-visualblocks dl {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
+}
+.mce-visualblocks:not([dir=rtl]) p,
+.mce-visualblocks:not([dir=rtl]) h1,
+.mce-visualblocks:not([dir=rtl]) h2,
+.mce-visualblocks:not([dir=rtl]) h3,
+.mce-visualblocks:not([dir=rtl]) h4,
+.mce-visualblocks:not([dir=rtl]) h5,
+.mce-visualblocks:not([dir=rtl]) h6,
+.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),
+.mce-visualblocks:not([dir=rtl]) section,
+.mce-visualblocks:not([dir=rtl]) article,
+.mce-visualblocks:not([dir=rtl]) blockquote,
+.mce-visualblocks:not([dir=rtl]) address,
+.mce-visualblocks:not([dir=rtl]) pre,
+.mce-visualblocks:not([dir=rtl]) figure,
+.mce-visualblocks:not([dir=rtl]) figcaption,
+.mce-visualblocks:not([dir=rtl]) hgroup,
+.mce-visualblocks:not([dir=rtl]) aside,
+.mce-visualblocks:not([dir=rtl]) ul,
+.mce-visualblocks:not([dir=rtl]) ol,
+.mce-visualblocks:not([dir=rtl]) dl {
+ margin-left: 3px;
+}
+.mce-visualblocks[dir=rtl] p,
+.mce-visualblocks[dir=rtl] h1,
+.mce-visualblocks[dir=rtl] h2,
+.mce-visualblocks[dir=rtl] h3,
+.mce-visualblocks[dir=rtl] h4,
+.mce-visualblocks[dir=rtl] h5,
+.mce-visualblocks[dir=rtl] h6,
+.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),
+.mce-visualblocks[dir=rtl] section,
+.mce-visualblocks[dir=rtl] article,
+.mce-visualblocks[dir=rtl] blockquote,
+.mce-visualblocks[dir=rtl] address,
+.mce-visualblocks[dir=rtl] pre,
+.mce-visualblocks[dir=rtl] figure,
+.mce-visualblocks[dir=rtl] figcaption,
+.mce-visualblocks[dir=rtl] hgroup,
+.mce-visualblocks[dir=rtl] aside,
+.mce-visualblocks[dir=rtl] ul,
+.mce-visualblocks[dir=rtl] ol,
+.mce-visualblocks[dir=rtl] dl {
+ background-position-x: right;
+ margin-right: 3px;
+}
+.mce-nbsp,
+.mce-shy {
+ background: #aaa;
+}
+.mce-shy::after {
+ content: '-';
+}
diff --git a/public/tinymce/skins/ui/oxide/content.inline.min.css b/public/tinymce/skins/ui/oxide/content.inline.min.css
new file mode 100644
index 00000000..d5f05d42
--- /dev/null
+++ b/public/tinymce/skins/ui/oxide/content.inline.min.css
@@ -0,0 +1 @@
+.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center}.mce-content-body .mce-item-anchor:empty{cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor:not(:empty){background-position-x:2px;display:inline-block;padding-left:12px}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment[data-mce-annotation-active=true]:not([data-mce-selected=inline-boundary]){background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}
diff --git a/public/tinymce/skins/ui/oxide/content.min.css b/public/tinymce/skins/ui/oxide/content.min.css
new file mode 100644
index 00000000..e3c189c5
--- /dev/null
+++ b/public/tinymce/skins/ui/oxide/content.min.css
@@ -0,0 +1 @@
+.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center}.mce-content-body .mce-item-anchor:empty{cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor:not(:empty){background-position-x:2px;display:inline-block;padding-left:12px}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment[data-mce-annotation-active=true]:not([data-mce-selected=inline-boundary]){background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse}
diff --git a/public/tinymce/skins/ui/oxide/skin.css b/public/tinymce/skins/ui/oxide/skin.css
new file mode 100644
index 00000000..e574875a
--- /dev/null
+++ b/public/tinymce/skins/ui/oxide/skin.css
@@ -0,0 +1,3038 @@
+.tox {
+ box-shadow: none;
+ box-sizing: content-box;
+ color: #222f3e;
+ cursor: auto;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: normal;
+ -webkit-tap-highlight-color: transparent;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ vertical-align: initial;
+ white-space: normal;
+}
+.tox *:not(svg):not(rect) {
+ box-sizing: inherit;
+ color: inherit;
+ cursor: inherit;
+ direction: inherit;
+ font-family: inherit;
+ font-size: inherit;
+ font-style: inherit;
+ font-weight: inherit;
+ line-height: inherit;
+ -webkit-tap-highlight-color: inherit;
+ text-align: inherit;
+ text-decoration: inherit;
+ text-shadow: inherit;
+ text-transform: inherit;
+ vertical-align: inherit;
+ white-space: inherit;
+}
+.tox *:not(svg):not(rect) {
+ /* stylelint-disable-line no-duplicate-selectors */
+ background: transparent;
+ border: 0;
+ box-shadow: none;
+ float: none;
+ height: auto;
+ margin: 0;
+ max-width: none;
+ outline: 0;
+ padding: 0;
+ position: static;
+ width: auto;
+}
+.tox:not([dir=rtl]) {
+ direction: ltr;
+ text-align: left;
+}
+.tox[dir=rtl] {
+ direction: rtl;
+ text-align: right;
+}
+.tox-tinymce {
+ border: 2px solid #eeeeee;
+ border-radius: 10px;
+ box-shadow: none;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ overflow: hidden;
+ position: relative;
+ visibility: inherit !important;
+}
+.tox.tox-tinymce-inline {
+ border: none;
+ box-shadow: none;
+ overflow: initial;
+}
+.tox.tox-tinymce-inline .tox-editor-container {
+ overflow: initial;
+}
+.tox.tox-tinymce-inline .tox-editor-header {
+ background-color: #fff;
+ border: 2px solid #eeeeee;
+ border-radius: 10px;
+ box-shadow: none;
+ overflow: hidden;
+}
+.tox-tinymce-aux {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ z-index: 1300;
+}
+.tox-tinymce *:focus,
+.tox-tinymce-aux *:focus {
+ outline: none;
+}
+button::-moz-focus-inner {
+ border: 0;
+}
+.tox[dir=rtl] .tox-icon--flip svg {
+ transform: rotateY(180deg);
+}
+.tox .accessibility-issue__header {
+ align-items: center;
+ display: flex;
+ margin-bottom: 4px;
+}
+.tox .accessibility-issue__description {
+ align-items: stretch;
+ border: 1px solid #eeeeee;
+ border-radius: 6px;
+ display: flex;
+ justify-content: space-between;
+}
+.tox .accessibility-issue__description > div {
+ padding-bottom: 4px;
+}
+.tox .accessibility-issue__description > div > div {
+ align-items: center;
+ display: flex;
+ margin-bottom: 4px;
+}
+.tox .accessibility-issue__description > *:last-child:not(:only-child) {
+ border-color: #eeeeee;
+ border-style: solid;
+}
+.tox .accessibility-issue__repair {
+ margin-top: 16px;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description {
+ background-color: rgba(0, 108, 231, 0.1);
+ border-color: #006ce7;
+ color: #222f3e;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > *:last-child {
+ border-color: #006ce7;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 {
+ color: #006ce7;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg {
+ fill: #006ce7;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon {
+ color: #006ce7;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description {
+ background-color: rgba(255, 165, 0, 0.1);
+ border-color: rgba(255, 165, 0, 0.5);
+ color: #222f3e;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > *:last-child {
+ border-color: rgba(255, 165, 0, 0.5);
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 {
+ color: #cc8500;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg {
+ fill: #cc8500;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon {
+ color: #cc8500;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description {
+ background-color: rgba(204, 0, 0, 0.1);
+ border-color: rgba(204, 0, 0, 0.4);
+ color: #222f3e;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > *:last-child {
+ border-color: rgba(204, 0, 0, 0.4);
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 {
+ color: #c00;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg {
+ fill: #c00;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon {
+ color: #c00;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description {
+ background-color: rgba(120, 171, 70, 0.1);
+ border-color: rgba(120, 171, 70, 0.4);
+ color: #222f3e;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > *:last-child {
+ border-color: rgba(120, 171, 70, 0.4);
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 {
+ color: #78AB46;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg {
+ fill: #78AB46;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon {
+ color: #78AB46;
+}
+.tox .tox-dialog__body-content .accessibility-issue__header h1,
+.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 {
+ margin-top: 0;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) {
+ margin-left: auto;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description {
+ padding: 4px 4px 4px 8px;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description > *:last-child {
+ border-left-width: 1px;
+ padding-left: 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) {
+ margin-right: auto;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description {
+ padding: 4px 8px 4px 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description > *:last-child {
+ border-right-width: 1px;
+ padding-right: 4px;
+}
+.tox .tox-anchorbar {
+ display: flex;
+ flex: 0 0 auto;
+}
+.tox .tox-bar {
+ display: flex;
+ flex: 0 0 auto;
+}
+.tox .tox-button {
+ background-color: #006ce7;
+ background-image: none;
+ background-position: 0 0;
+ background-repeat: repeat;
+ border-color: #006ce7;
+ border-radius: 6px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #fff;
+ cursor: pointer;
+ display: inline-block;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ line-height: 24px;
+ margin: 0;
+ outline: none;
+ padding: 4px 16px;
+ text-align: center;
+ text-decoration: none;
+ text-transform: none;
+ white-space: nowrap;
+}
+.tox .tox-button[disabled] {
+ background-color: #006ce7;
+ background-image: none;
+ border-color: #006ce7;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-button:focus:not(:disabled) {
+ background-color: #0060ce;
+ background-image: none;
+ border-color: #0060ce;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button:hover:not(:disabled) {
+ background-color: #0060ce;
+ background-image: none;
+ border-color: #0060ce;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button:active:not(:disabled) {
+ background-color: #0054b4;
+ background-image: none;
+ border-color: #0054b4;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--secondary {
+ background-color: #f0f0f0;
+ background-image: none;
+ background-position: 0 0;
+ background-repeat: repeat;
+ border-color: #f0f0f0;
+ border-radius: 6px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ color: #222f3e;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ outline: none;
+ padding: 4px 16px;
+ text-decoration: none;
+ text-transform: none;
+}
+.tox .tox-button--secondary[disabled] {
+ background-color: #f0f0f0;
+ background-image: none;
+ border-color: #f0f0f0;
+ box-shadow: none;
+ color: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-button--secondary:focus:not(:disabled) {
+ background-color: #e3e3e3;
+ background-image: none;
+ border-color: #e3e3e3;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-button--secondary:hover:not(:disabled) {
+ background-color: #e3e3e3;
+ background-image: none;
+ border-color: #e3e3e3;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-button--secondary:active:not(:disabled) {
+ background-color: #d6d6d6;
+ background-image: none;
+ border-color: #d6d6d6;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-button--icon,
+.tox .tox-button.tox-button--icon,
+.tox .tox-button.tox-button--secondary.tox-button--icon {
+ padding: 4px;
+}
+.tox .tox-button--icon .tox-icon svg,
+.tox .tox-button.tox-button--icon .tox-icon svg,
+.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg {
+ display: block;
+ fill: currentColor;
+}
+.tox .tox-button-link {
+ background: 0;
+ border: none;
+ box-sizing: border-box;
+ cursor: pointer;
+ display: inline-block;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ font-weight: normal;
+ line-height: 1.3;
+ margin: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.tox .tox-button-link--sm {
+ font-size: 14px;
+}
+.tox .tox-button--naked {
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: unset;
+ color: #222f3e;
+}
+.tox .tox-button--naked[disabled] {
+ background-color: rgba(34, 47, 62, 0.12);
+ border-color: transparent;
+ box-shadow: unset;
+ color: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-button--naked:hover:not(:disabled) {
+ background-color: rgba(34, 47, 62, 0.12);
+ border-color: transparent;
+ box-shadow: unset;
+ color: #222f3e;
+}
+.tox .tox-button--naked:focus:not(:disabled) {
+ background-color: rgba(34, 47, 62, 0.12);
+ border-color: transparent;
+ box-shadow: unset;
+ color: #222f3e;
+}
+.tox .tox-button--naked:active:not(:disabled) {
+ background-color: rgba(34, 47, 62, 0.18);
+ border-color: transparent;
+ box-shadow: unset;
+ color: #222f3e;
+}
+.tox .tox-button--naked .tox-icon svg {
+ fill: currentColor;
+}
+.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) {
+ color: #222f3e;
+}
+.tox .tox-checkbox {
+ align-items: center;
+ border-radius: 6px;
+ cursor: pointer;
+ display: flex;
+ height: 36px;
+ min-width: 36px;
+}
+.tox .tox-checkbox__input {
+ /* Hide from view but visible to screen readers */
+ height: 1px;
+ overflow: hidden;
+ position: absolute;
+ top: auto;
+ width: 1px;
+}
+.tox .tox-checkbox__icons {
+ align-items: center;
+ border-radius: 6px;
+ box-shadow: 0 0 0 2px transparent;
+ box-sizing: content-box;
+ display: flex;
+ height: 24px;
+ justify-content: center;
+ padding: calc(4px - 1px);
+ width: 24px;
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: block;
+ fill: rgba(34, 47, 62, 0.3);
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ display: none;
+ fill: #006ce7;
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ display: none;
+ fill: #006ce7;
+}
+.tox .tox-checkbox--disabled {
+ color: rgba(34, 47, 62, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: none;
+}
+.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ display: block;
+}
+.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: none;
+}
+.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ display: block;
+}
+.tox input.tox-checkbox__input:focus + .tox-checkbox__icons {
+ border-radius: 6px;
+ box-shadow: inset 0 0 0 1px #006ce7;
+ padding: calc(4px - 1px);
+}
+.tox:not([dir=rtl]) .tox-checkbox__label {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-checkbox__input {
+ left: -10000px;
+}
+.tox:not([dir=rtl]) .tox-bar .tox-checkbox {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-checkbox__label {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-checkbox__input {
+ right: -10000px;
+}
+.tox[dir=rtl] .tox-bar .tox-checkbox {
+ margin-right: 4px;
+}
+.tox {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox .tox-collection--toolbar .tox-collection__group {
+ display: flex;
+ padding: 0;
+}
+.tox .tox-collection--grid .tox-collection__group {
+ display: flex;
+ flex-wrap: wrap;
+ max-height: 208px;
+ overflow-x: hidden;
+ overflow-y: auto;
+ padding: 0;
+}
+.tox .tox-collection--list .tox-collection__group {
+ border-bottom-width: 0;
+ border-color: #e3e3e3;
+ border-left-width: 0;
+ border-right-width: 0;
+ border-style: solid;
+ border-top-width: 1px;
+ padding: 4px 0;
+}
+.tox .tox-collection--list .tox-collection__group:first-child {
+ border-top-width: 0;
+}
+.tox .tox-collection__group-heading {
+ background-color: #fcfcfc;
+ color: rgba(34, 47, 62, 0.7);
+ cursor: default;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: normal;
+ margin-bottom: 4px;
+ margin-top: -4px;
+ padding: 4px 8px;
+ text-transform: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.tox .tox-collection__item {
+ align-items: center;
+ border-radius: 3px;
+ color: #222f3e;
+ display: flex;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.tox .tox-collection--list .tox-collection__item {
+ padding: 4px 8px;
+}
+.tox .tox-collection--toolbar .tox-collection__item {
+ border-radius: 3px;
+ padding: 4px;
+}
+.tox .tox-collection--grid .tox-collection__item {
+ border-radius: 3px;
+ padding: 4px;
+}
+.tox .tox-collection--list .tox-collection__item--enabled {
+ background-color: #fff;
+ color: #222f3e;
+}
+.tox .tox-collection--list .tox-collection__item--active {
+ background-color: #cce2fa;
+}
+.tox .tox-collection--toolbar .tox-collection__item--enabled {
+ background-color: #a6ccf7;
+ color: #222f3e;
+}
+.tox .tox-collection--toolbar .tox-collection__item--active {
+ background-color: #cce2fa;
+}
+.tox .tox-collection--grid .tox-collection__item--enabled {
+ background-color: #a6ccf7;
+ color: #222f3e;
+}
+.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ background-color: #cce2fa;
+ color: #222f3e;
+}
+.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ color: #222f3e;
+}
+.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ color: #222f3e;
+}
+.tox .tox-collection__item-icon,
+.tox .tox-collection__item-checkmark {
+ align-items: center;
+ display: flex;
+ height: 24px;
+ justify-content: center;
+ width: 24px;
+}
+.tox .tox-collection__item-icon svg,
+.tox .tox-collection__item-checkmark svg {
+ fill: currentColor;
+}
+.tox .tox-collection--toolbar-lg .tox-collection__item-icon {
+ height: 48px;
+ width: 48px;
+}
+.tox .tox-collection__item-label {
+ color: currentColor;
+ display: inline-block;
+ flex: 1;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 24px;
+ text-transform: none;
+ word-break: break-all;
+}
+.tox .tox-collection__item-accessory {
+ color: rgba(34, 47, 62, 0.7);
+ display: inline-block;
+ font-size: 14px;
+ height: 24px;
+ line-height: 24px;
+ text-transform: none;
+}
+.tox .tox-collection__item-caret {
+ align-items: center;
+ display: flex;
+ min-height: 24px;
+}
+.tox .tox-collection__item-caret::after {
+ content: '';
+ font-size: 0;
+ min-height: inherit;
+}
+.tox .tox-collection__item-caret svg {
+ fill: #222f3e;
+}
+.tox .tox-collection__item--state-disabled {
+ background-color: transparent;
+ color: rgba(34, 47, 62, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg {
+ display: none;
+}
+.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory + .tox-collection__item-checkmark {
+ display: none;
+}
+.tox .tox-collection--horizontal {
+ background-color: #fff;
+ border: 1px solid #e3e3e3;
+ border-radius: 6px;
+ box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15);
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: nowrap;
+ margin-bottom: 0;
+ overflow-x: auto;
+ padding: 0;
+}
+.tox .tox-collection--horizontal .tox-collection__group {
+ align-items: center;
+ display: flex;
+ flex-wrap: nowrap;
+ margin: 0;
+ padding: 0 4px;
+}
+.tox .tox-collection--horizontal .tox-collection__item {
+ height: 28px;
+ margin: 6px 1px 5px 0;
+ padding: 0 4px;
+}
+.tox .tox-collection--horizontal .tox-collection__item-label {
+ white-space: nowrap;
+}
+.tox .tox-collection--horizontal .tox-collection__item-caret {
+ margin-left: 4px;
+}
+.tox .tox-collection__item-container {
+ display: flex;
+}
+.tox .tox-collection__item-container--row {
+ align-items: center;
+ flex: 1 1 auto;
+ flex-direction: row;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--align-left {
+ margin-right: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--align-right {
+ justify-content: flex-end;
+ margin-left: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top {
+ align-items: flex-start;
+ margin-bottom: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle {
+ align-items: center;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom {
+ align-items: flex-end;
+ margin-top: auto;
+}
+.tox .tox-collection__item-container--column {
+ align-self: center;
+ flex: 1 1 auto;
+ flex-direction: column;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--align-left {
+ align-items: flex-start;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--align-right {
+ align-items: flex-end;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top {
+ align-self: flex-start;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle {
+ align-self: center;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom {
+ align-self: flex-end;
+}
+.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) {
+ border-right: 1px solid transparent;
+}
+.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > *:not(:first-child) {
+ margin-left: 8px;
+}
+.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-collection__item-accessory {
+ margin-left: 16px;
+ text-align: right;
+}
+.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret {
+ margin-left: 16px;
+}
+.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) {
+ border-left: 1px solid transparent;
+}
+.tox[dir=rtl] .tox-collection--list .tox-collection__item > *:not(:first-child) {
+ margin-right: 8px;
+}
+.tox[dir=rtl] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-collection__item-accessory {
+ margin-right: 16px;
+ text-align: left;
+}
+.tox[dir=rtl] .tox-collection .tox-collection__item-caret {
+ margin-right: 16px;
+ transform: rotateY(180deg);
+}
+.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret {
+ margin-right: 4px;
+}
+.tox .tox-color-picker-container {
+ display: flex;
+ flex-direction: row;
+ height: 225px;
+ margin: 0;
+}
+.tox .tox-sv-palette {
+ box-sizing: border-box;
+ display: flex;
+ height: 100%;
+}
+.tox .tox-sv-palette-spectrum {
+ height: 100%;
+}
+.tox .tox-sv-palette,
+.tox .tox-sv-palette-spectrum {
+ width: 225px;
+}
+.tox .tox-sv-palette-thumb {
+ background: none;
+ border: 1px solid black;
+ border-radius: 50%;
+ box-sizing: content-box;
+ height: 12px;
+ position: absolute;
+ width: 12px;
+}
+.tox .tox-sv-palette-inner-thumb {
+ border: 1px solid white;
+ border-radius: 50%;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+}
+.tox .tox-hue-slider {
+ box-sizing: border-box;
+ height: 100%;
+ width: 25px;
+}
+.tox .tox-hue-slider-spectrum {
+ background: linear-gradient(to bottom, #f00, #ff0080, #f0f, #8000ff, #00f, #0080ff, #0ff, #00ff80, #0f0, #80ff00, #ff0, #ff8000, #f00);
+ height: 100%;
+ width: 100%;
+}
+.tox .tox-hue-slider,
+.tox .tox-hue-slider-spectrum {
+ width: 20px;
+}
+.tox .tox-hue-slider-thumb {
+ background: white;
+ border: 1px solid black;
+ box-sizing: content-box;
+ height: 4px;
+ width: 100%;
+}
+.tox .tox-rgb-form {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+}
+.tox .tox-rgb-form div {
+ align-items: center;
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 5px;
+ width: inherit;
+}
+.tox .tox-rgb-form input {
+ width: 6em;
+}
+.tox .tox-rgb-form input.tox-invalid {
+ /* Need !important to override Chrome's focus styling unfortunately */
+ border: 1px solid red !important;
+}
+.tox .tox-rgb-form .tox-rgba-preview {
+ border: 1px solid black;
+ flex-grow: 2;
+ margin-bottom: 0;
+}
+.tox:not([dir=rtl]) .tox-sv-palette {
+ margin-right: 15px;
+}
+.tox:not([dir=rtl]) .tox-hue-slider {
+ margin-right: 15px;
+}
+.tox:not([dir=rtl]) .tox-hue-slider-thumb {
+ margin-left: -1px;
+}
+.tox:not([dir=rtl]) .tox-rgb-form label {
+ margin-right: 0.5em;
+}
+.tox[dir=rtl] .tox-sv-palette {
+ margin-left: 15px;
+}
+.tox[dir=rtl] .tox-hue-slider {
+ margin-left: 15px;
+}
+.tox[dir=rtl] .tox-hue-slider-thumb {
+ margin-right: -1px;
+}
+.tox[dir=rtl] .tox-rgb-form label {
+ margin-left: 0.5em;
+}
+.tox .tox-toolbar .tox-swatches,
+.tox .tox-toolbar__primary .tox-swatches,
+.tox .tox-toolbar__overflow .tox-swatches {
+ margin: 5px 0 6px 11px;
+}
+.tox .tox-collection--list .tox-collection__group .tox-swatches-menu {
+ border: 0;
+ margin: -4px -4px;
+}
+.tox .tox-swatches__row {
+ display: flex;
+}
+.tox .tox-swatch {
+ height: 30px;
+ transition: transform 0.15s, box-shadow 0.15s;
+ width: 30px;
+}
+.tox .tox-swatch:hover,
+.tox .tox-swatch:focus {
+ box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset;
+ transform: scale(0.8);
+}
+.tox .tox-swatch--remove {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+}
+.tox .tox-swatch--remove svg path {
+ stroke: #e74c3c;
+}
+.tox .tox-swatches__picker-btn {
+ align-items: center;
+ background-color: transparent;
+ border: 0;
+ cursor: pointer;
+ display: flex;
+ height: 30px;
+ justify-content: center;
+ outline: none;
+ padding: 0;
+ width: 30px;
+}
+.tox .tox-swatches__picker-btn svg {
+ fill: #222f3e;
+ height: 24px;
+ width: 24px;
+}
+.tox .tox-swatches__picker-btn:hover {
+ background: #cce2fa;
+}
+.tox:not([dir=rtl]) .tox-swatches__picker-btn {
+ margin-left: auto;
+}
+.tox[dir=rtl] .tox-swatches__picker-btn {
+ margin-right: auto;
+}
+.tox .tox-comment-thread {
+ background: #fff;
+ position: relative;
+}
+.tox .tox-comment-thread > *:not(:first-child) {
+ margin-top: 8px;
+}
+.tox .tox-comment {
+ background: #fff;
+ border: 1px solid #eeeeee;
+ border-radius: 6px;
+ box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1);
+ padding: 8px 8px 16px 8px;
+ position: relative;
+}
+.tox .tox-comment__header {
+ align-items: center;
+ color: #222f3e;
+ display: flex;
+ justify-content: space-between;
+}
+.tox .tox-comment__date {
+ color: rgba(34, 47, 62, 0.7);
+ font-size: 12px;
+}
+.tox .tox-comment__body {
+ color: #222f3e;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ margin-top: 8px;
+ position: relative;
+ text-transform: initial;
+}
+.tox .tox-comment__body textarea {
+ resize: none;
+ white-space: normal;
+ width: 100%;
+}
+.tox .tox-comment__expander {
+ padding-top: 8px;
+}
+.tox .tox-comment__expander p {
+ color: rgba(34, 47, 62, 0.7);
+ font-size: 14px;
+ font-style: normal;
+}
+.tox .tox-comment__body p {
+ margin: 0;
+}
+.tox .tox-comment__buttonspacing {
+ padding-top: 16px;
+ text-align: center;
+}
+.tox .tox-comment-thread__overlay::after {
+ background: #fff;
+ bottom: 0;
+ content: "";
+ display: flex;
+ left: 0;
+ opacity: 0.9;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 5;
+}
+.tox .tox-comment__reply {
+ display: flex;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ margin-top: 8px;
+}
+.tox .tox-comment__reply > *:first-child {
+ margin-bottom: 8px;
+ width: 100%;
+}
+.tox .tox-comment__edit {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ margin-top: 16px;
+}
+.tox .tox-comment__gradient::after {
+ background: linear-gradient(rgba(255, 255, 255, 0), #fff);
+ bottom: 0;
+ content: "";
+ display: block;
+ height: 5em;
+ margin-top: -40px;
+ position: absolute;
+ width: 100%;
+}
+.tox .tox-comment__overlay {
+ background: #fff;
+ bottom: 0;
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ left: 0;
+ opacity: 0.9;
+ position: absolute;
+ right: 0;
+ text-align: center;
+ top: 0;
+ z-index: 5;
+}
+.tox .tox-comment__loading-text {
+ align-items: center;
+ color: #222f3e;
+ display: flex;
+ flex-direction: column;
+ position: relative;
+}
+.tox .tox-comment__loading-text > div {
+ padding-bottom: 16px;
+}
+.tox .tox-comment__overlaytext {
+ bottom: 0;
+ flex-direction: column;
+ font-size: 14px;
+ left: 0;
+ padding: 1em;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 10;
+}
+.tox .tox-comment__overlaytext p {
+ background-color: #fff;
+ box-shadow: 0 0 8px 8px #fff;
+ color: #222f3e;
+ text-align: center;
+}
+.tox .tox-comment__overlaytext div:nth-of-type(2) {
+ font-size: 0.8em;
+}
+.tox .tox-comment__busy-spinner {
+ align-items: center;
+ background-color: #fff;
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 20;
+}
+.tox .tox-comment__scroll {
+ display: flex;
+ flex-direction: column;
+ flex-shrink: 1;
+ overflow: auto;
+}
+.tox .tox-conversations {
+ margin: 8px;
+}
+.tox:not([dir=rtl]) .tox-comment__edit {
+ margin-left: 8px;
+}
+.tox:not([dir=rtl]) .tox-comment__buttonspacing > *:last-child,
+.tox:not([dir=rtl]) .tox-comment__edit > *:last-child,
+.tox:not([dir=rtl]) .tox-comment__reply > *:last-child {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-comment__edit {
+ margin-right: 8px;
+}
+.tox[dir=rtl] .tox-comment__buttonspacing > *:last-child,
+.tox[dir=rtl] .tox-comment__edit > *:last-child,
+.tox[dir=rtl] .tox-comment__reply > *:last-child {
+ margin-right: 8px;
+}
+.tox .tox-user {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-user__avatar svg {
+ fill: rgba(34, 47, 62, 0.7);
+}
+.tox .tox-user__name {
+ color: rgba(34, 47, 62, 0.7);
+ font-size: 12px;
+ font-style: normal;
+ font-weight: bold;
+ text-transform: uppercase;
+}
+.tox:not([dir=rtl]) .tox-user__avatar svg {
+ margin-right: 8px;
+}
+.tox:not([dir=rtl]) .tox-user__avatar + .tox-user__name {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-user__avatar svg {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-user__avatar + .tox-user__name {
+ margin-right: 8px;
+}
+.tox .tox-dialog-wrap {
+ align-items: center;
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: fixed;
+ right: 0;
+ top: 0;
+ z-index: 1100;
+}
+.tox .tox-dialog-wrap__backdrop {
+ background-color: rgba(255, 255, 255, 0.75);
+ bottom: 0;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 1;
+}
+.tox .tox-dialog-wrap__backdrop--opaque {
+ background-color: #fff;
+}
+.tox .tox-dialog {
+ background-color: #fff;
+ border-color: #eeeeee;
+ border-radius: 10px;
+ border-style: solid;
+ border-width: 0px;
+ box-shadow: 0 16px 16px -10px rgba(34, 47, 62, 0.15), 0 0 40px 1px rgba(34, 47, 62, 0.15);
+ display: flex;
+ flex-direction: column;
+ max-height: 100%;
+ max-width: 480px;
+ overflow: hidden;
+ position: relative;
+ width: 95vw;
+ z-index: 2;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog {
+ align-self: flex-start;
+ margin: 8px auto;
+ width: calc(100vw - 16px);
+ }
+}
+.tox .tox-dialog-inline {
+ z-index: 1100;
+}
+.tox .tox-dialog__header {
+ align-items: center;
+ background-color: #fff;
+ border-bottom: none;
+ color: #222f3e;
+ display: flex;
+ font-size: 16px;
+ justify-content: space-between;
+ padding: 8px 16px 0 16px;
+ position: relative;
+}
+.tox .tox-dialog__header .tox-button {
+ z-index: 1;
+}
+.tox .tox-dialog__draghandle {
+ cursor: grab;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tox .tox-dialog__draghandle:active {
+ cursor: grabbing;
+}
+.tox .tox-dialog__dismiss {
+ margin-left: auto;
+}
+.tox .tox-dialog__title {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 20px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ margin: 0;
+ text-transform: none;
+}
+.tox .tox-dialog__body {
+ color: #222f3e;
+ display: flex;
+ flex: 1;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ min-width: 0;
+ text-align: left;
+ text-transform: none;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog__body {
+ flex-direction: column;
+ }
+}
+.tox .tox-dialog__body-nav {
+ align-items: flex-start;
+ display: flex;
+ flex-direction: column;
+ padding: 16px 16px;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog__body-nav {
+ flex-direction: row;
+ -webkit-overflow-scrolling: touch;
+ overflow-x: auto;
+ padding-bottom: 0;
+ }
+}
+.tox .tox-dialog__body-nav-item {
+ border-bottom: 2px solid transparent;
+ color: rgba(34, 47, 62, 0.7);
+ display: inline-block;
+ font-size: 14px;
+ line-height: 1.3;
+ margin-bottom: 8px;
+ text-decoration: none;
+ white-space: nowrap;
+}
+.tox .tox-dialog__body-nav-item:focus {
+ background-color: rgba(0, 108, 231, 0.1);
+}
+.tox .tox-dialog__body-nav-item--active {
+ border-bottom: 2px solid #006ce7;
+ color: #006ce7;
+}
+.tox .tox-dialog__body-content {
+ box-sizing: border-box;
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ max-height: 650px;
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+ padding: 16px 16px;
+}
+.tox .tox-dialog__body-content > * {
+ margin-bottom: 0;
+ margin-top: 16px;
+}
+.tox .tox-dialog__body-content > *:first-child {
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content > *:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-dialog__body-content > *:only-child {
+ margin-bottom: 0;
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content a {
+ color: #006ce7;
+ cursor: pointer;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content a:hover,
+.tox .tox-dialog__body-content a:focus {
+ color: #0054b4;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content a:active {
+ color: #0054b4;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content svg {
+ fill: #222f3e;
+}
+.tox .tox-dialog__body-content ul {
+ display: block;
+ list-style-type: disc;
+ margin-bottom: 16px;
+ margin-inline-end: 0;
+ margin-inline-start: 0;
+ padding-inline-start: 2.5rem;
+}
+.tox .tox-dialog__body-content .tox-form__group h1 {
+ color: #222f3e;
+ font-size: 20px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ margin-bottom: 16px;
+ margin-top: 2rem;
+ text-transform: none;
+}
+.tox .tox-dialog__body-content .tox-form__group h2 {
+ color: #222f3e;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ margin-bottom: 16px;
+ margin-top: 2rem;
+ text-transform: none;
+}
+.tox .tox-dialog__body-content .tox-form__group p {
+ margin-bottom: 16px;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:first-child,
+.tox .tox-dialog__body-content .tox-form__group h2:first-child,
+.tox .tox-dialog__body-content .tox-form__group p:first-child {
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:last-child,
+.tox .tox-dialog__body-content .tox-form__group h2:last-child,
+.tox .tox-dialog__body-content .tox-form__group p:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:only-child,
+.tox .tox-dialog__body-content .tox-form__group h2:only-child,
+.tox .tox-dialog__body-content .tox-form__group p:only-child {
+ margin-bottom: 0;
+ margin-top: 0;
+}
+.tox .tox-dialog--width-lg {
+ height: 650px;
+ max-width: 1200px;
+}
+.tox .tox-dialog--width-md {
+ max-width: 800px;
+}
+.tox .tox-dialog--width-md .tox-dialog__body-content {
+ overflow: auto;
+}
+.tox .tox-dialog__body-content--centered {
+ text-align: center;
+}
+.tox .tox-dialog__footer {
+ align-items: center;
+ background-color: #fff;
+ border-top: none;
+ display: flex;
+ justify-content: space-between;
+ padding: 8px 16px;
+}
+.tox .tox-dialog__footer-start,
+.tox .tox-dialog__footer-end {
+ display: flex;
+}
+.tox .tox-dialog__busy-spinner {
+ align-items: center;
+ background-color: rgba(255, 255, 255, 0.75);
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 3;
+}
+.tox .tox-dialog__table {
+ border-collapse: collapse;
+ width: 100%;
+}
+.tox .tox-dialog__table thead th {
+ font-weight: bold;
+ padding-bottom: 8px;
+}
+.tox .tox-dialog__table tbody tr {
+ border-bottom: 1px solid #eeeeee;
+}
+.tox .tox-dialog__table tbody tr:last-child {
+ border-bottom: none;
+}
+.tox .tox-dialog__table td {
+ padding-bottom: 8px;
+ padding-top: 8px;
+}
+.tox .tox-dialog__popups {
+ position: absolute;
+ width: 100%;
+ z-index: 1100;
+}
+.tox .tox-dialog__body-iframe {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+}
+.tox .tox-dialog__body-iframe .tox-navobj {
+ display: flex;
+ flex: 1;
+}
+.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) {
+ flex: 1;
+ height: 100%;
+}
+.tox .tox-dialog-dock-fadeout {
+ opacity: 0;
+ visibility: hidden;
+}
+.tox .tox-dialog-dock-fadein {
+ opacity: 1;
+ visibility: visible;
+}
+.tox .tox-dialog-dock-transition {
+ transition: visibility 0s linear 0.3s, opacity 0.3s ease;
+}
+.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein {
+ transition-delay: 0s;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav {
+ margin-right: 0;
+ }
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child) {
+ margin-left: 8px;
+ }
+}
+.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start > *,
+.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end > * {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-dialog__body {
+ text-align: right;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav {
+ margin-left: 0;
+ }
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child) {
+ margin-right: 8px;
+ }
+}
+.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start > *,
+.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end > * {
+ margin-right: 8px;
+}
+body.tox-dialog__disable-scroll {
+ overflow: hidden;
+}
+.tox .tox-dropzone-container {
+ display: flex;
+ flex: 1;
+}
+.tox .tox-dropzone {
+ align-items: center;
+ background: #fff;
+ border: 2px dashed #eeeeee;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ justify-content: center;
+ min-height: 100px;
+ padding: 10px;
+}
+.tox .tox-dropzone p {
+ color: rgba(34, 47, 62, 0.7);
+ margin: 0 0 16px 0;
+}
+.tox .tox-edit-area {
+ display: flex;
+ flex: 1;
+ overflow: hidden;
+ position: relative;
+}
+.tox .tox-edit-area__iframe {
+ background-color: #fff;
+ border: 0;
+ box-sizing: border-box;
+ flex: 1;
+ height: 100%;
+ position: absolute;
+ width: 100%;
+}
+.tox.tox-inline-edit-area {
+ border: 1px dotted #eeeeee;
+}
+.tox .tox-editor-container {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ overflow: hidden;
+}
+.tox .tox-editor-header {
+ z-index: 1;
+}
+.tox:not(.tox-tinymce-inline) .tox-editor-header {
+ background-color: #fff;
+ border-bottom: none;
+ box-shadow: 0 2px 2px -2px rgba(34, 47, 62, 0.1), 0 8px 8px -4px rgba(34, 47, 62, 0.07);
+ padding: 4px 0;
+ transition: box-shadow 0.5s;
+}
+.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header {
+ border-top: 1px solid #e3e3e3;
+ box-shadow: none;
+}
+.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header {
+ background-color: #fff;
+ box-shadow: 0 2px 2px -2px rgba(34, 47, 62, 0.2), 0 8px 8px -4px rgba(34, 47, 62, 0.15);
+ padding: 4px 0;
+}
+.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header {
+ box-shadow: 0 2px 2px -2px rgba(34, 47, 62, 0.2), 0 8px 8px -4px rgba(34, 47, 62, 0.15);
+}
+.tox-editor-dock-fadeout {
+ opacity: 0;
+ visibility: hidden;
+}
+.tox-editor-dock-fadein {
+ opacity: 1;
+ visibility: visible;
+}
+.tox-editor-dock-transition {
+ transition: visibility 0s linear 0.25s, opacity 0.25s ease;
+}
+.tox-editor-dock-transition.tox-editor-dock-fadein {
+ transition-delay: 0s;
+}
+.tox .tox-control-wrap {
+ flex: 1;
+ position: relative;
+}
+.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,
+.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,
+.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid {
+ display: none;
+}
+.tox .tox-control-wrap svg {
+ display: block;
+}
+.tox .tox-control-wrap__status-icon-wrap {
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-control-wrap__status-icon-invalid svg {
+ fill: #c00;
+}
+.tox .tox-control-wrap__status-icon-unknown svg {
+ fill: orange;
+}
+.tox .tox-control-wrap__status-icon-valid svg {
+ fill: green;
+}
+.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,
+.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,
+.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield {
+ padding-right: 32px;
+}
+.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap {
+ right: 4px;
+}
+.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,
+.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,
+.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield {
+ padding-left: 32px;
+}
+.tox[dir=rtl] .tox-control-wrap__status-icon-wrap {
+ left: 4px;
+}
+.tox .tox-autocompleter {
+ max-width: 25em;
+}
+.tox .tox-autocompleter .tox-menu {
+ border-color: #eeeeee;
+ box-shadow: none;
+ max-width: 25em;
+}
+.tox .tox-autocompleter .tox-autocompleter-highlight {
+ font-weight: bold;
+}
+.tox .tox-color-input {
+ display: flex;
+ position: relative;
+ z-index: 1;
+}
+.tox .tox-color-input .tox-textfield {
+ z-index: -1;
+}
+.tox .tox-color-input span {
+ border-color: rgba(34, 47, 62, 0.2);
+ border-radius: 6px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ height: 24px;
+ position: absolute;
+ top: 6px;
+ width: 24px;
+}
+.tox .tox-color-input span:hover:not([aria-disabled=true]),
+.tox .tox-color-input span:focus:not([aria-disabled=true]) {
+ border-color: #006ce7;
+ cursor: pointer;
+}
+.tox .tox-color-input span::before {
+ background-image: linear-gradient(45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), linear-gradient(-45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%), linear-gradient(-45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%);
+ background-position: 0 0, 0 6px, 6px -6px, -6px 0;
+ background-size: 12px 12px;
+ border: 1px solid #fff;
+ border-radius: 6px;
+ box-sizing: border-box;
+ content: '';
+ height: 24px;
+ left: -1px;
+ position: absolute;
+ top: -1px;
+ width: 24px;
+ z-index: -1;
+}
+.tox .tox-color-input span[aria-disabled=true] {
+ cursor: not-allowed;
+}
+.tox:not([dir=rtl]) .tox-color-input {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox:not([dir=rtl]) .tox-color-input .tox-textfield {
+ padding-left: 36px;
+}
+.tox:not([dir=rtl]) .tox-color-input span {
+ left: 6px;
+}
+.tox[dir="rtl"] .tox-color-input {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox[dir="rtl"] .tox-color-input .tox-textfield {
+ padding-right: 36px;
+}
+.tox[dir="rtl"] .tox-color-input span {
+ right: 6px;
+}
+.tox .tox-label,
+.tox .tox-toolbar-label {
+ color: rgba(34, 47, 62, 0.7);
+ display: block;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ padding: 0 8px 0 0;
+ text-transform: none;
+ white-space: nowrap;
+}
+.tox .tox-toolbar-label {
+ padding: 0 8px;
+}
+.tox[dir=rtl] .tox-label {
+ padding: 0 0 0 8px;
+}
+.tox .tox-form {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+}
+.tox .tox-form__group {
+ box-sizing: border-box;
+ margin-bottom: 4px;
+}
+.tox .tox-form-group--maximize {
+ flex: 1;
+}
+.tox .tox-form__group--error {
+ color: #c00;
+}
+.tox .tox-form__group--collection {
+ display: flex;
+}
+.tox .tox-form__grid {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: space-between;
+}
+.tox .tox-form__grid--2col > .tox-form__group {
+ width: calc(50% - (8px / 2));
+}
+.tox .tox-form__grid--3col > .tox-form__group {
+ width: calc(100% / 3 - (8px / 2));
+}
+.tox .tox-form__grid--4col > .tox-form__group {
+ width: calc(25% - (8px / 2));
+}
+.tox .tox-form__controls-h-stack {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-form__group--inline {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-form__group--stretched {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+}
+.tox .tox-form__group--stretched .tox-textarea {
+ flex: 1;
+}
+.tox .tox-form__group--stretched .tox-navobj {
+ display: flex;
+ flex: 1;
+}
+.tox .tox-form__group--stretched .tox-navobj :nth-child(2) {
+ flex: 1;
+ height: 100%;
+}
+.tox:not([dir=rtl]) .tox-form__controls-h-stack > *:not(:first-child) {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-form__controls-h-stack > *:not(:first-child) {
+ margin-right: 4px;
+}
+.tox .tox-lock.tox-locked .tox-lock-icon__unlock,
+.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock {
+ display: none;
+}
+.tox .tox-textfield,
+.tox .tox-toolbar-textfield,
+.tox .tox-listboxfield .tox-listbox--select,
+.tox .tox-textarea {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: #fff;
+ border-color: #eeeeee;
+ border-radius: 6px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #222f3e;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ margin: 0;
+ min-height: 34px;
+ outline: none;
+ padding: 5px 5.5px;
+ resize: none;
+ width: 100%;
+}
+.tox .tox-textfield[disabled],
+.tox .tox-textarea[disabled] {
+ background-color: #f2f2f2;
+ color: rgba(34, 47, 62, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-textfield:focus,
+.tox .tox-listboxfield .tox-listbox--select:focus,
+.tox .tox-textarea:focus {
+ background-color: #fff;
+ border-color: #006ce7;
+ box-shadow: 0 0 0 2px rgba(0, 108, 231, 0.25);
+ outline: none;
+}
+.tox .tox-toolbar-textfield {
+ border-width: 0;
+ margin-bottom: 3px;
+ margin-top: 2px;
+ max-width: 250px;
+}
+.tox .tox-naked-btn {
+ background-color: transparent;
+ border: 0;
+ border-color: transparent;
+ box-shadow: unset;
+ color: #006ce7;
+ cursor: pointer;
+ display: block;
+ margin: 0;
+ padding: 0;
+}
+.tox .tox-naked-btn svg {
+ display: block;
+ fill: #222f3e;
+}
+.tox:not([dir=rtl]) .tox-toolbar-textfield + * {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-toolbar-textfield + * {
+ margin-right: 4px;
+}
+.tox .tox-listboxfield {
+ cursor: pointer;
+ position: relative;
+}
+.tox .tox-listboxfield .tox-listbox--select[disabled] {
+ background-color: #f2f2f2;
+ color: rgba(34, 47, 62, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-listbox__select-label {
+ cursor: default;
+ flex: 1;
+ margin: 0 4px;
+}
+.tox .tox-listbox__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+}
+.tox .tox-listbox__select-chevron svg {
+ fill: #222f3e;
+}
+.tox .tox-listboxfield .tox-listbox--select {
+ align-items: center;
+ display: flex;
+}
+.tox:not([dir=rtl]) .tox-listboxfield svg {
+ right: 8px;
+}
+.tox[dir=rtl] .tox-listboxfield svg {
+ left: 8px;
+}
+.tox .tox-selectfield {
+ cursor: pointer;
+ position: relative;
+}
+.tox .tox-selectfield select {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: #fff;
+ border-color: #eeeeee;
+ border-radius: 6px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #222f3e;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ margin: 0;
+ min-height: 34px;
+ outline: none;
+ padding: 5px 5.5px;
+ resize: none;
+ width: 100%;
+}
+.tox .tox-selectfield select[disabled] {
+ background-color: #f2f2f2;
+ color: rgba(34, 47, 62, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-selectfield select::-ms-expand {
+ display: none;
+}
+.tox .tox-selectfield select:focus {
+ background-color: #fff;
+ border-color: #006ce7;
+ box-shadow: 0 0 0 2px rgba(0, 108, 231, 0.25);
+ outline: none;
+}
+.tox .tox-selectfield svg {
+ pointer-events: none;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox:not([dir=rtl]) .tox-selectfield select[size="0"],
+.tox:not([dir=rtl]) .tox-selectfield select[size="1"] {
+ padding-right: 24px;
+}
+.tox:not([dir=rtl]) .tox-selectfield svg {
+ right: 8px;
+}
+.tox[dir=rtl] .tox-selectfield select[size="0"],
+.tox[dir=rtl] .tox-selectfield select[size="1"] {
+ padding-left: 24px;
+}
+.tox[dir=rtl] .tox-selectfield svg {
+ left: 8px;
+}
+.tox .tox-textarea {
+ -webkit-appearance: textarea;
+ -moz-appearance: textarea;
+ appearance: textarea;
+ white-space: pre-wrap;
+}
+.tox-fullscreen {
+ border: 0;
+ height: 100%;
+ margin: 0;
+ overflow: hidden;
+ overscroll-behavior: none;
+ padding: 0;
+ touch-action: pinch-zoom;
+ width: 100%;
+}
+.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {
+ display: none;
+}
+.tox.tox-tinymce.tox-fullscreen,
+.tox-shadowhost.tox-fullscreen {
+ left: 0;
+ position: fixed;
+ top: 0;
+ z-index: 1200;
+}
+.tox.tox-tinymce.tox-fullscreen {
+ background-color: transparent;
+}
+.tox-fullscreen .tox.tox-tinymce-aux,
+.tox-fullscreen ~ .tox.tox-tinymce-aux {
+ z-index: 1201;
+}
+.tox .tox-help__more-link {
+ list-style: none;
+ margin-top: 1em;
+}
+.tox .tox-imagepreview {
+ background-color: #666;
+ height: 380px;
+ overflow: hidden;
+ position: relative;
+ width: 100%;
+}
+.tox .tox-imagepreview.tox-imagepreview__loaded {
+ overflow: auto;
+}
+.tox .tox-imagepreview__container {
+ display: flex;
+ left: 100vw;
+ position: absolute;
+ top: 100vw;
+}
+.tox .tox-imagepreview__image {
+ background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==);
+}
+.tox .tox-image-tools .tox-spacer {
+ flex: 1;
+}
+.tox .tox-image-tools .tox-bar {
+ align-items: center;
+ display: flex;
+ height: 60px;
+ justify-content: center;
+}
+.tox .tox-image-tools .tox-imagepreview,
+.tox .tox-image-tools .tox-imagepreview + .tox-bar {
+ margin-top: 8px;
+}
+.tox .tox-image-tools .tox-croprect-block {
+ background: black;
+ filter: alpha(opacity=50);
+ opacity: 0.5;
+ position: absolute;
+ zoom: 1;
+}
+.tox .tox-image-tools .tox-croprect-handle {
+ border: 2px solid white;
+ height: 20px;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 20px;
+}
+.tox .tox-image-tools .tox-croprect-handle-move {
+ border: 0;
+ cursor: move;
+ position: absolute;
+}
+.tox .tox-image-tools .tox-croprect-handle-nw {
+ border-width: 2px 0 0 2px;
+ cursor: nw-resize;
+ left: 100px;
+ margin: -2px 0 0 -2px;
+ top: 100px;
+}
+.tox .tox-image-tools .tox-croprect-handle-ne {
+ border-width: 2px 2px 0 0;
+ cursor: ne-resize;
+ left: 200px;
+ margin: -2px 0 0 -20px;
+ top: 100px;
+}
+.tox .tox-image-tools .tox-croprect-handle-sw {
+ border-width: 0 0 2px 2px;
+ cursor: sw-resize;
+ left: 100px;
+ margin: -20px 2px 0 -2px;
+ top: 200px;
+}
+.tox .tox-image-tools .tox-croprect-handle-se {
+ border-width: 0 2px 2px 0;
+ cursor: se-resize;
+ left: 200px;
+ margin: -20px 0 0 -20px;
+ top: 200px;
+}
+.tox .tox-insert-table-picker {
+ display: flex;
+ flex-wrap: wrap;
+ width: 170px;
+}
+.tox .tox-insert-table-picker > div {
+ border-color: #eeeeee;
+ border-style: solid;
+ border-width: 0 1px 1px 0;
+ box-sizing: border-box;
+ height: 17px;
+ width: 17px;
+}
+.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker {
+ margin: -4px -4px;
+}
+.tox .tox-insert-table-picker .tox-insert-table-picker__selected {
+ background-color: rgba(0, 108, 231, 0.5);
+ border-color: rgba(0, 108, 231, 0.5);
+}
+.tox .tox-insert-table-picker__label {
+ color: rgba(34, 47, 62, 0.7);
+ display: block;
+ font-size: 14px;
+ padding: 4px;
+ text-align: center;
+ width: 100%;
+}
+.tox:not([dir=rtl]) {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox:not([dir=rtl]) .tox-insert-table-picker > div:nth-child(10n) {
+ border-right: 0;
+}
+.tox[dir=rtl] {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox[dir=rtl] .tox-insert-table-picker > div:nth-child(10n+1) {
+ border-right: 0;
+}
+.tox {
+ /* stylelint-disable */
+ /* stylelint-enable */
+}
+.tox .tox-menu {
+ background-color: #fff;
+ border: 1px solid transparent;
+ border-radius: 6px;
+ box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15);
+ display: inline-block;
+ overflow: hidden;
+ vertical-align: top;
+ z-index: 1150;
+}
+.tox .tox-menu.tox-collection.tox-collection--list {
+ padding: 0 4px;
+}
+.tox .tox-menu.tox-collection.tox-collection--toolbar {
+ padding: 8px;
+}
+.tox .tox-menu.tox-collection.tox-collection--grid {
+ padding: 8px;
+}
+.tox .tox-menu__label h1,
+.tox .tox-menu__label h2,
+.tox .tox-menu__label h3,
+.tox .tox-menu__label h4,
+.tox .tox-menu__label h5,
+.tox .tox-menu__label h6,
+.tox .tox-menu__label p,
+.tox .tox-menu__label blockquote,
+.tox .tox-menu__label code {
+ margin: 0;
+}
+.tox .tox-menubar {
+ background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='transparent'/%3E%3C/svg%3E") left 0 top 0 #fff;
+ background-color: #fff;
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ padding: 0 11px 0 12px;
+}
+.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar {
+ border-top: 1px solid transparent;
+}
+/* Deprecated. Remove in next major release */
+.tox .tox-mbtn {
+ align-items: center;
+ background: transparent;
+ border: 0;
+ border-radius: 3px;
+ box-shadow: none;
+ color: #222f3e;
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ height: 28px;
+ justify-content: center;
+ margin: 5px 1px 6px 0;
+ outline: none;
+ overflow: hidden;
+ padding: 0 4px;
+ text-transform: none;
+ width: auto;
+}
+.tox .tox-mbtn[disabled] {
+ background-color: transparent;
+ border: 0;
+ box-shadow: none;
+ color: rgba(34, 47, 62, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-mbtn:focus:not(:disabled) {
+ background: #cce2fa;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-mbtn--active {
+ background: #a6ccf7;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) {
+ background: #cce2fa;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-mbtn__select-label {
+ cursor: default;
+ font-weight: normal;
+ margin: 0 4px;
+}
+.tox .tox-mbtn[disabled] .tox-mbtn__select-label {
+ cursor: not-allowed;
+}
+.tox .tox-mbtn__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+ display: none;
+}
+.tox .tox-notification {
+ border-radius: 6px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ display: grid;
+ font-size: 14px;
+ font-weight: normal;
+ grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr);
+ margin-top: 4px;
+ opacity: 0;
+ padding: 4px;
+ transition: transform 100ms ease-in, opacity 150ms ease-in;
+}
+.tox .tox-notification p {
+ font-size: 14px;
+ font-weight: normal;
+}
+.tox .tox-notification a {
+ cursor: pointer;
+ text-decoration: underline;
+}
+.tox .tox-notification--in {
+ opacity: 1;
+}
+.tox .tox-notification--success {
+ background-color: #e4eeda;
+ border-color: #d7e6c8;
+ color: #222f3e;
+}
+.tox .tox-notification--success p {
+ color: #222f3e;
+}
+.tox .tox-notification--success a {
+ color: #517342;
+}
+.tox .tox-notification--success svg {
+ fill: #222f3e;
+}
+.tox .tox-notification--error {
+ background-color: #f5cccc;
+ border-color: #f0b3b3;
+ color: #222f3e;
+}
+.tox .tox-notification--error p {
+ color: #222f3e;
+}
+.tox .tox-notification--error a {
+ color: #77181f;
+}
+.tox .tox-notification--error svg {
+ fill: #222f3e;
+}
+.tox .tox-notification--warn,
+.tox .tox-notification--warning {
+ background-color: #fff5cc;
+ border-color: #fff0b3;
+ color: #222f3e;
+}
+.tox .tox-notification--warn p,
+.tox .tox-notification--warning p {
+ color: #222f3e;
+}
+.tox .tox-notification--warn a,
+.tox .tox-notification--warning a {
+ color: #7a6e25;
+}
+.tox .tox-notification--warn svg,
+.tox .tox-notification--warning svg {
+ fill: #222f3e;
+}
+.tox .tox-notification--info {
+ background-color: #d6e7fb;
+ border-color: #c1dbf9;
+ color: #222f3e;
+}
+.tox .tox-notification--info p {
+ color: #222f3e;
+}
+.tox .tox-notification--info a {
+ color: #2a64a6;
+}
+.tox .tox-notification--info svg {
+ fill: #222f3e;
+}
+.tox .tox-notification__body {
+ align-self: center;
+ color: #222f3e;
+ font-size: 14px;
+ grid-column-end: 3;
+ grid-column-start: 2;
+ grid-row-end: 2;
+ grid-row-start: 1;
+ text-align: center;
+ white-space: normal;
+ word-break: break-all;
+ word-break: break-word;
+}
+.tox .tox-notification__body > * {
+ margin: 0;
+}
+.tox .tox-notification__body > * + * {
+ margin-top: 1rem;
+}
+.tox .tox-notification__icon {
+ align-self: center;
+ grid-column-end: 2;
+ grid-column-start: 1;
+ grid-row-end: 2;
+ grid-row-start: 1;
+ justify-self: end;
+}
+.tox .tox-notification__icon svg {
+ display: block;
+}
+.tox .tox-notification__dismiss {
+ align-self: start;
+ grid-column-end: 4;
+ grid-column-start: 3;
+ grid-row-end: 2;
+ grid-row-start: 1;
+ justify-self: end;
+}
+.tox .tox-notification .tox-progress-bar {
+ grid-column-end: 4;
+ grid-column-start: 1;
+ grid-row-end: 3;
+ grid-row-start: 2;
+ justify-self: center;
+}
+.tox .tox-pop {
+ display: inline-block;
+ position: relative;
+}
+.tox .tox-pop--resizing {
+ transition: width 0.1s ease;
+}
+.tox .tox-pop--resizing .tox-toolbar,
+.tox .tox-pop--resizing .tox-toolbar__group {
+ flex-wrap: nowrap;
+}
+.tox .tox-pop--transition {
+ transition: 0.15s ease;
+ transition-property: left, right, top, bottom;
+}
+.tox .tox-pop--transition::before,
+.tox .tox-pop--transition::after {
+ transition: all 0.15s, visibility 0s, opacity 0.075s ease 0.075s;
+}
+.tox .tox-pop__dialog {
+ background-color: #fff;
+ border: 1px solid #eeeeee;
+ border-radius: 6px;
+ box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15);
+ min-width: 0;
+ overflow: hidden;
+}
+.tox .tox-pop__dialog > *:not(.tox-toolbar) {
+ margin: 4px 4px 4px 8px;
+}
+.tox .tox-pop__dialog .tox-toolbar {
+ background-color: transparent;
+ margin-bottom: -1px;
+}
+.tox .tox-pop::before,
+.tox .tox-pop::after {
+ border-style: solid;
+ content: '';
+ display: block;
+ height: 0;
+ opacity: 1;
+ position: absolute;
+ width: 0;
+}
+.tox .tox-pop.tox-pop--inset::before,
+.tox .tox-pop.tox-pop--inset::after {
+ opacity: 0;
+ transition: all 0s 0.15s, visibility 0s, opacity 0.075s ease;
+}
+.tox .tox-pop.tox-pop--bottom::before,
+.tox .tox-pop.tox-pop--bottom::after {
+ left: 50%;
+ top: 100%;
+}
+.tox .tox-pop.tox-pop--bottom::after {
+ border-color: #fff transparent transparent transparent;
+ border-width: 8px;
+ margin-left: -8px;
+ margin-top: -1px;
+}
+.tox .tox-pop.tox-pop--bottom::before {
+ border-color: #eeeeee transparent transparent transparent;
+ border-width: 9px;
+ margin-left: -9px;
+}
+.tox .tox-pop.tox-pop--top::before,
+.tox .tox-pop.tox-pop--top::after {
+ left: 50%;
+ top: 0;
+ transform: translateY(-100%);
+}
+.tox .tox-pop.tox-pop--top::after {
+ border-color: transparent transparent #fff transparent;
+ border-width: 8px;
+ margin-left: -8px;
+ margin-top: 1px;
+}
+.tox .tox-pop.tox-pop--top::before {
+ border-color: transparent transparent #eeeeee transparent;
+ border-width: 9px;
+ margin-left: -9px;
+}
+.tox .tox-pop.tox-pop--left::before,
+.tox .tox-pop.tox-pop--left::after {
+ left: 0;
+ top: calc(50% - 1px);
+ transform: translateY(-50%);
+}
+.tox .tox-pop.tox-pop--left::after {
+ border-color: transparent #fff transparent transparent;
+ border-width: 8px;
+ margin-left: -15px;
+}
+.tox .tox-pop.tox-pop--left::before {
+ border-color: transparent #eeeeee transparent transparent;
+ border-width: 10px;
+ margin-left: -19px;
+}
+.tox .tox-pop.tox-pop--right::before,
+.tox .tox-pop.tox-pop--right::after {
+ left: 100%;
+ top: calc(50% + 1px);
+ transform: translateY(-50%);
+}
+.tox .tox-pop.tox-pop--right::after {
+ border-color: transparent transparent transparent #fff;
+ border-width: 8px;
+ margin-left: -1px;
+}
+.tox .tox-pop.tox-pop--right::before {
+ border-color: transparent transparent transparent #eeeeee;
+ border-width: 10px;
+ margin-left: -1px;
+}
+.tox .tox-pop.tox-pop--align-left::before,
+.tox .tox-pop.tox-pop--align-left::after {
+ left: 20px;
+}
+.tox .tox-pop.tox-pop--align-right::before,
+.tox .tox-pop.tox-pop--align-right::after {
+ left: calc(100% - 20px);
+}
+.tox .tox-sidebar-wrap {
+ display: flex;
+ flex-direction: row;
+ flex-grow: 1;
+ min-height: 0;
+}
+.tox .tox-sidebar {
+ background-color: #fff;
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-end;
+}
+.tox .tox-sidebar__slider {
+ display: flex;
+ overflow: hidden;
+}
+.tox .tox-sidebar__pane-container {
+ display: flex;
+}
+.tox .tox-sidebar__pane {
+ display: flex;
+}
+.tox .tox-sidebar--sliding-closed {
+ opacity: 0;
+}
+.tox .tox-sidebar--sliding-open {
+ opacity: 1;
+}
+.tox .tox-sidebar--sliding-growing,
+.tox .tox-sidebar--sliding-shrinking {
+ transition: width 0.5s ease, opacity 0.5s ease;
+}
+.tox .tox-selector {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ display: inline-block;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+}
+.tox.tox-platform-touch .tox-selector {
+ height: 12px;
+ width: 12px;
+}
+.tox .tox-slider {
+ align-items: center;
+ display: flex;
+ flex: 1;
+ height: 24px;
+ justify-content: center;
+ position: relative;
+}
+.tox .tox-slider__rail {
+ background-color: transparent;
+ border: 1px solid #eeeeee;
+ border-radius: 6px;
+ height: 10px;
+ min-width: 120px;
+ width: 100%;
+}
+.tox .tox-slider__handle {
+ background-color: #006ce7;
+ border: 2px solid #0054b4;
+ border-radius: 6px;
+ box-shadow: none;
+ height: 24px;
+ left: 50%;
+ position: absolute;
+ top: 50%;
+ transform: translateX(-50%) translateY(-50%);
+ width: 14px;
+}
+.tox .tox-form__controls-h-stack > .tox-slider:not(:first-of-type) {
+ margin-inline-start: 8px;
+}
+.tox .tox-form__controls-h-stack > .tox-form__group + .tox-slider {
+ margin-inline-start: 32px;
+}
+.tox .tox-form__controls-h-stack > .tox-slider + .tox-form__group {
+ margin-inline-start: 32px;
+}
+.tox .tox-source-code {
+ overflow: auto;
+}
+.tox .tox-spinner {
+ display: flex;
+}
+.tox .tox-spinner > div {
+ animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both;
+ background-color: rgba(34, 47, 62, 0.7);
+ border-radius: 100%;
+ height: 8px;
+ width: 8px;
+}
+.tox .tox-spinner > div:nth-child(1) {
+ animation-delay: -0.32s;
+}
+.tox .tox-spinner > div:nth-child(2) {
+ animation-delay: -0.16s;
+}
+@keyframes tam-bouncing-dots {
+ 0%,
+ 80%,
+ 100% {
+ transform: scale(0);
+ }
+ 40% {
+ transform: scale(1);
+ }
+}
+.tox:not([dir=rtl]) .tox-spinner > div:not(:first-child) {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-spinner > div:not(:first-child) {
+ margin-right: 4px;
+}
+.tox .tox-statusbar {
+ align-items: center;
+ background-color: #fff;
+ border-top: 1px solid #e3e3e3;
+ color: rgba(34, 47, 62, 0.7);
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 14px;
+ font-weight: normal;
+ height: 25px;
+ overflow: hidden;
+ padding: 0 8px;
+ position: relative;
+ text-transform: none;
+}
+.tox .tox-statusbar__text-container {
+ display: flex;
+ flex: 1 1 auto;
+ justify-content: flex-end;
+ overflow: hidden;
+}
+.tox .tox-statusbar__path {
+ display: flex;
+ flex: 1 1 auto;
+ margin-right: auto;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.tox .tox-statusbar__path > * {
+ display: inline;
+ white-space: nowrap;
+}
+.tox .tox-statusbar__wordcount {
+ flex: 0 0 auto;
+ margin-left: 1ch;
+}
+.tox .tox-statusbar a,
+.tox .tox-statusbar__path-item,
+.tox .tox-statusbar__wordcount {
+ color: rgba(34, 47, 62, 0.7);
+ text-decoration: none;
+}
+.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]) {
+ color: #222f3e;
+ cursor: pointer;
+}
+.tox .tox-statusbar__branding svg {
+ fill: rgba(34, 47, 62, 0.8);
+ height: 1.14em;
+ vertical-align: -0.28em;
+ width: 3.6em;
+}
+.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled=true]) svg,
+.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled=true]) svg {
+ fill: #222f3e;
+}
+.tox .tox-statusbar__resize-handle {
+ align-items: flex-end;
+ align-self: stretch;
+ cursor: nwse-resize;
+ display: flex;
+ flex: 0 0 auto;
+ justify-content: flex-end;
+ margin-left: auto;
+ margin-right: -8px;
+ padding-bottom: 3px;
+ padding-left: 1ch;
+ padding-right: 3px;
+}
+.tox .tox-statusbar__resize-handle svg {
+ display: block;
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-statusbar__resize-handle:focus svg {
+ background-color: #dee0e2;
+ border-radius: 1px 1px 5px 1px;
+ box-shadow: 0 0 0 2px #dee0e2;
+}
+.tox:not([dir=rtl]) .tox-statusbar__path > * {
+ margin-right: 4px;
+}
+.tox:not([dir=rtl]) .tox-statusbar__branding {
+ margin-left: 2ch;
+}
+.tox[dir=rtl] .tox-statusbar {
+ flex-direction: row-reverse;
+}
+.tox[dir=rtl] .tox-statusbar__path > * {
+ margin-left: 4px;
+}
+.tox .tox-throbber {
+ z-index: 1299;
+}
+.tox .tox-throbber__busy-spinner {
+ align-items: center;
+ background-color: rgba(255, 255, 255, 0.6);
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+}
+.tox .tox-tbtn {
+ align-items: center;
+ background: transparent;
+ border: 0;
+ border-radius: 3px;
+ box-shadow: none;
+ color: #222f3e;
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ height: 28px;
+ justify-content: center;
+ margin: 6px 1px 5px 0;
+ outline: none;
+ overflow: hidden;
+ padding: 0;
+ text-transform: none;
+ width: 34px;
+}
+.tox .tox-tbtn svg {
+ display: block;
+ fill: #222f3e;
+}
+.tox .tox-tbtn.tox-tbtn-more {
+ padding-left: 5px;
+ padding-right: 5px;
+ width: inherit;
+}
+.tox .tox-tbtn:focus {
+ background: #cce2fa;
+ border: 0;
+ box-shadow: none;
+}
+.tox .tox-tbtn:hover {
+ background: #cce2fa;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-tbtn:hover svg {
+ fill: #222f3e;
+}
+.tox .tox-tbtn:active {
+ background: #a6ccf7;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-tbtn:active svg {
+ fill: #222f3e;
+}
+.tox .tox-tbtn--disabled,
+.tox .tox-tbtn--disabled:hover,
+.tox .tox-tbtn:disabled,
+.tox .tox-tbtn:disabled:hover {
+ background: transparent;
+ border: 0;
+ box-shadow: none;
+ color: rgba(34, 47, 62, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-tbtn--disabled svg,
+.tox .tox-tbtn--disabled:hover svg,
+.tox .tox-tbtn:disabled svg,
+.tox .tox-tbtn:disabled:hover svg {
+ /* stylelint-disable-line no-descending-specificity */
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-tbtn--enabled,
+.tox .tox-tbtn--enabled:hover {
+ background: #a6ccf7;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-tbtn--enabled > *,
+.tox .tox-tbtn--enabled:hover > * {
+ transform: none;
+}
+.tox .tox-tbtn--enabled svg,
+.tox .tox-tbtn--enabled:hover svg {
+ /* stylelint-disable-line no-descending-specificity */
+ fill: #222f3e;
+}
+.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) {
+ color: #222f3e;
+}
+.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg {
+ fill: #222f3e;
+}
+.tox .tox-tbtn:active > * {
+ transform: none;
+}
+.tox .tox-tbtn--md {
+ height: 42px;
+ width: 51px;
+}
+.tox .tox-tbtn--lg {
+ flex-direction: column;
+ height: 56px;
+ width: 68px;
+}
+.tox .tox-tbtn--return {
+ align-self: stretch;
+ height: unset;
+ width: 16px;
+}
+.tox .tox-tbtn--labeled {
+ padding: 0 4px;
+ width: unset;
+}
+.tox .tox-tbtn__vlabel {
+ display: block;
+ font-size: 10px;
+ font-weight: normal;
+ letter-spacing: -0.025em;
+ margin-bottom: 4px;
+ white-space: nowrap;
+}
+.tox .tox-tbtn--select {
+ margin: 6px 1px 5px 0;
+ padding: 0 4px;
+ width: auto;
+}
+.tox .tox-tbtn__select-label {
+ cursor: default;
+ font-weight: normal;
+ margin: 0 4px;
+}
+.tox .tox-tbtn__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+}
+.tox .tox-tbtn__select-chevron svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-tbtn--bespoke {
+ background: #f7f7f7;
+}
+.tox .tox-tbtn--bespoke + .tox-tbtn--bespoke {
+ margin-inline-start: 4px;
+}
+.tox .tox-tbtn--bespoke .tox-tbtn__select-label {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ width: 7em;
+}
+.tox .tox-split-button {
+ border: 0;
+ border-radius: 3px;
+ box-sizing: border-box;
+ display: flex;
+ margin: 6px 1px 5px 0;
+ overflow: hidden;
+}
+.tox .tox-split-button:hover {
+ box-shadow: 0 0 0 1px #cce2fa inset;
+}
+.tox .tox-split-button:focus {
+ background: #cce2fa;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-split-button > * {
+ border-radius: 0;
+}
+.tox .tox-split-button__chevron {
+ width: 16px;
+}
+.tox .tox-split-button__chevron svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-split-button .tox-tbtn {
+ margin: 0;
+}
+.tox .tox-split-button.tox-tbtn--disabled:hover,
+.tox .tox-split-button.tox-tbtn--disabled:focus,
+.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,
+.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus {
+ background: transparent;
+ box-shadow: none;
+ color: rgba(34, 47, 62, 0.5);
+}
+.tox.tox-platform-touch .tox-split-button .tox-tbtn--select {
+ padding: 0 0px;
+}
+.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child {
+ width: 30px;
+}
+.tox.tox-platform-touch .tox-split-button__chevron {
+ width: 20px;
+}
+.tox .tox-toolbar-overlord {
+ background-color: #fff;
+}
+.tox .tox-toolbar,
+.tox .tox-toolbar__primary,
+.tox .tox-toolbar__overflow {
+ background-color: #fff;
+ background-image: repeating-linear-gradient(#e3e3e3 0px 1px, transparent 1px 39px);
+ background-position: center top 40px;
+ background-repeat: no-repeat;
+ background-size: calc(100% - 11px * 2) calc(100% - 41px);
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ padding: 0 0px;
+ transform: perspective(1px);
+}
+.tox .tox-toolbar-overlord > .tox-toolbar,
+.tox .tox-toolbar-overlord > .tox-toolbar__primary,
+.tox .tox-toolbar-overlord > .tox-toolbar__overflow {
+ background-position: center top 0px;
+ background-size: calc(100% - 11px * 2) calc(100% - 0px);
+}
+.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed {
+ height: 0;
+ opacity: 0;
+ padding-bottom: 0;
+ padding-top: 0;
+ visibility: hidden;
+}
+.tox .tox-toolbar__overflow--growing {
+ transition: height 0.3s ease, opacity 0.2s linear 0.1s;
+}
+.tox .tox-toolbar__overflow--shrinking {
+ transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s;
+}
+.tox .tox-menubar + .tox-toolbar,
+.tox .tox-menubar + .tox-toolbar-overlord {
+ border-top: 1px solid transparent;
+ margin-top: 0px;
+ padding-bottom: 1px;
+ padding-top: 1px;
+}
+.tox .tox-toolbar--scrolling {
+ flex-wrap: nowrap;
+ overflow-x: auto;
+}
+.tox .tox-pop .tox-toolbar {
+ border-width: 0;
+}
+.tox .tox-toolbar--no-divider {
+ background-image: none;
+}
+.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child,
+.tox .tox-toolbar-overlord .tox-toolbar__primary {
+ background-position: center top 39px;
+}
+.tox .tox-editor-header > .tox-toolbar--scrolling,
+.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child {
+ background-image: none;
+}
+.tox.tox-tinymce-aux .tox-toolbar__overflow {
+ background-color: #fff;
+ background-position: center top 43px;
+ background-size: calc(100% - 8px * 2) calc(100% - 51px);
+ border: none;
+ border-radius: 6px;
+ box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15);
+ padding: 4px 0;
+}
+.tox-pop .tox-pop__dialog {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox-pop .tox-pop__dialog .tox-toolbar {
+ background-position: center top 43px;
+ background-size: calc(100% - 11px * 2) calc(100% - 51px);
+ padding: 4px 0;
+}
+.tox .tox-toolbar__group {
+ align-items: center;
+ display: flex;
+ flex-wrap: wrap;
+ margin: 0 0;
+ padding: 0 11px 0 12px;
+}
+.tox .tox-toolbar__group--pull-right {
+ margin-left: auto;
+}
+.tox .tox-toolbar--scrolling .tox-toolbar__group {
+ flex-shrink: 0;
+ flex-wrap: nowrap;
+}
+.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type) {
+ border-right: 1px solid transparent;
+}
+.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type) {
+ border-left: 1px solid transparent;
+}
+.tox .tox-tooltip {
+ display: inline-block;
+ padding: 8px;
+ position: relative;
+}
+.tox .tox-tooltip__body {
+ background-color: #222f3e;
+ border-radius: 6px;
+ box-shadow: 0 2px 4px rgba(34, 47, 62, 0.3);
+ color: rgba(255, 255, 255, 0.75);
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ padding: 4px 8px;
+ text-transform: none;
+}
+.tox .tox-tooltip__arrow {
+ position: absolute;
+}
+.tox .tox-tooltip--down .tox-tooltip__arrow {
+ border-left: 8px solid transparent;
+ border-right: 8px solid transparent;
+ border-top: 8px solid #222f3e;
+ bottom: 0;
+ left: 50%;
+ position: absolute;
+ transform: translateX(-50%);
+}
+.tox .tox-tooltip--up .tox-tooltip__arrow {
+ border-bottom: 8px solid #222f3e;
+ border-left: 8px solid transparent;
+ border-right: 8px solid transparent;
+ left: 50%;
+ position: absolute;
+ top: 0;
+ transform: translateX(-50%);
+}
+.tox .tox-tooltip--right .tox-tooltip__arrow {
+ border-bottom: 8px solid transparent;
+ border-left: 8px solid #222f3e;
+ border-top: 8px solid transparent;
+ position: absolute;
+ right: 0;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-tooltip--left .tox-tooltip__arrow {
+ border-bottom: 8px solid transparent;
+ border-right: 8px solid #222f3e;
+ border-top: 8px solid transparent;
+ left: 0;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-well {
+ border: 1px solid #eeeeee;
+ border-radius: 6px;
+ padding: 8px;
+ width: 100%;
+}
+.tox .tox-well > *:first-child {
+ margin-top: 0;
+}
+.tox .tox-well > *:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-well > *:only-child {
+ margin: 0;
+}
+.tox .tox-custom-editor {
+ border: 1px solid #eeeeee;
+ border-radius: 6px;
+ display: flex;
+ flex: 1;
+ position: relative;
+}
+/* stylelint-disable */
+.tox {
+ /* stylelint-enable */
+}
+.tox .tox-dialog-loading::before {
+ background-color: rgba(0, 0, 0, 0.5);
+ content: "";
+ height: 100%;
+ position: absolute;
+ width: 100%;
+ z-index: 1000;
+}
+.tox .tox-tab {
+ cursor: pointer;
+}
+.tox .tox-dialog__content-js {
+ display: flex;
+ flex: 1;
+}
+.tox .tox-dialog__body-content .tox-collection {
+ display: flex;
+ flex: 1;
+}
diff --git a/public/tinymce/skins/ui/oxide/skin.min.css b/public/tinymce/skins/ui/oxide/skin.min.css
new file mode 100644
index 00000000..e0ffd65b
--- /dev/null
+++ b/public/tinymce/skins/ui/oxide/skin.min.css
@@ -0,0 +1 @@
+.tox{box-shadow:none;box-sizing:content-box;color:#222f3e;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:2px solid #eee;border-radius:10px;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox.tox-tinymce-inline{border:none;box-shadow:none;overflow:initial}.tox.tox-tinymce-inline .tox-editor-container{overflow:initial}.tox.tox-tinymce-inline .tox-editor-header{background-color:#fff;border:2px solid #eee;border-radius:10px;box-shadow:none;overflow:hidden}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox[dir=rtl] .tox-icon--flip svg{transform:rotateY(180deg)}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #eee;border-radius:6px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#eee;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(0,108,231,.1);border-color:#006ce7;color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:#006ce7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#006ce7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#006ce7}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#006ce7}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.1);border-color:rgba(255,165,0,.5);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.5)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.1);border-color:rgba(204,0,0,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.4)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#c00}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.1);border-color:rgba(120,171,70,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.4)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#006ce7;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#006ce7;border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button[disabled]{background-color:#006ce7;background-image:none;border-color:#006ce7;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#0060ce;background-image:none;border-color:#0060ce;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#0060ce;background-image:none;border-color:#0060ce;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#0054b4;background-image:none;border-color:#0054b4;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#f0f0f0;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#f0f0f0;border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;color:#222f3e;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:none}.tox .tox-button--secondary[disabled]{background-color:#f0f0f0;background-image:none;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:hover:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:active:not(:disabled){background-color:#d6d6d6;background-image:none;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#222f3e}.tox .tox-button--naked[disabled]{background-color:rgba(34,47,62,.12);border-color:transparent;box-shadow:unset;color:rgba(34,47,62,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:rgba(34,47,62,.12);border-color:transparent;box-shadow:unset;color:#222f3e}.tox .tox-button--naked:focus:not(:disabled){background-color:rgba(34,47,62,.12);border-color:transparent;box-shadow:unset;color:#222f3e}.tox .tox-button--naked:active:not(:disabled){background-color:rgba(34,47,62,.18);border-color:transparent;box-shadow:unset;color:#222f3e}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#222f3e}.tox .tox-checkbox{align-items:center;border-radius:6px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:6px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(34,47,62,.3)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#006ce7}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#006ce7}.tox .tox-checkbox--disabled{color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(34,47,62,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:6px;box-shadow:inset 0 0 0 1px #006ce7;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#e3e3e3;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#fcfcfc;color:rgba(34,47,62,.7);cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;border-radius:3px;color:#222f3e;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#fff;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active{background-color:#cce2fa}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#a6ccf7;color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#cce2fa}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#a6ccf7;color:#222f3e}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#cce2fa;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(34,47,62,.7);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#222f3e}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg{fill:rgba(34,47,62,.5)}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#fff;border:1px solid #e3e3e3;border-radius:6px;box-shadow:0 0 2px 0 rgba(34,47,62,.2),0 4px 8px 0 rgba(34,47,62,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:28px;margin:6px 1px 5px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid transparent}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid transparent}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:5px 0 6px 11px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px -4px}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{fill:#222f3e;height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#cce2fa}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#fff;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#fff;border:1px solid #eee;border-radius:6px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#222f3e;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(34,47,62,.7);font-size:12px}.tox .tox-comment__body{color:#222f3e;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(34,47,62,.7);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#fff;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(255,255,255,0),#fff);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#fff;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#222f3e;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#fff;box-shadow:0 0 8px 8px #fff;color:#222f3e;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#fff;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(34,47,62,.7)}.tox .tox-user__name{color:rgba(34,47,62,.7);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(255,255,255,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#fff}.tox .tox-dialog{background-color:#fff;border-color:#eee;border-radius:10px;border-style:solid;border-width:0;box-shadow:0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#fff;border-bottom:none;color:#222f3e;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#222f3e;display:flex;flex:1;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(34,47,62,.7);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(0,108,231,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #006ce7;color:#006ce7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#006ce7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#0054b4;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#0054b4;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#222f3e}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;margin-inline-end:0;margin-inline-start:0;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#222f3e;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#222f3e;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#fff;border-top:none;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(255,255,255,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #eee}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #eee;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(34,47,62,.7);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #eee}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{background-color:#fff;border-bottom:none;box-shadow:0 2px 2px -2px rgba(34,47,62,.1),0 8px 8px -4px rgba(34,47,62,.07);padding:4px 0;transition:box-shadow .5s}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header{border-top:1px solid #e3e3e3;box-shadow:none}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:#fff;box-shadow:0 2px 2px -2px rgba(34,47,62,.2),0 8px 8px -4px rgba(34,47,62,.15);padding:4px 0}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header{box-shadow:0 2px 2px -2px rgba(34,47,62,.2),0 8px 8px -4px rgba(34,47,62,.15)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{border-color:#eee;box-shadow:none;max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(34,47,62,.2);border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#006ce7;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(0,0,0,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #fff;border-radius:6px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(34,47,62,.7);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column}.tox .tox-form__group--stretched .tox-textarea{flex:1}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#eee;border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 5.5px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#fff;border-color:#006ce7;box-shadow:0 0 0 2px rgba(0,108,231,.25);outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#006ce7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#222f3e}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#222f3e}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#eee;border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 5.5px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#fff;border-color:#006ce7;box-shadow:0 0 0 2px rgba(0,108,231,.25);outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-imagepreview{background-color:#666;height:380px;overflow:hidden;position:relative;width:100%}.tox .tox-imagepreview.tox-imagepreview__loaded{overflow:auto}.tox .tox-imagepreview__container{display:flex;left:100vw;position:absolute;top:100vw}.tox .tox-imagepreview__image{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools .tox-spacer{flex:1}.tox .tox-image-tools .tox-bar{align-items:center;display:flex;height:60px;justify-content:center}.tox .tox-image-tools .tox-imagepreview,.tox .tox-image-tools .tox-imagepreview+.tox-bar{margin-top:8px}.tox .tox-image-tools .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-image-tools .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-image-tools .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-image-tools .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-image-tools .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-image-tools .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-image-tools .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#eee;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px -4px}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(0,108,231,.5);border-color:rgba(0,108,231,.5)}.tox .tox-insert-table-picker__label{color:rgba(34,47,62,.7);display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#fff;border:1px solid transparent;border-radius:6px;box-shadow:0 0 2px 0 rgba(34,47,62,.2),0 4px 8px 0 rgba(34,47,62,.15);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0 4px}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:8px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:8px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='transparent'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 11px 0 12px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid transparent}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:28px;justify-content:center;margin:5px 1px 6px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#cce2fa;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn--active{background:#a6ccf7;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#cce2fa;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:6px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:grid;font-size:14px;font-weight:400;grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{cursor:pointer;text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#222f3e}.tox .tox-notification--success p{color:#222f3e}.tox .tox-notification--success a{color:#517342}.tox .tox-notification--success svg{fill:#222f3e}.tox .tox-notification--error{background-color:#f5cccc;border-color:#f0b3b3;color:#222f3e}.tox .tox-notification--error p{color:#222f3e}.tox .tox-notification--error a{color:#77181f}.tox .tox-notification--error svg{fill:#222f3e}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fff5cc;border-color:#fff0b3;color:#222f3e}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#222f3e}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#7a6e25}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#222f3e}.tox .tox-notification--info{background-color:#d6e7fb;border-color:#c1dbf9;color:#222f3e}.tox .tox-notification--info p{color:#222f3e}.tox .tox-notification--info a{color:#2a64a6}.tox .tox-notification--info svg{fill:#222f3e}.tox .tox-notification__body{align-self:center;color:#222f3e;font-size:14px;grid-column-end:3;grid-column-start:2;grid-row-end:2;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{align-self:center;grid-column-end:2;grid-column-start:1;grid-row-end:2;grid-row-start:1;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{align-self:start;grid-column-end:4;grid-column-start:3;grid-row-end:2;grid-row-start:1;justify-self:end}.tox .tox-notification .tox-progress-bar{grid-column-end:4;grid-column-start:1;grid-row-end:3;grid-row-start:2;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar,.tox .tox-pop--resizing .tox-toolbar__group{flex-wrap:nowrap}.tox .tox-pop--transition{transition:.15s ease;transition-property:left,right,top,bottom}.tox .tox-pop--transition::after,.tox .tox-pop--transition::before{transition:all .15s,visibility 0s,opacity 75ms ease 75ms}.tox .tox-pop__dialog{background-color:#fff;border:1px solid #eee;border-radius:6px;box-shadow:0 0 2px 0 rgba(34,47,62,.2),0 4px 8px 0 rgba(34,47,62,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;opacity:1;position:absolute;width:0}.tox .tox-pop.tox-pop--inset::after,.tox .tox-pop.tox-pop--inset::before{opacity:0;transition:all 0s .15s,visibility 0s,opacity 75ms ease}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#fff transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#eee transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #fff transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #eee transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #fff transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #eee transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #fff;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #eee;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;min-height:0}.tox .tox-sidebar{background-color:#fff;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #eee;border-radius:6px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#006ce7;border:2px solid #0054b4;border-radius:6px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-form__controls-h-stack>.tox-slider:not(:first-of-type){margin-inline-start:8px}.tox .tox-form__controls-h-stack>.tox-form__group+.tox-slider{margin-inline-start:32px}.tox .tox-form__controls-h-stack>.tox-slider+.tox-form__group{margin-inline-start:32px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(34,47,62,.7);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#fff;border-top:1px solid #e3e3e3;color:rgba(34,47,62,.7);display:flex;flex:0 0 auto;font-size:14px;font-weight:400;height:25px;overflow:hidden;padding:0 8px;position:relative;text-transform:none}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:rgba(34,47,62,.7);text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){color:#222f3e;cursor:pointer}.tox .tox-statusbar__branding svg{fill:rgba(34,47,62,.8);height:1.14em;vertical-align:-.28em;width:3.6em}.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled=true]) svg,.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled=true]) svg{fill:#222f3e}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-bottom:3px;padding-left:1ch;padding-right:3px}.tox .tox-statusbar__resize-handle svg{display:block;fill:rgba(34,47,62,.5)}.tox .tox-statusbar__resize-handle:focus svg{background-color:#dee0e2;border-radius:1px 1px 5px 1px;box-shadow:0 0 0 2px #dee0e2}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:2ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(255,255,255,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:28px;justify-content:center;margin:6px 1px 5px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#222f3e}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#cce2fa;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#cce2fa;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:hover svg{fill:#222f3e}.tox .tox-tbtn:active{background:#a6ccf7;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:active svg{fill:#222f3e}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#a6ccf7;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#222f3e}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:42px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:56px;width:68px}.tox .tox-tbtn--return{align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:6px 1px 5px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--bespoke{background:#f7f7f7}.tox .tox-tbtn--bespoke+.tox-tbtn--bespoke{margin-inline-start:4px}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:6px 1px 5px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #cce2fa inset}.tox .tox-split-button:focus{background:#cce2fa;box-shadow:none;color:#222f3e}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(34,47,62,.5)}.tox.tox-platform-touch .tox-split-button .tox-tbtn--select{padding:0 0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-toolbar-overlord{background-color:#fff}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background-color:#fff;background-image:repeating-linear-gradient(#e3e3e3 0 1px,transparent 1px 39px);background-position:center top 40px;background-repeat:no-repeat;background-size:calc(100% - 11px * 2) calc(100% - 41px);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0;transform:perspective(1px)}.tox .tox-toolbar-overlord>.tox-toolbar,.tox .tox-toolbar-overlord>.tox-toolbar__overflow,.tox .tox-toolbar-overlord>.tox-toolbar__primary{background-position:center top 0;background-size:calc(100% - 11px * 2) calc(100% - 0px)}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord{border-top:1px solid transparent;margin-top:0;padding-bottom:1px;padding-top:1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child,.tox .tox-toolbar-overlord .tox-toolbar__primary{background-position:center top 39px}.tox .tox-editor-header>.tox-toolbar--scrolling,.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child{background-image:none}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#fff;background-position:center top 43px;background-size:calc(100% - 8px * 2) calc(100% - 51px);border:none;border-radius:6px;box-shadow:0 0 2px 0 rgba(34,47,62,.2),0 4px 8px 0 rgba(34,47,62,.15);padding:4px 0}.tox-pop .tox-pop__dialog .tox-toolbar{background-position:center top 43px;background-size:calc(100% - 11px * 2) calc(100% - 51px);padding:4px 0}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 11px 0 12px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid transparent}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid transparent}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#222f3e;border-radius:6px;box-shadow:0 2px 4px rgba(34,47,62,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #222f3e;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #222f3e;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #222f3e;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #222f3e;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #eee;border-radius:6px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #eee;border-radius:6px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1}
diff --git a/public/tinymce/skins/ui/oxide/skin.shadowdom.css b/public/tinymce/skins/ui/oxide/skin.shadowdom.css
new file mode 100644
index 00000000..25b0a371
--- /dev/null
+++ b/public/tinymce/skins/ui/oxide/skin.shadowdom.css
@@ -0,0 +1,30 @@
+body.tox-dialog__disable-scroll {
+ overflow: hidden;
+}
+.tox-fullscreen {
+ border: 0;
+ height: 100%;
+ margin: 0;
+ overflow: hidden;
+ overscroll-behavior: none;
+ padding: 0;
+ touch-action: pinch-zoom;
+ width: 100%;
+}
+.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {
+ display: none;
+}
+.tox.tox-tinymce.tox-fullscreen,
+.tox-shadowhost.tox-fullscreen {
+ left: 0;
+ position: fixed;
+ top: 0;
+ z-index: 1200;
+}
+.tox.tox-tinymce.tox-fullscreen {
+ background-color: transparent;
+}
+.tox-fullscreen .tox.tox-tinymce-aux,
+.tox-fullscreen ~ .tox.tox-tinymce-aux {
+ z-index: 1201;
+}
diff --git a/public/tinymce/skins/ui/oxide/skin.shadowdom.min.css b/public/tinymce/skins/ui/oxide/skin.shadowdom.min.css
new file mode 100644
index 00000000..8745951a
--- /dev/null
+++ b/public/tinymce/skins/ui/oxide/skin.shadowdom.min.css
@@ -0,0 +1 @@
+body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}
diff --git a/public/tinymce/skins/ui/tinymce-5-dark/content.css b/public/tinymce/skins/ui/tinymce-5-dark/content.css
new file mode 100644
index 00000000..0f1bce69
--- /dev/null
+++ b/public/tinymce/skins/ui/tinymce-5-dark/content.css
@@ -0,0 +1,711 @@
+.mce-content-body .mce-item-anchor {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+}
+.mce-content-body .mce-item-anchor:empty {
+ cursor: default;
+ display: inline-block;
+ height: 12px !important;
+ padding: 0 2px;
+ -webkit-user-modify: read-only;
+ -moz-user-modify: read-only;
+ -webkit-user-select: all;
+ -moz-user-select: all;
+ user-select: all;
+ width: 8px !important;
+}
+.mce-content-body .mce-item-anchor:not(:empty) {
+ background-position-x: 2px;
+ display: inline-block;
+ padding-left: 12px;
+}
+.mce-content-body .mce-item-anchor[data-mce-selected] {
+ outline-offset: 1px;
+}
+.tox-comments-visible .tox-comment {
+ background-color: #fff0b7;
+}
+.tox-comments-visible .tox-comment[data-mce-annotation-active="true"]:not([data-mce-selected="inline-boundary"]) {
+ background-color: #ffe168;
+}
+.tox-checklist > li:not(.tox-checklist--hidden) {
+ list-style: none;
+ margin: 0.25em 0;
+}
+.tox-checklist > li:not(.tox-checklist--hidden)::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+ cursor: pointer;
+ height: 1em;
+ margin-left: -1.5em;
+ margin-top: 0.125em;
+ position: absolute;
+ width: 1em;
+}
+.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+}
+[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {
+ margin-left: 0;
+ margin-right: -1.5em;
+}
+/* stylelint-disable */
+/* http://prismjs.com/ */
+/**
+ * Dracula Theme originally by Zeno Rocha [@zenorocha]
+ * https://draculatheme.com/
+ *
+ * Ported for PrismJS by Albert Vallverdu [@byverdu]
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ color: #f8f8f2;
+ background: none;
+ text-shadow: 0 1px rgba(0, 0, 0, 0.3);
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+ -moz-tab-size: 4;
+ tab-size: 4;
+ -webkit-hyphens: none;
+ hyphens: none;
+}
+/* Code blocks */
+pre[class*="language-"] {
+ padding: 1em;
+ margin: 0.5em 0;
+ overflow: auto;
+ border-radius: 0.3em;
+}
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+ background: #282a36;
+}
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+ padding: 0.1em;
+ border-radius: 0.3em;
+ white-space: normal;
+}
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: #6272a4;
+}
+.token.punctuation {
+ color: #f8f8f2;
+}
+.namespace {
+ opacity: 0.7;
+}
+.token.property,
+.token.tag,
+.token.constant,
+.token.symbol,
+.token.deleted {
+ color: #ff79c6;
+}
+.token.boolean,
+.token.number {
+ color: #bd93f9;
+}
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+ color: #50fa7b;
+}
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string,
+.token.variable {
+ color: #f8f8f2;
+}
+.token.atrule,
+.token.attr-value,
+.token.function,
+.token.class-name {
+ color: #f1fa8c;
+}
+.token.keyword {
+ color: #8be9fd;
+}
+.token.regex,
+.token.important {
+ color: #ffb86c;
+}
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+.token.italic {
+ font-style: italic;
+}
+.token.entity {
+ cursor: help;
+}
+/* stylelint-enable */
+.mce-content-body {
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+.mce-content-body .mce-visual-caret {
+ background-color: black;
+ background-color: currentColor;
+ position: absolute;
+}
+.mce-content-body .mce-visual-caret-hidden {
+ display: none;
+}
+.mce-content-body *[data-mce-caret] {
+ left: -1000px;
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ right: auto;
+ top: 0;
+}
+.mce-content-body .mce-offscreen-selection {
+ left: -2000000px;
+ max-width: 1000000px;
+ position: absolute;
+}
+.mce-content-body *[contentEditable=false] {
+ cursor: default;
+}
+.mce-content-body *[contentEditable=true] {
+ cursor: text;
+}
+.tox-cursor-format-painter {
+ cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default;
+}
+.mce-content-body figure.align-left {
+ float: left;
+}
+.mce-content-body figure.align-right {
+ float: right;
+}
+.mce-content-body figure.image.align-center {
+ display: table;
+ margin-left: auto;
+ margin-right: auto;
+}
+.mce-preview-object {
+ border: 1px solid gray;
+ display: inline-block;
+ line-height: 0;
+ margin: 0 2px 0 2px;
+ position: relative;
+}
+.mce-preview-object .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-preview-object[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.mce-object {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+ border: 1px dashed #aaa;
+}
+.mce-pagebreak {
+ border: 1px dashed #aaa;
+ cursor: default;
+ display: block;
+ height: 5px;
+ margin-top: 15px;
+ page-break-before: always;
+ width: 100%;
+}
+@media print {
+ .mce-pagebreak {
+ border: 0;
+ }
+}
+.tiny-pageembed .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tiny-pageembed[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.tiny-pageembed {
+ display: inline-block;
+ position: relative;
+}
+.tiny-pageembed--21by9,
+.tiny-pageembed--16by9,
+.tiny-pageembed--4by3,
+.tiny-pageembed--1by1 {
+ display: block;
+ overflow: hidden;
+ padding: 0;
+ position: relative;
+ width: 100%;
+}
+.tiny-pageembed--21by9 {
+ padding-top: 42.857143%;
+}
+.tiny-pageembed--16by9 {
+ padding-top: 56.25%;
+}
+.tiny-pageembed--4by3 {
+ padding-top: 75%;
+}
+.tiny-pageembed--1by1 {
+ padding-top: 100%;
+}
+.tiny-pageembed--21by9 iframe,
+.tiny-pageembed--16by9 iframe,
+.tiny-pageembed--4by3 iframe,
+.tiny-pageembed--1by1 iframe {
+ border: 0;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-content-body[data-mce-placeholder] {
+ position: relative;
+}
+.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ color: rgba(34, 47, 62, 0.7);
+ content: attr(data-mce-placeholder);
+ position: absolute;
+}
+.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ left: 1px;
+}
+.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {
+ right: 1px;
+}
+.mce-content-body div.mce-resizehandle {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+ z-index: 1298;
+}
+.mce-content-body div.mce-resizehandle:hover {
+ background-color: #4099ff;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(1) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(2) {
+ cursor: nesw-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(3) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(4) {
+ cursor: nesw-resize;
+}
+.mce-content-body .mce-resize-backdrop {
+ z-index: 10000;
+}
+.mce-content-body .mce-clonedresizable {
+ cursor: default;
+ opacity: 0.5;
+ outline: 1px dashed black;
+ position: absolute;
+ z-index: 10001;
+}
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns th,
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns td {
+ border: 0;
+}
+.mce-content-body .mce-resize-helper {
+ background: #555;
+ background: rgba(0, 0, 0, 0.75);
+ border: 1px;
+ border-radius: 3px;
+ color: white;
+ display: none;
+ font-family: sans-serif;
+ font-size: 12px;
+ line-height: 14px;
+ margin: 5px 10px;
+ padding: 5px;
+ position: absolute;
+ white-space: nowrap;
+ z-index: 10002;
+}
+.tox-rtc-user-selection {
+ position: relative;
+}
+.tox-rtc-user-cursor {
+ bottom: 0;
+ cursor: default;
+ position: absolute;
+ top: 0;
+ width: 2px;
+}
+.tox-rtc-user-cursor::before {
+ background-color: inherit;
+ border-radius: 50%;
+ content: '';
+ display: block;
+ height: 8px;
+ position: absolute;
+ right: -3px;
+ top: -3px;
+ width: 8px;
+}
+.tox-rtc-user-cursor:hover::after {
+ background-color: inherit;
+ border-radius: 100px;
+ box-sizing: border-box;
+ color: #fff;
+ content: attr(data-user);
+ display: block;
+ font-size: 12px;
+ font-weight: bold;
+ left: -5px;
+ min-height: 8px;
+ min-width: 8px;
+ padding: 0 12px;
+ position: absolute;
+ top: -11px;
+ white-space: nowrap;
+ z-index: 1000;
+}
+.tox-rtc-user-selection--1 .tox-rtc-user-cursor {
+ background-color: #2dc26b;
+}
+.tox-rtc-user-selection--2 .tox-rtc-user-cursor {
+ background-color: #e03e2d;
+}
+.tox-rtc-user-selection--3 .tox-rtc-user-cursor {
+ background-color: #f1c40f;
+}
+.tox-rtc-user-selection--4 .tox-rtc-user-cursor {
+ background-color: #3598db;
+}
+.tox-rtc-user-selection--5 .tox-rtc-user-cursor {
+ background-color: #b96ad9;
+}
+.tox-rtc-user-selection--6 .tox-rtc-user-cursor {
+ background-color: #e67e23;
+}
+.tox-rtc-user-selection--7 .tox-rtc-user-cursor {
+ background-color: #aaa69d;
+}
+.tox-rtc-user-selection--8 .tox-rtc-user-cursor {
+ background-color: #f368e0;
+}
+.tox-rtc-remote-image {
+ background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;
+ border: 1px solid #ccc;
+ min-height: 240px;
+ min-width: 320px;
+}
+.mce-match-marker {
+ background: #aaa;
+ color: #fff;
+}
+.mce-match-marker-selected {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::-moz-selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-content-body img[data-mce-selected],
+.mce-content-body video[data-mce-selected],
+.mce-content-body audio[data-mce-selected],
+.mce-content-body object[data-mce-selected],
+.mce-content-body embed[data-mce-selected],
+.mce-content-body table[data-mce-selected] {
+ outline: 3px solid #4099ff;
+}
+.mce-content-body hr[data-mce-selected] {
+ outline: 3px solid #4099ff;
+ outline-offset: 1px;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {
+ outline: 3px solid #4099ff;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {
+ outline: 3px solid #4099ff;
+}
+.mce-content-body *[contentEditable=false][data-mce-selected] {
+ cursor: not-allowed;
+ outline: 3px solid #4099ff;
+}
+.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,
+.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {
+ outline: none;
+}
+.mce-content-body *[data-mce-selected="inline-boundary"] {
+ background-color: #4099ff;
+}
+.mce-content-body .mce-edit-focus {
+ outline: 3px solid #4099ff;
+}
+.mce-content-body td[data-mce-selected],
+.mce-content-body th[data-mce-selected] {
+ position: relative;
+}
+.mce-content-body td[data-mce-selected]::-moz-selection,
+.mce-content-body th[data-mce-selected]::-moz-selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected]::selection,
+.mce-content-body th[data-mce-selected]::selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected] *,
+.mce-content-body th[data-mce-selected] * {
+ outline: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.mce-content-body td[data-mce-selected]::after,
+.mce-content-body th[data-mce-selected]::after {
+ background-color: rgba(180, 215, 255, 0.7);
+ border: 1px solid transparent;
+ bottom: -1px;
+ content: '';
+ left: -1px;
+ mix-blend-mode: lighten;
+ position: absolute;
+ right: -1px;
+ top: -1px;
+}
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+ .mce-content-body td[data-mce-selected]::after,
+ .mce-content-body th[data-mce-selected]::after {
+ border-color: rgba(0, 84, 180, 0.7);
+ }
+}
+.mce-content-body img::-moz-selection {
+ background: none;
+}
+.mce-content-body img::selection {
+ background: none;
+}
+.ephox-snooker-resizer-bar {
+ background-color: #4099ff;
+ opacity: 0;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.ephox-snooker-resizer-cols {
+ cursor: col-resize;
+}
+.ephox-snooker-resizer-rows {
+ cursor: row-resize;
+}
+.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {
+ opacity: 1;
+}
+.mce-spellchecker-word {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+ height: 2rem;
+}
+.mce-spellchecker-grammar {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+}
+.mce-toc {
+ border: 1px solid gray;
+}
+.mce-toc h2 {
+ margin: 4px;
+}
+.mce-toc li {
+ list-style-type: none;
+}
+table[style*="border-width: 0px"],
+.mce-item-table:not([border]),
+.mce-item-table[border="0"],
+table[style*="border-width: 0px"] td,
+.mce-item-table:not([border]) td,
+.mce-item-table[border="0"] td,
+table[style*="border-width: 0px"] th,
+.mce-item-table:not([border]) th,
+.mce-item-table[border="0"] th,
+table[style*="border-width: 0px"] caption,
+.mce-item-table:not([border]) caption,
+.mce-item-table[border="0"] caption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks p,
+.mce-visualblocks h1,
+.mce-visualblocks h2,
+.mce-visualblocks h3,
+.mce-visualblocks h4,
+.mce-visualblocks h5,
+.mce-visualblocks h6,
+.mce-visualblocks div:not([data-mce-bogus]),
+.mce-visualblocks section,
+.mce-visualblocks article,
+.mce-visualblocks blockquote,
+.mce-visualblocks address,
+.mce-visualblocks pre,
+.mce-visualblocks figure,
+.mce-visualblocks figcaption,
+.mce-visualblocks hgroup,
+.mce-visualblocks aside,
+.mce-visualblocks ul,
+.mce-visualblocks ol,
+.mce-visualblocks dl {
+ background-repeat: no-repeat;
+ border: 1px dashed #bbb;
+ margin-left: 3px;
+ padding-top: 10px;
+}
+.mce-visualblocks p {
+ background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
+}
+.mce-visualblocks h1 {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
+}
+.mce-visualblocks h2 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
+}
+.mce-visualblocks h3 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
+}
+.mce-visualblocks h4 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
+}
+.mce-visualblocks h5 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
+}
+.mce-visualblocks h6 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
+}
+.mce-visualblocks div:not([data-mce-bogus]) {
+ background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
+}
+.mce-visualblocks section {
+ background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
+}
+.mce-visualblocks article {
+ background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
+}
+.mce-visualblocks blockquote {
+ background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
+}
+.mce-visualblocks address {
+ background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
+}
+.mce-visualblocks pre {
+ background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
+}
+.mce-visualblocks figure {
+ background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
+}
+.mce-visualblocks figcaption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks hgroup {
+ background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
+}
+.mce-visualblocks aside {
+ background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
+}
+.mce-visualblocks ul {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
+}
+.mce-visualblocks ol {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
+}
+.mce-visualblocks dl {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
+}
+.mce-visualblocks:not([dir=rtl]) p,
+.mce-visualblocks:not([dir=rtl]) h1,
+.mce-visualblocks:not([dir=rtl]) h2,
+.mce-visualblocks:not([dir=rtl]) h3,
+.mce-visualblocks:not([dir=rtl]) h4,
+.mce-visualblocks:not([dir=rtl]) h5,
+.mce-visualblocks:not([dir=rtl]) h6,
+.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),
+.mce-visualblocks:not([dir=rtl]) section,
+.mce-visualblocks:not([dir=rtl]) article,
+.mce-visualblocks:not([dir=rtl]) blockquote,
+.mce-visualblocks:not([dir=rtl]) address,
+.mce-visualblocks:not([dir=rtl]) pre,
+.mce-visualblocks:not([dir=rtl]) figure,
+.mce-visualblocks:not([dir=rtl]) figcaption,
+.mce-visualblocks:not([dir=rtl]) hgroup,
+.mce-visualblocks:not([dir=rtl]) aside,
+.mce-visualblocks:not([dir=rtl]) ul,
+.mce-visualblocks:not([dir=rtl]) ol,
+.mce-visualblocks:not([dir=rtl]) dl {
+ margin-left: 3px;
+}
+.mce-visualblocks[dir=rtl] p,
+.mce-visualblocks[dir=rtl] h1,
+.mce-visualblocks[dir=rtl] h2,
+.mce-visualblocks[dir=rtl] h3,
+.mce-visualblocks[dir=rtl] h4,
+.mce-visualblocks[dir=rtl] h5,
+.mce-visualblocks[dir=rtl] h6,
+.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),
+.mce-visualblocks[dir=rtl] section,
+.mce-visualblocks[dir=rtl] article,
+.mce-visualblocks[dir=rtl] blockquote,
+.mce-visualblocks[dir=rtl] address,
+.mce-visualblocks[dir=rtl] pre,
+.mce-visualblocks[dir=rtl] figure,
+.mce-visualblocks[dir=rtl] figcaption,
+.mce-visualblocks[dir=rtl] hgroup,
+.mce-visualblocks[dir=rtl] aside,
+.mce-visualblocks[dir=rtl] ul,
+.mce-visualblocks[dir=rtl] ol,
+.mce-visualblocks[dir=rtl] dl {
+ background-position-x: right;
+ margin-right: 3px;
+}
+.mce-nbsp,
+.mce-shy {
+ background: #aaa;
+}
+.mce-shy::after {
+ content: '-';
+}
+body {
+ font-family: sans-serif;
+}
+table {
+ border-collapse: collapse;
+}
diff --git a/public/tinymce/skins/ui/tinymce-5-dark/content.inline.css b/public/tinymce/skins/ui/tinymce-5-dark/content.inline.css
new file mode 100644
index 00000000..040100bf
--- /dev/null
+++ b/public/tinymce/skins/ui/tinymce-5-dark/content.inline.css
@@ -0,0 +1,724 @@
+.mce-content-body .mce-item-anchor {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+}
+.mce-content-body .mce-item-anchor:empty {
+ cursor: default;
+ display: inline-block;
+ height: 12px !important;
+ padding: 0 2px;
+ -webkit-user-modify: read-only;
+ -moz-user-modify: read-only;
+ -webkit-user-select: all;
+ -moz-user-select: all;
+ user-select: all;
+ width: 8px !important;
+}
+.mce-content-body .mce-item-anchor:not(:empty) {
+ background-position-x: 2px;
+ display: inline-block;
+ padding-left: 12px;
+}
+.mce-content-body .mce-item-anchor[data-mce-selected] {
+ outline-offset: 1px;
+}
+.tox-comments-visible .tox-comment {
+ background-color: #fff0b7;
+}
+.tox-comments-visible .tox-comment[data-mce-annotation-active="true"]:not([data-mce-selected="inline-boundary"]) {
+ background-color: #ffe168;
+}
+.tox-checklist > li:not(.tox-checklist--hidden) {
+ list-style: none;
+ margin: 0.25em 0;
+}
+.tox-checklist > li:not(.tox-checklist--hidden)::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+ cursor: pointer;
+ height: 1em;
+ margin-left: -1.5em;
+ margin-top: 0.125em;
+ position: absolute;
+ width: 1em;
+}
+.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+}
+[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {
+ margin-left: 0;
+ margin-right: -1.5em;
+}
+/* stylelint-disable */
+/* http://prismjs.com/ */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ color: black;
+ background: none;
+ text-shadow: 0 1px white;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ font-size: 1em;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+ -moz-tab-size: 4;
+ tab-size: 4;
+ -webkit-hyphens: none;
+ hyphens: none;
+}
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+@media print {
+ code[class*="language-"],
+ pre[class*="language-"] {
+ text-shadow: none;
+ }
+}
+/* Code blocks */
+pre[class*="language-"] {
+ padding: 1em;
+ margin: 0.5em 0;
+ overflow: auto;
+}
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+ background: #f5f2f0;
+}
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+ padding: 0.1em;
+ border-radius: 0.3em;
+ white-space: normal;
+}
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: slategray;
+}
+.token.punctuation {
+ color: #999;
+}
+.token.namespace {
+ opacity: 0.7;
+}
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+ color: #905;
+}
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+ color: #690;
+}
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+ color: #9a6e3a;
+ /* This background color was intended by the author of this theme. */
+ background: hsla(0, 0%, 100%, 0.5);
+}
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+ color: #07a;
+}
+.token.function,
+.token.class-name {
+ color: #DD4A68;
+}
+.token.regex,
+.token.important,
+.token.variable {
+ color: #e90;
+}
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+.token.italic {
+ font-style: italic;
+}
+.token.entity {
+ cursor: help;
+}
+/* stylelint-enable */
+.mce-content-body {
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+.mce-content-body .mce-visual-caret {
+ background-color: black;
+ background-color: currentColor;
+ position: absolute;
+}
+.mce-content-body .mce-visual-caret-hidden {
+ display: none;
+}
+.mce-content-body *[data-mce-caret] {
+ left: -1000px;
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ right: auto;
+ top: 0;
+}
+.mce-content-body .mce-offscreen-selection {
+ left: -2000000px;
+ max-width: 1000000px;
+ position: absolute;
+}
+.mce-content-body *[contentEditable=false] {
+ cursor: default;
+}
+.mce-content-body *[contentEditable=true] {
+ cursor: text;
+}
+.tox-cursor-format-painter {
+ cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default;
+}
+.mce-content-body figure.align-left {
+ float: left;
+}
+.mce-content-body figure.align-right {
+ float: right;
+}
+.mce-content-body figure.image.align-center {
+ display: table;
+ margin-left: auto;
+ margin-right: auto;
+}
+.mce-preview-object {
+ border: 1px solid gray;
+ display: inline-block;
+ line-height: 0;
+ margin: 0 2px 0 2px;
+ position: relative;
+}
+.mce-preview-object .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-preview-object[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.mce-object {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+ border: 1px dashed #aaa;
+}
+.mce-pagebreak {
+ border: 1px dashed #aaa;
+ cursor: default;
+ display: block;
+ height: 5px;
+ margin-top: 15px;
+ page-break-before: always;
+ width: 100%;
+}
+@media print {
+ .mce-pagebreak {
+ border: 0;
+ }
+}
+.tiny-pageembed .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tiny-pageembed[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.tiny-pageembed {
+ display: inline-block;
+ position: relative;
+}
+.tiny-pageembed--21by9,
+.tiny-pageembed--16by9,
+.tiny-pageembed--4by3,
+.tiny-pageembed--1by1 {
+ display: block;
+ overflow: hidden;
+ padding: 0;
+ position: relative;
+ width: 100%;
+}
+.tiny-pageembed--21by9 {
+ padding-top: 42.857143%;
+}
+.tiny-pageembed--16by9 {
+ padding-top: 56.25%;
+}
+.tiny-pageembed--4by3 {
+ padding-top: 75%;
+}
+.tiny-pageembed--1by1 {
+ padding-top: 100%;
+}
+.tiny-pageembed--21by9 iframe,
+.tiny-pageembed--16by9 iframe,
+.tiny-pageembed--4by3 iframe,
+.tiny-pageembed--1by1 iframe {
+ border: 0;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-content-body[data-mce-placeholder] {
+ position: relative;
+}
+.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ color: rgba(34, 47, 62, 0.7);
+ content: attr(data-mce-placeholder);
+ position: absolute;
+}
+.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ left: 1px;
+}
+.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {
+ right: 1px;
+}
+.mce-content-body div.mce-resizehandle {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+ z-index: 1298;
+}
+.mce-content-body div.mce-resizehandle:hover {
+ background-color: #4099ff;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(1) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(2) {
+ cursor: nesw-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(3) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(4) {
+ cursor: nesw-resize;
+}
+.mce-content-body .mce-resize-backdrop {
+ z-index: 10000;
+}
+.mce-content-body .mce-clonedresizable {
+ cursor: default;
+ opacity: 0.5;
+ outline: 1px dashed black;
+ position: absolute;
+ z-index: 10001;
+}
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns th,
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns td {
+ border: 0;
+}
+.mce-content-body .mce-resize-helper {
+ background: #555;
+ background: rgba(0, 0, 0, 0.75);
+ border: 1px;
+ border-radius: 3px;
+ color: white;
+ display: none;
+ font-family: sans-serif;
+ font-size: 12px;
+ line-height: 14px;
+ margin: 5px 10px;
+ padding: 5px;
+ position: absolute;
+ white-space: nowrap;
+ z-index: 10002;
+}
+.tox-rtc-user-selection {
+ position: relative;
+}
+.tox-rtc-user-cursor {
+ bottom: 0;
+ cursor: default;
+ position: absolute;
+ top: 0;
+ width: 2px;
+}
+.tox-rtc-user-cursor::before {
+ background-color: inherit;
+ border-radius: 50%;
+ content: '';
+ display: block;
+ height: 8px;
+ position: absolute;
+ right: -3px;
+ top: -3px;
+ width: 8px;
+}
+.tox-rtc-user-cursor:hover::after {
+ background-color: inherit;
+ border-radius: 100px;
+ box-sizing: border-box;
+ color: #fff;
+ content: attr(data-user);
+ display: block;
+ font-size: 12px;
+ font-weight: bold;
+ left: -5px;
+ min-height: 8px;
+ min-width: 8px;
+ padding: 0 12px;
+ position: absolute;
+ top: -11px;
+ white-space: nowrap;
+ z-index: 1000;
+}
+.tox-rtc-user-selection--1 .tox-rtc-user-cursor {
+ background-color: #2dc26b;
+}
+.tox-rtc-user-selection--2 .tox-rtc-user-cursor {
+ background-color: #e03e2d;
+}
+.tox-rtc-user-selection--3 .tox-rtc-user-cursor {
+ background-color: #f1c40f;
+}
+.tox-rtc-user-selection--4 .tox-rtc-user-cursor {
+ background-color: #3598db;
+}
+.tox-rtc-user-selection--5 .tox-rtc-user-cursor {
+ background-color: #b96ad9;
+}
+.tox-rtc-user-selection--6 .tox-rtc-user-cursor {
+ background-color: #e67e23;
+}
+.tox-rtc-user-selection--7 .tox-rtc-user-cursor {
+ background-color: #aaa69d;
+}
+.tox-rtc-user-selection--8 .tox-rtc-user-cursor {
+ background-color: #f368e0;
+}
+.tox-rtc-remote-image {
+ background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;
+ border: 1px solid #ccc;
+ min-height: 240px;
+ min-width: 320px;
+}
+.mce-match-marker {
+ background: #aaa;
+ color: #fff;
+}
+.mce-match-marker-selected {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::-moz-selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-content-body img[data-mce-selected],
+.mce-content-body video[data-mce-selected],
+.mce-content-body audio[data-mce-selected],
+.mce-content-body object[data-mce-selected],
+.mce-content-body embed[data-mce-selected],
+.mce-content-body table[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body hr[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+ outline-offset: 1px;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false][data-mce-selected] {
+ cursor: not-allowed;
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,
+.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {
+ outline: none;
+}
+.mce-content-body *[data-mce-selected="inline-boundary"] {
+ background-color: #b4d7ff;
+}
+.mce-content-body .mce-edit-focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body td[data-mce-selected],
+.mce-content-body th[data-mce-selected] {
+ position: relative;
+}
+.mce-content-body td[data-mce-selected]::-moz-selection,
+.mce-content-body th[data-mce-selected]::-moz-selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected]::selection,
+.mce-content-body th[data-mce-selected]::selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected] *,
+.mce-content-body th[data-mce-selected] * {
+ outline: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.mce-content-body td[data-mce-selected]::after,
+.mce-content-body th[data-mce-selected]::after {
+ background-color: rgba(180, 215, 255, 0.7);
+ border: 1px solid rgba(180, 215, 255, 0.7);
+ bottom: -1px;
+ content: '';
+ left: -1px;
+ mix-blend-mode: multiply;
+ position: absolute;
+ right: -1px;
+ top: -1px;
+}
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+ .mce-content-body td[data-mce-selected]::after,
+ .mce-content-body th[data-mce-selected]::after {
+ border-color: rgba(0, 84, 180, 0.7);
+ }
+}
+.mce-content-body img::-moz-selection {
+ background: none;
+}
+.mce-content-body img::selection {
+ background: none;
+}
+.ephox-snooker-resizer-bar {
+ background-color: #b4d7ff;
+ opacity: 0;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.ephox-snooker-resizer-cols {
+ cursor: col-resize;
+}
+.ephox-snooker-resizer-rows {
+ cursor: row-resize;
+}
+.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {
+ opacity: 1;
+}
+.mce-spellchecker-word {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+ height: 2rem;
+}
+.mce-spellchecker-grammar {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+}
+.mce-toc {
+ border: 1px solid gray;
+}
+.mce-toc h2 {
+ margin: 4px;
+}
+.mce-toc li {
+ list-style-type: none;
+}
+table[style*="border-width: 0px"],
+.mce-item-table:not([border]),
+.mce-item-table[border="0"],
+table[style*="border-width: 0px"] td,
+.mce-item-table:not([border]) td,
+.mce-item-table[border="0"] td,
+table[style*="border-width: 0px"] th,
+.mce-item-table:not([border]) th,
+.mce-item-table[border="0"] th,
+table[style*="border-width: 0px"] caption,
+.mce-item-table:not([border]) caption,
+.mce-item-table[border="0"] caption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks p,
+.mce-visualblocks h1,
+.mce-visualblocks h2,
+.mce-visualblocks h3,
+.mce-visualblocks h4,
+.mce-visualblocks h5,
+.mce-visualblocks h6,
+.mce-visualblocks div:not([data-mce-bogus]),
+.mce-visualblocks section,
+.mce-visualblocks article,
+.mce-visualblocks blockquote,
+.mce-visualblocks address,
+.mce-visualblocks pre,
+.mce-visualblocks figure,
+.mce-visualblocks figcaption,
+.mce-visualblocks hgroup,
+.mce-visualblocks aside,
+.mce-visualblocks ul,
+.mce-visualblocks ol,
+.mce-visualblocks dl {
+ background-repeat: no-repeat;
+ border: 1px dashed #bbb;
+ margin-left: 3px;
+ padding-top: 10px;
+}
+.mce-visualblocks p {
+ background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
+}
+.mce-visualblocks h1 {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
+}
+.mce-visualblocks h2 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
+}
+.mce-visualblocks h3 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
+}
+.mce-visualblocks h4 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
+}
+.mce-visualblocks h5 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
+}
+.mce-visualblocks h6 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
+}
+.mce-visualblocks div:not([data-mce-bogus]) {
+ background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
+}
+.mce-visualblocks section {
+ background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
+}
+.mce-visualblocks article {
+ background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
+}
+.mce-visualblocks blockquote {
+ background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
+}
+.mce-visualblocks address {
+ background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
+}
+.mce-visualblocks pre {
+ background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
+}
+.mce-visualblocks figure {
+ background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
+}
+.mce-visualblocks figcaption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks hgroup {
+ background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
+}
+.mce-visualblocks aside {
+ background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
+}
+.mce-visualblocks ul {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
+}
+.mce-visualblocks ol {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
+}
+.mce-visualblocks dl {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
+}
+.mce-visualblocks:not([dir=rtl]) p,
+.mce-visualblocks:not([dir=rtl]) h1,
+.mce-visualblocks:not([dir=rtl]) h2,
+.mce-visualblocks:not([dir=rtl]) h3,
+.mce-visualblocks:not([dir=rtl]) h4,
+.mce-visualblocks:not([dir=rtl]) h5,
+.mce-visualblocks:not([dir=rtl]) h6,
+.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),
+.mce-visualblocks:not([dir=rtl]) section,
+.mce-visualblocks:not([dir=rtl]) article,
+.mce-visualblocks:not([dir=rtl]) blockquote,
+.mce-visualblocks:not([dir=rtl]) address,
+.mce-visualblocks:not([dir=rtl]) pre,
+.mce-visualblocks:not([dir=rtl]) figure,
+.mce-visualblocks:not([dir=rtl]) figcaption,
+.mce-visualblocks:not([dir=rtl]) hgroup,
+.mce-visualblocks:not([dir=rtl]) aside,
+.mce-visualblocks:not([dir=rtl]) ul,
+.mce-visualblocks:not([dir=rtl]) ol,
+.mce-visualblocks:not([dir=rtl]) dl {
+ margin-left: 3px;
+}
+.mce-visualblocks[dir=rtl] p,
+.mce-visualblocks[dir=rtl] h1,
+.mce-visualblocks[dir=rtl] h2,
+.mce-visualblocks[dir=rtl] h3,
+.mce-visualblocks[dir=rtl] h4,
+.mce-visualblocks[dir=rtl] h5,
+.mce-visualblocks[dir=rtl] h6,
+.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),
+.mce-visualblocks[dir=rtl] section,
+.mce-visualblocks[dir=rtl] article,
+.mce-visualblocks[dir=rtl] blockquote,
+.mce-visualblocks[dir=rtl] address,
+.mce-visualblocks[dir=rtl] pre,
+.mce-visualblocks[dir=rtl] figure,
+.mce-visualblocks[dir=rtl] figcaption,
+.mce-visualblocks[dir=rtl] hgroup,
+.mce-visualblocks[dir=rtl] aside,
+.mce-visualblocks[dir=rtl] ul,
+.mce-visualblocks[dir=rtl] ol,
+.mce-visualblocks[dir=rtl] dl {
+ background-position-x: right;
+ margin-right: 3px;
+}
+.mce-nbsp,
+.mce-shy {
+ background: #aaa;
+}
+.mce-shy::after {
+ content: '-';
+}
diff --git a/public/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css b/public/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css
new file mode 100644
index 00000000..d5f05d42
--- /dev/null
+++ b/public/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css
@@ -0,0 +1 @@
+.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center}.mce-content-body .mce-item-anchor:empty{cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor:not(:empty){background-position-x:2px;display:inline-block;padding-left:12px}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment[data-mce-annotation-active=true]:not([data-mce-selected=inline-boundary]){background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}
diff --git a/public/tinymce/skins/ui/tinymce-5-dark/content.min.css b/public/tinymce/skins/ui/tinymce-5-dark/content.min.css
new file mode 100644
index 00000000..a27d11b6
--- /dev/null
+++ b/public/tinymce/skins/ui/tinymce-5-dark/content.min.css
@@ -0,0 +1 @@
+.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center}.mce-content-body .mce-item-anchor:empty{cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor:not(:empty){background-position-x:2px;display:inline-block;padding-left:12px}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment[data-mce-annotation-active=true]:not([data-mce-selected=inline-boundary]){background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#282a36}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6272a4}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#ff79c6}.token.boolean,.token.number{color:#bd93f9}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#50fa7b}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#f1fa8c}.token.keyword{color:#8be9fd}.token.important,.token.regex{color:#ffb86c}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #4099ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #4099ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #4099ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #4099ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #4099ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#4099ff}.mce-content-body .mce-edit-focus{outline:3px solid #4099ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid transparent;bottom:-1px;content:'';left:-1px;mix-blend-mode:lighten;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#4099ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse}
diff --git a/public/tinymce/skins/ui/tinymce-5-dark/skin.css b/public/tinymce/skins/ui/tinymce-5-dark/skin.css
new file mode 100644
index 00000000..ce9511b8
--- /dev/null
+++ b/public/tinymce/skins/ui/tinymce-5-dark/skin.css
@@ -0,0 +1,3119 @@
+.tox {
+ box-shadow: none;
+ box-sizing: content-box;
+ color: #2A3746;
+ cursor: auto;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: normal;
+ -webkit-tap-highlight-color: transparent;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ vertical-align: initial;
+ white-space: normal;
+}
+.tox *:not(svg):not(rect) {
+ box-sizing: inherit;
+ color: inherit;
+ cursor: inherit;
+ direction: inherit;
+ font-family: inherit;
+ font-size: inherit;
+ font-style: inherit;
+ font-weight: inherit;
+ line-height: inherit;
+ -webkit-tap-highlight-color: inherit;
+ text-align: inherit;
+ text-decoration: inherit;
+ text-shadow: inherit;
+ text-transform: inherit;
+ vertical-align: inherit;
+ white-space: inherit;
+}
+.tox *:not(svg):not(rect) {
+ /* stylelint-disable-line no-duplicate-selectors */
+ background: transparent;
+ border: 0;
+ box-shadow: none;
+ float: none;
+ height: auto;
+ margin: 0;
+ max-width: none;
+ outline: 0;
+ padding: 0;
+ position: static;
+ width: auto;
+}
+.tox:not([dir=rtl]) {
+ direction: ltr;
+ text-align: left;
+}
+.tox[dir=rtl] {
+ direction: rtl;
+ text-align: right;
+}
+.tox-tinymce {
+ border: 1px solid #000000;
+ border-radius: 0;
+ box-shadow: none;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ overflow: hidden;
+ position: relative;
+ visibility: inherit !important;
+}
+.tox.tox-tinymce-inline {
+ border: none;
+ box-shadow: none;
+ overflow: initial;
+}
+.tox.tox-tinymce-inline .tox-editor-container {
+ overflow: initial;
+}
+.tox.tox-tinymce-inline .tox-editor-header {
+ background-color: #222f3e;
+ border: 1px solid #000000;
+ border-radius: 0;
+ box-shadow: none;
+ overflow: hidden;
+}
+.tox-tinymce-aux {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ z-index: 1300;
+}
+.tox-tinymce *:focus,
+.tox-tinymce-aux *:focus {
+ outline: none;
+}
+button::-moz-focus-inner {
+ border: 0;
+}
+.tox[dir=rtl] .tox-icon--flip svg {
+ transform: rotateY(180deg);
+}
+.tox .accessibility-issue__header {
+ align-items: center;
+ display: flex;
+ margin-bottom: 4px;
+}
+.tox .accessibility-issue__description {
+ align-items: stretch;
+ border: 1px solid #000000;
+ border-radius: 3px;
+ display: flex;
+ justify-content: space-between;
+}
+.tox .accessibility-issue__description > div {
+ padding-bottom: 4px;
+}
+.tox .accessibility-issue__description > div > div {
+ align-items: center;
+ display: flex;
+ margin-bottom: 4px;
+}
+.tox .accessibility-issue__description > *:last-child:not(:only-child) {
+ border-color: #000000;
+ border-style: solid;
+}
+.tox .accessibility-issue__repair {
+ margin-top: 16px;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description {
+ background-color: rgba(32, 122, 183, 0.5);
+ border-color: #207ab7;
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > *:last-child {
+ border-color: #207ab7;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg {
+ fill: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description {
+ background-color: rgba(255, 165, 0, 0.5);
+ border-color: rgba(255, 165, 0, 0.8);
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > *:last-child {
+ border-color: rgba(255, 165, 0, 0.8);
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg {
+ fill: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description {
+ background-color: rgba(204, 0, 0, 0.5);
+ border-color: rgba(204, 0, 0, 0.8);
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > *:last-child {
+ border-color: rgba(204, 0, 0, 0.8);
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg {
+ fill: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description {
+ background-color: rgba(120, 171, 70, 0.5);
+ border-color: rgba(120, 171, 70, 0.8);
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > *:last-child {
+ border-color: rgba(120, 171, 70, 0.8);
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg {
+ fill: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue__header h1,
+.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 {
+ margin-top: 0;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) {
+ margin-left: auto;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description {
+ padding: 4px 4px 4px 8px;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description > *:last-child {
+ border-left-width: 1px;
+ padding-left: 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) {
+ margin-right: auto;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description {
+ padding: 4px 8px 4px 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description > *:last-child {
+ border-right-width: 1px;
+ padding-right: 4px;
+}
+.tox .tox-anchorbar {
+ display: flex;
+ flex: 0 0 auto;
+}
+.tox .tox-bar {
+ display: flex;
+ flex: 0 0 auto;
+}
+.tox .tox-button {
+ background-color: #207ab7;
+ background-image: none;
+ background-position: 0 0;
+ background-repeat: repeat;
+ border-color: #207ab7;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #fff;
+ cursor: pointer;
+ display: inline-block;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ line-height: 24px;
+ margin: 0;
+ outline: none;
+ padding: 4px 16px;
+ text-align: center;
+ text-decoration: none;
+ text-transform: none;
+ white-space: nowrap;
+}
+.tox .tox-button[disabled] {
+ background-color: #207ab7;
+ background-image: none;
+ border-color: #207ab7;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-button:focus:not(:disabled) {
+ background-color: #1c6ca1;
+ background-image: none;
+ border-color: #1c6ca1;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button:hover:not(:disabled) {
+ background-color: #1c6ca1;
+ background-image: none;
+ border-color: #1c6ca1;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button:active:not(:disabled) {
+ background-color: #185d8c;
+ background-image: none;
+ border-color: #185d8c;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--secondary {
+ background-color: #3d546f;
+ background-image: none;
+ background-position: 0 0;
+ background-repeat: repeat;
+ border-color: #3d546f;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ color: #fff;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ outline: none;
+ padding: 4px 16px;
+ text-decoration: none;
+ text-transform: none;
+}
+.tox .tox-button--secondary[disabled] {
+ background-color: #3d546f;
+ background-image: none;
+ border-color: #3d546f;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-button--secondary:focus:not(:disabled) {
+ background-color: #34485f;
+ background-image: none;
+ border-color: #34485f;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--secondary:hover:not(:disabled) {
+ background-color: #34485f;
+ background-image: none;
+ border-color: #34485f;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--secondary:active:not(:disabled) {
+ background-color: #2b3b4e;
+ background-image: none;
+ border-color: #2b3b4e;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--icon,
+.tox .tox-button.tox-button--icon,
+.tox .tox-button.tox-button--secondary.tox-button--icon {
+ padding: 4px;
+}
+.tox .tox-button--icon .tox-icon svg,
+.tox .tox-button.tox-button--icon .tox-icon svg,
+.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg {
+ display: block;
+ fill: currentColor;
+}
+.tox .tox-button-link {
+ background: 0;
+ border: none;
+ box-sizing: border-box;
+ cursor: pointer;
+ display: inline-block;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ font-weight: normal;
+ line-height: 1.3;
+ margin: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.tox .tox-button-link--sm {
+ font-size: 14px;
+}
+.tox .tox-button--naked {
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: unset;
+ color: #fff;
+}
+.tox .tox-button--naked[disabled] {
+ background-color: #3d546f;
+ border-color: #3d546f;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-button--naked:hover:not(:disabled) {
+ background-color: #34485f;
+ border-color: #34485f;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--naked:focus:not(:disabled) {
+ background-color: #34485f;
+ border-color: #34485f;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--naked:active:not(:disabled) {
+ background-color: #2b3b4e;
+ border-color: #2b3b4e;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--naked .tox-icon svg {
+ fill: currentColor;
+}
+.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) {
+ color: #fff;
+}
+.tox .tox-checkbox {
+ align-items: center;
+ border-radius: 3px;
+ cursor: pointer;
+ display: flex;
+ height: 36px;
+ min-width: 36px;
+}
+.tox .tox-checkbox__input {
+ /* Hide from view but visible to screen readers */
+ height: 1px;
+ overflow: hidden;
+ position: absolute;
+ top: auto;
+ width: 1px;
+}
+.tox .tox-checkbox__icons {
+ align-items: center;
+ border-radius: 3px;
+ box-shadow: 0 0 0 2px transparent;
+ box-sizing: content-box;
+ display: flex;
+ height: 24px;
+ justify-content: center;
+ padding: calc(4px - 1px);
+ width: 24px;
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: block;
+ fill: rgba(255, 255, 255, 0.2);
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ display: none;
+ fill: #207ab7;
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ display: none;
+ fill: #207ab7;
+}
+.tox .tox-checkbox--disabled {
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: none;
+}
+.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ display: block;
+}
+.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: none;
+}
+.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ display: block;
+}
+.tox input.tox-checkbox__input:focus + .tox-checkbox__icons {
+ border-radius: 3px;
+ box-shadow: inset 0 0 0 1px #207ab7;
+ padding: calc(4px - 1px);
+}
+.tox:not([dir=rtl]) .tox-checkbox__label {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-checkbox__input {
+ left: -10000px;
+}
+.tox:not([dir=rtl]) .tox-bar .tox-checkbox {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-checkbox__label {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-checkbox__input {
+ right: -10000px;
+}
+.tox[dir=rtl] .tox-bar .tox-checkbox {
+ margin-right: 4px;
+}
+.tox {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox .tox-collection--toolbar .tox-collection__group {
+ display: flex;
+ padding: 0;
+}
+.tox .tox-collection--grid .tox-collection__group {
+ display: flex;
+ flex-wrap: wrap;
+ max-height: 208px;
+ overflow-x: hidden;
+ overflow-y: auto;
+ padding: 0;
+}
+.tox .tox-collection--list .tox-collection__group {
+ border-bottom-width: 0;
+ border-color: #1a1a1a;
+ border-left-width: 0;
+ border-right-width: 0;
+ border-style: solid;
+ border-top-width: 1px;
+ padding: 4px 0;
+}
+.tox .tox-collection--list .tox-collection__group:first-child {
+ border-top-width: 0;
+}
+.tox .tox-collection__group-heading {
+ background-color: #333333;
+ color: #fff;
+ cursor: default;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: normal;
+ margin-bottom: 4px;
+ margin-top: -4px;
+ padding: 4px 8px;
+ text-transform: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.tox .tox-collection__item {
+ align-items: center;
+ border-radius: 3px;
+ color: #fff;
+ display: flex;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.tox .tox-collection--list .tox-collection__item {
+ padding: 4px 8px;
+}
+.tox .tox-collection--toolbar .tox-collection__item {
+ border-radius: 3px;
+ padding: 4px;
+}
+.tox .tox-collection--grid .tox-collection__item {
+ border-radius: 3px;
+ padding: 4px;
+}
+.tox .tox-collection--list .tox-collection__item--enabled {
+ background-color: #2b3b4e;
+ color: #fff;
+}
+.tox .tox-collection--list .tox-collection__item--active {
+ background-color: #4a5562;
+}
+.tox .tox-collection--toolbar .tox-collection__item--enabled {
+ background-color: #757d87;
+ color: #fff;
+}
+.tox .tox-collection--toolbar .tox-collection__item--active {
+ background-color: #4a5562;
+}
+.tox .tox-collection--grid .tox-collection__item--enabled {
+ background-color: #757d87;
+ color: #fff;
+}
+.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ background-color: #4a5562;
+ color: #fff;
+}
+.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ color: #fff;
+}
+.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ color: #fff;
+}
+.tox .tox-collection__item-icon,
+.tox .tox-collection__item-checkmark {
+ align-items: center;
+ display: flex;
+ height: 24px;
+ justify-content: center;
+ width: 24px;
+}
+.tox .tox-collection__item-icon svg,
+.tox .tox-collection__item-checkmark svg {
+ fill: currentColor;
+}
+.tox .tox-collection--toolbar-lg .tox-collection__item-icon {
+ height: 48px;
+ width: 48px;
+}
+.tox .tox-collection__item-label {
+ color: currentColor;
+ display: inline-block;
+ flex: 1;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 24px;
+ text-transform: none;
+ word-break: break-all;
+}
+.tox .tox-collection__item-accessory {
+ color: rgba(255, 255, 255, 0.5);
+ display: inline-block;
+ font-size: 14px;
+ height: 24px;
+ line-height: 24px;
+ text-transform: none;
+}
+.tox .tox-collection__item-caret {
+ align-items: center;
+ display: flex;
+ min-height: 24px;
+}
+.tox .tox-collection__item-caret::after {
+ content: '';
+ font-size: 0;
+ min-height: inherit;
+}
+.tox .tox-collection__item-caret svg {
+ fill: #fff;
+}
+.tox .tox-collection__item--state-disabled {
+ background-color: transparent;
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg {
+ display: none;
+}
+.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory + .tox-collection__item-checkmark {
+ display: none;
+}
+.tox .tox-collection--horizontal {
+ background-color: #2b3b4e;
+ border: 1px solid #1a1a1a;
+ border-radius: 3px;
+ box-shadow: 0 0 2px 0 rgba(42, 55, 70, 0.2), 0 4px 8px 0 rgba(42, 55, 70, 0.15);
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: nowrap;
+ margin-bottom: 0;
+ overflow-x: auto;
+ padding: 0;
+}
+.tox .tox-collection--horizontal .tox-collection__group {
+ align-items: center;
+ display: flex;
+ flex-wrap: nowrap;
+ margin: 0;
+ padding: 0 4px;
+}
+.tox .tox-collection--horizontal .tox-collection__item {
+ height: 34px;
+ margin: 3px 0 2px 0;
+ padding: 0 4px;
+}
+.tox .tox-collection--horizontal .tox-collection__item-label {
+ white-space: nowrap;
+}
+.tox .tox-collection--horizontal .tox-collection__item-caret {
+ margin-left: 4px;
+}
+.tox .tox-collection__item-container {
+ display: flex;
+}
+.tox .tox-collection__item-container--row {
+ align-items: center;
+ flex: 1 1 auto;
+ flex-direction: row;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--align-left {
+ margin-right: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--align-right {
+ justify-content: flex-end;
+ margin-left: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top {
+ align-items: flex-start;
+ margin-bottom: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle {
+ align-items: center;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom {
+ align-items: flex-end;
+ margin-top: auto;
+}
+.tox .tox-collection__item-container--column {
+ align-self: center;
+ flex: 1 1 auto;
+ flex-direction: column;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--align-left {
+ align-items: flex-start;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--align-right {
+ align-items: flex-end;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top {
+ align-self: flex-start;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle {
+ align-self: center;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom {
+ align-self: flex-end;
+}
+.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) {
+ border-right: 1px solid #000000;
+}
+.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > *:not(:first-child) {
+ margin-left: 8px;
+}
+.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-collection__item-accessory {
+ margin-left: 16px;
+ text-align: right;
+}
+.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret {
+ margin-left: 16px;
+}
+.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) {
+ border-left: 1px solid #000000;
+}
+.tox[dir=rtl] .tox-collection--list .tox-collection__item > *:not(:first-child) {
+ margin-right: 8px;
+}
+.tox[dir=rtl] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-collection__item-accessory {
+ margin-right: 16px;
+ text-align: left;
+}
+.tox[dir=rtl] .tox-collection .tox-collection__item-caret {
+ margin-right: 16px;
+ transform: rotateY(180deg);
+}
+.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret {
+ margin-right: 4px;
+}
+.tox .tox-color-picker-container {
+ display: flex;
+ flex-direction: row;
+ height: 225px;
+ margin: 0;
+}
+.tox .tox-sv-palette {
+ box-sizing: border-box;
+ display: flex;
+ height: 100%;
+}
+.tox .tox-sv-palette-spectrum {
+ height: 100%;
+}
+.tox .tox-sv-palette,
+.tox .tox-sv-palette-spectrum {
+ width: 225px;
+}
+.tox .tox-sv-palette-thumb {
+ background: none;
+ border: 1px solid black;
+ border-radius: 50%;
+ box-sizing: content-box;
+ height: 12px;
+ position: absolute;
+ width: 12px;
+}
+.tox .tox-sv-palette-inner-thumb {
+ border: 1px solid white;
+ border-radius: 50%;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+}
+.tox .tox-hue-slider {
+ box-sizing: border-box;
+ height: 100%;
+ width: 25px;
+}
+.tox .tox-hue-slider-spectrum {
+ background: linear-gradient(to bottom, #f00, #ff0080, #f0f, #8000ff, #00f, #0080ff, #0ff, #00ff80, #0f0, #80ff00, #ff0, #ff8000, #f00);
+ height: 100%;
+ width: 100%;
+}
+.tox .tox-hue-slider,
+.tox .tox-hue-slider-spectrum {
+ width: 20px;
+}
+.tox .tox-hue-slider-thumb {
+ background: white;
+ border: 1px solid black;
+ box-sizing: content-box;
+ height: 4px;
+ width: 100%;
+}
+.tox .tox-rgb-form {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+}
+.tox .tox-rgb-form div {
+ align-items: center;
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 5px;
+ width: inherit;
+}
+.tox .tox-rgb-form input {
+ width: 6em;
+}
+.tox .tox-rgb-form input.tox-invalid {
+ /* Need !important to override Chrome's focus styling unfortunately */
+ border: 1px solid red !important;
+}
+.tox .tox-rgb-form .tox-rgba-preview {
+ border: 1px solid black;
+ flex-grow: 2;
+ margin-bottom: 0;
+}
+.tox:not([dir=rtl]) .tox-sv-palette {
+ margin-right: 15px;
+}
+.tox:not([dir=rtl]) .tox-hue-slider {
+ margin-right: 15px;
+}
+.tox:not([dir=rtl]) .tox-hue-slider-thumb {
+ margin-left: -1px;
+}
+.tox:not([dir=rtl]) .tox-rgb-form label {
+ margin-right: 0.5em;
+}
+.tox[dir=rtl] .tox-sv-palette {
+ margin-left: 15px;
+}
+.tox[dir=rtl] .tox-hue-slider {
+ margin-left: 15px;
+}
+.tox[dir=rtl] .tox-hue-slider-thumb {
+ margin-right: -1px;
+}
+.tox[dir=rtl] .tox-rgb-form label {
+ margin-left: 0.5em;
+}
+.tox .tox-toolbar .tox-swatches,
+.tox .tox-toolbar__primary .tox-swatches,
+.tox .tox-toolbar__overflow .tox-swatches {
+ margin: 2px 0 3px 4px;
+}
+.tox .tox-collection--list .tox-collection__group .tox-swatches-menu {
+ border: 0;
+ margin: -4px 0;
+}
+.tox .tox-swatches__row {
+ display: flex;
+}
+.tox .tox-swatch {
+ height: 30px;
+ transition: transform 0.15s, box-shadow 0.15s;
+ width: 30px;
+}
+.tox .tox-swatch:hover,
+.tox .tox-swatch:focus {
+ box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset;
+ transform: scale(0.8);
+}
+.tox .tox-swatch--remove {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+}
+.tox .tox-swatch--remove svg path {
+ stroke: #e74c3c;
+}
+.tox .tox-swatches__picker-btn {
+ align-items: center;
+ background-color: transparent;
+ border: 0;
+ cursor: pointer;
+ display: flex;
+ height: 30px;
+ justify-content: center;
+ outline: none;
+ padding: 0;
+ width: 30px;
+}
+.tox .tox-swatches__picker-btn svg {
+ fill: #fff;
+ height: 24px;
+ width: 24px;
+}
+.tox .tox-swatches__picker-btn:hover {
+ background: #4a5562;
+}
+.tox:not([dir=rtl]) .tox-swatches__picker-btn {
+ margin-left: auto;
+}
+.tox[dir=rtl] .tox-swatches__picker-btn {
+ margin-right: auto;
+}
+.tox .tox-comment-thread {
+ background: #2b3b4e;
+ position: relative;
+}
+.tox .tox-comment-thread > *:not(:first-child) {
+ margin-top: 8px;
+}
+.tox .tox-comment {
+ background: #2b3b4e;
+ border: 1px solid #000000;
+ border-radius: 3px;
+ box-shadow: 0 4px 8px 0 rgba(42, 55, 70, 0.1);
+ padding: 8px 8px 16px 8px;
+ position: relative;
+}
+.tox .tox-comment__header {
+ align-items: center;
+ color: #fff;
+ display: flex;
+ justify-content: space-between;
+}
+.tox .tox-comment__date {
+ color: rgba(255, 255, 255, 0.5);
+ font-size: 12px;
+}
+.tox .tox-comment__body {
+ color: #fff;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ margin-top: 8px;
+ position: relative;
+ text-transform: initial;
+}
+.tox .tox-comment__body textarea {
+ resize: none;
+ white-space: normal;
+ width: 100%;
+}
+.tox .tox-comment__expander {
+ padding-top: 8px;
+}
+.tox .tox-comment__expander p {
+ color: rgba(255, 255, 255, 0.5);
+ font-size: 14px;
+ font-style: normal;
+}
+.tox .tox-comment__body p {
+ margin: 0;
+}
+.tox .tox-comment__buttonspacing {
+ padding-top: 16px;
+ text-align: center;
+}
+.tox .tox-comment-thread__overlay::after {
+ background: #2b3b4e;
+ bottom: 0;
+ content: "";
+ display: flex;
+ left: 0;
+ opacity: 0.9;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 5;
+}
+.tox .tox-comment__reply {
+ display: flex;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ margin-top: 8px;
+}
+.tox .tox-comment__reply > *:first-child {
+ margin-bottom: 8px;
+ width: 100%;
+}
+.tox .tox-comment__edit {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ margin-top: 16px;
+}
+.tox .tox-comment__gradient::after {
+ background: linear-gradient(rgba(43, 59, 78, 0), #2b3b4e);
+ bottom: 0;
+ content: "";
+ display: block;
+ height: 5em;
+ margin-top: -40px;
+ position: absolute;
+ width: 100%;
+}
+.tox .tox-comment__overlay {
+ background: #2b3b4e;
+ bottom: 0;
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ left: 0;
+ opacity: 0.9;
+ position: absolute;
+ right: 0;
+ text-align: center;
+ top: 0;
+ z-index: 5;
+}
+.tox .tox-comment__loading-text {
+ align-items: center;
+ color: #fff;
+ display: flex;
+ flex-direction: column;
+ position: relative;
+}
+.tox .tox-comment__loading-text > div {
+ padding-bottom: 16px;
+}
+.tox .tox-comment__overlaytext {
+ bottom: 0;
+ flex-direction: column;
+ font-size: 14px;
+ left: 0;
+ padding: 1em;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 10;
+}
+.tox .tox-comment__overlaytext p {
+ background-color: #2b3b4e;
+ box-shadow: 0 0 8px 8px #2b3b4e;
+ color: #fff;
+ text-align: center;
+}
+.tox .tox-comment__overlaytext div:nth-of-type(2) {
+ font-size: 0.8em;
+}
+.tox .tox-comment__busy-spinner {
+ align-items: center;
+ background-color: #2b3b4e;
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 20;
+}
+.tox .tox-comment__scroll {
+ display: flex;
+ flex-direction: column;
+ flex-shrink: 1;
+ overflow: auto;
+}
+.tox .tox-conversations {
+ margin: 8px;
+}
+.tox:not([dir=rtl]) .tox-comment__edit {
+ margin-left: 8px;
+}
+.tox:not([dir=rtl]) .tox-comment__buttonspacing > *:last-child,
+.tox:not([dir=rtl]) .tox-comment__edit > *:last-child,
+.tox:not([dir=rtl]) .tox-comment__reply > *:last-child {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-comment__edit {
+ margin-right: 8px;
+}
+.tox[dir=rtl] .tox-comment__buttonspacing > *:last-child,
+.tox[dir=rtl] .tox-comment__edit > *:last-child,
+.tox[dir=rtl] .tox-comment__reply > *:last-child {
+ margin-right: 8px;
+}
+.tox .tox-user {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-user__avatar svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-user__name {
+ color: rgba(255, 255, 255, 0.5);
+ font-size: 12px;
+ font-style: normal;
+ font-weight: bold;
+ text-transform: uppercase;
+}
+.tox:not([dir=rtl]) .tox-user__avatar svg {
+ margin-right: 8px;
+}
+.tox:not([dir=rtl]) .tox-user__avatar + .tox-user__name {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-user__avatar svg {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-user__avatar + .tox-user__name {
+ margin-right: 8px;
+}
+.tox .tox-dialog-wrap {
+ align-items: center;
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: fixed;
+ right: 0;
+ top: 0;
+ z-index: 1100;
+}
+.tox .tox-dialog-wrap__backdrop {
+ background-color: rgba(34, 47, 62, 0.75);
+ bottom: 0;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 1;
+}
+.tox .tox-dialog-wrap__backdrop--opaque {
+ background-color: #222f3e;
+}
+.tox .tox-dialog {
+ background-color: #2b3b4e;
+ border-color: #000000;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: 0 16px 16px -10px rgba(42, 55, 70, 0.15), 0 0 40px 1px rgba(42, 55, 70, 0.15);
+ display: flex;
+ flex-direction: column;
+ max-height: 100%;
+ max-width: 480px;
+ overflow: hidden;
+ position: relative;
+ width: 95vw;
+ z-index: 2;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog {
+ align-self: flex-start;
+ margin: 8px auto;
+ width: calc(100vw - 16px);
+ }
+}
+.tox .tox-dialog-inline {
+ z-index: 1100;
+}
+.tox .tox-dialog__header {
+ align-items: center;
+ background-color: #2b3b4e;
+ border-bottom: none;
+ color: #fff;
+ display: flex;
+ font-size: 16px;
+ justify-content: space-between;
+ padding: 8px 16px 0 16px;
+ position: relative;
+}
+.tox .tox-dialog__header .tox-button {
+ z-index: 1;
+}
+.tox .tox-dialog__draghandle {
+ cursor: grab;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tox .tox-dialog__draghandle:active {
+ cursor: grabbing;
+}
+.tox .tox-dialog__dismiss {
+ margin-left: auto;
+}
+.tox .tox-dialog__title {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 20px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ margin: 0;
+ text-transform: none;
+}
+.tox .tox-dialog__body {
+ color: #fff;
+ display: flex;
+ flex: 1;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ min-width: 0;
+ text-align: left;
+ text-transform: none;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog__body {
+ flex-direction: column;
+ }
+}
+.tox .tox-dialog__body-nav {
+ align-items: flex-start;
+ display: flex;
+ flex-direction: column;
+ padding: 16px 16px;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog__body-nav {
+ flex-direction: row;
+ -webkit-overflow-scrolling: touch;
+ overflow-x: auto;
+ padding-bottom: 0;
+ }
+}
+.tox .tox-dialog__body-nav-item {
+ border-bottom: 2px solid transparent;
+ color: rgba(255, 255, 255, 0.5);
+ display: inline-block;
+ font-size: 14px;
+ line-height: 1.3;
+ margin-bottom: 8px;
+ text-decoration: none;
+ white-space: nowrap;
+}
+.tox .tox-dialog__body-nav-item:focus {
+ background-color: rgba(32, 122, 183, 0.1);
+}
+.tox .tox-dialog__body-nav-item--active {
+ border-bottom: 2px solid #207ab7;
+ color: #207ab7;
+}
+.tox .tox-dialog__body-content {
+ box-sizing: border-box;
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ max-height: 650px;
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+ padding: 16px 16px;
+}
+.tox .tox-dialog__body-content > * {
+ margin-bottom: 0;
+ margin-top: 16px;
+}
+.tox .tox-dialog__body-content > *:first-child {
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content > *:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-dialog__body-content > *:only-child {
+ margin-bottom: 0;
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content a {
+ color: #207ab7;
+ cursor: pointer;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content a:hover,
+.tox .tox-dialog__body-content a:focus {
+ color: #185d8c;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content a:active {
+ color: #185d8c;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content svg {
+ fill: #fff;
+}
+.tox .tox-dialog__body-content ul {
+ display: block;
+ list-style-type: disc;
+ margin-bottom: 16px;
+ margin-inline-end: 0;
+ margin-inline-start: 0;
+ padding-inline-start: 2.5rem;
+}
+.tox .tox-dialog__body-content .tox-form__group h1 {
+ color: #fff;
+ font-size: 20px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ margin-bottom: 16px;
+ margin-top: 2rem;
+ text-transform: none;
+}
+.tox .tox-dialog__body-content .tox-form__group h2 {
+ color: #fff;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ margin-bottom: 16px;
+ margin-top: 2rem;
+ text-transform: none;
+}
+.tox .tox-dialog__body-content .tox-form__group p {
+ margin-bottom: 16px;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:first-child,
+.tox .tox-dialog__body-content .tox-form__group h2:first-child,
+.tox .tox-dialog__body-content .tox-form__group p:first-child {
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:last-child,
+.tox .tox-dialog__body-content .tox-form__group h2:last-child,
+.tox .tox-dialog__body-content .tox-form__group p:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:only-child,
+.tox .tox-dialog__body-content .tox-form__group h2:only-child,
+.tox .tox-dialog__body-content .tox-form__group p:only-child {
+ margin-bottom: 0;
+ margin-top: 0;
+}
+.tox .tox-dialog--width-lg {
+ height: 650px;
+ max-width: 1200px;
+}
+.tox .tox-dialog--width-md {
+ max-width: 800px;
+}
+.tox .tox-dialog--width-md .tox-dialog__body-content {
+ overflow: auto;
+}
+.tox .tox-dialog__body-content--centered {
+ text-align: center;
+}
+.tox .tox-dialog__footer {
+ align-items: center;
+ background-color: #2b3b4e;
+ border-top: 1px solid #000000;
+ display: flex;
+ justify-content: space-between;
+ padding: 8px 16px;
+}
+.tox .tox-dialog__footer-start,
+.tox .tox-dialog__footer-end {
+ display: flex;
+}
+.tox .tox-dialog__busy-spinner {
+ align-items: center;
+ background-color: rgba(34, 47, 62, 0.75);
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 3;
+}
+.tox .tox-dialog__table {
+ border-collapse: collapse;
+ width: 100%;
+}
+.tox .tox-dialog__table thead th {
+ font-weight: bold;
+ padding-bottom: 8px;
+}
+.tox .tox-dialog__table tbody tr {
+ border-bottom: 1px solid #000000;
+}
+.tox .tox-dialog__table tbody tr:last-child {
+ border-bottom: none;
+}
+.tox .tox-dialog__table td {
+ padding-bottom: 8px;
+ padding-top: 8px;
+}
+.tox .tox-dialog__popups {
+ position: absolute;
+ width: 100%;
+ z-index: 1100;
+}
+.tox .tox-dialog__body-iframe {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+}
+.tox .tox-dialog__body-iframe .tox-navobj {
+ display: flex;
+ flex: 1;
+}
+.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) {
+ flex: 1;
+ height: 100%;
+}
+.tox .tox-dialog-dock-fadeout {
+ opacity: 0;
+ visibility: hidden;
+}
+.tox .tox-dialog-dock-fadein {
+ opacity: 1;
+ visibility: visible;
+}
+.tox .tox-dialog-dock-transition {
+ transition: visibility 0s linear 0.3s, opacity 0.3s ease;
+}
+.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein {
+ transition-delay: 0s;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav {
+ margin-right: 0;
+ }
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child) {
+ margin-left: 8px;
+ }
+}
+.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start > *,
+.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end > * {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-dialog__body {
+ text-align: right;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav {
+ margin-left: 0;
+ }
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child) {
+ margin-right: 8px;
+ }
+}
+.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start > *,
+.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end > * {
+ margin-right: 8px;
+}
+body.tox-dialog__disable-scroll {
+ overflow: hidden;
+}
+.tox .tox-dropzone-container {
+ display: flex;
+ flex: 1;
+}
+.tox .tox-dropzone {
+ align-items: center;
+ background: #fff;
+ border: 2px dashed #000000;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ justify-content: center;
+ min-height: 100px;
+ padding: 10px;
+}
+.tox .tox-dropzone p {
+ color: rgba(255, 255, 255, 0.5);
+ margin: 0 0 16px 0;
+}
+.tox .tox-edit-area {
+ display: flex;
+ flex: 1;
+ overflow: hidden;
+ position: relative;
+}
+.tox .tox-edit-area__iframe {
+ background-color: #fff;
+ border: 0;
+ box-sizing: border-box;
+ flex: 1;
+ height: 100%;
+ position: absolute;
+ width: 100%;
+}
+.tox.tox-inline-edit-area {
+ border: 1px dotted #000000;
+}
+.tox .tox-editor-container {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ overflow: hidden;
+}
+.tox .tox-editor-header {
+ z-index: 1;
+}
+.tox:not(.tox-tinymce-inline) .tox-editor-header {
+ background-color: #222f3e;
+ border-bottom: none;
+ box-shadow: none;
+ padding: 4px 0;
+ transition: box-shadow 0.5s;
+}
+.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header {
+ border-top: 1px solid #000000;
+ box-shadow: none;
+}
+.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header {
+ background-color: #222f3e;
+ box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25);
+ padding: 4px 0;
+}
+.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header {
+ box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25);
+}
+.tox-editor-dock-fadeout {
+ opacity: 0;
+ visibility: hidden;
+}
+.tox-editor-dock-fadein {
+ opacity: 1;
+ visibility: visible;
+}
+.tox-editor-dock-transition {
+ transition: visibility 0s linear 0.25s, opacity 0.25s ease;
+}
+.tox-editor-dock-transition.tox-editor-dock-fadein {
+ transition-delay: 0s;
+}
+.tox .tox-control-wrap {
+ flex: 1;
+ position: relative;
+}
+.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,
+.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,
+.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid {
+ display: none;
+}
+.tox .tox-control-wrap svg {
+ display: block;
+}
+.tox .tox-control-wrap__status-icon-wrap {
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-control-wrap__status-icon-invalid svg {
+ fill: #c00;
+}
+.tox .tox-control-wrap__status-icon-unknown svg {
+ fill: orange;
+}
+.tox .tox-control-wrap__status-icon-valid svg {
+ fill: green;
+}
+.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,
+.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,
+.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield {
+ padding-right: 32px;
+}
+.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap {
+ right: 4px;
+}
+.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,
+.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,
+.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield {
+ padding-left: 32px;
+}
+.tox[dir=rtl] .tox-control-wrap__status-icon-wrap {
+ left: 4px;
+}
+.tox .tox-autocompleter {
+ max-width: 25em;
+}
+.tox .tox-autocompleter .tox-menu {
+ border-color: #000000;
+ box-shadow: none;
+ max-width: 25em;
+}
+.tox .tox-autocompleter .tox-autocompleter-highlight {
+ font-weight: bold;
+}
+.tox .tox-color-input {
+ display: flex;
+ position: relative;
+ z-index: 1;
+}
+.tox .tox-color-input .tox-textfield {
+ z-index: -1;
+}
+.tox .tox-color-input span {
+ border-color: rgba(42, 55, 70, 0.2);
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ height: 24px;
+ position: absolute;
+ top: 6px;
+ width: 24px;
+}
+.tox .tox-color-input span:hover:not([aria-disabled=true]),
+.tox .tox-color-input span:focus:not([aria-disabled=true]) {
+ border-color: #207ab7;
+ cursor: pointer;
+}
+.tox .tox-color-input span::before {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.25) 25%, transparent 25%), linear-gradient(-45deg, rgba(255, 255, 255, 0.25) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, rgba(255, 255, 255, 0.25) 75%), linear-gradient(-45deg, transparent 75%, rgba(255, 255, 255, 0.25) 75%);
+ background-position: 0 0, 0 6px, 6px -6px, -6px 0;
+ background-size: 12px 12px;
+ border: 1px solid #2b3b4e;
+ border-radius: 3px;
+ box-sizing: border-box;
+ content: '';
+ height: 24px;
+ left: -1px;
+ position: absolute;
+ top: -1px;
+ width: 24px;
+ z-index: -1;
+}
+.tox .tox-color-input span[aria-disabled=true] {
+ cursor: not-allowed;
+}
+.tox:not([dir=rtl]) .tox-color-input {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox:not([dir=rtl]) .tox-color-input .tox-textfield {
+ padding-left: 36px;
+}
+.tox:not([dir=rtl]) .tox-color-input span {
+ left: 6px;
+}
+.tox[dir="rtl"] .tox-color-input {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox[dir="rtl"] .tox-color-input .tox-textfield {
+ padding-right: 36px;
+}
+.tox[dir="rtl"] .tox-color-input span {
+ right: 6px;
+}
+.tox .tox-label,
+.tox .tox-toolbar-label {
+ color: rgba(255, 255, 255, 0.5);
+ display: block;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ padding: 0 8px 0 0;
+ text-transform: none;
+ white-space: nowrap;
+}
+.tox .tox-toolbar-label {
+ padding: 0 8px;
+}
+.tox[dir=rtl] .tox-label {
+ padding: 0 0 0 8px;
+}
+.tox .tox-form {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+}
+.tox .tox-form__group {
+ box-sizing: border-box;
+ margin-bottom: 4px;
+}
+.tox .tox-form-group--maximize {
+ flex: 1;
+}
+.tox .tox-form__group--error {
+ color: #c00;
+}
+.tox .tox-form__group--collection {
+ display: flex;
+}
+.tox .tox-form__grid {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: space-between;
+}
+.tox .tox-form__grid--2col > .tox-form__group {
+ width: calc(50% - (8px / 2));
+}
+.tox .tox-form__grid--3col > .tox-form__group {
+ width: calc(100% / 3 - (8px / 2));
+}
+.tox .tox-form__grid--4col > .tox-form__group {
+ width: calc(25% - (8px / 2));
+}
+.tox .tox-form__controls-h-stack {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-form__group--inline {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-form__group--stretched {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+}
+.tox .tox-form__group--stretched .tox-textarea {
+ flex: 1;
+}
+.tox .tox-form__group--stretched .tox-navobj {
+ display: flex;
+ flex: 1;
+}
+.tox .tox-form__group--stretched .tox-navobj :nth-child(2) {
+ flex: 1;
+ height: 100%;
+}
+.tox:not([dir=rtl]) .tox-form__controls-h-stack > *:not(:first-child) {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-form__controls-h-stack > *:not(:first-child) {
+ margin-right: 4px;
+}
+.tox .tox-lock.tox-locked .tox-lock-icon__unlock,
+.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock {
+ display: none;
+}
+.tox .tox-textfield,
+.tox .tox-toolbar-textfield,
+.tox .tox-listboxfield .tox-listbox--select,
+.tox .tox-textarea {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: #2b3b4e;
+ border-color: #000000;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #fff;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ margin: 0;
+ min-height: 34px;
+ outline: none;
+ padding: 5px 4.75px;
+ resize: none;
+ width: 100%;
+}
+.tox .tox-textfield[disabled],
+.tox .tox-textarea[disabled] {
+ background-color: #222f3e;
+ color: rgba(255, 255, 255, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-textfield:focus,
+.tox .tox-listboxfield .tox-listbox--select:focus,
+.tox .tox-textarea:focus {
+ background-color: #2b3b4e;
+ border-color: #207ab7;
+ box-shadow: none;
+ outline: 2px solid rgba(32, 122, 183, 0.25);
+}
+.tox .tox-toolbar-textfield {
+ border-width: 0;
+ margin-bottom: 3px;
+ margin-top: 2px;
+ max-width: 250px;
+}
+.tox .tox-naked-btn {
+ background-color: transparent;
+ border: 0;
+ border-color: transparent;
+ box-shadow: unset;
+ color: #207ab7;
+ cursor: pointer;
+ display: block;
+ margin: 0;
+ padding: 0;
+}
+.tox .tox-naked-btn svg {
+ display: block;
+ fill: #fff;
+}
+.tox:not([dir=rtl]) .tox-toolbar-textfield + * {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-toolbar-textfield + * {
+ margin-right: 4px;
+}
+.tox .tox-listboxfield {
+ cursor: pointer;
+ position: relative;
+}
+.tox .tox-listboxfield .tox-listbox--select[disabled] {
+ background-color: #19232e;
+ color: rgba(255, 255, 255, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-listbox__select-label {
+ cursor: default;
+ flex: 1;
+ margin: 0 4px;
+}
+.tox .tox-listbox__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+}
+.tox .tox-listbox__select-chevron svg {
+ fill: #fff;
+}
+.tox .tox-listboxfield .tox-listbox--select {
+ align-items: center;
+ display: flex;
+}
+.tox:not([dir=rtl]) .tox-listboxfield svg {
+ right: 8px;
+}
+.tox[dir=rtl] .tox-listboxfield svg {
+ left: 8px;
+}
+.tox .tox-selectfield {
+ cursor: pointer;
+ position: relative;
+}
+.tox .tox-selectfield select {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: #2b3b4e;
+ border-color: #000000;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #fff;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ margin: 0;
+ min-height: 34px;
+ outline: none;
+ padding: 5px 4.75px;
+ resize: none;
+ width: 100%;
+}
+.tox .tox-selectfield select[disabled] {
+ background-color: #19232e;
+ color: rgba(255, 255, 255, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-selectfield select::-ms-expand {
+ display: none;
+}
+.tox .tox-selectfield select:focus {
+ background-color: #2b3b4e;
+ border-color: #207ab7;
+ box-shadow: none;
+ outline: 2px solid rgba(32, 122, 183, 0.25);
+}
+.tox .tox-selectfield svg {
+ pointer-events: none;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox:not([dir=rtl]) .tox-selectfield select[size="0"],
+.tox:not([dir=rtl]) .tox-selectfield select[size="1"] {
+ padding-right: 24px;
+}
+.tox:not([dir=rtl]) .tox-selectfield svg {
+ right: 8px;
+}
+.tox[dir=rtl] .tox-selectfield select[size="0"],
+.tox[dir=rtl] .tox-selectfield select[size="1"] {
+ padding-left: 24px;
+}
+.tox[dir=rtl] .tox-selectfield svg {
+ left: 8px;
+}
+.tox .tox-textarea {
+ -webkit-appearance: textarea;
+ -moz-appearance: textarea;
+ appearance: textarea;
+ white-space: pre-wrap;
+}
+.tox-fullscreen {
+ border: 0;
+ height: 100%;
+ margin: 0;
+ overflow: hidden;
+ overscroll-behavior: none;
+ padding: 0;
+ touch-action: pinch-zoom;
+ width: 100%;
+}
+.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {
+ display: none;
+}
+.tox.tox-tinymce.tox-fullscreen,
+.tox-shadowhost.tox-fullscreen {
+ left: 0;
+ position: fixed;
+ top: 0;
+ z-index: 1200;
+}
+.tox.tox-tinymce.tox-fullscreen {
+ background-color: transparent;
+}
+.tox-fullscreen .tox.tox-tinymce-aux,
+.tox-fullscreen ~ .tox.tox-tinymce-aux {
+ z-index: 1201;
+}
+.tox .tox-help__more-link {
+ list-style: none;
+ margin-top: 1em;
+}
+.tox .tox-imagepreview {
+ background-color: #666;
+ height: 380px;
+ overflow: hidden;
+ position: relative;
+ width: 100%;
+}
+.tox .tox-imagepreview.tox-imagepreview__loaded {
+ overflow: auto;
+}
+.tox .tox-imagepreview__container {
+ display: flex;
+ left: 100vw;
+ position: absolute;
+ top: 100vw;
+}
+.tox .tox-imagepreview__image {
+ background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==);
+}
+.tox .tox-image-tools .tox-spacer {
+ flex: 1;
+}
+.tox .tox-image-tools .tox-bar {
+ align-items: center;
+ display: flex;
+ height: 60px;
+ justify-content: center;
+}
+.tox .tox-image-tools .tox-imagepreview,
+.tox .tox-image-tools .tox-imagepreview + .tox-bar {
+ margin-top: 8px;
+}
+.tox .tox-image-tools .tox-croprect-block {
+ background: black;
+ filter: alpha(opacity=50);
+ opacity: 0.5;
+ position: absolute;
+ zoom: 1;
+}
+.tox .tox-image-tools .tox-croprect-handle {
+ border: 2px solid white;
+ height: 20px;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 20px;
+}
+.tox .tox-image-tools .tox-croprect-handle-move {
+ border: 0;
+ cursor: move;
+ position: absolute;
+}
+.tox .tox-image-tools .tox-croprect-handle-nw {
+ border-width: 2px 0 0 2px;
+ cursor: nw-resize;
+ left: 100px;
+ margin: -2px 0 0 -2px;
+ top: 100px;
+}
+.tox .tox-image-tools .tox-croprect-handle-ne {
+ border-width: 2px 2px 0 0;
+ cursor: ne-resize;
+ left: 200px;
+ margin: -2px 0 0 -20px;
+ top: 100px;
+}
+.tox .tox-image-tools .tox-croprect-handle-sw {
+ border-width: 0 0 2px 2px;
+ cursor: sw-resize;
+ left: 100px;
+ margin: -20px 2px 0 -2px;
+ top: 200px;
+}
+.tox .tox-image-tools .tox-croprect-handle-se {
+ border-width: 0 2px 2px 0;
+ cursor: se-resize;
+ left: 200px;
+ margin: -20px 0 0 -20px;
+ top: 200px;
+}
+.tox .tox-insert-table-picker {
+ display: flex;
+ flex-wrap: wrap;
+ width: 170px;
+}
+.tox .tox-insert-table-picker > div {
+ border-color: #000000;
+ border-style: solid;
+ border-width: 0 1px 1px 0;
+ box-sizing: border-box;
+ height: 17px;
+ width: 17px;
+}
+.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker {
+ margin: 0 -4px;
+}
+.tox .tox-insert-table-picker .tox-insert-table-picker__selected {
+ background-color: rgba(32, 122, 183, 0.5);
+ border-color: rgba(32, 122, 183, 0.5);
+}
+.tox .tox-insert-table-picker__label {
+ color: #fff;
+ display: block;
+ font-size: 14px;
+ padding: 4px;
+ text-align: center;
+ width: 100%;
+}
+.tox:not([dir=rtl]) {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox:not([dir=rtl]) .tox-insert-table-picker > div:nth-child(10n) {
+ border-right: 0;
+}
+.tox[dir=rtl] {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox[dir=rtl] .tox-insert-table-picker > div:nth-child(10n+1) {
+ border-right: 0;
+}
+.tox {
+ /* stylelint-disable */
+ /* stylelint-enable */
+}
+.tox .tox-menu {
+ background-color: #2b3b4e;
+ border: 1px solid #000000;
+ border-radius: 3px;
+ box-shadow: 0 4px 8px 0 rgba(42, 55, 70, 0.1);
+ display: inline-block;
+ overflow: hidden;
+ vertical-align: top;
+ z-index: 1150;
+}
+.tox .tox-menu.tox-collection.tox-collection--list {
+ padding: 0 0;
+}
+.tox .tox-menu.tox-collection.tox-collection--toolbar {
+ padding: 4px;
+}
+.tox .tox-menu.tox-collection.tox-collection--grid {
+ padding: 4px;
+}
+.tox .tox-menu__label h1,
+.tox .tox-menu__label h2,
+.tox .tox-menu__label h3,
+.tox .tox-menu__label h4,
+.tox .tox-menu__label h5,
+.tox .tox-menu__label h6,
+.tox .tox-menu__label p,
+.tox .tox-menu__label blockquote,
+.tox .tox-menu__label code {
+ margin: 0;
+}
+.tox .tox-menubar {
+ background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;
+ background-color: #222f3e;
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ padding: 0 4px 0 4px;
+}
+.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar {
+ border-top: 1px solid #000000;
+}
+/* Deprecated. Remove in next major release */
+.tox .tox-mbtn {
+ align-items: center;
+ background: transparent;
+ border: 0;
+ border-radius: 3px;
+ box-shadow: none;
+ color: #fff;
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ height: 34px;
+ justify-content: center;
+ margin: 2px 0 3px 0;
+ outline: none;
+ overflow: hidden;
+ padding: 0 4px;
+ text-transform: none;
+ width: auto;
+}
+.tox .tox-mbtn[disabled] {
+ background-color: transparent;
+ border: 0;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-mbtn:focus:not(:disabled) {
+ background: #4a5562;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-mbtn--active {
+ background: #757d87;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) {
+ background: #4a5562;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-mbtn__select-label {
+ cursor: default;
+ font-weight: normal;
+ margin: 0 4px;
+}
+.tox .tox-mbtn[disabled] .tox-mbtn__select-label {
+ cursor: not-allowed;
+}
+.tox .tox-mbtn__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+ display: none;
+}
+.tox .tox-notification {
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ display: grid;
+ font-size: 14px;
+ font-weight: normal;
+ grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr);
+ margin-top: 4px;
+ opacity: 0;
+ padding: 4px;
+ transition: transform 100ms ease-in, opacity 150ms ease-in;
+}
+.tox .tox-notification p {
+ font-size: 14px;
+ font-weight: normal;
+}
+.tox .tox-notification a {
+ cursor: pointer;
+ text-decoration: underline;
+}
+.tox .tox-notification--in {
+ opacity: 1;
+}
+.tox .tox-notification--success {
+ background-color: #334840;
+ border-color: #3c5440;
+ color: #fff;
+}
+.tox .tox-notification--success p {
+ color: #fff;
+}
+.tox .tox-notification--success a {
+ color: #b5d199;
+}
+.tox .tox-notification--success svg {
+ fill: #fff;
+}
+.tox .tox-notification--error {
+ background-color: #442632;
+ border-color: #55212b;
+ color: #fff;
+}
+.tox .tox-notification--error p {
+ color: #fff;
+}
+.tox .tox-notification--error a {
+ color: #e68080;
+}
+.tox .tox-notification--error svg {
+ fill: #fff;
+}
+.tox .tox-notification--warn,
+.tox .tox-notification--warning {
+ background-color: #222f3e;
+ border-color: #000000;
+ color: #fff0b3;
+}
+.tox .tox-notification--warn p,
+.tox .tox-notification--warning p {
+ color: #fff0b3;
+}
+.tox .tox-notification--warn a,
+.tox .tox-notification--warning a {
+ color: #ffcc00;
+}
+.tox .tox-notification--warn svg,
+.tox .tox-notification--warning svg {
+ fill: #fff0b3;
+}
+.tox .tox-notification--info {
+ background-color: #254161;
+ border-color: #264972;
+ color: #fff;
+}
+.tox .tox-notification--info p {
+ color: #fff;
+}
+.tox .tox-notification--info a {
+ color: #83b7f3;
+}
+.tox .tox-notification--info svg {
+ fill: #fff;
+}
+.tox .tox-notification__body {
+ align-self: center;
+ color: #fff;
+ font-size: 14px;
+ grid-column-end: 3;
+ grid-column-start: 2;
+ grid-row-end: 2;
+ grid-row-start: 1;
+ text-align: center;
+ white-space: normal;
+ word-break: break-all;
+ word-break: break-word;
+}
+.tox .tox-notification__body > * {
+ margin: 0;
+}
+.tox .tox-notification__body > * + * {
+ margin-top: 1rem;
+}
+.tox .tox-notification__icon {
+ align-self: center;
+ grid-column-end: 2;
+ grid-column-start: 1;
+ grid-row-end: 2;
+ grid-row-start: 1;
+ justify-self: end;
+}
+.tox .tox-notification__icon svg {
+ display: block;
+}
+.tox .tox-notification__dismiss {
+ align-self: start;
+ grid-column-end: 4;
+ grid-column-start: 3;
+ grid-row-end: 2;
+ grid-row-start: 1;
+ justify-self: end;
+}
+.tox .tox-notification .tox-progress-bar {
+ grid-column-end: 4;
+ grid-column-start: 1;
+ grid-row-end: 3;
+ grid-row-start: 2;
+ justify-self: center;
+}
+.tox .tox-pop {
+ display: inline-block;
+ position: relative;
+}
+.tox .tox-pop--resizing {
+ transition: width 0.1s ease;
+}
+.tox .tox-pop--resizing .tox-toolbar,
+.tox .tox-pop--resizing .tox-toolbar__group {
+ flex-wrap: nowrap;
+}
+.tox .tox-pop--transition {
+ transition: 0.15s ease;
+ transition-property: left, right, top, bottom;
+}
+.tox .tox-pop--transition::before,
+.tox .tox-pop--transition::after {
+ transition: all 0.15s, visibility 0s, opacity 0.075s ease 0.075s;
+}
+.tox .tox-pop__dialog {
+ background-color: #222f3e;
+ border: 1px solid #000000;
+ border-radius: 3px;
+ box-shadow: 0 0 2px 0 rgba(42, 55, 70, 0.2), 0 4px 8px 0 rgba(42, 55, 70, 0.15);
+ min-width: 0;
+ overflow: hidden;
+}
+.tox .tox-pop__dialog > *:not(.tox-toolbar) {
+ margin: 4px 4px 4px 8px;
+}
+.tox .tox-pop__dialog .tox-toolbar {
+ background-color: transparent;
+ margin-bottom: -1px;
+}
+.tox .tox-pop::before,
+.tox .tox-pop::after {
+ border-style: solid;
+ content: '';
+ display: block;
+ height: 0;
+ opacity: 1;
+ position: absolute;
+ width: 0;
+}
+.tox .tox-pop.tox-pop--inset::before,
+.tox .tox-pop.tox-pop--inset::after {
+ opacity: 0;
+ transition: all 0s 0.15s, visibility 0s, opacity 0.075s ease;
+}
+.tox .tox-pop.tox-pop--bottom::before,
+.tox .tox-pop.tox-pop--bottom::after {
+ left: 50%;
+ top: 100%;
+}
+.tox .tox-pop.tox-pop--bottom::after {
+ border-color: #222f3e transparent transparent transparent;
+ border-width: 8px;
+ margin-left: -8px;
+ margin-top: -1px;
+}
+.tox .tox-pop.tox-pop--bottom::before {
+ border-color: #000000 transparent transparent transparent;
+ border-width: 9px;
+ margin-left: -9px;
+}
+.tox .tox-pop.tox-pop--top::before,
+.tox .tox-pop.tox-pop--top::after {
+ left: 50%;
+ top: 0;
+ transform: translateY(-100%);
+}
+.tox .tox-pop.tox-pop--top::after {
+ border-color: transparent transparent #222f3e transparent;
+ border-width: 8px;
+ margin-left: -8px;
+ margin-top: 1px;
+}
+.tox .tox-pop.tox-pop--top::before {
+ border-color: transparent transparent #000000 transparent;
+ border-width: 9px;
+ margin-left: -9px;
+}
+.tox .tox-pop.tox-pop--left::before,
+.tox .tox-pop.tox-pop--left::after {
+ left: 0;
+ top: calc(50% - 1px);
+ transform: translateY(-50%);
+}
+.tox .tox-pop.tox-pop--left::after {
+ border-color: transparent #222f3e transparent transparent;
+ border-width: 8px;
+ margin-left: -15px;
+}
+.tox .tox-pop.tox-pop--left::before {
+ border-color: transparent #000000 transparent transparent;
+ border-width: 10px;
+ margin-left: -19px;
+}
+.tox .tox-pop.tox-pop--right::before,
+.tox .tox-pop.tox-pop--right::after {
+ left: 100%;
+ top: calc(50% + 1px);
+ transform: translateY(-50%);
+}
+.tox .tox-pop.tox-pop--right::after {
+ border-color: transparent transparent transparent #222f3e;
+ border-width: 8px;
+ margin-left: -1px;
+}
+.tox .tox-pop.tox-pop--right::before {
+ border-color: transparent transparent transparent #000000;
+ border-width: 10px;
+ margin-left: -1px;
+}
+.tox .tox-pop.tox-pop--align-left::before,
+.tox .tox-pop.tox-pop--align-left::after {
+ left: 20px;
+}
+.tox .tox-pop.tox-pop--align-right::before,
+.tox .tox-pop.tox-pop--align-right::after {
+ left: calc(100% - 20px);
+}
+.tox .tox-sidebar-wrap {
+ display: flex;
+ flex-direction: row;
+ flex-grow: 1;
+ min-height: 0;
+}
+.tox .tox-sidebar {
+ background-color: #222f3e;
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-end;
+}
+.tox .tox-sidebar__slider {
+ display: flex;
+ overflow: hidden;
+}
+.tox .tox-sidebar__pane-container {
+ display: flex;
+}
+.tox .tox-sidebar__pane {
+ display: flex;
+}
+.tox .tox-sidebar--sliding-closed {
+ opacity: 0;
+}
+.tox .tox-sidebar--sliding-open {
+ opacity: 1;
+}
+.tox .tox-sidebar--sliding-growing,
+.tox .tox-sidebar--sliding-shrinking {
+ transition: width 0.5s ease, opacity 0.5s ease;
+}
+.tox .tox-selector {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ display: inline-block;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+}
+.tox.tox-platform-touch .tox-selector {
+ height: 12px;
+ width: 12px;
+}
+.tox .tox-slider {
+ align-items: center;
+ display: flex;
+ flex: 1;
+ height: 24px;
+ justify-content: center;
+ position: relative;
+}
+.tox .tox-slider__rail {
+ background-color: transparent;
+ border: 1px solid #000000;
+ border-radius: 3px;
+ height: 10px;
+ min-width: 120px;
+ width: 100%;
+}
+.tox .tox-slider__handle {
+ background-color: #207ab7;
+ border: 2px solid #185d8c;
+ border-radius: 3px;
+ box-shadow: none;
+ height: 24px;
+ left: 50%;
+ position: absolute;
+ top: 50%;
+ transform: translateX(-50%) translateY(-50%);
+ width: 14px;
+}
+.tox .tox-form__controls-h-stack > .tox-slider:not(:first-of-type) {
+ margin-inline-start: 8px;
+}
+.tox .tox-form__controls-h-stack > .tox-form__group + .tox-slider {
+ margin-inline-start: 32px;
+}
+.tox .tox-form__controls-h-stack > .tox-slider + .tox-form__group {
+ margin-inline-start: 32px;
+}
+.tox .tox-source-code {
+ overflow: auto;
+}
+.tox .tox-spinner {
+ display: flex;
+}
+.tox .tox-spinner > div {
+ animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-radius: 100%;
+ height: 8px;
+ width: 8px;
+}
+.tox .tox-spinner > div:nth-child(1) {
+ animation-delay: -0.32s;
+}
+.tox .tox-spinner > div:nth-child(2) {
+ animation-delay: -0.16s;
+}
+@keyframes tam-bouncing-dots {
+ 0%,
+ 80%,
+ 100% {
+ transform: scale(0);
+ }
+ 40% {
+ transform: scale(1);
+ }
+}
+.tox:not([dir=rtl]) .tox-spinner > div:not(:first-child) {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-spinner > div:not(:first-child) {
+ margin-right: 4px;
+}
+.tox .tox-statusbar {
+ align-items: center;
+ background-color: #222f3e;
+ border-top: 1px solid #000000;
+ color: #fff;
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 12px;
+ font-weight: normal;
+ height: 18px;
+ overflow: hidden;
+ padding: 0 8px;
+ position: relative;
+ text-transform: uppercase;
+}
+.tox .tox-statusbar__text-container {
+ display: flex;
+ flex: 1 1 auto;
+ justify-content: flex-end;
+ overflow: hidden;
+}
+.tox .tox-statusbar__path {
+ display: flex;
+ flex: 1 1 auto;
+ margin-right: auto;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.tox .tox-statusbar__path > * {
+ display: inline;
+ white-space: nowrap;
+}
+.tox .tox-statusbar__wordcount {
+ flex: 0 0 auto;
+ margin-left: 1ch;
+}
+.tox .tox-statusbar a,
+.tox .tox-statusbar__path-item,
+.tox .tox-statusbar__wordcount {
+ color: #fff;
+ text-decoration: none;
+}
+.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]) {
+ color: #fff;
+ cursor: pointer;
+}
+.tox .tox-statusbar__branding svg {
+ fill: rgba(255, 255, 255, 0.8);
+ height: 1.14em;
+ vertical-align: -0.28em;
+ width: 3.6em;
+}
+.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled=true]) svg,
+.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled=true]) svg {
+ fill: #fff;
+}
+.tox .tox-statusbar__resize-handle {
+ align-items: flex-end;
+ align-self: stretch;
+ cursor: nwse-resize;
+ display: flex;
+ flex: 0 0 auto;
+ justify-content: flex-end;
+ margin-left: auto;
+ margin-right: -8px;
+ padding-bottom: 3px;
+ padding-left: 1ch;
+ padding-right: 3px;
+}
+.tox .tox-statusbar__resize-handle svg {
+ display: block;
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-statusbar__resize-handle:focus svg {
+ background-color: #4a5562;
+ border-radius: 1px 1px -4px 1px;
+ box-shadow: 0 0 0 2px #4a5562;
+}
+.tox:not([dir=rtl]) .tox-statusbar__path > * {
+ margin-right: 4px;
+}
+.tox:not([dir=rtl]) .tox-statusbar__branding {
+ margin-left: 2ch;
+}
+.tox[dir=rtl] .tox-statusbar {
+ flex-direction: row-reverse;
+}
+.tox[dir=rtl] .tox-statusbar__path > * {
+ margin-left: 4px;
+}
+.tox .tox-throbber {
+ z-index: 1299;
+}
+.tox .tox-throbber__busy-spinner {
+ align-items: center;
+ background-color: rgba(34, 47, 62, 0.6);
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+}
+.tox .tox-tbtn {
+ align-items: center;
+ background: transparent;
+ border: 0;
+ border-radius: 3px;
+ box-shadow: none;
+ color: #fff;
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ height: 34px;
+ justify-content: center;
+ margin: 3px 0 2px 0;
+ outline: none;
+ overflow: hidden;
+ padding: 0;
+ text-transform: none;
+ width: 34px;
+}
+.tox .tox-tbtn svg {
+ display: block;
+ fill: #fff;
+}
+.tox .tox-tbtn.tox-tbtn-more {
+ padding-left: 5px;
+ padding-right: 5px;
+ width: inherit;
+}
+.tox .tox-tbtn:focus {
+ background: #4a5562;
+ border: 0;
+ box-shadow: none;
+}
+.tox .tox-tbtn:hover {
+ background: #4a5562;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-tbtn:hover svg {
+ fill: #fff;
+}
+.tox .tox-tbtn:active {
+ background: #757d87;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-tbtn:active svg {
+ fill: #fff;
+}
+.tox .tox-tbtn--disabled,
+.tox .tox-tbtn--disabled:hover,
+.tox .tox-tbtn:disabled,
+.tox .tox-tbtn:disabled:hover {
+ background: transparent;
+ border: 0;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-tbtn--disabled svg,
+.tox .tox-tbtn--disabled:hover svg,
+.tox .tox-tbtn:disabled svg,
+.tox .tox-tbtn:disabled:hover svg {
+ /* stylelint-disable-line no-descending-specificity */
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-tbtn--enabled,
+.tox .tox-tbtn--enabled:hover {
+ background: #757d87;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-tbtn--enabled > *,
+.tox .tox-tbtn--enabled:hover > * {
+ transform: none;
+}
+.tox .tox-tbtn--enabled svg,
+.tox .tox-tbtn--enabled:hover svg {
+ /* stylelint-disable-line no-descending-specificity */
+ fill: #fff;
+}
+.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) {
+ color: #fff;
+}
+.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg {
+ fill: #fff;
+}
+.tox .tox-tbtn:active > * {
+ transform: none;
+}
+.tox .tox-tbtn--md {
+ height: 51px;
+ width: 51px;
+}
+.tox .tox-tbtn--lg {
+ flex-direction: column;
+ height: 68px;
+ width: 68px;
+}
+.tox .tox-tbtn--return {
+ align-self: stretch;
+ height: unset;
+ width: 16px;
+}
+.tox .tox-tbtn--labeled {
+ padding: 0 4px;
+ width: unset;
+}
+.tox .tox-tbtn__vlabel {
+ display: block;
+ font-size: 10px;
+ font-weight: normal;
+ letter-spacing: -0.025em;
+ margin-bottom: 4px;
+ white-space: nowrap;
+}
+.tox .tox-tbtn--select {
+ margin: 3px 0 2px 0;
+ padding: 0 4px;
+ width: auto;
+}
+.tox .tox-tbtn__select-label {
+ cursor: default;
+ font-weight: normal;
+ margin: 0 4px;
+}
+.tox .tox-tbtn__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+}
+.tox .tox-tbtn__select-chevron svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-tbtn--bespoke {
+ background: transparent;
+}
+.tox .tox-tbtn--bespoke + .tox-tbtn--bespoke {
+ margin-inline-start: 0;
+}
+.tox .tox-tbtn--bespoke .tox-tbtn__select-label {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ width: 7em;
+}
+.tox .tox-split-button {
+ border: 0;
+ border-radius: 3px;
+ box-sizing: border-box;
+ display: flex;
+ margin: 3px 0 2px 0;
+ overflow: hidden;
+}
+.tox .tox-split-button:hover {
+ box-shadow: 0 0 0 1px #4a5562 inset;
+}
+.tox .tox-split-button:focus {
+ background: #4a5562;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-split-button > * {
+ border-radius: 0;
+}
+.tox .tox-split-button__chevron {
+ width: 16px;
+}
+.tox .tox-split-button__chevron svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-split-button .tox-tbtn {
+ margin: 0;
+}
+.tox .tox-split-button.tox-tbtn--disabled:hover,
+.tox .tox-split-button.tox-tbtn--disabled:focus,
+.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,
+.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus {
+ background: transparent;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+}
+.tox.tox-platform-touch .tox-split-button .tox-tbtn--select {
+ padding: 0 0px;
+}
+.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child {
+ width: 30px;
+}
+.tox.tox-platform-touch .tox-split-button__chevron {
+ width: 20px;
+}
+.tox .tox-toolbar-overlord {
+ background-color: #222f3e;
+}
+.tox .tox-toolbar,
+.tox .tox-toolbar__primary,
+.tox .tox-toolbar__overflow {
+ background-color: #222f3e;
+ background-image: repeating-linear-gradient(#000000 0px 1px, transparent 1px 39px);
+ background-position: center top 39px;
+ background-repeat: no-repeat;
+ background-size: calc(100% - 4px * 2) calc(100% - 39px);
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ padding: 0 0px;
+ transform: perspective(1px);
+}
+.tox .tox-toolbar-overlord > .tox-toolbar,
+.tox .tox-toolbar-overlord > .tox-toolbar__primary,
+.tox .tox-toolbar-overlord > .tox-toolbar__overflow {
+ background-position: center top 0px;
+ background-size: calc(100% - 4px * 2) calc(100% - 0px);
+}
+.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed {
+ height: 0;
+ opacity: 0;
+ padding-bottom: 0;
+ padding-top: 0;
+ visibility: hidden;
+}
+.tox .tox-toolbar__overflow--growing {
+ transition: height 0.3s ease, opacity 0.2s linear 0.1s;
+}
+.tox .tox-toolbar__overflow--shrinking {
+ transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s;
+}
+.tox .tox-menubar + .tox-toolbar,
+.tox .tox-menubar + .tox-toolbar-overlord {
+ border-top: 1px solid #000000;
+ margin-top: 0;
+ padding-bottom: 0px;
+ padding-top: 0px;
+}
+.tox .tox-toolbar--scrolling {
+ flex-wrap: nowrap;
+ overflow-x: auto;
+}
+.tox .tox-pop .tox-toolbar {
+ border-width: 0;
+}
+.tox .tox-toolbar--no-divider {
+ background-image: none;
+}
+.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child,
+.tox .tox-toolbar-overlord .tox-toolbar__primary {
+ background-position: center top 39px;
+}
+.tox .tox-editor-header > .tox-toolbar--scrolling,
+.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child {
+ background-image: none;
+}
+.tox.tox-tinymce-aux .tox-toolbar__overflow {
+ background-color: #222f3e;
+ background-position: center top 43px;
+ background-size: calc(100% - 8px * 2) calc(100% - 51px);
+ border: none;
+ border-radius: 3px;
+ box-shadow: 0 0 2px 0 rgba(42, 55, 70, 0.2), 0 4px 8px 0 rgba(42, 55, 70, 0.15);
+ padding: 4px 0;
+}
+.tox-pop .tox-pop__dialog {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox-pop .tox-pop__dialog .tox-toolbar {
+ background-position: center top 43px;
+ background-size: calc(100% - 4px * 2) calc(100% - 51px);
+ padding: 4px 0;
+}
+.tox .tox-toolbar__group {
+ align-items: center;
+ display: flex;
+ flex-wrap: wrap;
+ margin: 0 0;
+ padding: 0 4px 0 4px;
+}
+.tox .tox-toolbar__group--pull-right {
+ margin-left: auto;
+}
+.tox .tox-toolbar--scrolling .tox-toolbar__group {
+ flex-shrink: 0;
+ flex-wrap: nowrap;
+}
+.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type) {
+ border-right: 1px solid #000000;
+}
+.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type) {
+ border-left: 1px solid #000000;
+}
+.tox .tox-tooltip {
+ display: inline-block;
+ padding: 8px;
+ position: relative;
+}
+.tox .tox-tooltip__body {
+ background-color: #3d546f;
+ border-radius: 3px;
+ box-shadow: 0 2px 4px rgba(42, 55, 70, 0.3);
+ color: rgba(255, 255, 255, 0.75);
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ padding: 4px 8px;
+ text-transform: none;
+}
+.tox .tox-tooltip__arrow {
+ position: absolute;
+}
+.tox .tox-tooltip--down .tox-tooltip__arrow {
+ border-left: 8px solid transparent;
+ border-right: 8px solid transparent;
+ border-top: 8px solid #3d546f;
+ bottom: 0;
+ left: 50%;
+ position: absolute;
+ transform: translateX(-50%);
+}
+.tox .tox-tooltip--up .tox-tooltip__arrow {
+ border-bottom: 8px solid #3d546f;
+ border-left: 8px solid transparent;
+ border-right: 8px solid transparent;
+ left: 50%;
+ position: absolute;
+ top: 0;
+ transform: translateX(-50%);
+}
+.tox .tox-tooltip--right .tox-tooltip__arrow {
+ border-bottom: 8px solid transparent;
+ border-left: 8px solid #3d546f;
+ border-top: 8px solid transparent;
+ position: absolute;
+ right: 0;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-tooltip--left .tox-tooltip__arrow {
+ border-bottom: 8px solid transparent;
+ border-right: 8px solid #3d546f;
+ border-top: 8px solid transparent;
+ left: 0;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-well {
+ border: 1px solid #000000;
+ border-radius: 3px;
+ padding: 8px;
+ width: 100%;
+}
+.tox .tox-well > *:first-child {
+ margin-top: 0;
+}
+.tox .tox-well > *:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-well > *:only-child {
+ margin: 0;
+}
+.tox .tox-custom-editor {
+ border: 1px solid #000000;
+ border-radius: 3px;
+ display: flex;
+ flex: 1;
+ position: relative;
+}
+/* stylelint-disable */
+.tox {
+ /* stylelint-enable */
+}
+.tox .tox-dialog-loading::before {
+ background-color: rgba(0, 0, 0, 0.5);
+ content: "";
+ height: 100%;
+ position: absolute;
+ width: 100%;
+ z-index: 1000;
+}
+.tox .tox-tab {
+ cursor: pointer;
+}
+.tox .tox-dialog__content-js {
+ display: flex;
+ flex: 1;
+}
+.tox .tox-dialog__body-content .tox-collection {
+ display: flex;
+ flex: 1;
+}
+.tox:not(.tox-tinymce-inline) .tox-editor-header {
+ background-color: none;
+ padding: 0;
+}
+.tox.tox-tinymce--toolbar-bottom .tox-editor-header,
+.tox.tox-tinymce-inline .tox-editor-header {
+ margin-bottom: -1px;
+}
+.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header {
+ border-top: none;
+ box-shadow: none;
+}
+.tox.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header {
+ background-color: transparent;
+ box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25);
+ padding: 0;
+}
+.tox.tox.tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header {
+ box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25);
+}
+.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker {
+ margin: -4px 0;
+}
+.tox .tox-menu.tox-collection.tox-collection--list {
+ padding: 0;
+}
+.tox .tox-pop {
+ box-shadow: none;
+}
+.tox .tox-tbtn,
+.tox .tox-tbtn--select,
+.tox .tox-split-button {
+ margin: 2px 0 3px 0;
+}
+.tox .tox-toolbar,
+.tox .tox-toolbar__primary,
+.tox .tox-toolbar__overflow {
+ background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0px #222f3e !important;
+}
+.tox .tox-menubar + .tox-toolbar-overlord {
+ border-top: none;
+}
+.tox .tox-menubar + .tox-toolbar,
+.tox .tox-menubar + .tox-toolbar-overlord .tox-toolbar__primary {
+ border-top: 1px solid #000000;
+ margin-top: -1px;
+}
+.tox.tox-tinymce-aux .tox-toolbar__overflow {
+ border: 1px solid #000000;
+ padding: 0;
+}
+.tox:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,
+.tox:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child {
+ border-top: 1px solid #000000;
+}
+.tox .tox-toolbar__group {
+ padding: 0 4px 0 4px;
+}
+.tox .tox-collection__item {
+ border-radius: 0;
+ cursor: pointer;
+}
+.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]) {
+ color: #fff;
+ text-decoration: underline;
+}
+.tox .tox-statusbar__branding svg {
+ vertical-align: -0.25em;
+}
+.tox:not([dir=rtl]) .tox-statusbar__branding {
+ margin-left: 1ch;
+}
+.tox .tox-statusbar__resize-handle {
+ padding-bottom: 0;
+ padding-right: 0;
+}
diff --git a/public/tinymce/skins/ui/tinymce-5-dark/skin.min.css b/public/tinymce/skins/ui/tinymce-5-dark/skin.min.css
new file mode 100644
index 00000000..317041b5
--- /dev/null
+++ b/public/tinymce/skins/ui/tinymce-5-dark/skin.min.css
@@ -0,0 +1 @@
+.tox{box-shadow:none;box-sizing:content-box;color:#2a3746;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #000;border-radius:0;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox.tox-tinymce-inline{border:none;box-shadow:none;overflow:initial}.tox.tox-tinymce-inline .tox-editor-container{overflow:initial}.tox.tox-tinymce-inline .tox-editor-header{background-color:#222f3e;border:1px solid #000;border-radius:0;box-shadow:none;overflow:hidden}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox[dir=rtl] .tox-icon--flip svg{transform:rotateY(180deg)}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #000;border-radius:3px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#000;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.5);border-color:#207ab7;color:#fff}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.5);border-color:rgba(255,165,0,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.8)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.5);border-color:rgba(204,0,0,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.8)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.5);border-color:rgba(120,171,70,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.8)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#207ab7;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#207ab7;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button[disabled]{background-color:#207ab7;background-image:none;border-color:#207ab7;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#185d8c;background-image:none;border-color:#185d8c;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#3d546f;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#3d546f;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;color:#fff;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:none}.tox .tox-button--secondary[disabled]{background-color:#3d546f;background-image:none;border-color:#3d546f;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#34485f;background-image:none;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--secondary:hover:not(:disabled){background-color:#34485f;background-image:none;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--secondary:active:not(:disabled){background-color:#2b3b4e;background-image:none;border-color:#2b3b4e;box-shadow:none;color:#fff}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#fff}.tox .tox-button--naked[disabled]{background-color:#3d546f;border-color:#3d546f;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:#34485f;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--naked:focus:not(:disabled){background-color:#34485f;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--naked:active:not(:disabled){background-color:#2b3b4e;border-color:#2b3b4e;box-shadow:none;color:#fff}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#fff}.tox .tox-checkbox{align-items:center;border-radius:3px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:3px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(255,255,255,.2)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#207ab7}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#207ab7}.tox .tox-checkbox--disabled{color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(255,255,255,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(255,255,255,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(255,255,255,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:3px;box-shadow:inset 0 0 0 1px #207ab7;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#1a1a1a;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#333;color:#fff;cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;border-radius:3px;color:#fff;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#2b3b4e;color:#fff}.tox .tox-collection--list .tox-collection__item--active{background-color:#4a5562}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#757d87;color:#fff}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#4a5562}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#757d87;color:#fff}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#4a5562;color:#fff}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#fff}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#fff}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(255,255,255,.5);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#fff}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg{fill:rgba(255,255,255,.5)}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#2b3b4e;border:1px solid #1a1a1a;border-radius:3px;box-shadow:0 0 2px 0 rgba(42,55,70,.2),0 4px 8px 0 rgba(42,55,70,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:3px 0 2px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #000}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #000}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{fill:#fff;height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#4a5562}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#2b3b4e;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#2b3b4e;border:1px solid #000;border-radius:3px;box-shadow:0 4px 8px 0 rgba(42,55,70,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#fff;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(255,255,255,.5);font-size:12px}.tox .tox-comment__body{color:#fff;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(255,255,255,.5);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#2b3b4e;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(43,59,78,0),#2b3b4e);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#2b3b4e;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#fff;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#2b3b4e;box-shadow:0 0 8px 8px #2b3b4e;color:#fff;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#2b3b4e;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(255,255,255,.5)}.tox .tox-user__name{color:rgba(255,255,255,.5);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(34,47,62,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#222f3e}.tox .tox-dialog{background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(42,55,70,.15),0 0 40px 1px rgba(42,55,70,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#2b3b4e;border-bottom:none;color:#fff;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#fff;display:flex;flex:1;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(255,255,255,.5);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #207ab7;color:#207ab7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#207ab7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#fff}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;margin-inline-end:0;margin-inline-start:0;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#fff;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#fff;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#2b3b4e;border-top:1px solid #000;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(34,47,62,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #000}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #000;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(255,255,255,.5);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #000}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{background-color:#222f3e;border-bottom:none;box-shadow:none;padding:4px 0;transition:box-shadow .5s}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header{border-top:1px solid #000;box-shadow:none}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:#222f3e;box-shadow:0 4px 4px -3px rgba(0,0,0,.25);padding:4px 0}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header{box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{border-color:#000;box-shadow:none;max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(42,55,70,.2);border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#207ab7;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(255,255,255,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(255,255,255,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(255,255,255,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(255,255,255,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #2b3b4e;border-radius:3px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(255,255,255,.5);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column}.tox .tox-form__group--stretched .tox-textarea{flex:1}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#222f3e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#2b3b4e;border-color:#207ab7;box-shadow:none;outline:2px solid rgba(32,122,183,.25)}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#207ab7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#fff}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#fff}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#2b3b4e;border-color:#207ab7;box-shadow:none;outline:2px solid rgba(32,122,183,.25)}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-imagepreview{background-color:#666;height:380px;overflow:hidden;position:relative;width:100%}.tox .tox-imagepreview.tox-imagepreview__loaded{overflow:auto}.tox .tox-imagepreview__container{display:flex;left:100vw;position:absolute;top:100vw}.tox .tox-imagepreview__image{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools .tox-spacer{flex:1}.tox .tox-image-tools .tox-bar{align-items:center;display:flex;height:60px;justify-content:center}.tox .tox-image-tools .tox-imagepreview,.tox .tox-image-tools .tox-imagepreview+.tox-bar{margin-top:8px}.tox .tox-image-tools .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-image-tools .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-image-tools .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-image-tools .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-image-tools .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-image-tools .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-image-tools .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#000;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:0 -4px}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:#fff;display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#2b3b4e;border:1px solid #000;border-radius:3px;box-shadow:0 4px 8px 0 rgba(42,55,70,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0 0}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color:#222f3e;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #000}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#fff;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn--active{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:grid;font-size:14px;font-weight:400;grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{cursor:pointer;text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#334840;border-color:#3c5440;color:#fff}.tox .tox-notification--success p{color:#fff}.tox .tox-notification--success a{color:#b5d199}.tox .tox-notification--success svg{fill:#fff}.tox .tox-notification--error{background-color:#442632;border-color:#55212b;color:#fff}.tox .tox-notification--error p{color:#fff}.tox .tox-notification--error a{color:#e68080}.tox .tox-notification--error svg{fill:#fff}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#222f3e;border-color:#000;color:#fff0b3}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#fff0b3}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#fc0}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#fff0b3}.tox .tox-notification--info{background-color:#254161;border-color:#264972;color:#fff}.tox .tox-notification--info p{color:#fff}.tox .tox-notification--info a{color:#83b7f3}.tox .tox-notification--info svg{fill:#fff}.tox .tox-notification__body{align-self:center;color:#fff;font-size:14px;grid-column-end:3;grid-column-start:2;grid-row-end:2;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{align-self:center;grid-column-end:2;grid-column-start:1;grid-row-end:2;grid-row-start:1;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{align-self:start;grid-column-end:4;grid-column-start:3;grid-row-end:2;grid-row-start:1;justify-self:end}.tox .tox-notification .tox-progress-bar{grid-column-end:4;grid-column-start:1;grid-row-end:3;grid-row-start:2;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar,.tox .tox-pop--resizing .tox-toolbar__group{flex-wrap:nowrap}.tox .tox-pop--transition{transition:.15s ease;transition-property:left,right,top,bottom}.tox .tox-pop--transition::after,.tox .tox-pop--transition::before{transition:all .15s,visibility 0s,opacity 75ms ease 75ms}.tox .tox-pop__dialog{background-color:#222f3e;border:1px solid #000;border-radius:3px;box-shadow:0 0 2px 0 rgba(42,55,70,.2),0 4px 8px 0 rgba(42,55,70,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;opacity:1;position:absolute;width:0}.tox .tox-pop.tox-pop--inset::after,.tox .tox-pop.tox-pop--inset::before{opacity:0;transition:all 0s .15s,visibility 0s,opacity 75ms ease}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#222f3e transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#000 transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #222f3e transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #000 transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #222f3e transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #000 transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #222f3e;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #000;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;min-height:0}.tox .tox-sidebar{background-color:#222f3e;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #000;border-radius:3px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#207ab7;border:2px solid #185d8c;border-radius:3px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-form__controls-h-stack>.tox-slider:not(:first-of-type){margin-inline-start:8px}.tox .tox-form__controls-h-stack>.tox-form__group+.tox-slider{margin-inline-start:32px}.tox .tox-form__controls-h-stack>.tox-slider+.tox-form__group{margin-inline-start:32px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(255,255,255,.5);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#222f3e;border-top:1px solid #000;color:#fff;display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:#fff;text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){color:#fff;cursor:pointer}.tox .tox-statusbar__branding svg{fill:rgba(255,255,255,.8);height:1.14em;vertical-align:-.28em;width:3.6em}.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled=true]) svg,.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled=true]) svg{fill:#fff}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-bottom:3px;padding-left:1ch;padding-right:3px}.tox .tox-statusbar__resize-handle svg{display:block;fill:rgba(255,255,255,.5)}.tox .tox-statusbar__resize-handle:focus svg{background-color:#4a5562;border-radius:1px 1px -4px 1px;box-shadow:0 0 0 2px #4a5562}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:2ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(34,47,62,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#fff;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:3px 0 2px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#fff}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#4a5562;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn:hover svg{fill:#fff}.tox .tox-tbtn:active{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn:active svg{fill:#fff}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(255,255,255,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#fff}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#fff}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#fff}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:3px 0 2px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(255,255,255,.5)}.tox .tox-tbtn--bespoke{background:0 0}.tox .tox-tbtn--bespoke+.tox-tbtn--bespoke{margin-inline-start:0}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:3px 0 2px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #4a5562 inset}.tox .tox-split-button:focus{background:#4a5562;box-shadow:none;color:#fff}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(255,255,255,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(255,255,255,.5)}.tox.tox-platform-touch .tox-split-button .tox-tbtn--select{padding:0 0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-toolbar-overlord{background-color:#222f3e}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background-color:#222f3e;background-image:repeating-linear-gradient(#000 0 1px,transparent 1px 39px);background-position:center top 39px;background-repeat:no-repeat;background-size:calc(100% - 4px * 2) calc(100% - 39px);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0;transform:perspective(1px)}.tox .tox-toolbar-overlord>.tox-toolbar,.tox .tox-toolbar-overlord>.tox-toolbar__overflow,.tox .tox-toolbar-overlord>.tox-toolbar__primary{background-position:center top 0;background-size:calc(100% - 4px * 2) calc(100% - 0px)}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord{border-top:1px solid #000;margin-top:0;padding-bottom:0;padding-top:0}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child,.tox .tox-toolbar-overlord .tox-toolbar__primary{background-position:center top 39px}.tox .tox-editor-header>.tox-toolbar--scrolling,.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child{background-image:none}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#222f3e;background-position:center top 43px;background-size:calc(100% - 8px * 2) calc(100% - 51px);border:none;border-radius:3px;box-shadow:0 0 2px 0 rgba(42,55,70,.2),0 4px 8px 0 rgba(42,55,70,.15);padding:4px 0}.tox-pop .tox-pop__dialog .tox-toolbar{background-position:center top 43px;background-size:calc(100% - 4px * 2) calc(100% - 51px);padding:4px 0}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #000}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #000}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#3d546f;border-radius:3px;box-shadow:0 2px 4px rgba(42,55,70,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #3d546f;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #3d546f;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #3d546f;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #3d546f;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #000;border-radius:3px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #000;border-radius:3px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{background-color:none;padding:0}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header{border-top:none;box-shadow:none}.tox.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25);padding:0}.tox.tox.tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header{box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-pop{box-shadow:none}.tox .tox-split-button,.tox .tox-tbtn,.tox .tox-tbtn--select{margin:2px 0 3px 0}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e!important}.tox .tox-menubar+.tox-toolbar-overlord{border-top:none}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #000;margin-top:-1px}.tox.tox-tinymce-aux .tox-toolbar__overflow{border:1px solid #000;padding:0}.tox:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #000}.tox .tox-toolbar__group{padding:0 4px 0 4px}.tox .tox-collection__item{border-radius:0;cursor:pointer}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){color:#fff;text-decoration:underline}.tox .tox-statusbar__branding svg{vertical-align:-.25em}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox .tox-statusbar__resize-handle{padding-bottom:0;padding-right:0}
diff --git a/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css b/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css
new file mode 100644
index 00000000..25b0a371
--- /dev/null
+++ b/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css
@@ -0,0 +1,30 @@
+body.tox-dialog__disable-scroll {
+ overflow: hidden;
+}
+.tox-fullscreen {
+ border: 0;
+ height: 100%;
+ margin: 0;
+ overflow: hidden;
+ overscroll-behavior: none;
+ padding: 0;
+ touch-action: pinch-zoom;
+ width: 100%;
+}
+.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {
+ display: none;
+}
+.tox.tox-tinymce.tox-fullscreen,
+.tox-shadowhost.tox-fullscreen {
+ left: 0;
+ position: fixed;
+ top: 0;
+ z-index: 1200;
+}
+.tox.tox-tinymce.tox-fullscreen {
+ background-color: transparent;
+}
+.tox-fullscreen .tox.tox-tinymce-aux,
+.tox-fullscreen ~ .tox.tox-tinymce-aux {
+ z-index: 1201;
+}
diff --git a/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css b/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css
new file mode 100644
index 00000000..8745951a
--- /dev/null
+++ b/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css
@@ -0,0 +1 @@
+body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}
diff --git a/public/tinymce/skins/ui/tinymce-5/content.css b/public/tinymce/skins/ui/tinymce-5/content.css
new file mode 100644
index 00000000..d6d40ce5
--- /dev/null
+++ b/public/tinymce/skins/ui/tinymce-5/content.css
@@ -0,0 +1,730 @@
+.mce-content-body .mce-item-anchor {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+}
+.mce-content-body .mce-item-anchor:empty {
+ cursor: default;
+ display: inline-block;
+ height: 12px !important;
+ padding: 0 2px;
+ -webkit-user-modify: read-only;
+ -moz-user-modify: read-only;
+ -webkit-user-select: all;
+ -moz-user-select: all;
+ user-select: all;
+ width: 8px !important;
+}
+.mce-content-body .mce-item-anchor:not(:empty) {
+ background-position-x: 2px;
+ display: inline-block;
+ padding-left: 12px;
+}
+.mce-content-body .mce-item-anchor[data-mce-selected] {
+ outline-offset: 1px;
+}
+.tox-comments-visible .tox-comment {
+ background-color: #fff0b7;
+}
+.tox-comments-visible .tox-comment[data-mce-annotation-active="true"]:not([data-mce-selected="inline-boundary"]) {
+ background-color: #ffe168;
+}
+.tox-checklist > li:not(.tox-checklist--hidden) {
+ list-style: none;
+ margin: 0.25em 0;
+}
+.tox-checklist > li:not(.tox-checklist--hidden)::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+ cursor: pointer;
+ height: 1em;
+ margin-left: -1.5em;
+ margin-top: 0.125em;
+ position: absolute;
+ width: 1em;
+}
+.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+}
+[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {
+ margin-left: 0;
+ margin-right: -1.5em;
+}
+/* stylelint-disable */
+/* http://prismjs.com/ */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ color: black;
+ background: none;
+ text-shadow: 0 1px white;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ font-size: 1em;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+ -moz-tab-size: 4;
+ tab-size: 4;
+ -webkit-hyphens: none;
+ hyphens: none;
+}
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+@media print {
+ code[class*="language-"],
+ pre[class*="language-"] {
+ text-shadow: none;
+ }
+}
+/* Code blocks */
+pre[class*="language-"] {
+ padding: 1em;
+ margin: 0.5em 0;
+ overflow: auto;
+}
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+ background: #f5f2f0;
+}
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+ padding: 0.1em;
+ border-radius: 0.3em;
+ white-space: normal;
+}
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: slategray;
+}
+.token.punctuation {
+ color: #999;
+}
+.token.namespace {
+ opacity: 0.7;
+}
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+ color: #905;
+}
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+ color: #690;
+}
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+ color: #9a6e3a;
+ /* This background color was intended by the author of this theme. */
+ background: hsla(0, 0%, 100%, 0.5);
+}
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+ color: #07a;
+}
+.token.function,
+.token.class-name {
+ color: #DD4A68;
+}
+.token.regex,
+.token.important,
+.token.variable {
+ color: #e90;
+}
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+.token.italic {
+ font-style: italic;
+}
+.token.entity {
+ cursor: help;
+}
+/* stylelint-enable */
+.mce-content-body {
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+.mce-content-body .mce-visual-caret {
+ background-color: black;
+ background-color: currentColor;
+ position: absolute;
+}
+.mce-content-body .mce-visual-caret-hidden {
+ display: none;
+}
+.mce-content-body *[data-mce-caret] {
+ left: -1000px;
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ right: auto;
+ top: 0;
+}
+.mce-content-body .mce-offscreen-selection {
+ left: -2000000px;
+ max-width: 1000000px;
+ position: absolute;
+}
+.mce-content-body *[contentEditable=false] {
+ cursor: default;
+}
+.mce-content-body *[contentEditable=true] {
+ cursor: text;
+}
+.tox-cursor-format-painter {
+ cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default;
+}
+.mce-content-body figure.align-left {
+ float: left;
+}
+.mce-content-body figure.align-right {
+ float: right;
+}
+.mce-content-body figure.image.align-center {
+ display: table;
+ margin-left: auto;
+ margin-right: auto;
+}
+.mce-preview-object {
+ border: 1px solid gray;
+ display: inline-block;
+ line-height: 0;
+ margin: 0 2px 0 2px;
+ position: relative;
+}
+.mce-preview-object .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-preview-object[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.mce-object {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+ border: 1px dashed #aaa;
+}
+.mce-pagebreak {
+ border: 1px dashed #aaa;
+ cursor: default;
+ display: block;
+ height: 5px;
+ margin-top: 15px;
+ page-break-before: always;
+ width: 100%;
+}
+@media print {
+ .mce-pagebreak {
+ border: 0;
+ }
+}
+.tiny-pageembed .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tiny-pageembed[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.tiny-pageembed {
+ display: inline-block;
+ position: relative;
+}
+.tiny-pageembed--21by9,
+.tiny-pageembed--16by9,
+.tiny-pageembed--4by3,
+.tiny-pageembed--1by1 {
+ display: block;
+ overflow: hidden;
+ padding: 0;
+ position: relative;
+ width: 100%;
+}
+.tiny-pageembed--21by9 {
+ padding-top: 42.857143%;
+}
+.tiny-pageembed--16by9 {
+ padding-top: 56.25%;
+}
+.tiny-pageembed--4by3 {
+ padding-top: 75%;
+}
+.tiny-pageembed--1by1 {
+ padding-top: 100%;
+}
+.tiny-pageembed--21by9 iframe,
+.tiny-pageembed--16by9 iframe,
+.tiny-pageembed--4by3 iframe,
+.tiny-pageembed--1by1 iframe {
+ border: 0;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-content-body[data-mce-placeholder] {
+ position: relative;
+}
+.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ color: rgba(34, 47, 62, 0.7);
+ content: attr(data-mce-placeholder);
+ position: absolute;
+}
+.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ left: 1px;
+}
+.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {
+ right: 1px;
+}
+.mce-content-body div.mce-resizehandle {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+ z-index: 1298;
+}
+.mce-content-body div.mce-resizehandle:hover {
+ background-color: #4099ff;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(1) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(2) {
+ cursor: nesw-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(3) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(4) {
+ cursor: nesw-resize;
+}
+.mce-content-body .mce-resize-backdrop {
+ z-index: 10000;
+}
+.mce-content-body .mce-clonedresizable {
+ cursor: default;
+ opacity: 0.5;
+ outline: 1px dashed black;
+ position: absolute;
+ z-index: 10001;
+}
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns th,
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns td {
+ border: 0;
+}
+.mce-content-body .mce-resize-helper {
+ background: #555;
+ background: rgba(0, 0, 0, 0.75);
+ border: 1px;
+ border-radius: 3px;
+ color: white;
+ display: none;
+ font-family: sans-serif;
+ font-size: 12px;
+ line-height: 14px;
+ margin: 5px 10px;
+ padding: 5px;
+ position: absolute;
+ white-space: nowrap;
+ z-index: 10002;
+}
+.tox-rtc-user-selection {
+ position: relative;
+}
+.tox-rtc-user-cursor {
+ bottom: 0;
+ cursor: default;
+ position: absolute;
+ top: 0;
+ width: 2px;
+}
+.tox-rtc-user-cursor::before {
+ background-color: inherit;
+ border-radius: 50%;
+ content: '';
+ display: block;
+ height: 8px;
+ position: absolute;
+ right: -3px;
+ top: -3px;
+ width: 8px;
+}
+.tox-rtc-user-cursor:hover::after {
+ background-color: inherit;
+ border-radius: 100px;
+ box-sizing: border-box;
+ color: #fff;
+ content: attr(data-user);
+ display: block;
+ font-size: 12px;
+ font-weight: bold;
+ left: -5px;
+ min-height: 8px;
+ min-width: 8px;
+ padding: 0 12px;
+ position: absolute;
+ top: -11px;
+ white-space: nowrap;
+ z-index: 1000;
+}
+.tox-rtc-user-selection--1 .tox-rtc-user-cursor {
+ background-color: #2dc26b;
+}
+.tox-rtc-user-selection--2 .tox-rtc-user-cursor {
+ background-color: #e03e2d;
+}
+.tox-rtc-user-selection--3 .tox-rtc-user-cursor {
+ background-color: #f1c40f;
+}
+.tox-rtc-user-selection--4 .tox-rtc-user-cursor {
+ background-color: #3598db;
+}
+.tox-rtc-user-selection--5 .tox-rtc-user-cursor {
+ background-color: #b96ad9;
+}
+.tox-rtc-user-selection--6 .tox-rtc-user-cursor {
+ background-color: #e67e23;
+}
+.tox-rtc-user-selection--7 .tox-rtc-user-cursor {
+ background-color: #aaa69d;
+}
+.tox-rtc-user-selection--8 .tox-rtc-user-cursor {
+ background-color: #f368e0;
+}
+.tox-rtc-remote-image {
+ background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;
+ border: 1px solid #ccc;
+ min-height: 240px;
+ min-width: 320px;
+}
+.mce-match-marker {
+ background: #aaa;
+ color: #fff;
+}
+.mce-match-marker-selected {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::-moz-selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-content-body img[data-mce-selected],
+.mce-content-body video[data-mce-selected],
+.mce-content-body audio[data-mce-selected],
+.mce-content-body object[data-mce-selected],
+.mce-content-body embed[data-mce-selected],
+.mce-content-body table[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body hr[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+ outline-offset: 1px;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false][data-mce-selected] {
+ cursor: not-allowed;
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,
+.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {
+ outline: none;
+}
+.mce-content-body *[data-mce-selected="inline-boundary"] {
+ background-color: #b4d7ff;
+}
+.mce-content-body .mce-edit-focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body td[data-mce-selected],
+.mce-content-body th[data-mce-selected] {
+ position: relative;
+}
+.mce-content-body td[data-mce-selected]::-moz-selection,
+.mce-content-body th[data-mce-selected]::-moz-selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected]::selection,
+.mce-content-body th[data-mce-selected]::selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected] *,
+.mce-content-body th[data-mce-selected] * {
+ outline: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.mce-content-body td[data-mce-selected]::after,
+.mce-content-body th[data-mce-selected]::after {
+ background-color: rgba(180, 215, 255, 0.7);
+ border: 1px solid rgba(180, 215, 255, 0.7);
+ bottom: -1px;
+ content: '';
+ left: -1px;
+ mix-blend-mode: multiply;
+ position: absolute;
+ right: -1px;
+ top: -1px;
+}
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+ .mce-content-body td[data-mce-selected]::after,
+ .mce-content-body th[data-mce-selected]::after {
+ border-color: rgba(0, 84, 180, 0.7);
+ }
+}
+.mce-content-body img::-moz-selection {
+ background: none;
+}
+.mce-content-body img::selection {
+ background: none;
+}
+.ephox-snooker-resizer-bar {
+ background-color: #b4d7ff;
+ opacity: 0;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.ephox-snooker-resizer-cols {
+ cursor: col-resize;
+}
+.ephox-snooker-resizer-rows {
+ cursor: row-resize;
+}
+.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {
+ opacity: 1;
+}
+.mce-spellchecker-word {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+ height: 2rem;
+}
+.mce-spellchecker-grammar {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+}
+.mce-toc {
+ border: 1px solid gray;
+}
+.mce-toc h2 {
+ margin: 4px;
+}
+.mce-toc li {
+ list-style-type: none;
+}
+table[style*="border-width: 0px"],
+.mce-item-table:not([border]),
+.mce-item-table[border="0"],
+table[style*="border-width: 0px"] td,
+.mce-item-table:not([border]) td,
+.mce-item-table[border="0"] td,
+table[style*="border-width: 0px"] th,
+.mce-item-table:not([border]) th,
+.mce-item-table[border="0"] th,
+table[style*="border-width: 0px"] caption,
+.mce-item-table:not([border]) caption,
+.mce-item-table[border="0"] caption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks p,
+.mce-visualblocks h1,
+.mce-visualblocks h2,
+.mce-visualblocks h3,
+.mce-visualblocks h4,
+.mce-visualblocks h5,
+.mce-visualblocks h6,
+.mce-visualblocks div:not([data-mce-bogus]),
+.mce-visualblocks section,
+.mce-visualblocks article,
+.mce-visualblocks blockquote,
+.mce-visualblocks address,
+.mce-visualblocks pre,
+.mce-visualblocks figure,
+.mce-visualblocks figcaption,
+.mce-visualblocks hgroup,
+.mce-visualblocks aside,
+.mce-visualblocks ul,
+.mce-visualblocks ol,
+.mce-visualblocks dl {
+ background-repeat: no-repeat;
+ border: 1px dashed #bbb;
+ margin-left: 3px;
+ padding-top: 10px;
+}
+.mce-visualblocks p {
+ background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
+}
+.mce-visualblocks h1 {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
+}
+.mce-visualblocks h2 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
+}
+.mce-visualblocks h3 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
+}
+.mce-visualblocks h4 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
+}
+.mce-visualblocks h5 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
+}
+.mce-visualblocks h6 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
+}
+.mce-visualblocks div:not([data-mce-bogus]) {
+ background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
+}
+.mce-visualblocks section {
+ background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
+}
+.mce-visualblocks article {
+ background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
+}
+.mce-visualblocks blockquote {
+ background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
+}
+.mce-visualblocks address {
+ background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
+}
+.mce-visualblocks pre {
+ background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
+}
+.mce-visualblocks figure {
+ background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
+}
+.mce-visualblocks figcaption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks hgroup {
+ background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
+}
+.mce-visualblocks aside {
+ background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
+}
+.mce-visualblocks ul {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
+}
+.mce-visualblocks ol {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
+}
+.mce-visualblocks dl {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
+}
+.mce-visualblocks:not([dir=rtl]) p,
+.mce-visualblocks:not([dir=rtl]) h1,
+.mce-visualblocks:not([dir=rtl]) h2,
+.mce-visualblocks:not([dir=rtl]) h3,
+.mce-visualblocks:not([dir=rtl]) h4,
+.mce-visualblocks:not([dir=rtl]) h5,
+.mce-visualblocks:not([dir=rtl]) h6,
+.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),
+.mce-visualblocks:not([dir=rtl]) section,
+.mce-visualblocks:not([dir=rtl]) article,
+.mce-visualblocks:not([dir=rtl]) blockquote,
+.mce-visualblocks:not([dir=rtl]) address,
+.mce-visualblocks:not([dir=rtl]) pre,
+.mce-visualblocks:not([dir=rtl]) figure,
+.mce-visualblocks:not([dir=rtl]) figcaption,
+.mce-visualblocks:not([dir=rtl]) hgroup,
+.mce-visualblocks:not([dir=rtl]) aside,
+.mce-visualblocks:not([dir=rtl]) ul,
+.mce-visualblocks:not([dir=rtl]) ol,
+.mce-visualblocks:not([dir=rtl]) dl {
+ margin-left: 3px;
+}
+.mce-visualblocks[dir=rtl] p,
+.mce-visualblocks[dir=rtl] h1,
+.mce-visualblocks[dir=rtl] h2,
+.mce-visualblocks[dir=rtl] h3,
+.mce-visualblocks[dir=rtl] h4,
+.mce-visualblocks[dir=rtl] h5,
+.mce-visualblocks[dir=rtl] h6,
+.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),
+.mce-visualblocks[dir=rtl] section,
+.mce-visualblocks[dir=rtl] article,
+.mce-visualblocks[dir=rtl] blockquote,
+.mce-visualblocks[dir=rtl] address,
+.mce-visualblocks[dir=rtl] pre,
+.mce-visualblocks[dir=rtl] figure,
+.mce-visualblocks[dir=rtl] figcaption,
+.mce-visualblocks[dir=rtl] hgroup,
+.mce-visualblocks[dir=rtl] aside,
+.mce-visualblocks[dir=rtl] ul,
+.mce-visualblocks[dir=rtl] ol,
+.mce-visualblocks[dir=rtl] dl {
+ background-position-x: right;
+ margin-right: 3px;
+}
+.mce-nbsp,
+.mce-shy {
+ background: #aaa;
+}
+.mce-shy::after {
+ content: '-';
+}
+body {
+ font-family: sans-serif;
+}
+table {
+ border-collapse: collapse;
+}
diff --git a/public/tinymce/skins/ui/tinymce-5/content.inline.css b/public/tinymce/skins/ui/tinymce-5/content.inline.css
new file mode 100644
index 00000000..040100bf
--- /dev/null
+++ b/public/tinymce/skins/ui/tinymce-5/content.inline.css
@@ -0,0 +1,724 @@
+.mce-content-body .mce-item-anchor {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+}
+.mce-content-body .mce-item-anchor:empty {
+ cursor: default;
+ display: inline-block;
+ height: 12px !important;
+ padding: 0 2px;
+ -webkit-user-modify: read-only;
+ -moz-user-modify: read-only;
+ -webkit-user-select: all;
+ -moz-user-select: all;
+ user-select: all;
+ width: 8px !important;
+}
+.mce-content-body .mce-item-anchor:not(:empty) {
+ background-position-x: 2px;
+ display: inline-block;
+ padding-left: 12px;
+}
+.mce-content-body .mce-item-anchor[data-mce-selected] {
+ outline-offset: 1px;
+}
+.tox-comments-visible .tox-comment {
+ background-color: #fff0b7;
+}
+.tox-comments-visible .tox-comment[data-mce-annotation-active="true"]:not([data-mce-selected="inline-boundary"]) {
+ background-color: #ffe168;
+}
+.tox-checklist > li:not(.tox-checklist--hidden) {
+ list-style: none;
+ margin: 0.25em 0;
+}
+.tox-checklist > li:not(.tox-checklist--hidden)::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+ cursor: pointer;
+ height: 1em;
+ margin-left: -1.5em;
+ margin-top: 0.125em;
+ position: absolute;
+ width: 1em;
+}
+.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+}
+[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {
+ margin-left: 0;
+ margin-right: -1.5em;
+}
+/* stylelint-disable */
+/* http://prismjs.com/ */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ color: black;
+ background: none;
+ text-shadow: 0 1px white;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ font-size: 1em;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+ -moz-tab-size: 4;
+ tab-size: 4;
+ -webkit-hyphens: none;
+ hyphens: none;
+}
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+@media print {
+ code[class*="language-"],
+ pre[class*="language-"] {
+ text-shadow: none;
+ }
+}
+/* Code blocks */
+pre[class*="language-"] {
+ padding: 1em;
+ margin: 0.5em 0;
+ overflow: auto;
+}
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+ background: #f5f2f0;
+}
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+ padding: 0.1em;
+ border-radius: 0.3em;
+ white-space: normal;
+}
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: slategray;
+}
+.token.punctuation {
+ color: #999;
+}
+.token.namespace {
+ opacity: 0.7;
+}
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+ color: #905;
+}
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+ color: #690;
+}
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+ color: #9a6e3a;
+ /* This background color was intended by the author of this theme. */
+ background: hsla(0, 0%, 100%, 0.5);
+}
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+ color: #07a;
+}
+.token.function,
+.token.class-name {
+ color: #DD4A68;
+}
+.token.regex,
+.token.important,
+.token.variable {
+ color: #e90;
+}
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+.token.italic {
+ font-style: italic;
+}
+.token.entity {
+ cursor: help;
+}
+/* stylelint-enable */
+.mce-content-body {
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+.mce-content-body .mce-visual-caret {
+ background-color: black;
+ background-color: currentColor;
+ position: absolute;
+}
+.mce-content-body .mce-visual-caret-hidden {
+ display: none;
+}
+.mce-content-body *[data-mce-caret] {
+ left: -1000px;
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ right: auto;
+ top: 0;
+}
+.mce-content-body .mce-offscreen-selection {
+ left: -2000000px;
+ max-width: 1000000px;
+ position: absolute;
+}
+.mce-content-body *[contentEditable=false] {
+ cursor: default;
+}
+.mce-content-body *[contentEditable=true] {
+ cursor: text;
+}
+.tox-cursor-format-painter {
+ cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default;
+}
+.mce-content-body figure.align-left {
+ float: left;
+}
+.mce-content-body figure.align-right {
+ float: right;
+}
+.mce-content-body figure.image.align-center {
+ display: table;
+ margin-left: auto;
+ margin-right: auto;
+}
+.mce-preview-object {
+ border: 1px solid gray;
+ display: inline-block;
+ line-height: 0;
+ margin: 0 2px 0 2px;
+ position: relative;
+}
+.mce-preview-object .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-preview-object[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.mce-object {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+ border: 1px dashed #aaa;
+}
+.mce-pagebreak {
+ border: 1px dashed #aaa;
+ cursor: default;
+ display: block;
+ height: 5px;
+ margin-top: 15px;
+ page-break-before: always;
+ width: 100%;
+}
+@media print {
+ .mce-pagebreak {
+ border: 0;
+ }
+}
+.tiny-pageembed .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tiny-pageembed[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.tiny-pageembed {
+ display: inline-block;
+ position: relative;
+}
+.tiny-pageembed--21by9,
+.tiny-pageembed--16by9,
+.tiny-pageembed--4by3,
+.tiny-pageembed--1by1 {
+ display: block;
+ overflow: hidden;
+ padding: 0;
+ position: relative;
+ width: 100%;
+}
+.tiny-pageembed--21by9 {
+ padding-top: 42.857143%;
+}
+.tiny-pageembed--16by9 {
+ padding-top: 56.25%;
+}
+.tiny-pageembed--4by3 {
+ padding-top: 75%;
+}
+.tiny-pageembed--1by1 {
+ padding-top: 100%;
+}
+.tiny-pageembed--21by9 iframe,
+.tiny-pageembed--16by9 iframe,
+.tiny-pageembed--4by3 iframe,
+.tiny-pageembed--1by1 iframe {
+ border: 0;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-content-body[data-mce-placeholder] {
+ position: relative;
+}
+.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ color: rgba(34, 47, 62, 0.7);
+ content: attr(data-mce-placeholder);
+ position: absolute;
+}
+.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ left: 1px;
+}
+.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {
+ right: 1px;
+}
+.mce-content-body div.mce-resizehandle {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+ z-index: 1298;
+}
+.mce-content-body div.mce-resizehandle:hover {
+ background-color: #4099ff;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(1) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(2) {
+ cursor: nesw-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(3) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(4) {
+ cursor: nesw-resize;
+}
+.mce-content-body .mce-resize-backdrop {
+ z-index: 10000;
+}
+.mce-content-body .mce-clonedresizable {
+ cursor: default;
+ opacity: 0.5;
+ outline: 1px dashed black;
+ position: absolute;
+ z-index: 10001;
+}
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns th,
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns td {
+ border: 0;
+}
+.mce-content-body .mce-resize-helper {
+ background: #555;
+ background: rgba(0, 0, 0, 0.75);
+ border: 1px;
+ border-radius: 3px;
+ color: white;
+ display: none;
+ font-family: sans-serif;
+ font-size: 12px;
+ line-height: 14px;
+ margin: 5px 10px;
+ padding: 5px;
+ position: absolute;
+ white-space: nowrap;
+ z-index: 10002;
+}
+.tox-rtc-user-selection {
+ position: relative;
+}
+.tox-rtc-user-cursor {
+ bottom: 0;
+ cursor: default;
+ position: absolute;
+ top: 0;
+ width: 2px;
+}
+.tox-rtc-user-cursor::before {
+ background-color: inherit;
+ border-radius: 50%;
+ content: '';
+ display: block;
+ height: 8px;
+ position: absolute;
+ right: -3px;
+ top: -3px;
+ width: 8px;
+}
+.tox-rtc-user-cursor:hover::after {
+ background-color: inherit;
+ border-radius: 100px;
+ box-sizing: border-box;
+ color: #fff;
+ content: attr(data-user);
+ display: block;
+ font-size: 12px;
+ font-weight: bold;
+ left: -5px;
+ min-height: 8px;
+ min-width: 8px;
+ padding: 0 12px;
+ position: absolute;
+ top: -11px;
+ white-space: nowrap;
+ z-index: 1000;
+}
+.tox-rtc-user-selection--1 .tox-rtc-user-cursor {
+ background-color: #2dc26b;
+}
+.tox-rtc-user-selection--2 .tox-rtc-user-cursor {
+ background-color: #e03e2d;
+}
+.tox-rtc-user-selection--3 .tox-rtc-user-cursor {
+ background-color: #f1c40f;
+}
+.tox-rtc-user-selection--4 .tox-rtc-user-cursor {
+ background-color: #3598db;
+}
+.tox-rtc-user-selection--5 .tox-rtc-user-cursor {
+ background-color: #b96ad9;
+}
+.tox-rtc-user-selection--6 .tox-rtc-user-cursor {
+ background-color: #e67e23;
+}
+.tox-rtc-user-selection--7 .tox-rtc-user-cursor {
+ background-color: #aaa69d;
+}
+.tox-rtc-user-selection--8 .tox-rtc-user-cursor {
+ background-color: #f368e0;
+}
+.tox-rtc-remote-image {
+ background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;
+ border: 1px solid #ccc;
+ min-height: 240px;
+ min-width: 320px;
+}
+.mce-match-marker {
+ background: #aaa;
+ color: #fff;
+}
+.mce-match-marker-selected {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::-moz-selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-content-body img[data-mce-selected],
+.mce-content-body video[data-mce-selected],
+.mce-content-body audio[data-mce-selected],
+.mce-content-body object[data-mce-selected],
+.mce-content-body embed[data-mce-selected],
+.mce-content-body table[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body hr[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+ outline-offset: 1px;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false][data-mce-selected] {
+ cursor: not-allowed;
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,
+.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {
+ outline: none;
+}
+.mce-content-body *[data-mce-selected="inline-boundary"] {
+ background-color: #b4d7ff;
+}
+.mce-content-body .mce-edit-focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body td[data-mce-selected],
+.mce-content-body th[data-mce-selected] {
+ position: relative;
+}
+.mce-content-body td[data-mce-selected]::-moz-selection,
+.mce-content-body th[data-mce-selected]::-moz-selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected]::selection,
+.mce-content-body th[data-mce-selected]::selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected] *,
+.mce-content-body th[data-mce-selected] * {
+ outline: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.mce-content-body td[data-mce-selected]::after,
+.mce-content-body th[data-mce-selected]::after {
+ background-color: rgba(180, 215, 255, 0.7);
+ border: 1px solid rgba(180, 215, 255, 0.7);
+ bottom: -1px;
+ content: '';
+ left: -1px;
+ mix-blend-mode: multiply;
+ position: absolute;
+ right: -1px;
+ top: -1px;
+}
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+ .mce-content-body td[data-mce-selected]::after,
+ .mce-content-body th[data-mce-selected]::after {
+ border-color: rgba(0, 84, 180, 0.7);
+ }
+}
+.mce-content-body img::-moz-selection {
+ background: none;
+}
+.mce-content-body img::selection {
+ background: none;
+}
+.ephox-snooker-resizer-bar {
+ background-color: #b4d7ff;
+ opacity: 0;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.ephox-snooker-resizer-cols {
+ cursor: col-resize;
+}
+.ephox-snooker-resizer-rows {
+ cursor: row-resize;
+}
+.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {
+ opacity: 1;
+}
+.mce-spellchecker-word {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+ height: 2rem;
+}
+.mce-spellchecker-grammar {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+}
+.mce-toc {
+ border: 1px solid gray;
+}
+.mce-toc h2 {
+ margin: 4px;
+}
+.mce-toc li {
+ list-style-type: none;
+}
+table[style*="border-width: 0px"],
+.mce-item-table:not([border]),
+.mce-item-table[border="0"],
+table[style*="border-width: 0px"] td,
+.mce-item-table:not([border]) td,
+.mce-item-table[border="0"] td,
+table[style*="border-width: 0px"] th,
+.mce-item-table:not([border]) th,
+.mce-item-table[border="0"] th,
+table[style*="border-width: 0px"] caption,
+.mce-item-table:not([border]) caption,
+.mce-item-table[border="0"] caption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks p,
+.mce-visualblocks h1,
+.mce-visualblocks h2,
+.mce-visualblocks h3,
+.mce-visualblocks h4,
+.mce-visualblocks h5,
+.mce-visualblocks h6,
+.mce-visualblocks div:not([data-mce-bogus]),
+.mce-visualblocks section,
+.mce-visualblocks article,
+.mce-visualblocks blockquote,
+.mce-visualblocks address,
+.mce-visualblocks pre,
+.mce-visualblocks figure,
+.mce-visualblocks figcaption,
+.mce-visualblocks hgroup,
+.mce-visualblocks aside,
+.mce-visualblocks ul,
+.mce-visualblocks ol,
+.mce-visualblocks dl {
+ background-repeat: no-repeat;
+ border: 1px dashed #bbb;
+ margin-left: 3px;
+ padding-top: 10px;
+}
+.mce-visualblocks p {
+ background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
+}
+.mce-visualblocks h1 {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
+}
+.mce-visualblocks h2 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
+}
+.mce-visualblocks h3 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
+}
+.mce-visualblocks h4 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
+}
+.mce-visualblocks h5 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
+}
+.mce-visualblocks h6 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
+}
+.mce-visualblocks div:not([data-mce-bogus]) {
+ background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
+}
+.mce-visualblocks section {
+ background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
+}
+.mce-visualblocks article {
+ background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
+}
+.mce-visualblocks blockquote {
+ background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
+}
+.mce-visualblocks address {
+ background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
+}
+.mce-visualblocks pre {
+ background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
+}
+.mce-visualblocks figure {
+ background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
+}
+.mce-visualblocks figcaption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks hgroup {
+ background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
+}
+.mce-visualblocks aside {
+ background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
+}
+.mce-visualblocks ul {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
+}
+.mce-visualblocks ol {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
+}
+.mce-visualblocks dl {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
+}
+.mce-visualblocks:not([dir=rtl]) p,
+.mce-visualblocks:not([dir=rtl]) h1,
+.mce-visualblocks:not([dir=rtl]) h2,
+.mce-visualblocks:not([dir=rtl]) h3,
+.mce-visualblocks:not([dir=rtl]) h4,
+.mce-visualblocks:not([dir=rtl]) h5,
+.mce-visualblocks:not([dir=rtl]) h6,
+.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),
+.mce-visualblocks:not([dir=rtl]) section,
+.mce-visualblocks:not([dir=rtl]) article,
+.mce-visualblocks:not([dir=rtl]) blockquote,
+.mce-visualblocks:not([dir=rtl]) address,
+.mce-visualblocks:not([dir=rtl]) pre,
+.mce-visualblocks:not([dir=rtl]) figure,
+.mce-visualblocks:not([dir=rtl]) figcaption,
+.mce-visualblocks:not([dir=rtl]) hgroup,
+.mce-visualblocks:not([dir=rtl]) aside,
+.mce-visualblocks:not([dir=rtl]) ul,
+.mce-visualblocks:not([dir=rtl]) ol,
+.mce-visualblocks:not([dir=rtl]) dl {
+ margin-left: 3px;
+}
+.mce-visualblocks[dir=rtl] p,
+.mce-visualblocks[dir=rtl] h1,
+.mce-visualblocks[dir=rtl] h2,
+.mce-visualblocks[dir=rtl] h3,
+.mce-visualblocks[dir=rtl] h4,
+.mce-visualblocks[dir=rtl] h5,
+.mce-visualblocks[dir=rtl] h6,
+.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),
+.mce-visualblocks[dir=rtl] section,
+.mce-visualblocks[dir=rtl] article,
+.mce-visualblocks[dir=rtl] blockquote,
+.mce-visualblocks[dir=rtl] address,
+.mce-visualblocks[dir=rtl] pre,
+.mce-visualblocks[dir=rtl] figure,
+.mce-visualblocks[dir=rtl] figcaption,
+.mce-visualblocks[dir=rtl] hgroup,
+.mce-visualblocks[dir=rtl] aside,
+.mce-visualblocks[dir=rtl] ul,
+.mce-visualblocks[dir=rtl] ol,
+.mce-visualblocks[dir=rtl] dl {
+ background-position-x: right;
+ margin-right: 3px;
+}
+.mce-nbsp,
+.mce-shy {
+ background: #aaa;
+}
+.mce-shy::after {
+ content: '-';
+}
diff --git a/public/tinymce/skins/ui/tinymce-5/content.inline.min.css b/public/tinymce/skins/ui/tinymce-5/content.inline.min.css
new file mode 100644
index 00000000..d5f05d42
--- /dev/null
+++ b/public/tinymce/skins/ui/tinymce-5/content.inline.min.css
@@ -0,0 +1 @@
+.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center}.mce-content-body .mce-item-anchor:empty{cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor:not(:empty){background-position-x:2px;display:inline-block;padding-left:12px}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment[data-mce-annotation-active=true]:not([data-mce-selected=inline-boundary]){background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}
diff --git a/public/tinymce/skins/ui/tinymce-5/content.min.css b/public/tinymce/skins/ui/tinymce-5/content.min.css
new file mode 100644
index 00000000..e3c189c5
--- /dev/null
+++ b/public/tinymce/skins/ui/tinymce-5/content.min.css
@@ -0,0 +1 @@
+.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center}.mce-content-body .mce-item-anchor:empty{cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor:not(:empty){background-position-x:2px;display:inline-block;padding-left:12px}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment[data-mce-annotation-active=true]:not([data-mce-selected=inline-boundary]){background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:1298}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse}
diff --git a/public/tinymce/skins/ui/tinymce-5/skin.css b/public/tinymce/skins/ui/tinymce-5/skin.css
new file mode 100644
index 00000000..63cae4c1
--- /dev/null
+++ b/public/tinymce/skins/ui/tinymce-5/skin.css
@@ -0,0 +1,3119 @@
+.tox {
+ box-shadow: none;
+ box-sizing: content-box;
+ color: #222f3e;
+ cursor: auto;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: normal;
+ -webkit-tap-highlight-color: transparent;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ vertical-align: initial;
+ white-space: normal;
+}
+.tox *:not(svg):not(rect) {
+ box-sizing: inherit;
+ color: inherit;
+ cursor: inherit;
+ direction: inherit;
+ font-family: inherit;
+ font-size: inherit;
+ font-style: inherit;
+ font-weight: inherit;
+ line-height: inherit;
+ -webkit-tap-highlight-color: inherit;
+ text-align: inherit;
+ text-decoration: inherit;
+ text-shadow: inherit;
+ text-transform: inherit;
+ vertical-align: inherit;
+ white-space: inherit;
+}
+.tox *:not(svg):not(rect) {
+ /* stylelint-disable-line no-duplicate-selectors */
+ background: transparent;
+ border: 0;
+ box-shadow: none;
+ float: none;
+ height: auto;
+ margin: 0;
+ max-width: none;
+ outline: 0;
+ padding: 0;
+ position: static;
+ width: auto;
+}
+.tox:not([dir=rtl]) {
+ direction: ltr;
+ text-align: left;
+}
+.tox[dir=rtl] {
+ direction: rtl;
+ text-align: right;
+}
+.tox-tinymce {
+ border: 1px solid #cccccc;
+ border-radius: 0;
+ box-shadow: none;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ overflow: hidden;
+ position: relative;
+ visibility: inherit !important;
+}
+.tox.tox-tinymce-inline {
+ border: none;
+ box-shadow: none;
+ overflow: initial;
+}
+.tox.tox-tinymce-inline .tox-editor-container {
+ overflow: initial;
+}
+.tox.tox-tinymce-inline .tox-editor-header {
+ background-color: #fff;
+ border: 1px solid #cccccc;
+ border-radius: 0;
+ box-shadow: none;
+ overflow: hidden;
+}
+.tox-tinymce-aux {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ z-index: 1300;
+}
+.tox-tinymce *:focus,
+.tox-tinymce-aux *:focus {
+ outline: none;
+}
+button::-moz-focus-inner {
+ border: 0;
+}
+.tox[dir=rtl] .tox-icon--flip svg {
+ transform: rotateY(180deg);
+}
+.tox .accessibility-issue__header {
+ align-items: center;
+ display: flex;
+ margin-bottom: 4px;
+}
+.tox .accessibility-issue__description {
+ align-items: stretch;
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ display: flex;
+ justify-content: space-between;
+}
+.tox .accessibility-issue__description > div {
+ padding-bottom: 4px;
+}
+.tox .accessibility-issue__description > div > div {
+ align-items: center;
+ display: flex;
+ margin-bottom: 4px;
+}
+.tox .accessibility-issue__description > *:last-child:not(:only-child) {
+ border-color: #cccccc;
+ border-style: solid;
+}
+.tox .accessibility-issue__repair {
+ margin-top: 16px;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description {
+ background-color: rgba(32, 122, 183, 0.1);
+ border-color: rgba(32, 122, 183, 0.4);
+ color: #222f3e;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > *:last-child {
+ border-color: rgba(32, 122, 183, 0.4);
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 {
+ color: #207ab7;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg {
+ fill: #207ab7;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon {
+ color: #207ab7;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description {
+ background-color: rgba(255, 165, 0, 0.1);
+ border-color: rgba(255, 165, 0, 0.5);
+ color: #222f3e;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > *:last-child {
+ border-color: rgba(255, 165, 0, 0.5);
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 {
+ color: #cc8500;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg {
+ fill: #cc8500;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon {
+ color: #cc8500;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description {
+ background-color: rgba(204, 0, 0, 0.1);
+ border-color: rgba(204, 0, 0, 0.4);
+ color: #222f3e;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > *:last-child {
+ border-color: rgba(204, 0, 0, 0.4);
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 {
+ color: #c00;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg {
+ fill: #c00;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon {
+ color: #c00;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description {
+ background-color: rgba(120, 171, 70, 0.1);
+ border-color: rgba(120, 171, 70, 0.4);
+ color: #222f3e;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > *:last-child {
+ border-color: rgba(120, 171, 70, 0.4);
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 {
+ color: #78AB46;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg {
+ fill: #78AB46;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon {
+ color: #78AB46;
+}
+.tox .tox-dialog__body-content .accessibility-issue__header h1,
+.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 {
+ margin-top: 0;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) {
+ margin-left: auto;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description {
+ padding: 4px 4px 4px 8px;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description > *:last-child {
+ border-left-width: 1px;
+ padding-left: 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) {
+ margin-right: auto;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description {
+ padding: 4px 8px 4px 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description > *:last-child {
+ border-right-width: 1px;
+ padding-right: 4px;
+}
+.tox .tox-anchorbar {
+ display: flex;
+ flex: 0 0 auto;
+}
+.tox .tox-bar {
+ display: flex;
+ flex: 0 0 auto;
+}
+.tox .tox-button {
+ background-color: #207ab7;
+ background-image: none;
+ background-position: 0 0;
+ background-repeat: repeat;
+ border-color: #207ab7;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #fff;
+ cursor: pointer;
+ display: inline-block;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ line-height: 24px;
+ margin: 0;
+ outline: none;
+ padding: 4px 16px;
+ text-align: center;
+ text-decoration: none;
+ text-transform: none;
+ white-space: nowrap;
+}
+.tox .tox-button[disabled] {
+ background-color: #207ab7;
+ background-image: none;
+ border-color: #207ab7;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-button:focus:not(:disabled) {
+ background-color: #1c6ca1;
+ background-image: none;
+ border-color: #1c6ca1;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button:hover:not(:disabled) {
+ background-color: #1c6ca1;
+ background-image: none;
+ border-color: #1c6ca1;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button:active:not(:disabled) {
+ background-color: #185d8c;
+ background-image: none;
+ border-color: #185d8c;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--secondary {
+ background-color: #f0f0f0;
+ background-image: none;
+ background-position: 0 0;
+ background-repeat: repeat;
+ border-color: #f0f0f0;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ color: #222f3e;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ outline: none;
+ padding: 4px 16px;
+ text-decoration: none;
+ text-transform: none;
+}
+.tox .tox-button--secondary[disabled] {
+ background-color: #f0f0f0;
+ background-image: none;
+ border-color: #f0f0f0;
+ box-shadow: none;
+ color: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-button--secondary:focus:not(:disabled) {
+ background-color: #e3e3e3;
+ background-image: none;
+ border-color: #e3e3e3;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-button--secondary:hover:not(:disabled) {
+ background-color: #e3e3e3;
+ background-image: none;
+ border-color: #e3e3e3;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-button--secondary:active:not(:disabled) {
+ background-color: #d6d6d6;
+ background-image: none;
+ border-color: #d6d6d6;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-button--icon,
+.tox .tox-button.tox-button--icon,
+.tox .tox-button.tox-button--secondary.tox-button--icon {
+ padding: 4px;
+}
+.tox .tox-button--icon .tox-icon svg,
+.tox .tox-button.tox-button--icon .tox-icon svg,
+.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg {
+ display: block;
+ fill: currentColor;
+}
+.tox .tox-button-link {
+ background: 0;
+ border: none;
+ box-sizing: border-box;
+ cursor: pointer;
+ display: inline-block;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ font-weight: normal;
+ line-height: 1.3;
+ margin: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.tox .tox-button-link--sm {
+ font-size: 14px;
+}
+.tox .tox-button--naked {
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: unset;
+ color: #222f3e;
+}
+.tox .tox-button--naked[disabled] {
+ background-color: #f0f0f0;
+ border-color: #f0f0f0;
+ box-shadow: none;
+ color: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-button--naked:hover:not(:disabled) {
+ background-color: #e3e3e3;
+ border-color: #e3e3e3;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-button--naked:focus:not(:disabled) {
+ background-color: #e3e3e3;
+ border-color: #e3e3e3;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-button--naked:active:not(:disabled) {
+ background-color: #d6d6d6;
+ border-color: #d6d6d6;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-button--naked .tox-icon svg {
+ fill: currentColor;
+}
+.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) {
+ color: #222f3e;
+}
+.tox .tox-checkbox {
+ align-items: center;
+ border-radius: 3px;
+ cursor: pointer;
+ display: flex;
+ height: 36px;
+ min-width: 36px;
+}
+.tox .tox-checkbox__input {
+ /* Hide from view but visible to screen readers */
+ height: 1px;
+ overflow: hidden;
+ position: absolute;
+ top: auto;
+ width: 1px;
+}
+.tox .tox-checkbox__icons {
+ align-items: center;
+ border-radius: 3px;
+ box-shadow: 0 0 0 2px transparent;
+ box-sizing: content-box;
+ display: flex;
+ height: 24px;
+ justify-content: center;
+ padding: calc(4px - 1px);
+ width: 24px;
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: block;
+ fill: rgba(34, 47, 62, 0.3);
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ display: none;
+ fill: #207ab7;
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ display: none;
+ fill: #207ab7;
+}
+.tox .tox-checkbox--disabled {
+ color: rgba(34, 47, 62, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: none;
+}
+.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ display: block;
+}
+.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: none;
+}
+.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ display: block;
+}
+.tox input.tox-checkbox__input:focus + .tox-checkbox__icons {
+ border-radius: 3px;
+ box-shadow: inset 0 0 0 1px #207ab7;
+ padding: calc(4px - 1px);
+}
+.tox:not([dir=rtl]) .tox-checkbox__label {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-checkbox__input {
+ left: -10000px;
+}
+.tox:not([dir=rtl]) .tox-bar .tox-checkbox {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-checkbox__label {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-checkbox__input {
+ right: -10000px;
+}
+.tox[dir=rtl] .tox-bar .tox-checkbox {
+ margin-right: 4px;
+}
+.tox {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox .tox-collection--toolbar .tox-collection__group {
+ display: flex;
+ padding: 0;
+}
+.tox .tox-collection--grid .tox-collection__group {
+ display: flex;
+ flex-wrap: wrap;
+ max-height: 208px;
+ overflow-x: hidden;
+ overflow-y: auto;
+ padding: 0;
+}
+.tox .tox-collection--list .tox-collection__group {
+ border-bottom-width: 0;
+ border-color: #cccccc;
+ border-left-width: 0;
+ border-right-width: 0;
+ border-style: solid;
+ border-top-width: 1px;
+ padding: 4px 0;
+}
+.tox .tox-collection--list .tox-collection__group:first-child {
+ border-top-width: 0;
+}
+.tox .tox-collection__group-heading {
+ background-color: #e6e6e6;
+ color: rgba(34, 47, 62, 0.7);
+ cursor: default;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: normal;
+ margin-bottom: 4px;
+ margin-top: -4px;
+ padding: 4px 8px;
+ text-transform: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.tox .tox-collection__item {
+ align-items: center;
+ border-radius: 3px;
+ color: #222f3e;
+ display: flex;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+.tox .tox-collection--list .tox-collection__item {
+ padding: 4px 8px;
+}
+.tox .tox-collection--toolbar .tox-collection__item {
+ border-radius: 3px;
+ padding: 4px;
+}
+.tox .tox-collection--grid .tox-collection__item {
+ border-radius: 3px;
+ padding: 4px;
+}
+.tox .tox-collection--list .tox-collection__item--enabled {
+ background-color: #fff;
+ color: #222f3e;
+}
+.tox .tox-collection--list .tox-collection__item--active {
+ background-color: #dee0e2;
+}
+.tox .tox-collection--toolbar .tox-collection__item--enabled {
+ background-color: #c8cbcf;
+ color: #222f3e;
+}
+.tox .tox-collection--toolbar .tox-collection__item--active {
+ background-color: #dee0e2;
+}
+.tox .tox-collection--grid .tox-collection__item--enabled {
+ background-color: #c8cbcf;
+ color: #222f3e;
+}
+.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ background-color: #dee0e2;
+ color: #222f3e;
+}
+.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ color: #222f3e;
+}
+.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ color: #222f3e;
+}
+.tox .tox-collection__item-icon,
+.tox .tox-collection__item-checkmark {
+ align-items: center;
+ display: flex;
+ height: 24px;
+ justify-content: center;
+ width: 24px;
+}
+.tox .tox-collection__item-icon svg,
+.tox .tox-collection__item-checkmark svg {
+ fill: currentColor;
+}
+.tox .tox-collection--toolbar-lg .tox-collection__item-icon {
+ height: 48px;
+ width: 48px;
+}
+.tox .tox-collection__item-label {
+ color: currentColor;
+ display: inline-block;
+ flex: 1;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 24px;
+ text-transform: none;
+ word-break: break-all;
+}
+.tox .tox-collection__item-accessory {
+ color: rgba(34, 47, 62, 0.7);
+ display: inline-block;
+ font-size: 14px;
+ height: 24px;
+ line-height: 24px;
+ text-transform: none;
+}
+.tox .tox-collection__item-caret {
+ align-items: center;
+ display: flex;
+ min-height: 24px;
+}
+.tox .tox-collection__item-caret::after {
+ content: '';
+ font-size: 0;
+ min-height: inherit;
+}
+.tox .tox-collection__item-caret svg {
+ fill: #222f3e;
+}
+.tox .tox-collection__item--state-disabled {
+ background-color: transparent;
+ color: rgba(34, 47, 62, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg {
+ display: none;
+}
+.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory + .tox-collection__item-checkmark {
+ display: none;
+}
+.tox .tox-collection--horizontal {
+ background-color: #fff;
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15);
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: nowrap;
+ margin-bottom: 0;
+ overflow-x: auto;
+ padding: 0;
+}
+.tox .tox-collection--horizontal .tox-collection__group {
+ align-items: center;
+ display: flex;
+ flex-wrap: nowrap;
+ margin: 0;
+ padding: 0 4px;
+}
+.tox .tox-collection--horizontal .tox-collection__item {
+ height: 34px;
+ margin: 3px 0 2px 0;
+ padding: 0 4px;
+}
+.tox .tox-collection--horizontal .tox-collection__item-label {
+ white-space: nowrap;
+}
+.tox .tox-collection--horizontal .tox-collection__item-caret {
+ margin-left: 4px;
+}
+.tox .tox-collection__item-container {
+ display: flex;
+}
+.tox .tox-collection__item-container--row {
+ align-items: center;
+ flex: 1 1 auto;
+ flex-direction: row;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--align-left {
+ margin-right: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--align-right {
+ justify-content: flex-end;
+ margin-left: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top {
+ align-items: flex-start;
+ margin-bottom: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle {
+ align-items: center;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom {
+ align-items: flex-end;
+ margin-top: auto;
+}
+.tox .tox-collection__item-container--column {
+ align-self: center;
+ flex: 1 1 auto;
+ flex-direction: column;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--align-left {
+ align-items: flex-start;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--align-right {
+ align-items: flex-end;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top {
+ align-self: flex-start;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle {
+ align-self: center;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom {
+ align-self: flex-end;
+}
+.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) {
+ border-right: 1px solid #cccccc;
+}
+.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > *:not(:first-child) {
+ margin-left: 8px;
+}
+.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-collection__item-accessory {
+ margin-left: 16px;
+ text-align: right;
+}
+.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret {
+ margin-left: 16px;
+}
+.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) {
+ border-left: 1px solid #cccccc;
+}
+.tox[dir=rtl] .tox-collection--list .tox-collection__item > *:not(:first-child) {
+ margin-right: 8px;
+}
+.tox[dir=rtl] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-collection__item-accessory {
+ margin-right: 16px;
+ text-align: left;
+}
+.tox[dir=rtl] .tox-collection .tox-collection__item-caret {
+ margin-right: 16px;
+ transform: rotateY(180deg);
+}
+.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret {
+ margin-right: 4px;
+}
+.tox .tox-color-picker-container {
+ display: flex;
+ flex-direction: row;
+ height: 225px;
+ margin: 0;
+}
+.tox .tox-sv-palette {
+ box-sizing: border-box;
+ display: flex;
+ height: 100%;
+}
+.tox .tox-sv-palette-spectrum {
+ height: 100%;
+}
+.tox .tox-sv-palette,
+.tox .tox-sv-palette-spectrum {
+ width: 225px;
+}
+.tox .tox-sv-palette-thumb {
+ background: none;
+ border: 1px solid black;
+ border-radius: 50%;
+ box-sizing: content-box;
+ height: 12px;
+ position: absolute;
+ width: 12px;
+}
+.tox .tox-sv-palette-inner-thumb {
+ border: 1px solid white;
+ border-radius: 50%;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+}
+.tox .tox-hue-slider {
+ box-sizing: border-box;
+ height: 100%;
+ width: 25px;
+}
+.tox .tox-hue-slider-spectrum {
+ background: linear-gradient(to bottom, #f00, #ff0080, #f0f, #8000ff, #00f, #0080ff, #0ff, #00ff80, #0f0, #80ff00, #ff0, #ff8000, #f00);
+ height: 100%;
+ width: 100%;
+}
+.tox .tox-hue-slider,
+.tox .tox-hue-slider-spectrum {
+ width: 20px;
+}
+.tox .tox-hue-slider-thumb {
+ background: white;
+ border: 1px solid black;
+ box-sizing: content-box;
+ height: 4px;
+ width: 100%;
+}
+.tox .tox-rgb-form {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+}
+.tox .tox-rgb-form div {
+ align-items: center;
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 5px;
+ width: inherit;
+}
+.tox .tox-rgb-form input {
+ width: 6em;
+}
+.tox .tox-rgb-form input.tox-invalid {
+ /* Need !important to override Chrome's focus styling unfortunately */
+ border: 1px solid red !important;
+}
+.tox .tox-rgb-form .tox-rgba-preview {
+ border: 1px solid black;
+ flex-grow: 2;
+ margin-bottom: 0;
+}
+.tox:not([dir=rtl]) .tox-sv-palette {
+ margin-right: 15px;
+}
+.tox:not([dir=rtl]) .tox-hue-slider {
+ margin-right: 15px;
+}
+.tox:not([dir=rtl]) .tox-hue-slider-thumb {
+ margin-left: -1px;
+}
+.tox:not([dir=rtl]) .tox-rgb-form label {
+ margin-right: 0.5em;
+}
+.tox[dir=rtl] .tox-sv-palette {
+ margin-left: 15px;
+}
+.tox[dir=rtl] .tox-hue-slider {
+ margin-left: 15px;
+}
+.tox[dir=rtl] .tox-hue-slider-thumb {
+ margin-right: -1px;
+}
+.tox[dir=rtl] .tox-rgb-form label {
+ margin-left: 0.5em;
+}
+.tox .tox-toolbar .tox-swatches,
+.tox .tox-toolbar__primary .tox-swatches,
+.tox .tox-toolbar__overflow .tox-swatches {
+ margin: 2px 0 3px 4px;
+}
+.tox .tox-collection--list .tox-collection__group .tox-swatches-menu {
+ border: 0;
+ margin: -4px 0;
+}
+.tox .tox-swatches__row {
+ display: flex;
+}
+.tox .tox-swatch {
+ height: 30px;
+ transition: transform 0.15s, box-shadow 0.15s;
+ width: 30px;
+}
+.tox .tox-swatch:hover,
+.tox .tox-swatch:focus {
+ box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset;
+ transform: scale(0.8);
+}
+.tox .tox-swatch--remove {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+}
+.tox .tox-swatch--remove svg path {
+ stroke: #e74c3c;
+}
+.tox .tox-swatches__picker-btn {
+ align-items: center;
+ background-color: transparent;
+ border: 0;
+ cursor: pointer;
+ display: flex;
+ height: 30px;
+ justify-content: center;
+ outline: none;
+ padding: 0;
+ width: 30px;
+}
+.tox .tox-swatches__picker-btn svg {
+ fill: #222f3e;
+ height: 24px;
+ width: 24px;
+}
+.tox .tox-swatches__picker-btn:hover {
+ background: #dee0e2;
+}
+.tox:not([dir=rtl]) .tox-swatches__picker-btn {
+ margin-left: auto;
+}
+.tox[dir=rtl] .tox-swatches__picker-btn {
+ margin-right: auto;
+}
+.tox .tox-comment-thread {
+ background: #fff;
+ position: relative;
+}
+.tox .tox-comment-thread > *:not(:first-child) {
+ margin-top: 8px;
+}
+.tox .tox-comment {
+ background: #fff;
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1);
+ padding: 8px 8px 16px 8px;
+ position: relative;
+}
+.tox .tox-comment__header {
+ align-items: center;
+ color: #222f3e;
+ display: flex;
+ justify-content: space-between;
+}
+.tox .tox-comment__date {
+ color: rgba(34, 47, 62, 0.7);
+ font-size: 12px;
+}
+.tox .tox-comment__body {
+ color: #222f3e;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ margin-top: 8px;
+ position: relative;
+ text-transform: initial;
+}
+.tox .tox-comment__body textarea {
+ resize: none;
+ white-space: normal;
+ width: 100%;
+}
+.tox .tox-comment__expander {
+ padding-top: 8px;
+}
+.tox .tox-comment__expander p {
+ color: rgba(34, 47, 62, 0.7);
+ font-size: 14px;
+ font-style: normal;
+}
+.tox .tox-comment__body p {
+ margin: 0;
+}
+.tox .tox-comment__buttonspacing {
+ padding-top: 16px;
+ text-align: center;
+}
+.tox .tox-comment-thread__overlay::after {
+ background: #fff;
+ bottom: 0;
+ content: "";
+ display: flex;
+ left: 0;
+ opacity: 0.9;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 5;
+}
+.tox .tox-comment__reply {
+ display: flex;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ margin-top: 8px;
+}
+.tox .tox-comment__reply > *:first-child {
+ margin-bottom: 8px;
+ width: 100%;
+}
+.tox .tox-comment__edit {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ margin-top: 16px;
+}
+.tox .tox-comment__gradient::after {
+ background: linear-gradient(rgba(255, 255, 255, 0), #fff);
+ bottom: 0;
+ content: "";
+ display: block;
+ height: 5em;
+ margin-top: -40px;
+ position: absolute;
+ width: 100%;
+}
+.tox .tox-comment__overlay {
+ background: #fff;
+ bottom: 0;
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ left: 0;
+ opacity: 0.9;
+ position: absolute;
+ right: 0;
+ text-align: center;
+ top: 0;
+ z-index: 5;
+}
+.tox .tox-comment__loading-text {
+ align-items: center;
+ color: #222f3e;
+ display: flex;
+ flex-direction: column;
+ position: relative;
+}
+.tox .tox-comment__loading-text > div {
+ padding-bottom: 16px;
+}
+.tox .tox-comment__overlaytext {
+ bottom: 0;
+ flex-direction: column;
+ font-size: 14px;
+ left: 0;
+ padding: 1em;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 10;
+}
+.tox .tox-comment__overlaytext p {
+ background-color: #fff;
+ box-shadow: 0 0 8px 8px #fff;
+ color: #222f3e;
+ text-align: center;
+}
+.tox .tox-comment__overlaytext div:nth-of-type(2) {
+ font-size: 0.8em;
+}
+.tox .tox-comment__busy-spinner {
+ align-items: center;
+ background-color: #fff;
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 20;
+}
+.tox .tox-comment__scroll {
+ display: flex;
+ flex-direction: column;
+ flex-shrink: 1;
+ overflow: auto;
+}
+.tox .tox-conversations {
+ margin: 8px;
+}
+.tox:not([dir=rtl]) .tox-comment__edit {
+ margin-left: 8px;
+}
+.tox:not([dir=rtl]) .tox-comment__buttonspacing > *:last-child,
+.tox:not([dir=rtl]) .tox-comment__edit > *:last-child,
+.tox:not([dir=rtl]) .tox-comment__reply > *:last-child {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-comment__edit {
+ margin-right: 8px;
+}
+.tox[dir=rtl] .tox-comment__buttonspacing > *:last-child,
+.tox[dir=rtl] .tox-comment__edit > *:last-child,
+.tox[dir=rtl] .tox-comment__reply > *:last-child {
+ margin-right: 8px;
+}
+.tox .tox-user {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-user__avatar svg {
+ fill: rgba(34, 47, 62, 0.7);
+}
+.tox .tox-user__name {
+ color: rgba(34, 47, 62, 0.7);
+ font-size: 12px;
+ font-style: normal;
+ font-weight: bold;
+ text-transform: uppercase;
+}
+.tox:not([dir=rtl]) .tox-user__avatar svg {
+ margin-right: 8px;
+}
+.tox:not([dir=rtl]) .tox-user__avatar + .tox-user__name {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-user__avatar svg {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-user__avatar + .tox-user__name {
+ margin-right: 8px;
+}
+.tox .tox-dialog-wrap {
+ align-items: center;
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: fixed;
+ right: 0;
+ top: 0;
+ z-index: 1100;
+}
+.tox .tox-dialog-wrap__backdrop {
+ background-color: rgba(255, 255, 255, 0.75);
+ bottom: 0;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 1;
+}
+.tox .tox-dialog-wrap__backdrop--opaque {
+ background-color: #fff;
+}
+.tox .tox-dialog {
+ background-color: #fff;
+ border-color: #cccccc;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: 0 16px 16px -10px rgba(34, 47, 62, 0.15), 0 0 40px 1px rgba(34, 47, 62, 0.15);
+ display: flex;
+ flex-direction: column;
+ max-height: 100%;
+ max-width: 480px;
+ overflow: hidden;
+ position: relative;
+ width: 95vw;
+ z-index: 2;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog {
+ align-self: flex-start;
+ margin: 8px auto;
+ width: calc(100vw - 16px);
+ }
+}
+.tox .tox-dialog-inline {
+ z-index: 1100;
+}
+.tox .tox-dialog__header {
+ align-items: center;
+ background-color: #fff;
+ border-bottom: none;
+ color: #222f3e;
+ display: flex;
+ font-size: 16px;
+ justify-content: space-between;
+ padding: 8px 16px 0 16px;
+ position: relative;
+}
+.tox .tox-dialog__header .tox-button {
+ z-index: 1;
+}
+.tox .tox-dialog__draghandle {
+ cursor: grab;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tox .tox-dialog__draghandle:active {
+ cursor: grabbing;
+}
+.tox .tox-dialog__dismiss {
+ margin-left: auto;
+}
+.tox .tox-dialog__title {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 20px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ margin: 0;
+ text-transform: none;
+}
+.tox .tox-dialog__body {
+ color: #222f3e;
+ display: flex;
+ flex: 1;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ min-width: 0;
+ text-align: left;
+ text-transform: none;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog__body {
+ flex-direction: column;
+ }
+}
+.tox .tox-dialog__body-nav {
+ align-items: flex-start;
+ display: flex;
+ flex-direction: column;
+ padding: 16px 16px;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog__body-nav {
+ flex-direction: row;
+ -webkit-overflow-scrolling: touch;
+ overflow-x: auto;
+ padding-bottom: 0;
+ }
+}
+.tox .tox-dialog__body-nav-item {
+ border-bottom: 2px solid transparent;
+ color: rgba(34, 47, 62, 0.7);
+ display: inline-block;
+ font-size: 14px;
+ line-height: 1.3;
+ margin-bottom: 8px;
+ text-decoration: none;
+ white-space: nowrap;
+}
+.tox .tox-dialog__body-nav-item:focus {
+ background-color: rgba(32, 122, 183, 0.1);
+}
+.tox .tox-dialog__body-nav-item--active {
+ border-bottom: 2px solid #207ab7;
+ color: #207ab7;
+}
+.tox .tox-dialog__body-content {
+ box-sizing: border-box;
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ max-height: 650px;
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+ padding: 16px 16px;
+}
+.tox .tox-dialog__body-content > * {
+ margin-bottom: 0;
+ margin-top: 16px;
+}
+.tox .tox-dialog__body-content > *:first-child {
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content > *:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-dialog__body-content > *:only-child {
+ margin-bottom: 0;
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content a {
+ color: #207ab7;
+ cursor: pointer;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content a:hover,
+.tox .tox-dialog__body-content a:focus {
+ color: #185d8c;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content a:active {
+ color: #185d8c;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content svg {
+ fill: #222f3e;
+}
+.tox .tox-dialog__body-content ul {
+ display: block;
+ list-style-type: disc;
+ margin-bottom: 16px;
+ margin-inline-end: 0;
+ margin-inline-start: 0;
+ padding-inline-start: 2.5rem;
+}
+.tox .tox-dialog__body-content .tox-form__group h1 {
+ color: #222f3e;
+ font-size: 20px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ margin-bottom: 16px;
+ margin-top: 2rem;
+ text-transform: none;
+}
+.tox .tox-dialog__body-content .tox-form__group h2 {
+ color: #222f3e;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ margin-bottom: 16px;
+ margin-top: 2rem;
+ text-transform: none;
+}
+.tox .tox-dialog__body-content .tox-form__group p {
+ margin-bottom: 16px;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:first-child,
+.tox .tox-dialog__body-content .tox-form__group h2:first-child,
+.tox .tox-dialog__body-content .tox-form__group p:first-child {
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:last-child,
+.tox .tox-dialog__body-content .tox-form__group h2:last-child,
+.tox .tox-dialog__body-content .tox-form__group p:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:only-child,
+.tox .tox-dialog__body-content .tox-form__group h2:only-child,
+.tox .tox-dialog__body-content .tox-form__group p:only-child {
+ margin-bottom: 0;
+ margin-top: 0;
+}
+.tox .tox-dialog--width-lg {
+ height: 650px;
+ max-width: 1200px;
+}
+.tox .tox-dialog--width-md {
+ max-width: 800px;
+}
+.tox .tox-dialog--width-md .tox-dialog__body-content {
+ overflow: auto;
+}
+.tox .tox-dialog__body-content--centered {
+ text-align: center;
+}
+.tox .tox-dialog__footer {
+ align-items: center;
+ background-color: #fff;
+ border-top: 1px solid #cccccc;
+ display: flex;
+ justify-content: space-between;
+ padding: 8px 16px;
+}
+.tox .tox-dialog__footer-start,
+.tox .tox-dialog__footer-end {
+ display: flex;
+}
+.tox .tox-dialog__busy-spinner {
+ align-items: center;
+ background-color: rgba(255, 255, 255, 0.75);
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 3;
+}
+.tox .tox-dialog__table {
+ border-collapse: collapse;
+ width: 100%;
+}
+.tox .tox-dialog__table thead th {
+ font-weight: bold;
+ padding-bottom: 8px;
+}
+.tox .tox-dialog__table tbody tr {
+ border-bottom: 1px solid #cccccc;
+}
+.tox .tox-dialog__table tbody tr:last-child {
+ border-bottom: none;
+}
+.tox .tox-dialog__table td {
+ padding-bottom: 8px;
+ padding-top: 8px;
+}
+.tox .tox-dialog__popups {
+ position: absolute;
+ width: 100%;
+ z-index: 1100;
+}
+.tox .tox-dialog__body-iframe {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+}
+.tox .tox-dialog__body-iframe .tox-navobj {
+ display: flex;
+ flex: 1;
+}
+.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) {
+ flex: 1;
+ height: 100%;
+}
+.tox .tox-dialog-dock-fadeout {
+ opacity: 0;
+ visibility: hidden;
+}
+.tox .tox-dialog-dock-fadein {
+ opacity: 1;
+ visibility: visible;
+}
+.tox .tox-dialog-dock-transition {
+ transition: visibility 0s linear 0.3s, opacity 0.3s ease;
+}
+.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein {
+ transition-delay: 0s;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav {
+ margin-right: 0;
+ }
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child) {
+ margin-left: 8px;
+ }
+}
+.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start > *,
+.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end > * {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-dialog__body {
+ text-align: right;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav {
+ margin-left: 0;
+ }
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child) {
+ margin-right: 8px;
+ }
+}
+.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start > *,
+.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end > * {
+ margin-right: 8px;
+}
+body.tox-dialog__disable-scroll {
+ overflow: hidden;
+}
+.tox .tox-dropzone-container {
+ display: flex;
+ flex: 1;
+}
+.tox .tox-dropzone {
+ align-items: center;
+ background: #fff;
+ border: 2px dashed #cccccc;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ justify-content: center;
+ min-height: 100px;
+ padding: 10px;
+}
+.tox .tox-dropzone p {
+ color: rgba(34, 47, 62, 0.7);
+ margin: 0 0 16px 0;
+}
+.tox .tox-edit-area {
+ display: flex;
+ flex: 1;
+ overflow: hidden;
+ position: relative;
+}
+.tox .tox-edit-area__iframe {
+ background-color: #fff;
+ border: 0;
+ box-sizing: border-box;
+ flex: 1;
+ height: 100%;
+ position: absolute;
+ width: 100%;
+}
+.tox.tox-inline-edit-area {
+ border: 1px dotted #cccccc;
+}
+.tox .tox-editor-container {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ overflow: hidden;
+}
+.tox .tox-editor-header {
+ z-index: 1;
+}
+.tox:not(.tox-tinymce-inline) .tox-editor-header {
+ background-color: #fff;
+ border-bottom: none;
+ box-shadow: none;
+ padding: 4px 0;
+ transition: box-shadow 0.5s;
+}
+.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header {
+ border-top: 1px solid #c1c1c1;
+ box-shadow: none;
+}
+.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header {
+ background-color: #fff;
+ box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25);
+ padding: 4px 0;
+}
+.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header {
+ box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25);
+}
+.tox-editor-dock-fadeout {
+ opacity: 0;
+ visibility: hidden;
+}
+.tox-editor-dock-fadein {
+ opacity: 1;
+ visibility: visible;
+}
+.tox-editor-dock-transition {
+ transition: visibility 0s linear 0.25s, opacity 0.25s ease;
+}
+.tox-editor-dock-transition.tox-editor-dock-fadein {
+ transition-delay: 0s;
+}
+.tox .tox-control-wrap {
+ flex: 1;
+ position: relative;
+}
+.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,
+.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,
+.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid {
+ display: none;
+}
+.tox .tox-control-wrap svg {
+ display: block;
+}
+.tox .tox-control-wrap__status-icon-wrap {
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-control-wrap__status-icon-invalid svg {
+ fill: #c00;
+}
+.tox .tox-control-wrap__status-icon-unknown svg {
+ fill: orange;
+}
+.tox .tox-control-wrap__status-icon-valid svg {
+ fill: green;
+}
+.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,
+.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,
+.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield {
+ padding-right: 32px;
+}
+.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap {
+ right: 4px;
+}
+.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,
+.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,
+.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield {
+ padding-left: 32px;
+}
+.tox[dir=rtl] .tox-control-wrap__status-icon-wrap {
+ left: 4px;
+}
+.tox .tox-autocompleter {
+ max-width: 25em;
+}
+.tox .tox-autocompleter .tox-menu {
+ border-color: #cccccc;
+ box-shadow: none;
+ max-width: 25em;
+}
+.tox .tox-autocompleter .tox-autocompleter-highlight {
+ font-weight: bold;
+}
+.tox .tox-color-input {
+ display: flex;
+ position: relative;
+ z-index: 1;
+}
+.tox .tox-color-input .tox-textfield {
+ z-index: -1;
+}
+.tox .tox-color-input span {
+ border-color: rgba(34, 47, 62, 0.2);
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ height: 24px;
+ position: absolute;
+ top: 6px;
+ width: 24px;
+}
+.tox .tox-color-input span:hover:not([aria-disabled=true]),
+.tox .tox-color-input span:focus:not([aria-disabled=true]) {
+ border-color: #207ab7;
+ cursor: pointer;
+}
+.tox .tox-color-input span::before {
+ background-image: linear-gradient(45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), linear-gradient(-45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%), linear-gradient(-45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%);
+ background-position: 0 0, 0 6px, 6px -6px, -6px 0;
+ background-size: 12px 12px;
+ border: 1px solid #fff;
+ border-radius: 3px;
+ box-sizing: border-box;
+ content: '';
+ height: 24px;
+ left: -1px;
+ position: absolute;
+ top: -1px;
+ width: 24px;
+ z-index: -1;
+}
+.tox .tox-color-input span[aria-disabled=true] {
+ cursor: not-allowed;
+}
+.tox:not([dir=rtl]) .tox-color-input {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox:not([dir=rtl]) .tox-color-input .tox-textfield {
+ padding-left: 36px;
+}
+.tox:not([dir=rtl]) .tox-color-input span {
+ left: 6px;
+}
+.tox[dir="rtl"] .tox-color-input {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox[dir="rtl"] .tox-color-input .tox-textfield {
+ padding-right: 36px;
+}
+.tox[dir="rtl"] .tox-color-input span {
+ right: 6px;
+}
+.tox .tox-label,
+.tox .tox-toolbar-label {
+ color: rgba(34, 47, 62, 0.7);
+ display: block;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ padding: 0 8px 0 0;
+ text-transform: none;
+ white-space: nowrap;
+}
+.tox .tox-toolbar-label {
+ padding: 0 8px;
+}
+.tox[dir=rtl] .tox-label {
+ padding: 0 0 0 8px;
+}
+.tox .tox-form {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+}
+.tox .tox-form__group {
+ box-sizing: border-box;
+ margin-bottom: 4px;
+}
+.tox .tox-form-group--maximize {
+ flex: 1;
+}
+.tox .tox-form__group--error {
+ color: #c00;
+}
+.tox .tox-form__group--collection {
+ display: flex;
+}
+.tox .tox-form__grid {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: space-between;
+}
+.tox .tox-form__grid--2col > .tox-form__group {
+ width: calc(50% - (8px / 2));
+}
+.tox .tox-form__grid--3col > .tox-form__group {
+ width: calc(100% / 3 - (8px / 2));
+}
+.tox .tox-form__grid--4col > .tox-form__group {
+ width: calc(25% - (8px / 2));
+}
+.tox .tox-form__controls-h-stack {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-form__group--inline {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-form__group--stretched {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+}
+.tox .tox-form__group--stretched .tox-textarea {
+ flex: 1;
+}
+.tox .tox-form__group--stretched .tox-navobj {
+ display: flex;
+ flex: 1;
+}
+.tox .tox-form__group--stretched .tox-navobj :nth-child(2) {
+ flex: 1;
+ height: 100%;
+}
+.tox:not([dir=rtl]) .tox-form__controls-h-stack > *:not(:first-child) {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-form__controls-h-stack > *:not(:first-child) {
+ margin-right: 4px;
+}
+.tox .tox-lock.tox-locked .tox-lock-icon__unlock,
+.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock {
+ display: none;
+}
+.tox .tox-textfield,
+.tox .tox-toolbar-textfield,
+.tox .tox-listboxfield .tox-listbox--select,
+.tox .tox-textarea {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: #fff;
+ border-color: #cccccc;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #222f3e;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ margin: 0;
+ min-height: 34px;
+ outline: none;
+ padding: 5px 4.75px;
+ resize: none;
+ width: 100%;
+}
+.tox .tox-textfield[disabled],
+.tox .tox-textarea[disabled] {
+ background-color: #f2f2f2;
+ color: rgba(34, 47, 62, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-textfield:focus,
+.tox .tox-listboxfield .tox-listbox--select:focus,
+.tox .tox-textarea:focus {
+ background-color: #fff;
+ border-color: #207ab7;
+ box-shadow: none;
+ outline: 2px solid rgba(32, 122, 183, 0.25);
+}
+.tox .tox-toolbar-textfield {
+ border-width: 0;
+ margin-bottom: 3px;
+ margin-top: 2px;
+ max-width: 250px;
+}
+.tox .tox-naked-btn {
+ background-color: transparent;
+ border: 0;
+ border-color: transparent;
+ box-shadow: unset;
+ color: #207ab7;
+ cursor: pointer;
+ display: block;
+ margin: 0;
+ padding: 0;
+}
+.tox .tox-naked-btn svg {
+ display: block;
+ fill: #222f3e;
+}
+.tox:not([dir=rtl]) .tox-toolbar-textfield + * {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-toolbar-textfield + * {
+ margin-right: 4px;
+}
+.tox .tox-listboxfield {
+ cursor: pointer;
+ position: relative;
+}
+.tox .tox-listboxfield .tox-listbox--select[disabled] {
+ background-color: #f2f2f2;
+ color: rgba(34, 47, 62, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-listbox__select-label {
+ cursor: default;
+ flex: 1;
+ margin: 0 4px;
+}
+.tox .tox-listbox__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+}
+.tox .tox-listbox__select-chevron svg {
+ fill: #222f3e;
+}
+.tox .tox-listboxfield .tox-listbox--select {
+ align-items: center;
+ display: flex;
+}
+.tox:not([dir=rtl]) .tox-listboxfield svg {
+ right: 8px;
+}
+.tox[dir=rtl] .tox-listboxfield svg {
+ left: 8px;
+}
+.tox .tox-selectfield {
+ cursor: pointer;
+ position: relative;
+}
+.tox .tox-selectfield select {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: #fff;
+ border-color: #cccccc;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #222f3e;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ margin: 0;
+ min-height: 34px;
+ outline: none;
+ padding: 5px 4.75px;
+ resize: none;
+ width: 100%;
+}
+.tox .tox-selectfield select[disabled] {
+ background-color: #f2f2f2;
+ color: rgba(34, 47, 62, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-selectfield select::-ms-expand {
+ display: none;
+}
+.tox .tox-selectfield select:focus {
+ background-color: #fff;
+ border-color: #207ab7;
+ box-shadow: none;
+ outline: 2px solid rgba(32, 122, 183, 0.25);
+}
+.tox .tox-selectfield svg {
+ pointer-events: none;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox:not([dir=rtl]) .tox-selectfield select[size="0"],
+.tox:not([dir=rtl]) .tox-selectfield select[size="1"] {
+ padding-right: 24px;
+}
+.tox:not([dir=rtl]) .tox-selectfield svg {
+ right: 8px;
+}
+.tox[dir=rtl] .tox-selectfield select[size="0"],
+.tox[dir=rtl] .tox-selectfield select[size="1"] {
+ padding-left: 24px;
+}
+.tox[dir=rtl] .tox-selectfield svg {
+ left: 8px;
+}
+.tox .tox-textarea {
+ -webkit-appearance: textarea;
+ -moz-appearance: textarea;
+ appearance: textarea;
+ white-space: pre-wrap;
+}
+.tox-fullscreen {
+ border: 0;
+ height: 100%;
+ margin: 0;
+ overflow: hidden;
+ overscroll-behavior: none;
+ padding: 0;
+ touch-action: pinch-zoom;
+ width: 100%;
+}
+.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {
+ display: none;
+}
+.tox.tox-tinymce.tox-fullscreen,
+.tox-shadowhost.tox-fullscreen {
+ left: 0;
+ position: fixed;
+ top: 0;
+ z-index: 1200;
+}
+.tox.tox-tinymce.tox-fullscreen {
+ background-color: transparent;
+}
+.tox-fullscreen .tox.tox-tinymce-aux,
+.tox-fullscreen ~ .tox.tox-tinymce-aux {
+ z-index: 1201;
+}
+.tox .tox-help__more-link {
+ list-style: none;
+ margin-top: 1em;
+}
+.tox .tox-imagepreview {
+ background-color: #666;
+ height: 380px;
+ overflow: hidden;
+ position: relative;
+ width: 100%;
+}
+.tox .tox-imagepreview.tox-imagepreview__loaded {
+ overflow: auto;
+}
+.tox .tox-imagepreview__container {
+ display: flex;
+ left: 100vw;
+ position: absolute;
+ top: 100vw;
+}
+.tox .tox-imagepreview__image {
+ background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==);
+}
+.tox .tox-image-tools .tox-spacer {
+ flex: 1;
+}
+.tox .tox-image-tools .tox-bar {
+ align-items: center;
+ display: flex;
+ height: 60px;
+ justify-content: center;
+}
+.tox .tox-image-tools .tox-imagepreview,
+.tox .tox-image-tools .tox-imagepreview + .tox-bar {
+ margin-top: 8px;
+}
+.tox .tox-image-tools .tox-croprect-block {
+ background: black;
+ filter: alpha(opacity=50);
+ opacity: 0.5;
+ position: absolute;
+ zoom: 1;
+}
+.tox .tox-image-tools .tox-croprect-handle {
+ border: 2px solid white;
+ height: 20px;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 20px;
+}
+.tox .tox-image-tools .tox-croprect-handle-move {
+ border: 0;
+ cursor: move;
+ position: absolute;
+}
+.tox .tox-image-tools .tox-croprect-handle-nw {
+ border-width: 2px 0 0 2px;
+ cursor: nw-resize;
+ left: 100px;
+ margin: -2px 0 0 -2px;
+ top: 100px;
+}
+.tox .tox-image-tools .tox-croprect-handle-ne {
+ border-width: 2px 2px 0 0;
+ cursor: ne-resize;
+ left: 200px;
+ margin: -2px 0 0 -20px;
+ top: 100px;
+}
+.tox .tox-image-tools .tox-croprect-handle-sw {
+ border-width: 0 0 2px 2px;
+ cursor: sw-resize;
+ left: 100px;
+ margin: -20px 2px 0 -2px;
+ top: 200px;
+}
+.tox .tox-image-tools .tox-croprect-handle-se {
+ border-width: 0 2px 2px 0;
+ cursor: se-resize;
+ left: 200px;
+ margin: -20px 0 0 -20px;
+ top: 200px;
+}
+.tox .tox-insert-table-picker {
+ display: flex;
+ flex-wrap: wrap;
+ width: 170px;
+}
+.tox .tox-insert-table-picker > div {
+ border-color: #cccccc;
+ border-style: solid;
+ border-width: 0 1px 1px 0;
+ box-sizing: border-box;
+ height: 17px;
+ width: 17px;
+}
+.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker {
+ margin: 0 -4px;
+}
+.tox .tox-insert-table-picker .tox-insert-table-picker__selected {
+ background-color: rgba(32, 122, 183, 0.5);
+ border-color: rgba(32, 122, 183, 0.5);
+}
+.tox .tox-insert-table-picker__label {
+ color: rgba(34, 47, 62, 0.7);
+ display: block;
+ font-size: 14px;
+ padding: 4px;
+ text-align: center;
+ width: 100%;
+}
+.tox:not([dir=rtl]) {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox:not([dir=rtl]) .tox-insert-table-picker > div:nth-child(10n) {
+ border-right: 0;
+}
+.tox[dir=rtl] {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox[dir=rtl] .tox-insert-table-picker > div:nth-child(10n+1) {
+ border-right: 0;
+}
+.tox {
+ /* stylelint-disable */
+ /* stylelint-enable */
+}
+.tox .tox-menu {
+ background-color: #fff;
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1);
+ display: inline-block;
+ overflow: hidden;
+ vertical-align: top;
+ z-index: 1150;
+}
+.tox .tox-menu.tox-collection.tox-collection--list {
+ padding: 0 0;
+}
+.tox .tox-menu.tox-collection.tox-collection--toolbar {
+ padding: 4px;
+}
+.tox .tox-menu.tox-collection.tox-collection--grid {
+ padding: 4px;
+}
+.tox .tox-menu__label h1,
+.tox .tox-menu__label h2,
+.tox .tox-menu__label h3,
+.tox .tox-menu__label h4,
+.tox .tox-menu__label h5,
+.tox .tox-menu__label h6,
+.tox .tox-menu__label p,
+.tox .tox-menu__label blockquote,
+.tox .tox-menu__label code {
+ margin: 0;
+}
+.tox .tox-menubar {
+ background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;
+ background-color: #fff;
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ padding: 0 4px 0 4px;
+}
+.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar {
+ border-top: 1px solid #cccccc;
+}
+/* Deprecated. Remove in next major release */
+.tox .tox-mbtn {
+ align-items: center;
+ background: transparent;
+ border: 0;
+ border-radius: 3px;
+ box-shadow: none;
+ color: #222f3e;
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ height: 34px;
+ justify-content: center;
+ margin: 2px 0 3px 0;
+ outline: none;
+ overflow: hidden;
+ padding: 0 4px;
+ text-transform: none;
+ width: auto;
+}
+.tox .tox-mbtn[disabled] {
+ background-color: transparent;
+ border: 0;
+ box-shadow: none;
+ color: rgba(34, 47, 62, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-mbtn:focus:not(:disabled) {
+ background: #dee0e2;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-mbtn--active {
+ background: #c8cbcf;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) {
+ background: #dee0e2;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-mbtn__select-label {
+ cursor: default;
+ font-weight: normal;
+ margin: 0 4px;
+}
+.tox .tox-mbtn[disabled] .tox-mbtn__select-label {
+ cursor: not-allowed;
+}
+.tox .tox-mbtn__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+ display: none;
+}
+.tox .tox-notification {
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ display: grid;
+ font-size: 14px;
+ font-weight: normal;
+ grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr);
+ margin-top: 4px;
+ opacity: 0;
+ padding: 4px;
+ transition: transform 100ms ease-in, opacity 150ms ease-in;
+}
+.tox .tox-notification p {
+ font-size: 14px;
+ font-weight: normal;
+}
+.tox .tox-notification a {
+ cursor: pointer;
+ text-decoration: underline;
+}
+.tox .tox-notification--in {
+ opacity: 1;
+}
+.tox .tox-notification--success {
+ background-color: #e4eeda;
+ border-color: #d7e6c8;
+ color: #222f3e;
+}
+.tox .tox-notification--success p {
+ color: #222f3e;
+}
+.tox .tox-notification--success a {
+ color: #517342;
+}
+.tox .tox-notification--success svg {
+ fill: #222f3e;
+}
+.tox .tox-notification--error {
+ background-color: #f5cccc;
+ border-color: #f0b3b3;
+ color: #222f3e;
+}
+.tox .tox-notification--error p {
+ color: #222f3e;
+}
+.tox .tox-notification--error a {
+ color: #77181f;
+}
+.tox .tox-notification--error svg {
+ fill: #222f3e;
+}
+.tox .tox-notification--warn,
+.tox .tox-notification--warning {
+ background-color: #fff5cc;
+ border-color: #fff0b3;
+ color: #222f3e;
+}
+.tox .tox-notification--warn p,
+.tox .tox-notification--warning p {
+ color: #222f3e;
+}
+.tox .tox-notification--warn a,
+.tox .tox-notification--warning a {
+ color: #7a6e25;
+}
+.tox .tox-notification--warn svg,
+.tox .tox-notification--warning svg {
+ fill: #222f3e;
+}
+.tox .tox-notification--info {
+ background-color: #d6e7fb;
+ border-color: #c1dbf9;
+ color: #222f3e;
+}
+.tox .tox-notification--info p {
+ color: #222f3e;
+}
+.tox .tox-notification--info a {
+ color: #2a64a6;
+}
+.tox .tox-notification--info svg {
+ fill: #222f3e;
+}
+.tox .tox-notification__body {
+ align-self: center;
+ color: #222f3e;
+ font-size: 14px;
+ grid-column-end: 3;
+ grid-column-start: 2;
+ grid-row-end: 2;
+ grid-row-start: 1;
+ text-align: center;
+ white-space: normal;
+ word-break: break-all;
+ word-break: break-word;
+}
+.tox .tox-notification__body > * {
+ margin: 0;
+}
+.tox .tox-notification__body > * + * {
+ margin-top: 1rem;
+}
+.tox .tox-notification__icon {
+ align-self: center;
+ grid-column-end: 2;
+ grid-column-start: 1;
+ grid-row-end: 2;
+ grid-row-start: 1;
+ justify-self: end;
+}
+.tox .tox-notification__icon svg {
+ display: block;
+}
+.tox .tox-notification__dismiss {
+ align-self: start;
+ grid-column-end: 4;
+ grid-column-start: 3;
+ grid-row-end: 2;
+ grid-row-start: 1;
+ justify-self: end;
+}
+.tox .tox-notification .tox-progress-bar {
+ grid-column-end: 4;
+ grid-column-start: 1;
+ grid-row-end: 3;
+ grid-row-start: 2;
+ justify-self: center;
+}
+.tox .tox-pop {
+ display: inline-block;
+ position: relative;
+}
+.tox .tox-pop--resizing {
+ transition: width 0.1s ease;
+}
+.tox .tox-pop--resizing .tox-toolbar,
+.tox .tox-pop--resizing .tox-toolbar__group {
+ flex-wrap: nowrap;
+}
+.tox .tox-pop--transition {
+ transition: 0.15s ease;
+ transition-property: left, right, top, bottom;
+}
+.tox .tox-pop--transition::before,
+.tox .tox-pop--transition::after {
+ transition: all 0.15s, visibility 0s, opacity 0.075s ease 0.075s;
+}
+.tox .tox-pop__dialog {
+ background-color: #fff;
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15);
+ min-width: 0;
+ overflow: hidden;
+}
+.tox .tox-pop__dialog > *:not(.tox-toolbar) {
+ margin: 4px 4px 4px 8px;
+}
+.tox .tox-pop__dialog .tox-toolbar {
+ background-color: transparent;
+ margin-bottom: -1px;
+}
+.tox .tox-pop::before,
+.tox .tox-pop::after {
+ border-style: solid;
+ content: '';
+ display: block;
+ height: 0;
+ opacity: 1;
+ position: absolute;
+ width: 0;
+}
+.tox .tox-pop.tox-pop--inset::before,
+.tox .tox-pop.tox-pop--inset::after {
+ opacity: 0;
+ transition: all 0s 0.15s, visibility 0s, opacity 0.075s ease;
+}
+.tox .tox-pop.tox-pop--bottom::before,
+.tox .tox-pop.tox-pop--bottom::after {
+ left: 50%;
+ top: 100%;
+}
+.tox .tox-pop.tox-pop--bottom::after {
+ border-color: #fff transparent transparent transparent;
+ border-width: 8px;
+ margin-left: -8px;
+ margin-top: -1px;
+}
+.tox .tox-pop.tox-pop--bottom::before {
+ border-color: #cccccc transparent transparent transparent;
+ border-width: 9px;
+ margin-left: -9px;
+}
+.tox .tox-pop.tox-pop--top::before,
+.tox .tox-pop.tox-pop--top::after {
+ left: 50%;
+ top: 0;
+ transform: translateY(-100%);
+}
+.tox .tox-pop.tox-pop--top::after {
+ border-color: transparent transparent #fff transparent;
+ border-width: 8px;
+ margin-left: -8px;
+ margin-top: 1px;
+}
+.tox .tox-pop.tox-pop--top::before {
+ border-color: transparent transparent #cccccc transparent;
+ border-width: 9px;
+ margin-left: -9px;
+}
+.tox .tox-pop.tox-pop--left::before,
+.tox .tox-pop.tox-pop--left::after {
+ left: 0;
+ top: calc(50% - 1px);
+ transform: translateY(-50%);
+}
+.tox .tox-pop.tox-pop--left::after {
+ border-color: transparent #fff transparent transparent;
+ border-width: 8px;
+ margin-left: -15px;
+}
+.tox .tox-pop.tox-pop--left::before {
+ border-color: transparent #cccccc transparent transparent;
+ border-width: 10px;
+ margin-left: -19px;
+}
+.tox .tox-pop.tox-pop--right::before,
+.tox .tox-pop.tox-pop--right::after {
+ left: 100%;
+ top: calc(50% + 1px);
+ transform: translateY(-50%);
+}
+.tox .tox-pop.tox-pop--right::after {
+ border-color: transparent transparent transparent #fff;
+ border-width: 8px;
+ margin-left: -1px;
+}
+.tox .tox-pop.tox-pop--right::before {
+ border-color: transparent transparent transparent #cccccc;
+ border-width: 10px;
+ margin-left: -1px;
+}
+.tox .tox-pop.tox-pop--align-left::before,
+.tox .tox-pop.tox-pop--align-left::after {
+ left: 20px;
+}
+.tox .tox-pop.tox-pop--align-right::before,
+.tox .tox-pop.tox-pop--align-right::after {
+ left: calc(100% - 20px);
+}
+.tox .tox-sidebar-wrap {
+ display: flex;
+ flex-direction: row;
+ flex-grow: 1;
+ min-height: 0;
+}
+.tox .tox-sidebar {
+ background-color: #fff;
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-end;
+}
+.tox .tox-sidebar__slider {
+ display: flex;
+ overflow: hidden;
+}
+.tox .tox-sidebar__pane-container {
+ display: flex;
+}
+.tox .tox-sidebar__pane {
+ display: flex;
+}
+.tox .tox-sidebar--sliding-closed {
+ opacity: 0;
+}
+.tox .tox-sidebar--sliding-open {
+ opacity: 1;
+}
+.tox .tox-sidebar--sliding-growing,
+.tox .tox-sidebar--sliding-shrinking {
+ transition: width 0.5s ease, opacity 0.5s ease;
+}
+.tox .tox-selector {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ display: inline-block;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+}
+.tox.tox-platform-touch .tox-selector {
+ height: 12px;
+ width: 12px;
+}
+.tox .tox-slider {
+ align-items: center;
+ display: flex;
+ flex: 1;
+ height: 24px;
+ justify-content: center;
+ position: relative;
+}
+.tox .tox-slider__rail {
+ background-color: transparent;
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ height: 10px;
+ min-width: 120px;
+ width: 100%;
+}
+.tox .tox-slider__handle {
+ background-color: #207ab7;
+ border: 2px solid #185d8c;
+ border-radius: 3px;
+ box-shadow: none;
+ height: 24px;
+ left: 50%;
+ position: absolute;
+ top: 50%;
+ transform: translateX(-50%) translateY(-50%);
+ width: 14px;
+}
+.tox .tox-form__controls-h-stack > .tox-slider:not(:first-of-type) {
+ margin-inline-start: 8px;
+}
+.tox .tox-form__controls-h-stack > .tox-form__group + .tox-slider {
+ margin-inline-start: 32px;
+}
+.tox .tox-form__controls-h-stack > .tox-slider + .tox-form__group {
+ margin-inline-start: 32px;
+}
+.tox .tox-source-code {
+ overflow: auto;
+}
+.tox .tox-spinner {
+ display: flex;
+}
+.tox .tox-spinner > div {
+ animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both;
+ background-color: rgba(34, 47, 62, 0.7);
+ border-radius: 100%;
+ height: 8px;
+ width: 8px;
+}
+.tox .tox-spinner > div:nth-child(1) {
+ animation-delay: -0.32s;
+}
+.tox .tox-spinner > div:nth-child(2) {
+ animation-delay: -0.16s;
+}
+@keyframes tam-bouncing-dots {
+ 0%,
+ 80%,
+ 100% {
+ transform: scale(0);
+ }
+ 40% {
+ transform: scale(1);
+ }
+}
+.tox:not([dir=rtl]) .tox-spinner > div:not(:first-child) {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-spinner > div:not(:first-child) {
+ margin-right: 4px;
+}
+.tox .tox-statusbar {
+ align-items: center;
+ background-color: #fff;
+ border-top: 1px solid #cccccc;
+ color: rgba(34, 47, 62, 0.7);
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 12px;
+ font-weight: normal;
+ height: 18px;
+ overflow: hidden;
+ padding: 0 8px;
+ position: relative;
+ text-transform: uppercase;
+}
+.tox .tox-statusbar__text-container {
+ display: flex;
+ flex: 1 1 auto;
+ justify-content: flex-end;
+ overflow: hidden;
+}
+.tox .tox-statusbar__path {
+ display: flex;
+ flex: 1 1 auto;
+ margin-right: auto;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.tox .tox-statusbar__path > * {
+ display: inline;
+ white-space: nowrap;
+}
+.tox .tox-statusbar__wordcount {
+ flex: 0 0 auto;
+ margin-left: 1ch;
+}
+.tox .tox-statusbar a,
+.tox .tox-statusbar__path-item,
+.tox .tox-statusbar__wordcount {
+ color: rgba(34, 47, 62, 0.7);
+ text-decoration: none;
+}
+.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]) {
+ color: #222f3e;
+ cursor: pointer;
+}
+.tox .tox-statusbar__branding svg {
+ fill: rgba(34, 47, 62, 0.8);
+ height: 1.14em;
+ vertical-align: -0.28em;
+ width: 3.6em;
+}
+.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled=true]) svg,
+.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled=true]) svg {
+ fill: #222f3e;
+}
+.tox .tox-statusbar__resize-handle {
+ align-items: flex-end;
+ align-self: stretch;
+ cursor: nwse-resize;
+ display: flex;
+ flex: 0 0 auto;
+ justify-content: flex-end;
+ margin-left: auto;
+ margin-right: -8px;
+ padding-bottom: 3px;
+ padding-left: 1ch;
+ padding-right: 3px;
+}
+.tox .tox-statusbar__resize-handle svg {
+ display: block;
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-statusbar__resize-handle:focus svg {
+ background-color: #dee0e2;
+ border-radius: 1px 1px -4px 1px;
+ box-shadow: 0 0 0 2px #dee0e2;
+}
+.tox:not([dir=rtl]) .tox-statusbar__path > * {
+ margin-right: 4px;
+}
+.tox:not([dir=rtl]) .tox-statusbar__branding {
+ margin-left: 2ch;
+}
+.tox[dir=rtl] .tox-statusbar {
+ flex-direction: row-reverse;
+}
+.tox[dir=rtl] .tox-statusbar__path > * {
+ margin-left: 4px;
+}
+.tox .tox-throbber {
+ z-index: 1299;
+}
+.tox .tox-throbber__busy-spinner {
+ align-items: center;
+ background-color: rgba(255, 255, 255, 0.6);
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+}
+.tox .tox-tbtn {
+ align-items: center;
+ background: transparent;
+ border: 0;
+ border-radius: 3px;
+ box-shadow: none;
+ color: #222f3e;
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ height: 34px;
+ justify-content: center;
+ margin: 3px 0 2px 0;
+ outline: none;
+ overflow: hidden;
+ padding: 0;
+ text-transform: none;
+ width: 34px;
+}
+.tox .tox-tbtn svg {
+ display: block;
+ fill: #222f3e;
+}
+.tox .tox-tbtn.tox-tbtn-more {
+ padding-left: 5px;
+ padding-right: 5px;
+ width: inherit;
+}
+.tox .tox-tbtn:focus {
+ background: #dee0e2;
+ border: 0;
+ box-shadow: none;
+}
+.tox .tox-tbtn:hover {
+ background: #dee0e2;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-tbtn:hover svg {
+ fill: #222f3e;
+}
+.tox .tox-tbtn:active {
+ background: #c8cbcf;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-tbtn:active svg {
+ fill: #222f3e;
+}
+.tox .tox-tbtn--disabled,
+.tox .tox-tbtn--disabled:hover,
+.tox .tox-tbtn:disabled,
+.tox .tox-tbtn:disabled:hover {
+ background: transparent;
+ border: 0;
+ box-shadow: none;
+ color: rgba(34, 47, 62, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-tbtn--disabled svg,
+.tox .tox-tbtn--disabled:hover svg,
+.tox .tox-tbtn:disabled svg,
+.tox .tox-tbtn:disabled:hover svg {
+ /* stylelint-disable-line no-descending-specificity */
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-tbtn--enabled,
+.tox .tox-tbtn--enabled:hover {
+ background: #c8cbcf;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-tbtn--enabled > *,
+.tox .tox-tbtn--enabled:hover > * {
+ transform: none;
+}
+.tox .tox-tbtn--enabled svg,
+.tox .tox-tbtn--enabled:hover svg {
+ /* stylelint-disable-line no-descending-specificity */
+ fill: #222f3e;
+}
+.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) {
+ color: #222f3e;
+}
+.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg {
+ fill: #222f3e;
+}
+.tox .tox-tbtn:active > * {
+ transform: none;
+}
+.tox .tox-tbtn--md {
+ height: 51px;
+ width: 51px;
+}
+.tox .tox-tbtn--lg {
+ flex-direction: column;
+ height: 68px;
+ width: 68px;
+}
+.tox .tox-tbtn--return {
+ align-self: stretch;
+ height: unset;
+ width: 16px;
+}
+.tox .tox-tbtn--labeled {
+ padding: 0 4px;
+ width: unset;
+}
+.tox .tox-tbtn__vlabel {
+ display: block;
+ font-size: 10px;
+ font-weight: normal;
+ letter-spacing: -0.025em;
+ margin-bottom: 4px;
+ white-space: nowrap;
+}
+.tox .tox-tbtn--select {
+ margin: 3px 0 2px 0;
+ padding: 0 4px;
+ width: auto;
+}
+.tox .tox-tbtn__select-label {
+ cursor: default;
+ font-weight: normal;
+ margin: 0 4px;
+}
+.tox .tox-tbtn__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+}
+.tox .tox-tbtn__select-chevron svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-tbtn--bespoke {
+ background: transparent;
+}
+.tox .tox-tbtn--bespoke + .tox-tbtn--bespoke {
+ margin-inline-start: 0;
+}
+.tox .tox-tbtn--bespoke .tox-tbtn__select-label {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ width: 7em;
+}
+.tox .tox-split-button {
+ border: 0;
+ border-radius: 3px;
+ box-sizing: border-box;
+ display: flex;
+ margin: 3px 0 2px 0;
+ overflow: hidden;
+}
+.tox .tox-split-button:hover {
+ box-shadow: 0 0 0 1px #dee0e2 inset;
+}
+.tox .tox-split-button:focus {
+ background: #dee0e2;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-split-button > * {
+ border-radius: 0;
+}
+.tox .tox-split-button__chevron {
+ width: 16px;
+}
+.tox .tox-split-button__chevron svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-split-button .tox-tbtn {
+ margin: 0;
+}
+.tox .tox-split-button.tox-tbtn--disabled:hover,
+.tox .tox-split-button.tox-tbtn--disabled:focus,
+.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,
+.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus {
+ background: transparent;
+ box-shadow: none;
+ color: rgba(34, 47, 62, 0.5);
+}
+.tox.tox-platform-touch .tox-split-button .tox-tbtn--select {
+ padding: 0 0px;
+}
+.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child {
+ width: 30px;
+}
+.tox.tox-platform-touch .tox-split-button__chevron {
+ width: 20px;
+}
+.tox .tox-toolbar-overlord {
+ background-color: #fff;
+}
+.tox .tox-toolbar,
+.tox .tox-toolbar__primary,
+.tox .tox-toolbar__overflow {
+ background-color: #fff;
+ background-image: repeating-linear-gradient(#cccccc 0px 1px, transparent 1px 39px);
+ background-position: center top 39px;
+ background-repeat: no-repeat;
+ background-size: calc(100% - 4px * 2) calc(100% - 39px);
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ padding: 0 0px;
+ transform: perspective(1px);
+}
+.tox .tox-toolbar-overlord > .tox-toolbar,
+.tox .tox-toolbar-overlord > .tox-toolbar__primary,
+.tox .tox-toolbar-overlord > .tox-toolbar__overflow {
+ background-position: center top 0px;
+ background-size: calc(100% - 4px * 2) calc(100% - 0px);
+}
+.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed {
+ height: 0;
+ opacity: 0;
+ padding-bottom: 0;
+ padding-top: 0;
+ visibility: hidden;
+}
+.tox .tox-toolbar__overflow--growing {
+ transition: height 0.3s ease, opacity 0.2s linear 0.1s;
+}
+.tox .tox-toolbar__overflow--shrinking {
+ transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s;
+}
+.tox .tox-menubar + .tox-toolbar,
+.tox .tox-menubar + .tox-toolbar-overlord {
+ border-top: 1px solid #cccccc;
+ margin-top: 0;
+ padding-bottom: 0px;
+ padding-top: 0px;
+}
+.tox .tox-toolbar--scrolling {
+ flex-wrap: nowrap;
+ overflow-x: auto;
+}
+.tox .tox-pop .tox-toolbar {
+ border-width: 0;
+}
+.tox .tox-toolbar--no-divider {
+ background-image: none;
+}
+.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child,
+.tox .tox-toolbar-overlord .tox-toolbar__primary {
+ background-position: center top 39px;
+}
+.tox .tox-editor-header > .tox-toolbar--scrolling,
+.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child {
+ background-image: none;
+}
+.tox.tox-tinymce-aux .tox-toolbar__overflow {
+ background-color: #fff;
+ background-position: center top 43px;
+ background-size: calc(100% - 8px * 2) calc(100% - 51px);
+ border: none;
+ border-radius: 3px;
+ box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15);
+ padding: 4px 0;
+}
+.tox-pop .tox-pop__dialog {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox-pop .tox-pop__dialog .tox-toolbar {
+ background-position: center top 43px;
+ background-size: calc(100% - 4px * 2) calc(100% - 51px);
+ padding: 4px 0;
+}
+.tox .tox-toolbar__group {
+ align-items: center;
+ display: flex;
+ flex-wrap: wrap;
+ margin: 0 0;
+ padding: 0 4px 0 4px;
+}
+.tox .tox-toolbar__group--pull-right {
+ margin-left: auto;
+}
+.tox .tox-toolbar--scrolling .tox-toolbar__group {
+ flex-shrink: 0;
+ flex-wrap: nowrap;
+}
+.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type) {
+ border-right: 1px solid #cccccc;
+}
+.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type) {
+ border-left: 1px solid #cccccc;
+}
+.tox .tox-tooltip {
+ display: inline-block;
+ padding: 8px;
+ position: relative;
+}
+.tox .tox-tooltip__body {
+ background-color: #222f3e;
+ border-radius: 3px;
+ box-shadow: 0 2px 4px rgba(34, 47, 62, 0.3);
+ color: rgba(255, 255, 255, 0.75);
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ padding: 4px 8px;
+ text-transform: none;
+}
+.tox .tox-tooltip__arrow {
+ position: absolute;
+}
+.tox .tox-tooltip--down .tox-tooltip__arrow {
+ border-left: 8px solid transparent;
+ border-right: 8px solid transparent;
+ border-top: 8px solid #222f3e;
+ bottom: 0;
+ left: 50%;
+ position: absolute;
+ transform: translateX(-50%);
+}
+.tox .tox-tooltip--up .tox-tooltip__arrow {
+ border-bottom: 8px solid #222f3e;
+ border-left: 8px solid transparent;
+ border-right: 8px solid transparent;
+ left: 50%;
+ position: absolute;
+ top: 0;
+ transform: translateX(-50%);
+}
+.tox .tox-tooltip--right .tox-tooltip__arrow {
+ border-bottom: 8px solid transparent;
+ border-left: 8px solid #222f3e;
+ border-top: 8px solid transparent;
+ position: absolute;
+ right: 0;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-tooltip--left .tox-tooltip__arrow {
+ border-bottom: 8px solid transparent;
+ border-right: 8px solid #222f3e;
+ border-top: 8px solid transparent;
+ left: 0;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-well {
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ padding: 8px;
+ width: 100%;
+}
+.tox .tox-well > *:first-child {
+ margin-top: 0;
+}
+.tox .tox-well > *:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-well > *:only-child {
+ margin: 0;
+}
+.tox .tox-custom-editor {
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ display: flex;
+ flex: 1;
+ position: relative;
+}
+/* stylelint-disable */
+.tox {
+ /* stylelint-enable */
+}
+.tox .tox-dialog-loading::before {
+ background-color: rgba(0, 0, 0, 0.5);
+ content: "";
+ height: 100%;
+ position: absolute;
+ width: 100%;
+ z-index: 1000;
+}
+.tox .tox-tab {
+ cursor: pointer;
+}
+.tox .tox-dialog__content-js {
+ display: flex;
+ flex: 1;
+}
+.tox .tox-dialog__body-content .tox-collection {
+ display: flex;
+ flex: 1;
+}
+.tox:not(.tox-tinymce-inline) .tox-editor-header {
+ background-color: none;
+ padding: 0;
+}
+.tox.tox-tinymce--toolbar-bottom .tox-editor-header,
+.tox.tox-tinymce-inline .tox-editor-header {
+ margin-bottom: -1px;
+}
+.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header {
+ border-top: none;
+ box-shadow: none;
+}
+.tox.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header {
+ background-color: transparent;
+ box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25);
+ padding: 0;
+}
+.tox.tox.tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header {
+ box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25);
+}
+.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker {
+ margin: -4px 0;
+}
+.tox .tox-menu.tox-collection.tox-collection--list {
+ padding: 0;
+}
+.tox .tox-pop {
+ box-shadow: none;
+}
+.tox .tox-tbtn,
+.tox .tox-tbtn--select,
+.tox .tox-split-button {
+ margin: 2px 0 3px 0;
+}
+.tox .tox-toolbar,
+.tox .tox-toolbar__primary,
+.tox .tox-toolbar__overflow {
+ background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0px #fff !important;
+}
+.tox .tox-menubar + .tox-toolbar-overlord {
+ border-top: none;
+}
+.tox .tox-menubar + .tox-toolbar,
+.tox .tox-menubar + .tox-toolbar-overlord .tox-toolbar__primary {
+ border-top: 1px solid #cccccc;
+ margin-top: -1px;
+}
+.tox.tox-tinymce-aux .tox-toolbar__overflow {
+ border: 1px solid #cccccc;
+ padding: 0;
+}
+.tox:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,
+.tox:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child {
+ border-top: 1px solid #cccccc;
+}
+.tox .tox-toolbar__group {
+ padding: 0 4px 0 4px;
+}
+.tox .tox-collection__item {
+ border-radius: 0;
+ cursor: pointer;
+}
+.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]) {
+ color: rgba(34, 47, 62, 0.7);
+ text-decoration: underline;
+}
+.tox .tox-statusbar__branding svg {
+ vertical-align: -0.25em;
+}
+.tox:not([dir=rtl]) .tox-statusbar__branding {
+ margin-left: 1ch;
+}
+.tox .tox-statusbar__resize-handle {
+ padding-bottom: 0;
+ padding-right: 0;
+}
diff --git a/public/tinymce/skins/ui/tinymce-5/skin.min.css b/public/tinymce/skins/ui/tinymce-5/skin.min.css
new file mode 100644
index 00000000..a7d24a17
--- /dev/null
+++ b/public/tinymce/skins/ui/tinymce-5/skin.min.css
@@ -0,0 +1 @@
+.tox{box-shadow:none;box-sizing:content-box;color:#222f3e;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #ccc;border-radius:0;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox.tox-tinymce-inline{border:none;box-shadow:none;overflow:initial}.tox.tox-tinymce-inline .tox-editor-container{overflow:initial}.tox.tox-tinymce-inline .tox-editor-header{background-color:#fff;border:1px solid #ccc;border-radius:0;box-shadow:none;overflow:hidden}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox[dir=rtl] .tox-icon--flip svg{transform:rotateY(180deg)}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #ccc;border-radius:3px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#ccc;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.1);border-color:rgba(32,122,183,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:rgba(32,122,183,.4)}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.1);border-color:rgba(255,165,0,.5);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.5)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.1);border-color:rgba(204,0,0,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.4)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#c00}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.1);border-color:rgba(120,171,70,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.4)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#207ab7;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#207ab7;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:none;white-space:nowrap}.tox .tox-button[disabled]{background-color:#207ab7;background-image:none;border-color:#207ab7;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#185d8c;background-image:none;border-color:#185d8c;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#f0f0f0;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#f0f0f0;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;color:#222f3e;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:none}.tox .tox-button--secondary[disabled]{background-color:#f0f0f0;background-image:none;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:hover:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:active:not(:disabled){background-color:#d6d6d6;background-image:none;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#222f3e}.tox .tox-button--naked[disabled]{background-color:#f0f0f0;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:focus:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:active:not(:disabled){background-color:#d6d6d6;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#222f3e}.tox .tox-checkbox{align-items:center;border-radius:3px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:3px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(34,47,62,.3)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#207ab7}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#207ab7}.tox .tox-checkbox--disabled{color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(34,47,62,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:3px;box-shadow:inset 0 0 0 1px #207ab7;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#ccc;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#e6e6e6;color:rgba(34,47,62,.7);cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;border-radius:3px;color:#222f3e;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#fff;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#dee0e2;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(34,47,62,.7);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#222f3e}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg{fill:rgba(34,47,62,.5)}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 0 2px 0 rgba(34,47,62,.2),0 4px 8px 0 rgba(34,47,62,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:3px 0 2px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #ccc}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #ccc}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{fill:#222f3e;height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#dee0e2}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#fff;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#222f3e;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(34,47,62,.7);font-size:12px}.tox .tox-comment__body{color:#222f3e;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(34,47,62,.7);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#fff;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(255,255,255,0),#fff);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#fff;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#222f3e;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#fff;box-shadow:0 0 8px 8px #fff;color:#222f3e;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#fff;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(34,47,62,.7)}.tox .tox-user__name{color:rgba(34,47,62,.7);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(255,255,255,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#fff}.tox .tox-dialog{background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#fff;border-bottom:none;color:#222f3e;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#222f3e;display:flex;flex:1;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(34,47,62,.7);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #207ab7;color:#207ab7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#207ab7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#222f3e}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;margin-inline-end:0;margin-inline-start:0;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#222f3e;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#222f3e;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#fff;border-top:1px solid #ccc;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(255,255,255,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #ccc}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #ccc;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(34,47,62,.7);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #ccc}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{background-color:#fff;border-bottom:none;box-shadow:none;padding:4px 0;transition:box-shadow .5s}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header{border-top:1px solid #c1c1c1;box-shadow:none}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:#fff;box-shadow:0 4px 4px -3px rgba(0,0,0,.25);padding:4px 0}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header{box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{border-color:#ccc;box-shadow:none;max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(34,47,62,.2);border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#207ab7;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(0,0,0,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #fff;border-radius:3px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(34,47,62,.7);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column}.tox .tox-form__group--stretched .tox-textarea{flex:1}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#fff;border-color:#207ab7;box-shadow:none;outline:2px solid rgba(32,122,183,.25)}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#207ab7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#222f3e}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#222f3e}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#fff;border-color:#207ab7;box-shadow:none;outline:2px solid rgba(32,122,183,.25)}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-imagepreview{background-color:#666;height:380px;overflow:hidden;position:relative;width:100%}.tox .tox-imagepreview.tox-imagepreview__loaded{overflow:auto}.tox .tox-imagepreview__container{display:flex;left:100vw;position:absolute;top:100vw}.tox .tox-imagepreview__image{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools .tox-spacer{flex:1}.tox .tox-image-tools .tox-bar{align-items:center;display:flex;height:60px;justify-content:center}.tox .tox-image-tools .tox-imagepreview,.tox .tox-image-tools .tox-imagepreview+.tox-bar{margin-top:8px}.tox .tox-image-tools .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-image-tools .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-image-tools .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-image-tools .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-image-tools .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-image-tools .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-image-tools .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#ccc;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:0 -4px}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:rgba(34,47,62,.7);display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0 0}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #ccc}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn--active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:grid;font-size:14px;font-weight:400;grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{cursor:pointer;text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#222f3e}.tox .tox-notification--success p{color:#222f3e}.tox .tox-notification--success a{color:#517342}.tox .tox-notification--success svg{fill:#222f3e}.tox .tox-notification--error{background-color:#f5cccc;border-color:#f0b3b3;color:#222f3e}.tox .tox-notification--error p{color:#222f3e}.tox .tox-notification--error a{color:#77181f}.tox .tox-notification--error svg{fill:#222f3e}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fff5cc;border-color:#fff0b3;color:#222f3e}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#222f3e}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#7a6e25}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#222f3e}.tox .tox-notification--info{background-color:#d6e7fb;border-color:#c1dbf9;color:#222f3e}.tox .tox-notification--info p{color:#222f3e}.tox .tox-notification--info a{color:#2a64a6}.tox .tox-notification--info svg{fill:#222f3e}.tox .tox-notification__body{align-self:center;color:#222f3e;font-size:14px;grid-column-end:3;grid-column-start:2;grid-row-end:2;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{align-self:center;grid-column-end:2;grid-column-start:1;grid-row-end:2;grid-row-start:1;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{align-self:start;grid-column-end:4;grid-column-start:3;grid-row-end:2;grid-row-start:1;justify-self:end}.tox .tox-notification .tox-progress-bar{grid-column-end:4;grid-column-start:1;grid-row-end:3;grid-row-start:2;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar,.tox .tox-pop--resizing .tox-toolbar__group{flex-wrap:nowrap}.tox .tox-pop--transition{transition:.15s ease;transition-property:left,right,top,bottom}.tox .tox-pop--transition::after,.tox .tox-pop--transition::before{transition:all .15s,visibility 0s,opacity 75ms ease 75ms}.tox .tox-pop__dialog{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 0 2px 0 rgba(34,47,62,.2),0 4px 8px 0 rgba(34,47,62,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;opacity:1;position:absolute;width:0}.tox .tox-pop.tox-pop--inset::after,.tox .tox-pop.tox-pop--inset::before{opacity:0;transition:all 0s .15s,visibility 0s,opacity 75ms ease}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#fff transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#ccc transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #fff transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #ccc transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #fff transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #ccc transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #fff;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #ccc;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;min-height:0}.tox .tox-sidebar{background-color:#fff;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #ccc;border-radius:3px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#207ab7;border:2px solid #185d8c;border-radius:3px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-form__controls-h-stack>.tox-slider:not(:first-of-type){margin-inline-start:8px}.tox .tox-form__controls-h-stack>.tox-form__group+.tox-slider{margin-inline-start:32px}.tox .tox-form__controls-h-stack>.tox-slider+.tox-form__group{margin-inline-start:32px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(34,47,62,.7);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#fff;border-top:1px solid #ccc;color:rgba(34,47,62,.7);display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:rgba(34,47,62,.7);text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){color:#222f3e;cursor:pointer}.tox .tox-statusbar__branding svg{fill:rgba(34,47,62,.8);height:1.14em;vertical-align:-.28em;width:3.6em}.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled=true]) svg,.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled=true]) svg{fill:#222f3e}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-bottom:3px;padding-left:1ch;padding-right:3px}.tox .tox-statusbar__resize-handle svg{display:block;fill:rgba(34,47,62,.5)}.tox .tox-statusbar__resize-handle:focus svg{background-color:#dee0e2;border-radius:1px 1px -4px 1px;box-shadow:0 0 0 2px #dee0e2}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:2ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(255,255,255,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:3px 0 2px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#222f3e}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#dee0e2;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:hover svg{fill:#222f3e}.tox .tox-tbtn:active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:active svg{fill:#222f3e}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#222f3e}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:3px 0 2px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--bespoke{background:0 0}.tox .tox-tbtn--bespoke+.tox-tbtn--bespoke{margin-inline-start:0}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:3px 0 2px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #dee0e2 inset}.tox .tox-split-button:focus{background:#dee0e2;box-shadow:none;color:#222f3e}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(34,47,62,.5)}.tox.tox-platform-touch .tox-split-button .tox-tbtn--select{padding:0 0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-toolbar-overlord{background-color:#fff}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background-color:#fff;background-image:repeating-linear-gradient(#ccc 0 1px,transparent 1px 39px);background-position:center top 39px;background-repeat:no-repeat;background-size:calc(100% - 4px * 2) calc(100% - 39px);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0;transform:perspective(1px)}.tox .tox-toolbar-overlord>.tox-toolbar,.tox .tox-toolbar-overlord>.tox-toolbar__overflow,.tox .tox-toolbar-overlord>.tox-toolbar__primary{background-position:center top 0;background-size:calc(100% - 4px * 2) calc(100% - 0px)}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord{border-top:1px solid #ccc;margin-top:0;padding-bottom:0;padding-top:0}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child,.tox .tox-toolbar-overlord .tox-toolbar__primary{background-position:center top 39px}.tox .tox-editor-header>.tox-toolbar--scrolling,.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child{background-image:none}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#fff;background-position:center top 43px;background-size:calc(100% - 8px * 2) calc(100% - 51px);border:none;border-radius:3px;box-shadow:0 0 2px 0 rgba(34,47,62,.2),0 4px 8px 0 rgba(34,47,62,.15);padding:4px 0}.tox-pop .tox-pop__dialog .tox-toolbar{background-position:center top 43px;background-size:calc(100% - 4px * 2) calc(100% - 51px);padding:4px 0}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #ccc}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #ccc}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#222f3e;border-radius:3px;box-shadow:0 2px 4px rgba(34,47,62,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #222f3e;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #222f3e;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #222f3e;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #222f3e;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #ccc;border-radius:3px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #ccc;border-radius:3px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{background-color:none;padding:0}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header{border-top:none;box-shadow:none}.tox.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25);padding:0}.tox.tox.tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header{box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-pop{box-shadow:none}.tox .tox-split-button,.tox .tox-tbtn,.tox .tox-tbtn--select{margin:2px 0 3px 0}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff!important}.tox .tox-menubar+.tox-toolbar-overlord{border-top:none}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #ccc;margin-top:-1px}.tox.tox-tinymce-aux .tox-toolbar__overflow{border:1px solid #ccc;padding:0}.tox:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #ccc}.tox .tox-toolbar__group{padding:0 4px 0 4px}.tox .tox-collection__item{border-radius:0;cursor:pointer}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){color:rgba(34,47,62,.7);text-decoration:underline}.tox .tox-statusbar__branding svg{vertical-align:-.25em}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox .tox-statusbar__resize-handle{padding-bottom:0;padding-right:0}
diff --git a/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.css b/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.css
new file mode 100644
index 00000000..25b0a371
--- /dev/null
+++ b/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.css
@@ -0,0 +1,30 @@
+body.tox-dialog__disable-scroll {
+ overflow: hidden;
+}
+.tox-fullscreen {
+ border: 0;
+ height: 100%;
+ margin: 0;
+ overflow: hidden;
+ overscroll-behavior: none;
+ padding: 0;
+ touch-action: pinch-zoom;
+ width: 100%;
+}
+.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {
+ display: none;
+}
+.tox.tox-tinymce.tox-fullscreen,
+.tox-shadowhost.tox-fullscreen {
+ left: 0;
+ position: fixed;
+ top: 0;
+ z-index: 1200;
+}
+.tox.tox-tinymce.tox-fullscreen {
+ background-color: transparent;
+}
+.tox-fullscreen .tox.tox-tinymce-aux,
+.tox-fullscreen ~ .tox.tox-tinymce-aux {
+ z-index: 1201;
+}
diff --git a/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css b/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css
new file mode 100644
index 00000000..8745951a
--- /dev/null
+++ b/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css
@@ -0,0 +1 @@
+body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 00000000..545c4771
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/api/index.js b/src/api/index.js
new file mode 100644
index 00000000..271f33c0
--- /dev/null
+++ b/src/api/index.js
@@ -0,0 +1,11 @@
+/**
+ * @description 自动import导入所有 api 模块
+ */
+
+const files = require.context('./model', false, /\.js$/)
+const modules = {}
+files.keys().forEach((key) => {
+ modules[key.replace(/(\.\/|\.js)/g, '')] = files(key).default
+})
+
+export default modules
diff --git a/src/api/model/auth.js b/src/api/model/auth.js
new file mode 100644
index 00000000..8b0071af
--- /dev/null
+++ b/src/api/model/auth.js
@@ -0,0 +1,47 @@
+import config from "@/config"
+import http from "@/utils/request"
+
+export default {
+ token: {
+ url: `${config.API_URL}/auth/token/`,
+ name: "登录获取TOKEN",
+ post: async function(data={}){
+ return await http.post(this.url, data);
+ }
+ },
+ info: {
+ url: `${config.API_URL}/system/user/info/`,
+ name: "获取账户信息",
+ get: async function(data={}){
+ return await http.get(this.url, data);
+ }
+ },
+ sms_code: {
+ url: `${config.API_URL}/auth/sms_code/`,
+ name: "获取验证码",
+ req: async function(data={}){
+ return await http.post(this.url, data);
+ }
+ },
+ login_sms_code: {
+ url: `${config.API_URL}/auth/login_sms_code/`,
+ name: "手机验证码登录",
+ req: async function(data={}){
+ return await http.post(this.url, data);
+ }
+ },
+ reset_password: {
+ url: `${config.API_URL}/auth/reset_password/`,
+ name: "重置密码",
+ req: async function(data={}){
+ return await http.post(this.url, data);
+ }
+ },
+ login_face: {
+ url: `${config.API_URL}/auth/login_face/`,
+ name: "人脸登录",
+ req: async function(data={}){
+ return await http.post(this.url, data);
+ }
+ },
+}
diff --git a/src/api/model/common.js b/src/api/model/common.js
new file mode 100644
index 00000000..1f036a7c
--- /dev/null
+++ b/src/api/model/common.js
@@ -0,0 +1,28 @@
+import config from "@/config"
+import http from "@/utils/request"
+
+export default {
+ upload: {
+ url: `${config.API_URL}/file/`,
+ name: "文件上传",
+ post: async function(data, config={}){
+ return await http.post(this.url, data, config);
+ }
+ },
+ uploadFile: {
+ url: `${config.API_URL}/file/`,
+ name: "附件上传",
+ post: async function(data, config={}){
+ return await http.post(this.url, data, config);
+ }
+ },
+ file: {
+ list: {
+ url: `${config.API_URL}/file`,
+ name: "获取文件列表",
+ get: async function(params){
+ return await http.get(this.url, params);
+ }
+ }
+ }
+}
diff --git a/src/api/model/ops.js b/src/api/model/ops.js
new file mode 100644
index 00000000..acb77651
--- /dev/null
+++ b/src/api/model/ops.js
@@ -0,0 +1,76 @@
+import config from "@/config"
+import http from "@/utils/request"
+
+export default {
+ logs: {
+ list: {
+ url: `${config.API_URL}/monitor/request_log/`,
+ name: "请求日志",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ audit: {
+ url: `${config.API_URL}/monitor/auditlog/`,
+ name: "审计日志",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ }
+ },
+ dbbackup: {
+ list: {
+ url: `${config.API_URL}/monitor/dbbackup/`,
+ name: "数据库备份",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ deletes: {
+ url: `${config.API_URL}/monitor/dbbackup/`,
+ name: "数据库备份",
+ req: async function(data){
+ return await http.delete(this.url, data);
+ }
+ }
+ },
+ file_logs: {
+ list: {
+ url: `${config.API_URL}/monitor/log/`,
+ name: "文件日志",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ detail: {
+ name: "文件日志",
+ req: async function(name){
+ return await http.get(`${config.API_URL}/monitor/log/${name}/`);
+ }
+ }
+ },
+ server: {
+ info: {
+ name: "服务器状态",
+ req: async function(name){
+ return await http.get(`${config.API_URL}/monitor/server/`);
+ }
+ }
+ },
+ celery: {
+ info: {
+ name: "celery状态",
+ req: async function(name){
+ return await http.get(`${config.API_URL}/monitor/celery/`);
+ }
+ }
+ },
+ redis: {
+ info: {
+ name: "redis状态",
+ req: async function(name){
+ return await http.get(`${config.API_URL}/monitor/redis/`);
+ }
+ }
+ },
+}
diff --git a/src/api/model/system.js b/src/api/model/system.js
new file mode 100644
index 00000000..c3fb3581
--- /dev/null
+++ b/src/api/model/system.js
@@ -0,0 +1,441 @@
+import config from "@/config"
+import http from "@/utils/request"
+
+export default {
+ myschedule: {
+ list: {
+ url: `${config.API_URL}/system/myschedule/`,
+ name: "获取列表",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/system/myschedule/`,
+ name: "新增",
+ req: async function(data){
+ return await http.post(this.url,data);
+ }
+ },
+ delete: {
+ name: "删除",
+ req: async function(id){
+ return await http.delete(`${config.API_URL}/system/myschedule/${id}/`);
+ }
+ }
+ },
+ dept: {
+ list: {
+ url: `${config.API_URL}/system/dept/`,
+ name: "获取部门列表",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/system/dept/`,
+ name: "新增部门",
+ req: async function(data){
+ return await http.post(this.url,data);
+ }
+ },
+ update: {
+ name: "更新部门信息",
+ req: async function(id, data){
+ return await http.put(
+ `${config.API_URL}/system/dept/${id}/`,
+ data
+ );
+ }
+ },
+ delete: {
+ name: "删除部门",
+ req: async function(id){
+ return await http.delete(`${config.API_URL}/system/dept/${id}/`);
+ }
+ }
+ },
+ dicttype: {
+ list: {
+ url: `${config.API_URL}/system/dicttype/`,
+ name: "获取字典类型列表",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/system/dicttype/`,
+ name: "新增字典类型",
+ req: async function(data){
+ return await http.post(this.url,data);
+ }
+ },
+ update: {
+ name: "更新字典类型",
+ req: async function(id, data){
+ return await http.put(
+ `${config.API_URL}/system/dicttype/${id}/`,
+ data
+ );
+ }
+ },
+ delete: {
+ name: "删除字典类型",
+ req: async function(id){
+ return await http.delete(`${config.API_URL}/system/dicttype/${id}/`);
+ }
+ }
+ },
+ dict: {
+ list: {
+ url: `${config.API_URL}/system/dict/`,
+ name: "获取字典列表",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/system/dict/`,
+ name: "新增字典",
+ req: async function(data){
+ return await http.post(this.url,data);
+ }
+ },
+ update: {
+ name: "更新字典",
+ req: async function(id, data){
+ return await http.put(
+ `${config.API_URL}/system/dict/${id}/`,
+ data
+ );
+ }
+ },
+ delete: {
+ name: "删除字典",
+ req: async function(id){
+ return await http.delete(`${config.API_URL}/system/dict/${id}/`);
+ }
+ }
+ },
+ permission:{
+ list: {
+ url: `${config.API_URL}/system/permission/`,
+ name: "获取菜单权限列表",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ codes: {
+ url: `${config.API_URL}/system/permission/codes/`,
+ name: "获取全部权限标识",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/system/permission/`,
+ name: "新增菜单权限",
+ req: async function(data){
+ return await http.post(this.url,data);
+ }
+ },
+ update: {
+ name: "更新菜单权限",
+ req: async function(id, data){
+ return await http.put(
+ `${config.API_URL}/system/permission/${id}/`,
+ data
+ );
+ }
+ },
+ delete: {
+ name: "删除菜单权限",
+ req: async function(id){
+ return await http.delete(`${config.API_URL}/system/permission/${id}/`);
+ }
+ },
+ deletes: {
+ name: "批量删除菜单权限",
+ url: `${config.API_URL}/system/permission/deletes/`,
+ req: async function(data){
+ return await http.post(this.url,data);
+ }
+ },
+ },
+ role: {
+ list: {
+ url: `${config.API_URL}/system/role/`,
+ name: "获取角色列表",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/system/role/`,
+ name: "新增角色",
+ req: async function(data){
+ return await http.post(this.url,data);
+ }
+ },
+ update: {
+ name: "更新角色",
+ req: async function(id, data){
+ return await http.put(
+ `${config.API_URL}/system/role/${id}/`,
+ data
+ );
+ }
+ },
+ delete: {
+ name: "删除角色",
+ req: async function(id){
+ return await http.delete(`${config.API_URL}/system/role/${id}/`);
+ }
+ },
+ },
+ user: {
+ list: {
+ url: `${config.API_URL}/system/user/`,
+ name: "获取用户列表",
+ req: async function(params){
+ return await http.get(this.url, params);
+ }
+ },
+ read: {
+ name: "用户详情",
+ req: async function(id){
+ return await http.get( `${config.API_URL}/system/user/info/`);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/system/user/`,
+ name: "新增用户",
+ req: async function(data){
+ return await http.post(this.url,data);
+ }
+ },
+ update: {
+ name: "更新用户",
+ req: async function(id, data){
+ return await http.put(
+ `${config.API_URL}/system/user/${id}/`,
+ data
+ );
+ }
+ },
+ put:{
+ url: `${config.API_URL}/system/user/password/`,
+ name: "修改密码",
+ req: async function(data){
+ return await http.put(this.url,data);
+ }
+ },
+ delete: {
+ name: "删除用户",
+ req: async function(id){
+ return await http.delete(`${config.API_URL}/system/user/${id}/`);
+ }
+ },
+ rPassword: {
+ name: "重置密码",
+ req: async function( id){
+ return await http.post(`${config.API_URL}/system/user/${id}/reset_password/`);
+ }
+ }
+ },
+ post: {
+ list: {
+ url: `${config.API_URL}/system/post/`,
+ name: "获取岗位列表",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/system/post/`,
+ name: "新增岗位",
+ req: async function(data){
+ return await http.post(this.url,data);
+ }
+ },
+ update: {
+ name: "更新岗位",
+ req: async function(id, data){
+ return await http.put(
+ `${config.API_URL}/system/post/${id}/`,
+ data
+ );
+ }
+ },
+ delete: {
+ name: "删除岗位",
+ req: async function(id){
+ return await http.delete(`${config.API_URL}/system/post/${id}/`);
+ }
+ }
+ },
+ postrole: {
+ list: {
+ url: `${config.API_URL}/system/post_role/`,
+ name: "获取岗位列表",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/system/post_role/`,
+ name: "新增岗位",
+ req: async function(data){
+ return await http.post(this.url,data);
+ }
+ },
+ delete: {
+ name: "删除岗位",
+ req: async function(id){
+ return await http.delete(`${config.API_URL}/system/post_role/${id}/`);
+ }
+ }
+ },
+ task: {
+ list: {
+ url: `${config.API_URL}/system/ptask/`,
+ name: "定时任务列表",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ item: {
+ name: "定时任务详情",
+ req: async function(id){
+ return await http.get( `${config.API_URL}/system/ptask/${id}/`);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/system/ptask/`,
+ name: "创建定时任务",
+ req: async function(data){
+ return await http.post(this.url,data);
+ }
+ },
+ update: {
+ name: "更新定时任务",
+ req: async function(id, data){
+ return await http.put(
+ `${config.API_URL}/system/ptask/${id}/`,
+ data
+ );
+ }
+ },
+ updateToggle: {
+ name: "修改启用禁用状态",
+ req: async function(id, data){
+ return await http.put(
+ `${config.API_URL}/system/ptask/${id}/toggle/`,
+ data
+ );
+ }
+ },
+ delete: {
+ name: "删除定时任务",
+ req: async function(id){
+ return await http.delete(`${config.API_URL}/system/ptask/${id}/`);
+ }
+ },
+ deletes: {
+ url: `${config.API_URL}/system/ptask/deletes/`,
+ name: "批量删除定时任务",
+ req: async function(data){
+ return await http.post(this.url,data);
+ }
+ },
+ runOnce: {
+ name: "执行一次",
+ req: async function(data, id){
+ return await http.post(`${config.API_URL}/system/ptask/${id}/run_once/`,data);
+ }
+ },
+ result: {
+ url: `${config.API_URL}/system/ptask_result/`,
+ name: "任务执行结果列表",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ resultItem: {
+ name: "任务执行结果详情",
+ req: async function(id){
+ return await http.get( `${config.API_URL}/system/ptask_result/${id}/`);
+ }
+ },
+ },
+ apk:{
+ read: {
+ url: `${config.API_URL}/system/apk/`,
+ name: "apk信息",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/system/apk/`,
+ name: "apk创建",
+ req: async function(data){
+ return await http.post(this.url, data);
+ }
+ }
+ },
+ userPost:{
+ list: {
+ url: `${config.API_URL}/system/user_post/`,
+ name: "用户/岗位关系",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/system/user_post/`,
+ name: "新增用户/岗位关系",
+ req: async function(data){
+ return await http.post(this.url,data);
+ }
+ },
+ delete: {
+ name: "删除用户/岗位关系",
+ req: async function(id){
+ return await http.delete(`${config.API_URL}/system/user_post/${id}/`);
+ }
+ }
+ },
+ tasks: {
+ list: {
+ url: `${config.API_URL}/system/tasks/list`,
+ name: "系统任务管理",
+ get: async function(params){
+ return await http.get(this.url, params);
+ }
+ }
+ },
+ config: {
+ base: {
+ url: `${config.API_URL}/system/base_config/`,
+ name: "账户信息",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ getInfo: {
+ url: `${config.API_URL}/system/config/`,
+ name: "获取系统信息",
+ req: async function(){
+ return await http.get(this.url);
+ }
+ },
+ updateInfo: {
+ url: `${config.API_URL}/system/config/`,
+ name: "更新系统信息",
+ req: async function(data){
+ return await http.put(this.url, data);
+ }
+ },
+ }
+}
diff --git a/src/api/model/wf.js b/src/api/model/wf.js
new file mode 100644
index 00000000..0bd01bb7
--- /dev/null
+++ b/src/api/model/wf.js
@@ -0,0 +1,307 @@
+import config from "@/config"
+import http from "@/utils/request"
+
+export default {
+ workflow: {
+ list: {
+ url: `${config.API_URL}/wf/workflow/`,
+ name: "工作流列表",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ item: {
+ name: "工作流详情",
+ req: async function(id){
+ return await http.get( `${config.API_URL}/wf/workflow/${id}/`);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/wf/workflow/`,
+ name: "新增工作流",
+ req: async function(data){
+ return await http.post(this.url, data);
+ }
+ },
+ update: {
+ name: "更新工作流",
+ req: async function(id, data){
+ return await http.put(
+ `${config.API_URL}/wf/workflow/${id}/`,
+ data
+ );
+ }
+ },
+ clone: {
+ name: "克隆工作流",
+ req: async function(id, data){
+ return await http.put(
+ `${config.API_URL}/wf/workflow/${id}/clone/`,
+ data
+ );
+ }
+ },
+ delete: {
+ name: "删除工作流",
+ req: async function(id){
+ return await http.delete(`${config.API_URL}/wf/workflow/${id}/`);
+ }
+ },
+ init: {
+ name: "新建工单初始化",
+ req: async function(id){
+ return await http.get( `${config.API_URL}/wf/workflow/${id}/init/`);
+ }
+ },
+ initkey: {
+ name: "新建工单初始化",
+ req: async function(key){
+ return await http.get( `${config.API_URL}/wf/workflow/${key}/init_key/`);
+ }
+ },
+ customfields: {
+ name: "工作流下的自定义字段",
+ req: async function(id){
+ return await http.get( `${config.API_URL}/wf/workflow/${id}/customfields/`);
+ }
+ },
+ states: {
+ name: "工作流下的状态节点",
+ req: async function(id){
+ return await http.get( `${config.API_URL}/wf/workflow/${id}/states/`);
+ }
+ },
+ transitions: {
+ name: "工作流下的流转规则",
+ req: async function(id){
+ return await http.get( `${config.API_URL}/wf/workflow/${id}/transitions/`);
+ }
+ }
+ },
+ ticket: {
+ list: {
+ url: `${config.API_URL}/wf/ticket/`,
+ name: "工单列表",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ ticketItem: {
+ name: "工单详情",
+ req: async function(id){
+ return await http.get(`${config.API_URL}/wf/ticket/${id}/`);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/wf/ticket/`,
+ name: "新增工单",
+ req: async function(data){
+ return await http.post(this.url, data);
+ }
+ },
+ destorys: {
+ url: `${config.API_URL}/wf/ticket/destorys/`,
+ name: "批量物理删除",
+ req: async function(data){
+ return await http.post(this.url, data);
+ }
+ },
+ ticketAccept: {
+ name: "接单",
+ req: async function(id,data){
+ return await http.post(`${config.API_URL}/wf/ticket/${id}/accpet/`,data);
+ }
+ },
+ addNodeEnd: {
+ name: "加签完成",
+ req: async function(id,data){
+ return await http.post(`${config.API_URL}/wf/ticket/${id}/add_node_end/`,data);
+ }
+ },
+ addNode: {
+ name: "加签",
+ req: async function(id,data){
+ return await http.post(`${config.API_URL}/wf/ticket/${id}/add_node/`,data);
+ }
+ },
+ ticketClose: {
+ name: "关闭工单",
+ req: async function(id,data){
+ return await http.post(`${config.API_URL}/wf/ticket/${id}/close/`,data);
+ }
+ },
+ ticketDeliver: {
+ name: "转交工单",
+ req: async function(id,data){
+ return await http.post(`${config.API_URL}/wf/ticket/${id}/deliver/`,data);
+ }
+ },
+ ticketHandle: {
+ name: "处理工单",
+ req: async function(id,data){
+ return await http.post(`${config.API_URL}/wf/ticket/${id}/handle/`,data);
+ }
+ },
+ ticketRetreat: {
+ name: "撤回工单",
+ req: async function(id,data){
+ return await http.post(`${config.API_URL}/wf/ticket/${id}/retreat/`,data);
+ }
+ },
+ ticketFlowlogs: {
+ name: "工单流转记录",
+ req: async function(id){
+ return await http.get( `${config.API_URL}/wf/ticket/${id}/flowlogs/`);
+ }
+ },
+ ticketFlowSteps: {
+ name: "工单流转step, 用于显示当前状态的step图(线性结构)",
+ req: async function(id){
+ return await http.get( `${config.API_URL}/wf/ticket/${id}/flowsteps/`);
+ }
+ },
+ ticketTransitions: {
+ name: "获取工单可执行的操作",
+ req: async function(id){
+ return await http.get( `${config.API_URL}/wf/ticket/${id}/transitions/`);
+ }
+ },
+ dutyAgg: {
+ url: `${config.API_URL}/wf/ticket/duty_agg/`,
+ name: "待办审批聚合",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ ticketFlow: {
+ url: `${config.API_URL}/wf/ticketflow/`,
+ name: "工单日志",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ ticketFlowItem: {
+ name: "获取工单可执行的操作",
+ req: async function(id){
+ return await http.get( `${config.API_URL}/wf/ticketflow/${id}/`);
+ }
+ },
+ retryScript: {
+ name: "重试脚本",
+ req: async function(id){
+ return await http.post(`${config.API_URL}/wf/ticket/${id}/retry_script/`);
+ }
+ },
+ },
+ field:{
+ list: {
+ url: `${config.API_URL}/wf/customfield/`,
+ name: "字段列表",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ item: {
+ name: "字段详情",
+ req: async function(id){
+ return await http.get( `${config.API_URL}/wf/customfield/${id}/`);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/wf/customfield/`,
+ name: "新增字段",
+ req: async function(data){
+ return await http.post(this.url, data);
+ }
+ },
+ update: {
+ name: "更新字段",
+ req: async function(id, data){
+ return await http.put(
+ `${config.API_URL}/wf/customfield/${id}/`,
+ data
+ );
+ }
+ },
+ delete: {
+ name: "删除字段",
+ req: async function(id){
+ return await http.delete(`${config.API_URL}/wf/customfield/${id}/`);
+ }
+ }
+ },
+ state:{
+ list: {
+ url: `${config.API_URL}/wf/state/`,
+ name: "状态列表",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ item: {
+ name: "状态详情",
+ req: async function(id){
+ return await http.get( `${config.API_URL}/wf/state/${id}/`);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/wf/state/`,
+ name: "新增状态",
+ req: async function(data){
+ return await http.post(this.url, data);
+ }
+ },
+ update: {
+ name: "更新状态",
+ req: async function(id, data){
+ return await http.put(
+ `${config.API_URL}/wf/state/${id}/`,
+ data
+ );
+ }
+ },
+ delete: {
+ name: "删除状态",
+ req: async function(id){
+ return await http.delete(`${config.API_URL}/wf/state/${id}/`);
+ }
+ }
+ },
+ transition:{
+ list: {
+ url: `${config.API_URL}/wf/transition/`,
+ name: "流转列表",
+ req: async function(data){
+ return await http.get(this.url, data);
+ }
+ },
+ item: {
+ name: "流转详情",
+ req: async function(id){
+ return await http.get( `${config.API_URL}/wf/transition/${id}/`);
+ }
+ },
+ create: {
+ url: `${config.API_URL}/wf/transition/`,
+ name: "新增流转",
+ req: async function(data){
+ return await http.post(this.url, data);
+ }
+ },
+ update: {
+ name: "更新流转",
+ req: async function(id, data){
+ return await http.put(
+ `${config.API_URL}/wf/transition/${id}/`,
+ data
+ );
+ }
+ },
+ delete: {
+ name: "删除流转",
+ req: async function(id){
+ return await http.delete(`${config.API_URL}/wf/transition/${id}/`);
+ }
+ }
+ }
+}
diff --git a/src/assets/icons/BugFill.vue b/src/assets/icons/BugFill.vue
new file mode 100644
index 00000000..35a6edcb
--- /dev/null
+++ b/src/assets/icons/BugFill.vue
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/icons/BugLine.vue b/src/assets/icons/BugLine.vue
new file mode 100644
index 00000000..b1cb9ad1
--- /dev/null
+++ b/src/assets/icons/BugLine.vue
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/icons/Code.vue b/src/assets/icons/Code.vue
new file mode 100644
index 00000000..9d1581cf
--- /dev/null
+++ b/src/assets/icons/Code.vue
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/Download.vue b/src/assets/icons/Download.vue
new file mode 100644
index 00000000..3b139da7
--- /dev/null
+++ b/src/assets/icons/Download.vue
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/FileExcel.vue b/src/assets/icons/FileExcel.vue
new file mode 100644
index 00000000..c6d5fdfa
--- /dev/null
+++ b/src/assets/icons/FileExcel.vue
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/FilePpt.vue b/src/assets/icons/FilePpt.vue
new file mode 100644
index 00000000..9fcf2a22
--- /dev/null
+++ b/src/assets/icons/FilePpt.vue
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/FileWord.vue b/src/assets/icons/FileWord.vue
new file mode 100644
index 00000000..cfd035a6
--- /dev/null
+++ b/src/assets/icons/FileWord.vue
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/Gongzuotai.vue b/src/assets/icons/Gongzuotai.vue
new file mode 100644
index 00000000..aa6d6e53
--- /dev/null
+++ b/src/assets/icons/Gongzuotai.vue
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/src/assets/icons/Organization.vue b/src/assets/icons/Organization.vue
new file mode 100644
index 00000000..a666d766
--- /dev/null
+++ b/src/assets/icons/Organization.vue
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/Shenpi.vue b/src/assets/icons/Shenpi.vue
new file mode 100644
index 00000000..967165ad
--- /dev/null
+++ b/src/assets/icons/Shenpi.vue
@@ -0,0 +1,5 @@
+
+
+
diff --git a/src/assets/icons/Upload.vue b/src/assets/icons/Upload.vue
new file mode 100644
index 00000000..c0bf5e60
--- /dev/null
+++ b/src/assets/icons/Upload.vue
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/Vue.vue b/src/assets/icons/Vue.vue
new file mode 100644
index 00000000..5253d615
--- /dev/null
+++ b/src/assets/icons/Vue.vue
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/Wechat.vue b/src/assets/icons/Wechat.vue
new file mode 100644
index 00000000..a572f7b0
--- /dev/null
+++ b/src/assets/icons/Wechat.vue
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/Xiaoshou.vue b/src/assets/icons/Xiaoshou.vue
new file mode 100644
index 00000000..26386c77
--- /dev/null
+++ b/src/assets/icons/Xiaoshou.vue
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/src/assets/icons/index.js b/src/assets/icons/index.js
new file mode 100644
index 00000000..c174b827
--- /dev/null
+++ b/src/assets/icons/index.js
@@ -0,0 +1,16 @@
+export { default as Vue } from './Vue.vue'
+export { default as Code } from './Code.vue'
+export { default as Wechat } from './Wechat.vue'
+export { default as BugFill } from './BugFill.vue'
+export { default as BugLine } from './BugLine.vue'
+export { default as FileWord } from './FileWord.vue'
+export { default as FileExcel } from './FileExcel.vue'
+export { default as FilePpt } from './FilePpt.vue'
+export { default as Organization } from './Organization.vue'
+export { default as Upload } from './Upload.vue'
+export { default as Download } from './Download.vue'
+
+
+
+export { default as Gongzuotai } from './Gongzuotai.vue'
+export { default as Shenpi } from './Shenpi.vue'
\ No newline at end of file
diff --git a/src/components/mySelect/epselect.vue b/src/components/mySelect/epselect.vue
new file mode 100644
index 00000000..67f26cf3
--- /dev/null
+++ b/src/components/mySelect/epselect.vue
@@ -0,0 +1,386 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ scope.row.belong_dept_.name
+ }}
+
+
+
+
+ {{userTypeOptions[scope.row.type]}}
+
+
+
+
+
+
+
+
+
+
+ {{index+1}}-{{item.name}}
+
+
+
+
+
+ 取消
+ 确定
+
+
+
+
+
diff --git a/src/components/mySelect/select.vue b/src/components/mySelect/select.vue
new file mode 100644
index 00000000..db73d4b3
--- /dev/null
+++ b/src/components/mySelect/select.vue
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
diff --git a/src/components/mySelect/tableSelect.vue b/src/components/mySelect/tableSelect.vue
new file mode 100644
index 00000000..152df008
--- /dev/null
+++ b/src/components/mySelect/tableSelect.vue
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
+
+ {{scope.$index+(currentPage - 1) * pageSize + 1}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/mySelect/userselect.vue b/src/components/mySelect/userselect.vue
new file mode 100644
index 00000000..b413fd68
--- /dev/null
+++ b/src/components/mySelect/userselect.vue
@@ -0,0 +1,427 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{userTypeOptions[scope.row.type]}}
+
+
+
+
+
+
+
+
+
+
+
+ {{index+1}}-{{item.name}}
+
+
+
+
+
+ 取消
+ 确定
+
+
+
+
+
diff --git a/src/components/scAddress/SelectAddress.vue b/src/components/scAddress/SelectAddress.vue
new file mode 100644
index 00000000..5dda7049
--- /dev/null
+++ b/src/components/scAddress/SelectAddress.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
diff --git a/src/components/scBind/index.vue b/src/components/scBind/index.vue
new file mode 100644
index 00000000..9649cf95
--- /dev/null
+++ b/src/components/scBind/index.vue
@@ -0,0 +1,99 @@
+
+
+
+
+ {{ bindName }}
+
+
+
+
+
+
+
+
+ 绑定
+ 解绑
+
+
+
+
diff --git a/src/components/scCodeEditor/index.vue b/src/components/scCodeEditor/index.vue
new file mode 100644
index 00000000..4a9c29e6
--- /dev/null
+++ b/src/components/scCodeEditor/index.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scContextmenu/index.vue b/src/components/scContextmenu/index.vue
new file mode 100644
index 00000000..7f0a72e4
--- /dev/null
+++ b/src/components/scContextmenu/index.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scContextmenu/item.vue b/src/components/scContextmenu/item.vue
new file mode 100644
index 00000000..2a94e2f9
--- /dev/null
+++ b/src/components/scContextmenu/item.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+ {{title}}
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scCron/index.vue b/src/components/scCron/index.vue
new file mode 100644
index 00000000..9aaf6ee1
--- /dev/null
+++ b/src/components/scCron/index.vue
@@ -0,0 +1,733 @@
+
+
+
+
+
+
+
+
+
+ 每分钟
+ 每小时
+ 每天零点
+ 每月一号零点
+ 每月最后一天零点
+ 每周星期日零点
+ {{item.text}}
+ 自定义
+
+
+
+
+
+
+
+
+
+
+
+
+
秒
+ {{value_second}}
+
+
+
+
+
+ 任意值
+ 范围
+ 间隔
+ 指定
+
+
+
+
+ -
+
+
+
+
+ 秒开始,每
+
+ 秒执行一次
+
+
+
+
+
+
+
+
+
+
+
+
分钟
+ {{value_minute}}
+
+
+
+
+
+ 任意值
+ 范围
+ 间隔
+ 指定
+
+
+
+
+ -
+
+
+
+
+ 分钟开始,每
+
+ 分钟执行一次
+
+
+
+
+
+
+
+
+
+
+
+
小时
+ {{value_hour}}
+
+
+
+
+
+ 任意值
+ 范围
+ 间隔
+ 指定
+
+
+
+
+ -
+
+
+
+
+ 小时开始,每
+
+ 小时执行一次
+
+
+
+
+
+
+
+
+
+
+
+
日
+ {{value_day}}
+
+
+
+
+
+ 任意值
+ 范围
+ 间隔
+ 指定
+ 本月最后一天
+ 不指定
+
+
+
+
+ -
+
+
+
+
+ 号开始,每
+
+ 天执行一次
+
+
+
+
+
+
+
+
+
+
+
+
月
+ {{value_month}}
+
+
+
+
+
+ 任意值
+ 范围
+ 间隔
+ 指定
+
+
+
+
+ -
+
+
+
+
+ 月开始,每
+
+ 月执行一次
+
+
+
+
+
+
+
+
+
+
+
+
周
+ {{value_week}}
+
+
+
+
+
+
+ 任意值
+ 范围
+ 间隔
+ 指定
+ 本月最后一周
+ 不指定
+
+
+
+
+
+
+ -
+
+
+
+
+
+ 第
+
+ 周的星期
+
+
+
+ 执行一次
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
年
+ {{value_year}}
+
+
+
+
+
+ 忽略
+ 任意值
+ 范围
+ 间隔
+ 指定
+
+
+
+
+ -
+
+
+
+
+ 年开始,每
+
+ 年执行一次
+
+
+
+
+
+
+
+
+
+
+
+
+ 取 消
+ 确 认
+
+
+
+
+
+
+
diff --git a/src/components/scCropper/index.vue b/src/components/scCropper/index.vue
new file mode 100644
index 00000000..96055d91
--- /dev/null
+++ b/src/components/scCropper/index.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
![]()
+
+
+
+
+
+
+
+
diff --git a/src/components/scDialog/index.vue b/src/components/scDialog/index.vue
new file mode 100644
index 00000000..cfd065d7
--- /dev/null
+++ b/src/components/scDialog/index.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scEcharts/echarts-theme-T.js b/src/components/scEcharts/echarts-theme-T.js
new file mode 100644
index 00000000..41541616
--- /dev/null
+++ b/src/components/scEcharts/echarts-theme-T.js
@@ -0,0 +1,74 @@
+const T = {
+ "color": [
+ "#409EFF",
+ "#36CE9E",
+ "#f56e6a",
+ "#626c91",
+ "#edb00d",
+ "#909399"
+ ],
+ 'grid': {
+ 'left': '3%',
+ 'right': '3%',
+ 'bottom': '10',
+ 'top': '40',
+ 'containLabel': true
+ },
+ "legend": {
+ "textStyle": {
+ "color": "#999"
+ },
+ "inactiveColor": "rgba(128,128,128,0.4)"
+ },
+ "categoryAxis": {
+ "axisLine": {
+ "show": true,
+ "lineStyle": {
+ "color": "rgba(128,128,128,0.2)",
+ "width": 1
+ }
+ },
+ "axisTick": {
+ "show": false,
+ "lineStyle": {
+ "color": "#333"
+ }
+ },
+ "axisLabel": {
+ "color": "#999"
+ },
+ "splitLine": {
+ "show": false,
+ "lineStyle": {
+ "color": [
+ "#eee"
+ ]
+ }
+ },
+ "splitArea": {
+ "show": false,
+ "areaStyle": {
+ "color": [
+ "rgba(255,255,255,0.01)",
+ "rgba(0,0,0,0.01)"
+ ]
+ }
+ }
+ },
+ "valueAxis": {
+ "axisLine": {
+ "show": false,
+ "lineStyle": {
+ "color": "#999"
+ }
+ },
+ "splitLine": {
+ "show": true,
+ "lineStyle": {
+ "color": "rgba(128,128,128,0.2)"
+ }
+ }
+ }
+}
+
+export default T
diff --git a/src/components/scEcharts/index.vue b/src/components/scEcharts/index.vue
new file mode 100644
index 00000000..9e2112c4
--- /dev/null
+++ b/src/components/scEcharts/index.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
diff --git a/src/components/scEditor/index.vue b/src/components/scEditor/index.vue
new file mode 100644
index 00000000..9d771811
--- /dev/null
+++ b/src/components/scEditor/index.vue
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scFileExport/column.vue b/src/components/scFileExport/column.vue
new file mode 100644
index 00000000..e4d457f3
--- /dev/null
+++ b/src/components/scFileExport/column.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+ {{ scope.row.label }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scFileExport/index.vue b/src/components/scFileExport/index.vue
new file mode 100644
index 00000000..b8645746
--- /dev/null
+++ b/src/components/scFileExport/index.vue
@@ -0,0 +1,198 @@
+
+
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 发起导出任务
+ 下 载
+
+
+
+
+
+
+ {{val}}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scFileImport/index.vue b/src/components/scFileImport/index.vue
new file mode 100644
index 00000000..0cb6f3de
--- /dev/null
+++ b/src/components/scFileImport/index.vue
@@ -0,0 +1,133 @@
+
+
+
+
+ 导入
+
+
+
+
+
+
+
+
+ 将文件拖到此处或 点击选择文件上传
+
+
+
+
+
{{tip}}
+
请上传小于或等于 {{maxSize}}M 的 {{accept}} 格式文件
+
+ 下载导入模板
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scFileSelect/index.vue b/src/components/scFileSelect/index.vue
new file mode 100644
index 00000000..224baed9
--- /dev/null
+++ b/src/components/scFileSelect/index.vue
@@ -0,0 +1,283 @@
+
+
+
+
+
+
+
+ 已选择 {{value.length}} / {{max}} 项
+
+
+
+
+
+
+ 本地上传
+
+ 大小不超过{{maxSize}}MB
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{item[fileProps.fileName]}}
+
+
+
+
+
+
+ 确 定
+
+
+
+
+
+
+
+
diff --git a/src/components/scFilterBar/index.vue b/src/components/scFilterBar/index.vue
new file mode 100644
index 00000000..04b8e2a7
--- /dev/null
+++ b/src/components/scFilterBar/index.vue
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 过滤项
+
+
+
+
设置过滤条件
+
+ 没有默认过滤条件,请点击增加过滤项
+
+
+
+
+
+
+
+
+
+
+ |
+ {{index+1}}
+ |
+
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+ |
+
+
+
增加过滤项
+
+
+
+
+
+ 常用
+
+
+
+
+
+
+
+
+ 立即过滤
+ 另存为常用
+ 清空过滤
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scFilterBar/my.vue b/src/components/scFilterBar/my.vue
new file mode 100644
index 00000000..15a52c1f
--- /dev/null
+++ b/src/components/scFilterBar/my.vue
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+ 没有常用的过滤
+ 常用过滤可以将多个过滤条件保存为一个集合,方便下次进行相同条件的过滤
+
+
+
+ 我的常用过滤
+ -
+
+
+
+ {}">
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scFilterBar/pinyin.js b/src/components/scFilterBar/pinyin.js
new file mode 100644
index 00000000..1308b4e6
--- /dev/null
+++ b/src/components/scFilterBar/pinyin.js
@@ -0,0 +1,2 @@
+/* eslint-disable */
+!function(n,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a():"function"==typeof define&&define.amd?define(a):(n="undefined"!=typeof globalThis?globalThis:n||self).PinyinMatch=a()}(this,(function(){"use strict";var n=[],a={},i={};function u(n){for(var a=[],i=[],u=0;n.length>=u;u++)i.push(!0);return e(0,n,[],a,i),a}function e(a,i,u,o,g){if(a!==i.length)for(var h=function(h){var t=i.substring(a,h+1),r=!1;if(n.some((function(n){return 0===n.indexOf(t)}))&&!i[h+1]&&g[h+1]){if(1===t.length)u.push(t);else{var s=[];n.forEach((function(n){0===n.indexOf(t)&&s.push(n)})),u.push(s)}r=!0}else-1!==n.indexOf(t)&&g[h+1]&&(u.push(t),r=!0);if(r){var f=o.length;e(h+1,i,u,o,g),o.length===f&&(g[h+1]=!1),u.pop()}},t=a;i.length>t;t++)h(t);else o.push(u.join(" "))}function o(n){var a=[];return u(n).forEach((function(n){var i=n.split(" "),u=i.length-1;i[u].indexOf(",")?i[u].split(",").forEach((function(n){i.splice(u,1,n),a.push(JSON.parse(JSON.stringify(i)))})):a.push(i)})),0!==a.length&&a[0].length===n.length||a.push(n.split("")),i=function(n,a,i){return a in n?Object.defineProperty(n,a,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[a]=i,n}({},n,a),a}function g(n,a,i,u){if(!n)return!1;var e=n.split(" ");return e.forEach((function(n){n.length>0&&u&&e.push(n.charAt(0))})),i?e.some((function(n){return 0===n.indexOf(a)})):-1!==e.indexOf(a)}function h(n,u){if(!n||!u)return!1;n=n.toLowerCase(),u=u.replace(/\s+/g,"").toLowerCase();var e=n.indexOf(u);if(-1!==e)return[e,e+u.length-1];var g=t(n.split(""),[u.split("")],u);return g||t(function(n){for(var i=[],u=0,e=n.length;e>u;u++){var o=n.charAt(u);i.push(a[o]||o)}return i}(n),i[u]||o(u),u)}function t(n,a,i){for(var u=0;n.length>u;u++)for(var e=0;a.length>e;e++){var o=a[e],h=o.length,t=h===i.length,r=!0,s=0,f=0,c=0;if(n.length>=h){for(;o.length>s;s++)if(0===s&&" "===n[u+s+f])f+=1,s-=1;else if(" "===n[u+s+c])c+=1,s-=1;else if(!g(n[u+s+c],o[s],!n[u+s+1]||!o[s+1],t)){r=!1;break}if(r)return[u+f,c+u+s-1]}}return!1}return{match:function(i){return n=Object.keys(i),a=function(n){var a={};for(var i in n)for(var u=n[i],e=0,o=u.length;o>e;e++)a[u[e]]=a[u[e]]?a[u[e]]+" "+i:i;return a}(i),h}({a:"阿啊呵腌嗄吖锕",e:"额阿俄恶鹅遏鄂厄饿峨扼娥鳄哦蛾噩愕讹锷垩婀鹗萼谔莪腭锇颚呃阏屙苊轭",ai:"爱埃艾碍癌哀挨矮隘蔼唉皑哎霭捱暧嫒嗳瑷嗌锿砹",ei:"诶",xi:"系西席息希习吸喜细析戏洗悉锡溪惜稀袭夕洒晰昔牺腊烯熙媳栖膝隙犀蹊硒兮熄曦禧嬉玺奚汐徙羲铣淅嘻歙熹矽蟋郗唏皙隰樨浠忾蜥檄郄翕阋鳃舾屣葸螅咭粞觋欷僖醯鼷裼穸饩舄禊诶菥蓰",yi:"一以已意议义益亿易医艺食依移衣异伊仪宜射遗疑毅谊亦疫役忆抑尾乙译翼蛇溢椅沂泄逸蚁夷邑怡绎彝裔姨熠贻矣屹颐倚诣胰奕翌疙弈轶蛾驿壹猗臆弋铱旖漪迤佚翊诒怿痍懿饴峄揖眙镒仡黟肄咿翳挹缢呓刈咦嶷羿钇殪荑薏蜴镱噫癔苡悒嗌瘗衤佾埸圯舣酏劓",an:"安案按岸暗鞍氨俺胺铵谙庵黯鹌桉埯犴揞厂广",han:"厂汉韩含旱寒汗涵函喊憾罕焊翰邯撼瀚憨捍酣悍鼾邗颔蚶晗菡旰顸犴焓撖",ang:"昂仰盎肮",ao:"奥澳傲熬凹鳌敖遨鏖袄坳翱嗷拗懊岙螯骜獒鏊艹媪廒聱",wa:"瓦挖娃洼袜蛙凹哇佤娲呙腽",yu:"于与育余预域予遇奥语誉玉鱼雨渔裕愈娱欲吁舆宇羽逾豫郁寓吾狱喻御浴愉禹俞邪榆愚渝尉淤虞屿峪粥驭瑜禺毓钰隅芋熨瘀迂煜昱汩於臾盂聿竽萸妪腴圄谕觎揄龉谀俣馀庾妤瘐鬻欤鹬阈嵛雩鹆圉蜮伛纡窬窳饫蓣狳肀舁蝓燠",niu:"牛纽扭钮拗妞忸狃",o:"哦噢喔",ba:"把八巴拔伯吧坝爸霸罢芭跋扒叭靶疤笆耙鲅粑岜灞钯捌菝魃茇",pa:"怕帕爬扒趴琶啪葩耙杷钯筢",pi:"被批副否皮坏辟啤匹披疲罢僻毗坯脾譬劈媲屁琵邳裨痞癖陂丕枇噼霹吡纰砒铍淠郫埤濞睥芘蚍圮鼙罴蜱疋貔仳庀擗甓陴",bi:"比必币笔毕秘避闭佛辟壁弊彼逼碧鼻臂蔽拂泌璧庇痹毙弼匕鄙陛裨贲敝蓖吡篦纰俾铋毖筚荸薜婢哔跸濞秕荜愎睥妣芘箅髀畀滗狴萆嬖襞舭",bai:"百白败摆伯拜柏佰掰呗擘捭稗",bo:"波博播勃拨薄佛伯玻搏柏泊舶剥渤卜驳簿脖膊簸菠礴箔铂亳钵帛擘饽跛钹趵檗啵鹁擗踣",bei:"北被备倍背杯勃贝辈悲碑臂卑悖惫蓓陂钡狈呗焙碚褙庳鞴孛鹎邶鐾",ban:"办版半班般板颁伴搬斑扮拌扳瓣坂阪绊钣瘢舨癍",pan:"判盘番潘攀盼拚畔胖叛拌蹒磐爿蟠泮袢襻丬",bin:"份宾频滨斌彬濒殡缤鬓槟摈膑玢镔豳髌傧",bang:"帮邦彭旁榜棒膀镑绑傍磅蚌谤梆浜蒡",pang:"旁庞乓磅螃彷滂逄耪",beng:"泵崩蚌蹦迸绷甭嘣甏堋",bao:"报保包宝暴胞薄爆炮饱抱堡剥鲍曝葆瀑豹刨褒雹孢苞煲褓趵鸨龅勹",bu:"不部步布补捕堡埔卜埠簿哺怖钚卟瓿逋晡醭钸",pu:"普暴铺浦朴堡葡谱埔扑仆蒲曝瀑溥莆圃璞濮菩蹼匍噗氆攵镨攴镤",mian:"面棉免绵缅勉眠冕娩腼渑湎沔黾宀眄",po:"破繁坡迫颇朴泊婆泼魄粕鄱珀陂叵笸泺皤钋钷",fan:"反范犯繁饭泛翻凡返番贩烦拚帆樊藩矾梵蕃钒幡畈蘩蹯燔",fu:"府服副负富复福夫妇幅付扶父符附腐赴佛浮覆辅傅伏抚赋辐腹弗肤阜袱缚甫氟斧孚敷俯拂俘咐腑孵芙涪釜脯茯馥宓绂讣呋罘麸蝠匐芾蜉跗凫滏蝮驸绋蚨砩桴赙菔呒趺苻拊阝鲋怫稃郛莩幞祓艴黻黼鳆",ben:"本体奔苯笨夯贲锛畚坌",feng:"风丰封峰奉凤锋冯逢缝蜂枫疯讽烽俸沣酆砜葑唪",bian:"变便边编遍辩鞭辨贬匾扁卞汴辫砭苄蝙鳊弁窆笾煸褊碥忭缏",pian:"便片篇偏骗翩扁骈胼蹁谝犏缏",zhen:"镇真针圳振震珍阵诊填侦臻贞枕桢赈祯帧甄斟缜箴疹砧榛鸩轸稹溱蓁胗椹朕畛浈",biao:"表标彪镖裱飚膘飙镳婊骠飑杓髟鳔灬瘭",piao:"票朴漂飘嫖瓢剽缥殍瞟骠嘌莩螵",huo:"和活或货获火伙惑霍祸豁嚯藿锪蠖钬耠镬夥灬劐攉",bie:"别鳖憋瘪蹩",min:"民敏闽闵皿泯岷悯珉抿黾缗玟愍苠鳘",fen:"分份纷奋粉氛芬愤粪坟汾焚酚吩忿棼玢鼢瀵偾鲼",bing:"并病兵冰屏饼炳秉丙摒柄槟禀枋邴冫",geng:"更耕颈庚耿梗埂羹哽赓绠鲠",fang:"方放房防访纺芳仿坊妨肪邡舫彷枋鲂匚钫",xian:"现先县见线限显险献鲜洗宪纤陷闲贤仙衔掀咸嫌掺羡弦腺痫娴舷馅酰铣冼涎暹籼锨苋蚬跹岘藓燹鹇氙莶霰跣猃彡祆筅",fou:"不否缶",ca:"拆擦嚓礤",cha:"查察差茶插叉刹茬楂岔诧碴嚓喳姹杈汊衩搽槎镲苴檫馇锸猹",cai:"才采财材菜彩裁蔡猜踩睬",can:"参残餐灿惨蚕掺璨惭粲孱骖黪",shen:"信深参身神什审申甚沈伸慎渗肾绅莘呻婶娠砷蜃哂椹葚吲糁渖诜谂矧胂",cen:"参岑涔",san:"三参散伞叁糁馓毵",cang:"藏仓苍沧舱臧伧",zang:"藏脏葬赃臧奘驵",chen:"称陈沈沉晨琛臣尘辰衬趁忱郴宸谌碜嗔抻榇伧谶龀肜",cao:"草操曹槽糙嘈漕螬艚屮",ce:"策测册侧厕栅恻",ze:"责则泽择侧咋啧仄箦赜笮舴昃迮帻",zhai:"债择齐宅寨侧摘窄斋祭翟砦瘵哜",dao:"到道导岛倒刀盗稻蹈悼捣叨祷焘氘纛刂帱忉",ceng:"层曾蹭噌",zha:"查扎炸诈闸渣咋乍榨楂札栅眨咤柞喳喋铡蚱吒怍砟揸痄哳齄",chai:"差拆柴钗豺侪虿瘥",ci:"次此差词辞刺瓷磁兹慈茨赐祠伺雌疵鹚糍呲粢",zi:"资自子字齐咨滋仔姿紫兹孜淄籽梓鲻渍姊吱秭恣甾孳訾滓锱辎趑龇赀眦缁呲笫谘嵫髭茈粢觜耔",cuo:"措错磋挫搓撮蹉锉厝嵯痤矬瘥脞鹾",chan:"产单阐崭缠掺禅颤铲蝉搀潺蟾馋忏婵孱觇廛谄谗澶骣羼躔蒇冁",shan:"山单善陕闪衫擅汕扇掺珊禅删膳缮赡鄯栅煽姗跚鳝嬗潸讪舢苫疝掸膻钐剡蟮芟埏彡骟",zhan:"展战占站崭粘湛沾瞻颤詹斩盏辗绽毡栈蘸旃谵搌",xin:"新心信辛欣薪馨鑫芯锌忻莘昕衅歆囟忄镡",lian:"联连练廉炼脸莲恋链帘怜涟敛琏镰濂楝鲢殓潋裢裣臁奁莶蠊蔹",chang:"场长厂常偿昌唱畅倡尝肠敞倘猖娼淌裳徜昶怅嫦菖鲳阊伥苌氅惝鬯",zhang:"长张章障涨掌帐胀彰丈仗漳樟账杖璋嶂仉瘴蟑獐幛鄣嫜",chao:"超朝潮炒钞抄巢吵剿绰嘲晁焯耖怊",zhao:"着照招找召朝赵兆昭肇罩钊沼嘲爪诏濯啁棹笊",zhou:"调州周洲舟骤轴昼宙粥皱肘咒帚胄绉纣妯啁诌繇碡籀酎荮",che:"车彻撤尺扯澈掣坼砗屮",ju:"车局据具举且居剧巨聚渠距句拒俱柜菊拘炬桔惧矩鞠驹锯踞咀瞿枸掬沮莒橘飓疽钜趄踽遽琚龃椐苣裾榘狙倨榉苴讵雎锔窭鞫犋屦醵",cheng:"成程城承称盛抢乘诚呈净惩撑澄秤橙骋逞瞠丞晟铛埕塍蛏柽铖酲裎枨",rong:"容荣融绒溶蓉熔戎榕茸冗嵘肜狨蝾",sheng:"生声升胜盛乘圣剩牲甸省绳笙甥嵊晟渑眚",deng:"等登邓灯澄凳瞪蹬噔磴嶝镫簦戥",zhi:"制之治质职只志至指织支值知识直致执置止植纸拓智殖秩旨址滞氏枝芝脂帜汁肢挚稚酯掷峙炙栉侄芷窒咫吱趾痔蜘郅桎雉祉郦陟痣蛭帙枳踯徵胝栀贽祗豸鸷摭轵卮轾彘觯絷跖埴夂黹忮骘膣踬",zheng:"政正证争整征郑丁症挣蒸睁铮筝拯峥怔诤狰徵钲",tang:"堂唐糖汤塘躺趟倘棠烫淌膛搪镗傥螳溏帑羰樘醣螗耥铴瑭",chi:"持吃池迟赤驰尺斥齿翅匙痴耻炽侈弛叱啻坻眙嗤墀哧茌豉敕笞饬踟蚩柢媸魑篪褫彳鸱螭瘛眵傺",shi:"是时实事市十使世施式势视识师史示石食始士失适试什泽室似诗饰殖释驶氏硕逝湿蚀狮誓拾尸匙仕柿矢峙侍噬嗜栅拭嘘屎恃轼虱耆舐莳铈谥炻豕鲥饣螫酾筮埘弑礻蓍鲺贳",qi:"企其起期气七器汽奇齐启旗棋妻弃揭枝歧欺骑契迄亟漆戚岂稽岐琦栖缉琪泣乞砌祁崎绮祺祈凄淇杞脐麒圻憩芪伎俟畦耆葺沏萋骐鳍綦讫蕲屺颀亓碛柒啐汔綮萁嘁蛴槭欹芑桤丌蜞",chuai:"揣踹啜搋膪",tuo:"托脱拓拖妥驼陀沱鸵驮唾椭坨佗砣跎庹柁橐乇铊沲酡鼍箨柝",duo:"多度夺朵躲铎隋咄堕舵垛惰哆踱跺掇剁柁缍沲裰哚隳",xue:"学血雪削薛穴靴谑噱鳕踅泶彐",chong:"重种充冲涌崇虫宠忡憧舂茺铳艟",chou:"筹抽绸酬愁丑臭仇畴稠瞅踌惆俦瘳雠帱",qiu:"求球秋丘邱仇酋裘龟囚遒鳅虬蚯泅楸湫犰逑巯艽俅蝤赇鼽糗",xiu:"修秀休宿袖绣臭朽锈羞嗅岫溴庥馐咻髹鸺貅",chu:"出处础初助除储畜触楚厨雏矗橱锄滁躇怵绌搐刍蜍黜杵蹰亍樗憷楮",tuan:"团揣湍疃抟彖",zhui:"追坠缀揣椎锥赘惴隹骓缒",chuan:"传川船穿串喘椽舛钏遄氚巛舡",zhuan:"专转传赚砖撰篆馔啭颛",yuan:"元员院原源远愿园援圆缘袁怨渊苑宛冤媛猿垣沅塬垸鸳辕鸢瑗圜爰芫鼋橼螈眢箢掾",cuan:"窜攒篡蹿撺爨汆镩",chuang:"创床窗闯幢疮怆",zhuang:"装状庄壮撞妆幢桩奘僮戆",chui:"吹垂锤炊椎陲槌捶棰",chun:"春纯醇淳唇椿蠢鹑朐莼肫蝽",zhun:"准屯淳谆肫窀",cu:"促趋趣粗簇醋卒蹴猝蹙蔟殂徂",dun:"吨顿盾敦蹲墩囤沌钝炖盹遁趸砘礅",qu:"区去取曲趋渠趣驱屈躯衢娶祛瞿岖龋觑朐蛐癯蛆苣阒诎劬蕖蘧氍黢蠼璩麴鸲磲",xu:"需许续须序徐休蓄畜虚吁绪叙旭邪恤墟栩絮圩婿戌胥嘘浒煦酗诩朐盱蓿溆洫顼勖糈砉醑",chuo:"辍绰戳淖啜龊踔辶",zu:"组族足祖租阻卒俎诅镞菹",ji:"济机其技基记计系期际及集级几给积极己纪即继击既激绩急奇吉季齐疾迹鸡剂辑籍寄挤圾冀亟寂暨脊跻肌稽忌饥祭缉棘矶汲畸姬藉瘠骥羁妓讥稷蓟悸嫉岌叽伎鲫诘楫荠戟箕霁嵇觊麂畿玑笈犄芨唧屐髻戢佶偈笄跽蒺乩咭赍嵴虮掎齑殛鲚剞洎丌墼蕺彐芰哜",cong:"从丛匆聪葱囱琮淙枞骢苁璁",zong:"总从综宗纵踪棕粽鬃偬枞腙",cou:"凑辏腠楱",cui:"衰催崔脆翠萃粹摧璀瘁悴淬啐隹毳榱",wei:"为位委未维卫围违威伟危味微唯谓伪慰尾魏韦胃畏帷喂巍萎蔚纬潍尉渭惟薇苇炜圩娓诿玮崴桅偎逶倭猥囗葳隗痿猬涠嵬韪煨艉隹帏闱洧沩隈鲔軎",cun:"村存寸忖皴",zuo:"作做座左坐昨佐琢撮祚柞唑嘬酢怍笮阼胙",zuan:"钻纂攥缵躜",da:"大达打答搭沓瘩惮嗒哒耷鞑靼褡笪怛妲",dai:"大代带待贷毒戴袋歹呆隶逮岱傣棣怠殆黛甙埭诒绐玳呔迨",tai:"台太态泰抬胎汰钛苔薹肽跆邰鲐酞骀炱",ta:"他它她拓塔踏塌榻沓漯獭嗒挞蹋趿遢铊鳎溻闼",dan:"但单石担丹胆旦弹蛋淡诞氮郸耽殚惮儋眈疸澹掸膻啖箪聃萏瘅赕",lu:"路六陆录绿露鲁卢炉鹿禄赂芦庐碌麓颅泸卤潞鹭辘虏璐漉噜戮鲈掳橹轳逯渌蓼撸鸬栌氇胪镥簏舻辂垆",tan:"谈探坦摊弹炭坛滩贪叹谭潭碳毯瘫檀痰袒坍覃忐昙郯澹钽锬",ren:"人任认仁忍韧刃纫饪妊荏稔壬仞轫亻衽",jie:"家结解价界接节她届介阶街借杰洁截姐揭捷劫戒皆竭桔诫楷秸睫藉拮芥诘碣嗟颉蚧孑婕疖桀讦疥偈羯袷哜喈卩鲒骱",yan:"研严验演言眼烟沿延盐炎燕岩宴艳颜殷彦掩淹阎衍铅雁咽厌焰堰砚唁焉晏檐蜒奄俨腌妍谚兖筵焱偃闫嫣鄢湮赝胭琰滟阉魇酽郾恹崦芫剡鼹菸餍埏谳讠厣罨",dang:"当党档荡挡宕砀铛裆凼菪谠",tao:"套讨跳陶涛逃桃萄淘掏滔韬叨洮啕绦饕鼗",tiao:"条调挑跳迢眺苕窕笤佻啁粜髫铫祧龆蜩鲦",te:"特忑忒铽慝",de:"的地得德底锝",dei:"得",di:"的地第提低底抵弟迪递帝敌堤蒂缔滴涤翟娣笛棣荻谛狄邸嘀砥坻诋嫡镝碲骶氐柢籴羝睇觌",ti:"体提题弟替梯踢惕剔蹄棣啼屉剃涕锑倜悌逖嚏荑醍绨鹈缇裼",tui:"推退弟腿褪颓蜕忒煺",you:"有由又优游油友右邮尤忧幼犹诱悠幽佑釉柚铀鱿囿酉攸黝莠猷蝣疣呦蚴莸莜铕宥繇卣牖鼬尢蚰侑",dian:"电点店典奠甸碘淀殿垫颠滇癫巅惦掂癜玷佃踮靛钿簟坫阽",tian:"天田添填甜甸恬腆佃舔钿阗忝殄畋栝掭",zhu:"主术住注助属逐宁著筑驻朱珠祝猪诸柱竹铸株瞩嘱贮煮烛苎褚蛛拄铢洙竺蛀渚伫杼侏澍诛茱箸炷躅翥潴邾槠舳橥丶瘃麈疰",nian:"年念酿辗碾廿捻撵拈蔫鲶埝鲇辇黏",diao:"调掉雕吊钓刁貂凋碉鲷叼铫铞",yao:"要么约药邀摇耀腰遥姚窑瑶咬尧钥谣肴夭侥吆疟妖幺杳舀窕窈曜鹞爻繇徭轺铫鳐崾珧",die:"跌叠蝶迭碟爹谍牒耋佚喋堞瓞鲽垤揲蹀",she:"设社摄涉射折舍蛇拾舌奢慑赦赊佘麝歙畲厍猞揲滠",ye:"业也夜叶射野液冶喝页爷耶邪咽椰烨掖拽曳晔谒腋噎揶靥邺铘揲",xie:"些解协写血叶谢械鞋胁斜携懈契卸谐泄蟹邪歇泻屑挟燮榭蝎撷偕亵楔颉缬邂鲑瀣勰榍薤绁渫廨獬躞",zhe:"这者着著浙折哲蔗遮辙辄柘锗褶蜇蛰鹧谪赭摺乇磔螫",ding:"定订顶丁鼎盯钉锭叮仃铤町酊啶碇腚疔玎耵",diu:"丢铥",ting:"听庭停厅廷挺亭艇婷汀铤烃霆町蜓葶梃莛",dong:"动东董冬洞懂冻栋侗咚峒氡恫胴硐垌鸫岽胨",tong:"同通统童痛铜桶桐筒彤侗佟潼捅酮砼瞳恸峒仝嗵僮垌茼",zhong:"中重种众终钟忠仲衷肿踵冢盅蚣忪锺舯螽夂",dou:"都斗读豆抖兜陡逗窦渎蚪痘蔸钭篼",du:"度都独督读毒渡杜堵赌睹肚镀渎笃竺嘟犊妒牍蠹椟黩芏髑",duan:"断段短端锻缎煅椴簖",dui:"对队追敦兑堆碓镦怼憝",rui:"瑞兑锐睿芮蕊蕤蚋枘",yue:"月说约越乐跃兑阅岳粤悦曰钥栎钺樾瀹龠哕刖",tun:"吞屯囤褪豚臀饨暾氽",hui:"会回挥汇惠辉恢徽绘毁慧灰贿卉悔秽溃荟晖彗讳诲珲堕诙蕙晦睢麾烩茴喙桧蛔洄浍虺恚蟪咴隳缋哕",wu:"务物无五武午吴舞伍污乌误亡恶屋晤悟吾雾芜梧勿巫侮坞毋诬呜钨邬捂鹜兀婺妩於戊鹉浯蜈唔骛仵焐芴鋈庑鼯牾怃圬忤痦迕杌寤阢",ya:"亚压雅牙押鸭呀轧涯崖邪芽哑讶鸦娅衙丫蚜碣垭伢氩桠琊揠吖睚痖疋迓岈砑",he:"和合河何核盖贺喝赫荷盒鹤吓呵苛禾菏壑褐涸阂阖劾诃颌嗬貉曷翮纥盍",wo:"我握窝沃卧挝涡斡渥幄蜗喔倭莴龌肟硪",en:"恩摁蒽",n:"嗯唔",er:"而二尔儿耳迩饵洱贰铒珥佴鸸鲕",fa:"发法罚乏伐阀筏砝垡珐",quan:"全权券泉圈拳劝犬铨痊诠荃醛蜷颧绻犭筌鬈悛辁畎",fei:"费非飞肥废菲肺啡沸匪斐蜚妃诽扉翡霏吠绯腓痱芾淝悱狒榧砩鲱篚镄",pei:"配培坏赔佩陪沛裴胚妃霈淠旆帔呸醅辔锫",ping:"平评凭瓶冯屏萍苹乒坪枰娉俜鲆",fo:"佛",hu:"和护户核湖互乎呼胡戏忽虎沪糊壶葫狐蝴弧瑚浒鹄琥扈唬滹惚祜囫斛笏芴醐猢怙唿戽槲觳煳鹕冱瓠虍岵鹱烀轷",ga:"夹咖嘎尬噶旮伽尕钆尜",ge:"个合各革格歌哥盖隔割阁戈葛鸽搁胳舸疙铬骼蛤咯圪镉颌仡硌嗝鬲膈纥袼搿塥哿虼",ha:"哈蛤铪",xia:"下夏峡厦辖霞夹虾狭吓侠暇遐瞎匣瑕唬呷黠硖罅狎瘕柙",gai:"改该盖概溉钙丐芥赅垓陔戤",hai:"海还害孩亥咳骸骇氦嗨胲醢",gan:"干感赶敢甘肝杆赣乾柑尴竿秆橄矸淦苷擀酐绀泔坩旰疳澉",gang:"港钢刚岗纲冈杠缸扛肛罡戆筻",jiang:"将强江港奖讲降疆蒋姜浆匠酱僵桨绛缰犟豇礓洚茳糨耩",hang:"行航杭巷夯吭桁沆绗颃",gong:"工公共供功红贡攻宫巩龚恭拱躬弓汞蚣珙觥肱廾",hong:"红宏洪轰虹鸿弘哄烘泓訇蕻闳讧荭黉薨",guang:"广光逛潢犷胱咣桄",qiong:"穷琼穹邛茕筇跫蛩銎",gao:"高告搞稿膏糕镐皋羔锆杲郜睾诰藁篙缟槁槔",hao:"好号毫豪耗浩郝皓昊皋蒿壕灏嚎濠蚝貉颢嗥薅嚆",li:"理力利立里李历例离励礼丽黎璃厉厘粒莉梨隶栗荔沥犁漓哩狸藜罹篱鲤砺吏澧俐骊溧砾莅锂笠蠡蛎痢雳俪傈醴栎郦俚枥喱逦娌鹂戾砬唳坜疠蜊黧猁鬲粝蓠呖跞疬缡鲡鳢嫠詈悝苈篥轹",jia:"家加价假佳架甲嘉贾驾嫁夹稼钾挟拮迦伽颊浃枷戛荚痂颉镓笳珈岬胛袈郏葭袷瘕铗跏蛱恝哿",luo:"落罗络洛逻螺锣骆萝裸漯烙摞骡咯箩珞捋荦硌雒椤镙跞瘰泺脶猡倮蠃",ke:"可科克客刻课颗渴壳柯棵呵坷恪苛咳磕珂稞瞌溘轲窠嗑疴蝌岢铪颏髁蚵缂氪骒钶锞",qia:"卡恰洽掐髂袷咭葜",gei:"给",gen:"根跟亘艮哏茛",hen:"很狠恨痕哏",gou:"构购够句沟狗钩拘勾苟垢枸篝佝媾诟岣彀缑笱鞲觏遘",kou:"口扣寇叩抠佝蔻芤眍筘",gu:"股古顾故固鼓骨估谷贾姑孤雇辜菇沽咕呱锢钴箍汩梏痼崮轱鸪牯蛊诂毂鹘菰罟嘏臌觚瞽蛄酤牿鲴",pai:"牌排派拍迫徘湃俳哌蒎",gua:"括挂瓜刮寡卦呱褂剐胍诖鸹栝呙",tou:"投头透偷愉骰亠",guai:"怪拐乖",kuai:"会快块筷脍蒯侩浍郐蒉狯哙",guan:"关管观馆官贯冠惯灌罐莞纶棺斡矜倌鹳鳏盥掼涫",wan:"万完晚湾玩碗顽挽弯蔓丸莞皖宛婉腕蜿惋烷琬畹豌剜纨绾脘菀芄箢",ne:"呢哪呐讷疒",gui:"规贵归轨桂柜圭鬼硅瑰跪龟匮闺诡癸鳜桧皈鲑刽晷傀眭妫炅庋簋刿宄匦",jun:"军均俊君峻菌竣钧骏龟浚隽郡筠皲麇捃",jiong:"窘炯迥炅冂扃",jue:"决绝角觉掘崛诀獗抉爵嚼倔厥蕨攫珏矍蹶谲镢鳜噱桷噘撅橛孓觖劂爝",gun:"滚棍辊衮磙鲧绲丨",hun:"婚混魂浑昏棍珲荤馄诨溷阍",guo:"国过果郭锅裹帼涡椁囗蝈虢聒埚掴猓崞蜾呙馘",hei:"黑嘿嗨",kan:"看刊勘堪坎砍侃嵌槛瞰阚龛戡凵莰",heng:"衡横恒亨哼珩桁蘅",mo:"万没么模末冒莫摩墨默磨摸漠脉膜魔沫陌抹寞蘑摹蓦馍茉嘿谟秣蟆貉嫫镆殁耱嬷麽瘼貊貘",peng:"鹏朋彭膨蓬碰苹棚捧亨烹篷澎抨硼怦砰嘭蟛堋",hou:"后候厚侯猴喉吼逅篌糇骺後鲎瘊堠",hua:"化华划话花画滑哗豁骅桦猾铧砉",huai:"怀坏淮徊槐踝",huan:"还环换欢患缓唤焕幻痪桓寰涣宦垸洹浣豢奂郇圜獾鲩鬟萑逭漶锾缳擐",xun:"讯训迅孙寻询循旬巡汛勋逊熏徇浚殉驯鲟薰荀浔洵峋埙巽郇醺恂荨窨蕈曛獯",huang:"黄荒煌皇凰慌晃潢谎惶簧璜恍幌湟蝗磺隍徨遑肓篁鳇蟥癀",nai:"能乃奶耐奈鼐萘氖柰佴艿",luan:"乱卵滦峦鸾栾銮挛孪脔娈",qie:"切且契窃茄砌锲怯伽惬妾趄挈郄箧慊",jian:"建间件见坚检健监减简艰践兼鉴键渐柬剑尖肩舰荐箭浅剪俭碱茧奸歼拣捡煎贱溅槛涧堑笺谏饯锏缄睑謇蹇腱菅翦戬毽笕犍硷鞯牮枧湔鲣囝裥踺搛缣鹣蒹谫僭戋趼楗",nan:"南难男楠喃囡赧腩囝蝻",qian:"前千钱签潜迁欠纤牵浅遣谦乾铅歉黔谴嵌倩钳茜虔堑钎骞阡掮钤扦芊犍荨仟芡悭缱佥愆褰凵肷岍搴箝慊椠",qiang:"强抢疆墙枪腔锵呛羌蔷襁羟跄樯戕嫱戗炝镪锖蜣",xiang:"向项相想乡象响香降像享箱羊祥湘详橡巷翔襄厢镶飨饷缃骧芗庠鲞葙蟓",jiao:"教交较校角觉叫脚缴胶轿郊焦骄浇椒礁佼蕉娇矫搅绞酵剿嚼饺窖跤蛟侥狡姣皎茭峤铰醮鲛湫徼鹪僬噍艽挢敫",zhuo:"着著缴桌卓捉琢灼浊酌拙茁涿镯淖啄濯焯倬擢斫棹诼浞禚",qiao:"桥乔侨巧悄敲俏壳雀瞧翘窍峭锹撬荞跷樵憔鞘橇峤诮谯愀鞒硗劁缲",xiao:"小效销消校晓笑肖削孝萧俏潇硝宵啸嚣霄淆哮筱逍姣箫骁枭哓绡蛸崤枵魈",si:"司四思斯食私死似丝饲寺肆撕泗伺嗣祀厮驷嘶锶俟巳蛳咝耜笥纟糸鸶缌澌姒汜厶兕",kai:"开凯慨岂楷恺揩锴铠忾垲剀锎蒈",jin:"进金今近仅紧尽津斤禁锦劲晋谨筋巾浸襟靳瑾烬缙钅矜觐堇馑荩噤廑妗槿赆衿卺",qin:"亲勤侵秦钦琴禽芹沁寝擒覃噙矜嗪揿溱芩衾廑锓吣檎螓",jing:"经京精境竞景警竟井惊径静劲敬净镜睛晶颈荆兢靖泾憬鲸茎腈菁胫阱旌粳靓痉箐儆迳婧肼刭弪獍",ying:"应营影英景迎映硬盈赢颖婴鹰荧莹樱瑛蝇萦莺颍膺缨瀛楹罂荥萤鹦滢蓥郢茔嘤璎嬴瘿媵撄潆",jiu:"就究九酒久救旧纠舅灸疚揪咎韭玖臼柩赳鸠鹫厩啾阄桕僦鬏",zui:"最罪嘴醉咀蕞觜",juan:"卷捐圈眷娟倦绢隽镌涓鹃鄄蠲狷锩桊",suan:"算酸蒜狻",yun:"员运云允孕蕴韵酝耘晕匀芸陨纭郧筠恽韫郓氲殒愠昀菀狁",qun:"群裙逡麇",ka:"卡喀咖咔咯佧胩",kang:"康抗扛慷炕亢糠伉钪闶",keng:"坑铿吭",kao:"考靠烤拷铐栲尻犒",ken:"肯垦恳啃龈裉",yin:"因引银印音饮阴隐姻殷淫尹荫吟瘾寅茵圻垠鄞湮蚓氤胤龈窨喑铟洇狺夤廴吲霪茚堙",kong:"空控孔恐倥崆箜",ku:"苦库哭酷裤枯窟挎骷堀绔刳喾",kua:"跨夸垮挎胯侉",kui:"亏奎愧魁馈溃匮葵窥盔逵睽馗聩喟夔篑岿喹揆隗傀暌跬蒉愦悝蝰",kuan:"款宽髋",kuang:"况矿框狂旷眶匡筐邝圹哐贶夼诳诓纩",que:"确却缺雀鹊阙瘸榷炔阕悫",kun:"困昆坤捆琨锟鲲醌髡悃阃",kuo:"扩括阔廓蛞",la:"拉落垃腊啦辣蜡喇剌旯砬邋瘌",lai:"来莱赖睐徕籁涞赉濑癞崃疠铼",lan:"兰览蓝篮栏岚烂滥缆揽澜拦懒榄斓婪阑褴罱啉谰镧漤",lin:"林临邻赁琳磷淋麟霖鳞凛拎遴蔺吝粼嶙躏廪檩啉辚膦瞵懔",lang:"浪朗郎廊狼琅榔螂阆锒莨啷蒗稂",liang:"量两粮良辆亮梁凉谅粱晾靓踉莨椋魉墚",lao:"老劳落络牢捞涝烙姥佬崂唠酪潦痨醪铑铹栳耢",mu:"目模木亩幕母牧莫穆姆墓慕牟牡募睦缪沐暮拇姥钼苜仫毪坶",le:"了乐勒肋叻鳓嘞仂泐",lei:"类累雷勒泪蕾垒磊擂镭肋羸耒儡嫘缧酹嘞诔檑",sui:"随岁虽碎尿隧遂髓穗绥隋邃睢祟濉燧谇眭荽",lie:"列烈劣裂猎冽咧趔洌鬣埒捩躐",leng:"冷愣棱楞塄",ling:"领令另零灵龄陵岭凌玲铃菱棱伶羚苓聆翎泠瓴囹绫呤棂蛉酃鲮柃",lia:"俩",liao:"了料疗辽廖聊寥缪僚燎缭撂撩嘹潦镣寮蓼獠钌尥鹩",liu:"流刘六留柳瘤硫溜碌浏榴琉馏遛鎏骝绺镏旒熘鹨锍",lun:"论轮伦仑纶沦抡囵",lv:"率律旅绿虑履吕铝屡氯缕滤侣驴榈闾偻褛捋膂稆",lou:"楼露漏陋娄搂篓喽镂偻瘘髅耧蝼嵝蒌",mao:"贸毛矛冒貌茂茅帽猫髦锚懋袤牦卯铆耄峁瑁蟊茆蝥旄泖昴瞀",long:"龙隆弄垄笼拢聋陇胧珑窿茏咙砻垅泷栊癃",nong:"农浓弄脓侬哝",shuang:"双爽霜孀泷",shu:"术书数属树输束述署熟殊蔬舒疏鼠淑叔暑枢墅俞曙抒竖蜀薯梳戍恕孰沭赎庶漱塾倏澍纾姝菽黍腧秫毹殳疋摅",shuai:"率衰帅摔甩蟀",lve:"略掠锊",ma:"么马吗摩麻码妈玛嘛骂抹蚂唛蟆犸杩",me:"么麽",mai:"买卖麦迈脉埋霾荬劢",man:"满慢曼漫埋蔓瞒蛮鳗馒幔谩螨熳缦镘颟墁鞔嫚",mi:"米密秘迷弥蜜谜觅靡泌眯麋猕谧咪糜宓汨醚嘧弭脒冖幂祢縻蘼芈糸敉",men:"们门闷瞒汶扪焖懑鞔钔",mang:"忙盲茫芒氓莽蟒邙硭漭",meng:"蒙盟梦猛孟萌氓朦锰檬勐懵蟒蜢虻黾蠓艨甍艋瞢礞",miao:"苗秒妙描庙瞄缪渺淼藐缈邈鹋杪眇喵",mou:"某谋牟缪眸哞鍪蛑侔厶",miu:"缪谬",mei:"美没每煤梅媒枚妹眉魅霉昧媚玫酶镁湄寐莓袂楣糜嵋镅浼猸鹛",wen:"文问闻稳温纹吻蚊雯紊瘟汶韫刎璺玟阌",mie:"灭蔑篾乜咩蠛",ming:"明名命鸣铭冥茗溟酩瞑螟暝",na:"内南那纳拿哪娜钠呐捺衲镎肭",nei:"内那哪馁",nuo:"难诺挪娜糯懦傩喏搦锘",ruo:"若弱偌箬",nang:"囊馕囔曩攮",nao:"脑闹恼挠瑙淖孬垴铙桡呶硇猱蛲",ni:"你尼呢泥疑拟逆倪妮腻匿霓溺旎昵坭铌鲵伲怩睨猊",nen:"嫩恁",neng:"能",nin:"您恁",niao:"鸟尿溺袅脲茑嬲",nie:"摄聂捏涅镍孽捻蘖啮蹑嗫臬镊颞乜陧",niang:"娘酿",ning:"宁凝拧泞柠咛狞佞聍甯",nu:"努怒奴弩驽帑孥胬",nv:"女钕衄恧",ru:"入如女乳儒辱汝茹褥孺濡蠕嚅缛溽铷洳薷襦颥蓐",nuan:"暖",nve:"虐疟",re:"热若惹喏",ou:"区欧偶殴呕禺藕讴鸥瓯沤耦怄",pao:"跑炮泡抛刨袍咆疱庖狍匏脬",pou:"剖掊裒",pen:"喷盆湓",pie:"瞥撇苤氕丿",pin:"品贫聘频拼拚颦姘嫔榀牝",se:"色塞瑟涩啬穑铯槭",qing:"情青清请亲轻庆倾顷卿晴氢擎氰罄磬蜻箐鲭綮苘黥圊檠謦",zan:"赞暂攒堑昝簪糌瓒錾趱拶",shao:"少绍召烧稍邵哨韶捎勺梢鞘芍苕劭艄筲杓潲",sao:"扫骚嫂梢缫搔瘙臊埽缲鳋",sha:"沙厦杀纱砂啥莎刹杉傻煞鲨霎嗄痧裟挲铩唼歃",xuan:"县选宣券旋悬轩喧玄绚渲璇炫萱癣漩眩暄煊铉楦泫谖痃碹揎镟儇",ran:"然染燃冉苒髯蚺",rang:"让壤攘嚷瓤穰禳",rao:"绕扰饶娆桡荛",reng:"仍扔",ri:"日",rou:"肉柔揉糅鞣蹂",ruan:"软阮朊",run:"润闰",sa:"萨洒撒飒卅仨脎",suo:"所些索缩锁莎梭琐嗦唆唢娑蓑羧挲桫嗍睃",sai:"思赛塞腮噻鳃",shui:"说水税谁睡氵",sang:"桑丧嗓搡颡磉",sen:"森",seng:"僧",shai:"筛晒",shang:"上商尚伤赏汤裳墒晌垧觞殇熵绱",xing:"行省星腥猩惺兴刑型形邢饧醒幸杏性姓陉荇荥擤悻硎",shou:"收手受首售授守寿瘦兽狩绶艏扌",shuo:"说数硕烁朔铄妁槊蒴搠",su:"速素苏诉缩塑肃俗宿粟溯酥夙愫簌稣僳谡涑蔌嗉觫",shua:"刷耍唰",shuan:"栓拴涮闩",shun:"顺瞬舜吮",song:"送松宋讼颂耸诵嵩淞怂悚崧凇忪竦菘",sou:"艘搜擞嗽嗖叟馊薮飕嗾溲锼螋瞍",sun:"损孙笋荪榫隼狲飧",teng:"腾疼藤滕誊",tie:"铁贴帖餮萜",tu:"土突图途徒涂吐屠兔秃凸荼钍菟堍酴",wai:"外歪崴",wang:"王望往网忘亡旺汪枉妄惘罔辋魍",weng:"翁嗡瓮蓊蕹",zhua:"抓挝爪",yang:"样养央阳洋扬杨羊详氧仰秧痒漾疡泱殃恙鸯徉佯怏炀烊鞅蛘",xiong:"雄兄熊胸凶匈汹芎",yo:"哟唷",yong:"用永拥勇涌泳庸俑踊佣咏雍甬镛臃邕蛹恿慵壅痈鳙墉饔喁",za:"杂扎咱砸咋匝咂拶",zai:"在再灾载栽仔宰哉崽甾",zao:"造早遭枣噪灶燥糟凿躁藻皂澡蚤唣",zei:"贼",zen:"怎谮",zeng:"增曾综赠憎锃甑罾缯",zhei:"这",zou:"走邹奏揍诹驺陬楱鄹鲰",zhuai:"转拽",zun:"尊遵鳟樽撙",dia:"嗲",nou:"耨"})}}));
diff --git a/src/components/scFilterBar/pySelect.vue b/src/components/scFilterBar/pySelect.vue
new file mode 100644
index 00000000..5d77edc6
--- /dev/null
+++ b/src/components/scFilterBar/pySelect.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scForm/index.vue b/src/components/scForm/index.vue
new file mode 100644
index 00000000..3e74f549
--- /dev/null
+++ b/src/components/scForm/index.vue
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.label}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{_item.label}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{_item.label}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [{{item.component}}] Component not found
+
+ {{item.message}}
+
+
+
+
+
+
+ 提交
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scForm/items/tableselect.vue b/src/components/scForm/items/tableselect.vue
new file mode 100644
index 00000000..1a81ec47
--- /dev/null
+++ b/src/components/scForm/items/tableselect.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scFormTable/index.vue b/src/components/scFormTable/index.vue
new file mode 100644
index 00000000..775f6e85
--- /dev/null
+++ b/src/components/scFormTable/index.vue
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scIconSelect/index.vue b/src/components/scIconSelect/index.vue
new file mode 100644
index 00000000..4326ff22
--- /dev/null
+++ b/src/components/scIconSelect/index.vue
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}} {{item.icons.length}}
+
+
+
+
+
+
+ 清除
+ 取消
+
+
+
+
+
+
+
+
diff --git a/src/components/scMini/scStatusIndicator.vue b/src/components/scMini/scStatusIndicator.vue
new file mode 100644
index 00000000..4e51b406
--- /dev/null
+++ b/src/components/scMini/scStatusIndicator.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scMini/scTrend.vue b/src/components/scMini/scTrend.vue
new file mode 100644
index 00000000..304c44d6
--- /dev/null
+++ b/src/components/scMini/scTrend.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+ {{prefix}}
+ {{modelValue}}
+ {{suffix}}
+
+
+
+
+
+
diff --git a/src/components/scPageHeader/index.vue b/src/components/scPageHeader/index.vue
new file mode 100644
index 00000000..9ca2d356
--- /dev/null
+++ b/src/components/scPageHeader/index.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scPasswordStrength/index.vue b/src/components/scPasswordStrength/index.vue
new file mode 100644
index 00000000..e80ef7a4
--- /dev/null
+++ b/src/components/scPasswordStrength/index.vue
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scQrCode/index.vue b/src/components/scQrCode/index.vue
new file mode 100644
index 00000000..0166ec32
--- /dev/null
+++ b/src/components/scQrCode/index.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scSelect/index.vue b/src/components/scSelect/index.vue
new file mode 100644
index 00000000..77d8bc41
--- /dev/null
+++ b/src/components/scSelect/index.vue
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scSelectFilter/index.vue b/src/components/scSelectFilter/index.vue
new file mode 100644
index 00000000..c62fd19b
--- /dev/null
+++ b/src/components/scSelectFilter/index.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
+ 暂无数据
+
+
+
+
+
+ -
+
+ {{option.label}}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scStatistic/index.vue b/src/components/scStatistic/index.vue
new file mode 100644
index 00000000..e32bbf2d
--- /dev/null
+++ b/src/components/scStatistic/index.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+ {{ title }}
+
+
+
+ {{ tips }}
+
+
+
+
+
+
+ {{ prefix }}
+ {{ cmtValue }}
+ {{ suffix }}
+
+
+
+ {{ description }}
+
+
+
+
+
+
+
+
diff --git a/src/components/scTable/column.js b/src/components/scTable/column.js
new file mode 100644
index 00000000..af5ab1fe
--- /dev/null
+++ b/src/components/scTable/column.js
@@ -0,0 +1,23 @@
+import { h, resolveComponent } from 'vue'
+
+export default {
+ render() {
+ return h (
+ resolveComponent("el-table-column"),
+ {
+ index: this.index,
+ ...this.$attrs
+ },
+ this.$slots
+ )
+ },
+ methods: {
+ index(index){
+ if(this.$attrs.type=="index"){
+ let page = this.$parent.$parent.currentPage
+ let pageSize = this.$parent.$parent.pageSize
+ return (page - 1) * pageSize + index + 1
+ }
+ }
+ }
+}
diff --git a/src/components/scTable/columnSetting.vue b/src/components/scTable/columnSetting.vue
new file mode 100644
index 00000000..f2c5b9e1
--- /dev/null
+++ b/src/components/scTable/columnSetting.vue
@@ -0,0 +1,120 @@
+
+
+
+
+ 显示
+ 名称
+ 宽度
+ 排序
+ 固定
+
+
+
+ -
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 重置
+ 保存
+
+
+
+
+
+
+
+
diff --git a/src/components/scTable/index.vue b/src/components/scTable/index.vue
new file mode 100644
index 00000000..41c72baf
--- /dev/null
+++ b/src/components/scTable/index.vue
@@ -0,0 +1,495 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row[item.prop] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 已选择 {{selectNum}} 项
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 大
+ 正常
+ 小
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scTableSelect/index.vue b/src/components/scTableSelect/index.vue
new file mode 100644
index 00000000..772a7cc3
--- /dev/null
+++ b/src/components/scTableSelect/index.vue
@@ -0,0 +1,234 @@
+
+
+
+
+
+
+
+
+
+
+ {{scope.$index+(currentPage - 1) * pageSize + 1}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scTitle/index.vue b/src/components/scTitle/index.vue
new file mode 100644
index 00000000..4ad28f4c
--- /dev/null
+++ b/src/components/scTitle/index.vue
@@ -0,0 +1,25 @@
+
+
+ {{title}}
+
+
+
+
+
+
diff --git a/src/components/scUpload/file.vue b/src/components/scUpload/file.vue
new file mode 100644
index 00000000..f8ec732c
--- /dev/null
+++ b/src/components/scUpload/file.vue
@@ -0,0 +1,191 @@
+
+
+
+
+ Click to upload
+
+
+ {{tip}}
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scUpload/index.vue b/src/components/scUpload/index.vue
new file mode 100644
index 00000000..5c712346
--- /dev/null
+++ b/src/components/scUpload/index.vue
@@ -0,0 +1,282 @@
+
+
+
+
+
+
+
+ Loading...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取 消
+ 确 定
+
+
+
+
+
+
+
+
diff --git a/src/components/scUpload/multiple.vue b/src/components/scUpload/multiple.vue
new file mode 100644
index 00000000..ef7a51f3
--- /dev/null
+++ b/src/components/scUpload/multiple.vue
@@ -0,0 +1,286 @@
+
+
+
+
+
+
+
+ {{tip}}
+
+
+
+
+
+
+ Loading...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scVideo/index.vue b/src/components/scVideo/index.vue
new file mode 100644
index 00000000..0777ce0e
--- /dev/null
+++ b/src/components/scVideo/index.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scWaterMark/index.vue b/src/components/scWaterMark/index.vue
new file mode 100644
index 00000000..bb938909
--- /dev/null
+++ b/src/components/scWaterMark/index.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scWorkflow/index.vue b/src/components/scWorkflow/index.vue
new file mode 100644
index 00000000..d8b17663
--- /dev/null
+++ b/src/components/scWorkflow/index.vue
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scWorkflow/nodeWrap.vue b/src/components/scWorkflow/nodeWrap.vue
new file mode 100644
index 00000000..b2ff83ea
--- /dev/null
+++ b/src/components/scWorkflow/nodeWrap.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scWorkflow/nodes/addNode.vue b/src/components/scWorkflow/nodes/addNode.vue
new file mode 100644
index 00000000..ff693cf7
--- /dev/null
+++ b/src/components/scWorkflow/nodes/addNode.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+ -
+
+
审批节点
+
+ -
+
+
抄送节点
+
+ -
+
+
条件分支
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scWorkflow/nodes/approver.vue b/src/components/scWorkflow/nodes/approver.vue
new file mode 100644
index 00000000..6427276f
--- /dev/null
+++ b/src/components/scWorkflow/nodes/approver.vue
@@ -0,0 +1,193 @@
+
+
+
+
+
+ {{ nodeConfig.nodeName }}
+
+
+
+ {{ toText(nodeConfig) }}
+ 请选择
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选择人员
+
+ {{user.name}}
+
+
+
+
+ 发起人的第 级主管
+
+
+
+ 选择角色
+
+ {{role.name}}
+
+
+
+
+
+ 自选一个人
+ 自选多个人
+
+
+
+
+
+ 直到最上层主管
+ 自定义审批终点
+
+ 直到发起人的第 级主管
+
+
+
+
+
+
+
+
+ 小时
+
+
+
+ 自动通过
+ 自动拒绝
+
+
+
+
+
+
+ 按顺序依次审批
+ 会签 (可同时审批,每个人必须审批通过)
+ 或签 (有一人审批通过即可)
+
+
+
+
+
+ 保存
+ 取消
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scWorkflow/nodes/branch.vue b/src/components/scWorkflow/nodes/branch.vue
new file mode 100644
index 00000000..509e7500
--- /dev/null
+++ b/src/components/scWorkflow/nodes/branch.vue
@@ -0,0 +1,222 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.nodeName }}
+ 优先级{{item.priorityLevel}}
+
+
+
+ {{ toText(nodeConfig, index) }}
+ 请设置条件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 且
+ 或
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 移除
+
+
+
+
+ 增加条件
+
+
+
+ 保存
+ 取消
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scWorkflow/nodes/promoter.vue b/src/components/scWorkflow/nodes/promoter.vue
new file mode 100644
index 00000000..ebfa74ff
--- /dev/null
+++ b/src/components/scWorkflow/nodes/promoter.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
+ {{ nodeConfig.nodeName }}
+
+
+ {{ toText(nodeConfig) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选择角色
+
+ {{role.name}}
+
+
+
+
+
+
+ 保存
+ 取消
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scWorkflow/nodes/send.vue b/src/components/scWorkflow/nodes/send.vue
new file mode 100644
index 00000000..2bbd82e9
--- /dev/null
+++ b/src/components/scWorkflow/nodes/send.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+ {{ nodeConfig.nodeName }}
+
+
+
+ {{ toText(nodeConfig) }}
+ 请选择人员
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选择人员
+
+ {{user.name}}
+
+
+
+
+
+
+
+
+ 保存
+ 取消
+
+
+
+
+
+
+
+
+
diff --git a/src/components/scWorkflow/select.vue b/src/components/scWorkflow/select.vue
new file mode 100644
index 00000000..f4f465e6
--- /dev/null
+++ b/src/components/scWorkflow/select.vue
@@ -0,0 +1,269 @@
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+ {{item.name.substring(0,1)}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取 消
+ 确 认
+
+
+
+
+
+
+
diff --git a/src/config/fileSelect.js b/src/config/fileSelect.js
new file mode 100644
index 00000000..16c4f4a0
--- /dev/null
+++ b/src/config/fileSelect.js
@@ -0,0 +1,69 @@
+import API from "@/api";
+
+//文件选择器配置
+
+export default {
+ apiObj: API.common.upload,
+ menuApiObj: API.common.file.menu,
+ listApiObj: API.common.file.list,
+ successCode: 200,
+ maxSize: 30,
+ max: 99,
+ uploadParseData: function (res) {
+ return {
+ id: res.id,
+ fileName: res.name,
+ url: res.path
+ }
+ },
+ listParseData: function (res) {
+ return {
+ rows: res.results,
+ total: res.count,
+ // msg: res.message,
+ // code: res.code
+ }
+ },
+ request: {
+ page: 'page',
+ pageSize: 'page_size',
+ keyword: 'keyword',
+ menuKey: 'groupId'
+ },
+ menuProps: {
+ key: 'id',
+ label: 'label',
+ children: 'children'
+ },
+ fileProps: {
+ key: 'id',
+ fileName: 'fileName',
+ url: 'url'
+ },
+ files: {
+ doc: {
+ icon: 'sc-icon-file-word-2-fill',
+ color: '#409eff'
+ },
+ docx: {
+ icon: 'sc-icon-file-word-2-fill',
+ color: '#409eff'
+ },
+ xls: {
+ icon: 'sc-icon-file-excel-2-fill',
+ color: '#67C23A'
+ },
+ xlsx: {
+ icon: 'sc-icon-file-excel-2-fill',
+ color: '#67C23A'
+ },
+ ppt: {
+ icon: 'sc-icon-file-ppt-2-fill',
+ color: '#F56C6C'
+ },
+ pptx: {
+ icon: 'sc-icon-file-ppt-2-fill',
+ color: '#F56C6C'
+ }
+ }
+}
diff --git a/src/config/filterBar.js b/src/config/filterBar.js
new file mode 100644
index 00000000..15ed8405
--- /dev/null
+++ b/src/config/filterBar.js
@@ -0,0 +1,74 @@
+export default {
+ //运算符
+ operator: [
+ {
+ label: '等于',
+ value: '=',
+ },
+ {
+ label: '不等于',
+ value: '!=',
+ },
+ {
+ label: '大于',
+ value: '>',
+ },
+ {
+ label: '大于等于',
+ value: '>=',
+ },
+ {
+ label: '小于',
+ value: '<',
+ },
+ {
+ label: '小于等于',
+ value: '<=',
+ },
+ {
+ label: '包含',
+ value: 'include',
+ },
+ {
+ label: '不包含',
+ value: 'notinclude',
+ }
+ ],
+ //过滤结果运算符的分隔符
+ separator: '|',
+ //获取我的常用
+ getMy: function (name) {
+ return new Promise((resolve) => {
+ console.log(`这里可以根据${name}参数请求接口`)
+ var list = []
+ setTimeout(()=>{
+ resolve(list)
+ },500)
+ })
+ },
+ /**
+ * 常用保存处理 返回resolve后继续操作
+ * @name scFilterBar组件的props->filterName
+ * @obj 过滤项整理好的对象
+ */
+ saveMy: function (name, obj) {
+ return new Promise((resolve) => {
+ console.log(name, obj)
+ setTimeout(()=>{
+ resolve(true)
+ },500)
+ })
+ },
+ /**
+ * 常用删除处理 返回resolve后继续操作
+ * @name scFilterBar组件的props->filterName
+ */
+ delMy: function (name) {
+ return new Promise((resolve) => {
+ console.log(name)
+ setTimeout(()=>{
+ resolve(true)
+ },500)
+ })
+ }
+}
diff --git a/src/config/iconSelect.js b/src/config/iconSelect.js
new file mode 100644
index 00000000..1ff2dacd
--- /dev/null
+++ b/src/config/iconSelect.js
@@ -0,0 +1,308 @@
+//图标选择器配置
+export default {
+ icons: [{
+ name: '默认',
+ icons: [
+ "el-icon-add-location",
+ "el-icon-aim",
+ "el-icon-alarm-clock",
+ "el-icon-apple",
+ "el-icon-arrow-down",
+ "el-icon-arrow-down-bold",
+ "el-icon-arrow-left",
+ "el-icon-arrow-left-bold",
+ "el-icon-arrow-right",
+ "el-icon-arrow-right-bold",
+ "el-icon-arrow-up",
+ "el-icon-arrow-up-bold",
+ "el-icon-avatar",
+ "el-icon-back",
+ "el-icon-baseball",
+ "el-icon-basketball",
+ "el-icon-bell",
+ "el-icon-bell-filled",
+ "el-icon-bicycle",
+ "el-icon-bottom",
+ "el-icon-bottom-left",
+ "el-icon-bottom-right",
+ "el-icon-bowl",
+ "el-icon-box",
+ "el-icon-briefcase",
+ "el-icon-brush",
+ "el-icon-brush-filled",
+ "el-icon-burger",
+ "el-icon-calendar",
+ "el-icon-camera",
+ "el-icon-camera-filled",
+ "el-icon-caret-bottom",
+ "el-icon-caret-left",
+ "el-icon-caret-right",
+ "el-icon-caret-top",
+ "el-icon-cellphone",
+ "el-icon-chat-dot-round",
+ "el-icon-chat-dot-square",
+ "el-icon-chat-line-round",
+ "el-icon-chat-line-square",
+ "el-icon-chat-round",
+ "el-icon-chat-square",
+ "el-icon-check",
+ "el-icon-checked",
+ "el-icon-cherry",
+ "el-icon-chicken",
+ "el-icon-circle-check",
+ "el-icon-circle-check-filled",
+ "el-icon-circle-close",
+ "el-icon-circle-close-filled",
+ "el-icon-circle-plus",
+ "el-icon-circle-plus-filled",
+ "el-icon-clock",
+ "el-icon-close",
+ "el-icon-close-bold",
+ "el-icon-cloudy",
+ "el-icon-coffee",
+ "el-icon-coffee-cup",
+ "el-icon-coin",
+ "el-icon-cold-drink",
+ "el-icon-collection",
+ "el-icon-collection-tag",
+ "el-icon-comment",
+ "el-icon-compass",
+ "el-icon-connection",
+ "el-icon-coordinate",
+ "el-icon-copy-document",
+ "el-icon-cpu",
+ "el-icon-credit-card",
+ "el-icon-crop",
+ "el-icon-d-arrow-left",
+ "el-icon-d-arrow-right",
+ "el-icon-d-caret",
+ "el-icon-data-analysis",
+ "el-icon-data-board",
+ "el-icon-data-line",
+ "el-icon-delete",
+ "el-icon-delete-filled",
+ "el-icon-delete-location",
+ "el-icon-dessert",
+ "el-icon-discount",
+ "el-icon-dish",
+ "el-icon-dish-dot",
+ "el-icon-document",
+ "el-icon-document-add",
+ "el-icon-document-checked",
+ "el-icon-document-copy",
+ "el-icon-document-delete",
+ "el-icon-document-remove",
+ "el-icon-download",
+ "el-icon-drizzling",
+ "el-icon-edit",
+ "el-icon-edit-pen",
+ "el-icon-eleme",
+ "el-icon-eleme-filled",
+ "el-icon-element-plus",
+ "el-icon-expand",
+ "el-icon-failed",
+ "el-icon-female",
+ "el-icon-files",
+ "el-icon-film",
+ "el-icon-filter",
+ "el-icon-finished",
+ "el-icon-first-aid-kit",
+ "el-icon-flag",
+ "el-icon-fold",
+ "el-icon-folder",
+ "el-icon-folder-add",
+ "el-icon-folder-checked",
+ "el-icon-folder-delete",
+ "el-icon-folder-opened",
+ "el-icon-folder-remove",
+ "el-icon-food",
+ "el-icon-football",
+ "el-icon-fork-spoon",
+ "el-icon-fries",
+ "el-icon-full-screen",
+ "el-icon-goblet",
+ "el-icon-goblet-full",
+ "el-icon-goblet-square",
+ "el-icon-goblet-square-full",
+ "el-icon-goods",
+ "el-icon-goods-filled",
+ "el-icon-grape",
+ "el-icon-grid",
+ "el-icon-guide",
+ "el-icon-headset",
+ "el-icon-help",
+ "el-icon-help-filled",
+ "el-icon-hide",
+ "el-icon-histogram",
+ "el-icon-home-filled",
+ "el-icon-hot-water",
+ "el-icon-house",
+ "el-icon-ice-cream",
+ "el-icon-ice-cream-round",
+ "el-icon-ice-cream-square",
+ "el-icon-ice-drink",
+ "el-icon-ice-tea",
+ "el-icon-info-filled",
+ "el-icon-iphone",
+ "el-icon-key",
+ "el-icon-knife-fork",
+ "el-icon-lightning",
+ "el-icon-link",
+ "el-icon-list",
+ "el-icon-loading",
+ "el-icon-location",
+ "el-icon-location-filled",
+ "el-icon-location-information",
+ "el-icon-lock",
+ "el-icon-lollipop",
+ "el-icon-magic-stick",
+ "el-icon-magnet",
+ "el-icon-male",
+ "el-icon-management",
+ "el-icon-map-location",
+ "el-icon-medal",
+ "el-icon-menu",
+ "el-icon-message",
+ "el-icon-message-box",
+ "el-icon-mic",
+ "el-icon-microphone",
+ "el-icon-milk-tea",
+ "el-icon-minus",
+ "el-icon-money",
+ "el-icon-monitor",
+ "el-icon-moon",
+ "el-icon-moon-night",
+ "el-icon-more",
+ "el-icon-more-filled",
+ "el-icon-mostly-cloudy",
+ "el-icon-mouse",
+ "el-icon-mug",
+ "el-icon-mute",
+ "el-icon-mute-notification",
+ "el-icon-no-smoking",
+ "el-icon-notebook",
+ "el-icon-notification",
+ "el-icon-odometer",
+ "el-icon-office-building",
+ "el-icon-open",
+ "el-icon-operation",
+ "el-icon-opportunity",
+ "el-icon-orange",
+ "el-icon-paperclip",
+ "el-icon-partly-cloudy",
+ "el-icon-pear",
+ "el-icon-phone",
+ "el-icon-phone-filled",
+ "el-icon-picture",
+ "el-icon-picture-filled",
+ "el-icon-picture-rounded",
+ "el-icon-pie-chart",
+ "el-icon-place",
+ "el-icon-platform",
+ "el-icon-plus",
+ "el-icon-pointer",
+ "el-icon-position",
+ "el-icon-postcard",
+ "el-icon-pouring",
+ "el-icon-present",
+ "el-icon-price-tag",
+ "el-icon-printer",
+ "el-icon-promotion",
+ "el-icon-question-filled",
+ "el-icon-rank",
+ "el-icon-reading",
+ "el-icon-reading-lamp",
+ "el-icon-refresh",
+ "el-icon-refresh-left",
+ "el-icon-refresh-right",
+ "el-icon-refrigerator",
+ "el-icon-remove",
+ "el-icon-remove-filled",
+ "el-icon-right",
+ "el-icon-scale-to-original",
+ "el-icon-school",
+ "el-icon-scissor",
+ "el-icon-search",
+ "el-icon-select",
+ "el-icon-sell",
+ "el-icon-semi-select",
+ "el-icon-service",
+ "el-icon-set-up",
+ "el-icon-setting",
+ "el-icon-share",
+ "el-icon-ship",
+ "el-icon-shop",
+ "el-icon-shopping-bag",
+ "el-icon-shopping-cart",
+ "el-icon-shopping-cart-full",
+ "el-icon-smoking",
+ "el-icon-soccer",
+ "el-icon-sold-out",
+ "el-icon-sort",
+ "el-icon-sort-down",
+ "el-icon-sort-up",
+ "el-icon-stamp",
+ "el-icon-star",
+ "el-icon-star-filled",
+ "el-icon-stopwatch",
+ "el-icon-success-filled",
+ "el-icon-sugar",
+ "el-icon-suitcase",
+ "el-icon-sunny",
+ "el-icon-sunrise",
+ "el-icon-sunset",
+ "el-icon-switch",
+ "el-icon-switch-button",
+ "el-icon-takeaway-box",
+ "el-icon-ticket",
+ "el-icon-tickets",
+ "el-icon-timer",
+ "el-icon-toilet-paper",
+ "el-icon-tools",
+ "el-icon-top",
+ "el-icon-top-left",
+ "el-icon-top-right",
+ "el-icon-trend-charts",
+ "el-icon-trophy",
+ "el-icon-turn-off",
+ "el-icon-umbrella",
+ "el-icon-unlock",
+ "el-icon-upload",
+ "el-icon-upload-filled",
+ "el-icon-user",
+ "el-icon-user-filled",
+ "el-icon-van",
+ "el-icon-video-camera",
+ "el-icon-video-camera-filled",
+ "el-icon-video-pause",
+ "el-icon-video-play",
+ "el-icon-view",
+ "el-icon-wallet",
+ "el-icon-wallet-filled",
+ "el-icon-warning",
+ "el-icon-warning-filled",
+ "el-icon-watch",
+ "el-icon-watermelon",
+ "el-icon-wind-power",
+ "el-icon-zoom-in",
+ "el-icon-zoom-out"
+ ]
+ },
+ {
+ name: '扩展',
+ icons: [
+ 'sc-icon-vue',
+ 'sc-icon-code',
+ 'sc-icon-wechat',
+ 'sc-icon-bug-fill',
+ 'sc-icon-bug-line',
+ 'sc-icon-file-word',
+ 'sc-icon-file-excel',
+ 'sc-icon-file-ppt',
+ 'sc-icon-organization',
+ 'sc-icon-upload',
+ 'sc-icon-download'
+ ]
+ }
+ ]
+}
diff --git a/src/config/index.js b/src/config/index.js
new file mode 100644
index 00000000..f4b827fc
--- /dev/null
+++ b/src/config/index.js
@@ -0,0 +1,97 @@
+const DEFAULT_CONFIG = {
+ //标题
+ APP_NAME: process.env.VUE_APP_TITLE,
+
+ //首页地址
+ DASHBOARD_URL: "/dashboard",
+
+ //版本号
+ APP_VER: "2.3.0",
+
+ //内核版本号
+ CORE_VER: "1.6.9",
+
+ //接口地址
+ // API_URL: process.env.NODE_ENV === 'development' && process.env.VUE_APP_PROXY === 'false' ? "/api" : process.env.VUE_APP_API_BASEURL,
+ API_URL: get_api_url(),
+
+ //端口地址
+ HOST_URL: get_host_url(),
+
+ //请求超时
+ TIMEOUT: 200000,
+
+ //TokenName
+ TOKEN_NAME: "Authorization",
+
+ //Token前缀,注意最后有个空格,如不需要需设置空字符串
+ TOKEN_PREFIX: "Bearer ",
+
+ //追加其他头
+ HEADERS: {},
+
+ //请求是否开启缓存
+ REQUEST_CACHE: false,
+
+ //布局 默认:default | 通栏:header | 经典:menu | 功能坞:dock
+ //dock将关闭标签和面包屑栏
+ LAYOUT: 'header',
+
+ //菜单是否折叠
+ MENU_IS_COLLAPSE: false,
+
+ //菜单是否启用手风琴效果
+ MENU_UNIQUE_OPENED: true,
+
+ //是否开启多标签
+ LAYOUT_TAGS: false,
+
+ //语言
+ LANG: 'zh-cn',
+
+ //主题颜色
+ COLOR: '#536DFE',
+
+ //是否加密localStorage, 为空不加密,可填写AES(模式ECB,移位Pkcs7)加密
+ LS_ENCRYPTION: '',
+
+ //localStorageAES加密秘钥,位数建议填写8的倍数
+ LS_ENCRYPTION_key: '2XNN4K8LC0ELVWN4',
+
+ //控制台首页默认布局
+ DEFAULT_GRID: {
+ //默认分栏数量和宽度 例如 [24] [18,6] [8,8,8] [6,12,6]
+ layout: [24, 24, 24],
+ //小组件分布,com取值:views/home/components 文件名
+ copmsList: [
+ ['ticket'],
+ // ['eventlist'],
+ ['about'],
+
+ ]
+ }
+}
+function get_api_url(){
+ if(process.env.NODE_ENV === 'development' || (process.env.NODE_ENV === 'production' && window.location.host.indexOf('localhost') > -1)){
+ return process.env.VUE_APP_API_BASEURL
+ }
+ return 'http://' + window.location.host + '/api'
+}
+
+function get_host_url(){
+ if(process.env.NODE_ENV === 'development'){
+ return process.env.VUE_APP_BASEURL
+ }
+ return 'http://' + window.location.host
+}
+//合并业务配置
+import MY_CONFIG from "./myConfig"
+Object.assign(DEFAULT_CONFIG, MY_CONFIG)
+
+// 如果生产模式,就合并动态的APP_CONFIG
+// public/config.js
+if (process.env.NODE_ENV === 'production') {
+ Object.assign(DEFAULT_CONFIG, APP_CONFIG)
+}
+
+export default DEFAULT_CONFIG
diff --git a/src/config/myConfig.js b/src/config/myConfig.js
new file mode 100644
index 00000000..e87699d6
--- /dev/null
+++ b/src/config/myConfig.js
@@ -0,0 +1,10 @@
+//业务配置
+//会合并至this.$CONFIG
+//生产模式 public/config.js 同名key会覆盖这里的配置从而实现打包后的热更新
+//为避免和SCUI框架配置混淆建议添加前缀 MY_
+//全局可使用 this.$CONFIG.MY_KEY 访问
+
+export default {
+ //是否显示第三方授权登录
+ MY_SHOW_LOGIN_OAUTH: true
+}
diff --git a/src/config/route.js b/src/config/route.js
new file mode 100644
index 00000000..c1c72493
--- /dev/null
+++ b/src/config/route.js
@@ -0,0 +1,310 @@
+// 静态路由配置
+// 书写格式与动态路由格式一致,全部经由框架统一转换
+// 比较动态路由在meta中多加入了role角色权限,为数组类型。一个菜单是否有权限显示,取决于它以及后代菜单是否有权限。
+// routes 显示在左侧菜单中的路由(显示顺序在动态路由之前)
+const routes = [
+ //工作台
+ {
+ name: "workSpace",
+ path: "/",
+ meta: {
+ title: "工作台",
+ icon: "sc-icon-Gongzuotai",
+ type: "menu",
+ perms: ["home"],
+ },
+ children: [
+ //首页
+ {
+ name: "home",
+ path: "/",
+ meta: {
+ title: "首页",
+ icon: "el-icon-home-filled",
+ type: "menu",
+ perms: ["home"],
+ },
+ children: [
+ {
+ name: "dashboard",
+ path: "/dashboard",
+ meta: {
+ title: "控制台",
+ affix: true,
+ perms: ["dashboard"],
+ },
+ component: "home",
+ },
+ {
+ name: "userCenter",
+ path: "/usercenter",
+ meta: {
+ title: "帐号信息",
+ // icon: "el-icon-user",
+ perms: ["userCenter"],
+ },
+ component: "userCenter",
+ },
+ ],
+ },
+ //审批
+ {
+ name: "wf",
+ path: "/wf",
+ meta: {
+ title: "审批管理",
+ icon: "sc-icon-Shenpi",
+ type: "menu",
+ perms: ["wf"],
+ },
+ children: [
+ {
+ name: "workflow",
+ path: "/wf/workflow",
+ meta: {
+ title: "工作流",
+ // icon: "el-icon-guide",
+ perms: ["workflow"],
+ },
+ component: "wf/workflow",
+ },
+ {
+ name: "configuration",
+ path: "/wf/configuration",
+ meta: {
+ title: "工作流配置",
+ // icon: "el-icon-menu",
+ hidden: true,
+ perms: ["workflow"],
+ },
+ component: "wf/configuration",
+ },
+ {
+ name: "allwork",
+ path: "/wf/allwork",
+ meta: {
+ title: "全部审批",
+ // icon: "el-icon-folder",
+ perms: ["allwork"],
+ },
+ component: "wf/allwork",
+ },
+ {
+ name: "ownerwork",
+ path: "/wf/ownerwork",
+ meta: {
+ title: "我创建的",
+ // icon: "el-icon-folder-add",
+ perms: ["ownerwork"],
+ },
+ component: "wf/ownerwork",
+ },
+ {
+ name: "duty",
+ path: "/wf/dutywork",
+ meta: {
+ title: "待办审批",
+ // icon: "el-icon-folder-opened",
+ perms: ["duty"],
+ },
+ component: "wf/dutywork",
+ },
+ {
+ name: "worked",
+ path: "/wf/worked",
+ meta: {
+ title: "我处理的",
+ // icon: "el-icon-expand",
+ perms: ["worked"],
+ },
+ component: "wf/worked",
+ },
+ {
+ name: "ccwork",
+ path: "/wf/ccwork",
+ meta: {
+ title: "抄送我的",
+ // icon: "el-icon-edit-pen",
+ perms: ["ccwork"],
+ },
+ component: "wf/ccwork",
+ },
+ {
+ name: "ticketdetail",
+ path: "/wf/ticketdetail",
+ meta: {
+ title: "工单详情",
+ // icon: "el-icon-menu",
+ hidden: true,
+ perms: ["duty"],
+ },
+ component: "wf/ticketdetail",
+ },
+ ],
+ },
+ //系统
+ {
+ name: "sys",
+ path: "/sys",
+ meta: {
+ title: "系统",
+ icon: "el-icon-tools",
+ type: "menu",
+ perms: ["sys"],
+ },
+ children: [
+ {
+ path: "/sys/user",
+ name: "user",
+ meta: {
+ title: "账户管理",
+ // icon: "el-icon-user",
+ type: "menu",
+ perms: ["user"],
+ },
+ component: "sys/user",
+ },
+ {
+ path: "/sys/dept",
+ name: "dept",
+ meta: {
+ title: "部门管理",
+ // icon: "sc-icon-organization",
+ type: "menu",
+ perms: ["dept"],
+ },
+ component: "sys/dept",
+ },
+ {
+ path: "/sys/post",
+ name: "post",
+ meta: {
+ title: "岗位管理",
+ // icon: "el-icon-postcard",
+ type: "menu",
+ perms: ["post"],
+ },
+ component: "sys/post",
+ },
+ {
+ path: "/sys/role",
+ name: "role",
+ meta: {
+ title: "角色管理",
+ // icon: "el-icon-notebook",
+ type: "menu",
+ perms: ["role"],
+ },
+ component: "sys/role",
+ },
+ {
+ path: "/sys/myschedule",
+ name: "myschedule",
+ meta: {
+ title: "定时策略",
+ type: "menu",
+ perms: ["myschedule"],
+ },
+ component: "sys/myschedule"
+ },
+ {
+ path: "/sys/dict",
+ name: "dict",
+ meta: {
+ title: "字典管理",
+ // icon: "el-icon-document",
+ type: "menu",
+ perms: ["dict"],
+ },
+ component: "sys/dict",
+ },
+ {
+ path: "/sys/task",
+ name: "task",
+ meta: {
+ title: "计划任务",
+ // icon: "el-icon-alarm-clock",
+ type: "menu",
+ perms: ["task"],
+ },
+ component: "sys/task",
+ },
+ ],
+ },
+ ],
+ },
+ //运维
+ {
+ name: "ops",
+ path: "/ops",
+ meta: {
+ title: "运维",
+ icon: "el-icon-tools",
+ type: "menu",
+ perms: ["ops"],
+ },
+ children: [
+ {
+ name: "menu",
+ path: "/ops/menu",
+ meta: {
+ title: "功能管理",
+ icon: "el-icon-fold",
+ perms: ["menu"],
+ },
+ component: "ops/menu",
+ },
+ {
+ name: "log",
+ path: "/ops/log",
+ meta: {
+ title: "请求日志",
+ icon: "el-icon-document",
+ perms: ["log"],
+ },
+ component: "ops/log_request",
+ },
+ {
+ name: "thirdLogs",
+ path: "/ops/thirdLogs",
+ meta: {
+ title: "第三方日志",
+ icon: "el-icon-document",
+ perms: ["third_log"],
+ },
+ component: "ops/thirdLogs",
+ },
+ {
+ name: "fileLogs",
+ path: "/ops/fileLogs",
+ meta: {
+ title: "文件日志",
+ icon: "el-icon-document",
+ perms: ["file_log"],
+ },
+ component: "ops/fileLogs",
+ },
+ {
+ name: "server",
+ path: "/ops/server",
+ meta: {
+ title: "服务器",
+ icon: "el-icon-document",
+ perms: ["ops"],
+ },
+ component: "ops/server",
+ },
+ {
+ name: "setting",
+ path: "/ops/setting",
+ meta: {
+ title: "配置",
+ icon: "el-icon-document",
+ perms: ["sysconfig"],
+ },
+ component: "ops/setting",
+ },
+ ],
+ },
+];
+export default routes;
diff --git a/src/config/select.js b/src/config/select.js
new file mode 100644
index 00000000..06af8c76
--- /dev/null
+++ b/src/config/select.js
@@ -0,0 +1,21 @@
+import API from "@/api";
+
+//字典选择器配置
+
+export default {
+ dicApiObj: API.system.dict.list, //获取字典接口对象
+ parseData: function (res) {
+ return {
+ data: res.data, //分析行数据字段结构
+ msg: res.message, //分析描述字段结构
+ code: res.code //分析状态字段结构
+ }
+ },
+ request: {
+ name: 'name' //规定搜索字段
+ },
+ props: {
+ label: 'label', //映射label显示字段
+ value: 'value', //映射value值字段
+ }
+}
diff --git a/src/config/table.js b/src/config/table.js
new file mode 100644
index 00000000..55839d82
--- /dev/null
+++ b/src/config/table.js
@@ -0,0 +1,72 @@
+//数据表格配置
+
+import tool from "@/utils/tool";
+
+export default {
+ successCode: 200, //请求完成代码
+ pageSize: 20, //表格每一页条数
+ pageSizes: [1, 10, 20, 30, 40, 50, 100, 200, 500, 1000], //表格可设置的一页条数
+ paginationLayout: "total, sizes, prev, pager, next, jumper", //表格分页布局,可设置"total, sizes, prev, pager, next, jumper"
+ parseData: function (res) {
+ //数据分析
+ return {
+ data: res, //分析无分页的数据字段结构
+ rows: res.results, //分析行数据字段结构
+ total: res.count, //分析总数字段结构
+ summary: res.summary, //分析合计行字段结构
+ // msg: res.err_msg, //分析描述字段结构
+ // code: res.err_code //分析状态字段结构
+ };
+ },
+ request: {
+ //请求规定字段
+ page: "page", //规定当前分页字段
+ pageSize: "page_size", //规定一页条数字段
+ prop: "prop", //规定排序字段名字段
+ order: "ordering", //规定排序规格字段
+ },
+ /**
+ * 自定义列保存处理
+ * @tableName scTable组件的props->tableName
+ * @column 用户配置好的列
+ */
+ columnSettingSave: function (tableName, column) {
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ //这里为了演示使用了session和setTimeout演示,开发时应用数据请求
+ tool.session.set(tableName, column);
+ resolve(true);
+ }, 1000);
+ });
+ },
+ /**
+ * 获取自定义列
+ * @tableName scTable组件的props->tableName
+ * @column 组件接受到的props->column
+ */
+ columnSettingGet: function (tableName, column) {
+ return new Promise((resolve) => {
+ //这里为了演示使用了session和setTimeout演示,开发时应用数据请求
+ const userColumn = tool.session.get(tableName);
+ if (userColumn) {
+ resolve(userColumn);
+ } else {
+ resolve(column);
+ }
+ });
+ },
+ /**
+ * 重置自定义列
+ * @tableName scTable组件的props->tableName
+ * @column 组件接受到的props->column
+ */
+ columnSettingReset: function (tableName, column) {
+ return new Promise((resolve) => {
+ //这里为了演示使用了session和setTimeout演示,开发时应用数据请求
+ setTimeout(() => {
+ tool.session.remove(tableName);
+ resolve(column);
+ }, 1000);
+ });
+ },
+};
diff --git a/src/config/tableSelect.js b/src/config/tableSelect.js
new file mode 100644
index 00000000..fa2120ca
--- /dev/null
+++ b/src/config/tableSelect.js
@@ -0,0 +1,23 @@
+//表格选择器配置
+
+export default {
+ pageSize: 20, //表格每一页条数
+ parseData: function (res) {
+ return {
+ data: res,
+ rows: res.results, //分析行数据字段结构
+ total: res.count, //分析总数字段结构
+ // msg: res.message, //分析描述字段结构
+ // code: res.code //分析状态字段结构
+ }
+ },
+ request: {
+ page: 'page', //规定当前分页字段
+ pageSize: 'page_size', //规定一页条数字段
+ keyword: 'search' //规定搜索字段
+ },
+ props: {
+ label: 'name', //映射label显示字段
+ value: 'id', //映射value值字段
+ }
+}
diff --git a/src/config/upload.js b/src/config/upload.js
new file mode 100644
index 00000000..98a9b432
--- /dev/null
+++ b/src/config/upload.js
@@ -0,0 +1,20 @@
+import API from "@/api";
+
+//上传配置
+
+export default {
+ apiObj: API.common.upload, //上传请求API对象
+ filename: "file", //form请求时文件的key
+ successCode: 200, //请求完成代码
+ maxSize: 10, //最大文件大小 默认10MB
+ parseData: function (res) {
+ return {
+ // code: res.code, //分析状态字段结构
+ fileName: res.name,//分析文件名称
+ src: res.path, //分析图片远程地址结构
+ // msg: res.message //分析描述字段结构
+ }
+ },
+ apiObjFile: API.common.uploadFile, //附件上传请求API对象
+ maxSizeFile: 50 //最大文件大小 默认10MB
+}
diff --git a/src/config/workflow.js b/src/config/workflow.js
new file mode 100644
index 00000000..1024e169
--- /dev/null
+++ b/src/config/workflow.js
@@ -0,0 +1,69 @@
+import API from "@/api";
+
+//审批工作流人员/组织选择器配置
+
+export default {
+ //配置接口正常返回代码
+ successCode: 200,
+ //配置组织
+ group: {
+ //请求接口对象
+ apiObj: API.system.dept.list,
+ //接受数据字段映射
+ parseData: function (res) {
+ return {
+ rows: res.data,
+ msg: res.message,
+ code: res.code
+ }
+ },
+ //显示数据字段映射
+ props: {
+ key: 'id',
+ label: 'label',
+ children: 'children'
+ }
+ },
+ //配置用户
+ user: {
+ apiObj: API.demo.page,
+ pageSize: 20,
+ parseData: function (res) {
+ return {
+ rows: res.data.rows,
+ total: res.data.total,
+ msg: res.message,
+ code: res.code
+ }
+ },
+ props: {
+ key: 'id',
+ label: 'user',
+ },
+ request: {
+ page: 'page',
+ pageSize: 'pageSize',
+ groupId: 'groupId',
+ keyword: 'keyword'
+ }
+ },
+ //配置角色
+ role: {
+ //请求接口对象
+ apiObj: API.system.dept.list,
+ //接受数据字段映射
+ parseData: function (res) {
+ return {
+ rows: res.data,
+ msg: res.message,
+ code: res.code
+ }
+ },
+ //显示数据字段映射
+ props: {
+ key: 'id',
+ label: 'label',
+ children: 'children'
+ }
+ }
+}
diff --git a/src/directives/auth.js b/src/directives/auth.js
new file mode 100644
index 00000000..14d1d72e
--- /dev/null
+++ b/src/directives/auth.js
@@ -0,0 +1,22 @@
+import { permissionAll } from '@/utils/permission'
+import tool from '@/utils/tool';
+
+/**
+ * 用户权限指令
+ * @directive 单个权限验证(v-auth="'xxx'")
+ * @directive 多个权限验证,满足一个则显示(v-auths="['xxx','xxx']")
+ * @directive 多个权限验证,全部满足则显示(v-auths-all="['xxx','xxx']")
+ */
+export default {
+ mounted (el, binding) {
+ if(permissionAll()){
+ return
+ }
+ let permissions = tool.data.get("PERMISSIONS");
+
+ // if (permissions.indexOf('superuser') > -1){
+ // return
+ // }
+ if (!permissions.some((v) => v === binding.value)) el.parentNode.removeChild(el);
+ }
+}
diff --git a/src/directives/auths.js b/src/directives/auths.js
new file mode 100644
index 00000000..a6fbeb00
--- /dev/null
+++ b/src/directives/auths.js
@@ -0,0 +1,27 @@
+import { permissionAll } from '@/utils/permission'
+import tool from '@/utils/tool';
+
+/**
+ * 用户权限指令
+ * @directive 单个权限验证(v-auth="'xxx'")
+ * @directive 多个权限验证,满足一个则显示(v-auths="['xxx','xxx']")
+ * @directive 多个权限验证,全部满足则显示(v-auths-all="['xxx','xxx']")
+ */
+export default {
+ mounted (el, binding) {
+ if(permissionAll()){
+ return
+ }
+ let permissions = tool.data.get("PERMISSIONS");
+ // if (permissions.indexOf('superuser') > -1){
+ // return
+ // }
+ let flag = false;
+ permissions.map((val) => {
+ binding.value.map((v) => {
+ if (val === v) flag = true;
+ });
+ });
+ if (!flag) el.parentNode.removeChild(el);
+ }
+}
diff --git a/src/directives/authsAll.js b/src/directives/authsAll.js
new file mode 100644
index 00000000..883abb3c
--- /dev/null
+++ b/src/directives/authsAll.js
@@ -0,0 +1,22 @@
+import { permissionAll, judementSameArr } from '@/utils/permission'
+import tool from '@/utils/tool';
+
+/**
+ * 用户权限指令
+ * @directive 单个权限验证(v-auth="'xxx'")
+ * @directive 多个权限验证,满足一个则显示(v-auths="['xxx','xxx']")
+ * @directive 多个权限验证,全部满足则显示(v-auths-all="['xxx','xxx']")
+ */
+export default {
+ mounted (el, binding) {
+ if(permissionAll()){
+ return
+ }
+ let permissions = tool.data.get("PERMISSIONS");
+ // if (permissions.indexOf('superuser') > -1){
+ // return
+ // }
+ const flag = judementSameArr(binding.value, permissions);
+ if (!flag) el.parentNode.removeChild(el);
+ }
+}
diff --git a/src/directives/copy.js b/src/directives/copy.js
new file mode 100644
index 00000000..0efecbef
--- /dev/null
+++ b/src/directives/copy.js
@@ -0,0 +1,29 @@
+import { ElMessage } from 'element-plus'
+
+export default {
+ mounted(el, binding) {
+ el.$value = binding.value
+ el.handler = () => {
+ const textarea = document.createElement('textarea')
+ textarea.readOnly = 'readonly'
+ textarea.style.position = 'absolute'
+ textarea.style.left = '-9999px'
+ textarea.value = el.$value
+ document.body.appendChild(textarea)
+ textarea.select()
+ textarea.setSelectionRange(0, textarea.value.length)
+ const result = document.execCommand('Copy')
+ if (result) {
+ ElMessage.success("复制成功")
+ }
+ document.body.removeChild(textarea)
+ }
+ el.addEventListener('click', el.handler)
+ },
+ updated(el, binding){
+ el.$value = binding.value
+ },
+ unmounted(el){
+ el.removeEventListener('click', el.handler)
+ }
+}
diff --git a/src/directives/role.js b/src/directives/role.js
new file mode 100644
index 00000000..42655b05
--- /dev/null
+++ b/src/directives/role.js
@@ -0,0 +1,22 @@
+import { rolePermission } from '@/utils/permission'
+
+export default {
+ mounted(el, binding) {
+ const { value } = binding
+ if(Array.isArray(value)){
+ let ishas = false;
+ value.forEach(item => {
+ if(rolePermission(item)){
+ ishas = true;
+ }
+ })
+ if (!ishas){
+ el.parentNode.removeChild(el)
+ }
+ }else{
+ if(!rolePermission(value)){
+ el.parentNode.removeChild(el);
+ }
+ }
+ }
+};
diff --git a/src/directives/time.js b/src/directives/time.js
new file mode 100644
index 00000000..d0e74744
--- /dev/null
+++ b/src/directives/time.js
@@ -0,0 +1,79 @@
+import tool from '@/utils/tool'
+
+var Time = {
+ //获取当前时间戳
+ getUnix: function() {
+ var date = new Date();
+ return date.getTime();
+ },
+ //获取今天0点0分0秒的时间戳
+ getTodayUnix: function() {
+ var date = new Date();
+ date.setHours(0);
+ date.setMinutes(0);
+ date.setSeconds(0);
+ date.setMilliseconds(0);
+ return date.getTime();
+ },
+ //获取今年1月1日0点0秒的时间戳
+ getYearUnix: function() {
+ var date = new Date();
+ date.setMonth(0);
+ date.setDate(1);
+ date.setHours(0);
+ date.setMinutes(0);
+ date.setSeconds(0);
+ date.setMilliseconds(0);
+ return date.getTime();
+ },
+ //获取标准年月日
+ getLastDate: function(time) {
+ var date = new Date(time);
+ var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1;
+ var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
+ return date.getFullYear() + '-' + month + '-' + day;
+ },
+ //转换时间
+ getFormateTime: function(timestamp) {
+ timestamp = new Date(timestamp)
+ var now = this.getUnix();
+ var today = this.getTodayUnix();
+ //var year = this.getYearUnix();
+ var timer = (now - timestamp) / 1000;
+ var tip = '';
+
+ if (timer <= 0) {
+ tip = '刚刚';
+ } else if (Math.floor(timer / 60) <= 0) {
+ tip = '刚刚';
+ } else if (timer < 3600) {
+ tip = Math.floor(timer / 60) + '分钟前';
+ } else if (timer >= 3600 && (timestamp - today >= 0)) {
+ tip = Math.floor(timer / 3600) + '小时前';
+ } else if (timer / 86400 <= 31) {
+ tip = Math.ceil(timer / 86400) + '天前';
+ } else {
+ tip = this.getLastDate(timestamp);
+ }
+ return tip;
+ }
+}
+
+export default (el, binding) => {
+ let { value, modifiers} = binding
+ if(!value){
+ return false
+ }
+ if(value.toString().length == 10){
+ value = value * 1000
+ }
+ if (modifiers.tip) {
+ el.innerHTML = Time.getFormateTime(value)
+ el.__timeout__ = setInterval(() => {
+ el.innerHTML = Time.getFormateTime(value)
+ }, 60000)
+ } else {
+ const format = el.getAttribute('format') || undefined
+ el.innerHTML = tool.dateFormat(value, format)
+ }
+}
diff --git a/src/layout/components/NavMenu.vue b/src/layout/components/NavMenu.vue
new file mode 100644
index 00000000..c5a368ec
--- /dev/null
+++ b/src/layout/components/NavMenu.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+ {}'>
+
+
+ {{navMenu.meta.title}}
+
+
+
+
+
+
+ {{navMenu.meta.title}}
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/iframeView.vue b/src/layout/components/iframeView.vue
new file mode 100644
index 00000000..3e64d542
--- /dev/null
+++ b/src/layout/components/iframeView.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/search.vue b/src/layout/components/search.vue
new file mode 100644
index 00000000..fd727f3e
--- /dev/null
+++ b/src/layout/components/search.vue
@@ -0,0 +1,139 @@
+
+
+
+
+ {{item}}
+
+
+
暂无搜索结果
+
+
+ -
+
+ {{ item.breadcrumb }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/setting.vue b/src/layout/components/setting.vue
new file mode 100644
index 00000000..e8ef2e13
--- /dev/null
+++ b/src/layout/components/setting.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/sideM.vue b/src/layout/components/sideM.vue
new file mode 100644
index 00000000..80c622af
--- /dev/null
+++ b/src/layout/components/sideM.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+
+
{{ baseName }}>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/tags.vue b/src/layout/components/tags.vue
new file mode 100644
index 00000000..ae23c706
--- /dev/null
+++ b/src/layout/components/tags.vue
@@ -0,0 +1,304 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/tasks.vue b/src/layout/components/tasks.vue
new file mode 100644
index 00000000..e14ab99f
--- /dev/null
+++ b/src/layout/components/tasks.vue
@@ -0,0 +1,83 @@
+
+
+
+
+
+ 没有正在执行的任务
+
+ 在处理耗时过久的任务时为了不阻碍正在处理的工作,可在任务中心进行异步执行。
+
+
+
+
+
+
+
+
+
+
{{ task.taskName }}
+
创建
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/topbar.vue b/src/layout/components/topbar.vue
new file mode 100644
index 00000000..bcc9ed51
--- /dev/null
+++ b/src/layout/components/topbar.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+ {{item.meta.title}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/components/userbar.vue b/src/layout/components/userbar.vue
new file mode 100644
index 00000000..f89a901a
--- /dev/null
+++ b/src/layout/components/userbar.vue
@@ -0,0 +1,328 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ userNameF }}
+
+
+
+
+
+
+
+ 帐号信息
+
+ 退出登录
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/index.vue b/src/layout/index.vue
new file mode 100644
index 00000000..26c2b518
--- /dev/null
+++ b/src/layout/index.vue
@@ -0,0 +1,469 @@
+
+
+
+
+
+
+
+
{{ pmenu.meta.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ pmenu.meta.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/other/404.vue b/src/layout/other/404.vue
new file mode 100644
index 00000000..1647130d
--- /dev/null
+++ b/src/layout/other/404.vue
@@ -0,0 +1,50 @@
+
+
+
+

+
+
+
无权限或找不到页面
+
当前页面无权限访问或者打开了一个不存在的链接,请检查当前账户权限和链接的可访问性。
+
返回首页
+
重新登录
+
返回上一页
+
+
+
+
+
+
+
diff --git a/src/layout/other/autoExit.js b/src/layout/other/autoExit.js
new file mode 100644
index 00000000..c88c85b7
--- /dev/null
+++ b/src/layout/other/autoExit.js
@@ -0,0 +1,51 @@
+export default {
+ render() {
+
+ },
+ data() {
+ return {
+ logoutCount: this.$TOOL.data.get('AUTO_EXIT')
+ }
+ },
+ mounted() {
+ if(this.logoutCount){
+ this.setNewAutoExitTime()
+ document.onclick = () => {
+ this.setNewAutoExitTime()
+ }
+ document.onmousemove = () => {
+ this.setNewAutoExitTime()
+ }
+ document.onkeydown = () => {
+ this.setNewAutoExitTime()
+ }
+ document.onscroll = () => {
+ this.setNewAutoExitTime()
+ }
+ window.autoExitTimer = window.setInterval(this.autoExitfun, 1000)
+ }
+ },
+ unmounted() {
+ if(this.logoutCount){
+ clearInterval(window.autoExitTimer)
+ window.autoExitTimer = null
+ }
+ },
+ methods: {
+ setNewAutoExitTime(){
+ window.autoExitTime = new Date().getTime()
+ },
+ autoExitfun(){
+ if(new Date().getTime() - window.autoExitTime > this.logoutCount * 60 * 1000){
+ clearInterval(window.autoExitTimer)
+ window.autoExitTimer = null
+ this.$router.replace({path: '/login'})
+ this.$alert("用户长时间无操作,为保证账户安全,系统已自动登出。", "提示", {
+ type: 'warning',
+ center: true,
+ roundButton: true
+ })
+ }
+ }
+ }
+}
diff --git a/src/layout/other/empty.vue b/src/layout/other/empty.vue
new file mode 100644
index 00000000..9c72bc89
--- /dev/null
+++ b/src/layout/other/empty.vue
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/locales/index.js b/src/locales/index.js
new file mode 100644
index 00000000..97c53b7c
--- /dev/null
+++ b/src/locales/index.js
@@ -0,0 +1,28 @@
+import sysConfig from "@/config"
+import tool from '@/utils/tool'
+import { createI18n } from 'vue-i18n'
+import el_zh_cn from 'element-plus/es/locale/lang/zh-cn'
+import el_en from 'element-plus/es/locale/lang/en'
+
+import zh_cn from './lang/zh-cn.js'
+import en from './lang/en.js'
+
+const messages = {
+ 'zh-cn': {
+ el: el_zh_cn,
+ ...zh_cn
+ },
+ 'en': {
+ el: el_en,
+ ...en
+ }
+}
+
+const i18n = createI18n({
+ locale: tool.data.get("APP_LANG") || sysConfig.LANG,
+ fallbackLocale: 'zh-cn',
+ globalInjection: true,
+ messages,
+})
+
+export default i18n;
diff --git a/src/locales/lang/en.js b/src/locales/lang/en.js
new file mode 100644
index 00000000..39dcceb1
--- /dev/null
+++ b/src/locales/lang/en.js
@@ -0,0 +1,39 @@
+export default {
+ login: {
+ slogan: 'High performance / delicate / grace',
+ describe: 'Vue3 + element plus based front-end solutions in the background.',
+ signInTitle: 'Sign in',
+ accountLogin: 'Account sign in',
+ mobileLogin: 'Mobile sign in',
+ rememberMe: 'Remember me',
+ forgetPassword: 'Forget password',
+ signIn: 'Sign in',
+ signInOther: 'Sign in with',
+ userPlaceholder: 'user / phone / idnumber',
+ userError: 'Please input a user name',
+ PWPlaceholder: 'Please input a password',
+ PWError: 'Please input a password',
+ admin: 'Administrator',
+ user: 'User',
+ mobilePlaceholder: 'Mobile',
+ mobileError: 'Please input mobile',
+ smsPlaceholder: 'SMS Code',
+ smsError: 'Please input sms code',
+ smsGet: 'Get SMS Code',
+ smsSent: 'SMS sent to mobile number',
+ noAccount: 'No account?',
+ createAccount: 'Create a new account',
+ wechatLoginTitle: 'QR code sign in',
+ wechatLoginMsg: 'Please use wechat to scan and log in | Auto scan after 3 seconds of simulation',
+ wechatLoginResult: 'Scanned | Please click authorize login in the device'
+ },
+ user: {
+ dynamic: 'Dynamic',
+ info: 'User Info',
+ settings: 'Settings',
+ nightmode: 'night mode',
+ nightmode_msg: 'Suitable for low light environment,The current night mode is beta',
+ language: 'language',
+ language_msg: 'Translation in progress,Temporarily translated the text of this view',
+ }
+}
diff --git a/src/locales/lang/zh-cn.js b/src/locales/lang/zh-cn.js
new file mode 100644
index 00000000..431036a0
--- /dev/null
+++ b/src/locales/lang/zh-cn.js
@@ -0,0 +1,40 @@
+export default {
+ login: {
+ slogan: '高性能 / 精致 / 优雅',
+ describe: '基于Vue3 + Element-Plus 的中后台前端解决方案。',
+ signInTitle: '用户登录',
+ accountLogin: '账号登录',
+ mobileLogin: '手机号登录',
+ rememberMe: '24小时免登录',
+ forgetPassword: '忘记密码',
+ signIn: '登录',
+ signInOther: '其他登录方式',
+ userPlaceholder: '用户名 / 手机号 / 身份证号',
+ userError: '请输入用户名',
+ PWPlaceholder: '请输入密码',
+ PWError: '请输入密码',
+ admin: '管理员',
+ user: '用户',
+ mobilePlaceholder: '手机号码',
+ mobileError: '请输入手机号码',
+ smsPlaceholder: '短信验证码',
+ smsError: '请输入短信验证码',
+ smsGet: '获取验证码',
+ smsSent: '已发送短信至手机号码',
+ noAccount: '还没有账号?',
+ createAccount: '创建新账号',
+ fangke:'访客注册',
+ wechatLoginTitle: '二维码登录',
+ wechatLoginMsg: '请使用微信扫一扫登录 | 模拟3秒后自动扫描',
+ wechatLoginResult: '已扫描 | 请在设备中点击授权登录'
+ },
+ user: {
+ dynamic: '近期动态',
+ info: '个人信息',
+ settings: '设置',
+ nightmode: '黑夜模式',
+ nightmode_msg: '适合光线较弱的环境,当前黑暗模式为beta版本',
+ language: '语言',
+ language_msg: '翻译进行中,暂翻译了本视图的文本',
+ }
+}
diff --git a/src/main.js b/src/main.js
new file mode 100644
index 00000000..1fb77e35
--- /dev/null
+++ b/src/main.js
@@ -0,0 +1,57 @@
+import { createApp } from "vue";
+import ElementPlus from "element-plus";
+import "element-plus/dist/index.css";
+import "element-plus/theme-chalk/display.css";
+import scui from "./scui";
+import myui from "./my";
+import i18n from "./locales";
+import router from "./router";
+import store from "./store";
+import App from "./App.vue";
+import * as ElementPlusIconsVue from "@element-plus/icons-vue";
+import preventReClick from "./utils/preventReClick";
+import Print from "./utils/print2";
+import Xlsx from "./utils/xlsx";
+
+const app = createApp(App);
+
+app.use(store);
+app.use(router);
+app.use(ElementPlus);
+app.use(i18n);
+app.use(scui);
+app.use(myui);
+app.use(preventReClick);
+app.use(Print);
+app.use(Xlsx);
+
+//挂载app
+app.mount("#app");
+for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
+ app.component(key, component);
+}
+
+const debounce = (fn, delay) => {
+ let timer = null;
+
+ return function () {
+ let context = this;
+
+ let args = arguments;
+
+ clearTimeout(timer);
+
+ timer = setTimeout(function () {
+ fn.apply(context, args);
+ }, delay);
+ };
+};
+
+const _ResizeObserver = window.ResizeObserver;
+
+window.ResizeObserver = class ResizeObserver extends _ResizeObserver {
+ constructor(callback) {
+ callback = debounce(callback, 16);
+ super(callback);
+ }
+};
diff --git a/src/my.js b/src/my.js
new file mode 100644
index 00000000..3005b2a9
--- /dev/null
+++ b/src/my.js
@@ -0,0 +1,10 @@
+import myUserSelect from './components/mySelect/userselect'
+import mySelect from './components/mySelect/select'
+import myTableSelect from './components/mySelect/tableSelect'
+export default {
+ install(app) {
+ app.component('myUserSelect', myUserSelect);
+ app.component('mySelect', mySelect);
+ app.component('myTableSelect', myTableSelect);
+ }
+}
diff --git a/src/router/index.js b/src/router/index.js
new file mode 100644
index 00000000..91501cde
--- /dev/null
+++ b/src/router/index.js
@@ -0,0 +1,221 @@
+import { createRouter, createWebHashHistory } from 'vue-router';
+import { ElNotification } from 'element-plus';
+import config from "@/config"
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
+import tool from '@/utils/tool';
+import systemRouter from './systemRouter';
+import userRoutes from '@/config/route';
+import { beforeEach, afterEach } from './scrollBehavior';
+
+//系统路由
+const routes = systemRouter
+
+//系统特殊路由
+const routes_404 = {
+ path: "/:pathMatch(.*)*",
+ hidden: true,
+ component: () => import(/* webpackChunkName: "404" */ '@/layout/other/404'),
+}
+let routes_404_r = () => { }
+
+const router = createRouter({
+ history: createWebHashHistory(),
+ routes: routes
+})
+
+//设置标题
+document.title = config.APP_NAME
+
+//判断是否已加载过动态/静态路由
+var isGetRouter = false;
+
+router.beforeEach(async (to, from, next) => {
+
+ NProgress.start()
+ //动态标题
+ document.title = to.meta.title ? `${to.meta.title} - ${config.APP_NAME}` : `${config.APP_NAME}`
+
+ let token = tool.data.get("TOKEN");
+ //去往登录页
+ if (to.path === "/login") {
+ //删除路由(替换当前layout路由)
+ // router.addRoute(routes[0])
+ //删除路由(404)
+ routes_404_r()
+ isGetRouter = false;
+ next();
+ return false;
+ }
+ //目标路由等于当前路由
+ if (routes.findIndex(r => r.path === to.path) >= 0) {
+ next();
+ return false;
+ }
+ //未登录
+ if (!token) {
+ next({
+ path: '/login'
+ });
+ return false;
+ }
+
+ //整页路由处理
+ if (to.meta.fullpage) {
+ to.matched = [to.matched[to.matched.length - 1]]
+ }
+ //加载动态/静态路由
+ if (!isGetRouter) {
+ let permissions = tool.data.get("PERMISSIONS") || [];//账号页面权限
+ let userMenu = userRoutes;//静态路由
+ userMenu = treeFilter(userRoutes, node => {
+ return node.meta.perms ? node.meta.perms.filter(item => permissions.indexOf(item) > -1).length > 0 : true
+ });
+ var menuRouter = filterAsyncRouter(userMenu);
+ menuRouter = flatAsyncRoutes(menuRouter);
+ menuRouter.forEach(item => {
+ router.addRoute("layout", item)
+ });
+ routes_404_r = router.addRoute(routes_404);
+ if (to.matched.length == 0) {
+ router.push(to.fullPath);
+ }
+ isGetRouter = true;
+ }
+ beforeEach(to, from)
+ next();
+});
+
+router.afterEach((to, from) => {
+ afterEach(to, from)
+ NProgress.done()
+});
+
+router.onError((error) => {
+ NProgress.done();
+ ElNotification.error({
+ title: '路由错误',
+ message: error.message
+ });
+});
+
+//入侵追加自定义方法、对象
+router.sc_getMenu = () => {
+ // var apiMenu = tool.data.get("MENU") || []
+ let permissions = tool.data.get("PERMISSIONS") || [];
+ let userMenu = userRoutes;
+ userMenu = treeFilter(userRoutes, node => {
+ return node.meta.perms ? node.meta.perms.filter(item => permissions.indexOf(item) > -1).length > 0 : true
+ });
+ let menus = checkRoute(userMenu, permissions)
+ return menus
+}
+
+//转换
+function filterAsyncRouter(routerMap) {
+ const accessedRouters = []
+ routerMap.forEach(item => {
+ item.meta = item.meta ? item.meta : {};
+ //处理外部链接特殊路由
+ if (item.meta.type == 'iframe') {
+ item.meta.url = item.path;
+ item.path = `/i/${item.name}`;
+ }
+ //MAP转路由对象
+ var route = {
+ path: item.path,
+ name: item.name,
+ meta: item.meta,
+ redirect: item.redirect,
+ children: item.children ? filterAsyncRouter(item.children) : null,
+ component: loadComponent(item.component)
+ }
+ accessedRouters.push(route)
+ })
+ return accessedRouters
+}
+function loadComponent(component) {
+ if (component) {
+ return () => import(/* webpackChunkName: "[request]" */ `@/views/${component}`)
+ } else {
+ return () => import(`@/layout/other/empty`)
+ }
+
+}
+
+//路由扁平化
+function flatAsyncRoutes(routes, breadcrumb = []) {
+ let res = []
+ routes.forEach(route => {
+ const tmp = { ...route }
+ if (tmp.children) {
+ let childrenBreadcrumb = [...breadcrumb]
+ childrenBreadcrumb.push(route)
+ let tmpRoute = { ...route }
+ tmpRoute.meta.breadcrumb = childrenBreadcrumb
+ delete tmpRoute.children
+ res.push(tmpRoute)
+ let childrenRoutes = flatAsyncRoutes(tmp.children, childrenBreadcrumb)
+ childrenRoutes.map(item => {
+ res.push(item)
+ })
+ } else {
+ let tmpBreadcrumb = [...breadcrumb]
+ tmpBreadcrumb.push(tmp)
+ tmp.meta.breadcrumb = tmpBreadcrumb
+ res.push(tmp)
+ }
+ })
+ return res
+}
+
+//过滤树
+function treeFilter(tree, func) {
+ return tree.map(node => ({ ...node })).filter(node => {
+
+ node.children = node.children && treeFilter(node.children, func)
+
+ return func(node) || (node.children && node.children.length)
+ })
+}
+
+
+function hasPerm(perms_need, perms_have) {
+ let has = false
+ for (var m = 0; m < perms_need.length; m++) {
+ if (perms_have.indexOf(perms_need[m]) > -1) {
+ has = true
+ }
+ }
+ return has
+}
+
+function checkRoute(routes, perms) {
+ if (perms.indexOf('superuser') > -1) {
+ return routes
+ }
+ for (var i = 0; i < routes.length; i++) {
+ if (routes[i].meta && routes[i].meta.perms) {
+ let has = hasPerm(routes[i].meta.perms, perms)
+ if (!has) {
+ routes.splice(i, 1)
+ }
+ else if (routes[i].children) {
+ for (var m = 0; m < routes[i].children.length; m++) {
+ let child = routes[i].children[m]
+ if (child.meta && child.meta.perms) {
+ let has = hasPerm(child.meta.perms, perms)
+ if (!has) {
+ routes[i].children.splice(m, 1)
+ }
+ }
+ }
+ }
+ }else{
+ routes.splice(i, 1)
+ }
+ }
+ return routes
+}
+
+export default router
diff --git a/src/router/scrollBehavior.js b/src/router/scrollBehavior.js
new file mode 100644
index 00000000..ec301971
--- /dev/null
+++ b/src/router/scrollBehavior.js
@@ -0,0 +1,22 @@
+import store from '@/store'
+import { nextTick } from 'vue'
+
+export function beforeEach(to, from){
+ var adminMain = document.querySelector('#adminui-main')
+ if(!adminMain){return false}
+ store.commit("updateViewTags", {
+ fullPath: from.fullPath,
+ scrollTop: adminMain.scrollTop
+ })
+}
+
+export function afterEach(to){
+ var adminMain = document.querySelector('#adminui-main')
+ if(!adminMain){return false}
+ nextTick(()=>{
+ var beforeRoute = store.state.viewTags.viewTags.filter(v => v.fullPath == to.fullPath)[0]
+ if(beforeRoute){
+ adminMain.scrollTop = beforeRoute.scrollTop || 0
+ }
+ })
+}
\ No newline at end of file
diff --git a/src/router/systemRouter.js b/src/router/systemRouter.js
new file mode 100644
index 00000000..fd51a958
--- /dev/null
+++ b/src/router/systemRouter.js
@@ -0,0 +1,35 @@
+import config from "@/config"
+
+//系统路由
+const routes = [
+ {
+ name: "layout",
+ path: "/",
+ component: () => import(/* webpackChunkName: "layout" */ '@/layout'),
+ redirect: config.DASHBOARD_URL || '/dashboard',
+ children: []
+ },
+ {
+ path: "/login",
+ component: () => import(/* webpackChunkName: "login" */ '@/views/login'),
+ meta: {
+ title: "登录"
+ }
+ },
+ {
+ path: "/user_register",
+ component: () => import(/* webpackChunkName: "userRegister" */ '@/views/login/userRegister'),
+ meta: {
+ title: "注册"
+ }
+ },
+ {
+ path: "/reset_password",
+ component: () => import(/* webpackChunkName: "resetPassword" */ '@/views/login/resetPassword'),
+ meta: {
+ title: "重置密码"
+ }
+ }
+]
+
+export default routes;
diff --git a/src/scui.js b/src/scui.js
new file mode 100644
index 00000000..98de31a7
--- /dev/null
+++ b/src/scui.js
@@ -0,0 +1,93 @@
+import config from "./config"
+import api from './api'
+import tool from './utils/tool'
+import http from "./utils/request"
+import { permission, rolePermission } from './utils/permission'
+
+import scTable from './components/scTable'
+import scBind from './components/scBind'
+import scTableColumn from './components/scTable/column.js'
+import scFilterBar from './components/scFilterBar'
+import scUpload from './components/scUpload'
+import scUploadMultiple from './components/scUpload/multiple'
+import scUploadFile from './components/scUpload/file'
+import scFormTable from './components/scFormTable'
+import scTableSelect from './components/scTableSelect'
+import scPageHeader from './components/scPageHeader'
+import scSelect from './components/scSelect'
+import scDialog from './components/scDialog'
+import scForm from './components/scForm'
+import scTitle from './components/scTitle'
+import scWaterMark from './components/scWaterMark'
+import scQrCode from './components/scQrCode'
+import scIconSelect from './components/scIconSelect'
+
+import scStatusIndicator from './components/scMini/scStatusIndicator'
+import scTrend from './components/scMini/scTrend'
+
+import auth from './directives/auth'
+import auths from './directives/auths'
+import authsAll from './directives/authsAll'
+import role from './directives/role'
+import time from './directives/time'
+import copy from './directives/copy'
+import errorHandler from './utils/errorHandler'
+
+import * as elIcons from '@element-plus/icons-vue'
+import * as scIcons from './assets/icons'
+
+export default {
+ install(app) {
+ //挂载全局对象
+ app.config.globalProperties.$CONFIG = config;
+ app.config.globalProperties.$TOOL = tool;
+ app.config.globalProperties.$HTTP = http;
+ app.config.globalProperties.$API = api;
+ app.config.globalProperties.$AUTH = permission;
+ app.config.globalProperties.$ROLE = rolePermission;
+
+ //注册全局组件
+ app.component('scBind', scBind);
+ app.component('scTable', scTable);
+ app.component('scTableColumn', scTableColumn);
+ app.component('scFilterBar', scFilterBar);
+ app.component('scUpload', scUpload);
+ app.component('scUploadMultiple', scUploadMultiple);
+ app.component('scUploadFile', scUploadFile);
+ app.component('scFormTable', scFormTable);
+ app.component('scTableSelect', scTableSelect);
+ app.component('scPageHeader', scPageHeader);
+ app.component('scSelect', scSelect);
+ app.component('scDialog', scDialog);
+ app.component('scForm', scForm);
+ app.component('scTitle', scTitle);
+ app.component('scWaterMark', scWaterMark);
+ app.component('scQrCode', scQrCode);
+ app.component('scStatusIndicator', scStatusIndicator);
+ app.component('scTrend', scTrend);
+ app.component('scIconSelect', scIconSelect);
+
+ //注册全局指令
+ app.directive('auth', auth)
+ app.directive('auths', auths)
+ app.directive('auths-all', authsAll)
+ app.directive('role', role)
+ app.directive('time', time)
+ app.directive('copy', copy)
+
+ //统一注册el-icon图标
+ for(let icon in elIcons){
+ app.component(`ElIcon${icon}`, elIcons[icon])
+ }
+ //统一注册sc-icon图标
+ for(let icon in scIcons){
+ app.component(`ScIcon${icon}`, scIcons[icon])
+ }
+
+ //关闭async-validator全局控制台警告
+ window.ASYNC_VALIDATOR_NO_WARNING = 1
+
+ //全局代码错误捕捉
+ app.config.errorHandler = errorHandler
+ }
+}
diff --git a/src/store/index.js b/src/store/index.js
new file mode 100644
index 00000000..6cb63b07
--- /dev/null
+++ b/src/store/index.js
@@ -0,0 +1,15 @@
+/**
+ * @description 自动import导入所有 vuex 模块
+ */
+
+import { createStore } from 'vuex';
+
+const files = require.context('./modules', false, /\.js$/);
+const modules = {}
+files.keys().forEach((key) => {
+ modules[key.replace(/(\.\/|\.js)/g, '')] = files(key).default
+})
+
+export default createStore({
+ modules
+});
diff --git a/src/store/modules/global.js b/src/store/modules/global.js
new file mode 100644
index 00000000..53ae8643
--- /dev/null
+++ b/src/store/modules/global.js
@@ -0,0 +1,33 @@
+import config from "@/config";
+
+export default {
+ state: {
+ //移动端布局
+ ismobile: false,
+ //布局
+ layout: config.LAYOUT,
+ //菜单是否折叠 toggle
+ menuIsCollapse: config.MENU_IS_COLLAPSE,
+ //多标签栏
+ layoutTags: config.LAYOUT_TAGS,
+ //主题
+ theme: config.THEME,
+ },
+ mutations: {
+ SET_ismobile(state, key){
+ state.ismobile = key
+ },
+ SET_layout(state, key){
+ state.layout = key
+ },
+ SET_theme(state, key){
+ state.theme = key
+ },
+ TOGGLE_menuIsCollapse(state){
+ state.menuIsCollapse = !state.menuIsCollapse
+ },
+ TOGGLE_layoutTags(state){
+ state.layoutTags = !state.layoutTags
+ }
+ }
+}
diff --git a/src/store/modules/iframe.js b/src/store/modules/iframe.js
new file mode 100644
index 00000000..f1395784
--- /dev/null
+++ b/src/store/modules/iframe.js
@@ -0,0 +1,38 @@
+export default {
+ state: {
+ iframeList: []
+ },
+ mutations: {
+ setIframeList(state, route){
+ state.iframeList = []
+ state.iframeList.push(route)
+ },
+ pushIframeList(state, route){
+ let target = state.iframeList.find((item) => item.path === route.path)
+ if(!target){
+ state.iframeList.push(route)
+ }
+ },
+ removeIframeList(state, route){
+ state.iframeList.forEach((item, index) => {
+ if (item.path === route.path){
+ state.iframeList.splice(index, 1)
+ }
+ })
+ },
+ refreshIframe(state, route){
+ state.iframeList.forEach((item) => {
+ if (item.path == route.path){
+ var url = route.meta.url;
+ item.meta.url = '';
+ setTimeout(function() {
+ item.meta.url = url
+ }, 200);
+ }
+ })
+ },
+ clearIframeList(state){
+ state.iframeList = []
+ }
+ }
+}
diff --git a/src/store/modules/keepAlive.js b/src/store/modules/keepAlive.js
new file mode 100644
index 00000000..c143cf51
--- /dev/null
+++ b/src/store/modules/keepAlive.js
@@ -0,0 +1,34 @@
+export default {
+ state: {
+ keepLiveRoute: [],
+ routeKey: null,
+ routeShow: true
+ },
+ mutations: {
+ pushKeepLive(state, component){
+ if(!state.keepLiveRoute.includes(component)){
+ state.keepLiveRoute.push(component)
+ }
+ },
+ removeKeepLive(state, component){
+ var index = state.keepLiveRoute.indexOf(component);
+ if(index !== -1){
+ state.keepLiveRoute.splice(index, 1);
+ }
+ },
+ clearKeepLive(state){
+ state.keepLiveRoute = []
+ },
+ setRouteKey(state, key){
+ state.routeKey = key
+ },
+ setRouteShow(state, key){
+ state.routeShow = key
+ }
+ },
+ actions: {
+ setRouteKey({ commit }, key) {
+ commit('setRouteKey', key);
+ }
+ }
+}
diff --git a/src/store/modules/viewTags.js b/src/store/modules/viewTags.js
new file mode 100644
index 00000000..5946559a
--- /dev/null
+++ b/src/store/modules/viewTags.js
@@ -0,0 +1,46 @@
+import router from '@/router'
+
+export default {
+ state: {
+ viewTags: []
+ },
+ mutations: {
+ pushViewTags(state, route){
+ let backPathIndex = state.viewTags.findIndex(item => item.fullPath == router.options.history.state.back)
+ let target = state.viewTags.find((item) => item.fullPath === route.fullPath)
+ let isName = route.name
+ if(!target && isName){
+ if(backPathIndex == -1){
+ state.viewTags.push(route)
+ }else{
+ state.viewTags.splice(backPathIndex+1, 0, route)
+ }
+ }
+ },
+ removeViewTags(state, route){
+ state.viewTags.forEach((item, index) => {
+ if (item.fullPath === route.fullPath){
+ state.viewTags.splice(index, 1)
+ }
+ })
+ },
+ updateViewTags(state, route){
+ state.viewTags.forEach((item) => {
+ if (item.fullPath == route.fullPath){
+ item = Object.assign(item, route)
+ }
+ })
+ },
+ updateViewTagsTitle(state, title=''){
+ const nowFullPath = location.hash.substring(1)
+ state.viewTags.forEach((item) => {
+ if (item.fullPath == nowFullPath){
+ item.meta.title = title
+ }
+ })
+ },
+ clearViewTags(state){
+ state.viewTags = []
+ }
+ }
+}
diff --git a/src/style/app.scss b/src/style/app.scss
new file mode 100644
index 00000000..98a4595b
--- /dev/null
+++ b/src/style/app.scss
@@ -0,0 +1,114 @@
+/* 全局 */
+#app, body, html {width: 100%;height: 100%;background-color: #f6f8f9;font-size: 12px;}
+a {color: #333;text-decoration: none;}
+a:hover, a:focus {color: #000;text-decoration: none;}
+a:link {text-decoration: none;}
+a:-webkit-any-link {text-decoration: none;}
+a,button,input,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0);box-sizing: border-box;outline:none !important; -webkit-appearance: none;}
+* {margin: 0;padding: 0;box-sizing: border-box;outline: none;}
+.card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+/* 大布局样式 */
+.aminui {display: flex;flex-flow: column;}
+.aminui-wrapper {display: flex;flex:1;overflow: auto;}
+
+/* 全局滚动条样式 */
+.scrollable {-webkit-overflow-scrolling: touch;}
+::-webkit-scrollbar {width: 5px;height: 5px;}
+::-webkit-scrollbar-thumb {background-color: rgba(50, 50, 50, 0.3);}
+::-webkit-scrollbar-thumb:hover {background-color: rgba(50, 50, 50, 0.6);}
+::-webkit-scrollbar-track {background-color: rgba(50, 50, 50, 0.1);}
+::-webkit-scrollbar-track:hover {background-color: rgba(50, 50, 50, 0.2);}
+
+/*布局设置*/
+.layout-setting {position: fixed;width: 40px;height: 40px;border-radius: 3px 0 0 3px;bottom: 100px;right: 0px;z-index: 100;background: #409EFF;display: flex;flex-direction: column;align-items: center;justify-content: center;cursor: pointer;}
+.layout-setting i {font-size: 18px;color: #fff;}
+
+/* 头部 */
+.adminui-header {height: 58px;background: #222b45;color: #fff;display: flex;justify-content:space-between;}
+.adminui-header-left {display: flex;align-items: center;padding-left:4px;}
+.adminui-header-right {display: flex;align-items: center;}
+.adminui-header .logo-bar {font-size: 20px;font-weight: bold;display: flex;align-items: center;}
+.adminui-header .logo-bar .logo {margin-right: 10px;height: 52px;display: inline-block;padding: 4px;border-radius: 5px;margin:auto}
+.adminui-header .nav {display: flex;height: 100%;margin-left: 40px;}
+.adminui-header .nav li {padding:0 10px;margin: 0 10px 0 0;font-size: 14px;color: rgba(255, 255, 255, 0.6);list-style: none;height: 100%;display: flex;align-items: center;cursor: pointer;}
+.adminui-header .nav li i {margin-right: 5px;}
+.adminui-header .nav li:hover {color: #fff;}
+.adminui-header .nav li.active {background: rgba(255, 255, 255, 0.1);color: #fff;}
+.adminui-header .user-bar .panel-item:hover {background: rgba(255, 255, 255, 0.1)!important;}
+.adminui-header .user-bar .user label{color: #fff;}
+
+/* 左侧菜单 */
+.aminui-side-split {width:65px;flex-shrink:0;background: #222b45;display: flex;flex-flow: column;}
+.aminui-side-split-top {height: 49px;}
+.aminui-side-split-top a {display: inline-block;width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;}
+.aminui-side-split-top .logo {height:30px;vertical-align: bottom;}
+.adminui-side-split-scroll {overflow: auto;overflow-x:hidden;height: 100%;flex: 1;}
+.aminui-side-split li {cursor: pointer;width: 65px;height: 65px;color: #fff;text-align: center;display: flex;flex-direction: column;align-items: center;justify-content: center;}
+.aminui-side-split li i {font-size: 18px;}
+.aminui-side-split li p {margin-top:5px;}
+.aminui-side-split li:hover {background: rgba(255, 255, 255, 0.1);}
+.aminui-side-split li.active {background: #409EFF;}
+
+.adminui-side-split-scroll::-webkit-scrollbar-thumb {background-color: rgba(255, 255, 255, 0.4);border-radius:5px;}
+.adminui-side-split-scroll::-webkit-scrollbar-thumb:hover {background-color: rgba(255, 255, 255, 0.5);}
+.adminui-side-split-scroll::-webkit-scrollbar-track {background-color: rgba(255, 255, 255, 0);}
+.adminui-side-split-scroll::-webkit-scrollbar-track:hover {background-color: rgba(255, 255, 255, 0);}
+
+.aminui-side {display: flex;flex-flow: column;flex-shrink:0;width:180px;background: #fff;box-shadow: 2px 0 8px 0 rgba(29,35,41,.05);border-right: 1px solid #e6e6e6;transition:width 0.3s;}
+.adminui-side-top {border-bottom: 1px solid #ebeef5;height:50px;line-height: 50px;}
+.adminui-side-top h2 {padding:0 20px;font-size: 17px;color: #3c4a54;}
+.adminui-side-scroll {overflow: auto;overflow-x:hidden;flex: 1;}
+.adminui-side-bottom {border-top: 1px solid #ebeef5;height:51px;cursor: pointer;display: flex;align-items: center;justify-content: center;}
+.adminui-side-bottom i {font-size: 16px;}
+.adminui-side-bottom:hover {color: var(--el-color-primary);}
+.aminui-side.isCollapse {width: 65px;}
+.el-menu .menu-tag {position: absolute;height: 18px;line-height: 18px;background: var(--el-color-danger);font-size: 12px;color: #fff;right: 20px;border-radius:18px;padding:0 6px;}
+.el-menu .el-sub-menu__title .menu-tag {right: 40px;}
+.el-menu--horizontal > li .menu-tag {display: none;}
+
+/* 右侧内容 */
+.aminui-body {flex: 1;display: flex;flex-flow: column;}
+
+.adminui-topbar {height: 50px;border-bottom: 1px solid #ebeef5;background: #fff;box-shadow: 0 1px 4px rgba(0,21,41,.08);display: flex;justify-content:space-between;}
+.adminui-topbar .left-panel {display: flex;align-items: center;}
+.adminui-topbar .right-panel {display: flex;align-items: center;}
+
+.right-panel-search {display: flex;align-items: center;}
+.right-panel-search > * + * {margin-left:10px;}
+
+.adminui-tags {height:35px;background: #fff;border-bottom: 1px solid #e6e6e6;}
+.adminui-tags ul {display: flex;overflow: hidden;}
+.adminui-tags li {cursor: pointer;display: inline-block;float: left;height:34px;line-height: 34px;position: relative;flex-shrink: 0;}
+.adminui-tags li::after {content: " ";width:1px;height:100%;position: absolute;right:0px;background-image: linear-gradient(#fff, #e6e6e6);}
+.adminui-tags li a {display: inline-block;padding:0 10px;width:100%;height:100%;color: #999;text-decoration:none;display: flex;align-items: center;}
+.adminui-tags li i {margin-left:10px;border-radius: 3px;width:18px;height:18px;display: flex;align-items: center;justify-content: center;}
+.adminui-tags li i:hover {background: rgba(0,0,0,.2);color: #fff;}
+.adminui-tags li:hover {background: #ecf5ff;}
+.adminui-tags li.active {background: #409EFF;}
+.adminui-tags li.active a {color: #fff;}
+.adminui-tags li.sortable-ghost {opacity: 0;}
+
+.adminui-main {overflow: auto;background-color: #f6f8f9;flex: 1;}
+
+/*页面最大化*/
+.aminui.main-maximize {
+ .main-maximize-exit {display: block;}
+ .aminui-side-split, .aminui-side, .adminui-header, .adminui-topbar, .adminui-tags {display: none;}
+}
+.main-maximize-exit {display: none;position: fixed;z-index: 3000;top:-20px;left:50%;margin-left: -20px;border-radius: 50%;width: 40px;height: 40px;cursor: pointer;background: rgba(0,0,0,0.2);text-align: center;}
+.main-maximize-exit i {font-size: 14px;margin-top: 22px;color: #fff;}
+.main-maximize-exit:hover {background: rgba(0,0,0,0.4);}
+
+/*定宽页面*/
+.sc-page {width: 1230px;margin: 0 auto;}
+
+.el-dialog__headerbtn { top: 0px;right: 0px;}
+
+.el-select {
+ width: 10vw;
+}
\ No newline at end of file
diff --git a/src/style/blue.scss b/src/style/blue.scss
new file mode 100644
index 00000000..bdaad89b
--- /dev/null
+++ b/src/style/blue.scss
@@ -0,0 +1,108 @@
+@import '~element-plus/theme-chalk/src/dark/css-vars.scss';
+
+html.dark {
+ //变量
+ --el-text-color-primary: #d0d0d0;
+ --el-color-primary-dark-2: var(--el-color-primary-light-2) !important;
+ --el-color-primary-light-9: var(--el-color-primary-dark-8) !important;
+ --el-color-primary-light-8: var(--el-color-primary-dark-7) !important;
+ --el-color-primary-light-7: var(--el-color-primary-dark-6) !important;
+ --el-color-primary-light-5: var(--el-color-primary-dark-4) !important;
+ --el-color-primary-light-3: var(--el-color-primary-dark-3) !important;
+
+ //背景
+ #app {
+ background: var(--el-bg-color);
+ }
+
+ //登录背景
+ .login_bg {
+ background: var(--el-bg-color);
+ }
+
+ //框架
+ .adminui-header {
+ background: var(--el-bg-color-overlay);
+ border-bottom: 1px solid var(--el-border-color-light);
+ height: 59px;
+ }
+
+ .aminui-side-split {
+ background: var(--el-bg-color);
+ }
+
+ .aminui-side-split li {
+ color: var(--el-text-color-primary);
+ }
+
+ .aminui-side {
+ background: var(--el-bg-color-overlay);
+ border-color: var(--el-border-color-light);
+ }
+
+ .adminui-side-top,
+ .adminui-side-bottom {
+ border-color: var(--el-border-color-light);
+ }
+
+ .adminui-side-top h2 {
+ color: var(--el-text-color-primary);
+ }
+
+ .adminui-topbar,
+ .adminui-tags {
+ background: var(--el-bg-color-overlay);
+ border-color: var(--el-border-color-light);
+ }
+
+ .adminui-main {
+ background: var(--el-bg-color);
+ }
+
+ .drawerBG {
+ background: var(--el-bg-color);
+ }
+
+ .adminui-header-menu .el-menu {
+ --el-menu-bg-color: var(--el-bg-color-overlay) !important;
+ --el-menu-hover-bg-color: #171819 !important;
+ }
+
+ .adminui-header-menu .el-menu .el-sub-menu__title {
+ background-color: transparent !important;
+ }
+
+ //全局滚动条样式
+ ::-webkit-scrollbar-thumb {
+ background-color: rgba(163, 166, 173, 0.3);
+ }
+
+ ::-webkit-scrollbar-thumb:hover {
+ background-color: rgba(163, 166, 173, 0.5);
+ }
+
+ //组件
+ .el-header,
+ .el-main.nopadding,
+ .el-footer {
+ background: var(--el-bg-color-overlay);
+ border-color: var(--el-border-color-light);
+ }
+
+ .el-main {
+ background: var(--el-bg-color);
+ }
+
+ .el-aside {
+ background: var(--el-bg-color-overlay);
+ border-color: var(--el-border-color-light);
+ }
+
+ .el-table .el-table__body-wrapper {
+ background: var(--el-bg-color);
+ }
+
+ .el-table th.is-sortable:hover {
+ background: #111;
+ }
+}
\ No newline at end of file
diff --git a/src/style/dark.scss b/src/style/dark.scss
new file mode 100644
index 00000000..e02a6954
--- /dev/null
+++ b/src/style/dark.scss
@@ -0,0 +1,280 @@
+@import '~element-plus/theme-chalk/src/dark/css-vars.scss';
+
+html.dark {
+ //变量
+ --el-text-color-primary: #d0d0d0;
+ --el-color-primary-dark-2: var(--el-color-primary-light-2) !important;
+ --el-color-primary-light-9: var(--el-color-primary-dark-8) !important;
+ --el-color-primary-light-8: var(--el-color-primary-dark-7) !important;
+ --el-color-primary-light-7: var(--el-color-primary-dark-6) !important;
+ --el-color-primary-light-5: var(--el-color-primary-dark-4) !important;
+ --el-color-primary-light-3: var(--el-color-primary-dark-3) !important;
+ --el-menu-active-color: #ffffff !important;
+ // --el-bg-color: #1e789a;
+ // --el-text-color-regular: #ffffff;
+ .el-dialog__close {
+ color: #ffffff;
+ }
+ .el-dialog__title {
+ color: #ffffff;
+ }
+
+ .el-tag {
+ background-color: #f8f5f5 !important;
+ }
+ //背景
+ #app {
+ background: var(--el-bg-color);
+ }
+
+ //登录背景
+ .login_bg {
+ background: var(--el-bg-color);
+ }
+
+ //框架
+ .adminui-header {
+ background: var(--el-bg-color-overlay);
+ border-bottom: 1px solid var(--el-border-color-light);
+ height: 59px;
+ }
+
+ .aminui-side-split {
+ background: var(--el-bg-color);
+ }
+
+ .aminui-side-split li {
+ color: var(--el-text-color-primary);
+ }
+
+ .aminui-side {
+ background: var(--el-bg-color-overlay);
+ border-color: var(--el-border-color-light);
+ }
+
+ .adminui-side-top,
+ .adminui-side-bottom {
+ border-color: var(--el-border-color-light);
+ }
+
+ .adminui-side-top h2 {
+ color: var(--el-text-color-primary);
+ }
+
+ .adminui-topbar,
+ .adminui-tags {
+ background: var(--el-bg-color-overlay);
+ border-color: var(--el-border-color-light);
+ }
+
+ .adminui-main {
+ background: var(--el-bg-color);
+ }
+
+ .drawerBG {
+ background: var(--el-bg-color);
+ }
+
+ .adminui-header-menu .el-menu {
+ --el-menu-bg-color: var(--el-bg-color-overlay) !important;
+ --el-menu-hover-bg-color: #171819 !important;
+ }
+
+ .adminui-header-menu .el-menu .el-sub-menu__title {
+ background-color: transparent !important;
+ }
+
+ //全局滚动条样式
+ ::-webkit-scrollbar-thumb {
+ background-color: rgba(163, 166, 173, 0.3);
+ }
+
+ ::-webkit-scrollbar-thumb:hover {
+ background-color: rgba(163, 166, 173, 0.5);
+ }
+
+ .el-main {
+ // padding: 13px 15px;
+ }
+
+ .el-main.nopadding {
+ background: transparent;
+ background-color: transparent;
+ }
+
+ //组件
+ .el-header,
+ .el-main.nopadding,
+ .el-footer {
+ background: transparent;
+ background-color: transparent;
+ }
+
+ .el-header {
+ border-bottom: none;
+ }
+
+ .el-header:has(> .panel_title) {
+ padding: 10px 0;
+ }
+
+ .el-header:has(> .searchWrap) {
+ padding: 0;
+ }
+
+ .el-input {
+ --el-input-text-color: #ffffff;
+ --el-input-placeholder-color: #ffffff;
+ --el-input-transparent-border: #ffffff;
+ --el-input-border-color: #ffffff;
+ --el-input-hover-border-color: #ffffff;
+ }
+
+ .el-button {
+ color: #ffffff;
+ border-color: #ffffff;
+ }
+
+ .el-select {
+ margin: 0 5px;
+ }
+
+ .el-select__wrapper{
+ --el-border-color: #ffffff;
+ }
+
+ .el-select__placeholder.is-transparent {
+ color: #d8d8d8;
+ }
+
+ .el-select .el-input .el-select__caret {
+ color: #ffffff;
+ }
+
+ .el-select-dropdown__item.selected {
+ color: #ffffff;
+ }
+
+ .el-date-editor {
+ --el-input-border-color: #ffffff;
+ }
+
+ .el-main {
+ background: transparent;
+ background-color: transparent;
+ }
+
+ .el-main:has(> .scTable) {
+ padding: 8px 0;
+ }
+
+ .aside_one,
+ .aside_side {
+ height: 100%;
+ background: var(--el-bg-color-overlay);
+ border-color: var(--el-border-color-light);
+ // border-radius: 4px;
+ background: rgb(4, 50, 83);
+ background-color: rgb(4, 50, 83);
+ box-shadow: inset 0px 0px 30px 15px rgb(7, 79, 109);
+ border: 1px solid #1279c3;
+ }
+
+ .el-aside:has(> .aside_one) {
+ padding: 8px;
+ border-right: none;
+ }
+
+ .el-drawer {
+ box-shadow: 0 0 20px 5px rgb(4, 50, 83);
+ }
+
+ .scTable-table {
+ padding: 0.2vw;
+ // border-radius: 4px;
+ background: rgb(4, 50, 83);
+ background-color: rgb(4, 50, 83);
+ box-shadow: inset 0px 0px 30px 15px rgb(7, 79, 109);
+ border: 1px solid #1279c3;
+ }
+
+ .scTable-page {
+ background: rgb(4, 50, 83);
+ border: 1px solid #1279c3;
+ }
+
+ .el-table {
+ --el-table-border-color: transparent;
+ --el-table-row-hover-bg-color: rgb(15, 59, 94);
+ }
+
+ .el-table thead {
+ color: #ffffff;
+ background: rgb(7, 79, 109);
+ }
+
+ .el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell {
+ background: rgb(15, 59, 94);
+ }
+
+ .el-table__body-wrapper tr td.el-table-fixed-column--right {
+ background: transparent;
+ background-color: transparent;
+ }
+
+ .el-table>.el-table__inner-wrapper,
+ .el-table th.el-table__cell,
+ .el-table>.el-table__inner-wrapper>.el-table__header-wrapper,
+ .el-table>.el-table__inner-wrapper>.el-table__body-wrapper {
+ background: transparent;
+ background-color: transparent;
+ }
+
+ .el-table th.is-sortable:hover {
+ background: #111;
+ }
+ .el-table__header {
+ --el-table-tr-bg-color: #1e789a
+ }
+ .el-pagination.is-background .el-pager li.is-active {
+ background-color: #1e789a;
+ }
+
+ .el-pagination__jump,
+ .el-pagination__total {
+ color: #ffffff;
+ }
+
+ ////
+ ///
+ ///
+ //页面标题
+ .panel_title {
+ height: 55px;
+ width: 100%;
+ line-height: 55px;
+ color: #ffffff;
+ font-size: 2vh;
+ padding-left: 1vw;
+ position: relative;
+ border-left: 5px solid #1279c3;
+ background: rgb(4, 50, 83);
+ }
+
+ //条件搜索
+ .searchWrap {
+ width: 100%;
+ height: 50px;
+ display: flex;
+ justify-content: space-between;
+ line-height: 50px;
+ // border-radius: 4px;
+ padding: 0 1vw;
+ margin-top: 0.5vh;
+ align-items: center;
+ background: rgb(4, 50, 83);
+ background-color: rgb(4, 50, 83);
+ box-shadow: inset 0px 0px 30px 15px rgb(7, 79, 109);
+ border: 1px solid #1279c3;
+ }
+}
\ No newline at end of file
diff --git a/src/style/fix.scss b/src/style/fix.scss
new file mode 100644
index 00000000..58629f17
--- /dev/null
+++ b/src/style/fix.scss
@@ -0,0 +1,402 @@
+/* 覆盖element-plus样式 */
+
+:root {
+ --el-color-primary: #409EFF;
+ --el-color-primary-light-1: #53a7ff;
+ --el-color-primary-light-2: #66b1ff;
+ --el-color-primary-light-3: #79bbff;
+ --el-color-primary-light-4: #8cc4ff;
+ --el-color-primary-light-5: #9fceff;
+ --el-color-primary-light-6: #b2d8ff;
+ --el-color-primary-light-7: #c5e1ff;
+ --el-color-primary-light-8: #d8ebff;
+ --el-color-primary-light-9: #ebf5ff;
+ --el-color-primary-dark-1: #398ee5;
+ --el-color-primary-dark-2: #337ecc;
+ --el-color-primary-dark-3: #2c6eb2;
+ --el-color-primary-dark-4: #265e99;
+ --el-color-primary-dark-5: #204f7f;
+ --el-color-primary-dark-6: #193f66;
+ --el-color-primary-dark-7: #132f4c;
+ --el-color-primary-dark-8: #0c1f32;
+ --el-color-primary-dark-9: #060f19;
+ --el-border-radius-base: 2px;
+}
+.el-tag {
+ --el-tag-border-radius: 2px;
+}
+
+.el-message-box {
+ --el-messagebox-border-radius: 2px;
+}
+.el-menu {
+ border: none !important;
+}
+
+.el-menu .el-menu-item a {
+ color: inherit;
+ text-decoration: none;
+ display: block;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+}
+
+.el-form-item-msg {
+ font-size: 12px;
+ color: #999;
+ clear: both;
+ width: 100%;
+}
+
+.el-container {
+ height: 100%;
+}
+
+.el-aside {
+ border-right: 1px solid var(--el-border-color-light);
+}
+
+.el-container+.el-aside {
+ border-right: 0;
+ border-left: 1px solid var(--el-border-color-light);
+}
+
+.el-divider--horizontal {
+ margin: 12px 0;
+}
+.el-header {
+ background: #fff;
+ border-bottom: 1px solid var(--el-border-color-light);
+ padding: 13px 15px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.el-header .left-panel {
+ display: flex;
+ align-items: center;
+}
+
+.el-header .right-panel {
+ display: flex;
+ align-items: center;
+}
+
+.el-header .right-panel>*+* {
+ margin-left: 10px;
+}
+
+.el-footer {
+ background: #fff;
+ // border-top: 1px solid var(--el-border-color-light);
+ padding: 13px 15px;
+ height: 51px;
+ text-align: right;
+}
+
+.el-main {
+ padding: 8px;
+}
+
+.el-main.nopadding {
+ padding: 0;
+ background: #fff;
+}
+
+.el-drawer__body {
+ overflow: auto;
+ padding: 0;
+}
+
+.el-popconfirm__main {
+ margin: 14px 0;
+}
+
+.el-card__header {
+ border-bottom: 0;
+ font-size: 17px;
+ font-weight: bold;
+ padding: 15px 20px 0px 20px;
+}
+
+.el-dialog__title {
+ font-size: 17px;
+ font-weight: bold;
+}
+
+.el-drawer__header>:first-child {
+ font-size: 17px;
+ font-weight: bold;
+}
+
+.el-tree.menu .el-tree-node__content {
+ height: 36px;
+}
+
+.el-tree.menu .el-tree-node__content .el-tree-node__label .icon {
+ margin-right: 5px;
+}
+
+.el-progress__text {
+ font-size: 12px !important;
+}
+
+.el-progress__text i {
+ font-size: 14.4px !important;
+}
+
+.el-step.is-horizontal .el-step__line {
+ height: 1px;
+}
+
+.el-step__title {
+ font-size: 14px;
+}
+
+.drawerBG {
+ background: #f6f8f9;
+}
+
+.el-button+.el-dropdown {
+ margin-left: 10px;
+}
+
+.el-button-group+.el-dropdown {
+ margin-left: 10px;
+}
+
+.el-tag+.el-tag {
+ margin-left: 10px;
+}
+
+.el-button-group+.el-button-group {
+ margin-left: 10px;
+}
+
+.el-tabs__nav-wrap::after {
+ height: 1px;
+}
+
+.el-table th.is-sortable {
+ transition: .1s;
+}
+
+.el-table th.is-sortable:hover {
+ background: #eee;
+}
+
+.el-table .el-table__body-wrapper {
+ background: #f6f8f9;
+}
+
+.el-col .el-card {
+ margin-bottom: 15px;
+}
+
+.el-main {
+ flex-basis: 100%;
+}
+
+.el-main>.scTable .el-table--border::before {
+ display: none;
+}
+
+.el-main>.scTable .el-table--border::after {
+ display: none;
+}
+
+.el-main>.scTable .el-table--border .el-table__inner-wrapper::after {
+ display: none;
+}
+
+.el-main>.scTable .el-table__border-left-patch {
+ display: none;
+}
+
+.el-main>.scTable .el-table--border .el-table__inner-wrapper tr:first-child td:first-child {
+ border-left: 0;
+}
+
+.el-main>.scTable .el-table--border .el-table__inner-wrapper tr:first-child th:first-child {
+ border-left: 0;
+}
+
+.el-table.el-table--large {
+ font-size: 14px;
+}
+
+.el-table.el-table--small {
+ font-size: 12px;
+}
+
+.el-table {
+ font-size: 12px;
+}
+
+.el-radio-button__inner {
+ font-size: 12px;
+}
+
+.el-checkbox-button__inner {
+ font-size: 12px;
+}
+
+.aminui-side-split li.active {
+ background-color: var(--el-color-primary);
+}
+
+.adminui-tags li:hover {
+ background-color: var(--el-color-primary-light-9);
+}
+
+.adminui-tags li.active {
+ background-color: var(--el-color-primary) !important;
+}
+
+.contextmenu li:hover {
+ background-color: var(--el-color-primary-light-9) !important;
+ color: var(--el-color-primary-light-2) !important;
+}
+
+.data-box .item-background {
+ background-color: var(--el-color-primary) !important;
+}
+
+.layout-setting,
+.diy-grid-setting {
+ background-color: var(--el-color-primary) !important;
+}
+
+/* 全部禁用el-tag动画 */
+.el-tag {transition: all 0s !important;}
+
+/* 覆盖tinymce样式 */
+.sceditor .tox-tinymce {
+ border: 1px solid #DCDFE6;
+ border-radius: 0;
+}
+
+body .tox-tinymce-aux {
+ z-index: 5700;
+}
+
+
+.el-table--medium td, .el-table--medium th {
+ padding: 2px 0;
+ }
+
+.el-form-item {
+ margin-bottom: 16px;
+}
+
+.el-col .el-card {
+ margin-bottom: 8px;
+}
+
+.el-card,
+.el-message {
+ border-radius: 0px;
+ overflow: hidden;
+}
+
+.el-card__body {
+ padding: 6px;
+}
+
+.el-card__header {
+ padding: 6px;
+}
+
+.el-tabs--border-card>.el-tabs__content {
+ padding: 6px;
+}
+
+.el-dialog__header {
+ padding: 10px 10px 6px;
+}
+
+.el-dialog {
+ display: flex;
+ flex-direction: column;
+ margin: 0 !important;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ /*height:600px;*/
+ max-height: calc(100% - 30px);
+ max-width: calc(100% - 30px);
+}
+
+.el-dialog__headerbtn {
+ top: 8px;
+}
+
+.el-dialog .el-dialog__body {
+ flex: 1;
+ overflow: auto;
+ padding: 8px 12px;
+}
+
+.el-drawer__header {
+ margin-bottom: 0;
+ // margin-bottom: 16px;
+}
+
+.el-drawer .el-drawer__body {
+ flex: 1;
+ overflow: auto;
+ padding: 8px 12px;
+}
+
+.el-form--label-top .el-form-item__label {
+ line-height: 16px;
+}
+
+.el-button+.el-button {
+ margin-left: 4px;
+}
+
+.el-tabs__header {
+ margin: 0 0 6px;
+}
+
+.pagination-container {
+ padding: 0px 0px;
+}
+
+body .el-table th.gutter {
+ display: table-cell !important;
+}
+
+.el-dialog__footer {
+ padding: 6px 6px 6px;
+}
+
+.aside_one,
+.aside_side {
+ height: 100%;
+ background: var(--el-bg-color-overlay);
+ border-color: var(--el-border-color-light);
+ // border-radius: 4px;
+ background: rgb(4, 50, 83);
+ background-color: rgb(4, 50, 83);
+ box-shadow: inset 0px 0px 30px 15px rgb(7, 79, 109);
+ border: 1px solid #1279c3;
+}
+.el-aside:has(> .aside_one) {
+ padding: 8px;
+ border-right: none;
+}
+
+.infoLine {
+ color: #ffffff;
+}
+
+.typeLine {
+ color: #ffffff;
+}
\ No newline at end of file
diff --git a/src/style/media.scss b/src/style/media.scss
new file mode 100644
index 00000000..b3d639fe
--- /dev/null
+++ b/src/style/media.scss
@@ -0,0 +1,50 @@
+@media (max-width: 992px){
+ // 移动端样式覆盖
+ .el-form-item {display: block;}
+ .el-form-item__label {display: block;text-align: left;padding: 0 0 10px;}
+ .el-dialog {width: 90%!important;}
+ .el-dialog.is-fullscreen {width: 100%!important;}
+ //.el-drawer.rtl {width: 90%!important;}
+ .el-form-item__content {margin-left: 0px!important;}
+
+ .adminui-main {
+ >.el-container {display: block;height:auto;}
+ >.el-container > .el-aside {width: 100%!important;border: 0}
+ }
+ .scTable {
+ .el-table,
+ .el-table__body-wrapper {display: block!important;height:auto!important;}
+ .el-scrollbar__wrap {height:auto!important;}
+ .scTable-page {padding: 0 5px!important;}
+ .el-pagination__total,
+ .el-pagination__jump,
+ .el-pagination__sizes {display: none!important;}
+ }
+
+ .headerPublic {
+ height: auto!important;display: block;
+ .left-panel {overflow: auto;}
+ .left-panel::-webkit-scrollbar{display: none;}
+ .right-panel {display: block;border-top: 1px solid var(--el-border-color-light);margin-top: 15px;}
+ .right-panel .right-panel-search {display: block;}
+ .right-panel .right-panel-search >* {width: 100%;margin: 0;margin-top: 15px;}
+ }
+ .adminui-main > .el-container >*:first-child:not(.el-aside):not(.el-header) {border: 0;margin-top: 0;}
+ .adminui-main > .el-container >*:first-child:not(.el-aside):not(.el-header) + .el-aside {margin-top: 0;}
+ .adminui-main > .el-container > .el-aside {border-bottom: 1px solid var(--el-border-color-light)!important;}
+ .adminui-main > .el-container > .el-container {border-top: 1px solid var(--el-border-color-light);border-bottom: 1px solid var(--el-border-color-light);margin-top: 15px;}
+ .adminui-main > .el-container > .el-container + .el-aside {border-top: 1px solid var(--el-border-color-light);margin-top: 15px;}
+ .adminui-main > .el-container > .el-header {@extend .headerPublic;}
+ .adminui-main > .el-container > .el-main.nopadding {border-top: 1px solid var(--el-border-color-light);border-bottom: 1px solid var(--el-border-color-light);margin-top: 15px;}
+ .adminui-main > .el-container > .el-main + .el-aside {border-left: 0!important;border-top: 1px solid var(--el-border-color-light);margin-top: 15px;}
+ .adminui-main > .el-container > .el-footer {margin-top: 15px;border-bottom: 1px solid var(--el-border-color-light);}
+ .adminui-main > .el-container > .el-container > .el-header {@extend .headerPublic}
+ .adminui-main > .el-container > .el-container > .el-header .left-panel {display: block;}
+ .adminui-main > .el-container > .el-container > .el-header .right-panel {display: block;margin-top: 15px;}
+
+ .sc-page {width: 100%;margin: 0;}
+
+ .common-main .el-form {width: 100% !important;}
+ .common-header-logo label {display: none;}
+ .common-header-title {display: none;}
+}
diff --git a/src/style/pages.scss b/src/style/pages.scss
new file mode 100644
index 00000000..564c8cae
--- /dev/null
+++ b/src/style/pages.scss
@@ -0,0 +1,44 @@
+/* USERCENTER */
+.page-user {
+ .user-info-top {text-align: center;}
+ .user-info-top h2 {font-size: 18px;margin-top: 5px;}
+ .user-info-top p {margin: 8px 0 10px 0;}
+ .menu {background: none;}
+ .menu .el-menu-item {font-size: 12px;--el-menu-item-height:50px;}
+ .menu .el-menu-item-group {border-top: 1px solid var(--el-border-color-light);}
+ .menu .el-menu-item-group:first-child {border: 0;}
+}
+
+/*static-table*/
+.static-table {border-collapse: collapse;width: 100%;font-size: 14px;margin-bottom: 45px;line-height: 1.5em;}
+.static-table th {text-align: left;white-space: nowrap;color: #909399;font-weight: 400;border-bottom: 1px solid #dcdfe6;padding: 15px;max-width: 250px;}
+.static-table td {border-bottom: 1px solid #dcdfe6;padding: 15px;max-width: 250px;color: #606266;}
+
+/*header-tabs*/
+.header-tabs {padding:10px 0 0 0;display:block;border:0!important;height:50px;background: none;}
+.header-tabs .el-tabs__header {padding-left:10px;margin: 0;}
+.header-tabs .el-tabs__content {display: none;}
+.header-tabs .el-tabs__nav {border-radius: 0 !important;}
+.header-tabs .el-tabs__item {font-size: 13px;}
+.header-tabs .el-tabs__item.is-active {background-color: var(--el-bg-color-overlay);}
+
+/*common-page*/
+.common-page {}
+.common-header-left {display: flex;align-items: center;}
+.common-header-logo {display: flex;align-items: center;}
+.common-header-logo img {height:30px;margin-right: 10px;vertical-align: bottom;}
+.common-header-logo label {font-size: 20px;}
+.common-header-title {font-size: 16px;border-left: 1px solid var(--el-border-color-light);margin-left: 15px;padding-left: 15px;}
+.common-header-right {display: flex;align-items: center;}
+.common-header-right a {font-size: 14px;color: var(--el-color-primary);cursor: pointer;}
+.common-header-right a:hover {color: var(--el-color-primary-light-3);}
+.common-container {max-width: 1240px;margin:30px auto 30px auto;}
+.common-main {padding:20px;}
+.common-title {font-size: 26px;margin-bottom: 20px;font-weight: normal;}
+.common-main .el-form {width: 500px;margin:30px auto;}
+.common-main .el-steps .el-step__title {font-size: 14px;}
+.common-main .el-steps .el-step__icon {border: 1px solid;}
+.common-main .yzm {display: flex;width: 100%;}
+.common-main .yzm .el-button {margin-left: 10px;}
+.common-main .link {color: var(--el-color-primary);cursor: pointer;}
+.common-main .link:hover {color: var(--el-color-primary-light-3);}
diff --git a/src/style/style.scss b/src/style/style.scss
new file mode 100644
index 00000000..2ce45bb4
--- /dev/null
+++ b/src/style/style.scss
@@ -0,0 +1,5 @@
+@import 'app.scss';
+@import 'fix.scss';
+@import 'pages.scss';
+@import 'media.scss';
+@import 'dark.scss';
diff --git a/src/style/youShe.ttf b/src/style/youShe.ttf
new file mode 100644
index 00000000..3729151a
Binary files /dev/null and b/src/style/youShe.ttf differ
diff --git a/src/utils/checkIdent.js b/src/utils/checkIdent.js
new file mode 100644
index 00000000..7bfc9cec
--- /dev/null
+++ b/src/utils/checkIdent.js
@@ -0,0 +1,130 @@
+const validateIdent = {
+ aIdentityCode_City: { // 城市代码列表
+ 11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古", 21: "辽宁", 22: "吉林",
+ 23: "黑龙江 ", 31: "上海", 32: "江苏", 33: "浙江", 34: "安徽", 35: "福建", 36: "江西",
+ 37: "山东", 41: "河南", 42: "湖北 ", 43: "湖南", 44: "广东", 45: "广西", 46: "海南",
+ 50: "重庆", 51: "四川", 52: "贵州", 53: "云南", 54: "西藏 ", 61: "陕西", 62: "甘肃",
+ 63: "青海", 64: "宁夏", 65: "新疆", 71: "台湾", 81: "香港", 82: "澳门", 91: "国外 "
+ },
+ IdentityCode_isCardNo(card) {//检查号码是否符合规范,包括长度,类型
+ var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/; //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
+ if (reg.test(card) === false) {
+ return false;
+ }
+ return true;
+ },
+ IdentityCode_checkProvince(card) { //取身份证前两位,校验省份
+ var province = card.substr(0, 2);
+ if (validateIdent.aIdentityCode_City[province] == undefined) {
+ return false;
+ }
+ return true;
+ },
+ IdentityCode_checkBirthday(card) { //检查生日是否正确,15位以'19'年份来进行补齐。
+ var len = card.length;
+ //身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
+ if (len == '15') {
+ var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
+ var arr_data = card.match(re_fifteen); // 正则取号码内所含出年月日数据
+ var year = arr_data[2];
+ var month = arr_data[3];
+ var day = arr_data[4];
+ var birthday = new Date('19' + year + '/' + month + '/' + day);
+ return validateIdent.IdentityCode_verifyBirthday('19' + year, month, day, birthday);
+ }
+ //身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X
+ if (len == '18') {
+ var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/;
+ var arr_data = card.match(re_eighteen); // 正则取号码内所含出年月日数据
+ var year = arr_data[2];
+ var month = arr_data[3];
+ var day = arr_data[4];
+ var birthday = new Date(year + '/' + month + '/' + day);
+ return validateIdent.IdentityCode_verifyBirthday(year, month, day, birthday);
+ }
+ return false;
+ },
+ IdentityCode_verifyBirthday(year, month, day, birthday) {//校验日期 ,15位以'19'年份来进行补齐。
+ var now = new Date();
+ var now_year = now.getFullYear();
+ //年月日是否合理
+ if (birthday.getFullYear() == year
+ && (birthday.getMonth() + 1) == month
+ && birthday.getDate() == day) {
+ //判断年份的范围(3岁到150岁之间)
+ var time = now_year - year;
+ if (time >= 3 && time <= 150) {
+ return true;
+ }
+ return false;
+ }
+ return false;
+ },
+ IdentityCode_checkParity(card) { //校验位的检测
+ card = validateIdent.IdentityCode_changeFivteenToEighteen(card); // 15位转18位
+ var len = card.length;
+ if (len == '18') {
+ var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
+ var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
+ var cardTemp = 0, i, valnum;
+ for (i = 0; i < 17; i++) {
+ cardTemp += card.substr(i, 1) * arrInt[i];
+ }
+ valnum = arrCh[cardTemp % 11];
+ if (valnum == card.substr(17, 1)) {
+ return true;
+ }
+ return false;
+ }
+ return false;
+ },
+ IdentityCode_changeFivteenToEighteen(card) { //15位转18位身份证号
+ if (card.length == '15') {
+ var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
+ var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
+ var cardTemp = 0, i;
+ card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6);
+ for (i = 0; i < 17; i++) {
+ cardTemp += card.substr(i, 1) * arrInt[i];
+ }
+ card += arrCh[cardTemp % 11];
+ return card;
+ }
+ return card;
+ },
+ IdentityCodeValid(card) {// 身份证号码检验主入口
+ let pass = true;
+ let sex = ''
+ //是否为空
+ if (pass && card === '')
+ pass = false;
+ //校验长度,类型
+ if (pass && validateIdent.IdentityCode_isCardNo(card) === false)
+ pass = false;
+ //检查省份
+ if (pass && validateIdent.IdentityCode_checkProvince(card) === false)
+ pass = false;
+ //校验生日
+ if (pass && validateIdent.IdentityCode_checkBirthday(card) === false)
+ pass = false;
+ //检验位的检测
+ // if (pass && validateIdent.IdentityCode_checkParity(card) === false)
+ // pass = false;
+ if (pass) {
+ var iCard = validateIdent.IdentityCode_changeFivteenToEighteen(card);
+ if (parseInt(iCard.charAt(16)) % 2 == 0) {
+ sex = "0"; // 女生
+ } else {
+ sex = "1"; // 男生
+ }
+ return true
+ } else {
+ return false
+ }
+ }
+}
+
+
+
+
+export default validateIdent.IdentityCodeValid //导出
diff --git a/src/utils/color.js b/src/utils/color.js
new file mode 100644
index 00000000..295d0113
--- /dev/null
+++ b/src/utils/color.js
@@ -0,0 +1,29 @@
+export default {
+ //hex颜色转rgb颜色
+ HexToRgb(str) {
+ str = str.replace("#", "")
+ var hxs = str.match(/../g)
+ for (var i = 0; i < 3; i++) hxs[i] = parseInt(hxs[i], 16)
+ return hxs
+ },
+ //rgb颜色转hex颜色
+ RgbToHex(a, b, c) {
+ var hexs = [a.toString(16), b.toString(16), c.toString(16)]
+ for (var i = 0; i < 3; i++) {
+ if (hexs[i].length == 1) hexs[i] = "0" + hexs[i]
+ }
+ return "#" + hexs.join("");
+ },
+ //加深
+ darken(color, level) {
+ var rgbc = this.HexToRgb(color)
+ for (var i = 0; i < 3; i++) rgbc[i] = Math.floor(rgbc[i] * (1 - level))
+ return this.RgbToHex(rgbc[0], rgbc[1], rgbc[2])
+ },
+ //变淡
+ lighten(color, level) {
+ var rgbc = this.HexToRgb(color)
+ for (var i = 0; i < 3; i++) rgbc[i] = Math.floor((255 - rgbc[i]) * level + rgbc[i])
+ return this.RgbToHex(rgbc[0], rgbc[1], rgbc[2])
+ }
+}
diff --git a/src/utils/db.js b/src/utils/db.js
new file mode 100644
index 00000000..68e46832
--- /dev/null
+++ b/src/utils/db.js
@@ -0,0 +1,304 @@
+//初始数据库结构
+const dbData = [
+ {
+ dbName: "masterDB", //数据库名称
+ version: 1, //数据库版本号,当结构发生变化时
+ tables: [ //表
+ {
+ name: "SYS_favorites", //表名称
+ keyPath: "uid", //主键
+ autoIncrement: false, //主键是否自增
+ index: [ //索引
+ {
+ name: "name_index", //索引名称
+ key: "name" //索引key
+ }
+ ]
+ },
+ {
+ name: "SYS_keyword",
+ keyPath: "id"
+ }
+ ]
+ },
+ {
+ dbName: "guestDB",
+ version: 1,
+ tables: [
+ {
+ name: "MY_demo",
+ keyPath: "id"
+ }
+ ]
+ }
+]
+
+// 使用示例
+// import DB from '@/utils/db'
+
+// 初始化创建数据库 一般在项目启动时就执行了
+// await DB.create()
+
+// 打开某个数据库,返回数据库实例
+// const database = await DB.open("dbName")
+
+// 在打开的数据库中添加数据到tablenName表
+// await database.add("tablenName", data)
+
+// 查询
+// await database.get("tablenName", key)
+
+// 查询 根据索引
+// await database.indexGet("tablenName", "indexName", indexVal)
+
+// 修改
+// await database.put("tablenName", data)
+
+// 删除
+// await database.delete("tablenName", key)
+
+// 获取所有
+// await database.getAll("tablenName")
+
+// 清空某个表数据
+// await database.clear("tablenName")
+
+// 获取某个表信息
+// database.getTable("tablenName")
+
+// 获取所有表
+// database.getTables()
+
+// 关闭数据库连接
+// database.close()
+
+
+export default {
+ //建立数据库,表,初始数据
+ create() {
+ var promiseArray = []
+ const addDB = db => {
+ return new Promise((resolve, reject) => {
+ const request = indexedDB.open(db.dbName, db.version)
+ request.onupgradeneeded = e => {
+ const thisDB = e.target.result
+ db.tables.forEach(item => {
+ let table = null
+ if (thisDB.objectStoreNames.contains(item.name)) {
+ //已存在表,删除旧index
+ table = e.target.transaction.objectStore(item.name)
+ table.indexNames.length>0 && table.indexNames.forEach(indexName => {
+ table.deleteIndex(indexName)
+ })
+ }else{
+ //创建新的表
+ table = thisDB.createObjectStore(item.name, {
+ keyPath: item.keyPath,
+ autoIncrement: item.autoIncrement
+ })
+ }
+ //建立index
+ item.index && item.index.forEach(ind => {
+ table.createIndex(ind.name, ind.key, { unique: false })
+ })
+ })
+ },
+ request.onsuccess = e => {
+ return resolve(e.target.result)
+ }
+ request.onerror = e => {
+ return reject(e)
+ }
+ })
+ }
+ dbData.forEach(db => {
+ promiseArray.push(addDB(db))
+ })
+ return new Promise((resolve, reject) => {
+ Promise.all(promiseArray).then((e) => {
+ resolve(e)
+ }).catch(e => {
+ reject(e)
+ })
+ })
+ },
+ //所有数据库
+ databases(){
+ return indexedDB.databases()
+ },
+ //打开数据库
+ open(dbName){
+ return new Promise((resolve, reject) => {
+ const request = indexedDB.open(dbName)
+ request.onsuccess = e => {
+ const database = new this.database(e.target.result)
+ resolve(database)
+ }
+ request.onerror = e => {
+ reject(e)
+ }
+ })
+ },
+ //删除数据库
+ deleteDB(dbName){
+ return indexedDB.deleteDatabase(dbName)
+ },
+ //数据库类
+ database: function (IDBDatabase) {
+ this.IDBDatabase = IDBDatabase
+
+ /**
+ * 添加行数据
+ * @param {string} tableName 表名
+ * @param {object} data 数据
+ * @returns {promise}
+ */
+ this.add = (tableName, data) => {
+ return new Promise((resolve, reject) => {
+ const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).add(data)
+ request.onsuccess = e => {
+ resolve(e)
+ }
+ request.onerror = e => {
+ reject(e)
+ }
+ })
+ }
+
+ /**
+ * 修改行数据,未查询到就新增
+ * @param {string} tableName 表名
+ * @param {object} data 数据
+ * @returns {promise}
+ */
+ this.put = (tableName, data) => {
+ return new Promise((resolve, reject) => {
+ const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).put(data)
+ request.onsuccess = e => {
+ resolve(e)
+ }
+ request.onerror = e => {
+ reject(e)
+ }
+ })
+ }
+
+ /**
+ * 删除行
+ * @param {string} tableName 表名
+ * @param {string} key 主键
+ * @returns {promise}
+ */
+ this.delete = (tableName, key) => {
+ return new Promise((resolve, reject) => {
+ const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).delete(key)
+ request.onsuccess = e => {
+ resolve(e)
+ }
+ request.onerror = e => {
+ reject(e)
+ }
+ })
+ }
+
+ /**
+ * 根据主键获取行
+ * @param {string} tableName 表名
+ * @param {string} key 主键
+ * @returns {promise}
+ */
+ this.get = (tableName, key) => {
+ return new Promise((resolve, reject) => {
+ const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).get(key)
+ request.onsuccess = () => {
+ resolve(request.result || null)
+ }
+ request.onerror = e => {
+ reject(e)
+ }
+ })
+ }
+
+ /**
+ * 根据索引获取行
+ * @param {string} tableName 表名
+ * @param {string} indexName 索引库名称
+ * @param {string} indexVal 索引值
+ * @returns {promise}
+ */
+ this.indexGet = (tableName, indexName, indexVal) => {
+ return new Promise((resolve, reject) => {
+ const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).index(indexName).get(indexVal)
+ request.onsuccess = () => {
+ resolve(request.result || null)
+ }
+ request.onerror = e => {
+ reject(e)
+ }
+ })
+ }
+
+ /**
+ * 获取所有行
+ * @param {string} tableName 表名
+ * @returns {promise}
+ */
+ this.getAll = (tableName) => {
+ return new Promise((resolve, reject) => {
+ const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).getAll()
+ request.onsuccess = () => {
+ resolve(request.result || null)
+ }
+ request.onerror = e => {
+ reject(e)
+ }
+ })
+ }
+
+ /**
+ * 清空表
+ * @param {string} tableName 表名
+ * @returns {promise}
+ */
+ this.clear = (tableName) => {
+ return new Promise((resolve, reject) => {
+ const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).clear()
+ request.onsuccess = e => {
+ resolve(e)
+ }
+ request.onerror = err => {
+ reject(err)
+ }
+ })
+ }
+
+ /**
+ * 获取表信息
+ * @returns {IDBObjectStore}
+ */
+ this.getTable = (tableName) => {
+ const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName)
+ return request
+ }
+
+ /**
+ * 获取所有的表
+ * @returns {[IDBObjectStore]}
+ */
+ this.getTables = () => {
+ const tables = []
+ for (let item of IDBDatabase.objectStoreNames) {
+ tables.push(IDBDatabase.transaction([item], 'readwrite').objectStore(item))
+ }
+ return tables
+ }
+
+ /**
+ * 关闭数据库连接
+ * @returns {}
+ */
+ this.close = () => {
+ return IDBDatabase.close()
+ }
+ }
+}
diff --git a/src/utils/enum.js b/src/utils/enum.js
new file mode 100644
index 00000000..010400ca
--- /dev/null
+++ b/src/utils/enum.js
@@ -0,0 +1,69 @@
+/**
+ * 枚举创建工厂(构造函数),扩展枚举对象:keys、values(含key值的[{key,text,type}])、formatter。
+ * @param {*} enumObj 枚举值,支持标准模式{key:{text,type},},简单模式{key:text,}(会自动转换为标准模式)
+ * @param {*} keyParseFunc key的转换函数,默认null,如果key为整数则传 parseInt
+ */
+export default function EnumFactory(enumObj, keyParseFunc = null) {
+ //复制(继承)enumObj
+ Object.assign(this, enumObj)
+
+ // keys:枚举的key集合[key]
+ Object.defineProperty(this, 'keys', {
+ value: keyParseFunc ? Object.keys(enumObj).map(s => keyParseFunc(s)) : Object.keys(enumObj)
+ })
+
+ // 处理 values
+ let values = []
+ const ovalues = Object.values(enumObj)
+ // 主要区分下value是简单类型(字符串)还是对象类型
+ if (typeof ovalues[0] === 'string') {
+ ovalues.forEach((text, index) => {
+ const obj = { key: this.keys[index], text }
+ values.push(obj)
+ this[this.keys[index]] = obj
+ })
+ }
+ else {
+ ovalues.forEach((item, index) => {
+ item.key = this.keys[index]
+ values.push(item)
+ })
+ }
+ // 设置values属性
+ Object.defineProperty(this, 'values', { value: values })
+
+ // formatter:element中表格绑定枚举数据文本的formatter函数
+ // r、c为行列,可传入null
+ Object.defineProperty(this, 'formatter', {
+ value: function(r, c, value) {
+ return values.filter(v => v.key == value || v.text == value)[0]?.text || 'notfound'
+ }
+ })
+
+ //枚举定义的数据都是常量,不可修改,冻结一下
+ Object.freeze(this)
+ }
+
+export const valTypeEnum = new EnumFactory({
+ 'int': '整型',
+ 'float': '浮点型',
+ 'str': '字符串型',
+ 'bool': '布尔型',
+})
+
+export const boolEnum = new EnumFactory({
+ true: '是',
+ false: '否',
+})
+
+export const scheduleTypeEnum = new EnumFactory({
+ 10: '间隔',
+ 20: '定时',
+}, parseInt)
+
+export const schedulePeriodEnum = new EnumFactory({
+ 'seconds': '秒',
+ 'minutes': '分钟',
+ 'hours': '小时',
+ 'days': '天',
+})
diff --git a/src/utils/errorHandler.js b/src/utils/errorHandler.js
new file mode 100644
index 00000000..2443c626
--- /dev/null
+++ b/src/utils/errorHandler.js
@@ -0,0 +1,39 @@
+/**
+ * 全局代码错误捕捉
+ * 比如 null.length 就会被捕捉到
+ */
+
+export default (error, vm)=>{
+ //过滤HTTP请求错误
+ if(error.status || error.status==0){
+ return false
+ }
+ let errorString = error.toString();
+ console.log('error,')
+ console.log(error.toString())
+ console.log('error0000000000')
+ var errorMap = {
+ InternalError: "Javascript引擎内部错误",
+ ReferenceError: "未找到对象",
+ TypeError: "使用了错误的类型或对象",
+ RangeError: "使用内置对象时,参数超范围",
+ SyntaxError: "语法错误",
+ EvalError: "错误的使用了Eval",
+ URIError: "URI错误"
+ }
+ var errorName = errorMap[error.name] || "未知错误"
+
+ console.warn(`[SCUI error]: ${error}`);
+ console.error(error);
+ //throw error;
+
+ vm.$nextTick(() => {
+ if(errorString=="TypeError: Cannot read properties of undefined (reading 'splice')"){}else{
+ vm.$notify.error({
+ title: errorName,
+ message: error
+ });
+ }
+
+ })
+}
diff --git a/src/utils/exportExcel.js b/src/utils/exportExcel.js
new file mode 100644
index 00000000..23bcbae0
--- /dev/null
+++ b/src/utils/exportExcel.js
@@ -0,0 +1,44 @@
+import * as XLSX from 'xlsx';
+/**
+ * eg: .columns = [
+ * { header: 'Id', key: 'id', wpx: 10 },
+ * { header: 'Name', key: 'name', wch: 32 },
+ * { header: 'D.O.B.', key: 'dob', width: 10, hidden: true }
+ * ]
+ * data: [{id: 1, name: 'John Doe', dob: new Date(1970,1,1)}]
+ * @param columns 定义列属性数组
+ * @param data 数据
+ * @param name 文件名
+ */
+export const generateExcel = (columns = [], data = [], name = '') => {
+ const headers = columns.map((item) => item.header);
+ const otherConfigs = columns.map(({ key, header, ...item }) => item);
+ const dataList = data.map((item) => {
+ let obj = {};
+ columns.forEach((col) => {
+ obj[col.header] = item[col.key];
+ });
+ return obj;
+ });
+ const workbook = XLSX.utils.book_new();
+ workbook.SheetNames.push(name);
+ const worksheet = XLSX.utils.json_to_sheet(dataList, {
+ header: headers,
+ });
+ worksheet['!cols'] = otherConfigs;
+ workbook.Sheets[name] = worksheet;
+ // 生成Blob数据
+ const excelData = XLSX.write(workbook, { type: 'array', bookType: 'xlsx' });
+ const blobData = new Blob([excelData], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
+ // 创建Blob URL
+ const blobUrl = URL.createObjectURL(blobData);
+ // 创建一个隐藏的标签并设置href属性为Blob URL
+ const link = document.createElement('a');
+ link.href = blobUrl;
+ link.target = '_blank';
+ link.download = `${name}.xlsx`;
+ // 触发点击操作,开始下载文件
+ link.click();
+ // 释放Blob URL
+ URL.revokeObjectURL(blobUrl);
+};
\ No newline at end of file
diff --git a/src/utils/flv.js b/src/utils/flv.js
new file mode 100644
index 00000000..ecf44d7e
--- /dev/null
+++ b/src/utils/flv.js
@@ -0,0 +1,11301 @@
+(function webpackUniversalModuleDefinition(root, factory) {
+ if(typeof exports === 'object' && typeof module === 'object')
+ module.exports = factory();
+ else if(typeof define === 'function' && define.amd)
+ define([], factory);
+ else if(typeof exports === 'object')
+ exports["flvjs"] = factory();
+ else
+ root["flvjs"] = factory();
+})(self, function() {
+return /******/ (function() { // webpackBootstrap
+/******/ var __webpack_modules__ = ({
+
+/***/ "./node_modules/es6-promise/dist/es6-promise.js":
+/*!******************************************************!*\
+ !*** ./node_modules/es6-promise/dist/es6-promise.js ***!
+ \******************************************************/
+/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
+
+/*!
+ * @overview es6-promise - a tiny implementation of Promises/A+.
+ * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
+ * @license Licensed under MIT license
+ * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE
+ * @version v4.2.8+1e68dce6
+ */
+(function (global, factory) {
+ true ? module.exports = factory() :
+ 0;
+}(this, (function () {
+ 'use strict';
+ function objectOrFunction(x) {
+ var type = typeof x;
+ return x !== null && (type === 'object' || type === 'function');
+ }
+ function isFunction(x) {
+ return typeof x === 'function';
+ }
+ var _isArray = void 0;
+ if (Array.isArray) {
+ _isArray = Array.isArray;
+ }
+ else {
+ _isArray = function (x) {
+ return Object.prototype.toString.call(x) === '[object Array]';
+ };
+ }
+ var isArray = _isArray;
+ var len = 0;
+ var vertxNext = void 0;
+ var customSchedulerFn = void 0;
+ var asap = function asap(callback, arg) {
+ queue[len] = callback;
+ queue[len + 1] = arg;
+ len += 2;
+ if (len === 2) {
+ // If len is 2, that means that we need to schedule an async flush.
+ // If additional callbacks are queued before the queue is flushed, they
+ // will be processed by this flush that we are scheduling.
+ if (customSchedulerFn) {
+ customSchedulerFn(flush);
+ }
+ else {
+ scheduleFlush();
+ }
+ }
+ };
+ function setScheduler(scheduleFn) {
+ customSchedulerFn = scheduleFn;
+ }
+ function setAsap(asapFn) {
+ asap = asapFn;
+ }
+ var browserWindow = typeof window !== 'undefined' ? window : undefined;
+ var browserGlobal = browserWindow || {};
+ var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
+ var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
+ // test for web worker but not in IE10
+ var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';
+ // node
+ function useNextTick() {
+ // node version 0.10.x displays a deprecation warning when nextTick is used recursively
+ // see https://github.com/cujojs/when/issues/410 for details
+ return function () {
+ return process.nextTick(flush);
+ };
+ }
+ // vertx
+ function useVertxTimer() {
+ if (typeof vertxNext !== 'undefined') {
+ return function () {
+ vertxNext(flush);
+ };
+ }
+ return useSetTimeout();
+ }
+ function useMutationObserver() {
+ var iterations = 0;
+ var observer = new BrowserMutationObserver(flush);
+ var node = document.createTextNode('');
+ observer.observe(node, { characterData: true });
+ return function () {
+ node.data = iterations = ++iterations % 2;
+ };
+ }
+ // web worker
+ function useMessageChannel() {
+ var channel = new MessageChannel();
+ channel.port1.onmessage = flush;
+ return function () {
+ return channel.port2.postMessage(0);
+ };
+ }
+ function useSetTimeout() {
+ // Store setTimeout reference so es6-promise will be unaffected by
+ // other code modifying setTimeout (like sinon.useFakeTimers())
+ var globalSetTimeout = setTimeout;
+ return function () {
+ return globalSetTimeout(flush, 1);
+ };
+ }
+ var queue = new Array(1000);
+ function flush() {
+ for (var i = 0; i < len; i += 2) {
+ var callback = queue[i];
+ var arg = queue[i + 1];
+ callback(arg);
+ queue[i] = undefined;
+ queue[i + 1] = undefined;
+ }
+ len = 0;
+ }
+ function attemptVertx() {
+ try {
+ var vertx = Function('return this')().require('vertx');
+ vertxNext = vertx.runOnLoop || vertx.runOnContext;
+ return useVertxTimer();
+ }
+ catch (e) {
+ return useSetTimeout();
+ }
+ }
+ var scheduleFlush = void 0;
+ // Decide what async method to use to triggering processing of queued callbacks:
+ if (isNode) {
+ scheduleFlush = useNextTick();
+ }
+ else if (BrowserMutationObserver) {
+ scheduleFlush = useMutationObserver();
+ }
+ else if (isWorker) {
+ scheduleFlush = useMessageChannel();
+ }
+ else if (browserWindow === undefined && "function" === 'function') {
+ scheduleFlush = attemptVertx();
+ }
+ else {
+ scheduleFlush = useSetTimeout();
+ }
+ function then(onFulfillment, onRejection) {
+ var parent = this;
+ var child = new this.constructor(noop);
+ if (child[PROMISE_ID] === undefined) {
+ makePromise(child);
+ }
+ var _state = parent._state;
+ if (_state) {
+ var callback = arguments[_state - 1];
+ asap(function () {
+ return invokeCallback(_state, child, callback, parent._result);
+ });
+ }
+ else {
+ subscribe(parent, child, onFulfillment, onRejection);
+ }
+ return child;
+ }
+ /**
+ `Promise.resolve` returns a promise that will become resolved with the
+ passed `value`. It is shorthand for the following:
+
+ ```javascript
+ let promise = new Promise(function(resolve, reject){
+ resolve(1);
+ });
+
+ promise.then(function(value){
+ // value === 1
+ });
+ ```
+
+ Instead of writing the above, your code now simply becomes the following:
+
+ ```javascript
+ let promise = Promise.resolve(1);
+
+ promise.then(function(value){
+ // value === 1
+ });
+ ```
+
+ @method resolve
+ @static
+ @param {Any} value value that the returned promise will be resolved with
+ Useful for tooling.
+ @return {Promise} a promise that will become fulfilled with the given
+ `value`
+ */
+ function resolve$1(object) {
+ /*jshint validthis:true */
+ var Constructor = this;
+ if (object && typeof object === 'object' && object.constructor === Constructor) {
+ return object;
+ }
+ var promise = new Constructor(noop);
+ resolve(promise, object);
+ return promise;
+ }
+ var PROMISE_ID = Math.random().toString(36).substring(2);
+ function noop() { }
+ var PENDING = void 0;
+ var FULFILLED = 1;
+ var REJECTED = 2;
+ function selfFulfillment() {
+ return new TypeError("You cannot resolve a promise with itself");
+ }
+ function cannotReturnOwn() {
+ return new TypeError('A promises callback cannot return that same promise.');
+ }
+ function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {
+ try {
+ then$$1.call(value, fulfillmentHandler, rejectionHandler);
+ }
+ catch (e) {
+ return e;
+ }
+ }
+ function handleForeignThenable(promise, thenable, then$$1) {
+ asap(function (promise) {
+ var sealed = false;
+ var error = tryThen(then$$1, thenable, function (value) {
+ if (sealed) {
+ return;
+ }
+ sealed = true;
+ if (thenable !== value) {
+ resolve(promise, value);
+ }
+ else {
+ fulfill(promise, value);
+ }
+ }, function (reason) {
+ if (sealed) {
+ return;
+ }
+ sealed = true;
+ reject(promise, reason);
+ }, 'Settle: ' + (promise._label || ' unknown promise'));
+ if (!sealed && error) {
+ sealed = true;
+ reject(promise, error);
+ }
+ }, promise);
+ }
+ function handleOwnThenable(promise, thenable) {
+ if (thenable._state === FULFILLED) {
+ fulfill(promise, thenable._result);
+ }
+ else if (thenable._state === REJECTED) {
+ reject(promise, thenable._result);
+ }
+ else {
+ subscribe(thenable, undefined, function (value) {
+ return resolve(promise, value);
+ }, function (reason) {
+ return reject(promise, reason);
+ });
+ }
+ }
+ function handleMaybeThenable(promise, maybeThenable, then$$1) {
+ if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {
+ handleOwnThenable(promise, maybeThenable);
+ }
+ else {
+ if (then$$1 === undefined) {
+ fulfill(promise, maybeThenable);
+ }
+ else if (isFunction(then$$1)) {
+ handleForeignThenable(promise, maybeThenable, then$$1);
+ }
+ else {
+ fulfill(promise, maybeThenable);
+ }
+ }
+ }
+ function resolve(promise, value) {
+ if (promise === value) {
+ reject(promise, selfFulfillment());
+ }
+ else if (objectOrFunction(value)) {
+ var then$$1 = void 0;
+ try {
+ then$$1 = value.then;
+ }
+ catch (error) {
+ reject(promise, error);
+ return;
+ }
+ handleMaybeThenable(promise, value, then$$1);
+ }
+ else {
+ fulfill(promise, value);
+ }
+ }
+ function publishRejection(promise) {
+ if (promise._onerror) {
+ promise._onerror(promise._result);
+ }
+ publish(promise);
+ }
+ function fulfill(promise, value) {
+ if (promise._state !== PENDING) {
+ return;
+ }
+ promise._result = value;
+ promise._state = FULFILLED;
+ if (promise._subscribers.length !== 0) {
+ asap(publish, promise);
+ }
+ }
+ function reject(promise, reason) {
+ if (promise._state !== PENDING) {
+ return;
+ }
+ promise._state = REJECTED;
+ promise._result = reason;
+ asap(publishRejection, promise);
+ }
+ function subscribe(parent, child, onFulfillment, onRejection) {
+ var _subscribers = parent._subscribers;
+ var length = _subscribers.length;
+ parent._onerror = null;
+ _subscribers[length] = child;
+ _subscribers[length + FULFILLED] = onFulfillment;
+ _subscribers[length + REJECTED] = onRejection;
+ if (length === 0 && parent._state) {
+ asap(publish, parent);
+ }
+ }
+ function publish(promise) {
+ var subscribers = promise._subscribers;
+ var settled = promise._state;
+ if (subscribers.length === 0) {
+ return;
+ }
+ var child = void 0, callback = void 0, detail = promise._result;
+ for (var i = 0; i < subscribers.length; i += 3) {
+ child = subscribers[i];
+ callback = subscribers[i + settled];
+ if (child) {
+ invokeCallback(settled, child, callback, detail);
+ }
+ else {
+ callback(detail);
+ }
+ }
+ promise._subscribers.length = 0;
+ }
+ function invokeCallback(settled, promise, callback, detail) {
+ var hasCallback = isFunction(callback), value = void 0, error = void 0, succeeded = true;
+ if (hasCallback) {
+ try {
+ value = callback(detail);
+ }
+ catch (e) {
+ succeeded = false;
+ error = e;
+ }
+ if (promise === value) {
+ reject(promise, cannotReturnOwn());
+ return;
+ }
+ }
+ else {
+ value = detail;
+ }
+ if (promise._state !== PENDING) {
+ // noop
+ }
+ else if (hasCallback && succeeded) {
+ resolve(promise, value);
+ }
+ else if (succeeded === false) {
+ reject(promise, error);
+ }
+ else if (settled === FULFILLED) {
+ fulfill(promise, value);
+ }
+ else if (settled === REJECTED) {
+ reject(promise, value);
+ }
+ }
+ function initializePromise(promise, resolver) {
+ try {
+ resolver(function resolvePromise(value) {
+ resolve(promise, value);
+ }, function rejectPromise(reason) {
+ reject(promise, reason);
+ });
+ }
+ catch (e) {
+ reject(promise, e);
+ }
+ }
+ var id = 0;
+ function nextId() {
+ return id++;
+ }
+ function makePromise(promise) {
+ promise[PROMISE_ID] = id++;
+ promise._state = undefined;
+ promise._result = undefined;
+ promise._subscribers = [];
+ }
+ function validationError() {
+ return new Error('Array Methods must be provided an Array');
+ }
+ var Enumerator = function () {
+ function Enumerator(Constructor, input) {
+ this._instanceConstructor = Constructor;
+ this.promise = new Constructor(noop);
+ if (!this.promise[PROMISE_ID]) {
+ makePromise(this.promise);
+ }
+ if (isArray(input)) {
+ this.length = input.length;
+ this._remaining = input.length;
+ this._result = new Array(this.length);
+ if (this.length === 0) {
+ fulfill(this.promise, this._result);
+ }
+ else {
+ this.length = this.length || 0;
+ this._enumerate(input);
+ if (this._remaining === 0) {
+ fulfill(this.promise, this._result);
+ }
+ }
+ }
+ else {
+ reject(this.promise, validationError());
+ }
+ }
+ Enumerator.prototype._enumerate = function _enumerate(input) {
+ for (var i = 0; this._state === PENDING && i < input.length; i++) {
+ this._eachEntry(input[i], i);
+ }
+ };
+ Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {
+ var c = this._instanceConstructor;
+ var resolve$$1 = c.resolve;
+ if (resolve$$1 === resolve$1) {
+ var _then = void 0;
+ var error = void 0;
+ var didError = false;
+ try {
+ _then = entry.then;
+ }
+ catch (e) {
+ didError = true;
+ error = e;
+ }
+ if (_then === then && entry._state !== PENDING) {
+ this._settledAt(entry._state, i, entry._result);
+ }
+ else if (typeof _then !== 'function') {
+ this._remaining--;
+ this._result[i] = entry;
+ }
+ else if (c === Promise$1) {
+ var promise = new c(noop);
+ if (didError) {
+ reject(promise, error);
+ }
+ else {
+ handleMaybeThenable(promise, entry, _then);
+ }
+ this._willSettleAt(promise, i);
+ }
+ else {
+ this._willSettleAt(new c(function (resolve$$1) {
+ return resolve$$1(entry);
+ }), i);
+ }
+ }
+ else {
+ this._willSettleAt(resolve$$1(entry), i);
+ }
+ };
+ Enumerator.prototype._settledAt = function _settledAt(state, i, value) {
+ var promise = this.promise;
+ if (promise._state === PENDING) {
+ this._remaining--;
+ if (state === REJECTED) {
+ reject(promise, value);
+ }
+ else {
+ this._result[i] = value;
+ }
+ }
+ if (this._remaining === 0) {
+ fulfill(promise, this._result);
+ }
+ };
+ Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {
+ var enumerator = this;
+ subscribe(promise, undefined, function (value) {
+ return enumerator._settledAt(FULFILLED, i, value);
+ }, function (reason) {
+ return enumerator._settledAt(REJECTED, i, reason);
+ });
+ };
+ return Enumerator;
+ }();
+ /**
+ `Promise.all` accepts an array of promises, and returns a new promise which
+ is fulfilled with an array of fulfillment values for the passed promises, or
+ rejected with the reason of the first passed promise to be rejected. It casts all
+ elements of the passed iterable to promises as it runs this algorithm.
+
+ Example:
+
+ ```javascript
+ let promise1 = resolve(1);
+ let promise2 = resolve(2);
+ let promise3 = resolve(3);
+ let promises = [ promise1, promise2, promise3 ];
+
+ Promise.all(promises).then(function(array){
+ // The array here would be [ 1, 2, 3 ];
+ });
+ ```
+
+ If any of the `promises` given to `all` are rejected, the first promise
+ that is rejected will be given as an argument to the returned promises's
+ rejection handler. For example:
+
+ Example:
+
+ ```javascript
+ let promise1 = resolve(1);
+ let promise2 = reject(new Error("2"));
+ let promise3 = reject(new Error("3"));
+ let promises = [ promise1, promise2, promise3 ];
+
+ Promise.all(promises).then(function(array){
+ // Code here never runs because there are rejected promises!
+ }, function(error) {
+ // error.message === "2"
+ });
+ ```
+
+ @method all
+ @static
+ @param {Array} entries array of promises
+ @param {String} label optional string for labeling the promise.
+ Useful for tooling.
+ @return {Promise} promise that is fulfilled when all `promises` have been
+ fulfilled, or rejected if any of them become rejected.
+ @static
+ */
+ function all(entries) {
+ return new Enumerator(this, entries).promise;
+ }
+ /**
+ `Promise.race` returns a new promise which is settled in the same way as the
+ first passed promise to settle.
+
+ Example:
+
+ ```javascript
+ let promise1 = new Promise(function(resolve, reject){
+ setTimeout(function(){
+ resolve('promise 1');
+ }, 200);
+ });
+
+ let promise2 = new Promise(function(resolve, reject){
+ setTimeout(function(){
+ resolve('promise 2');
+ }, 100);
+ });
+
+ Promise.race([promise1, promise2]).then(function(result){
+ // result === 'promise 2' because it was resolved before promise1
+ // was resolved.
+ });
+ ```
+
+ `Promise.race` is deterministic in that only the state of the first
+ settled promise matters. For example, even if other promises given to the
+ `promises` array argument are resolved, but the first settled promise has
+ become rejected before the other promises became fulfilled, the returned
+ promise will become rejected:
+
+ ```javascript
+ let promise1 = new Promise(function(resolve, reject){
+ setTimeout(function(){
+ resolve('promise 1');
+ }, 200);
+ });
+
+ let promise2 = new Promise(function(resolve, reject){
+ setTimeout(function(){
+ reject(new Error('promise 2'));
+ }, 100);
+ });
+
+ Promise.race([promise1, promise2]).then(function(result){
+ // Code here never runs
+ }, function(reason){
+ // reason.message === 'promise 2' because promise 2 became rejected before
+ // promise 1 became fulfilled
+ });
+ ```
+
+ An example real-world use case is implementing timeouts:
+
+ ```javascript
+ Promise.race([ajax('foo.json'), timeout(5000)])
+ ```
+
+ @method race
+ @static
+ @param {Array} promises array of promises to observe
+ Useful for tooling.
+ @return {Promise} a promise which settles in the same way as the first passed
+ promise to settle.
+ */
+ function race(entries) {
+ /*jshint validthis:true */
+ var Constructor = this;
+ if (!isArray(entries)) {
+ return new Constructor(function (_, reject) {
+ return reject(new TypeError('You must pass an array to race.'));
+ });
+ }
+ else {
+ return new Constructor(function (resolve, reject) {
+ var length = entries.length;
+ for (var i = 0; i < length; i++) {
+ Constructor.resolve(entries[i]).then(resolve, reject);
+ }
+ });
+ }
+ }
+ /**
+ `Promise.reject` returns a promise rejected with the passed `reason`.
+ It is shorthand for the following:
+
+ ```javascript
+ let promise = new Promise(function(resolve, reject){
+ reject(new Error('WHOOPS'));
+ });
+
+ promise.then(function(value){
+ // Code here doesn't run because the promise is rejected!
+ }, function(reason){
+ // reason.message === 'WHOOPS'
+ });
+ ```
+
+ Instead of writing the above, your code now simply becomes the following:
+
+ ```javascript
+ let promise = Promise.reject(new Error('WHOOPS'));
+
+ promise.then(function(value){
+ // Code here doesn't run because the promise is rejected!
+ }, function(reason){
+ // reason.message === 'WHOOPS'
+ });
+ ```
+
+ @method reject
+ @static
+ @param {Any} reason value that the returned promise will be rejected with.
+ Useful for tooling.
+ @return {Promise} a promise rejected with the given `reason`.
+ */
+ function reject$1(reason) {
+ /*jshint validthis:true */
+ var Constructor = this;
+ var promise = new Constructor(noop);
+ reject(promise, reason);
+ return promise;
+ }
+ function needsResolver() {
+ throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
+ }
+ function needsNew() {
+ throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
+ }
+ /**
+ Promise objects represent the eventual result of an asynchronous operation. The
+ primary way of interacting with a promise is through its `then` method, which
+ registers callbacks to receive either a promise's eventual value or the reason
+ why the promise cannot be fulfilled.
+
+ Terminology
+ -----------
+
+ - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
+ - `thenable` is an object or function that defines a `then` method.
+ - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
+ - `exception` is a value that is thrown using the throw statement.
+ - `reason` is a value that indicates why a promise was rejected.
+ - `settled` the final resting state of a promise, fulfilled or rejected.
+
+ A promise can be in one of three states: pending, fulfilled, or rejected.
+
+ Promises that are fulfilled have a fulfillment value and are in the fulfilled
+ state. Promises that are rejected have a rejection reason and are in the
+ rejected state. A fulfillment value is never a thenable.
+
+ Promises can also be said to *resolve* a value. If this value is also a
+ promise, then the original promise's settled state will match the value's
+ settled state. So a promise that *resolves* a promise that rejects will
+ itself reject, and a promise that *resolves* a promise that fulfills will
+ itself fulfill.
+
+
+ Basic Usage:
+ ------------
+
+ ```js
+ let promise = new Promise(function(resolve, reject) {
+ // on success
+ resolve(value);
+
+ // on failure
+ reject(reason);
+ });
+
+ promise.then(function(value) {
+ // on fulfillment
+ }, function(reason) {
+ // on rejection
+ });
+ ```
+
+ Advanced Usage:
+ ---------------
+
+ Promises shine when abstracting away asynchronous interactions such as
+ `XMLHttpRequest`s.
+
+ ```js
+ function getJSON(url) {
+ return new Promise(function(resolve, reject){
+ let xhr = new XMLHttpRequest();
+
+ xhr.open('GET', url);
+ xhr.onreadystatechange = handler;
+ xhr.responseType = 'json';
+ xhr.setRequestHeader('Accept', 'application/json');
+ xhr.send();
+
+ function handler() {
+ if (this.readyState === this.DONE) {
+ if (this.status === 200) {
+ resolve(this.response);
+ } else {
+ reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
+ }
+ }
+ };
+ });
+ }
+
+ getJSON('/posts.json').then(function(json) {
+ // on fulfillment
+ }, function(reason) {
+ // on rejection
+ });
+ ```
+
+ Unlike callbacks, promises are great composable primitives.
+
+ ```js
+ Promise.all([
+ getJSON('/posts'),
+ getJSON('/comments')
+ ]).then(function(values){
+ values[0] // => postsJSON
+ values[1] // => commentsJSON
+
+ return values;
+ });
+ ```
+
+ @class Promise
+ @param {Function} resolver
+ Useful for tooling.
+ @constructor
+ */
+ var Promise$1 = function () {
+ function Promise(resolver) {
+ this[PROMISE_ID] = nextId();
+ this._result = this._state = undefined;
+ this._subscribers = [];
+ if (noop !== resolver) {
+ typeof resolver !== 'function' && needsResolver();
+ this instanceof Promise ? initializePromise(this, resolver) : needsNew();
+ }
+ }
+ /**
+ The primary way of interacting with a promise is through its `then` method,
+ which registers callbacks to receive either a promise's eventual value or the
+ reason why the promise cannot be fulfilled.
+ ```js
+ findUser().then(function(user){
+ // user is available
+ }, function(reason){
+ // user is unavailable, and you are given the reason why
+ });
+ ```
+ Chaining
+ --------
+ The return value of `then` is itself a promise. This second, 'downstream'
+ promise is resolved with the return value of the first promise's fulfillment
+ or rejection handler, or rejected if the handler throws an exception.
+ ```js
+ findUser().then(function (user) {
+ return user.name;
+ }, function (reason) {
+ return 'default name';
+ }).then(function (userName) {
+ // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
+ // will be `'default name'`
+ });
+ findUser().then(function (user) {
+ throw new Error('Found user, but still unhappy');
+ }, function (reason) {
+ throw new Error('`findUser` rejected and we're unhappy');
+ }).then(function (value) {
+ // never reached
+ }, function (reason) {
+ // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
+ // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
+ });
+ ```
+ If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
+ ```js
+ findUser().then(function (user) {
+ throw new PedagogicalException('Upstream error');
+ }).then(function (value) {
+ // never reached
+ }).then(function (value) {
+ // never reached
+ }, function (reason) {
+ // The `PedgagocialException` is propagated all the way down to here
+ });
+ ```
+ Assimilation
+ ------------
+ Sometimes the value you want to propagate to a downstream promise can only be
+ retrieved asynchronously. This can be achieved by returning a promise in the
+ fulfillment or rejection handler. The downstream promise will then be pending
+ until the returned promise is settled. This is called *assimilation*.
+ ```js
+ findUser().then(function (user) {
+ return findCommentsByAuthor(user);
+ }).then(function (comments) {
+ // The user's comments are now available
+ });
+ ```
+ If the assimliated promise rejects, then the downstream promise will also reject.
+ ```js
+ findUser().then(function (user) {
+ return findCommentsByAuthor(user);
+ }).then(function (comments) {
+ // If `findCommentsByAuthor` fulfills, we'll have the value here
+ }, function (reason) {
+ // If `findCommentsByAuthor` rejects, we'll have the reason here
+ });
+ ```
+ Simple Example
+ --------------
+ Synchronous Example
+ ```javascript
+ let result;
+ try {
+ result = findResult();
+ // success
+ } catch(reason) {
+ // failure
+ }
+ ```
+ Errback Example
+ ```js
+ findResult(function(result, err){
+ if (err) {
+ // failure
+ } else {
+ // success
+ }
+ });
+ ```
+ Promise Example;
+ ```javascript
+ findResult().then(function(result){
+ // success
+ }, function(reason){
+ // failure
+ });
+ ```
+ Advanced Example
+ --------------
+ Synchronous Example
+ ```javascript
+ let author, books;
+ try {
+ author = findAuthor();
+ books = findBooksByAuthor(author);
+ // success
+ } catch(reason) {
+ // failure
+ }
+ ```
+ Errback Example
+ ```js
+ function foundBooks(books) {
+ }
+ function failure(reason) {
+ }
+ findAuthor(function(author, err){
+ if (err) {
+ failure(err);
+ // failure
+ } else {
+ try {
+ findBoooksByAuthor(author, function(books, err) {
+ if (err) {
+ failure(err);
+ } else {
+ try {
+ foundBooks(books);
+ } catch(reason) {
+ failure(reason);
+ }
+ }
+ });
+ } catch(error) {
+ failure(err);
+ }
+ // success
+ }
+ });
+ ```
+ Promise Example;
+ ```javascript
+ findAuthor().
+ then(findBooksByAuthor).
+ then(function(books){
+ // found books
+ }).catch(function(reason){
+ // something went wrong
+ });
+ ```
+ @method then
+ @param {Function} onFulfilled
+ @param {Function} onRejected
+ Useful for tooling.
+ @return {Promise}
+ */
+ /**
+ `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
+ as the catch block of a try/catch statement.
+ ```js
+ function findAuthor(){
+ throw new Error('couldn't find that author');
+ }
+ // synchronous
+ try {
+ findAuthor();
+ } catch(reason) {
+ // something went wrong
+ }
+ // async with promises
+ findAuthor().catch(function(reason){
+ // something went wrong
+ });
+ ```
+ @method catch
+ @param {Function} onRejection
+ Useful for tooling.
+ @return {Promise}
+ */
+ Promise.prototype.catch = function _catch(onRejection) {
+ return this.then(null, onRejection);
+ };
+ /**
+ `finally` will be invoked regardless of the promise's fate just as native
+ try/catch/finally behaves
+
+ Synchronous example:
+
+ ```js
+ findAuthor() {
+ if (Math.random() > 0.5) {
+ throw new Error();
+ }
+ return new Author();
+ }
+
+ try {
+ return findAuthor(); // succeed or fail
+ } catch(error) {
+ return findOtherAuther();
+ } finally {
+ // always runs
+ // doesn't affect the return value
+ }
+ ```
+
+ Asynchronous example:
+
+ ```js
+ findAuthor().catch(function(reason){
+ return findOtherAuther();
+ }).finally(function(){
+ // author was either found, or not
+ });
+ ```
+
+ @method finally
+ @param {Function} callback
+ @return {Promise}
+ */
+ Promise.prototype.finally = function _finally(callback) {
+ var promise = this;
+ var constructor = promise.constructor;
+ if (isFunction(callback)) {
+ return promise.then(function (value) {
+ return constructor.resolve(callback()).then(function () {
+ return value;
+ });
+ }, function (reason) {
+ return constructor.resolve(callback()).then(function () {
+ throw reason;
+ });
+ });
+ }
+ return promise.then(callback, callback);
+ };
+ return Promise;
+ }();
+ Promise$1.prototype.then = then;
+ Promise$1.all = all;
+ Promise$1.race = race;
+ Promise$1.resolve = resolve$1;
+ Promise$1.reject = reject$1;
+ Promise$1._setScheduler = setScheduler;
+ Promise$1._setAsap = setAsap;
+ Promise$1._asap = asap;
+ /*global self*/
+ function polyfill() {
+ var local = void 0;
+ if (typeof __webpack_require__.g !== 'undefined') {
+ local = __webpack_require__.g;
+ }
+ else if (typeof self !== 'undefined') {
+ local = self;
+ }
+ else {
+ try {
+ local = Function('return this')();
+ }
+ catch (e) {
+ throw new Error('polyfill failed because global object is unavailable in this environment');
+ }
+ }
+ var P = local.Promise;
+ if (P) {
+ var promiseToString = null;
+ try {
+ promiseToString = Object.prototype.toString.call(P.resolve());
+ }
+ catch (e) {
+ // silently ignored
+ }
+ if (promiseToString === '[object Promise]' && !P.cast) {
+ return;
+ }
+ }
+ local.Promise = Promise$1;
+ }
+ // Strange compat..
+ Promise$1.polyfill = polyfill;
+ Promise$1.Promise = Promise$1;
+ return Promise$1;
+})));
+
+
+/***/ }),
+
+/***/ "./node_modules/events/events.js":
+/*!***************************************!*\
+ !*** ./node_modules/events/events.js ***!
+ \***************************************/
+/***/ (function(module) {
+
+"use strict";
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var R = typeof Reflect === 'object' ? Reflect : null;
+var ReflectApply = R && typeof R.apply === 'function'
+ ? R.apply
+ : function ReflectApply(target, receiver, args) {
+ return Function.prototype.apply.call(target, receiver, args);
+ };
+var ReflectOwnKeys;
+if (R && typeof R.ownKeys === 'function') {
+ ReflectOwnKeys = R.ownKeys;
+}
+else if (Object.getOwnPropertySymbols) {
+ ReflectOwnKeys = function ReflectOwnKeys(target) {
+ return Object.getOwnPropertyNames(target)
+ .concat(Object.getOwnPropertySymbols(target));
+ };
+}
+else {
+ ReflectOwnKeys = function ReflectOwnKeys(target) {
+ return Object.getOwnPropertyNames(target);
+ };
+}
+function ProcessEmitWarning(warning) {
+ if (console && console.warn)
+ console.warn(warning);
+}
+var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {
+ return value !== value;
+};
+function EventEmitter() {
+ EventEmitter.init.call(this);
+}
+module.exports = EventEmitter;
+module.exports.once = once;
+// Backwards-compat with node 0.10.x
+EventEmitter.EventEmitter = EventEmitter;
+EventEmitter.prototype._events = undefined;
+EventEmitter.prototype._eventsCount = 0;
+EventEmitter.prototype._maxListeners = undefined;
+// By default EventEmitters will print a warning if more than 10 listeners are
+// added to it. This is a useful default which helps finding memory leaks.
+var defaultMaxListeners = 10;
+function checkListener(listener) {
+ if (typeof listener !== 'function') {
+ throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
+ }
+}
+Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
+ enumerable: true,
+ get: function () {
+ return defaultMaxListeners;
+ },
+ set: function (arg) {
+ if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {
+ throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.');
+ }
+ defaultMaxListeners = arg;
+ }
+});
+EventEmitter.init = function () {
+ if (this._events === undefined ||
+ this._events === Object.getPrototypeOf(this)._events) {
+ this._events = Object.create(null);
+ this._eventsCount = 0;
+ }
+ this._maxListeners = this._maxListeners || undefined;
+};
+// Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
+ if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {
+ throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.');
+ }
+ this._maxListeners = n;
+ return this;
+};
+function _getMaxListeners(that) {
+ if (that._maxListeners === undefined)
+ return EventEmitter.defaultMaxListeners;
+ return that._maxListeners;
+}
+EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
+ return _getMaxListeners(this);
+};
+EventEmitter.prototype.emit = function emit(type) {
+ var args = [];
+ for (var i = 1; i < arguments.length; i++)
+ args.push(arguments[i]);
+ var doError = (type === 'error');
+ var events = this._events;
+ if (events !== undefined)
+ doError = (doError && events.error === undefined);
+ else if (!doError)
+ return false;
+ // If there is no 'error' event listener then throw.
+ if (doError) {
+ var er;
+ if (args.length > 0)
+ er = args[0];
+ if (er instanceof Error) {
+ // Note: The comments on the `throw` lines are intentional, they show
+ // up in Node's output if this results in an unhandled exception.
+ throw er; // Unhandled 'error' event
+ }
+ // At least give some kind of context to the user
+ var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));
+ err.context = er;
+ throw err; // Unhandled 'error' event
+ }
+ var handler = events[type];
+ if (handler === undefined)
+ return false;
+ if (typeof handler === 'function') {
+ ReflectApply(handler, this, args);
+ }
+ else {
+ var len = handler.length;
+ var listeners = arrayClone(handler, len);
+ for (var i = 0; i < len; ++i)
+ ReflectApply(listeners[i], this, args);
+ }
+ return true;
+};
+function _addListener(target, type, listener, prepend) {
+ var m;
+ var events;
+ var existing;
+ checkListener(listener);
+ events = target._events;
+ if (events === undefined) {
+ events = target._events = Object.create(null);
+ target._eventsCount = 0;
+ }
+ else {
+ // To avoid recursion in the case that type === "newListener"! Before
+ // adding it to the listeners, first emit "newListener".
+ if (events.newListener !== undefined) {
+ target.emit('newListener', type, listener.listener ? listener.listener : listener);
+ // Re-assign `events` because a newListener handler could have caused the
+ // this._events to be assigned to a new object
+ events = target._events;
+ }
+ existing = events[type];
+ }
+ if (existing === undefined) {
+ // Optimize the case of one listener. Don't need the extra array object.
+ existing = events[type] = listener;
+ ++target._eventsCount;
+ }
+ else {
+ if (typeof existing === 'function') {
+ // Adding the second element, need to change to array.
+ existing = events[type] =
+ prepend ? [listener, existing] : [existing, listener];
+ // If we've already got an array, just append.
+ }
+ else if (prepend) {
+ existing.unshift(listener);
+ }
+ else {
+ existing.push(listener);
+ }
+ // Check for listener leak
+ m = _getMaxListeners(target);
+ if (m > 0 && existing.length > m && !existing.warned) {
+ existing.warned = true;
+ // No error code for this since it is a Warning
+ // eslint-disable-next-line no-restricted-syntax
+ var w = new Error('Possible EventEmitter memory leak detected. ' +
+ existing.length + ' ' + String(type) + ' listeners ' +
+ 'added. Use emitter.setMaxListeners() to ' +
+ 'increase limit');
+ w.name = 'MaxListenersExceededWarning';
+ w.emitter = target;
+ w.type = type;
+ w.count = existing.length;
+ ProcessEmitWarning(w);
+ }
+ }
+ return target;
+}
+EventEmitter.prototype.addListener = function addListener(type, listener) {
+ return _addListener(this, type, listener, false);
+};
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+EventEmitter.prototype.prependListener =
+ function prependListener(type, listener) {
+ return _addListener(this, type, listener, true);
+ };
+function onceWrapper() {
+ if (!this.fired) {
+ this.target.removeListener(this.type, this.wrapFn);
+ this.fired = true;
+ if (arguments.length === 0)
+ return this.listener.call(this.target);
+ return this.listener.apply(this.target, arguments);
+ }
+}
+function _onceWrap(target, type, listener) {
+ var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };
+ var wrapped = onceWrapper.bind(state);
+ wrapped.listener = listener;
+ state.wrapFn = wrapped;
+ return wrapped;
+}
+EventEmitter.prototype.once = function once(type, listener) {
+ checkListener(listener);
+ this.on(type, _onceWrap(this, type, listener));
+ return this;
+};
+EventEmitter.prototype.prependOnceListener =
+ function prependOnceListener(type, listener) {
+ checkListener(listener);
+ this.prependListener(type, _onceWrap(this, type, listener));
+ return this;
+ };
+// Emits a 'removeListener' event if and only if the listener was removed.
+EventEmitter.prototype.removeListener =
+ function removeListener(type, listener) {
+ var list, events, position, i, originalListener;
+ checkListener(listener);
+ events = this._events;
+ if (events === undefined)
+ return this;
+ list = events[type];
+ if (list === undefined)
+ return this;
+ if (list === listener || list.listener === listener) {
+ if (--this._eventsCount === 0)
+ this._events = Object.create(null);
+ else {
+ delete events[type];
+ if (events.removeListener)
+ this.emit('removeListener', type, list.listener || listener);
+ }
+ }
+ else if (typeof list !== 'function') {
+ position = -1;
+ for (i = list.length - 1; i >= 0; i--) {
+ if (list[i] === listener || list[i].listener === listener) {
+ originalListener = list[i].listener;
+ position = i;
+ break;
+ }
+ }
+ if (position < 0)
+ return this;
+ if (position === 0)
+ list.shift();
+ else {
+ spliceOne(list, position);
+ }
+ if (list.length === 1)
+ events[type] = list[0];
+ if (events.removeListener !== undefined)
+ this.emit('removeListener', type, originalListener || listener);
+ }
+ return this;
+ };
+EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
+EventEmitter.prototype.removeAllListeners =
+ function removeAllListeners(type) {
+ var listeners, events, i;
+ events = this._events;
+ if (events === undefined)
+ return this;
+ // not listening for removeListener, no need to emit
+ if (events.removeListener === undefined) {
+ if (arguments.length === 0) {
+ this._events = Object.create(null);
+ this._eventsCount = 0;
+ }
+ else if (events[type] !== undefined) {
+ if (--this._eventsCount === 0)
+ this._events = Object.create(null);
+ else
+ delete events[type];
+ }
+ return this;
+ }
+ // emit removeListener for all listeners on all events
+ if (arguments.length === 0) {
+ var keys = Object.keys(events);
+ var key;
+ for (i = 0; i < keys.length; ++i) {
+ key = keys[i];
+ if (key === 'removeListener')
+ continue;
+ this.removeAllListeners(key);
+ }
+ this.removeAllListeners('removeListener');
+ this._events = Object.create(null);
+ this._eventsCount = 0;
+ return this;
+ }
+ listeners = events[type];
+ if (typeof listeners === 'function') {
+ this.removeListener(type, listeners);
+ }
+ else if (listeners !== undefined) {
+ // LIFO order
+ for (i = listeners.length - 1; i >= 0; i--) {
+ this.removeListener(type, listeners[i]);
+ }
+ }
+ return this;
+ };
+function _listeners(target, type, unwrap) {
+ var events = target._events;
+ if (events === undefined)
+ return [];
+ var evlistener = events[type];
+ if (evlistener === undefined)
+ return [];
+ if (typeof evlistener === 'function')
+ return unwrap ? [evlistener.listener || evlistener] : [evlistener];
+ return unwrap ?
+ unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
+}
+EventEmitter.prototype.listeners = function listeners(type) {
+ return _listeners(this, type, true);
+};
+EventEmitter.prototype.rawListeners = function rawListeners(type) {
+ return _listeners(this, type, false);
+};
+EventEmitter.listenerCount = function (emitter, type) {
+ if (typeof emitter.listenerCount === 'function') {
+ return emitter.listenerCount(type);
+ }
+ else {
+ return listenerCount.call(emitter, type);
+ }
+};
+EventEmitter.prototype.listenerCount = listenerCount;
+function listenerCount(type) {
+ var events = this._events;
+ if (events !== undefined) {
+ var evlistener = events[type];
+ if (typeof evlistener === 'function') {
+ return 1;
+ }
+ else if (evlistener !== undefined) {
+ return evlistener.length;
+ }
+ }
+ return 0;
+}
+EventEmitter.prototype.eventNames = function eventNames() {
+ return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
+};
+function arrayClone(arr, n) {
+ var copy = new Array(n);
+ for (var i = 0; i < n; ++i)
+ copy[i] = arr[i];
+ return copy;
+}
+function spliceOne(list, index) {
+ for (; index + 1 < list.length; index++)
+ list[index] = list[index + 1];
+ list.pop();
+}
+function unwrapListeners(arr) {
+ var ret = new Array(arr.length);
+ for (var i = 0; i < ret.length; ++i) {
+ ret[i] = arr[i].listener || arr[i];
+ }
+ return ret;
+}
+function once(emitter, name) {
+ return new Promise(function (resolve, reject) {
+ function errorListener(err) {
+ emitter.removeListener(name, resolver);
+ reject(err);
+ }
+ function resolver() {
+ if (typeof emitter.removeListener === 'function') {
+ emitter.removeListener('error', errorListener);
+ }
+ resolve([].slice.call(arguments));
+ }
+ ;
+ eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
+ if (name !== 'error') {
+ addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });
+ }
+ });
+}
+function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
+ if (typeof emitter.on === 'function') {
+ eventTargetAgnosticAddListener(emitter, 'error', handler, flags);
+ }
+}
+function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
+ if (typeof emitter.on === 'function') {
+ if (flags.once) {
+ emitter.once(name, listener);
+ }
+ else {
+ emitter.on(name, listener);
+ }
+ }
+ else if (typeof emitter.addEventListener === 'function') {
+ // EventTarget does not have `error` event semantics like Node
+ // EventEmitters, we do not listen for `error` events here.
+ emitter.addEventListener(name, function wrapListener(arg) {
+ // IE does not have builtin `{ once: true }` support so we
+ // have to do it manually.
+ if (flags.once) {
+ emitter.removeEventListener(name, wrapListener);
+ }
+ listener(arg);
+ });
+ }
+ else {
+ throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
+ }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/webworkify-webpack/index.js":
+/*!**************************************************!*\
+ !*** ./node_modules/webworkify-webpack/index.js ***!
+ \**************************************************/
+/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
+
+function webpackBootstrapFunc(modules) {
+ /******/ // The module cache
+ /******/ var installedModules = {};
+ /******/ // The require function
+ /******/ function __nested_webpack_require_168__(moduleId) {
+ /******/ // Check if module is in cache
+ /******/ if (installedModules[moduleId])
+ /******/ return installedModules[moduleId].exports;
+ /******/ // Create a new module (and put it into the cache)
+ /******/ var module = installedModules[moduleId] = {
+ /******/ i: moduleId,
+ /******/ l: false,
+ /******/ exports: {}
+ /******/
+ };
+ /******/ // Execute the module function
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_168__);
+ /******/ // Flag the module as loaded
+ /******/ module.l = true;
+ /******/ // Return the exports of the module
+ /******/ return module.exports;
+ /******/
+ }
+ /******/ // expose the modules object (__webpack_modules__)
+ /******/ __nested_webpack_require_168__.m = modules;
+ /******/ // expose the module cache
+ /******/ __nested_webpack_require_168__.c = installedModules;
+ /******/ // identity function for calling harmony imports with the correct context
+ /******/ __nested_webpack_require_168__.i = function (value) { return value; };
+ /******/ // define getter function for harmony exports
+ /******/ __nested_webpack_require_168__.d = function (exports, name, getter) {
+ /******/ if (!__nested_webpack_require_168__.o(exports, name)) {
+ /******/ Object.defineProperty(exports, name, {
+ /******/ configurable: false,
+ /******/ enumerable: true,
+ /******/ get: getter
+ /******/
+ });
+ /******/ }
+ /******/
+ };
+ /******/ // define __esModule on exports
+ /******/ __nested_webpack_require_168__.r = function (exports) {
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
+ /******/
+ };
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
+ /******/ __nested_webpack_require_168__.n = function (module) {
+ /******/ var getter = module && module.__esModule ?
+ /******/ function getDefault() { return module['default']; } :
+ /******/ function getModuleExports() { return module; };
+ /******/ __nested_webpack_require_168__.d(getter, 'a', getter);
+ /******/ return getter;
+ /******/
+ };
+ /******/ // Object.prototype.hasOwnProperty.call
+ /******/ __nested_webpack_require_168__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+ /******/ // __webpack_public_path__
+ /******/ __nested_webpack_require_168__.p = "/";
+ /******/ // on error function for async loading
+ /******/ __nested_webpack_require_168__.oe = function (err) { console.error(err); throw err; };
+ var f = __nested_webpack_require_168__(__nested_webpack_require_168__.s = ENTRY_MODULE);
+ return f.default || f; // try to call default if defined to also support babel esmodule exports
+}
+var moduleNameReqExp = '[\\.|\\-|\\+|\\w|\/|@]+';
+var dependencyRegExp = '\\(\\s*(\/\\*.*?\\*\/)?\\s*.*?(' + moduleNameReqExp + ').*?\\)'; // additional chars when output.pathinfo is true
+// http://stackoverflow.com/a/2593661/130442
+function quoteRegExp(str) {
+ return (str + '').replace(/[.?*+^$[\]\\(){}|-]/g, '\\$&');
+}
+function isNumeric(n) {
+ return !isNaN(1 * n); // 1 * n converts integers, integers as string ("123"), 1e3 and "1e3" to integers and strings to NaN
+}
+function getModuleDependencies(sources, module, queueName) {
+ var retval = {};
+ retval[queueName] = [];
+ var fnString = module.toString();
+ var wrapperSignature = fnString.match(/^function\s?\w*\(\w+,\s*\w+,\s*(\w+)\)/);
+ if (!wrapperSignature)
+ return retval;
+ var webpackRequireName = wrapperSignature[1];
+ // main bundle deps
+ var re = new RegExp('(\\\\n|\\W)' + quoteRegExp(webpackRequireName) + dependencyRegExp, 'g');
+ var match;
+ while ((match = re.exec(fnString))) {
+ if (match[3] === 'dll-reference')
+ continue;
+ retval[queueName].push(match[3]);
+ }
+ // dll deps
+ re = new RegExp('\\(' + quoteRegExp(webpackRequireName) + '\\("(dll-reference\\s(' + moduleNameReqExp + '))"\\)\\)' + dependencyRegExp, 'g');
+ while ((match = re.exec(fnString))) {
+ if (!sources[match[2]]) {
+ retval[queueName].push(match[1]);
+ sources[match[2]] = __webpack_require__(match[1]).m;
+ }
+ retval[match[2]] = retval[match[2]] || [];
+ retval[match[2]].push(match[4]);
+ }
+ // convert 1e3 back to 1000 - this can be important after uglify-js converted 1000 to 1e3
+ var keys = Object.keys(retval);
+ for (var i = 0; i < keys.length; i++) {
+ for (var j = 0; j < retval[keys[i]].length; j++) {
+ if (isNumeric(retval[keys[i]][j])) {
+ retval[keys[i]][j] = 1 * retval[keys[i]][j];
+ }
+ }
+ }
+ return retval;
+}
+function hasValuesInQueues(queues) {
+ var keys = Object.keys(queues);
+ return keys.reduce(function (hasValues, key) {
+ return hasValues || queues[key].length > 0;
+ }, false);
+}
+function getRequiredModules(sources, moduleId) {
+ var modulesQueue = {
+ main: [moduleId]
+ };
+ var requiredModules = {
+ main: []
+ };
+ var seenModules = {
+ main: {}
+ };
+ while (hasValuesInQueues(modulesQueue)) {
+ var queues = Object.keys(modulesQueue);
+ for (var i = 0; i < queues.length; i++) {
+ var queueName = queues[i];
+ var queue = modulesQueue[queueName];
+ var moduleToCheck = queue.pop();
+ seenModules[queueName] = seenModules[queueName] || {};
+ if (seenModules[queueName][moduleToCheck] || !sources[queueName][moduleToCheck])
+ continue;
+ seenModules[queueName][moduleToCheck] = true;
+ requiredModules[queueName] = requiredModules[queueName] || [];
+ requiredModules[queueName].push(moduleToCheck);
+ var newModules = getModuleDependencies(sources, sources[queueName][moduleToCheck], queueName);
+ var newModulesKeys = Object.keys(newModules);
+ for (var j = 0; j < newModulesKeys.length; j++) {
+ modulesQueue[newModulesKeys[j]] = modulesQueue[newModulesKeys[j]] || [];
+ modulesQueue[newModulesKeys[j]] = modulesQueue[newModulesKeys[j]].concat(newModules[newModulesKeys[j]]);
+ }
+ }
+ }
+ return requiredModules;
+}
+module.exports = function (moduleId, options) {
+ options = options || {};
+ var sources = {
+ main: __webpack_require__.m
+ };
+ var requiredModules = options.all ? { main: Object.keys(sources.main) } : getRequiredModules(sources, moduleId);
+ var src = '';
+ Object.keys(requiredModules).filter(function (m) { return m !== 'main'; }).forEach(function (module) {
+ var entryModule = 0;
+ while (requiredModules[module][entryModule]) {
+ entryModule++;
+ }
+ requiredModules[module].push(entryModule);
+ sources[module][entryModule] = '(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })';
+ src = src + 'var ' + module + ' = (' + webpackBootstrapFunc.toString().replace('ENTRY_MODULE', JSON.stringify(entryModule)) + ')({' + requiredModules[module].map(function (id) { return '' + JSON.stringify(id) + ': ' + sources[module][id].toString(); }).join(',') + '});\n';
+ });
+ src = src + 'new ((' + webpackBootstrapFunc.toString().replace('ENTRY_MODULE', JSON.stringify(moduleId)) + ')({' + requiredModules.main.map(function (id) { return '' + JSON.stringify(id) + ': ' + sources.main[id].toString(); }).join(',') + '}))(self);';
+ var blob = new window.Blob([src], { type: 'text/javascript' });
+ if (options.bare) {
+ return blob;
+ }
+ var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;
+ var workerUrl = URL.createObjectURL(blob);
+ var worker = new window.Worker(workerUrl);
+ worker.objectURL = workerUrl;
+ return worker;
+};
+
+
+/***/ }),
+
+/***/ "./src/config.js":
+/*!***********************!*\
+ !*** ./src/config.js ***!
+ \***********************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "defaultConfig": function() { return /* binding */ defaultConfig; },
+/* harmony export */ "createDefaultConfig": function() { return /* binding */ createDefaultConfig; }
+/* harmony export */ });
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var defaultConfig = {
+ enableWorker: false,
+ enableStashBuffer: true,
+ stashInitialSize: undefined,
+ isLive: false,
+ lazyLoad: true,
+ lazyLoadMaxDuration: 3 * 60,
+ lazyLoadRecoverDuration: 30,
+ deferLoadAfterSourceOpen: true,
+ // autoCleanupSourceBuffer: default as false, leave unspecified
+ autoCleanupMaxBackwardDuration: 3 * 60,
+ autoCleanupMinBackwardDuration: 2 * 60,
+ statisticsInfoReportInterval: 600,
+ fixAudioTimestampGap: true,
+ accurateSeek: false,
+ seekType: 'range',
+ seekParamStart: 'bstart',
+ seekParamEnd: 'bend',
+ rangeLoadZeroStart: false,
+ customSeekHandler: undefined,
+ reuseRedirectedURL: false,
+ // referrerPolicy: leave as unspecified
+ headers: undefined,
+ customLoader: undefined
+};
+function createDefaultConfig() {
+ return Object.assign({}, defaultConfig);
+}
+
+
+/***/ }),
+
+/***/ "./src/core/features.js":
+/*!******************************!*\
+ !*** ./src/core/features.js ***!
+ \******************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _io_io_controller_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../io/io-controller.js */ "./src/io/io-controller.js");
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+var Features = /** @class */ (function () {
+ function Features() {
+ }
+ Features.supportMSEH264Playback = function () {
+ return window.MediaSource &&
+ window.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"');
+ };
+ Features.supportNetworkStreamIO = function () {
+ var ioctl = new _io_io_controller_js__WEBPACK_IMPORTED_MODULE_0__.default({}, (0,_config_js__WEBPACK_IMPORTED_MODULE_1__.createDefaultConfig)());
+ var loaderType = ioctl.loaderType;
+ ioctl.destroy();
+ return loaderType == 'fetch-stream-loader' || loaderType == 'xhr-moz-chunked-loader';
+ };
+ Features.getNetworkLoaderTypeName = function () {
+ var ioctl = new _io_io_controller_js__WEBPACK_IMPORTED_MODULE_0__.default({}, (0,_config_js__WEBPACK_IMPORTED_MODULE_1__.createDefaultConfig)());
+ var loaderType = ioctl.loaderType;
+ ioctl.destroy();
+ return loaderType;
+ };
+ Features.supportNativeMediaPlayback = function (mimeType) {
+ if (Features.videoElement == undefined) {
+ Features.videoElement = window.document.createElement('video');
+ }
+ var canPlay = Features.videoElement.canPlayType(mimeType);
+ return canPlay === 'probably' || canPlay == 'maybe';
+ };
+ Features.getFeatureList = function () {
+ var features = {
+ mseFlvPlayback: false,
+ mseLiveFlvPlayback: false,
+ networkStreamIO: false,
+ networkLoaderName: '',
+ nativeMP4H264Playback: false,
+ nativeMP4H265Playback: false,
+ nativeWebmVP8Playback: false,
+ nativeWebmVP9Playback: false
+ };
+ features.mseFlvPlayback = Features.supportMSEH264Playback();
+ features.networkStreamIO = Features.supportNetworkStreamIO();
+ features.networkLoaderName = Features.getNetworkLoaderTypeName();
+ features.mseLiveFlvPlayback = features.mseFlvPlayback && features.networkStreamIO;
+ features.nativeMP4H264Playback = Features.supportNativeMediaPlayback('video/mp4; codecs="avc1.42001E, mp4a.40.2"');
+ features.nativeMP4H265Playback = Features.supportNativeMediaPlayback('video/mp4; codecs="hvc1.1.6.L93.B0"');
+ features.nativeWebmVP8Playback = Features.supportNativeMediaPlayback('video/webm; codecs="vp8.0, vorbis"');
+ features.nativeWebmVP9Playback = Features.supportNativeMediaPlayback('video/webm; codecs="vp9"');
+ return features;
+ };
+ return Features;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (Features);
+
+
+/***/ }),
+
+/***/ "./src/core/media-info.js":
+/*!********************************!*\
+ !*** ./src/core/media-info.js ***!
+ \********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var MediaInfo = /** @class */ (function () {
+ function MediaInfo() {
+ this.mimeType = null;
+ this.duration = null;
+ this.hasAudio = null;
+ this.hasVideo = null;
+ this.audioCodec = null;
+ this.videoCodec = null;
+ this.audioDataRate = null;
+ this.videoDataRate = null;
+ this.audioSampleRate = null;
+ this.audioChannelCount = null;
+ this.width = null;
+ this.height = null;
+ this.fps = null;
+ this.profile = null;
+ this.level = null;
+ this.refFrames = null;
+ this.chromaFormat = null;
+ this.sarNum = null;
+ this.sarDen = null;
+ this.metadata = null;
+ this.segments = null; // MediaInfo[]
+ this.segmentCount = null;
+ this.hasKeyframesIndex = null;
+ this.keyframesIndex = null;
+ }
+ MediaInfo.prototype.isComplete = function () {
+ var audioInfoComplete = (this.hasAudio === false) ||
+ (this.hasAudio === true &&
+ this.audioCodec != null &&
+ this.audioSampleRate != null &&
+ this.audioChannelCount != null);
+ var videoInfoComplete = (this.hasVideo === false) ||
+ (this.hasVideo === true &&
+ this.videoCodec != null &&
+ this.width != null &&
+ this.height != null &&
+ this.fps != null &&
+ this.profile != null &&
+ this.level != null &&
+ this.refFrames != null &&
+ this.chromaFormat != null &&
+ this.sarNum != null &&
+ this.sarDen != null);
+ // keyframesIndex may not be present
+ return this.mimeType != null &&
+ this.duration != null &&
+ this.metadata != null &&
+ this.hasKeyframesIndex != null &&
+ audioInfoComplete &&
+ videoInfoComplete;
+ };
+ MediaInfo.prototype.isSeekable = function () {
+ return this.hasKeyframesIndex === true;
+ };
+ MediaInfo.prototype.getNearestKeyframe = function (milliseconds) {
+ if (this.keyframesIndex == null) {
+ return null;
+ }
+ var table = this.keyframesIndex;
+ var keyframeIdx = this._search(table.times, milliseconds);
+ return {
+ index: keyframeIdx,
+ milliseconds: table.times[keyframeIdx],
+ fileposition: table.filepositions[keyframeIdx]
+ };
+ };
+ MediaInfo.prototype._search = function (list, value) {
+ var idx = 0;
+ var last = list.length - 1;
+ var mid = 0;
+ var lbound = 0;
+ var ubound = last;
+ if (value < list[0]) {
+ idx = 0;
+ lbound = ubound + 1; // skip search
+ }
+ while (lbound <= ubound) {
+ mid = lbound + Math.floor((ubound - lbound) / 2);
+ if (mid === last || (value >= list[mid] && value < list[mid + 1])) {
+ idx = mid;
+ break;
+ }
+ else if (list[mid] < value) {
+ lbound = mid + 1;
+ }
+ else {
+ ubound = mid - 1;
+ }
+ }
+ return idx;
+ };
+ return MediaInfo;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (MediaInfo);
+
+
+/***/ }),
+
+/***/ "./src/core/media-segment-info.js":
+/*!****************************************!*\
+ !*** ./src/core/media-segment-info.js ***!
+ \****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "SampleInfo": function() { return /* binding */ SampleInfo; },
+/* harmony export */ "MediaSegmentInfo": function() { return /* binding */ MediaSegmentInfo; },
+/* harmony export */ "IDRSampleList": function() { return /* binding */ IDRSampleList; },
+/* harmony export */ "MediaSegmentInfoList": function() { return /* binding */ MediaSegmentInfoList; }
+/* harmony export */ });
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// Represents an media sample (audio / video)
+var SampleInfo = /** @class */ (function () {
+ function SampleInfo(dts, pts, duration, originalDts, isSync) {
+ this.dts = dts;
+ this.pts = pts;
+ this.duration = duration;
+ this.originalDts = originalDts;
+ this.isSyncPoint = isSync;
+ this.fileposition = null;
+ }
+ return SampleInfo;
+}());
+
+// Media Segment concept is defined in Media Source Extensions spec.
+// Particularly in ISO BMFF format, an Media Segment contains a moof box followed by a mdat box.
+var MediaSegmentInfo = /** @class */ (function () {
+ function MediaSegmentInfo() {
+ this.beginDts = 0;
+ this.endDts = 0;
+ this.beginPts = 0;
+ this.endPts = 0;
+ this.originalBeginDts = 0;
+ this.originalEndDts = 0;
+ this.syncPoints = []; // SampleInfo[n], for video IDR frames only
+ this.firstSample = null; // SampleInfo
+ this.lastSample = null; // SampleInfo
+ }
+ MediaSegmentInfo.prototype.appendSyncPoint = function (sampleInfo) {
+ sampleInfo.isSyncPoint = true;
+ this.syncPoints.push(sampleInfo);
+ };
+ return MediaSegmentInfo;
+}());
+
+// Ordered list for recording video IDR frames, sorted by originalDts
+var IDRSampleList = /** @class */ (function () {
+ function IDRSampleList() {
+ this._list = [];
+ }
+ IDRSampleList.prototype.clear = function () {
+ this._list = [];
+ };
+ IDRSampleList.prototype.appendArray = function (syncPoints) {
+ var list = this._list;
+ if (syncPoints.length === 0) {
+ return;
+ }
+ if (list.length > 0 && syncPoints[0].originalDts < list[list.length - 1].originalDts) {
+ this.clear();
+ }
+ Array.prototype.push.apply(list, syncPoints);
+ };
+ IDRSampleList.prototype.getLastSyncPointBeforeDts = function (dts) {
+ if (this._list.length == 0) {
+ return null;
+ }
+ var list = this._list;
+ var idx = 0;
+ var last = list.length - 1;
+ var mid = 0;
+ var lbound = 0;
+ var ubound = last;
+ if (dts < list[0].dts) {
+ idx = 0;
+ lbound = ubound + 1;
+ }
+ while (lbound <= ubound) {
+ mid = lbound + Math.floor((ubound - lbound) / 2);
+ if (mid === last || (dts >= list[mid].dts && dts < list[mid + 1].dts)) {
+ idx = mid;
+ break;
+ }
+ else if (list[mid].dts < dts) {
+ lbound = mid + 1;
+ }
+ else {
+ ubound = mid - 1;
+ }
+ }
+ return this._list[idx];
+ };
+ return IDRSampleList;
+}());
+
+// Data structure for recording information of media segments in single track.
+var MediaSegmentInfoList = /** @class */ (function () {
+ function MediaSegmentInfoList(type) {
+ this._type = type;
+ this._list = [];
+ this._lastAppendLocation = -1; // cached last insert location
+ }
+ Object.defineProperty(MediaSegmentInfoList.prototype, "type", {
+ get: function () {
+ return this._type;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(MediaSegmentInfoList.prototype, "length", {
+ get: function () {
+ return this._list.length;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ MediaSegmentInfoList.prototype.isEmpty = function () {
+ return this._list.length === 0;
+ };
+ MediaSegmentInfoList.prototype.clear = function () {
+ this._list = [];
+ this._lastAppendLocation = -1;
+ };
+ MediaSegmentInfoList.prototype._searchNearestSegmentBefore = function (originalBeginDts) {
+ var list = this._list;
+ if (list.length === 0) {
+ return -2;
+ }
+ var last = list.length - 1;
+ var mid = 0;
+ var lbound = 0;
+ var ubound = last;
+ var idx = 0;
+ if (originalBeginDts < list[0].originalBeginDts) {
+ idx = -1;
+ return idx;
+ }
+ while (lbound <= ubound) {
+ mid = lbound + Math.floor((ubound - lbound) / 2);
+ if (mid === last || (originalBeginDts > list[mid].lastSample.originalDts &&
+ (originalBeginDts < list[mid + 1].originalBeginDts))) {
+ idx = mid;
+ break;
+ }
+ else if (list[mid].originalBeginDts < originalBeginDts) {
+ lbound = mid + 1;
+ }
+ else {
+ ubound = mid - 1;
+ }
+ }
+ return idx;
+ };
+ MediaSegmentInfoList.prototype._searchNearestSegmentAfter = function (originalBeginDts) {
+ return this._searchNearestSegmentBefore(originalBeginDts) + 1;
+ };
+ MediaSegmentInfoList.prototype.append = function (mediaSegmentInfo) {
+ var list = this._list;
+ var msi = mediaSegmentInfo;
+ var lastAppendIdx = this._lastAppendLocation;
+ var insertIdx = 0;
+ if (lastAppendIdx !== -1 && lastAppendIdx < list.length &&
+ msi.originalBeginDts >= list[lastAppendIdx].lastSample.originalDts &&
+ ((lastAppendIdx === list.length - 1) ||
+ (lastAppendIdx < list.length - 1 &&
+ msi.originalBeginDts < list[lastAppendIdx + 1].originalBeginDts))) {
+ insertIdx = lastAppendIdx + 1; // use cached location idx
+ }
+ else {
+ if (list.length > 0) {
+ insertIdx = this._searchNearestSegmentBefore(msi.originalBeginDts) + 1;
+ }
+ }
+ this._lastAppendLocation = insertIdx;
+ this._list.splice(insertIdx, 0, msi);
+ };
+ MediaSegmentInfoList.prototype.getLastSegmentBefore = function (originalBeginDts) {
+ var idx = this._searchNearestSegmentBefore(originalBeginDts);
+ if (idx >= 0) {
+ return this._list[idx];
+ }
+ else { // -1
+ return null;
+ }
+ };
+ MediaSegmentInfoList.prototype.getLastSampleBefore = function (originalBeginDts) {
+ var segment = this.getLastSegmentBefore(originalBeginDts);
+ if (segment != null) {
+ return segment.lastSample;
+ }
+ else {
+ return null;
+ }
+ };
+ MediaSegmentInfoList.prototype.getLastSyncPointBefore = function (originalBeginDts) {
+ var segmentIdx = this._searchNearestSegmentBefore(originalBeginDts);
+ var syncPoints = this._list[segmentIdx].syncPoints;
+ while (syncPoints.length === 0 && segmentIdx > 0) {
+ segmentIdx--;
+ syncPoints = this._list[segmentIdx].syncPoints;
+ }
+ if (syncPoints.length > 0) {
+ return syncPoints[syncPoints.length - 1];
+ }
+ else {
+ return null;
+ }
+ };
+ return MediaSegmentInfoList;
+}());
+
+
+
+/***/ }),
+
+/***/ "./src/core/mse-controller.js":
+/*!************************************!*\
+ !*** ./src/core/mse-controller.js ***!
+ \************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! events */ "./node_modules/events/events.js");
+/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js");
+/* harmony import */ var _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/browser.js */ "./src/utils/browser.js");
+/* harmony import */ var _mse_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mse-events.js */ "./src/core/mse-events.js");
+/* harmony import */ var _media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./media-segment-info.js */ "./src/core/media-segment-info.js");
+/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+// Media Source Extensions controller
+var MSEController = /** @class */ (function () {
+ function MSEController(config) {
+ this.TAG = 'MSEController';
+ this._config = config;
+ this._emitter = new (events__WEBPACK_IMPORTED_MODULE_0___default())();
+ if (this._config.isLive && this._config.autoCleanupSourceBuffer == undefined) {
+ // For live stream, do auto cleanup by default
+ this._config.autoCleanupSourceBuffer = true;
+ }
+ this.e = {
+ onSourceOpen: this._onSourceOpen.bind(this),
+ onSourceEnded: this._onSourceEnded.bind(this),
+ onSourceClose: this._onSourceClose.bind(this),
+ onSourceBufferError: this._onSourceBufferError.bind(this),
+ onSourceBufferUpdateEnd: this._onSourceBufferUpdateEnd.bind(this)
+ };
+ this._mediaSource = null;
+ this._mediaSourceObjectURL = null;
+ this._mediaElement = null;
+ this._isBufferFull = false;
+ this._hasPendingEos = false;
+ this._requireSetMediaDuration = false;
+ this._pendingMediaDuration = 0;
+ this._pendingSourceBufferInit = [];
+ this._mimeTypes = {
+ video: null,
+ audio: null
+ };
+ this._sourceBuffers = {
+ video: null,
+ audio: null
+ };
+ this._lastInitSegments = {
+ video: null,
+ audio: null
+ };
+ this._pendingSegments = {
+ video: [],
+ audio: []
+ };
+ this._pendingRemoveRanges = {
+ video: [],
+ audio: []
+ };
+ this._idrList = new _media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.IDRSampleList();
+ }
+ MSEController.prototype.destroy = function () {
+ if (this._mediaElement || this._mediaSource) {
+ this.detachMediaElement();
+ }
+ this.e = null;
+ this._emitter.removeAllListeners();
+ this._emitter = null;
+ };
+ MSEController.prototype.on = function (event, listener) {
+ this._emitter.addListener(event, listener);
+ };
+ MSEController.prototype.off = function (event, listener) {
+ this._emitter.removeListener(event, listener);
+ };
+ MSEController.prototype.attachMediaElement = function (mediaElement) {
+ if (this._mediaSource) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_5__.IllegalStateException('MediaSource has been attached to an HTMLMediaElement!');
+ }
+ var ms = this._mediaSource = new window.MediaSource();
+ ms.addEventListener('sourceopen', this.e.onSourceOpen);
+ ms.addEventListener('sourceended', this.e.onSourceEnded);
+ ms.addEventListener('sourceclose', this.e.onSourceClose);
+ this._mediaElement = mediaElement;
+ this._mediaSourceObjectURL = window.URL.createObjectURL(this._mediaSource);
+ mediaElement.src = this._mediaSourceObjectURL;
+ };
+ MSEController.prototype.detachMediaElement = function () {
+ if (this._mediaSource) {
+ var ms = this._mediaSource;
+ for (var type in this._sourceBuffers) {
+ // pending segments should be discard
+ var ps = this._pendingSegments[type];
+ ps.splice(0, ps.length);
+ this._pendingSegments[type] = null;
+ this._pendingRemoveRanges[type] = null;
+ this._lastInitSegments[type] = null;
+ // remove all sourcebuffers
+ var sb = this._sourceBuffers[type];
+ if (sb) {
+ if (ms.readyState !== 'closed') {
+ // ms edge can throw an error: Unexpected call to method or property access
+ try {
+ ms.removeSourceBuffer(sb);
+ }
+ catch (error) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, error.message);
+ }
+ sb.removeEventListener('error', this.e.onSourceBufferError);
+ sb.removeEventListener('updateend', this.e.onSourceBufferUpdateEnd);
+ }
+ this._mimeTypes[type] = null;
+ this._sourceBuffers[type] = null;
+ }
+ }
+ if (ms.readyState === 'open') {
+ try {
+ ms.endOfStream();
+ }
+ catch (error) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, error.message);
+ }
+ }
+ ms.removeEventListener('sourceopen', this.e.onSourceOpen);
+ ms.removeEventListener('sourceended', this.e.onSourceEnded);
+ ms.removeEventListener('sourceclose', this.e.onSourceClose);
+ this._pendingSourceBufferInit = [];
+ this._isBufferFull = false;
+ this._idrList.clear();
+ this._mediaSource = null;
+ }
+ if (this._mediaElement) {
+ this._mediaElement.src = '';
+ this._mediaElement.removeAttribute('src');
+ this._mediaElement = null;
+ }
+ if (this._mediaSourceObjectURL) {
+ window.URL.revokeObjectURL(this._mediaSourceObjectURL);
+ this._mediaSourceObjectURL = null;
+ }
+ };
+ MSEController.prototype.appendInitSegment = function (initSegment, deferred) {
+ if (!this._mediaSource || this._mediaSource.readyState !== 'open') {
+ // sourcebuffer creation requires mediaSource.readyState === 'open'
+ // so we defer the sourcebuffer creation, until sourceopen event triggered
+ this._pendingSourceBufferInit.push(initSegment);
+ // make sure that this InitSegment is in the front of pending segments queue
+ this._pendingSegments[initSegment.type].push(initSegment);
+ return;
+ }
+ var is = initSegment;
+ var mimeType = "" + is.container;
+ if (is.codec && is.codec.length > 0) {
+ mimeType += ";codecs=" + is.codec;
+ }
+ var firstInitSegment = false;
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, 'Received Initialization Segment, mimeType: ' + mimeType);
+ this._lastInitSegments[is.type] = is;
+ if (mimeType !== this._mimeTypes[is.type]) {
+ if (!this._mimeTypes[is.type]) { // empty, first chance create sourcebuffer
+ firstInitSegment = true;
+ try {
+ var sb = this._sourceBuffers[is.type] = this._mediaSource.addSourceBuffer(mimeType);
+ sb.addEventListener('error', this.e.onSourceBufferError);
+ sb.addEventListener('updateend', this.e.onSourceBufferUpdateEnd);
+ }
+ catch (error) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, error.message);
+ this._emitter.emit(_mse_events_js__WEBPACK_IMPORTED_MODULE_3__.default.ERROR, { code: error.code, msg: error.message });
+ return;
+ }
+ }
+ else {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, "Notice: " + is.type + " mimeType changed, origin: " + this._mimeTypes[is.type] + ", target: " + mimeType);
+ }
+ this._mimeTypes[is.type] = mimeType;
+ }
+ if (!deferred) {
+ // deferred means this InitSegment has been pushed to pendingSegments queue
+ this._pendingSegments[is.type].push(is);
+ }
+ if (!firstInitSegment) { // append immediately only if init segment in subsequence
+ if (this._sourceBuffers[is.type] && !this._sourceBuffers[is.type].updating) {
+ this._doAppendSegments();
+ }
+ }
+ if (_utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.safari && is.container === 'audio/mpeg' && is.mediaDuration > 0) {
+ // 'audio/mpeg' track under Safari may cause MediaElement's duration to be NaN
+ // Manually correct MediaSource.duration to make progress bar seekable, and report right duration
+ this._requireSetMediaDuration = true;
+ this._pendingMediaDuration = is.mediaDuration / 1000; // in seconds
+ this._updateMediaSourceDuration();
+ }
+ };
+ MSEController.prototype.appendMediaSegment = function (mediaSegment) {
+ var ms = mediaSegment;
+ this._pendingSegments[ms.type].push(ms);
+ if (this._config.autoCleanupSourceBuffer && this._needCleanupSourceBuffer()) {
+ this._doCleanupSourceBuffer();
+ }
+ var sb = this._sourceBuffers[ms.type];
+ if (sb && !sb.updating && !this._hasPendingRemoveRanges()) {
+ this._doAppendSegments();
+ }
+ };
+ MSEController.prototype.seek = function (seconds) {
+ // remove all appended buffers
+ for (var type in this._sourceBuffers) {
+ if (!this._sourceBuffers[type]) {
+ continue;
+ }
+ // abort current buffer append algorithm
+ var sb = this._sourceBuffers[type];
+ if (this._mediaSource.readyState === 'open') {
+ try {
+ // If range removal algorithm is running, InvalidStateError will be throwed
+ // Ignore it.
+ sb.abort();
+ }
+ catch (error) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, error.message);
+ }
+ }
+ // IDRList should be clear
+ this._idrList.clear();
+ // pending segments should be discard
+ var ps = this._pendingSegments[type];
+ ps.splice(0, ps.length);
+ if (this._mediaSource.readyState === 'closed') {
+ // Parent MediaSource object has been detached from HTMLMediaElement
+ continue;
+ }
+ // record ranges to be remove from SourceBuffer
+ for (var i = 0; i < sb.buffered.length; i++) {
+ var start = sb.buffered.start(i);
+ var end = sb.buffered.end(i);
+ this._pendingRemoveRanges[type].push({ start: start, end: end });
+ }
+ // if sb is not updating, let's remove ranges now!
+ if (!sb.updating) {
+ this._doRemoveRanges();
+ }
+ // Safari 10 may get InvalidStateError in the later appendBuffer() after SourceBuffer.remove() call
+ // Internal parser's state may be invalid at this time. Re-append last InitSegment to workaround.
+ // Related issue: https://bugs.webkit.org/show_bug.cgi?id=159230
+ if (_utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.safari) {
+ var lastInitSegment = this._lastInitSegments[type];
+ if (lastInitSegment) {
+ this._pendingSegments[type].push(lastInitSegment);
+ if (!sb.updating) {
+ this._doAppendSegments();
+ }
+ }
+ }
+ }
+ };
+ MSEController.prototype.endOfStream = function () {
+ var ms = this._mediaSource;
+ var sb = this._sourceBuffers;
+ if (!ms || ms.readyState !== 'open') {
+ if (ms && ms.readyState === 'closed' && this._hasPendingSegments()) {
+ // If MediaSource hasn't turned into open state, and there're pending segments
+ // Mark pending endOfStream, defer call until all pending segments appended complete
+ this._hasPendingEos = true;
+ }
+ return;
+ }
+ if (sb.video && sb.video.updating || sb.audio && sb.audio.updating) {
+ // If any sourcebuffer is updating, defer endOfStream operation
+ // See _onSourceBufferUpdateEnd()
+ this._hasPendingEos = true;
+ }
+ else {
+ this._hasPendingEos = false;
+ // Notify media data loading complete
+ // This is helpful for correcting total duration to match last media segment
+ // Otherwise MediaElement's ended event may not be triggered
+ ms.endOfStream();
+ }
+ };
+ MSEController.prototype.getNearestKeyframe = function (dts) {
+ return this._idrList.getLastSyncPointBeforeDts(dts);
+ };
+ MSEController.prototype._needCleanupSourceBuffer = function () {
+ if (!this._config.autoCleanupSourceBuffer) {
+ return false;
+ }
+ var currentTime = this._mediaElement.currentTime;
+ for (var type in this._sourceBuffers) {
+ var sb = this._sourceBuffers[type];
+ if (sb) {
+ var buffered = sb.buffered;
+ if (buffered.length >= 1) {
+ if (currentTime - buffered.start(0) >= this._config.autoCleanupMaxBackwardDuration) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ };
+ MSEController.prototype._doCleanupSourceBuffer = function () {
+ var currentTime = this._mediaElement.currentTime;
+ for (var type in this._sourceBuffers) {
+ var sb = this._sourceBuffers[type];
+ if (sb) {
+ var buffered = sb.buffered;
+ var doRemove = false;
+ for (var i = 0; i < buffered.length; i++) {
+ var start = buffered.start(i);
+ var end = buffered.end(i);
+ if (start <= currentTime && currentTime < end + 3) { // padding 3 seconds
+ if (currentTime - start >= this._config.autoCleanupMaxBackwardDuration) {
+ doRemove = true;
+ var removeEnd = currentTime - this._config.autoCleanupMinBackwardDuration;
+ this._pendingRemoveRanges[type].push({ start: start, end: removeEnd });
+ }
+ }
+ else if (end < currentTime) {
+ doRemove = true;
+ this._pendingRemoveRanges[type].push({ start: start, end: end });
+ }
+ }
+ if (doRemove && !sb.updating) {
+ this._doRemoveRanges();
+ }
+ }
+ }
+ };
+ MSEController.prototype._updateMediaSourceDuration = function () {
+ var sb = this._sourceBuffers;
+ if (this._mediaElement.readyState === 0 || this._mediaSource.readyState !== 'open') {
+ return;
+ }
+ if ((sb.video && sb.video.updating) || (sb.audio && sb.audio.updating)) {
+ return;
+ }
+ var current = this._mediaSource.duration;
+ var target = this._pendingMediaDuration;
+ if (target > 0 && (isNaN(current) || target > current)) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, "Update MediaSource duration from " + current + " to " + target);
+ this._mediaSource.duration = target;
+ }
+ this._requireSetMediaDuration = false;
+ this._pendingMediaDuration = 0;
+ };
+ MSEController.prototype._doRemoveRanges = function () {
+ for (var type in this._pendingRemoveRanges) {
+ if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) {
+ continue;
+ }
+ var sb = this._sourceBuffers[type];
+ var ranges = this._pendingRemoveRanges[type];
+ while (ranges.length && !sb.updating) {
+ var range = ranges.shift();
+ sb.remove(range.start, range.end);
+ }
+ }
+ };
+ MSEController.prototype._doAppendSegments = function () {
+ var pendingSegments = this._pendingSegments;
+ for (var type in pendingSegments) {
+ if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) {
+ continue;
+ }
+ if (pendingSegments[type].length > 0) {
+ var segment = pendingSegments[type].shift();
+ if (segment.timestampOffset) {
+ // For MPEG audio stream in MSE, if unbuffered-seeking occurred
+ // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer.
+ var currentOffset = this._sourceBuffers[type].timestampOffset;
+ var targetOffset = segment.timestampOffset / 1000; // in seconds
+ var delta = Math.abs(currentOffset - targetOffset);
+ if (delta > 0.1) { // If time delta > 100ms
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, "Update MPEG audio timestampOffset from " + currentOffset + " to " + targetOffset);
+ this._sourceBuffers[type].timestampOffset = targetOffset;
+ }
+ delete segment.timestampOffset;
+ }
+ if (!segment.data || segment.data.byteLength === 0) {
+ // Ignore empty buffer
+ continue;
+ }
+ try {
+ this._sourceBuffers[type].appendBuffer(segment.data);
+ this._isBufferFull = false;
+ if (type === 'video' && segment.hasOwnProperty('info')) {
+ this._idrList.appendArray(segment.info.syncPoints);
+ }
+ }
+ catch (error) {
+ this._pendingSegments[type].unshift(segment);
+ if (error.code === 22) { // QuotaExceededError
+ /* Notice that FireFox may not throw QuotaExceededError if SourceBuffer is full
+ * Currently we can only do lazy-load to avoid SourceBuffer become scattered.
+ * SourceBuffer eviction policy may be changed in future version of FireFox.
+ *
+ * Related issues:
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=1279885
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=1280023
+ */
+ // report buffer full, abort network IO
+ if (!this._isBufferFull) {
+ this._emitter.emit(_mse_events_js__WEBPACK_IMPORTED_MODULE_3__.default.BUFFER_FULL);
+ }
+ this._isBufferFull = true;
+ }
+ else {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, type, error.message);
+ this._emitter.emit(_mse_events_js__WEBPACK_IMPORTED_MODULE_3__.default.ERROR, { code: error.code, msg: error.message });
+ }
+ }
+ }
+ }
+ };
+ MSEController.prototype._onSourceOpen = function () {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, 'MediaSource onSourceOpen');
+ this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen);
+ // deferred sourcebuffer creation / initialization
+ if (this._pendingSourceBufferInit.length > 0) {
+ var pendings = this._pendingSourceBufferInit;
+ while (pendings.length) {
+ var segment = pendings.shift();
+ this.appendInitSegment(segment, true);
+ }
+ }
+ // there may be some pending media segments, append them
+ if (this._hasPendingSegments()) {
+ this._doAppendSegments();
+ }
+ this._emitter.emit(_mse_events_js__WEBPACK_IMPORTED_MODULE_3__.default.SOURCE_OPEN);
+ };
+ MSEController.prototype._onSourceEnded = function () {
+ // fired on endOfStream
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, 'MediaSource onSourceEnded');
+ };
+ MSEController.prototype._onSourceClose = function () {
+ // fired on detaching from media element
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, 'MediaSource onSourceClose');
+ if (this._mediaSource && this.e != null) {
+ this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen);
+ this._mediaSource.removeEventListener('sourceended', this.e.onSourceEnded);
+ this._mediaSource.removeEventListener('sourceclose', this.e.onSourceClose);
+ }
+ };
+ MSEController.prototype._hasPendingSegments = function () {
+ var ps = this._pendingSegments;
+ return (ps.video && ps.video.length) > 0 || (ps.audio && ps.audio.length > 0);
+ };
+ MSEController.prototype._hasPendingRemoveRanges = function () {
+ var prr = this._pendingRemoveRanges;
+ return (prr.video && prr.video.length) > 0 || (prr.audio && prr.audio.length > 0);
+ };
+ MSEController.prototype._onSourceBufferUpdateEnd = function () {
+ if (this._requireSetMediaDuration) {
+ this._updateMediaSourceDuration();
+ }
+ else if (this._hasPendingRemoveRanges()) {
+ this._doRemoveRanges();
+ }
+ else if (this._hasPendingSegments()) {
+ this._doAppendSegments();
+ }
+ else if (this._hasPendingEos) {
+ this.endOfStream();
+ }
+ this._emitter.emit(_mse_events_js__WEBPACK_IMPORTED_MODULE_3__.default.UPDATE_END);
+ };
+ MSEController.prototype._onSourceBufferError = function (e) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, "SourceBuffer Error: " + e);
+ // this error might not always be fatal, just ignore it
+ };
+ return MSEController;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (MSEController);
+
+
+/***/ }),
+
+/***/ "./src/core/mse-events.js":
+/*!********************************!*\
+ !*** ./src/core/mse-events.js ***!
+ \********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var MSEEvents = {
+ ERROR: 'error',
+ SOURCE_OPEN: 'source_open',
+ UPDATE_END: 'update_end',
+ BUFFER_FULL: 'buffer_full'
+};
+/* harmony default export */ __webpack_exports__["default"] = (MSEEvents);
+
+
+/***/ }),
+
+/***/ "./src/core/transmuxer.js":
+/*!********************************!*\
+ !*** ./src/core/transmuxer.js ***!
+ \********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! events */ "./node_modules/events/events.js");
+/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var webworkify_webpack__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! webworkify-webpack */ "./node_modules/webworkify-webpack/index.js");
+/* harmony import */ var webworkify_webpack__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(webworkify_webpack__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js");
+/* harmony import */ var _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/logging-control.js */ "./src/utils/logging-control.js");
+/* harmony import */ var _transmuxing_controller_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./transmuxing-controller.js */ "./src/core/transmuxing-controller.js");
+/* harmony import */ var _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./transmuxing-events.js */ "./src/core/transmuxing-events.js");
+/* harmony import */ var _media_info_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./media-info.js */ "./src/core/media-info.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+var Transmuxer = /** @class */ (function () {
+ function Transmuxer(mediaDataSource, config) {
+ this.TAG = 'Transmuxer';
+ this._emitter = new (events__WEBPACK_IMPORTED_MODULE_0___default())();
+ if (config.enableWorker && typeof (Worker) !== 'undefined') {
+ try {
+ this._worker = webworkify_webpack__WEBPACK_IMPORTED_MODULE_1___default()(/*require.resolve*/(/*! ./transmuxing-worker */ "./src/core/transmuxing-worker.js"));
+ this._workerDestroying = false;
+ this._worker.addEventListener('message', this._onWorkerMessage.bind(this));
+ this._worker.postMessage({ cmd: 'init', param: [mediaDataSource, config] });
+ this.e = {
+ onLoggingConfigChanged: this._onLoggingConfigChanged.bind(this)
+ };
+ _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_3__.default.registerListener(this.e.onLoggingConfigChanged);
+ this._worker.postMessage({ cmd: 'logging_config', param: _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_3__.default.getConfig() });
+ }
+ catch (error) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_2__.default.e(this.TAG, 'Error while initialize transmuxing worker, fallback to inline transmuxing');
+ this._worker = null;
+ this._controller = new _transmuxing_controller_js__WEBPACK_IMPORTED_MODULE_4__.default(mediaDataSource, config);
+ }
+ }
+ else {
+ this._controller = new _transmuxing_controller_js__WEBPACK_IMPORTED_MODULE_4__.default(mediaDataSource, config);
+ }
+ if (this._controller) {
+ var ctl = this._controller;
+ ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.IO_ERROR, this._onIOError.bind(this));
+ ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.DEMUX_ERROR, this._onDemuxError.bind(this));
+ ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.INIT_SEGMENT, this._onInitSegment.bind(this));
+ ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.MEDIA_SEGMENT, this._onMediaSegment.bind(this));
+ ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.LOADING_COMPLETE, this._onLoadingComplete.bind(this));
+ ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.RECOVERED_EARLY_EOF, this._onRecoveredEarlyEof.bind(this));
+ ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.MEDIA_INFO, this._onMediaInfo.bind(this));
+ ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.METADATA_ARRIVED, this._onMetaDataArrived.bind(this));
+ ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.SCRIPTDATA_ARRIVED, this._onScriptDataArrived.bind(this));
+ ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.STATISTICS_INFO, this._onStatisticsInfo.bind(this));
+ ctl.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.RECOMMEND_SEEKPOINT, this._onRecommendSeekpoint.bind(this));
+ }
+ }
+ Transmuxer.prototype.destroy = function () {
+ if (this._worker) {
+ if (!this._workerDestroying) {
+ this._workerDestroying = true;
+ this._worker.postMessage({ cmd: 'destroy' });
+ _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_3__.default.removeListener(this.e.onLoggingConfigChanged);
+ this.e = null;
+ }
+ }
+ else {
+ this._controller.destroy();
+ this._controller = null;
+ }
+ this._emitter.removeAllListeners();
+ this._emitter = null;
+ };
+ Transmuxer.prototype.on = function (event, listener) {
+ this._emitter.addListener(event, listener);
+ };
+ Transmuxer.prototype.off = function (event, listener) {
+ this._emitter.removeListener(event, listener);
+ };
+ Transmuxer.prototype.hasWorker = function () {
+ return this._worker != null;
+ };
+ Transmuxer.prototype.open = function () {
+ if (this._worker) {
+ this._worker.postMessage({ cmd: 'start' });
+ }
+ else {
+ this._controller.start();
+ }
+ };
+ Transmuxer.prototype.close = function () {
+ if (this._worker) {
+ this._worker.postMessage({ cmd: 'stop' });
+ }
+ else {
+ this._controller.stop();
+ }
+ };
+ Transmuxer.prototype.seek = function (milliseconds) {
+ if (this._worker) {
+ this._worker.postMessage({ cmd: 'seek', param: milliseconds });
+ }
+ else {
+ this._controller.seek(milliseconds);
+ }
+ };
+ Transmuxer.prototype.pause = function () {
+ if (this._worker) {
+ this._worker.postMessage({ cmd: 'pause' });
+ }
+ else {
+ this._controller.pause();
+ }
+ };
+ Transmuxer.prototype.resume = function () {
+ if (this._worker) {
+ this._worker.postMessage({ cmd: 'resume' });
+ }
+ else {
+ this._controller.resume();
+ }
+ };
+ Transmuxer.prototype._onInitSegment = function (type, initSegment) {
+ var _this = this;
+ // do async invoke
+ Promise.resolve().then(function () {
+ _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.INIT_SEGMENT, type, initSegment);
+ });
+ };
+ Transmuxer.prototype._onMediaSegment = function (type, mediaSegment) {
+ var _this = this;
+ Promise.resolve().then(function () {
+ _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.MEDIA_SEGMENT, type, mediaSegment);
+ });
+ };
+ Transmuxer.prototype._onLoadingComplete = function () {
+ var _this = this;
+ Promise.resolve().then(function () {
+ _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.LOADING_COMPLETE);
+ });
+ };
+ Transmuxer.prototype._onRecoveredEarlyEof = function () {
+ var _this = this;
+ Promise.resolve().then(function () {
+ _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.RECOVERED_EARLY_EOF);
+ });
+ };
+ Transmuxer.prototype._onMediaInfo = function (mediaInfo) {
+ var _this = this;
+ Promise.resolve().then(function () {
+ _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.MEDIA_INFO, mediaInfo);
+ });
+ };
+ Transmuxer.prototype._onMetaDataArrived = function (metadata) {
+ var _this = this;
+ Promise.resolve().then(function () {
+ _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.METADATA_ARRIVED, metadata);
+ });
+ };
+ Transmuxer.prototype._onScriptDataArrived = function (data) {
+ var _this = this;
+ Promise.resolve().then(function () {
+ _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.SCRIPTDATA_ARRIVED, data);
+ });
+ };
+ Transmuxer.prototype._onStatisticsInfo = function (statisticsInfo) {
+ var _this = this;
+ Promise.resolve().then(function () {
+ _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.STATISTICS_INFO, statisticsInfo);
+ });
+ };
+ Transmuxer.prototype._onIOError = function (type, info) {
+ var _this = this;
+ Promise.resolve().then(function () {
+ _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.IO_ERROR, type, info);
+ });
+ };
+ Transmuxer.prototype._onDemuxError = function (type, info) {
+ var _this = this;
+ Promise.resolve().then(function () {
+ _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.DEMUX_ERROR, type, info);
+ });
+ };
+ Transmuxer.prototype._onRecommendSeekpoint = function (milliseconds) {
+ var _this = this;
+ Promise.resolve().then(function () {
+ _this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.RECOMMEND_SEEKPOINT, milliseconds);
+ });
+ };
+ Transmuxer.prototype._onLoggingConfigChanged = function (config) {
+ if (this._worker) {
+ this._worker.postMessage({ cmd: 'logging_config', param: config });
+ }
+ };
+ Transmuxer.prototype._onWorkerMessage = function (e) {
+ var message = e.data;
+ var data = message.data;
+ if (message.msg === 'destroyed' || this._workerDestroying) {
+ this._workerDestroying = false;
+ this._worker.terminate();
+ this._worker = null;
+ return;
+ }
+ switch (message.msg) {
+ case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.INIT_SEGMENT:
+ case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.MEDIA_SEGMENT:
+ this._emitter.emit(message.msg, data.type, data.data);
+ break;
+ case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.LOADING_COMPLETE:
+ case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.RECOVERED_EARLY_EOF:
+ this._emitter.emit(message.msg);
+ break;
+ case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.MEDIA_INFO:
+ Object.setPrototypeOf(data, _media_info_js__WEBPACK_IMPORTED_MODULE_6__.default.prototype);
+ this._emitter.emit(message.msg, data);
+ break;
+ case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.METADATA_ARRIVED:
+ case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.SCRIPTDATA_ARRIVED:
+ case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.STATISTICS_INFO:
+ this._emitter.emit(message.msg, data);
+ break;
+ case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.IO_ERROR:
+ case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.DEMUX_ERROR:
+ this._emitter.emit(message.msg, data.type, data.info);
+ break;
+ case _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.RECOMMEND_SEEKPOINT:
+ this._emitter.emit(message.msg, data);
+ break;
+ case 'logcat_callback':
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_2__.default.emitter.emit('log', data.type, data.logcat);
+ break;
+ default:
+ break;
+ }
+ };
+ return Transmuxer;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (Transmuxer);
+
+
+/***/ }),
+
+/***/ "./src/core/transmuxing-controller.js":
+/*!********************************************!*\
+ !*** ./src/core/transmuxing-controller.js ***!
+ \********************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! events */ "./node_modules/events/events.js");
+/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js");
+/* harmony import */ var _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/browser.js */ "./src/utils/browser.js");
+/* harmony import */ var _media_info_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./media-info.js */ "./src/core/media-info.js");
+/* harmony import */ var _demux_flv_demuxer_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../demux/flv-demuxer.js */ "./src/demux/flv-demuxer.js");
+/* harmony import */ var _remux_mp4_remuxer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../remux/mp4-remuxer.js */ "./src/remux/mp4-remuxer.js");
+/* harmony import */ var _demux_demux_errors_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../demux/demux-errors.js */ "./src/demux/demux-errors.js");
+/* harmony import */ var _io_io_controller_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../io/io-controller.js */ "./src/io/io-controller.js");
+/* harmony import */ var _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./transmuxing-events.js */ "./src/core/transmuxing-events.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+
+
+// Transmuxing (IO, Demuxing, Remuxing) controller, with multipart support
+var TransmuxingController = /** @class */ (function () {
+ function TransmuxingController(mediaDataSource, config) {
+ this.TAG = 'TransmuxingController';
+ this._emitter = new (events__WEBPACK_IMPORTED_MODULE_0___default())();
+ this._config = config;
+ // treat single part media as multipart media, which has only one segment
+ if (!mediaDataSource.segments) {
+ mediaDataSource.segments = [{
+ duration: mediaDataSource.duration,
+ filesize: mediaDataSource.filesize,
+ url: mediaDataSource.url
+ }];
+ }
+ // fill in default IO params if not exists
+ if (typeof mediaDataSource.cors !== 'boolean') {
+ mediaDataSource.cors = true;
+ }
+ if (typeof mediaDataSource.withCredentials !== 'boolean') {
+ mediaDataSource.withCredentials = false;
+ }
+ this._mediaDataSource = mediaDataSource;
+ this._currentSegmentIndex = 0;
+ var totalDuration = 0;
+ this._mediaDataSource.segments.forEach(function (segment) {
+ // timestampBase for each segment, and calculate total duration
+ segment.timestampBase = totalDuration;
+ totalDuration += segment.duration;
+ // params needed by IOController
+ segment.cors = mediaDataSource.cors;
+ segment.withCredentials = mediaDataSource.withCredentials;
+ // referrer policy control, if exist
+ if (config.referrerPolicy) {
+ segment.referrerPolicy = config.referrerPolicy;
+ }
+ });
+ if (!isNaN(totalDuration) && this._mediaDataSource.duration !== totalDuration) {
+ this._mediaDataSource.duration = totalDuration;
+ }
+ this._mediaInfo = null;
+ this._demuxer = null;
+ this._remuxer = null;
+ this._ioctl = null;
+ this._pendingSeekTime = null;
+ this._pendingResolveSeekPoint = null;
+ this._statisticsReporter = null;
+ }
+ TransmuxingController.prototype.destroy = function () {
+ this._mediaInfo = null;
+ this._mediaDataSource = null;
+ if (this._statisticsReporter) {
+ this._disableStatisticsReporter();
+ }
+ if (this._ioctl) {
+ this._ioctl.destroy();
+ this._ioctl = null;
+ }
+ if (this._demuxer) {
+ this._demuxer.destroy();
+ this._demuxer = null;
+ }
+ if (this._remuxer) {
+ this._remuxer.destroy();
+ this._remuxer = null;
+ }
+ this._emitter.removeAllListeners();
+ this._emitter = null;
+ };
+ TransmuxingController.prototype.on = function (event, listener) {
+ this._emitter.addListener(event, listener);
+ };
+ TransmuxingController.prototype.off = function (event, listener) {
+ this._emitter.removeListener(event, listener);
+ };
+ TransmuxingController.prototype.start = function () {
+ this._loadSegment(0);
+ this._enableStatisticsReporter();
+ };
+ TransmuxingController.prototype._loadSegment = function (segmentIndex, optionalFrom) {
+ this._currentSegmentIndex = segmentIndex;
+ var dataSource = this._mediaDataSource.segments[segmentIndex];
+ var ioctl = this._ioctl = new _io_io_controller_js__WEBPACK_IMPORTED_MODULE_7__.default(dataSource, this._config, segmentIndex);
+ ioctl.onError = this._onIOException.bind(this);
+ ioctl.onSeeked = this._onIOSeeked.bind(this);
+ ioctl.onComplete = this._onIOComplete.bind(this);
+ ioctl.onRedirect = this._onIORedirect.bind(this);
+ ioctl.onRecoveredEarlyEof = this._onIORecoveredEarlyEof.bind(this);
+ if (optionalFrom) {
+ this._demuxer.bindDataSource(this._ioctl);
+ }
+ else {
+ ioctl.onDataArrival = this._onInitChunkArrival.bind(this);
+ }
+ ioctl.open(optionalFrom);
+ };
+ TransmuxingController.prototype.stop = function () {
+ this._internalAbort();
+ this._disableStatisticsReporter();
+ };
+ TransmuxingController.prototype._internalAbort = function () {
+ if (this._ioctl) {
+ this._ioctl.destroy();
+ this._ioctl = null;
+ }
+ };
+ TransmuxingController.prototype.pause = function () {
+ if (this._ioctl && this._ioctl.isWorking()) {
+ this._ioctl.pause();
+ this._disableStatisticsReporter();
+ }
+ };
+ TransmuxingController.prototype.resume = function () {
+ if (this._ioctl && this._ioctl.isPaused()) {
+ this._ioctl.resume();
+ this._enableStatisticsReporter();
+ }
+ };
+ TransmuxingController.prototype.seek = function (milliseconds) {
+ if (this._mediaInfo == null || !this._mediaInfo.isSeekable()) {
+ return;
+ }
+ var targetSegmentIndex = this._searchSegmentIndexContains(milliseconds);
+ if (targetSegmentIndex === this._currentSegmentIndex) {
+ // intra-segment seeking
+ var segmentInfo = this._mediaInfo.segments[targetSegmentIndex];
+ if (segmentInfo == undefined) {
+ // current segment loading started, but mediainfo hasn't received yet
+ // wait for the metadata loaded, then seek to expected position
+ this._pendingSeekTime = milliseconds;
+ }
+ else {
+ var keyframe = segmentInfo.getNearestKeyframe(milliseconds);
+ this._remuxer.seek(keyframe.milliseconds);
+ this._ioctl.seek(keyframe.fileposition);
+ // Will be resolved in _onRemuxerMediaSegmentArrival()
+ this._pendingResolveSeekPoint = keyframe.milliseconds;
+ }
+ }
+ else {
+ // cross-segment seeking
+ var targetSegmentInfo = this._mediaInfo.segments[targetSegmentIndex];
+ if (targetSegmentInfo == undefined) {
+ // target segment hasn't been loaded. We need metadata then seek to expected time
+ this._pendingSeekTime = milliseconds;
+ this._internalAbort();
+ this._remuxer.seek();
+ this._remuxer.insertDiscontinuity();
+ this._loadSegment(targetSegmentIndex);
+ // Here we wait for the metadata loaded, then seek to expected position
+ }
+ else {
+ // We have target segment's metadata, direct seek to target position
+ var keyframe = targetSegmentInfo.getNearestKeyframe(milliseconds);
+ this._internalAbort();
+ this._remuxer.seek(milliseconds);
+ this._remuxer.insertDiscontinuity();
+ this._demuxer.resetMediaInfo();
+ this._demuxer.timestampBase = this._mediaDataSource.segments[targetSegmentIndex].timestampBase;
+ this._loadSegment(targetSegmentIndex, keyframe.fileposition);
+ this._pendingResolveSeekPoint = keyframe.milliseconds;
+ this._reportSegmentMediaInfo(targetSegmentIndex);
+ }
+ }
+ this._enableStatisticsReporter();
+ };
+ TransmuxingController.prototype._searchSegmentIndexContains = function (milliseconds) {
+ var segments = this._mediaDataSource.segments;
+ var idx = segments.length - 1;
+ for (var i = 0; i < segments.length; i++) {
+ if (milliseconds < segments[i].timestampBase) {
+ idx = i - 1;
+ break;
+ }
+ }
+ return idx;
+ };
+ TransmuxingController.prototype._onInitChunkArrival = function (data, byteStart) {
+ var _this = this;
+ var probeData = null;
+ var consumed = 0;
+ if (byteStart > 0) {
+ // IOController seeked immediately after opened, byteStart > 0 callback may received
+ this._demuxer.bindDataSource(this._ioctl);
+ this._demuxer.timestampBase = this._mediaDataSource.segments[this._currentSegmentIndex].timestampBase;
+ consumed = this._demuxer.parseChunks(data, byteStart);
+ }
+ else if ((probeData = _demux_flv_demuxer_js__WEBPACK_IMPORTED_MODULE_4__.default.probe(data)).match) {
+ // Always create new FLVDemuxer
+ this._demuxer = new _demux_flv_demuxer_js__WEBPACK_IMPORTED_MODULE_4__.default(probeData, this._config);
+ if (!this._remuxer) {
+ this._remuxer = new _remux_mp4_remuxer_js__WEBPACK_IMPORTED_MODULE_5__.default(this._config);
+ }
+ var mds = this._mediaDataSource;
+ if (mds.duration != undefined && !isNaN(mds.duration)) {
+ this._demuxer.overridedDuration = mds.duration;
+ }
+ if (typeof mds.hasAudio === 'boolean') {
+ this._demuxer.overridedHasAudio = mds.hasAudio;
+ }
+ if (typeof mds.hasVideo === 'boolean') {
+ this._demuxer.overridedHasVideo = mds.hasVideo;
+ }
+ this._demuxer.timestampBase = mds.segments[this._currentSegmentIndex].timestampBase;
+ this._demuxer.onError = this._onDemuxException.bind(this);
+ this._demuxer.onMediaInfo = this._onMediaInfo.bind(this);
+ this._demuxer.onMetaDataArrived = this._onMetaDataArrived.bind(this);
+ this._demuxer.onScriptDataArrived = this._onScriptDataArrived.bind(this);
+ this._remuxer.bindDataSource(this._demuxer
+ .bindDataSource(this._ioctl));
+ this._remuxer.onInitSegment = this._onRemuxerInitSegmentArrival.bind(this);
+ this._remuxer.onMediaSegment = this._onRemuxerMediaSegmentArrival.bind(this);
+ consumed = this._demuxer.parseChunks(data, byteStart);
+ }
+ else {
+ probeData = null;
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, 'Non-FLV, Unsupported media type!');
+ Promise.resolve().then(function () {
+ _this._internalAbort();
+ });
+ this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.DEMUX_ERROR, _demux_demux_errors_js__WEBPACK_IMPORTED_MODULE_6__.default.FORMAT_UNSUPPORTED, 'Non-FLV, Unsupported media type');
+ consumed = 0;
+ }
+ return consumed;
+ };
+ TransmuxingController.prototype._onMediaInfo = function (mediaInfo) {
+ var _this = this;
+ if (this._mediaInfo == null) {
+ // Store first segment's mediainfo as global mediaInfo
+ this._mediaInfo = Object.assign({}, mediaInfo);
+ this._mediaInfo.keyframesIndex = null;
+ this._mediaInfo.segments = [];
+ this._mediaInfo.segmentCount = this._mediaDataSource.segments.length;
+ Object.setPrototypeOf(this._mediaInfo, _media_info_js__WEBPACK_IMPORTED_MODULE_3__.default.prototype);
+ }
+ var segmentInfo = Object.assign({}, mediaInfo);
+ Object.setPrototypeOf(segmentInfo, _media_info_js__WEBPACK_IMPORTED_MODULE_3__.default.prototype);
+ this._mediaInfo.segments[this._currentSegmentIndex] = segmentInfo;
+ // notify mediaInfo update
+ this._reportSegmentMediaInfo(this._currentSegmentIndex);
+ if (this._pendingSeekTime != null) {
+ Promise.resolve().then(function () {
+ var target = _this._pendingSeekTime;
+ _this._pendingSeekTime = null;
+ _this.seek(target);
+ });
+ }
+ };
+ TransmuxingController.prototype._onMetaDataArrived = function (metadata) {
+ this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.METADATA_ARRIVED, metadata);
+ };
+ TransmuxingController.prototype._onScriptDataArrived = function (data) {
+ this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.SCRIPTDATA_ARRIVED, data);
+ };
+ TransmuxingController.prototype._onIOSeeked = function () {
+ this._remuxer.insertDiscontinuity();
+ };
+ TransmuxingController.prototype._onIOComplete = function (extraData) {
+ var segmentIndex = extraData;
+ var nextSegmentIndex = segmentIndex + 1;
+ if (nextSegmentIndex < this._mediaDataSource.segments.length) {
+ this._internalAbort();
+ this._remuxer.flushStashedSamples();
+ this._loadSegment(nextSegmentIndex);
+ }
+ else {
+ this._remuxer.flushStashedSamples();
+ this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.LOADING_COMPLETE);
+ this._disableStatisticsReporter();
+ }
+ };
+ TransmuxingController.prototype._onIORedirect = function (redirectedURL) {
+ var segmentIndex = this._ioctl.extraData;
+ this._mediaDataSource.segments[segmentIndex].redirectedURL = redirectedURL;
+ };
+ TransmuxingController.prototype._onIORecoveredEarlyEof = function () {
+ this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.RECOVERED_EARLY_EOF);
+ };
+ TransmuxingController.prototype._onIOException = function (type, info) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, "IOException: type = " + type + ", code = " + info.code + ", msg = " + info.msg);
+ this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.IO_ERROR, type, info);
+ this._disableStatisticsReporter();
+ };
+ TransmuxingController.prototype._onDemuxException = function (type, info) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.e(this.TAG, "DemuxException: type = " + type + ", info = " + info);
+ this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.DEMUX_ERROR, type, info);
+ };
+ TransmuxingController.prototype._onRemuxerInitSegmentArrival = function (type, initSegment) {
+ this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.INIT_SEGMENT, type, initSegment);
+ };
+ TransmuxingController.prototype._onRemuxerMediaSegmentArrival = function (type, mediaSegment) {
+ if (this._pendingSeekTime != null) {
+ // Media segments after new-segment cross-seeking should be dropped.
+ return;
+ }
+ this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.MEDIA_SEGMENT, type, mediaSegment);
+ // Resolve pending seekPoint
+ if (this._pendingResolveSeekPoint != null && type === 'video') {
+ var syncPoints = mediaSegment.info.syncPoints;
+ var seekpoint = this._pendingResolveSeekPoint;
+ this._pendingResolveSeekPoint = null;
+ // Safari: Pass PTS for recommend_seekpoint
+ if (_utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.safari && syncPoints.length > 0 && syncPoints[0].originalDts === seekpoint) {
+ seekpoint = syncPoints[0].pts;
+ }
+ // else: use original DTS (keyframe.milliseconds)
+ this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.RECOMMEND_SEEKPOINT, seekpoint);
+ }
+ };
+ TransmuxingController.prototype._enableStatisticsReporter = function () {
+ if (this._statisticsReporter == null) {
+ this._statisticsReporter = self.setInterval(this._reportStatisticsInfo.bind(this), this._config.statisticsInfoReportInterval);
+ }
+ };
+ TransmuxingController.prototype._disableStatisticsReporter = function () {
+ if (this._statisticsReporter) {
+ self.clearInterval(this._statisticsReporter);
+ this._statisticsReporter = null;
+ }
+ };
+ TransmuxingController.prototype._reportSegmentMediaInfo = function (segmentIndex) {
+ var segmentInfo = this._mediaInfo.segments[segmentIndex];
+ var exportInfo = Object.assign({}, segmentInfo);
+ exportInfo.duration = this._mediaInfo.duration;
+ exportInfo.segmentCount = this._mediaInfo.segmentCount;
+ delete exportInfo.segments;
+ delete exportInfo.keyframesIndex;
+ this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.MEDIA_INFO, exportInfo);
+ };
+ TransmuxingController.prototype._reportStatisticsInfo = function () {
+ var info = {};
+ info.url = this._ioctl.currentURL;
+ info.hasRedirect = this._ioctl.hasRedirect;
+ if (info.hasRedirect) {
+ info.redirectedURL = this._ioctl.currentRedirectedURL;
+ }
+ info.speed = this._ioctl.currentSpeed;
+ info.loaderType = this._ioctl.loaderType;
+ info.currentSegmentIndex = this._currentSegmentIndex;
+ info.totalSegmentCount = this._mediaDataSource.segments.length;
+ this._emitter.emit(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_8__.default.STATISTICS_INFO, info);
+ };
+ return TransmuxingController;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (TransmuxingController);
+
+
+/***/ }),
+
+/***/ "./src/core/transmuxing-events.js":
+/*!****************************************!*\
+ !*** ./src/core/transmuxing-events.js ***!
+ \****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var TransmuxingEvents = {
+ IO_ERROR: 'io_error',
+ DEMUX_ERROR: 'demux_error',
+ INIT_SEGMENT: 'init_segment',
+ MEDIA_SEGMENT: 'media_segment',
+ LOADING_COMPLETE: 'loading_complete',
+ RECOVERED_EARLY_EOF: 'recovered_early_eof',
+ MEDIA_INFO: 'media_info',
+ METADATA_ARRIVED: 'metadata_arrived',
+ SCRIPTDATA_ARRIVED: 'scriptdata_arrived',
+ STATISTICS_INFO: 'statistics_info',
+ RECOMMEND_SEEKPOINT: 'recommend_seekpoint'
+};
+/* harmony default export */ __webpack_exports__["default"] = (TransmuxingEvents);
+
+
+/***/ }),
+
+/***/ "./src/core/transmuxing-worker.js":
+/*!****************************************!*\
+ !*** ./src/core/transmuxing-worker.js ***!
+ \****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logging-control.js */ "./src/utils/logging-control.js");
+/* harmony import */ var _utils_polyfill_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/polyfill.js */ "./src/utils/polyfill.js");
+/* harmony import */ var _transmuxing_controller_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./transmuxing-controller.js */ "./src/core/transmuxing-controller.js");
+/* harmony import */ var _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./transmuxing-events.js */ "./src/core/transmuxing-events.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+/* post message to worker:
+ data: {
+ cmd: string
+ param: any
+ }
+
+ receive message from worker:
+ data: {
+ msg: string,
+ data: any
+ }
+ */
+var TransmuxingWorker = function (self) {
+ var TAG = 'TransmuxingWorker';
+ var controller = null;
+ var logcatListener = onLogcatCallback.bind(this);
+ _utils_polyfill_js__WEBPACK_IMPORTED_MODULE_1__.default.install();
+ self.addEventListener('message', function (e) {
+ switch (e.data.cmd) {
+ case 'init':
+ controller = new _transmuxing_controller_js__WEBPACK_IMPORTED_MODULE_2__.default(e.data.param[0], e.data.param[1]);
+ controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.IO_ERROR, onIOError.bind(this));
+ controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.DEMUX_ERROR, onDemuxError.bind(this));
+ controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.INIT_SEGMENT, onInitSegment.bind(this));
+ controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.MEDIA_SEGMENT, onMediaSegment.bind(this));
+ controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.LOADING_COMPLETE, onLoadingComplete.bind(this));
+ controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.RECOVERED_EARLY_EOF, onRecoveredEarlyEof.bind(this));
+ controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.MEDIA_INFO, onMediaInfo.bind(this));
+ controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.METADATA_ARRIVED, onMetaDataArrived.bind(this));
+ controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.SCRIPTDATA_ARRIVED, onScriptDataArrived.bind(this));
+ controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.STATISTICS_INFO, onStatisticsInfo.bind(this));
+ controller.on(_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.RECOMMEND_SEEKPOINT, onRecommendSeekpoint.bind(this));
+ break;
+ case 'destroy':
+ if (controller) {
+ controller.destroy();
+ controller = null;
+ }
+ self.postMessage({ msg: 'destroyed' });
+ break;
+ case 'start':
+ controller.start();
+ break;
+ case 'stop':
+ controller.stop();
+ break;
+ case 'seek':
+ controller.seek(e.data.param);
+ break;
+ case 'pause':
+ controller.pause();
+ break;
+ case 'resume':
+ controller.resume();
+ break;
+ case 'logging_config': {
+ var config = e.data.param;
+ _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_0__.default.applyConfig(config);
+ if (config.enableCallback === true) {
+ _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_0__.default.addLogListener(logcatListener);
+ }
+ else {
+ _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_0__.default.removeLogListener(logcatListener);
+ }
+ break;
+ }
+ }
+ });
+ function onInitSegment(type, initSegment) {
+ var obj = {
+ msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.INIT_SEGMENT,
+ data: {
+ type: type,
+ data: initSegment
+ }
+ };
+ self.postMessage(obj, [initSegment.data]); // data: ArrayBuffer
+ }
+ function onMediaSegment(type, mediaSegment) {
+ var obj = {
+ msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.MEDIA_SEGMENT,
+ data: {
+ type: type,
+ data: mediaSegment
+ }
+ };
+ self.postMessage(obj, [mediaSegment.data]); // data: ArrayBuffer
+ }
+ function onLoadingComplete() {
+ var obj = {
+ msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.LOADING_COMPLETE
+ };
+ self.postMessage(obj);
+ }
+ function onRecoveredEarlyEof() {
+ var obj = {
+ msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.RECOVERED_EARLY_EOF
+ };
+ self.postMessage(obj);
+ }
+ function onMediaInfo(mediaInfo) {
+ var obj = {
+ msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.MEDIA_INFO,
+ data: mediaInfo
+ };
+ self.postMessage(obj);
+ }
+ function onMetaDataArrived(metadata) {
+ var obj = {
+ msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.METADATA_ARRIVED,
+ data: metadata
+ };
+ self.postMessage(obj);
+ }
+ function onScriptDataArrived(data) {
+ var obj = {
+ msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.SCRIPTDATA_ARRIVED,
+ data: data
+ };
+ self.postMessage(obj);
+ }
+ function onStatisticsInfo(statInfo) {
+ var obj = {
+ msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.STATISTICS_INFO,
+ data: statInfo
+ };
+ self.postMessage(obj);
+ }
+ function onIOError(type, info) {
+ self.postMessage({
+ msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.IO_ERROR,
+ data: {
+ type: type,
+ info: info
+ }
+ });
+ }
+ function onDemuxError(type, info) {
+ self.postMessage({
+ msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.DEMUX_ERROR,
+ data: {
+ type: type,
+ info: info
+ }
+ });
+ }
+ function onRecommendSeekpoint(milliseconds) {
+ self.postMessage({
+ msg: _transmuxing_events_js__WEBPACK_IMPORTED_MODULE_3__.default.RECOMMEND_SEEKPOINT,
+ data: milliseconds
+ });
+ }
+ function onLogcatCallback(type, str) {
+ self.postMessage({
+ msg: 'logcat_callback',
+ data: {
+ type: type,
+ logcat: str
+ }
+ });
+ }
+};
+/* harmony default export */ __webpack_exports__["default"] = (TransmuxingWorker);
+
+
+/***/ }),
+
+/***/ "./src/demux/amf-parser.js":
+/*!*********************************!*\
+ !*** ./src/demux/amf-parser.js ***!
+ \*********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js");
+/* harmony import */ var _utils_utf8_conv_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/utf8-conv.js */ "./src/utils/utf8-conv.js");
+/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+var le = (function () {
+ var buf = new ArrayBuffer(2);
+ (new DataView(buf)).setInt16(0, 256, true); // little-endian write
+ return (new Int16Array(buf))[0] === 256; // platform-spec read, if equal then LE
+})();
+var AMF = /** @class */ (function () {
+ function AMF() {
+ }
+ AMF.parseScriptData = function (arrayBuffer, dataOffset, dataSize) {
+ var data = {};
+ try {
+ var name_1 = AMF.parseValue(arrayBuffer, dataOffset, dataSize);
+ var value = AMF.parseValue(arrayBuffer, dataOffset + name_1.size, dataSize - name_1.size);
+ data[name_1.data] = value.data;
+ }
+ catch (e) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.e('AMF', e.toString());
+ }
+ return data;
+ };
+ AMF.parseObject = function (arrayBuffer, dataOffset, dataSize) {
+ if (dataSize < 3) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.IllegalStateException('Data not enough when parse ScriptDataObject');
+ }
+ var name = AMF.parseString(arrayBuffer, dataOffset, dataSize);
+ var value = AMF.parseValue(arrayBuffer, dataOffset + name.size, dataSize - name.size);
+ var isObjectEnd = value.objectEnd;
+ return {
+ data: {
+ name: name.data,
+ value: value.data
+ },
+ size: name.size + value.size,
+ objectEnd: isObjectEnd
+ };
+ };
+ AMF.parseVariable = function (arrayBuffer, dataOffset, dataSize) {
+ return AMF.parseObject(arrayBuffer, dataOffset, dataSize);
+ };
+ AMF.parseString = function (arrayBuffer, dataOffset, dataSize) {
+ if (dataSize < 2) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.IllegalStateException('Data not enough when parse String');
+ }
+ var v = new DataView(arrayBuffer, dataOffset, dataSize);
+ var length = v.getUint16(0, !le);
+ var str;
+ if (length > 0) {
+ str = (0,_utils_utf8_conv_js__WEBPACK_IMPORTED_MODULE_1__.default)(new Uint8Array(arrayBuffer, dataOffset + 2, length));
+ }
+ else {
+ str = '';
+ }
+ return {
+ data: str,
+ size: 2 + length
+ };
+ };
+ AMF.parseLongString = function (arrayBuffer, dataOffset, dataSize) {
+ if (dataSize < 4) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.IllegalStateException('Data not enough when parse LongString');
+ }
+ var v = new DataView(arrayBuffer, dataOffset, dataSize);
+ var length = v.getUint32(0, !le);
+ var str;
+ if (length > 0) {
+ str = (0,_utils_utf8_conv_js__WEBPACK_IMPORTED_MODULE_1__.default)(new Uint8Array(arrayBuffer, dataOffset + 4, length));
+ }
+ else {
+ str = '';
+ }
+ return {
+ data: str,
+ size: 4 + length
+ };
+ };
+ AMF.parseDate = function (arrayBuffer, dataOffset, dataSize) {
+ if (dataSize < 10) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.IllegalStateException('Data size invalid when parse Date');
+ }
+ var v = new DataView(arrayBuffer, dataOffset, dataSize);
+ var timestamp = v.getFloat64(0, !le);
+ var localTimeOffset = v.getInt16(8, !le);
+ timestamp += localTimeOffset * 60 * 1000; // get UTC time
+ return {
+ data: new Date(timestamp),
+ size: 8 + 2
+ };
+ };
+ AMF.parseValue = function (arrayBuffer, dataOffset, dataSize) {
+ if (dataSize < 1) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.IllegalStateException('Data not enough when parse Value');
+ }
+ var v = new DataView(arrayBuffer, dataOffset, dataSize);
+ var offset = 1;
+ var type = v.getUint8(0);
+ var value;
+ var objectEnd = false;
+ try {
+ switch (type) {
+ case 0: // Number(Double) type
+ value = v.getFloat64(1, !le);
+ offset += 8;
+ break;
+ case 1: { // Boolean type
+ var b = v.getUint8(1);
+ value = b ? true : false;
+ offset += 1;
+ break;
+ }
+ case 2: { // String type
+ var amfstr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1);
+ value = amfstr.data;
+ offset += amfstr.size;
+ break;
+ }
+ case 3: { // Object(s) type
+ value = {};
+ var terminal = 0; // workaround for malformed Objects which has missing ScriptDataObjectEnd
+ if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) {
+ terminal = 3;
+ }
+ while (offset < dataSize - 4) { // 4 === type(UI8) + ScriptDataObjectEnd(UI24)
+ var amfobj = AMF.parseObject(arrayBuffer, dataOffset + offset, dataSize - offset - terminal);
+ if (amfobj.objectEnd)
+ break;
+ value[amfobj.data.name] = amfobj.data.value;
+ offset += amfobj.size;
+ }
+ if (offset <= dataSize - 3) {
+ var marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF;
+ if (marker === 9) {
+ offset += 3;
+ }
+ }
+ break;
+ }
+ case 8: { // ECMA array type (Mixed array)
+ value = {};
+ offset += 4; // ECMAArrayLength(UI32)
+ var terminal = 0; // workaround for malformed MixedArrays which has missing ScriptDataObjectEnd
+ if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) {
+ terminal = 3;
+ }
+ while (offset < dataSize - 8) { // 8 === type(UI8) + ECMAArrayLength(UI32) + ScriptDataVariableEnd(UI24)
+ var amfvar = AMF.parseVariable(arrayBuffer, dataOffset + offset, dataSize - offset - terminal);
+ if (amfvar.objectEnd)
+ break;
+ value[amfvar.data.name] = amfvar.data.value;
+ offset += amfvar.size;
+ }
+ if (offset <= dataSize - 3) {
+ var marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF;
+ if (marker === 9) {
+ offset += 3;
+ }
+ }
+ break;
+ }
+ case 9: // ScriptDataObjectEnd
+ value = undefined;
+ offset = 1;
+ objectEnd = true;
+ break;
+ case 10: { // Strict array type
+ // ScriptDataValue[n]. NOTE: according to video_file_format_spec_v10_1.pdf
+ value = [];
+ var strictArrayLength = v.getUint32(1, !le);
+ offset += 4;
+ for (var i = 0; i < strictArrayLength; i++) {
+ var val = AMF.parseValue(arrayBuffer, dataOffset + offset, dataSize - offset);
+ value.push(val.data);
+ offset += val.size;
+ }
+ break;
+ }
+ case 11: { // Date type
+ var date = AMF.parseDate(arrayBuffer, dataOffset + 1, dataSize - 1);
+ value = date.data;
+ offset += date.size;
+ break;
+ }
+ case 12: { // Long string type
+ var amfLongStr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1);
+ value = amfLongStr.data;
+ offset += amfLongStr.size;
+ break;
+ }
+ default:
+ // ignore and skip
+ offset = dataSize;
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w('AMF', 'Unsupported AMF value type ' + type);
+ }
+ }
+ catch (e) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.e('AMF', e.toString());
+ }
+ return {
+ data: value,
+ size: offset,
+ objectEnd: objectEnd
+ };
+ };
+ return AMF;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (AMF);
+
+
+/***/ }),
+
+/***/ "./src/demux/demux-errors.js":
+/*!***********************************!*\
+ !*** ./src/demux/demux-errors.js ***!
+ \***********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var DemuxErrors = {
+ OK: 'OK',
+ FORMAT_ERROR: 'FormatError',
+ FORMAT_UNSUPPORTED: 'FormatUnsupported',
+ CODEC_UNSUPPORTED: 'CodecUnsupported'
+};
+/* harmony default export */ __webpack_exports__["default"] = (DemuxErrors);
+
+
+/***/ }),
+
+/***/ "./src/demux/exp-golomb.js":
+/*!*********************************!*\
+ !*** ./src/demux/exp-golomb.js ***!
+ \*********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Exponential-Golomb buffer decoder
+var ExpGolomb = /** @class */ (function () {
+ function ExpGolomb(uint8array) {
+ this.TAG = 'ExpGolomb';
+ this._buffer = uint8array;
+ this._buffer_index = 0;
+ this._total_bytes = uint8array.byteLength;
+ this._total_bits = uint8array.byteLength * 8;
+ this._current_word = 0;
+ this._current_word_bits_left = 0;
+ }
+ ExpGolomb.prototype.destroy = function () {
+ this._buffer = null;
+ };
+ ExpGolomb.prototype._fillCurrentWord = function () {
+ var buffer_bytes_left = this._total_bytes - this._buffer_index;
+ if (buffer_bytes_left <= 0)
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_0__.IllegalStateException('ExpGolomb: _fillCurrentWord() but no bytes available');
+ var bytes_read = Math.min(4, buffer_bytes_left);
+ var word = new Uint8Array(4);
+ word.set(this._buffer.subarray(this._buffer_index, this._buffer_index + bytes_read));
+ this._current_word = new DataView(word.buffer).getUint32(0, false);
+ this._buffer_index += bytes_read;
+ this._current_word_bits_left = bytes_read * 8;
+ };
+ ExpGolomb.prototype.readBits = function (bits) {
+ if (bits > 32)
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_0__.InvalidArgumentException('ExpGolomb: readBits() bits exceeded max 32bits!');
+ if (bits <= this._current_word_bits_left) {
+ var result_1 = this._current_word >>> (32 - bits);
+ this._current_word <<= bits;
+ this._current_word_bits_left -= bits;
+ return result_1;
+ }
+ var result = this._current_word_bits_left ? this._current_word : 0;
+ result = result >>> (32 - this._current_word_bits_left);
+ var bits_need_left = bits - this._current_word_bits_left;
+ this._fillCurrentWord();
+ var bits_read_next = Math.min(bits_need_left, this._current_word_bits_left);
+ var result2 = this._current_word >>> (32 - bits_read_next);
+ this._current_word <<= bits_read_next;
+ this._current_word_bits_left -= bits_read_next;
+ result = (result << bits_read_next) | result2;
+ return result;
+ };
+ ExpGolomb.prototype.readBool = function () {
+ return this.readBits(1) === 1;
+ };
+ ExpGolomb.prototype.readByte = function () {
+ return this.readBits(8);
+ };
+ ExpGolomb.prototype._skipLeadingZero = function () {
+ var zero_count;
+ for (zero_count = 0; zero_count < this._current_word_bits_left; zero_count++) {
+ if (0 !== (this._current_word & (0x80000000 >>> zero_count))) {
+ this._current_word <<= zero_count;
+ this._current_word_bits_left -= zero_count;
+ return zero_count;
+ }
+ }
+ this._fillCurrentWord();
+ return zero_count + this._skipLeadingZero();
+ };
+ ExpGolomb.prototype.readUEG = function () {
+ var leading_zeros = this._skipLeadingZero();
+ return this.readBits(leading_zeros + 1) - 1;
+ };
+ ExpGolomb.prototype.readSEG = function () {
+ var value = this.readUEG();
+ if (value & 0x01) {
+ return (value + 1) >>> 1;
+ }
+ else {
+ return -1 * (value >>> 1);
+ }
+ };
+ return ExpGolomb;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (ExpGolomb);
+
+
+/***/ }),
+
+/***/ "./src/demux/flv-demuxer.js":
+/*!**********************************!*\
+ !*** ./src/demux/flv-demuxer.js ***!
+ \**********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js");
+/* harmony import */ var _amf_parser_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./amf-parser.js */ "./src/demux/amf-parser.js");
+/* harmony import */ var _sps_parser_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sps-parser.js */ "./src/demux/sps-parser.js");
+/* harmony import */ var _hevc_sps_parser_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hevc-sps-parser.js */ "./src/demux/hevc-sps-parser.js");
+/* harmony import */ var _demux_errors_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./demux-errors.js */ "./src/demux/demux-errors.js");
+/* harmony import */ var _core_media_info_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../core/media-info.js */ "./src/core/media-info.js");
+/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+function Swap16(src) {
+ return (((src >>> 8) & 0xFF) |
+ ((src & 0xFF) << 8));
+}
+function Swap32(src) {
+ return (((src & 0xFF000000) >>> 24) |
+ ((src & 0x00FF0000) >>> 8) |
+ ((src & 0x0000FF00) << 8) |
+ ((src & 0x000000FF) << 24));
+}
+function ReadBig32(array, index) {
+ return ((array[index] << 24) |
+ (array[index + 1] << 16) |
+ (array[index + 2] << 8) |
+ (array[index + 3]));
+}
+var FLVDemuxer = /** @class */ (function () {
+ function FLVDemuxer(probeData, config) {
+ this.TAG = 'FLVDemuxer';
+ this._config = config;
+ this._onError = null;
+ this._onMediaInfo = null;
+ this._onMetaDataArrived = null;
+ this._onScriptDataArrived = null;
+ this._onTrackMetadata = null;
+ this._onDataAvailable = null;
+ this._dataOffset = probeData.dataOffset;
+ this._firstParse = true;
+ this._dispatch = false;
+ this._hasAudio = probeData.hasAudioTrack;
+ this._hasVideo = probeData.hasVideoTrack;
+ this._hasAudioFlagOverrided = false;
+ this._hasVideoFlagOverrided = false;
+ this._audioInitialMetadataDispatched = false;
+ this._videoInitialMetadataDispatched = false;
+ this._mediaInfo = new _core_media_info_js__WEBPACK_IMPORTED_MODULE_5__.default();
+ this._mediaInfo.hasAudio = this._hasAudio;
+ this._mediaInfo.hasVideo = this._hasVideo;
+ this._metadata = null;
+ this._audioMetadata = null;
+ this._videoMetadata = null;
+ this._naluLengthSize = 4;
+ this._timestampBase = 0; // int32, in milliseconds
+ this._timescale = 1000;
+ this._duration = 0; // int32, in milliseconds
+ this._durationOverrided = false;
+ this._referenceFrameRate = {
+ fixed: true,
+ fps: 23.976,
+ fps_num: 23976,
+ fps_den: 1000
+ };
+ this._flvSoundRateTable = [5500, 11025, 22050, 44100, 48000];
+ this._mpegSamplingRates = [
+ 96000, 88200, 64000, 48000, 44100, 32000,
+ 24000, 22050, 16000, 12000, 11025, 8000, 7350
+ ];
+ this._mpegAudioV10SampleRateTable = [44100, 48000, 32000, 0];
+ this._mpegAudioV20SampleRateTable = [22050, 24000, 16000, 0];
+ this._mpegAudioV25SampleRateTable = [11025, 12000, 8000, 0];
+ this._mpegAudioL1BitRateTable = [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1];
+ this._mpegAudioL2BitRateTable = [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1];
+ this._mpegAudioL3BitRateTable = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1];
+ this._videoTrack = { type: 'video', id: 1, sequenceNumber: 0, samples: [], length: 0 };
+ this._audioTrack = { type: 'audio', id: 2, sequenceNumber: 0, samples: [], length: 0 };
+ this._littleEndian = (function () {
+ var buf = new ArrayBuffer(2);
+ (new DataView(buf)).setInt16(0, 256, true); // little-endian write
+ return (new Int16Array(buf))[0] === 256; // platform-spec read, if equal then LE
+ })();
+ }
+ FLVDemuxer.prototype.destroy = function () {
+ this._mediaInfo = null;
+ this._metadata = null;
+ this._audioMetadata = null;
+ this._videoMetadata = null;
+ this._videoTrack = null;
+ this._audioTrack = null;
+ this._onError = null;
+ this._onMediaInfo = null;
+ this._onMetaDataArrived = null;
+ this._onScriptDataArrived = null;
+ this._onTrackMetadata = null;
+ this._onDataAvailable = null;
+ };
+ FLVDemuxer.probe = function (buffer) {
+ var data = new Uint8Array(buffer);
+ var mismatch = { match: false };
+ if (data[0] !== 0x46 || data[1] !== 0x4C || data[2] !== 0x56 || data[3] !== 0x01) {
+ return mismatch;
+ }
+ var hasAudio = ((data[4] & 4) >>> 2) !== 0;
+ var hasVideo = (data[4] & 1) !== 0;
+ var offset = ReadBig32(data, 5);
+ if (offset < 9) {
+ return mismatch;
+ }
+ return {
+ match: true,
+ consumed: offset,
+ dataOffset: offset,
+ hasAudioTrack: hasAudio,
+ hasVideoTrack: hasVideo
+ };
+ };
+ FLVDemuxer.prototype.bindDataSource = function (loader) {
+ loader.onDataArrival = this.parseChunks.bind(this);
+ return this;
+ };
+ Object.defineProperty(FLVDemuxer.prototype, "onTrackMetadata", {
+ // prototype: function(type: string, metadata: any): void
+ get: function () {
+ return this._onTrackMetadata;
+ },
+ set: function (callback) {
+ this._onTrackMetadata = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(FLVDemuxer.prototype, "onMediaInfo", {
+ // prototype: function(mediaInfo: MediaInfo): void
+ get: function () {
+ return this._onMediaInfo;
+ },
+ set: function (callback) {
+ this._onMediaInfo = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(FLVDemuxer.prototype, "onMetaDataArrived", {
+ get: function () {
+ return this._onMetaDataArrived;
+ },
+ set: function (callback) {
+ this._onMetaDataArrived = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(FLVDemuxer.prototype, "onScriptDataArrived", {
+ get: function () {
+ return this._onScriptDataArrived;
+ },
+ set: function (callback) {
+ this._onScriptDataArrived = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(FLVDemuxer.prototype, "onError", {
+ // prototype: function(type: number, info: string): void
+ get: function () {
+ return this._onError;
+ },
+ set: function (callback) {
+ this._onError = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(FLVDemuxer.prototype, "onDataAvailable", {
+ // prototype: function(videoTrack: any, audioTrack: any): void
+ get: function () {
+ return this._onDataAvailable;
+ },
+ set: function (callback) {
+ this._onDataAvailable = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(FLVDemuxer.prototype, "timestampBase", {
+ // timestamp base for output samples, must be in milliseconds
+ get: function () {
+ return this._timestampBase;
+ },
+ set: function (base) {
+ this._timestampBase = base;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(FLVDemuxer.prototype, "overridedDuration", {
+ get: function () {
+ return this._duration;
+ },
+ // Force-override media duration. Must be in milliseconds, int32
+ set: function (duration) {
+ this._durationOverrided = true;
+ this._duration = duration;
+ this._mediaInfo.duration = duration;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(FLVDemuxer.prototype, "overridedHasAudio", {
+ // Force-override audio track present flag, boolean
+ set: function (hasAudio) {
+ this._hasAudioFlagOverrided = true;
+ this._hasAudio = hasAudio;
+ this._mediaInfo.hasAudio = hasAudio;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(FLVDemuxer.prototype, "overridedHasVideo", {
+ // Force-override video track present flag, boolean
+ set: function (hasVideo) {
+ this._hasVideoFlagOverrided = true;
+ this._hasVideo = hasVideo;
+ this._mediaInfo.hasVideo = hasVideo;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ FLVDemuxer.prototype.resetMediaInfo = function () {
+ this._mediaInfo = new _core_media_info_js__WEBPACK_IMPORTED_MODULE_5__.default();
+ };
+ FLVDemuxer.prototype._isInitialMetadataDispatched = function () {
+ if (this._hasAudio && this._hasVideo) { // both audio & video
+ return this._audioInitialMetadataDispatched && this._videoInitialMetadataDispatched;
+ }
+ if (this._hasAudio && !this._hasVideo) { // audio only
+ return this._audioInitialMetadataDispatched;
+ }
+ if (!this._hasAudio && this._hasVideo) { // video only
+ return this._videoInitialMetadataDispatched;
+ }
+ return false;
+ };
+ // function parseChunks(chunk: ArrayBuffer, byteStart: number): number;
+ FLVDemuxer.prototype.parseChunks = function (chunk, byteStart) {
+ if (!this._onError || !this._onMediaInfo || !this._onTrackMetadata || !this._onDataAvailable) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_6__.IllegalStateException('Flv: onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified');
+ }
+ var offset = 0;
+ var le = this._littleEndian;
+ if (byteStart === 0) { // buffer with FLV header
+ if (chunk.byteLength > 13) {
+ var probeData = FLVDemuxer.probe(chunk);
+ offset = probeData.dataOffset;
+ }
+ else {
+ return 0;
+ }
+ }
+ if (this._firstParse) { // handle PreviousTagSize0 before Tag1
+ this._firstParse = false;
+ if (byteStart + offset !== this._dataOffset) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'First time parsing but chunk byteStart invalid!');
+ }
+ var v = new DataView(chunk, offset);
+ var prevTagSize0 = v.getUint32(0, !le);
+ if (prevTagSize0 !== 0) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'PrevTagSize0 !== 0 !!!');
+ }
+ offset += 4;
+ }
+ while (offset < chunk.byteLength) {
+ this._dispatch = true;
+ var v = new DataView(chunk, offset);
+ if (offset + 11 + 4 > chunk.byteLength) {
+ // data not enough for parsing an flv tag
+ break;
+ }
+ var tagType = v.getUint8(0);
+ var dataSize = v.getUint32(0, !le) & 0x00FFFFFF;
+ if (offset + 11 + dataSize + 4 > chunk.byteLength) {
+ // data not enough for parsing actual data body
+ break;
+ }
+ if (tagType !== 8 && tagType !== 9 && tagType !== 18) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Unsupported tag type " + tagType + ", skipped");
+ // consume the whole tag (skip it)
+ offset += 11 + dataSize + 4;
+ continue;
+ }
+ var ts2 = v.getUint8(4);
+ var ts1 = v.getUint8(5);
+ var ts0 = v.getUint8(6);
+ var ts3 = v.getUint8(7);
+ var timestamp = ts0 | (ts1 << 8) | (ts2 << 16) | (ts3 << 24);
+ var streamId = v.getUint32(7, !le) & 0x00FFFFFF;
+ if (streamId !== 0) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Meet tag which has StreamID != 0!');
+ }
+ var dataOffset = offset + 11;
+ switch (tagType) {
+ case 8: // Audio
+ this._parseAudioData(chunk, dataOffset, dataSize, timestamp);
+ break;
+ case 9: // Video
+ this._parseVideoData(chunk, dataOffset, dataSize, timestamp, byteStart + offset);
+ break;
+ case 18: // ScriptDataObject
+ this._parseScriptData(chunk, dataOffset, dataSize);
+ break;
+ }
+ var prevTagSize = v.getUint32(11 + dataSize, !le);
+ if (prevTagSize !== 11 + dataSize) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Invalid PrevTagSize " + prevTagSize);
+ }
+ offset += 11 + dataSize + 4; // tagBody + dataSize + prevTagSize
+ }
+ // dispatch parsed frames to consumer (typically, the remuxer)
+ if (this._isInitialMetadataDispatched()) {
+ if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {
+ this._onDataAvailable(this._audioTrack, this._videoTrack);
+ }
+ }
+ return offset; // consumed bytes, just equals latest offset index
+ };
+ FLVDemuxer.prototype._parseScriptData = function (arrayBuffer, dataOffset, dataSize) {
+ var scriptData = _amf_parser_js__WEBPACK_IMPORTED_MODULE_1__.default.parseScriptData(arrayBuffer, dataOffset, dataSize);
+ if (scriptData.hasOwnProperty('onMetaData')) {
+ if (scriptData.onMetaData == null || typeof scriptData.onMetaData !== 'object') {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Invalid onMetaData structure!');
+ return;
+ }
+ if (this._metadata) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Found another onMetaData tag!');
+ }
+ this._metadata = scriptData;
+ var onMetaData = this._metadata.onMetaData;
+ if (this._onMetaDataArrived) {
+ this._onMetaDataArrived(Object.assign({}, onMetaData));
+ }
+ if (typeof onMetaData.hasAudio === 'boolean') { // hasAudio
+ if (this._hasAudioFlagOverrided === false) {
+ this._hasAudio = onMetaData.hasAudio;
+ this._mediaInfo.hasAudio = this._hasAudio;
+ }
+ }
+ if (typeof onMetaData.hasVideo === 'boolean') { // hasVideo
+ if (this._hasVideoFlagOverrided === false) {
+ this._hasVideo = onMetaData.hasVideo;
+ this._mediaInfo.hasVideo = this._hasVideo;
+ }
+ }
+ if (typeof onMetaData.audiodatarate === 'number') { // audiodatarate
+ this._mediaInfo.audioDataRate = onMetaData.audiodatarate;
+ }
+ if (typeof onMetaData.videodatarate === 'number') { // videodatarate
+ this._mediaInfo.videoDataRate = onMetaData.videodatarate;
+ }
+ if (typeof onMetaData.width === 'number') { // width
+ this._mediaInfo.width = onMetaData.width;
+ }
+ if (typeof onMetaData.height === 'number') { // height
+ this._mediaInfo.height = onMetaData.height;
+ }
+ if (typeof onMetaData.duration === 'number') { // duration
+ if (!this._durationOverrided) {
+ var duration = Math.floor(onMetaData.duration * this._timescale);
+ this._duration = duration;
+ this._mediaInfo.duration = duration;
+ }
+ }
+ else {
+ this._mediaInfo.duration = 0;
+ }
+ if (typeof onMetaData.framerate === 'number') { // framerate
+ var fps_num = Math.floor(onMetaData.framerate * 1000);
+ if (fps_num > 0) {
+ var fps = fps_num / 1000;
+ this._referenceFrameRate.fixed = true;
+ this._referenceFrameRate.fps = fps;
+ this._referenceFrameRate.fps_num = fps_num;
+ this._referenceFrameRate.fps_den = 1000;
+ this._mediaInfo.fps = fps;
+ }
+ }
+ if (typeof onMetaData.keyframes === 'object') { // keyframes
+ this._mediaInfo.hasKeyframesIndex = true;
+ var keyframes = onMetaData.keyframes;
+ this._mediaInfo.keyframesIndex = this._parseKeyframesIndex(keyframes);
+ onMetaData.keyframes = null; // keyframes has been extracted, remove it
+ }
+ else {
+ this._mediaInfo.hasKeyframesIndex = false;
+ }
+ this._dispatch = false;
+ this._mediaInfo.metadata = onMetaData;
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.v(this.TAG, 'Parsed onMetaData');
+ if (this._mediaInfo.isComplete()) {
+ this._onMediaInfo(this._mediaInfo);
+ }
+ }
+ if (Object.keys(scriptData).length > 0) {
+ if (this._onScriptDataArrived) {
+ this._onScriptDataArrived(Object.assign({}, scriptData));
+ }
+ }
+ };
+ FLVDemuxer.prototype._parseKeyframesIndex = function (keyframes) {
+ var times = [];
+ var filepositions = [];
+ // ignore first keyframe which is actually AVC Sequence Header (AVCDecoderConfigurationRecord)
+ for (var i = 1; i < keyframes.times.length; i++) {
+ var time = this._timestampBase + Math.floor(keyframes.times[i] * 1000);
+ times.push(time);
+ filepositions.push(keyframes.filepositions[i]);
+ }
+ return {
+ times: times,
+ filepositions: filepositions
+ };
+ };
+ FLVDemuxer.prototype._parseAudioData = function (arrayBuffer, dataOffset, dataSize, tagTimestamp) {
+ if (dataSize <= 1) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Flv: Invalid audio packet, missing SoundData payload!');
+ return;
+ }
+ if (this._hasAudioFlagOverrided === true && this._hasAudio === false) {
+ // If hasAudio: false indicated explicitly in MediaDataSource,
+ // Ignore all the audio packets
+ return;
+ }
+ var le = this._littleEndian;
+ var v = new DataView(arrayBuffer, dataOffset, dataSize);
+ var soundSpec = v.getUint8(0);
+ var soundFormat = soundSpec >>> 4;
+ if (soundFormat !== 2 && soundFormat !== 10) { // MP3 or AAC
+ this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_4__.default.CODEC_UNSUPPORTED, 'Flv: Unsupported audio codec idx: ' + soundFormat);
+ return;
+ }
+ var soundRate = 0;
+ var soundRateIndex = (soundSpec & 12) >>> 2;
+ if (soundRateIndex >= 0 && soundRateIndex <= 4) {
+ soundRate = this._flvSoundRateTable[soundRateIndex];
+ }
+ else {
+ this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_4__.default.FORMAT_ERROR, 'Flv: Invalid audio sample rate idx: ' + soundRateIndex);
+ return;
+ }
+ var soundSize = (soundSpec & 2) >>> 1; // unused
+ var soundType = (soundSpec & 1);
+ var meta = this._audioMetadata;
+ var track = this._audioTrack;
+ if (!meta) {
+ if (this._hasAudio === false && this._hasAudioFlagOverrided === false) {
+ this._hasAudio = true;
+ this._mediaInfo.hasAudio = true;
+ }
+ // initial metadata
+ meta = this._audioMetadata = {};
+ meta.type = 'audio';
+ meta.id = track.id;
+ meta.timescale = this._timescale;
+ meta.duration = this._duration;
+ meta.audioSampleRate = soundRate;
+ meta.channelCount = (soundType === 0 ? 1 : 2);
+ }
+ if (soundFormat === 10) { // AAC
+ var aacData = this._parseAACAudioData(arrayBuffer, dataOffset + 1, dataSize - 1);
+ if (aacData == undefined) {
+ return;
+ }
+ if (aacData.packetType === 0) { // AAC sequence header (AudioSpecificConfig)
+ if (meta.config) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Found another AudioSpecificConfig!');
+ }
+ var misc = aacData.data;
+ meta.audioSampleRate = misc.samplingRate;
+ meta.channelCount = misc.channelCount;
+ meta.codec = misc.codec;
+ meta.originalCodec = misc.originalCodec;
+ meta.config = misc.config;
+ // The decode result of an aac sample is 1024 PCM samples
+ meta.refSampleDuration = 1024 / meta.audioSampleRate * meta.timescale;
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.v(this.TAG, 'Parsed AudioSpecificConfig');
+ if (this._isInitialMetadataDispatched()) {
+ // Non-initial metadata, force dispatch (or flush) parsed frames to remuxer
+ if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {
+ this._onDataAvailable(this._audioTrack, this._videoTrack);
+ }
+ }
+ else {
+ this._audioInitialMetadataDispatched = true;
+ }
+ // then notify new metadata
+ this._dispatch = false;
+ this._onTrackMetadata('audio', meta);
+ var mi = this._mediaInfo;
+ mi.audioCodec = meta.originalCodec;
+ mi.audioSampleRate = meta.audioSampleRate;
+ mi.audioChannelCount = meta.channelCount;
+ if (mi.hasVideo) {
+ if (mi.videoCodec != null) {
+ mi.mimeType = 'video/x-flv; codecs="' + mi.videoCodec + ',' + mi.audioCodec + '"';
+ }
+ }
+ else {
+ mi.mimeType = 'video/x-flv; codecs="' + mi.audioCodec + '"';
+ }
+ if (mi.isComplete()) {
+ this._onMediaInfo(mi);
+ }
+ }
+ else if (aacData.packetType === 1) { // AAC raw frame data
+ var dts = this._timestampBase + tagTimestamp;
+ var aacSample = { unit: aacData.data, length: aacData.data.byteLength, dts: dts, pts: dts };
+ track.samples.push(aacSample);
+ track.length += aacData.data.length;
+ }
+ else {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.e(this.TAG, "Flv: Unsupported AAC data type " + aacData.packetType);
+ }
+ }
+ else if (soundFormat === 2) { // MP3
+ if (!meta.codec) {
+ // We need metadata for mp3 audio track, extract info from frame header
+ var misc = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, true);
+ if (misc == undefined) {
+ return;
+ }
+ meta.audioSampleRate = misc.samplingRate;
+ meta.channelCount = misc.channelCount;
+ meta.codec = misc.codec;
+ meta.originalCodec = misc.originalCodec;
+ // The decode result of an mp3 sample is 1152 PCM samples
+ meta.refSampleDuration = 1152 / meta.audioSampleRate * meta.timescale;
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.v(this.TAG, 'Parsed MPEG Audio Frame Header');
+ this._audioInitialMetadataDispatched = true;
+ this._onTrackMetadata('audio', meta);
+ var mi = this._mediaInfo;
+ mi.audioCodec = meta.codec;
+ mi.audioSampleRate = meta.audioSampleRate;
+ mi.audioChannelCount = meta.channelCount;
+ mi.audioDataRate = misc.bitRate;
+ if (mi.hasVideo) {
+ if (mi.videoCodec != null) {
+ mi.mimeType = 'video/x-flv; codecs="' + mi.videoCodec + ',' + mi.audioCodec + '"';
+ }
+ }
+ else {
+ mi.mimeType = 'video/x-flv; codecs="' + mi.audioCodec + '"';
+ }
+ if (mi.isComplete()) {
+ this._onMediaInfo(mi);
+ }
+ }
+ // This packet is always a valid audio packet, extract it
+ var data = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, false);
+ if (data == undefined) {
+ return;
+ }
+ var dts = this._timestampBase + tagTimestamp;
+ var mp3Sample = { unit: data, length: data.byteLength, dts: dts, pts: dts };
+ track.samples.push(mp3Sample);
+ track.length += data.length;
+ }
+ };
+ FLVDemuxer.prototype._parseAACAudioData = function (arrayBuffer, dataOffset, dataSize) {
+ if (dataSize <= 1) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Flv: Invalid AAC packet, missing AACPacketType or/and Data!');
+ return;
+ }
+ var result = {};
+ var array = new Uint8Array(arrayBuffer, dataOffset, dataSize);
+ result.packetType = array[0];
+ if (array[0] === 0) {
+ result.data = this._parseAACAudioSpecificConfig(arrayBuffer, dataOffset + 1, dataSize - 1);
+ }
+ else {
+ result.data = array.subarray(1);
+ }
+ return result;
+ };
+ FLVDemuxer.prototype._parseAACAudioSpecificConfig = function (arrayBuffer, dataOffset, dataSize) {
+ var array = new Uint8Array(arrayBuffer, dataOffset, dataSize);
+ var config = null;
+ /* Audio Object Type:
+ 0: Null
+ 1: AAC Main
+ 2: AAC LC
+ 3: AAC SSR (Scalable Sample Rate)
+ 4: AAC LTP (Long Term Prediction)
+ 5: HE-AAC / SBR (Spectral Band Replication)
+ 6: AAC Scalable
+ */
+ var audioObjectType = 0;
+ var originalAudioObjectType = 0;
+ var audioExtensionObjectType = null;
+ var samplingIndex = 0;
+ var extensionSamplingIndex = null;
+ // 5 bits
+ audioObjectType = originalAudioObjectType = array[0] >>> 3;
+ // 4 bits
+ samplingIndex = ((array[0] & 0x07) << 1) | (array[1] >>> 7);
+ if (samplingIndex < 0 || samplingIndex >= this._mpegSamplingRates.length) {
+ this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_4__.default.FORMAT_ERROR, 'Flv: AAC invalid sampling frequency index!');
+ return;
+ }
+ var samplingFrequence = this._mpegSamplingRates[samplingIndex];
+ // 4 bits
+ var channelConfig = (array[1] & 0x78) >>> 3;
+ if (channelConfig < 0 || channelConfig >= 8) {
+ this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_4__.default.FORMAT_ERROR, 'Flv: AAC invalid channel configuration');
+ return;
+ }
+ if (audioObjectType === 5) { // HE-AAC?
+ // 4 bits
+ extensionSamplingIndex = ((array[1] & 0x07) << 1) | (array[2] >>> 7);
+ // 5 bits
+ audioExtensionObjectType = (array[2] & 0x7C) >>> 2;
+ }
+ // workarounds for various browsers
+ var userAgent = self.navigator.userAgent.toLowerCase();
+ if (userAgent.indexOf('firefox') !== -1) {
+ // firefox: use SBR (HE-AAC) if freq less than 24kHz
+ if (samplingIndex >= 6) {
+ audioObjectType = 5;
+ config = new Array(4);
+ extensionSamplingIndex = samplingIndex - 3;
+ }
+ else { // use LC-AAC
+ audioObjectType = 2;
+ config = new Array(2);
+ extensionSamplingIndex = samplingIndex;
+ }
+ }
+ else if (userAgent.indexOf('android') !== -1) {
+ // android: always use LC-AAC
+ audioObjectType = 2;
+ config = new Array(2);
+ extensionSamplingIndex = samplingIndex;
+ }
+ else {
+ // for other browsers, e.g. chrome...
+ // Always use HE-AAC to make it easier to switch aac codec profile
+ audioObjectType = 5;
+ extensionSamplingIndex = samplingIndex;
+ config = new Array(4);
+ if (samplingIndex >= 6) {
+ extensionSamplingIndex = samplingIndex - 3;
+ }
+ else if (channelConfig === 1) { // Mono channel
+ audioObjectType = 2;
+ config = new Array(2);
+ extensionSamplingIndex = samplingIndex;
+ }
+ }
+ config[0] = audioObjectType << 3;
+ config[0] |= (samplingIndex & 0x0F) >>> 1;
+ config[1] = (samplingIndex & 0x0F) << 7;
+ config[1] |= (channelConfig & 0x0F) << 3;
+ if (audioObjectType === 5) {
+ config[1] |= ((extensionSamplingIndex & 0x0F) >>> 1);
+ config[2] = (extensionSamplingIndex & 0x01) << 7;
+ // extended audio object type: force to 2 (LC-AAC)
+ config[2] |= (2 << 2);
+ config[3] = 0;
+ }
+ return {
+ config: config,
+ samplingRate: samplingFrequence,
+ channelCount: channelConfig,
+ codec: 'mp4a.40.' + audioObjectType,
+ originalCodec: 'mp4a.40.' + originalAudioObjectType
+ };
+ };
+ FLVDemuxer.prototype._parseMP3AudioData = function (arrayBuffer, dataOffset, dataSize, requestHeader) {
+ if (dataSize < 4) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Flv: Invalid MP3 packet, header missing!');
+ return;
+ }
+ var le = this._littleEndian;
+ var array = new Uint8Array(arrayBuffer, dataOffset, dataSize);
+ var result = null;
+ if (requestHeader) {
+ if (array[0] !== 0xFF) {
+ return;
+ }
+ var ver = (array[1] >>> 3) & 0x03;
+ var layer = (array[1] & 0x06) >> 1;
+ var bitrate_index = (array[2] & 0xF0) >>> 4;
+ var sampling_freq_index = (array[2] & 0x0C) >>> 2;
+ var channel_mode = (array[3] >>> 6) & 0x03;
+ var channel_count = channel_mode !== 3 ? 2 : 1;
+ var sample_rate = 0;
+ var bit_rate = 0;
+ var object_type = 34; // Layer-3, listed in MPEG-4 Audio Object Types
+ var codec = 'mp3';
+ switch (ver) {
+ case 0: // MPEG 2.5
+ sample_rate = this._mpegAudioV25SampleRateTable[sampling_freq_index];
+ break;
+ case 2: // MPEG 2
+ sample_rate = this._mpegAudioV20SampleRateTable[sampling_freq_index];
+ break;
+ case 3: // MPEG 1
+ sample_rate = this._mpegAudioV10SampleRateTable[sampling_freq_index];
+ break;
+ }
+ switch (layer) {
+ case 1: // Layer 3
+ object_type = 34;
+ if (bitrate_index < this._mpegAudioL3BitRateTable.length) {
+ bit_rate = this._mpegAudioL3BitRateTable[bitrate_index];
+ }
+ break;
+ case 2: // Layer 2
+ object_type = 33;
+ if (bitrate_index < this._mpegAudioL2BitRateTable.length) {
+ bit_rate = this._mpegAudioL2BitRateTable[bitrate_index];
+ }
+ break;
+ case 3: // Layer 1
+ object_type = 32;
+ if (bitrate_index < this._mpegAudioL1BitRateTable.length) {
+ bit_rate = this._mpegAudioL1BitRateTable[bitrate_index];
+ }
+ break;
+ }
+ result = {
+ bitRate: bit_rate,
+ samplingRate: sample_rate,
+ channelCount: channel_count,
+ codec: codec,
+ originalCodec: codec
+ };
+ }
+ else {
+ result = array;
+ }
+ return result;
+ };
+ FLVDemuxer.prototype._parseVideoData = function (arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition) {
+ if (dataSize <= 1) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Flv: Invalid video packet, missing VideoData payload!');
+ return;
+ }
+ if (this._hasVideoFlagOverrided === true && this._hasVideo === false) {
+ // If hasVideo: false indicated explicitly in MediaDataSource,
+ // Ignore all the video packets
+ return;
+ }
+ var spec = (new Uint8Array(arrayBuffer, dataOffset, dataSize))[0];
+ var frameType = (spec & 240) >>> 4;
+ var codecId = spec & 15;
+ if (codecId !== 7 && codecId !== 12) {
+ this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_4__.default.CODEC_UNSUPPORTED, "Flv: Unsupported codec in video frame: " + codecId);
+ return;
+ }
+ if (codecId === 7) {
+ this._parseAVCVideoPacket(arrayBuffer, dataOffset + 1, dataSize - 1, tagTimestamp, tagPosition, frameType);
+ }
+ else if (codecId === 12) {
+ this._parseHVCVideoPacket(arrayBuffer, dataOffset + 1, dataSize - 1, tagTimestamp, tagPosition, frameType);
+ }
+ };
+ FLVDemuxer.prototype._parseAVCVideoPacket = function (arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType) {
+ if (dataSize < 4) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Flv: Invalid AVC packet, missing AVCPacketType or/and CompositionTime');
+ return;
+ }
+ var le = this._littleEndian;
+ var v = new DataView(arrayBuffer, dataOffset, dataSize);
+ var packetType = v.getUint8(0);
+ var cts_unsigned = v.getUint32(0, !le) & 0x00FFFFFF;
+ var cts = (cts_unsigned << 8) >> 8; // convert to 24-bit signed int
+ if (packetType === 0) { // AVCDecoderConfigurationRecord
+ this._parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset + 4, dataSize - 4);
+ }
+ else if (packetType === 1) { // One or more Nalus
+ this._parseAVCVideoData(arrayBuffer, dataOffset + 4, dataSize - 4, tagTimestamp, tagPosition, frameType, cts);
+ }
+ else if (packetType === 2) {
+ // empty, AVC end of sequence
+ }
+ else {
+ this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_4__.default.FORMAT_ERROR, "Flv: Invalid video packet type " + packetType);
+ return;
+ }
+ };
+ FLVDemuxer.prototype._parseAVCDecoderConfigurationRecord = function (arrayBuffer, dataOffset, dataSize) {
+ if (dataSize < 7) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Flv: Invalid AVCDecoderConfigurationRecord, lack of data!');
+ return;
+ }
+ var meta = this._videoMetadata;
+ var track = this._videoTrack;
+ var le = this._littleEndian;
+ var v = new DataView(arrayBuffer, dataOffset, dataSize);
+ if (!meta) {
+ if (this._hasVideo === false && this._hasVideoFlagOverrided === false) {
+ this._hasVideo = true;
+ this._mediaInfo.hasVideo = true;
+ }
+ meta = this._videoMetadata = {};
+ meta.type = 'video';
+ meta.id = track.id;
+ meta.timescale = this._timescale;
+ meta.duration = this._duration;
+ }
+ else {
+ if (typeof meta.avcc !== 'undefined') {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Found another AVCDecoderConfigurationRecord!');
+ }
+ }
+ var version = v.getUint8(0); // configurationVersion
+ var avcProfile = v.getUint8(1); // avcProfileIndication
+ var profileCompatibility = v.getUint8(2); // profile_compatibility
+ var avcLevel = v.getUint8(3); // AVCLevelIndication
+ if (version !== 1 || avcProfile === 0) {
+ this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_4__.default.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord');
+ return;
+ }
+ this._naluLengthSize = (v.getUint8(4) & 3) + 1; // lengthSizeMinusOne
+ if (this._naluLengthSize !== 3 && this._naluLengthSize !== 4) { // holy shit!!!
+ this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_4__.default.FORMAT_ERROR, "Flv: Strange NaluLengthSizeMinusOne: " + (this._naluLengthSize - 1));
+ return;
+ }
+ var spsCount = v.getUint8(5) & 31; // numOfSequenceParameterSets
+ if (spsCount === 0) {
+ this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_4__.default.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No SPS');
+ return;
+ }
+ else if (spsCount > 1) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Flv: Strange AVCDecoderConfigurationRecord: SPS Count = " + spsCount);
+ }
+ var offset = 6;
+ for (var i = 0; i < spsCount; i++) {
+ var len = v.getUint16(offset, !le); // sequenceParameterSetLength
+ offset += 2;
+ if (len === 0) {
+ continue;
+ }
+ // Notice: Nalu without startcode header (00 00 00 01)
+ var sps = new Uint8Array(arrayBuffer, dataOffset + offset, len);
+ offset += len;
+ var config = _sps_parser_js__WEBPACK_IMPORTED_MODULE_2__.default.parseSPS(sps);
+ if (i !== 0) {
+ // ignore other sps's config
+ continue;
+ }
+ meta.codecWidth = config.codec_size.width;
+ meta.codecHeight = config.codec_size.height;
+ meta.presentWidth = config.present_size.width;
+ meta.presentHeight = config.present_size.height;
+ meta.profile = config.profile_string;
+ meta.level = config.level_string;
+ meta.bitDepth = config.bit_depth;
+ meta.chromaFormat = config.chroma_format;
+ meta.sarRatio = config.sar_ratio;
+ meta.frameRate = config.frame_rate;
+ if (config.frame_rate.fixed === false ||
+ config.frame_rate.fps_num === 0 ||
+ config.frame_rate.fps_den === 0) {
+ meta.frameRate = this._referenceFrameRate;
+ }
+ var fps_den = meta.frameRate.fps_den;
+ var fps_num = meta.frameRate.fps_num;
+ meta.refSampleDuration = meta.timescale * (fps_den / fps_num);
+ var codecArray = sps.subarray(1, 4);
+ var codecString = 'avc1.';
+ for (var j = 0; j < 3; j++) {
+ var h = codecArray[j].toString(16);
+ if (h.length < 2) {
+ h = '0' + h;
+ }
+ codecString += h;
+ }
+ meta.codec = codecString;
+ var mi = this._mediaInfo;
+ mi.width = meta.codecWidth;
+ mi.height = meta.codecHeight;
+ mi.fps = meta.frameRate.fps;
+ mi.profile = meta.profile;
+ mi.level = meta.level;
+ mi.refFrames = config.ref_frames;
+ mi.chromaFormat = config.chroma_format_string;
+ mi.sarNum = meta.sarRatio.width;
+ mi.sarDen = meta.sarRatio.height;
+ mi.videoCodec = codecString;
+ if (mi.hasAudio) {
+ if (mi.audioCodec != null) {
+ mi.mimeType = 'video/x-flv; codecs="' + mi.videoCodec + ',' + mi.audioCodec + '"';
+ }
+ }
+ else {
+ mi.mimeType = 'video/x-flv; codecs="' + mi.videoCodec + '"';
+ }
+ if (mi.isComplete()) {
+ this._onMediaInfo(mi);
+ }
+ }
+ var ppsCount = v.getUint8(offset); // numOfPictureParameterSets
+ if (ppsCount === 0) {
+ this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_4__.default.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No PPS');
+ return;
+ }
+ else if (ppsCount > 1) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Flv: Strange AVCDecoderConfigurationRecord: PPS Count = " + ppsCount);
+ }
+ offset++;
+ for (var i = 0; i < ppsCount; i++) {
+ var len = v.getUint16(offset, !le); // pictureParameterSetLength
+ offset += 2;
+ if (len === 0) {
+ continue;
+ }
+ // pps is useless for extracting video information
+ offset += len;
+ }
+ meta.avcc = new Uint8Array(dataSize);
+ meta.avcc.set(new Uint8Array(arrayBuffer, dataOffset, dataSize), 0);
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.v(this.TAG, 'Parsed AVCDecoderConfigurationRecord');
+ if (this._isInitialMetadataDispatched()) {
+ // flush parsed frames
+ if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {
+ this._onDataAvailable(this._audioTrack, this._videoTrack);
+ }
+ }
+ else {
+ this._videoInitialMetadataDispatched = true;
+ }
+ // notify new metadata
+ this._dispatch = false;
+ this._onTrackMetadata('video', meta);
+ };
+ FLVDemuxer.prototype._parseAVCVideoData = function (arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType, cts) {
+ var le = this._littleEndian;
+ var v = new DataView(arrayBuffer, dataOffset, dataSize);
+ var units = [], length = 0;
+ var offset = 0;
+ var lengthSize = this._naluLengthSize;
+ var dts = this._timestampBase + tagTimestamp;
+ var keyframe = (frameType === 1); // from FLV Frame Type constants
+ while (offset < dataSize) {
+ if (offset + 4 >= dataSize) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Malformed Nalu near timestamp " + dts + ", offset = " + offset + ", dataSize = " + dataSize);
+ break; // data not enough for next Nalu
+ }
+ // Nalu with length-header (AVC1)
+ var naluSize = v.getUint32(offset, !le); // Big-Endian read
+ if (lengthSize === 3) {
+ naluSize >>>= 8;
+ }
+ if (naluSize > dataSize - lengthSize) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Malformed Nalus near timestamp " + dts + ", NaluSize > DataSize!");
+ return;
+ }
+ var unitType = v.getUint8(offset + lengthSize) & 0x1F;
+ if (unitType === 5) { // IDR
+ keyframe = true;
+ }
+ var data = new Uint8Array(arrayBuffer, dataOffset + offset, lengthSize + naluSize);
+ var unit = { type: unitType, data: data };
+ units.push(unit);
+ length += data.byteLength;
+ offset += lengthSize + naluSize;
+ }
+ if (units.length) {
+ var track = this._videoTrack;
+ var avcSample = {
+ units: units,
+ length: length,
+ isKeyframe: keyframe,
+ dts: dts,
+ cts: cts,
+ pts: (dts + cts)
+ };
+ if (keyframe) {
+ avcSample.fileposition = tagPosition;
+ }
+ track.samples.push(avcSample);
+ track.length += length;
+ }
+ };
+ FLVDemuxer.prototype._parseHVCVideoPacket = function (arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType) {
+ if (dataSize < 4) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Flv: Invalid HVC packet, missing HVCPacketType or/and CompositionTime');
+ return;
+ }
+ var le = this._littleEndian;
+ var v = new DataView(arrayBuffer, dataOffset, dataSize);
+ var packetType = v.getUint8(0);
+ var cts_unsigned = v.getUint32(0, !le) & 0x00FFFFFF;
+ var cts = (cts_unsigned << 8) >> 8; // convert to 24-bit signed int
+ if (packetType === 0) { // HVCDecoderConfigurationRecord
+ this._parseHVCDecoderConfigurationRecord(arrayBuffer, dataOffset + 4, dataSize - 4);
+ }
+ else if (packetType === 1) { // One or more Nalus
+ this._parseHVCVideoData(arrayBuffer, dataOffset + 4, dataSize - 4, tagTimestamp, tagPosition, frameType, cts);
+ }
+ else if (packetType === 2) {
+ // empty, HVC end of sequence
+ }
+ else {
+ this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_4__.default.FORMAT_ERROR, "Flv: Invalid video packet type " + packetType);
+ return;
+ }
+ };
+ FLVDemuxer.prototype._parseHVCDecoderConfigurationRecord = function (arrayBuffer, dataOffset, dataSize) {
+ if (dataSize < 23) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Flv: Invalid HVCDecoderConfigurationRecord, lack of data!');
+ return;
+ }
+ var meta = this._videoMetadata;
+ var track = this._videoTrack;
+ var le = this._littleEndian;
+ var v = new DataView(arrayBuffer, dataOffset, dataSize);
+ if (!meta) {
+ if (this._hasVideo === false && this._hasVideoFlagOverrided === false) {
+ this._hasVideo = true;
+ this._mediaInfo.hasVideo = true;
+ }
+ meta = this._videoMetadata = {};
+ meta.type = 'video';
+ meta.id = track.id;
+ meta.timescale = this._timescale;
+ meta.duration = this._duration;
+ }
+ else {
+ if (typeof meta.avcc !== 'undefined') {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Found another HVCDecoderConfigurationRecord!');
+ }
+ }
+ var version = v.getUint8(0); // configurationVersion
+ if (version !== 1) {
+ this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_4__.default.FORMAT_ERROR, 'Flv: Invalid HVCDecoderConfigurationRecord');
+ return;
+ }
+ this._naluLengthSize = (v.getUint8(21) & 3) + 1; // lengthSizeMinusOne
+ if (this._naluLengthSize !== 3 && this._naluLengthSize !== 4) { // holy shit!!!
+ this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_4__.default.FORMAT_ERROR, "Flv: Strange NaluLengthSizeMinusOne: " + (this._naluLengthSize - 1));
+ return;
+ }
+ var numOfArrays = v.getUint8(22);
+ var offset = 23;
+ var vpsCount, spsCount, ppsCount;
+ var spss = [];
+ for (var i = 0; i < numOfArrays; i++) {
+ var unitType = v.getUint8(offset++) & 0x3F;
+ var numNalus = v.getUint16(offset, !le);
+ offset += 2;
+ if (numNalus === 0) {
+ continue;
+ }
+ switch (unitType) {
+ case 32:
+ vpsCount += numNalus;
+ break;
+ case 33:
+ spsCount += numNalus;
+ break;
+ case 34:
+ ppsCount += numNalus;
+ break;
+ default:
+ break;
+ }
+ for (var j = 0; j < numNalus; j++) {
+ var nauUnitLength = v.getUint16(offset, !le);
+ offset += 2;
+ if (nauUnitLength === 0) {
+ continue;
+ }
+ if (unitType === 33) {
+ // Notice: Nalu without startcode header (00 00 00 01)
+ var sps_1 = new Uint8Array(arrayBuffer, dataOffset + offset, nauUnitLength);
+ spss.push(sps_1);
+ }
+ offset += nauUnitLength;
+ }
+ }
+ if (vpsCount === 0) {
+ this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_4__.default.FORMAT_ERROR, 'Flv: Invalid HVCDecoderConfigurationRecord: No VPS');
+ return;
+ }
+ else if (vpsCount > 1) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Flv: Strange HVCDecoderConfigurationRecord: VPS Count = " + vpsCount);
+ }
+ if (spsCount === 0) {
+ this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_4__.default.FORMAT_ERROR, 'Flv: Invalid HVCDecoderConfigurationRecord: No SPS');
+ return;
+ }
+ else if (spsCount > 1) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Flv: Strange HVCDecoderConfigurationRecord: SPS Count = " + spsCount);
+ }
+ if (ppsCount === 0) {
+ this._onError(_demux_errors_js__WEBPACK_IMPORTED_MODULE_4__.default.FORMAT_ERROR, 'Flv: Invalid HVCDecoderConfigurationRecord: No PPS');
+ return;
+ }
+ else if (ppsCount > 1) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Flv: Strange HVCDecoderConfigurationRecord: PPS Count = " + spsCount);
+ }
+ var sps = spss[0]; // ignore other sps's config
+ var config = _hevc_sps_parser_js__WEBPACK_IMPORTED_MODULE_3__.default.parseSPS(sps);
+ meta.codecWidth = config.codec_size.width;
+ meta.codecHeight = config.codec_size.height;
+ meta.presentWidth = config.present_size.width;
+ meta.presentHeight = config.present_size.height;
+ meta.profile = config.profile_string;
+ meta.level = config.level_string;
+ meta.profile_idc = config.profile_idc;
+ meta.level_idc = config.level_idc;
+ meta.bitDepth = config.bit_depth;
+ meta.chromaFormat = config.chroma_format;
+ meta.sarRatio = config.sar_ratio;
+ meta.frameRate = config.frame_rate;
+ if (config.frame_rate.fixed === false ||
+ config.frame_rate.fps_num === 0 ||
+ config.frame_rate.fps_den === 0) {
+ meta.frameRate = this._referenceFrameRate;
+ }
+ var fps_den = meta.frameRate.fps_den;
+ var fps_num = meta.frameRate.fps_num;
+ meta.refSampleDuration = meta.timescale * (fps_den / fps_num);
+ /**
+ * https://tools.axinom.com/capabilities/media
+ * 视频Profile
+ *
+ * Main: `hvc1.1.6.L93.B0`
+ * Main 10: `hvc1.2.4.L93.B0`
+ * Main still-picture: `hvc1.3.E.L93.B0`
+ * Range extensions: `hvc1.4.10.L93.B0`
+ */
+ var codecString = 'hvc1.' + meta.profile_idc + '.' + '1' + '.L' + meta.level_idc + '.B0';
+ meta.codec = codecString;
+ var mi = this._mediaInfo;
+ mi.width = meta.codecWidth;
+ mi.height = meta.codecHeight;
+ mi.fps = meta.frameRate.fps;
+ mi.profile = meta.profile;
+ mi.level = meta.level;
+ mi.refFrames = config.ref_frames;
+ mi.chromaFormat = config.chroma_format_string;
+ mi.sarNum = meta.sarRatio.width;
+ mi.sarDen = meta.sarRatio.height;
+ mi.videoCodec = codecString;
+ if (mi.hasAudio) {
+ if (mi.audioCodec != null) {
+ mi.mimeType = 'video/x-flv; codecs="' + mi.videoCodec + ',' + mi.audioCodec + '"';
+ }
+ }
+ else {
+ mi.mimeType = 'video/x-flv; codecs="' + mi.videoCodec + '"';
+ }
+ if (mi.isComplete()) {
+ this._onMediaInfo(mi);
+ }
+ meta.avcc = new Uint8Array(dataSize);
+ meta.avcc.set(new Uint8Array(arrayBuffer, dataOffset, dataSize), 0);
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.v(this.TAG, 'Parsed HVCDecoderConfigurationRecord');
+ if (this._isInitialMetadataDispatched()) {
+ // flush parsed frames
+ if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {
+ this._onDataAvailable(this._audioTrack, this._videoTrack);
+ }
+ }
+ else {
+ this._videoInitialMetadataDispatched = true;
+ }
+ // notify new metadata
+ this._dispatch = false;
+ this._onTrackMetadata('video', meta);
+ };
+ FLVDemuxer.prototype._parseHVCVideoData = function (arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType, cts) {
+ var le = this._littleEndian;
+ var v = new DataView(arrayBuffer, dataOffset, dataSize);
+ var units = [], length = 0;
+ var offset = 0;
+ var lengthSize = this._naluLengthSize;
+ var dts = this._timestampBase + tagTimestamp;
+ var keyframe = (frameType === 1); // from FLV Frame Type constants
+ while (offset < dataSize) {
+ if (offset + 4 >= dataSize) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Malformed Nalu near timestamp " + dts + ", offset = " + offset + ", dataSize = " + dataSize);
+ break; // data not enough for next Nalu
+ }
+ // Nalu with length-header (HVC1)
+ var naluSize = v.getUint32(offset, !le); // Big-Endian read
+ if (lengthSize === 3) {
+ naluSize >>>= 8;
+ }
+ if (naluSize > dataSize - lengthSize) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Malformed Nalus near timestamp " + dts + ", NaluSize > DataSize!");
+ return;
+ }
+ var unitType = (v.getUint8(offset + lengthSize) >> 1) & 0x3F;
+ if (unitType >= 16 && unitType <= 23) { // IDR
+ keyframe = true;
+ }
+ var data = new Uint8Array(arrayBuffer, dataOffset + offset, lengthSize + naluSize);
+ var unit = { type: unitType, data: data };
+ units.push(unit);
+ length += data.byteLength;
+ offset += lengthSize + naluSize;
+ }
+ if (units.length) {
+ var track = this._videoTrack;
+ var hvcSample = {
+ units: units,
+ length: length,
+ isKeyframe: keyframe,
+ dts: dts,
+ cts: cts,
+ pts: (dts + cts)
+ };
+ if (keyframe) {
+ hvcSample.fileposition = tagPosition;
+ }
+ track.samples.push(hvcSample);
+ track.length += length;
+ }
+ };
+ return FLVDemuxer;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (FLVDemuxer);
+
+
+/***/ }),
+
+/***/ "./src/demux/hevc-sps-parser.js":
+/*!**************************************!*\
+ !*** ./src/demux/hevc-sps-parser.js ***!
+ \**************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _exp_golomb_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./exp-golomb.js */ "./src/demux/exp-golomb.js");
+/* harmony import */ var _sps_parser_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sps-parser.js */ "./src/demux/sps-parser.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ * Copyright (C) 2022 Nanuns. All Rights Reserved.
+ *
+ * @author zheng qian
+ * @author nanuns
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+var HevcSPSParser = /** @class */ (function () {
+ function HevcSPSParser() {
+ }
+ HevcSPSParser.parseSPS = function (uint8array) {
+ var rbsp = _sps_parser_js__WEBPACK_IMPORTED_MODULE_1__.default._ebsp2rbsp(uint8array);
+ var gb = new _exp_golomb_js__WEBPACK_IMPORTED_MODULE_0__.default(rbsp);
+ var hvcc = {};
+ gb.readBits(16); // nal_unit_header
+ gb.readBits(4); // sps_video_parameter_set_id
+ var max_sub_layers_minus1 = gb.readBits(3); // sps_max_sub_layers_minus1
+ gb.readBits(1); // sps_temporal_id_nesting_flag
+ HevcSPSParser._hvcc_parse_ptl(gb, hvcc, max_sub_layers_minus1);
+ gb.readUEG(); // seq_parameter_set_id
+ var separate_colour_plane_flag = 0;
+ var chroma_format = gb.readUEG(); // chroma_format_idc
+ if (chroma_format == 3) {
+ separate_colour_plane_flag = gb.readBits(1); // separate_colour_plane_flag
+ }
+ hvcc.sar_width = hvcc.sar_height = 1;
+ hvcc.conf_win_left_offset = hvcc.conf_win_right_offset =
+ hvcc.conf_win_top_offset = hvcc.conf_win_bottom_offset = 0;
+ hvcc.def_disp_win_left_offset = hvcc.def_disp_win_right_offset =
+ hvcc.def_disp_win_top_offset = hvcc.def_disp_win_bottom_offset = 0;
+ var pic_width_in_luma_samples = gb.readUEG(); // pic_width_in_luma_samples
+ var pic_height_in_luma_samples = gb.readUEG(); // pic_height_in_luma_samples
+ var left_offset = 0, right_offset = 0, top_offset = 0, bottom_offset = 0;
+ var conformance_window_flag = gb.readBits(1);
+ if (conformance_window_flag) {
+ hvcc.conf_win_left_offset = gb.readUEG(); // conf_win_left_offset
+ hvcc.conf_win_right_offset = gb.readUEG(); // conf_win_right_offset
+ hvcc.conf_win_top_offset = gb.readUEG(); // conf_win_top_offset
+ hvcc.conf_win_bottom_offset = gb.readUEG(); // conf_win_bottom_offset
+ if (hvcc.default_display_window_flag === 1) {
+ left_offset = hvcc.conf_win_left_offset + hvcc.def_disp_win_left_offset;
+ right_offset = hvcc.conf_win_right_offset + hvcc.def_disp_win_right_offset;
+ top_offset = hvcc.conf_win_top_offset + hvcc.def_disp_win_top_offset;
+ bottom_offset = hvcc.conf_win_bottom_offset + hvcc.def_disp_win_bottom_offset;
+ }
+ }
+ var bit_depth = gb.readUEG() + 8; // bit_depth_luma_minus8
+ gb.readUEG(); // bit_depth_chroma_minus8
+ var log2_max_pic_order_cnt_lsb_minus4 = gb.readUEG();
+ /* sps_sub_layer_ordering_info_present_flag */
+ var i = gb.readBits(1) ? 0 : max_sub_layers_minus1;
+ for (; i <= max_sub_layers_minus1; i++) {
+ HevcSPSParser._skip_sub_layer_ordering_info(gb);
+ }
+ gb.readUEG(); // log2_min_luma_coding_block_size_minus3
+ gb.readUEG(); // log2_diff_max_min_luma_coding_block_size
+ gb.readUEG(); // log2_min_transform_block_size_minus2
+ gb.readUEG(); // log2_diff_max_min_transform_block_size
+ gb.readUEG(); // max_transform_hierarchy_depth_inter
+ gb.readUEG(); // max_transform_hierarchy_depth_intra
+ if (gb.readBits(1) && // scaling_list_enabled_flag
+ gb.readBits(1)) { // sps_scaling_list_data_present_flag
+ HevcSPSParser._skip_scaling_list_data(gb);
+ }
+ gb.readBits(1); // amp_enabled_flag
+ gb.readBits(1); // sample_adaptive_offset_enabled_flag
+ if (gb.readBits(1)) { // pcm_enabled_flag
+ gb.readBits(4); // pcm_sample_bit_depth_luma_minus1
+ gb.readBits(4); // pcm_sample_bit_depth_chroma_minus1
+ gb.readUEG(); // log2_min_pcm_luma_coding_block_size_minus3
+ gb.readUEG(); // log2_diff_max_min_pcm_luma_coding_block_size
+ gb.readBits(1); // pcm_loop_filter_disabled_flag
+ }
+ var num_delta_pocs = [];
+ var num_short_term_ref_pic_sets = gb.readUEG();
+ for (i = 0; i < num_short_term_ref_pic_sets; i++) {
+ var ret = HevcSPSParser._parse_rps(gb, i, num_short_term_ref_pic_sets, num_delta_pocs);
+ if (ret < 0)
+ return ret;
+ }
+ if (gb.readBits(1)) { // long_term_ref_pics_present_flag
+ var num_long_term_ref_pics_sps = gb.readUEG();
+ for (i = 0; i < num_long_term_ref_pics_sps; i++) { // num_long_term_ref_pics_sps
+ var len = Math.min(log2_max_pic_order_cnt_lsb_minus4 + 4, 16);
+ // lt_ref_pic_poc_lsb_sps[i]
+ if (len > 32) {
+ var d = len / 32;
+ var t = len % 32;
+ for (var j = 0; j < d; j++) {
+ gb.readBits(32);
+ }
+ gb.readBits(t);
+ }
+ else {
+ gb.readBits(len);
+ }
+ gb.readBits(1); // used_by_curr_pic_lt_sps_flag[i]
+ }
+ }
+ var ref_frames = 1; // TODO
+ gb.readBits(1); // sps_temporal_mvp_enabled_flag
+ gb.readBits(1); // strong_intra_smoothing_enabled_flag
+ if (gb.readBits(1)) { // vui_parameters_present_flag
+ HevcSPSParser._hvcc_parse_vui(gb, hvcc, max_sub_layers_minus1);
+ }
+ var profile_string = HevcSPSParser.getProfileString(hvcc.profile_idc);
+ var level_string = HevcSPSParser.getLevelString(hvcc.level_idc);
+ var sarScale = 1;
+ if (hvcc.sar_width !== 1 || hvcc.sar_height !== 1) {
+ sarScale = hvcc.sar_width / hvcc.sar_height;
+ }
+ var codec_width = pic_width_in_luma_samples, codec_height = pic_height_in_luma_samples;
+ var sub_wc = (1 === chroma_format || 2 == chroma_format) && (0 === separate_colour_plane_flag) ? 2 : 1;
+ var sub_hc = (1 === chroma_format) && (0 === separate_colour_plane_flag) ? 2 : 1;
+ codec_width -= sub_wc * (hvcc.conf_win_left_offset + hvcc.conf_win_right_offset);
+ codec_height -= sub_hc * (hvcc.conf_win_top_offset + hvcc.conf_win_bottom_offset);
+ var present_width = Math.ceil(codec_width * sarScale);
+ gb.destroy();
+ gb = null;
+ return {
+ profile_string: profile_string,
+ level_string: level_string,
+ profile_idc: hvcc.profile_idc,
+ level_idc: hvcc.level_idc,
+ bit_depth: bit_depth,
+ ref_frames: ref_frames,
+ chroma_format: chroma_format,
+ chroma_format_string: HevcSPSParser.getChromaFormatString(chroma_format),
+ frame_rate: {
+ fixed: hvcc.fps_fixed,
+ fps: hvcc.fps,
+ fps_den: hvcc.fps_den,
+ fps_num: hvcc.fps_num
+ },
+ sar_ratio: {
+ width: hvcc.sar_width,
+ height: hvcc.sar_height
+ },
+ codec_size: {
+ width: codec_width,
+ height: codec_height
+ },
+ present_size: {
+ width: present_width,
+ height: codec_height
+ }
+ };
+ };
+ HevcSPSParser._hvcc_parse_ptl = function (gb, hvcc, max_sub_layers_minus1) {
+ gb.readBits(2); // profile_space
+ var tier_flag = gb.readBits(1);
+ var profile_idc = gb.readBits(5); // profile_idc
+ gb.readBits(32); // profile_compatibility_flags
+ gb.readBits(32); // constraint_indicator_flags
+ gb.readBits(16);
+ var level_idc = gb.readByte(); // level_idc
+ if (hvcc.tier_flag === undefined || hvcc.level_idc === undefined ||
+ hvcc.tier_flag < tier_flag) {
+ hvcc.level_idc = level_idc;
+ }
+ else {
+ hvcc.level_idc = Math.max(hvcc.level_idc, level_idc);
+ }
+ hvcc.profile_idc = Math.max(hvcc.profile_idc === undefined ? 0 : hvcc.profile_idc, profile_idc);
+ var sub_layer_profile_present_flag = [];
+ var sub_layer_level_present_flag = [];
+ for (var i = 0; i < max_sub_layers_minus1; i++) {
+ sub_layer_profile_present_flag.push(gb.readBits(1));
+ sub_layer_level_present_flag.push(gb.readBits(1));
+ }
+ if (max_sub_layers_minus1 > 0) {
+ for (var i = max_sub_layers_minus1; i < 8; i++) {
+ gb.readBits(2); // reserved_zero_2bits[i]
+ }
+ }
+ for (i = 0; i < max_sub_layers_minus1; i++) {
+ if (sub_layer_profile_present_flag[i]) {
+ /*
+ * sub_layer_profile_space[i] u(2)
+ * sub_layer_tier_flag[i] u(1)
+ * sub_layer_profile_idc[i] u(5)
+ * sub_layer_profile_compatibility_flag[i][0..31] u(32)
+ * sub_layer_progressive_source_flag[i] u(1)
+ * sub_layer_interlaced_source_flag[i] u(1)
+ * sub_layer_non_packed_constraint_flag[i] u(1)
+ * sub_layer_frame_only_constraint_flag[i] u(1)
+ * sub_layer_reserved_zero_44bits[i] u(44)
+ */
+ gb.readBits(32);
+ gb.readBits(32);
+ gb.readBits(24);
+ }
+ if (sub_layer_level_present_flag[i]) {
+ gb.readByte();
+ }
+ }
+ };
+ HevcSPSParser._parse_rps = function (gb, rps_idx, num_rps, num_delta_pocs) {
+ if (rps_idx && gb.readBits(1)) { // inter_ref_pic_set_prediction_flag
+ /* this should only happen for slice headers, and this isn't one */
+ if (rps_idx >= num_rps)
+ return -1;
+ gb.readBits(1); // delta_rps_sign
+ gb.readUEG(); // abs_delta_rps_minus1
+ num_delta_pocs[rps_idx] = 0;
+ for (var i = 0; i <= num_delta_pocs[rps_idx - 1]; i++) {
+ var use_delta_flag = 0;
+ var used_by_curr_pic_flag = gb.readBits(1);
+ if (!used_by_curr_pic_flag) {
+ use_delta_flag = gb.readBits(1);
+ }
+ if (used_by_curr_pic_flag || use_delta_flag) {
+ num_delta_pocs[rps_idx]++;
+ }
+ }
+ }
+ else {
+ var num_negative_pics = gb.readUEG();
+ var num_positive_pics = gb.readUEG();
+ //if ((num_positive_pics + num_negative_pics) * 2 > gb.getBitsLeft())
+ // return -1;
+ num_delta_pocs[rps_idx] = num_negative_pics + num_positive_pics;
+ for (var i = 0; i < num_negative_pics; i++) {
+ gb.readUEG(); // delta_poc_s0_minus1[rps_idx]
+ gb.readBits(1); // used_by_curr_pic_s0_flag[rps_idx]
+ }
+ for (i = 0; i < num_positive_pics; i++) {
+ gb.readUEG(); // delta_poc_s1_minus1[rps_idx]
+ gb.readBits(1); // used_by_curr_pic_s1_flag[rps_idx]
+ }
+ }
+ return 0;
+ };
+ HevcSPSParser._hvcc_parse_vui = function (gb, hvcc, max_sub_layers_minus1) {
+ if (gb.readBits(1)) { // aspect_ratio_info_present_flag
+ if (gb.readByte() == 255) { // aspect_ratio_idc
+ hvcc.sar_width = gb.readBits(16); // sar_width u(16)
+ hvcc.sar_height = gb.readBits(16); // sar_height u(16)
+ }
+ }
+ if (gb.readBits(1)) { // overscan_info_present_flag
+ gb.readBits(1); // overscan_appropriate_flag
+ }
+ if (gb.readBits(1)) { // video_signal_type_present_flag
+ gb.readBits(4); // video_format u(3), video_full_range_flag u(1)
+ if (gb.readBits(1)) { // colour_description_present_flag
+ /*
+ * colour_primaries u(8)
+ * transfer_characteristics u(8)
+ * matrix_coeffs u(8)
+ */
+ gb.readBits(24);
+ }
+ }
+ if (gb.readBits(1)) { // chroma_loc_info_present_flag
+ gb.readUEG(); // chroma_sample_loc_type_top_field
+ gb.readUEG(); // chroma_sample_loc_type_bottom_field
+ }
+ /*
+ * neutral_chroma_indication_flag u(1)
+ * field_seq_flag u(1)
+ * frame_field_info_present_flag u(1)
+ */
+ gb.readBits(3);
+ hvcc.default_display_window_flag = gb.readBits(1); // default_display_window_flag
+ if (hvcc.default_display_window_flag) {
+ hvcc.def_disp_win_left_offset = gb.readUEG(); // def_disp_win_left_offset
+ hvcc.def_disp_win_right_offset = gb.readUEG(); // def_disp_win_right_offset
+ hvcc.def_disp_win_top_offset = gb.readUEG(); // def_disp_win_top_offset
+ hvcc.def_disp_win_bottom_offset = gb.readUEG(); // def_disp_win_bottom_offset
+ }
+ if (gb.readBits(1)) { // vui_timing_info_present_flag
+ HevcSPSParser._skip_timing_info(gb, hvcc);
+ if (gb.readBits(1)) { // vui_hrd_parameters_present_flag
+ HevcSPSParser._skip_hrd_parameters(gb, hvcc, 1, max_sub_layers_minus1);
+ }
+ }
+ if (gb.readBits(1)) { // bitstream_restriction_flag
+ /*
+ * tiles_fixed_structure_flag u(1)
+ * motion_vectors_over_pic_boundaries_flag u(1)
+ * restricted_ref_pic_lists_flag u(1)
+ */
+ gb.readBits(3);
+ gb.readUEG(); // min_spatial_segmentation_idc
+ gb.readUEG(); // max_bytes_per_pic_denom
+ gb.readUEG(); // max_bits_per_min_cu_denom
+ gb.readUEG(); // log2_max_mv_length_horizontal
+ gb.readUEG(); // log2_max_mv_length_vertical
+ }
+ };
+ HevcSPSParser._skip_sub_layer_ordering_info = function (gb, hvcc) {
+ gb.readUEG(); // max_dec_pic_buffering_minus1
+ gb.readUEG(); // max_num_reorder_pics
+ gb.readUEG(); // max_latency_increase_plus1
+ };
+ HevcSPSParser._skip_scaling_list_data = function (gb) {
+ for (var i = 0; i < 4; i++) {
+ for (var j = 0; j < (i == 3 ? 2 : 6); j++) {
+ if (!gb.readBits(1)) { // scaling_list_pred_mode_flag[i][j]
+ gb.readUEG(); // scaling_list_pred_matrix_id_delta[i][j]
+ }
+ else {
+ var num_coeffs = Math.min(64, 1 << (4 + (i << 1)));
+ if (i > 1) {
+ gb.readSEG(); // scaling_list_dc_coef_minus8[i-2][j]
+ }
+ for (var k = 0; k < num_coeffs; k++) {
+ gb.readSEG(); // scaling_list_delta_coef
+ }
+ }
+ }
+ }
+ };
+ HevcSPSParser._skip_sub_layer_hrd_parameters = function (gb, cpb_cnt_minus1, sub_pic_hrd_params_present_flag) {
+ for (var i = 0; i <= cpb_cnt_minus1; i++) {
+ gb.readUEG(); // bit_rate_value_minus1
+ gb.readUEG(); // cpb_size_value_minus1
+ if (sub_pic_hrd_params_present_flag) {
+ gb.readUEG(); // cpb_size_du_value_minus1
+ gb.readUEG(); // bit_rate_du_value_minus1
+ }
+ gb.readBits(1); // cbr_flag
+ }
+ };
+ HevcSPSParser._skip_timing_info = function (gb, hvcc) {
+ hvcc.fps_den = gb.readBits(32); // num_units_in_tick
+ hvcc.fps_num = gb.readBits(32); // time_scale
+ if (hvcc.fps_den > 0) {
+ hvcc.fps = hvcc.fps_num / hvcc.fps_den;
+ }
+ var num_ticks_poc_diff_one_minus1 = 0;
+ if (gb.readBits(1)) { // poc_proportional_to_timing_flag
+ num_ticks_poc_diff_one_minus1 = gb.readUEG(); // num_ticks_poc_diff_one_minus1
+ if (num_ticks_poc_diff_one_minus1 >= 0) {
+ hvcc.fps /= (num_ticks_poc_diff_one_minus1 + 1);
+ }
+ }
+ };
+ HevcSPSParser._skip_hrd_parameters = function (gb, cprms_present_flag, max_sub_layers_minus1) {
+ var sub_pic_hrd_params_present_flag = 0;
+ var nal_hrd_parameters_present_flag = 0;
+ var vcl_hrd_parameters_present_flag = 0;
+ if (cprms_present_flag) {
+ nal_hrd_parameters_present_flag = gb.readBits(1);
+ vcl_hrd_parameters_present_flag = gb.readBits(1);
+ if (nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag) {
+ var sub_pic_hrd_params_present_flag_1 = gb.readBits(1);
+ if (sub_pic_hrd_params_present_flag_1) {
+ /*
+ * tick_divisor_minus2 u(8)
+ * du_cpb_removal_delay_increment_length_minus1 u(5)
+ * sub_pic_cpb_params_in_pic_timing_sei_flag u(1)
+ * dpb_output_delay_du_length_minus1 u(5)
+ */
+ gb.readBits(19);
+ }
+ /*
+ * bit_rate_scale u(4)
+ * cpb_size_scale u(4)
+ */
+ gb.readByte();
+ if (sub_pic_hrd_params_present_flag_1) {
+ gb.readBits(4); // cpb_size_du_scale
+ }
+ /*
+ * initial_cpb_removal_delay_length_minus1 u(5)
+ * au_cpb_removal_delay_length_minus1 u(5)
+ * dpb_output_delay_length_minus1 u(5)
+ */
+ gb.readBits(15);
+ }
+ }
+ for (var i = 0; i <= max_sub_layers_minus1; i++) {
+ var cpb_cnt_minus1 = 0;
+ var low_delay_hrd_flag = 0;
+ var fixed_pic_rate_within_cvs_flag = 0;
+ var fixed_pic_rate_general_flag = gb.readBits(1);
+ hvcc.fps_fixed = fixed_pic_rate_general_flag;
+ if (!fixed_pic_rate_general_flag) {
+ fixed_pic_rate_within_cvs_flag = gb.readBits(1);
+ }
+ if (fixed_pic_rate_within_cvs_flag) {
+ gb.readUEG(); // elemental_duration_in_tc_minus1
+ }
+ else {
+ low_delay_hrd_flag = gb.readBits(1);
+ }
+ if (!low_delay_hrd_flag) {
+ cpb_cnt_minus1 = gb.readUEG(gb);
+ }
+ if (nal_hrd_parameters_present_flag) {
+ HevcSPSParser._skip_sub_layer_hrd_parameters(gb, cpb_cnt_minus1, sub_pic_hrd_params_present_flag);
+ }
+ if (vcl_hrd_parameters_present_flag) {
+ HevcSPSParser._skip_sub_layer_hrd_parameters(gb, cpb_cnt_minus1, sub_pic_hrd_params_present_flag);
+ }
+ }
+ };
+ HevcSPSParser.getProfileString = function (profile_idc) {
+ switch (profile_idc) {
+ case 1:
+ return 'Main';
+ case 2:
+ return 'Main10';
+ case 3:
+ return 'MainSP'; // MainStillPictrue
+ case 4:
+ return 'Rext';
+ case 9:
+ return 'SCC';
+ default:
+ return 'Unknown';
+ }
+ };
+ HevcSPSParser.getLevelString = function (level_idc) {
+ return (level_idc / 30).toFixed(1);
+ };
+ HevcSPSParser.getChromaFormatString = function (chroma) {
+ switch (chroma) {
+ case 0:
+ return '4:0:0';
+ case 1:
+ return '4:2:0';
+ case 2:
+ return '4:2:2';
+ case 3:
+ return '4:4:4';
+ default:
+ return 'Unknown';
+ }
+ };
+ return HevcSPSParser;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (HevcSPSParser);
+
+
+/***/ }),
+
+/***/ "./src/demux/sps-parser.js":
+/*!*********************************!*\
+ !*** ./src/demux/sps-parser.js ***!
+ \*********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _exp_golomb_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./exp-golomb.js */ "./src/demux/exp-golomb.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var SPSParser = /** @class */ (function () {
+ function SPSParser() {
+ }
+ SPSParser._ebsp2rbsp = function (uint8array) {
+ var src = uint8array;
+ var src_length = src.byteLength;
+ var dst = new Uint8Array(src_length);
+ var dst_idx = 0;
+ for (var i = 0; i < src_length; i++) {
+ if (i >= 2) {
+ // Unescape: Skip 0x03 after 00 00
+ if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {
+ continue;
+ }
+ }
+ dst[dst_idx] = src[i];
+ dst_idx++;
+ }
+ return new Uint8Array(dst.buffer, 0, dst_idx);
+ };
+ SPSParser.parseSPS = function (uint8array) {
+ var rbsp = SPSParser._ebsp2rbsp(uint8array);
+ var gb = new _exp_golomb_js__WEBPACK_IMPORTED_MODULE_0__.default(rbsp);
+ gb.readByte();
+ var profile_idc = gb.readByte(); // profile_idc
+ gb.readByte(); // constraint_set_flags[6] + reserved_zero[2]
+ var level_idc = gb.readByte(); // level_idc
+ gb.readUEG(); // seq_parameter_set_id
+ var profile_string = SPSParser.getProfileString(profile_idc);
+ var level_string = SPSParser.getLevelString(level_idc);
+ var chroma_format_idc = 1;
+ var chroma_format = 420;
+ var chroma_format_table = [0, 420, 422, 444];
+ var bit_depth = 8;
+ if (profile_idc === 100 || profile_idc === 110 || profile_idc === 122 ||
+ profile_idc === 244 || profile_idc === 44 || profile_idc === 83 ||
+ profile_idc === 86 || profile_idc === 118 || profile_idc === 128 ||
+ profile_idc === 138 || profile_idc === 144) {
+ chroma_format_idc = gb.readUEG();
+ if (chroma_format_idc === 3) {
+ gb.readBits(1); // separate_colour_plane_flag
+ }
+ if (chroma_format_idc <= 3) {
+ chroma_format = chroma_format_table[chroma_format_idc];
+ }
+ bit_depth = gb.readUEG() + 8; // bit_depth_luma_minus8
+ gb.readUEG(); // bit_depth_chroma_minus8
+ gb.readBits(1); // qpprime_y_zero_transform_bypass_flag
+ if (gb.readBool()) { // seq_scaling_matrix_present_flag
+ var scaling_list_count = (chroma_format_idc !== 3) ? 8 : 12;
+ for (var i = 0; i < scaling_list_count; i++) {
+ if (gb.readBool()) { // seq_scaling_list_present_flag
+ if (i < 6) {
+ SPSParser._skipScalingList(gb, 16);
+ }
+ else {
+ SPSParser._skipScalingList(gb, 64);
+ }
+ }
+ }
+ }
+ }
+ gb.readUEG(); // log2_max_frame_num_minus4
+ var pic_order_cnt_type = gb.readUEG();
+ if (pic_order_cnt_type === 0) {
+ gb.readUEG(); // log2_max_pic_order_cnt_lsb_minus_4
+ }
+ else if (pic_order_cnt_type === 1) {
+ gb.readBits(1); // delta_pic_order_always_zero_flag
+ gb.readSEG(); // offset_for_non_ref_pic
+ gb.readSEG(); // offset_for_top_to_bottom_field
+ var num_ref_frames_in_pic_order_cnt_cycle = gb.readUEG();
+ for (var i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {
+ gb.readSEG(); // offset_for_ref_frame
+ }
+ }
+ var ref_frames = gb.readUEG(); // max_num_ref_frames
+ gb.readBits(1); // gaps_in_frame_num_value_allowed_flag
+ var pic_width_in_mbs_minus1 = gb.readUEG();
+ var pic_height_in_map_units_minus1 = gb.readUEG();
+ var frame_mbs_only_flag = gb.readBits(1);
+ if (frame_mbs_only_flag === 0) {
+ gb.readBits(1); // mb_adaptive_frame_field_flag
+ }
+ gb.readBits(1); // direct_8x8_inference_flag
+ var frame_crop_left_offset = 0;
+ var frame_crop_right_offset = 0;
+ var frame_crop_top_offset = 0;
+ var frame_crop_bottom_offset = 0;
+ var frame_cropping_flag = gb.readBool();
+ if (frame_cropping_flag) {
+ frame_crop_left_offset = gb.readUEG();
+ frame_crop_right_offset = gb.readUEG();
+ frame_crop_top_offset = gb.readUEG();
+ frame_crop_bottom_offset = gb.readUEG();
+ }
+ var sar_width = 1, sar_height = 1;
+ var fps = 0, fps_fixed = true, fps_num = 0, fps_den = 0;
+ var vui_parameters_present_flag = gb.readBool();
+ if (vui_parameters_present_flag) {
+ if (gb.readBool()) { // aspect_ratio_info_present_flag
+ var aspect_ratio_idc = gb.readByte();
+ var sar_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];
+ var sar_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];
+ if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {
+ sar_width = sar_w_table[aspect_ratio_idc - 1];
+ sar_height = sar_h_table[aspect_ratio_idc - 1];
+ }
+ else if (aspect_ratio_idc === 255) {
+ sar_width = gb.readByte() << 8 | gb.readByte();
+ sar_height = gb.readByte() << 8 | gb.readByte();
+ }
+ }
+ if (gb.readBool()) { // overscan_info_present_flag
+ gb.readBool(); // overscan_appropriate_flag
+ }
+ if (gb.readBool()) { // video_signal_type_present_flag
+ gb.readBits(4); // video_format & video_full_range_flag
+ if (gb.readBool()) { // colour_description_present_flag
+ gb.readBits(24); // colour_primaries & transfer_characteristics & matrix_coefficients
+ }
+ }
+ if (gb.readBool()) { // chroma_loc_info_present_flag
+ gb.readUEG(); // chroma_sample_loc_type_top_field
+ gb.readUEG(); // chroma_sample_loc_type_bottom_field
+ }
+ if (gb.readBool()) { // timing_info_present_flag
+ var num_units_in_tick = gb.readBits(32);
+ var time_scale = gb.readBits(32);
+ fps_fixed = gb.readBool(); // fixed_frame_rate_flag
+ fps_num = time_scale;
+ fps_den = num_units_in_tick * 2;
+ fps = fps_num / fps_den;
+ }
+ }
+ var sarScale = 1;
+ if (sar_width !== 1 || sar_height !== 1) {
+ sarScale = sar_width / sar_height;
+ }
+ var crop_unit_x = 0, crop_unit_y = 0;
+ if (chroma_format_idc === 0) {
+ crop_unit_x = 1;
+ crop_unit_y = 2 - frame_mbs_only_flag;
+ }
+ else {
+ var sub_wc = (chroma_format_idc === 3) ? 1 : 2;
+ var sub_hc = (chroma_format_idc === 1) ? 2 : 1;
+ crop_unit_x = sub_wc;
+ crop_unit_y = sub_hc * (2 - frame_mbs_only_flag);
+ }
+ var codec_width = (pic_width_in_mbs_minus1 + 1) * 16;
+ var codec_height = (2 - frame_mbs_only_flag) * ((pic_height_in_map_units_minus1 + 1) * 16);
+ codec_width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x;
+ codec_height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y;
+ var present_width = Math.ceil(codec_width * sarScale);
+ gb.destroy();
+ gb = null;
+ return {
+ profile_string: profile_string,
+ level_string: level_string,
+ bit_depth: bit_depth,
+ ref_frames: ref_frames,
+ chroma_format: chroma_format,
+ chroma_format_string: SPSParser.getChromaFormatString(chroma_format),
+ frame_rate: {
+ fixed: fps_fixed,
+ fps: fps,
+ fps_den: fps_den,
+ fps_num: fps_num
+ },
+ sar_ratio: {
+ width: sar_width,
+ height: sar_height
+ },
+ codec_size: {
+ width: codec_width,
+ height: codec_height
+ },
+ present_size: {
+ width: present_width,
+ height: codec_height
+ }
+ };
+ };
+ SPSParser._skipScalingList = function (gb, count) {
+ var last_scale = 8, next_scale = 8;
+ var delta_scale = 0;
+ for (var i = 0; i < count; i++) {
+ if (next_scale !== 0) {
+ delta_scale = gb.readSEG();
+ next_scale = (last_scale + delta_scale + 256) % 256;
+ }
+ last_scale = (next_scale === 0) ? last_scale : next_scale;
+ }
+ };
+ SPSParser.getProfileString = function (profile_idc) {
+ switch (profile_idc) {
+ case 66:
+ return 'Baseline';
+ case 77:
+ return 'Main';
+ case 88:
+ return 'Extended';
+ case 100:
+ return 'High';
+ case 110:
+ return 'High10';
+ case 122:
+ return 'High422';
+ case 244:
+ return 'High444';
+ default:
+ return 'Unknown';
+ }
+ };
+ SPSParser.getLevelString = function (level_idc) {
+ return (level_idc / 10).toFixed(1);
+ };
+ SPSParser.getChromaFormatString = function (chroma) {
+ switch (chroma) {
+ case 420:
+ return '4:2:0';
+ case 422:
+ return '4:2:2';
+ case 444:
+ return '4:4:4';
+ default:
+ return 'Unknown';
+ }
+ };
+ return SPSParser;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (SPSParser);
+
+
+/***/ }),
+
+/***/ "./src/flv.js":
+/*!********************!*\
+ !*** ./src/flv.js ***!
+ \********************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _utils_polyfill_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/polyfill.js */ "./src/utils/polyfill.js");
+/* harmony import */ var _core_features_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core/features.js */ "./src/core/features.js");
+/* harmony import */ var _io_loader_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./io/loader.js */ "./src/io/loader.js");
+/* harmony import */ var _player_flv_player_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./player/flv-player.js */ "./src/player/flv-player.js");
+/* harmony import */ var _player_native_player_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./player/native-player.js */ "./src/player/native-player.js");
+/* harmony import */ var _player_player_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./player/player-events.js */ "./src/player/player-events.js");
+/* harmony import */ var _player_player_errors_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./player/player-errors.js */ "./src/player/player-errors.js");
+/* harmony import */ var _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/logging-control.js */ "./src/utils/logging-control.js");
+/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/exception.js */ "./src/utils/exception.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+
+
+// here are all the interfaces
+// install polyfills
+_utils_polyfill_js__WEBPACK_IMPORTED_MODULE_0__.default.install();
+// factory method
+function createPlayer(mediaDataSource, optionalConfig) {
+ var mds = mediaDataSource;
+ if (mds == null || typeof mds !== 'object') {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_8__.InvalidArgumentException('MediaDataSource must be an javascript object!');
+ }
+ if (!mds.hasOwnProperty('type')) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_8__.InvalidArgumentException('MediaDataSource must has type field to indicate video file type!');
+ }
+ switch (mds.type) {
+ case 'flv':
+ return new _player_flv_player_js__WEBPACK_IMPORTED_MODULE_3__.default(mds, optionalConfig);
+ default:
+ return new _player_native_player_js__WEBPACK_IMPORTED_MODULE_4__.default(mds, optionalConfig);
+ }
+}
+// feature detection
+function isSupported() {
+ return _core_features_js__WEBPACK_IMPORTED_MODULE_1__.default.supportMSEH264Playback();
+}
+function getFeatureList() {
+ return _core_features_js__WEBPACK_IMPORTED_MODULE_1__.default.getFeatureList();
+}
+// interfaces
+var flvjs = {};
+flvjs.createPlayer = createPlayer;
+flvjs.isSupported = isSupported;
+flvjs.getFeatureList = getFeatureList;
+flvjs.BaseLoader = _io_loader_js__WEBPACK_IMPORTED_MODULE_2__.BaseLoader;
+flvjs.LoaderStatus = _io_loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus;
+flvjs.LoaderErrors = _io_loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors;
+flvjs.Events = _player_player_events_js__WEBPACK_IMPORTED_MODULE_5__.default;
+flvjs.ErrorTypes = _player_player_errors_js__WEBPACK_IMPORTED_MODULE_6__.ErrorTypes;
+flvjs.ErrorDetails = _player_player_errors_js__WEBPACK_IMPORTED_MODULE_6__.ErrorDetails;
+flvjs.FlvPlayer = _player_flv_player_js__WEBPACK_IMPORTED_MODULE_3__.default;
+flvjs.NativePlayer = _player_native_player_js__WEBPACK_IMPORTED_MODULE_4__.default;
+flvjs.LoggingControl = _utils_logging_control_js__WEBPACK_IMPORTED_MODULE_7__.default;
+Object.defineProperty(flvjs, 'version', {
+ enumerable: true,
+ get: function () {
+ // replace by webpack.DefinePlugin
+ return "1.7.0";
+ }
+});
+/* harmony default export */ __webpack_exports__["default"] = (flvjs);
+
+
+/***/ }),
+
+/***/ "./src/index.js":
+/*!**********************!*\
+ !*** ./src/index.js ***!
+ \**********************/
+/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
+
+// entry/index file
+// make it compatible with browserify's umd wrapper
+module.exports = __webpack_require__(/*! ./flv.js */ "./src/flv.js").default;
+
+
+/***/ }),
+
+/***/ "./src/io/fetch-stream-loader.js":
+/*!***************************************!*\
+ !*** ./src/io/fetch-stream-loader.js ***!
+ \***************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _utils_browser_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/browser.js */ "./src/utils/browser.js");
+/* harmony import */ var _loader_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loader.js */ "./src/io/loader.js");
+/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var __extends = (undefined && undefined.__extends) || (function () {
+ var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+ return function (d, b) {
+ if (typeof b !== "function" && b !== null)
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+
+
+
+/* fetch + stream IO loader. Currently working on chrome 43+.
+ * fetch provides a better alternative http API to XMLHttpRequest
+ *
+ * fetch spec https://fetch.spec.whatwg.org/
+ * stream spec https://streams.spec.whatwg.org/
+ */
+var FetchStreamLoader = /** @class */ (function (_super) {
+ __extends(FetchStreamLoader, _super);
+ function FetchStreamLoader(seekHandler, config) {
+ var _this = _super.call(this, 'fetch-stream-loader') || this;
+ _this.TAG = 'FetchStreamLoader';
+ _this._seekHandler = seekHandler;
+ _this._config = config;
+ _this._needStash = true;
+ _this._requestAbort = false;
+ _this._contentLength = null;
+ _this._receivedLength = 0;
+ return _this;
+ }
+ FetchStreamLoader.isSupported = function () {
+ try {
+ // fetch + stream is broken on Microsoft Edge. Disable before build 15048.
+ // see https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8196907/
+ // Fixed in Jan 10, 2017. Build 15048+ removed from blacklist.
+ var isWorkWellEdge = _utils_browser_js__WEBPACK_IMPORTED_MODULE_0__.default.msedge && _utils_browser_js__WEBPACK_IMPORTED_MODULE_0__.default.version.minor >= 15048;
+ var browserNotBlacklisted = _utils_browser_js__WEBPACK_IMPORTED_MODULE_0__.default.msedge ? isWorkWellEdge : true;
+ return (self.fetch && self.ReadableStream && browserNotBlacklisted);
+ }
+ catch (e) {
+ return false;
+ }
+ };
+ FetchStreamLoader.prototype.destroy = function () {
+ if (this.isWorking()) {
+ this.abort();
+ }
+ _super.prototype.destroy.call(this);
+ };
+ FetchStreamLoader.prototype.open = function (dataSource, range) {
+ var _this = this;
+ this._dataSource = dataSource;
+ this._range = range;
+ var sourceURL = dataSource.url;
+ if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) {
+ sourceURL = dataSource.redirectedURL;
+ }
+ var seekConfig = this._seekHandler.getConfig(sourceURL, range);
+ var headers = new self.Headers();
+ if (typeof seekConfig.headers === 'object') {
+ var configHeaders = seekConfig.headers;
+ for (var key in configHeaders) {
+ if (configHeaders.hasOwnProperty(key)) {
+ headers.append(key, configHeaders[key]);
+ }
+ }
+ }
+ var params = {
+ method: 'GET',
+ headers: headers,
+ mode: 'cors',
+ cache: 'default',
+ // The default policy of Fetch API in the whatwg standard
+ // Safari incorrectly indicates 'no-referrer' as default policy, fuck it
+ referrerPolicy: 'no-referrer-when-downgrade'
+ };
+ // add additional headers
+ if (typeof this._config.headers === 'object') {
+ for (var key in this._config.headers) {
+ headers.append(key, this._config.headers[key]);
+ }
+ }
+ // cors is enabled by default
+ if (dataSource.cors === false) {
+ // no-cors means 'disregard cors policy', which can only be used in ServiceWorker
+ params.mode = 'same-origin';
+ }
+ // withCredentials is disabled by default
+ if (dataSource.withCredentials) {
+ params.credentials = 'include';
+ }
+ // referrerPolicy from config
+ if (dataSource.referrerPolicy) {
+ params.referrerPolicy = dataSource.referrerPolicy;
+ }
+ // add abort controller, by wmlgl 2019-5-10 12:21:27
+ if (self.AbortController) {
+ this._abortController = new self.AbortController();
+ params.signal = this._abortController.signal;
+ }
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kConnecting;
+ self.fetch(seekConfig.url, params).then(function (res) {
+ if (_this._requestAbort) {
+ _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kIdle;
+ res.body.cancel();
+ return;
+ }
+ if (res.ok && (res.status >= 200 && res.status <= 299)) {
+ if (res.url !== seekConfig.url) {
+ if (_this._onURLRedirect) {
+ var redirectedURL = _this._seekHandler.removeURLParameters(res.url);
+ _this._onURLRedirect(redirectedURL);
+ }
+ }
+ var lengthHeader = res.headers.get('Content-Length');
+ if (lengthHeader != null) {
+ _this._contentLength = parseInt(lengthHeader);
+ if (_this._contentLength !== 0) {
+ if (_this._onContentLengthKnown) {
+ _this._onContentLengthKnown(_this._contentLength);
+ }
+ }
+ }
+ return _this._pump.call(_this, res.body.getReader());
+ }
+ else {
+ _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kError;
+ if (_this._onError) {
+ _this._onError(_loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderErrors.HTTP_STATUS_CODE_INVALID, { code: res.status, msg: res.statusText });
+ }
+ else {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.RuntimeException('FetchStreamLoader: Http code invalid, ' + res.status + ' ' + res.statusText);
+ }
+ }
+ }).catch(function (e) {
+ if (_this._abortController && _this._abortController.signal.aborted) {
+ return;
+ }
+ _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kError;
+ if (_this._onError) {
+ _this._onError(_loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderErrors.EXCEPTION, { code: -1, msg: e.message });
+ }
+ else {
+ throw e;
+ }
+ });
+ };
+ FetchStreamLoader.prototype.abort = function () {
+ this._requestAbort = true;
+ if (this._status !== _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kBuffering || !_utils_browser_js__WEBPACK_IMPORTED_MODULE_0__.default.chrome) {
+ // Chrome may throw Exception-like things here, avoid using if is buffering
+ if (this._abortController) {
+ try {
+ this._abortController.abort();
+ }
+ catch (e) { }
+ }
+ }
+ };
+ FetchStreamLoader.prototype._pump = function (reader) {
+ var _this = this;
+ return reader.read().then(function (result) {
+ if (result.done) {
+ // First check received length
+ if (_this._contentLength !== null && _this._receivedLength < _this._contentLength) {
+ // Report Early-EOF
+ _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kError;
+ var type = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderErrors.EARLY_EOF;
+ var info = { code: -1, msg: 'Fetch stream meet Early-EOF' };
+ if (_this._onError) {
+ _this._onError(type, info);
+ }
+ else {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.RuntimeException(info.msg);
+ }
+ }
+ else {
+ // OK. Download complete
+ _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kComplete;
+ if (_this._onComplete) {
+ _this._onComplete(_this._range.from, _this._range.from + _this._receivedLength - 1);
+ }
+ }
+ }
+ else {
+ if (_this._abortController && _this._abortController.signal.aborted) {
+ _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kComplete;
+ return;
+ }
+ else if (_this._requestAbort === true) {
+ _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kComplete;
+ return reader.cancel();
+ }
+ _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kBuffering;
+ var chunk = result.value.buffer;
+ var byteStart = _this._range.from + _this._receivedLength;
+ _this._receivedLength += chunk.byteLength;
+ if (_this._onDataArrival) {
+ _this._onDataArrival(chunk, byteStart, _this._receivedLength);
+ }
+ _this._pump(reader);
+ }
+ }).catch(function (e) {
+ if (_this._abortController && _this._abortController.signal.aborted) {
+ _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kComplete;
+ return;
+ }
+ if (e.code === 11 && _utils_browser_js__WEBPACK_IMPORTED_MODULE_0__.default.msedge) { // InvalidStateError on Microsoft Edge
+ // Workaround: Edge may throw InvalidStateError after ReadableStreamReader.cancel() call
+ // Ignore the unknown exception.
+ // Related issue: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11265202/
+ return;
+ }
+ _this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kError;
+ var type = 0;
+ var info = null;
+ if ((e.code === 19 || e.message === 'network error') && // NETWORK_ERR
+ (_this._contentLength === null ||
+ (_this._contentLength !== null && _this._receivedLength < _this._contentLength))) {
+ type = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderErrors.EARLY_EOF;
+ info = { code: e.code, msg: 'Fetch stream meet Early-EOF' };
+ }
+ else {
+ type = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderErrors.EXCEPTION;
+ info = { code: e.code, msg: e.message };
+ }
+ if (_this._onError) {
+ _this._onError(type, info);
+ }
+ else {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.RuntimeException(info.msg);
+ }
+ });
+ };
+ return FetchStreamLoader;
+}(_loader_js__WEBPACK_IMPORTED_MODULE_1__.BaseLoader));
+/* harmony default export */ __webpack_exports__["default"] = (FetchStreamLoader);
+
+
+/***/ }),
+
+/***/ "./src/io/io-controller.js":
+/*!*********************************!*\
+ !*** ./src/io/io-controller.js ***!
+ \*********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js");
+/* harmony import */ var _speed_sampler_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./speed-sampler.js */ "./src/io/speed-sampler.js");
+/* harmony import */ var _loader_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./loader.js */ "./src/io/loader.js");
+/* harmony import */ var _fetch_stream_loader_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fetch-stream-loader.js */ "./src/io/fetch-stream-loader.js");
+/* harmony import */ var _xhr_moz_chunked_loader_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./xhr-moz-chunked-loader.js */ "./src/io/xhr-moz-chunked-loader.js");
+/* harmony import */ var _xhr_range_loader_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./xhr-range-loader.js */ "./src/io/xhr-range-loader.js");
+/* harmony import */ var _websocket_loader_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./websocket-loader.js */ "./src/io/websocket-loader.js");
+/* harmony import */ var _range_seek_handler_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./range-seek-handler.js */ "./src/io/range-seek-handler.js");
+/* harmony import */ var _param_seek_handler_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./param-seek-handler.js */ "./src/io/param-seek-handler.js");
+/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+
+
+
+/**
+ * DataSource: {
+ * url: string,
+ * filesize: number,
+ * cors: boolean,
+ * withCredentials: boolean
+ * }
+ *
+ */
+// Manage IO Loaders
+var IOController = /** @class */ (function () {
+ function IOController(dataSource, config, extraData) {
+ this.TAG = 'IOController';
+ this._config = config;
+ this._extraData = extraData;
+ this._stashInitialSize = 1024 * 384; // default initial size: 384KB
+ if (config.stashInitialSize != undefined && config.stashInitialSize > 0) {
+ // apply from config
+ this._stashInitialSize = config.stashInitialSize;
+ }
+ this._stashUsed = 0;
+ this._stashSize = this._stashInitialSize;
+ this._bufferSize = 1024 * 1024 * 3; // initial size: 3MB
+ this._stashBuffer = new ArrayBuffer(this._bufferSize);
+ this._stashByteStart = 0;
+ this._enableStash = true;
+ if (config.enableStashBuffer === false) {
+ this._enableStash = false;
+ }
+ this._loader = null;
+ this._loaderClass = null;
+ this._seekHandler = null;
+ this._dataSource = dataSource;
+ this._isWebSocketURL = /wss?:\/\/(.+?)/.test(dataSource.url);
+ this._refTotalLength = dataSource.filesize ? dataSource.filesize : null;
+ this._totalLength = this._refTotalLength;
+ this._fullRequestFlag = false;
+ this._currentRange = null;
+ this._redirectedURL = null;
+ this._speedNormalized = 0;
+ this._speedSampler = new _speed_sampler_js__WEBPACK_IMPORTED_MODULE_1__.default();
+ this._speedNormalizeList = [64, 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096];
+ this._isEarlyEofReconnecting = false;
+ this._paused = false;
+ this._resumeFrom = 0;
+ this._onDataArrival = null;
+ this._onSeeked = null;
+ this._onError = null;
+ this._onComplete = null;
+ this._onRedirect = null;
+ this._onRecoveredEarlyEof = null;
+ this._selectSeekHandler();
+ this._selectLoader();
+ this._createLoader();
+ }
+ IOController.prototype.destroy = function () {
+ if (this._loader.isWorking()) {
+ this._loader.abort();
+ }
+ this._loader.destroy();
+ this._loader = null;
+ this._loaderClass = null;
+ this._dataSource = null;
+ this._stashBuffer = null;
+ this._stashUsed = this._stashSize = this._bufferSize = this._stashByteStart = 0;
+ this._currentRange = null;
+ this._speedSampler = null;
+ this._isEarlyEofReconnecting = false;
+ this._onDataArrival = null;
+ this._onSeeked = null;
+ this._onError = null;
+ this._onComplete = null;
+ this._onRedirect = null;
+ this._onRecoveredEarlyEof = null;
+ this._extraData = null;
+ };
+ IOController.prototype.isWorking = function () {
+ return this._loader && this._loader.isWorking() && !this._paused;
+ };
+ IOController.prototype.isPaused = function () {
+ return this._paused;
+ };
+ Object.defineProperty(IOController.prototype, "status", {
+ get: function () {
+ return this._loader.status;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(IOController.prototype, "extraData", {
+ get: function () {
+ return this._extraData;
+ },
+ set: function (data) {
+ this._extraData = data;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(IOController.prototype, "onDataArrival", {
+ // prototype: function onDataArrival(chunks: ArrayBuffer, byteStart: number): number
+ get: function () {
+ return this._onDataArrival;
+ },
+ set: function (callback) {
+ this._onDataArrival = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(IOController.prototype, "onSeeked", {
+ get: function () {
+ return this._onSeeked;
+ },
+ set: function (callback) {
+ this._onSeeked = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(IOController.prototype, "onError", {
+ // prototype: function onError(type: number, info: {code: number, msg: string}): void
+ get: function () {
+ return this._onError;
+ },
+ set: function (callback) {
+ this._onError = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(IOController.prototype, "onComplete", {
+ get: function () {
+ return this._onComplete;
+ },
+ set: function (callback) {
+ this._onComplete = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(IOController.prototype, "onRedirect", {
+ get: function () {
+ return this._onRedirect;
+ },
+ set: function (callback) {
+ this._onRedirect = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(IOController.prototype, "onRecoveredEarlyEof", {
+ get: function () {
+ return this._onRecoveredEarlyEof;
+ },
+ set: function (callback) {
+ this._onRecoveredEarlyEof = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(IOController.prototype, "currentURL", {
+ get: function () {
+ return this._dataSource.url;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(IOController.prototype, "hasRedirect", {
+ get: function () {
+ return (this._redirectedURL != null || this._dataSource.redirectedURL != undefined);
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(IOController.prototype, "currentRedirectedURL", {
+ get: function () {
+ return this._redirectedURL || this._dataSource.redirectedURL;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(IOController.prototype, "currentSpeed", {
+ // in KB/s
+ get: function () {
+ if (this._loaderClass === _xhr_range_loader_js__WEBPACK_IMPORTED_MODULE_5__.default) {
+ // SpeedSampler is inaccuracy if loader is RangeLoader
+ return this._loader.currentSpeed;
+ }
+ return this._speedSampler.lastSecondKBps;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(IOController.prototype, "loaderType", {
+ get: function () {
+ return this._loader.type;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ IOController.prototype._selectSeekHandler = function () {
+ var config = this._config;
+ if (config.seekType === 'range') {
+ this._seekHandler = new _range_seek_handler_js__WEBPACK_IMPORTED_MODULE_7__.default(this._config.rangeLoadZeroStart);
+ }
+ else if (config.seekType === 'param') {
+ var paramStart = config.seekParamStart || 'bstart';
+ var paramEnd = config.seekParamEnd || 'bend';
+ this._seekHandler = new _param_seek_handler_js__WEBPACK_IMPORTED_MODULE_8__.default(paramStart, paramEnd);
+ }
+ else if (config.seekType === 'custom') {
+ if (typeof config.customSeekHandler !== 'function') {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_9__.InvalidArgumentException('Custom seekType specified in config but invalid customSeekHandler!');
+ }
+ this._seekHandler = new config.customSeekHandler();
+ }
+ else {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_9__.InvalidArgumentException("Invalid seekType in config: " + config.seekType);
+ }
+ };
+ IOController.prototype._selectLoader = function () {
+ if (this._config.customLoader != null) {
+ this._loaderClass = this._config.customLoader;
+ }
+ else if (this._isWebSocketURL) {
+ this._loaderClass = _websocket_loader_js__WEBPACK_IMPORTED_MODULE_6__.default;
+ }
+ else if (_fetch_stream_loader_js__WEBPACK_IMPORTED_MODULE_3__.default.isSupported()) {
+ this._loaderClass = _fetch_stream_loader_js__WEBPACK_IMPORTED_MODULE_3__.default;
+ }
+ else if (_xhr_moz_chunked_loader_js__WEBPACK_IMPORTED_MODULE_4__.default.isSupported()) {
+ this._loaderClass = _xhr_moz_chunked_loader_js__WEBPACK_IMPORTED_MODULE_4__.default;
+ }
+ else if (_xhr_range_loader_js__WEBPACK_IMPORTED_MODULE_5__.default.isSupported()) {
+ this._loaderClass = _xhr_range_loader_js__WEBPACK_IMPORTED_MODULE_5__.default;
+ }
+ else {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_9__.RuntimeException('Your browser doesn\'t support xhr with arraybuffer responseType!');
+ }
+ };
+ IOController.prototype._createLoader = function () {
+ this._loader = new this._loaderClass(this._seekHandler, this._config);
+ if (this._loader.needStashBuffer === false) {
+ this._enableStash = false;
+ }
+ this._loader.onContentLengthKnown = this._onContentLengthKnown.bind(this);
+ this._loader.onURLRedirect = this._onURLRedirect.bind(this);
+ this._loader.onDataArrival = this._onLoaderChunkArrival.bind(this);
+ this._loader.onComplete = this._onLoaderComplete.bind(this);
+ this._loader.onError = this._onLoaderError.bind(this);
+ };
+ IOController.prototype.open = function (optionalFrom) {
+ this._currentRange = { from: 0, to: -1 };
+ if (optionalFrom) {
+ this._currentRange.from = optionalFrom;
+ }
+ this._speedSampler.reset();
+ if (!optionalFrom) {
+ this._fullRequestFlag = true;
+ }
+ this._loader.open(this._dataSource, Object.assign({}, this._currentRange));
+ };
+ IOController.prototype.abort = function () {
+ this._loader.abort();
+ if (this._paused) {
+ this._paused = false;
+ this._resumeFrom = 0;
+ }
+ };
+ IOController.prototype.pause = function () {
+ if (this.isWorking()) {
+ this._loader.abort();
+ if (this._stashUsed !== 0) {
+ this._resumeFrom = this._stashByteStart;
+ this._currentRange.to = this._stashByteStart - 1;
+ }
+ else {
+ this._resumeFrom = this._currentRange.to + 1;
+ }
+ this._stashUsed = 0;
+ this._stashByteStart = 0;
+ this._paused = true;
+ }
+ };
+ IOController.prototype.resume = function () {
+ if (this._paused) {
+ this._paused = false;
+ var bytes = this._resumeFrom;
+ this._resumeFrom = 0;
+ this._internalSeek(bytes, true);
+ }
+ };
+ IOController.prototype.seek = function (bytes) {
+ this._paused = false;
+ this._stashUsed = 0;
+ this._stashByteStart = 0;
+ this._internalSeek(bytes, true);
+ };
+ /**
+ * When seeking request is from media seeking, unconsumed stash data should be dropped
+ * However, stash data shouldn't be dropped if seeking requested from http reconnection
+ *
+ * @dropUnconsumed: Ignore and discard all unconsumed data in stash buffer
+ */
+ IOController.prototype._internalSeek = function (bytes, dropUnconsumed) {
+ if (this._loader.isWorking()) {
+ this._loader.abort();
+ }
+ // dispatch & flush stash buffer before seek
+ this._flushStashBuffer(dropUnconsumed);
+ this._loader.destroy();
+ this._loader = null;
+ var requestRange = { from: bytes, to: -1 };
+ this._currentRange = { from: requestRange.from, to: -1 };
+ this._speedSampler.reset();
+ this._stashSize = this._stashInitialSize;
+ this._createLoader();
+ this._loader.open(this._dataSource, requestRange);
+ if (this._onSeeked) {
+ this._onSeeked();
+ }
+ };
+ IOController.prototype.updateUrl = function (url) {
+ if (!url || typeof url !== 'string' || url.length === 0) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_9__.InvalidArgumentException('Url must be a non-empty string!');
+ }
+ this._dataSource.url = url;
+ // TODO: replace with new url
+ };
+ IOController.prototype._expandBuffer = function (expectedBytes) {
+ var bufferNewSize = this._stashSize;
+ while (bufferNewSize + 1024 * 1024 * 1 < expectedBytes) {
+ bufferNewSize *= 2;
+ }
+ bufferNewSize += 1024 * 1024 * 1; // bufferSize = stashSize + 1MB
+ if (bufferNewSize === this._bufferSize) {
+ return;
+ }
+ var newBuffer = new ArrayBuffer(bufferNewSize);
+ if (this._stashUsed > 0) { // copy existing data into new buffer
+ var stashOldArray = new Uint8Array(this._stashBuffer, 0, this._stashUsed);
+ var stashNewArray = new Uint8Array(newBuffer, 0, bufferNewSize);
+ stashNewArray.set(stashOldArray, 0);
+ }
+ this._stashBuffer = newBuffer;
+ this._bufferSize = bufferNewSize;
+ };
+ IOController.prototype._normalizeSpeed = function (input) {
+ var list = this._speedNormalizeList;
+ var last = list.length - 1;
+ var mid = 0;
+ var lbound = 0;
+ var ubound = last;
+ if (input < list[0]) {
+ return list[0];
+ }
+ // binary search
+ while (lbound <= ubound) {
+ mid = lbound + Math.floor((ubound - lbound) / 2);
+ if (mid === last || (input >= list[mid] && input < list[mid + 1])) {
+ return list[mid];
+ }
+ else if (list[mid] < input) {
+ lbound = mid + 1;
+ }
+ else {
+ ubound = mid - 1;
+ }
+ }
+ };
+ IOController.prototype._adjustStashSize = function (normalized) {
+ var stashSizeKB = 0;
+ if (this._config.isLive) {
+ // live stream: always use single normalized speed for size of stashSizeKB
+ stashSizeKB = normalized;
+ }
+ else {
+ if (normalized < 512) {
+ stashSizeKB = normalized;
+ }
+ else if (normalized >= 512 && normalized <= 1024) {
+ stashSizeKB = Math.floor(normalized * 1.5);
+ }
+ else {
+ stashSizeKB = normalized * 2;
+ }
+ }
+ if (stashSizeKB > 8192) {
+ stashSizeKB = 8192;
+ }
+ var bufferSize = stashSizeKB * 1024 + 1024 * 1024 * 1; // stashSize + 1MB
+ if (this._bufferSize < bufferSize) {
+ this._expandBuffer(bufferSize);
+ }
+ this._stashSize = stashSizeKB * 1024;
+ };
+ IOController.prototype._dispatchChunks = function (chunks, byteStart) {
+ this._currentRange.to = byteStart + chunks.byteLength - 1;
+ return this._onDataArrival(chunks, byteStart);
+ };
+ IOController.prototype._onURLRedirect = function (redirectedURL) {
+ this._redirectedURL = redirectedURL;
+ if (this._onRedirect) {
+ this._onRedirect(redirectedURL);
+ }
+ };
+ IOController.prototype._onContentLengthKnown = function (contentLength) {
+ if (contentLength && this._fullRequestFlag) {
+ this._totalLength = contentLength;
+ this._fullRequestFlag = false;
+ }
+ };
+ IOController.prototype._onLoaderChunkArrival = function (chunk, byteStart, receivedLength) {
+ if (!this._onDataArrival) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_9__.IllegalStateException('IOController: No existing consumer (onDataArrival) callback!');
+ }
+ if (this._paused) {
+ return;
+ }
+ if (this._isEarlyEofReconnecting) {
+ // Auto-reconnect for EarlyEof succeed, notify to upper-layer by callback
+ this._isEarlyEofReconnecting = false;
+ if (this._onRecoveredEarlyEof) {
+ this._onRecoveredEarlyEof();
+ }
+ }
+ this._speedSampler.addBytes(chunk.byteLength);
+ // adjust stash buffer size according to network speed dynamically
+ var KBps = this._speedSampler.lastSecondKBps;
+ if (KBps !== 0) {
+ var normalized = this._normalizeSpeed(KBps);
+ if (this._speedNormalized !== normalized) {
+ this._speedNormalized = normalized;
+ this._adjustStashSize(normalized);
+ }
+ }
+ if (!this._enableStash) { // disable stash
+ if (this._stashUsed === 0) {
+ // dispatch chunk directly to consumer;
+ // check ret value (consumed bytes) and stash unconsumed to stashBuffer
+ var consumed = this._dispatchChunks(chunk, byteStart);
+ if (consumed < chunk.byteLength) { // unconsumed data remain.
+ var remain = chunk.byteLength - consumed;
+ if (remain > this._bufferSize) {
+ this._expandBuffer(remain);
+ }
+ var stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);
+ stashArray.set(new Uint8Array(chunk, consumed), 0);
+ this._stashUsed += remain;
+ this._stashByteStart = byteStart + consumed;
+ }
+ }
+ else {
+ // else: Merge chunk into stashBuffer, and dispatch stashBuffer to consumer.
+ if (this._stashUsed + chunk.byteLength > this._bufferSize) {
+ this._expandBuffer(this._stashUsed + chunk.byteLength);
+ }
+ var stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);
+ stashArray.set(new Uint8Array(chunk), this._stashUsed);
+ this._stashUsed += chunk.byteLength;
+ var consumed = this._dispatchChunks(this._stashBuffer.slice(0, this._stashUsed), this._stashByteStart);
+ if (consumed < this._stashUsed && consumed > 0) { // unconsumed data remain
+ var remainArray = new Uint8Array(this._stashBuffer, consumed);
+ stashArray.set(remainArray, 0);
+ }
+ this._stashUsed -= consumed;
+ this._stashByteStart += consumed;
+ }
+ }
+ else { // enable stash
+ if (this._stashUsed === 0 && this._stashByteStart === 0) { // seeked? or init chunk?
+ // This is the first chunk after seek action
+ this._stashByteStart = byteStart;
+ }
+ if (this._stashUsed + chunk.byteLength <= this._stashSize) {
+ // just stash
+ var stashArray = new Uint8Array(this._stashBuffer, 0, this._stashSize);
+ stashArray.set(new Uint8Array(chunk), this._stashUsed);
+ this._stashUsed += chunk.byteLength;
+ }
+ else { // stashUsed + chunkSize > stashSize, size limit exceeded
+ var stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);
+ if (this._stashUsed > 0) { // There're stash datas in buffer
+ // dispatch the whole stashBuffer, and stash remain data
+ // then append chunk to stashBuffer (stash)
+ var buffer = this._stashBuffer.slice(0, this._stashUsed);
+ var consumed = this._dispatchChunks(buffer, this._stashByteStart);
+ if (consumed < buffer.byteLength) {
+ if (consumed > 0) {
+ var remainArray = new Uint8Array(buffer, consumed);
+ stashArray.set(remainArray, 0);
+ this._stashUsed = remainArray.byteLength;
+ this._stashByteStart += consumed;
+ }
+ }
+ else {
+ this._stashUsed = 0;
+ this._stashByteStart += consumed;
+ }
+ if (this._stashUsed + chunk.byteLength > this._bufferSize) {
+ this._expandBuffer(this._stashUsed + chunk.byteLength);
+ stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);
+ }
+ stashArray.set(new Uint8Array(chunk), this._stashUsed);
+ this._stashUsed += chunk.byteLength;
+ }
+ else { // stash buffer empty, but chunkSize > stashSize (oh, holy shit)
+ // dispatch chunk directly and stash remain data
+ var consumed = this._dispatchChunks(chunk, byteStart);
+ if (consumed < chunk.byteLength) {
+ var remain = chunk.byteLength - consumed;
+ if (remain > this._bufferSize) {
+ this._expandBuffer(remain);
+ stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);
+ }
+ stashArray.set(new Uint8Array(chunk, consumed), 0);
+ this._stashUsed += remain;
+ this._stashByteStart = byteStart + consumed;
+ }
+ }
+ }
+ }
+ };
+ IOController.prototype._flushStashBuffer = function (dropUnconsumed) {
+ if (this._stashUsed > 0) {
+ var buffer = this._stashBuffer.slice(0, this._stashUsed);
+ var consumed = this._dispatchChunks(buffer, this._stashByteStart);
+ var remain = buffer.byteLength - consumed;
+ if (consumed < buffer.byteLength) {
+ if (dropUnconsumed) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, remain + " bytes unconsumed data remain when flush buffer, dropped");
+ }
+ else {
+ if (consumed > 0) {
+ var stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);
+ var remainArray = new Uint8Array(buffer, consumed);
+ stashArray.set(remainArray, 0);
+ this._stashUsed = remainArray.byteLength;
+ this._stashByteStart += consumed;
+ }
+ return 0;
+ }
+ }
+ this._stashUsed = 0;
+ this._stashByteStart = 0;
+ return remain;
+ }
+ return 0;
+ };
+ IOController.prototype._onLoaderComplete = function (from, to) {
+ // Force-flush stash buffer, and drop unconsumed data
+ this._flushStashBuffer(true);
+ if (this._onComplete) {
+ this._onComplete(this._extraData);
+ }
+ };
+ IOController.prototype._onLoaderError = function (type, data) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.e(this.TAG, "Loader error, code = " + data.code + ", msg = " + data.msg);
+ this._flushStashBuffer(false);
+ if (this._isEarlyEofReconnecting) {
+ // Auto-reconnect for EarlyEof failed, throw UnrecoverableEarlyEof error to upper-layer
+ this._isEarlyEofReconnecting = false;
+ type = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.UNRECOVERABLE_EARLY_EOF;
+ }
+ switch (type) {
+ case _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.EARLY_EOF: {
+ if (!this._config.isLive) {
+ // Do internal http reconnect if not live stream
+ if (this._totalLength) {
+ var nextFrom = this._currentRange.to + 1;
+ if (nextFrom < this._totalLength) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Connection lost, trying reconnect...');
+ this._isEarlyEofReconnecting = true;
+ this._internalSeek(nextFrom, false);
+ }
+ return;
+ }
+ // else: We don't know totalLength, throw UnrecoverableEarlyEof
+ }
+ // live stream: throw UnrecoverableEarlyEof error to upper-layer
+ type = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.UNRECOVERABLE_EARLY_EOF;
+ break;
+ }
+ case _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.UNRECOVERABLE_EARLY_EOF:
+ case _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.CONNECTING_TIMEOUT:
+ case _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.HTTP_STATUS_CODE_INVALID:
+ case _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.EXCEPTION:
+ break;
+ }
+ if (this._onError) {
+ this._onError(type, data);
+ }
+ else {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_9__.RuntimeException('IOException: ' + data.msg);
+ }
+ };
+ return IOController;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (IOController);
+
+
+/***/ }),
+
+/***/ "./src/io/loader.js":
+/*!**************************!*\
+ !*** ./src/io/loader.js ***!
+ \**************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "LoaderStatus": function() { return /* binding */ LoaderStatus; },
+/* harmony export */ "LoaderErrors": function() { return /* binding */ LoaderErrors; },
+/* harmony export */ "BaseLoader": function() { return /* binding */ BaseLoader; }
+/* harmony export */ });
+/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var LoaderStatus = {
+ kIdle: 0,
+ kConnecting: 1,
+ kBuffering: 2,
+ kError: 3,
+ kComplete: 4
+};
+var LoaderErrors = {
+ OK: 'OK',
+ EXCEPTION: 'Exception',
+ HTTP_STATUS_CODE_INVALID: 'HttpStatusCodeInvalid',
+ CONNECTING_TIMEOUT: 'ConnectingTimeout',
+ EARLY_EOF: 'EarlyEof',
+ UNRECOVERABLE_EARLY_EOF: 'UnrecoverableEarlyEof'
+};
+/* Loader has callbacks which have following prototypes:
+ * function onContentLengthKnown(contentLength: number): void
+ * function onURLRedirect(url: string): void
+ * function onDataArrival(chunk: ArrayBuffer, byteStart: number, receivedLength: number): void
+ * function onError(errorType: number, errorInfo: {code: number, msg: string}): void
+ * function onComplete(rangeFrom: number, rangeTo: number): void
+ */
+var BaseLoader = /** @class */ (function () {
+ function BaseLoader(typeName) {
+ this._type = typeName || 'undefined';
+ this._status = LoaderStatus.kIdle;
+ this._needStash = false;
+ // callbacks
+ this._onContentLengthKnown = null;
+ this._onURLRedirect = null;
+ this._onDataArrival = null;
+ this._onError = null;
+ this._onComplete = null;
+ }
+ BaseLoader.prototype.destroy = function () {
+ this._status = LoaderStatus.kIdle;
+ this._onContentLengthKnown = null;
+ this._onURLRedirect = null;
+ this._onDataArrival = null;
+ this._onError = null;
+ this._onComplete = null;
+ };
+ BaseLoader.prototype.isWorking = function () {
+ return this._status === LoaderStatus.kConnecting || this._status === LoaderStatus.kBuffering;
+ };
+ Object.defineProperty(BaseLoader.prototype, "type", {
+ get: function () {
+ return this._type;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(BaseLoader.prototype, "status", {
+ get: function () {
+ return this._status;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(BaseLoader.prototype, "needStashBuffer", {
+ get: function () {
+ return this._needStash;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(BaseLoader.prototype, "onContentLengthKnown", {
+ get: function () {
+ return this._onContentLengthKnown;
+ },
+ set: function (callback) {
+ this._onContentLengthKnown = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(BaseLoader.prototype, "onURLRedirect", {
+ get: function () {
+ return this._onURLRedirect;
+ },
+ set: function (callback) {
+ this._onURLRedirect = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(BaseLoader.prototype, "onDataArrival", {
+ get: function () {
+ return this._onDataArrival;
+ },
+ set: function (callback) {
+ this._onDataArrival = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(BaseLoader.prototype, "onError", {
+ get: function () {
+ return this._onError;
+ },
+ set: function (callback) {
+ this._onError = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(BaseLoader.prototype, "onComplete", {
+ get: function () {
+ return this._onComplete;
+ },
+ set: function (callback) {
+ this._onComplete = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ // pure virtual
+ BaseLoader.prototype.open = function (dataSource, range) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_0__.NotImplementedException('Unimplemented abstract function!');
+ };
+ BaseLoader.prototype.abort = function () {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_0__.NotImplementedException('Unimplemented abstract function!');
+ };
+ return BaseLoader;
+}());
+
+
+
+/***/ }),
+
+/***/ "./src/io/param-seek-handler.js":
+/*!**************************************!*\
+ !*** ./src/io/param-seek-handler.js ***!
+ \**************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var ParamSeekHandler = /** @class */ (function () {
+ function ParamSeekHandler(paramStart, paramEnd) {
+ this._startName = paramStart;
+ this._endName = paramEnd;
+ }
+ ParamSeekHandler.prototype.getConfig = function (baseUrl, range) {
+ var url = baseUrl;
+ if (range.from !== 0 || range.to !== -1) {
+ var needAnd = true;
+ if (url.indexOf('?') === -1) {
+ url += '?';
+ needAnd = false;
+ }
+ if (needAnd) {
+ url += '&';
+ }
+ url += this._startName + "=" + range.from.toString();
+ if (range.to !== -1) {
+ url += "&" + this._endName + "=" + range.to.toString();
+ }
+ }
+ return {
+ url: url,
+ headers: {}
+ };
+ };
+ ParamSeekHandler.prototype.removeURLParameters = function (seekedURL) {
+ var baseURL = seekedURL.split('?')[0];
+ var params = undefined;
+ var queryIndex = seekedURL.indexOf('?');
+ if (queryIndex !== -1) {
+ params = seekedURL.substring(queryIndex + 1);
+ }
+ var resultParams = '';
+ if (params != undefined && params.length > 0) {
+ var pairs = params.split('&');
+ for (var i = 0; i < pairs.length; i++) {
+ var pair = pairs[i].split('=');
+ var requireAnd = (i > 0);
+ if (pair[0] !== this._startName && pair[0] !== this._endName) {
+ if (requireAnd) {
+ resultParams += '&';
+ }
+ resultParams += pairs[i];
+ }
+ }
+ }
+ return (resultParams.length === 0) ? baseURL : baseURL + '?' + resultParams;
+ };
+ return ParamSeekHandler;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (ParamSeekHandler);
+
+
+/***/ }),
+
+/***/ "./src/io/range-seek-handler.js":
+/*!**************************************!*\
+ !*** ./src/io/range-seek-handler.js ***!
+ \**************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var RangeSeekHandler = /** @class */ (function () {
+ function RangeSeekHandler(zeroStart) {
+ this._zeroStart = zeroStart || false;
+ }
+ RangeSeekHandler.prototype.getConfig = function (url, range) {
+ var headers = {};
+ if (range.from !== 0 || range.to !== -1) {
+ var param = void 0;
+ if (range.to !== -1) {
+ param = "bytes=" + range.from.toString() + "-" + range.to.toString();
+ }
+ else {
+ param = "bytes=" + range.from.toString() + "-";
+ }
+ headers['Range'] = param;
+ }
+ else if (this._zeroStart) {
+ headers['Range'] = 'bytes=0-';
+ }
+ return {
+ url: url,
+ headers: headers
+ };
+ };
+ RangeSeekHandler.prototype.removeURLParameters = function (seekedURL) {
+ return seekedURL;
+ };
+ return RangeSeekHandler;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (RangeSeekHandler);
+
+
+/***/ }),
+
+/***/ "./src/io/speed-sampler.js":
+/*!*********************************!*\
+ !*** ./src/io/speed-sampler.js ***!
+ \*********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// Utility class to calculate realtime network I/O speed
+var SpeedSampler = /** @class */ (function () {
+ function SpeedSampler() {
+ // milliseconds
+ this._firstCheckpoint = 0;
+ this._lastCheckpoint = 0;
+ this._intervalBytes = 0;
+ this._totalBytes = 0;
+ this._lastSecondBytes = 0;
+ // compatibility detection
+ if (self.performance && self.performance.now) {
+ this._now = self.performance.now.bind(self.performance);
+ }
+ else {
+ this._now = Date.now;
+ }
+ }
+ SpeedSampler.prototype.reset = function () {
+ this._firstCheckpoint = this._lastCheckpoint = 0;
+ this._totalBytes = this._intervalBytes = 0;
+ this._lastSecondBytes = 0;
+ };
+ SpeedSampler.prototype.addBytes = function (bytes) {
+ if (this._firstCheckpoint === 0) {
+ this._firstCheckpoint = this._now();
+ this._lastCheckpoint = this._firstCheckpoint;
+ this._intervalBytes += bytes;
+ this._totalBytes += bytes;
+ }
+ else if (this._now() - this._lastCheckpoint < 1000) {
+ this._intervalBytes += bytes;
+ this._totalBytes += bytes;
+ }
+ else { // duration >= 1000
+ this._lastSecondBytes = this._intervalBytes;
+ this._intervalBytes = bytes;
+ this._totalBytes += bytes;
+ this._lastCheckpoint = this._now();
+ }
+ };
+ Object.defineProperty(SpeedSampler.prototype, "currentKBps", {
+ get: function () {
+ this.addBytes(0);
+ var durationSeconds = (this._now() - this._lastCheckpoint) / 1000;
+ if (durationSeconds == 0)
+ durationSeconds = 1;
+ return (this._intervalBytes / durationSeconds) / 1024;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(SpeedSampler.prototype, "lastSecondKBps", {
+ get: function () {
+ this.addBytes(0);
+ if (this._lastSecondBytes !== 0) {
+ return this._lastSecondBytes / 1024;
+ }
+ else { // lastSecondBytes === 0
+ if (this._now() - this._lastCheckpoint >= 500) {
+ // if time interval since last checkpoint has exceeded 500ms
+ // the speed is nearly accurate
+ return this.currentKBps;
+ }
+ else {
+ // We don't know
+ return 0;
+ }
+ }
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(SpeedSampler.prototype, "averageKBps", {
+ get: function () {
+ var durationSeconds = (this._now() - this._firstCheckpoint) / 1000;
+ return (this._totalBytes / durationSeconds) / 1024;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ return SpeedSampler;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (SpeedSampler);
+
+
+/***/ }),
+
+/***/ "./src/io/websocket-loader.js":
+/*!************************************!*\
+ !*** ./src/io/websocket-loader.js ***!
+ \************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _loader_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./loader.js */ "./src/io/loader.js");
+/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var __extends = (undefined && undefined.__extends) || (function () {
+ var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+ return function (d, b) {
+ if (typeof b !== "function" && b !== null)
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+
+
+// For FLV over WebSocket live stream
+var WebSocketLoader = /** @class */ (function (_super) {
+ __extends(WebSocketLoader, _super);
+ function WebSocketLoader() {
+ var _this = _super.call(this, 'websocket-loader') || this;
+ _this.TAG = 'WebSocketLoader';
+ _this._needStash = true;
+ _this._ws = null;
+ _this._requestAbort = false;
+ _this._receivedLength = 0;
+ return _this;
+ }
+ WebSocketLoader.isSupported = function () {
+ try {
+ return (typeof self.WebSocket !== 'undefined');
+ }
+ catch (e) {
+ return false;
+ }
+ };
+ WebSocketLoader.prototype.destroy = function () {
+ if (this._ws) {
+ this.abort();
+ }
+ _super.prototype.destroy.call(this);
+ };
+ WebSocketLoader.prototype.open = function (dataSource) {
+ try {
+ var ws = this._ws = new self.WebSocket(dataSource.url);
+ ws.binaryType = 'arraybuffer';
+ ws.onopen = this._onWebSocketOpen.bind(this);
+ ws.onclose = this._onWebSocketClose.bind(this);
+ ws.onmessage = this._onWebSocketMessage.bind(this);
+ ws.onerror = this._onWebSocketError.bind(this);
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderStatus.kConnecting;
+ }
+ catch (e) {
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderStatus.kError;
+ var info = { code: e.code, msg: e.message };
+ if (this._onError) {
+ this._onError(_loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderErrors.EXCEPTION, info);
+ }
+ else {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_1__.RuntimeException(info.msg);
+ }
+ }
+ };
+ WebSocketLoader.prototype.abort = function () {
+ var ws = this._ws;
+ if (ws && (ws.readyState === 0 || ws.readyState === 1)) { // CONNECTING || OPEN
+ this._requestAbort = true;
+ ws.close();
+ }
+ this._ws = null;
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderStatus.kComplete;
+ };
+ WebSocketLoader.prototype._onWebSocketOpen = function (e) {
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderStatus.kBuffering;
+ };
+ WebSocketLoader.prototype._onWebSocketClose = function (e) {
+ if (this._requestAbort === true) {
+ this._requestAbort = false;
+ return;
+ }
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderStatus.kComplete;
+ if (this._onComplete) {
+ this._onComplete(0, this._receivedLength - 1);
+ }
+ };
+ WebSocketLoader.prototype._onWebSocketMessage = function (e) {
+ var _this = this;
+ if (e.data instanceof ArrayBuffer) {
+ this._dispatchArrayBuffer(e.data);
+ }
+ else if (e.data instanceof Blob) {
+ var reader_1 = new FileReader();
+ reader_1.onload = function () {
+ _this._dispatchArrayBuffer(reader_1.result);
+ };
+ reader_1.readAsArrayBuffer(e.data);
+ }
+ else {
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderStatus.kError;
+ var info = { code: -1, msg: 'Unsupported WebSocket message type: ' + e.data.constructor.name };
+ if (this._onError) {
+ this._onError(_loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderErrors.EXCEPTION, info);
+ }
+ else {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_1__.RuntimeException(info.msg);
+ }
+ }
+ };
+ WebSocketLoader.prototype._dispatchArrayBuffer = function (arraybuffer) {
+ var chunk = arraybuffer;
+ var byteStart = this._receivedLength;
+ this._receivedLength += chunk.byteLength;
+ if (this._onDataArrival) {
+ this._onDataArrival(chunk, byteStart, this._receivedLength);
+ }
+ };
+ WebSocketLoader.prototype._onWebSocketError = function (e) {
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderStatus.kError;
+ var info = {
+ code: e.code,
+ msg: e.message
+ };
+ if (this._onError) {
+ this._onError(_loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderErrors.EXCEPTION, info);
+ }
+ else {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_1__.RuntimeException(info.msg);
+ }
+ };
+ return WebSocketLoader;
+}(_loader_js__WEBPACK_IMPORTED_MODULE_0__.BaseLoader));
+/* harmony default export */ __webpack_exports__["default"] = (WebSocketLoader);
+
+
+/***/ }),
+
+/***/ "./src/io/xhr-moz-chunked-loader.js":
+/*!******************************************!*\
+ !*** ./src/io/xhr-moz-chunked-loader.js ***!
+ \******************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js");
+/* harmony import */ var _loader_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loader.js */ "./src/io/loader.js");
+/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var __extends = (undefined && undefined.__extends) || (function () {
+ var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+ return function (d, b) {
+ if (typeof b !== "function" && b !== null)
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+
+
+
+// For FireFox browser which supports `xhr.responseType = 'moz-chunked-arraybuffer'`
+var MozChunkedLoader = /** @class */ (function (_super) {
+ __extends(MozChunkedLoader, _super);
+ function MozChunkedLoader(seekHandler, config) {
+ var _this = _super.call(this, 'xhr-moz-chunked-loader') || this;
+ _this.TAG = 'MozChunkedLoader';
+ _this._seekHandler = seekHandler;
+ _this._config = config;
+ _this._needStash = true;
+ _this._xhr = null;
+ _this._requestAbort = false;
+ _this._contentLength = null;
+ _this._receivedLength = 0;
+ return _this;
+ }
+ MozChunkedLoader.isSupported = function () {
+ try {
+ var xhr = new XMLHttpRequest();
+ // Firefox 37- requires .open() to be called before setting responseType
+ xhr.open('GET', 'https://example.com', true);
+ xhr.responseType = 'moz-chunked-arraybuffer';
+ return (xhr.responseType === 'moz-chunked-arraybuffer');
+ }
+ catch (e) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w('MozChunkedLoader', e.message);
+ return false;
+ }
+ };
+ MozChunkedLoader.prototype.destroy = function () {
+ if (this.isWorking()) {
+ this.abort();
+ }
+ if (this._xhr) {
+ this._xhr.onreadystatechange = null;
+ this._xhr.onprogress = null;
+ this._xhr.onloadend = null;
+ this._xhr.onerror = null;
+ this._xhr = null;
+ }
+ _super.prototype.destroy.call(this);
+ };
+ MozChunkedLoader.prototype.open = function (dataSource, range) {
+ this._dataSource = dataSource;
+ this._range = range;
+ var sourceURL = dataSource.url;
+ if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) {
+ sourceURL = dataSource.redirectedURL;
+ }
+ var seekConfig = this._seekHandler.getConfig(sourceURL, range);
+ this._requestURL = seekConfig.url;
+ var xhr = this._xhr = new XMLHttpRequest();
+ xhr.open('GET', seekConfig.url, true);
+ xhr.responseType = 'moz-chunked-arraybuffer';
+ xhr.onreadystatechange = this._onReadyStateChange.bind(this);
+ xhr.onprogress = this._onProgress.bind(this);
+ xhr.onloadend = this._onLoadEnd.bind(this);
+ xhr.onerror = this._onXhrError.bind(this);
+ // cors is auto detected and enabled by xhr
+ // withCredentials is disabled by default
+ if (dataSource.withCredentials) {
+ xhr.withCredentials = true;
+ }
+ if (typeof seekConfig.headers === 'object') {
+ var headers = seekConfig.headers;
+ for (var key in headers) {
+ if (headers.hasOwnProperty(key)) {
+ xhr.setRequestHeader(key, headers[key]);
+ }
+ }
+ }
+ // add additional headers
+ if (typeof this._config.headers === 'object') {
+ var headers = this._config.headers;
+ for (var key in headers) {
+ if (headers.hasOwnProperty(key)) {
+ xhr.setRequestHeader(key, headers[key]);
+ }
+ }
+ }
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kConnecting;
+ xhr.send();
+ };
+ MozChunkedLoader.prototype.abort = function () {
+ this._requestAbort = true;
+ if (this._xhr) {
+ this._xhr.abort();
+ }
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kComplete;
+ };
+ MozChunkedLoader.prototype._onReadyStateChange = function (e) {
+ var xhr = e.target;
+ if (xhr.readyState === 2) { // HEADERS_RECEIVED
+ if (xhr.responseURL != undefined && xhr.responseURL !== this._requestURL) {
+ if (this._onURLRedirect) {
+ var redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);
+ this._onURLRedirect(redirectedURL);
+ }
+ }
+ if (xhr.status !== 0 && (xhr.status < 200 || xhr.status > 299)) {
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kError;
+ if (this._onError) {
+ this._onError(_loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderErrors.HTTP_STATUS_CODE_INVALID, { code: xhr.status, msg: xhr.statusText });
+ }
+ else {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.RuntimeException('MozChunkedLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);
+ }
+ }
+ else {
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kBuffering;
+ }
+ }
+ };
+ MozChunkedLoader.prototype._onProgress = function (e) {
+ if (this._status === _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kError) {
+ // Ignore error response
+ return;
+ }
+ if (this._contentLength === null) {
+ if (e.total !== null && e.total !== 0) {
+ this._contentLength = e.total;
+ if (this._onContentLengthKnown) {
+ this._onContentLengthKnown(this._contentLength);
+ }
+ }
+ }
+ var chunk = e.target.response;
+ var byteStart = this._range.from + this._receivedLength;
+ this._receivedLength += chunk.byteLength;
+ if (this._onDataArrival) {
+ this._onDataArrival(chunk, byteStart, this._receivedLength);
+ }
+ };
+ MozChunkedLoader.prototype._onLoadEnd = function (e) {
+ if (this._requestAbort === true) {
+ this._requestAbort = false;
+ return;
+ }
+ else if (this._status === _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kError) {
+ return;
+ }
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kComplete;
+ if (this._onComplete) {
+ this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);
+ }
+ };
+ MozChunkedLoader.prototype._onXhrError = function (e) {
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderStatus.kError;
+ var type = 0;
+ var info = null;
+ if (this._contentLength && e.loaded < this._contentLength) {
+ type = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderErrors.EARLY_EOF;
+ info = { code: -1, msg: 'Moz-Chunked stream meet Early-Eof' };
+ }
+ else {
+ type = _loader_js__WEBPACK_IMPORTED_MODULE_1__.LoaderErrors.EXCEPTION;
+ info = { code: -1, msg: e.constructor.name + ' ' + e.type };
+ }
+ if (this._onError) {
+ this._onError(type, info);
+ }
+ else {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_2__.RuntimeException(info.msg);
+ }
+ };
+ return MozChunkedLoader;
+}(_loader_js__WEBPACK_IMPORTED_MODULE_1__.BaseLoader));
+/* harmony default export */ __webpack_exports__["default"] = (MozChunkedLoader);
+
+
+/***/ }),
+
+/***/ "./src/io/xhr-range-loader.js":
+/*!************************************!*\
+ !*** ./src/io/xhr-range-loader.js ***!
+ \************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js");
+/* harmony import */ var _speed_sampler_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./speed-sampler.js */ "./src/io/speed-sampler.js");
+/* harmony import */ var _loader_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./loader.js */ "./src/io/loader.js");
+/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var __extends = (undefined && undefined.__extends) || (function () {
+ var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+ return function (d, b) {
+ if (typeof b !== "function" && b !== null)
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+
+
+
+
+// Universal IO Loader, implemented by adding Range header in xhr's request header
+var RangeLoader = /** @class */ (function (_super) {
+ __extends(RangeLoader, _super);
+ function RangeLoader(seekHandler, config) {
+ var _this = _super.call(this, 'xhr-range-loader') || this;
+ _this.TAG = 'RangeLoader';
+ _this._seekHandler = seekHandler;
+ _this._config = config;
+ _this._needStash = false;
+ _this._chunkSizeKBList = [
+ 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192
+ ];
+ _this._currentChunkSizeKB = 384;
+ _this._currentSpeedNormalized = 0;
+ _this._zeroSpeedChunkCount = 0;
+ _this._xhr = null;
+ _this._speedSampler = new _speed_sampler_js__WEBPACK_IMPORTED_MODULE_1__.default();
+ _this._requestAbort = false;
+ _this._waitForTotalLength = false;
+ _this._totalLengthReceived = false;
+ _this._currentRequestURL = null;
+ _this._currentRedirectedURL = null;
+ _this._currentRequestRange = null;
+ _this._totalLength = null; // size of the entire file
+ _this._contentLength = null; // Content-Length of entire request range
+ _this._receivedLength = 0; // total received bytes
+ _this._lastTimeLoaded = 0; // received bytes of current request sub-range
+ return _this;
+ }
+ RangeLoader.isSupported = function () {
+ try {
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', 'https://example.com', true);
+ xhr.responseType = 'arraybuffer';
+ return (xhr.responseType === 'arraybuffer');
+ }
+ catch (e) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w('RangeLoader', e.message);
+ return false;
+ }
+ };
+ RangeLoader.prototype.destroy = function () {
+ if (this.isWorking()) {
+ this.abort();
+ }
+ if (this._xhr) {
+ this._xhr.onreadystatechange = null;
+ this._xhr.onprogress = null;
+ this._xhr.onload = null;
+ this._xhr.onerror = null;
+ this._xhr = null;
+ }
+ _super.prototype.destroy.call(this);
+ };
+ Object.defineProperty(RangeLoader.prototype, "currentSpeed", {
+ get: function () {
+ return this._speedSampler.lastSecondKBps;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ RangeLoader.prototype.open = function (dataSource, range) {
+ this._dataSource = dataSource;
+ this._range = range;
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus.kConnecting;
+ var useRefTotalLength = false;
+ if (this._dataSource.filesize != undefined && this._dataSource.filesize !== 0) {
+ useRefTotalLength = true;
+ this._totalLength = this._dataSource.filesize;
+ }
+ if (!this._totalLengthReceived && !useRefTotalLength) {
+ // We need total filesize
+ this._waitForTotalLength = true;
+ this._internalOpen(this._dataSource, { from: 0, to: -1 });
+ }
+ else {
+ // We have filesize, start loading
+ this._openSubRange();
+ }
+ };
+ RangeLoader.prototype._openSubRange = function () {
+ var chunkSize = this._currentChunkSizeKB * 1024;
+ var from = this._range.from + this._receivedLength;
+ var to = from + chunkSize;
+ if (this._contentLength != null) {
+ if (to - this._range.from >= this._contentLength) {
+ to = this._range.from + this._contentLength - 1;
+ }
+ }
+ this._currentRequestRange = { from: from, to: to };
+ this._internalOpen(this._dataSource, this._currentRequestRange);
+ };
+ RangeLoader.prototype._internalOpen = function (dataSource, range) {
+ this._lastTimeLoaded = 0;
+ var sourceURL = dataSource.url;
+ if (this._config.reuseRedirectedURL) {
+ if (this._currentRedirectedURL != undefined) {
+ sourceURL = this._currentRedirectedURL;
+ }
+ else if (dataSource.redirectedURL != undefined) {
+ sourceURL = dataSource.redirectedURL;
+ }
+ }
+ var seekConfig = this._seekHandler.getConfig(sourceURL, range);
+ this._currentRequestURL = seekConfig.url;
+ var xhr = this._xhr = new XMLHttpRequest();
+ xhr.open('GET', seekConfig.url, true);
+ xhr.responseType = 'arraybuffer';
+ xhr.onreadystatechange = this._onReadyStateChange.bind(this);
+ xhr.onprogress = this._onProgress.bind(this);
+ xhr.onload = this._onLoad.bind(this);
+ xhr.onerror = this._onXhrError.bind(this);
+ if (dataSource.withCredentials) {
+ xhr.withCredentials = true;
+ }
+ if (typeof seekConfig.headers === 'object') {
+ var headers = seekConfig.headers;
+ for (var key in headers) {
+ if (headers.hasOwnProperty(key)) {
+ xhr.setRequestHeader(key, headers[key]);
+ }
+ }
+ }
+ // add additional headers
+ if (typeof this._config.headers === 'object') {
+ var headers = this._config.headers;
+ for (var key in headers) {
+ if (headers.hasOwnProperty(key)) {
+ xhr.setRequestHeader(key, headers[key]);
+ }
+ }
+ }
+ xhr.send();
+ };
+ RangeLoader.prototype.abort = function () {
+ this._requestAbort = true;
+ this._internalAbort();
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus.kComplete;
+ };
+ RangeLoader.prototype._internalAbort = function () {
+ if (this._xhr) {
+ this._xhr.onreadystatechange = null;
+ this._xhr.onprogress = null;
+ this._xhr.onload = null;
+ this._xhr.onerror = null;
+ this._xhr.abort();
+ this._xhr = null;
+ }
+ };
+ RangeLoader.prototype._onReadyStateChange = function (e) {
+ var xhr = e.target;
+ if (xhr.readyState === 2) { // HEADERS_RECEIVED
+ if (xhr.responseURL != undefined) { // if the browser support this property
+ var redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);
+ if (xhr.responseURL !== this._currentRequestURL && redirectedURL !== this._currentRedirectedURL) {
+ this._currentRedirectedURL = redirectedURL;
+ if (this._onURLRedirect) {
+ this._onURLRedirect(redirectedURL);
+ }
+ }
+ }
+ if ((xhr.status >= 200 && xhr.status <= 299)) {
+ if (this._waitForTotalLength) {
+ return;
+ }
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus.kBuffering;
+ }
+ else {
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus.kError;
+ if (this._onError) {
+ this._onError(_loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.HTTP_STATUS_CODE_INVALID, { code: xhr.status, msg: xhr.statusText });
+ }
+ else {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_3__.RuntimeException('RangeLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);
+ }
+ }
+ }
+ };
+ RangeLoader.prototype._onProgress = function (e) {
+ if (this._status === _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus.kError) {
+ // Ignore error response
+ return;
+ }
+ if (this._contentLength === null) {
+ var openNextRange = false;
+ if (this._waitForTotalLength) {
+ this._waitForTotalLength = false;
+ this._totalLengthReceived = true;
+ openNextRange = true;
+ var total = e.total;
+ this._internalAbort();
+ if (total != null & total !== 0) {
+ this._totalLength = total;
+ }
+ }
+ // calculate currrent request range's contentLength
+ if (this._range.to === -1) {
+ this._contentLength = this._totalLength - this._range.from;
+ }
+ else { // to !== -1
+ this._contentLength = this._range.to - this._range.from + 1;
+ }
+ if (openNextRange) {
+ this._openSubRange();
+ return;
+ }
+ if (this._onContentLengthKnown) {
+ this._onContentLengthKnown(this._contentLength);
+ }
+ }
+ var delta = e.loaded - this._lastTimeLoaded;
+ this._lastTimeLoaded = e.loaded;
+ this._speedSampler.addBytes(delta);
+ };
+ RangeLoader.prototype._normalizeSpeed = function (input) {
+ var list = this._chunkSizeKBList;
+ var last = list.length - 1;
+ var mid = 0;
+ var lbound = 0;
+ var ubound = last;
+ if (input < list[0]) {
+ return list[0];
+ }
+ while (lbound <= ubound) {
+ mid = lbound + Math.floor((ubound - lbound) / 2);
+ if (mid === last || (input >= list[mid] && input < list[mid + 1])) {
+ return list[mid];
+ }
+ else if (list[mid] < input) {
+ lbound = mid + 1;
+ }
+ else {
+ ubound = mid - 1;
+ }
+ }
+ };
+ RangeLoader.prototype._onLoad = function (e) {
+ if (this._status === _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus.kError) {
+ // Ignore error response
+ return;
+ }
+ if (this._waitForTotalLength) {
+ this._waitForTotalLength = false;
+ return;
+ }
+ this._lastTimeLoaded = 0;
+ var KBps = this._speedSampler.lastSecondKBps;
+ if (KBps === 0) {
+ this._zeroSpeedChunkCount++;
+ if (this._zeroSpeedChunkCount >= 3) {
+ // Try get currentKBps after 3 chunks
+ KBps = this._speedSampler.currentKBps;
+ }
+ }
+ if (KBps !== 0) {
+ var normalized = this._normalizeSpeed(KBps);
+ if (this._currentSpeedNormalized !== normalized) {
+ this._currentSpeedNormalized = normalized;
+ this._currentChunkSizeKB = normalized;
+ }
+ }
+ var chunk = e.target.response;
+ var byteStart = this._range.from + this._receivedLength;
+ this._receivedLength += chunk.byteLength;
+ var reportComplete = false;
+ if (this._contentLength != null && this._receivedLength < this._contentLength) {
+ // continue load next chunk
+ this._openSubRange();
+ }
+ else {
+ reportComplete = true;
+ }
+ // dispatch received chunk
+ if (this._onDataArrival) {
+ this._onDataArrival(chunk, byteStart, this._receivedLength);
+ }
+ if (reportComplete) {
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus.kComplete;
+ if (this._onComplete) {
+ this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);
+ }
+ }
+ };
+ RangeLoader.prototype._onXhrError = function (e) {
+ this._status = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderStatus.kError;
+ var type = 0;
+ var info = null;
+ if (this._contentLength && this._receivedLength > 0
+ && this._receivedLength < this._contentLength) {
+ type = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.EARLY_EOF;
+ info = { code: -1, msg: 'RangeLoader meet Early-Eof' };
+ }
+ else {
+ type = _loader_js__WEBPACK_IMPORTED_MODULE_2__.LoaderErrors.EXCEPTION;
+ info = { code: -1, msg: e.constructor.name + ' ' + e.type };
+ }
+ if (this._onError) {
+ this._onError(type, info);
+ }
+ else {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_3__.RuntimeException(info.msg);
+ }
+ };
+ return RangeLoader;
+}(_loader_js__WEBPACK_IMPORTED_MODULE_2__.BaseLoader));
+/* harmony default export */ __webpack_exports__["default"] = (RangeLoader);
+
+
+/***/ }),
+
+/***/ "./src/player/flv-player.js":
+/*!**********************************!*\
+ !*** ./src/player/flv-player.js ***!
+ \**********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! events */ "./node_modules/events/events.js");
+/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js");
+/* harmony import */ var _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/browser.js */ "./src/utils/browser.js");
+/* harmony import */ var _player_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./player-events.js */ "./src/player/player-events.js");
+/* harmony import */ var _core_transmuxer_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/transmuxer.js */ "./src/core/transmuxer.js");
+/* harmony import */ var _core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../core/transmuxing-events.js */ "./src/core/transmuxing-events.js");
+/* harmony import */ var _core_mse_controller_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../core/mse-controller.js */ "./src/core/mse-controller.js");
+/* harmony import */ var _core_mse_events_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../core/mse-events.js */ "./src/core/mse-events.js");
+/* harmony import */ var _player_errors_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./player-errors.js */ "./src/player/player-errors.js");
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+
+
+
+
+var FlvPlayer = /** @class */ (function () {
+ function FlvPlayer(mediaDataSource, config) {
+ this.TAG = 'FlvPlayer';
+ this._type = 'FlvPlayer';
+ this._emitter = new (events__WEBPACK_IMPORTED_MODULE_0___default())();
+ this._config = (0,_config_js__WEBPACK_IMPORTED_MODULE_9__.createDefaultConfig)();
+ if (typeof config === 'object') {
+ Object.assign(this._config, config);
+ }
+ if (mediaDataSource.type.toLowerCase() !== 'flv') {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_10__.InvalidArgumentException('FlvPlayer requires an flv MediaDataSource input!');
+ }
+ if (mediaDataSource.isLive === true) {
+ this._config.isLive = true;
+ }
+ this.e = {
+ onvLoadedMetadata: this._onvLoadedMetadata.bind(this),
+ onvSeeking: this._onvSeeking.bind(this),
+ onvCanPlay: this._onvCanPlay.bind(this),
+ onvStalled: this._onvStalled.bind(this),
+ onvProgress: this._onvProgress.bind(this)
+ };
+ if (self.performance && self.performance.now) {
+ this._now = self.performance.now.bind(self.performance);
+ }
+ else {
+ this._now = Date.now;
+ }
+ this._pendingSeekTime = null; // in seconds
+ this._requestSetTime = false;
+ this._seekpointRecord = null;
+ this._progressChecker = null;
+ this._mediaDataSource = mediaDataSource;
+ this._mediaElement = null;
+ this._msectl = null;
+ this._transmuxer = null;
+ this._mseSourceOpened = false;
+ this._hasPendingLoad = false;
+ this._receivedCanPlay = false;
+ this._mediaInfo = null;
+ this._statisticsInfo = null;
+ var chromeNeedIDRFix = (_utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.chrome &&
+ (_utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.version.major < 50 ||
+ (_utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.version.major === 50 && _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.version.build < 2661)));
+ this._alwaysSeekKeyframe = (chromeNeedIDRFix || _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.msedge || _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.msie) ? true : false;
+ if (this._alwaysSeekKeyframe) {
+ this._config.accurateSeek = false;
+ }
+ }
+ FlvPlayer.prototype.destroy = function () {
+ if (this._progressChecker != null) {
+ window.clearInterval(this._progressChecker);
+ this._progressChecker = null;
+ }
+ if (this._transmuxer) {
+ this.unload();
+ }
+ if (this._mediaElement) {
+ this.detachMediaElement();
+ }
+ this.e = null;
+ this._mediaDataSource = null;
+ this._emitter.removeAllListeners();
+ this._emitter = null;
+ };
+ FlvPlayer.prototype.on = function (event, listener) {
+ var _this = this;
+ if (event === _player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.MEDIA_INFO) {
+ if (this._mediaInfo != null) {
+ Promise.resolve().then(function () {
+ _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.MEDIA_INFO, _this.mediaInfo);
+ });
+ }
+ }
+ else if (event === _player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.STATISTICS_INFO) {
+ if (this._statisticsInfo != null) {
+ Promise.resolve().then(function () {
+ _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.STATISTICS_INFO, _this.statisticsInfo);
+ });
+ }
+ }
+ this._emitter.addListener(event, listener);
+ };
+ FlvPlayer.prototype.off = function (event, listener) {
+ this._emitter.removeListener(event, listener);
+ };
+ FlvPlayer.prototype.attachMediaElement = function (mediaElement) {
+ var _this = this;
+ this._mediaElement = mediaElement;
+ mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata);
+ mediaElement.addEventListener('seeking', this.e.onvSeeking);
+ mediaElement.addEventListener('canplay', this.e.onvCanPlay);
+ mediaElement.addEventListener('stalled', this.e.onvStalled);
+ mediaElement.addEventListener('progress', this.e.onvProgress);
+ this._msectl = new _core_mse_controller_js__WEBPACK_IMPORTED_MODULE_6__.default(this._config);
+ this._msectl.on(_core_mse_events_js__WEBPACK_IMPORTED_MODULE_7__.default.UPDATE_END, this._onmseUpdateEnd.bind(this));
+ this._msectl.on(_core_mse_events_js__WEBPACK_IMPORTED_MODULE_7__.default.BUFFER_FULL, this._onmseBufferFull.bind(this));
+ this._msectl.on(_core_mse_events_js__WEBPACK_IMPORTED_MODULE_7__.default.SOURCE_OPEN, function () {
+ _this._mseSourceOpened = true;
+ if (_this._hasPendingLoad) {
+ _this._hasPendingLoad = false;
+ _this.load();
+ }
+ });
+ this._msectl.on(_core_mse_events_js__WEBPACK_IMPORTED_MODULE_7__.default.ERROR, function (info) {
+ _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.ERROR, _player_errors_js__WEBPACK_IMPORTED_MODULE_8__.ErrorTypes.MEDIA_ERROR, _player_errors_js__WEBPACK_IMPORTED_MODULE_8__.ErrorDetails.MEDIA_MSE_ERROR, info);
+ });
+ this._msectl.attachMediaElement(mediaElement);
+ if (this._pendingSeekTime != null) {
+ try {
+ mediaElement.currentTime = this._pendingSeekTime;
+ this._pendingSeekTime = null;
+ }
+ catch (e) {
+ // IE11 may throw InvalidStateError if readyState === 0
+ // We can defer set currentTime operation after loadedmetadata
+ }
+ }
+ };
+ FlvPlayer.prototype.detachMediaElement = function () {
+ if (this._mediaElement) {
+ this._msectl.detachMediaElement();
+ this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata);
+ this._mediaElement.removeEventListener('seeking', this.e.onvSeeking);
+ this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay);
+ this._mediaElement.removeEventListener('stalled', this.e.onvStalled);
+ this._mediaElement.removeEventListener('progress', this.e.onvProgress);
+ this._mediaElement = null;
+ }
+ if (this._msectl) {
+ this._msectl.destroy();
+ this._msectl = null;
+ }
+ };
+ FlvPlayer.prototype.load = function () {
+ var _this = this;
+ if (!this._mediaElement) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_10__.IllegalStateException('HTMLMediaElement must be attached before load()!');
+ }
+ if (this._transmuxer) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_10__.IllegalStateException('FlvPlayer.load() has been called, please call unload() first!');
+ }
+ if (this._hasPendingLoad) {
+ return;
+ }
+ if (this._config.deferLoadAfterSourceOpen && this._mseSourceOpened === false) {
+ this._hasPendingLoad = true;
+ return;
+ }
+ if (this._mediaElement.readyState > 0) {
+ this._requestSetTime = true;
+ // IE11 may throw InvalidStateError if readyState === 0
+ this._mediaElement.currentTime = 0;
+ }
+ this._transmuxer = new _core_transmuxer_js__WEBPACK_IMPORTED_MODULE_4__.default(this._mediaDataSource, this._config);
+ this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.INIT_SEGMENT, function (type, is) {
+ _this._msectl.appendInitSegment(is);
+ });
+ this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.MEDIA_SEGMENT, function (type, ms) {
+ _this._msectl.appendMediaSegment(ms);
+ // lazyLoad check
+ if (_this._config.lazyLoad && !_this._config.isLive) {
+ var currentTime = _this._mediaElement.currentTime;
+ if (ms.info.endDts >= (currentTime + _this._config.lazyLoadMaxDuration) * 1000) {
+ if (_this._progressChecker == null) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(_this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task');
+ _this._suspendTransmuxer();
+ }
+ }
+ }
+ });
+ this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.LOADING_COMPLETE, function () {
+ _this._msectl.endOfStream();
+ _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.LOADING_COMPLETE);
+ });
+ this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.RECOVERED_EARLY_EOF, function () {
+ _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.RECOVERED_EARLY_EOF);
+ });
+ this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.IO_ERROR, function (detail, info) {
+ _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.ERROR, _player_errors_js__WEBPACK_IMPORTED_MODULE_8__.ErrorTypes.NETWORK_ERROR, detail, info);
+ });
+ this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.DEMUX_ERROR, function (detail, info) {
+ _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.ERROR, _player_errors_js__WEBPACK_IMPORTED_MODULE_8__.ErrorTypes.MEDIA_ERROR, detail, { code: -1, msg: info });
+ });
+ this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.MEDIA_INFO, function (mediaInfo) {
+ _this._mediaInfo = mediaInfo;
+ _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.MEDIA_INFO, Object.assign({}, mediaInfo));
+ });
+ this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.METADATA_ARRIVED, function (metadata) {
+ _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.METADATA_ARRIVED, metadata);
+ });
+ this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.SCRIPTDATA_ARRIVED, function (data) {
+ _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.SCRIPTDATA_ARRIVED, data);
+ });
+ this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.STATISTICS_INFO, function (statInfo) {
+ _this._statisticsInfo = _this._fillStatisticsInfo(statInfo);
+ _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_3__.default.STATISTICS_INFO, Object.assign({}, _this._statisticsInfo));
+ });
+ this._transmuxer.on(_core_transmuxing_events_js__WEBPACK_IMPORTED_MODULE_5__.default.RECOMMEND_SEEKPOINT, function (milliseconds) {
+ if (_this._mediaElement && !_this._config.accurateSeek) {
+ _this._requestSetTime = true;
+ _this._mediaElement.currentTime = milliseconds / 1000;
+ }
+ });
+ this._transmuxer.open();
+ };
+ FlvPlayer.prototype.unload = function () {
+ if (this._mediaElement) {
+ this._mediaElement.pause();
+ }
+ if (this._msectl) {
+ this._msectl.seek(0);
+ }
+ if (this._transmuxer) {
+ this._transmuxer.close();
+ this._transmuxer.destroy();
+ this._transmuxer = null;
+ }
+ };
+ FlvPlayer.prototype.play = function () {
+ return this._mediaElement.play();
+ };
+ FlvPlayer.prototype.pause = function () {
+ this._mediaElement.pause();
+ };
+ Object.defineProperty(FlvPlayer.prototype, "type", {
+ get: function () {
+ return this._type;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(FlvPlayer.prototype, "buffered", {
+ get: function () {
+ return this._mediaElement.buffered;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(FlvPlayer.prototype, "duration", {
+ get: function () {
+ return this._mediaElement.duration;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(FlvPlayer.prototype, "volume", {
+ get: function () {
+ return this._mediaElement.volume;
+ },
+ set: function (value) {
+ this._mediaElement.volume = value;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(FlvPlayer.prototype, "muted", {
+ get: function () {
+ return this._mediaElement.muted;
+ },
+ set: function (muted) {
+ this._mediaElement.muted = muted;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(FlvPlayer.prototype, "currentTime", {
+ get: function () {
+ if (this._mediaElement) {
+ return this._mediaElement.currentTime;
+ }
+ return 0;
+ },
+ set: function (seconds) {
+ if (this._mediaElement) {
+ this._internalSeek(seconds);
+ }
+ else {
+ this._pendingSeekTime = seconds;
+ }
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(FlvPlayer.prototype, "mediaInfo", {
+ get: function () {
+ return Object.assign({}, this._mediaInfo);
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(FlvPlayer.prototype, "statisticsInfo", {
+ get: function () {
+ if (this._statisticsInfo == null) {
+ this._statisticsInfo = {};
+ }
+ this._statisticsInfo = this._fillStatisticsInfo(this._statisticsInfo);
+ return Object.assign({}, this._statisticsInfo);
+ },
+ enumerable: false,
+ configurable: true
+ });
+ FlvPlayer.prototype._fillStatisticsInfo = function (statInfo) {
+ statInfo.playerType = this._type;
+ if (!(this._mediaElement instanceof HTMLVideoElement)) {
+ return statInfo;
+ }
+ var hasQualityInfo = true;
+ var decoded = 0;
+ var dropped = 0;
+ if (this._mediaElement.getVideoPlaybackQuality) {
+ var quality = this._mediaElement.getVideoPlaybackQuality();
+ decoded = quality.totalVideoFrames;
+ dropped = quality.droppedVideoFrames;
+ }
+ else if (this._mediaElement.webkitDecodedFrameCount != undefined) {
+ decoded = this._mediaElement.webkitDecodedFrameCount;
+ dropped = this._mediaElement.webkitDroppedFrameCount;
+ }
+ else {
+ hasQualityInfo = false;
+ }
+ if (hasQualityInfo) {
+ statInfo.decodedFrames = decoded;
+ statInfo.droppedFrames = dropped;
+ }
+ return statInfo;
+ };
+ FlvPlayer.prototype._onmseUpdateEnd = function () {
+ if (!this._config.lazyLoad || this._config.isLive) {
+ return;
+ }
+ var buffered = this._mediaElement.buffered;
+ var currentTime = this._mediaElement.currentTime;
+ var currentRangeStart = 0;
+ var currentRangeEnd = 0;
+ for (var i = 0; i < buffered.length; i++) {
+ var start = buffered.start(i);
+ var end = buffered.end(i);
+ if (start <= currentTime && currentTime < end) {
+ currentRangeStart = start;
+ currentRangeEnd = end;
+ break;
+ }
+ }
+ if (currentRangeEnd >= currentTime + this._config.lazyLoadMaxDuration && this._progressChecker == null) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task');
+ this._suspendTransmuxer();
+ }
+ };
+ FlvPlayer.prototype._onmseBufferFull = function () {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, 'MSE SourceBuffer is full, suspend transmuxing task');
+ if (this._progressChecker == null) {
+ this._suspendTransmuxer();
+ }
+ };
+ FlvPlayer.prototype._suspendTransmuxer = function () {
+ if (this._transmuxer) {
+ this._transmuxer.pause();
+ if (this._progressChecker == null) {
+ this._progressChecker = window.setInterval(this._checkProgressAndResume.bind(this), 1000);
+ }
+ }
+ };
+ FlvPlayer.prototype._checkProgressAndResume = function () {
+ var currentTime = this._mediaElement.currentTime;
+ var buffered = this._mediaElement.buffered;
+ var needResume = false;
+ for (var i = 0; i < buffered.length; i++) {
+ var from = buffered.start(i);
+ var to = buffered.end(i);
+ if (currentTime >= from && currentTime < to) {
+ if (currentTime >= to - this._config.lazyLoadRecoverDuration) {
+ needResume = true;
+ }
+ break;
+ }
+ }
+ if (needResume) {
+ window.clearInterval(this._progressChecker);
+ this._progressChecker = null;
+ if (needResume) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.v(this.TAG, 'Continue loading from paused position');
+ this._transmuxer.resume();
+ }
+ }
+ };
+ FlvPlayer.prototype._isTimepointBuffered = function (seconds) {
+ var buffered = this._mediaElement.buffered;
+ for (var i = 0; i < buffered.length; i++) {
+ var from = buffered.start(i);
+ var to = buffered.end(i);
+ if (seconds >= from && seconds < to) {
+ return true;
+ }
+ }
+ return false;
+ };
+ FlvPlayer.prototype._internalSeek = function (seconds) {
+ var directSeek = this._isTimepointBuffered(seconds);
+ var directSeekBegin = false;
+ var directSeekBeginTime = 0;
+ if (seconds < 1.0 && this._mediaElement.buffered.length > 0) {
+ var videoBeginTime = this._mediaElement.buffered.start(0);
+ if ((videoBeginTime < 1.0 && seconds < videoBeginTime) || _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.safari) {
+ directSeekBegin = true;
+ // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid
+ directSeekBeginTime = _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.safari ? 0.1 : videoBeginTime;
+ }
+ }
+ if (directSeekBegin) { // seek to video begin, set currentTime directly if beginPTS buffered
+ this._requestSetTime = true;
+ this._mediaElement.currentTime = directSeekBeginTime;
+ }
+ else if (directSeek) { // buffered position
+ if (!this._alwaysSeekKeyframe) {
+ this._requestSetTime = true;
+ this._mediaElement.currentTime = seconds;
+ }
+ else {
+ var idr = this._msectl.getNearestKeyframe(Math.floor(seconds * 1000));
+ this._requestSetTime = true;
+ if (idr != null) {
+ this._mediaElement.currentTime = idr.dts / 1000;
+ }
+ else {
+ this._mediaElement.currentTime = seconds;
+ }
+ }
+ if (this._progressChecker != null) {
+ this._checkProgressAndResume();
+ }
+ }
+ else {
+ if (this._progressChecker != null) {
+ window.clearInterval(this._progressChecker);
+ this._progressChecker = null;
+ }
+ this._msectl.seek(seconds);
+ this._transmuxer.seek(Math.floor(seconds * 1000)); // in milliseconds
+ // no need to set mediaElement.currentTime if non-accurateSeek,
+ // just wait for the recommend_seekpoint callback
+ if (this._config.accurateSeek) {
+ this._requestSetTime = true;
+ this._mediaElement.currentTime = seconds;
+ }
+ }
+ };
+ FlvPlayer.prototype._checkAndApplyUnbufferedSeekpoint = function () {
+ if (this._seekpointRecord) {
+ if (this._seekpointRecord.recordTime <= this._now() - 100) {
+ var target = this._mediaElement.currentTime;
+ this._seekpointRecord = null;
+ if (!this._isTimepointBuffered(target)) {
+ if (this._progressChecker != null) {
+ window.clearTimeout(this._progressChecker);
+ this._progressChecker = null;
+ }
+ // .currentTime is consists with .buffered timestamp
+ // Chrome/Edge use DTS, while FireFox/Safari use PTS
+ this._msectl.seek(target);
+ this._transmuxer.seek(Math.floor(target * 1000));
+ // set currentTime if accurateSeek, or wait for recommend_seekpoint callback
+ if (this._config.accurateSeek) {
+ this._requestSetTime = true;
+ this._mediaElement.currentTime = target;
+ }
+ }
+ }
+ else {
+ window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50);
+ }
+ }
+ };
+ FlvPlayer.prototype._checkAndResumeStuckPlayback = function (stalled) {
+ var media = this._mediaElement;
+ if (stalled || !this._receivedCanPlay || media.readyState < 2) { // HAVE_CURRENT_DATA
+ var buffered = media.buffered;
+ if (buffered.length > 0 && media.currentTime < buffered.start(0)) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.w(this.TAG, "Playback seems stuck at " + media.currentTime + ", seek to " + buffered.start(0));
+ this._requestSetTime = true;
+ this._mediaElement.currentTime = buffered.start(0);
+ this._mediaElement.removeEventListener('progress', this.e.onvProgress);
+ }
+ }
+ else {
+ // Playback didn't stuck, remove progress event listener
+ this._mediaElement.removeEventListener('progress', this.e.onvProgress);
+ }
+ };
+ FlvPlayer.prototype._onvLoadedMetadata = function (e) {
+ if (this._pendingSeekTime != null) {
+ this._mediaElement.currentTime = this._pendingSeekTime;
+ this._pendingSeekTime = null;
+ }
+ };
+ FlvPlayer.prototype._onvSeeking = function (e) {
+ var target = this._mediaElement.currentTime;
+ var buffered = this._mediaElement.buffered;
+ if (this._requestSetTime) {
+ this._requestSetTime = false;
+ return;
+ }
+ if (target < 1.0 && buffered.length > 0) {
+ // seek to video begin, set currentTime directly if beginPTS buffered
+ var videoBeginTime = buffered.start(0);
+ if ((videoBeginTime < 1.0 && target < videoBeginTime) || _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.safari) {
+ this._requestSetTime = true;
+ // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid
+ this._mediaElement.currentTime = _utils_browser_js__WEBPACK_IMPORTED_MODULE_2__.default.safari ? 0.1 : videoBeginTime;
+ return;
+ }
+ }
+ if (this._isTimepointBuffered(target)) {
+ if (this._alwaysSeekKeyframe) {
+ var idr = this._msectl.getNearestKeyframe(Math.floor(target * 1000));
+ if (idr != null) {
+ this._requestSetTime = true;
+ this._mediaElement.currentTime = idr.dts / 1000;
+ }
+ }
+ if (this._progressChecker != null) {
+ this._checkProgressAndResume();
+ }
+ return;
+ }
+ this._seekpointRecord = {
+ seekPoint: target,
+ recordTime: this._now()
+ };
+ window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50);
+ };
+ FlvPlayer.prototype._onvCanPlay = function (e) {
+ this._receivedCanPlay = true;
+ this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay);
+ };
+ FlvPlayer.prototype._onvStalled = function (e) {
+ this._checkAndResumeStuckPlayback(true);
+ };
+ FlvPlayer.prototype._onvProgress = function (e) {
+ this._checkAndResumeStuckPlayback();
+ };
+ return FlvPlayer;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (FlvPlayer);
+
+
+/***/ }),
+
+/***/ "./src/player/native-player.js":
+/*!*************************************!*\
+ !*** ./src/player/native-player.js ***!
+ \*************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! events */ "./node_modules/events/events.js");
+/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _player_events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./player-events.js */ "./src/player/player-events.js");
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+// Player wrapper for browser's native player (HTMLVideoElement) without MediaSource src.
+var NativePlayer = /** @class */ (function () {
+ function NativePlayer(mediaDataSource, config) {
+ this.TAG = 'NativePlayer';
+ this._type = 'NativePlayer';
+ this._emitter = new (events__WEBPACK_IMPORTED_MODULE_0___default())();
+ this._config = (0,_config_js__WEBPACK_IMPORTED_MODULE_2__.createDefaultConfig)();
+ if (typeof config === 'object') {
+ Object.assign(this._config, config);
+ }
+ if (mediaDataSource.type.toLowerCase() === 'flv') {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_3__.InvalidArgumentException('NativePlayer does\'t support flv MediaDataSource input!');
+ }
+ if (mediaDataSource.hasOwnProperty('segments')) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_3__.InvalidArgumentException("NativePlayer(" + mediaDataSource.type + ") doesn't support multipart playback!");
+ }
+ this.e = {
+ onvLoadedMetadata: this._onvLoadedMetadata.bind(this)
+ };
+ this._pendingSeekTime = null;
+ this._statisticsReporter = null;
+ this._mediaDataSource = mediaDataSource;
+ this._mediaElement = null;
+ }
+ NativePlayer.prototype.destroy = function () {
+ if (this._mediaElement) {
+ this.unload();
+ this.detachMediaElement();
+ }
+ this.e = null;
+ this._mediaDataSource = null;
+ this._emitter.removeAllListeners();
+ this._emitter = null;
+ };
+ NativePlayer.prototype.on = function (event, listener) {
+ var _this = this;
+ if (event === _player_events_js__WEBPACK_IMPORTED_MODULE_1__.default.MEDIA_INFO) {
+ if (this._mediaElement != null && this._mediaElement.readyState !== 0) { // HAVE_NOTHING
+ Promise.resolve().then(function () {
+ _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_1__.default.MEDIA_INFO, _this.mediaInfo);
+ });
+ }
+ }
+ else if (event === _player_events_js__WEBPACK_IMPORTED_MODULE_1__.default.STATISTICS_INFO) {
+ if (this._mediaElement != null && this._mediaElement.readyState !== 0) {
+ Promise.resolve().then(function () {
+ _this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_1__.default.STATISTICS_INFO, _this.statisticsInfo);
+ });
+ }
+ }
+ this._emitter.addListener(event, listener);
+ };
+ NativePlayer.prototype.off = function (event, listener) {
+ this._emitter.removeListener(event, listener);
+ };
+ NativePlayer.prototype.attachMediaElement = function (mediaElement) {
+ this._mediaElement = mediaElement;
+ mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata);
+ if (this._pendingSeekTime != null) {
+ try {
+ mediaElement.currentTime = this._pendingSeekTime;
+ this._pendingSeekTime = null;
+ }
+ catch (e) {
+ // IE11 may throw InvalidStateError if readyState === 0
+ // Defer set currentTime operation after loadedmetadata
+ }
+ }
+ };
+ NativePlayer.prototype.detachMediaElement = function () {
+ if (this._mediaElement) {
+ this._mediaElement.src = '';
+ this._mediaElement.removeAttribute('src');
+ this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata);
+ this._mediaElement = null;
+ }
+ if (this._statisticsReporter != null) {
+ window.clearInterval(this._statisticsReporter);
+ this._statisticsReporter = null;
+ }
+ };
+ NativePlayer.prototype.load = function () {
+ if (!this._mediaElement) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_3__.IllegalStateException('HTMLMediaElement must be attached before load()!');
+ }
+ this._mediaElement.src = this._mediaDataSource.url;
+ if (this._mediaElement.readyState > 0) {
+ this._mediaElement.currentTime = 0;
+ }
+ this._mediaElement.preload = 'auto';
+ this._mediaElement.load();
+ this._statisticsReporter = window.setInterval(this._reportStatisticsInfo.bind(this), this._config.statisticsInfoReportInterval);
+ };
+ NativePlayer.prototype.unload = function () {
+ if (this._mediaElement) {
+ this._mediaElement.src = '';
+ this._mediaElement.removeAttribute('src');
+ }
+ if (this._statisticsReporter != null) {
+ window.clearInterval(this._statisticsReporter);
+ this._statisticsReporter = null;
+ }
+ };
+ NativePlayer.prototype.play = function () {
+ return this._mediaElement.play();
+ };
+ NativePlayer.prototype.pause = function () {
+ this._mediaElement.pause();
+ };
+ Object.defineProperty(NativePlayer.prototype, "type", {
+ get: function () {
+ return this._type;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(NativePlayer.prototype, "buffered", {
+ get: function () {
+ return this._mediaElement.buffered;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(NativePlayer.prototype, "duration", {
+ get: function () {
+ return this._mediaElement.duration;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(NativePlayer.prototype, "volume", {
+ get: function () {
+ return this._mediaElement.volume;
+ },
+ set: function (value) {
+ this._mediaElement.volume = value;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(NativePlayer.prototype, "muted", {
+ get: function () {
+ return this._mediaElement.muted;
+ },
+ set: function (muted) {
+ this._mediaElement.muted = muted;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(NativePlayer.prototype, "currentTime", {
+ get: function () {
+ if (this._mediaElement) {
+ return this._mediaElement.currentTime;
+ }
+ return 0;
+ },
+ set: function (seconds) {
+ if (this._mediaElement) {
+ this._mediaElement.currentTime = seconds;
+ }
+ else {
+ this._pendingSeekTime = seconds;
+ }
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(NativePlayer.prototype, "mediaInfo", {
+ get: function () {
+ var mediaPrefix = (this._mediaElement instanceof HTMLAudioElement) ? 'audio/' : 'video/';
+ var info = {
+ mimeType: mediaPrefix + this._mediaDataSource.type
+ };
+ if (this._mediaElement) {
+ info.duration = Math.floor(this._mediaElement.duration * 1000);
+ if (this._mediaElement instanceof HTMLVideoElement) {
+ info.width = this._mediaElement.videoWidth;
+ info.height = this._mediaElement.videoHeight;
+ }
+ }
+ return info;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(NativePlayer.prototype, "statisticsInfo", {
+ get: function () {
+ var info = {
+ playerType: this._type,
+ url: this._mediaDataSource.url
+ };
+ if (!(this._mediaElement instanceof HTMLVideoElement)) {
+ return info;
+ }
+ var hasQualityInfo = true;
+ var decoded = 0;
+ var dropped = 0;
+ if (this._mediaElement.getVideoPlaybackQuality) {
+ var quality = this._mediaElement.getVideoPlaybackQuality();
+ decoded = quality.totalVideoFrames;
+ dropped = quality.droppedVideoFrames;
+ }
+ else if (this._mediaElement.webkitDecodedFrameCount != undefined) {
+ decoded = this._mediaElement.webkitDecodedFrameCount;
+ dropped = this._mediaElement.webkitDroppedFrameCount;
+ }
+ else {
+ hasQualityInfo = false;
+ }
+ if (hasQualityInfo) {
+ info.decodedFrames = decoded;
+ info.droppedFrames = dropped;
+ }
+ return info;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ NativePlayer.prototype._onvLoadedMetadata = function (e) {
+ if (this._pendingSeekTime != null) {
+ this._mediaElement.currentTime = this._pendingSeekTime;
+ this._pendingSeekTime = null;
+ }
+ this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_1__.default.MEDIA_INFO, this.mediaInfo);
+ };
+ NativePlayer.prototype._reportStatisticsInfo = function () {
+ this._emitter.emit(_player_events_js__WEBPACK_IMPORTED_MODULE_1__.default.STATISTICS_INFO, this.statisticsInfo);
+ };
+ return NativePlayer;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (NativePlayer);
+
+
+/***/ }),
+
+/***/ "./src/player/player-errors.js":
+/*!*************************************!*\
+ !*** ./src/player/player-errors.js ***!
+ \*************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "ErrorTypes": function() { return /* binding */ ErrorTypes; },
+/* harmony export */ "ErrorDetails": function() { return /* binding */ ErrorDetails; }
+/* harmony export */ });
+/* harmony import */ var _io_loader_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../io/loader.js */ "./src/io/loader.js");
+/* harmony import */ var _demux_demux_errors_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../demux/demux-errors.js */ "./src/demux/demux-errors.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+var ErrorTypes = {
+ NETWORK_ERROR: 'NetworkError',
+ MEDIA_ERROR: 'MediaError',
+ OTHER_ERROR: 'OtherError'
+};
+var ErrorDetails = {
+ NETWORK_EXCEPTION: _io_loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderErrors.EXCEPTION,
+ NETWORK_STATUS_CODE_INVALID: _io_loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderErrors.HTTP_STATUS_CODE_INVALID,
+ NETWORK_TIMEOUT: _io_loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderErrors.CONNECTING_TIMEOUT,
+ NETWORK_UNRECOVERABLE_EARLY_EOF: _io_loader_js__WEBPACK_IMPORTED_MODULE_0__.LoaderErrors.UNRECOVERABLE_EARLY_EOF,
+ MEDIA_MSE_ERROR: 'MediaMSEError',
+ MEDIA_FORMAT_ERROR: _demux_demux_errors_js__WEBPACK_IMPORTED_MODULE_1__.default.FORMAT_ERROR,
+ MEDIA_FORMAT_UNSUPPORTED: _demux_demux_errors_js__WEBPACK_IMPORTED_MODULE_1__.default.FORMAT_UNSUPPORTED,
+ MEDIA_CODEC_UNSUPPORTED: _demux_demux_errors_js__WEBPACK_IMPORTED_MODULE_1__.default.CODEC_UNSUPPORTED
+};
+
+
+/***/ }),
+
+/***/ "./src/player/player-events.js":
+/*!*************************************!*\
+ !*** ./src/player/player-events.js ***!
+ \*************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var PlayerEvents = {
+ ERROR: 'error',
+ LOADING_COMPLETE: 'loading_complete',
+ RECOVERED_EARLY_EOF: 'recovered_early_eof',
+ MEDIA_INFO: 'media_info',
+ METADATA_ARRIVED: 'metadata_arrived',
+ SCRIPTDATA_ARRIVED: 'scriptdata_arrived',
+ STATISTICS_INFO: 'statistics_info'
+};
+/* harmony default export */ __webpack_exports__["default"] = (PlayerEvents);
+
+
+/***/ }),
+
+/***/ "./src/remux/aac-silent.js":
+/*!*********************************!*\
+ !*** ./src/remux/aac-silent.js ***!
+ \*********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * This file is modified from dailymotion's hls.js library (hls.js/src/helper/aac.js)
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var AAC = /** @class */ (function () {
+ function AAC() {
+ }
+ AAC.getSilentFrame = function (codec, channelCount) {
+ if (codec === 'mp4a.40.2') {
+ // handle LC-AAC
+ if (channelCount === 1) {
+ return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80]);
+ }
+ else if (channelCount === 2) {
+ return new Uint8Array([0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80]);
+ }
+ else if (channelCount === 3) {
+ return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x8e]);
+ }
+ else if (channelCount === 4) {
+ return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38]);
+ }
+ else if (channelCount === 5) {
+ return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38]);
+ }
+ else if (channelCount === 6) {
+ return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2, 0x00, 0x20, 0x08, 0xe0]);
+ }
+ }
+ else {
+ // handle HE-AAC (mp4a.40.5 / mp4a.40.29)
+ if (channelCount === 1) {
+ // ffmpeg -y -f lavfi -i "aevalsrc=0:d=0.05" -c:a libfdk_aac -profile:a aac_he -b:a 4k output.aac && hexdump -v -e '16/1 "0x%x," "\n"' -v output.aac
+ return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);
+ }
+ else if (channelCount === 2) {
+ // ffmpeg -y -f lavfi -i "aevalsrc=0|0:d=0.05" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 "0x%x," "\n"' -v output.aac
+ return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);
+ }
+ else if (channelCount === 3) {
+ // ffmpeg -y -f lavfi -i "aevalsrc=0|0|0:d=0.05" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 "0x%x," "\n"' -v output.aac
+ return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);
+ }
+ }
+ return null;
+ };
+ return AAC;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (AAC);
+
+
+/***/ }),
+
+/***/ "./src/remux/mp4-generator.js":
+/*!************************************!*\
+ !*** ./src/remux/mp4-generator.js ***!
+ \************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * This file is derived from dailymotion's hls.js library (hls.js/src/remux/mp4-generator.js)
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// MP4 boxes generator for ISO BMFF (ISO Base Media File Format, defined in ISO/IEC 14496-12)
+var MP4 = /** @class */ (function () {
+ function MP4() {
+ }
+ MP4.init = function () {
+ MP4.types = {
+ hvc1: [], hvcC: [],
+ avc1: [], avcC: [], btrt: [], dinf: [],
+ dref: [], esds: [], ftyp: [], hdlr: [],
+ mdat: [], mdhd: [], mdia: [], mfhd: [],
+ minf: [], moof: [], moov: [], mp4a: [],
+ mvex: [], mvhd: [], sdtp: [], stbl: [],
+ stco: [], stsc: [], stsd: [], stsz: [],
+ stts: [], tfdt: [], tfhd: [], traf: [],
+ trak: [], trun: [], trex: [], tkhd: [],
+ vmhd: [], smhd: [], pasp: [], '.mp3': []
+ };
+ for (var name_1 in MP4.types) {
+ if (MP4.types.hasOwnProperty(name_1)) {
+ MP4.types[name_1] = [
+ name_1.charCodeAt(0),
+ name_1.charCodeAt(1),
+ name_1.charCodeAt(2),
+ name_1.charCodeAt(3)
+ ];
+ }
+ }
+ var constants = MP4.constants = {};
+ constants.FTYP = new Uint8Array([
+ 0x69, 0x73, 0x6F, 0x6D,
+ 0x0, 0x0, 0x0, 0x1,
+ 0x69, 0x73, 0x6F, 0x6D,
+ 0x61, 0x76, 0x63, 0x31 // avc1
+ ]);
+ constants.STSD_PREFIX = new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01 // entry_count
+ ]);
+ constants.STTS = new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00 // entry_count
+ ]);
+ constants.STSC = constants.STCO = constants.STTS;
+ constants.STSZ = new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00 // sample_count
+ ]);
+ constants.HDLR_VIDEO = new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x76, 0x69, 0x64, 0x65,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x56, 0x69, 0x64, 0x65,
+ 0x6F, 0x48, 0x61, 0x6E,
+ 0x64, 0x6C, 0x65, 0x72, 0x00 // name: VideoHandler
+ ]);
+ constants.HDLR_AUDIO = new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x73, 0x6F, 0x75, 0x6E,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x53, 0x6F, 0x75, 0x6E,
+ 0x64, 0x48, 0x61, 0x6E,
+ 0x64, 0x6C, 0x65, 0x72, 0x00 // name: SoundHandler
+ ]);
+ constants.DREF = new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x0C,
+ 0x75, 0x72, 0x6C, 0x20,
+ 0x00, 0x00, 0x00, 0x01 // version(0) + flags
+ ]);
+ // Sound media header
+ constants.SMHD = new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00 // balance(2) + reserved(2)
+ ]);
+ // video media header
+ constants.VMHD = new Uint8Array([
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00
+ ]);
+ };
+ // Generate a box
+ MP4.box = function (type) {
+ var size = 8;
+ var result = null;
+ var datas = Array.prototype.slice.call(arguments, 1);
+ var arrayCount = datas.length;
+ for (var i = 0; i < arrayCount; i++) {
+ size += datas[i].byteLength;
+ }
+ result = new Uint8Array(size);
+ result[0] = (size >>> 24) & 0xFF; // size
+ result[1] = (size >>> 16) & 0xFF;
+ result[2] = (size >>> 8) & 0xFF;
+ result[3] = (size) & 0xFF;
+ result.set(type, 4); // type
+ var offset = 8;
+ for (var i = 0; i < arrayCount; i++) { // data body
+ result.set(datas[i], offset);
+ offset += datas[i].byteLength;
+ }
+ return result;
+ };
+ // emit ftyp & moov
+ MP4.generateInitSegment = function (meta) {
+ var ftyp = MP4.box(MP4.types.ftyp, MP4.constants.FTYP);
+ var moov = MP4.moov(meta);
+ var result = new Uint8Array(ftyp.byteLength + moov.byteLength);
+ result.set(ftyp, 0);
+ result.set(moov, ftyp.byteLength);
+ return result;
+ };
+ // Movie metadata box
+ MP4.moov = function (meta) {
+ var mvhd = MP4.mvhd(meta.timescale, meta.duration);
+ var trak = MP4.trak(meta);
+ var mvex = MP4.mvex(meta);
+ return MP4.box(MP4.types.moov, mvhd, trak, mvex);
+ };
+ // Movie header box
+ MP4.mvhd = function (timescale, duration) {
+ return MP4.box(MP4.types.mvhd, new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ (timescale >>> 24) & 0xFF,
+ (timescale >>> 16) & 0xFF,
+ (timescale >>> 8) & 0xFF,
+ (timescale) & 0xFF,
+ (duration >>> 24) & 0xFF,
+ (duration >>> 16) & 0xFF,
+ (duration >>> 8) & 0xFF,
+ (duration) & 0xFF,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF // next_track_ID
+ ]));
+ };
+ // Track box
+ MP4.trak = function (meta) {
+ return MP4.box(MP4.types.trak, MP4.tkhd(meta), MP4.mdia(meta));
+ };
+ // Track header box
+ MP4.tkhd = function (meta) {
+ var trackId = meta.id, duration = meta.duration;
+ var width = meta.presentWidth, height = meta.presentHeight;
+ return MP4.box(MP4.types.tkhd, new Uint8Array([
+ 0x00, 0x00, 0x00, 0x07,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ (trackId >>> 24) & 0xFF,
+ (trackId >>> 16) & 0xFF,
+ (trackId >>> 8) & 0xFF,
+ (trackId) & 0xFF,
+ 0x00, 0x00, 0x00, 0x00,
+ (duration >>> 24) & 0xFF,
+ (duration >>> 16) & 0xFF,
+ (duration >>> 8) & 0xFF,
+ (duration) & 0xFF,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x00, 0x00, 0x00,
+ (width >>> 8) & 0xFF,
+ (width) & 0xFF,
+ 0x00, 0x00,
+ (height >>> 8) & 0xFF,
+ (height) & 0xFF,
+ 0x00, 0x00
+ ]));
+ };
+ // Media Box
+ MP4.mdia = function (meta) {
+ return MP4.box(MP4.types.mdia, MP4.mdhd(meta), MP4.hdlr(meta), MP4.minf(meta));
+ };
+ // Media header box
+ MP4.mdhd = function (meta) {
+ var timescale = meta.timescale;
+ var duration = meta.duration;
+ return MP4.box(MP4.types.mdhd, new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ (timescale >>> 24) & 0xFF,
+ (timescale >>> 16) & 0xFF,
+ (timescale >>> 8) & 0xFF,
+ (timescale) & 0xFF,
+ (duration >>> 24) & 0xFF,
+ (duration >>> 16) & 0xFF,
+ (duration >>> 8) & 0xFF,
+ (duration) & 0xFF,
+ 0x55, 0xC4,
+ 0x00, 0x00 // pre_defined = 0
+ ]));
+ };
+ // Media handler reference box
+ MP4.hdlr = function (meta) {
+ var data = null;
+ if (meta.type === 'audio') {
+ data = MP4.constants.HDLR_AUDIO;
+ }
+ else {
+ data = MP4.constants.HDLR_VIDEO;
+ }
+ return MP4.box(MP4.types.hdlr, data);
+ };
+ // Media infomation box
+ MP4.minf = function (meta) {
+ var xmhd = null;
+ if (meta.type === 'audio') {
+ xmhd = MP4.box(MP4.types.smhd, MP4.constants.SMHD);
+ }
+ else {
+ xmhd = MP4.box(MP4.types.vmhd, MP4.constants.VMHD);
+ }
+ return MP4.box(MP4.types.minf, xmhd, MP4.dinf(), MP4.stbl(meta));
+ };
+ // Data infomation box
+ MP4.dinf = function () {
+ var result = MP4.box(MP4.types.dinf, MP4.box(MP4.types.dref, MP4.constants.DREF));
+ return result;
+ };
+ // Sample table box
+ MP4.stbl = function (meta) {
+ var result = MP4.box(MP4.types.stbl, // type: stbl
+ MP4.stsd(meta), // Sample Description Table
+ MP4.box(MP4.types.stts, MP4.constants.STTS), // Time-To-Sample
+ MP4.box(MP4.types.stsc, MP4.constants.STSC), // Sample-To-Chunk
+ MP4.box(MP4.types.stsz, MP4.constants.STSZ), // Sample size
+ MP4.box(MP4.types.stco, MP4.constants.STCO) // Chunk offset
+ );
+ return result;
+ };
+ // Sample description box
+ MP4.stsd = function (meta) {
+ if (meta.type === 'audio') {
+ if (meta.codec === 'mp3') {
+ return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp3(meta));
+ }
+ // else: aac -> mp4a
+ return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp4a(meta));
+ }
+ else {
+ return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.avc1(meta));
+ }
+ };
+ MP4.mp3 = function (meta) {
+ var channelCount = meta.channelCount;
+ var sampleRate = meta.audioSampleRate;
+ var data = new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, channelCount,
+ 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ (sampleRate >>> 8) & 0xFF,
+ (sampleRate) & 0xFF,
+ 0x00, 0x00
+ ]);
+ return MP4.box(MP4.types['.mp3'], data);
+ };
+ MP4.mp4a = function (meta) {
+ var channelCount = meta.channelCount;
+ var sampleRate = meta.audioSampleRate;
+ var data = new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, channelCount,
+ 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ (sampleRate >>> 8) & 0xFF,
+ (sampleRate) & 0xFF,
+ 0x00, 0x00
+ ]);
+ return MP4.box(MP4.types.mp4a, data, MP4.esds(meta));
+ };
+ MP4.esds = function (meta) {
+ var config = meta.config || [];
+ var configSize = config.length;
+ var data = new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ 0x03,
+ 0x17 + configSize,
+ 0x00, 0x01,
+ 0x00,
+ 0x04,
+ 0x0F + configSize,
+ 0x40,
+ 0x15,
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x05 // descriptor_type
+ ].concat([
+ configSize
+ ]).concat(config).concat([
+ 0x06, 0x01, 0x02 // GASpecificConfig
+ ]));
+ return MP4.box(MP4.types.esds, data);
+ };
+ MP4.avc1 = function (meta) {
+ var avcc = meta.avcc;
+ var width = meta.codecWidth, height = meta.codecHeight;
+ var data = new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ (width >>> 8) & 0xFF,
+ (width) & 0xFF,
+ (height >>> 8) & 0xFF,
+ (height) & 0xFF,
+ 0x00, 0x48, 0x00, 0x00,
+ 0x00, 0x48, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01,
+ 0x0A,
+ 0x78, 0x71, 0x71, 0x2F,
+ 0x66, 0x6C, 0x76, 0x2E,
+ 0x6A, 0x73, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00,
+ 0x00, 0x18,
+ 0xFF, 0xFF // pre_defined = -1
+ ]);
+ if (meta.codec.indexOf('avc1') >= 0) {
+ return MP4.box(MP4.types.avc1, data, MP4.box(MP4.types.avcC, avcc));
+ }
+ else {
+ return MP4.box(MP4.types.hvc1, data, MP4.box(MP4.types.hvcC, avcc));
+ }
+ };
+ // Movie Extends box
+ MP4.mvex = function (meta) {
+ return MP4.box(MP4.types.mvex, MP4.trex(meta));
+ };
+ // Track Extends box
+ MP4.trex = function (meta) {
+ var trackId = meta.id;
+ var data = new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ (trackId >>> 24) & 0xFF,
+ (trackId >>> 16) & 0xFF,
+ (trackId >>> 8) & 0xFF,
+ (trackId) & 0xFF,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x01 // default_sample_flags
+ ]);
+ return MP4.box(MP4.types.trex, data);
+ };
+ // Movie fragment box
+ MP4.moof = function (track, baseMediaDecodeTime) {
+ return MP4.box(MP4.types.moof, MP4.mfhd(track.sequenceNumber), MP4.traf(track, baseMediaDecodeTime));
+ };
+ MP4.mfhd = function (sequenceNumber) {
+ var data = new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ (sequenceNumber >>> 24) & 0xFF,
+ (sequenceNumber >>> 16) & 0xFF,
+ (sequenceNumber >>> 8) & 0xFF,
+ (sequenceNumber) & 0xFF
+ ]);
+ return MP4.box(MP4.types.mfhd, data);
+ };
+ // Track fragment box
+ MP4.traf = function (track, baseMediaDecodeTime) {
+ var trackId = track.id;
+ // Track fragment header box
+ var tfhd = MP4.box(MP4.types.tfhd, new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ (trackId >>> 24) & 0xFF,
+ (trackId >>> 16) & 0xFF,
+ (trackId >>> 8) & 0xFF,
+ (trackId) & 0xFF
+ ]));
+ // Track Fragment Decode Time
+ var tfdt = MP4.box(MP4.types.tfdt, new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00,
+ (baseMediaDecodeTime >>> 24) & 0xFF,
+ (baseMediaDecodeTime >>> 16) & 0xFF,
+ (baseMediaDecodeTime >>> 8) & 0xFF,
+ (baseMediaDecodeTime) & 0xFF
+ ]));
+ var sdtp = MP4.sdtp(track);
+ var trun = MP4.trun(track, sdtp.byteLength + 16 + 16 + 8 + 16 + 8 + 8);
+ return MP4.box(MP4.types.traf, tfhd, tfdt, trun, sdtp);
+ };
+ // Sample Dependency Type box
+ MP4.sdtp = function (track) {
+ var samples = track.samples || [];
+ var sampleCount = samples.length;
+ var data = new Uint8Array(4 + sampleCount);
+ // 0~4 bytes: version(0) & flags
+ for (var i = 0; i < sampleCount; i++) {
+ var flags = samples[i].flags;
+ data[i + 4] = (flags.isLeading << 6) // is_leading: 2 (bit)
+ | (flags.dependsOn << 4) // sample_depends_on
+ | (flags.isDependedOn << 2) // sample_is_depended_on
+ | (flags.hasRedundancy); // sample_has_redundancy
+ }
+ return MP4.box(MP4.types.sdtp, data);
+ };
+ // Track fragment run box
+ MP4.trun = function (track, offset) {
+ var samples = track.samples || [];
+ var sampleCount = samples.length;
+ var dataSize = 12 + 16 * sampleCount;
+ var data = new Uint8Array(dataSize);
+ offset += 8 + dataSize;
+ data.set([
+ 0x00, 0x00, 0x0F, 0x01,
+ (sampleCount >>> 24) & 0xFF,
+ (sampleCount >>> 16) & 0xFF,
+ (sampleCount >>> 8) & 0xFF,
+ (sampleCount) & 0xFF,
+ (offset >>> 24) & 0xFF,
+ (offset >>> 16) & 0xFF,
+ (offset >>> 8) & 0xFF,
+ (offset) & 0xFF
+ ], 0);
+ for (var i = 0; i < sampleCount; i++) {
+ var duration = samples[i].duration;
+ var size = samples[i].size;
+ var flags = samples[i].flags;
+ var cts = samples[i].cts;
+ data.set([
+ (duration >>> 24) & 0xFF,
+ (duration >>> 16) & 0xFF,
+ (duration >>> 8) & 0xFF,
+ (duration) & 0xFF,
+ (size >>> 24) & 0xFF,
+ (size >>> 16) & 0xFF,
+ (size >>> 8) & 0xFF,
+ (size) & 0xFF,
+ (flags.isLeading << 2) | flags.dependsOn,
+ (flags.isDependedOn << 6) | (flags.hasRedundancy << 4) | flags.isNonSync,
+ 0x00, 0x00,
+ (cts >>> 24) & 0xFF,
+ (cts >>> 16) & 0xFF,
+ (cts >>> 8) & 0xFF,
+ (cts) & 0xFF
+ ], 12 + 16 * i);
+ }
+ return MP4.box(MP4.types.trun, data);
+ };
+ MP4.mdat = function (data) {
+ return MP4.box(MP4.types.mdat, data);
+ };
+ return MP4;
+}());
+MP4.init();
+/* harmony default export */ __webpack_exports__["default"] = (MP4);
+
+
+/***/ }),
+
+/***/ "./src/remux/mp4-remuxer.js":
+/*!**********************************!*\
+ !*** ./src/remux/mp4-remuxer.js ***!
+ \**********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/logger.js */ "./src/utils/logger.js");
+/* harmony import */ var _mp4_generator_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mp4-generator.js */ "./src/remux/mp4-generator.js");
+/* harmony import */ var _aac_silent_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./aac-silent.js */ "./src/remux/aac-silent.js");
+/* harmony import */ var _utils_browser_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/browser.js */ "./src/utils/browser.js");
+/* harmony import */ var _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../core/media-segment-info.js */ "./src/core/media-segment-info.js");
+/* harmony import */ var _utils_exception_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/exception.js */ "./src/utils/exception.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+// Fragmented mp4 remuxer
+var MP4Remuxer = /** @class */ (function () {
+ function MP4Remuxer(config) {
+ this.TAG = 'MP4Remuxer';
+ this._config = config;
+ this._isLive = (config.isLive === true) ? true : false;
+ this._dtsBase = -1;
+ this._dtsBaseInited = false;
+ this._audioDtsBase = Infinity;
+ this._videoDtsBase = Infinity;
+ this._audioNextDts = undefined;
+ this._videoNextDts = undefined;
+ this._audioStashedLastSample = null;
+ this._videoStashedLastSample = null;
+ this._audioMeta = null;
+ this._videoMeta = null;
+ this._audioSegmentInfoList = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.MediaSegmentInfoList('audio');
+ this._videoSegmentInfoList = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.MediaSegmentInfoList('video');
+ this._onInitSegment = null;
+ this._onMediaSegment = null;
+ // Workaround for chrome < 50: Always force first sample as a Random Access Point in media segment
+ // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412
+ this._forceFirstIDR = (_utils_browser_js__WEBPACK_IMPORTED_MODULE_3__.default.chrome &&
+ (_utils_browser_js__WEBPACK_IMPORTED_MODULE_3__.default.version.major < 50 ||
+ (_utils_browser_js__WEBPACK_IMPORTED_MODULE_3__.default.version.major === 50 && _utils_browser_js__WEBPACK_IMPORTED_MODULE_3__.default.version.build < 2661))) ? true : false;
+ // Workaround for IE11/Edge: Fill silent aac frame after keyframe-seeking
+ // Make audio beginDts equals with video beginDts, in order to fix seek freeze
+ this._fillSilentAfterSeek = (_utils_browser_js__WEBPACK_IMPORTED_MODULE_3__.default.msedge || _utils_browser_js__WEBPACK_IMPORTED_MODULE_3__.default.msie);
+ // While only FireFox supports 'audio/mp4, codecs="mp3"', use 'audio/mpeg' for chrome, safari, ...
+ this._mp3UseMpegAudio = !_utils_browser_js__WEBPACK_IMPORTED_MODULE_3__.default.firefox;
+ this._fillAudioTimestampGap = this._config.fixAudioTimestampGap;
+ }
+ MP4Remuxer.prototype.destroy = function () {
+ this._dtsBase = -1;
+ this._dtsBaseInited = false;
+ this._audioMeta = null;
+ this._videoMeta = null;
+ this._audioSegmentInfoList.clear();
+ this._audioSegmentInfoList = null;
+ this._videoSegmentInfoList.clear();
+ this._videoSegmentInfoList = null;
+ this._onInitSegment = null;
+ this._onMediaSegment = null;
+ };
+ MP4Remuxer.prototype.bindDataSource = function (producer) {
+ producer.onDataAvailable = this.remux.bind(this);
+ producer.onTrackMetadata = this._onTrackMetadataReceived.bind(this);
+ return this;
+ };
+ Object.defineProperty(MP4Remuxer.prototype, "onInitSegment", {
+ /* prototype: function onInitSegment(type: string, initSegment: ArrayBuffer): void
+ InitSegment: {
+ type: string,
+ data: ArrayBuffer,
+ codec: string,
+ container: string
+ }
+ */
+ get: function () {
+ return this._onInitSegment;
+ },
+ set: function (callback) {
+ this._onInitSegment = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(MP4Remuxer.prototype, "onMediaSegment", {
+ /* prototype: function onMediaSegment(type: string, mediaSegment: MediaSegment): void
+ MediaSegment: {
+ type: string,
+ data: ArrayBuffer,
+ sampleCount: int32
+ info: MediaSegmentInfo
+ }
+ */
+ get: function () {
+ return this._onMediaSegment;
+ },
+ set: function (callback) {
+ this._onMediaSegment = callback;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ MP4Remuxer.prototype.insertDiscontinuity = function () {
+ this._audioNextDts = this._videoNextDts = undefined;
+ };
+ MP4Remuxer.prototype.seek = function (originalDts) {
+ this._audioStashedLastSample = null;
+ this._videoStashedLastSample = null;
+ this._videoSegmentInfoList.clear();
+ this._audioSegmentInfoList.clear();
+ };
+ MP4Remuxer.prototype.remux = function (audioTrack, videoTrack) {
+ if (!this._onMediaSegment) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_5__.IllegalStateException('MP4Remuxer: onMediaSegment callback must be specificed!');
+ }
+ if (!this._dtsBaseInited) {
+ this._calculateDtsBase(audioTrack, videoTrack);
+ }
+ this._remuxVideo(videoTrack);
+ this._remuxAudio(audioTrack);
+ };
+ MP4Remuxer.prototype._onTrackMetadataReceived = function (type, metadata) {
+ var metabox = null;
+ var container = 'mp4';
+ var codec = metadata.codec;
+ if (type === 'audio') {
+ this._audioMeta = metadata;
+ if (metadata.codec === 'mp3' && this._mp3UseMpegAudio) {
+ // 'audio/mpeg' for MP3 audio track
+ container = 'mpeg';
+ codec = '';
+ metabox = new Uint8Array();
+ }
+ else {
+ // 'audio/mp4, codecs="codec"'
+ metabox = _mp4_generator_js__WEBPACK_IMPORTED_MODULE_1__.default.generateInitSegment(metadata);
+ }
+ }
+ else if (type === 'video') {
+ this._videoMeta = metadata;
+ metabox = _mp4_generator_js__WEBPACK_IMPORTED_MODULE_1__.default.generateInitSegment(metadata);
+ }
+ else {
+ return;
+ }
+ // dispatch metabox (Initialization Segment)
+ if (!this._onInitSegment) {
+ throw new _utils_exception_js__WEBPACK_IMPORTED_MODULE_5__.IllegalStateException('MP4Remuxer: onInitSegment callback must be specified!');
+ }
+ this._onInitSegment(type, {
+ type: type,
+ data: metabox.buffer,
+ codec: codec,
+ container: type + "/" + container,
+ mediaDuration: metadata.duration // in timescale 1000 (milliseconds)
+ });
+ };
+ MP4Remuxer.prototype._calculateDtsBase = function (audioTrack, videoTrack) {
+ if (this._dtsBaseInited) {
+ return;
+ }
+ if (audioTrack.samples && audioTrack.samples.length) {
+ this._audioDtsBase = audioTrack.samples[0].dts;
+ }
+ if (videoTrack.samples && videoTrack.samples.length) {
+ this._videoDtsBase = videoTrack.samples[0].dts;
+ }
+ this._dtsBase = Math.min(this._audioDtsBase, this._videoDtsBase);
+ this._dtsBaseInited = true;
+ };
+ MP4Remuxer.prototype.flushStashedSamples = function () {
+ var videoSample = this._videoStashedLastSample;
+ var audioSample = this._audioStashedLastSample;
+ var videoTrack = {
+ type: 'video',
+ id: 1,
+ sequenceNumber: 0,
+ samples: [],
+ length: 0
+ };
+ if (videoSample != null) {
+ videoTrack.samples.push(videoSample);
+ videoTrack.length = videoSample.length;
+ }
+ var audioTrack = {
+ type: 'audio',
+ id: 2,
+ sequenceNumber: 0,
+ samples: [],
+ length: 0
+ };
+ if (audioSample != null) {
+ audioTrack.samples.push(audioSample);
+ audioTrack.length = audioSample.length;
+ }
+ this._videoStashedLastSample = null;
+ this._audioStashedLastSample = null;
+ this._remuxVideo(videoTrack, true);
+ this._remuxAudio(audioTrack, true);
+ };
+ MP4Remuxer.prototype._remuxAudio = function (audioTrack, force) {
+ if (this._audioMeta == null) {
+ return;
+ }
+ var track = audioTrack;
+ var samples = track.samples;
+ var dtsCorrection = undefined;
+ var firstDts = -1, lastDts = -1, lastPts = -1;
+ var refSampleDuration = this._audioMeta.refSampleDuration;
+ var mpegRawTrack = this._audioMeta.codec === 'mp3' && this._mp3UseMpegAudio;
+ var firstSegmentAfterSeek = this._dtsBaseInited && this._audioNextDts === undefined;
+ var insertPrefixSilentFrame = false;
+ if (!samples || samples.length === 0) {
+ return;
+ }
+ if (samples.length === 1 && !force) {
+ // If [sample count in current batch] === 1 && (force != true)
+ // Ignore and keep in demuxer's queue
+ return;
+ } // else if (force === true) do remux
+ var offset = 0;
+ var mdatbox = null;
+ var mdatBytes = 0;
+ // calculate initial mdat size
+ if (mpegRawTrack) {
+ // for raw mpeg buffer
+ offset = 0;
+ mdatBytes = track.length;
+ }
+ else {
+ // for fmp4 mdat box
+ offset = 8; // size + type
+ mdatBytes = 8 + track.length;
+ }
+ var lastSample = null;
+ // Pop the lastSample and waiting for stash
+ if (samples.length > 1) {
+ lastSample = samples.pop();
+ mdatBytes -= lastSample.length;
+ }
+ // Insert [stashed lastSample in the previous batch] to the front
+ if (this._audioStashedLastSample != null) {
+ var sample = this._audioStashedLastSample;
+ this._audioStashedLastSample = null;
+ samples.unshift(sample);
+ mdatBytes += sample.length;
+ }
+ // Stash the lastSample of current batch, waiting for next batch
+ if (lastSample != null) {
+ this._audioStashedLastSample = lastSample;
+ }
+ var firstSampleOriginalDts = samples[0].dts - this._dtsBase;
+ // calculate dtsCorrection
+ if (this._audioNextDts) {
+ dtsCorrection = firstSampleOriginalDts - this._audioNextDts;
+ }
+ else { // this._audioNextDts == undefined
+ if (this._audioSegmentInfoList.isEmpty()) {
+ dtsCorrection = 0;
+ if (this._fillSilentAfterSeek && !this._videoSegmentInfoList.isEmpty()) {
+ if (this._audioMeta.originalCodec !== 'mp3') {
+ insertPrefixSilentFrame = true;
+ }
+ }
+ }
+ else {
+ var lastSample_1 = this._audioSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts);
+ if (lastSample_1 != null) {
+ var distance = (firstSampleOriginalDts - (lastSample_1.originalDts + lastSample_1.duration));
+ if (distance <= 3) {
+ distance = 0;
+ }
+ var expectedDts = lastSample_1.dts + lastSample_1.duration + distance;
+ dtsCorrection = firstSampleOriginalDts - expectedDts;
+ }
+ else { // lastSample == null, cannot found
+ dtsCorrection = 0;
+ }
+ }
+ }
+ if (insertPrefixSilentFrame) {
+ // align audio segment beginDts to match with current video segment's beginDts
+ var firstSampleDts = firstSampleOriginalDts - dtsCorrection;
+ var videoSegment = this._videoSegmentInfoList.getLastSegmentBefore(firstSampleOriginalDts);
+ if (videoSegment != null && videoSegment.beginDts < firstSampleDts) {
+ var silentUnit = _aac_silent_js__WEBPACK_IMPORTED_MODULE_2__.default.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount);
+ if (silentUnit) {
+ var dts = videoSegment.beginDts;
+ var silentFrameDuration = firstSampleDts - videoSegment.beginDts;
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.v(this.TAG, "InsertPrefixSilentAudio: dts: " + dts + ", duration: " + silentFrameDuration);
+ samples.unshift({ unit: silentUnit, dts: dts, pts: dts });
+ mdatBytes += silentUnit.byteLength;
+ } // silentUnit == null: Cannot generate, skip
+ }
+ else {
+ insertPrefixSilentFrame = false;
+ }
+ }
+ var mp4Samples = [];
+ // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples
+ for (var i = 0; i < samples.length; i++) {
+ var sample = samples[i];
+ var unit = sample.unit;
+ var originalDts = sample.dts - this._dtsBase;
+ var dts = originalDts;
+ var needFillSilentFrames = false;
+ var silentFrames = null;
+ var sampleDuration = 0;
+ if (originalDts < -0.001) {
+ continue; //pass the first sample with the invalid dts
+ }
+ if (this._audioMeta.codec !== 'mp3') {
+ // for AAC codec, we need to keep dts increase based on refSampleDuration
+ var curRefDts = originalDts;
+ var maxAudioFramesDrift = 3;
+ if (this._audioNextDts) {
+ curRefDts = this._audioNextDts;
+ }
+ dtsCorrection = originalDts - curRefDts;
+ if (dtsCorrection <= -maxAudioFramesDrift * refSampleDuration) {
+ // If we're overlapping by more than maxAudioFramesDrift number of frame, drop this sample
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, "Dropping 1 audio frame (originalDts: " + originalDts + " ms ,curRefDts: " + curRefDts + " ms) due to dtsCorrection: " + dtsCorrection + " ms overlap.");
+ continue;
+ }
+ else if (dtsCorrection >= maxAudioFramesDrift * refSampleDuration && this._fillAudioTimestampGap && !_utils_browser_js__WEBPACK_IMPORTED_MODULE_3__.default.safari) {
+ // Silent frame generation, if large timestamp gap detected && config.fixAudioTimestampGap
+ needFillSilentFrames = true;
+ // We need to insert silent frames to fill timestamp gap
+ var frameCount = Math.floor(dtsCorrection / refSampleDuration);
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Large audio timestamp gap detected, may cause AV sync to drift. ' +
+ 'Silent frames will be generated to avoid unsync.\n' +
+ ("originalDts: " + originalDts + " ms, curRefDts: " + curRefDts + " ms, ") +
+ ("dtsCorrection: " + Math.round(dtsCorrection) + " ms, generate: " + frameCount + " frames"));
+ dts = Math.floor(curRefDts);
+ sampleDuration = Math.floor(curRefDts + refSampleDuration) - dts;
+ var silentUnit = _aac_silent_js__WEBPACK_IMPORTED_MODULE_2__.default.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount);
+ if (silentUnit == null) {
+ _utils_logger_js__WEBPACK_IMPORTED_MODULE_0__.default.w(this.TAG, 'Unable to generate silent frame for ' +
+ (this._audioMeta.originalCodec + " with " + this._audioMeta.channelCount + " channels, repeat last frame"));
+ // Repeat last frame
+ silentUnit = unit;
+ }
+ silentFrames = [];
+ for (var j = 0; j < frameCount; j++) {
+ curRefDts = curRefDts + refSampleDuration;
+ var intDts = Math.floor(curRefDts); // change to integer
+ var intDuration = Math.floor(curRefDts + refSampleDuration) - intDts;
+ var frame = {
+ dts: intDts,
+ pts: intDts,
+ cts: 0,
+ unit: silentUnit,
+ size: silentUnit.byteLength,
+ duration: intDuration,
+ originalDts: originalDts,
+ flags: {
+ isLeading: 0,
+ dependsOn: 1,
+ isDependedOn: 0,
+ hasRedundancy: 0
+ }
+ };
+ silentFrames.push(frame);
+ mdatBytes += frame.size;
+ ;
+ }
+ this._audioNextDts = curRefDts + refSampleDuration;
+ }
+ else {
+ dts = Math.floor(curRefDts);
+ sampleDuration = Math.floor(curRefDts + refSampleDuration) - dts;
+ this._audioNextDts = curRefDts + refSampleDuration;
+ }
+ }
+ else {
+ // keep the original dts calculate algorithm for mp3
+ dts = originalDts - dtsCorrection;
+ if (i !== samples.length - 1) {
+ var nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection;
+ sampleDuration = nextDts - dts;
+ }
+ else { // the last sample
+ if (lastSample != null) { // use stashed sample's dts to calculate sample duration
+ var nextDts = lastSample.dts - this._dtsBase - dtsCorrection;
+ sampleDuration = nextDts - dts;
+ }
+ else if (mp4Samples.length >= 1) { // use second last sample duration
+ sampleDuration = mp4Samples[mp4Samples.length - 1].duration;
+ }
+ else { // the only one sample, use reference sample duration
+ sampleDuration = Math.floor(refSampleDuration);
+ }
+ }
+ this._audioNextDts = dts + sampleDuration;
+ }
+ if (firstDts === -1) {
+ firstDts = dts;
+ }
+ mp4Samples.push({
+ dts: dts,
+ pts: dts,
+ cts: 0,
+ unit: sample.unit,
+ size: sample.unit.byteLength,
+ duration: sampleDuration,
+ originalDts: originalDts,
+ flags: {
+ isLeading: 0,
+ dependsOn: 1,
+ isDependedOn: 0,
+ hasRedundancy: 0
+ }
+ });
+ if (needFillSilentFrames) {
+ // Silent frames should be inserted after wrong-duration frame
+ mp4Samples.push.apply(mp4Samples, silentFrames);
+ }
+ }
+ if (mp4Samples.length === 0) {
+ //no samples need to remux
+ track.samples = [];
+ track.length = 0;
+ return;
+ }
+ // allocate mdatbox
+ if (mpegRawTrack) {
+ // allocate for raw mpeg buffer
+ mdatbox = new Uint8Array(mdatBytes);
+ }
+ else {
+ // allocate for fmp4 mdat box
+ mdatbox = new Uint8Array(mdatBytes);
+ // size field
+ mdatbox[0] = (mdatBytes >>> 24) & 0xFF;
+ mdatbox[1] = (mdatBytes >>> 16) & 0xFF;
+ mdatbox[2] = (mdatBytes >>> 8) & 0xFF;
+ mdatbox[3] = (mdatBytes) & 0xFF;
+ // type field (fourCC)
+ mdatbox.set(_mp4_generator_js__WEBPACK_IMPORTED_MODULE_1__.default.types.mdat, 4);
+ }
+ // Write samples into mdatbox
+ for (var i = 0; i < mp4Samples.length; i++) {
+ var unit = mp4Samples[i].unit;
+ mdatbox.set(unit, offset);
+ offset += unit.byteLength;
+ }
+ var latest = mp4Samples[mp4Samples.length - 1];
+ lastDts = latest.dts + latest.duration;
+ //this._audioNextDts = lastDts;
+ // fill media segment info & add to info list
+ var info = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.MediaSegmentInfo();
+ info.beginDts = firstDts;
+ info.endDts = lastDts;
+ info.beginPts = firstDts;
+ info.endPts = lastDts;
+ info.originalBeginDts = mp4Samples[0].originalDts;
+ info.originalEndDts = latest.originalDts + latest.duration;
+ info.firstSample = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.SampleInfo(mp4Samples[0].dts, mp4Samples[0].pts, mp4Samples[0].duration, mp4Samples[0].originalDts, false);
+ info.lastSample = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.SampleInfo(latest.dts, latest.pts, latest.duration, latest.originalDts, false);
+ if (!this._isLive) {
+ this._audioSegmentInfoList.append(info);
+ }
+ track.samples = mp4Samples;
+ track.sequenceNumber++;
+ var moofbox = null;
+ if (mpegRawTrack) {
+ // Generate empty buffer, because useless for raw mpeg
+ moofbox = new Uint8Array();
+ }
+ else {
+ // Generate moof for fmp4 segment
+ moofbox = _mp4_generator_js__WEBPACK_IMPORTED_MODULE_1__.default.moof(track, firstDts);
+ }
+ track.samples = [];
+ track.length = 0;
+ var segment = {
+ type: 'audio',
+ data: this._mergeBoxes(moofbox, mdatbox).buffer,
+ sampleCount: mp4Samples.length,
+ info: info
+ };
+ if (mpegRawTrack && firstSegmentAfterSeek) {
+ // For MPEG audio stream in MSE, if seeking occurred, before appending new buffer
+ // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer.
+ segment.timestampOffset = firstDts;
+ }
+ this._onMediaSegment('audio', segment);
+ };
+ MP4Remuxer.prototype._remuxVideo = function (videoTrack, force) {
+ if (this._videoMeta == null) {
+ return;
+ }
+ var track = videoTrack;
+ var samples = track.samples;
+ var dtsCorrection = undefined;
+ var firstDts = -1, lastDts = -1;
+ var firstPts = -1, lastPts = -1;
+ if (!samples || samples.length === 0) {
+ return;
+ }
+ if (samples.length === 1 && !force) {
+ // If [sample count in current batch] === 1 && (force != true)
+ // Ignore and keep in demuxer's queue
+ return;
+ } // else if (force === true) do remux
+ var offset = 8;
+ var mdatbox = null;
+ var mdatBytes = 8 + videoTrack.length;
+ var lastSample = null;
+ // Pop the lastSample and waiting for stash
+ if (samples.length > 1) {
+ lastSample = samples.pop();
+ mdatBytes -= lastSample.length;
+ }
+ // Insert [stashed lastSample in the previous batch] to the front
+ if (this._videoStashedLastSample != null) {
+ var sample = this._videoStashedLastSample;
+ this._videoStashedLastSample = null;
+ samples.unshift(sample);
+ mdatBytes += sample.length;
+ }
+ // Stash the lastSample of current batch, waiting for next batch
+ if (lastSample != null) {
+ this._videoStashedLastSample = lastSample;
+ }
+ var firstSampleOriginalDts = samples[0].dts - this._dtsBase;
+ // calculate dtsCorrection
+ if (this._videoNextDts) {
+ dtsCorrection = firstSampleOriginalDts - this._videoNextDts;
+ }
+ else { // this._videoNextDts == undefined
+ if (this._videoSegmentInfoList.isEmpty()) {
+ dtsCorrection = 0;
+ }
+ else {
+ var lastSample_2 = this._videoSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts);
+ if (lastSample_2 != null) {
+ var distance = (firstSampleOriginalDts - (lastSample_2.originalDts + lastSample_2.duration));
+ if (distance <= 3) {
+ distance = 0;
+ }
+ var expectedDts = lastSample_2.dts + lastSample_2.duration + distance;
+ dtsCorrection = firstSampleOriginalDts - expectedDts;
+ }
+ else { // lastSample == null, cannot found
+ dtsCorrection = 0;
+ }
+ }
+ }
+ var info = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.MediaSegmentInfo();
+ var mp4Samples = [];
+ // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples
+ for (var i = 0; i < samples.length; i++) {
+ var sample = samples[i];
+ var originalDts = sample.dts - this._dtsBase;
+ var isKeyframe = sample.isKeyframe;
+ var dts = originalDts - dtsCorrection;
+ var cts = sample.cts;
+ var pts = dts + cts;
+ if (firstDts === -1) {
+ firstDts = dts;
+ firstPts = pts;
+ }
+ var sampleDuration = 0;
+ if (i !== samples.length - 1) {
+ var nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection;
+ sampleDuration = nextDts - dts;
+ }
+ else { // the last sample
+ if (lastSample != null) { // use stashed sample's dts to calculate sample duration
+ var nextDts = lastSample.dts - this._dtsBase - dtsCorrection;
+ sampleDuration = nextDts - dts;
+ }
+ else if (mp4Samples.length >= 1) { // use second last sample duration
+ sampleDuration = mp4Samples[mp4Samples.length - 1].duration;
+ }
+ else { // the only one sample, use reference sample duration
+ sampleDuration = Math.floor(this._videoMeta.refSampleDuration);
+ }
+ }
+ if (isKeyframe) {
+ var syncPoint = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.SampleInfo(dts, pts, sampleDuration, sample.dts, true);
+ syncPoint.fileposition = sample.fileposition;
+ info.appendSyncPoint(syncPoint);
+ }
+ mp4Samples.push({
+ dts: dts,
+ pts: pts,
+ cts: cts,
+ units: sample.units,
+ size: sample.length,
+ isKeyframe: isKeyframe,
+ duration: sampleDuration,
+ originalDts: originalDts,
+ flags: {
+ isLeading: 0,
+ dependsOn: isKeyframe ? 2 : 1,
+ isDependedOn: isKeyframe ? 1 : 0,
+ hasRedundancy: 0,
+ isNonSync: isKeyframe ? 0 : 1
+ }
+ });
+ }
+ // allocate mdatbox
+ mdatbox = new Uint8Array(mdatBytes);
+ mdatbox[0] = (mdatBytes >>> 24) & 0xFF;
+ mdatbox[1] = (mdatBytes >>> 16) & 0xFF;
+ mdatbox[2] = (mdatBytes >>> 8) & 0xFF;
+ mdatbox[3] = (mdatBytes) & 0xFF;
+ mdatbox.set(_mp4_generator_js__WEBPACK_IMPORTED_MODULE_1__.default.types.mdat, 4);
+ // Write samples into mdatbox
+ for (var i = 0; i < mp4Samples.length; i++) {
+ var units = mp4Samples[i].units;
+ while (units.length) {
+ var unit = units.shift();
+ var data = unit.data;
+ mdatbox.set(data, offset);
+ offset += data.byteLength;
+ }
+ }
+ var latest = mp4Samples[mp4Samples.length - 1];
+ lastDts = latest.dts + latest.duration;
+ lastPts = latest.pts + latest.duration;
+ this._videoNextDts = lastDts;
+ // fill media segment info & add to info list
+ info.beginDts = firstDts;
+ info.endDts = lastDts;
+ info.beginPts = firstPts;
+ info.endPts = lastPts;
+ info.originalBeginDts = mp4Samples[0].originalDts;
+ info.originalEndDts = latest.originalDts + latest.duration;
+ info.firstSample = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.SampleInfo(mp4Samples[0].dts, mp4Samples[0].pts, mp4Samples[0].duration, mp4Samples[0].originalDts, mp4Samples[0].isKeyframe);
+ info.lastSample = new _core_media_segment_info_js__WEBPACK_IMPORTED_MODULE_4__.SampleInfo(latest.dts, latest.pts, latest.duration, latest.originalDts, latest.isKeyframe);
+ if (!this._isLive) {
+ this._videoSegmentInfoList.append(info);
+ }
+ track.samples = mp4Samples;
+ track.sequenceNumber++;
+ // workaround for chrome < 50: force first sample as a random access point
+ // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412
+ if (this._forceFirstIDR) {
+ var flags = mp4Samples[0].flags;
+ flags.dependsOn = 2;
+ flags.isNonSync = 0;
+ }
+ var moofbox = _mp4_generator_js__WEBPACK_IMPORTED_MODULE_1__.default.moof(track, firstDts);
+ track.samples = [];
+ track.length = 0;
+ this._onMediaSegment('video', {
+ type: 'video',
+ data: this._mergeBoxes(moofbox, mdatbox).buffer,
+ sampleCount: mp4Samples.length,
+ info: info
+ });
+ };
+ MP4Remuxer.prototype._mergeBoxes = function (moof, mdat) {
+ var result = new Uint8Array(moof.byteLength + mdat.byteLength);
+ result.set(moof, 0);
+ result.set(mdat, moof.byteLength);
+ return result;
+ };
+ return MP4Remuxer;
+}());
+/* harmony default export */ __webpack_exports__["default"] = (MP4Remuxer);
+
+
+/***/ }),
+
+/***/ "./src/utils/browser.js":
+/*!******************************!*\
+ !*** ./src/utils/browser.js ***!
+ \******************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var Browser = {};
+function detect() {
+ // modified from jquery-browser-plugin
+ var ua = self.navigator.userAgent.toLowerCase();
+ var match = /(edge)\/([\w.]+)/.exec(ua) ||
+ /(opr)[\/]([\w.]+)/.exec(ua) ||
+ /(chrome)[ \/]([\w.]+)/.exec(ua) ||
+ /(iemobile)[\/]([\w.]+)/.exec(ua) ||
+ /(version)(applewebkit)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(ua) ||
+ /(webkit)[ \/]([\w.]+).*(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(ua) ||
+ /(webkit)[ \/]([\w.]+)/.exec(ua) ||
+ /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
+ /(msie) ([\w.]+)/.exec(ua) ||
+ ua.indexOf('trident') >= 0 && /(rv)(?::| )([\w.]+)/.exec(ua) ||
+ ua.indexOf('compatible') < 0 && /(firefox)[ \/]([\w.]+)/.exec(ua) ||
+ [];
+ var platform_match = /(ipad)/.exec(ua) ||
+ /(ipod)/.exec(ua) ||
+ /(windows phone)/.exec(ua) ||
+ /(iphone)/.exec(ua) ||
+ /(kindle)/.exec(ua) ||
+ /(android)/.exec(ua) ||
+ /(windows)/.exec(ua) ||
+ /(mac)/.exec(ua) ||
+ /(linux)/.exec(ua) ||
+ /(cros)/.exec(ua) ||
+ [];
+ var matched = {
+ browser: match[5] || match[3] || match[1] || '',
+ version: match[2] || match[4] || '0',
+ majorVersion: match[4] || match[2] || '0',
+ platform: platform_match[0] || ''
+ };
+ var browser = {};
+ if (matched.browser) {
+ browser[matched.browser] = true;
+ var versionArray = matched.majorVersion.split('.');
+ browser.version = {
+ major: parseInt(matched.majorVersion, 10),
+ string: matched.version
+ };
+ if (versionArray.length > 1) {
+ browser.version.minor = parseInt(versionArray[1], 10);
+ }
+ if (versionArray.length > 2) {
+ browser.version.build = parseInt(versionArray[2], 10);
+ }
+ }
+ if (matched.platform) {
+ browser[matched.platform] = true;
+ }
+ if (browser.chrome || browser.opr || browser.safari) {
+ browser.webkit = true;
+ }
+ // MSIE. IE11 has 'rv' identifer
+ if (browser.rv || browser.iemobile) {
+ if (browser.rv) {
+ delete browser.rv;
+ }
+ var msie = 'msie';
+ matched.browser = msie;
+ browser[msie] = true;
+ }
+ // Microsoft Edge
+ if (browser.edge) {
+ delete browser.edge;
+ var msedge = 'msedge';
+ matched.browser = msedge;
+ browser[msedge] = true;
+ }
+ // Opera 15+
+ if (browser.opr) {
+ var opera = 'opera';
+ matched.browser = opera;
+ browser[opera] = true;
+ }
+ // Stock android browsers are marked as Safari
+ if (browser.safari && browser.android) {
+ var android = 'android';
+ matched.browser = android;
+ browser[android] = true;
+ }
+ browser.name = matched.browser;
+ browser.platform = matched.platform;
+ for (var key in Browser) {
+ if (Browser.hasOwnProperty(key)) {
+ delete Browser[key];
+ }
+ }
+ Object.assign(Browser, browser);
+}
+detect();
+/* harmony default export */ __webpack_exports__["default"] = (Browser);
+
+
+/***/ }),
+
+/***/ "./src/utils/exception.js":
+/*!********************************!*\
+ !*** ./src/utils/exception.js ***!
+ \********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "RuntimeException": function() { return /* binding */ RuntimeException; },
+/* harmony export */ "IllegalStateException": function() { return /* binding */ IllegalStateException; },
+/* harmony export */ "InvalidArgumentException": function() { return /* binding */ InvalidArgumentException; },
+/* harmony export */ "NotImplementedException": function() { return /* binding */ NotImplementedException; }
+/* harmony export */ });
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var __extends = (undefined && undefined.__extends) || (function () {
+ var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+ return function (d, b) {
+ if (typeof b !== "function" && b !== null)
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+var RuntimeException = /** @class */ (function () {
+ function RuntimeException(message) {
+ this._message = message;
+ }
+ Object.defineProperty(RuntimeException.prototype, "name", {
+ get: function () {
+ return 'RuntimeException';
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(RuntimeException.prototype, "message", {
+ get: function () {
+ return this._message;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ RuntimeException.prototype.toString = function () {
+ return this.name + ': ' + this.message;
+ };
+ return RuntimeException;
+}());
+
+var IllegalStateException = /** @class */ (function (_super) {
+ __extends(IllegalStateException, _super);
+ function IllegalStateException(message) {
+ return _super.call(this, message) || this;
+ }
+ Object.defineProperty(IllegalStateException.prototype, "name", {
+ get: function () {
+ return 'IllegalStateException';
+ },
+ enumerable: false,
+ configurable: true
+ });
+ return IllegalStateException;
+}(RuntimeException));
+
+var InvalidArgumentException = /** @class */ (function (_super) {
+ __extends(InvalidArgumentException, _super);
+ function InvalidArgumentException(message) {
+ return _super.call(this, message) || this;
+ }
+ Object.defineProperty(InvalidArgumentException.prototype, "name", {
+ get: function () {
+ return 'InvalidArgumentException';
+ },
+ enumerable: false,
+ configurable: true
+ });
+ return InvalidArgumentException;
+}(RuntimeException));
+
+var NotImplementedException = /** @class */ (function (_super) {
+ __extends(NotImplementedException, _super);
+ function NotImplementedException(message) {
+ return _super.call(this, message) || this;
+ }
+ Object.defineProperty(NotImplementedException.prototype, "name", {
+ get: function () {
+ return 'NotImplementedException';
+ },
+ enumerable: false,
+ configurable: true
+ });
+ return NotImplementedException;
+}(RuntimeException));
+
+
+
+/***/ }),
+
+/***/ "./src/utils/logger.js":
+/*!*****************************!*\
+ !*** ./src/utils/logger.js ***!
+ \*****************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! events */ "./node_modules/events/events.js");
+/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__);
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var Log = /** @class */ (function () {
+ function Log() {
+ }
+ Log.e = function (tag, msg) {
+ if (!tag || Log.FORCE_GLOBAL_TAG)
+ tag = Log.GLOBAL_TAG;
+ var str = "[" + tag + "] > " + msg;
+ if (Log.ENABLE_CALLBACK) {
+ Log.emitter.emit('log', 'error', str);
+ }
+ if (!Log.ENABLE_ERROR) {
+ return;
+ }
+ if (console.error) {
+ console.error(str);
+ }
+ else if (console.warn) {
+ console.warn(str);
+ }
+ else {
+ console.log(str);
+ }
+ };
+ Log.i = function (tag, msg) {
+ if (!tag || Log.FORCE_GLOBAL_TAG)
+ tag = Log.GLOBAL_TAG;
+ var str = "[" + tag + "] > " + msg;
+ if (Log.ENABLE_CALLBACK) {
+ Log.emitter.emit('log', 'info', str);
+ }
+ if (!Log.ENABLE_INFO) {
+ return;
+ }
+ if (console.info) {
+ console.info(str);
+ }
+ else {
+ console.log(str);
+ }
+ };
+ Log.w = function (tag, msg) {
+ if (!tag || Log.FORCE_GLOBAL_TAG)
+ tag = Log.GLOBAL_TAG;
+ var str = "[" + tag + "] > " + msg;
+ if (Log.ENABLE_CALLBACK) {
+ Log.emitter.emit('log', 'warn', str);
+ }
+ if (!Log.ENABLE_WARN) {
+ return;
+ }
+ if (console.warn) {
+ console.warn(str);
+ }
+ else {
+ console.log(str);
+ }
+ };
+ Log.d = function (tag, msg) {
+ if (!tag || Log.FORCE_GLOBAL_TAG)
+ tag = Log.GLOBAL_TAG;
+ var str = "[" + tag + "] > " + msg;
+ if (Log.ENABLE_CALLBACK) {
+ Log.emitter.emit('log', 'debug', str);
+ }
+ if (!Log.ENABLE_DEBUG) {
+ return;
+ }
+ if (console.debug) {
+ console.debug(str);
+ }
+ else {
+ console.log(str);
+ }
+ };
+ Log.v = function (tag, msg) {
+ if (!tag || Log.FORCE_GLOBAL_TAG)
+ tag = Log.GLOBAL_TAG;
+ var str = "[" + tag + "] > " + msg;
+ if (Log.ENABLE_CALLBACK) {
+ Log.emitter.emit('log', 'verbose', str);
+ }
+ if (!Log.ENABLE_VERBOSE) {
+ return;
+ }
+ console.log(str);
+ };
+ return Log;
+}());
+Log.GLOBAL_TAG = 'flv.js';
+Log.FORCE_GLOBAL_TAG = false;
+Log.ENABLE_ERROR = true;
+Log.ENABLE_INFO = true;
+Log.ENABLE_WARN = true;
+Log.ENABLE_DEBUG = true;
+Log.ENABLE_VERBOSE = true;
+Log.ENABLE_CALLBACK = false;
+Log.emitter = new (events__WEBPACK_IMPORTED_MODULE_0___default())();
+/* harmony default export */ __webpack_exports__["default"] = (Log);
+
+
+/***/ }),
+
+/***/ "./src/utils/logging-control.js":
+/*!**************************************!*\
+ !*** ./src/utils/logging-control.js ***!
+ \**************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! events */ "./node_modules/events/events.js");
+/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./logger.js */ "./src/utils/logger.js");
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+var LoggingControl = /** @class */ (function () {
+ function LoggingControl() {
+ }
+ Object.defineProperty(LoggingControl, "forceGlobalTag", {
+ get: function () {
+ return _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.FORCE_GLOBAL_TAG;
+ },
+ set: function (enable) {
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.FORCE_GLOBAL_TAG = enable;
+ LoggingControl._notifyChange();
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(LoggingControl, "globalTag", {
+ get: function () {
+ return _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.GLOBAL_TAG;
+ },
+ set: function (tag) {
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.GLOBAL_TAG = tag;
+ LoggingControl._notifyChange();
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(LoggingControl, "enableAll", {
+ get: function () {
+ return _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_VERBOSE
+ && _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_DEBUG
+ && _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_INFO
+ && _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_WARN
+ && _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_ERROR;
+ },
+ set: function (enable) {
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_VERBOSE = enable;
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_DEBUG = enable;
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_INFO = enable;
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_WARN = enable;
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_ERROR = enable;
+ LoggingControl._notifyChange();
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(LoggingControl, "enableDebug", {
+ get: function () {
+ return _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_DEBUG;
+ },
+ set: function (enable) {
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_DEBUG = enable;
+ LoggingControl._notifyChange();
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(LoggingControl, "enableVerbose", {
+ get: function () {
+ return _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_VERBOSE;
+ },
+ set: function (enable) {
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_VERBOSE = enable;
+ LoggingControl._notifyChange();
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(LoggingControl, "enableInfo", {
+ get: function () {
+ return _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_INFO;
+ },
+ set: function (enable) {
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_INFO = enable;
+ LoggingControl._notifyChange();
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(LoggingControl, "enableWarn", {
+ get: function () {
+ return _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_WARN;
+ },
+ set: function (enable) {
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_WARN = enable;
+ LoggingControl._notifyChange();
+ },
+ enumerable: false,
+ configurable: true
+ });
+ Object.defineProperty(LoggingControl, "enableError", {
+ get: function () {
+ return _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_ERROR;
+ },
+ set: function (enable) {
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_ERROR = enable;
+ LoggingControl._notifyChange();
+ },
+ enumerable: false,
+ configurable: true
+ });
+ LoggingControl.getConfig = function () {
+ return {
+ globalTag: _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.GLOBAL_TAG,
+ forceGlobalTag: _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.FORCE_GLOBAL_TAG,
+ enableVerbose: _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_VERBOSE,
+ enableDebug: _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_DEBUG,
+ enableInfo: _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_INFO,
+ enableWarn: _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_WARN,
+ enableError: _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_ERROR,
+ enableCallback: _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_CALLBACK
+ };
+ };
+ LoggingControl.applyConfig = function (config) {
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.GLOBAL_TAG = config.globalTag;
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.FORCE_GLOBAL_TAG = config.forceGlobalTag;
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_VERBOSE = config.enableVerbose;
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_DEBUG = config.enableDebug;
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_INFO = config.enableInfo;
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_WARN = config.enableWarn;
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_ERROR = config.enableError;
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_CALLBACK = config.enableCallback;
+ };
+ LoggingControl._notifyChange = function () {
+ var emitter = LoggingControl.emitter;
+ if (emitter.listenerCount('change') > 0) {
+ var config = LoggingControl.getConfig();
+ emitter.emit('change', config);
+ }
+ };
+ LoggingControl.registerListener = function (listener) {
+ LoggingControl.emitter.addListener('change', listener);
+ };
+ LoggingControl.removeListener = function (listener) {
+ LoggingControl.emitter.removeListener('change', listener);
+ };
+ LoggingControl.addLogListener = function (listener) {
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.emitter.addListener('log', listener);
+ if (_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.emitter.listenerCount('log') > 0) {
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_CALLBACK = true;
+ LoggingControl._notifyChange();
+ }
+ };
+ LoggingControl.removeLogListener = function (listener) {
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.emitter.removeListener('log', listener);
+ if (_logger_js__WEBPACK_IMPORTED_MODULE_1__.default.emitter.listenerCount('log') === 0) {
+ _logger_js__WEBPACK_IMPORTED_MODULE_1__.default.ENABLE_CALLBACK = false;
+ LoggingControl._notifyChange();
+ }
+ };
+ return LoggingControl;
+}());
+LoggingControl.emitter = new (events__WEBPACK_IMPORTED_MODULE_0___default())();
+/* harmony default export */ __webpack_exports__["default"] = (LoggingControl);
+
+
+/***/ }),
+
+/***/ "./src/utils/polyfill.js":
+/*!*******************************!*\
+ !*** ./src/utils/polyfill.js ***!
+ \*******************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var Polyfill = /** @class */ (function () {
+ function Polyfill() {
+ }
+ Polyfill.install = function () {
+ // ES6 Object.setPrototypeOf
+ Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) {
+ obj.__proto__ = proto;
+ return obj;
+ };
+ // ES6 Object.assign
+ Object.assign = Object.assign || function (target) {
+ if (target === undefined || target === null) {
+ throw new TypeError('Cannot convert undefined or null to object');
+ }
+ var output = Object(target);
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ if (source !== undefined && source !== null) {
+ for (var key in source) {
+ if (source.hasOwnProperty(key)) {
+ output[key] = source[key];
+ }
+ }
+ }
+ }
+ return output;
+ };
+ // ES6 Promise (missing support in IE11)
+ if (typeof self.Promise !== 'function') {
+ __webpack_require__(/*! es6-promise */ "./node_modules/es6-promise/dist/es6-promise.js").polyfill();
+ }
+ };
+ return Polyfill;
+}());
+Polyfill.install();
+/* harmony default export */ __webpack_exports__["default"] = (Polyfill);
+
+
+/***/ }),
+
+/***/ "./src/utils/utf8-conv.js":
+/*!********************************!*\
+ !*** ./src/utils/utf8-conv.js ***!
+ \********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/*
+ * Copyright (C) 2016 Bilibili. All Rights Reserved.
+ *
+ * This file is derived from C++ project libWinTF8 (https://github.com/m13253/libWinTF8)
+ * @author zheng qian
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+function checkContinuation(uint8array, start, checkLength) {
+ var array = uint8array;
+ if (start + checkLength < array.length) {
+ while (checkLength--) {
+ if ((array[++start] & 0xC0) !== 0x80)
+ return false;
+ }
+ return true;
+ }
+ else {
+ return false;
+ }
+}
+function decodeUTF8(uint8array) {
+ var out = [];
+ var input = uint8array;
+ var i = 0;
+ var length = uint8array.length;
+ while (i < length) {
+ if (input[i] < 0x80) {
+ out.push(String.fromCharCode(input[i]));
+ ++i;
+ continue;
+ }
+ else if (input[i] < 0xC0) {
+ // fallthrough
+ }
+ else if (input[i] < 0xE0) {
+ if (checkContinuation(input, i, 1)) {
+ var ucs4 = (input[i] & 0x1F) << 6 | (input[i + 1] & 0x3F);
+ if (ucs4 >= 0x80) {
+ out.push(String.fromCharCode(ucs4 & 0xFFFF));
+ i += 2;
+ continue;
+ }
+ }
+ }
+ else if (input[i] < 0xF0) {
+ if (checkContinuation(input, i, 2)) {
+ var ucs4 = (input[i] & 0xF) << 12 | (input[i + 1] & 0x3F) << 6 | input[i + 2] & 0x3F;
+ if (ucs4 >= 0x800 && (ucs4 & 0xF800) !== 0xD800) {
+ out.push(String.fromCharCode(ucs4 & 0xFFFF));
+ i += 3;
+ continue;
+ }
+ }
+ }
+ else if (input[i] < 0xF8) {
+ if (checkContinuation(input, i, 3)) {
+ var ucs4 = (input[i] & 0x7) << 18 | (input[i + 1] & 0x3F) << 12
+ | (input[i + 2] & 0x3F) << 6 | (input[i + 3] & 0x3F);
+ if (ucs4 > 0x10000 && ucs4 < 0x110000) {
+ ucs4 -= 0x10000;
+ out.push(String.fromCharCode((ucs4 >>> 10) | 0xD800));
+ out.push(String.fromCharCode((ucs4 & 0x3FF) | 0xDC00));
+ i += 4;
+ continue;
+ }
+ }
+ }
+ out.push(String.fromCharCode(0xFFFD));
+ ++i;
+ }
+ return out.join('');
+}
+/* harmony default export */ __webpack_exports__["default"] = (decodeUTF8);
+
+
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/ // The module cache
+/******/ var __webpack_module_cache__ = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/ // Check if module is in cache
+/******/ var cachedModule = __webpack_module_cache__[moduleId];
+/******/ if (cachedModule !== undefined) {
+/******/ return cachedModule.exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = __webpack_module_cache__[moduleId] = {
+/******/ // no module.id needed
+/******/ // no module.loaded needed
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = __webpack_modules__;
+/******/
+/************************************************************************/
+/******/ /* webpack/runtime/compat get default export */
+/******/ !function() {
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function() { return module['default']; } :
+/******/ function() { return module; };
+/******/ __webpack_require__.d(getter, { a: getter });
+/******/ return getter;
+/******/ };
+/******/ }();
+/******/
+/******/ /* webpack/runtime/define property getters */
+/******/ !function() {
+/******/ // define getter functions for harmony exports
+/******/ __webpack_require__.d = function(exports, definition) {
+/******/ for(var key in definition) {
+/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ }
+/******/ }
+/******/ };
+/******/ }();
+/******/
+/******/ /* webpack/runtime/global */
+/******/ !function() {
+/******/ __webpack_require__.g = (function() {
+/******/ if (typeof globalThis === 'object') return globalThis;
+/******/ try {
+/******/ return this || new Function('return this')();
+/******/ } catch (e) {
+/******/ if (typeof window === 'object') return window;
+/******/ }
+/******/ })();
+/******/ }();
+/******/
+/******/ /* webpack/runtime/hasOwnProperty shorthand */
+/******/ !function() {
+/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
+/******/ }();
+/******/
+/******/ /* webpack/runtime/make namespace object */
+/******/ !function() {
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/ }();
+/******/
+/************************************************************************/
+/******/
+/******/ // module factories are used so entry inlining is disabled
+/******/ // startup
+/******/ // Load entry module and return exports
+/******/ var __webpack_exports__ = __webpack_require__("./src/index.js");
+/******/
+/******/ return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=flv.js.map
\ No newline at end of file
diff --git a/src/utils/html2pdf.js b/src/utils/html2pdf.js
new file mode 100644
index 00000000..3551e154
--- /dev/null
+++ b/src/utils/html2pdf.js
@@ -0,0 +1,114 @@
+import jsPDF from 'jspdf'
+import html2canvas from 'html2canvas'
+
+/*
+* 使用说明
+* ele:需要导出pdf的容器元素(dom节点 不是id)
+* pdfFileName: 导出文件的名字 通过调用outPutPdfFn方法也可传参数改变
+* splitClassName: 避免分段截断的类名 当pdf有多页时需要传入此参数 , 避免pdf分页时截断元素 如表格
+* 调用方式 先 let pdf = new PdfLoader(ele, 'pdf' ,'itemClass');
+* 若想改变pdf名称 pdf.outPutPdfFn(fileName); outPutPdfFn方法返回一个promise 可以使用then方法处理pdf生成后的逻辑
+* */
+class PdfLoader {
+ constructor(ele, pdfFileName, splitClassName) {
+ this.ele = ele
+ this.pdfFileName = pdfFileName
+ this.splitClassName = splitClassName
+ this.A4_WIDTH = 595
+ this.A4_HEIGHT = 842
+ }
+
+ async getPDF(resolve) {
+ const ele = this.ele;
+ let eleme = this.ele;
+ eleme.style.width="800px";
+ const pdfFileName = this.pdfFileName
+ const eleW = ele.offsetWidth// 获得该容器的宽
+ const eleH = ele.scrollHeight;// 获得该容器的高
+ const eleOffsetTop = ele.offsetTop// 获得该容器到文档顶部的距离
+ const eleOffsetLeft = ele.offsetLeft// 获得该容器到文档最左的距离
+ const canvas = document.createElement('canvas')
+ canvas.width = eleW * 3// 将画布宽&&高放大两倍
+ canvas.height = eleH * 3
+ const context = canvas.getContext('2d')
+ context.scale(3,3) // 增强图片清晰度
+ context.translate(-eleOffsetLeft , -eleOffsetTop)
+ html2canvas(eleme, {
+ useCORS: true// 允许canvas画布内可以跨域请求外部链接图片, 允许跨域请求。
+ }).then(async canvas => {
+ const contentWidth = canvas.width
+ const contentHeight = canvas.height
+ // 一页pdf显示html页面生成的canvas高度;
+ const pageHeight = (contentWidth / this.A4_WIDTH) * this.A4_HEIGHT // 这样写的目的在于保持宽高比例一致 pageHeight/canvas.width = a4纸高度/a4纸宽度// 宽度和canvas.width保持一致
+ // 未生成pdf的html页面高度
+ let leftHeight = contentHeight
+ // 页面偏移
+ let position = 20
+ // a4纸的尺寸[595,842],单位像素,html页面生成的canvas在pdf中图片的宽高
+ const imgWidth = this.A4_WIDTH - 40 // -10为了页面有右边距
+ const imgHeight = (this.A4_WIDTH / contentWidth) * contentHeight
+ const pageData = canvas.toDataURL('image/jpeg', 1.0)
+ const pdf = jsPDF('', 'pt', 'a4')
+ // 有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
+ // 当内容未超过pdf一页显示的范围,无需分页
+ if (leftHeight < pageHeight) {
+ // 在pdf.addImage(pageData, 'JPEG', 左,上,宽度,高度)设置在pdf中显示;
+ pdf.addImage(pageData, 'JPEG', 20, 20, imgWidth, imgHeight)
+ } else {
+ // 分页
+ while (leftHeight > 0) {
+ pdf.addImage(pageData, 'JPEG', 20, position, imgWidth, imgHeight)
+ leftHeight -= pageHeight
+ position -= this.A4_HEIGHT
+ // 避免添加空白页
+ if (leftHeight > 0) {
+ pdf.addPage()
+ }
+ }
+ }
+ pdf.save(pdfFileName + '.pdf', { returnPromise: true }).then(() => {
+ // 去除添加的空div 防止页面混乱
+ const doms = document.querySelectorAll('.emptyDiv')
+ for (let i = 0; i < doms.length; i++) {
+ doms[i].remove()
+ }
+ })
+ this.ele.style.height = ''
+ resolve()
+ })
+ }
+ //此方法是防止(图表之类)内容因为A4纸张问题被截断
+ async outPutPdfFn(pdfFileName) {
+ return new Promise((resolve, reject) => {
+ this.ele.style.height = 'initial'
+ pdfFileName ? this.pdfFileName = pdfFileName : null
+ const target = this.ele
+ const pageHeight = target.scrollWidth / this.A4_WIDTH * this.A4_HEIGHT
+ // 获取分割dom,此处为class类名为item的dom
+ const domList = document.getElementsByClassName(this.splitClassName)
+ // 进行分割操作,当dom内容已超出a4的高度,则将该dom前插入一个空dom,把他挤下去,分割
+ let pageNum = 1 // pdf页数
+ const eleBounding = this.ele.getBoundingClientRect()
+ for (let i = 0; i < domList.length; i++) {
+ const node = domList[i]
+ const bound = node.getBoundingClientRect()
+ const offset2Ele = bound.top - eleBounding.top
+ const currentPage = Math.ceil((bound.bottom - eleBounding.top) / pageHeight) // 当前元素应该在哪一页
+ if (pageNum < currentPage) {
+ pageNum++
+ const divParent = domList[i].parentNode // 获取该div的父节点
+ const newNode = document.createElement('div')
+ newNode.className = 'emptyDiv'
+ newNode.style.background = 'white'
+ newNode.style.height = (pageHeight * (pageNum - 1) - offset2Ele + 30) + 'px' // +30为了在换下一页时有顶部的边距
+ newNode.style.width = '100%'
+ divParent.insertBefore(newNode, node) //在每一个节点前面插入一个空的新节点,防止内容被分割截断
+ }
+ }
+ // 异步函数,导出成功后处理交互
+ this.getPDF(resolve, reject)
+ })
+ }
+}
+export default PdfLoader
+
diff --git a/src/utils/htmlToPdf.js b/src/utils/htmlToPdf.js
new file mode 100644
index 00000000..6789ddc1
--- /dev/null
+++ b/src/utils/htmlToPdf.js
@@ -0,0 +1,45 @@
+import html2Canvas from "html2canvas";
+import JsPDF from "jspdf";
+/**
+ *
+ * @param {*} reportName 下载时候的标题
+ * @param {*} isDownload 是否下载默认为下载,传false不下载
+ */
+const getPdf = function (reportName, isDownload = true) {
+ return new Promise((resolve, reject) => {
+ var title = reportName;
+ html2Canvas(document.querySelector("#pdfDom"), {
+ allowTaint: true,
+ useCORS: true,
+ }).then((canvas) => {
+ const contentWidth = canvas.width;
+ const contentHeight = canvas.height;
+ console.log("contentWidth", contentWidth);
+ console.log("contentHeight", contentHeight);
+ //页面偏移
+ let position = 5;
+ //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
+ const imgWidth = contentWidth - 20;
+ const imgHeight = contentHeight - 20;
+ let pageData = canvas.toDataURL("image/jpeg", 1.0);
+ let PDF = new JsPDF("p", "px", [210, 270]);
+
+ //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
+ //当内容未超过pdf一页显示的范围,无需分页
+ PDF.addImage(pageData, "JPEG", 10, 10, imgWidth, imgHeight);
+ PDF.save(title + ".pdf");
+ if (isDownload) {
+ PDF.save(title + ".pdf");
+ }
+ // 删除本地存储的base64字段
+ var pdfData = PDF.output("datauristring"); //获取base64Pdf
+ let blobData = new Blob([PDF], {
+ type: "application/pdf",
+ });
+ console.log("blobData", blobData);
+ resolve(blobData);
+ });
+ });
+};
+
+export default getPdf;
diff --git a/src/utils/jsBarCode.js b/src/utils/jsBarCode.js
new file mode 100644
index 00000000..eaa7540f
--- /dev/null
+++ b/src/utils/jsBarCode.js
@@ -0,0 +1,4095 @@
+/*! JsBarcode v3.11.5 | (c) Johan Lindell | MIT license */
+!(function (t) {
+ var e = {};
+ function n(r) {
+ if (e[r]) return e[r].exports;
+ var o = (e[r] = { i: r, l: !1, exports: {} });
+ return t[r].call(o.exports, o, o.exports, n), (o.l = !0), o.exports;
+ }
+ (n.m = t),
+ (n.c = e),
+ (n.d = function (t, e, r) {
+ n.o(t, e) ||
+ Object.defineProperty(t, e, { enumerable: !0, get: r });
+ }),
+ (n.r = function (t) {
+ "undefined" != typeof Symbol &&
+ Symbol.toStringTag &&
+ Object.defineProperty(t, Symbol.toStringTag, {
+ value: "Module",
+ }),
+ Object.defineProperty(t, "__esModule", { value: !0 });
+ }),
+ (n.t = function (t, e) {
+ if ((1 & e && (t = n(t)), 8 & e)) return t;
+ if (4 & e && "object" == typeof t && t && t.__esModule) return t;
+ var r = Object.create(null);
+ if (
+ (n.r(r),
+ Object.defineProperty(r, "default", {
+ enumerable: !0,
+ value: t,
+ }),
+ 2 & e && "string" != typeof t)
+ )
+ for (var o in t)
+ n.d(
+ r,
+ o,
+ function (e) {
+ return t[e];
+ }.bind(null, o)
+ );
+ return r;
+ }),
+ (n.n = function (t) {
+ var e =
+ t && t.__esModule
+ ? function () {
+ return t.default;
+ }
+ : function () {
+ return t;
+ };
+ return n.d(e, "a", e), e;
+ }),
+ (n.o = function (t, e) {
+ return Object.prototype.hasOwnProperty.call(t, e);
+ }),
+ (n.p = ""),
+ n((n.s = 15));
+})([
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ e.default = function t(e, n) {
+ !(function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError("Cannot call a class as a function");
+ })(this, t),
+ (this.data = e),
+ (this.text = n.text || e),
+ (this.options = n);
+ };
+ },
+ function (t, e, n) {
+ "use strict";
+ var r;
+ function o(t, e, n) {
+ return (
+ e in t
+ ? Object.defineProperty(t, e, {
+ value: n,
+ enumerable: !0,
+ configurable: !0,
+ writable: !0,
+ })
+ : (t[e] = n),
+ t
+ );
+ }
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var i = (e.SET_A = 0),
+ a = (e.SET_B = 1),
+ u = (e.SET_C = 2),
+ f = ((e.SHIFT = 98), (e.START_A = 103)),
+ c = (e.START_B = 104),
+ s = (e.START_C = 105);
+ (e.MODULO = 103),
+ (e.STOP = 106),
+ (e.FNC1 = 207),
+ (e.SET_BY_CODE = (o((r = {}), f, i), o(r, c, a), o(r, s, u), r)),
+ (e.SWAP = { 101: i, 100: a, 99: u }),
+ (e.A_START_CHAR = String.fromCharCode(208)),
+ (e.B_START_CHAR = String.fromCharCode(209)),
+ (e.C_START_CHAR = String.fromCharCode(210)),
+ (e.A_CHARS = "[\0-_È-Ï]"),
+ (e.B_CHARS = "[ -È-Ï]"),
+ (e.C_CHARS = "(Ï*[0-9]{2}Ï*)"),
+ (e.BARS = [
+ 11011001100, 11001101100, 11001100110, 10010011e3, 10010001100,
+ 10001001100, 10011001e3, 10011000100, 10001100100, 11001001e3,
+ 11001000100, 11000100100, 10110011100, 10011011100, 10011001110,
+ 10111001100, 10011101100, 10011100110, 11001110010, 11001011100,
+ 11001001110, 11011100100, 11001110100, 11101101110, 11101001100,
+ 11100101100, 11100100110, 11101100100, 11100110100, 11100110010,
+ 11011011e3, 11011000110, 11000110110, 10100011e3, 10001011e3,
+ 10001000110, 10110001e3, 10001101e3, 10001100010, 11010001e3,
+ 11000101e3, 11000100010, 10110111e3, 10110001110, 10001101110,
+ 10111011e3, 10111000110, 10001110110, 11101110110, 11010001110,
+ 11000101110, 11011101e3, 11011100010, 11011101110, 11101011e3,
+ 11101000110, 11100010110, 11101101e3, 11101100010, 11100011010,
+ 11101111010, 11001000010, 11110001010, 1010011e4, 10100001100,
+ 1001011e4, 10010000110, 10000101100, 10000100110, 1011001e4,
+ 10110000100, 1001101e4, 10011000010, 10000110100, 10000110010,
+ 11000010010, 1100101e4, 11110111010, 11000010100, 10001111010,
+ 10100111100, 10010111100, 10010011110, 10111100100, 10011110100,
+ 10011110010, 11110100100, 11110010100, 11110010010, 11011011110,
+ 11011110110, 11110110110, 10101111e3, 10100011110, 10001011110,
+ 10111101e3, 10111100010, 11110101e3, 11110100010, 10111011110,
+ 10111101110, 11101011110, 11110101110, 11010000100, 1101001e4,
+ 11010011100, 1100011101011,
+ ]);
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ (e.SIDE_BIN = "101"),
+ (e.MIDDLE_BIN = "01010"),
+ (e.BINARIES = {
+ L: [
+ "0001101",
+ "0011001",
+ "0010011",
+ "0111101",
+ "0100011",
+ "0110001",
+ "0101111",
+ "0111011",
+ "0110111",
+ "0001011",
+ ],
+ G: [
+ "0100111",
+ "0110011",
+ "0011011",
+ "0100001",
+ "0011101",
+ "0111001",
+ "0000101",
+ "0010001",
+ "0001001",
+ "0010111",
+ ],
+ R: [
+ "1110010",
+ "1100110",
+ "1101100",
+ "1000010",
+ "1011100",
+ "1001110",
+ "1010000",
+ "1000100",
+ "1001000",
+ "1110100",
+ ],
+ O: [
+ "0001101",
+ "0011001",
+ "0010011",
+ "0111101",
+ "0100011",
+ "0110001",
+ "0101111",
+ "0111011",
+ "0110111",
+ "0001011",
+ ],
+ E: [
+ "0100111",
+ "0110011",
+ "0011011",
+ "0100001",
+ "0011101",
+ "0111001",
+ "0000101",
+ "0010001",
+ "0001001",
+ "0010111",
+ ],
+ }),
+ (e.EAN2_STRUCTURE = ["LL", "LG", "GL", "GG"]),
+ (e.EAN5_STRUCTURE = [
+ "GGLLL",
+ "GLGLL",
+ "GLLGL",
+ "GLLLG",
+ "LGGLL",
+ "LLGGL",
+ "LLLGG",
+ "LGLGL",
+ "LGLLG",
+ "LLGLG",
+ ]),
+ (e.EAN13_STRUCTURE = [
+ "LLLLLL",
+ "LLGLGG",
+ "LLGGLG",
+ "LLGGGL",
+ "LGLLGG",
+ "LGGLLG",
+ "LGGGLL",
+ "LGLGLG",
+ "LGLGGL",
+ "LGGLGL",
+ ]);
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r = n(2);
+ e.default = function (t, e, n) {
+ var o = t
+ .split("")
+ .map(function (t, n) {
+ return r.BINARIES[e[n]];
+ })
+ .map(function (e, n) {
+ return e ? e[t[n]] : "";
+ });
+ if (n) {
+ var i = t.length - 1;
+ o = o.map(function (t, e) {
+ return e < i ? t + n : t;
+ });
+ }
+ return o.join("");
+ };
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r,
+ o = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ i = n(0);
+ var a = (function (t) {
+ function e(t, n) {
+ return (
+ (function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ t,
+ n
+ )
+ )
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ o(e, [
+ {
+ key: "encode",
+ value: function () {
+ for (
+ var t = "110", e = 0;
+ e < this.data.length;
+ e++
+ ) {
+ var n = parseInt(this.data[e]).toString(2);
+ n = u(n, 4 - n.length);
+ for (var r = 0; r < n.length; r++)
+ t += "0" == n[r] ? "100" : "110";
+ }
+ return { data: (t += "1001"), text: this.text };
+ },
+ },
+ {
+ key: "valid",
+ value: function () {
+ return -1 !== this.data.search(/^[0-9]+$/);
+ },
+ },
+ ]),
+ e
+ );
+ })(((r = i) && r.__esModule ? r : { default: r }).default);
+ function u(t, e) {
+ for (var n = 0; n < e; n++) t = "0" + t;
+ return t;
+ }
+ e.default = a;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r,
+ o = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ i = n(0),
+ a = (r = i) && r.__esModule ? r : { default: r },
+ u = n(1);
+ var f = (function (t) {
+ function e(t, n) {
+ !(function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e);
+ var r = (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ t.substring(1),
+ n
+ )
+ );
+ return (
+ (r.bytes = t.split("").map(function (t) {
+ return t.charCodeAt(0);
+ })),
+ r
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ o(
+ e,
+ [
+ {
+ key: "valid",
+ value: function () {
+ return /^[\x00-\x7F\xC8-\xD3]+$/.test(
+ this.data
+ );
+ },
+ },
+ {
+ key: "encode",
+ value: function () {
+ var t = this.bytes,
+ n = t.shift() - 105,
+ r = u.SET_BY_CODE[n];
+ if (void 0 === r)
+ throw new RangeError(
+ "The encoding does not start with a start character."
+ );
+ !0 === this.shouldEncodeAsEan128() &&
+ t.unshift(u.FNC1);
+ var o = e.next(t, 1, r);
+ return {
+ text:
+ this.text === this.data
+ ? this.text.replace(
+ /[^\x20-\x7E]/g,
+ ""
+ )
+ : this.text,
+ data:
+ e.getBar(n) +
+ o.result +
+ e.getBar((o.checksum + n) % u.MODULO) +
+ e.getBar(u.STOP),
+ };
+ },
+ },
+ {
+ key: "shouldEncodeAsEan128",
+ value: function () {
+ var t = this.options.ean128 || !1;
+ return (
+ "string" == typeof t &&
+ (t = "true" === t.toLowerCase()),
+ t
+ );
+ },
+ },
+ ],
+ [
+ {
+ key: "getBar",
+ value: function (t) {
+ return u.BARS[t] ? u.BARS[t].toString() : "";
+ },
+ },
+ {
+ key: "correctIndex",
+ value: function (t, e) {
+ if (e === u.SET_A) {
+ var n = t.shift();
+ return n < 32 ? n + 64 : n - 32;
+ }
+ return e === u.SET_B
+ ? t.shift() - 32
+ : 10 * (t.shift() - 48) + t.shift() - 48;
+ },
+ },
+ {
+ key: "next",
+ value: function (t, n, r) {
+ if (!t.length)
+ return { result: "", checksum: 0 };
+ var o = void 0,
+ i = void 0;
+ if (t[0] >= 200) {
+ i = t.shift() - 105;
+ var a = u.SWAP[i];
+ void 0 !== a
+ ? (o = e.next(t, n + 1, a))
+ : ((r !== u.SET_A && r !== u.SET_B) ||
+ i !== u.SHIFT ||
+ (t[0] =
+ r === u.SET_A
+ ? t[0] > 95
+ ? t[0] - 96
+ : t[0]
+ : t[0] < 32
+ ? t[0] + 96
+ : t[0]),
+ (o = e.next(t, n + 1, r)));
+ } else
+ (i = e.correctIndex(t, r)),
+ (o = e.next(t, n + 1, r));
+ var f = i * n;
+ return {
+ result: e.getBar(i) + o.result,
+ checksum: f + o.checksum,
+ };
+ },
+ },
+ ]
+ ),
+ e
+ );
+ })(a.default);
+ e.default = f;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 }),
+ (e.mod10 = function (t) {
+ for (var e = 0, n = 0; n < t.length; n++) {
+ var r = parseInt(t[n]);
+ (n + t.length) % 2 == 0
+ ? (e += r)
+ : (e += ((2 * r) % 10) + Math.floor((2 * r) / 10));
+ }
+ return (10 - (e % 10)) % 10;
+ }),
+ (e.mod11 = function (t) {
+ for (
+ var e = 0, n = [2, 3, 4, 5, 6, 7], r = 0;
+ r < t.length;
+ r++
+ ) {
+ var o = parseInt(t[t.length - 1 - r]);
+ e += n[r % n.length] * o;
+ }
+ return (11 - (e % 11)) % 11;
+ });
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r =
+ Object.assign ||
+ function (t) {
+ for (var e = 1; e < arguments.length; e++) {
+ var n = arguments[e];
+ for (var r in n)
+ Object.prototype.hasOwnProperty.call(n, r) &&
+ (t[r] = n[r]);
+ }
+ return t;
+ };
+ e.default = function (t, e) {
+ return r({}, t, e);
+ };
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ o = n(2),
+ i = a(n(3));
+ function a(t) {
+ return t && t.__esModule ? t : { default: t };
+ }
+ var u = (function (t) {
+ function e(t, n) {
+ !(function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e);
+ var r = (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)
+ );
+ return (
+ (r.fontSize =
+ !n.flat && n.fontSize > 10 * n.width
+ ? 10 * n.width
+ : n.fontSize),
+ (r.guardHeight = n.height + r.fontSize / 2 + n.textMargin),
+ r
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ r(e, [
+ {
+ key: "encode",
+ value: function () {
+ return this.options.flat
+ ? this.encodeFlat()
+ : this.encodeGuarded();
+ },
+ },
+ {
+ key: "leftText",
+ value: function (t, e) {
+ return this.text.substr(t, e);
+ },
+ },
+ {
+ key: "leftEncode",
+ value: function (t, e) {
+ return (0, i.default)(t, e);
+ },
+ },
+ {
+ key: "rightText",
+ value: function (t, e) {
+ return this.text.substr(t, e);
+ },
+ },
+ {
+ key: "rightEncode",
+ value: function (t, e) {
+ return (0, i.default)(t, e);
+ },
+ },
+ {
+ key: "encodeGuarded",
+ value: function () {
+ var t = { fontSize: this.fontSize },
+ e = { height: this.guardHeight };
+ return [
+ { data: o.SIDE_BIN, options: e },
+ {
+ data: this.leftEncode(),
+ text: this.leftText(),
+ options: t,
+ },
+ { data: o.MIDDLE_BIN, options: e },
+ {
+ data: this.rightEncode(),
+ text: this.rightText(),
+ options: t,
+ },
+ { data: o.SIDE_BIN, options: e },
+ ];
+ },
+ },
+ {
+ key: "encodeFlat",
+ value: function () {
+ return {
+ data: [
+ o.SIDE_BIN,
+ this.leftEncode(),
+ o.MIDDLE_BIN,
+ this.rightEncode(),
+ o.SIDE_BIN,
+ ].join(""),
+ text: this.text,
+ };
+ },
+ },
+ ]),
+ e
+ );
+ })(a(n(0)).default);
+ e.default = u;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })();
+ e.checksum = u;
+ var o = i(n(3));
+ function i(t) {
+ return t && t.__esModule ? t : { default: t };
+ }
+ var a = (function (t) {
+ function e(t, n) {
+ !(function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ -1 !== t.search(/^[0-9]{11}$/) && (t += u(t));
+ var r = (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)
+ );
+ return (
+ (r.displayValue = n.displayValue),
+ n.fontSize > 10 * n.width
+ ? (r.fontSize = 10 * n.width)
+ : (r.fontSize = n.fontSize),
+ (r.guardHeight = n.height + r.fontSize / 2 + n.textMargin),
+ r
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ r(e, [
+ {
+ key: "valid",
+ value: function () {
+ return (
+ -1 !== this.data.search(/^[0-9]{12}$/) &&
+ this.data[11] == u(this.data)
+ );
+ },
+ },
+ {
+ key: "encode",
+ value: function () {
+ return this.options.flat
+ ? this.flatEncoding()
+ : this.guardedEncoding();
+ },
+ },
+ {
+ key: "flatEncoding",
+ value: function () {
+ var t = "";
+ return (
+ (t += "101"),
+ (t += (0, o.default)(
+ this.data.substr(0, 6),
+ "LLLLLL"
+ )),
+ (t += "01010"),
+ (t += (0, o.default)(
+ this.data.substr(6, 6),
+ "RRRRRR"
+ )),
+ { data: (t += "101"), text: this.text }
+ );
+ },
+ },
+ {
+ key: "guardedEncoding",
+ value: function () {
+ var t = [];
+ return (
+ this.displayValue &&
+ t.push({
+ data: "00000000",
+ text: this.text.substr(0, 1),
+ options: {
+ textAlign: "left",
+ fontSize: this.fontSize,
+ },
+ }),
+ t.push({
+ data:
+ "101" +
+ (0, o.default)(this.data[0], "L"),
+ options: { height: this.guardHeight },
+ }),
+ t.push({
+ data: (0, o.default)(
+ this.data.substr(1, 5),
+ "LLLLL"
+ ),
+ text: this.text.substr(1, 5),
+ options: { fontSize: this.fontSize },
+ }),
+ t.push({
+ data: "01010",
+ options: { height: this.guardHeight },
+ }),
+ t.push({
+ data: (0, o.default)(
+ this.data.substr(6, 5),
+ "RRRRR"
+ ),
+ text: this.text.substr(6, 5),
+ options: { fontSize: this.fontSize },
+ }),
+ t.push({
+ data:
+ (0, o.default)(this.data[11], "R") +
+ "101",
+ options: { height: this.guardHeight },
+ }),
+ this.displayValue &&
+ t.push({
+ data: "00000000",
+ text: this.text.substr(11, 1),
+ options: {
+ textAlign: "right",
+ fontSize: this.fontSize,
+ },
+ }),
+ t
+ );
+ },
+ },
+ ]),
+ e
+ );
+ })(i(n(0)).default);
+ function u(t) {
+ var e,
+ n = 0;
+ for (e = 1; e < 11; e += 2) n += parseInt(t[e]);
+ for (e = 0; e < 11; e += 2) n += 3 * parseInt(t[e]);
+ return (10 - (n % 10)) % 10;
+ }
+ e.default = a;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r,
+ o = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ i = n(31),
+ a = n(0);
+ function u(t, e) {
+ if (!(t instanceof e))
+ throw new TypeError("Cannot call a class as a function");
+ }
+ function f(t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e || ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ }
+ var c = (function (t) {
+ function e() {
+ return (
+ u(this, e),
+ f(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).apply(
+ this,
+ arguments
+ )
+ )
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ o(e, [
+ {
+ key: "valid",
+ value: function () {
+ return -1 !== this.data.search(/^([0-9]{2})+$/);
+ },
+ },
+ {
+ key: "encode",
+ value: function () {
+ var t = this,
+ e = this.data
+ .match(/.{2}/g)
+ .map(function (e) {
+ return t.encodePair(e);
+ })
+ .join("");
+ return {
+ data: i.START_BIN + e + i.END_BIN,
+ text: this.text,
+ };
+ },
+ },
+ {
+ key: "encodePair",
+ value: function (t) {
+ var e = i.BINARIES[t[1]];
+ return i.BINARIES[t[0]]
+ .split("")
+ .map(function (t, n) {
+ return (
+ ("1" === t ? "111" : "1") +
+ ("1" === e[n] ? "000" : "0")
+ );
+ })
+ .join("");
+ },
+ },
+ ]),
+ e
+ );
+ })(((r = a) && r.__esModule ? r : { default: r }).default);
+ e.default = c;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 }),
+ (e.default = function (t) {
+ var e = [
+ "width",
+ "height",
+ "textMargin",
+ "fontSize",
+ "margin",
+ "marginTop",
+ "marginBottom",
+ "marginLeft",
+ "marginRight",
+ ];
+ for (var n in e)
+ e.hasOwnProperty(n) &&
+ ((n = e[n]),
+ "string" == typeof t[n] && (t[n] = parseInt(t[n], 10)));
+ "string" == typeof t.displayValue &&
+ (t.displayValue = "false" != t.displayValue);
+ return t;
+ });
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r = {
+ width: 2,
+ height: 100,
+ format: "auto",
+ displayValue: !0,
+ fontOptions: "",
+ font: "monospace",
+ text: void 0,
+ textAlign: "center",
+ textPosition: "bottom",
+ textMargin: 2,
+ fontSize: 20,
+ background: "#ffffff",
+ lineColor: "#000000",
+ margin: 10,
+ marginTop: void 0,
+ marginBottom: void 0,
+ marginLeft: void 0,
+ marginRight: void 0,
+ valid: function () {},
+ };
+ e.default = r;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 }),
+ (e.getTotalWidthOfEncodings =
+ e.calculateEncodingAttributes =
+ e.getBarcodePadding =
+ e.getEncodingHeight =
+ e.getMaximumHeightOfEncodings =
+ void 0);
+ var r,
+ o = n(7),
+ i = (r = o) && r.__esModule ? r : { default: r };
+ function a(t, e) {
+ return (
+ e.height +
+ (e.displayValue && t.text.length > 0
+ ? e.fontSize + e.textMargin
+ : 0) +
+ e.marginTop +
+ e.marginBottom
+ );
+ }
+ function u(t, e, n) {
+ if (n.displayValue && e < t) {
+ if ("center" == n.textAlign) return Math.floor((t - e) / 2);
+ if ("left" == n.textAlign) return 0;
+ if ("right" == n.textAlign) return Math.floor(t - e);
+ }
+ return 0;
+ }
+ function f(t, e, n) {
+ var r;
+ if (n) r = n;
+ else {
+ if ("undefined" == typeof document) return 0;
+ r = document.createElement("canvas").getContext("2d");
+ }
+ r.font = e.fontOptions + " " + e.fontSize + "px " + e.font;
+ var o = r.measureText(t);
+ return o ? o.width : 0;
+ }
+ (e.getMaximumHeightOfEncodings = function (t) {
+ for (var e = 0, n = 0; n < t.length; n++)
+ t[n].height > e && (e = t[n].height);
+ return e;
+ }),
+ (e.getEncodingHeight = a),
+ (e.getBarcodePadding = u),
+ (e.calculateEncodingAttributes = function (t, e, n) {
+ for (var r = 0; r < t.length; r++) {
+ var o,
+ c = t[r],
+ s = (0, i.default)(e, c.options);
+ o = s.displayValue ? f(c.text, s, n) : 0;
+ var l = c.data.length * s.width;
+ (c.width = Math.ceil(Math.max(o, l))),
+ (c.height = a(c, s)),
+ (c.barcodePadding = u(o, l, s));
+ }
+ }),
+ (e.getTotalWidthOfEncodings = function (t) {
+ for (var e = 0, n = 0; n < t.length; n++) e += t[n].width;
+ return e;
+ });
+ },
+ function (t, e, n) {
+ "use strict";
+ function r(t, e) {
+ if (!(t instanceof e))
+ throw new TypeError("Cannot call a class as a function");
+ }
+ function o(t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e || ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ }
+ function i(t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ }
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var a = (function (t) {
+ function e(t, n) {
+ r(this, e);
+ var i = o(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(this)
+ );
+ return (
+ (i.name = "InvalidInputException"),
+ (i.symbology = t),
+ (i.input = n),
+ (i.message =
+ '"' +
+ i.input +
+ '" is not a valid input for ' +
+ i.symbology),
+ i
+ );
+ }
+ return i(e, Error), e;
+ })(),
+ u = (function (t) {
+ function e() {
+ r(this, e);
+ var t = o(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(this)
+ );
+ return (
+ (t.name = "InvalidElementException"),
+ (t.message = "Not supported type to render on"),
+ t
+ );
+ }
+ return i(e, Error), e;
+ })(),
+ f = (function (t) {
+ function e() {
+ r(this, e);
+ var t = o(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(this)
+ );
+ return (
+ (t.name = "NoElementException"),
+ (t.message = "No element to render on."),
+ t
+ );
+ }
+ return i(e, Error), e;
+ })();
+ (e.InvalidInputException = a),
+ (e.InvalidElementException = u),
+ (e.NoElementException = f);
+ },
+ function (t, e, n) {
+ "use strict";
+ var r = p(n(16)),
+ o = p(n(7)),
+ i = p(n(41)),
+ a = p(n(42)),
+ u = p(n(43)),
+ f = p(n(11)),
+ c = p(n(49)),
+ s = n(14),
+ l = p(n(12));
+ function p(t) {
+ return t && t.__esModule ? t : { default: t };
+ }
+ var d = function () {},
+ h = function (t, e, n) {
+ var r = new d();
+ if (void 0 === t)
+ throw Error("No element to render on was provided.");
+ return (
+ (r._renderProperties = (0, u.default)(t)),
+ (r._encodings = []),
+ (r._options = l.default),
+ (r._errorHandler = new c.default(r)),
+ void 0 !== e &&
+ ((n = n || {}).format || (n.format = _()),
+ r.options(n)[n.format](e, n).render()),
+ r
+ );
+ };
+ for (var y in ((h.getModule = function (t) {
+ return r.default[t];
+ }),
+ r.default))
+ r.default.hasOwnProperty(y) && b(r.default, y);
+ function b(t, e) {
+ d.prototype[e] =
+ d.prototype[e.toUpperCase()] =
+ d.prototype[e.toLowerCase()] =
+ function (n, r) {
+ var i = this;
+ return i._errorHandler.wrapBarcodeCall(function () {
+ r.text = void 0 === r.text ? void 0 : "" + r.text;
+ var a = (0, o.default)(i._options, r);
+ a = (0, f.default)(a);
+ var u = t[e],
+ c = v(n, u, a);
+ return i._encodings.push(c), i;
+ });
+ };
+ }
+ function v(t, e, n) {
+ var r = new e((t = "" + t), n);
+ if (!r.valid())
+ throw new s.InvalidInputException(r.constructor.name, t);
+ var a = r.encode();
+ a = (0, i.default)(a);
+ for (var u = 0; u < a.length; u++)
+ a[u].options = (0, o.default)(n, a[u].options);
+ return a;
+ }
+ function _() {
+ return r.default.CODE128 ? "CODE128" : Object.keys(r.default)[0];
+ }
+ function g(t, e, n) {
+ e = (0, i.default)(e);
+ for (var r = 0; r < e.length; r++)
+ (e[r].options = (0, o.default)(n, e[r].options)),
+ (0, a.default)(e[r].options);
+ (0, a.default)(n),
+ new (0, t.renderer)(t.element, e, n).render(),
+ t.afterRender && t.afterRender();
+ }
+ (d.prototype.options = function (t) {
+ return (this._options = (0, o.default)(this._options, t)), this;
+ }),
+ (d.prototype.blank = function (t) {
+ var e = new Array(t + 1).join("0");
+ return this._encodings.push({ data: e }), this;
+ }),
+ (d.prototype.init = function () {
+ var t;
+ if (this._renderProperties)
+ for (var e in (Array.isArray(this._renderProperties) ||
+ (this._renderProperties = [this._renderProperties]),
+ this._renderProperties)) {
+ t = this._renderProperties[e];
+ var n = (0, o.default)(this._options, t.options);
+ "auto" == n.format && (n.format = _()),
+ this._errorHandler.wrapBarcodeCall(function () {
+ var e = v(
+ n.value,
+ r.default[n.format.toUpperCase()],
+ n
+ );
+ g(t, e, n);
+ });
+ }
+ }),
+ (d.prototype.render = function () {
+ if (!this._renderProperties) throw new s.NoElementException();
+ if (Array.isArray(this._renderProperties))
+ for (var t = 0; t < this._renderProperties.length; t++)
+ g(
+ this._renderProperties[t],
+ this._encodings,
+ this._options
+ );
+ else g(this._renderProperties, this._encodings, this._options);
+ return this;
+ }),
+ (d.prototype._defaults = l.default),
+ "undefined" != typeof window && (window.JsBarcode = h),
+ "undefined" != typeof jQuery &&
+ (jQuery.fn.JsBarcode = function (t, e) {
+ var n = [];
+ return (
+ jQuery(this).each(function () {
+ n.push(this);
+ }),
+ h(n, t, e)
+ );
+ }),
+ (t.exports = h);
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r = n(17),
+ o = n(18),
+ i = n(24),
+ a = n(30),
+ u = n(33),
+ f = n(38),
+ c = n(39),
+ s = n(40);
+ e.default = {
+ CODE39: r.CODE39,
+ CODE128: o.CODE128,
+ CODE128A: o.CODE128A,
+ CODE128B: o.CODE128B,
+ CODE128C: o.CODE128C,
+ EAN13: i.EAN13,
+ EAN8: i.EAN8,
+ EAN5: i.EAN5,
+ EAN2: i.EAN2,
+ UPC: i.UPC,
+ UPCE: i.UPCE,
+ ITF14: a.ITF14,
+ ITF: a.ITF,
+ MSI: u.MSI,
+ MSI10: u.MSI10,
+ MSI11: u.MSI11,
+ MSI1010: u.MSI1010,
+ MSI1110: u.MSI1110,
+ pharmacode: f.pharmacode,
+ codabar: c.codabar,
+ GenericBarcode: s.GenericBarcode,
+ };
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 }),
+ (e.CODE39 = void 0);
+ var r,
+ o = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ i = n(0);
+ var a = (function (t) {
+ function e(t, n) {
+ return (
+ (function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ (t = t.toUpperCase()),
+ n.mod43 &&
+ (t += (function (t) {
+ return u[t];
+ })(
+ (function (t) {
+ for (var e = 0, n = 0; n < t.length; n++)
+ e += s(t[n]);
+ return (e %= 43);
+ })(t)
+ )),
+ (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ t,
+ n
+ )
+ )
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ o(e, [
+ {
+ key: "encode",
+ value: function () {
+ for (
+ var t = c("*"), e = 0;
+ e < this.data.length;
+ e++
+ )
+ t += c(this.data[e]) + "0";
+ return { data: (t += c("*")), text: this.text };
+ },
+ },
+ {
+ key: "valid",
+ value: function () {
+ return (
+ -1 !==
+ this.data.search(
+ /^[0-9A-Z\-\.\ \$\/\+\%]+$/
+ )
+ );
+ },
+ },
+ ]),
+ e
+ );
+ })(((r = i) && r.__esModule ? r : { default: r }).default),
+ u = [
+ "0",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "A",
+ "B",
+ "C",
+ "D",
+ "E",
+ "F",
+ "G",
+ "H",
+ "I",
+ "J",
+ "K",
+ "L",
+ "M",
+ "N",
+ "O",
+ "P",
+ "Q",
+ "R",
+ "S",
+ "T",
+ "U",
+ "V",
+ "W",
+ "X",
+ "Y",
+ "Z",
+ "-",
+ ".",
+ " ",
+ "$",
+ "/",
+ "+",
+ "%",
+ "*",
+ ],
+ f = [
+ 20957, 29783, 23639, 30485, 20951, 29813, 23669, 20855, 29789,
+ 23645, 29975, 23831, 30533, 22295, 30149, 24005, 21623, 29981,
+ 23837, 22301, 30023, 23879, 30545, 22343, 30161, 24017, 21959,
+ 30065, 23921, 22385, 29015, 18263, 29141, 17879, 29045, 18293,
+ 17783, 29021, 18269, 17477, 17489, 17681, 20753, 35770,
+ ];
+ function c(t) {
+ return (function (t) {
+ return f[t].toString(2);
+ })(s(t));
+ }
+ function s(t) {
+ return u.indexOf(t);
+ }
+ e.CODE39 = a;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 }),
+ (e.CODE128C = e.CODE128B = e.CODE128A = e.CODE128 = void 0);
+ var r = u(n(19)),
+ o = u(n(21)),
+ i = u(n(22)),
+ a = u(n(23));
+ function u(t) {
+ return t && t.__esModule ? t : { default: t };
+ }
+ (e.CODE128 = r.default),
+ (e.CODE128A = o.default),
+ (e.CODE128B = i.default),
+ (e.CODE128C = a.default);
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r = i(n(5)),
+ o = i(n(20));
+ function i(t) {
+ return t && t.__esModule ? t : { default: t };
+ }
+ function a(t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e || ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ }
+ var u = (function (t) {
+ function e(t, n) {
+ if (
+ ((function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ /^[\x00-\x7F\xC8-\xD3]+$/.test(t))
+ )
+ var r = a(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ (0, o.default)(t),
+ n
+ )
+ );
+ else
+ r = a(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ t,
+ n
+ )
+ );
+ return a(r);
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ e
+ );
+ })(r.default);
+ e.default = u;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r = n(1),
+ o = function (t) {
+ return t.match(new RegExp("^" + r.A_CHARS + "*"))[0].length;
+ },
+ i = function (t) {
+ return t.match(new RegExp("^" + r.B_CHARS + "*"))[0].length;
+ },
+ a = function (t) {
+ return t.match(new RegExp("^" + r.C_CHARS + "*"))[0];
+ };
+ function u(t, e) {
+ var n = e ? r.A_CHARS : r.B_CHARS,
+ o = t.match(
+ new RegExp("^(" + n + "+?)(([0-9]{2}){2,})([^0-9]|$)")
+ );
+ if (o)
+ return (
+ o[1] +
+ String.fromCharCode(204) +
+ f(t.substring(o[1].length))
+ );
+ var i = t.match(new RegExp("^" + n + "+"))[0];
+ return i.length === t.length
+ ? t
+ : i +
+ String.fromCharCode(e ? 205 : 206) +
+ u(t.substring(i.length), !e);
+ }
+ function f(t) {
+ var e = a(t),
+ n = e.length;
+ if (n === t.length) return t;
+ t = t.substring(n);
+ var r = o(t) >= i(t);
+ return e + String.fromCharCode(r ? 206 : 205) + u(t, r);
+ }
+ e.default = function (t) {
+ var e = void 0;
+ if (a(t).length >= 2) e = r.C_START_CHAR + f(t);
+ else {
+ var n = o(t) > i(t);
+ e = (n ? r.A_START_CHAR : r.B_START_CHAR) + u(t, n);
+ }
+ return e.replace(/[\xCD\xCE]([^])[\xCD\xCE]/, function (t, e) {
+ return String.fromCharCode(203) + e;
+ });
+ };
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r,
+ o = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ i = n(5),
+ a = (r = i) && r.__esModule ? r : { default: r },
+ u = n(1);
+ var f = (function (t) {
+ function e(t, n) {
+ return (
+ (function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ u.A_START_CHAR + t,
+ n
+ )
+ )
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ o(e, [
+ {
+ key: "valid",
+ value: function () {
+ return new RegExp("^" + u.A_CHARS + "+$").test(
+ this.data
+ );
+ },
+ },
+ ]),
+ e
+ );
+ })(a.default);
+ e.default = f;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r,
+ o = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ i = n(5),
+ a = (r = i) && r.__esModule ? r : { default: r },
+ u = n(1);
+ var f = (function (t) {
+ function e(t, n) {
+ return (
+ (function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ u.B_START_CHAR + t,
+ n
+ )
+ )
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ o(e, [
+ {
+ key: "valid",
+ value: function () {
+ return new RegExp("^" + u.B_CHARS + "+$").test(
+ this.data
+ );
+ },
+ },
+ ]),
+ e
+ );
+ })(a.default);
+ e.default = f;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r,
+ o = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ i = n(5),
+ a = (r = i) && r.__esModule ? r : { default: r },
+ u = n(1);
+ var f = (function (t) {
+ function e(t, n) {
+ return (
+ (function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ u.C_START_CHAR + t,
+ n
+ )
+ )
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ o(e, [
+ {
+ key: "valid",
+ value: function () {
+ return new RegExp("^" + u.C_CHARS + "+$").test(
+ this.data
+ );
+ },
+ },
+ ]),
+ e
+ );
+ })(a.default);
+ e.default = f;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 }),
+ (e.UPCE = e.UPC = e.EAN2 = e.EAN5 = e.EAN8 = e.EAN13 = void 0);
+ var r = c(n(25)),
+ o = c(n(26)),
+ i = c(n(27)),
+ a = c(n(28)),
+ u = c(n(9)),
+ f = c(n(29));
+ function c(t) {
+ return t && t.__esModule ? t : { default: t };
+ }
+ (e.EAN13 = r.default),
+ (e.EAN8 = o.default),
+ (e.EAN5 = i.default),
+ (e.EAN2 = a.default),
+ (e.UPC = u.default),
+ (e.UPCE = f.default);
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r,
+ o = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ i = function t(e, n, r) {
+ null === e && (e = Function.prototype);
+ var o = Object.getOwnPropertyDescriptor(e, n);
+ if (void 0 === o) {
+ var i = Object.getPrototypeOf(e);
+ return null === i ? void 0 : t(i, n, r);
+ }
+ if ("value" in o) return o.value;
+ var a = o.get;
+ return void 0 !== a ? a.call(r) : void 0;
+ },
+ a = n(2),
+ u = n(8),
+ f = (r = u) && r.__esModule ? r : { default: r };
+ var c = function (t) {
+ return (
+ (10 -
+ (t
+ .substr(0, 12)
+ .split("")
+ .map(function (t) {
+ return +t;
+ })
+ .reduce(function (t, e, n) {
+ return n % 2 ? t + 3 * e : t + e;
+ }, 0) %
+ 10)) %
+ 10
+ );
+ },
+ s = (function (t) {
+ function e(t, n) {
+ !(function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ -1 !== t.search(/^[0-9]{12}$/) && (t += c(t));
+ var r = (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ t,
+ n
+ )
+ );
+ return (r.lastChar = n.lastChar), r;
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ o(e, [
+ {
+ key: "valid",
+ value: function () {
+ return (
+ -1 !== this.data.search(/^[0-9]{13}$/) &&
+ +this.data[12] === c(this.data)
+ );
+ },
+ },
+ {
+ key: "leftText",
+ value: function () {
+ return i(
+ e.prototype.__proto__ ||
+ Object.getPrototypeOf(e.prototype),
+ "leftText",
+ this
+ ).call(this, 1, 6);
+ },
+ },
+ {
+ key: "leftEncode",
+ value: function () {
+ var t = this.data.substr(1, 6),
+ n = a.EAN13_STRUCTURE[this.data[0]];
+ return i(
+ e.prototype.__proto__ ||
+ Object.getPrototypeOf(e.prototype),
+ "leftEncode",
+ this
+ ).call(this, t, n);
+ },
+ },
+ {
+ key: "rightText",
+ value: function () {
+ return i(
+ e.prototype.__proto__ ||
+ Object.getPrototypeOf(e.prototype),
+ "rightText",
+ this
+ ).call(this, 7, 6);
+ },
+ },
+ {
+ key: "rightEncode",
+ value: function () {
+ var t = this.data.substr(7, 6);
+ return i(
+ e.prototype.__proto__ ||
+ Object.getPrototypeOf(e.prototype),
+ "rightEncode",
+ this
+ ).call(this, t, "RRRRRR");
+ },
+ },
+ {
+ key: "encodeGuarded",
+ value: function () {
+ var t = i(
+ e.prototype.__proto__ ||
+ Object.getPrototypeOf(e.prototype),
+ "encodeGuarded",
+ this
+ ).call(this);
+ return (
+ this.options.displayValue &&
+ (t.unshift({
+ data: "000000000000",
+ text: this.text.substr(0, 1),
+ options: {
+ textAlign: "left",
+ fontSize: this.fontSize,
+ },
+ }),
+ this.options.lastChar &&
+ (t.push({ data: "00" }),
+ t.push({
+ data: "00000",
+ text: this.options.lastChar,
+ options: {
+ fontSize: this.fontSize,
+ },
+ }))),
+ t
+ );
+ },
+ },
+ ]),
+ e
+ );
+ })(f.default);
+ e.default = s;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r,
+ o = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ i = function t(e, n, r) {
+ null === e && (e = Function.prototype);
+ var o = Object.getOwnPropertyDescriptor(e, n);
+ if (void 0 === o) {
+ var i = Object.getPrototypeOf(e);
+ return null === i ? void 0 : t(i, n, r);
+ }
+ if ("value" in o) return o.value;
+ var a = o.get;
+ return void 0 !== a ? a.call(r) : void 0;
+ },
+ a = n(8),
+ u = (r = a) && r.__esModule ? r : { default: r };
+ var f = function (t) {
+ return (
+ (10 -
+ (t
+ .substr(0, 7)
+ .split("")
+ .map(function (t) {
+ return +t;
+ })
+ .reduce(function (t, e, n) {
+ return n % 2 ? t + e : t + 3 * e;
+ }, 0) %
+ 10)) %
+ 10
+ );
+ },
+ c = (function (t) {
+ function e(t, n) {
+ return (
+ (function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ -1 !== t.search(/^[0-9]{7}$/) && (t += f(t)),
+ (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ t,
+ n
+ )
+ )
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ o(e, [
+ {
+ key: "valid",
+ value: function () {
+ return (
+ -1 !== this.data.search(/^[0-9]{8}$/) &&
+ +this.data[7] === f(this.data)
+ );
+ },
+ },
+ {
+ key: "leftText",
+ value: function () {
+ return i(
+ e.prototype.__proto__ ||
+ Object.getPrototypeOf(e.prototype),
+ "leftText",
+ this
+ ).call(this, 0, 4);
+ },
+ },
+ {
+ key: "leftEncode",
+ value: function () {
+ var t = this.data.substr(0, 4);
+ return i(
+ e.prototype.__proto__ ||
+ Object.getPrototypeOf(e.prototype),
+ "leftEncode",
+ this
+ ).call(this, t, "LLLL");
+ },
+ },
+ {
+ key: "rightText",
+ value: function () {
+ return i(
+ e.prototype.__proto__ ||
+ Object.getPrototypeOf(e.prototype),
+ "rightText",
+ this
+ ).call(this, 4, 4);
+ },
+ },
+ {
+ key: "rightEncode",
+ value: function () {
+ var t = this.data.substr(4, 4);
+ return i(
+ e.prototype.__proto__ ||
+ Object.getPrototypeOf(e.prototype),
+ "rightEncode",
+ this
+ ).call(this, t, "RRRR");
+ },
+ },
+ ]),
+ e
+ );
+ })(u.default);
+ e.default = c;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ o = n(2),
+ i = u(n(3)),
+ a = u(n(0));
+ function u(t) {
+ return t && t.__esModule ? t : { default: t };
+ }
+ var f = (function (t) {
+ function e(t, n) {
+ return (
+ (function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ t,
+ n
+ )
+ )
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ r(e, [
+ {
+ key: "valid",
+ value: function () {
+ return -1 !== this.data.search(/^[0-9]{5}$/);
+ },
+ },
+ {
+ key: "encode",
+ value: function () {
+ var t,
+ e =
+ o.EAN5_STRUCTURE[
+ ((t = this.data),
+ t
+ .split("")
+ .map(function (t) {
+ return +t;
+ })
+ .reduce(function (t, e, n) {
+ return n % 2
+ ? t + 9 * e
+ : t + 3 * e;
+ }, 0) % 10)
+ ];
+ return {
+ data:
+ "1011" + (0, i.default)(this.data, e, "01"),
+ text: this.text,
+ };
+ },
+ },
+ ]),
+ e
+ );
+ })(a.default);
+ e.default = f;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ o = n(2),
+ i = a(n(3));
+ function a(t) {
+ return t && t.__esModule ? t : { default: t };
+ }
+ var u = (function (t) {
+ function e(t, n) {
+ return (
+ (function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ t,
+ n
+ )
+ )
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ r(e, [
+ {
+ key: "valid",
+ value: function () {
+ return -1 !== this.data.search(/^[0-9]{2}$/);
+ },
+ },
+ {
+ key: "encode",
+ value: function () {
+ var t = o.EAN2_STRUCTURE[parseInt(this.data) % 4];
+ return {
+ data:
+ "1011" + (0, i.default)(this.data, t, "01"),
+ text: this.text,
+ };
+ },
+ },
+ ]),
+ e
+ );
+ })(a(n(0)).default);
+ e.default = u;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ o = u(n(3)),
+ i = u(n(0)),
+ a = n(9);
+ function u(t) {
+ return t && t.__esModule ? t : { default: t };
+ }
+ function f(t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e || ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ }
+ var c = [
+ "XX00000XXX",
+ "XX10000XXX",
+ "XX20000XXX",
+ "XXX00000XX",
+ "XXXX00000X",
+ "XXXXX00005",
+ "XXXXX00006",
+ "XXXXX00007",
+ "XXXXX00008",
+ "XXXXX00009",
+ ],
+ s = [
+ ["EEEOOO", "OOOEEE"],
+ ["EEOEOO", "OOEOEE"],
+ ["EEOOEO", "OOEEOE"],
+ ["EEOOOE", "OOEEEO"],
+ ["EOEEOO", "OEOOEE"],
+ ["EOOEEO", "OEEOOE"],
+ ["EOOOEE", "OEEEOO"],
+ ["EOEOEO", "OEOEOE"],
+ ["EOEOOE", "OEOEEO"],
+ ["EOOEOE", "OEEOEO"],
+ ],
+ l = (function (t) {
+ function e(t, n) {
+ !(function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e);
+ var r = f(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ t,
+ n
+ )
+ );
+ if (((r.isValid = !1), -1 !== t.search(/^[0-9]{6}$/)))
+ (r.middleDigits = t),
+ (r.upcA = p(t, "0")),
+ (r.text =
+ n.text ||
+ "" + r.upcA[0] + t + r.upcA[r.upcA.length - 1]),
+ (r.isValid = !0);
+ else {
+ if (-1 === t.search(/^[01][0-9]{7}$/)) return f(r);
+ if (
+ ((r.middleDigits = t.substring(1, t.length - 1)),
+ (r.upcA = p(r.middleDigits, t[0])),
+ r.upcA[r.upcA.length - 1] !== t[t.length - 1])
+ )
+ return f(r);
+ r.isValid = !0;
+ }
+ return (
+ (r.displayValue = n.displayValue),
+ n.fontSize > 10 * n.width
+ ? (r.fontSize = 10 * n.width)
+ : (r.fontSize = n.fontSize),
+ (r.guardHeight =
+ n.height + r.fontSize / 2 + n.textMargin),
+ r
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ r(e, [
+ {
+ key: "valid",
+ value: function () {
+ return this.isValid;
+ },
+ },
+ {
+ key: "encode",
+ value: function () {
+ return this.options.flat
+ ? this.flatEncoding()
+ : this.guardedEncoding();
+ },
+ },
+ {
+ key: "flatEncoding",
+ value: function () {
+ var t = "";
+ return (
+ (t += "101"),
+ (t += this.encodeMiddleDigits()),
+ { data: (t += "010101"), text: this.text }
+ );
+ },
+ },
+ {
+ key: "guardedEncoding",
+ value: function () {
+ var t = [];
+ return (
+ this.displayValue &&
+ t.push({
+ data: "00000000",
+ text: this.text[0],
+ options: {
+ textAlign: "left",
+ fontSize: this.fontSize,
+ },
+ }),
+ t.push({
+ data: "101",
+ options: { height: this.guardHeight },
+ }),
+ t.push({
+ data: this.encodeMiddleDigits(),
+ text: this.text.substring(1, 7),
+ options: { fontSize: this.fontSize },
+ }),
+ t.push({
+ data: "010101",
+ options: { height: this.guardHeight },
+ }),
+ this.displayValue &&
+ t.push({
+ data: "00000000",
+ text: this.text[7],
+ options: {
+ textAlign: "right",
+ fontSize: this.fontSize,
+ },
+ }),
+ t
+ );
+ },
+ },
+ {
+ key: "encodeMiddleDigits",
+ value: function () {
+ var t = this.upcA[0],
+ e = this.upcA[this.upcA.length - 1],
+ n = s[parseInt(e)][parseInt(t)];
+ return (0, o.default)(this.middleDigits, n);
+ },
+ },
+ ]),
+ e
+ );
+ })(i.default);
+ function p(t, e) {
+ for (
+ var n = parseInt(t[t.length - 1]),
+ r = c[n],
+ o = "",
+ i = 0,
+ u = 0;
+ u < r.length;
+ u++
+ ) {
+ var f = r[u];
+ o += "X" === f ? t[i++] : f;
+ }
+ return "" + (o = "" + e + o) + (0, a.checksum)(o);
+ }
+ e.default = l;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 }),
+ (e.ITF14 = e.ITF = void 0);
+ var r = i(n(10)),
+ o = i(n(32));
+ function i(t) {
+ return t && t.__esModule ? t : { default: t };
+ }
+ (e.ITF = r.default), (e.ITF14 = o.default);
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ (e.START_BIN = "1010"),
+ (e.END_BIN = "11101"),
+ (e.BINARIES = [
+ "00110",
+ "10001",
+ "01001",
+ "11000",
+ "00101",
+ "10100",
+ "01100",
+ "00011",
+ "10010",
+ "01010",
+ ]);
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r,
+ o = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ i = n(10),
+ a = (r = i) && r.__esModule ? r : { default: r };
+ var u = function (t) {
+ var e = t
+ .substr(0, 13)
+ .split("")
+ .map(function (t) {
+ return parseInt(t, 10);
+ })
+ .reduce(function (t, e, n) {
+ return t + e * (3 - (n % 2) * 2);
+ }, 0);
+ return 10 * Math.ceil(e / 10) - e;
+ },
+ f = (function (t) {
+ function e(t, n) {
+ return (
+ (function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ -1 !== t.search(/^[0-9]{13}$/) && (t += u(t)),
+ (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ t,
+ n
+ )
+ )
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ o(e, [
+ {
+ key: "valid",
+ value: function () {
+ return (
+ -1 !== this.data.search(/^[0-9]{14}$/) &&
+ +this.data[13] === u(this.data)
+ );
+ },
+ },
+ ]),
+ e
+ );
+ })(a.default);
+ e.default = f;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 }),
+ (e.MSI1110 = e.MSI1010 = e.MSI11 = e.MSI10 = e.MSI = void 0);
+ var r = f(n(4)),
+ o = f(n(34)),
+ i = f(n(35)),
+ a = f(n(36)),
+ u = f(n(37));
+ function f(t) {
+ return t && t.__esModule ? t : { default: t };
+ }
+ (e.MSI = r.default),
+ (e.MSI10 = o.default),
+ (e.MSI11 = i.default),
+ (e.MSI1010 = a.default),
+ (e.MSI1110 = u.default);
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r,
+ o = n(4),
+ i = (r = o) && r.__esModule ? r : { default: r },
+ a = n(6);
+ var u = (function (t) {
+ function e(t, n) {
+ return (
+ (function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ t + (0, a.mod10)(t),
+ n
+ )
+ )
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ e
+ );
+ })(i.default);
+ e.default = u;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r,
+ o = n(4),
+ i = (r = o) && r.__esModule ? r : { default: r },
+ a = n(6);
+ var u = (function (t) {
+ function e(t, n) {
+ return (
+ (function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ t + (0, a.mod11)(t),
+ n
+ )
+ )
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ e
+ );
+ })(i.default);
+ e.default = u;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r,
+ o = n(4),
+ i = (r = o) && r.__esModule ? r : { default: r },
+ a = n(6);
+ var u = (function (t) {
+ function e(t, n) {
+ return (
+ (function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ (t += (0, a.mod10)(t)),
+ (t += (0, a.mod10)(t)),
+ (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ t,
+ n
+ )
+ )
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ e
+ );
+ })(i.default);
+ e.default = u;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r,
+ o = n(4),
+ i = (r = o) && r.__esModule ? r : { default: r },
+ a = n(6);
+ var u = (function (t) {
+ function e(t, n) {
+ return (
+ (function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ (t += (0, a.mod11)(t)),
+ (t += (0, a.mod10)(t)),
+ (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ t,
+ n
+ )
+ )
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ e
+ );
+ })(i.default);
+ e.default = u;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 }),
+ (e.pharmacode = void 0);
+ var r,
+ o = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ i = n(0);
+ var a = (function (t) {
+ function e(t, n) {
+ !(function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e);
+ var r = (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)
+ );
+ return (r.number = parseInt(t, 10)), r;
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ o(e, [
+ {
+ key: "encode",
+ value: function () {
+ for (
+ var t = this.number, e = "";
+ !isNaN(t) && 0 != t;
+
+ )
+ t % 2 == 0
+ ? ((e = "11100" + e), (t = (t - 2) / 2))
+ : ((e = "100" + e), (t = (t - 1) / 2));
+ return {
+ data: (e = e.slice(0, -2)),
+ text: this.text,
+ };
+ },
+ },
+ {
+ key: "valid",
+ value: function () {
+ return this.number >= 3 && this.number <= 131070;
+ },
+ },
+ ]),
+ e
+ );
+ })(((r = i) && r.__esModule ? r : { default: r }).default);
+ e.pharmacode = a;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 }),
+ (e.codabar = void 0);
+ var r,
+ o = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ i = n(0);
+ var a = (function (t) {
+ function e(t, n) {
+ !(function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ 0 === t.search(/^[0-9\-\$\:\.\+\/]+$/) &&
+ (t = "A" + t + "A");
+ var r = (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ t.toUpperCase(),
+ n
+ )
+ );
+ return (
+ (r.text = r.options.text || r.text.replace(/[A-D]/g, "")), r
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ o(e, [
+ {
+ key: "valid",
+ value: function () {
+ return (
+ -1 !==
+ this.data.search(
+ /^[A-D][0-9\-\$\:\.\+\/]+[A-D]$/
+ )
+ );
+ },
+ },
+ {
+ key: "encode",
+ value: function () {
+ for (
+ var t = [], e = this.getEncodings(), n = 0;
+ n < this.data.length;
+ n++
+ )
+ t.push(e[this.data.charAt(n)]),
+ n !== this.data.length - 1 && t.push("0");
+ return { text: this.text, data: t.join("") };
+ },
+ },
+ {
+ key: "getEncodings",
+ value: function () {
+ return {
+ 0: "101010011",
+ 1: "101011001",
+ 2: "101001011",
+ 3: "110010101",
+ 4: "101101001",
+ 5: "110101001",
+ 6: "100101011",
+ 7: "100101101",
+ 8: "100110101",
+ 9: "110100101",
+ "-": "101001101",
+ $: "101100101",
+ ":": "1101011011",
+ "/": "1101101011",
+ ".": "1101101101",
+ "+": "1011011011",
+ A: "1011001001",
+ B: "1001001011",
+ C: "1010010011",
+ D: "1010011001",
+ };
+ },
+ },
+ ]),
+ e
+ );
+ })(((r = i) && r.__esModule ? r : { default: r }).default);
+ e.codabar = a;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 }),
+ (e.GenericBarcode = void 0);
+ var r,
+ o = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ i = n(0);
+ var a = (function (t) {
+ function e(t, n) {
+ return (
+ (function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, e),
+ (function (t, e) {
+ if (!t)
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ return !e ||
+ ("object" != typeof e && "function" != typeof e)
+ ? t
+ : e;
+ })(
+ this,
+ (e.__proto__ || Object.getPrototypeOf(e)).call(
+ this,
+ t,
+ n
+ )
+ )
+ );
+ }
+ return (
+ (function (t, e) {
+ if ("function" != typeof e && null !== e)
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof e
+ );
+ (t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ enumerable: !1,
+ writable: !0,
+ configurable: !0,
+ },
+ })),
+ e &&
+ (Object.setPrototypeOf
+ ? Object.setPrototypeOf(t, e)
+ : (t.__proto__ = e));
+ })(e, t),
+ o(e, [
+ {
+ key: "encode",
+ value: function () {
+ return {
+ data: "10101010101010101010101010101010101010101",
+ text: this.text,
+ };
+ },
+ },
+ {
+ key: "valid",
+ value: function () {
+ return !0;
+ },
+ },
+ ]),
+ e
+ );
+ })(((r = i) && r.__esModule ? r : { default: r }).default);
+ e.GenericBarcode = a;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 }),
+ (e.default = function (t) {
+ var e = [];
+ return (
+ (function t(n) {
+ if (Array.isArray(n))
+ for (var r = 0; r < n.length; r++) t(n[r]);
+ else
+ (n.text = n.text || ""),
+ (n.data = n.data || ""),
+ e.push(n);
+ })(t),
+ e
+ );
+ });
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 }),
+ (e.default = function (t) {
+ return (
+ (t.marginTop = t.marginTop || t.margin),
+ (t.marginBottom = t.marginBottom || t.margin),
+ (t.marginRight = t.marginRight || t.margin),
+ (t.marginLeft = t.marginLeft || t.margin),
+ t
+ );
+ });
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r =
+ "function" == typeof Symbol &&
+ "symbol" == typeof Symbol.iterator
+ ? function (t) {
+ return typeof t;
+ }
+ : function (t) {
+ return t &&
+ "function" == typeof Symbol &&
+ t.constructor === Symbol &&
+ t !== Symbol.prototype
+ ? "symbol"
+ : typeof t;
+ },
+ o = u(n(44)),
+ i = u(n(45)),
+ a = n(14);
+ function u(t) {
+ return t && t.__esModule ? t : { default: t };
+ }
+ function f(t) {
+ if ("string" == typeof t)
+ return (function (t) {
+ var e = document.querySelectorAll(t);
+ if (0 === e.length) return;
+ for (var n = [], r = 0; r < e.length; r++) n.push(f(e[r]));
+ return n;
+ })(t);
+ if (Array.isArray(t)) {
+ for (var e = [], n = 0; n < t.length; n++) e.push(f(t[n]));
+ return e;
+ }
+ if (
+ "undefined" != typeof HTMLCanvasElement &&
+ t instanceof HTMLImageElement
+ )
+ return (
+ (u = t),
+ {
+ element: (c = document.createElement("canvas")),
+ options: (0, o.default)(u),
+ renderer: i.default.CanvasRenderer,
+ afterRender: function () {
+ u.setAttribute("src", c.toDataURL());
+ },
+ }
+ );
+ if (
+ (t && t.nodeName && "svg" === t.nodeName.toLowerCase()) ||
+ ("undefined" != typeof SVGElement && t instanceof SVGElement)
+ )
+ return {
+ element: t,
+ options: (0, o.default)(t),
+ renderer: i.default.SVGRenderer,
+ };
+ if (
+ "undefined" != typeof HTMLCanvasElement &&
+ t instanceof HTMLCanvasElement
+ )
+ return {
+ element: t,
+ options: (0, o.default)(t),
+ renderer: i.default.CanvasRenderer,
+ };
+ if (t && t.getContext)
+ return { element: t, renderer: i.default.CanvasRenderer };
+ if (
+ t &&
+ "object" === (void 0 === t ? "undefined" : r(t)) &&
+ !t.nodeName
+ )
+ return { element: t, renderer: i.default.ObjectRenderer };
+ throw new a.InvalidElementException();
+ var u, c;
+ }
+ e.default = f;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r = i(n(11)),
+ o = i(n(12));
+ function i(t) {
+ return t && t.__esModule ? t : { default: t };
+ }
+ e.default = function (t) {
+ var e = {};
+ for (var n in o.default)
+ o.default.hasOwnProperty(n) &&
+ (t.hasAttribute("jsbarcode-" + n.toLowerCase()) &&
+ (e[n] = t.getAttribute("jsbarcode-" + n.toLowerCase())),
+ t.hasAttribute("data-" + n.toLowerCase()) &&
+ (e[n] = t.getAttribute("data-" + n.toLowerCase())));
+ return (
+ (e.value =
+ t.getAttribute("jsbarcode-value") ||
+ t.getAttribute("data-value")),
+ (e = (0, r.default)(e))
+ );
+ };
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r = a(n(46)),
+ o = a(n(47)),
+ i = a(n(48));
+ function a(t) {
+ return t && t.__esModule ? t : { default: t };
+ }
+ e.default = {
+ CanvasRenderer: r.default,
+ SVGRenderer: o.default,
+ ObjectRenderer: i.default,
+ };
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r,
+ o = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ i = n(7),
+ a = (r = i) && r.__esModule ? r : { default: r },
+ u = n(13);
+ var f = (function () {
+ function t(e, n, r) {
+ !(function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, t),
+ (this.canvas = e),
+ (this.encodings = n),
+ (this.options = r);
+ }
+ return (
+ o(t, [
+ {
+ key: "render",
+ value: function () {
+ if (!this.canvas.getContext)
+ throw new Error(
+ "The browser does not support canvas."
+ );
+ this.prepareCanvas();
+ for (var t = 0; t < this.encodings.length; t++) {
+ var e = (0, a.default)(
+ this.options,
+ this.encodings[t].options
+ );
+ this.drawCanvasBarcode(e, this.encodings[t]),
+ this.drawCanvasText(e, this.encodings[t]),
+ this.moveCanvasDrawing(this.encodings[t]);
+ }
+ this.restoreCanvas();
+ },
+ },
+ {
+ key: "prepareCanvas",
+ value: function () {
+ var t = this.canvas.getContext("2d");
+ t.save(),
+ (0, u.calculateEncodingAttributes)(
+ this.encodings,
+ this.options,
+ t
+ );
+ var e = (0, u.getTotalWidthOfEncodings)(
+ this.encodings
+ ),
+ n = (0, u.getMaximumHeightOfEncodings)(
+ this.encodings
+ );
+ (this.canvas.width =
+ e +
+ this.options.marginLeft +
+ this.options.marginRight),
+ (this.canvas.height = n),
+ t.clearRect(
+ 0,
+ 0,
+ this.canvas.width,
+ this.canvas.height
+ ),
+ this.options.background &&
+ ((t.fillStyle = this.options.background),
+ t.fillRect(
+ 0,
+ 0,
+ this.canvas.width,
+ this.canvas.height
+ )),
+ t.translate(this.options.marginLeft, 0);
+ },
+ },
+ {
+ key: "drawCanvasBarcode",
+ value: function (t, e) {
+ var n,
+ r = this.canvas.getContext("2d"),
+ o = e.data;
+ (n =
+ "top" == t.textPosition
+ ? t.marginTop + t.fontSize + t.textMargin
+ : t.marginTop),
+ (r.fillStyle = t.lineColor);
+ for (var i = 0; i < o.length; i++) {
+ var a = i * t.width + e.barcodePadding;
+ "1" === o[i]
+ ? r.fillRect(a, n, t.width, t.height)
+ : o[i] &&
+ r.fillRect(
+ a,
+ n,
+ t.width,
+ t.height * o[i]
+ );
+ }
+ },
+ },
+ {
+ key: "drawCanvasText",
+ value: function (t, e) {
+ var n,
+ r,
+ o = this.canvas.getContext("2d"),
+ i =
+ t.fontOptions +
+ " " +
+ t.fontSize +
+ "px " +
+ t.font;
+ t.displayValue &&
+ ((r =
+ "top" == t.textPosition
+ ? t.marginTop +
+ t.fontSize -
+ t.textMargin
+ : t.height +
+ t.textMargin +
+ t.marginTop +
+ t.fontSize),
+ (o.font = i),
+ "left" == t.textAlign || e.barcodePadding > 0
+ ? ((n = 0), (o.textAlign = "left"))
+ : "right" == t.textAlign
+ ? ((n = e.width - 1),
+ (o.textAlign = "right"))
+ : ((n = e.width / 2),
+ (o.textAlign = "center")),
+ o.fillText(e.text, n, r));
+ },
+ },
+ {
+ key: "moveCanvasDrawing",
+ value: function (t) {
+ this.canvas.getContext("2d").translate(t.width, 0);
+ },
+ },
+ {
+ key: "restoreCanvas",
+ value: function () {
+ this.canvas.getContext("2d").restore();
+ },
+ },
+ ]),
+ t
+ );
+ })();
+ e.default = f;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r,
+ o = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })(),
+ i = n(7),
+ a = (r = i) && r.__esModule ? r : { default: r },
+ u = n(13);
+ var f = "http://www.w3.org/2000/svg",
+ c = (function () {
+ function t(e, n, r) {
+ !(function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, t),
+ (this.svg = e),
+ (this.encodings = n),
+ (this.options = r),
+ (this.document = r.xmlDocument || document);
+ }
+ return (
+ o(t, [
+ {
+ key: "render",
+ value: function () {
+ var t = this.options.marginLeft;
+ this.prepareSVG();
+ for (
+ var e = 0;
+ e < this.encodings.length;
+ e++
+ ) {
+ var n = this.encodings[e],
+ r = (0, a.default)(
+ this.options,
+ n.options
+ ),
+ o = this.createGroup(
+ t,
+ r.marginTop,
+ this.svg
+ );
+ this.setGroupOptions(o, r),
+ this.drawSvgBarcode(o, r, n),
+ this.drawSVGText(o, r, n),
+ (t += n.width);
+ }
+ },
+ },
+ {
+ key: "prepareSVG",
+ value: function () {
+ for (; this.svg.firstChild; )
+ this.svg.removeChild(this.svg.firstChild);
+ (0, u.calculateEncodingAttributes)(
+ this.encodings,
+ this.options
+ );
+ var t = (0, u.getTotalWidthOfEncodings)(
+ this.encodings
+ ),
+ e = (0, u.getMaximumHeightOfEncodings)(
+ this.encodings
+ ),
+ n =
+ t +
+ this.options.marginLeft +
+ this.options.marginRight;
+ this.setSvgAttributes(n, e),
+ this.options.background &&
+ this.drawRect(
+ 0,
+ 0,
+ n,
+ e,
+ this.svg
+ ).setAttribute(
+ "style",
+ "fill:" +
+ this.options.background +
+ ";"
+ );
+ },
+ },
+ {
+ key: "drawSvgBarcode",
+ value: function (t, e, n) {
+ var r,
+ o = n.data;
+ r =
+ "top" == e.textPosition
+ ? e.fontSize + e.textMargin
+ : 0;
+ for (var i = 0, a = 0, u = 0; u < o.length; u++)
+ (a = u * e.width + n.barcodePadding),
+ "1" === o[u]
+ ? i++
+ : i > 0 &&
+ (this.drawRect(
+ a - e.width * i,
+ r,
+ e.width * i,
+ e.height,
+ t
+ ),
+ (i = 0));
+ i > 0 &&
+ this.drawRect(
+ a - e.width * (i - 1),
+ r,
+ e.width * i,
+ e.height,
+ t
+ );
+ },
+ },
+ {
+ key: "drawSVGText",
+ value: function (t, e, n) {
+ var r,
+ o,
+ i = this.document.createElementNS(
+ f,
+ "text"
+ );
+ e.displayValue &&
+ (i.setAttribute(
+ "style",
+ "font:" +
+ e.fontOptions +
+ " " +
+ e.fontSize +
+ "px " +
+ e.font
+ ),
+ (o =
+ "top" == e.textPosition
+ ? e.fontSize - e.textMargin
+ : e.height +
+ e.textMargin +
+ e.fontSize),
+ "left" == e.textAlign ||
+ n.barcodePadding > 0
+ ? ((r = 0),
+ i.setAttribute(
+ "text-anchor",
+ "start"
+ ))
+ : "right" == e.textAlign
+ ? ((r = n.width - 1),
+ i.setAttribute("text-anchor", "end"))
+ : ((r = n.width / 2),
+ i.setAttribute(
+ "text-anchor",
+ "middle"
+ )),
+ i.setAttribute("x", r),
+ i.setAttribute("y", o),
+ i.appendChild(
+ this.document.createTextNode(n.text)
+ ),
+ t.appendChild(i));
+ },
+ },
+ {
+ key: "setSvgAttributes",
+ value: function (t, e) {
+ var n = this.svg;
+ n.setAttribute("width", t + "px"),
+ n.setAttribute("height", e + "px"),
+ n.setAttribute("x", "0px"),
+ n.setAttribute("y", "0px"),
+ n.setAttribute(
+ "viewBox",
+ "0 0 " + t + " " + e
+ ),
+ n.setAttribute("xmlns", f),
+ n.setAttribute("version", "1.1"),
+ n.setAttribute(
+ "style",
+ "transform: translate(0,0)"
+ );
+ },
+ },
+ {
+ key: "createGroup",
+ value: function (t, e, n) {
+ var r = this.document.createElementNS(f, "g");
+ return (
+ r.setAttribute(
+ "transform",
+ "translate(" + t + ", " + e + ")"
+ ),
+ n.appendChild(r),
+ r
+ );
+ },
+ },
+ {
+ key: "setGroupOptions",
+ value: function (t, e) {
+ t.setAttribute(
+ "style",
+ "fill:" + e.lineColor + ";"
+ );
+ },
+ },
+ {
+ key: "drawRect",
+ value: function (t, e, n, r, o) {
+ var i = this.document.createElementNS(
+ f,
+ "rect"
+ );
+ return (
+ i.setAttribute("x", t),
+ i.setAttribute("y", e),
+ i.setAttribute("width", n),
+ i.setAttribute("height", r),
+ o.appendChild(i),
+ i
+ );
+ },
+ },
+ ]),
+ t
+ );
+ })();
+ e.default = c;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })();
+ var o = (function () {
+ function t(e, n, r) {
+ !(function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, t),
+ (this.object = e),
+ (this.encodings = n),
+ (this.options = r);
+ }
+ return (
+ r(t, [
+ {
+ key: "render",
+ value: function () {
+ this.object.encodings = this.encodings;
+ },
+ },
+ ]),
+ t
+ );
+ })();
+ e.default = o;
+ },
+ function (t, e, n) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", { value: !0 });
+ var r = (function () {
+ function t(t, e) {
+ for (var n = 0; n < e.length; n++) {
+ var r = e[n];
+ (r.enumerable = r.enumerable || !1),
+ (r.configurable = !0),
+ "value" in r && (r.writable = !0),
+ Object.defineProperty(t, r.key, r);
+ }
+ }
+ return function (e, n, r) {
+ return n && t(e.prototype, n), r && t(e, r), e;
+ };
+ })();
+ var o = (function () {
+ function t(e) {
+ !(function (t, e) {
+ if (!(t instanceof e))
+ throw new TypeError(
+ "Cannot call a class as a function"
+ );
+ })(this, t),
+ (this.api = e);
+ }
+ return (
+ r(t, [
+ {
+ key: "handleCatch",
+ value: function (t) {
+ if ("InvalidInputException" !== t.name) throw t;
+ if (
+ this.api._options.valid ===
+ this.api._defaults.valid
+ )
+ throw t.message;
+ this.api._options.valid(!1),
+ (this.api.render = function () {});
+ },
+ },
+ {
+ key: "wrapBarcodeCall",
+ value: function (t) {
+ try {
+ var e = t.apply(void 0, arguments);
+ return this.api._options.valid(!0), e;
+ } catch (t) {
+ return this.handleCatch(t), this.api;
+ }
+ },
+ },
+ ]),
+ t
+ );
+ })();
+ e.default = o;
+ },
+]);
diff --git a/src/utils/load.js b/src/utils/load.js
new file mode 100644
index 00000000..fa3ebc21
--- /dev/null
+++ b/src/utils/load.js
@@ -0,0 +1,60 @@
+/**
+ * loadJS 异步加载远程JS
+ * @constructor
+ * @param {string} src - 必填,需要加载的URL路径
+ * @param {string} keyName - 必填,唯一key和JS返回的全局的对象名
+ * @param {string} callbackName - 非必填,如果远程JS有callback,则可更有效的判断是否完成加载
+ */
+export function loadJS (src, keyName, callbackName) {
+ return new Promise((resolve, reject) => {
+ let has = document.head.querySelector("script[loadKey="+keyName+"]")
+ if(has){
+ return resolve(window[keyName])
+ }
+ let script = document.createElement("script")
+ script.type = "text/javascript"
+ script.src = src
+ script.setAttribute("loadKey", keyName)
+ document.head.appendChild(script)
+ script.onload = () => {
+ if(callbackName){
+ window[callbackName] = () => {
+ return resolve(window[keyName])
+ }
+ }else{
+ setTimeout(()=>{
+ return resolve(window[keyName])
+ },50)
+ }
+ }
+ script.onerror = (err) => {
+ return reject(err)
+ }
+ })
+}
+
+/**
+ * loadCSS 异步加载远程css
+ * @constructor
+ * @param {string} src - 必填,需要加载的URL路径
+ * @param {string} keyName - 必填,唯一key
+ */
+export function loadCSS (src, keyName) {
+ return new Promise((resolve, reject) => {
+ let has = document.head.querySelector("link[loadKey="+keyName+"]")
+ if(has){
+ return resolve()
+ }
+ let link = document.createElement('link')
+ link.rel = "stylesheet"
+ link.href = src
+ link.setAttribute("loadKey", keyName)
+ document.head.appendChild(link)
+ link.onload = () => {
+ return resolve()
+ }
+ link.onerror = (err) => {
+ return reject(err)
+ }
+ })
+}
diff --git a/src/utils/permission.js b/src/utils/permission.js
new file mode 100644
index 00000000..c826b4c1
--- /dev/null
+++ b/src/utils/permission.js
@@ -0,0 +1,58 @@
+import tool from '@/utils/tool';
+
+/**
+ * 是否含有不限分类,有则表示全部允许通过
+ */
+export function permissionAll() {
+ const allPermissions = "*/*/*"
+ let permissions = tool.data.get("PERMISSIONS");
+ return permissions.includes(allPermissions);
+}
+
+/**
+ * 比对两组数据是否一致
+ * @param news
+ * @param old
+ * @returns {boolean}
+ */
+export function judementSameArr(news, old) {
+ // console.log(news)
+ // console.log(old)
+ let count = 0;
+ const leng = news.length;
+ for (let i in news) {
+ for (let j in old) {
+ if (news[i] === old[j]) {
+ count++;
+ // console.log(news[i])
+ }
+ }
+ }
+ // console.log('相同的数量', count)
+ return count === leng;
+}
+
+export function permission(data) {
+ let permissions = tool.data.get("PERMISSIONS");
+ if (permissions.indexOf('superuser')>-1){
+ return true
+ }
+ if(!permissions){
+ return false;
+ }
+ let isHave = permissions.includes(data);
+ return isHave;
+}
+
+export function rolePermission(data) {
+ let userInfo = tool.data.get("USER_INFO");
+ if(!userInfo){
+ return false;
+ }
+ let role = userInfo.role;
+ if(!role){
+ return false;
+ }
+ let isHave = role.includes(data);
+ return isHave;
+}
diff --git a/src/utils/preventReClick.js b/src/utils/preventReClick.js
new file mode 100644
index 00000000..97aa1e52
--- /dev/null
+++ b/src/utils/preventReClick.js
@@ -0,0 +1,14 @@
+export default (app) => {
+ app.directive('preventReClick', {
+ mounted(el, binding) {
+ el.addEventListener('click', () => {
+ if (!el.disabled) {
+ el.disabled = true
+ setTimeout(() => {
+ el.disabled = false
+ }, binding.value || 3000)
+ }
+ })
+ }
+ })
+}
\ No newline at end of file
diff --git a/src/utils/print.js b/src/utils/print.js
new file mode 100644
index 00000000..fb6d422b
--- /dev/null
+++ b/src/utils/print.js
@@ -0,0 +1,137 @@
+// 打印类属性、方法定义
+/* eslint-disable */
+const Print = function(dom, options) {
+ if (!(this instanceof Print)) return new Print(dom, options);
+
+ this.options = this.extend({
+ 'noPrint': '.no-print'
+ }, options);
+
+ if ((typeof dom) === "string") {
+ try{
+ this.dom = document.querySelector(dom);
+ }catch{
+ var createDom = document.createElement("div")
+ createDom.innerHTML = dom
+ this.dom = createDom;
+ };
+ } else {
+ this.isDOM(dom)
+ this.dom = this.isDOM(dom) ? dom : dom.$el;
+ }
+
+ this.init();
+};
+Print.prototype = {
+ init: function() {
+ var content = this.getStyle() + this.getHtml();
+ this.writeIframe(content);
+ },
+ extend: function(obj, obj2) {
+ for (var k in obj2) {
+ obj[k] = obj2[k];
+ }
+ return obj;
+ },
+
+ getStyle: function() {
+ var str = "",
+ styles = document.querySelectorAll('style,link');
+ for (var i = 0; i < styles.length; i++) {
+ str += styles[i].outerHTML;
+ }
+ str += "";
+ str += "";
+ return str;
+ },
+
+ getHtml: function() {
+ var inputs = document.querySelectorAll('input');
+ var textareas = document.querySelectorAll('textarea');
+ var selects = document.querySelectorAll('select');
+
+ for (var k = 0; k < inputs.length; k++) {
+ if (inputs[k].type == "checkbox" || inputs[k].type == "radio") {
+ if (inputs[k].checked == true) {
+ inputs[k].setAttribute('checked', "checked")
+ } else {
+ inputs[k].removeAttribute('checked')
+ }
+ } else if (inputs[k].type == "text") {
+ inputs[k].setAttribute('value', inputs[k].value)
+ } else {
+ inputs[k].setAttribute('value', inputs[k].value)
+ }
+ }
+
+ for (var k2 = 0; k2 < textareas.length; k2++) {
+ if (textareas[k2].type == 'textarea') {
+ textareas[k2].innerHTML = textareas[k2].value
+ }
+ }
+
+ for (var k3 = 0; k3 < selects.length; k3++) {
+ if (selects[k3].type == 'select-one') {
+ var child = selects[k3].children;
+ for (var i in child) {
+ if (child[i].tagName == 'OPTION') {
+ if (child[i].selected == true) {
+ child[i].setAttribute('selected', "selected")
+ } else {
+ child[i].removeAttribute('selected')
+ }
+ }
+ }
+ }
+ }
+
+ return this.dom.outerHTML;
+ },
+
+ writeIframe: function(content) {
+ var w, doc, iframe = document.createElement('iframe'),
+ f = document.body.appendChild(iframe);
+ iframe.id = "myIframe";
+ //iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;";
+ iframe.setAttribute('style', 'position:absolute;width:0;height:0;top:-10px;left:-10px;');
+ w = f.contentWindow || f.contentDocument;
+ doc = f.contentDocument || f.contentWindow.document;
+ doc.open();
+ doc.write(content);
+ doc.close();
+ var _this = this
+ iframe.onload = function() {
+ _this.toPrint(w);
+ setTimeout(function() {
+ document.body.removeChild(iframe)
+ }, 100)
+ }
+ },
+
+ toPrint: function(frameWindow) {
+ try {
+ setTimeout(function() {
+ frameWindow.focus();
+ try {
+ if (!frameWindow.document.execCommand('print', false, null)) {
+ frameWindow.print();
+ }
+ } catch (e) {
+ frameWindow.print();
+ }
+ frameWindow.close();
+ }, 10);
+ } catch (err) {
+ console.log('err', err);
+ }
+ },
+ isDOM: (typeof HTMLElement === 'object') ?
+ function(obj) {
+ return obj instanceof HTMLElement;
+ } : function(obj) {
+ return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';
+ }
+};
+
+export default Print
diff --git a/src/utils/print2.js b/src/utils/print2.js
new file mode 100644
index 00000000..99bc0198
--- /dev/null
+++ b/src/utils/print2.js
@@ -0,0 +1,171 @@
+// 打印类属性、方法定义
+/* eslint-disable */
+const Print = function (dom, options) {
+ if (!(this instanceof Print)) return new Print(dom, options);
+
+ this.options = this.extend({
+ 'noPrint': '.no-print'
+ }, options);
+
+ if ((typeof dom) === "string") {
+ this.dom = document.querySelector(dom);
+ } else {
+ this.isDOM(dom)
+ this.dom = this.isDOM(dom) ? dom : dom.$el;
+ }
+
+ this.init();
+ };
+ Print.prototype = {
+ init: function () {
+ var content = this.getStyle() + this.getHtml();
+ this.writeIframe(content);
+ },
+ extend: function (obj, obj2) {
+ for (var k in obj2) {
+ obj[k] = obj2[k];
+ }
+ return obj;
+ },
+
+ getStyle: function () {
+ var str = "",
+ styles = document.querySelectorAll('style,link');
+ for (var i = 0; i < styles.length; i++) {
+ str += styles[i].outerHTML;
+ }
+ str += "";
+ // 去除height:100%样式,解决分页下,样式混乱问题
+ str += "";
+
+ return str;
+ },
+
+ getHtml: function () {
+ var inputs = document.querySelectorAll('input');
+ var textareas = document.querySelectorAll('textarea');
+ var selects = document.querySelectorAll('select');
+ var canvass = document.querySelectorAll('canvas');
+
+ for (var k = 0; k < inputs.length; k++) {
+ if (inputs[k].type == "checkbox" || inputs[k].type == "radio") {
+ if (inputs[k].checked == true) {
+ inputs[k].setAttribute('checked', "checked")
+ } else {
+ inputs[k].removeAttribute('checked')
+ }
+ } else if (inputs[k].type == "text") {
+ inputs[k].setAttribute('value', inputs[k].value)
+ } else {
+ inputs[k].setAttribute('value', inputs[k].value)
+ }
+ }
+
+ for (var k2 = 0; k2 < textareas.length; k2++) {
+ if (textareas[k2].type == 'textarea') {
+ textareas[k2].innerHTML = textareas[k2].value
+ }
+ }
+
+ for (var k3 = 0; k3 < selects.length; k3++) {
+ if (selects[k3].type == 'select-one') {
+ var child = selects[k3].children;
+ for (var i in child) {
+ if (child[i].tagName == 'OPTION') {
+ if (child[i].selected == true) {
+ child[i].setAttribute('selected', "selected")
+ } else {
+ child[i].removeAttribute('selected')
+ }
+ }
+ }
+ }
+ }
+
+ //canvass echars图表转为图片
+ for (var k4 = 0; k4 < canvass.length; k4++) {
+ var imageURL = canvass[k4].toDataURL("image/png");
+ var img = document.createElement("img");
+ img.src = imageURL;
+ img.setAttribute('style', 'max-width: 100%;');
+ img.className = 'isNeedRemove'
+ // canvass[k4].style.display = 'none'
+ // canvass[k4].parentNode.style.width = '100%'
+ // canvass[k4].parentNode.style.textAlign = 'center'
+ canvass[k4].parentNode.insertBefore(img,canvass[k4].nextElementSibling);
+ }
+
+ // 包裹要打印的元素
+ // fix: https://github.com/xyl66/vuePlugs_printjs/issues/36
+ // return this.wrapperRefDom(this.dom).outerHTML;
+ return this.dom.outerHTML;
+ },
+ // 向父级元素循环,包裹当前需要打印的元素
+ // 防止根级别开头的 css 选择器不生效
+ wrapperRefDom: function (refDom) {
+ let prevDom = null
+ let currDom = refDom
+ while (currDom && currDom.tagName.toLowerCase() !== 'body') {
+ if (prevDom) {
+ let element = currDom.cloneNode(false)
+ element.appendChild(prevDom)
+ prevDom = element
+ } else {
+ prevDom = currDom.cloneNode(true)
+ }
+
+ currDom = currDom.parentElement
+ }
+
+ return currDom.tagName.toLowerCase() === 'body' ? currDom : prevDom
+ },
+
+ writeIframe: function (content) {
+ var w, doc, iframe = document.createElement('iframe'),
+ f = document.body.appendChild(iframe);
+ iframe.id = "myIframe";
+ //iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;";
+ iframe.setAttribute('style', 'position:absolute;width:0;height:0;top:-10px;left:-10px;');
+ w = f.contentWindow || f.contentDocument;
+ doc = f.contentDocument || f.contentWindow.document;
+ doc.open();
+ doc.write(content);
+ doc.close();
+ var _this = this
+ iframe.onload = function(){
+ _this.toPrint(w);
+ setTimeout(function () {
+ document.body.removeChild(iframe)
+ }, 100)
+ }
+ },
+
+ toPrint: function (frameWindow) {
+ try {
+ setTimeout(function () {
+ frameWindow.focus();
+ try {
+ if (!frameWindow.document.execCommand('print', false, null)) {
+ frameWindow.print();
+ }
+ } catch (e) {
+ frameWindow.print();
+ }
+ frameWindow.close();
+ }, 10);
+ } catch (err) {
+ console.log('err', err);
+ }
+ },
+ isDOM: (typeof HTMLElement === 'object') ?
+ function (obj) {
+ return obj instanceof HTMLElement;
+ } :
+ function (obj) {
+ return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';
+ }
+ };
+ export default (app) => {
+ app.config.globalProperties.$PRINT = Print;
+}
+
\ No newline at end of file
diff --git a/src/utils/request.js b/src/utils/request.js
new file mode 100644
index 00000000..fed0882e
--- /dev/null
+++ b/src/utils/request.js
@@ -0,0 +1,233 @@
+import axios from 'axios';
+import { ElNotification, ElMessageBox } from 'element-plus';
+import sysConfig from "@/config";
+import tool from '@/utils/tool';
+import router from '@/router';
+
+axios.defaults.baseURL = sysConfig.API_URL;
+
+axios.defaults.timeout = sysConfig.TIMEOUT;
+
+// 是否正在刷新的标记
+let isRefreshing = false;
+// 重试队列,每一项将是一个待执行的函数形式
+let requests = [];
+// HTTP request 拦截器
+axios.interceptors.request.use(
+ (config) => {
+ let token = tool.data.get("TOKEN");
+ if(token){
+ config.headers[sysConfig.TOKEN_NAME] = sysConfig.TOKEN_PREFIX + token
+ }
+ if(!sysConfig.REQUEST_CACHE && config.method == 'get'){
+ config.params = config.params || {};
+ // config.params['_'] = new Date().getTime();
+ }
+ Object.assign(config.headers, sysConfig.HEADERS)
+ return config;
+ },
+ (error) => {
+ return Promise.reject(error);
+ }
+);
+
+//FIX 多个API同时401时疯狂弹窗BUG
+let MessageBox_401_show = false
+
+// HTTP response 拦截器
+axios.interceptors.response.use(
+ (response) => {
+ return response;
+ },
+ (error) => {
+ if (error.response) {
+ if (error.response.status == 401) {
+ if(error.response.data.err_code == 'no_active_account'){
+ ElNotification.warning({
+ title: '请求失败',
+ message: "账户密码错误或已禁用"
+ });
+ }else{
+ if (error.config.url.indexOf('auth/token/refresh/') != -1) {
+ isRefreshing = false;
+ requests=[];
+ router.push('/login');
+ return
+ }
+ if (!isRefreshing) {
+ isRefreshing = true;
+ axios({
+ method: 'post',
+ url: sysConfig.API_URL+'/auth/token/refresh/',
+ headers: {
+ Authorization: `Bearer ${tool.data.get("TOKEN")}`,
+ },
+ data:{refresh:tool.data.get("TOKEN_REFRESH")}
+ }).then(res=>{
+ // 替换本地的token
+ tool.data.set("TOKEN", res.data.access);
+ tool.data.set("TOKEN_TIME", new Date().getTime());
+ error.config.headers[sysConfig.TOKEN_NAME] = sysConfig.TOKEN_PREFIX + res.data.access;
+ isRefreshing = false;
+ requests.forEach(cb => cb())
+ //发起后将requests置空
+ requests=[];
+ return axios(error.config)
+ })
+ }else{
+ //如果正在刷新token,将发起的请求暂存在requests中
+ return new Promise((resolve)=>{
+ requests.push(()=>{
+ resolve(axios(error.config));
+ })
+ })
+ }
+ }
+
+ } else {
+ if(error.response.data.err_msg=='人脸未匹配,请调整位置'){}else{
+ ElNotification.warning({
+ title: '请求失败',
+ message: error.response.data.err_msg || `Status:${error.response.status},未知错误!`
+ });
+ }
+
+ }
+ } else {
+ ElNotification.error({
+ title: '请求错误',
+ message: "请求服务器无响应!"
+ });
+ }
+ return Promise.reject(error.response);
+ }
+);
+
+var http = {
+
+ /** get 请求
+ * @param {string} url 接口地址
+ * @param {object} params 请求参数
+ * @param {object} config 参数
+ */
+ get: function(url, params={}, config={}) {
+ return new Promise((resolve, reject) => {
+ axios({
+ method: 'get',
+ url: url,
+ params: params,
+ ...config
+ }).then((response) => {
+ resolve(response.data);
+ }).catch((error) => {
+ reject(error);
+ })
+ })
+ },
+
+ /** post 请求
+ * @param {string} url 接口地址
+ * @param {object} data 请求参数
+ * @param {object} config 参数
+ */
+ post: function(url, data={}, config={}) {
+ return new Promise((resolve, reject) => {
+ axios({
+ method: 'post',
+ url: url,
+ data: data,
+ ...config
+ }).then((response) => {
+ resolve(response.data);
+ }).catch((error) => {
+ reject(error);
+ })
+ })
+ },
+
+ /** put 请求
+ * @param {string} url 接口地址
+ * @param {object} data 请求参数
+ * @param {object} config 参数
+ */
+ put: function(url, data={}, config={}) {
+ return new Promise((resolve, reject) => {
+ axios({
+ method: 'put',
+ url: url,
+ data: data,
+ ...config
+ }).then((response) => {
+ resolve(response.data);
+ }).catch((error) => {
+ reject(error);
+ })
+ })
+ },
+
+ /** patch 请求
+ * @param {string} url 接口地址
+ * @param {object} data 请求参数
+ * @param {object} config 参数
+ */
+ patch: function(url, data={}, config={}) {
+ return new Promise((resolve, reject) => {
+ axios({
+ method: 'patch',
+ url: url,
+ data: data,
+ ...config
+ }).then((response) => {
+ resolve(response.data);
+ }).catch((error) => {
+ reject(error);
+ })
+ })
+ },
+
+ /** delete 请求
+ * @param {string} url 接口地址
+ * @param {object} data 请求参数
+ * @param {object} config 参数
+ */
+ delete: function(url, data={}, config={}) {
+ return new Promise((resolve, reject) => {
+ axios({
+ method: 'delete',
+ url: url,
+ data: data,
+ ...config
+ }).then((response) => {
+ resolve(response.data);
+ }).catch((error) => {
+ reject(error);
+ })
+ })
+ },
+
+ /** jsonp 请求
+ * @param {string} url 接口地址
+ * @param {string} name JSONP回调函数名称
+ */
+ jsonp: function(url, name='jsonp'){
+ return new Promise((resolve) => {
+ var script = document.createElement('script')
+ var _id = `jsonp${Math.ceil(Math.random() * 1000000)}`
+ script.id = _id
+ script.type = 'text/javascript'
+ script.src = url
+ window[name] =(response) => {
+ resolve(response)
+ document.getElementsByTagName('head')[0].removeChild(script)
+ try {
+ delete window[name];
+ }catch(e){
+ window[name] = undefined;
+ }
+ }
+ document.getElementsByTagName('head')[0].appendChild(script)
+ })
+ }
+}
+
+export default http;
diff --git a/src/utils/template.js b/src/utils/template.js
new file mode 100644
index 00000000..e441bd63
--- /dev/null
+++ b/src/utils/template.js
@@ -0,0 +1,316 @@
+/*!
+ * template.js v0.7.1 (https://github.com/yanhaijing/template.js)
+ * API https://github.com/yanhaijing/template.js/blob/master/doc/api.md
+ * Copyright 2015 yanhaijing. All Rights Reserved
+ * Licensed under MIT (https://github.com/yanhaijing/template.js/blob/master/MIT-LICENSE.txt)
+ */
+/* eslint-disable */
+;(function(root, factory) {
+ var template = factory(root);
+ if (typeof define === 'function' && define.amd) {
+ // AMD
+ define('template', function() {
+ return template;
+ });
+ } else if (typeof exports === 'object') {
+ // Node.js
+ module.exports = template;
+ } else {
+ // Browser globals
+ var _template = root.template;
+
+ template.noConflict = function() {
+ if (root.template === template) {
+ root.template = _template;
+ }
+
+ return template;
+ };
+ root.template = template;
+ }
+}(this, function(root) {
+ 'use strict';
+ var o = {
+ sTag: '<%',//开始标签
+ eTag: '%>',//结束标签
+ compress: false,//是否压缩html
+ escape: true, //默认输出是否进行HTML转义
+ error: function (e) {}//错误回调
+ };
+ var functionMap = {}; //内部函数对象
+ //修饰器前缀
+ var modifierMap = {
+ '': function (param) {return nothing(param)},
+ 'h': function (param) {return encodeHTML(param)},
+ 'u': function (param) {return encodeURI(param)}
+ };
+
+ var toString = {}.toString;
+ var slice = [].slice;
+ function type(x) {
+ if(x === null){
+ return 'null';
+ }
+
+ var t= typeof x;
+
+ if(t !== 'object'){
+ return t;
+ }
+
+ var c = toString.call(x).slice(8, -1).toLowerCase();
+ if(c !== 'object'){
+ return c;
+ }
+
+ if(x.constructor==Object){
+ return c;
+ }
+
+ return 'unknown';
+ }
+
+ function isObject(obj) {
+ return type(obj) === 'object';
+ }
+ function isFunction(fn) {
+ return type(fn) === 'function';
+ }
+ function isString(str) {
+ return type(str) === 'string';
+ }
+ function extend() {
+ var target = arguments[0] || {};
+ var arrs = slice.call(arguments, 1);
+ var len = arrs.length;
+
+ for (var i = 0; i < len; i++) {
+ var arr = arrs[i];
+ for (var name in arr) {
+ target[name] = arr[name];
+ }
+
+ }
+ return target;
+ }
+ function clone() {
+ var args = slice.call(arguments);
+ return extend.apply(null, [{}].concat(args));
+ }
+ function nothing(param) {
+ return param;
+ }
+ function encodeHTML(source) {
+ return String(source)
+ .replace(/&/g,'&')
+ .replace(//g,'>')
+ .replace(/\\/g,'\')
+ .replace(/"/g,'"')
+ .replace(/'/g,''');
+ }
+ function compress(html) {
+ return html.replace(/\s+/g, ' ').replace(//g, '');
+ }
+ function consoleAdapter(cmd, msg) {
+ typeof console !== 'undefined' && console[cmd] && console[cmd](msg);
+ }
+ function handelError(e) {
+ var message = 'template.js error\n\n';
+
+ for (var key in e) {
+ message += '<' + key + '>\n' + e[key] + '\n\n';
+ }
+ message += '\n' + e.message + '\n\n';
+ consoleAdapter('error', message);
+
+ o.error(e);
+ function error() {
+ return 'template.js error';
+ }
+ error.toString = function () {
+ return '__code__ = "template.js error"';
+ }
+ return error;
+ }
+ function parse(tpl, opt) {
+ var code = '';
+ var sTag = opt.sTag;
+ var eTag = opt.eTag;
+ var escape = opt.escape;
+ function parsehtml(line) {
+ // 单双引号转义,换行符替换为空格
+ line = line.replace(/('|")/g, '\\$1');
+ var lineList = line.split('\n');
+ var code = '';
+ for (var i = 0; i < lineList.length; i++) {
+ code += ';__code__ += ("' + lineList[i] + (i === lineList.length - 1 ? '")\n' : '\\n")\n');
+ }
+ return code;
+ }
+ function parsejs(line) {
+ //var reg = /^(:?)(.*?)=(.*)$/;
+ var reg = /^(?:=|(:.*?)=)(.*)$/
+ var html;
+ var arr;
+ var modifier;
+
+ // = := :*=
+ // :h=123 [':h=123', 'h', '123']
+ if (arr = reg.exec(line)) {
+ html = arr[2]; // 输出
+ if (Boolean(arr[1])) {
+ // :开头
+ modifier = arr[1].slice(1);
+ } else {
+ // = 开头
+ modifier = escape ? 'h' : '';
+ }
+
+ return ';__code__ += __modifierMap__["' + modifier + '"](typeof (' + html + ') !== "undefined" ? (' + html + ') : "")\n';
+ }
+
+ //原生js
+ return ';' + line + '\n';
+ }
+
+ var tokens = tpl.split(sTag);
+
+ for (var i = 0, len = tokens.length; i < len; i++) {
+ var token = tokens[i].split(eTag);
+
+ if (token.length === 1) {
+ code += parsehtml(token[0]);
+ } else {
+ code += parsejs(token[0], true);
+ if (token[1]) {
+ code += parsehtml(token[1]);
+ }
+ }
+ }
+ return code;
+ }
+ function compiler(tpl, opt) {
+ var mainCode = parse(tpl, opt);
+
+ var headerCode = '\n' +
+ ' var html = (function (__data__, __modifierMap__) {\n' +
+ ' var __str__ = "", __code__ = "";\n' +
+ ' for(var key in __data__) {\n' +
+ ' __str__+=("var " + key + "=__data__[\'" + key + "\'];");\n' +
+ ' }\n' +
+ ' eval(__str__);\n\n';
+
+ var footerCode = '\n' +
+ ' ;return __code__;\n' +
+ ' }(__data__, __modifierMap__));\n' +
+ ' return html;\n';
+
+ var code = headerCode + mainCode + footerCode;
+ code = code.replace(/[\r]/g, ' '); // ie 7 8 会报错,不知道为什么
+ try {
+ var Render = new Function('__data__', '__modifierMap__', code);
+ Render.toString = function () {
+ return mainCode;
+ }
+ return Render;
+ } catch(e) {
+ e.temp = 'function anonymous(__data__, __modifierMap__) {' + code + '}';
+ throw e;
+ }
+ }
+ function compile(tpl, opt) {
+ opt = clone(o, opt);
+
+ try {
+ var Render = compiler(tpl, opt);
+ } catch(e) {
+ e.name = 'CompileError';
+ e.tpl = tpl;
+ e.render = e.temp;
+ delete e.temp;
+ return handelError(e);
+ }
+
+ function render(data) {
+ data = clone(functionMap, data);
+ try {
+ var html = Render(data, modifierMap);
+ html = opt.compress ? compress(html) : html;
+ return html;
+ } catch(e) {
+ e.name = 'RenderError';
+ e.tpl = tpl;
+ e.render = Render.toString();
+ return handelError(e)();
+ }
+ }
+
+ render.toString = function () {
+ return Render.toString();
+ };
+ return render;
+ }
+ function template(tpl, data) {
+ if (typeof tpl !== 'string') {
+ return '';
+ }
+
+ var fn = compile(tpl);
+ if (!isObject(data)) {
+ return fn;
+ }
+
+ return fn(data);
+ }
+
+ template.config = function (option) {
+ if (isObject(option)) {
+ o = extend(o, option);
+ }
+ return clone(o);
+ };
+
+ template.registerFunction = function(name, fn) {
+ if (!isString(name)) {
+ return clone(functionMap);
+ }
+ if (!isFunction(fn)) {
+ return functionMap[name];
+ }
+
+ return functionMap[name] = fn;
+ }
+ template.unregisterFunction = function (name) {
+ if (!isString(name)) {
+ return false;
+ }
+ delete functionMap[name];
+ return true;
+ }
+
+ template.registerModifier = function(name, fn) {
+ if (!isString(name)) {
+ return clone(modifierMap);
+ }
+ if (!isFunction(fn)) {
+ return modifierMap[name];
+ }
+
+ return modifierMap[name] = fn;
+ }
+ template.unregisterModifier = function (name) {
+ if (!isString(name)) {
+ return false;
+ }
+ delete modifierMap[name];
+ return true;
+ }
+
+ template.__encodeHTML = encodeHTML;
+ template.__compress = compress;
+ template.__handelError = handelError;
+ template.__compile = compile;
+ template.version = '0.7.1';
+ return template;
+}));
\ No newline at end of file
diff --git a/src/utils/tool.js b/src/utils/tool.js
new file mode 100644
index 00000000..0e44a085
--- /dev/null
+++ b/src/utils/tool.js
@@ -0,0 +1,279 @@
+/*
+ * @Descripttion: 工具集
+ * @version: 1.2
+ * @LastEditors: sakuya
+ * @LastEditTime: 2022年5月24日00:28:56
+ */
+
+import CryptoJS from 'crypto-js';
+import sysConfig from "@/config";
+
+const tool = {}
+
+/* localStorage */
+tool.data = {
+ set(key, data, datetime = 0) {
+ //加密
+ if(sysConfig.LS_ENCRYPTION == "AES"){
+ data = tool.crypto.AES.encrypt(JSON.stringify(data), sysConfig.LS_ENCRYPTION_key)
+ }
+ let cacheValue = {
+ content: data,
+ datetime: parseInt(datetime) === 0 ? 0 : new Date().getTime() + parseInt(datetime) * 1000
+ }
+ return localStorage.setItem(key, JSON.stringify(cacheValue))
+ },
+ get(key) {
+ try {
+ const value = JSON.parse(localStorage.getItem(key))
+ if (value) {
+ let nowTime = new Date().getTime()
+ if (nowTime > value.datetime && value.datetime != 0) {
+ localStorage.removeItem(key)
+ return null;
+ }
+ //解密
+ if(sysConfig.LS_ENCRYPTION == "AES"){
+ value.content = JSON.parse(tool.crypto.AES.decrypt(value.content, sysConfig.LS_ENCRYPTION_key))
+ }
+ return value.content
+ }
+ return null
+ } catch (err) {
+ return null
+ }
+ },
+ remove(key) {
+ return localStorage.removeItem(key)
+ },
+ clear() {
+ return localStorage.clear()
+ }
+}
+
+/*sessionStorage*/
+tool.session = {
+ set(table, settings) {
+ var _set = JSON.stringify(settings)
+ return sessionStorage.setItem(table, _set);
+ },
+ get(table) {
+ var data = sessionStorage.getItem(table);
+ try {
+ data = JSON.parse(data)
+ } catch (err) {
+ return null
+ }
+ return data;
+ },
+ remove(table) {
+ return sessionStorage.removeItem(table);
+ },
+ clear() {
+ return sessionStorage.clear();
+ }
+}
+
+/*cookie*/
+tool.cookie = {
+ set(name, value, config={}) {
+ var cfg = {
+ expires: null,
+ path: null,
+ domain: null,
+ secure: false,
+ httpOnly: false,
+ ...config
+ }
+ var cookieStr = `${name}=${escape(value)}`
+ if(cfg.expires){
+ var exp = new Date()
+ exp.setTime(exp.getTime() + parseInt(cfg.expires) * 1000)
+ cookieStr += `;expires=${exp.toGMTString()}`
+ }
+ if(cfg.path){
+ cookieStr += `;path=${cfg.path}`
+ }
+ if(cfg.domain){
+ cookieStr += `;domain=${cfg.domain}`
+ }
+ document.cookie = cookieStr
+ },
+ get(name){
+ var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"))
+ if(arr != null){
+ return unescape(arr[2])
+ }else{
+ return null
+ }
+ },
+ remove(name){
+ var exp = new Date()
+ exp.setTime(exp.getTime() - 1)
+ document.cookie = `${name}=;expires=${exp.toGMTString()}`
+ }
+}
+
+/* Fullscreen */
+tool.screen = function (element) {
+ var isFull = !!(document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement || document.fullscreenElement);
+ if(isFull){
+ if(document.exitFullscreen) {
+ document.exitFullscreen();
+ }else if (document.msExitFullscreen) {
+ document.msExitFullscreen();
+ }else if (document.mozCancelFullScreen) {
+ document.mozCancelFullScreen();
+ }else if (document.webkitExitFullscreen) {
+ document.webkitExitFullscreen();
+ }
+ }else{
+ if(element.requestFullscreen) {
+ element.requestFullscreen();
+ }else if(element.msRequestFullscreen) {
+ element.msRequestFullscreen();
+ }else if(element.mozRequestFullScreen) {
+ element.mozRequestFullScreen();
+ }else if(element.webkitRequestFullscreen) {
+ element.webkitRequestFullscreen();
+ }
+ }
+}
+
+/* 复制对象 */
+tool.objCopy = function (obj) {
+ return JSON.parse(JSON.stringify(obj));
+}
+
+/* 日期格式化 */
+tool.dateFormat = function (date, fmt='yyyy-MM-dd hh:mm:ss') {
+ date = new Date(date);
+ var o = {
+ "M+" : date.getMonth()+1, //月份
+ "d+" : date.getDate(), //日
+ "h+" : date.getHours(), //小时
+ "m+" : date.getMinutes(), //分
+ "s+" : date.getSeconds(), //秒
+ "q+" : Math.floor((date.getMonth()+3)/3), //季度
+ "S" : date.getMilliseconds(), //毫秒
+ };
+ var weeks = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
+
+ if(fmt==='week'){
+ fmt =weeks[date.getDay()];
+ }else{
+ if(/(y+)/.test(fmt)) {
+ fmt=fmt.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length));
+ }
+ for(var k in o) {
+ if(new RegExp("("+ k +")").test(fmt)){
+ fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
+ }
+ }
+ }
+ return fmt;
+}
+tool.dateFormat1 = function (date) {
+ date = new Date(date);
+ let newDate = '';
+ let year = date.getFullYear();
+ let month = date.getMonth() + 1;
+ let day = date.getDate();
+ let hour = date.getHours();
+ let minute = date.getMinutes();
+ let second = date.getSeconds();
+ month = month > 9 ? month : '0' + month;
+ day = day > 9 ? day : '0' + day;
+ hour = hour > 9 ? hour : '0' + hour;
+ minute = minute > 9 ? minute : '0' + minute;
+ second = second > 9 ? second : '0' + second;
+ newDate = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;
+ return newDate;
+}
+// 格式化某一天
+tool.dateFormat2 = function (date) {
+ date = new Date(date);
+ let newDate = '';
+ let year = date.getFullYear();
+ let month = date.getMonth() + 1;
+ let day = date.getDate();
+ month = month > 9 ? month : '0' + month;
+ day = day > 9 ? day : '0' + day;
+ newDate = year+'-'+month+'-'+day;
+ return newDate;
+}
+// 格式化某一月
+tool.dateFormat2 = function (date) {
+ date = new Date(date);
+ let first = '';
+ let lastDate = '',year2 = '',month2 = '';
+ let year = date.getFullYear();
+ let month = date.getMonth() + 1;
+ if (month < 12) {
+ year2 = year;
+ let mon = month + 1;
+ month2 = mon > 9 ? mon : '0' + mon;
+ } else {
+ year2 = year + 1;
+ month2 = '01';
+ }
+
+ month = month > 9 ? month : '0' + month;
+ first = year + '-' + month + '-01';
+ lastDate = year2 + '-' + month2 + '-01';
+ let arr = [];
+ arr.push(first)
+ arr.push(lastDate)
+ return arr;
+}
+/* 千分符 */
+tool.groupSeparator = function (num) {
+ num = num + '';
+ if(!num.includes('.')){
+ num += '.'
+ }
+ return num.replace(/(\d)(?=(\d{3})+\.)/g, function ($0, $1) {
+ return $1 + ',';
+ }).replace(/\.$/, '');
+}
+
+/* 常用加解密 */
+tool.crypto = {
+ //MD5加密
+ MD5(data){
+ return CryptoJS.MD5(data).toString()
+ },
+ //BASE64加解密
+ BASE64: {
+ encrypt(data){
+ return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(data))
+ },
+ decrypt(cipher){
+ return CryptoJS.enc.Base64.parse(cipher).toString(CryptoJS.enc.Utf8)
+ }
+ },
+ //AES加解密
+ AES: {
+ encrypt(data, secretKey, config={}){
+ if(secretKey.length % 8 != 0){
+ console.warn("[SCUI error]: 秘钥长度需为8的倍数,否则解密将会失败。")
+ }
+ const result = CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(secretKey), {
+ iv: CryptoJS.enc.Utf8.parse(config.iv || ""),
+ mode: CryptoJS.mode[config.mode || "ECB"],
+ padding: CryptoJS.pad[config.padding || "Pkcs7"]
+ })
+ return result.toString()
+ },
+ decrypt(cipher, secretKey, config={}){
+ const result = CryptoJS.AES.decrypt(cipher, CryptoJS.enc.Utf8.parse(secretKey), {
+ iv: CryptoJS.enc.Utf8.parse(config.iv || ""),
+ mode: CryptoJS.mode[config.mode || "ECB"],
+ padding: CryptoJS.pad[config.padding || "Pkcs7"]
+ })
+ return CryptoJS.enc.Utf8.stringify(result);
+ }
+ }
+}
+
+export default tool
diff --git a/src/utils/useTabs.js b/src/utils/useTabs.js
new file mode 100644
index 00000000..8813e9fe
--- /dev/null
+++ b/src/utils/useTabs.js
@@ -0,0 +1,61 @@
+import { nextTick } from 'vue'
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
+import router from '@/router'
+import store from '@/store'
+
+export default {
+ //刷新标签
+ refresh() {
+ NProgress.start()
+ const route = router.currentRoute.value
+ store.commit("removeKeepLive", route.name)
+ store.commit("setRouteShow", false)
+ nextTick(() => {
+ store.commit("pushKeepLive", route.name)
+ store.commit("setRouteShow", true)
+ NProgress.done()
+ })
+ },
+ //关闭标签
+ close(tag) {
+ const route = tag || router.currentRoute.value
+ store.commit("removeViewTags", route)
+ store.commit("removeIframeList", route)
+ store.commit("removeKeepLive", route.name)
+ const tagList = store.state.viewTags.viewTags
+ const latestView = tagList.slice(-1)[0]
+ if (latestView) {
+ router.push(latestView)
+ } else {
+ router.push('/')
+ }
+ },
+ //关闭标签后处理
+ closeNext(next) {
+ const route = router.currentRoute.value
+ store.commit("removeViewTags", route)
+ store.commit("removeIframeList", route)
+ store.commit("removeKeepLive", route.name)
+ if(next){
+ const tagList = store.state.viewTags.viewTags
+ next(tagList)
+ }
+ },
+ //关闭其他
+ closeOther() {
+ const route = router.currentRoute.value
+ const tagList = [...store.state.viewTags.viewTags]
+ tagList.forEach(tag => {
+ if(tag.meta&&tag.meta.affix || route.fullPath==tag.fullPath){
+ return true
+ }else{
+ this.close(tag)
+ }
+ })
+ },
+ //设置标题
+ setTitle(title){
+ store.commit("updateViewTagsTitle", title)
+ }
+}
diff --git a/src/utils/verificate.js b/src/utils/verificate.js
new file mode 100644
index 00000000..71f523b2
--- /dev/null
+++ b/src/utils/verificate.js
@@ -0,0 +1,46 @@
+
+//验证手机号
+export function verifyPhone(rule, value, callback) {
+ let reg = /^[1][3, 4, 5, 6, 7, 8, 9][0-9]{9}$/
+ if(!reg.test(value)){
+ return callback(new Error('请输入正确的手机号码'))
+ }
+ callback()
+}
+
+//车牌号码
+export function verifyCars(rule, value, callback) {
+ let reg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]$/
+ if(!reg.test(value)){
+ return callback(new Error('请输入正确的车牌号码'))
+ }
+ callback()
+}
+export function genTree(data) {
+ const result = []
+ if (!Array.isArray(data)) {
+ return result
+ }
+ data.forEach(item => {
+ delete item.children
+ })
+ const map = {}
+ data.forEach(item => {
+ item.label = item.name
+ item.parentId = item.parent
+ if(item.fullname){
+ item.label = item.fullname
+ }
+ item.value = item.id
+ map[item.id] = item
+ })
+ data.forEach(item => {
+ const parent = map[item.parent]
+ if (parent) {
+ (parent.children || (parent.children = [])).push(item)
+ } else {
+ result.push(item)
+ }
+ })
+ return result
+ }
diff --git a/src/utils/xlsx.js b/src/utils/xlsx.js
new file mode 100644
index 00000000..151c8567
--- /dev/null
+++ b/src/utils/xlsx.js
@@ -0,0 +1,11 @@
+import * as XLSX from "xlsx";
+
+const ExportExcel = function(domId, name) {
+ const table = document.querySelector(domId);
+ const workbook = XLSX.utils.table_to_book(table);
+
+ XLSX.writeFile(workbook, `${name}.xlsx`);
+}
+export default (app) => {
+ app.config.globalProperties.$XLSX = ExportExcel;
+}
\ No newline at end of file
diff --git a/src/utils/youShe.ttf b/src/utils/youShe.ttf
new file mode 100644
index 00000000..3729151a
Binary files /dev/null and b/src/utils/youShe.ttf differ
diff --git a/src/views/home/index.vue b/src/views/home/index.vue
new file mode 100644
index 00000000..bab94556
--- /dev/null
+++ b/src/views/home/index.vue
@@ -0,0 +1,7 @@
+
+
+ hello world
+
+
+
\ No newline at end of file
diff --git a/src/views/login/components/commonPage.vue b/src/views/login/components/commonPage.vue
new file mode 100644
index 00000000..9946de7a
--- /dev/null
+++ b/src/views/login/components/commonPage.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/login/components/passwordForm.vue b/src/views/login/components/passwordForm.vue
new file mode 100644
index 00000000..25aefb3e
--- /dev/null
+++ b/src/views/login/components/passwordForm.vue
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t("login.forgetPassword") }}?
+
+
+
+ {{ $t("login.signIn")
+ }}
+
+
+
+
+
+
+
+
+
diff --git a/src/views/login/components/phoneForm.vue b/src/views/login/components/phoneForm.vue
new file mode 100644
index 00000000..82c00b28
--- /dev/null
+++ b/src/views/login/components/phoneForm.vue
@@ -0,0 +1,122 @@
+
+
+
+
+ +86
+
+
+
+
+
+ {{ this.$t('login.smsGet') }}
+ ({{ time }})
+
+
+
+ {{ $t('login.signIn')
+ }}
+
+
+
+
+
+
+
diff --git a/src/views/login/index.vue b/src/views/login/index.vue
new file mode 100644
index 00000000..a8985ee7
--- /dev/null
+++ b/src/views/login/index.vue
@@ -0,0 +1,454 @@
+
+
+
+
+
+
{{ baseConfig.base_name }}
+
+
+
+
+
+
+
+
+
+
{{ $tc('login.wechatLoginMsg', 1) }}
{{ $tc('login.wechatLoginMsg', 2) }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/login/resetPassword.vue b/src/views/login/resetPassword.vue
new file mode 100644
index 00000000..0a6edab4
--- /dev/null
+++ b/src/views/login/resetPassword.vue
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 获取验证码 ({{ time }})
+
+
+
+
+
+
+
+
+
+
+
+ 提交
+
+
+
+
+ 返回登录
+
+
+
+
+
+
+
+
diff --git a/src/views/login/userRegister.vue b/src/views/login/userRegister.vue
new file mode 100644
index 00000000..c41d8d5f
--- /dev/null
+++ b/src/views/login/userRegister.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+
+
+
+ 登录账号将作为登录时的唯一凭证
+
+
+
+
+ 请输入包含英文、数字的8位以上密码
+
+
+
+
+
+ 已阅读并同意《平台服务协议》
+
+
+
+
+
+
+
+
+
+
+
+ 企业开发者
+ 企业开发者
+
+
+
+
+ 云存储API
+ 云检索API
+ Javescript API
+
+
+
+
+
+
+ 前去登录
+
+
+
+
+ 上一步
+ 下一步
+ 提交
+
+
+ 平台服务协议
+
+ 取消
+ 我已阅读并同意
+
+
+
+
+
+
+
+
diff --git a/src/views/ops/fileLogs.vue b/src/views/ops/fileLogs.vue
new file mode 100644
index 00000000..6efa8e55
--- /dev/null
+++ b/src/views/ops/fileLogs.vue
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/ops/logInfo.vue b/src/views/ops/logInfo.vue
new file mode 100644
index 00000000..a3547da5
--- /dev/null
+++ b/src/views/ops/logInfo.vue
@@ -0,0 +1,78 @@
+
+
+
+ {{data.path}}
+ {{data.method}}
+ {{data.target}}
+ {{data.result}}
+ {{data.status_code}}
+ {{data.id}}
+ {{data.requested_at}}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/ops/log_request.vue b/src/views/ops/log_request.vue
new file mode 100644
index 00000000..17c50b7b
--- /dev/null
+++ b/src/views/ops/log_request.vue
@@ -0,0 +1,156 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.status_code }}
+ {{ scope.row.status_code }}
+ {{ scope.row.status_code }}
+
+
+
+
+ 查看
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/ops/menu.vue b/src/views/ops/menu.vue
new file mode 100644
index 00000000..685cc34a
--- /dev/null
+++ b/src/views/ops/menu.vue
@@ -0,0 +1,259 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ types[scope.row.type] }}
+
+
+
+
+ {{ i }}
+
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+ 模块
+ 页面
+ 接口
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取 消
+ 保 存
+
+
+
+
+
+
+
diff --git a/src/views/ops/server.vue b/src/views/ops/server.vue
new file mode 100644
index 00000000..81c5e724
--- /dev/null
+++ b/src/views/ops/server.vue
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+ {{
+ cpuData.count
+ }}
+ {{
+ cpuData.lcount
+ }}
+ {{ cpuData.percent }}%
+
+
+
+
+
+
+ {{ memoryData.total }}GB
+ {{ memoryData.used }}GB
+ {{ memoryData.percent }}%
+
+
+
+
+
+
+ {{ diskData.total }}GB
+ {{ diskData.used }}GB
+ {{ diskData.percent }}%
+
+
+
+
+
+
+ {{ celeryData.count_registered_task }}
+ {{ redisData.used_memory_human }}
+ {{ celeryData.count_active_task }}
+ {{ redisData.used_memory_peak_human }}
+ {{ celeryData.count_scheduled_task }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/ops/setting.vue b/src/views/ops/setting.vue
new file mode 100644
index 00000000..b2a24209
--- /dev/null
+++ b/src/views/ops/setting.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
{{ form.base_name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/ops/settings/sysSet.vue b/src/views/ops/settings/sysSet.vue
new file mode 100644
index 00000000..742d45da
--- /dev/null
+++ b/src/views/ops/settings/sysSet.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提交
+
+
+
+
+
+
+
+
diff --git a/src/views/ops/thirdLogs.vue b/src/views/ops/thirdLogs.vue
new file mode 100644
index 00000000..54fecffe
--- /dev/null
+++ b/src/views/ops/thirdLogs.vue
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 成功
+ 失败
+ 错误
+
+
+
+
+ 查看
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/sys/dept.vue b/src/views/sys/dept.vue
new file mode 100644
index 00000000..122ead3b
--- /dev/null
+++ b/src/views/sys/dept.vue
@@ -0,0 +1,303 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ deptTypeOptions[scope.row.type] }}
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取 消
+ 保 存
+
+
+
+
+
+
diff --git a/src/views/sys/dict.vue b/src/views/sys/dict.vue
new file mode 100644
index 00000000..1d4e8aad
--- /dev/null
+++ b/src/views/sys/dict.vue
@@ -0,0 +1,422 @@
+
+
+
+
+
+
+
+
+
+
+
+ 字典分类
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取 消
+ 保 存
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取 消
+ 保 存
+
+
+
+
+
+
+
+
diff --git a/src/views/sys/myschedule.vue b/src/views/sys/myschedule.vue
new file mode 100644
index 00000000..84e67180
--- /dev/null
+++ b/src/views/sys/myschedule.vue
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
+
+
+
+ {{ scheduleTypeEnum[scope.row.type]?.text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 每隔
+
+
+
+
+
+
+
+
+
+ 分钟
+
+
+ 小时
+
+
+ 每周的天
+
+
+ 每月的天
+
+
+ 每年的月
+
+
+
+
+
+ 保 存
+
+
+
+
+
diff --git a/src/views/sys/post.vue b/src/views/sys/post.vue
new file mode 100644
index 00000000..bd70cc63
--- /dev/null
+++ b/src/views/sys/post.vue
@@ -0,0 +1,277 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.post_.name }}
+
+
+ {{ scope.row.role_.name }}
+
+
+ {{
+ options[scope.row.data_range]
+ }}
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/sys/post_form.vue b/src/views/sys/post_form.vue
new file mode 100644
index 00000000..ee9509a9
--- /dev/null
+++ b/src/views/sys/post_form.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取 消
+ 保 存
+
+
+
+
+
+
+
diff --git a/src/views/sys/post_role_form.vue b/src/views/sys/post_role_form.vue
new file mode 100644
index 00000000..bd51bf62
--- /dev/null
+++ b/src/views/sys/post_role_form.vue
@@ -0,0 +1,182 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取 消
+
+ 保 存
+
+
+
+
+
+
+
+
diff --git a/src/views/sys/role.vue b/src/views/sys/role.vue
new file mode 100644
index 00000000..54a2b234
--- /dev/null
+++ b/src/views/sys/role.vue
@@ -0,0 +1,249 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取 消
+ 保 存
+
+
+
+
+
diff --git a/src/views/sys/task.vue b/src/views/sys/task.vue
new file mode 100644
index 00000000..9d0f7b52
--- /dev/null
+++ b/src/views/sys/task.vue
@@ -0,0 +1,208 @@
+
+
+
+
+
+ {{item.name}}
+
+
+
+ 启用
+ 停用
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+ 日志
+ 删除
+
+
+
+
+
+
+
+
+
+
+ 添加计划任务
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取 消
+ 保 存
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/sys/taskLogs.vue b/src/views/sys/taskLogs.vue
new file mode 100644
index 00000000..fe435dd7
--- /dev/null
+++ b/src/views/sys/taskLogs.vue
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+ 成功
+ 异常
+
+
+
+
+ 日志
+
+
+
+
+
+
+
+
+ {{demoLog}}
+
+
+
+
+
+
+
diff --git a/src/views/sys/user.vue b/src/views/sys/user.vue
new file mode 100644
index 00000000..270fa7dc
--- /dev/null
+++ b/src/views/sys/user.vue
@@ -0,0 +1,482 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 已删
+ 在用
+
+
+
+
+
+ {{userTypeOptions[scope.row.type]}}
+
+
+
+
+
+
+
+
+
+
+
+ 设置
+
+
+
+ 编辑
+
+
+ 重置密码
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取 消
+ 保 存
+
+
+
+
+
+
+
+
+
diff --git a/src/views/sys/user_form.vue b/src/views/sys/user_form.vue
new file mode 100644
index 00000000..8e0f98ef
--- /dev/null
+++ b/src/views/sys/user_form.vue
@@ -0,0 +1,254 @@
+
+
+
+
+
+
+
+
+
+ {{ form.name }}
+
+
+
+
+ {{ form.username }}
+
+
+
+
+ {{ form.phone }}
+
+
+
+
+ {{ job_states[form.is_active] }}
+
+
+
+
+
+
+
+
+
+ {{ scope.row.sort }}
+
+
+
+
+
+ {{
+ scope.row.dept_.name
+ }}
+
+
+
+
+
+ {{ scope.row.post_.name }}
+
+
+
+
+
+
+
+ 删除
+ 添加
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/userCenter/index.vue b/src/views/userCenter/index.vue
new file mode 100644
index 00000000..bec784fb
--- /dev/null
+++ b/src/views/userCenter/index.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
{{ userData.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/userCenter/user/account.vue b/src/views/userCenter/user/account.vue
new file mode 100644
index 00000000..87d2034e
--- /dev/null
+++ b/src/views/userCenter/user/account.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+ 账号信息用于登录,系统不允许修改
+
+
+
+
+
+
+ {{form.belong_dept_name}}
+ {{form.post_name}}
+ 超级管理员
+
+
+
+
+
+
+
diff --git a/src/views/userCenter/user/password.vue b/src/views/userCenter/user/password.vue
new file mode 100644
index 00000000..5e8827d3
--- /dev/null
+++ b/src/views/userCenter/user/password.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+ 必须提供当前登录用户密码才能进行更改
+
+
+
+
+ 请输入包含英文、数字的8位以上密码
+
+
+
+
+
+ 保存密码
+
+
+
+
+
+
+
+
diff --git a/src/views/userCenter/user/pushSettings.vue b/src/views/userCenter/user/pushSettings.vue
new file mode 100644
index 00000000..33559e6e
--- /dev/null
+++ b/src/views/userCenter/user/pushSettings.vue
@@ -0,0 +1,104 @@
+
+
+
+
+
+ 必须提供当前登录用户密码才能进行更改
+
+
+
+
+
+
+
+
+ 提交
+ 重置
+
+
+
+
+
+
+
+
diff --git a/src/views/wf/allwork.vue b/src/views/wf/allwork.vue
new file mode 100644
index 00000000..f5fa0ff6
--- /dev/null
+++ b/src/views/wf/allwork.vue
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.workflow_.name }}
+
+
+
+
+ {{ scope.row.state_.name }}
+
+
+
+
+ {{ act_states[scope.row.act_state] }}
+
+
+
+
+
+ {{ item.name }}/
+
+ 无
+
+
+
+
+
+ 查看
+ 重试
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wf/ccwork.vue b/src/views/wf/ccwork.vue
new file mode 100644
index 00000000..1f4c171b
--- /dev/null
+++ b/src/views/wf/ccwork.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+ {{ scope.row.workflow_.name }}
+
+
+
+
+ {{ scope.row.state_.name }}
+
+
+
+
+ {{ act_states[scope.row.act_state] }}
+
+
+
+
+
+ {{ item.name}}/
+
+
+ 无
+
+
+
+
+
+
+ 查看
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wf/configuration.vue b/src/views/wf/configuration.vue
new file mode 100644
index 00000000..3ae45b41
--- /dev/null
+++ b/src/views/wf/configuration.vue
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wf/details.vue b/src/views/wf/details.vue
new file mode 100644
index 00000000..e9ffd727
--- /dev/null
+++ b/src/views/wf/details.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+ {{ scope.row.state_.name }}
+
+
+
+
+ {{ interveneTypeOptions[scope.row.intervene_type] }}
+
+
+
+
+ {{
+ scope.row.participant_.name
+ }}
+ {{
+ scope.row.participant_str
+ }}
+
+
+
+
+ 同意
+ 拒绝
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wf/dutywork.vue b/src/views/wf/dutywork.vue
new file mode 100644
index 00000000..faa37215
--- /dev/null
+++ b/src/views/wf/dutywork.vue
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
+ {{ scope.row.workflow_.name }}
+
+
+
+
+ {{ scope.row.state_.name }}
+
+
+
+
+ {{ act_states[scope.row.act_state] }}
+
+
+
+
+
+ {{ item.name }}/
+
+ 无
+
+
+
+
+
+
+ 处理
+
+
+ 接单
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wf/field.vue b/src/views/wf/field.vue
new file mode 100644
index 00000000..c461790f
--- /dev/null
+++ b/src/views/wf/field.vue
@@ -0,0 +1,260 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 显示
+ 隐藏
+
+
+
+
+ 取消
+ 确认
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wf/ownerwork.vue b/src/views/wf/ownerwork.vue
new file mode 100644
index 00000000..a11cd803
--- /dev/null
+++ b/src/views/wf/ownerwork.vue
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
+
+
+ {{ scope.row.workflow_.name }}
+
+
+
+
+ {{ scope.row.state_.name }}
+
+
+
+
+ {{ act_states[scope.row.act_state] }}
+
+
+
+
+
+ {{ item.name}}/
+
+
+ 无
+
+
+
+
+
+
+ 查看
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确定
+
+
+
+
+
+
+
+
diff --git a/src/views/wf/state.vue b/src/views/wf/state.vue
new file mode 100644
index 00000000..498bcb92
--- /dev/null
+++ b/src/views/wf/state.vue
@@ -0,0 +1,640 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是
+ 否
+
+
+
+
+
+
+ 普通类型
+
+
+ 初始状态
+
+
+ 结束状态
+
+
+
+
+
+ {{ options_[scope.row.participant_type] }}
+
+
+
+ {{ options2_[scope.row.distribute_type] }}
+
+
+
+ {{ scope.row.on_reach_func }}
+
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.phone }}
+
+
+
+
+
+
+ {{ item.name }}
+ {{ item.phone }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加修改
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确认
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wf/steps.vue b/src/views/wf/steps.vue
new file mode 100644
index 00000000..da2251cc
--- /dev/null
+++ b/src/views/wf/steps.vue
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wf/transform.vue b/src/views/wf/transform.vue
new file mode 100644
index 00000000..a32a24f0
--- /dev/null
+++ b/src/views/wf/transform.vue
@@ -0,0 +1,244 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{scope.row.source_state_.name}}
+
+
+
+
+ {{scope.row.destination_state_.name}}
+
+
+
+
+ {{ scope.row.on_submit_func }}
+
+
+
+ {{ scope.row.create_time }}
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 确认
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wf/worked.vue b/src/views/wf/worked.vue
new file mode 100644
index 00000000..a3019e9f
--- /dev/null
+++ b/src/views/wf/worked.vue
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+
+
+
+ {{ scope.row.workflow_.name }}
+
+
+
+
+ {{ scope.row.state_.name }}
+
+
+
+
+ {{ act_states[scope.row.act_state] }}
+
+
+
+
+
+ {{ item.name }}/
+
+ 无
+
+
+
+
+
+ 查看
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/wf/workflow.vue b/src/views/wf/workflow.vue
new file mode 100644
index 00000000..bb1ad2c6
--- /dev/null
+++ b/src/views/wf/workflow.vue
@@ -0,0 +1,548 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是
+ 否
+
+
+
+
+
+
+ 配置
+
+ 编辑
+
+
+ 流程图
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取 消
+ 保 存
+
+
+
+
+
+
+