Merge branch 'master' into master
@@ -99,7 +99,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-compress</artifactId>
|
<artifactId>commons-compress</artifactId>
|
||||||
<version>1.19</version>
|
<version>1.21</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- 解压(rar)-->
|
<!-- 解压(rar)-->
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -149,7 +149,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.thoughtworks.xstream</groupId>
|
<groupId>com.thoughtworks.xstream</groupId>
|
||||||
<artifactId>xstream</artifactId>
|
<artifactId>xstream</artifactId>
|
||||||
<version>1.4.17</version>
|
<version>1.4.18</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.googlecode.concurrentlinkedhashmap</groupId>
|
<groupId>com.googlecode.concurrentlinkedhashmap</groupId>
|
||||||
|
|||||||
@@ -1,2 +1,36 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
kill -15 `ps -ef|grep kkFileView|awk 'NR==1{print $2}'`
|
#
|
||||||
|
#
|
||||||
|
#############################
|
||||||
|
# Author: sanxi
|
||||||
|
# Version: 1.0
|
||||||
|
# Date: 2021/09/17
|
||||||
|
# Description: v1.0:修改kkFileView关闭进程机制
|
||||||
|
#############################
|
||||||
|
#
|
||||||
|
KKFILEVIEW_BIN_FOLDER=$(cd "$(dirname "$0")" || exit 1 ;pwd)
|
||||||
|
PID_FILE_NAME="kkFileView.pid"
|
||||||
|
PID_FILE="${KKFILEVIEW_BIN_FOLDER}/${PID_FILE_NAME}"
|
||||||
|
export KKFILEVIEW_BIN_FOLDER=$KKFILEVIEW_BIN_FOLDER
|
||||||
|
#
|
||||||
|
## pid文件是否存在
|
||||||
|
if [ ! -e "$PID_FILE" ]; then
|
||||||
|
echo "kkFileView.pid文件不存在!"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
## 文件不为空代表程序正在运行,则循环关闭进程。
|
||||||
|
if [ -s "$PID_FILE" ]; then
|
||||||
|
# 读取pid文件内容,开启while循环读取每一行文本赋予给变量PID_FILE。
|
||||||
|
cat "${PID_FILE}" | while read PID;do
|
||||||
|
## 如已读取完毕,则退出脚本。
|
||||||
|
[ -z "$PID" ] && exit 2
|
||||||
|
echo "正在停止进程:${PID}..."
|
||||||
|
## 正常停止进程
|
||||||
|
kill -15 "${PID}" && echo "进程:${PID}停止成功!"
|
||||||
|
done
|
||||||
|
# 关闭所有进程后,重置pid。
|
||||||
|
cat /dev/null > "$PID_FILE"
|
||||||
|
else
|
||||||
|
echo "kkFileView进程尚未运行!"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|||||||
@@ -1,18 +1,41 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
DIR_HOME=("/opt/openoffice.org3" "/opt/libreoffice" "/opt/libreoffice6.0" "/opt/libreoffice6.1" "/opt/libreoffice6.2" "/opt/libreoffice6.3" "/opt/libreoffice6.4" "/opt/libreoffice7.0" "/opt/libreoffice7.1" "/opt/libreoffice7.2" "/opt/openoffice4" "/usr/lib/openoffice" "/usr/lib/libreoffice" "/usr/lib64/libreoffice")
|
#
|
||||||
|
#
|
||||||
|
#############################
|
||||||
|
# First_Author: 凯京科技
|
||||||
|
# Second_Author: sanxi
|
||||||
|
# Version: 1.1
|
||||||
|
# Date: 2021/09/17
|
||||||
|
# Description: v1.1:修改进程启动机制为pid形式。
|
||||||
|
#############################
|
||||||
|
#
|
||||||
|
DIR_HOME=("/opt/openoffice.org3" "/opt/libreoffice" "/opt/libreoffice6.1" "/opt/libreoffice7.0" "/opt/libreoffice7.1" "/opt/openoffice4" "/usr/lib/openoffice" "/usr/lib/libreoffice")
|
||||||
FLAG=
|
FLAG=
|
||||||
OFFICE_HOME=
|
OFFICE_HOME=
|
||||||
KKFILEVIEW_BIN_FOLDER=$(cd "$(dirname "$0")";pwd)
|
KKFILEVIEW_BIN_FOLDER=$(cd "$(dirname "$0")" || exit 1 ;pwd)
|
||||||
|
PID_FILE_NAME="kkFileView.pid"
|
||||||
|
PID_FILE="${KKFILEVIEW_BIN_FOLDER}/${PID_FILE_NAME}"
|
||||||
export KKFILEVIEW_BIN_FOLDER=$KKFILEVIEW_BIN_FOLDER
|
export KKFILEVIEW_BIN_FOLDER=$KKFILEVIEW_BIN_FOLDER
|
||||||
cd $KKFILEVIEW_BIN_FOLDER
|
#
|
||||||
echo "Using KKFILEVIEW_BIN_FOLDER $KKFILEVIEW_BIN_FOLDER"
|
## 如pid文件不存在则自动创建
|
||||||
grep 'office\.home' ../config/application.properties | grep '!^#'
|
if [ ! -f ${PID_FILE_NAME} ]; then
|
||||||
if [ $? -eq 0 ]; then
|
touch "${KKFILEVIEW_BIN_FOLDER}/${PID_FILE_NAME}"
|
||||||
echo "Using customized office.home"
|
fi
|
||||||
|
## 判断当前是否有进程处于运行状态
|
||||||
|
if [ -s "${PID_FILE}" ]; then
|
||||||
|
PID=$(cat "${PID_FILE}")
|
||||||
|
echo "进程已处于运行状态,进程号为:${PID}"
|
||||||
|
exit 1
|
||||||
else
|
else
|
||||||
|
cd "$KKFILEVIEW_BIN_FOLDER" || exit 1
|
||||||
|
echo "Using KKFILEVIEW_BIN_FOLDER $KKFILEVIEW_BIN_FOLDER"
|
||||||
|
grep 'office\.home' ../config/application.properties | grep '!^#'
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "Using customized office.home"
|
||||||
|
else
|
||||||
for i in ${DIR_HOME[@]}
|
for i in ${DIR_HOME[@]}
|
||||||
do
|
do
|
||||||
if [ -f $i"/program/soffice.bin" ]; then
|
if [ -f "$i/program/soffice.bin" ]; then
|
||||||
FLAG=true
|
FLAG=true
|
||||||
OFFICE_HOME=${i}
|
OFFICE_HOME=${i}
|
||||||
break
|
break
|
||||||
@@ -24,9 +47,15 @@ else
|
|||||||
else
|
else
|
||||||
echo "Detected office component has been installed in $OFFICE_HOME"
|
echo "Detected office component has been installed in $OFFICE_HOME"
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
## 启动kkFileView
|
||||||
|
echo "Starting kkFileView..."
|
||||||
|
nohup java -Dfile.encoding=UTF-8 -Dspring.config.location=../config/application.properties -jar kkFileView-4.0.0.jar > ../log/kkFileView.log 2>&1 &
|
||||||
|
echo "Please execute ./showlog.sh to check log for more information"
|
||||||
|
echo "You can get help in our official homesite: https://kkFileView.keking.cn"
|
||||||
|
echo "If this project is helpful to you, please star it on https://gitee.com/kekingcn/file-online-preview/stargazers"
|
||||||
|
PROCESS=$(ps -ef | grep kkFileView | awk 'NR==1{print $2}')
|
||||||
|
# 启动成功后将进程号写入pid文件
|
||||||
|
echo "$PROCESS" > "$PID_FILE"
|
||||||
fi
|
fi
|
||||||
echo "Starting kkFileView..."
|
|
||||||
echo "Please execute ./showlog.sh to check log for more information"
|
|
||||||
echo "You can get help in our official homesite: https://kkFileView.keking.cn"
|
|
||||||
echo "If this project is helpful to you, please star it on https://gitee.com/kekingcn/file-online-preview/stargazers"
|
|
||||||
nohup java -Dfile.encoding=UTF-8 -Dspring.config.location=../config/application.properties -jar kkFileView-4.0.0.jar > ../log/kkFileView.log 2>&1 &
|
|
||||||
|
|||||||
@@ -22,9 +22,15 @@ office.plugin.server.ports = 2001,2002
|
|||||||
## office 转换服务 task 超时时间,默认五分钟
|
## office 转换服务 task 超时时间,默认五分钟
|
||||||
office.plugin.task.timeout = 5m
|
office.plugin.task.timeout = 5m
|
||||||
|
|
||||||
#文件资源路径(默认为打包根路径下的file目录下)
|
#预览生成资源路径(默认为打包根路径下的file目录下)
|
||||||
#file.dir = D:\\kkFileview\\
|
#file.dir = D:\\kkFileview\\
|
||||||
file.dir = ${KK_FILE_DIR:default}
|
file.dir = ${KK_FILE_DIR:default}
|
||||||
|
|
||||||
|
#允许预览的本地文件夹 默认不允许任何本地文件被预览
|
||||||
|
#file.dir = D:\\kkFileview\\
|
||||||
|
local.preview.dir = ${KK_LOCAL_PREVIEW_DIR:default}
|
||||||
|
|
||||||
|
|
||||||
#openoffice home路径
|
#openoffice home路径
|
||||||
#office.home = C:\\Program Files (x86)\\OpenOffice 4
|
#office.home = C:\\Program Files (x86)\\OpenOffice 4
|
||||||
office.home = ${KK_OFFICE_HOME:default}
|
office.home = ${KK_OFFICE_HOME:default}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ public class ConfigConstants {
|
|||||||
private static String ftpControlEncoding;
|
private static String ftpControlEncoding;
|
||||||
private static String baseUrl;
|
private static String baseUrl;
|
||||||
private static String fileDir = ConfigUtils.getHomePath() + File.separator + "file" + File.separator;
|
private static String fileDir = ConfigUtils.getHomePath() + File.separator + "file" + File.separator;
|
||||||
|
private static String localPreviewDir;
|
||||||
private static CopyOnWriteArraySet<String> trustHostSet;
|
private static CopyOnWriteArraySet<String> trustHostSet;
|
||||||
private static String pdfPresentationModeDisable;
|
private static String pdfPresentationModeDisable;
|
||||||
private static String pdfOpenFileDisable;
|
private static String pdfOpenFileDisable;
|
||||||
@@ -51,6 +52,7 @@ public class ConfigConstants {
|
|||||||
public static final String DEFAULT_FTP_CONTROL_ENCODING = "UTF-8";
|
public static final String DEFAULT_FTP_CONTROL_ENCODING = "UTF-8";
|
||||||
public static final String DEFAULT_BASE_URL = "default";
|
public static final String DEFAULT_BASE_URL = "default";
|
||||||
public static final String DEFAULT_FILE_DIR_VALUE = "default";
|
public static final String DEFAULT_FILE_DIR_VALUE = "default";
|
||||||
|
public static final String DEFAULT_LOCAL_PREVIEW_DIR_VALUE = "default";
|
||||||
public static final String DEFAULT_TRUST_HOST = "default";
|
public static final String DEFAULT_TRUST_HOST = "default";
|
||||||
public static final String DEFAULT_PDF_PRESENTATION_MODE_DISABLE = "true";
|
public static final String DEFAULT_PDF_PRESENTATION_MODE_DISABLE = "true";
|
||||||
public static final String DEFAULT_PDF_OPEN_FILE_DISABLE = "true";
|
public static final String DEFAULT_PDF_OPEN_FILE_DISABLE = "true";
|
||||||
@@ -211,6 +213,24 @@ public class ConfigConstants {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getLocalPreviewDir() {
|
||||||
|
return localPreviewDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Value("${local.preview.dir:default}")
|
||||||
|
public void setLocalPreviewDir(String localPreviewDir) {
|
||||||
|
setLocalPreviewDirValue(localPreviewDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setLocalPreviewDirValue(String localPreviewDir) {
|
||||||
|
if (!DEFAULT_LOCAL_PREVIEW_DIR_VALUE.equals(localPreviewDir)) {
|
||||||
|
if (!localPreviewDir.endsWith(File.separator)) {
|
||||||
|
localPreviewDir = localPreviewDir + File.separator;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ConfigConstants.localPreviewDir = localPreviewDir;
|
||||||
|
}
|
||||||
|
|
||||||
@Value("${trust.host:default}")
|
@Value("${trust.host:default}")
|
||||||
public void setTrustHost(String trustHost) {
|
public void setTrustHost(String trustHost) {
|
||||||
setTrustHostValue(trustHost);
|
setTrustHostValue(trustHost);
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ public class DownloadUtils {
|
|||||||
* @return 本地文件绝对路径
|
* @return 本地文件绝对路径
|
||||||
*/
|
*/
|
||||||
public static ReturnResponse<String> downLoad(FileAttribute fileAttribute, String fileName) {
|
public static ReturnResponse<String> downLoad(FileAttribute fileAttribute, String fileName) {
|
||||||
String urlStr = fileAttribute.getUrl();
|
String urlStr = fileAttribute.getUrl().replaceAll("\\+", "%20");
|
||||||
ReturnResponse<String> response = new ReturnResponse<>(0, "下载成功!!!", "");
|
ReturnResponse<String> response = new ReturnResponse<>(0, "下载成功!!!", "");
|
||||||
String realPath = DownloadUtils.getRelFilePath(fileName, fileAttribute);
|
String realPath = DownloadUtils.getRelFilePath(fileName, fileAttribute);
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -81,6 +81,14 @@ public class WebUtils {
|
|||||||
* @return 文件名
|
* @return 文件名
|
||||||
*/
|
*/
|
||||||
public static String getFileNameFromURL(String url) {
|
public static String getFileNameFromURL(String url) {
|
||||||
|
if (url.toLowerCase().startsWith("file:")) {
|
||||||
|
try {
|
||||||
|
URL urlObj = new URL(url);
|
||||||
|
url = urlObj.getPath().substring(1);
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
// 因为url的参数中可能会存在/的情况,所以直接url.lastIndexOf("/")会有问题
|
// 因为url的参数中可能会存在/的情况,所以直接url.lastIndexOf("/")会有问题
|
||||||
// 所以先从?处将url截断,然后运用url.lastIndexOf("/")获取文件名
|
// 所以先从?处将url截断,然后运用url.lastIndexOf("/")获取文件名
|
||||||
String noQueryUrl = url.substring(0, url.contains("?") ? url.indexOf("?") : url.length());
|
String noQueryUrl = url.substring(0, url.contains("?") ? url.indexOf("?") : url.length());
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package cn.keking.web.controller;
|
package cn.keking.web.controller;
|
||||||
|
|
||||||
|
import cn.keking.config.ConfigConstants;
|
||||||
import cn.keking.model.FileAttribute;
|
import cn.keking.model.FileAttribute;
|
||||||
import cn.keking.service.FilePreview;
|
import cn.keking.service.FilePreview;
|
||||||
import cn.keking.service.FilePreviewFactory;
|
import cn.keking.service.FilePreviewFactory;
|
||||||
@@ -12,6 +13,7 @@ import fr.opensagres.xdocreport.core.io.IOUtils;
|
|||||||
import io.mola.galimatias.GalimatiasParseException;
|
import io.mola.galimatias.GalimatiasParseException;
|
||||||
import jodd.io.NetUtil;
|
import jodd.io.NetUtil;
|
||||||
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.codec.binary.Base64;
|
||||||
|
import org.artofsolving.jodconverter.util.PlatformUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
@@ -25,9 +27,11 @@ import javax.servlet.http.HttpServletRequest;
|
|||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.net.URLDecoder;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
import static cn.keking.service.FilePreview.PICTURE_FILE_PREVIEW_PAGE;
|
import static cn.keking.service.FilePreview.PICTURE_FILE_PREVIEW_PAGE;
|
||||||
|
|
||||||
@@ -61,6 +65,9 @@ public class OnlinePreviewController {
|
|||||||
String errorMsg = String.format(BASE64_DECODE_ERROR_MSG, "url");
|
String errorMsg = String.format(BASE64_DECODE_ERROR_MSG, "url");
|
||||||
return otherFilePreview.notSupportedFile(model, errorMsg);
|
return otherFilePreview.notSupportedFile(model, errorMsg);
|
||||||
}
|
}
|
||||||
|
if (!allowPreview(fileUrl)) {
|
||||||
|
return otherFilePreview.notSupportedFile(model, "该文件不允许预览:" + fileUrl);
|
||||||
|
}
|
||||||
FileAttribute fileAttribute = fileHandlerService.getFileAttribute(fileUrl, req);
|
FileAttribute fileAttribute = fileHandlerService.getFileAttribute(fileUrl, req);
|
||||||
model.addAttribute("file", fileAttribute);
|
model.addAttribute("file", fileAttribute);
|
||||||
FilePreview filePreview = previewFactory.get(fileAttribute);
|
FilePreview filePreview = previewFactory.get(fileAttribute);
|
||||||
@@ -86,8 +93,14 @@ public class OnlinePreviewController {
|
|||||||
String currentUrl = req.getParameter("currentUrl");
|
String currentUrl = req.getParameter("currentUrl");
|
||||||
if (StringUtils.hasText(currentUrl)) {
|
if (StringUtils.hasText(currentUrl)) {
|
||||||
String decodedCurrentUrl = new String(Base64.decodeBase64(currentUrl));
|
String decodedCurrentUrl = new String(Base64.decodeBase64(currentUrl));
|
||||||
|
if (!allowPreview(decodedCurrentUrl)) {
|
||||||
|
return otherFilePreview.notSupportedFile(model, "该文件不允许预览:" + decodedCurrentUrl);
|
||||||
|
}
|
||||||
model.addAttribute("currentUrl", decodedCurrentUrl);
|
model.addAttribute("currentUrl", decodedCurrentUrl);
|
||||||
} else {
|
} else {
|
||||||
|
if (!allowPreview(imgUrls.get(0))) {
|
||||||
|
return otherFilePreview.notSupportedFile(model, "该文件不允许预览:" + imgUrls.get(0));
|
||||||
|
}
|
||||||
model.addAttribute("currentUrl", imgUrls.get(0));
|
model.addAttribute("currentUrl", imgUrls.get(0));
|
||||||
}
|
}
|
||||||
return PICTURE_FILE_PREVIEW_PAGE;
|
return PICTURE_FILE_PREVIEW_PAGE;
|
||||||
@@ -105,6 +118,12 @@ public class OnlinePreviewController {
|
|||||||
logger.info("下载跨域pdf文件url:{}", urlPath);
|
logger.info("下载跨域pdf文件url:{}", urlPath);
|
||||||
try {
|
try {
|
||||||
URL url = WebUtils.normalizedURL(urlPath);
|
URL url = WebUtils.normalizedURL(urlPath);
|
||||||
|
if (!allowPreview(urlPath)) {
|
||||||
|
response.setHeader("content-type", "text/html;charset=utf-8");
|
||||||
|
response.getOutputStream().println("forbidden");
|
||||||
|
response.setStatus(401);
|
||||||
|
return;
|
||||||
|
}
|
||||||
byte[] bytes = NetUtil.downloadBytes(url.toString());
|
byte[] bytes = NetUtil.downloadBytes(url.toString());
|
||||||
IOUtils.write(bytes, response.getOutputStream());
|
IOUtils.write(bytes, response.getOutputStream());
|
||||||
} catch (IOException | GalimatiasParseException e) {
|
} catch (IOException | GalimatiasParseException e) {
|
||||||
@@ -125,4 +144,24 @@ public class OnlinePreviewController {
|
|||||||
return "success";
|
return "success";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean allowPreview(String urlPath) {
|
||||||
|
try {
|
||||||
|
URL url = WebUtils.normalizedURL(urlPath);
|
||||||
|
if ("file".equals(url.getProtocol().toLowerCase(Locale.ROOT))) {
|
||||||
|
String filePath = URLDecoder.decode(url.getPath(), StandardCharsets.UTF_8.name());
|
||||||
|
if (PlatformUtils.isWindows()) {
|
||||||
|
filePath = filePath.replaceAll("/", "\\\\");
|
||||||
|
}
|
||||||
|
filePath = filePath.substring(1);
|
||||||
|
if (!filePath.startsWith(ConfigConstants.getFileDir()) && !filePath.startsWith(ConfigConstants.getLocalPreviewDir())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} catch (IOException | GalimatiasParseException e) {
|
||||||
|
logger.error("解析URL异常,url:{}", urlPath, e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,8 +19,12 @@ function checkImgs() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function loadImg(el) {
|
function loadImg(el) {
|
||||||
|
var loaded = el.getAttribute("loaded");
|
||||||
|
if (!Boolean(loaded)) {
|
||||||
var source = el.getAttribute("data-src");
|
var source = el.getAttribute("data-src");
|
||||||
|
el.setAttribute("loaded", true);
|
||||||
el.src = source;
|
el.src = source;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// var mustRun = 500
|
// var mustRun = 500
|
||||||
// function throttle(fn, mustRun) {
|
// function throttle(fn, mustRun) {
|
||||||
|
|||||||
309
server/src/main/resources/static/pdfjs/build/pdf.sandbox.js
Normal file
96189
server/src/main/resources/static/pdfjs/build/pdf.worker.js
vendored
|
Before Width: | Height: | Size: 199 B |
|
Before Width: | Height: | Size: 304 B |
|
Before Width: | Height: | Size: 193 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M8 12a1 1 0 0 1-.707-.293l-5-5a1 1 0 0 1 1.414-1.414L8 9.586l4.293-4.293a1 1 0 0 1 1.414 1.414l-5 5A1 1 0 0 1 8 12z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 434 B |
|
Before Width: | Height: | Size: 296 B |
|
Before Width: | Height: | Size: 193 B |
|
Before Width: | Height: | Size: 296 B |
|
Before Width: | Height: | Size: 199 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M13 11a1 1 0 0 1-.707-.293L8 6.414l-4.293 4.293a1 1 0 0 1-1.414-1.414l5-5a1 1 0 0 1 1.414 0l5 5A1 1 0 0 1 13 11z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 431 B |
|
Before Width: | Height: | Size: 304 B |
@@ -0,0 +1,24 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"
|
||||||
|
fill="rgba(255,255,255,1)" style="animation:spinLoadingIcon 1s steps(12,end)
|
||||||
|
infinite"><style>@keyframes
|
||||||
|
spinLoadingIcon{to{transform:rotate(360deg)}}</style><path
|
||||||
|
d="M7 3V1s0-1 1-1 1 1 1 1v2s0 1-1 1-1-1-1-1z"/><path d="M4.63
|
||||||
|
4.1l-1-1.73S3.13 1.5 4 1c.87-.5 1.37.37 1.37.37l1 1.73s.5.87-.37
|
||||||
|
1.37c-.87.57-1.37-.37-1.37-.37z" fill-opacity=".93"/><path
|
||||||
|
d="M3.1 6.37l-1.73-1S.5 4.87 1 4c.5-.87 1.37-.37 1.37-.37l1.73 1s.87.5.37
|
||||||
|
1.37c-.5.87-1.37.37-1.37.37z" fill-opacity=".86"/><path d="M3
|
||||||
|
9H1S0 9 0 8s1-1 1-1h2s1 0 1 1-1 1-1 1z" fill-opacity=".79"/><path d="M4.1 11.37l-1.73 1S1.5 12.87 1
|
||||||
|
12c-.5-.87.37-1.37.37-1.37l1.73-1s.87-.5 1.37.37c.5.87-.37 1.37-.37 1.37z"
|
||||||
|
fill-opacity=".72"/><path d="M3.63 13.56l1-1.73s.5-.87
|
||||||
|
1.37-.37c.87.5.37 1.37.37 1.37l-1 1.73s-.5.87-1.37.37c-.87-.5-.37-1.37-.37-1.37z"
|
||||||
|
fill-opacity=".65"/><path d="M7 15v-2s0-1 1-1 1 1 1 1v2s0 1-1
|
||||||
|
1-1-1-1-1z" fill-opacity=".58"/><path d="M10.63
|
||||||
|
14.56l-1-1.73s-.5-.87.37-1.37c.87-.5 1.37.37 1.37.37l1 1.73s.5.87-.37
|
||||||
|
1.37c-.87.5-1.37-.37-1.37-.37z" fill-opacity=".51"/><path
|
||||||
|
d="M13.56 12.37l-1.73-1s-.87-.5-.37-1.37c.5-.87 1.37-.37 1.37-.37l1.73 1s.87.5.37
|
||||||
|
1.37c-.5.87-1.37.37-1.37.37z" fill-opacity=".44"/><path d="M15
|
||||||
|
9h-2s-1 0-1-1 1-1 1-1h2s1 0 1 1-1 1-1 1z" fill-opacity=".37"/><path d="M14.56 5.37l-1.73
|
||||||
|
1s-.87.5-1.37-.37c-.5-.87.37-1.37.37-1.37l1.73-1s.87-.5 1.37.37c.5.87-.37 1.37-.37
|
||||||
|
1.37z" fill-opacity=".3"/><path d="M9.64 3.1l.98-1.66s.5-.874
|
||||||
|
1.37-.37c.87.5.37 1.37.37 1.37l-1 1.73s-.5.87-1.37.37c-.87-.5-.37-1.37-.37-1.37z"
|
||||||
|
fill-opacity=".23"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 16 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" style="animation:spinLoadingIcon 1s steps(12,end) infinite"><style>@keyframes spinLoadingIcon{to{transform:rotate(360deg)}}</style><path d="M7 3V1s0-1 1-1 1 1 1 1v2s0 1-1 1-1-1-1-1z"/><path d="M4.63 4.1l-1-1.73S3.13 1.5 4 1c.87-.5 1.37.37 1.37.37l1 1.73s.5.87-.37 1.37c-.87.57-1.37-.37-1.37-.37z" fill-opacity=".93"/><path d="M3.1 6.37l-1.73-1S.5 4.87 1 4c.5-.87 1.37-.37 1.37-.37l1.73 1s.87.5.37 1.37c-.5.87-1.37.37-1.37.37z" fill-opacity=".86"/><path d="M3 9H1S0 9 0 8s1-1 1-1h2s1 0 1 1-1 1-1 1z" fill-opacity=".79"/><path d="M4.1 11.37l-1.73 1S1.5 12.87 1 12c-.5-.87.37-1.37.37-1.37l1.73-1s.87-.5 1.37.37c.5.87-.37 1.37-.37 1.37z" fill-opacity=".72"/><path d="M3.63 13.56l1-1.73s.5-.87 1.37-.37c.87.5.37 1.37.37 1.37l-1 1.73s-.5.87-1.37.37c-.87-.5-.37-1.37-.37-1.37z" fill-opacity=".65"/><path d="M7 15v-2s0-1 1-1 1 1 1 1v2s0 1-1 1-1-1-1-1z" fill-opacity=".58"/><path d="M10.63 14.56l-1-1.73s-.5-.87.37-1.37c.87-.5 1.37.37 1.37.37l1 1.73s.5.87-.37 1.37c-.87.5-1.37-.37-1.37-.37z" fill-opacity=".51"/><path d="M13.56 12.37l-1.73-1s-.87-.5-.37-1.37c.5-.87 1.37-.37 1.37-.37l1.73 1s.87.5.37 1.37c-.5.87-1.37.37-1.37.37z" fill-opacity=".44"/><path d="M15 9h-2s-1 0-1-1 1-1 1-1h2s1 0 1 1-1 1-1 1z" fill-opacity=".37"/><path d="M14.56 5.37l-1.73 1s-.87.5-1.37-.37c-.5-.87.37-1.37.37-1.37l1.73-1s.87-.5 1.37.37c.5.87-.37 1.37-.37 1.37z" fill-opacity=".3"/><path d="M9.64 3.1l.98-1.66s.5-.874 1.37-.37c.87.5.37 1.37.37 1.37l-1 1.73s-.5.87-1.37.37c-.87-.5-.37-1.37-.37-1.37z" fill-opacity=".23"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 403 B |
@@ -0,0 +1,15 @@
|
|||||||
|
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16
|
||||||
|
16">
|
||||||
|
<path
|
||||||
|
d="M8 16a8 8 0 1 1 8-8 8.009 8.009 0 0 1-8 8zM8 2a6 6 0 1 0 6 6 6.006 6.006 0 0 0-6-6z">
|
||||||
|
</path>
|
||||||
|
<path
|
||||||
|
d="M8 7a1 1 0 0 0-1 1v3a1 1 0 0 0 2 0V8a1 1 0 0 0-1-1z">
|
||||||
|
</path>
|
||||||
|
<circle
|
||||||
|
cx="8" cy="5" r="1.188">
|
||||||
|
</circle>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 530 B |
|
Before Width: | Height: | Size: 933 B |
|
Before Width: | Height: | Size: 179 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13 13c-.3 0-.5-.1-.7-.3L8 8.4l-4.3 4.3c-.9.9-2.3-.5-1.4-1.4l5-5c.4-.4 1-.4 1.4 0l5 5c.6.6.2 1.7-.7 1.7zm0-11H3C1.7 2 1.7 4 3 4h10c1.3 0 1.3-2 0-2z"/></svg>
|
||||||
|
After Width: | Height: | Size: 228 B |
|
Before Width: | Height: | Size: 266 B |
|
Before Width: | Height: | Size: 301 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M15 3.7V13c0 1.5-1.53 3-3 3H7.13c-.72 0-1.63-.5-2.13-1l-5-5s.84-1 .87-1c.13-.1.33-.2.53-.2.1 0 .3.1.4.2L4 10.6V2.7c0-.6.4-1 1-1s1 .4 1 1v4.6h1V1c0-.6.4-1 1-1s1 .4 1 1v6.3h1V1.7c0-.6.4-1 1-1s1 .4 1 1v5.7h1V3.7c0-.6.4-1 1-1s1 .4 1 1z"/></svg>
|
||||||
|
After Width: | Height: | Size: 312 B |
|
Before Width: | Height: | Size: 583 B |
|
Before Width: | Height: | Size: 175 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8 10c-.3 0-.5-.1-.7-.3l-5-5c-.9-.9.5-2.3 1.4-1.4L8 7.6l4.3-4.3c.9-.9 2.3.5 1.4 1.4l-5 5c-.2.2-.4.3-.7.3zm5 2H3c-1.3 0-1.3 2 0 2h10c1.3 0 1.3-2 0-2z"/></svg>
|
||||||
|
After Width: | Height: | Size: 229 B |
|
Before Width: | Height: | Size: 276 B |
|
Before Width: | Height: | Size: 360 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M1 1a1 1 0 011 1v2.4A7 7 0 118 15a7 7 0 01-4.9-2 1 1 0 011.4-1.5 5 5 0 10-1-5.5H6a1 1 0 010 2H1a1 1 0 01-1-1V2a1 1 0 011-1z"/></svg>
|
||||||
|
After Width: | Height: | Size: 204 B |
|
Before Width: | Height: | Size: 731 B |
|
Before Width: | Height: | Size: 359 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M15 1a1 1 0 0 0-1 1v2.418A6.995 6.995 0 1 0 8 15a6.954 6.954 0 0 0 4.95-2.05 1 1 0 0 0-1.414-1.414A5.019 5.019 0 1 1 12.549 6H10a1 1 0 0 0 0 2h5a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 494 B |
|
Before Width: | Height: | Size: 714 B |
|
Before Width: | Height: | Size: 218 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M0 4h1.5c1 0 1.5.5 1.5 1.5v5c0 1-.5 1.5-1.5 1.5H0zM9.5 4c1 0 1.5.5 1.5 1.5v5c0 1-.5 1.5-1.5 1.5h-3c-1 0-1.5-.5-1.5-1.5v-5C5 4.5 5.5 4 6.5 4zM16 4h-1.5c-1 0-1.5.5-1.5 1.5v5c0 1 .5 1.5 1.5 1.5H16z"/></svg>
|
||||||
|
After Width: | Height: | Size: 275 B |