diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-service/Dockerfile" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-service/Dockerfile" new file mode 100644 index 0000000000000000000000000000000000000000..ce0f38995189c3b7825c8c080b3235194fad41e1 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-service/Dockerfile" @@ -0,0 +1,11 @@ +FROM wefe_java_base + +WORKDIR /opt/service + +COPY board-service.jar /opt/service/board-service.jar + +COPY start.sh /opt/service/start.sh + +# RUN chmod +x /opt/service/start.sh + +CMD ["sh", "/opt/service/start.sh"] diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-service/board-service.md" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-service/board-service.md" new file mode 100644 index 0000000000000000000000000000000000000000..d6ab8dcb8715709651ceb97732d7aa876e80bea7 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-service/board-service.md" @@ -0,0 +1,92 @@ +#打jar包 +```shell +mvn clean install -Dmaven.test.skip=true -am -pl board/board-service +``` +#Dockerfile手动打镜像并且保存为离线版 +```shell +FROM wefe_java_base + +WORKDIR /opt/service + +COPY board-service.jar /opt/service/board-service.jar + +COPY start.sh /opt/service/start.sh + +# RUN chmod +x /opt/service/start.sh + +CMD ["sh", "/opt/service/start.sh"] + +``` + +#启动脚本start.sh +```shell +java -jar -Dconfig.path=config.properties board-service.jar +``` + +#镜像构建 +```shell +sudo docker build -t wefe_board_service:$WEFE_VERSION . +sudo docker save -o wefe_board_service_$WEFE_VERSION.tar wefe_board_service:$WEFE_VERSION +``` + +#docker-compose.yml +```shell +version: "3" +services: + + wefe_board_service: + image: wefe_board_service:v.2.2 # wefe_version + ports: + - 8080:8080 # service_port + restart: always + privileged: true + networks: + - network + volumes: + - "/data/wefe/docker-compose/logs/service:/data/logs/wefe-board-service" # service_logs + - "./mount/start.sh:/opt/service/start.sh" + - "./mount/config.properties:/opt/service/config.properties" + - "./mount/application.properties:/opt/service/application.properties" + - "./mount/board-service.jar:/opt/service/board-service.jar" + +networks: + network: + driver: bridge +``` +#启动脚本wefe_board_service_start.sh +```shell +#!/bin/bash + +# 导入配置 +source ../wefe.cfg + +# 修改服务启动配置 +sed -i "/service_logs/s@-.*:@- \"$DATA_PATH/logs/service:@g" ./resources/docker-compose.yml +sed -i "/wefe_version/s/service:.*#/service:$WEFE_VERSION #/g" ./resources/docker-compose.yml + +# 修改镜像文件配置 +sed -i "/service_port/s/-.*:/- $BOARD_SERVICE_PORT:/g" ./resources/docker-compose.yml + +# 加载本地离线镜像包 +echo "开始加载 board-service 离线镜像" +docker load < resources/wefe_board_service_${WEFE_VERSION}\.tar +echo "加载 board-service 离线镜像完成" + +docker-compose -p $WEFE_ENV -f resources/docker-compose.yml up -d + +``` +#停止脚本wefe_board_service_stop.sh +```shell +#!/bin/bash + +docker-compose -p wefe -f resources/docker-compose.yml down + +``` + + + +在界面上成员信息配置各自的gateway地址: +10.10.178.147:50051 +10.10.178.148:50051 +在界面上系统配置信息配置 +![img.png](img.png) \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-service/config.properties" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-service/config.properties" new file mode 100644 index 0000000000000000000000000000000000000000..842494a2dda20e3bc2bf0218ec7231721904439e --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-service/config.properties" @@ -0,0 +1,147 @@ +# ************************************************ +# The configuration for job +# ************************************************ + +# Environment name, different configuration files for different environments . +# Enums: prod銆乨ev銆乫at銆乶one +# Default is none +env.name=prod + +# Different branches have different functions +# Enums: master銆乷nline_demo +env.branch=master + +# 鏂囦欢涓婁紶鐩稿叧鍔熻兘浼氬皢鏂囦欢缁熶竴涓婁紶鍒版鐩綍 +wefe.file.upload.dir=/data/wefe_file_upload_dir + +# base url of union +wefe.union.base-url=https://wefe.tianmiantech.com/union-service/ + +# base url of serving +wefe.serving.base-url= + +# Working mode of modeling tasks +# Use integer type definition: Cluster mode=1, stand-alone mode=0 +# If work_mode=1 is used, multi-party interaction needs to go through the gateway +# work_mode=SPARK +wefe.job.work_mode=1 + +# ************************************************ +# The configuration for storing data +# ************************************************ + +# The type of database which data is stored in CLICKHOUSE or LMDB +# LMDB is suitable for the stand-alone mode, and clickhouse is suitable for the cluster mode +db.storage.type=CLICKHOUSE + +# If CLICKHOUSE is used, the following configuration is included +# In general, you need to change the url銆乭ost銆乸ort銆乽sername銆乸assword , the other use by default +db.storage.clickhouse.driverClassName=ru.yandex.clickhouse.ClickHouseDriver +db.storage.clickhouse.url=jdbc:clickhouse://10.10.178.147:8122 +db.storage.clickhouse.host=10.10.178.147 +db.storage.clickhouse.tcp.port=9900 +db.storage.clickhouse.username=wefe +db.storage.clickhouse.password=wefe2020 +db.storage.clickhouse.initialSize=1 +db.storage.clickhouse.maxActive=50 +db.storage.clickhouse.minIdle=1 +db.storage.clickhouse.maxWait=60000 +db.storage.clickhouse.testWhileIdle=true +db.storage.clickhouse.validationQuery=SELECT 1 +db.storage.clickhouse.timeBetweenEvictionRunsMillis=5000 +db.storage.clickhouse.minEvictableIdleTimeMillis=10000 +db.storage.clickhouse.removeAbandoned=true +db.storage.clickhouse.removeAbandonedTimeout=300 +db.storage.clickhouse.logAbandoned=true +# The batch size of written to CLICKHOUSE in bulk锛孶nits: M(support for sub-counts) +db.storage.clickhouse.optimal.insert.byte.size=1 + +# If LMDB is used, the following configuration is included +lmdb.database.name=lmdbtest +lmdb.max.size=256 +lmdb.database.count=10 +lmdb.path=/data/lmdb +lmdb.partitions=8 + +# ************************************************ +# The configuration for business database mysql +# mysql is used to save modeling processes, modeling information, member information, and more +# ************************************************ + +db.mysql.url=jdbc:mysql://10.10.178.147:4406/wefe_board?serverTimezone=GMT%2B8 +db.mysql.host=10.10.178.147 +db.mysql.port=4406 +db.mysql.database=wefe_board +db.mysql.username=wefe +db.mysql.password=wefe2020 + +# ************************************************ +# The configuration for flow +# ************************************************ + +# The root of the flow log, which supports relative paths +flow.log.root.path=./logs + +wefe.job.backend=SPARK + +# ************************************************ +# If you are using the spark backend, the following configuration is required +# ************************************************ + +flow.spark.submit.default.driver.memory=15g +flow.spark.submit.default.driver.maxResultSize=2g +flow.spark.submit.default.num.executors=6 +flow.spark.submit.default.executor.memory=2g +flow.spark.submit.default.executor.cores=1 +flow.spark.default.num.slices=32 + +# ************************************************ +# If you are using the fc backend, the following configuration is required +# ************************************************ + +# the type of intermediate data in function calculates锛宱nly ots is supported +fc.storage.type=oss + +# the region of function calculates +fc.region=cn-shenzhen + +# the alias for the function call +fc.qualifier=LATEST + +# the service name for the function call +fc.service.name=wefe-fc + +# the account ID for the function call +fc.account_id=xxx + +# the access key id for the function call +fc.access_key_id=xxx + +# the access key secret for the function call +fc.access_key_secret=xxx + +# the end point for the function call +fc.end_point=https://xxx.cn-shenzhen.fc.aliyuncs.com + +# instance name of ots +fc.ots.instance_name=fc-*** + +# the end point of the ots internal and external network +fc.ots.internal_end_point=https://fc-***.cn-shenzhen.ots.aliyuncs.com +fc.ots.end_point=https://fc-***.cn-shenzhen.ots.aliyuncs.com + +# Used to send intermediate data generated during calculations at oss +fc.cloud_store.temp_auth_internal_end_point=https://oss-cn-shenzhen-internal.aliyuncs.com +fc.cloud_store.temp_auth_end_point=https://oss-cn-shenzhen.aliyuncs.com +fc.cloud_store.temp_auth_role_arn=acs:ram::xxx:role/wefe-fc-ossread +fc.cloud_store.temp_auth_role_session_name=tianmian +fc.cloud_store.temp_auth_duration_seconds=36000 + + +# ************************************************ +# oss configuration for fc +# ************************************************ +fc.oss.bucket_name=xxx +fc.oss.endpoint=http://oss-cn-shenzhen.aliyuncs.com +fc.oss.internal_endpoint=http://oss-cn-shenzhen-internal.aliyuncs.com + diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-service/img.png" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-service/img.png" new file mode 100644 index 0000000000000000000000000000000000000000..2b78c258a748465947a0e490742d890b87200643 Binary files /dev/null and "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-service/img.png" differ diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-service/start.sh" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-service/start.sh" new file mode 100644 index 0000000000000000000000000000000000000000..84394559c7f9379f82a2ca6857933183a6c0607f --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-service/start.sh" @@ -0,0 +1 @@ +java -jar -Dconfig.path=config.properties board-service.jar \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-website/board-website.md" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-website/board-website.md" new file mode 100644 index 0000000000000000000000000000000000000000..c3d556766f1c380e5cce01331fefbadf4220ad94 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/board-website/board-website.md" @@ -0,0 +1,97 @@ +#前端打包 +```shell +npm build +``` +#打前端镜像 +```shell +FROM nginx:1.19.2 + +WORKDIR /opt/website + +ADD html.tar /opt/website/ +``` + +#打前端镜像 +```shell +sudo docker build -t wefe_board_website:$WEFE_VERSION . +sudo docker save -o wefe_board_website_$WEFE_VERSION.tar wefe_board_website:$WEFE_VERSION +``` + +#docker-compose +```shell +version: "3" +services: + + wefe_board_website: + image: wefe_board_website:v.2.2 # wefe_version + ports: + - 80:80 # website_port + restart: always + privileged: true + networks: + - network + volumes: + - "./mount/index.html:/opt/website/html/board-website/index.html" + - "./mount/default.conf:/etc/nginx/conf.d/default.conf" + - "./mount/html:/opt/website/html" + +networks: + network: + driver: bridge +``` + +#nginx配置 +```shell +server { + + listen 80; + server_name 10.10.178.147; + + root /opt/website/html; + + client_max_body_size 100m; + + location /board-website/ { + try_files $uri /board-website/index.html; + } + + location /board-service/ { + add_header Access-Control-Allow-Origin *; + add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; + add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; + + if ($request_method = 'OPTIONS') { + return 204; + } + + proxy_pass http://10.10.178.147:8080/board-service/; + proxy_read_timeout 1800; + } + +} + +``` +#启动脚本wefe_board_website_start.sh +```shell +#!/bin/bash + +# 导入配置 +source ../wefe.cfg + +# Nginx 配置文件修改 +sed -i "/server_name/s/server_name.*;/server_name $EXTRANET_IP;/g" ./resources/mount/default.conf +sed -i "/proxy_pass/s@proxy_pass.*;@proxy_pass http://$EXTRANET_IP:$BOARD_SERVICE_PORT/board-service/;@g" ./resources/mount/default.conf + +# 修改静态文件 +sed -i "s@baseUrl.*/board-service@baseUrl: \"http://$EXTRANET_IP:$NGINX_PORT/board-service@g" ./resources/mount/index.html +sed -i "/wefe_version/s/website:.*#/website:$WEFE_VERSION #/g" ./resources/docker-compose.yml +sed -i "/website_port/s/-.*:/- $NGINX_PORT:/g" ./resources/docker-compose.yml + +echo "开始加载 board-website 离线镜像" +docker load < resources/wefe_board_website_${WEFE_VERSION}\.tar +echo "加载 board-website 离线镜像完成" + +docker-compose -p $WEFE_ENV -f resources/docker-compose.yml up -d + +``` +#停止脚本wefe_board_website_stop.sh diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/gateway/Dockerfile" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/gateway/Dockerfile" new file mode 100644 index 0000000000000000000000000000000000000000..8012615aab027ca2356900101d627c3795f19442 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/gateway/Dockerfile" @@ -0,0 +1,11 @@ +FROM wefe_java_base + +WORKDIR /opt/gateway + +COPY gateway.jar /opt/gateway/gateway.jar + +COPY start.sh /opt/gateway/start.sh + +# RUN chmod +x /opt/gateway/start.sh + +CMD ["sh", "/opt/gateway/start.sh"] \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/gateway/config.properties" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/gateway/config.properties" new file mode 100644 index 0000000000000000000000000000000000000000..842494a2dda20e3bc2bf0218ec7231721904439e --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/gateway/config.properties" @@ -0,0 +1,147 @@ +# ************************************************ +# The configuration for job +# ************************************************ + +# Environment name, different configuration files for different environments . +# Enums: prod銆乨ev銆乫at銆乶one +# Default is none +env.name=prod + +# Different branches have different functions +# Enums: master銆乷nline_demo +env.branch=master + +# 鏂囦欢涓婁紶鐩稿叧鍔熻兘浼氬皢鏂囦欢缁熶竴涓婁紶鍒版鐩綍 +wefe.file.upload.dir=/data/wefe_file_upload_dir + +# base url of union +wefe.union.base-url=https://wefe.tianmiantech.com/union-service/ + +# base url of serving +wefe.serving.base-url= + +# Working mode of modeling tasks +# Use integer type definition: Cluster mode=1, stand-alone mode=0 +# If work_mode=1 is used, multi-party interaction needs to go through the gateway +# work_mode=SPARK +wefe.job.work_mode=1 + +# ************************************************ +# The configuration for storing data +# ************************************************ + +# The type of database which data is stored in CLICKHOUSE or LMDB +# LMDB is suitable for the stand-alone mode, and clickhouse is suitable for the cluster mode +db.storage.type=CLICKHOUSE + +# If CLICKHOUSE is used, the following configuration is included +# In general, you need to change the url銆乭ost銆乸ort銆乽sername銆乸assword , the other use by default +db.storage.clickhouse.driverClassName=ru.yandex.clickhouse.ClickHouseDriver +db.storage.clickhouse.url=jdbc:clickhouse://10.10.178.147:8122 +db.storage.clickhouse.host=10.10.178.147 +db.storage.clickhouse.tcp.port=9900 +db.storage.clickhouse.username=wefe +db.storage.clickhouse.password=wefe2020 +db.storage.clickhouse.initialSize=1 +db.storage.clickhouse.maxActive=50 +db.storage.clickhouse.minIdle=1 +db.storage.clickhouse.maxWait=60000 +db.storage.clickhouse.testWhileIdle=true +db.storage.clickhouse.validationQuery=SELECT 1 +db.storage.clickhouse.timeBetweenEvictionRunsMillis=5000 +db.storage.clickhouse.minEvictableIdleTimeMillis=10000 +db.storage.clickhouse.removeAbandoned=true +db.storage.clickhouse.removeAbandonedTimeout=300 +db.storage.clickhouse.logAbandoned=true +# The batch size of written to CLICKHOUSE in bulk锛孶nits: M(support for sub-counts) +db.storage.clickhouse.optimal.insert.byte.size=1 + +# If LMDB is used, the following configuration is included +lmdb.database.name=lmdbtest +lmdb.max.size=256 +lmdb.database.count=10 +lmdb.path=/data/lmdb +lmdb.partitions=8 + +# ************************************************ +# The configuration for business database mysql +# mysql is used to save modeling processes, modeling information, member information, and more +# ************************************************ + +db.mysql.url=jdbc:mysql://10.10.178.147:4406/wefe_board?serverTimezone=GMT%2B8 +db.mysql.host=10.10.178.147 +db.mysql.port=4406 +db.mysql.database=wefe_board +db.mysql.username=wefe +db.mysql.password=wefe2020 + +# ************************************************ +# The configuration for flow +# ************************************************ + +# The root of the flow log, which supports relative paths +flow.log.root.path=./logs + +wefe.job.backend=SPARK + +# ************************************************ +# If you are using the spark backend, the following configuration is required +# ************************************************ + +flow.spark.submit.default.driver.memory=15g +flow.spark.submit.default.driver.maxResultSize=2g +flow.spark.submit.default.num.executors=6 +flow.spark.submit.default.executor.memory=2g +flow.spark.submit.default.executor.cores=1 +flow.spark.default.num.slices=32 + +# ************************************************ +# If you are using the fc backend, the following configuration is required +# ************************************************ + +# the type of intermediate data in function calculates锛宱nly ots is supported +fc.storage.type=oss + +# the region of function calculates +fc.region=cn-shenzhen + +# the alias for the function call +fc.qualifier=LATEST + +# the service name for the function call +fc.service.name=wefe-fc + +# the account ID for the function call +fc.account_id=xxx + +# the access key id for the function call +fc.access_key_id=xxx + +# the access key secret for the function call +fc.access_key_secret=xxx + +# the end point for the function call +fc.end_point=https://xxx.cn-shenzhen.fc.aliyuncs.com + +# instance name of ots +fc.ots.instance_name=fc-*** + +# the end point of the ots internal and external network +fc.ots.internal_end_point=https://fc-***.cn-shenzhen.ots.aliyuncs.com +fc.ots.end_point=https://fc-***.cn-shenzhen.ots.aliyuncs.com + +# Used to send intermediate data generated during calculations at oss +fc.cloud_store.temp_auth_internal_end_point=https://oss-cn-shenzhen-internal.aliyuncs.com +fc.cloud_store.temp_auth_end_point=https://oss-cn-shenzhen.aliyuncs.com +fc.cloud_store.temp_auth_role_arn=acs:ram::xxx:role/wefe-fc-ossread +fc.cloud_store.temp_auth_role_session_name=tianmian +fc.cloud_store.temp_auth_duration_seconds=36000 + + +# ************************************************ +# oss configuration for fc +# ************************************************ +fc.oss.bucket_name=xxx +fc.oss.endpoint=http://oss-cn-shenzhen.aliyuncs.com +fc.oss.internal_endpoint=http://oss-cn-shenzhen-internal.aliyuncs.com + diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/gateway/gateway.md" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/gateway/gateway.md" new file mode 100644 index 0000000000000000000000000000000000000000..1661bfa0bb4fea2c15c38886db15136d0d6a2b30 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/gateway/gateway.md" @@ -0,0 +1,48 @@ +#打jar包 +```shell +mvn clean install -Dmaven.test.skip=true -am -pl gateway +``` +#手动打镜像并且保存为离线版 +```shell +FROM wefe_java_base + +WORKDIR /opt/gateway + +COPY gateway.jar /opt/gateway/gateway.jar + +COPY start.sh /opt/gateway/start.sh + +# RUN chmod +x /opt/gateway/start.sh + +CMD ["sh", "/opt/gateway/start.sh"] + + +``` + +#sh +```shell +#!/bin/bash +java -jar gateway.jar +``` +#制作镜像 +```shell + +sudo docker build -t wefe_gateway_service:$WEFE_VERSION . +sudo docker save -o wefe_gateway_service_$WEFE_VERSION.tar wefe_gateway_service:$WEFE_VERSION +``` + +#Dockerfile +```shell +FROM wefe_java_base + +WORKDIR /opt/gateway + +COPY gateway.jar /opt/gateway/gateway.jar +COPY config.properties /opt/gateway/config.properties +COPY start.sh /opt/gateway/start.sh + +# RUN chmod +x /opt/gateway/start.sh + +CMD ["sh", "/opt/gateway/start.sh"] + +``` diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/gateway/satrt.sh" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/gateway/satrt.sh" new file mode 100644 index 0000000000000000000000000000000000000000..9863fec4ce53e4bd5e0d52186c00fc144360fd9e --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/gateway/satrt.sh" @@ -0,0 +1,2 @@ +#!/bin/bash +java -jar gateway.jar \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/java-base/java-base.md" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/java-base/java-base.md" new file mode 100644 index 0000000000000000000000000000000000000000..44344d2cabf0a703ed2d5f4445fe0fbb40923d49 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/java-base/java-base.md" @@ -0,0 +1,24 @@ +```dockerfile +# 指定基础镜像 +FROM centos:centos7.5.1804 +#语言编码设置 +RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 +ENV LC_ALL zh_CN.UTF-8 +# 修改时区 +RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone +# 指定构建镜像时的工作目录 +WORKDIR /opt/docker_jdk +# 复制文件到镜像中 +ADD jdk-8u261-linux-x64.tar.gz /opt/docker_jdk/ +# 配置环境变量 +ENV JAVA_HOME=/opt/docker_jdk/jdk1.8.0_261 +ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar +ENV PATH=$JAVA_HOME/bin:$PATH + +``` + +#镜像构建 +```dockerfile + sudo docker build -t wefe_java_base . +``` + diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/middleware-service/middleware-service.md" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/middleware-service/middleware-service.md" new file mode 100644 index 0000000000000000000000000000000000000000..2048b5df59f0007bbdf78034e38954e15819ec72 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/middleware-service/middleware-service.md" @@ -0,0 +1,45 @@ +#docker-compose.yml +```shell +version: "3" +services: + + wefe_middleware_service_clickhouse: + image: yandex/clickhouse-server:20.6.5.8 + restart: always + ports: + - 8122:8123 # clickhouse_port + - 9900:9000 # clickhouse_tcp_port + privileged: true + networks: + - network + volumes: + - "/data/wefe/docker-compose/clickhouse:/var/lib/clickhouse" # clickhouse_data + - "./mount/clickhouse/config.xml:/etc/clickhouse-server/config.xml" + - "./mount/clickhouse/users.xml:/etc/clickhouse-server/users.xml" + - "./mount/clickhouse/clickhouse_init_db.sh:/docker-entrypoint-initdb.d/init-db.sh" + wefe_middleware_service_mysql: + image: mysql:5.7.24 + environment: + MYSQL_ROOT_PASSWORD: "wefe2020" + MYSQL_USER: "wefe" + MYSQL_PASSWORD: "wefe2020" + MYSQL_DATABASE: "wefe_board" + command: [ + '--character-set-server=utf8mb4', + '--collation-server=utf8mb4_unicode_ci', + '--default-time-zone=+8:00' + ] + ports: + - 4406:3306 # mysql_port + restart: always + privileged: true + networks: + - network + volumes: + - '/data/wefe/docker-compose/mysql:/var/lib/mysql' # mysql_data + - './mount/sql/wefe_board.sql:/docker-entrypoint-initdb.d/wefe_board.sql' + +networks: + network: + driver: bridge +``` \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-base/python-base.md" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-base/python-base.md" new file mode 100644 index 0000000000000000000000000000000000000000..d9a1a69007252a98fba9916cbabb86ea76d7839d --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-base/python-base.md" @@ -0,0 +1,195 @@ +#手动打镜,替换为自己的spark,Dockerfile + +```shell +#基础镜像为centos,版本为7,build镜像时会自动下载 +FROM centos:centos7.5.1804 + +#语言编码设置 +RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 +ENV LC_ALL zh_CN.UTF-8 + +# 修改时区 +RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone \ +&& yum -y install gcc gcc-c++ make openssl-devel gmp-devel mpfr-devel libmpc-devel libaio numactl \ +autoconf automake libtool libffi-devel snappy snappy-devel zlib zlib-devel bzip2 bzip2-devel lz4-devel \ +libasan lsof sysstat telnet psmisc python3-devel wget less vim + +# 本地环境路径 +ARG LOCAL_ENV_BASE=. + +# 镜像环境路径 +ARG ENV_BASE=/data/environment +ARG MINICONDA_DIR=$ENV_BASE/miniconda3 +ARG PYTHON_DIR=$ENV_BASE/miniconda3/envs/wefe-python37 +ARG SPARK_DIR=$ENV_BASE/spark-3.2.0-bin-hadoop2.7 +ARG JDK_DIR=$ENV_BASE/jdk1.8.0_241 +ARG OSSUTIL_DIR=$ENV_BASE/ossutil +ARG NODEJS_DIR=$ENV_BASE/nodejs +ARG FUN_ENVIRONMENT_DIR=$ENV_BASE/.s/python + +# 在镜像创建目录 +RUN mkdir -p $MINICONDA_DIR \ +&& mkdir -p $SPARK_DIR \ +&& mkdir -p $JDK_DIR \ +&& mkdir -p $OSSUTIL_DIR \ +&& mkdir -p $NODEJS_DIR \ +&& mkdir -p $FUN_ENVIRONMENT_DIR + + +# 复制 miniconda 的 python 环境 +COPY $LOCAL_ENV_BASE/miniconda3 $MINICONDA_DIR/ + +# 复制 spark 环境 +COPY $LOCAL_ENV_BASE/spark-3.2.0-bin-hadoop2.7 $SPARK_DIR/ + +# 复制 jdk 环境 +COPY $LOCAL_ENV_BASE/jdk1.8.0_241 $JDK_DIR/ + +# 复制 ossutil +COPY $LOCAL_ENV_BASE/ossutil $OSSUTIL_DIR + +# 复制 nodejs 环境,包含 serverless devs 工具 +COPY $LOCAL_ENV_BASE/nodejs $NODEJS_DIR + +# 复制函数计算依赖 +#COPY $LOCAL_ENV_BASE/python $FUN_ENVIRONMENT_DIR + +# 配置环境变量 +ENV JAVA_HOME $JDK_DIR +ENV PATH $JAVA_HOME/bin:$PATH +# Spark +ENV SPARK_HOME $SPARK_DIR +ENV PATH $SPARK_HOME/bin:$PATH +ENV LD_LIBRARY_PATH $SPARK_HOME/jars + +ENV PYTHON_HOME $PYTHON_DIR +ENV PATH $PYTHON_HOME/bin:$PATH + +ENV NODE_HOME $NODEJS_DIR +ENV PATH $NODE_HOME/bin:$PATH +ENV NODE_PATH $NODE_HOME/lib/node_modules +``` + + +#镜像构建 +```shell +sudo docker build -t wefe_python_base . +``` + +#flow/service.sh +```shell +#!/bin/bash + +#!/bin/bash +export PYTHONPATH=/opt/welab/wefe +export SPARK_HOME=/data/environment/spark-3.2.0-bin-hadoop2.7 +# export PYSPARK_PYTHON=/data/spark-2.4.5-bin-hadoop2.7/python +# PYTHON_ROOT=$(dirname "$PWD") +PYTHON_ROOT=/opt/welab/wefe +#log_dir=${PYTHON_ROOT}/logs +log_dir=/data/logs/flow_server + +#venv=/data/environment/venv +venv=/data/environment/miniconda3/envs/wefe-python37 +flowUrl=http://0.0.0.0:5000 + +getpid() { + pid=$(ps -ef|grep python|grep app_launcher.py|grep -v grep|awk '{print $2}') + + if [[ -n ${pid} ]]; then + return 1 + else + return 0 + fi +} + +mklogsdir() { + if [[ ! -d $log_dir ]]; then + mkdir -p $log_dir + fi +} + +status() { + getpid + if [[ -n ${pid} ]]; then + echo "status: + `ps aux | grep ${pid} | grep -v grep`" + return 1 + else + echo "service not running" + return 0 + fi +} + +clean_pyc(){ + find $PYTHON_ROOT -name '*.pyc' -type f -exec rm {} \; +} + +start() { + getpid + if [[ $? -eq 0 ]]; then + + mklogsdir + # clean_pyc + + source ${venv}/bin/activate + + pip install -r ${PYTHON_ROOT}/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple + + python3 ${PYTHON_ROOT}/flow/service/config/fill_config_shell_service.py + nohup python3 ${PYTHON_ROOT}/flow/app_launcher.py >> "${log_dir}/console.log" 2>>"${log_dir}/error.log" & + + sleep 3 + getpid + if [[ -n ${pid} ]]; then + echo "service start sucessfully. pid: ${pid}" + else + echo "service start failed, please check ${log_dir}/error.log and ${log_dir}/console.log" + fi + else + echo "service already started. pid: ${pid}" + fi +} + +stop() { + getpid + if [[ -n ${pid} ]]; then + echo "killing: + `ps aux | grep ${pid} | grep -v grep`" + kill -9 ${pid} + kill -9 $(ps -ef|grep wefe|grep task_executor|grep -v grep|awk '{print $2}') + if [[ $? -eq 0 ]]; then + echo "killed" + else + echo "kill error" + fi + else + echo "service not running" + fi +} + +case "$1" in + start) + start + status + ;; + + stop) + stop + ;; + status) + status + ;; + + restart) + stop + start + status + ;; + *) + echo "usage: $0 {start|stop|status|restart}" + exit -1 +esac + + +``` \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-base/service.sh" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-base/service.sh" new file mode 100644 index 0000000000000000000000000000000000000000..7521b6276f38fcd81481360872dd44b8252dcece --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-base/service.sh" @@ -0,0 +1,112 @@ +#!/bin/bash + +#!/bin/bash +export PYTHONPATH=/opt/welab/wefe +export SPARK_HOME=/data/environment/spark-3.2.0-bin-hadoop2.7 +# export PYSPARK_PYTHON=/data/spark-2.4.5-bin-hadoop2.7/python +# PYTHON_ROOT=$(dirname "$PWD") +PYTHON_ROOT=/opt/welab/wefe +#log_dir=${PYTHON_ROOT}/logs +log_dir=/data/logs/flow_server + +#venv=/data/environment/venv +venv=/data/environment/miniconda3/envs/wefe-python37 +flowUrl=http://0.0.0.0:5000 + +getpid() { + pid=$(ps -ef|grep python|grep app_launcher.py|grep -v grep|awk '{print $2}') + + if [[ -n ${pid} ]]; then + return 1 + else + return 0 + fi +} + +mklogsdir() { + if [[ ! -d $log_dir ]]; then + mkdir -p $log_dir + fi +} + +status() { + getpid + if [[ -n ${pid} ]]; then + echo "status: + `ps aux | grep ${pid} | grep -v grep`" + return 1 + else + echo "service not running" + return 0 + fi +} + +clean_pyc(){ + find $PYTHON_ROOT -name '*.pyc' -type f -exec rm {} \; +} + +start() { + getpid + if [[ $? -eq 0 ]]; then + + mklogsdir + # clean_pyc + + source ${venv}/bin/activate + + pip install -r ${PYTHON_ROOT}/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple + + python3 ${PYTHON_ROOT}/flow/service/config/fill_config_shell_service.py + nohup python3 ${PYTHON_ROOT}/flow/app_launcher.py >> "${log_dir}/console.log" 2>>"${log_dir}/error.log" & + + sleep 3 + getpid + if [[ -n ${pid} ]]; then + echo "service start sucessfully. pid: ${pid}" + else + echo "service start failed, please check ${log_dir}/error.log and ${log_dir}/console.log" + fi + else + echo "service already started. pid: ${pid}" + fi +} + +stop() { + getpid + if [[ -n ${pid} ]]; then + echo "killing: + `ps aux | grep ${pid} | grep -v grep`" + kill -9 ${pid} + kill -9 $(ps -ef|grep wefe|grep task_executor|grep -v grep|awk '{print $2}') + if [[ $? -eq 0 ]]; then + echo "killed" + else + echo "kill error" + fi + else + echo "service not running" + fi +} + +case "$1" in + start) + start + status + ;; + + stop) + stop + ;; + status) + status + ;; + + restart) + stop + start + status + ;; + *) + echo "usage: $0 {start|stop|status|restart}" + exit -1 +esac diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-service/python-service.md" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-service/python-service.md" new file mode 100644 index 0000000000000000000000000000000000000000..a674cb0419aefd0a3b038b7395928eb55c48fe6e --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-service/python-service.md" @@ -0,0 +1,48 @@ + +#Dockerfile +#ntos,版本为7,build镜像时会自动下载 +```shell +FROM wefe_python_base + +#语言编码设置 +RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 +ENV LC_ALL zh_CN.UTF-8 + +# 修改时区 +RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone + +# 项目位置 +ENV CODE_DIR=/opt/welab/wefe + +# 在镜像创建目录 +RUN mkdir -p $CODE_DIR + +# 将项目模块放入 docker 镜像 +COPY ./python_project $CODE_DIR/ +``` + +#镜像构建 +```shell +sudo docker build -t wefe_python_service:$WEFE_VERSION . +sudo docker save -o wefe_python_service_$WEFE_VERSION.tar wefe_python_service:$WEFE_VERSION +``` + + +#进入容器,客户机安装krb5 +```shell +yum install krb5-workstation krb5-libs krb5-auth-dialog +配置这些主机上的/etc/krb5.conf, krb5.conf拿去覆盖 +sudo docker cp /work/wefeonhand/wefe/krb5.conf e7b8b9fd56e6:/etc/ +添加hosts +172.21.72.165 host165 +172.21.72.166 host166 +172.21.72.167 host167 +172.21.72.164 host164 +kinit -kt 密钥 principal +kinit -kt ./bdp.keytab bdp/admin@NBDP.COM + + +klist + +sc.textFile("hdfs://nameservice1:8020/user/bdp/liuyan/testdata.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_ + _).collect +``` \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/README_CLUSTER.md" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/README_CLUSTER.md" new file mode 100644 index 0000000000000000000000000000000000000000..b58e7a7771c05c5f1684a86c287b6ba252d29569 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/README_CLUSTER.md" @@ -0,0 +1,157 @@ +Wefe Spark 闆嗙兢鐗堢浉鍏抽厤缃笌閮ㄧ讲鏂规銆 + +master 鍜 worker 閮芥槸 wefe 鐨勫熀浜 docker 鍚姩鐨 WeFe PythonProject锛屽悇闆嗙兢鑺傜偣閮介渶瑕佹湁鐩稿叧鐨勮繍琛岀幆澧冧互鍙婇」鐩唬鐮併 +#Oocker鐜 +master,worker涓绘満閮介渶瑕侀儴缃瞕ocker鐜 + +# 鍏嶅瘑鐧婚檰 + +閮ㄧ讲 WeFe 闆嗙兢鐗堟湰闇瑕侀厤缃富浠庢満鍣ㄩ棿鍙繘琛 Root 鍏嶅瘑鐧婚檰銆 + +**鍏瀵嗛挜** + +鑻 A 闇瑕 SSH 鍏嶅瘑鐧婚檰 B锛屽垯 A 闇瑕佺敓鎴愬叕閽ュ拰绉侀挜锛岃 B 闇瑕佹湁 A 鐨勫叕閽ャ +## 鏈哄櫒 A鎿嶄綔 +```shell +sudo su root +# 榛樿涓ゆ鍥炶溅鐢熸垚鍏挜鍜岀閽 +ssh-keygen -t rsa -P "" +cat ~/.ssh/id_rsa.pub +``` +鍏挜澶嶅埗 +```shell +# 澶嶅埗 A 鐨勫叕閽ュ埌192.168.18.63鍜岃嚜宸192.168.18.62锛屽涓嬶細 +ssh-copy-id root@192.168.18.63 +ssh-copy-id root@192.168.18.62 +``` + +## 鏈哄櫒 B鎿嶄綔 +```shell +#鍘籦绔涓嬬洰褰曟煡鐪 +cat ~/.ssh/authorized_keys +``` + +sshd 閰嶇疆 +```shell +#SSH 鏈嶅姟榛樿鏄笉鍏佽 Root 瑙掕壊鐨勫厤瀵嗙櫥闄嗙殑锛岄渶瑕佷慨鏀瑰叾榛樿閰嶇疆鏂囦欢 /etc/ssh/sshd_config +# 淇敼鏈哄櫒 B 鐨 SSH 鏈嶅姟閰嶇疆 +PermitRootLogin yes +``` + +鍏嶅瘑鐧婚檰娴嬭瘯 + +```shell +# A 鐧婚檰 B +#63 +ssh root@[B IP] +#62鑷繁 +ssh root@[B IP] +``` + + + +#Docker璺ㄥ涓绘満 + +Docker 瀹瑰櫒涓殑鍚勮妭鐐归渶瑕佽法涓绘満閫氫俊锛岃繖閲屼娇鐢 Docker 銆 + +瑕佸疄鐜 Overlay 缃戠粶锛岄渶瑕佷竴涓彂鐜版湇鍔★紝杩欓噷浣跨敤 Consul 杩涜鏈嶅姟鍙戠幇銆 + +## Consul 閮ㄧ讲閰嶇疆 + +Consul 闇瑕侀儴缃插湪 master 鏈哄櫒涓娿 + +###master + +涓嬭浇 Consul 闀滃儚骞跺惎鍔紝榛樿鍚姩鍦 8500 绔彛銆 + +```shell +docker pull consul:1.9.10 +docker run -d -p 8500:8500 -h consul --name consul consul:1.9.10 +``` + +璁块棶鍦板潃 `[master ip]:8500`锛岃嫢鏈嶅姟鍚姩鎴愬姛锛屽垯鍙甯歌闂 Consul WebUI 椤甸潰銆 + +淇敼 master 鏈哄櫒涓婄殑 Docker 閰嶇疆鏂囦欢 /etc/docker/daemon.json锛屾坊鍔犱互涓嬮厤缃細 + +```json +{ + "live-restore": true, + "cluster-store": "consul://[master ip]:8500", + "cluster-advertise": "[master ip]:2375" + } +#淇敼瀹 Docker 鐨 daemon.json 閰嶇疆鏂囦欢鍚庨噸鍚 docker 鏈嶅姟 +systemctl restart docker +``` + +###worker +淇敼 worker 鏈哄櫒涓婄殑 Docker 閰嶇疆鏂囦欢 /etc/docker/daemon.json锛屾坊鍔犱互涓嬮厤缃細 + +```json +{ + "live-restore": true, + "cluster-store": "consul://[master ip]:8500", + "cluster-advertise": "[worker ip]:2375" +} +#淇敼瀹 Docker 鐨 daemon.json 閰嶇疆鏂囦欢鍚庨噸鍚 docker 鏈嶅姟 +systemctl restart docker +``` + + +## Overlay 缃戠粶妯″紡 +###master +鍦 master 鏈哄櫒涓婂垱寤 Docker Overlay 缃戠粶銆 + +闇瑕佹敞鎰忕殑鏄紝姝ゅ鎸囧畾鐨勭綉缁 subnet 闇瑕佷笌 wefe.cfg 涓厤缃殑 CONTAINER_SUBNET 涓鑷达紙榛樿鏄竴鑷寸殑锛夈 + +```shell +docker network create -d overlay --subnet 10.101.0.0/24 spark_overlay +``` + +###鏌ョ湅缃戠粶鏄惁鍒涘缓鎴愬姛 +```shell +docker network ls +NETWORK ID NAME DRIVER SCOPE +769154a98055 bridge bridge local +8c5cbe459b08 host host local +f2360fcee185 none null local +35bb09768374 spark_overlay overlay global +``` +鍦 worker 鏈嶅姟鍣ㄦ煡鐪嬪湪 master 鍒涘缓鐨 Global Overlay 绫诲瀷鐨勭綉缁 wefe_overlay 鏄惁琚垚鍔熷悓姝ャ +```shell +docker network ls +NETWORK ID NAME DRIVER SCOPE +eeb10ebaadf8 bridge bridge local +1bb6fcbb2787 host host local +41f556e18465 none null local +35bb09768374 spark_overlay overlay global +``` + +鑻ュ湪 worker 鐨勬湇鍔″櫒涓婅兘鐪嬪埌鍒涘缓鐨 Global Overlay 绫诲瀷鐨勭綉缁 spark_overlay锛屽垯缃戠粶鍚屾鎴愬姛锛岀綉缁滈厤缃垚鍔熴 + +# 閰嶇疆涓庨儴缃 + +閮ㄧ讲 Spark 闆嗙兢鐗堬紝闇瑕佹寜闇淇敼 Spark 鐩稿叧閰嶇疆锛岄粯璁ら厤缃涓嬨 + +``` +# 閰嶇疆鏂囦欢浣嶄簬椤圭洰鏍圭洰褰曚笅鐨 wefe.cfg 鏂囦欢涓 + +# SPARK 鍚姩妯″紡 LOCAL / STANDALONE锛屽叾涓 STANDALONE 涓 spark 鐨勯泦缇ゆā寮 +SPARK_MODE=LOCAL +# 鑻ラ噰鐢ㄩ泦缇ゆā寮忥紝闇瑕侀厤缃 MASTER 鍙 WORKER 鍙傛暟锛屼笖淇濊瘉鍚勬満鍣ㄩ棿宸查厤缃 SSH 鍏嶅瘑鐧诲綍浠ュ強 Overlay 缃戠粶 +# 鐩墠鍙敮鎸佸崟涓 master锛岃嫢骞蹭釜 worker 鐨勬ā寮 +SPARK_MASTER=192.168.18.61 +# 濉啓鏈哄櫒鐨勫唴缃 IP锛岄楀彿鍒嗛殧 +SPARK_WORKERS=192.168.18.61,192.168.18.61 +SPARK_SUBMIT_PORT=7077 +SPARK_MASTER_UI_PORT=8082 +# 鐩稿簲鐨 worker 鐨 worker_ui_port 涔熼渶瑕佸涓厤缃 +SPARK_WORKER_UI_PORTS=8081,8083 +SPARK_CLUSTER_DATA_PATH=/data/wefe/wefe_spark_cluster/ +# 闆嗙兢 SPARK 瀹瑰櫒鐨勭綉娈 IP锛堣櫄鎷熺綉娈碉紝涓嶅缓璁慨鏀癸級 +CONTAINER_SUBNET=10.101.0.0 +``` + + + + + diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/config.properties" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/config.properties" new file mode 100644 index 0000000000000000000000000000000000000000..a7d48895d3af4a773a2cc23e201edd7efb99e484 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/config.properties" @@ -0,0 +1,150 @@ +# ************************************************ +# The configuration for job +# ************************************************ + +# Environment name, different configuration files for different environments . +# Enums: prod銆乨ev銆乫at銆乶one +# Default is none +env.name=prod + +# Different branches have different functions +# Enums: master銆乷nline_demo +env.branch=master + +# 鏂囦欢涓婁紶鐩稿叧鍔熻兘浼氬皢鏂囦欢缁熶竴涓婁紶鍒版鐩綍 +wefe.file.upload.dir=/data/wefe_file_upload_dir + +# base url of union +wefe.union.base-url=https://wefe.tianmiantech.com/union-service/ + +# base url of serving +wefe.serving.base-url= + +# Working mode of modeling tasks +# Use integer type definition: Cluster mode=1, stand-alone mode=0 +# If work_mode=1 is used, multi-party interaction needs to go through the gateway +# work_mode=0 is only used in stand-alone mode锛寃ithout gateway interaction, the transmitted data is directly written to mysql锛宱ften used with "wefe.job.backend=LOCAL" +wefe.job.work_mode=1 + +# ************************************************ +# The configuration for storing data +# ************************************************ + +# The type of database which data is stored in CLICKHOUSE or LMDB +# LMDB is suitable for the stand-alone mode, and clickhouse is suitable for the cluster mode +db.storage.type=CLICKHOUSE + +# If CLICKHOUSE is used, the following configuration is included +# In general, you need to change the url銆乭ost銆乸ort銆乽sername銆乸assword , the other use by default +db.storage.clickhouse.driverClassName=ru.yandex.clickhouse.ClickHouseDriver +db.storage.clickhouse.url=jdbc:clickhouse://127.0.0.1:8153 +db.storage.clickhouse.host=127.0.0.1 +db.storage.clickhouse.tcp.port=9030 +db.storage.clickhouse.username=welab +db.storage.clickhouse.password=pwd +db.storage.clickhouse.initialSize=1 +db.storage.clickhouse.maxActive=50 +db.storage.clickhouse.minIdle=1 +db.storage.clickhouse.maxWait=60000 +db.storage.clickhouse.testWhileIdle=true +db.storage.clickhouse.validationQuery=SELECT 1 +db.storage.clickhouse.timeBetweenEvictionRunsMillis=5000 +db.storage.clickhouse.minEvictableIdleTimeMillis=10000 +db.storage.clickhouse.removeAbandoned=true +db.storage.clickhouse.removeAbandonedTimeout=300 +db.storage.clickhouse.logAbandoned=true +# The batch size of written to CLICKHOUSE in bulk锛孶nits: M(support for sub-counts) +db.storage.clickhouse.optimal.insert.byte.size=1 + +# If LMDB is used, the following configuration is included +lmdb.database.name=lmdbtest +lmdb.max.size=256 +lmdb.database.count=10 +lmdb.path=/data/lmdb +lmdb.partitions=8 + +# ************************************************ +# The configuration for business database mysql +# mysql is used to save modeling processes, modeling information, member information, and more +# ************************************************ + +db.mysql.url=jdbc:mysql://127.0.0.1:3306/wefe_board?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=GMT%2B8 +db.mysql.host=127.0.0.1 +db.mysql.port=3306 +db.mysql.database=wefe_board +db.mysql.username=wefe +db.mysql.password=****** + +# ************************************************ +# The configuration for flow +# ************************************************ + +# The root of the flow log, which supports relative paths +flow.log.root.path=./logs + +wefe.job.backend=SPARK + +# ************************************************ +# If you are using the spark backend, the following configuration is required +# ************************************************ + +flow.spark.submit.default.driver.memory=1g +flow.spark.submit.default.driver.maxResultSize=1g +flow.spark.submit.default.num.executors=1 +flow.spark.submit.default.executor.memory=1g +flow.spark.submit.default.executor.cores=1 +flow.spark.default.num.slices=1 + +# ************************************************ +# If you are using the fc backend, the following configuration is required +# ************************************************ + +# the type of intermediate data in function calculates锛宱nly ots is supported +fc.storage.type=oss + +# the region of function calculates +fc.region=cn-shenzhen + +# the alias for the function call +fc.qualifier=LATEST + +# the service name for the function call +fc.service.name=wefe-fc + +# the account ID for the function call +fc.account_id=294***9042 + +# the access key id for the function call +fc.access_key_id=LTA***ND7 + +# the access key secret for the function call +fc.access_key_secret=nxL***sfv + +# fc account type: api or admin +fc.account_type=admin + +# the end point for the function call +fc.end_point=https://145******.cn-shenzhen.fc.aliyuncs.com + +# instance name of ots +fc.ots.instance_name=fc-*** + +# the end point of the ots internal and external network +fc.ots.internal_end_point=https://fc-***.cn-shenzhen.ots.aliyuncs.com +fc.ots.end_point=https://fc-***.cn-shenzhen.ots.aliyuncs.com + +# Used to send intermediate data generated during calculations at oss +fc.cloud_store.temp_auth_internal_end_point=https://oss-cn-shenzhen-internal.aliyuncs.com +fc.cloud_store.temp_auth_end_point=https://oss-cn-shenzhen.aliyuncs.com +fc.cloud_store.temp_auth_role_arn=acs:ram::145*******:role/wefe-fc-ossread +fc.cloud_store.temp_auth_role_session_name=tianmian +fc.cloud_store.temp_auth_duration_seconds=36000 + + +# ************************************************ +# oss configuration for fc +# ************************************************ +fc.oss.bucket_name=wefe-fc +fc.oss.endpoint=http://oss-cn-shenzhen.aliyuncs.com +fc.oss.internal_endpoint=http://oss-cn-shenzhen-internal.aliyuncs.com + diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/docker-compose.yml" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/docker-compose.yml" new file mode 100644 index 0000000000000000000000000000000000000000..68b4d45f0960776a10ed1092eaf0c13223bb374c --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/docker-compose.yml" @@ -0,0 +1,34 @@ +version: "3" +services: + # python 鏈嶅姟 + wefe_python_service: + image: wefe_python_service:v.2.2 # wefe_version + tty: true + env_file: + - variables.env + ports: + - 8888:5000 # flow_port + privileged: true + networks: + - network + volumes: + - ./mount/config.properties:/opt/welab/wefe/config.properties + # 鎸傚湪鏂囦欢澶逛細鍚屾锛屾寕鍦ㄦ枃浠朵笉涓瀹氬悓姝(vim缂栬緫涓嶄細鍚屾,闇瑕佺粰鏂囦欢鍔犳潈闄 chmod 777 file, echo 缂栬緫浼氬悓姝) + - /data/wefe/docker-compose/logs/flow:/opt/welab/wefe/logs # flow_logs + command: +# sh -c "sh /opt/welab/wefe/fc/function/wefe-fc/update_env.sh && sh /opt/welab/wefe/flow/service.sh start && tail -f /dev/null" + + - sh + - -c + - | + sh /opt/welab/wefe/common/python/calculation/fc/function/wefe-fc/fc_deploy.sh & + sh /opt/welab/wefe/flow/service.sh start + tail -f /dev/null + + deploy: + restart_policy: + condition: on-failure + +networks: + network: + driver: bridge diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/mount/config.properties" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/mount/config.properties" new file mode 100644 index 0000000000000000000000000000000000000000..19dd33bcbde62b655075e9a9fbf429621fc28154 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/mount/config.properties" @@ -0,0 +1,147 @@ +# ************************************************ +# The configuration for job +# ************************************************ + +# Environment name, different configuration files for different environments . +# Enums: prod銆乨ev銆乫at銆乶one +# Default is none +env.name=prod + +# Different branches have different functions +# Enums: master銆乷nline_demo +env.branch=master + +# 鏂囦欢涓婁紶鐩稿叧鍔熻兘浼氬皢鏂囦欢缁熶竴涓婁紶鍒版鐩綍 +wefe.file.upload.dir=/data/wefe_file_upload_dir + +# base url of union +wefe.union.base-url=https://wefe.tianmiantech.com/union-blockchain/ + +# base url of serving +wefe.serving.base-url= + +# Working mode of modeling tasks +# Use integer type definition: Cluster mode=1, stand-alone mode=0 +# If work_mode=1 is used, multi-party interaction needs to go through the gateway +# work_mode=0 is only used in stand-alone mode锛寃ithout gateway interaction, the transmitted data is directly written to mysql锛宱ften used with "wefe.job.backend=LOCAL" +wefe.job.work_mode=1 + +# ************************************************ +# The configuration for storing data +# ************************************************ + +# The type of database which data is stored in CLICKHOUSE or LMDB +# LMDB is suitable for the stand-alone mode, and clickhouse is suitable for the cluster mode +db.storage.type=CLICKHOUSE + +# If CLICKHOUSE is used, the following configuration is included +# In general, you need to change the url銆乭ost銆乸ort銆乽sername銆乸assword , the other use by default +db.storage.clickhouse.driverClassName=ru.yandex.clickhouse.ClickHouseDriver +db.storage.clickhouse.url=jdbc:clickhouse://127.0.0.1:8153 +db.storage.clickhouse.host=127.0.0.1 +db.storage.clickhouse.tcp.port=9030 +db.storage.clickhouse.username=welab +db.storage.clickhouse.password=pwd +db.storage.clickhouse.initialSize=1 +db.storage.clickhouse.maxActive=50 +db.storage.clickhouse.minIdle=1 +db.storage.clickhouse.maxWait=60000 +db.storage.clickhouse.testWhileIdle=true +db.storage.clickhouse.validationQuery=SELECT 1 +db.storage.clickhouse.timeBetweenEvictionRunsMillis=5000 +db.storage.clickhouse.minEvictableIdleTimeMillis=10000 +db.storage.clickhouse.removeAbandoned=true +db.storage.clickhouse.removeAbandonedTimeout=300 +db.storage.clickhouse.logAbandoned=true +# The batch size of written to CLICKHOUSE in bulk锛孶nits: M(support for sub-counts) +db.storage.clickhouse.optimal.insert.byte.size=1 + +# If LMDB is used, the following configuration is included +lmdb.database.name=lmdbtest +lmdb.max.size=256 +lmdb.database.count=10 +lmdb.path=/data/lmdb +lmdb.partitions=8 + +# ************************************************ +# The configuration for business database mysql +# mysql is used to save modeling processes, modeling information, member information, and more +# ************************************************ + +db.mysql.url=jdbc:mysql://127.0.0.1:3306/wefe_board?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=GMT%2B8 +db.mysql.host=127.0.0.1 +db.mysql.port=3306 +db.mysql.database=wefe_board +db.mysql.username=wefe +db.mysql.password=****** + +# ************************************************ +# The configuration for flow +# ************************************************ + +# The root of the flow log, which supports relative paths +flow.log.root.path=./logs + +wefe.job.backend=SPARK + +# ************************************************ +# If you are using the spark backend, the following configuration is required +# ************************************************ + +flow.spark.submit.default.driver.memory=1g +flow.spark.submit.default.driver.maxResultSize=1g +flow.spark.submit.default.num.executors=1 +flow.spark.submit.default.executor.memory=1g +flow.spark.submit.default.executor.cores=1 +flow.spark.default.num.slices=1 + +# ************************************************ +# If you are using the fc backend, the following configuration is required +# ************************************************ + +# the type of intermediate data in function calculates锛宱nly ots is supported +fc.storage.type=oss + +# the region of function calculates +fc.region=cn-shenzhen + +# the alias for the function call +fc.qualifier=LATEST + +# the service name for the function call +fc.service.name=wefe-fc + +# the account ID for the function call +fc.account_id=294***9042 + +# the access key id for the function call +fc.access_key_id=LTA***ND7 + +# the access key secret for the function call +fc.access_key_secret=nxL***sfv + +# the end point for the function call +fc.end_point=https://145******.cn-shenzhen.fc.aliyuncs.com + +# instance name of ots +fc.ots.instance_name=fc-*** + +# the end point of the ots internal and external network +fc.ots.internal_end_point=https://fc-***.cn-shenzhen.ots.aliyuncs.com +fc.ots.end_point=https://fc-***.cn-shenzhen.ots.aliyuncs.com + +# Used to send intermediate data generated during calculations at oss +fc.cloud_store.temp_auth_internal_end_point=https://oss-cn-shenzhen-internal.aliyuncs.com +fc.cloud_store.temp_auth_end_point=https://oss-cn-shenzhen.aliyuncs.com +fc.cloud_store.temp_auth_role_arn=acs:ram::145*******:role/*********read +fc.cloud_store.temp_auth_role_session_name=tianmian +fc.cloud_store.temp_auth_duration_seconds=36000 + + +# ************************************************ +# oss configuration for fc +# ************************************************ +fc.oss.bucket_name=wefe-fc +fc.oss.endpoint=http://oss-cn-shenzhen.aliyuncs.com +fc.oss.internal_endpoint=http://oss-cn-shenzhen-internal.aliyuncs.com + diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/template/docker-compose-gpu.yml.template" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/template/docker-compose-gpu.yml.template" new file mode 100644 index 0000000000000000000000000000000000000000..76778a22223f8c1b1323353dd62ca9bf350d16fa --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/template/docker-compose-gpu.yml.template" @@ -0,0 +1,32 @@ +version: "3" +services: + # python 鏈嶅姟 + wefe_python_service: + image: wefe_python_gpu_service:v.2.1 # wefe_version + tty: true + runtime: nvidia + env_file: + - variables.env + ports: + - 8888:5000 # flow_port + privileged: true + networks: + - network + volumes: + - ./mount/config.properties:/opt/welab/wefe/config.properties + # 鎸傚湪鏂囦欢澶逛細鍚屾锛屾寕鍦ㄦ枃浠朵笉涓瀹氬悓姝(vim缂栬緫涓嶄細鍚屾,闇瑕佺粰鏂囦欢鍔犳潈闄 chmod 777 file, echo 缂栬緫浼氬悓姝) + - /data/wefe/docker-compose/logs/flow:/opt/welab/wefe/logs # flow_logs + command: + - sh + - -c + - | + sh /opt/welab/wefe/flow/service.sh start + tail -f /dev/null + + deploy: + restart_policy: + condition: on-failure + +networks: + network: + driver: bridge diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/template/docker-compose-master.yml.template" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/template/docker-compose-master.yml.template" new file mode 100644 index 0000000000000000000000000000000000000000..759d548c9dca664b29cac87c11b58c5364fb4938 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/template/docker-compose-master.yml.template" @@ -0,0 +1,40 @@ +version: "3" +services: + # python 鏈嶅姟 + wefe_python_service_master: + image: wefe_python_service:v.2.1 # wefe_version + tty: true + env_file: + - variables.env + hostname: master + ports: + - 8888:5000 # flow_port + - 4040-4049:4040-4049 + - 8080:8080 # spark_master_ui_port + privileged: true + environment: + - "SPARK_PUBLIC_DNS=to_replace_ip" # master_public_dns + - SPARK_MASTER_WEBUI_PORT=8080 # master_web_ui_port + networks: + spark_overlay: + ipv4_address: to_replace_ip # master_container_ip + volumes: + - ./mount/config.properties:/opt/welab/wefe/config.properties + # 鎸傚湪鏂囦欢澶逛細鍚屾锛屾寕鍦ㄦ枃浠朵笉涓瀹氬悓姝(vim缂栬緫涓嶄細鍚屾,闇瑕佺粰鏂囦欢鍔犳潈闄 chmod 777 file, echo 缂栬緫浼氬悓姝) + - /data/wefe/docker-compose/logs/flow:/data/logs # flow_logs + command: + - sh + - -c + - | + cd /data/environment/spark-3.0.1-bin-hadoop2.7/conf && cp spark-defaults.conf.template spark-defaults.conf + sh /data/environment/spark-3.0.1-bin-hadoop2.7/sbin/start-master.sh + sh /opt/welab/wefe/flow/service.sh start + tail -f /dev/null + + deploy: + restart_policy: + condition: on-failure + +networks: + spark_overlay: + external: true diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/template/docker-compose-worker.yml.template" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/template/docker-compose-worker.yml.template" new file mode 100644 index 0000000000000000000000000000000000000000..455491a8693854523f060d7d3f73433ee05fb927 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/template/docker-compose-worker.yml.template" @@ -0,0 +1,38 @@ +version: "3" +services: + # python 鏈嶅姟 + wefe_python_service_worker: # worker_name + image: wefe_python_service:v.2.1 # wefe_version + environment: + - PYTHONPATH=/opt/welab/wefe + - SPARK_WORKER_WEBUI_PORT=8081 # worker_web_ui_port + - "SPARK_PUBLIC_DNS=to_replace_ip" # worker_public_dns + tty: true + ports: + - 8081:8081 # spark_worker_ui_port + privileged: true + extra_hosts: + - "master:to_replace_container_ip" # worker_extra_hosts + networks: + spark_overlay: + ipv4_address: to_replace_ip # worker_container_ip + volumes: + - ./mount/config.properties:/opt/welab/wefe/config.properties + # 鎸傚湪鏂囦欢澶逛細鍚屾锛屾寕鍦ㄦ枃浠朵笉涓瀹氬悓姝(vim缂栬緫涓嶄細鍚屾,闇瑕佺粰鏂囦欢鍔犳潈闄 chmod 777 file, echo 缂栬緫浼氬悓姝) + - /data/wefe/docker-compose/logs/flow:/data/logs # flow_logs + command: +# sh -c "sh /opt/welab/wefe/fc/function/wefe-fc/update_env.sh && sh /opt/welab/wefe/flow/service.sh start && tail -f /dev/null" + + - sh + - -c + - | + sh /data/environment/spark-3.0.1-bin-hadoop2.7/sbin/start-slave.sh spark://master:7077 + tail -f /dev/null + + deploy: + restart_policy: + condition: on-failure + +networks: + spark_overlay: + external: true diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/variables.env" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/variables.env" new file mode 100644 index 0000000000000000000000000000000000000000..008f1cbfb6a823cc538fa09a477b2dda99130448 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/resources/variables.env" @@ -0,0 +1,7 @@ +# define python service container env + +FLOW_PORT= +NGINX_PORT= +GATEWAY_PORT= + +INTRANET_IP= diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/spark_cluster.sh" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/spark_cluster.sh" new file mode 100644 index 0000000000000000000000000000000000000000..700a7e64cecfe886dc38d4f792a696a63ea796d3 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/spark_cluster.sh" @@ -0,0 +1,247 @@ +source ./wefe.cfg +export PWD=$(pwd) + +# 鍓嶇疆澶勭悊 +if [ $SPARK_MODE = "STANDALONE" ] +then + echo '褰撳墠涓洪泦缇ら儴缃' +else + echo '闈為泦缇ゆā寮忥紝閫鍑' + exit 0 +fi + +# 妫鏌ヤ緷璧栫幆澧 + +# Consul 鏈嶅姟 +CONSUL_SERVICE=$(docker ps | grep consul) +if [[ ! $CONSUL_SERVICE ]]; then + echo '鏈娴嬪埌 consul 鏈嶅姟锛岃鍙傜収闆嗙兢閮ㄧ讲鏂囨。閮ㄧ讲 consul 鏈嶅姟' + exit 0 +fi + +# 缃戠粶妫娴 +OVERLAY_NETWORK=$(docker network ls | grep overlay) +if [[ ! $OVERLAY_NETWORK ]]; then + echo '鏈娴嬪埌 Overlay 缃戠粶锛岃鍙傜収闆嗙兢閮ㄧ讲鏂囨。鍒涘缓 Overlay 缃戠粶' + exit 0 +fi + + +INPUT_ACTION=$1 + +# ****************** +# 鍑芥暟锛氭嫹璐濆崟涓猵ython service鍒拌繙绋嬫満鍣 +# ***************** +_cp_python_service(){ + # 鍙傛暟 + to_host=$1 + to_path=$2 + + if [ ${#to_path} -gt 5 ]; then + echo "鍒犻櫎杩滅▼鐩綍${to_host}:${to_path}骞堕噸鏂板垱寤" + ssh root@$to_host "rm -rf $to_path" + ssh root@$to_host "mkdir -p $to_path" + fi + + echo "鍑嗗鎷疯礉鏁版嵁鍒$to_host鐨$to_path鐩綍锛岃鑰愬績绛夊緟..." + scp wefe.cfg root@$to_host:$to_path + scp config.properties root@$to_host:$to_path + scp -r wefe_python_service root@$to_host:$to_path/ >/dev/null 2>&1 +} + +# ****************** +# 鍑芥暟锛氬仠姝㈠崟涓猵ython service +# ***************** +_stop_python_service(){ + # 鍙傛暟 + to_host=$1 + to_path=$2 + + echo "鍑嗗鍏抽棴杩滅▼瀹瑰櫒$to_host, 鐩綍:$to_path" + # ssh root@$to_host "cd $to_path && cd wefe_python_service && sh wefe_python_service_stop.sh" + to_stop=$(ssh root@$to_host "docker ps -a | grep $WEFE_ENV | grep python " | awk '{print $1}' | xargs) + ssh root@$to_host "docker stop $to_stop" + sleep 1 +} + + +_remove_python_service(){ + # 鍙傛暟 + to_host=$1 + to_path=$2 + + echo "鍑嗗鍏抽棴杩滅▼瀹瑰櫒$to_host, 鐩綍:$to_path" + # ssh root@$to_host "cd $to_path && cd wefe_python_service && sh wefe_python_service_stop.sh" + to_remove=$(ssh root@$to_host "docker ps -a | grep $WEFE_ENV | grep python " | awk '{print $1}' | xargs) + ssh root@$to_host "docker rm $to_remove" + sleep 1 +} + +# ****************** +# 鍑芥暟锛氬惎鍔ㄥ崟涓猵ython service +# ***************** +_start_python_service(){ + # 鍙傛暟: + to_host=$1 + to_path=$2 + identity=$3 + identity_name=$4 + container_ip=$5 + worker_ui_port=$6 + + echo "鍑嗗鍚姩杩滅▼瀹瑰櫒$to_host, 鐩綍:$to_path, 韬唤:$identity, identity_name:$identity_name" + ssh root@$to_host "cd $to_path && cd wefe_python_service && sh wefe_python_service_start.sh $identity $identity_name $container_ip $to_host $worker_ui_port" + sleep 1 +} + +# ****************** +# 鍑芥暟锛氭牴鎹甤ontainer_index鐢熸垚瀹瑰櫒ip +# ***************** +_generate_container_ip(){ + container_index=$1 + + container_subnet_split=(${CONTAINER_SUBNET//./ }) + container_subnet_split[${#container_subnet_split[@]}-1]=$container_index + container_ip=$(IFS=.; echo "${container_subnet_split[*]}") + echo $container_ip +} + +# ****************** +# 鍑芥暟锛氭嫹璐 python service 鍒版墍鏈夌殑杩滅▼鏈哄櫒 +# ***************** +cp_python_service_all(){ + + # 鎷疯礉鏁版嵁鍒拌繙绋 master 鐩綍 + REMOTE_MASTER_PATH=$SPARK_CLUSTER_DATA_PATH/master + # ssh root@$SPARK_MASTER "mkdir -p $master_path" + + # 鎷疯礉python service 鍒癿aster + _cp_python_service $SPARK_MASTER $REMOTE_MASTER_PATH + + # 鎷疯礉鍒版瘡涓 worker + workers=(`echo $SPARK_WORKERS | tr ',' ' '` ) + index=0 + for worker in ${workers[@]} + do + # echo $worker + worker_path=$SPARK_CLUSTER_DATA_PATH"/worker_"$index + + # 杩滅▼鍒涘缓 worker 鐩綍 + # ssh root@$worker "mkdir -p $worker_path" + # echo $worker_path + + # 杩滅▼鎷疯礉 + _cp_python_service $worker $worker_path + + index=$[index + 1] + done + +} + +# ****************** +# 鍑芥暟锛氬惎鍔ㄩ泦缇 python service +# ***************** +start_cluster(){ + + # 鎷疯礉闀滃儚鍒伴泦缇ゆ満鍣 + cp_python_service_all + + # container_index锛岄粯璁よ缃粠2寮濮 + container_index=2 + master_container_ip=$(_generate_container_ip $container_index) + + # master鐩綍 + REMOTE_MASTER_PATH=$SPARK_CLUSTER_DATA_PATH/master + + # start master + _start_python_service $SPARK_MASTER $REMOTE_MASTER_PATH master master $master_container_ip no_worder_ui_port + sleep 3 + + # 鎷疯礉鍒版瘡涓 worker + workers=(`echo $SPARK_WORKERS | tr ',' ' '` ) + worker_ui_ports=(`echo $SPARK_WORKER_UI_PORTS | tr ',' ' '` ) + index=0 + for worker in ${workers[@]} + do + echo $worker + worker_path=$SPARK_CLUSTER_DATA_PATH"/worker_"$index + worker_name="worker_"$index + container_index=$[container_index + 1] + worker_container_ip=$(_generate_container_ip $container_index) + worker_ui_port=${worker_ui_ports[$index]} + + # 杩滅▼鍚姩 worker + _start_python_service $worker $worker_path worker $worker_name $worker_container_ip $worker_ui_port + + index=$[index + 1] + done + +} + + +# ****************** +# 鍑芥暟锛氬仠姝㈤泦缇ython service +# ***************** +stop_cluster(){ + + # master鐩綍 + master_path=$SPARK_CLUSTER_DATA_PATH/master + + # start master + _stop_python_service $SPARK_MASTER $master_path + sleep 3 + + # 鎷疯礉鍒版瘡涓 worker + workers=(`echo $SPARK_WORKERS | tr ',' ' '` ) + index=0 + for worker in ${workers[@]} + do + echo $worker + worker_path=$SPARK_CLUSTER_DATA_PATH"/worker_"$index + + # 杩滅▼鍚姩 worker + _stop_python_service $worker $worker_path + + index=$[index + 1] + done + +} + +remove_cluster(){ + + # master鐩綍 + master_path=$SPARK_CLUSTER_DATA_PATH/master + + # start master + _remove_python_service $SPARK_MASTER $master_path + sleep 3 + + # 鎷疯礉鍒版瘡涓 worker + workers=(`echo $SPARK_WORKERS | tr ',' ' '` ) + index=0 + for worker in ${workers[@]} + do + echo $worker + worker_path=$SPARK_CLUSTER_DATA_PATH"/worker_"$index + + # 杩滅▼鍚姩 worker + _remove_python_service $worker $worker_path + + index=$[index + 1] + done + +} + + +#case $INPUT_ACTION in +# start) +# start_python_service_all +# ;; +# stop) +# stop_python_service_all +# ;; +# *) +# echo "Please Input a Legal Action" +# echo "eg. {start | stop | restart | help}" +# exit -1 +#esac diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/wefe.cfg" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/wefe.cfg" new file mode 100644 index 0000000000000000000000000000000000000000..a6aa7f5a2ad31f7db6ba99cd723bce2b5a35e98a --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/wefe.cfg" @@ -0,0 +1,118 @@ +# ************** +# 浠ヤ笅閰嶇疆涓哄繀濉」 +# *************** + +### VERSION #### +WEFE_VERSION=v.2.2 +WEFE_ENV=release + +# 鑻ヤ笉闇瑕佸缃戣闂紝鍒欓兘濉啓鍐呯綉鍦板潃 +# 鏈満鍐呯綉 IP +INTRANET_IP=127.0.0.1 +# 鏈満澶栫綉 IP +EXTRANET_IP=127.0.0.1 + +# ************** +# 浠ヤ笅閰嶇疆涓洪夊~椤 +# *************** + +# Docker 鏁版嵁瀛樺偍鐩綍锛岄渶瑕佸閲忚緝澶х殑鐩綍 +DATA_PATH=/data/wefe/docker-compose + +### middleware ### + +# mysql 甯愬彿瀵嗙爜涓庢暟鎹簱 +MYSQL_USERNAME=wefe +MYSQL_PASSWORD=wefe2020 +MYSQL_DATABASE=wefe_board +# mysql 绔彛 +MYSQL_PORT=4406 + +# clickhouse +# 甯愬彿瀵嗙爜 +CLICKHOUSE_USERNAME=wefe +CLICKHOUSE_PASSWORD=wefe2020 +# 鏈嶅姟绔彛 +CLICKHOUSE_PORT=8122 +CLICKHOUSE_TCP_PORT=9900 + +### board_website ### + +# nginx 绔彛 +NGINX_PORT=80 + +### board-service ### + +# 鏈嶅姟绔彛 +BOARD_SERVICE_PORT=8080 + +### Flow ### + +# 鏈嶅姟绔彛 +PYTHON_SERVICE_PORT=5000 + +### gateway ### + +# 缃戝叧绔彛 +GATEWAY_SERVICE_PORT=50051 + +### 璁$畻寮曟搸 ### + +# 璁$畻寮曟搸锛孲PARK or FC +CALCULATION_ENGINE=SPARK + +### Spark 寮曟搸鐩稿叧閰嶇疆 ### + +# SPARK 鍚姩妯″紡 LOCAL / STANDALONE锛屽叾涓 STANDALONE 涓 spark 鐨勯泦缇ゆā寮 +SPARK_MODE=STANDALONE +# 鑻ラ噰鐢ㄩ泦缇ゆā寮忥紝闇瑕侀厤缃 MASTER 鍙 WORKER 鍙傛暟锛屼笖淇濊瘉鍚勬満鍣ㄩ棿宸查厤缃 SSH 鍏嶅瘑鐧诲綍浠ュ強 Overlay 缃戠粶 +# 鐩墠鍙敮鎸佸崟涓 master锛岃嫢骞蹭釜 worker 鐨勬ā寮 +SPARK_MASTER=192.168.1.2 +# 澶氫釜 IP 浠ラ楀彿鍒嗛殧 +SPARK_WORKERS=192.168.1.2,192.168.1.3 +SPARK_SUBMIT_PORT=7077 +SPARK_MASTER_UI_PORT=8082 +# 鐩稿簲鐨 worker 鐨 worker_ui_port 涔熼渶瑕佸涓厤缃 +SPARK_WORKER_UI_PORTS=8081,8081 +SPARK_CLUSTER_DATA_PATH=/data/wefe/wefe_spark_cluster/ +# 闆嗙兢SPARK瀹瑰櫒鐨勭綉娈礗P[涓鑸儏鍐典笅涓嶇敤淇敼] +CONTAINER_SUBNET=10.101.0.0 + +# 榛樿涓 32G 鍐呭瓨鐨勬湇鍔″櫒閰嶇疆 +SPARK_DRIVER_MEMORY=15g +SPARK_DRIVER_MAXRESULTSIZE=2g +SPARK_NUM_EXECUTORS=6 +SPARK_EXECUTOR_MEMORY=2g +SPARK_EXECUTOR_CORES=1 +SPARK_NUM_SLICES=32 + +# 闃块噷浜戝嚱鏁拌绠楀紩鎿庣浉鍏抽厤缃 +FC_ACCOUNT_ID="xxx" +FC_REGION="cn-shenzhen" +FC_ACCESS_KEY_ID="xxx" +FC_ACCESS_KEY_SECRET="xxx" +FC_QUALIFIER="LATEST" +FC_STORAGE_TYPE="oss" +FC_OSS_BUCKET_NAME="xxx" +FC_VPC_ID="" +FC_V_SWITCH_IDS="" +FC_SECURITY_GROUP_ID="" +FC_ACCOUNT_TYPE=admin + +# CPU銆丟PU 妯″紡鐩稿叧閰嶇疆锛孨ONE or GPU +ACCELERATION="NONE" + +### 鍒嗗竷寮忛儴缃查厤缃 ### + +# 涓棿浠舵湇鍔 IP +MIDDLEWARE_SERVICE_INTRANET_IP= +MIDDLEWARE_SERVICE_EXTRANET_IP= +# Python 鏈嶅姟 IP +PYTHON_SERVICE_INTRANET_IP= +PYTHON_SERVICE_EXTRANET_IP= +# Board 鏈嶅姟 IP +BOARD_SERVICE_INTRANET_IP= +BOARD_SERVICE_EXTRANET_IP= +# Gateway 鏈嶅姟 IP +GATEWAY_SERVICE_INTRANET_IP= +GATEWAY_SERVICE_EXTRANET_IP= \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/wefe_python_service_start.sh" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/wefe_python_service_start.sh" new file mode 100644 index 0000000000000000000000000000000000000000..16f43b6adfa0eef5ce447f3cc1839703fc4b834f --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/wefe_python_service_start.sh" @@ -0,0 +1,81 @@ + +#!/bin/bash + +# 瀵煎叆閰嶇疆 +source ../wefe.cfg + +identity_type=$1 +identity_name=$2 +cluster_container_ip=$3 +cluster_host_ip=$4 +worker_ui_port=$5 + +# ****************** +# 瀹氫箟鍑芥暟锛歞ocker-compose閰嶇疆鍒濆鍖 +# ***************** +spark_cluster_config(){ + echo "褰撳墠type:$identity_type" + case $identity_type in + master) + cp -f resources/template/docker-compose-master.yml.template resources/docker-compose.yml + sed -i "/master_web_ui_port/s/=.* #/=$SPARK_MASTER_UI_PORT #/g" ./resources/docker-compose.yml + sed -i "/spark_master_ui_port/s/8080:8080/$SPARK_MASTER_UI_PORT:$SPARK_MASTER_UI_PORT/g" ./resources/docker-compose.yml + sed -i "/master_public_dns/s/SPARK_PUBLIC_DNS=to_replace_ip/SPARK_PUBLIC_DNS=$SPARK_MASTER/g" ./resources/docker-compose.yml + sed -i "/master_container_ip/s/ipv4_address: to_replace_ip/ipv4_address: $cluster_container_ip/g" ./resources/docker-compose.yml + ;; + worker) + cp -f resources/template/docker-compose-worker.yml.template resources/docker-compose.yml + sed -i "/worker_name/s/wefe_python_service_worker/wefe_python_service_$identity_name/g" ./resources/docker-compose.yml + sed -i "/worker_public_dns/s/SPARK_PUBLIC_DNS=to_replace_ip/SPARK_PUBLIC_DNS=$cluster_host_ip/g" ./resources/docker-compose.yml + sed -i "/worker_web_ui_port/s/=.* #/=$worker_ui_port #/g" ./resources/docker-compose.yml + sed -i "/worker_container_ip/s/ipv4_address: to_replace_ip/ipv4_address: $cluster_container_ip/g" ./resources/docker-compose.yml + + # worker ui port + sed -i "/spark_worker_ui_port/s/8081:8081/$worker_ui_port:$worker_ui_port/g" ./resources/docker-compose.yml + + # replace host + container_subnet_split=(${CONTAINER_SUBNET//./ }) + container_subnet_split[${#container_subnet_split[@]}-1]=2 + master_container_ip=$(IFS=.; echo "${container_subnet_split[*]}") + echo "master_container_ip:$master_container_ip" + sed -i "/worker_extra_hosts/s/master:to_replace_container_ip/master:$master_container_ip/g" ./resources/docker-compose.yml + ;; + gpu) + echo 'GPU 鍔犻熸ā寮' + cp -f resources/template/docker-compose-gpu.yml.template resources/docker-compose.yml + ;; + *) + echo '闈為泦缇ゆā寮' + ;; + esac +} + +# 闆嗙兢鐜鐨刣ocker-compose閰嶇疆 +spark_cluster_config $identity_type + +# 濉厖鐜鍙橀噺 +sed -i "/FLOW_PORT/s/=.*/=$PYTHON_SERVICE_PORT/g" ./resources/variables.env +sed -i "/NGINX_PORT/s/=.*/=$NGINX_PORT/g" ./resources/variables.env +sed -i "/GATEWAY_PORT/s/=.*/=$GATEWAY_SERVICE_PORT/g" ./resources/variables.env +sed -i "/INTRANET_IP/s/=.*/=$INTRANET_IP/g" ./resources/variables.env + +# 淇敼鏈嶅姟鍚姩閰嶇疆 +sed -i "/wefe_version/s/python_service:.*#/python_service:$WEFE_VERSION #/g" ./resources/docker-compose.yml +sed -i "/flow_logs/s@-.*:@- $DATA_PATH/logs/flow:@g" ./resources/docker-compose.yml + +# 淇敼 flow 绔彛 +sed -i "/flow_port/s/-.*:/- $PYTHON_SERVICE_PORT:/g" ./resources/docker-compose.yml + +# 鍔犺浇鏈湴绂荤嚎闀滃儚鍖 +if [ ${ACCELERATION,,} == 'gpu' ];then + echo "寮濮嬪姞杞 gpu python 绂荤嚎闀滃儚" + docker load < resources/wefe_python_gpu_service_$WEFE_VERSION\.tar + echo "鍔犺浇 gpu python 绂荤嚎闀滃儚瀹屾垚" +else + echo "寮濮嬪姞杞 python 绂荤嚎闀滃儚" + docker load < resources/wefe_python_service_$WEFE_VERSION\.tar + echo "鍔犺浇 python 绂荤嚎闀滃儚瀹屾垚" +fi + +# 鍚姩 flow 闀滃儚 +docker-compose -p $WEFE_ENV -f resources/docker-compose.yml up -d \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/wefe_python_service_stop.sh" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/wefe_python_service_stop.sh" new file mode 100644 index 0000000000000000000000000000000000000000..ac8f49362381bcddf02bc89afdf455a87fc72451 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/wefe_python_service_stop.sh" @@ -0,0 +1,4 @@ + +#!/bin/bash + +docker-compose -p wefe -f ./resources/docker-compose.yml down diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/wefe_service.sh" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/wefe_service.sh" new file mode 100644 index 0000000000000000000000000000000000000000..a4d681efc3fa9196c8fe5c03669ec9dee34276ee --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/python-standalone/wefe_service.sh" @@ -0,0 +1,244 @@ +#!/bin/bash + +export INPUT_ACTION=$1 +export INPUT_SERVICE=$2 +export INPUT_DEPLOY=$3 + +source ./wefe.cfg +source ./spark_cluster.sh + +export PWD=$(pwd) + +edit_wefe_config(){ + + # ************ + # 鍔犻熸柟妗堢浉鍏抽厤缃 + # ************ + sed -i "/wefe.job.acceleration/s/=.*/=$ACCELERATION/g" ./config.properties + + # ************ + # 涓棿浠剁浉鍏抽厤缃 + # ************ + + # clickhouse + sed -i "/clickhouse.url/s/:\/\/.*/:\/\/$INTRANET_IP:$CLICKHOUSE_PORT/g" ./config.properties + sed -i "/clickhouse.host/s/=.*/=$INTRANET_IP/g" ./config.properties + sed -i "/clickhouse.tcp.port/s/=.*/=$CLICKHOUSE_TCP_PORT/g" ./config.properties + sed -i "/clickhouse.username/s/=.*/=$CLICKHOUSE_USERNAME/g" ./config.properties + sed -i "/clickhouse.password/s/=.*/=$CLICKHOUSE_PASSWORD/g" ./config.properties + + # mysql + sed -i "/mysql.url/s/:\/\/.*?/:\/\/$INTRANET_IP:$MYSQL_PORT\/$MYSQL_DATABASE?/g" ./config.properties + sed -i "/mysql.host/s/=.*/=$INTRANET_IP/g" ./config.properties + sed -i "/mysql.port/s/=.*/=$MYSQL_PORT/g" ./config.properties + sed -i "/mysql.database/s/=.*/=$MYSQL_DATABASE/g" ./config.properties + sed -i "/mysql.username/s/=.*/=$MYSQL_USERNAME/g" ./config.properties + sed -i "/mysql.password/s/=.*/=$MYSQL_PASSWORD/g" ./config.properties + + # ************ + # 璁$畻寮曟搸鐩稿叧閰嶇疆 + # ************ + + # 璁$畻寮曟搸閫夋嫨 + sed -i "/wefe.job.backend/s/=.*/=$CALCULATION_ENGINE/g" ./config.properties + + # spark + sed -i "/driver.memory/s/=.*/=$SPARK_DRIVER_MEMORY/g" ./config.properties + sed -i "/driver.maxResultSize/s/=.*/=$SPARK_DRIVER_MAXRESULTSIZE/g" ./config.properties + sed -i "/num.executors/s/=.*/=$SPARK_NUM_EXECUTORS/g" ./config.properties + sed -i "/executor.memory/s/=.*/=$SPARK_EXECUTOR_MEMORY/g" ./config.properties + sed -i "/executor.cores/s/=.*/=$SPARK_EXECUTOR_CORES/g" ./config.properties + sed -i "/num.slices/s/=.*/=$SPARK_NUM_SLICES/g" ./config.properties + + # 鍑芥暟璁$畻 + if [[ $FC_STORAGE_TYPE == 'oss' ]]; then + # 淇敼 oss 鐨勪复鏃舵巿鏉 + sed -i "/fc.cloud_store.temp_auth_internal_end_point/s@//.*@//oss-$FC_REGION-internal.aliyuncs.com@g" ./config.properties + sed -i "/fc.cloud_store.temp_auth_end_point/s@//.*@//oss-$FC_REGION.aliyuncs.com@g" ./config.properties + sed -i "/fc.cloud_store.temp_auth_role_arn/s@acs:ram::.*:role/wefe-fc-ossread@acs:ram::$FC_ACCOUNT_ID:role/wefe-fc-ossread@g" ./config.properties + # 淇敼 oss 閰嶇疆 + sed -i "/fc.oss.bucket_name/s/=.*/=$FC_OSS_BUCKET_NAME/g" ./config.properties + sed -i "/fc.oss.internal_endpoint/s@//.*@//oss-$FC_REGION-internal.aliyuncs.com@g" ./config.properties + sed -i "/fc.oss.endpoint/s@//.*@//oss-$FC_REGION.aliyuncs.com@g" ./config.properties + else + echo "鍑芥暟瀛樺偍绫诲瀷涓嶆敮鎸佽绫诲瀷锛$FC_STORAGE_TYPE" + fi + sed -i "/fc.storage.type/s/=.*/=$FC_STORAGE_TYPE/g" ./config.properties + sed -i "/fc.qualifier/s/=.*/=$FC_QUALIFIER/g" ./config.properties + sed -i "/fc.region/s/=.*/=$FC_REGION/g" ./config.properties + sed -i "/fc.account_id/s/=.*/=$FC_ACCOUNT_ID/g" ./config.properties + sed -i "/fc.access_key_id/s/=.*/=$FC_ACCESS_KEY_ID/g" ./config.properties + sed -i "/fc.access_key_secret/s/=.*/=$FC_ACCESS_KEY_SECRET/g" ./config.properties + sed -i "/fc.vpc_id/s/=.*/=$FC_VPC_ID/g" ./config.properties + sed -i "/fc.v_switch_ids/s/=.*/=$FC_V_SWITCH_IDS/g" ./config.properties + sed -i "/fc.security_group_id/s/=.*/=$FC_SECURITY_GROUP_ID/g" ./config.properties + sed -i "/fc.account_type/s/=.*/=$FC_ACCOUNT_TYPE/g" ./config.properties + sed -i "s|fc.end_point=https://.*.cn-shenzhen.fc.aliyuncs.com|fc.end_point=https://$FC_ACCOUNT_ID.cn-shenzhen.fc.aliyuncs.com|g" ./config.properties + +} + +send_wefe_config(){ + cp -f ./config.properties wefe_board_service/resources/mount/ + cp -f ./config.properties wefe_gateway_service/resources/mount/ + cp -f ./config.properties wefe_python_service/resources/mount/ + cp -f ./config.properties wefe_python_gpu_service/resources/mount/ +} + +init(){ + # 鎵ц鍓嶅垵濮嬪寲閰嶇疆鏂囦欢 + edit_wefe_config + # 鍒嗗彂閰嶇疆 + send_wefe_config +} + +_run_python_service(){ + if [ ${ACCELERATION,,} = "gpu" ];then + cd $PWD/wefe_python_service + sh wefe_python_service_start.sh gpu + fi + + if [ $SPARK_MODE = "STANDALONE" ] + then + # 闆嗙兢鏂瑰紡鍚姩 + start_cluster + else + # 鍗曟満鍚姩 + cd $PWD/wefe_python_service + sh wefe_python_service_start.sh + fi +} + +_stop_cluster_python_service(){ + if [ $SPARK_MODE = "STANDALONE" ]; then + stop_cluster + fi +} + +_remove_cluster_python_service(){ + if [ $SPARK_MODE = "STANDALONE" ]; then + remove_cluster + fi +} + +start(){ + init + case $INPUT_SERVICE in + board) + cd $PWD/wefe_board_service + sh wefe_board_service_start.sh + cd ../wefe_board_website + sh wefe_board_website_start.sh + ;; + gateway) + cd $PWD/wefe_gateway_service + sh wefe_gateway_service_start.sh + ;; + python) + _run_python_service + ;; + middleware) + cd $PWD/wefe_middleware_service + sh wefe_middleware_service_start.sh + ;; + '') + cd $PWD + sh wefe_service.sh start middleware + sh wefe_service.sh start board + sh wefe_service.sh start gateway + sh wefe_service.sh start python + ;; + *) + echo "Please Input a Legal Service" + echo "eg. {board|gateway|python|middleware}" + exit -1 + esac +} + +stop(){ + # init + case $INPUT_SERVICE in + board | gateway | python | middleware) + CONTAINER=$(docker ps -a | grep $WEFE_ENV | grep $INPUT_SERVICE | awk '{print $1}' | xargs) + docker stop $CONTAINER + if [ $INPUT_SERVICE = "python" ]; then + _stop_cluster_python_service + fi + ;; + '') + CONTAINER=$(docker ps -a | grep $WEFE_ENV | grep wefe | awk '{print $1}' | xargs) + docker stop $CONTAINER + _stop_cluster_python_service + ;; + *) + echo "Please Input a Legal Service" + echo "eg. {board|gateway|python|middleware}" + exit -1 + esac +} + +remove(){ + # init + case $INPUT_SERVICE in + board | gateway | python | middleware) + CONTAINER=$(docker ps -a | grep $WEFE_ENV | grep $INPUT_SERVICE | awk '{print $1}' | xargs) + docker rm $CONTAINER + if [ $INPUT_SERVICE = "python" ]; then + _remove_cluster_python_service + fi + ;; + '') + CONTAINER=$(docker ps -a | grep $WEFE_ENV | grep wefe | awk '{print $1}' | xargs) + docker rm $CONTAINER + _remove_cluster_python_service + ;; + *) + echo "Please Input a Legal Service" + echo "eg. {board|gateway|python|middleware}" + exit -1 + esac +} + +restart(){ + case $INPUT_SERVICE in + board | gateway | python | middleware) + CONTAINER=$(docker ps -a | grep $WEFE_ENV |grep $INPUT_SERVICE | awk '{print $1}' | xargs) + docker restart $CONTAINER + ;; + '') + CONTAINER=$(docker ps -a | grep $WEFE_ENV | grep wefe | awk '{print $1}' | xargs) + docker restart $CONTAINER + ;; + *) + echo "Please Input a Legal Service" + echo "eg. {board | gateway | python | middleware}" + exit -1 + esac +} + +help(){ + echo "Support Action: start | stop | restart" + echo "Support Service: board | gateway | python | middleware" + echo "sh service.sh [Action] [Service]" +} + +case $INPUT_ACTION in + start) + start + ;; + stop) + stop + ;; + restart) + restart + ;; + remove) + remove + ;; + help) + help + ;; + *) + echo "Please Input a Legal Action" + echo "eg. {start | stop | restart | help}" + exit -1 +esac diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/Dockerfile" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/Dockerfile" new file mode 100644 index 0000000000000000000000000000000000000000..a61c6f60393c5f3ec86530157af9266f0f503c4a --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/Dockerfile" @@ -0,0 +1,7 @@ +FROM nginx:1.19.2 + +WORKDIR /opt/website + +COPY html /opt/website/ + +RUN chmod +x /opt/website \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/docker-compose.yml" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/docker-compose.yml" new file mode 100644 index 0000000000000000000000000000000000000000..652190a10faff6003f5b4d52e65389be489f21d3 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/docker-compose.yml" @@ -0,0 +1,30 @@ +version: "3" +services: + + wefe_serving_website: + image: wefe_serving_website:v.2.2 # wefe_version + ports: + - 3310:80 # website_port + restart: always + privileged: true + networks: + - network + volumes: + - "./mount/default.conf:/etc/nginx/conf.d/default.conf" + wefe_serving_service: + image: wefe_serving_service:v.2.2 # wefe_version + ports: + - 9000:9000 # website_port + restart: always + privileged: true + networks: + - network + volumes: + - "/root/docker-compose/logs/service:/data/logs/wefe-serving-service" # service_logs + - "./mount/start.sh:/opt/service/start.sh" + - "./mount/serving-service.jar:/opt/service/serving-service.jar" + - "./mount/application.properties:/opt/service/application.properties" + +networks: + network: + driver: bridge \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/mount/Dockerfile" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/mount/Dockerfile" new file mode 100644 index 0000000000000000000000000000000000000000..24698d1c9219d34b9c2e8e26941cc9ce8dfa3360 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/mount/Dockerfile" @@ -0,0 +1,11 @@ +FROM wefe_java_base + +WORKDIR /opt/service + +COPY serving-service.jar /opt/service/serving-service.jar + +COPY start.sh /opt/service/start.sh + +RUN chmod +x /opt/service/start.sh + +CMD ["sh", "/opt/service/start.sh"] \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/mount/application.properties" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/mount/application.properties" new file mode 100644 index 0000000000000000000000000000000000000000..7b3bd5ac1bb14773b14baade17f5dd3e5a531c23 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/mount/application.properties" @@ -0,0 +1,21 @@ +server.servlet.context-path=/serving-service + +server.port=9000 + +logging.level.root=info +logging.level.com.ibatis=info +logging.file=/data/logs/wefe-serving-service/wefe-serving-service.log +logging.file.max-history=60 +logging.file.max-size=20GB +logging.pattern.console=%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) [%X{requestId}] %clr([%15.15t]){faint} %clr(%-40.40logger{39}[%F:%L]){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx} +logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%X{requestId}] ${PID:- } [%15.15t] %-40.40logger{39}[%F:%L] : %m%n + + +spring.datasource.serving.username=root +spring.datasource.serving.password=root +spring.datasource.serving.url=jdbc:mysql://123.249.9.220:3147/wefe_serving?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=GMT%2B8 +spring.datasource.serving.driver-class-name=com.mysql.jdbc.Driver +spring.datasource.serving.type=com.alibaba.druid.pool.DruidDataSource +spring.jpa.properties.hibernate.show_sql=true +spring.jpa.properties.hibernate.format_sql=true +spring.jpa.properties.hibernate.use_sql_comments=true \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/mount/default.conf" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/mount/default.conf" new file mode 100644 index 0000000000000000000000000000000000000000..b6a4e324e5cb83228aa6debbcc514ddf8d36c730 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/mount/default.conf" @@ -0,0 +1,26 @@ +server { + + listen 80; + server_name 123.249.9.220; + + client_max_body_size 100m; + + + location / { + root /opt/website/serving-website; + } + + location /serving-service/ { + add_header Access-Control-Allow-Origin *; + add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; + add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; + + if ($request_method = 'OPTIONS') { + return 204; + } + + proxy_pass http://123.249.9.220:9000/serving-service/; + proxy_read_timeout 1800; + } + +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/mount/serving-service.jar" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/mount/serving-service.jar" new file mode 100644 index 0000000000000000000000000000000000000000..e606947eb9ff1af6d68215a3a0edae3617c4c596 Binary files /dev/null and "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/mount/serving-service.jar" differ diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/mount/start.sh" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/mount/start.sh" new file mode 100644 index 0000000000000000000000000000000000000000..a53f39fd2fbbb81bb2163fec03a5e8cc11cacd12 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/resources/mount/start.sh" @@ -0,0 +1 @@ +java -jar serving-service.jar \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/serving.md" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/serving.md" new file mode 100644 index 0000000000000000000000000000000000000000..ec2ab3e011cd593ec5154e41cd21cdff7bc95f48 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/serving.md" @@ -0,0 +1,183 @@ + +#前端打包 +```shell +npm run dev +npm run build +npm run build -- dev // dev 对应了 .env 中的配置 +``` +#前端镜像构建 +```shell +FROM nginx:1.19.2 + +WORKDIR /opt/website + +COPY html /opt/website/ + +RUN chmod +x /opt/website + +``` +#前端镜像保存 +```sh +sudo docker build -t wefe_serving_website:$WEFE_VERSION . +sudo docker save -o wefe_serving_website_$WEFE_VERSION.tar wefe_serving_website:$WEFE_VERSION +``` + + + + +#后端项目打包方法 +#初始化数据库 +执行SQl脚本:serving-init.sql +```shell +mvn clean install -Dmaven.test.skip=true -am -pl serving/serving-service +``` +SDK 使用方法 +导入 sdk + +```shell + + + com.welab.wefe + serving-sdk-java + 1.0.0 + + +``` +#后端Dockerfile +```shell +FROM wefe_java_base + +WORKDIR /opt/service + +COPY serving-service.jar /opt/service/serving-service.jar + +COPY start.sh /opt/service/start.sh + +# RUN chmod +x /opt/service/start.sh + +CMD ["sh", "/opt/service/start.sh"] + +```` + +#启动脚本start.sh +```shell +java -jar serving-service.jar +``` +#后端镜像保存 +```dockerfile +sudo docker build -t wefe_serving_service:$WEFE_VERSION . +sudo docker save -o wefe_serving_service_$WEFE_VERSION.tar wefe_serving_service:$WEFE_VERSION +``` + +#docker-compose + +可以将外面的application.properties挂载到容器内jar包同一位置,即可生效 +```shell +version: "3" +services: + + wefe_serving_website: + image: wefe_serving_website:v.2.2 # wefe_version + ports: + - 3310:80 # website_port + restart: always + privileged: true + networks: + - network + volumes: + - "./mount/default.conf:/etc/nginx/conf.d/default.conf" + wefe_serving_service: + image: wefe_serving_service:v.2.2 # wefe_version + ports: + - 9000:9000 # website_port + restart: always + privileged: true + networks: + - network + volumes: + - "/root/docker-compose/logs/service:/data/logs/wefe-serving-service" # service_logs + - "./mount/start.sh:/opt/service/start.sh" + - "./mount/serving-service.jar:/opt/service/serving-service.jar" + - "./mount/application.properties:/opt/service/application.properties" + +networks: + network: + driver: bridge +``` + +#nginx,default.conf +```shell +server { + + listen 80; + server_name 10.10.178.147; + + client_max_body_size 100m; + + + location / { + root /opt/website/serving-website; + } + + location /serving-service/ { + add_header Access-Control-Allow-Origin *; + add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; + add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; + + if ($request_method = 'OPTIONS') { + return 204; + } + + proxy_pass http://10.10.178.147:9000/serving-service/; + proxy_read_timeout 1800; + } + +} + +``` +#启动脚本 +```shell +#!/bin/bash + +# 导入配置 +source ../wefe.cfg + +echo "开始加载 serving的前后端 离线镜像" +docker load < resources/wefe_serving_website_v2.2\.tar +docker load < resources/wefe_serving_servicev2.2\.tar +echo "加载 serving的前后端 离线镜像完成" + +docker-compose -p $WEFE_ENV -f resources/docker-compose.yml up -d + +``` + +#停止脚本 +```shell +docker-compose -p wefe -f resources/docker-compose.yml down +``` + + +发起方可以不用硬性要求sql方式获取。 +纵向联邦学习进行预测推理的时候,双方都没有完整的模型,且只有发起方通过调用协作方才能进行完整的预测(此部分逻辑代码底层处理),协作方是不能进行预测的, +协作方这里的配置是为了保证发起方能正常的调用到己方。 +所以配置的优先级一般是协作方->发起方。 + + +#内部玩 debug,provider接口 +协作方模型上线,并且提前debug预测校验数据库。这里建议改成 select feature1,feature2 from table where id = ?。这里的?是一个占位符,会将你下面填的a填充进来组成sql +发起方配置 {{baseUr}}/serving-service/predict/provider/,指向协作方 +http://10.10.178.147:9000/serving-service/predict/provider/ +http://124.71.228.136:9000/serving-service/predict/provider/ +http://123.249.9.220:9000/serving-service/predict/provider/ + +发起方最后预测 + +#外部玩 promter接口 +发起方模型上线 +如果说是你们内部系统自己调用的话可以通过此接口{{baseUr}}/serving-service/predict/promter/调用,这个接口会通过你当时初始化提供的board公钥进行验签的。 +如果是提供给外部调用,你就需要再包装一层,接收到对方的请求后自己再加一次签名,然后调用上述接口。 + + +#私钥签名,公钥验签 +AbstractAlgorithm.setFederatedPredictBody +Launcher.apiPermissionPolicy \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/serving\347\211\271\345\276\201\350\216\267\345\217\226\351\205\215\347\275\256\350\257\264\346\230\216\346\226\207\346\241\243(1).doc" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/serving\347\211\271\345\276\201\350\216\267\345\217\226\351\205\215\347\275\256\350\257\264\346\230\216\346\226\207\346\241\243(1).doc" new file mode 100644 index 0000000000000000000000000000000000000000..a2350795ab529f26c05e94d7487994a236588198 Binary files /dev/null and "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/serving\347\211\271\345\276\201\350\216\267\345\217\226\351\205\215\347\275\256\350\257\264\346\230\216\346\226\207\346\241\243(1).doc" differ diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/serving\351\205\215\347\275\256\346\250\241\345\236\213\346\265\201\347\250\213(1).doc" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/serving\351\205\215\347\275\256\346\250\241\345\236\213\346\265\201\347\250\213(1).doc" new file mode 100644 index 0000000000000000000000000000000000000000..6869159bf759a82d89f5c33725450bc7ad21d8c2 Binary files /dev/null and "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/serving\351\205\215\347\275\256\346\250\241\345\236\213\346\265\201\347\250\213(1).doc" differ diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/wefe_serving_service_start.sh" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/wefe_serving_service_start.sh" new file mode 100644 index 0000000000000000000000000000000000000000..3f3513136778aa4a73ea28ab41a24f047ca202e7 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/wefe_serving_service_start.sh" @@ -0,0 +1,10 @@ +#!/bin/bash +# 瀵煎叆閰嶇疆 +source ../wefe.cfg + +echo "寮濮嬪姞杞 serving鐨勫墠鍚庣 绂荤嚎闀滃儚" +docker load < resources/wefe_serving_website_v.2.2\.tar +docker load < resources/wefe_serving_service_v.2.2\.tar +echo "鍔犺浇 serving鐨勫墠鍚庣 绂荤嚎闀滃儚瀹屾垚" + +docker-compose -p $WEFE_ENV -f resources/docker-compose.yml up -d \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/wefe_serving_service_stop.sh" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/wefe_serving_service_stop.sh" new file mode 100644 index 0000000000000000000000000000000000000000..0ebd3cd36cc5dd0f1accdcb7c7d03f67b526313f --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/serving/wefe_serving_service_stop.sh" @@ -0,0 +1,3 @@ +#!/bin/bash + +docker-compose -p wefe -f resources/docker-compose.yml down \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/union/blockchain-service.md" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/union/blockchain-service.md" new file mode 100644 index 0000000000000000000000000000000000000000..b2a0f253cc317c2f8bcc18d593c7238aa5d77753 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/union/blockchain-service.md" @@ -0,0 +1,42 @@ +blockchain-data-sync 对 union 的区块链相关业务进行了优化处理,实现了区块链数据到业务库的实时同步,以方便做一些复杂查询跟统计的业务操作。 + +blockchain-data-sync 使用 java 开发,基于 spring-boot 框架,使用 maven 进行包管理; + +blockchain-data-sync 依赖 mongodb 数据库,所以在启动前需要先准备好 mongodb 服务; + +blockchain-data-sync 区块链节点,所以必须要部署区块链节点。 + +# 编译打包 + +项目基于 maven 进行打包(部署机器上需要有 maven 环境)。 + +```bash +# 在 [Root Dir] 目录下执行打包命令 +mvn clean install -Dmaven.test.skip=true -am -pl union/blockchain-data-sync +``` + + +#修改文件区块链连接相关配置项。 + +```yml +sdk.certPath=/work/fisco/console/conf +contract.solidity-path=/work/wefe/union/solidity +``` + + + +#单机mongo +指定Spring工程的合约路径 +注释掉DatasetContractService的 +//@Transactional(rollbackFor = Exception.class) +注释掉transactionManager的 +// @Bean +// public MongoTransactionManager transactionManager(MongoDbFactory mongoDbFactory) { +// return new MongoTransactionManager(mongoDbFactory); +// } + +**启动项目** + +```bash +nohup java -jar blockchain-data-sync.jar >blockchain-data-sync.out & +``` diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/union/blocklisk.md" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/union/blocklisk.md" new file mode 100644 index 0000000000000000000000000000000000000000..e8573b4781969f5b34d7ff355ebd3d03b6435aad --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/union/blocklisk.md" @@ -0,0 +1,9 @@ +#区块链 +sh start.sh + +getSystemConfigByKey tx_gas_limit + +setSystemConfigByKey tx_gas_limit 2100000000 + + +reference:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/console/console.html#setsystemconfigbykey \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/union/union-service.md" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/union/union-service.md" new file mode 100644 index 0000000000000000000000000000000000000000..f39ac11b5804bc1ee769206b3f91c9d7c38cf1a5 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/union/union-service.md" @@ -0,0 +1,81 @@ +union-service 是联邦学习的 union 的后台服务; + +union-service 使用去中心化的数据存储方式,存储联邦成员的公开信息,比如成员信息、公开的数据集信息; + +union-service 提供 http 接口供各成员修改自身公开信息以及获取联邦中其他成员的公开信息。 + +项目特点 +使用 Springboot + Mongodb + Fisco bcos(金链盟) 架构方式; + +去中心化、防篡改、可追溯性。 + +环境要求 +在使用本组件前,请确认系统环境已安装相关依赖软件,清单如下: + +依赖软件 说明 备注 +Java JDK[1.8] +Mongodb = Mongodb[4.0] +Fisco bcos Fisco bcos 搭建请参考 +编译打包 +项目基于 maven 进行打包(部署机器上需要有 maven 环境)。 +#区块链部署 +删除jdk1.8当中的一个安全协议 +config.toml指定证书cert路径 + +#新建config.toml 文件 + +[cryptoMaterial] + +certPath = "xx/xx/cert" # The certification path + +[network] + +peers=["0.0.0.0:20200"] # The peer list to connect + + +# 修改 application.properties 相关配置项 +union-service 的启动依赖 resource/application.properties 配置文件 + + +```shell +spring.datasource.mongodb.uri=mongodb://user:pwd@0.0.0.0:37017/wefe_union +spring.datasource.mongodb.databaseName=wefe_union + +block.chain.toml.file.path=xx/xx/config.toml +```` +#在 [Root Dir] 目录下执行打包命令打包 +```shell +mvn clean install -Dmaven.test.skip=true -am -pl union/union-service +``` + +#启动脚本 +```shell +nohup java -jar wefe-union-service.jar >union-service.out & + + +``` + +#union与区块链对接的问题排查 + +异常:Algorithm constraints check failed on disabled algorithm: secp256k1 +问题解决方式一,推荐: +查看jdk1.8.0_271/jre/lib/security目录java.security文件 +查找:secp256k1 +jdk.disabled.namedCurves = secp112r1, secp112r2, secp128r1, secp128r2, \ +secp160k1, secp160r1, secp160r2, secp192k1, secp192r1, secp224k1, \ +secp224r1, secp256k1, sect113r1, sect113r2, sect131r1, sect131r2, \ +sect163k1, sect163r1, sect163r2, sect193r1, sect193r2, sect233k1, \ +sect233r1, sect239k1, sect283k1, sect283r1, sect409k1, sect409r1, \ +sect571k1, sect571r1, X9.62 c2tnb191v1, X9.62 c2tnb191v2, \ +X9.62 c2tnb191v3, X9.62 c2tnb239v1, X9.62 c2tnb239v2, X9.62 c2tnb239v3, \ +X9.62 c2tnb359v1, X9.62 c2tnb431r1, X9.62 prime192v2, X9.62 prime192v3, \ +X9.62 prime239v1, X9.62 prime239v2, X9.62 prime239v3, brainpoolP256r1, \ +brainpoolP320r1, brainpoolP384r1, brainpoolP512r1 +将:secp256k1删掉就可以 + +问题解决方式二: +SDK依赖的Java禁用了secp256k1曲线,解决方法包括: +使用1.8以上的OracleJDK,启动SDK时,加上-Djdk.tls.namedGroups="secp256k1"参数启用secp256k1曲线 +升级到最新的Web3SDK 2.6.2版本 + + diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/wefe.cfg" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/wefe.cfg" new file mode 100644 index 0000000000000000000000000000000000000000..1b9ceefea2af82064fa26f61375c6bf47c532f71 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/wefe.cfg" @@ -0,0 +1,101 @@ +# ************** +# 浠ヤ笅閰嶇疆涓哄繀濉」 +# *************** + +### VERSION #### +WEFE_VERSION=v.2.2 +WEFE_ENV=release + +# 鑻ヤ笉闇瑕佸缃戣闂紝鍒欓兘濉啓鍐呯綉鍦板潃 +# 鏈満鍐呯綉 IP +INTRANET_IP=10.10.178.147 +# 鏈満澶栫綉 IP +EXTRANET_IP=10.10.178.147 + +# ************** +# 浠ヤ笅閰嶇疆涓洪夊~椤 +# *************** + +# Docker 鏁版嵁瀛樺偍鐩綍锛岄渶瑕佸閲忚緝澶х殑鐩綍 +DATA_PATH=/data/wefe/docker-compose + +### middleware ### + +# mysql 甯愬彿瀵嗙爜涓庢暟鎹簱 +MYSQL_USERNAME=wefe +MYSQL_PASSWORD=wefe2020 +MYSQL_DATABASE=wefe_board +# mysql 绔彛 +MYSQL_PORT=4406 + +# clickhouse +# 甯愬彿瀵嗙爜 +CLICKHOUSE_USERNAME=wefe +CLICKHOUSE_PASSWORD=wefe2020 +# 鏈嶅姟绔彛 +CLICKHOUSE_PORT=8122 +CLICKHOUSE_TCP_PORT=9900 + +### board_website ### + +# nginx 绔彛 +NGINX_PORT=80 + +### board-service ### + +# 鏈嶅姟绔彛 +BOARD_SERVICE_PORT=8080 + +### Flow ### + +# 鏈嶅姟绔彛 +PYTHON_SERVICE_PORT=5000 + +### gateway ### + +# 缃戝叧绔彛 +GATEWAY_SERVICE_PORT=50051 + +### 璁$畻寮曟搸 ### + +# 璁$畻寮曟搸锛孲PARK or FC +CALCULATION_ENGINE=SPARK + +# Spark 寮曟搸鐩稿叧閰嶇疆 +# 榛樿涓 32G 鍐呭瓨鐨勬湇鍔″櫒閰嶇疆 +SPARK_DRIVER_MEMORY=15g +SPARK_DRIVER_MAXRESULTSIZE=2g +SPARK_NUM_EXECUTORS=6 +SPARK_EXECUTOR_MEMORY=2g +SPARK_EXECUTOR_CORES=1 +SPARK_NUM_SLICES=32 + +# 闃块噷浜戝嚱鏁拌绠楀紩鎿庣浉鍏抽厤缃 +FC_ACCOUNT_ID="xxx" +FC_REGION="cn-shenzhen" +FC_ACCESS_KEY_ID="xxx" +FC_ACCESS_KEY_SECRET="xxx" +FC_QUALIFIER="LATEST" +FC_STORAGE_TYPE="oss" +FC_OSS_BUCKET_NAME="xxx" +FC_VPC_ID="" +FC_V_SWITCH_IDS="" +FC_SECURITY_GROUP_ID="" + +# CPU銆丟PU 妯″紡鐩稿叧閰嶇疆锛孨ONE or GPU +ACCELERATION="NONE" + +### 鍒嗗竷寮忛儴缃查厤缃 ### + +# 涓棿浠舵湇鍔 IP +MIDDLEWARE_SERVICE_INTRANET_IP= +MIDDLEWARE_SERVICE_EXTRANET_IP= +# Python 鏈嶅姟 IP +PYTHON_SERVICE_INTRANET_IP= +PYTHON_SERVICE_EXTRANET_IP= +# Board 鏈嶅姟 IP +BOARD_SERVICE_INTRANET_IP= +BOARD_SERVICE_EXTRANET_IP= +# Gateway 鏈嶅姟 IP +GATEWAY_SERVICE_INTRANET_IP= +GATEWAY_SERVICE_EXTRANET_IP= \ No newline at end of file diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/wefe_service.sh" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/wefe_service.sh" new file mode 100644 index 0000000000000000000000000000000000000000..c354f68f5b7d580191da865c9e131dcc55151238 --- /dev/null +++ "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/wefe_service.sh" @@ -0,0 +1,184 @@ +#!/bin/bash + +export INPUT_ACTION=$1 +export INPUT_SERVICE=$2 +export INPUT_DEPLOY=$3 + +source ./wefe.cfg + +export PWD=$(pwd) + +edit_wefe_config(){ + + # ************ + # 鍔犻熸柟妗堢浉鍏抽厤缃 + # ************ + sed -i "/wefe.job.acceleration/s/=.*/=$ACCELERATION/g" ./config.properties + + # ************ + # 涓棿浠剁浉鍏抽厤缃 + # ************ + + # clickhouse + sed -i "/clickhouse.url/s/:\/\/.*/:\/\/$INTRANET_IP:$CLICKHOUSE_PORT/g" ./config.properties + sed -i "/clickhouse.host/s/=.*/=$INTRANET_IP/g" ./config.properties + sed -i "/clickhouse.tcp.port/s/=.*/=$CLICKHOUSE_TCP_PORT/g" ./config.properties + sed -i "/clickhouse.username/s/=.*/=$CLICKHOUSE_USERNAME/g" ./config.properties + sed -i "/clickhouse.password/s/=.*/=$CLICKHOUSE_PASSWORD/g" ./config.properties + + # mysql + sed -i "/mysql.url/s/:\/\/.*?/:\/\/$INTRANET_IP:$MYSQL_PORT\/$MYSQL_DATABASE?/g" ./config.properties + sed -i "/mysql.host/s/=.*/=$INTRANET_IP/g" ./config.properties + sed -i "/mysql.port/s/=.*/=$MYSQL_PORT/g" ./config.properties + sed -i "/mysql.database/s/=.*/=$MYSQL_DATABASE/g" ./config.properties + sed -i "/mysql.username/s/=.*/=$MYSQL_USERNAME/g" ./config.properties + sed -i "/mysql.password/s/=.*/=$MYSQL_PASSWORD/g" ./config.properties + + # ************ + # 璁$畻寮曟搸鐩稿叧閰嶇疆 + # ************ + + # 璁$畻寮曟搸閫夋嫨 + sed -i "/wefe.job.backend/s/=.*/=$CALCULATION_ENGINE/g" ./config.properties + + # spark + sed -i "/driver.memory/s/=.*/=$SPARK_DRIVER_MEMORY/g" ./config.properties + sed -i "/driver.maxResultSize/s/=.*/=$SPARK_DRIVER_MAXRESULTSIZE/g" ./config.properties + sed -i "/num.executors/s/=.*/=$SPARK_NUM_EXECUTORS/g" ./config.properties + sed -i "/executor.memory/s/=.*/=$SPARK_EXECUTOR_MEMORY/g" ./config.properties + sed -i "/executor.cores/s/=.*/=$SPARK_EXECUTOR_CORES/g" ./config.properties + sed -i "/num.slices/s/=.*/=$SPARK_NUM_SLICES/g" ./config.properties + + # 鍑芥暟璁$畻 + if [[ $FC_STORAGE_TYPE == 'oss' ]]; then + # 淇敼 oss 鐨勪复鏃舵巿鏉 + sed -i "/fc.cloud_store.temp_auth_internal_end_point/s@//.*@//oss-$FC_REGION-internal.aliyuncs.com@g" ./config.properties + sed -i "/fc.cloud_store.temp_auth_end_point/s@//.*@//oss-$FC_REGION.aliyuncs.com@g" ./config.properties + sed -i "/fc.cloud_store.temp_auth_role_arn/s@acs:ram::.*:role/wefe-fc-ossread@acs:ram::$FC_ACCOUNT_ID:role/wefe-fc-ossread@g" ./config.properties + # 淇敼 oss 閰嶇疆 + sed -i "/fc.oss.bucket_name/s/=.*/=$FC_OSS_BUCKET_NAME/g" ./config.properties + sed -i "/fc.oss.internal_endpoint/s@//.*@//oss-$FC_REGION-internal.aliyuncs.com@g" ./config.properties + sed -i "/fc.oss.endpoint/s@//.*@//oss-$FC_REGION.aliyuncs.com@g" ./config.properties + else + echo "鍑芥暟瀛樺偍绫诲瀷涓嶆敮鎸佽绫诲瀷锛$FC_STORAGE_TYPE" + fi + sed -i "/fc.storage.type/s/=.*/=$FC_STORAGE_TYPE/g" ./config.properties + sed -i "/fc.qualifier/s/=.*/=$FC_QUALIFIER/g" ./config.properties + sed -i "/fc.region/s/=.*/=$FC_REGION/g" ./config.properties + sed -i "/fc.account_id/s/=.*/=$FC_ACCOUNT_ID/g" ./config.properties + sed -i "/fc.access_key_id/s/=.*/=$FC_ACCESS_KEY_ID/g" ./config.properties + sed -i "/fc.access_key_secret/s/=.*/=$FC_ACCESS_KEY_SECRET/g" ./config.properties + sed -i "/fc.vpc_id/s/=.*/=$FC_VPC_ID/g" ./config.properties + sed -i "/fc.v_switch_ids/s/=.*/=$FC_V_SWITCH_IDS/g" ./config.properties + sed -i "/fc.security_group_id/s/=.*/=$FC_SECURITY_GROUP_ID/g" ./config.properties + sed -i "s|fc.end_point=https://.*.cn-shenzhen.fc.aliyuncs.com|fc.end_point=https://$FC_ACCOUNT_ID.cn-shenzhen.fc.aliyuncs.com|g" ./config.properties + +} + +send_wefe_config(){ + cp -f ./config.properties wefe_board_service/resources/mount/ + cp -f ./config.properties wefe_gateway_service/resources/mount/ + cp -f ./config.properties wefe_python_service/resources/mount/ +} + +init(){ + # 鎵ц鍓嶅垵濮嬪寲閰嶇疆鏂囦欢 + edit_wefe_config + # 鍒嗗彂閰嶇疆 + send_wefe_config +} + +start(){ + init + case $INPUT_SERVICE in + board) + cd $PWD/wefe_board_service + sh wefe_board_service_start.sh + cd ../wefe_board_website + sh wefe_board_website_start.sh + ;; + gateway) + cd $PWD/wefe_gateway_service + sh wefe_gateway_service_start.sh + ;; + python) + cd $PWD/wefe_python_service + sh wefe_python_service_start.sh + ;; + middleware) + cd $PWD/wefe_middleware_service + sh wefe_middleware_service_start.sh + ;; + '') + cd $PWD + sh wefe_service.sh start middleware + sh wefe_service.sh start board + sh wefe_service.sh start gateway + sh wefe_service.sh start python + ;; + *) + echo "Please Input a Legal Service" + echo "eg. {board|gateway|python|middleware}" + exit -1 + esac +} + +stop(){ + # init + case $INPUT_SERVICE in + board | gateway | python | middleware) + CONTAINER=$(docker ps -a | grep $WEFE_ENV | grep $INPUT_SERVICE | awk '{print $1}' | xargs) + docker stop $CONTAINER + ;; + '') + CONTAINER=$(docker ps -a | grep $WEFE_ENV | grep wefe | awk '{print $1}' | xargs) + docker stop $CONTAINER + ;; + *) + echo "Please Input a Legal Service" + echo "eg. {board|gateway|python|middleware}" + exit -1 + esac +} + +restart(){ + case $INPUT_SERVICE in + board | gateway | python | middleware) + CONTAINER=$(docker ps -a | grep $WEFE_ENV |grep $INPUT_SERVICE | awk '{print $1}' | xargs) + docker restart $CONTAINER + ;; + '') + CONTAINER=$(docker ps -a | grep $WEFE_ENV | grep wefe | awk '{print $1}' | xargs) + docker restart $CONTAINER + ;; + *) + echo "Please Input a Legal Service" + echo "eg. {board | gateway | python | middleware}" + exit -1 + esac +} + +help(){ + echo "Support Action: start | stop | restart" + echo "Support Service: board | gateway | python | middleware" + echo "sh service.sh [Action] [Service]" +} + +case $INPUT_ACTION in + start) + start + ;; + stop) + stop + ;; + restart) + restart + ;; + help) + help + ;; + *) + echo "Please Input a Legal Action" + echo "eg. {start | stop | restart | help}" + exit -1 +esac diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/\346\250\241\345\235\227\347\273\223\346\236\204.png" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/\346\250\241\345\235\227\347\273\223\346\236\204.png" new file mode 100644 index 0000000000000000000000000000000000000000..bc8318ecab4a6f6e4dfc42123fe459d9a4538852 Binary files /dev/null and "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/\346\250\241\345\235\227\347\273\223\346\236\204.png" differ diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/\351\203\250\347\275\262\346\236\266\346\236\204.doc" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/\351\203\250\347\275\262\346\236\266\346\236\204.doc" new file mode 100644 index 0000000000000000000000000000000000000000..d04d0ab1e7ff0f9912244b309ae746fad464c757 Binary files /dev/null and "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/\351\203\250\347\275\262\346\236\266\346\236\204.doc" differ diff --git "a/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/\351\203\250\347\275\262\346\236\266\346\236\204.jpg" "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/\351\203\250\347\275\262\346\236\266\346\236\204.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..df4477fc995667c46fbd1649be47ca036e2a04ca Binary files /dev/null and "b/BFLP234/FederationStudy/01.\351\203\250\347\275\262\346\225\231\347\250\213/\351\203\250\347\275\262\346\236\266\346\236\204.jpg" differ diff --git "a/BFLP234/FederationStudy/02.\345\212\237\350\203\275\350\257\264\346\230\216/\345\212\237\350\203\275\350\257\264\346\230\216.doc" "b/BFLP234/FederationStudy/02.\345\212\237\350\203\275\350\257\264\346\230\216/\345\212\237\350\203\275\350\257\264\346\230\216.doc" new file mode 100644 index 0000000000000000000000000000000000000000..cb9bcb46dbf6ab4b223c3c1ab5159f298ccf2c33 Binary files /dev/null and "b/BFLP234/FederationStudy/02.\345\212\237\350\203\275\350\257\264\346\230\216/\345\212\237\350\203\275\350\257\264\346\230\216.doc" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/.gitignore" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/.gitignore" new file mode 100644 index 0000000000000000000000000000000000000000..88f397f48ed85f39710d3b0349bb2d8b05d4a8ce --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/.gitignore" @@ -0,0 +1,48 @@ +# 鎺掗櫎 ide 鏂囦欢 +.idea/ +*.iml +out +gen +**/bin/ +*.project +.settings/ +.classpath +.vscode/ +.factorypath + +# 鎺掗櫎缂栬瘧杈撳嚭 +*.class +target/ + +# 鎺掗櫎鏃ュ織 +log/ +logs/ +*.log +*.log.* + +# 鎺掗櫎 Microsoft Office 涓存椂鏂囦欢 +~$*.* + +# py鐩稿叧鎺掗櫎 +*.py[cod] + +# db鎺掗櫎 +data/__META__/ +data/IN_MEMORY/ +data/LMDB/ +data/sqlite/ +data/export/ + +# 鎺掗櫎job鏁版嵁 +jobs/ + +# 鎺掗櫎build +build/ +**/bin/ +# 鎺掗櫎mac鏈湴鏂囦欢 +*.DS_Store +*.properties +venv/ +/docker/ +**/assembly/ +/assembly/ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/LICENSE" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/LICENSE" new file mode 100644 index 0000000000000000000000000000000000000000..9d098b8bee5e919738cc54e569f5d860421e53cb --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/LICENSE" @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2021 Tianmian Tech. All Rights Reserved. + + 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. \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/README.md" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/README.md" new file mode 100644 index 0000000000000000000000000000000000000000..e9fcd3efdc1fa71ad2a5e2129777a5bb9a6fad24 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/README.md" @@ -0,0 +1,108 @@ +![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg) + +```text + + ___ __ _______ ________ _______ +|\ \ |\ \|\ ___ \ |\ _____\\ ___ \ +\ \ \ \ \ \ \ __/|\ \ \__/\ \ __/| + \ \ \ __\ \ \ \ \_|/_\ \ __\\ \ \_|/__ + \ \ \|\__\_\ \ \ \_|\ \ \ \_| \ \ \_|\ \ + \ \____________\ \_______\ \__\ \ \_______\ + \|____________|\|_______|\|__| \|_______| + + +``` + +WeFe ( WeLab Federated Learning ) 鏄 Welab 姹囩珛闆嗗洟瀛愬叕鍙竅澶╁啎](https://www.tianmiantech.com)绉戞妧鍙戣捣鐨勫紑婧愰」鐩紝涓鸿仈閭﹀涔犵敓鎬佺郴缁熸彁渚涗簡涓濂楀ソ鐢ㄧ殑鍙潬鐨勫畨鍏ㄨ绠楁鏋躲 + +`Documentation锛歚 https://tianmiantech.github.io/WeFe/ or http://tianmiantech.gitee.io/wefe + + +# 椤圭洰鐗圭偣 + +娣峰悎鑱旈偊锛岀旱鍚戣仈閭﹀涔犱笌妯悜鑱旈偊瀛︿範缁撳悎鐨勮涓氳В鍐虫柟妗堬紱 + +浣跨敤鑱旂洘閾句綔涓鸿仈閭︿腑蹇冨瓨璇佸叡浜柟妗堬紱 + +鏀寔娴佺▼鍙鍖栵紝鎵樻媺鎷界紪杈戞祦绋嬬殑浜や簰褰㈠紡锛 + +鍩轰簬鍑芥暟璁$畻涓庝簯瀛樺偍瀵硅薄瀹炵幇鍔ㄦ佽祫婧愭嫇灞曟柟妗堬紱 + +鏀寔 GPU 鍔犻熷悓鎬佸姞瀵嗚繍绠楋紙瀹為獙瀹わ級銆 + + +# 鑱旈偊瀛︿範绠楁硶 + +WeFe 鐩墠鏀寔鐨勮仈閭﹀涔犵畻娉曪細妯悜鑱旈偊銆佺旱鍚戣仈閭︺佹贩鍚堣仈閭︺佹繁搴﹀涔犮 + +鍩轰簬FATE锛屾敼杩涘苟鏂板浜嗙浉鍏崇畻娉曪紝绠楁硶缁嗚妭璇峰弬鑰 Kernel 妯″潡鏂囨。 [kernel/README.md](./kernel)銆 + +# 瀹夎浣跨敤 + +WeFe 鏀寔 Linux 鎿嶄綔绯荤粺锛屾帹鑽愪娇鐢 Centos 7+ 鐨勭増鏈 + +WeFe 鎻愪緵浜嗕竴濂楀熀浜 Docker 鐨勪究鎹烽儴缃叉柟寮忋 + +WeFe 鎻愪緵浜嗕竴濂楀畬鏁寸殑鍦ㄧ嚎浣撻獙鐜 Demo ENV銆 + +## Docker 閮ㄧ讲 + +鍗曟満閮ㄧ讲锛岃瑙 [release/docker/README.md](./release/docker) + +## 鍦ㄧ嚎浣撻獙 + +WeFe 涓嶄粎鏀寔鏈湴閮ㄧ讲杩愯娴嬭瘯锛屽苟涓旀彁渚涗簡涓濂楀畬鏁寸殑绾夸笂浣撻獙鐜锛 + +鐢ㄦ埛鍙互閫氳繃绾夸笂浣撻獙鐜锛屾ā鎷熻仈閭︿腑涓変綅鎴愬憳闂寸殑寤烘ā鎿嶄綔锛 + +浣撻獙鐜鐨勮仈閭︽垚鍛樿鑹叉湁 DemoMember1銆丏emoMember2銆丏emoMember3锛 + +璇︽儏璁块棶[鍦ㄧ嚎浣撻獙骞冲彴](https://tianmiantech.com/federal)浣撻獙銆 + +# 绯荤粺鏋舵瀯 + +WeFe 绯荤粺鐢变袱澶фā鍧 union 涓 member 缁勬垚锛 + +member 鏄 WeFe 鑱旈偊瀛︿範骞冲彴涓繘琛岃仈閭﹀缓妯$殑鏈灏忔垚鍛樺崟浣嶏紱 + +union 鏄竴涓幓涓績鍖栫殑鍏叡鏈嶅姟骞冲彴锛屽瓨鍌ㄤ簡鑱旈偊涓殑鍙叕寮淇℃伅骞舵彁渚涚粰鑱旈偊涓殑 member 璁块棶銆 + +妯″潡璇︽儏锛 + +鈥 union 妯″潡锛岃瑙 [union/README.md](./union)锛 + +鈥 member 妯″潡锛岃瑙 [README_MEMBER.md](./README_MEMBER.md)銆 + +# 鍙戣鐗堟湰 + +2021-09-23锛歷.2.2 + +# 鎴愪负椤圭洰璐$尞鑰 + +椤圭洰鐨勬瀯寤轰笌缂栧啓鍦ㄤ竴瀹氱▼搴︿笂閬靛惊浠ヤ笅浠g爜瑙勮寖 + +Python 浠g爜瑙勮寖锛歔Google Python Style Guide](https://google.github.io/styleguide/pyguide.html) + +Java 浠g爜瑙勮寖锛歔銆婇樋閲屽反宸 Java 寮鍙戞墜鍐屻媇(https://github.com/alibaba/p3c) + +Java 浠g爜瑙勮寖鍖栨彃浠讹細[IDEA 鎻掍欢 alibaba-java-coding-guidelines](https://plugins.jetbrains.com/plugin/10046-alibaba-java-coding-guidelines) + +# 鐗堟潈 + +Apache 2.0 + +# 鑱旂郴鎴戜滑 + +娆㈣繋鎵爜娣诲姞 WeFe 灏忓姪鎵嬶紙寰俊鍙凤細tianmiantech001锛夛紱 + +
+ +
+ +娣诲姞鍚庢淮婊村皬鍔╂墜锛屽皬鍔╂墜浼氭媺浣犺繘 WeFe 鎶鏈氦娴佺兢鍝锛 + +娆㈣繋鍏虫敞澶╁啎绉戞妧鍏紬鍙 +
+ +
+蹇潵瀵绘壘蹇楀悓閬撳悎鐨勪紮浼村惂锛 \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/README_MEMBER.md" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/README_MEMBER.md" new file mode 100644 index 0000000000000000000000000000000000000000..3fd46795ae903e07d4edb56a49c83e9e664edfb1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/README_MEMBER.md" @@ -0,0 +1,28 @@ +鍦ㄨ仈閭﹀涔犱腑锛岃仈閭︽槸鐢变竴涓釜鑱旈偊鎴愬憳缁勬垚鐨勶紝涓涓仈閭︽垚鍛樺氨鏄竴涓 member銆 + +# 妯″潡姒傝堪 + +**鍩虹妯″潡** + +[board](./board)锛氬缓妯℃搷浣滐紝鐢ㄦ埛绠$悊锛 + +[gateway](./gateway)锛氭湇鍔¢棿鏁版嵁浜や簰锛 + +[flow](./flow)锛氫换鍔¤皟搴︾洃鎺э紱 + +[kernel](./kernel)锛氬簳灞傜畻娉曪紱 + +[common](./common)锛氬悇妯″潡鍩虹鏈嶅姟銆 + +**楂樼骇妯″潡** + +[fusion](./fusion)锛氭暟鎹瀺鍚堟湇鍔★紱 + +[serving](./serving)锛氭ā鍨嬭皟鐢ㄦ湇鍔° + +# 妯″潡浜や簰 + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/README.md" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/README.md" new file mode 100644 index 0000000000000000000000000000000000000000..47403fe040b89f5719460b73432e74adbdeeb341 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/README.md" @@ -0,0 +1,8 @@ +board 妯″潡鍦 WeFe 绯荤粺鎻愪緵锛氬彲瑙嗗寲寤烘ā鎿嶄綔銆佺敤鎴风鐞嗕互鍙婄郴缁熺鐞嗙瓑鍔熻兘銆 + +# 妯″潡鏋舵瀯 + +[board-service](./board-service/README.md)锛氬悗鍙版湇鍔★紝鎻愪緵 API 璋冪敤锛 + +[board-website](./board-website/README.md)锛氬墠绔ā鍧楋紝鎻愪緵鍙鍖栥 + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/README.md" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/README.md" new file mode 100644 index 0000000000000000000000000000000000000000..a48ae7423d678b4ff8cf0f3704e52b0b8533275f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/README.md" @@ -0,0 +1,53 @@ +board-service 鏄 board-website 鐨勫悗鍙版湇鍔★紝鎻愪緵 HTTP API 渚涘叾璋冪敤銆 + +# 椤圭洰鐨勬墦鍖呬笌鍚姩 + +board-service 浣跨敤 java 寮鍙戯紝鍩轰簬 spring-boot 妗嗘灦锛屼娇鐢 maven 杩涜鍖呯鐞嗐 + +board-service 鐨勫悇绉嶅姛鑳戒緷璧 WeFe 涓叾浠栫殑鏈嶅姟锛屼絾灏 board-service 鏈韩鐨勮繍琛岃岃█锛屽彧渚濊禆 mysql 鏁版嵁搴擄紝鎵浠ュ湪鍚姩鍓嶉渶瑕佸厛鍑嗗濂 mysql 鏈嶅姟銆 + +杩欓噷鍙弿杩板浣曠紪璇戝苟鍚姩 board-service 鏈嶅姟锛屽畬鏁寸殑 WeFe 绯荤粺閮ㄧ讲杩囩▼璇﹁ [WeFe 閮ㄧ讲鏂囨。](/docker/README.md)銆 + +**鍒濆鍖栨暟鎹簱锛堝缓琛級** + +鎵ц `wefe_board.sql` 涓殑 sql 鑴氭湰銆 + +**缂栬瘧 / 鎵撳寘** + +鍩轰簬 maven 杩涜鎵撳寘锛堥儴缃叉満鍣ㄤ笂闇瑕佹湁 maven 鐜锛夈 + +```bash +mvn clean install -Dmaven.test.skip=true -am -pl board/board-service +``` + +**淇敼閰嶇疆鏂囦欢** + +board-service 鐨勫惎鍔ㄤ緷璧 `config.properties` 閰嶇疆鏂囦欢锛岄渶瑕佸湪 jar 鍖呭悓鐩綍鏀剧疆璇ラ厤缃枃浠讹紝绋嬪簭浼氳嚜鍔ㄤ粠 jar 鍖呯洰褰曡鍙栥 + +淇敼 mysql 鐩稿叧閰嶇疆椤 + +```bash +db.mysql.url=jdbc:mysql://0.0.0.0:3306/wefe_board?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=GMT%2B8 +db.mysql.host=0.0.0.0 +db.mysql.port=3306 +db.mysql.database=wefe_board +db.mysql.username=wefe +db.mysql.password=password +``` + +淇敼鏂囦欢涓婁紶鐩稿叧閰嶇疆椤 + +```bash +# 鏂囦欢涓婁紶鐩稿叧鍔熻兘浼氬皢鏂囦欢缁熶竴涓婁紶鍒版鐩綍 +wefe.file.upload.dir=/data/wefe_file_upload_dir +``` + +**鍚姩** + +```bash +java -jar wefe-board-service.jar +``` + +**璁块棶** + +鍦ㄦ祻瑙堝櫒涓闂 [http://localhost:8080/board-service/apis](http://localhost:8080/board-service/apis) 锛屽鏋滆兘鐪嬪埌绯荤粺 api 鍒楄〃锛屽嵆浠h〃鏈嶅姟鍚姩鎴愬姛銆 \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/pom.xml" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/pom.xml" new file mode 100644 index 0000000000000000000000000000000000000000..cbc353c511275369f52215cf57f24e1b4711f99f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/pom.xml" @@ -0,0 +1,159 @@ + + + 4.0.0 + + com.welab.wefe + board + 1.0.0 + + + board-service + + + 1.29.0 + + + + + com.welab.wefe + common-web + ${project.parent.version} + + + com.welab.wefe + common-lang + ${project.parent.version} + + + com.welab.wefe + common-data-storage + ${project.parent.version} + + + org.hibernate.javax.persistence + hibernate-jpa-2.1-api + 1.0.0.Final + compile + + + io.grpc + grpc-netty-shaded + ${grpc.version} + + + io.grpc + grpc-protobuf + ${grpc.version} + + + io.grpc + grpc-stub + ${grpc.version} + + + io.netty + netty-all + 4.1.50.Final + + + com.google.protobuf + protobuf-java-util + 3.7.1 + + + com.googlecode.protobuf-java-format + protobuf-java-format + 1.4 + + + cn.hutool + hutool-core + 4.6.7 + + + org.springframework.boot + spring-boot-starter-websocket + + + + commons-io + commons-io + 2.7 + + + + org.jpmml + pmml-evaluator + 1.4.1 + + + com.google.guava + guava + + + + + com.vladmihalcea + hibernate-types-52 + 2.4.2 + + + + com.google.guava + guava + 30.0-jre + + + + org.springframework.boot + spring-boot-starter-mail + + + log4j-api + org.apache.logging.log4j + + + slf4j-api + org.slf4j + + + + + + org.apache.hadoop + hadoop-client + 2.7.4 + + + + org.apache.hive + hive-jdbc + 2.3.4 + + + org.apache.logging.log4j + * + + + jdk.tools + * + + + + + + + wefe-board-service + + + org.springframework.boot + spring-boot-maven-plugin + + com.welab.wefe.board.service.BoardService + + + + + \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/BoardService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/BoardService.java" new file mode 100644 index 0000000000000000000000000000000000000000..716e0583c81ba8eada9ed32835bdfe4aa80306f3 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/BoardService.java" @@ -0,0 +1,141 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.base.OnlineDemoApi; +import com.welab.wefe.board.service.constant.Config; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.operation.OperationLogAfterApiExecute; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.data.storage.StorageManager; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.RSAUtil; +import com.welab.wefe.common.web.CurrentAccount; +import com.welab.wefe.common.web.Launcher; +import com.welab.wefe.common.web.config.ApiBeanNameGenerator; +import com.welab.wefe.common.web.dto.ApiResult; +import com.welab.wefe.common.web.dto.SignedApiInput; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; + +import java.nio.charset.StandardCharsets; + +/** + * @author hunter.zhao + */ +@SpringBootApplication +@EnableScheduling +@EnableAsync +@ComponentScan( + lazyInit = true, + nameGenerator = ApiBeanNameGenerator.class, + basePackageClasses = {BoardService.class, Launcher.class, StorageManager.class} +) +public class BoardService implements ApplicationContextAware { + + private static final Logger LOG = LoggerFactory.getLogger(BoardService.class); + + public static void main(String[] args) { + Launcher + .instance() + .apiPackageClass(BoardService.class) + // Login status check method + .checkSessionTokenFunction((api, annotation, token) -> CurrentAccount.get() != null) + .onApiExceptionFunction((api, e) -> { + + // When an exception occurs in a node, + // the corresponding nodeId is told to the front end to facilitate friendly prompts by the front end. + if (e instanceof FlowNodeException) { + FlowNodeException flowNodeException = (FlowNodeException) e; + JObject info = JObject + .create() + .put("node_id", flowNodeException.getNode().getNodeId()); + + ApiResult response = new ApiResult<>(); + response.code = flowNodeException.getStatusCode().getCode(); + response.message = e.getMessage(); + response.data = info; + return response; + + } + + throw e; + }) + .apiPermissionPolicy((api, annotation, params) -> { + + // 鍦ㄧ嚎浣撻獙鐗堜笓鐢 api 鏉冮檺妫鏌 + OnlineDemoApi onlineDemoApi = api.getClass().getAnnotation(OnlineDemoApi.class); + if (onlineDemoApi != null) { + Config config = Launcher.CONTEXT.getBean(Config.class); + if (!config.isOnlineDemo()) { + throw new StatusCodeWithException("The current environment does not allow this API to be called", StatusCode.SYSTEM_ERROR); + } + } + + if (annotation.rsaVerify()) { + rsaVerify(params); + } + }) + .launch(BoardService.class, args); + + Launcher + .instance() + .afterApiExecuteFunction(Launcher.CONTEXT.getBean(OperationLogAfterApiExecute.class)); + } + + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + Launcher.CONTEXT = applicationContext; + } + + + /** + * rsa signature check + */ + private static void rsaVerify(JSONObject params) throws Exception { + SignedApiInput signedApiInput = params.toJavaObject(SignedApiInput.class); + + // At present, the board service only serves the application services of its own wefe system, + // such as gateway and flow, so the same set of public and private keys are used for rsa signatures. + String publicKey = CacheObjects.getRsaPublicKey(); + + boolean verified = RSAUtil.verify( + signedApiInput.getData().getBytes(StandardCharsets.UTF_8), + RSAUtil.getPublicKey(publicKey), + signedApiInput.getSign() + ); + if (!verified) { + throw new StatusCodeWithException("閿欒鐨勭鍚", StatusCode.PARAMETER_VALUE_INVALID); + } + + params.clear(); + + JSONObject data = JSONObject.parseObject(signedApiInput.getData()); + + params.putAll(data); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/AuditApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/AuditApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..ad1e6b2460e42febd622893f68341809c67ef40b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/AuditApi.java" @@ -0,0 +1,101 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.account; + +import com.welab.wefe.board.service.service.account.AccountService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "account/audit", name = "audit the account") +public class AuditApi extends AbstractNoneOutputApi { + + @Autowired + private AccountService accountService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + accountService.audit(input); + + return success(); + } + + + public static class Input extends AbstractApiInput { + + @Check(name = "琚鏍镐汉鐨刬d", require = true) + private String accountId; + + @Check(name = "瀹℃牳缁撴灉", require = true) + private AuditStatus auditStatus; + + @Check(name = "瀹℃牳鎰忚") + private String auditComment; + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + super.checkAndStandardize(); + if (auditStatus == AuditStatus.disagree && StringUtil.isEmpty(auditComment)) { + throw new StatusCodeWithException("璇疯緭鍏ュ鏍告剰瑙", StatusCode.PARAMETER_VALUE_INVALID); + } + + if (auditStatus == AuditStatus.agree && StringUtil.isEmpty(auditComment)) { + auditComment = "閫氳繃"; + } + } + + //region getter/setter + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + + public AuditStatus getAuditStatus() { + return auditStatus; + } + + public void setAuditStatus(AuditStatus auditStatus) { + this.auditStatus = auditStatus; + } + + public String getAuditComment() { + return auditComment; + } + + public void setAuditComment(String auditComment) { + this.auditComment = auditComment; + } + + + //endregion + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/CaptchaApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/CaptchaApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..6716450abb668e7bd119f302c65c92b2548482e1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/CaptchaApi.java" @@ -0,0 +1,71 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.account; + +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractNoneInputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiOutput; +import com.welab.wefe.common.web.dto.ApiResult; +import com.welab.wefe.common.web.dto.Captcha; +import com.welab.wefe.common.web.service.CaptchaService; + +/** + * @author hunter.zhao + */ +@Api(path = "account/captcha", name = "get captcha", login = false) +public class CaptchaApi extends AbstractNoneInputApi { + + @Override + protected ApiResult handle() throws StatusCodeWithException { + Captcha captcha = CaptchaService.get(); + + Output output = new Output(); + output.setKey(captcha.getKey()); + output.setImage(captcha.getImage()); + return success(output); + } + + public static class Output extends AbstractApiOutput { + + private String image; + + private String key; + + + //region getter/setter + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/EnableApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/EnableApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..af1ded1fb5aeb73a446147af1fd73a3bca0c3084 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/EnableApi.java" @@ -0,0 +1,67 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.account; + +import com.welab.wefe.board.service.service.account.AccountService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author lonnie + */ +@Api(path = "account/enable", name = "change account enable status") +public class EnableApi extends AbstractNoneOutputApi { + + @Autowired + private AccountService accountService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + accountService.enable(input); + return success(); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "id鍞竴鏍囪瘑", require = true) + private String id; + + @Check(name = "鏄惁鍙敤", require = true) + private Boolean enable; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Boolean getEnable() { + return enable; + } + + public void setEnable(Boolean enable) { + this.enable = enable; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/ForgetPasswordApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/ForgetPasswordApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..a0d6d7a554d92ce8197f3c897ced6272a1c86d7e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/ForgetPasswordApi.java" @@ -0,0 +1,84 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.account; + +import com.welab.wefe.board.service.service.account.AccountService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import com.welab.wefe.common.web.dto.NoneApiOutput; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; + +/** + * forget password + * + * @author aaron.li + * @date 2021/11/10 14:08 + **/ +@Api(path = "account/forget_password", name = "forgetPassword", login = false) +public class ForgetPasswordApi extends AbstractApi { + @Autowired + private AccountService accountService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException, IOException { + accountService.forgetPassword(input); + return success(); + } + + public static class Input extends AbstractApiInput { + @Check(require = true) + private String phoneNumber; + + @Check(require = true, regex = "^.{6,128}$") + private String password; + + @Check(require = true) + private String smsVerificationCode; + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getSmsVerificationCode() { + return smsVerificationCode; + } + + public void setSmsVerificationCode(String smsVerificationCode) { + this.smsVerificationCode = smsVerificationCode; + } + } + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/LoginApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/LoginApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..f8843a7947d06e863db09aa1f03c5748a4d9c6ee --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/LoginApi.java" @@ -0,0 +1,200 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.account; + +import com.welab.wefe.board.service.database.entity.AccountMySqlModel; +import com.welab.wefe.board.service.service.account.AccountService; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.AbstractApiOutput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author hunter.zhao + */ +@Api(path = "account/login", name = "login", login = false) +public class LoginApi extends AbstractApi { + + @Autowired + private AccountService accountService; + + @Autowired + private GlobalConfigService globalConfigService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + + Output output = accountService.login(input.phoneNumber, input.password, input.key, input.code); + + /** + * After successful login, check whether the system has been initialized + * + * An exception is thrown when it is not initialized. When the front end obtains the exception, it will jump to the initialization interface. + */ + if (globalConfigService.getMemberInfo() == null) { + + // If the login is a super administrator, jump to the initialization page. + if (output.superAdminRole) { + StatusCode status = StatusCode.SYSTEM_NOT_BEEN_INITIALIZED; + return fail(status.getCode(), status.getMessage(), output); + } + // If you are not a super administrator, you will be prompted that you cannot log in. + else { + AccountMySqlModel superAdmin = accountService.findSuperAdmin(); + return fail("The system has not been initialized, please contact " + superAdmin.getNickname() + " Initialize the system."); + } + } + + return success(output); + } + + public static class Input extends AbstractApiInput { + + @Check(require = true) + private String phoneNumber; + + @Check(require = true) + private String password; + + @Check(require = true, desc = "楠岃瘉鐮佹爣璇") + private String key; + + @Check(require = true, desc = "楠岃瘉鐮") + private String code; + + //region getter/setter + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + //endregion + } + + public static class Output extends AbstractApiOutput { + + private String id; + + private String token; + + private String phoneNumber; + + private String nickname; + + private String email; + + private Boolean superAdminRole; + + private Boolean adminRole; + + + //region getter/setter + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Boolean getSuperAdminRole() { + return superAdminRole; + } + + public void setSuperAdminRole(Boolean superAdminRole) { + this.superAdminRole = superAdminRole; + } + + public Boolean getAdminRole() { + return adminRole; + } + + public void setAdminRole(Boolean adminRole) { + this.adminRole = adminRole; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/QueryApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/QueryApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..eaa5825f0b778a2b1e092d55bc78a038fbff7b9c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/QueryApi.java" @@ -0,0 +1,79 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.account; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.AccountOutputModel; +import com.welab.wefe.board.service.service.account.AccountService; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Zane + */ +@Api(path = "account/query", name = "query account by pagination") +public class QueryApi extends AbstractApi> { + + @Autowired + AccountService service; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + return success(service.query(input)); + } + + public static class Input extends PagingInput { + private String phoneNumber; + + private String nickname; + private AuditStatus auditStatus; + + //region getter/setter + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public AuditStatus getAuditStatus() { + return auditStatus; + } + + public void setAuditStatus(AuditStatus auditStatus) { + this.auditStatus = auditStatus; + } + + //endregion + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/QueryMemberAccountsApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/QueryMemberAccountsApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..5a3e6df67298a8619d3a1837814ca5741bfd2543 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/QueryMemberAccountsApi.java" @@ -0,0 +1,56 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.account; + +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.AccountOutputModel; +import com.welab.wefe.board.service.service.account.AccountService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author aaron.li + */ +@Api(path = "account/query_by_member_id", name = "Query account information by member ID", login = false) +public class QueryMemberAccountsApi extends AbstractApi> { + + @Autowired + AccountService accountService; + + @Override + protected ApiResult> handle(QueryMemberAccountsApi.Input input) throws StatusCodeWithException { + return success(accountService.queryMemberAccounts(input)); + } + + public static class Input extends QueryApi.Input { + @Check(require = true) + private String memberId; + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/QueryOnlineApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/QueryOnlineApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..51ded0c6938e48917825f85bdb85a939400d2656 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/QueryOnlineApi.java" @@ -0,0 +1,90 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.account; + +import com.welab.wefe.board.service.dto.vo.OnlineAccountOutput; +import com.welab.wefe.board.service.service.account.AccountService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * Query the online account of the exchange center + * + * @author aaron.li + **/ +@Api(path = "account/query_online", name = "Query the online account of the exchange center") +public class QueryOnlineApi extends AbstractApi { + @Autowired + private AccountService accountService; + + @Override + protected ApiResult handle(QueryOnlineApi.Input input) throws StatusCodeWithException { + Output output = new Output(); + output.setList(accountService.queryOnlineAccount(input)); + return success(output); + } + + public static class Input extends AbstractApiInput { + /** + * member id + */ + @Check(require = true) + private String memberId; + /** + * Account ID (if it is not empty, it means that you specify to query the online status of the account) + */ + private String accountId; + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + } + + + public static class Output { + + private List list; + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/RegisterApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/RegisterApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..7400cff94c65d4702440a102d516d51c2659a206 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/RegisterApi.java" @@ -0,0 +1,85 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.account; + +import com.welab.wefe.board.service.dto.vo.AccountInputModel; +import com.welab.wefe.board.service.service.account.AccountService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.BoardUserSource; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import com.welab.wefe.common.web.service.CaptchaService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author hunter.zhao + */ +@Api(path = "account/register", name = "register", login = false) +public class RegisterApi extends AbstractNoneOutputApi { + @Autowired + private AccountService accountService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + accountService.register(input, BoardUserSource.board_register); + return success(); + } + + + public static class Input extends AccountInputModel { + + @Check(require = true, desc = "楠岃瘉鐮佹爣璇") + private String key; + + @Check(require = true, desc = "楠岃瘉鐮") + private String code; + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + super.checkAndStandardize(); + + // Verification code verification + if (!CaptchaService.verify(key, code)) { + throw new StatusCodeWithException("楠岃瘉鐮侀敊璇紒", StatusCode.PARAMETER_VALUE_INVALID); + } + + } + + //region getter/setter + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/ResetPasswordApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/ResetPasswordApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..3e0ff5eba569510b47ca3c28d149df64a9aaba75 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/ResetPasswordApi.java" @@ -0,0 +1,56 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.account; + +import com.welab.wefe.board.service.service.account.AccountService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author lonnie + */ +@Api(path = "account/reset/password", name = "reset account password") +public class ResetPasswordApi extends AbstractApi { + + @Autowired + private AccountService accountService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + return success(accountService.resetPassword(input)); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "鐢ㄦ埛鍞竴鏍囪瘑", require = true) + private String id; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/SuperAdminChangeApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/SuperAdminChangeApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..29de8e91a3fdbb2fef361c3c9a2b8e2fe9082847 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/SuperAdminChangeApi.java" @@ -0,0 +1,73 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.account; + +import com.welab.wefe.board.service.database.entity.AccountMySqlModel; +import com.welab.wefe.board.service.database.repository.AccountRepository; +import com.welab.wefe.board.service.service.account.AccountService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.CurrentAccount; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import com.welab.wefe.common.web.dto.NoneApiOutput; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author yuxin.zhang + */ +@Api(path = "super/admin/change", name = "Super administrator change") +public class SuperAdminChangeApi extends AbstractApi { + @Autowired + private AccountService accountService; + @Autowired + private AccountRepository accountRepository; + + @Override + protected ApiResult handle(SuperAdminChangeApi.Input input) throws StatusCodeWithException { + AccountMySqlModel account = accountRepository.findById(input.getId()).orElse(null); + + if (account == null) { + throw new StatusCodeWithException("鎸囧畾鐢ㄦ埛涓嶅瓨鍦", StatusCode.DATA_NOT_FOUND); + } + + if (!CurrentAccount.isSuperAdmin()) { + throw new StatusCodeWithException("闈炶秴绾х鐞嗗憳鏃犳硶杩涜姝ゆ搷浣溿", StatusCode.PERMISSION_DENIED); + } + + accountService.changeSuperAdmin(account); + + return success(); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "鍞竴鏍囪瘑", require = true) + private String id; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/UpdateApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/UpdateApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..21930eb3be5369ba2fd29996dd6d152ef3bfca03 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/UpdateApi.java" @@ -0,0 +1,85 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.account; + +import com.welab.wefe.board.service.service.account.AccountService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.StandardFieldType; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import com.welab.wefe.common.web.dto.NoneApiOutput; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author hunter.zhao + */ +@Api(path = "account/update", name = "update account info") +public class UpdateApi extends AbstractApi { + @Autowired + private AccountService accountService; + + @Override + protected ApiResult handle(UpdateApi.Input input) throws StatusCodeWithException { + accountService.update(input); + return success(); + } + + public static class Input extends AbstractApiInput { + @Check(name = "鐢ㄦ埛Id") + public String id; + + @Check(name = "鏄电О") + private String nickname; + + @Check(name = "閭", type = StandardFieldType.Email) + private String email; + + @Check(name = "绠$悊鍛樻潈闄") + private Boolean adminRole; + + //region getter/setter + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Boolean getAdminRole() { + return adminRole; + } + + public void setAdminRole(Boolean adminRole) { + this.adminRole = adminRole; + } + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/UpdatePasswordApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/UpdatePasswordApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..829ffb2bed33965ef93cd800441d247562eaa14b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/UpdatePasswordApi.java" @@ -0,0 +1,73 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.account; + +import com.welab.wefe.board.service.service.account.AccountService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import com.welab.wefe.common.web.dto.NoneApiOutput; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author hunter.zhao + */ +@Api(path = "account/update_password", name = "change password") +public class UpdatePasswordApi extends AbstractApi { + @Autowired + private AccountService accountService; + + @Override + protected ApiResult handle(UpdatePasswordApi.Input input) throws StatusCodeWithException { + accountService.updatePassword(input.oldPassword, input.newPassword); + + return success(); + } + + public static class Input extends AbstractApiInput { + + @Check(require = true) + private String oldPassword; + + @Check(require = true) + private String newPassword; + + //region getter/setter + + public String getOldPassword() { + return oldPassword; + } + + public void setOldPassword(String oldPassword) { + this.oldPassword = oldPassword; + } + + public String getNewPassword() { + return newPassword; + } + + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/test/account-register.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/test/account-register.http" new file mode 100644 index 0000000000000000000000000000000000000000..df2e00ee88ce6ececaedd5ebadd8f1b783e8c4bf --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/test/account-register.http" @@ -0,0 +1,79 @@ + +### 姝e父娉ㄥ唽 +POST {{baseUrl}}/account/register +Content-Type: application/json + +{ + "phone_number": "13100000001", + "nickname": "灏忕敎鐢", + "password": "password", + "email": "email@email.com" +} + +> {% + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 0, "Response code is not 0"); +}); + +%} + + +### 鎵嬫満鍙峰啿绐 +POST {{baseUrl}}/account/register +Content-Type: application/json + +{ + "phone_number": "13100000000", + "nickname": "灏忕敎鐢", + "password": "password", + "email": "email@com.cn" +} + +> {% + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 20001, "Response code is not 20001"); +}); + +%} + + +### 鎵嬫満鍙烽敊璇 +POST {{baseUrl}}/account/register +Content-Type: application/json + +{ + "phone_number": "1310000", + "nickname": "灏忕敎鐢", + "password": "password", + "email": "email@email.email" +} + +> {% + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 10017, "Response code is not 10017"); +}); + +%} + + +### 閭閿欒 +POST {{baseUrl}}/account/register +Content-Type: application/json + +{ + "phone_number": "13100000000", + "nickname": "灏忕敎鐢", + "password": "password", + "email": "email@email.email" +} + +> {% + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 10017, "Response code is not 10017"); +}); + +%} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/test/account.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/test/account.http" new file mode 100644 index 0000000000000000000000000000000000000000..a2f0bbf3691fb7558f8d6eb74cc434e5421d9cea --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/test/account.http" @@ -0,0 +1,82 @@ + +### 鐧诲綍 +POST {{baseUrl}}/account/login +Content-Type: application/json + +{ + "phone_number": "13100000001", + "password": "password" +} + +> {% + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 0, "Response code is not 0"); +}); + +client.global.set("token", response.body.data.token); + +%} + + + +### 淇敼瀵嗙爜 +POST {{baseUrl}}/account/update_password +Content-Type: application/json +token: {{token}} + +{ + "old_password": "password", + "new_password": "password1" +} + + + +### 淇敼瀵嗙爜鍚庡啀娆$櫥褰 +POST {{baseUrl}}/account/login +Content-Type: application/json + +{ + "phone_number": "13100000001", + "password": "password1" +} + +> {% + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 0, "Response code is not 0"); +}); + +client.global.set("token", response.body.data.token); + +%} + + +### 鍐嶆妸瀵嗙爜鏀瑰洖鍘 +POST {{baseUrl}}/account/update_password +Content-Type: application/json +token: {{token}} + +{ + "old_password": "password1", + "new_password": "password" +} + + +### 鍒嗛〉鏌ヨ +POST {{baseUrl}}/account/query +Content-Type: application/json + +{ + "page_index": 0, + "page_size": 2 +} + + +> {% + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 0, "Response code is not 0"); +}); + +%} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/test/enable.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/test/enable.http" new file mode 100644 index 0000000000000000000000000000000000000000..a81c77d2eb71d4e39901820d047941529f2c43e2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/test/enable.http" @@ -0,0 +1,10 @@ + +POST {{baseUrl}}/account/enable +Content-Type: application/json + +{ + "id":"9514861dd5a24ad8bf2f6f77a412867b", + "enable":false +} + +### \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/test/reset-password.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/test/reset-password.http" new file mode 100644 index 0000000000000000000000000000000000000000..654bf0358f93f176b464fd211be32ca10771e886 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/test/reset-password.http" @@ -0,0 +1,9 @@ +POST {{baseUrl}}/account/reset/password +Content-Type: application/json +token: {{token}} + +{ + "id":"6ac57a3898714273a2bb38f6ba959c78" +} + +### \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/test/update.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/test/update.http" new file mode 100644 index 0000000000000000000000000000000000000000..075c3d3a30a5a4247eb4fe587095b994b51c3441 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/account/test/update.http" @@ -0,0 +1,11 @@ +POST {{baseUrl}}/account/update +Content-Type: application/json +token: {{token}} + +{ + "id": "6ac57a3898714273a2bb38f6ba959c78", + "nickName": "updateNick1", + "email": "afd@12.com" +} + +### \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/blacklist/AddApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/blacklist/AddApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..120b8da27f92e85f0e1092976b30692c1ec82faf --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/blacklist/AddApi.java" @@ -0,0 +1,69 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.blacklist; + +import com.welab.wefe.board.service.service.BlacklistService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author lonnie + */ +@Api(path = "blacklist/add", name = "add members to blacklist") +public class AddApi extends AbstractNoneOutputApi { + + @Autowired + private BlacklistService blacklistService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + blacklistService.add(input); + return success(); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "鍔犲叆榛戝悕鍗曞緱鐨勬垚鍛榠d", require = true) + private List memberIds; + + private String remark; + + public List getMemberIds() { + return memberIds; + } + + public void setMemberIds(List memberIds) { + this.memberIds = memberIds; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/blacklist/BlacklistApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/blacklist/BlacklistApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..9271e7115220990831883c5a8da334a870d72055 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/blacklist/BlacklistApi.java" @@ -0,0 +1,47 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.blacklist; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.BlacklistOutputModel; +import com.welab.wefe.board.service.service.BlacklistService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author lonnie + */ +@Api(path = "blacklist/list", name = "query blacklist by pagination") +public class BlacklistApi extends AbstractApi> { + + @Autowired + private BlacklistService blacklistService; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + return success(blacklistService.list(input)); + } + + public static class Input extends PagingInput { + + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/blacklist/BlacklistMemberApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/blacklist/BlacklistMemberApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..75ef0812f82f780a4aaadb5ed58196063b2cbed7 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/blacklist/BlacklistMemberApi.java" @@ -0,0 +1,65 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.blacklist; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.MemberOutputModel; +import com.welab.wefe.board.service.service.BlacklistService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author lonnie + */ +@Api(path = "blacklist/member", name = "query blacklist members") +public class BlacklistMemberApi extends AbstractApi> { + + @Autowired + private BlacklistService blacklistService; + + @Override + protected ApiResult> handle(BlacklistMemberApi.Input input) throws StatusCodeWithException { + + return success(blacklistService.queryBlacklistMember(input)); + } + + public static class Input extends PagingInput { + private String id; + + private String name; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/blacklist/DeleteApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/blacklist/DeleteApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..35bceff18b39aac8f7e77dfdcd682bb912af5f51 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/blacklist/DeleteApi.java" @@ -0,0 +1,61 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.blacklist; + +import com.welab.wefe.board.service.service.BlacklistService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author lonnie + */ +@Api(path = "blacklist/delete", name = "remove a member from the blacklist") +public class DeleteApi extends AbstractNoneOutputApi { + + @Autowired + private BlacklistService blacklistService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + blacklistService.deleteFromBlacklist(input); + return success(); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "榛戝悕鍗曚富閿", require = true) + private String id; + + //region getter/setter + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + //endregion + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/blacklist/test/blacklist.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/blacklist/test/blacklist.http" new file mode 100644 index 0000000000000000000000000000000000000000..23bafc9c876d8b6d0401c5cf21262781269cd588 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/blacklist/test/blacklist.http" @@ -0,0 +1,27 @@ +### 鏌ヨ鍏ㄩ儴鏁版嵁闆 +POST {{baseUrl}}/blacklist/list +Content-Type: application/json +token:9a90763c-1313-41c8-b2a2-b93d0dd66d93 + +{} + +> {% + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 0, "Response code is not 0"); +}); + +%} + +### + +POST {{baseUrl}}/blacklist/add +Content-Type: application/json +token:4c1d7dcf-89ee-44e4-8649-91f1055062b5 + +{ + "memberIds":["123"], + "remark":"test" +} + +### \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/AddChatLastAccountApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/AddChatLastAccountApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..a05cb20401c4e3d16f4c159c40e1eb2ddb383f18 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/AddChatLastAccountApi.java" @@ -0,0 +1,155 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.chat; + +import com.welab.wefe.board.service.service.ChatLastAccountService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import com.welab.wefe.common.web.dto.NoneApiOutput; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Add a recent chat account + *

+ * Scenario: when the front end clicks an account from the account list, it calls the interface to add the account to the database + *

+ * + * @author aaron.li + **/ +@Api(path = "chat/add_chat_last_account", name = "Add a recent chat account") +public class AddChatLastAccountApi extends AbstractApi { + + @Autowired + private ChatLastAccountService chatLastAccountService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + chatLastAccountService.add(input); + return success(); + } + + public static class Input extends AbstractApiInput { + /** + * account id + */ + @Check(require = true) + private String accountId; + /** + * account name + */ + @Check(require = true) + private String accountName; + /** + * member id + */ + @Check(require = true) + private String memberId; + /** + * member name + */ + @Check(require = true) + private String memberName; + /** + * liaison account id + */ + @Check(require = true) + private String liaisonAccountId; + /** + * liaison account name + */ + @Check(require = true) + private String liaisonAccountName; + /** + * liaison member id + */ + @Check(require = true) + private String liaisonMemberId; + /** + * liaison member name + */ + @Check(require = true) + private String liaisonMemberName; + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + + public String getAccountName() { + return accountName; + } + + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getMemberName() { + return memberName; + } + + public void setMemberName(String memberName) { + this.memberName = memberName; + } + + public String getLiaisonAccountId() { + return liaisonAccountId; + } + + public void setLiaisonAccountId(String liaisonAccountId) { + this.liaisonAccountId = liaisonAccountId; + } + + public String getLiaisonAccountName() { + return liaisonAccountName; + } + + public void setLiaisonAccountName(String liaisonAccountName) { + this.liaisonAccountName = liaisonAccountName; + } + + public String getLiaisonMemberId() { + return liaisonMemberId; + } + + public void setLiaisonMemberId(String liaisonMemberId) { + this.liaisonMemberId = liaisonMemberId; + } + + public String getLiaisonMemberName() { + return liaisonMemberName; + } + + public void setLiaisonMemberName(String liaisonMemberName) { + this.liaisonMemberName = liaisonMemberName; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/DeleteChatLastAccountApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/DeleteChatLastAccountApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..95fd9e57a98aae2fd41ad85aa30c158ac5262c0f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/DeleteChatLastAccountApi.java" @@ -0,0 +1,74 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.chat; + +import com.welab.wefe.board.service.service.ChatLastAccountService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import com.welab.wefe.common.web.dto.NoneApiOutput; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Delete recent chat account + * + * @author aaron.li + **/ +@Api(path = "chat/delete_chat_last_account", name = "Delete recent chat account") +public class DeleteChatLastAccountApi extends AbstractApi { + + @Autowired + private ChatLastAccountService chatLastAccountService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + chatLastAccountService.delete(input); + return success(); + } + + public static class Input extends AbstractApiInput { + /** + * account id + */ + @Check(require = true) + private String accountId; + /** + * liaison account id + */ + @Check(require = true) + private String liaisonAccountId; + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + + public String getLiaisonAccountId() { + return liaisonAccountId; + } + + public void setLiaisonAccountId(String liaisonAccountId) { + this.liaisonAccountId = liaisonAccountId; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/QueryChatDetailApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/QueryChatDetailApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..757c36b4fb74ddc574a380a456c1e2dfdbc000c9 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/QueryChatDetailApi.java" @@ -0,0 +1,102 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.chat; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.MemberChatOutputModel; +import com.welab.wefe.board.service.service.MemberChatService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiOutput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author Johnny.lin + */ +@Api(path = "chat/detail", name = "Query chat details") +public class QueryChatDetailApi extends AbstractApi> { + + @Autowired + MemberChatService memberChatService; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + return success(memberChatService.queryChatDetail(input)); + } + + + public static class Input extends PagingInput { + /** + * from account id + */ + @Check(require = true) + private String fromAccountId; + + /** + * to account id + */ + @Check(require = true) + private String toAccountId; + /** + * query timestamp limit + */ + private Long limitCreateTime; + + public String getFromAccountId() { + return fromAccountId; + } + + public void setFromAccountId(String fromAccountId) { + this.fromAccountId = fromAccountId; + } + + public String getToAccountId() { + return toAccountId; + } + + public void setToAccountId(String toAccountId) { + this.toAccountId = toAccountId; + } + + public Long getLimitCreateTime() { + return limitCreateTime; + } + + public void setLimitCreateTime(Long limitCreateTime) { + this.limitCreateTime = limitCreateTime; + } + } + + public static class Output extends AbstractApiOutput { + private List list; + + public List getList() { + return list; + } + + public Output setList(List list) { + this.list = list; + return this; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/QueryChatLastAccountApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/QueryChatLastAccountApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..e461d4cda873f607f34c0fe0d97f4f8a9c0fb788 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/QueryChatLastAccountApi.java" @@ -0,0 +1,77 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.chat; + +import com.welab.wefe.board.service.dto.entity.ChatLastAccountOutputModel; +import com.welab.wefe.board.service.service.ChatLastAccountService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.AbstractApiOutput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * Query recent chat account + * + * @author aaron.li + **/ +@Api(path = "chat/chat_last_account", name = "Query recent chat account") +public class QueryChatLastAccountApi extends AbstractApi { + + @Autowired + private ChatLastAccountService chatLastAccountService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + return success(new Output().setList(chatLastAccountService.query(input.accountId))); + } + + public static class Input extends AbstractApiInput { + /** + * account id + */ + @Check(require = true) + private String accountId; + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + } + + public static class Output extends AbstractApiOutput { + private List list; + + public List getList() { + return list; + } + + public Output setList(List list) { + this.list = list; + return this; + } + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/ResendMessageApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/ResendMessageApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..7eebbf84e61b3ee9328e87d44ed4655e34f9a888 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/ResendMessageApi.java" @@ -0,0 +1,61 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.chat; + +import com.welab.wefe.board.service.service.MemberChatService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import com.welab.wefe.common.web.dto.NoneApiOutput; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Resend send failure message + * + * @author aaron.li + **/ +@Api(path = "chat/resend_message", name = "Resend send failure message") +public class ResendMessageApi extends AbstractApi { + + @Autowired + private MemberChatService memberChatService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + memberChatService.resendMessage(input.memberChatId); + return success(); + } + + public static class Input extends AbstractApiInput { + /** + * Back end database message ID + */ + @Check(require = true) + private String memberChatId; + + public String getMemberChatId() { + return memberChatId; + } + + public void setMemberChatId(String memberChatId) { + this.memberChatId = memberChatId; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/SendMessageApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/SendMessageApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..1e89457c7aa940e2328c52108e04a35c075f2b5d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/SendMessageApi.java" @@ -0,0 +1,162 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.chat; + +import com.welab.wefe.board.service.constant.ChatConstant; +import com.welab.wefe.board.service.service.MemberChatService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.AbstractApiOutput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Send messages through non WebSockets + * + * @author aaron.li + **/ +@Api(path = "chat/send_message", name = "Send messages through non WebSockets") +public class SendMessageApi extends AbstractApi { + @Autowired + private MemberChatService memberChatService; + + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + JObject ret = memberChatService.sendMessage(input.toMemberId, input.toMemberName, input.toAccountId, input.toAccountName, input.content); + String code = ret.getString(ChatConstant.KEY_CODE); + String message = ret.getString(ChatConstant.KEY_MESSAGE); + String memberChatId = ret.getString(ChatConstant.KEY_MEMBER_CHAT_ID); + + Output output = new Output(); + output.setMemberChatId(memberChatId); + output.setMessageId(input.messageId); + return "0".equals(code) ? success(output) : fail(StatusCode.SYSTEM_ERROR.getCode(), message, output); + } + + public static class Input extends AbstractApiInput { + /** + * Receiver member ID + */ + @Check(require = true) + private String toMemberId; + /** + * Receiver member name + */ + @Check(require = true) + private String toMemberName; + /** + * Receiver account id + */ + @Check(require = true) + private String toAccountId; + /** + * Receiver account name + */ + @Check(require = true) + private String toAccountName; + /** + * message content + */ + @Check(require = true) + private String content; + /** + * Message ID used by the front end + */ + private String messageId; + + public String getToMemberId() { + return toMemberId; + } + + public void setToMemberId(String toMemberId) { + this.toMemberId = toMemberId; + } + + public String getToMemberName() { + return toMemberName; + } + + public void setToMemberName(String toMemberName) { + this.toMemberName = toMemberName; + } + + public String getToAccountId() { + return toAccountId; + } + + public void setToAccountId(String toAccountId) { + this.toAccountId = toAccountId; + } + + public String getToAccountName() { + return toAccountName; + } + + public void setToAccountName(String toAccountName) { + this.toAccountName = toAccountName; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getMessageId() { + return messageId; + } + + public void setMessageId(String messageId) { + this.messageId = messageId; + } + } + + public static class Output extends AbstractApiOutput { + /** + * Message ID used by the front end + */ + private String messageId; + /** + * Back end database message ID + */ + private String memberChatId; + + public String getMessageId() { + return messageId; + } + + public void setMessageId(String messageId) { + this.messageId = messageId; + } + + public String getMemberChatId() { + return memberChatId; + } + + public void setMemberChatId(String memberChatId) { + this.memberChatId = memberChatId; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/UnreadMessageIncreaseOneApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/UnreadMessageIncreaseOneApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..be44ecd95f95f68a6d1114022ef3ecff1867ce6a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/UnreadMessageIncreaseOneApi.java" @@ -0,0 +1,118 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.chat; + +import com.welab.wefe.board.service.database.entity.chat.MemberChatMySqlModel; +import com.welab.wefe.board.service.service.ChatUnreadMessageService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import com.welab.wefe.common.web.dto.NoneApiOutput; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Unread message plus 1 + *

+ * Usage scenario: A and B are chatting (the active chat window of a is b), and suddenly C sends a message to A. + * because the active window of a is B, for a, add 1 to the unread message of C. + * at this time, the front end calls this interface to add 1 to the unread message of C + *

+ * + * @author aaron.li + **/ +@Api(path = "chat/unread_message_increase_one", name = "Unread message plus 1") +public class UnreadMessageIncreaseOneApi extends AbstractApi { + + @Autowired + private ChatUnreadMessageService chatUnreadMessageService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + chatUnreadMessageService.addChatUnreadMessage(buildModel(input)); + return success(); + } + + public static class Input extends AbstractApiInput { + /** + * Sender member id + */ + @Check(require = true) + private String fromMemberId; + /** + * Sender account id + */ + @Check(require = true) + private String fromAccountId; + /** + * Receiver member id + */ + @Check(require = true) + private String toMemberId; + /** + * Receiver account id + */ + @Check(require = true) + private String toAccountId; + + public String getFromMemberId() { + return fromMemberId; + } + + public void setFromMemberId(String fromMemberId) { + this.fromMemberId = fromMemberId; + } + + public String getFromAccountId() { + return fromAccountId; + } + + public void setFromAccountId(String fromAccountId) { + this.fromAccountId = fromAccountId; + } + + public String getToMemberId() { + return toMemberId; + } + + public void setToMemberId(String toMemberId) { + this.toMemberId = toMemberId; + } + + public String getToAccountId() { + return toAccountId; + } + + public void setToAccountId(String toAccountId) { + this.toAccountId = toAccountId; + } + } + + + private MemberChatMySqlModel buildModel(UnreadMessageIncreaseOneApi.Input input) { + MemberChatMySqlModel model = new MemberChatMySqlModel(); + model.setFromMemberId(input.getFromMemberId()); + model.setFromAccountId(input.getFromAccountId()); + model.setToMemberId(input.getToMemberId()); + model.setToAccountId(input.getToAccountId()); + + return model; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/UpdateToReadApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/UpdateToReadApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..5f8fc1115d4900a6073456341b9c602042b30caa --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/chat/UpdateToReadApi.java" @@ -0,0 +1,70 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.chat; + +import com.welab.wefe.board.service.service.MemberChatService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Update the chat message of the account as read + * + * @author Johnny.lin + */ +@Api(path = "chat/update_to_read", name = "Update the chat message of the account as read") +public class UpdateToReadApi extends AbstractNoneOutputApi { + + @Autowired + MemberChatService memberChatService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + memberChatService.messageUpdateToRead(input); + return success(); + } + + + public static class Input extends AbstractApiInput { + @Check(require = true) + private String fromAccountId; + + @Check(require = true) + private String toAccountId; + + + public String getFromAccountId() { + return fromAccountId; + } + + public void setFromAccountId(String fromAccountId) { + this.fromAccountId = fromAccountId; + } + + public String getToAccountId() { + return toAccountId; + } + + public void setToAccountId(String toAccountId) { + this.toAccountId = toAccountId; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/component/ListApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/component/ListApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..4d4eef656abb7b842b1a98f213c93186256f933e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/component/ListApi.java" @@ -0,0 +1,69 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.component; + +import com.welab.wefe.board.service.dto.entity.component.ComponentOutputModel; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author zane.luo + **/ +@Api(path = "component/list", name = "list components") +public class ListApi extends AbstractApi> { + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + + List list = Arrays.stream(ComponentType.values()) + .filter(x -> input.getFederatedLearningType() == null || x.getFederatedLearningTypes() == null + || x.getFederatedLearningTypes().contains(input.federatedLearningType)) + // Exclude the relevant components of the validation data set, which have not been developed yet. + .filter(x -> !x.name().contains("ValidationDataSetLoader")) + .map(x -> new ComponentOutputModel(x.name(), x.getLabel(), x.getDesc())).collect(Collectors.toList()); + + return success(list); + } + + public static class Input extends AbstractApiInput { + @Check(name = "妯悜/绾靛悜") + private FederatedLearningType federatedLearningType; + + //region getter/setter + + public FederatedLearningType getFederatedLearningType() { + return federatedLearningType; + } + + public void setFederatedLearningType(FederatedLearningType federatedLearningType) { + this.federatedLearningType = federatedLearningType; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/component/test/list.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/component/test/list.http" new file mode 100644 index 0000000000000000000000000000000000000000..ae08eea3b36ad23b180e1fbda09351df5aad7b0b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/component/test/list.http" @@ -0,0 +1,22 @@ +### 鏌ュ叏閮 +POST {{baseUrl}}/component/list +Content-Type: application/json + +{} + +### 鏌ユí鍚 +POST {{baseUrl}}/component/list +Content-Type: application/json + +{ + "federatedLearningType": "horizontal" +} + + +### 鏌ョ旱鍚 +POST {{baseUrl}}/component/list +Content-Type: application/json + +{ + "federatedLearningType": "vertical" +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/data_output_info/ModelExportController.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/data_output_info/ModelExportController.java" new file mode 100644 index 0000000000000000000000000000000000000000..945a583796956bcfbd61cd4486b57562e7ee375d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/data_output_info/ModelExportController.java" @@ -0,0 +1,121 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.data_output_info; + +import com.welab.wefe.board.service.service.modelexport.ModelExportService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.ModelExportLanguage; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.CurrentAccount; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; + +/** + * @author aaron.li + **/ +@Controller +public class ModelExportController { + + protected final Logger LOG = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private ModelExportService modelExportService; + + + @RequestMapping(value = "/data_output_info/model_export", produces = "application/json; charset=UTF-8") + public void download(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { + PrintWriter out = null; + String jobId = null; + String modelFlowNodeId = null; + String role = null; + String language = null; + String token = null; + try { + jobId = httpServletRequest.getParameter("jobId"); + modelFlowNodeId = httpServletRequest.getParameter("modelFlowNodeId"); + role = httpServletRequest.getParameter("role"); + language = httpServletRequest.getParameter("language"); + token = httpServletRequest.getParameter("token"); + httpServletResponse.setCharacterEncoding("UTF-8"); + out = httpServletResponse.getWriter(); + CurrentAccount.Info info = CurrentAccount.get(token); + if (null == info) { + out.write(JObject.create().append("code", StatusCode.PARAMETER_VALUE_INVALID.getCode()) + .append("message", "鏈櫥褰").toString()); + out.flush(); + return; + } + httpServletResponse.setHeader("content-type", "text/html;charset=UTF-8"); + if (StringUtil.isEmpty(jobId) || StringUtil.isEmpty(modelFlowNodeId)) { + out.write(JObject.create().append("code", StatusCode.PARAMETER_VALUE_INVALID.getCode()) + .append("message", "鍙傛暟jobId涓嶈兘涓虹┖").toString()); + out.flush(); + return; + } + if (StringUtil.isEmpty(modelFlowNodeId)) { + out.write(JObject.create().append("code", StatusCode.PARAMETER_VALUE_INVALID.getCode()) + .append("message", "鍙傛暟modelFlowNodeId涓嶈兘涓虹┖").toString()); + out.flush(); + return; + } + + if (StringUtil.isEmpty(role)) { + out.write(JObject.create().append("code", StatusCode.PARAMETER_VALUE_INVALID.getCode()) + .append("message", "鍙傛暟role涓嶈兘涓虹┖").toString()); + out.flush(); + return; + } + + if (StringUtil.isEmpty(language)) { + out.write(JObject.create().append("code", StatusCode.PARAMETER_VALUE_INVALID.getCode()) + .append("message", "鍙傛暟language涓嶈兘涓虹┖").toString()); + out.flush(); + return; + } + + // export + String exportResult = modelExportService.handle(jobId, modelFlowNodeId, role, language); + + httpServletResponse.setHeader("content-disposition", "attachment;filename=" + "model." + ModelExportLanguage.getLanguageSuffix(language)); + httpServletResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + out.write(exportResult); + out.flush(); + } catch (Exception e) { + LOG.error("Job id: " + jobId + " model export exception锛", e); + if (null != out) { + out.write(JObject.create().append("code", StatusCode.SYSTEM_ERROR.getCode()) + .append("message", "妯″瀷瀵煎嚭寮傚父:" + e.getMessage()).toString()); + out.flush(); + } + } finally { + if (null != out) { + out.close(); + } + } + + } + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/data_output_info/SyncModelToServingApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/data_output_info/SyncModelToServingApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..998fe72e47e1e105368ec3e9787fee6e1b152084 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/data_output_info/SyncModelToServingApi.java" @@ -0,0 +1,85 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.data_output_info; + +import com.welab.wefe.board.service.service.ServingService; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author hunter.zhao + */ +@Api(path = "data_output_info/sync_model_to_serving", name = "sync model to serving service") +public class SyncModelToServingApi extends AbstractNoneOutputApi { + + @Autowired + private ServingService servingService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + servingService.syncModelToServing(input); + return success(); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "taskId", require = true) + private String taskId; + +// @Check(name = "type", require = true) +// private TaskResultType type = TaskResultType.model_train; + + @Check(name = "妯″瀷瑙掕壊", require = true) + private JobMemberRole role; + + //region getter/setter + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + +// public TaskResultType getType() { +// return type; +// } +// +// public void setType(TaskResultType type) { +// this.type = type; +// } + + public JobMemberRole getRole() { + return role; + } + + public void setRole(JobMemberRole role) { + this.role = role; + } + + + //endregion + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/data_output_info/test/model_push.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/data_output_info/test/model_push.http" new file mode 100644 index 0000000000000000000000000000000000000000..3d33613408fe43dec43126e901421c874e1fc247 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/data_output_info/test/model_push.http" @@ -0,0 +1,12 @@ + +### + +POST {{baseUrl}}/data_output_info/model_push +Content-Type: application/json +token:4c1d7dcf-89ee-44e4-8649-91f1055062b5 + +{ + "id":"a475edb2c3e34b33896e07da468bdf5e" +} + +### \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/AddApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/AddApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..685c052b942de765059a4a7555dac5f3c1e70665 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/AddApi.java" @@ -0,0 +1,45 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.dataset; + +import com.welab.wefe.board.service.database.entity.data_set.DataSetTaskMysqlModel; +import com.welab.wefe.board.service.dto.vo.DataSetAddInputModel; +import com.welab.wefe.board.service.service.dataset.DataSetTaskService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; + +/** + * @author Zane + */ +@Api(path = "data_set/add", name = "add data set") +public class AddApi extends AbstractApi { + + @Autowired + private DataSetTaskService dataSetTaskService; + + @Override + protected ApiResult handle(DataSetAddInputModel input) throws StatusCodeWithException, IOException { + DataSetTaskMysqlModel dataSetTaskMysqlModel = dataSetTaskService.add(input); + return success(dataSetTaskMysqlModel); + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/DeleteApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/DeleteApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..6d23805b4214ff9389a29fe04d9b0d1aa4b68c69 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/DeleteApi.java" @@ -0,0 +1,60 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.dataset; + +import com.welab.wefe.board.service.service.DataSetService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Zane + */ +@Api(path = "data_set/delete", name = "delete data set") +public class DeleteApi extends AbstractNoneOutputApi { + + @Autowired + private DataSetService dataSetService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + dataSetService.delete(input); + return success(); + } + + public static class Input extends AbstractApiInput { + @Check(name = "鏁版嵁闆 Id", require = true) + private String id; + + //region getter/setter + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/DetailApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/DetailApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..e678041daf99d587384db05f342ecd5ea3de01a2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/DetailApi.java" @@ -0,0 +1,70 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.dataset; + +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.database.repository.DataSetRepository; +import com.welab.wefe.board.service.dto.entity.data_set.DataSetOutputModel; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Zane + */ +@Api(path = "data_set/detail", name = "get data set detail") +public class DetailApi extends AbstractApi { + + @Autowired + DataSetRepository dataSetRepository; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + + DataSetMysqlModel model = dataSetRepository.findById(input.id).orElse(null); + + if (model == null) { + return success(); + } + + DataSetOutputModel output = ModelMapper.map(model, DataSetOutputModel.class); + + return success(output); + + } + + public static class Input extends AbstractApiInput { + private String id; + + //region getter/setter + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/PreviewApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/PreviewApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..226a57bd1dfce8ac793149d25d37666296ad8d85 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/PreviewApi.java" @@ -0,0 +1,362 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.dataset; + +import com.welab.wefe.board.service.constant.DataSetAddMethod; +import com.welab.wefe.board.service.database.entity.DataSourceMySqlModel; +import com.welab.wefe.board.service.dto.entity.data_set.DataSetColumnOutputModel; +import com.welab.wefe.board.service.service.DataSetService; +import com.welab.wefe.board.service.util.AbstractDataSetReader; +import com.welab.wefe.board.service.util.CsvDataSetReader; +import com.welab.wefe.board.service.util.ExcelDataSetReader; +import com.welab.wefe.board.service.util.JdbcManager; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.ColumnDataType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.ListUtil; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.File; +import java.io.IOException; +import java.sql.Connection; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * @author Zane + */ +@Api(path = "data_set/preview", name = "preview data set rows") +public class PreviewApi extends AbstractApi { + + private static final Pattern MATCH_INTEGER_PATTERN = Pattern.compile("^-?\\d{1,9}$"); + private static final Pattern MATCH_LONG_PATTERN = Pattern.compile("^-?\\d{10,}$"); + private static final Pattern MATCH_DOUBLE_PATTERN = Pattern.compile("^-?\\d+\\.\\d+$"); + + @Autowired + DataSetService dataSetService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + + Output output = new Output(); + // Read data from the database for preview + if (DataSetAddMethod.Database.equals(input.getDataSetAddMethod())) { + // Test whether SQL can be queried normally + boolean result = dataSetService.testSqlQuery(input.getDataSourceId(), input.getSql()); + if (result) { + output = readFromDatabase(input.getDataSourceId(), input.getSql()); + } + } else { + + File file = dataSetService.getDataSetFile(input.getDataSetAddMethod(), input.getFilename()); + try { + output = readFile(file); + } catch (IOException e) { + LOG.error(e.getClass().getSimpleName() + " " + e.getMessage(), e); + throw new StatusCodeWithException(e.getMessage(), StatusCode.SYSTEM_ERROR); + } + } + + //generateMetadata(output); + + return success(output); + } + + /** + * Parse the dataset file + */ + private Output readFile(File file) throws IOException, StatusCodeWithException { + + + Output output = new Output(); + LinkedHashMap metadata = new LinkedHashMap<>(); + + + // How to consume the first row of a column + Consumer> headRowConsumer = row -> { + + output.header.addAll(row); + + for (String name : output.header) { + DataSetColumnOutputModel column = new DataSetColumnOutputModel(); + column.setName(name); + metadata.put(name, column); + } + + }; + + // Data line consumer + DataRowConsumer dataRowConsumer = new DataRowConsumer(metadata, output); + + + try ( + AbstractDataSetReader reader = file.getName().endsWith("csv") + ? new CsvDataSetReader(file) + : new ExcelDataSetReader(file) + ) { + // Get column header + headRowConsumer.accept(reader.getHeader()); + // Read data row + reader.read(dataRowConsumer, 10000, 10_000); + } + + output.setMetadataList(new ArrayList<>(metadata.values())); + + + return output; + } + + /** + * Data line consumer + */ + private static class DataRowConsumer implements Consumer> { + + private final LinkedHashMap metadata; + private final Output output; + + private boolean allColumnKnowDataType = false; + + + public DataRowConsumer(LinkedHashMap metadata, Output output) { + this.metadata = metadata; + this.output = output; + } + + @Override + public void accept(LinkedHashMap x) { + // The front end only previews 10 rows of data, too many interfaces will freeze. + if (output.rawDataList.size() < 10) { + output.rawDataList.add(x); + } + + if (allColumnKnowDataType) { + return; + } + + // Infer data type + boolean hasUnkonow = true; + for (String name : output.header) { + + DataSetColumnOutputModel column = metadata.get(name); + if (column.getDataType() == null) { + + Object value = x.get(name); + ColumnDataType dataType = inferDataType(String.valueOf(value)); + + if (dataType != null) { + column.setDataType(dataType); + } else { + hasUnkonow = true; + } + } + } + + if (!hasUnkonow) { + allColumnKnowDataType = true; + } + + } + + /** + * Infer data type + */ + private ColumnDataType inferDataType(String value) { + if (AbstractDataSetReader.isEmptyValue(value)) { + return null; + } + + if (MATCH_DOUBLE_PATTERN.matcher(value).find()) { + return ColumnDataType.Double; + } + + if (MATCH_LONG_PATTERN.matcher(value).find()) { + return ColumnDataType.Long; + } + + if (MATCH_INTEGER_PATTERN.matcher(value).find()) { + return ColumnDataType.Integer; + } + + return ColumnDataType.String; + } + } + + private Output readFromDatabase(String dataSourceId, String sql) throws StatusCodeWithException { + DataSourceMySqlModel model = dataSetService.getDataSourceById(dataSourceId); + if (model == null) { + throw new StatusCodeWithException("dataSourceId鍦ㄦ暟鎹簱涓嶅瓨鍦", StatusCode.DATA_NOT_FOUND); + } + + Connection conn = JdbcManager.getConnection( + model.getDatabaseType(), + model.getHost(), + model.getPort(), + model.getUserName(), + model.getPassword(), + model.getDatabaseName() + ); + + // Get the column header of the data set + List header = JdbcManager.getRowHeaders(conn, sql); + if (header.stream().distinct().count() != header.size()) { + throw new StatusCodeWithException("鏁版嵁闆嗗寘鍚噸澶嶇殑瀛楁锛岃澶勭悊鍚庨噸鏂颁笂浼犮", StatusCode.PARAMETER_VALUE_INVALID); + } + + // Convert uppercase Y to lowercase y + header = header.stream().map(x -> "Y".equals(x) ? "y" : x).collect(Collectors.toList()); + + boolean containsY = header.contains("y"); + int yIndex = header.indexOf("y"); + + // If there is a y column, move y to the second column (the first column is the primary key). + if (containsY) { + ListUtil.moveElement(header, yIndex, 1); + } + + Output output = new Output(); + LinkedHashMap metadata = new LinkedHashMap<>(); + output.setHeader(header); + + for (String name : output.header) { + DataSetColumnOutputModel column = new DataSetColumnOutputModel(); + column.setName(name); + metadata.put(name, column); + } + + // Data line consumer + DataRowConsumer dataRowConsumer = new DataRowConsumer(metadata, output); + + JdbcManager.readWithFieldRow(conn, sql, dataRowConsumer, 10); + + + output.setMetadataList(new ArrayList<>(metadata.values())); + + return output; + } + + + //region dto + + public static class Input extends AbstractApiInput { + + @Check(require = true, name = "鏂囦欢鍚", messageOnEmpty = "璇锋寚瀹氭暟鎹泦鏂囦欢") + private String filename; + + @Check(require = true, name = "鏁版嵁闆嗘坊鍔犳柟娉") + private DataSetAddMethod dataSetAddMethod; + + @Check(name = "鏁版嵁婧恑d") + private String dataSourceId; + + @Check(name = "sql鑴氭湰") + private String sql; + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + // If the source is a database, dataSourceId and sql must not be empty. + if (DataSetAddMethod.Database.equals(dataSetAddMethod)) { + if (StringUtils.isEmpty(dataSourceId)) { + throw new StatusCodeWithException("dataSourceId鍦ㄦ暟鎹簱涓嶅瓨鍦", StatusCode.DATA_NOT_FOUND); + } + + if (StringUtils.isEmpty(sql)) { + throw new StatusCodeWithException("璇峰~鍏ql鏌ヨ璇彞", StatusCode.PARAMETER_CAN_NOT_BE_EMPTY); + } + } + } + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + public DataSetAddMethod getDataSetAddMethod() { + return dataSetAddMethod; + } + + public void setDataSetAddMethod(DataSetAddMethod dataSetAddMethod) { + this.dataSetAddMethod = dataSetAddMethod; + } + + public String getDataSourceId() { + return dataSourceId; + } + + public void setDataSourceId(String dataSourceId) { + this.dataSourceId = dataSourceId; + } + + public String getSql() { + return sql; + } + + public void setSql(String sql) { + this.sql = sql; + } + } + + public static class Output { + @Check(name = "瀛楁鍒楄〃") + private List header = new ArrayList<>(); + @Check(name = "鍘熷鏁版嵁鍒楄〃") + private List> rawDataList = new ArrayList<>(); + @Check(name = "鍏冩暟鎹俊鎭") + private List metadataList = new ArrayList<>(); + + + public List getHeader() { + return header; + } + + public void setHeader(List header) { + this.header = header; + } + + public List> getRawDataList() { + return rawDataList; + } + + public void setRawDataList(List> rawDataList) { + this.rawDataList = rawDataList; + } + + public List getMetadataList() { + return metadataList; + } + + public void setMetadataList(List metadataList) { + this.metadataList = metadataList; + } + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/QueryApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/QueryApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..aa82904305fa1d2e8de431452384122736f7ed5b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/QueryApi.java" @@ -0,0 +1,106 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.dataset; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.data_set.DataSetOutputModel; +import com.welab.wefe.board.service.service.DataSetService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Zane + */ +@Api(path = "data_set/query", name = "query data set") +public class QueryApi extends AbstractApi> { + + @Autowired + private DataSetService dataSetService; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + return success(dataSetService.query(input)); + } + + + public static class Input extends PagingInput { + + private String id; + + @Check(name = "鏁版嵁闆嗗悕绉") + private String name; + + @Check(name = "鏍囩") + private String tag; + + @Check(name = "鏄惁鍖呭惈 Y 鍊") + private Boolean containsY; + + @Check(name = "涓婁紶鑰") + private String creator; + + //region getter/setter + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } + + public Boolean getContainsY() { + return containsY; + } + + public void setContainsY(Boolean containsY) { + this.containsY = containsY; + } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/ServerLocalFilesApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/ServerLocalFilesApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..e58a0693922f0ac347ccbe6e2b19578e9eabc428 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/ServerLocalFilesApi.java" @@ -0,0 +1,97 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.dataset; + +import com.welab.wefe.board.service.constant.Config; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiOutput; +import com.welab.wefe.common.web.dto.ApiResult; +import com.welab.wefe.common.web.dto.NoneApiInput; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Johnny.lin + */ +@Api(path = "data_set/list_local_data_set_files", name = "query the files in the specified directory on the server") +public class ServerLocalFilesApi extends AbstractApi { + + @Autowired + private Config config; + + private static final List SUPPORT_SUFFIX = new ArrayList(); + + static { + SUPPORT_SUFFIX.add("xls"); + SUPPORT_SUFFIX.add("xlsx"); + SUPPORT_SUFFIX.add("csv"); + } + + @Override + protected ApiResult handle(NoneApiInput input) throws StatusCodeWithException { + List files = new ArrayList<>(); + File file = new File(config.getFileUploadDir()); + LOG.info("file.exists(): " + file.exists()); + if (!file.exists() || !file.isDirectory()) { + throw new StatusCodeWithException(StatusCode.DIRECTORY_NOT_FOUND, config.getFileUploadDir()); + } + + File[] tempList = file.listFiles(); + for (File fileObj : tempList) { + if (fileObj.isFile()) { + LOG.info("file: " + fileObj); + + //File name, excluding path + String fileName = fileObj.getName(); + String suffix = fileName.substring(fileName.lastIndexOf(".") + 1); + + //Only XLS, xlsx, and CSV files are displayed + if (!SUPPORT_SUFFIX.contains(suffix.toLowerCase())) { + continue; + } + + files.add(fileName); + } + } + + Output output = new Output(); + output.setFiles(files); + return success(output); + } + + public static class Output extends AbstractApiOutput { + private List files; + + public List getFiles() { + return files; + } + + public void setFiles(List files) { + this.files = files; + } + + public Output() { + + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/TagListApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/TagListApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..da4a2f45d8894bffc7848ee453bb6a95c35170b7 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/TagListApi.java" @@ -0,0 +1,72 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.dataset; + +import com.welab.wefe.board.service.database.repository.DataSetRepository; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.TreeMap; + +/** + * @author Zane + */ +@Api(path = "data_set/tags", name = "all of the data set tags") +public class TagListApi extends AbstractApi> { + + @Autowired + DataSetRepository repo; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + TreeMap map = (TreeMap) CacheObjects.getDataSetTags().clone(); + + // filter + if (StringUtil.isNotEmpty(input.tag)) { + for (Object tag : map.keySet().toArray()) { + if (!String.valueOf(tag).toLowerCase().contains(input.tag)) { + map.remove(tag); + } + } + } + + return success(map); + } + + public static class Input extends AbstractApiInput { + private String tag; + + //region getter/setter + + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/UpdateApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/UpdateApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..b17a01d5a5c63d81b72c6be4d07e4c12ec750ad9 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/UpdateApi.java" @@ -0,0 +1,97 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.dataset; + +import com.welab.wefe.board.service.dto.vo.DataSetBaseInputModel; +import com.welab.wefe.board.service.service.DataSetService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author Zane + */ +@Api(path = "data_set/update", name = "update data set info") +public class UpdateApi extends AbstractNoneOutputApi { + + @Autowired + private DataSetService dataSetService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + dataSetService.update(input); + + return success(); + } + + public static class Input extends DataSetBaseInputModel { + + @Check(name = "鏁版嵁闆咺d", require = true) + private String id; + + @Check(name = "鏁版嵁闆嗗悕绉", require = true, regex = "^.{4,50}$") + private String name; + + @Check(name = "鏍囩", require = true) + private List tags; + + @Check(name = "鎻忚堪") + private String description; + + //region getter/setter + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + //endregion + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/UsageDetailApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/UsageDetailApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..db70245c2ea09097bde0a8b997673936daaa386a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/UsageDetailApi.java" @@ -0,0 +1,61 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.dataset; + +import com.welab.wefe.board.service.dto.entity.project.ProjectUsageDetailOutputModel; +import com.welab.wefe.board.service.service.DataSetService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; +import java.util.List; + +/** + * @author Jacky.jiang + */ +@Api(path = "data_set/usage_detail", name = "list usage_detail") +public class UsageDetailApi extends AbstractApi> { + @Autowired + private DataSetService dataSetService; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException, IOException { + return success(dataSetService.queryUsageInProject(input.getDataSetId())); + } + + public static class Input extends AbstractApiInput { + @Check(name = "鏁版嵁闆咺D", require = true) + private String dataSetId; + + //region getter/setter + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/column/ListApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/column/ListApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..691d9b3f6d49eee57add3bc3bb4a3df41cb7647c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/column/ListApi.java" @@ -0,0 +1,63 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.dataset.column; + +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.data_set.DataSetColumnOutputModel; +import com.welab.wefe.board.service.service.DataSetColumnService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Zane + */ +@Api(path = "data_set/column/list", name = "list of data set fields") +public class ListApi extends AbstractApi> { + + @Autowired + private DataSetColumnService service; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + return success(service.list(input.getDataSetId())); + } + + + public static class Input extends AbstractApiInput { + + @Check(require = true, name = "鏁版嵁闆咺d") + private String dataSetId; + + //region getter/setter + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-add.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-add.http" new file mode 100644 index 0000000000000000000000000000000000000000..018157743aedcee1f4486deaac5b0b19aed89ede --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-add.http" @@ -0,0 +1,195 @@ + +### 娣诲姞鏁版嵁闆-xlsx +POST {{baseUrl}}/data_set/add +Content-Type: application/json +token: ac266310-0c98-46ac-b9d0-d7d8ff9ff888 + +{ + "publicLevel": "Public", + "name": "zane test", + "tags": [ + "12321" + ], + "description": "", + "public_member_list": "", + "filename": "db359e88-99a4-4998-a7f2-8ab6bdf0d688-test-01-1600-15.xls", + "data_set_add_method": "HttpUpload", + "metadata_list": [ + { + "data_type": "Integer", + "name": "id", + "$index": 0, + "comment": "" + }, + { + "data_type": "Double", + "name": "x1", + "$index": 1, + "comment": "" + }, + { + "data_type": "Double", + "name": "x2", + "$index": 2, + "comment": "" + }, + { + "data_type": "Double", + "name": "x3", + "$index": 3, + "comment": "" + }, + { + "data_type": "Double", + "name": "x4", + "$index": 4, + "comment": "" + }, + { + "data_type": "Double", + "name": "x5", + "$index": 5, + "comment": "" + }, + { + "data_type": "Double", + "name": "x6", + "$index": 6, + "comment": "" + }, + { + "data_type": "Double", + "name": "x7", + "$index": 7, + "comment": "" + }, + { + "data_type": "Double", + "name": "x8", + "$index": 8, + "comment": "" + }, + { + "data_type": "Double", + "name": "x9", + "$index": 9, + "comment": "" + }, + { + "data_type": "Double", + "name": "x10", + "$index": 10, + "comment": "" + }, + { + "data_type": "Double", + "name": "x11", + "$index": 11, + "comment": "" + }, + { + "data_type": "Double", + "name": "x12", + "$index": 12, + "comment": "" + }, + { + "data_type": "Double", + "name": "x13", + "$index": 13, + "comment": "" + }, + { + "data_type": "Double", + "name": "x14", + "$index": 14, + "comment": "" + }, + { + "data_type": "Double", + "name": "x15", + "$index": 15, + "comment": "" + } + ], + "deduplication": true +} + + + + +### 娣诲姞鏁版嵁闆-xls +POST {{baseUrl}}/data_set/add +Content-Type: multipart/form-data; boundary=WebAppBoundary +token: {{token}} + +--WebAppBoundary +--WebAppBoundary +Content-Disposition: form-data; name="file"; filename="test02.xlsx" +Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + +< /Users/zane.luo/test02.xlsx +--WebAppBoundary +Content-Disposition: form-data; name="name" + +xlsx娴嬭瘯鏁版嵁闆 +--WebAppBoundary +Content-Disposition: form-data; name="tags" + +xlsx,test +--WebAppBoundary +Content-Disposition: form-data; name="description" + +杩欐槸涓涓祴璇曟暟鎹泦锛岀敤浜庢祴璇曟暟鎹泦涓婁紶鍔熻兘銆 +--WebAppBoundary +Content-Disposition: form-data; name="contains_y" + +false +--WebAppBoundary + +> {% + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 0, "Response code is not 0"); +}); + +%} + + + + +### 娣诲姞鏁版嵁闆-csv +POST {{baseUrl}}/data_set/add +Content-Type: multipart/form-data; boundary=WebAppBoundary + +--WebAppBoundary +Content-Disposition: form-data; name="file"; filename="鍙嶆璇埪峰弽鏌ヨ捶鍚庡瓧娈靛紑鍙戔槥鏁版嵁鏍锋湰.csv" +Content-Type: text/csv + +< /Users/Zane/Code/WeLab/Wefe/board/board-service/src/main/resources/test/data_set/data_set01.csv +--WebAppBoundary +Content-Disposition: form-data; name="name" + +xlsx娴嬭瘯鏁版嵁闆 +--WebAppBoundary +Content-Disposition: form-data; name="tags" + +xlsx,test +--WebAppBoundary +Content-Disposition: form-data; name="description" + +杩欐槸涓涓祴璇曟暟鎹泦锛岀敤浜庢祴璇曟暟鎹泦涓婁紶鍔熻兘銆 +--WebAppBoundary +Content-Disposition: form-data; name="contains_y" + +false +--WebAppBoundary + +> {% + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 0, "Response code is not 0"); +}); + +%} + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-delete.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-delete.http" new file mode 100644 index 0000000000000000000000000000000000000000..743ddcffdd83ee2ac6dfd9a4815ccffc9cb7a02e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-delete.http" @@ -0,0 +1,16 @@ + +### 鍒犻櫎鏁版嵁闆 +POST {{baseUrl}}/data_set/delete +Content-Type: application/json + +{ + "id": "a80a0056505c498d9a9be56aa06f7324" +} + +> {% + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 0, "Response code is not 0"); +}); + +%} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-detail.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-detail.http" new file mode 100644 index 0000000000000000000000000000000000000000..a5e2b33372e4284dbfbdbec258bcdf93dbf13e5f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-detail.http" @@ -0,0 +1,18 @@ + +### 鏌ヨ鍗曚釜鏁版嵁闆 +POST {{baseUrl}}/data_set/detail +Content-Type: application/json + +{ + "id": "75c2b7d8e53f4400859a8fa72a099fdf" +} + + + +### 鏌ヨ宸插垹闄ょ殑鏁版嵁闆 +POST {{baseUrl}}/data_set/detail +Content-Type: application/json + +{ + "id": "a80a0056505c498d9a9be56aa06f7324" +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-preview.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-preview.http" new file mode 100644 index 0000000000000000000000000000000000000000..3159c25d3670762fab02c174fa095c2eae5e1b2e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-preview.http" @@ -0,0 +1,10 @@ + +### 棰勮鏁版嵁闆嗘枃浠 +POST {{baseUrl}}/data_set/preview +Content-Type: application/json +token: {{token}} + +{ + "filename": "/Users/zane.luo/data/f03ec02a-ef5e-4fb5-8873-08fbc8ebabe7-horz_lr_provider.csv", + "data_set_add_method" : "LocalFile" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-query.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-query.http" new file mode 100644 index 0000000000000000000000000000000000000000..8f63da3121dd72c978899392d95f1df96cef285a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-query.http" @@ -0,0 +1,40 @@ + +### 鏌ヨ鍏ㄩ儴鏁版嵁闆 +POST {{baseUrl}}/data_set/query +Content-Type: application/json + +{} + +> {% + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 0, "Response code is not 0"); +}); + +%} + + + +### 鎸夊悕瀛楁煡 +POST {{baseUrl}}/data_set/query +Content-Type: application/json + +{ + "name": "xlsx" +} + +### 鎸 tag 鏌 +POST {{baseUrl}}/data_set/query +Content-Type: application/json + +{ + "tag": "xlsx" +} + +### 鎸夋槸鍚︽湁 Y 鍊兼煡 +POST {{baseUrl}}/data_set/query +Content-Type: application/json + +{ + "contains_y": false +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-tags.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-tags.http" new file mode 100644 index 0000000000000000000000000000000000000000..6624ab282fb73898978a1c985621097c5d29c6fe --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-tags.http" @@ -0,0 +1,15 @@ + +### 鏌ヨ鎵鏈夋爣绛 +POST {{baseUrl}}/data_set/tags +Content-Type: application/json + +{} + + +### 鏍规嵁鏍囩鍚嶇О妯$硦鏌ヨ +POST {{baseUrl}}/data_set/tags +Content-Type: application/json + +{ + "tag": "s" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-update.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-update.http" new file mode 100644 index 0000000000000000000000000000000000000000..66b033122a4b9cb10c93dccbf27e8b62978044df --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset/test/dataset-update.http" @@ -0,0 +1,20 @@ + +### 淇敼鏁版嵁闆 +POST {{baseUrl}}/data_set/update +Content-Type: application/json + +{ + "id": "1af81c309a3342b498134236a3ae9744", + "name": "Euler鍥惧涔犲紑婧愭暟鎹泦", + "tags": "鍥", + "description": "Euler鍥惧涔犲钩鍙拌嚜鐮旂畻娉曞搴旂殑寮婧愬浘鏁版嵁涓庢牱鏈暟鎹", + "contains_y": true +} + +> {% + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 0, "Response code is not 0"); +}); + +%} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset_task/DetailApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset_task/DetailApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..39c006508425ad2714b8b5b6e1a1980f506e6896 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset_task/DetailApi.java" @@ -0,0 +1,56 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.dataset_task; + +import com.welab.wefe.board.service.database.entity.data_set.DataSetTaskMysqlModel; +import com.welab.wefe.board.service.service.dataset.DataSetTaskService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author lonnie + */ +@Api(path = "data_set_task/detail", name = "get a data set upload task info") +public class DetailApi extends AbstractApi { + + @Autowired + private DataSetTaskService dataSetTaskService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + return success(dataSetTaskService.findById(input.getId())); + } + + public static class Input extends AbstractApiInput { + @Check(name = "id鍞竴鏍囪瘑", require = true) + private String id; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset_task/QueryApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset_task/QueryApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..c51aa2c4ec81dfc761e3047c6e983472c295cdf4 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset_task/QueryApi.java" @@ -0,0 +1,46 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.dataset_task; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.DataSetTaskOutputModel; +import com.welab.wefe.board.service.service.dataset.DataSetTaskService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "data_set_task/query", name = "query data set upload task list") +public class QueryApi extends AbstractApi> { + + @Autowired + private DataSetTaskService dataSetTaskService; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + return success(dataSetTaskService.query(input)); + } + + public static class Input extends PagingInput { + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset_task/test/detail.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset_task/test/detail.http" new file mode 100644 index 0000000000000000000000000000000000000000..adf6a694705b716c849986fd840894062fc0464e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dataset_task/test/detail.http" @@ -0,0 +1,7 @@ +POST {{baseUrl}}/data_set_task/detail +Content-Type: application/json +token: ac266310-0c98-46ac-b9d0-d7d8ff9ff888 + +{ + "id": "" +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/datasource/AddApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/datasource/AddApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..176a23c699681250f52f53ad21319c4fc711f56c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/datasource/AddApi.java" @@ -0,0 +1,139 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.datasource; + +import com.welab.wefe.board.service.service.DataSourceService; +import com.welab.wefe.common.enums.DatabaseType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.AbstractApiOutput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Johnny.lin + */ +@Api(path = "data_source/add", name = "add a data source") +public class AddApi extends AbstractApi { + @Autowired + DataSourceService dataSourceService; + + @Override + protected ApiResult handle(DataSourceAddInput input) throws StatusCodeWithException { + return success(dataSourceService.add(input)); + } + + public static class DataSourceAddInput extends AbstractApiInput { + + @Check(name = "鏁版嵁婧愬悕绉", require = true, regex = "^.{4,30}$", messageOnInvalid = "鏁版嵁婧愬悕绉伴暱搴︿笉鑳藉皯浜4锛屼笉鑳藉ぇ浜30", messageOnEmpty = "鏁版嵁婧愬悕绉颁笉鑳戒负绌") + private String name; + + @Check(messageOnEmpty = "鏁版嵁搴撶被鍨嬩笉鑳戒负绌", require = true) + private DatabaseType databaseType; + + @Check(messageOnEmpty = "IP涓嶈兘涓虹┖", require = true) + private String host; + + @Check(messageOnEmpty = "绔彛涓嶈兘涓虹┖", require = true) + private Integer port; + + @Check(messageOnEmpty = "鏁版嵁搴撳悕绉颁笉鑳戒负绌", require = true) + private String databaseName; + + @Check(name = "鐢ㄦ埛鍚") + private String userName; + + @Check(name = "瀵嗙爜") + private String password; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public DatabaseType getDatabaseType() { + return databaseType; + } + + public void setDatabaseType(DatabaseType databaseType) { + this.databaseType = databaseType; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public Integer getPort() { + return port; + } + + public void setPort(Integer port) { + this.port = port; + } + + public String getDatabaseName() { + return databaseName; + } + + public void setDatabaseName(String databaseName) { + this.databaseName = databaseName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + } + + public static class DataSourceAddOutput extends AbstractApiOutput { + private String id; + + public DataSourceAddOutput() { + + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/datasource/DeleteApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/datasource/DeleteApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..7551449d39d770c0f935c41272f0091a96a137d2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/datasource/DeleteApi.java" @@ -0,0 +1,55 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.datasource; + +import com.welab.wefe.board.service.service.DataSourceService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Johnny.lin + */ +@Api(path = "data_source/delete", name = "delete a data source") +public class DeleteApi extends AbstractNoneOutputApi { + + @Autowired + DataSourceService dataSourceService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + dataSourceService.delete(input); + return success(); + } + + public static class Input extends AbstractApiInput { + @Check(name = "鏁版嵁婧恑d", require = true) + private String id; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/datasource/QueryApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/datasource/QueryApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..2a499b1dcac4abdc517fc6804cc5bd506a6dbd18 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/datasource/QueryApi.java" @@ -0,0 +1,129 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.datasource; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.service.DataSourceService; +import com.welab.wefe.common.enums.DatabaseType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiOutput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Johnny.lin + */ +@Api(path = "data_source/query", name = "query data source by pagination") +public class QueryApi extends AbstractApi> { + + @Autowired + DataSourceService dataSourceService; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + return success(dataSourceService.query(input)); + } + + public static class Input extends PagingInput { + @Check(name = "鏁版嵁婧愬悕绉") + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } + + public static class Output extends AbstractApiOutput { + private String id; + + private String name; + + private DatabaseType databaseType; + + private String host; + + private Integer port; + + private String databaseName; + + private String userName; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public DatabaseType getDatabaseType() { + return databaseType; + } + + public void setDatabaseType(DatabaseType databaseType) { + this.databaseType = databaseType; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public Integer getPort() { + return port; + } + + public void setPort(Integer port) { + this.port = port; + } + + public String getDatabaseName() { + return databaseName; + } + + public void setDatabaseName(String databaseName) { + this.databaseName = databaseName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/datasource/TestDBConnectApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/datasource/TestDBConnectApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..9ef802f1f1af1018fdb42eb960fa36e6845ec30a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/datasource/TestDBConnectApi.java" @@ -0,0 +1,60 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.datasource; + +import com.welab.wefe.board.service.service.DataSourceService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiOutput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Johnny.lin + */ +@Api(path = "data_source/test_db_connect", name = "test whether the database can be connected normally") +public class TestDBConnectApi extends AbstractApi { + + @Autowired + DataSourceService dataSourceService; + + @Override + protected ApiResult handle(AddApi.DataSourceAddInput input) throws StatusCodeWithException { + return success(dataSourceService.testdbconnect(input)); + } + + public static class Output extends AbstractApiOutput { + private Boolean result; + + public Output() { + + } + + public Output(Boolean result) { + this.result = result; + } + + public Boolean getResult() { + return result; + } + + public void setResult(Boolean result) { + this.result = result; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dev/CreateTestDataSetApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dev/CreateTestDataSetApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..cbe5811d13f6dffa65213159214c294a484f6b38 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dev/CreateTestDataSetApi.java" @@ -0,0 +1,223 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.dev; + +import com.welab.wefe.board.service.constant.Config; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.apache.commons.io.FileUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.text.NumberFormat; +import java.util.Random; + +/** + * @author Zane + */ +@Api(path = "test/create_data_set", name = "generate data set for testing", login = false) +public class CreateTestDataSetApi extends AbstractApi { + + private final Random random = new Random(); + private static final String[] PHONE_NUMBER_PREFIX = {"139", "138", "137", "136", "135", "134", "159", "158", "157", "150", "151", "152", "188", "187", "182", "183", "184", "178", "130", "131", "132", "156", "155", "186", "185", "176", "133", "153", "189", "180", "181", "177"}; + + @Autowired + private Config config; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + + try { + String file = createCsv(input); + return success(new Output(file)); + + } catch (IOException e) { + throw new StatusCodeWithException(e.getMessage(), StatusCode.SYSTEM_ERROR); + } + + + } + + private String createCsv(Input input) throws IOException { + String fileName = config.getFileUploadDir() + "/" + + input.idType + "-" + + input.features + "-" + + input.rows + + (input.hasY ? "-y" : "") + + ".csv"; + + File file = new File(fileName); + + if (file.exists()) { + FileUtils.deleteQuietly(file); + } + + FileOutputStream fileOutputStream = FileUtils.openOutputStream(file, true); + + // Count the number of columns + int columns = input.hasY ? input.features + 2 : input.features + 1; + + // Generate column headers + String[] header = new String[columns]; + header[0] = "id"; + if (input.hasY) { + header[1] = "y"; + } + + if (input.features > 0) { + for (int i = input.hasY ? 2 : 1; i < columns; i++) { + header[i] = "x" + (input.hasY ? i - 1 : i); + } + } + + String title = StringUtil.join(header, ",") + System.lineSeparator(); + fileOutputStream.write(title.getBytes()); + + NumberFormat format = NumberFormat.getInstance(); + format.setMaximumFractionDigits(3); + + // Generate data rows + for (int i = 0; i < input.rows; i++) { + String[] row = new String[columns]; + + row[0] = createId(i, input.idType); + for (int c = 1; c < columns; c++) { + + if (input.hasY && c == 1) { + row[c] = random.nextBoolean() ? "1" : "0"; + } else if (input.features > 0) { + row[c] = format.format(random.nextDouble()); + } + + } + + String line = StringUtil.join(row, ",") + System.lineSeparator(); + fileOutputStream.write(line.getBytes()); + + if (i % 10000 == 0) { + System.out.println(i); + } + } + + fileOutputStream.close(); + + return file.getAbsolutePath(); + } + + private String createId(int index, String idType) { + switch (idType) { + case "auto_increment": + return index + ""; + case "cnid": + return createCnid(); + case "phone_number": + return createPhoneNumber(); + default: + return ""; + } + } + + private String createCnid() { + StringBuilder str = new StringBuilder(18); + for (int i = 0; i < 18; i++) { + str.append(random.nextInt(9)); + } + return str.toString(); + } + + private String createPhoneNumber() { + int index = random.nextInt(PHONE_NUMBER_PREFIX.length); + StringBuilder str = new StringBuilder(11); + str.append(PHONE_NUMBER_PREFIX[index]); + for (int i = 0; i < 8; i++) { + str.append(random.nextInt(9)); + } + return str.toString(); + } + + public static class Input extends AbstractApiInput { + @Check(name = "鐗瑰緛鏁") + private int features; + @Check(name = "鏁版嵁琛屾暟") + private int rows; + @Check(name = "鏄惁鍖呭惈 y 鍒") + private boolean hasY; + @Check(name = "id 绫诲瀷", regex = "^(auto_increment)|(cnid)|(phone_number)$") + private String idType = "auto_increment"; + + //region getter/setter + + public int getFeatures() { + return features; + } + + public void setFeatures(int features) { + this.features = features; + } + + public int getRows() { + return rows; + } + + public void setRows(int rows) { + this.rows = rows; + } + + public boolean isHasY() { + return hasY; + } + + public void setHasY(boolean hasY) { + this.hasY = hasY; + } + + public String getIdType() { + return idType; + } + + public void setIdType(String idType) { + this.idType = idType; + } + + + //endregion + } + + public static class Output { + private String file; + + public Output(String file) { + this.file = file; + } + + public String getFile() { + return file; + } + + public void setFile(String file) { + this.file = file; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dev/test/create_data_set.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dev/test/create_data_set.http" new file mode 100644 index 0000000000000000000000000000000000000000..e24e5640ddb9846c1421c60ab1d886a2b68af280 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/dev/test/create_data_set.http" @@ -0,0 +1,47 @@ +### 鐢熸垚鎸囧畾澶у皬鐨勬暟鎹泦渚涙祴璇曚娇鐢 +POST {{baseUrl}}/test/create_data_set +Content-Type: application/json + +{ + "features": 30, + "rows": 1000000, + "has_y": true, + "id_type": "auto_increment" +} + + +### + +POST {{baseUrl}}/test/create_data_set +Content-Type: application/json + +{ + "features": 1, + "rows": 100, + "has_y": false, + "id_type": "cnid" +} + +### + + +POST {{baseUrl}}/test/create_data_set +Content-Type: application/json + +{ + "features": 0, + "rows": 100, + "has_y": true, + "id_type": "phone_number" +} + +### +POST {{baseUrl}}/test/create_data_set +Content-Type: application/json + +{ + "features": 5000, + "rows": 300000, + "has_y": true, + "id_type": "auto_increment" +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/file/MergeApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/file/MergeApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..1a69ce0c1e110a63f503bec2c7569bd3e5c9a6a3 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/file/MergeApi.java" @@ -0,0 +1,118 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.file; + +import com.welab.wefe.board.service.api.file.security.FileSecurityChecker; +import com.welab.wefe.board.service.constant.Config; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.apache.commons.io.FileUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.UUID; + +/** + * @author zane.luo + */ +@Api(path = "file/merge", name = "Merge the chunks after the file is uploaded") +public class MergeApi extends AbstractApi { + + @Autowired + private Config config; + + @Override + protected ApiResult handle(Input input) throws Exception { + + String mergedFileName = UUID.randomUUID() + "-" + input.filename; + + File dir = new File(config.getFileUploadDir() + File.separator + input.uniqueIdentifier); + + File[] parts = dir.listFiles(); + + File mergedFile = new File(config.getFileUploadDir() + File.separator + mergedFileName); + + if (mergedFile.exists()) { + return success(new Output(mergedFileName)); + } + + try { + for (int i = 1; i <= parts.length; i++) { + File part = new File(config.getFileUploadDir() + File.separator + input.uniqueIdentifier, i + ".part"); + + // append chunk to the target file + FileOutputStream stream = new FileOutputStream(mergedFile, true); + FileUtils.copyFile(part, stream); + stream.close(); + } + + // delete chunk + FileUtils.deleteDirectory(dir); + } catch (IOException e) { + throw new StatusCodeWithException(e.getMessage(), StatusCode.SYSTEM_ERROR); + } + + // 妫鏌ヤ笂浼犵殑鏂囦欢鏄惁瀹夊叏 + FileSecurityChecker.check(mergedFile); + + return success(new Output(mergedFileName)); + + } + + public static class Output { + private String filename; + + public Output(String filename) { + this.filename = filename; + } + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + } + + public static class Input extends AbstractApiInput { + private String filename; + private String uniqueIdentifier; + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + public String getUniqueIdentifier() { + return uniqueIdentifier; + } + + public void setUniqueIdentifier(String uniqueIdentifier) { + this.uniqueIdentifier = uniqueIdentifier; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/file/UploadApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/file/UploadApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..e915f4405aed4936723ee1632a25cd265954849e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/file/UploadApi.java" @@ -0,0 +1,231 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.file; + +import com.welab.wefe.board.service.constant.Config; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.FileUtil; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractWithFilesApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.apache.commons.io.FileUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * The front end uses the simple-uploader component + * doc锛歨ttps://github.com/simple-uploader/Uploader/blob/develop/README_zh-CN.md#%E5%A4%84%E7%90%86-get-%E6%88%96%E8%80%85-test-%E8%AF%B7%E6%B1%82 + * + * @author zane.luo + */ +@Api(path = "file/upload", name = "upload file") +public class UploadApi extends AbstractApi { + + @Autowired + private Config config; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + switch (input.method) { + case "POST": + return saveChunk(input); + + case "GET": + return checkChunk(input); + + default: + throw new StatusCodeWithException(StatusCode.UNEXPECTED_ENUM_CASE); + } + + + } + + /** + * Check if the chunk already exists + */ + private ApiResult checkChunk(Input input) { + Integer chunkNumber = input.getChunkNumber(); + if (chunkNumber == null) { + chunkNumber = 0; + } + + File outFile = new File(config.getFileUploadDir() + File.separator + input.getIdentifier(), chunkNumber + ".part"); + if (outFile.exists()) { + return success() + .setMessage("璇ュ垎鐗囧凡瀛樺湪"); + } else { + return success() + .setHttpCode(299) + .setMessage("璇ュ垎鐗囦笉瀛樺湪"); + } + } + + /** + * save chunk + */ + private ApiResult saveChunk(Input input) throws StatusCodeWithException { + MultipartFile file = input.getFirstFile(); + + Integer chunkNumber = input.getChunkNumber(); + if (chunkNumber == null) { + chunkNumber = 0; + } + + File outFile = new File(config.getFileUploadDir() + File.separator + input.getIdentifier(), chunkNumber + ".part"); + + try { + InputStream inputStream = file.getInputStream(); + FileUtils.copyInputStreamToFile(inputStream, outFile); + } catch (IOException e) { + throw new StatusCodeWithException(e.getMessage(), StatusCode.SYSTEM_ERROR); + } + + return success(new Output(file.getSize())); + } + + public static class Output { + private long length; + + public Output(long length) { + this.length = length; + } + + public long getLength() { + return length; + } + + public void setLength(long length) { + this.length = length; + } + } + + public static class Input extends AbstractWithFilesApiInput { + private Long id; + @Check(name = "褰撳墠鏂囦欢鍧楋紝浠1寮濮") + private Integer chunkNumber; + @Check(name = "鍒嗗潡澶у皬") + private Long chunkSize; + @Check(name = "褰撳墠鍒嗗潡澶у皬") + private Long currentChunkSize; + @Check(name = "鎬诲ぇ灏") + private Long totalSize; + @Check(name = "鏂囦欢鏍囪瘑") + private String identifier; + @Check(name = "鏂囦欢鍚") + private String filename; + @Check(name = "鐩稿璺緞") + private String relativePath; + @Check(name = "鎬诲潡鏁") + private Integer totalChunks; + @Check(name = "鏂囦欢绫诲瀷") + private String type; + + //region getter/setter + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getChunkNumber() { + return chunkNumber; + } + + public void setChunkNumber(Integer chunkNumber) { + this.chunkNumber = chunkNumber; + } + + public Long getChunkSize() { + return chunkSize; + } + + public void setChunkSize(Long chunkSize) { + this.chunkSize = chunkSize; + } + + public Long getCurrentChunkSize() { + return currentChunkSize; + } + + public void setCurrentChunkSize(Long currentChunkSize) { + this.currentChunkSize = currentChunkSize; + } + + public Long getTotalSize() { + return totalSize; + } + + public void setTotalSize(Long totalSize) { + this.totalSize = totalSize; + } + + public String getIdentifier() { + return identifier; + } + + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + public String getRelativePath() { + return relativePath; + } + + public void setRelativePath(String relativePath) { + this.relativePath = relativePath; + } + + public Integer getTotalChunks() { + return totalChunks; + } + + public void setTotalChunks(Integer totalChunks) { + this.totalChunks = totalChunks; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/file/security/CsvSecurityChecker.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/file/security/CsvSecurityChecker.java" new file mode 100644 index 0000000000000000000000000000000000000000..197fac1256837b15f408e48e70b5fb5f90c32e4e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/file/security/CsvSecurityChecker.java" @@ -0,0 +1,54 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ +package com.welab.wefe.board.service.api.file.security; + +import de.siegmar.fastcsv.reader.CsvParser; +import de.siegmar.fastcsv.reader.CsvReader; +import de.siegmar.fastcsv.reader.CsvRow; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +/** + * @author zane + * @date 2021/12/31 + */ +public class CsvSecurityChecker extends FileSecurityChecker { + @Override + protected void doCheck(File file) throws IOException { + CsvReader reader = new CsvReader(); + reader.setContainsHeader(false); + reader.setSkipEmptyRows(true); + CsvParser parser = reader.parse(file, StandardCharsets.UTF_8); + + while (true) { + CsvRow row = parser.nextRow(); + + if (row == null) { + break; + } + + for (String str : row.getFields()) { + for (String key : keywords) { + if (str.contains(key)) { + throw new IOException("鏂囦欢鍖呭惈涓嶅畨鍏ㄧ殑瀛楃锛" + key); + } + } + } + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/file/security/ExcelSecurityChecker.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/file/security/ExcelSecurityChecker.java" new file mode 100644 index 0000000000000000000000000000000000000000..bf025e8f6e2dbdf05fb20d84c6097fc3fdd3ad56 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/file/security/ExcelSecurityChecker.java" @@ -0,0 +1,52 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ +package com.welab.wefe.board.service.api.file.security; + +import com.welab.wefe.common.io.excel.ExcelReader; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +/** + * @author zane + * @date 2021/12/31 + */ +public class ExcelSecurityChecker extends FileSecurityChecker { + + @Override + protected void doCheck(File file) throws IOException { + ExcelReader reader = new ExcelReader(file); + + if (reader.getSheetCount() == 0) { + return; + } + + long totalRowCount = reader.getRowCount(0); + for (int i = 0; i < totalRowCount; i++) { + List row = reader.getRowData(0, i); + for (Object item : row) { + String str = String.valueOf(item); + for (String key : keywords) { + if (str.contains(key)) { + throw new IOException("鏂囦欢鍖呭惈涓嶅畨鍏ㄧ殑瀛楃锛" + key); + } + } + } + } + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/file/security/FileSecurityChecker.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/file/security/FileSecurityChecker.java" new file mode 100644 index 0000000000000000000000000000000000000000..36714e3e4d43c3fc3f5b6b876b966b3aaf1de9bb --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/file/security/FileSecurityChecker.java" @@ -0,0 +1,60 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ +package com.welab.wefe.board.service.api.file.security; + +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.util.FileUtil; +import com.welab.wefe.common.util.StringUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; + +/** + * @author zane + * @date 2021/12/31 + */ +public abstract class FileSecurityChecker { + protected final static Logger LOG = LoggerFactory.getLogger(FileSecurityChecker.class); + protected static final String[] keywords = {"<", ">", "\\"}; + + protected abstract void doCheck(File file) throws IOException; + + public static void check(File file) throws Exception { + // 涓烘鏌ヤ笂浼犵殑鏂囦欢鏄惁瀹夊叏 + String suffix = StringUtil.substringAfterLast(file.getName(), "."); + + try { + switch (suffix) { + case "xls": + case "xlsx": + new ExcelSecurityChecker().doCheck(file); + break; + case "csv": + new CsvSecurityChecker().doCheck(file); + break; + default: + StatusCode.PARAMETER_VALUE_INVALID.throwException("涓嶆敮鎸佺殑鏂囦欢绫诲瀷锛" + suffix); + } + + } catch (Exception e) { + LOG.error(e.getMessage(), e); + FileUtil.deleteFile(file); + throw e; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/GetDerivedDataSetDetailApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/GetDerivedDataSetDetailApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..74e48347c122809eeb4e79642fd93d3b75b86020 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/GetDerivedDataSetDetailApi.java" @@ -0,0 +1,92 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.gateway; + +import com.welab.wefe.board.service.dto.entity.project.DerivedProjectDataSetOutputModel; +import com.welab.wefe.board.service.service.ProjectDataSetService; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "gateway/derived_data_set/detail", name = "get a list of derived data sets in the project", rsaVerify = true, login = false) +public class GetDerivedDataSetDetailApi extends AbstractApi { + + @Autowired + private ProjectDataSetService projectDataSetService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + DerivedProjectDataSetOutputModel output = projectDataSetService.getDerivedDataSetDetail(input); + return success(output); + } + + public static class Input extends AbstractApiInput { + @Check(name = "椤圭洰Id", require = true) + private String projectId; + @Check(name = "鏁版嵁闆咺d", require = true) + private String dataSetId; + @Check(name = "鎴愬憳瑙掕壊Id", require = true) + private JobMemberRole memberRole; + + public Input() { + } + + public Input(String projectId, String dataSetId, JobMemberRole memberRole) { + this.projectId = projectId; + this.dataSetId = dataSetId; + this.memberRole = memberRole; + } + + //region getter/setter + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + + //endregion + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/GetMemberJobProgressApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/GetMemberJobProgressApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..8d6f1679c2582f575b0adaad8dad90e0825a84a2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/GetMemberJobProgressApi.java" @@ -0,0 +1,84 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.gateway; + +import com.welab.wefe.board.service.dto.vo.JobProgressOutput; +import com.welab.wefe.board.service.service.FlowJobService; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "gateway/get_job_progress", name = "get job progress", login = false, rsaVerify = true) +public class GetMemberJobProgressApi extends AbstractApi { + + @Autowired + private FlowJobService flowJobService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + JobProgressOutput progress = flowJobService.getProgress(input.jobId, input.memberRole); + + return success(progress); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "浠诲姟ID", require = true) + private String jobId; + + @Check(name = "瑙掕壊", require = true) + private JobMemberRole memberRole; + + public Input() { + } + + public Input(String jobId, JobMemberRole memberRole) { + this.jobId = jobId; + this.memberRole = memberRole; + } + + //region getter/setter + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + + //endregion + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/RedirectApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/RedirectApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..02d34e36703f36e63bf0d5b4afb346f38c0a841f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/RedirectApi.java" @@ -0,0 +1,105 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.gateway; + +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.Launcher; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import com.welab.wefe.common.web.dto.GatewayMemberInfo; + +import java.util.Map; + +/** + * @author zane.luo + */ +@Api(path = "gateway/redirect", name = "Redirect requests from gateway to internal api", login = false, rsaVerify = true) +public class RedirectApi extends AbstractApi { + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + + AbstractApi api = Launcher.CONTEXT.getBean(input.api, AbstractApi.class); + + // join the requester's member information in the input + input.data.put( + "callerMemberInfo", + new GatewayMemberInfo(input.callerMemberId, input.callerMemberName, input.callerMemberRole) + ); + + return api.execute("gateway", JObject.create(input.data)); + + } + + public static class Input extends AbstractApiInput { + private String callerMemberId; + private String callerMemberName; + private JobMemberRole callerMemberRole; + private String api; + private Map data; + + //region getter/setter + + public String getCallerMemberId() { + return callerMemberId; + } + + public void setCallerMemberId(String callerMemberId) { + this.callerMemberId = callerMemberId; + } + + public String getCallerMemberName() { + return callerMemberName; + } + + public void setCallerMemberName(String callerMemberName) { + this.callerMemberName = callerMemberName; + } + + public JobMemberRole getCallerMemberRole() { + return callerMemberRole; + } + + public void setCallerMemberRole(JobMemberRole callerMemberRole) { + this.callerMemberRole = callerMemberRole; + } + + public String getApi() { + return api; + } + + public void setApi(String api) { + this.api = api; + } + + public Map getData() { + return data; + } + + public void setData(Map data) { + this.data = data; + } + + + //endregion + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/TestConnectApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/TestConnectApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..49001621482b39adfb7c0bf977641fb4304f2b19 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/TestConnectApi.java" @@ -0,0 +1,52 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.gateway; + +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; + +/** + * Check the connectivity interface between the gateway and the board + * + * @author aaron.li + **/ +@Api(path = "gateway/test_route_connect", name = "Check the connectivity interface between the gateway and the board", desc = "Check the connectivity interface between the gateway and the board") +public class TestConnectApi extends AbstractNoneOutputApi { + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + return success(); + } + + public static class Input extends AbstractApiInput { + @Check(name = "Member ID of the checked network connectivity") + private String memberId; + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/test/RedirectApiTester.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/test/RedirectApiTester.java" new file mode 100644 index 0000000000000000000000000000000000000000..a2da00463392d9620fb5b9163bb43860eb42db21 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/test/RedirectApiTester.java" @@ -0,0 +1,70 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.gateway.test; + +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.board.service.service.GatewayService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "gateway/test/redirect", name = "鑷繁缁欒嚜宸卞彂娑堟伅锛岀敤鏉ユ祴璇", login = false) +public class RedirectApiTester extends AbstractApi { + + @Autowired + private GatewayService gatewayService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + Class api = null; + try { + api = Class.forName(input.api); + } catch (ClassNotFoundException e) { + throw new StatusCodeWithException("api class error:" + input.api, StatusCode.PARAMETER_VALUE_INVALID); + } + + ApiResult result = gatewayService.sendToBoardRedirectApi( + CacheObjects.getMemberId(), + input.memberRole, + input.data, + api + ); + return success(new Output(result.success())); + } + + public static class Output { + public boolean success; + + public Output(boolean success) { + this.success = success; + } + } + + public static class Input extends AbstractApiInput { + public Object data; + public JobMemberRole memberRole; + public String api; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/test/get-progress.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/test/get-progress.http" new file mode 100644 index 0000000000000000000000000000000000000000..e5a1f9b51fb7c5711ba7ddf28389ae723f7e4b60 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/test/get-progress.http" @@ -0,0 +1,6 @@ +POST {{baseUrl}}/gateway/get_job_progress +Content-Type: application/json + +{ + "jobId": "bcdeb5ebdbe24ec4bc6052de6678581d" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/test/redirect.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/test/redirect.http" new file mode 100644 index 0000000000000000000000000000000000000000..a1cd102426d7beab07eccda2c05aa85167dd28a0 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/test/redirect.http" @@ -0,0 +1,15 @@ +POST {{baseUrl}}/gateway/redirect +Content-Type: application/json + +{ + "caller_member_role": "provider", + "data": { + "method": "POST", + "project_id": "32065c74a125478581b9cd8fa980055a", + "data_set_id": "f2088c1f8cf04530872b5490b65064e5", + "status": "agree" + }, + "caller_member_name": "寮熶緷鍋庨浂鍥", + "api": "project/data_set/audit", + "caller_member_id": "682d087e965a4c5d8a2807a772a571c1" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/test/redirect_tester.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/test/redirect_tester.http" new file mode 100644 index 0000000000000000000000000000000000000000..93756af89c744f668693b6a4c851a8610b9a76cf --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/gateway/test/redirect_tester.http" @@ -0,0 +1,10 @@ +POST {{baseUrl}}/gateway/test/redirect +Content-Type: application/json + +{ + "api": "com.welab.wefe.board.service.api.project.job.GetLocalMemberJobProgressApi", + "memberRole": "promoter", + "data": { + "job_id": "bcdeb5ebdbe24ec4bc6052de6678581d" + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/global_config/GetGlobalConfigApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/global_config/GetGlobalConfigApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..e76bee00ece5a7257447050c2b32ffbbe6e36a26 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/global_config/GetGlobalConfigApi.java" @@ -0,0 +1,63 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.global_config; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.database.entity.GlobalConfigMySqlModel; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author zane + */ +@Api(path = "global_config/get", name = "get system global configs") +public class GetGlobalConfigApi extends AbstractApi> { + + @Autowired + private GlobalConfigService globalConfigService; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + + Map output = new HashMap<>(); + + for (String group : input.groups) { + List list = globalConfigService.list(group); + JSONObject json = new JSONObject(); + list.forEach(x -> json.put(x.getName(), x.getValue())); + output.put(group, json); + } + + return success(output); + } + + public static class Input extends AbstractApiInput { + @Check(name = "閰嶇疆椤圭殑缁勫悕", require = true) + public List groups; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/global_config/GlobalConfigUpdateApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/global_config/GlobalConfigUpdateApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..550138e539319f9eec56ba0369485f0887e46b92 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/global_config/GlobalConfigUpdateApi.java" @@ -0,0 +1,47 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.global_config; + +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Map; + +/** + * @author lonnie + */ +@Api(path = "global_config/update", name = "update system global configs") +public class GlobalConfigUpdateApi extends AbstractNoneOutputApi { + + @Autowired + private GlobalConfigService globalConfigService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + globalConfigService.update(input); + return success(); + } + + public static class Input extends AbstractApiInput { + public Map> groups; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/CheckMemberRouteConnectApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/CheckMemberRouteConnectApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..32c68faa47145b651fb2b0c40ca05ca32d5cb508 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/CheckMemberRouteConnectApi.java" @@ -0,0 +1,57 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.member; + +import com.welab.wefe.board.service.service.GatewayService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Check route connect of member gateway + * + * @author aaron.li + **/ +@Api(path = "member/check_route_connect", name = "Check route connect of member gateway", desc = "Check route connect of member gateway") +public class CheckMemberRouteConnectApi extends AbstractNoneOutputApi { + @Autowired + private GatewayService gatewayService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + gatewayService.pingGatewayAlive(input.memberGatewayUri); + return success(); + } + + + public static class Input extends AbstractApiInput { + @Check(name = "Gateway IP:PORT. If the value is not empty, it means to directly test its own gateway alive") + private String memberGatewayUri; + + public String getMemberGatewayUri() { + return memberGatewayUri; + } + + public void setMemberGatewayUri(String memberGatewayUri) { + this.memberGatewayUri = memberGatewayUri; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/InitializeApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/InitializeApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..88eedf42a577e3eefda6cb10d4c66291b91b81ec --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/InitializeApi.java" @@ -0,0 +1,106 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.member; + +import com.welab.wefe.board.service.service.SystemInitializeService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.StandardFieldType; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Zane + */ +@Api(path = "member/initialize", name = "initialize system") +public class InitializeApi extends AbstractNoneOutputApi { + + @Autowired + private SystemInitializeService systemInitializeService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + systemInitializeService.initialize(input); + return success(); + } + + + public static class Input extends AbstractApiInput { + @Check( + name = "鑱旈偊鎴愬憳鍚嶇О", + require = true, + messageOnEmpty = "璇疯緭鍏ユ垚鍛樺悕绉", + regex = "^[\\u4e00-\\u9fa5锛堬級0-9a-zA-Z ]{3,12}$", + messageOnInvalid = "鎴愬憳鍚嶇О浠呮敮鎸佷腑鏂囥佽嫳鏂囦笌鏁板瓧锛屼笖闀垮害涓 3 - 12銆" + ) + private String memberName; + + @Check(name = "閭", type = StandardFieldType.Email) + private String memberEmail; + + @Check( + name = "鐢佃瘽", + regex = "[0-9\\-\\+]{6,18}", + messageOnInvalid = "璇疯緭鍏ユ纭殑鑱旂郴鐢佃瘽" + ) + private String memberMobile; + + @Check(name = "鏄惁鍏佽瀵瑰鍏紑鏁版嵁闆嗗熀纭淇℃伅", require = true) + private Boolean memberAllowPublicDataSet; + + //region getter/setter + + public String getMemberName() { + return memberName; + } + + public void setMemberName(String memberName) { + this.memberName = memberName; + } + + public String getMemberEmail() { + return memberEmail; + } + + public void setMemberEmail(String memberEmail) { + this.memberEmail = memberEmail; + } + + public String getMemberMobile() { + return memberMobile; + } + + public void setMemberMobile(String memberMobile) { + this.memberMobile = memberMobile; + } + + public Boolean getMemberAllowPublicDataSet() { + return memberAllowPublicDataSet; + } + + public void setMemberAllowPublicDataSet(Boolean memberAllowPublicDataSet) { + this.memberAllowPublicDataSet = memberAllowPublicDataSet; + } + + //endregion + } + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/IsInitializedApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/IsInitializedApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..e2dc74dd6e62b1a6bab07f5161fb381b75f08e49 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/IsInitializedApi.java" @@ -0,0 +1,66 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.member; + +import com.welab.wefe.board.service.service.SystemInitializeService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractNoneInputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiOutput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Zane + */ +@Api( + path = "member/is_initialized", + name = "is the system initialized", + desc = "The system cannot access any functional modules before initialization" +) +public class IsInitializedApi extends AbstractNoneInputApi { + + @Autowired + private SystemInitializeService systemInitializeService; + + @Override + protected ApiResult handle() throws StatusCodeWithException { + + return success(new Output(systemInitializeService.isInitialized())); + } + + public static class Output extends AbstractApiOutput { + private boolean initialized; + + public Output(boolean initialized) { + this.initialized = initialized; + } + + //region getter/setter + + public boolean isInitialized() { + return initialized; + } + + public void setInitialized(boolean initialized) { + this.initialized = initialized; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/MemberDetailApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/MemberDetailApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..fef630a3bf1790dadbcbb71f39645453e0b0bb57 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/MemberDetailApi.java" @@ -0,0 +1,42 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.member; + +import com.welab.wefe.board.service.dto.globalconfig.MemberInfoModel; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractNoneInputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Zane + */ +@Api(path = "member/detail", name = "get Member detail") +public class MemberDetailApi extends AbstractNoneInputApi { + + @Autowired + private GlobalConfigService globalConfigService; + + @Override + protected ApiResult handle() throws StatusCodeWithException { + MemberInfoModel output = globalConfigService.getMemberInfo(); + output.setRsaPrivateKey(null); + return success(output); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/ResetRsaKeyApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/ResetRsaKeyApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..5fa3e304be3f164717e9f6855ba0cd55b2d4296e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/ResetRsaKeyApi.java" @@ -0,0 +1,41 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.member; + +import com.welab.wefe.board.service.service.SystemInitializeService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractNoneInputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author hunter.zhao + */ +@Api(path = "member/reset_rsa_key", name = "reset rsa key pair") +public class ResetRsaKeyApi extends AbstractNoneInputApi { + @Autowired + private SystemInitializeService systemInitializeService; + + @Override + protected ApiResult handle() throws StatusCodeWithException { + + systemInitializeService.updateMemberRsaKey(); + return success(); + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/ServiceStatusCheckApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/ServiceStatusCheckApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..17779e9d80638e9ce78acacbe22bb9ee47ce28c2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/ServiceStatusCheckApi.java" @@ -0,0 +1,113 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.member; + +import com.welab.wefe.board.service.dto.vo.MemberServiceStatusOutput; +import com.welab.wefe.board.service.service.ServiceCheckService; +import com.welab.wefe.common.enums.MemberService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Map; + +/** + * @author lonnie + */ +@Api(path = "/member/service_status_check", name = "Check whether the member鈥檚 system services are normal", login = false) +public class ServiceStatusCheckApi extends AbstractApi { + + @Autowired + private ServiceCheckService serviceCheckService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + + Output output = serviceCheckService.checkMemberServiceStatus(input); + + return success(output); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "鎴愬憳id", require = true) + private String memberId; + + private MemberService service; + + public Input() { + } + + public Input(String memberId) { + this.memberId = memberId; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public MemberService getService() { + return service; + } + + public void setService(MemberService service) { + this.service = service; + } + } + + public static class Output { + private boolean allStatusIsSuccess; + private Map status; + + public Output() { + } + + public Output(Map status) { + this.allStatusIsSuccess = status + .values() + .stream() + .allMatch(x -> x.isSuccess()); + + this.status = status; + } + + + public boolean isAllStatusIsSuccess() { + return allStatusIsSuccess; + } + + public void setAllStatusIsSuccess(boolean allStatusIsSuccess) { + this.allStatusIsSuccess = allStatusIsSuccess; + } + + public Map getStatus() { + return status; + } + + public void setStatus(Map status) { + this.status = status; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/SyncMemberToUnionApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/SyncMemberToUnionApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..4ce017a673818efff85e283e89a935c9037ac6ef --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/SyncMemberToUnionApi.java" @@ -0,0 +1,44 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.member; + +import com.welab.wefe.board.service.service.SystemInitializeService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractNoneInputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Zane + */ +@Api( + path = "member/sync_to_union", + name = "Synchronize member information to union", + desc = "Used for membership recovery after union data loss" +) +public class SyncMemberToUnionApi extends AbstractNoneInputApi { + + @Autowired + private SystemInitializeService systemInitializeService; + + @Override + protected ApiResult handle() throws StatusCodeWithException { + systemInitializeService.syncMemberToUnion(); + return success(); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/UpdateMemberInfoApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/UpdateMemberInfoApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..5e67095ff146f66cfc900d1fe31a091e17051a59 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/UpdateMemberInfoApi.java" @@ -0,0 +1,106 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.member; + +import com.welab.wefe.board.service.service.SystemInitializeService; +import com.welab.wefe.common.Convert; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Zane + */ +@Api(path = "member/update", name = "update member info") +public class UpdateMemberInfoApi extends AbstractNoneOutputApi { + + @Autowired + private SystemInitializeService systemInitializeService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + systemInitializeService.updateMemberInfo(input); + return success(); + } + + + public static class Input extends InitializeApi.Input { + + @Check( + name = "鎴愬憳logo", + blockReactionaryKeyword = false, + blockSqlInjection = false, + blockXss = false + ) + private String memberLogo; + + @Check(name = "鎴愬憳闅愯韩鐘舵") + private Boolean memberHidden; + + @Check(name = "缃戝叧閫氫俊鍦板潃", require = true, messageOnEmpty = "缃戝叧閫氫俊鍦板潃涓嶈兘涓虹┖") + private String memberGatewayUri; + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + super.checkAndStandardize(); + + if (getMemberGatewayUri().contains(":")) { + String portStr = getMemberGatewayUri().split(":")[1]; + Integer port = Convert.toInt(portStr); + if (port == null || port < 1 || port > 65535) { + throw new StatusCodeWithException("Gateway Uri绔彛鏈夎锛岀鍙h寖鍥达細1~65535", StatusCode.PARAMETER_VALUE_INVALID); + } + } + + } + + //region getter/setter + + public String getMemberLogo() { + return memberLogo; + } + + public void setMemberLogo(String memberLogo) { + this.memberLogo = memberLogo; + } + + public Boolean getMemberHidden() { + return memberHidden; + } + + public void setMemberHidden(Boolean memberHidden) { + this.memberHidden = memberHidden; + } + + + public String getMemberGatewayUri() { + return memberGatewayUri; + } + + public void setMemberGatewayUri(String memberGatewayUri) { + this.memberGatewayUri = memberGatewayUri; + } + + //endregion + } + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/UpdateMemberLogoApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/UpdateMemberLogoApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..9f1293e31cbd0beced1c8a19d566166868e2b4b6 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/UpdateMemberLogoApi.java" @@ -0,0 +1,97 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.member; + +import com.welab.wefe.board.service.service.SystemInitializeService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.FileType; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import net.coobird.thumbnailator.Thumbnails; +import org.apache.commons.codec.binary.Base64; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +/** + * @author aaron.li + **/ +@Api(path = "member/update_logo", name = "update member logo") +public class UpdateMemberLogoApi extends AbstractNoneOutputApi { + @Autowired + private SystemInitializeService systemInitializeService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + systemInitializeService.updateMemberLogo(input); + return success(); + } + + public static class Input extends AbstractApiInput { + @Check( + name = "鎴愬憳logo", + require = true, + blockReactionaryKeyword = false, + blockSqlInjection = false, + blockXss = false + ) + private String memberLogo; + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + super.checkAndStandardize(); + + String base64 = StringUtil.substringAfter(memberLogo, "base64,"); + byte[] bytes = Base64.decodeBase64(base64); + if (!FileType.isImage(bytes)) { + StatusCode.PARAMETER_VALUE_INVALID.throwException("涓嶆敮鎸佺殑鍥剧墖鏍煎紡"); + } + + // 瀵瑰浘鐗囨枃浠惰繘琛岀缉鏀撅紝杩囨护鎺夊唴閮ㄥ彲鑳藉寘鍚殑鏈ㄩ┈鍐呭銆 + ByteArrayOutputStream output = new ByteArrayOutputStream(); + try { + Thumbnails + .of(new ByteArrayInputStream(bytes)) + .scale(1) + .toOutputStream(output); + } catch (IOException e) { + StatusCode + .PARAMETER_VALUE_INVALID + .throwException("鍥剧墖宸叉崯鍧忥細" + e.getMessage()); + } + + memberLogo = "data:image/jpeg;base64," + Base64.encodeBase64String(output.toByteArray()); + + } + + + public String getMemberLogo() { + return memberLogo; + } + + public void setMemberLogo(String memberLogo) { + this.memberLogo = memberLogo; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/test/Initialize.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/test/Initialize.http" new file mode 100644 index 0000000000000000000000000000000000000000..6685ab9d7c94866d8a48d35177c6c656aa73d59e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/test/Initialize.http" @@ -0,0 +1,40 @@ + +### 鐧诲綍 +POST {{baseUrl}}/account/login +Content-Type: application/json + +{ + "phone_number": "13100000001", + "password": "password" +} + +> {% + +client.global.set("token", response.body.data.token); + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 0, "Response code is not 0"); +}); + +%} + + +### 鍒濆鍖栫郴缁 +POST {{baseUrl}}/system/initialize +Content-Type: application/json +token: {{token}} + +{ + "memberName": "鏄熺幆绉戞妧", + "memberEmail": "galaxy@galaxy.com", + "memberMobile": "400-88888888", + "memberAllowPublicDataSet": true +} + +> {% + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 0, "Response code is not 0"); +}); + +%} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/test/member-detail.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/test/member-detail.http" new file mode 100644 index 0000000000000000000000000000000000000000..2d39088383043a47c8ca283333d6310d3a31fd97 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/test/member-detail.http" @@ -0,0 +1,5 @@ + +### 鑾峰彇 member 淇℃伅 +GET {{baseUrl}}/member/detail +Content-Type: application/json +token: {{token}} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/test/member-update.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/test/member-update.http" new file mode 100644 index 0000000000000000000000000000000000000000..6add8dc4e5c8e3a2a2f5c982b9a5ecc81e7ee2f2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/test/member-update.http" @@ -0,0 +1,23 @@ + +### 鏇存柊 member 淇℃伅 +POST {{baseUrl}}/member/update +Content-Type: application/json +token: {{token}} + +{ + "memberName": "鏄熺幆绉戞妧", + "memberEmail": "galaxy@galaxy.com", + "memberMobile": "400-88888888", + "memberAllowPublicDataSet": true +} + +> {% + +client.global.set("token", response.body.data.token); + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 0, "Response code is not 0"); +}); + +%} + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/test/service_status_check.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/test/service_status_check.http" new file mode 100644 index 0000000000000000000000000000000000000000..c23dc84ded8f925e51ef1a05c7b0d7aad58f6e34 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/member/test/service_status_check.http" @@ -0,0 +1,16 @@ +POST {{baseUrl}}/member/service_status_check +Content-Type: application/json + +{ + "member_id": "23bd0dc471514fd0b268fc2d0799cb2c" +} + + + +### 鏌ュ埆浜 +POST {{baseUrl}}/member/service_status_check +Content-Type: application/json + +{ + "member_id": "601e3c3f150a4bfd9e9d6f2be9563b26" +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/DetailApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/DetailApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..a9e2c98242d2c3856181fe2139d7c70178a0e961 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/DetailApi.java" @@ -0,0 +1,65 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.message; + +/** + * @author Zane + */ + +import com.welab.wefe.board.service.database.entity.MessageMysqlModel; +import com.welab.wefe.board.service.database.repository.MessageRepository; +import com.welab.wefe.board.service.dto.entity.MessageOutputModel; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "message/detail", name = "get a message detail") +public class DetailApi extends AbstractApi { + + @Autowired + MessageRepository repo; + + @Override + protected ApiResult handle(DetailApi.Input input) throws StatusCodeWithException { + MessageMysqlModel model = repo.findById(input.getId()).orElse(null); + MessageOutputModel output = ModelMapper.map(model, MessageOutputModel.class); + return success(output); + } + + public static class Input extends AbstractApiInput { + private String id; + + //region getter/setter + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/QueryApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/QueryApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..6feaffcb8610e3e63b7dd7f02a3e5e849a59ca26 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/QueryApi.java" @@ -0,0 +1,72 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.message; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.MessageOutputModel; +import com.welab.wefe.board.service.service.MessageService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Zane + */ +@Api(path = "message/query", name = "query messages by pagination") +public class QueryApi extends AbstractApi> { + + @Autowired + MessageService service; + + @Override + protected ApiResult> handle(QueryApi.Input input) throws StatusCodeWithException { + return success(service.query(input)); + } + + public static class Input extends PagingInput { + @Check(name = "娑堟伅绾у埆") + private String level; + + @Check(name = "鏄惁鏈") + private Boolean unread; + + //region getter/setter + + public String getLevel() { + return level; + } + + public void setLevel(String level) { + this.level = level; + } + + public Boolean getUnread() { + return unread; + } + + public void setUnread(Boolean unread) { + this.unread = unread; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/ReadApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/ReadApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..2280c35117322e55ec4317b5042e1fd7bf0fe467 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/ReadApi.java" @@ -0,0 +1,61 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.message; + +/** + * @author Zane + */ + +import com.welab.wefe.board.service.service.MessageService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "message/read", name = "change the message to read") +public class ReadApi extends AbstractNoneOutputApi { + + @Autowired + MessageService service; + + @Override + protected ApiResult handler(ReadApi.Input input) throws StatusCodeWithException { + service.read(input.getId()); + return success(); + } + + public static class Input extends AbstractApiInput { + private String id; + + //region getter/setter + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/test/message-add.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/test/message-add.http" new file mode 100644 index 0000000000000000000000000000000000000000..970cf0fd4fcf3174dbc21074b3d526a86470f41e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/test/message-add.http" @@ -0,0 +1,47 @@ +### 娣诲姞娑堟伅 +POST {{baseUrl}}/message/add +Content-Type: application/json + +{ + "producer": "gateway", + "level": "error", + "title": "浠诲姟寮傚父涓柇", + "content": "Job锛77683fcde5f64a4e97e7d18ef9926acd锛夊彂鐢熷紓甯革細 鈥済ateway connec to member timeout鈥" +} + + +### 娣诲姞娑堟伅 +POST {{baseUrl}}/message/add +Content-Type: application/json + +{ + "producer": "flow", + "level": "success", + "title": "浠诲姟鎵ц鎴愬姛", + "content": "Job锛77683fcde5f64a4e97e7d18ef9926acd锛夋墽琛屾垚鍔" +} + + +### 娣诲姞娑堟伅 +POST {{baseUrl}}/message/add +Content-Type: application/json + +{ + "producer": "flow", + "level": "warning", + "title": "鏀跺埌鏉ヨ嚜 鑵捐绉戞妧 鍒涘缓鐨勪换鍔", + "content": "Job Id: 77683fcde5f64a4e97e7d18ef9926acd" +} + + +### 娣诲姞娑堟伅 +POST {{baseUrl}}/message/add +Content-Type: application/json + +{ + "producer": "board", + "level": "info", + "title": "鏉ヨ嚜 鏄熺幆绉戞妧 鐨勪换鍔″凡鍚姩", + "content": "Job Id: 77683fcde5f64a4e97e7d18ef9926acd" +} + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/test/message-detail.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/test/message-detail.http" new file mode 100644 index 0000000000000000000000000000000000000000..6bfa89e6ca2dd2c8907478d374626aae7909a5f9 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/test/message-detail.http" @@ -0,0 +1,8 @@ + +### 鑾峰彇娑堟伅璇︽儏 +POST {{baseUrl}}/message/detail +Content-Type: application/json + +{ + "id": "30e5a85323c34bba8d8f6fb66358e6c2" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/test/message-query.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/test/message-query.http" new file mode 100644 index 0000000000000000000000000000000000000000..5b1c7bbe998e54bb2c83e42b1bedc8a41373ca5a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/test/message-query.http" @@ -0,0 +1,24 @@ + +### 鏌ヨ鍏ㄩ儴娑堟伅 +POST {{baseUrl}}/message/query +Content-Type: application/json + +{} + + +### 鏌ユ湭璇绘秷鎭 +POST {{baseUrl}}/message/query +Content-Type: application/json + +{ + "unread": true +} + + +### 鎸 level 鏌 +POST {{baseUrl}}/message/query +Content-Type: application/json + +{ + "level": "error" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/test/message-read.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/test/message-read.http" new file mode 100644 index 0000000000000000000000000000000000000000..bf98cd5dd1332d334a7ac76c121ee08b46a7cfa9 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/message/test/message-read.http" @@ -0,0 +1,8 @@ + +### 灏嗘秷鎭爣璁颁负宸茶 +POST {{baseUrl}}/message/read +Content-Type: application/json + +{ + "id": "30e5a85323c34bba8d8f6fb66358e6c2" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/CheckAccountExistApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/CheckAccountExistApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..26754abcb74ba290b55b1a28831b1443ac8f0da1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/CheckAccountExistApi.java" @@ -0,0 +1,72 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.online_demo; + +import com.welab.wefe.board.service.base.OnlineDemoApi; +import com.welab.wefe.board.service.service.account.AccountService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@OnlineDemoApi +@Api(path = "account/online_demo/exist", name = "check if account already exists", login = false) +public class CheckAccountExistApi extends AbstractApi { + @Autowired + private AccountService accountService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + boolean exist = accountService.exist(input.phoneNumber); + return success(new Output(exist)); + } + + public static class Input extends AbstractApiInput { + @Check(name = "鎵嬫満鍙") + private String phoneNumber; + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + } + + public static class Output { + private boolean exist; + + public Output(boolean exist) { + this.exist = exist; + } + + public boolean isExist() { + return exist; + } + + public void setExist(boolean exist) { + this.exist = exist; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/CreateOnlineDemoAccountApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/CreateOnlineDemoAccountApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..f05996c86b95cbe45cc21d12923fb66f6cef3c0b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/CreateOnlineDemoAccountApi.java" @@ -0,0 +1,44 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.online_demo; + +import com.welab.wefe.board.service.base.OnlineDemoApi; +import com.welab.wefe.board.service.dto.vo.AccountInputModel; +import com.welab.wefe.board.service.service.account.AccountService; +import com.welab.wefe.common.enums.BoardUserSource; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zan.luo + */ +@OnlineDemoApi +@Api(path = "account/online_demo/create", name = "open an experience account", login = false) +public class CreateOnlineDemoAccountApi extends AbstractNoneOutputApi { + @Autowired + private AccountService accountService; + + @Override + protected ApiResult handler(AccountInputModel input) throws StatusCodeWithException { + accountService.register(input, BoardUserSource.online_demo); + return success(); + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/README.md" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/README.md" new file mode 100644 index 0000000000000000000000000000000000000000..17b08c871aa476b4a4dcf739075a8a603300667c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/README.md" @@ -0,0 +1,3 @@ +# 鍦ㄧ嚎浣撻獙鐗 + +姝ゆ枃浠跺す鐢ㄤ簬瀛樻斁鍦ㄧ嚎浣撻獙鐗堜笓鐢ㄦ帴鍙o紝鍦ㄧ嚎浣撻獙鐗堟帴鍙e繀椤诲湪 API 涓鍔 `@OnlineDemoApi` 娉ㄨВ锛屼互纭繚 API 涓嶄細鍦ㄥ叾浠栫幆澧冭浣跨敤銆 \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/TianmiantechCallApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/TianmiantechCallApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..59f53aea6714ec3bff52949db8f41cce271f7159 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/TianmiantechCallApi.java" @@ -0,0 +1,54 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.online_demo; + +import com.welab.wefe.board.service.base.OnlineDemoApi; +import com.welab.wefe.board.service.onlinedemo.TianmiantechService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; +import java.util.Map; + +/** + * @author zane + */ +@OnlineDemoApi +@Api(path = "tianmiantech/call_api", name = "call tianmiantech service api") +public class TianmiantechCallApi extends AbstractApi { + @Autowired + private TianmiantechService tianmiantechService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException, IOException { + JObject result = tianmiantechService.through(input.api, input.params); + return success(result); + } + + public static class Input extends AbstractApiInput { + @Check(require = true) + public String api; + public Map params; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/TianmiantechPageApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/TianmiantechPageApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..a2ef61a4b28bc7a51210a934f9c7229f2d8c3c0f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/TianmiantechPageApi.java" @@ -0,0 +1,76 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.online_demo; + +import com.welab.wefe.board.service.base.OnlineDemoApi; +import com.welab.wefe.board.service.onlinedemo.TianmiantechService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.UrlUtil; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; + +import java.io.IOException; +import java.util.Map; + +/** + * @author zane + */ +@OnlineDemoApi +@Api(path = "tianmiantech/page_url", name = "create tianmiantech website page url") +public class TianmiantechPageApi extends AbstractApi { + @Autowired + private TianmiantechService tianmiantechService; + @Value("${tianmiantech.website.base-url:}") + private String TIANMIANTECH_WEBSITE_BASE_URL; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException, IOException { + + input.params.put("timestamp", System.currentTimeMillis()); + input.params.put("sign", tianmiantechService.sign(input.params)); + String url = UrlUtil.appendQueryParameters(TIANMIANTECH_WEBSITE_BASE_URL + input.page, input.params); + return success(new Output(url)); + } + + public static class Input extends AbstractApiInput { + @Check(require = true) + public String page; + public Map params; + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + super.checkAndStandardize(); + + if (!page.startsWith("/")) { + page = "/" + page; + } + } + } + + public static class Output { + public String url; + + public Output(String url) { + this.url = url; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/test/account-create.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/test/account-create.http" new file mode 100644 index 0000000000000000000000000000000000000000..34dbc4b84bf012ca05ec655ed3d9b40abcbc12a8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/test/account-create.http" @@ -0,0 +1,48 @@ + +### 姝e父娉ㄥ唽 +POST {{baseUrl}}/account/online_demo/create +Content-Type: application/json + +{ + "phone_number": "13100000001", + "nickname": "灏忕敎鐢", + "password": "password", + "email": "email@email.com" +} + + +### 鎵嬫満鍙峰啿绐 +POST {{baseUrl}}/account/online_demo/create +Content-Type: application/json + +{ + "phone_number": "13100000000", + "nickname": "灏忕敎鐢", + "password": "password", + "email": "email@com.cn" +} + + + +### 鎵嬫満鍙烽敊璇 +POST {{baseUrl}}/account/online_demo/create +Content-Type: application/json + +{ + "phone_number": "1310000", + "nickname": "灏忕敎鐢", + "password": "password", + "email": "email@email.email" +} + + +### 閭閿欒 +POST {{baseUrl}}/account/online_demo/create +Content-Type: application/json + +{ + "phone_number": "13100000000", + "nickname": "灏忕敎鐢", + "password": "password", + "email": "email@email.email" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/test/account-exist.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/test/account-exist.http" new file mode 100644 index 0000000000000000000000000000000000000000..42e1c73146ca05d0fb45564aeb9ae31101d6ba31 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/test/account-exist.http" @@ -0,0 +1,6 @@ +POST {{baseUrl}}/account/online_demo/exist +Content-Type: application/json + +{ + "phone_number": "13168730657" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/test/tianmiantech-call.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/test/tianmiantech-call.http" new file mode 100644 index 0000000000000000000000000000000000000000..87d79557c15fbcc602660bd05df3385037f5f565 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/test/tianmiantech-call.http" @@ -0,0 +1,9 @@ +POST {{baseUrl}}/tianmiantech/call_api +Content-Type: application/json + +{ + "api": "realNameState", + "params": { + "mobile": "131682730657" + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/test/tianmiantech-page.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/test/tianmiantech-page.http" new file mode 100644 index 0000000000000000000000000000000000000000..ddd442a5b585bdacbffb62318ca4a0a23b4629ea --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/online_demo/test/tianmiantech-page.http" @@ -0,0 +1,9 @@ +POST {{baseUrl}}/tianmiantech/page_url +Content-Type: application/json + +{ + "page": "testApply", + "params": { + "mobile": "13168730657" + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/operation/QueryApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/operation/QueryApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..f0ef748c3b6aa10a8b0b259064c411c5367ba252 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/operation/QueryApi.java" @@ -0,0 +1,81 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.operation; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.OperationLogOutputModel; +import com.welab.wefe.board.service.service.OperationLogService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author eval + **/ +@Api(path = "log/query", name = "query log") +public class QueryApi extends AbstractApi> { + + @Autowired + OperationLogService service; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + return success(service.query(input)); + } + + public static class Input extends PagingInput { + private String action; + private String operatorPhone; + private Long startTime; + private Long endTime; + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public String getOperatorPhone() { + return operatorPhone; + } + + public void setOperatorPhone(String operatorPhone) { + this.operatorPhone = operatorPhone; + } + + public Long getStartTime() { + return startTime; + } + + public void setStartTime(Long startTime) { + this.startTime = startTime; + } + + public Long getEndTime() { + return endTime; + } + + public void setEndTime(Long endTime) { + this.endTime = endTime; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/operation/test/operation_log-query.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/operation/test/operation_log-query.http" new file mode 100644 index 0000000000000000000000000000000000000000..83c2cd66a2b9cf838c79b700a1951a34261ff94e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/operation/test/operation_log-query.http" @@ -0,0 +1,13 @@ +### 鏌ヨ鐢ㄦ埛鎿嶄綔鏃ュ織 +POST {{baseUrl}}/log/query +Content-Type: application/json +token: {{token}} + +{ + "action":"model_result", + "operator_phone": "15914412294", + "start_time": 1597567046000, + "end_time": 1597627277000 +} + +### \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/AddDataSetApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/AddDataSetApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..2c04156fa43bb92e024555bae776c7cd50aa5636 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/AddDataSetApi.java" @@ -0,0 +1,72 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.dataset; + +import com.welab.wefe.board.service.dto.entity.ProjectDataSetInput; +import com.welab.wefe.board.service.service.ProjectService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author zan.luo + */ +@Api(path = "project/data_set/add", name = "add data set to project") +public class AddDataSetApi extends AbstractNoneOutputApi { + + @Autowired + ProjectService service; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + service.addProjectDataSet(input); + return success(); + } + + + public static class Input extends AbstractApiInput { + + @Check(name = "椤圭洰ID", require = true) + private String projectId; + + @Check(name = "鏁版嵁闆嗗垪琛", require = true) + private List dataSetList; + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public List getDataSetList() { + return dataSetList; + } + + public void setDataSetList(List dataSetList) { + this.dataSetList = dataSetList; + } + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/AuditDataSetApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/AuditDataSetApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..6d81314c8e18206512c40ce7dc4cb72f1a6c5086 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/AuditDataSetApi.java" @@ -0,0 +1,105 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.dataset; + +import com.welab.wefe.board.service.service.ProjectDataSetAuditService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "project/data_set/audit", name = "audit the data set authorization application in the project") +public class AuditDataSetApi extends AbstractNoneOutputApi { + + @Autowired + ProjectDataSetAuditService projectDataSetAuditService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + projectDataSetAuditService.auditDataSet(input); + return success(); + } + + + public static class Input extends AbstractApiInput { + @Check(name = "椤圭洰ID", require = true) + private String projectId; + + @Check(name = "鏁版嵁闆咺D", require = true) + private String dataSetId; + + @Check(name = "鐘舵", require = true) + private AuditStatus auditStatus; + @Check(name = "瀹℃牳鎰忚") + private String auditComment; + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + super.checkAndStandardize(); + if (auditStatus == AuditStatus.disagree && StringUtil.isEmpty(auditComment)) { + throw new StatusCodeWithException("璇峰~鍐欐嫆缁濆師鍥犲摝~", StatusCode.PARAMETER_VALUE_INVALID); + } + } + + //region getter/setter + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public AuditStatus getAuditStatus() { + return auditStatus; + } + + public void setAuditStatus(AuditStatus auditStatus) { + this.auditStatus = auditStatus; + } + + public String getAuditComment() { + return auditComment; + } + + public void setAuditComment(String auditComment) { + this.auditComment = auditComment; + } + + //endregion + + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/ListApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/ListApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..a682c2f2b86d6192cc0eddf58a4a46e2dbbc444a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/ListApi.java" @@ -0,0 +1,90 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.dataset; + +import com.welab.wefe.board.service.dto.entity.project.ProjectDataSetOutputModel; +import com.welab.wefe.board.service.service.ProjectDataSetService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author zane.luo + */ +@Api(path = "project/data_set/list", name = "list all of the project data sets") +public class ListApi extends AbstractApi { + + @Autowired + private ProjectDataSetService projectDataSetService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + List list = projectDataSetService.list(input.projectId, input.memberId); + return success(new Output(list)); + } + + public static class Input extends AbstractApiInput { + @Check(name = "椤圭洰Id", require = true) + private String projectId; + + @Check(name = "鎴愬憳Id", desc = "褰撴鍙傛暟涓虹┖鏃讹紝杩斿洖椤圭洰涓墍鏈夋暟鎹泦") + private String memberId; + + + //region getter/setter + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + //endregion + } + + public static class Output { + private List list; + + public Output(List list) { + this.list = list; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/QueryDerivedDataSetApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/QueryDerivedDataSetApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..4c756003dfa3bdc6f356b5f36c352ae7b4fd0ab9 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/QueryDerivedDataSetApi.java" @@ -0,0 +1,108 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.dataset; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.project.DerivedProjectDataSetOutputModel; +import com.welab.wefe.board.service.service.ProjectDataSetService; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "project/derived_data_set/query", name = "get a list of derived data sets in the project") +public class QueryDerivedDataSetApi extends AbstractApi> { + + @Autowired + private ProjectDataSetService projectDataSetService; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + return success(projectDataSetService.queryDerivedDataSet(input)); + } + + public static class Input extends PagingInput { + @Check(name = "椤圭洰Id", require = true) + private String projectId; + + @Check(name = "鏉ユ簮") + private ComponentType sourceType; + + @Check(name = "鏉ユ簮娴佺▼id") + private String sourceFlowId; + + @Check(name = "鏉ユ簮浠诲姟id") + private String sourceJobId; + + @Check(name = "鏁版嵁闆唅d") + private String dataSetId; + + + //region getter/setter + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public ComponentType getSourceType() { + return sourceType; + } + + public void setSourceType(ComponentType sourceType) { + this.sourceType = sourceType; + } + + public String getSourceFlowId() { + return sourceFlowId; + } + + public void setSourceFlowId(String sourceFlowId) { + this.sourceFlowId = sourceFlowId; + } + + public String getSourceJobId() { + return sourceJobId; + } + + public void setSourceJobId(String sourceJobId) { + this.sourceJobId = sourceJobId; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + + //endregion + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/RawDataSetListApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/RawDataSetListApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..a07fb14e4ff235a5e03a337e293a7a99d54f416e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/RawDataSetListApi.java" @@ -0,0 +1,112 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.dataset; + +import com.welab.wefe.board.service.dto.entity.project.ProjectDataSetOutputModel; +import com.welab.wefe.board.service.service.ProjectDataSetService; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author zane.luo + */ +@Api(path = "project/raw_data_set/list", name = "Get the list of raw data sets in the project", login = false) +public class RawDataSetListApi extends AbstractApi { + + @Autowired + private ProjectDataSetService projectDataSetService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + List list = projectDataSetService.listRawDataSet(input.projectId, input.memberId, input.memberRole, input.containsY); + return success(new Output(list)); + } + + public static class Input extends AbstractApiInput { + @Check(name = "椤圭洰Id", require = true) + private String projectId; + + @Check(name = "鎴愬憳Id", require = true, desc = "褰撴鍙傛暟涓虹┖鏃讹紝杩斿洖椤圭洰涓墍鏈夋暟鎹泦") + private String memberId; + + @Check(name = "鎴愬憳瑙掕壊", require = true) + private JobMemberRole memberRole; + + @Check(name = "鏄惁鍖呭惈Y") + private Boolean containsY; + + //region getter/setter + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + public Boolean getContainsY() { + return containsY; + } + + public void setContainsY(Boolean containsY) { + this.containsY = containsY; + } + + //endregion + } + + public static class Output { + private List list; + + public Output(List list) { + this.list = list; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/RemoveDataSetApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/RemoveDataSetApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..8d463ea8aa6758b12d66037b0b6d424f365e89ed --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/RemoveDataSetApi.java" @@ -0,0 +1,85 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.dataset; + +import com.welab.wefe.board.service.service.ProjectService; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "project/data_set/remove", name = "Delete the data set in the project") +public class RemoveDataSetApi extends AbstractNoneOutputApi { + + @Autowired + ProjectService service; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + service.removeDataSet(input); + return success(); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "椤圭洰ID", require = true) + private String projectId; + + @Check(name = "鏁版嵁闆咺D", require = true) + private String dataSetId; + + @Check(name = "鎴愬憳瑙掕壊", desc = "褰撳垹闄ゅ師濮嬫暟鎹泦鏃讹紝闇瑕佹寚瀹氳鑹诧紝鍒犻櫎琛嶇敓鏁版嵁闆嗘椂锛屼笉闇瑕併") + private JobMemberRole memberRole; + + + //region getter/setter + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + //endregion + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/test/add.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/test/add.http" new file mode 100644 index 0000000000000000000000000000000000000000..d3c2b6d535330e595c24ea0f9b606748021c9b89 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/test/add.http" @@ -0,0 +1,13 @@ +POST {{baseUrl}}/project/data_set/add +Content-Type: application/json + +{ + "project_id": "67c5871c671b4dd2830edbc094ac1949", + "dataSetList": [ + { + "member_role": "provider", + "member_id": "682d087e965a4c5d8a2807a772a571c1", + "data_set_id": "bc7a824f64da488ab4e849504f3cd270" + } + ] +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/test/audit.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/test/audit.http" new file mode 100644 index 0000000000000000000000000000000000000000..9f93f7bbf5e4804e0ad513fb31bb22852c9c05fd --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/test/audit.http" @@ -0,0 +1,15 @@ +POST {{baseUrl}}/project/data_set/audit +Content-Type: application/json + +{ + "caller_member_role": "provider", + "data": { + "method": "POST", + "project_id": "32065c74a125478581b9cd8fa980055a", + "data_set_id": "f2088c1f8cf04530872b5490b65064e5", + "status": "agree" + }, + "caller_member_name": "寮熶緷鍋庨浂鍥", + "api": "project/data_set/audit", + "caller_member_id": "682d087e965a4c5d8a2807a772a571c1" +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/test/derived_data_set_list.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/test/derived_data_set_list.http" new file mode 100644 index 0000000000000000000000000000000000000000..9a7cba9809103a385c2565ad14045e4ee3c9bba5 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/test/derived_data_set_list.http" @@ -0,0 +1,6 @@ +POST {{baseUrl}}/project/derived_data_set/query +Content-Type: application/json + +{ + "projectId": "f6920e302e724da78f488883dfde5bd5" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/test/list.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/test/list.http" new file mode 100644 index 0000000000000000000000000000000000000000..6ce03240d04f5642ae510fb6f9fad9cb2ff5d886 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/test/list.http" @@ -0,0 +1,6 @@ +POST {{baseUrl}}/project/data_set/list +Content-Type: application/json + +{ + "projectId": "cb3b36c7086d45108af74cae40daa0f3" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/test/raw_data_set_list.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/test/raw_data_set_list.http" new file mode 100644 index 0000000000000000000000000000000000000000..d36935415855cb6b9c63d6d4dce6da38fa5899bf --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/dataset/test/raw_data_set_list.http" @@ -0,0 +1,9 @@ +POST {{baseUrl}}/project/raw_data_set/list +Content-Type: application/json + +{ + "projectId": "a76c2b3024da49e4a79b3701495e9cd3", + "memberRole": "promoter", + "memberId": "d3c9199e15154d9eac22690a55abc0f4", + "containsY": true +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/AddFlowApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/AddFlowApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..4a5d220e1226a1c927be290914dd27622c44898b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/AddFlowApi.java" @@ -0,0 +1,147 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.flow; + +import com.welab.wefe.board.service.service.ProjectFlowService; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "project/flow/add", name = "New project flow") +public class AddFlowApi extends AbstractApi { + + @Autowired + ProjectFlowService projectFlowService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + String flowId = projectFlowService.addFlow(input); + return success(new Output(flowId)); + } + + public static class Input extends AbstractApiInput { + @Check(name = "椤圭洰ID 涓婚敭", require = true) + private String projectId; + + @Check(name = "鑱旈偊绫诲瀷锛堟í鍚/绾靛悜锛", require = true) + private FederatedLearningType federatedLearningType; + + @Check(name = "娴佺▼鍚", require = true) + private String name; + + @Check(name = "娴佺▼鎻忚堪") + private String desc; + + @Check(name = "妯℃澘Id", desc = "濡傛灉鏄熀浜庢ā鏉垮垱寤烘祦绋嬶紝鍒欐寚瀹氭ā鏉縄d") + private String templateId; + + @Check(name = "娴佺▼Id", hiddenForFrontEnd = true) + private String flowId; + /** + * is oot model + */ + private boolean ootMode = false; + + //region getter/setter + + + public FederatedLearningType getFederatedLearningType() { + return federatedLearningType; + } + + public void setFederatedLearningType(FederatedLearningType federatedLearningType) { + this.federatedLearningType = federatedLearningType; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getTemplateId() { + return templateId; + } + + public void setTemplateId(String templateId) { + this.templateId = templateId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public boolean isOotMode() { + return ootMode; + } + + public void setOotMode(boolean ootMode) { + this.ootMode = ootMode; + } + + //endregion + + + } + + public static class Output { + private String flowId; + + public Output(String flowId) { + this.flowId = flowId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/AddOotFlowApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/AddOotFlowApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..b1f827bc4ea85ee108c3f917d43e62eca4a8f925 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/AddOotFlowApi.java" @@ -0,0 +1,80 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.flow; + +import com.welab.wefe.board.service.service.ProjectFlowService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Add OOT process + *

+ * Call this interface in [scoring verification] in the model list + *

+ * + * @author aaron.li + **/ +@Api(path = "project/flow/add_oot", name = "Add OOT process") +public class AddOotFlowApi extends AbstractApi { + @Autowired + ProjectFlowService projectFlowService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + return success(projectFlowService.addOotFlow(input)); + } + + public static class Input extends AbstractApiInput { + @Check(name = "The ID of the task being OOT", require = true) + private String ootJobId; + @Check(name = "ID of the model being OOT", require = true) + private String ootModelFlowNodeId; + + public String getOotJobId() { + return ootJobId; + } + + public void setOotJobId(String ootJobId) { + this.ootJobId = ootJobId; + } + + public String getOotModelFlowNodeId() { + return ootModelFlowNodeId; + } + + public void setOotModelFlowNodeId(String ootModelFlowNodeId) { + this.ootModelFlowNodeId = ootModelFlowNodeId; + } + } + + public static class Output { + private String flowId; + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/CopyFlowApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/CopyFlowApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..e6cbcaa685e67828c8f87de2e30516bb687aea4f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/CopyFlowApi.java" @@ -0,0 +1,93 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.flow; + +import com.welab.wefe.board.service.service.ProjectFlowService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author lonnie.ren + */ +@Api(path = "project/flow/copy", name = "copy flow") +public class CopyFlowApi extends AbstractNoneOutputApi { + + @Autowired + private ProjectFlowService projectFlowService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + projectFlowService.copy(input); + return success(); + } + + public static class Input extends AbstractApiInput { + @Check(name = "琚鍒剁殑娴佺▼Id", require = true) + private String sourceFlowId; + + @Check(name = "鐩爣椤圭洰Id", require = true) + private String targetProjectId; + + @Check(name = "缁欏鍒剁殑娴佺▼閲嶅懡鍚") + private String flowRename; + + @Check(name = "鏂扮殑娴佺▼id") + private String newFlowId; + //region getter/setter + + public String getSourceFlowId() { + return sourceFlowId; + } + + public void setSourceFlowId(String sourceFlowId) { + this.sourceFlowId = sourceFlowId; + } + + public String getTargetProjectId() { + return targetProjectId; + } + + public void setTargetProjectId(String targetProjectId) { + this.targetProjectId = targetProjectId; + } + + public String getFlowRename() { + return flowRename; + } + + public void setFlowRename(String flowRename) { + this.flowRename = flowRename; + } + + public String getNewFlowId() { + return newFlowId; + } + + public void setNewFlowId(String newFlowId) { + this.newFlowId = newFlowId; + } + + //endregion + + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/DeleteApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/DeleteApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..30a52fb6a1fb527b024a4a33f346fbc77416c4b0 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/DeleteApi.java" @@ -0,0 +1,63 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.flow; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.project.ProjectFlowListOutputModel; +import com.welab.wefe.board.service.service.ProjectFlowService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "project/flow/delete", name = "delete flow") +public class DeleteApi extends AbstractApi> { + + @Autowired + ProjectFlowService flowService; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + flowService.delete(input); + return success(); + } + + public static class Input extends PagingInput { + + @Check(name = "娴佺▼Id") + private String flowId; + + //region getter/setter + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + //endregion + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/DetailFlowApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/DetailFlowApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..e7b53c18a76f091f985faf75ac3b57d396320473 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/DetailFlowApi.java" @@ -0,0 +1,91 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.flow; + +import com.welab.wefe.board.service.database.entity.job.ModelOotRecordMysqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectFlowMySqlModel; +import com.welab.wefe.board.service.dto.entity.project.ProjectFlowDetailOutputModel; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.board.service.service.ModelOotRecordService; +import com.welab.wefe.board.service.service.ProjectFlowService; +import com.welab.wefe.board.service.service.ProjectService; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "project/flow/detail", name = "get flow detail") +public class DetailFlowApi extends AbstractApi { + + @Autowired + private ProjectFlowService projectFlowService; + @Autowired + ProjectService projectService; + @Autowired + private ModelOotRecordService modelOotRecordService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + ProjectFlowMySqlModel flow = projectFlowService.findOne(input.flowId); + + if (flow == null) { + return success(); + } + + ProjectFlowDetailOutputModel output = ModelMapper.map(flow, ProjectFlowDetailOutputModel.class); + output.setProject(projectService.detail(flow.getProjectId())); + output.setParamsIsNullFlowNodes(projectFlowService.getParamsIsNullFlowNodes(input.flowId)); + output.setIsCreator(CacheObjects.isCurrentMember(flow.getCreatedBy())); + + // OOT model + ModelOotRecordMysqlModel modelOotRecordMysqlModel = modelOotRecordService.findByFlowId(input.flowId); + if (null != modelOotRecordMysqlModel) { + output.setOotJobId(modelOotRecordMysqlModel.getOotJobId()); + output.setOotModelFlowNodeId(modelOotRecordMysqlModel.getOotModelFlowNodeId()); + } + return success(output); + } + + public static class Input extends AbstractApiInput { + public Input() { + } + + public Input(String flowId) { + this.flowId = flowId; + } + + @Check(name = "娴佺▼涓婚敭", require = true) + private String flowId; + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/FlowDataSetInfoApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/FlowDataSetInfoApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..a04f8b6853e5b97e3ea448cb9c009b38474bfc14 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/FlowDataSetInfoApi.java" @@ -0,0 +1,76 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.flow; + +import com.welab.wefe.board.service.dto.kernel.JobDataSet; +import com.welab.wefe.board.service.service.ProjectFlowNodeService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +/** + * @author zane.luo + */ +@Api(path = "flow/dataset/info", name = "Get information about the flow data set") +public class FlowDataSetInfoApi + extends AbstractApi { + + @Autowired + private ProjectFlowNodeService projectFlowNodeService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + return success(new Output(projectFlowNodeService.findFlowDataSetInfo(input.getFlowId()))); + } + + public static class Input extends AbstractApiInput { + @Check(name = "娴佺▼id", require = true) + private String flowId; + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + } + + public static class Output { + private List flowDataSetFeatures; + + public Output(List findFlowDataSetFeature) { + this.flowDataSetFeatures = findFlowDataSetFeature; + } + + public List getFlowDataSetFeatures() { + return flowDataSetFeatures; + } + + public void setFlowDataSetFeatures(List flowDataSetFeatures) { + this.flowDataSetFeatures = flowDataSetFeatures; + } + + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/GetProgressApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/GetProgressApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..9129833ceddfda4d50d46e9ec350b76c06a0f2d0 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/GetProgressApi.java" @@ -0,0 +1,67 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.flow; + +import com.welab.wefe.board.service.dto.entity.project.ProjectFlowProgressOutputModel; +import com.welab.wefe.board.service.service.ProjectFlowService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author zane.luo + */ +@Api(path = "project/flow/get_progress", name = "Get the latest progress of the specified flow") +public class GetProgressApi extends AbstractApi { + + @Autowired + ProjectFlowService flowService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + List list = flowService.getProgress(input.flowIdList); + return success(new Output(list)); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "娴佺▼ id 鍒楄〃", require = true) + private List flowIdList; + + public List getFlowIdList() { + return flowIdList; + } + + public void setFlowIdList(List flowIdList) { + this.flowIdList = flowIdList; + } + } + + public static class Output { + public List list; + + public Output(List list) { + this.list = list; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/QueryDataIoTaskConfigApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/QueryDataIoTaskConfigApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..ec45bb6274db33c69ad0629d0781c9bff59b8cc6 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/QueryDataIoTaskConfigApi.java" @@ -0,0 +1,70 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.flow; + +import com.welab.wefe.board.service.service.TaskService; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; + +/** + * Query input parameters of dataio component + * + * @author aaron.li + **/ +@Api(path = "project/flow/query/data_io_task_config", name = "Query input parameters of dataio component") +public class QueryDataIoTaskConfigApi extends AbstractApi { + @Autowired + private TaskService taskService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException, IOException { + return success(taskService.findDataIoTaskConfig(input)); + } + + + public static class Input extends AbstractApiInput { + @Check(name = "job id", require = true) + private String jobId; + @Check(name = "role", require = true) + private JobMemberRole role; + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public JobMemberRole getRole() { + return role; + } + + public void setRole(JobMemberRole role) { + this.role = role; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/QueryDataIoTaskFeaturesApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/QueryDataIoTaskFeaturesApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..e51ea85d611b4d10c5e0bcf72a8bcd1e621b612f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/QueryDataIoTaskFeaturesApi.java" @@ -0,0 +1,103 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.flow; + +import com.welab.wefe.board.service.dto.entity.DataIoTaskFeatureInfoOutputModel; +import com.welab.wefe.board.service.service.TaskService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; +import java.util.List; + +/** + * Query the modeling feature column of the dataio task of the member according to jobid + *

+ * Scenario: in OOT mode, the front end may need to view the modeling feature column of the original process dataio of + * the corresponding member when selecting the dataset, and the front end can call this interface to query + *

+ * + * @author aaron.li + **/ +@Api(path = "project/flow/query/data_io_task_features", name = "Query the modeling feature column of the dataio task of the member according to jobid") +public class QueryDataIoTaskFeaturesApi extends AbstractApi { + @Autowired + private TaskService taskService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException, IOException { + Output output = new Output(); + output.setDataIoTaskFeatureInfoList(taskService.findDataIoTaskFeatures(input)); + return success(output); + } + + public static class Input extends AbstractApiInput { + /** + * Process ID (non OOT mode) + */ + private String flowId; + /** + * Job ID (OOT mode) + */ + private String jobId; + /** + * The member ID to query. If it is blank, it means to query all members under the jobid + */ + private String memberId; + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + } + + public static class Output { + private List dataIoTaskFeatureInfoList; + + public List getDataIoTaskFeatureInfoList() { + return dataIoTaskFeatureInfoList; + } + + public void setDataIoTaskFeatureInfoList(List dataIoTaskFeatureInfoList) { + this.dataIoTaskFeatureInfoList = dataIoTaskFeatureInfoList; + } + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/QueryFlowListApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/QueryFlowListApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..5ad6345cd81603d3c29282c909266c1eed064cb4 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/QueryFlowListApi.java" @@ -0,0 +1,69 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.flow; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.project.ProjectFlowListOutputModel; +import com.welab.wefe.board.service.service.ProjectFlowService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author winter.zou + */ +@Api(path = "project/flow/query", name = "query flow list") +public class QueryFlowListApi extends AbstractApi> { + + @Autowired + ProjectFlowService flowService; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + return success(flowService.query(input)); + } + + public static class Input extends PagingInput { + + @Check(name = "鏄惁宸茶鍒犻櫎") + private boolean deleted = false; + @Check(name = "椤圭洰ID 涓婚敭") + private String projectId; + + + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/QueryFlowNodeListApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/QueryFlowNodeListApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..987f1d3abf10b15c344f52a57bb4e0b756444fbd --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/QueryFlowNodeListApi.java" @@ -0,0 +1,81 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.flow; + +import com.welab.wefe.board.service.dto.entity.job.ProjectFlowNodeOutputModel; +import com.welab.wefe.board.service.service.ProjectFlowService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.AbstractApiOutput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; +import java.util.List; + +/** + * @author aaron.li + **/ +@Api(path = "project/flow_node/query", name = "query flow node list by flow id", login = false) +public class QueryFlowNodeListApi extends AbstractApi { + + @Autowired + private ProjectFlowService projectFlowService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException, IOException { + List projectFlowNodeOutputModelList = projectFlowService.getFlowNodes(input.flowId); + Output output = new Output(); + output.setList(projectFlowNodeOutputModelList); + return success(output); + } + + public static class Input extends AbstractApiInput { + public Input(String flowId) { + this.flowId = flowId; + } + + @Check(name = "flow id", require = true) + private String flowId; + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + } + + + public static class Output extends AbstractApiOutput { + + private List list; + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/QueryFlowTemplateApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/QueryFlowTemplateApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..377b1807edf520c3d58b263600d7a77e37f8c261 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/QueryFlowTemplateApi.java" @@ -0,0 +1,132 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.flow; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.welab.wefe.board.service.api.project.flow.QueryFlowTemplateApi.TemplateListOutput; +import com.welab.wefe.board.service.database.entity.flow.FlowTemplateMySqlModel; +import com.welab.wefe.board.service.service.FlowTemplateService; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractNoneInputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiOutput; +import com.welab.wefe.common.web.dto.ApiResult; + +/** + * @author winter.zou + */ +@Api(path = "project/flow/templates", name = "list flow templates") +public class QueryFlowTemplateApi extends AbstractNoneInputApi { + + @Autowired + private FlowTemplateService flowTemplateService; + + @Override + protected ApiResult handle() throws StatusCodeWithException { + List models = flowTemplateService.query(); + + TemplateListOutput output = new TemplateListOutput(); + List templates = models + .stream() + .map(t -> ModelMapper.map(t, TemplateOutput.class)) + .collect(Collectors.toList()); + + output.setTemplates(templates); + return success(output); + } + + public static class TemplateListOutput extends AbstractApiOutput { + private List templates; + + public List getTemplates() { + return templates; + } + + public void setTemplates(List templates) { + this.templates = templates; + } + + } + + public static class TemplateOutput { + + private String id; + /** + * template name + */ + private String name; + + /** + * template name + */ + private String description; + + private String enname; + + @Enumerated(EnumType.STRING) + private FederatedLearningType federatedLearningType; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEnname() { + return enname; + } + + public void setEnname(String enname) { + this.enname = enname; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public FederatedLearningType getFederatedLearningType() { + return federatedLearningType; + } + + public void setFederatedLearningType(FederatedLearningType federatedLearningType) { + this.federatedLearningType = federatedLearningType; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/SaveFlowTemplateApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/SaveFlowTemplateApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..47c7cd2aae376ccfdc1ae4b30ef442ca728cdc65 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/SaveFlowTemplateApi.java" @@ -0,0 +1,94 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.flow; + +import com.welab.wefe.board.service.service.FlowTemplateService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author winter.zou + */ +@Api(path = "project/flow/template/save", name = "save flow template") +public class SaveFlowTemplateApi extends AbstractApi { + + @Autowired + private FlowTemplateService flowTemplateService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + String templateId = flowTemplateService.addTemplate(input); + return success(new Output(templateId)); + } + + public static class Output { + private String templateId; + + public Output(String templateId) { + this.templateId = templateId; + } + + public String getTemplateId() { + return templateId; + } + + public void setTemplateId(String templateId) { + this.templateId = templateId; + } + + } + + public static class Input extends AbstractApiInput { + @Check(name = "妯℃澘鍚嶇О") + private String name; + + @Check(name = "妯℃澘鎻忚堪") + private String description; + @Check(name = "娴佺▼鍥") + private String graph; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getGraph() { + return graph; + } + + public void setGraph(String graph) { + this.graph = graph; + } + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/StartFlowApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/StartFlowApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..553187035d5520f685c6a268a24627307e8678d1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/StartFlowApi.java" @@ -0,0 +1,127 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.flow; + +import com.welab.wefe.board.service.service.ProjectFlowJobService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "flow/start", name = "start flow, create a job and execute it.") +public class StartFlowApi extends AbstractApi { + + @Autowired + ProjectFlowJobService projectFlowJobService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + String jobId = projectFlowJobService.startFlow(input); + return success(new Output(jobId)); + } + + + public static class Input extends AbstractApiInput { + @Check(name = "娴佺▼id", require = true) + private String flowId; + @Check(name = "鏄惁浣跨敤缂撳瓨", require = true) + private boolean useCache; + @Check(name = "缁堟鑺傜偣", desc = "涓虹┖鏃惰〃绀烘墽琛屽叏娴佺▼") + private String endNodeId; + + @Check(name = "jobId", hiddenForFrontEnd = true) + private String jobId; + + @Check(name = "arbiterMemberId", desc = "arbiter鎴愬憳id") + private String arbiterMemberId; + + private String ootJobId; + + //region getter/setter + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public boolean isUseCache() { + return useCache; + } + + public void setUseCache(boolean useCache) { + this.useCache = useCache; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getEndNodeId() { + return endNodeId; + } + + public void setEndNodeId(String endNodeId) { + this.endNodeId = endNodeId; + } + + public String getArbiterMemberId() { + return arbiterMemberId; + } + + public void setArbiterMemberId(String arbiterMemberId) { + this.arbiterMemberId = arbiterMemberId; + } + + public String getOotJobId() { + return ootJobId; + } + + public void setOotJobId(String ootJobId) { + this.ootJobId = ootJobId; + } + //endregion + } + + public static class Output { + private String jobId; + + public Output(String jobId) { + this.jobId = jobId; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/UpdateFlowBaseInfoApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/UpdateFlowBaseInfoApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..fee787dddbb5a2418b84ba3705785dc5354dc7f2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/UpdateFlowBaseInfoApi.java" @@ -0,0 +1,97 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.flow; + +import com.welab.wefe.board.service.service.ProjectFlowService; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "project/flow/update/base_info", name = "update flow base info") +public class UpdateFlowBaseInfoApi extends AbstractNoneOutputApi { + + @Autowired + ProjectFlowService projectFlowService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + projectFlowService.updateFlowBaseInfo(input); + return success(); + } + + + public static class Input extends AbstractApiInput { + + @Check(name = "娴佺▼ID") + private String flowId; + + @Check(name = "鑱旈偊绫诲瀷锛堟í鍚/绾靛悜锛", require = true) + private FederatedLearningType federatedLearningType; + + @Check(name = "娴佺▼鍚", require = true) + private String name; + + @Check(name = "娴佺▼鎻忚堪") + private String desc; + + //region getter/setter + + + public FederatedLearningType getFederatedLearningType() { + return federatedLearningType; + } + + public void setFederatedLearningType(FederatedLearningType federatedLearningType) { + this.federatedLearningType = federatedLearningType; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/UpdateFlowGraphApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/UpdateFlowGraphApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..1a341bc8397b82987de8a38d282ae727f24e90c7 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/UpdateFlowGraphApi.java" @@ -0,0 +1,73 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.flow; + +import com.welab.wefe.board.service.service.ProjectFlowService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "project/flow/update/graph", name = "update flow graph") +public class UpdateFlowGraphApi extends AbstractNoneOutputApi { + + @Autowired + ProjectFlowService projectFlowService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + projectFlowService.updateFlowGraph(input); + return success(); + } + + + public static class Input extends AbstractApiInput { + @Check(name = "娴佺▼ID,涓婚敭", require = true) + private String flowId; + + @Check(name = "娴佺▼鍥", require = true) + private String graph; + + //region getter/setter + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getGraph() { + return graph; + } + + public void setGraph(String graph) { + this.graph = graph; + } + + + //endregion + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/add.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/add.http" new file mode 100644 index 0000000000000000000000000000000000000000..62c82e8ae9646094de760a34696dc1dfc4131cff --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/add.http" @@ -0,0 +1,8 @@ +POST {{baseUrl}}/project/flow/add +Content-Type: application/json + +{ + "projectId": "52b15ed34297467290ea1a17e679f1ef", + "name": "namename", + "desc": "鎻忚堪鎻忚堪" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/copy.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/copy.http" new file mode 100644 index 0000000000000000000000000000000000000000..25f7d555f2cc85f38b2a94412b92445ebbeac886 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/copy.http" @@ -0,0 +1,10 @@ +POST {{baseUrl}}/project/flow/copy +Content-Type: application/json + +{ + "targetProejctId": "c206ece46b1246e49109c172f06d4c0d", + "sourceFlowId": "12e1b0d5862d45c8a8c8c88e7ce0b8f3", + "flowRename": "鏂版祦绋-9:51:28" +} + +### \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/delete.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/delete.http" new file mode 100644 index 0000000000000000000000000000000000000000..eda905b7ca5cbb2066f40bc72d99c141a967ce3d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/delete.http" @@ -0,0 +1,6 @@ +POST {{baseUrl}}/project/flow/delete +Content-Type: application/json + +{ + "flow_id": "81c59ad426504586bf8eabfcfdf28bc1" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/detail.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/detail.http" new file mode 100644 index 0000000000000000000000000000000000000000..2cf2d150aed7d46075c4bbe89fa215b517bde5e3 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/detail.http" @@ -0,0 +1,6 @@ +POST {{baseUrl}}/project/flow/detail +Content-Type: application/json + +{ + "flow_id": "bcc5968348984883bf8fb5944b3facfe" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/flow_finished.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/flow_finished.http" new file mode 100644 index 0000000000000000000000000000000000000000..54d980bc4def0d3299cf449ad2a1a83f4bdcecfc --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/flow_finished.http" @@ -0,0 +1,10 @@ +POST {{baseUrl}}/project/flow/finished +Content-Type: application/json +token: {{token}} + +{ + "jobId": "2145bd19e9454f32a162634c7499326b ", + "jobStatus": "success" +} + +### \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/get-progress.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/get-progress.http" new file mode 100644 index 0000000000000000000000000000000000000000..981dd056dd55da63a2c1dc773f64d6866698b42d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/get-progress.http" @@ -0,0 +1,8 @@ +POST {{baseUrl}}/project/flow/get_progress +Content-Type: application/json + +{ + "flowIdList":[ + "81576f08c5fc48cca66f0f7c7834e7be" + ] +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/query.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/query.http" new file mode 100644 index 0000000000000000000000000000000000000000..19d354579b351945f015e4997769f6c33a7c19e7 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/query.http" @@ -0,0 +1,6 @@ +POST {{baseUrl}}/project/flow/query +Content-Type: application/json + +{ + "projectId": "a71cb40266d84d8aa2c1dda6576b71b0" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/start.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/start.http" new file mode 100644 index 0000000000000000000000000000000000000000..cbb96ce56054e28d9682ae312d6d6a7bc1162afa --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/start.http" @@ -0,0 +1,9 @@ +POST {{baseUrl}}/flow/start +Content-Type: application/json + +{ + "flow_id": "34bb11fb249c4181a62c9b0743a7cd9f", + "use_cache": false +} + +### \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/update_base_info.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/update_base_info.http" new file mode 100644 index 0000000000000000000000000000000000000000..e373bd83d402a69b121c91cb49729f8965bdf3aa --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/update_base_info.http" @@ -0,0 +1,9 @@ +POST {{baseUrl}}/project/flow/update/base_info +Content-Type: application/json + +{ + "federatedLearningType": "vertical", + "flowId": "6bbbfda08ce446989626e22ba7abd6cc", + "name": "浣犲ソ楠氬晩", + "desc": "hello world" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/update_graph.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/update_graph.http" new file mode 100644 index 0000000000000000000000000000000000000000..fc60765cbfb380562b980d0bb3393a1dafb229fc --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/update_graph.http" @@ -0,0 +1,162 @@ +POST {{baseUrl}}/project/flow/update/graph +Content-Type: application/json +token: {{token}} + +{ + "flow_id": "aad09525-7cfa-449c-951e-da3f22c0e23f", + "graph": { + "nodes": [ + { + "id": "1608695294703624", + "x": 203, + "y": 84, + "singleEdge": true, + "anchorPoints": [ + [ + 0.5, + 0 + ], + [ + 0.5, + 1 + ] + ], + "label": "杞藉叆鏁版嵁闆", + "data": { + "isStart": true, + "isEnd": false, + "anchorPoints": [ + [ + 0.5, + 0 + ], + [ + 0.5, + 1 + ] + ], + "errorLog": true, + "jsonParams": false, + "input": {}, + "componentType": "DataIO" + }, + "type": "rect-node", + "style": { + "nodeState:default": { + "lineWidth": 1, + "fill": "#ecf3ff", + "stroke": "#d9e8ff" + }, + "nodeState:selected": { + "lineWidth": 2, + "stroke": "#1890ff" + }, + "fill": "#ecf3ff", + "stroke": "#d9e8ff" + }, + "labelCfg": { + "fill": "#4483FF" + } + }, + { + "id": "16086952998588207", + "x": 203, + "y": 164, + "singleEdge": true, + "anchorPoints": [ + [ + 0.5, + 0 + ], + [ + 0.5, + 1 + ] + ], + "label": "妯悜LR", + "data": { + "isStart": false, + "isEnd": false, + "anchorPoints": [ + [ + 0.5, + 0 + ], + [ + 0.5, + 1 + ] + ], + "errorLog": true, + "jsonParams": false, + "input": {}, + "componentType": "HorzLR" + }, + "type": "rect-node", + "style": { + "nodeState:default": { + "lineWidth": 1, + "fill": "#ecf3ff", + "stroke": "#d9e8ff" + }, + "nodeState:selected": { + "lineWidth": 2, + "stroke": "#1890ff" + }, + "fill": "#ecf3ff", + "stroke": "#d9e8ff" + }, + "labelCfg": { + "fill": "#4483FF" + } + } + ], + "edges": [ + { + "source": "1608695294703624", + "target": "16086952998588207", + "sourceAnchor": 1, + "targetAnchor": 0, + "label": "", + "type": "cubic-edge", + "style": { + "edgeState:default": { + "stroke": "#aab7c3", + "endArrow": { + "path": "M 0,0 L 8,4 L 7,0 L 8,-4 Z", + "fill": "#aab7c3", + "stroke": "#aab7c3" + } + }, + "edgeState:selected": { + "stroke": "#1890FF" + }, + "edgeState:hover": { + "stroke": "#1890FF" + }, + "endArrow": true + }, + "id": "edge1", + "startPoint": { + "x": 203, + "y": 104.5, + "index": 1 + }, + "endPoint": { + "x": 203, + "y": 143.5, + "index": 0 + }, + "curveOffset": [ + -20, + 20 + ], + "curvePosition": [ + 0.5, + 0.5 + ] + } + ], + "combos": [] + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/update_graph2.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/update_graph2.http" new file mode 100644 index 0000000000000000000000000000000000000000..eeaae0ad63e79959bba410e9bd83392b73f3c309 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/flow/test/update_graph2.http" @@ -0,0 +1,94 @@ +### 杩欎釜鍖呭惈绂荤兢鑺傜偣 + +POST {{baseUrl}}/project/flow/update/graph +Content-Type: application/json +token: {{token}} + +{ + "flow_id": "a9632fcc436f4400bba1726532475f7b", + "graph": { + "nodes": [ + { + "data": { + "componentType": "DataIO", + "input": {}, + "jsonParams": false, + "anchorPoints": [ + [ + 0.5, + 0 + ], + [ + 0.5, + 1 + ] + ], + "errorLog": true, + "isStart": true, + "isEnd": false + }, + "labelCfg": { + "fill": "#4483FF" + }, + "x": 56, + "y": 146, + "anchorPoints": [ + [ + 0.5, + 0 + ], + [ + 0.5, + 1 + ] + ], + "style": { + "nodeState:default": { + "fill": "#ecf3ff", + "stroke": "#d9e8ff", + "lineWidth": 1 + }, + "nodeState:selected": { + "stroke": "#1890ff", + "lineWidth": 2 + }, + "fill": "#ecf3ff", + "stroke": "#d9e8ff" + }, + "id": "16087158979274548", + "singleEdge": true, + "label": "杞藉叆鏁版嵁闆", + "type": "rect-node" + }, + { + "id": "1608876235223230", + "x": 50, + "y": 217, + "singleEdge": true, + "label": "鐗瑰緛缁熻", + "data": { + "componentType": "FeatureStatistic" + }, + "type": "rect-node", + "style": { + "nodeState:default": { + "lineWidth": 1, + "fill": "#ecf3ff", + "stroke": "#d9e8ff" + }, + "nodeState:selected": { + "lineWidth": 2, + "stroke": "#1890ff" + }, + "fill": "#ecf3ff", + "stroke": "#d9e8ff" + }, + "labelCfg": { + "fill": "#4483FF" + } + } + ], + "edges": [], + "combos": [] + } +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/DetailApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/DetailApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..537be87553c4ba24e599d5877b9d1a91914f0cfd --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/DetailApi.java" @@ -0,0 +1,189 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.job; + +import com.welab.wefe.board.service.component.Components; +import com.welab.wefe.board.service.database.entity.job.ProjectFlowNodeMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.dto.entity.job.JobOutputModel; +import com.welab.wefe.board.service.dto.entity.job.TaskOutputView; +import com.welab.wefe.board.service.dto.entity.job.TaskResultOutputModel; +import com.welab.wefe.board.service.service.FlowJobService; +import com.welab.wefe.board.service.service.ProjectFlowNodeService; +import com.welab.wefe.board.service.service.TaskService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author zane.luo + */ +@Api(path = "flow/job/detail", name = "get job detail") +public class DetailApi extends AbstractApi { + + @Autowired + private FlowJobService flowJobService; + + @Autowired + private TaskService taskService; + + @Autowired + private ProjectFlowNodeService projectFlowNodeService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + JobOutputModel job = flowJobService.detail(input.flowId, input.jobId, input.memberRole); + if (job == null) { + return success(); + } + + List tasks = taskService.listByJobId(job.getJobId(), job.getMyRole()); + List nodes = projectFlowNodeService.findNodesByFlowId(job.getFlowId()); + + List output = tasks + .parallelStream() + .map(task -> { + + if (input.needResult && task != null) { + + List results = Components + .get(task.getTaskType()) + .getTaskAllResult(task.getTaskId()); + + return new TaskOutputView(task, results); + } else { + return new TaskOutputView(task); + } + + + }) + .collect(Collectors.toList()); + + return success(new Output(job, output)); + } + + public static class Output { + private JobOutputModel job; + private List taskViews; + + public Output(JobOutputModel job, List taskViews) { + this.job = job; + this.taskViews = taskViews; + } + + + //region getter/setter + + public JobOutputModel getJob() { + return job; + } + + public void setJob(JobOutputModel job) { + this.job = job; + } + + public List getTaskViews() { + return taskViews; + } + + public void setTaskViews(List taskViews) { + this.taskViews = taskViews; + } + + + //endregion + } + + public static class Input extends AbstractApiInput { + + @Check(name = "娴佺▼ID") + private String flowId; + + @Check(name = "浠诲姟ID", desc = "鍏佽涓虹┖锛屼负绌烘椂鑷姩鑾峰彇鏈鍚庝竴涓 job銆") + private String jobId; + + @Check(name = "瑙掕壊") + private JobMemberRole memberRole; + + @Check( + name = "鏄惁闇瑕佽繑鍥 task 鎵ц缁撴灉", + require = true, + desc = "task 鎵ц缁撴灉鍙兘浼氫綋绉緝澶э紝浠呭湪闇瑕佷竴娆℃у睍绀烘墍鏈 task 鎵ц缁撴灉鏃剁粰 true銆" + ) + private boolean needResult; + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + super.checkAndStandardize(); + if (StringUtil.isEmpty(flowId) && StringUtil.isEmpty(jobId)) { + throw new StatusCodeWithException("flowId 鍜 jobId 涓嶈兘鍚屾椂涓虹┖", StatusCode.PARAMETER_VALUE_INVALID); + } + + if (StringUtil.isNotEmpty(jobId) && memberRole == null) { + throw new StatusCodeWithException("鎸囧畾 jobId 鏃堕渶瑕佹寚瀹 memberRole", StatusCode.PARAMETER_VALUE_INVALID); + } + } + + //region getter/setter + + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + public boolean isNeedResult() { + return needResult; + } + + public void setNeedResult(boolean needResult) { + this.needResult = needResult; + } + + //endregion + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/DownloadLogApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/DownloadLogApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..e291d487649d7f96b96d9e57319b4a9312f32362 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/DownloadLogApi.java" @@ -0,0 +1,71 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.job; + +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.UrlUtil; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpMethod; +import org.springframework.http.RequestEntity; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +/** + * @author zane.luo + */ +@Api(path = "/job/log/download", name = "download job log") +public class DownloadLogApi extends AbstractApi { + + @Autowired + private GlobalConfigService globalConfigService; + + @Override + protected ApiResult handle(DownloadLogApi.Input input) throws StatusCodeWithException { + + String url = globalConfigService.getFlowConfig().intranetBaseUri + "/job/download_logs?job_id=" + input.jobId; + RequestEntity requestEntity = new RequestEntity<>(null, null, HttpMethod.GET, UrlUtil.createUri(url)); + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity response = restTemplate.exchange(requestEntity, byte[].class); + return success(response); + } + + + public static class Input extends AbstractApiInput { + @Check(name = "浠诲姟Id", require = true) + private String jobId; + + //region getter/setter + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/GetJobProgressApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/GetJobProgressApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..ec3bfd2ed7254105cc41dc85090b9d1a180988f9 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/GetJobProgressApi.java" @@ -0,0 +1,109 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.job; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.api.gateway.GetMemberJobProgressApi; +import com.welab.wefe.board.service.dto.entity.job.JobMemberOutputModel; +import com.welab.wefe.board.service.dto.vo.JobProgressOutput; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.board.service.service.FlowJobService; +import com.welab.wefe.board.service.service.GatewayService; +import com.welab.wefe.board.service.service.JobMemberService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author zane.luo + */ +@Api(path = "flow/job/get_progress", name = "Get job execution progress of all members", login = false) +public class GetJobProgressApi extends AbstractApi> { + + @Autowired + private FlowJobService flowJobService; + @Autowired + private JobMemberService jobMemberService; + @Autowired + private GatewayService gatewayService; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + + List output = new ArrayList<>(); + + for (JobMemberOutputModel member : jobMemberService.list(input.jobId)) { + JobProgressOutput progress = null; + + // get progress in local + if (CacheObjects.getMemberId().equals(member.getMemberId())) { + progress = flowJobService.getProgress(input.jobId, member.getJobRole()); + + } + // get progress in remote + else { + + try { + ApiResult apiResult = gatewayService.callOtherMemberBoard( + member.getMemberId(), + GetMemberJobProgressApi.class, + new GetMemberJobProgressApi.Input(input.jobId, member.getJobRole()) + ); + + if (apiResult.data != null) { + progress = ((JSONObject) apiResult.data).toJavaObject(JobProgressOutput.class); + } + } catch (Exception e) { + progress = JobProgressOutput.fail(member, e); + } + } + + if (progress != null) { + output.add(progress); + } + } + + return success(output); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "浠诲姟ID", require = true) + private String jobId; + + //region getter/setter + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + + //endregion + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/OnJobFinishedApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/OnJobFinishedApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..da171c16bb6b57843180002ac7644ee135d37f43 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/OnJobFinishedApi.java" @@ -0,0 +1,55 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.job; + +import com.welab.wefe.board.service.service.ProjectFlowService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author lonnie + */ +@Api(path = "project/job/finished", name = "callback on job finished", login = false) +public class OnJobFinishedApi extends AbstractNoneOutputApi { + + @Autowired + private ProjectFlowService projectFlowService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + projectFlowService.flowFinished(input); + return success(); + } + + public static class Input extends AbstractApiInput { + @Check(name = "job鐨刬d", require = true) + private String jobId; + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/PreviewJobApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/PreviewJobApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..e0932353ca4cd76dc061157b6292c67400ec21f6 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/PreviewJobApi.java" @@ -0,0 +1,148 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.job; + +import com.welab.wefe.board.service.dto.entity.job.PreviewJobNodeOutputModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.service.JobService; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author zane.luo + */ +@Api(path = "project/flow/job/preview", name = "Preview flow execution process") +public class PreviewJobApi extends AbstractApi { + + @Autowired + private JobService jobService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + FlowGraph graph = jobService.createFlowGraph(input.flowId); + jobService.setGraphHasCacheResult(graph, input.useCache); + + List nodes = graph + .getJobSteps(input.endNodeId) + .stream() + .map(x -> { + PreviewJobNodeOutputModel model = ModelMapper.map(x, PreviewJobNodeOutputModel.class); + + // Guess its input node + try { + model.input = x.getComponent().getInputs(graph, x); + model.output = x.getComponent().getOutputs(graph, x); + + } catch (FlowNodeException e) { + System.out.println(e.getMessage()); + } + + return model; + }) + .collect(Collectors.toList()); + + long hasCacheResultCount = nodes.stream().filter(x -> x.getHasCacheResult()).count(); + long noCacheResultCount = nodes.stream().filter(x -> !x.getHasCacheResult()).count(); + + return success(new Output(hasCacheResultCount, noCacheResultCount, nodes)); + } + + public static class Input extends AbstractApiInput { + @Check(name = "娴佺▼涓婚敭", require = true) + private String flowId; + @Check(name = "鏄惁浣跨敤缂撳瓨", require = true) + private boolean useCache = true; + @Check(name = "缁堟鑺傜偣", desc = "涓虹┖鏃惰〃绀烘墽琛屽埌娴佺▼鏈鍚") + private String endNodeId; + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public boolean isUseCache() { + return useCache; + } + + public void setUseCache(boolean useCache) { + this.useCache = useCache; + } + + public String getEndNodeId() { + return endNodeId; + } + + public void setEndNodeId(String endNodeId) { + this.endNodeId = endNodeId; + } + } + + public static class Output { + private long hasCacheResultCount; + private long noCacheResultCount; + private List list; + + public Output(long hasCacheResultCount, long noCacheResultCount, List list) { + this.hasCacheResultCount = hasCacheResultCount; + this.noCacheResultCount = noCacheResultCount; + this.list = list; + } + + //region getter/setter + + + public long getHasCacheResultCount() { + return hasCacheResultCount; + } + + public void setHasCacheResultCount(long hasCacheResultCount) { + this.hasCacheResultCount = hasCacheResultCount; + } + + public long getNoCacheResultCount() { + return noCacheResultCount; + } + + public void setNoCacheResultCount(long noCacheResultCount) { + this.noCacheResultCount = noCacheResultCount; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/QueryApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/QueryApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..e4f280c2d153fb8776681bcebdfd30d427d31881 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/QueryApi.java" @@ -0,0 +1,99 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.job; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.job.JobListOutputModel; +import com.welab.wefe.board.service.service.FlowJobService; +import com.welab.wefe.common.enums.JobStatus; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "flow/job/query", name = "Query flow execution record") +public class QueryApi extends AbstractApi> { + + + @Autowired + FlowJobService flowJobService; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + return success(flowJobService.query(input)); + } + + public static class Input extends PagingInput { + + @Check(name = "娴佺▼ID", require = true) + private String flowId; + + @Check(name = "浠诲姟ID") + private String jobId; + + @Check(name = "浠诲姟鍚嶇О") + private String name; + + @Check(name = "浠诲姟鐘舵") + private JobStatus status; + + //region getter/setter + + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public JobStatus getStatus() { + return status; + } + + public void setStatus(JobStatus status) { + this.status = status; + } + + + //endregion + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/ResumeJobApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/ResumeJobApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..bf2ba9bbc2832949eebdef8b498a10bdce21411a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/ResumeJobApi.java" @@ -0,0 +1,58 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.job; + +import com.welab.wefe.board.service.service.ProjectFlowJobService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "flow/job/resume", name = "resume job") +public class ResumeJobApi extends AbstractApi { + + @Autowired + private ProjectFlowJobService projectFlowJobService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + projectFlowJobService.resumeJob(input); + return success(); + } + + public static class Input extends AbstractApiInput { + @Check(name = "浠诲姟Id锛屼富閿", require = true) + private String jobId; + + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/StopJobApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/StopJobApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..3e1292a53683efec4045f7863e0cf93ca5118408 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/StopJobApi.java" @@ -0,0 +1,56 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.job; + +import com.welab.wefe.board.service.service.ProjectFlowJobService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "flow/job/stop", name = "Pause the project process flow task") +public class StopJobApi extends AbstractNoneOutputApi { + + @Autowired + ProjectFlowJobService projectFlowJobService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + projectFlowJobService.stopFlowJob(input); + return success(); + } + + public static class Input extends AbstractApiInput { + @Check(name = "浠诲姟id", require = true) + private String jobId; + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/UpdateJobStatusApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/UpdateJobStatusApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..69e446a86d5dcac975560610c62b3ec16d11cda5 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/UpdateJobStatusApi.java" @@ -0,0 +1,88 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.job; + +import com.welab.wefe.board.service.service.JobService; +import com.welab.wefe.common.enums.JobStatus; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author lonnie + */ +@Api(path = "project/job/update/status", name = "Update the status of the job") +public class UpdateJobStatusApi extends AbstractNoneOutputApi { + + @Autowired + private JobService jobService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + jobService.updateJobStatus(input); + return success(); + } + + public static class Input extends AbstractApiInput { + + public Input() { + } + + public Input(String id, JobStatus jobStatus, String message) { + this.id = id; + this.jobStatus = jobStatus; + this.message = message; + } + + @Check(name = "id鍞竴鏍囪瘑", require = true) + private String id; + + @Check(name = "浠诲姟鐘舵", require = true) + private JobStatus jobStatus; + + @Check(name = "澶囨敞淇℃伅") + private String message; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public JobStatus getJobStatus() { + return jobStatus; + } + + public void setJobStatus(JobStatus jobStatus) { + this.jobStatus = jobStatus; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/ViewDataSetApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/ViewDataSetApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..24c7f4638d28adacc3de2d4c8e96d5256562999c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/ViewDataSetApi.java" @@ -0,0 +1,108 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.job; + +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.service.TaskResultService; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.UrlUtil; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpMethod; +import org.springframework.http.RequestEntity; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import java.util.List; + +/** + * @author zane.luo + */ +@Api(path = "/job/data_set/view", name = "view data set data rows", login = false) +public class ViewDataSetApi extends AbstractApi { + + @Autowired + private TaskResultService taskResultService; + @Autowired + private GlobalConfigService globalConfigService; + + @Override + protected ApiResult handle(ViewDataSetApi.Input input) throws StatusCodeWithException { + List list = taskResultService.findList(input.jobId, input.nodeId, input.memberRole, + "data_normal"); + if (!list.isEmpty()) { + TaskResultMySqlModel one = list.get(0); + JObject root = JObject.create(one.getResult()); + String tableName = root.getString("table_name"); + String tableNamespace = root.getString("table_namespace"); + String url = globalConfigService.getFlowConfig().intranetBaseUri + + String.format("/data_set/view?table_name=%s&table_namespace=%s", tableName, tableNamespace); + RequestEntity requestEntity = new RequestEntity<>(null, null, HttpMethod.GET, UrlUtil.createUri(url)); + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity response = restTemplate.exchange(requestEntity, Object.class); + return success(response); + } + return success(); + } + + + public static class Input extends AbstractApiInput { + @Check(name = "浠诲姟Id", require = true) + private String jobId; + + @Check(name = "鑺傜偣Id", require = true) + private String nodeId; + + @Check(name = "瑙掕壊", require = true) + private JobMemberRole memberRole; + + //region getter/setter + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getNodeId() { + return nodeId; + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/DetailApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/DetailApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..9e5c5e4af464f9476c6065b82dd3b8054945db2f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/DetailApi.java" @@ -0,0 +1,177 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.job.task; + +import com.welab.wefe.board.service.component.Components; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.dto.entity.job.JobOutputModel; +import com.welab.wefe.board.service.dto.entity.job.TaskOutputView; +import com.welab.wefe.board.service.dto.entity.job.TaskResultOutputModel; +import com.welab.wefe.board.service.service.TaskService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author zane.luo + */ +@Api(path = "flow/job/task/detail", name = "get task detail") +public class DetailApi extends AbstractApi { + + @Autowired + private TaskService taskService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + + TaskMySqlModel task = taskService.findOne(input); + if (task == null) { + return success(); + } + + List results = null; + + if (input.needResult) { + results = Components + .get(task.getTaskType()) + .getTaskAllResult(task.getTaskId()); + + } + + return success( + new Output( + new TaskOutputView( + task, + results + ) + ) + ); + } + + public static class Output { + private JobOutputModel job; + private TaskOutputView taskView; + + public Output(TaskOutputView taskView) { + this.taskView = taskView; + } + + + //region getter/setter + + public JobOutputModel getJob() { + return job; + } + + public void setJob(JobOutputModel job) { + this.job = job; + } + + public TaskOutputView getTaskView() { + return taskView; + } + + public void setTaskView(TaskOutputView taskView) { + this.taskView = taskView; + } + + //endregion + } + + public static class Input extends AbstractApiInput { + + @Check(name = "浠诲姟ID") + private String jobId; + + @Check(name = "娴佺▼鑺傜偣ID") + private String flowNodeId; + + @Check(name = "瀛愪换鍔D") + private String taskId; + + @Check(name = "娴佺▼ID") + private String flowId; + + @Check(name = "鏄惁闇瑕佽繑鍥 task 鎵ц缁撴灉", require = true, desc = "task 鐨勬墽琛岀粨鏋滀綋绉緝澶э紝鍦ㄤ笉闇瑕佹椂锛岃鎸囧畾涓 false") + private boolean needResult; + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + super.checkAndStandardize(); + if (StringUtil.isEmpty(taskId)) { + if (StringUtil.isEmpty(jobId) && StringUtil.isEmpty(flowNodeId)) { + throw new StatusCodeWithException("璇锋寚瀹 taskId锛屾垨鑰呮寚瀹 jobId 鍜 flowNodeId銆", StatusCode.PARAMETER_VALUE_INVALID); + } + } + } + + + //region getter/setter + + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getFlowNodeId() { + return flowNodeId; + } + + public void setFlowNodeId(String flowNodeId) { + this.flowNodeId = flowNodeId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public boolean isNeedResult() { + return needResult; + } + + public void setNeedResult(boolean needResult) { + this.needResult = needResult; + } + + //endregion + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/GetFeatureApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/GetFeatureApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..1898a6de27d0f15839a831f25eb37d260985a962 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/GetFeatureApi.java" @@ -0,0 +1,114 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.job.task; + +import com.welab.wefe.board.service.dto.entity.MemberFeatureInfoModel; +import com.welab.wefe.board.service.service.TaskResultService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author lonnie + */ +@Api(path = "/flow/job/task/feature", name = "get feature list", desc = "Get the feature column in the output result of feature calculation in the parent node") +public class GetFeatureApi extends AbstractApi { + + @Autowired + TaskResultService taskResultService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + + return success(taskResultService.getResultFeature(input)); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "job鐨刬d") + private String jobId; + + @Check(name = "娴佺▼鐨刬d", require = true) + private String flowId; + + @Check(name = "娴佺▼鑺傜偣id", require = true) + private String flowNodeId; + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getFlowNodeId() { + return flowNodeId; + } + + public void setFlowNodeId(String flowNodeId) { + this.flowNodeId = flowNodeId; + } + } + + public static class Output { + + private boolean hasFeatureStatistic; + + private boolean hasFeatureCalculation; + + List members; + + public boolean isHasFeatureStatistic() { + return hasFeatureStatistic; + } + + public void setHasFeatureStatistic(boolean hasFeatureStatistic) { + this.hasFeatureStatistic = hasFeatureStatistic; + } + + public boolean isHasFeatureCalculation() { + return hasFeatureCalculation; + } + + public void setHasFeatureCalculation(boolean hasFeatureCalculation) { + this.hasFeatureCalculation = hasFeatureCalculation; + } + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/GetResultApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/GetResultApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..a2b76385cb81d45d2b5e57de70bb00e28dee4320 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/GetResultApi.java" @@ -0,0 +1,105 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.job.task; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.welab.wefe.board.service.component.Components; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.dto.entity.job.TaskResultOutputModel; +import com.welab.wefe.board.service.service.TaskService; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; + +/** + * @author zane.luo + */ +@Api(path = "flow/job/task/result", name = "get task result", desc = "Use taskId or flowId + nodeId to get the node execution result.") +public class GetResultApi extends AbstractApi> { + + @Autowired + private TaskService taskService; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + + List tasks = taskService.findAll(input); + if (tasks == null || tasks.isEmpty()) { + return success(); + } + List results = new ArrayList<>(); + Set temp = new HashSet<>(); + for (TaskMySqlModel task : tasks) { + String taskConf = task.getTaskConf(); + JObject taskConfigJson = JObject.create(taskConf); + TaskResultOutputModel result = Components.get(task.getTaskType()).getTaskResult(task.getTaskId(), + input.type); + if (result == null) { + result = new TaskResultOutputModel(); + } + // put task info to TaskResultOutputModel + result.setStatus(task.getStatus()); + result.setStartTime(task.getStartTime()); + result.setFinishTime(task.getFinishTime()); + result.setMessage(task.getMessage()); + result.setErrorCause(task.getErrorCause()); + result.setPosition(task.getPosition()); + result.setSpend(task.getSpend()); + result.setMembers(taskConfigJson.getJObject("task").getJSONList("members")); + if (result.getResult() != null && !temp.add(result.getResult().toJSONString()) && task.getRole() == JobMemberRole.provider + && (task.getTaskType() == ComponentType.MixStatistic + || task.getTaskType() == ComponentType.MixBinning + || task.getTaskType() == ComponentType.FillMissingValue + || task.getTaskType() == ComponentType.MixLR)) { + continue; + } + results.add(result); + } + + return success(results); + } + + public static class Input extends DetailApi.Input { + + @Check(name = "缁撴灉绫诲瀷") + private String type; + + // region getter/setter + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + // endregion + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/GetResultHistoryApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/GetResultHistoryApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..810b0a847a991da8b4749fadf5327f0ee4ecbd69 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/GetResultHistoryApi.java" @@ -0,0 +1,135 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.job.task; + +import com.welab.wefe.board.service.component.Components; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.dto.entity.job.TaskResultOutputModel; +import com.welab.wefe.board.service.service.TaskService; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author zane.luo + */ +@Api(path = "flow/job/task/result_history", name = "Get all historical execution results of task") +public class GetResultHistoryApi extends AbstractApi { + + @Autowired + private TaskService taskService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + + List tasks = taskService.findTaskHistory(input.flowId, input.flowNodeId, input.role); + + List list = new ArrayList<>(); + + for (TaskMySqlModel task : tasks) { + TaskResultOutputModel result = Components + .get(task.getTaskType()) + .getTaskResult(task.getTaskId(), input.type); + + if (result == null) { + result = ModelMapper.map(task, TaskResultOutputModel.class); + result.setComponentType(task.getTaskType()); + } + + // put task info to TaskResultOutputModel + result.setJobId(task.getJobId()); + result.setStatus(task.getStatus()); + result.setStartTime(task.getStartTime()); + result.setFinishTime(task.getFinishTime()); + result.setMessage(task.getMessage()); + result.setErrorCause(task.getErrorCause()); + result.setPosition(task.getPosition()); + result.setSpend(task.getSpend()); + + list.add(result); + } + + return success(new Output(list)); + } + + + public static class Input extends AbstractApiInput { + + @Check(name = "娴佺▼Id", require = true) + private String flowId; + @Check(name = "鑺傜偣Id", require = true) + private String flowNodeId; + @Check(name = "瑙掕壊", require = true) + private JobMemberRole role; + @Check(name = "缁撴灉绫诲瀷") + private String type; + + //region getter/setter + + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getFlowNodeId() { + return flowNodeId; + } + + public void setFlowNodeId(String flowNodeId) { + this.flowNodeId = flowNodeId; + } + + public JobMemberRole getRole() { + return role; + } + + public void setRole(JobMemberRole role) { + this.role = role; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + //endregion + } + + public static class Output { + public List list; + + public Output(List list) { + this.list = list; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/SelectFeatureApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/SelectFeatureApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..3750023849e9a0b413fc02ec21f5b44fba5fe706 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/SelectFeatureApi.java" @@ -0,0 +1,238 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.job.task; + +import com.welab.wefe.board.service.service.TaskResultService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author lonnie + */ +@Api( + path = "/flow/job/task/select", + name = "filter features", + desc = "Through the passed cv/iv value and feature rate, select the features that meet the conditions" +) +public class SelectFeatureApi extends AbstractApi { + + @Autowired + private TaskResultService taskResultService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + + return success(taskResultService.selectFeature(input)); + } + + public enum SelectType { + /** + * cv/iv + */ + cv_iv, + + /** + * + */ + miss_rate, + + /** + */ + manual, + } + + public static class Input extends AbstractApiInput { + + @Check(name = "job鐨刬d") + private String jobId; + + @Check(name = "娴佺▼id", require = true) + private String flowId; + + @Check(name = "娴佺▼鑺傜偣id", require = true) + private String flowNodeId; + + private double cv; + + private double iv; + + private double missRate; + + @Check(name = "绛涢夋柟寮", require = true) + private SelectType selectType; + + @Check(name = "鎴愬憳淇℃伅", require = true) + private List members; + + public static class MemberModel extends AbstractCheckModel { + private String memberId; + + private String memberName; + + private JobMemberRole memberRole; + + private double cv; + + private double iv; + + private double missRate; + + private String name; + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getMemberName() { + return memberName; + } + + public void setMemberName(String memberName) { + this.memberName = memberName; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + public double getCv() { + return cv; + } + + public void setCv(double cv) { + this.cv = cv; + } + + public double getIv() { + return iv; + } + + public void setIv(double iv) { + this.iv = iv; + } + + public double getMissRate() { + return missRate; + } + + public void setMissRate(double missRate) { + this.missRate = missRate; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getFlowNodeId() { + return flowNodeId; + } + + public void setFlowNodeId(String flowNodeId) { + this.flowNodeId = flowNodeId; + } + + public double getCv() { + return cv; + } + + public void setCv(double cv) { + this.cv = cv; + } + + public double getIv() { + return iv; + } + + public void setIv(double iv) { + this.iv = iv; + } + + public double getMissRate() { + return missRate; + } + + public void setMissRate(double missRate) { + this.missRate = missRate; + } + + public SelectType getSelectType() { + return selectType; + } + + public void setSelectType(SelectType selectType) { + this.selectType = selectType; + } + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + super.checkAndStandardize(); + if (StringUtil.isEmpty(jobId)) { + throw new StatusCodeWithException("娌℃湁浠诲姟id锛岃鍏堟墽琛屾祦绋嬶紝鍚庤繘琛岀瓫閫夈", StatusCode.PARAMETER_VALUE_INVALID); + } + } + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/TaskProgressDetailApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/TaskProgressDetailApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..c9652df226739cda05ca94ecfb42b04916c373be --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/TaskProgressDetailApi.java" @@ -0,0 +1,73 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.job.task; + +import com.welab.wefe.board.service.database.entity.job.TaskProgressMysqlModel; +import com.welab.wefe.board.service.dto.entity.job.TaskProgressOuputModel; +import com.welab.wefe.board.service.service.TaskProgressService; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author lonnie + */ +@Api(path = "task/progress/detail", name = "task progress details") +public class TaskProgressDetailApi extends AbstractApi { + + @Autowired + private TaskProgressService taskProgressService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + + TaskProgressMysqlModel taskProgress = taskProgressService.findOne(input.getTaskId(), input.getMemberRole()); + TaskProgressOuputModel output = ModelMapper.map(taskProgress, TaskProgressOuputModel.class); + return success(output); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "浠诲姟id", require = true) + private String taskId; + + @Check(name = "瑙掕壊", require = true) + private JobMemberRole memberRole; + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/test/detail.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/test/detail.http" new file mode 100644 index 0000000000000000000000000000000000000000..67ae103c9b3875c123e0316afcfce10b434ea110 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/test/detail.http" @@ -0,0 +1,7 @@ +POST {{baseUrl}}/flow/job/task/detail +Content-Type: application/json + +{ + "flow_id": "8400fcaac79e4aa0b4ddff45c4ff6dea", + "flow_node_id": "16099137605825112" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/test/getFeature.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/test/getFeature.http" new file mode 100644 index 0000000000000000000000000000000000000000..b623df0266d7ca0d9b6813475ff7dee50746f0f8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/test/getFeature.http" @@ -0,0 +1,10 @@ +POST {{baseUrl}}/flow/job/task/feature +Content-Type: application/json + +{ + "job_id": "a6e1f7a9dfd349688ccde5f707b4db86", + "flow_id": "6b25864fa5c84be0af83ddf4a12e78bb", + "flow_node_id": "16124192335523646" +} + +### diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/test/result.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/test/result.http" new file mode 100644 index 0000000000000000000000000000000000000000..23f28f0b339ba68605fd09c3c959493421f89112 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/test/result.http" @@ -0,0 +1,11 @@ +POST {{baseUrl}}/flow/job/task/result +Content-Type: application/json + +{ + "jobId": "69e6df7d606c470a83dadf4ddd41d8d9", + "flowId": "a2e07682b5d74eaab1e0227743e6dbd2 ", + "flowNodeId": "16167496011639956", + "type": "ks" +} + +### \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/test/selectFeature.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/test/selectFeature.http" new file mode 100644 index 0000000000000000000000000000000000000000..7f7bbac6357b8599ebe7ad1edf145e2a7eafeca2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/test/selectFeature.http" @@ -0,0 +1,147 @@ +POST {{baseUrl}}/flow/job/task/select +Content-Type: application/json + +{ + "job_id": "89e2733bb05e4463a8eb9cb4b322449d", + "flow_id": "6b25864fa5c84be0af83ddf4a12e78bb", + "flow_node_id": "16106025400141554", + "select_type": "cv_iv", + "cv": 0.1, + "iv": 0.02, + "members": [ + { + "member_role": "promoter", + "member_id": "269330b21e1342b48124303e55c75ce0", + "features": [ + { + "name": "x8" + + }, + { + "name": "x9" + + }, + { + "name": "x0" + + }, + { + "name": "x1" + + }, + { + "name": "x2" + + }, + { + "name": "x3" + + }, + { + "name": "x4" + + }, + { + "name": "x5" + + }, + { + "name": "x6" + + }, + { + "name": "x7" + + } + ] + }, + { + "member_role": "provider", + "member_id": "682d087e965a4c5d8a2807a772a571c1", + "features": [ + { + "name": "x8" + + }, + { + "name": "x19" + + }, + { + "name": "x9" + + }, + { + "name": "x10" + + }, + { + "name": "x0" + + }, + { + "name": "x12" + + }, + { + "name": "x1" + + }, + { + "name": "x11" + + }, + { + "name": "x2" + + }, + { + "name": "x14" + + }, + { + "name": "x3" + + }, + { + "name": "x13" + + }, + { + "name": "x16" + + }, + { + "name": "x4" + + }, + { + "name": "x5" + + }, + { + "name": "x15" + + }, + { + "name": "x6" + + }, + { + "name": "x18" + + }, + { + "name": "x7" + + }, + { + "name": "x17" + + } + ] + } + ] +} + +### diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/test/task_progress_detail.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/test/task_progress_detail.http" new file mode 100644 index 0000000000000000000000000000000000000000..1ba048ba6d05159f7a05d7df8dab7b3b6ab8347c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/task/test/task_progress_detail.http" @@ -0,0 +1,9 @@ +POST {{baseUrl}}/task/progress/detail +Content-Type: application/json + +{ + "task_id": "232d57369945464cbd4aa054dc8608a0_promoter_DataIO_16185344762495381", + "member_role": "promoter" +} + +### diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/detail.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/detail.http" new file mode 100644 index 0000000000000000000000000000000000000000..4fd794bc00f3e84169496d68a43b732d37d685cb --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/detail.http" @@ -0,0 +1,21 @@ +POST {{baseUrl}}/flow/job/detail +Content-Type: application/json + +{ + "jobId": "2e8874e5cd5547088688add0039c60d6", + "flowId": "6b25864fa5c84be0af83ddf4a12e78bb", + "member_role": "promoter" +} + + + +### + +POST {{baseUrl}}/flow/job/detail +Content-Type: application/json + +{ + "jobId": "2e8874e5cd5547088688add0039c60d6", + "flowId": "6b25864fa5c84be0af83ddf4a12e78bb", + "needResult": true +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/getl-progress.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/getl-progress.http" new file mode 100644 index 0000000000000000000000000000000000000000..2db5b05f0add66bbdcb90ba14af430bda1f8dfc4 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/getl-progress.http" @@ -0,0 +1,6 @@ +POST {{baseUrl}}/flow/job/get_progress +Content-Type: application/json + +{ + "jobId": "ae2bc9747e4c430281d80868bff15a17" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/log-download.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/log-download.http" new file mode 100644 index 0000000000000000000000000000000000000000..acd3b48a46afb23af93e1f802c4265f9e5a57772 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/log-download.http" @@ -0,0 +1,6 @@ +POST {{baseUrl}}/job/log/download +Content-Type: application/json + +{ + "jobId": "2e8874e5cd5547088688add0039c60d6" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/preview.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/preview.http" new file mode 100644 index 0000000000000000000000000000000000000000..38e01950120b61a0597f3217b64dea31fceb37e5 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/preview.http" @@ -0,0 +1,7 @@ +POST {{baseUrl}}/project/flow/job/preview +Content-Type: application/json + +{ + "flow_id": "b0f3ce028c1d44c9a9a1a3e3a74fa71a", + "use_cache": true +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/query.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/query.http" new file mode 100644 index 0000000000000000000000000000000000000000..3488608558cc27a2d40fed709947cad93f56eb80 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/query.http" @@ -0,0 +1,28 @@ +POST {{baseUrl}}/flow/job/query +Content-Type: application/json + +{ + "flow_id": "015d34e5192e4831a4d6ea321a3584a5", + "job_id": "10d421d323974914ad5a934f1c159a21" +} + + +### + +POST {{baseUrl}}/flow/job/query +Content-Type: application/json + +{ + "flow_id": "6b25864fa5c84be0af83ddf4a12e78bb", + "name": "鍑瓙" +} + +### + +POST {{baseUrl}}/flow/job/query +Content-Type: application/json + +{ + "flow_id": "6b25864fa5c84be0af83ddf4a12e78bb", + "status": "success" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/stop.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/stop.http" new file mode 100644 index 0000000000000000000000000000000000000000..97fe815e0ce7ab5c41d9a3be4fc7fcb2b426c9fe --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/stop.http" @@ -0,0 +1,6 @@ +POST {{baseUrl}}/flow/job/stop +Content-Type: application/json + +{ + "jobId": "50ffb03622f24aab8c66306417ffa559" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/view-dataset.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/view-dataset.http" new file mode 100644 index 0000000000000000000000000000000000000000..f4a082650c771ac823ad0ca414d4961a83ca89b1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/job/test/view-dataset.http" @@ -0,0 +1,8 @@ +POST {{baseUrl}}/job/data_set/view +Content-Type: application/json + +{ + "job_id":"18bc3d0dde244035ba9a8dc16fd58fae", + "node_id": "16196070742596633", + "member_role": "promoter" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/AddApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/AddApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..1cc51bbc9704efaf5ca220e83a5910552e1c1006 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/AddApi.java" @@ -0,0 +1,90 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.member; + +import com.welab.wefe.board.service.dto.entity.ProjectMemberInput; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.board.service.service.ProjectMemberService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author zane.luo + */ +@Api(path = "project/member/add", name = "add project member") +public class AddApi extends AbstractNoneOutputApi { + + @Autowired + private ProjectMemberService service; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + service.addMember(input); + return success(); + } + + + public static class Input extends AbstractApiInput { + + @Check(name = "椤圭洰ID", require = true) + private String projectId; + + @Check(name = "鍚堜綔鏂瑰垪琛", require = true) + private List memberList; + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public List getMemberList() { + return memberList; + } + + public void setMemberList(List memberList) { + this.memberList = memberList; + } + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + super.checkAndStandardize(); + + if (CollectionUtils.isEmpty(memberList)) { + throw new StatusCodeWithException("璇烽夋嫨鎴愬憳锛", StatusCode.PARAMETER_VALUE_INVALID); + } + + for (ProjectMemberInput item : memberList) { + if (CacheObjects.getMemberName(item.getMemberId()) == null) { + throw new StatusCodeWithException("閿欒鐨 memberId锛" + item.getMemberId(), StatusCode.PARAMETER_VALUE_INVALID); + } + } + } + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/ExitProjectApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/ExitProjectApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..33b0df2c408ba860f724e977d847404e44d404ed --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/ExitProjectApi.java" @@ -0,0 +1,56 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.member; + +import com.welab.wefe.board.service.service.ProjectService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "project/exit", name = "閫鍑洪」鐩", desc = "exit project") +public class ExitProjectApi extends AbstractNoneOutputApi { + + @Autowired + private ProjectService projectService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + projectService.exitProject(input); + return success(); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "椤圭洰id", require = true) + private String projectId; + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/ListAllApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/ListAllApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..37a4888704c7f96d6ff99cc47b8cf07f4181df34 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/ListAllApi.java" @@ -0,0 +1,88 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.member; + +import com.welab.wefe.board.service.database.repository.ProjectMemberRepository; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author zane.luo + */ +@Api(path = "project/member/all", name = "Get a list of all the members who work with me") +public class ListAllApi extends AbstractApi { + + @Autowired + private ProjectMemberRepository projectMemberRepository; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + List list = projectMemberRepository.listAllMemberId(); + + List output = list + .parallelStream() + .map(x -> new Member(x, CacheObjects.getMemberName(x))) + .filter(x -> StringUtil.isNotEmpty(x.memberName)) + .sorted(Comparator.comparing(x -> x.memberName == null ? "" : x.memberName)) + .collect(Collectors.toList()); + + return success(new Output(output)); + } + + public static class Input extends AbstractApiInput { + + } + + public static class Output { + private List list; + + public Output(List list) { + this.list = list; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + } + + public static class Member { + public String memberId; + public String memberName; + + public Member() { + } + + public Member(String memberId, String memberName) { + this.memberId = memberId; + this.memberName = memberName; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/ListApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/ListApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..f5282f835dad39e62465a6835e53c24f200588e0 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/ListApi.java" @@ -0,0 +1,105 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.member; + +import com.welab.wefe.board.service.database.entity.job.ProjectMemberMySqlModel; +import com.welab.wefe.board.service.dto.entity.project.ProjectMemberOutputModel; +import com.welab.wefe.board.service.service.ProjectMemberService; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author zane.luo + */ +@Api(path = "project/member/list", name = "Get the list of members in the project") +public class ListApi extends AbstractApi { + + @Autowired + private ProjectMemberService projectMemberService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + List list = projectMemberService.findList(input); + + List output = list + .parallelStream() + .map(x -> ModelMapper.map(x, ProjectMemberOutputModel.class)) + .collect(Collectors.toList()); + + return success(new Output(output)); + } + + public static class Input extends AbstractApiInput { + + public Input() { + + } + + public Input(String projectId) { + this.projectId = projectId; + } + + @Check(name = "椤圭洰Id", require = true) + private String projectId; + + private String ootJobId; + + //region getter/setter + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getOotJobId() { + return ootJobId; + } + + public void setOotJobId(String ootJobId) { + this.ootJobId = ootJobId; + } + //endregion + } + + public static class Output { + private List list; + + public Output(List list) { + this.list = list; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/OnlineCheckApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/OnlineCheckApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..4c987f367ffcd91c519d8dead5f055d0804b9863 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/OnlineCheckApi.java" @@ -0,0 +1,85 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.member; + +import com.welab.wefe.board.service.service.ServiceCheckService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author lonnie + */ +@Api( + path = "project/member/online_check", + name = "Check if the gateway and board of other members are connected" +) +public class OnlineCheckApi extends AbstractApi { + + @Autowired + private ServiceCheckService serviceCheckService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + + List checkResultList = serviceCheckService.gatewayOnlineCheck(input.isLocal(), input.getProjectId(), input.getMemberIds()); + + return success(JObject.create().append("result", checkResultList)); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "椤圭洰id") + private String projectId; + + @Check(name = "鏄惁鏄湰鍦") + private boolean local; + + private List memberIds; + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public boolean isLocal() { + return local; + } + + public void setLocal(boolean local) { + this.local = local; + } + + public List getMemberIds() { + return memberIds; + } + + public void setMemberIds(List memberIds) { + this.memberIds = memberIds; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/RemoveApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/RemoveApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..be91746fb815a41a32cc4e99b6dff28664a05b48 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/RemoveApi.java" @@ -0,0 +1,86 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.member; + +import com.welab.wefe.board.service.service.ProjectService; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "project/member/remove", name = "remove project member") +public class RemoveApi extends AbstractNoneOutputApi { + + @Autowired + ProjectService service; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + service.removeMember(input); + return success(); + } + + + public static class Input extends AbstractApiInput { + @Check(name = "椤圭洰ID", require = true) + private String projectId; + + @Check(name = "鎴愬憳ID", require = true) + private String memberId; + + @Check(name = "鎴愬憳瑙掕壊", require = true, desc = "鐢变簬瀛樺湪鑷繁鍜岃嚜宸辫仈閭︾殑鎯呭喌锛屾墍浠ラ渶瑕佹寚瀹氳鑹层") + private JobMemberRole memberRole; + + + //region getter/setter + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + //endregion + + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/audit/AuditApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/audit/AuditApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..be07f0f54808a11b11b164fcc0521fba04dd595c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/audit/AuditApi.java" @@ -0,0 +1,104 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.member.audit; + +import com.welab.wefe.board.service.service.ProjectMemberAuditService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "project/member/add/audit", name = "audit newly added project members") +public class AuditApi extends AbstractNoneOutputApi { + + @Autowired + ProjectMemberAuditService projectMemberAuditService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + projectMemberAuditService.auditMember(input); + return success(); + } + + public static class Input extends AbstractApiInput { + @Check(name = "椤圭洰ID", require = true) + private String projectId; + + @Check(name = "琚鏍哥殑鎴愬憳ID", require = true) + private String memberId; + + @Check(name = "瀹℃牳缁撴灉", require = true) + private AuditStatus auditResult; + + @Check(name = "瀹℃壒鎰忚") + private String auditComment; + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + super.checkAndStandardize(); + if (auditResult == AuditStatus.disagree && StringUtil.isEmpty(auditComment)) { + throw new StatusCodeWithException("璇烽檲杩版偍鎷掔粷鐨勭悊鐢", StatusCode.PARAMETER_VALUE_INVALID); + } + } + + //region getter/setter + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public AuditStatus getAuditResult() { + return auditResult; + } + + public void setAuditResult(AuditStatus auditResult) { + this.auditResult = auditResult; + } + + public String getAuditComment() { + return auditComment; + } + + public void setAuditComment(String auditComment) { + this.auditComment = auditComment; + } + + //endregion + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/audit/ListApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/audit/ListApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..7feae7c446f2d27c4de9cad11c06f81002306332 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/audit/ListApi.java" @@ -0,0 +1,100 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.member.audit; + +import com.welab.wefe.board.service.database.entity.job.ProjectMemberAuditMySqlModel; +import com.welab.wefe.board.service.dto.entity.ProjectMemberAuditOutput; +import com.welab.wefe.board.service.service.ProjectMemberAuditService; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author zane.luo + */ +@Api(path = "project/member/add/audit/list", name = "Get the review status of new members in the project") +public class ListApi extends AbstractApi { + + @Autowired + private ProjectMemberAuditService projectMemberAuditService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + List list = projectMemberAuditService.listAll(input.projectId, input.memberId); + + List output = list + .parallelStream() + .map(x -> ModelMapper.map(x, ProjectMemberAuditOutput.class)) + .collect(Collectors.toList()); + + return success(new Output(output)); + } + + public static class Input extends AbstractApiInput { + @Check(name = "椤圭洰Id", require = true) + private String projectId; + + @Check(name = "鎴愬憳Id", desc = "褰撴垚鍛 Id 涓虹┖鏃舵煡鎵鏈夋垚鍛") + private String memberId; + + + //region getter/setter + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + + //endregion + } + + public static class Output { + private List list; + + public Output(List list) { + this.list = list; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/audit/test/list.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/audit/test/list.http" new file mode 100644 index 0000000000000000000000000000000000000000..b3d7828e9d855fd6abe7d1bfdd6448eb71a29370 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/audit/test/list.http" @@ -0,0 +1,6 @@ +POST {{baseUrl}}/project/member/add/audit/list +Content-Type: application/json + +{ + "projectId": "860a5add81a745109933cd1ff9a9ca4c" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/test/add.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/test/add.http" new file mode 100644 index 0000000000000000000000000000000000000000..dfa5994a35f89347d050f9b53eddad392971072b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/test/add.http" @@ -0,0 +1,13 @@ +POST {{baseUrl}}/project/member/add +Content-Type: application/json + +{ + "project_id": "3a53a880343a4720829b9deaf4aca160", + "memberList": [ + { + "member_id": "682d087e965a4c5d8a2807a772a571c1", + "member_name": "寮熶緷鍋庨浂鍥", + "member_role": "provider" + } + ] +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/test/all.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/test/all.http" new file mode 100644 index 0000000000000000000000000000000000000000..1adbfdb66f2cdeb5329bf964cc5e472d282eacf7 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/test/all.http" @@ -0,0 +1,5 @@ +POST {{baseUrl}}/project/member/all +Content-Type: application/json + +{ +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/test/list.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/test/list.http" new file mode 100644 index 0000000000000000000000000000000000000000..0babbfef2c37f7ae7c6490f85d87155dd5766d8d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/test/list.http" @@ -0,0 +1,6 @@ +POST {{baseUrl}}/project/member/list +Content-Type: application/json + +{ + "projectId": "cc5c169e573e4e75a1aeff3833e17171" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/test/onlineCheck.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/test/onlineCheck.http" new file mode 100644 index 0000000000000000000000000000000000000000..ccf0c1a05b029873a4aedd60b88d998af20e0979 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/test/onlineCheck.http" @@ -0,0 +1,8 @@ +POST {{baseUrl}}/project/member/online_check +Content-Type: application/json + +{ + "projectId": "e151cbc676f344c6ba257d46f9992c9c" +} + +### diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/test/remove.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/test/remove.http" new file mode 100644 index 0000000000000000000000000000000000000000..4b0a827960328c3fe373d88b57b96c4bb6566332 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/member/test/remove.http" @@ -0,0 +1,8 @@ +POST {{baseUrl}}/project/member/remove +Content-Type: application/json + +{ + "project_id": "675de29f56344fc9b757973f55bb7980", + "member_id": "682d087e965a4c5d8a2807a772a571c1", + "member_role": "provider" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/modeling/DetailApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/modeling/DetailApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..e47600051ea6b7562e83222d4580b44061bc0405 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/modeling/DetailApi.java" @@ -0,0 +1,47 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.modeling; + +import com.welab.wefe.board.service.api.project.job.task.GetResultApi; +import com.welab.wefe.board.service.dto.entity.job.TaskResultOutputModel; +import com.welab.wefe.board.service.service.ProjectFlowService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author lonnie.ren + */ +@Api(path = "project/modeling/detail", name = "get modeling detail") +public class DetailApi extends AbstractApi { + + @Autowired + private ProjectFlowService projectFlowService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + TaskResultOutputModel outputModel = projectFlowService.findModelingResult(input); + + return success(outputModel); + } + + public static class Input extends GetResultApi.Input { + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/modeling/QueryApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/modeling/QueryApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..1d3f761065a527175d9e31e46243fd6810d48990 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/modeling/QueryApi.java" @@ -0,0 +1,99 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.modeling; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.modeling_config.ModelingInfoOutputModel; +import com.welab.wefe.board.service.service.ProjectFlowService; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "project/modeling/query", name = "query modeling by pagination") +public class QueryApi extends AbstractApi> { + + @Autowired + private ProjectFlowService projectFlowService; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + + return success(projectFlowService.queryModelingInfo(input)); + } + + public static class Input extends PagingInput { + + public Input() { + } + + public Input(String projectId) { + this.projectId = projectId; + } + + @Check(name = "椤圭洰id", require = true) + private String projectId; + + @Check(name = "浠诲姟id") + private String jobId; + + @Check(name = "娴佺▼id") + private String flowId; + + @Check(name = "缁勪欢绫诲瀷") + private ComponentType componentType; + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public ComponentType getComponentType() { + return componentType; + } + + public void setComponentType(ComponentType componentType) { + this.componentType = componentType; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/modeling/test/detail.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/modeling/test/detail.http" new file mode 100644 index 0000000000000000000000000000000000000000..a82b26d07d54826b376c9b7237765b071f60897d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/modeling/test/detail.http" @@ -0,0 +1,11 @@ +POST {{baseUrl}}/project/modeling/detail +Content-Type: application/json + +{ + "jobId": "ac44d921de1146ac947ccfa862cdc632", + "flowNodeId":"16158855548416030", + "taskId":"ac44d921de1146ac947ccfa862cdc632_HorzLR_16158855548416030", + "type": "ks" +} + +### diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/modeling/test/query.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/modeling/test/query.http" new file mode 100644 index 0000000000000000000000000000000000000000..ba8da4e677aee7d1493e6919444b049cdaa4f9bf --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/modeling/test/query.http" @@ -0,0 +1,9 @@ +POST {{baseUrl}}/project/modeling/query +Content-Type: application/json + +{ + "projectId": "ac6c60a15875487f8b32864512920653", + "componentType":"HorzLR" +} + +### diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/node/CheckExistEvaluationComponentApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/node/CheckExistEvaluationComponentApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..621e32a9718af36c8635381738f0d7947df71cc5 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/node/CheckExistEvaluationComponentApi.java" @@ -0,0 +1,120 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.node; + +import com.welab.wefe.board.service.service.ProjectFlowNodeService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.AbstractApiOutput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Check whether there are evaluation components in the process + *

+ * Scenario: when the [scoring verification] component is dragged out in non OOT mode, if there is no [model evaluation] component before it, + * the input parameters of the [scoring verification] component must include the input parameters of [model evaluation], otherwise it is not used; In the OOT mode, if the original process does not have a [model evaluation] component, the input parameters of the [scoring verification] component should include the input parameters of [model evaluation], otherwise it is not used. Since it is difficult for the front end to judge whether the [model evaluation] component exists in the front node of the [scoring verification] component, + * it can only be placed on the back end, so this interface is generated + *

+ * PS锛歄OT mode: click scoring verification in the model list to enter the canvas scene, that is, + * OOT mode (there are only two components: start and scoring verification). + *

+ * + * @author aaron.li + **/ +@Api(path = "project/flow/node/check_exist_evaluation_component", name = "Check whether there are evaluation components in the process") +public class CheckExistEvaluationComponentApi extends AbstractApi { + @Autowired + private ProjectFlowNodeService projectFlowNodeService; + + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + Output out = new Output(); + out.setCheckResult(projectFlowNodeService.checkExistEvaluationComponent(input)); + return success(out); + } + + public static class Input extends AbstractApiInput { + /** + * This parameter is used in non OOT mode + */ + private String flowId; + + /** + * The OOT component ID on the canvas (mainly used to find the front node and the OOT node on the canvas. This parameter is used in non OOT mode) + */ + private String nodeId; + /** + * Original model job ID (this parameter is used in OOT mode) + */ + private String jobId; + /** + * Original model node ID (this parameter is used in OOT mode) + */ + private String modelNodeId; + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getNodeId() { + return nodeId; + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getModelNodeId() { + return modelNodeId; + } + + public void setModelNodeId(String modelNodeId) { + this.modelNodeId = modelNodeId; + } + } + + public static class Output extends AbstractApiOutput { + /** + * check result + */ + private boolean checkResult; + + public boolean isCheckResult() { + return checkResult; + } + + public void setCheckResult(boolean checkResult) { + this.checkResult = checkResult; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/node/DetailApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/node/DetailApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..aaad178b3cffe7732bc01eb8889e5deed8fb7bb2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/node/DetailApi.java" @@ -0,0 +1,75 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.node; + +import com.welab.wefe.board.service.database.entity.job.ProjectFlowNodeMySqlModel; +import com.welab.wefe.board.service.dto.entity.job.ProjectFlowNodeOutputModel; +import com.welab.wefe.board.service.service.ProjectFlowNodeService; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "project/flow/node/detail", name = "get node detail") +public class DetailApi extends AbstractApi { + + @Autowired + private ProjectFlowNodeService projectFlowNodeService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + ProjectFlowNodeMySqlModel one = projectFlowNodeService.findOne(input.flowId, input.nodeId); + + if (one == null) { + return success(); + } + return success(ModelMapper.map(one, ProjectFlowNodeOutputModel.class)); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "娴佺▼id", require = true) + private String flowId; + + @Check(name = "鑺傜偣id", require = true) + private String nodeId; + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getNodeId() { + return nodeId; + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/node/UpdateApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/node/UpdateApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..fd3cd489c87b7ebac2bc2528b4fd6e3895390e78 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/node/UpdateApi.java" @@ -0,0 +1,118 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.node; + +import com.welab.wefe.board.service.dto.entity.job.ProjectFlowNodeOutputModel; +import com.welab.wefe.board.service.service.ProjectFlowNodeService; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author zane.luo + */ +@Api(path = "project/flow/node/update", name = "update node info") +public class UpdateApi extends AbstractApi { + + @Autowired + private ProjectFlowNodeService projectFlowNodeService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + return success(new Output(projectFlowNodeService.updateFlowNode(input))); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "娴佺▼id", require = true) + private String flowId; + + @Check(name = "鑺傜偣ID", require = true) + private String nodeId; + + @Check(name = "缁勪欢绫诲瀷", require = true) + private ComponentType componentType; + + @Check(name = "缁勪欢鍙傛暟", require = true, blockXss = false) + private String params; + + + //region getter/setter + + + public ComponentType getComponentType() { + return componentType; + } + + public void setComponentType(ComponentType componentType) { + this.componentType = componentType; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getNodeId() { + return nodeId; + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + public String getParams() { + return params; + } + + public void setParams(String params) { + this.params = params; + } + + + //endregion + } + + public static class Output { + + public Output(List paramsIsNullFlowNodes) { + this.paramsIsNullFlowNodes = paramsIsNullFlowNodes; + } + + private List paramsIsNullFlowNodes; + + public List getParamsIsNullFlowNodes() { + return paramsIsNullFlowNodes; + } + + public void setParamsIsNullFlowNodes(List paramsIsNullFlowNodes) { + this.paramsIsNullFlowNodes = paramsIsNullFlowNodes; + } + } + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/node/test/detail.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/node/test/detail.http" new file mode 100644 index 0000000000000000000000000000000000000000..f7135f445f90987cb6027b51c9fd1d8e047ed39b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/node/test/detail.http" @@ -0,0 +1,13 @@ +POST {{baseUrl}}/project/flow/node/detail +Content-Type: application/json + +{ + "flow_id": "a9632fcc436f4400bba1726532475f7b", + "nodeId": "1608695123123294703624" +} + + + +### + +GET {{baseUrl}}/project/flow/node/detail?nodeId=16088884188236603&flow_id=a9632fcc436f4400bba1726532475f7b \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/node/test/update.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/node/test/update.http" new file mode 100644 index 0000000000000000000000000000000000000000..3051b82d698d4d73e634e44a8e23dd98e1e9b36a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/node/test/update.http" @@ -0,0 +1,67 @@ +POST {{baseUrl}}/project/flow/node/update +Content-Type: application/json + + +{ + "nodeId": "16100034352598215", + "componentType": "Intersection", + "flow_id": "6b25864fa5c84be0af83ddf4a12e78bb", + "params": { + "intersect_method": "dh", + "save_dataset": true + } +} + + + +### 鑷姩鍒涘缓 + +GET {{baseUrl}}/project/flow/node/update?nodeId=16088878120465932&componentType=FeatureStatistic&flow_id=a9632fcc436f4400bba1726532475f7b + + +### debug + +POST {{baseUrl}}/project/flow/node/update +Content-Type: application/json + + +{ + "nodeId": "16088893089992860", + "componentType": "FeatureStatistic", + "flow_id": "a9632fcc436f4400bba1726532475f7b", + "params": { + "featureMethods": [ + { + "name": "Max", + "value": "" + }, + { + "name": "Min", + "value": "" + }, + { + "name": "Percentile", + "value": 50 + } + ], + "members": [ + { + "memberId": "682d087e965a4c5d8a2807a772a571c1", + "features": [ + "x4", + "x5", + "x6", + "x7" + ] + }, + { + "memberId": "269330b21e1342b48124303e55c75ce0", + "features": [ + "id", + "y", + "x1" + ] + } + ] + } +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/AddApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/AddApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..70f71f5f49739f294f5e8b7c014c084456fa97e2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/AddApi.java" @@ -0,0 +1,208 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.project; + +import com.welab.wefe.board.service.database.entity.job.ProjectMySqlModel; +import com.welab.wefe.board.service.database.repository.ProjectRepository; +import com.welab.wefe.board.service.dto.entity.ProjectDataSetInput; +import com.welab.wefe.board.service.dto.entity.ProjectMemberInput; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.board.service.service.ProjectService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.Launcher; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @author zane.luo + */ +@Api(path = "project/add", name = "add new project") +public class AddApi extends AbstractApi { + @Autowired + ProjectService service; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + String projectId = service.addProject(input); + return success(new Output(projectId)); + } + + public static class Output { + private String projectId; + + public Output(String projectId) { + this.projectId = projectId; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + } + + public static class Input extends AbstractApiInput { + + @Check(name = "涓氬姟灞傞潰鐨勯」鐩甀D", hiddenForFrontEnd = true) + private String projectId; + @Check(name = "鎵鏈夋垚鍛樺垪琛", hiddenForFrontEnd = true) + private List members; + + @Check(name = "椤圭洰鍚嶇О", require = true) + private String name; + + @Check(name = "椤圭洰鎻忚堪", require = true) + private String desc; + + @Check(name = "promoter 鐨勬暟鎹泦鍒楄〃") + private List promoterDataSetList; + + @Check(name = "鍚堜綔鏂瑰垪琛", require = true) + private List providerList; + + @Check(name = "鍗忎綔鏂瑰垪琛") + private List promoterList; + + @Check(name = "瑙掕壊") + private JobMemberRole role; + + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + super.checkAndStandardize(); + + // Project name cannot be repeated + if (!super.fromGateway()) { + List allByName = Launcher.CONTEXT.getBean(ProjectRepository.class).findAllByName(name); + if (!allByName.isEmpty()) { + StatusCode.PARAMETER_VALUE_INVALID.throwException( + "杩欎釜椤圭洰鍚嶇О宸茬粡琚敤杩囦簡鍝焴 鍐嶆兂涓涓惂~" + ); + } + } + + if (CollectionUtils.isEmpty(providerList)) { + throw new StatusCodeWithException("璇烽夋嫨鍚堜綔鏂", StatusCode.PARAMETER_VALUE_INVALID); + } + Set promoterIds = new HashSet<>(); + // When only one promoter member is allowed, the member is duplicated, + // so it is returned directly, and there is no need to verify later + if (promoterList == null || promoterList.isEmpty() || fromGateway()) { + return; + } + promoterList.forEach(p -> promoterIds.add(p.getMemberId())); + if (promoterList.size() != promoterIds.size()) { + throw new StatusCodeWithException("鍙戣捣鏂规垚鍛樹笉鑳介噸澶", StatusCode.PARAMETER_VALUE_INVALID); + } + if (!fromGateway() && !promoterIds.add(CacheObjects.getMemberId())) { + throw new StatusCodeWithException("鍙戣捣鏂规垚鍛樹笉鑳介噸澶", StatusCode.PARAMETER_VALUE_INVALID); + } + boolean mixFlag = promoterIds.size() >= 2; + for (ProjectMemberInput m : providerList) { + if (promoterIds.contains(m.getMemberId()) && mixFlag) { + throw new StatusCodeWithException("鎴愬憳銆" + CacheObjects.getMemberName(m.getMemberId()) + "銆戜笉鑳介噸澶嶅瓨鍦 ", + StatusCode.PARAMETER_VALUE_INVALID); + } + } + } + + + //region getter/setter + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public List getPromoterDataSetList() { + return promoterDataSetList; + } + + public void setPromoterDataSetList(List promoterDataSetList) { + this.promoterDataSetList = promoterDataSetList; + } + + public List getProviderList() { + return providerList; + } + + public void setProviderList(List providerList) { + this.providerList = providerList; + } + + public List getPromoterList() { + return promoterList; + } + + public void setPromoterList(List promoterList) { + this.promoterList = promoterList; + } + + public JobMemberRole getRole() { + return role; + } + + public void setRole(JobMemberRole role) { + this.role = role; + } + + //endregion + + } + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/AuditApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/AuditApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..c64f3ffae17d3b0aa9d11158006f6139e3d412b1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/AuditApi.java" @@ -0,0 +1,98 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.project; + +import com.welab.wefe.board.service.service.ProjectService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "project/add/audit", name = "Check whether you agree to join a project by yourself") +public class AuditApi extends AbstractNoneOutputApi { + + @Autowired + ProjectService service; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + service.auditProject(input); + return success(); + } + + public static class Input extends AbstractApiInput { + + @Check(name = "椤圭洰id", require = true) + private String projectId; + + @Check(name = "瀹℃牳缁撴灉", require = true) + private AuditStatus auditResult; + + @Check(name = "瀹℃壒鎰忚") + private String auditComment; + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + super.checkAndStandardize(); + if (auditResult == AuditStatus.disagree) { + // Non-empty check + if (StringUtil.isBlank(getAuditComment())) { + throw new StatusCodeWithException("璇峰~鍐欏鎵规剰瑙", StatusCode.PARAMETER_VALUE_INVALID); + } + } + } + + // region getter/setter + + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public AuditStatus getAuditResult() { + return auditResult; + } + + public void setAuditResult(AuditStatus auditResult) { + this.auditResult = auditResult; + } + + public String getAuditComment() { + return auditComment; + } + + public void setAuditComment(String auditComment) { + this.auditComment = auditComment; + } + + // endregion + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/CloseProjectApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/CloseProjectApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..22439ecb086972c18f026b8014c1f6c9fb861fc8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/CloseProjectApi.java" @@ -0,0 +1,55 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.project; + +import com.welab.wefe.board.service.service.ProjectService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author lonnie + */ +@Api(path = "project/close", name = "close project") +public class CloseProjectApi extends AbstractNoneOutputApi { + + @Autowired + private ProjectService projectService; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + projectService.closeProject(input); + return success(); + } + + public static class Input extends AbstractApiInput { + @Check(name = "椤圭洰id", require = true) + private String projectId; + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/CountStatisticsApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/CountStatisticsApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..bc76687cfa39ed1efcd217b87c475b74c9aade02 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/CountStatisticsApi.java" @@ -0,0 +1,86 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.project; + +import com.welab.wefe.board.service.service.ProjectService; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Map; + +/** + * @author zane.luo + */ +@Api(path = "project/count_statistics", name = "Count the number of projects") +public class CountStatisticsApi extends AbstractApi { + + @Autowired + ProjectService projectService; + + @Override + protected ApiResult handle(QueryApi.Input input) throws StatusCodeWithException { + return success(projectService.statistics(input)); + } + + public static class Output { + private long total; + private Map byRole; + private Map byAuditStatus; + + public Output() { + } + + public Output(long total, Map byRole, Map byAuditStatus) { + this.total = total; + this.byRole = byRole; + this.byAuditStatus = byAuditStatus; + } + + //region getter/setter + + public long getTotal() { + return total; + } + + public void setTotal(long total) { + this.total = total; + } + + public Map getByRole() { + return byRole; + } + + public void setByRole(Map byRole) { + this.byRole = byRole; + } + + public Map getByAuditStatus() { + return byAuditStatus; + } + + public void setByAuditStatus(Map byAuditStatus) { + this.byAuditStatus = byAuditStatus; + } + +//endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/DataInfoApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/DataInfoApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..bf767976f0981f63503895a76175ee084edaa688 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/DataInfoApi.java" @@ -0,0 +1,124 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.project; + +import com.welab.wefe.board.service.database.entity.job.*; +import com.welab.wefe.board.service.service.ProjectService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author lonnie + */ +@Api( + path = "project/data/info", + name = "Get the project and the information in the project", + desc = "Get the project and the data set, project members, project process, project process node information in the project." +) +public class DataInfoApi extends AbstractApi { + + @Autowired + private ProjectService projectService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + + return success(projectService.getDataInfo(input)); + } + + public static class Input extends AbstractApiInput { + + public Input() { + + } + + public Input(String project) { + this.projectId = project; + } + + @Check(name = "椤圭洰id", require = true) + private String projectId; + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + } + + public static class Output { + + private ProjectMySqlModel project; + + private List projectMembers; + + private List projectDataSets; + + private List projectFlows; + + private List projectFlowNodes; + + public ProjectMySqlModel getProject() { + return project; + } + + public void setProject(ProjectMySqlModel project) { + this.project = project; + } + + public List getProjectMembers() { + return projectMembers; + } + + public void setProjectMembers(List projectMembers) { + this.projectMembers = projectMembers; + } + + public List getProjectDataSets() { + return projectDataSets; + } + + public void setProjectDataSets(List projectDataSets) { + this.projectDataSets = projectDataSets; + } + + public List getProjectFlows() { + return projectFlows; + } + + public void setProjectFlows(List projectFlows) { + this.projectFlows = projectFlows; + } + + public List getProjectFlowNodes() { + return projectFlowNodes; + } + + public void setProjectFlowNodes(List projectFlowNodes) { + this.projectFlowNodes = projectFlowNodes; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/DetailApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/DetailApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..f5973f04e1cdf234945159538c46be683738db4e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/DetailApi.java" @@ -0,0 +1,56 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.project; + +import com.welab.wefe.board.service.dto.entity.project.ProjectOutputModel; +import com.welab.wefe.board.service.service.ProjectService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "project/detail", name = "Project details") +public class DetailApi extends AbstractApi { + + @Autowired + ProjectService service; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + + return success(service.detail(input.getProjectId())); + } + + public static class Input extends AbstractApiInput { + @Check(name = "椤圭洰涓婚敭", require = true) + private String projectId; + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/QueryApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/QueryApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..0de24ee9396d52b8af9104fe8045d58d1753078a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/QueryApi.java" @@ -0,0 +1,147 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.project; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.project.ProjectQueryOutputModel; +import com.welab.wefe.board.service.service.ProjectService; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author zane.luo + */ +@Api(path = "project/query", name = "Query project list") +public class QueryApi extends AbstractApi> { + + @Autowired + ProjectService service; + + @Override + protected ApiResult> handle(Input input) throws StatusCodeWithException { + return success(service.query(input)); + } + + public static class Input extends PagingInput { + + @Check(name = "椤圭洰鍚嶇О", blockSqlInjection = true) + private String name; + + @Check(name = "鍚堜綔鏂筰d", blockSqlInjection = true) + private String memberId; + + @Check(name = "瀹℃牳鐘舵") + private AuditStatus auditStatus; + + @Check(name = "璧峰鍒涘缓鏃堕棿", blockSqlInjection = true) + private String startCreateTime; + + @Check(name = "缁撴潫鍒涘缓鏃堕棿", blockSqlInjection = true) + private String endCreateTime; + + @Check(name = "鎴戞柟瑙掕壊") + private JobMemberRole myRole; + + @Check(name = "鍙備笌鏂硅鑹") + private JobMemberRole memberRole; + + @Check(name = "鏄惁宸查鍑") + private Boolean exited; + + @Check(name = "鏄惁宸插叧闂") + private Boolean closed; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public AuditStatus getAuditStatus() { + return auditStatus; + } + + public void setAuditStatus(AuditStatus auditStatus) { + this.auditStatus = auditStatus; + } + + public String getStartCreateTime() { + return startCreateTime; + } + + public void setStartCreateTime(String startCreateTime) { + this.startCreateTime = startCreateTime; + } + + public String getEndCreateTime() { + return endCreateTime; + } + + public void setEndCreateTime(String endCreateTime) { + this.endCreateTime = endCreateTime; + } + + public JobMemberRole getMyRole() { + return myRole; + } + + public void setMyRole(JobMemberRole myRole) { + this.myRole = myRole; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + public Boolean getExited() { + return exited; + } + + public void setExited(Boolean exited) { + this.exited = exited; + } + + public Boolean getClosed() { + return closed; + } + + public void setClosed(Boolean closed) { + this.closed = closed; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/UpdateProjectApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/UpdateProjectApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..b5429a353ada2143eaabe529d09bdf30cae21a2a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/UpdateProjectApi.java" @@ -0,0 +1,102 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.project.project; + +import com.welab.wefe.board.service.database.entity.job.ProjectMySqlModel; +import com.welab.wefe.board.service.database.repository.ProjectRepository; +import com.welab.wefe.board.service.service.ProjectService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.Launcher; +import com.welab.wefe.common.web.api.base.AbstractNoneOutputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @author zane.luo + */ +@Api(path = "project/update", name = "update project info") +public class UpdateProjectApi extends AbstractNoneOutputApi { + + @Autowired + ProjectService service; + + @Override + protected ApiResult handler(Input input) throws StatusCodeWithException { + service.updateProject(input); + return success(); + } + + public static class Input extends AbstractApiInput { + @Check(name = "椤圭洰id", require = true) + private String projectId; + + @Check(name = "椤圭洰鍚嶇О", require = true, messageOnEmpty = "璇疯緭鍏ラ」鐩悕绉") + private String name; + + @Check(name = "椤圭洰鎻忚堪") + private String desc; + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + super.checkAndStandardize(); + + // Project name cannot be repeated + if (!super.fromGateway()) { + List allByName = Launcher.CONTEXT.getBean(ProjectRepository.class).findAllByName(name); + if (!allByName.isEmpty()) { + if (allByName.size() > 1 || !allByName.get(0).getProjectId().equals(projectId)) { + StatusCode.PARAMETER_VALUE_INVALID.throwException( + "杩欎釜椤圭洰鍚嶇О宸茬粡琚敤杩囦簡鍝焴 鍐嶆兂涓涓惂~" + ); + } + } + } + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/add.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/add.http" new file mode 100644 index 0000000000000000000000000000000000000000..a9e2d23b991717813dd94c07372d6e886da6378d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/add.http" @@ -0,0 +1,43 @@ +### +POST {{baseUrl}}/project/add +Content-Type: application/json + + +{ + "name": "閲嶆瀯椤圭洰", + "desc": "閲嶆瀯椤圭洰", + "dataSetList": [ + { + "member_id": "269330b21e1342b48124303e55c75ce0", + "data_set_keys": ",bbb,", + "data_set_name": "kkk-b", + "member_name": "寮熶緷鍋庨浂涓", + "member_role": "promoter", + "data_set_id": "a4b9810d7cb34f6997381482e48c17a2", + "contains_y": true + }, + { + "member_id": "682d087e965a4c5d8a2807a772a571c1", + "data_set_keys": ",test,", + "data_set_name": "wingo-noy", + "data_set_column_num": "20", + "member_name": "寮熶緷鍋庨浂鍥", + "member_role": "provider", + "data_set_rows": "568", + "data_set_id": "d9ea082b855141378ed257111a1a07e4", + "contains_y": false + } + ], + "memberList": [ + { + "member_id": "269330b21e1342b48124303e55c75ce0", + "member_role": "promoter", + "member_name": "寮熶緷鍋庨浂涓" + }, + { + "member_id": "682d087e965a4c5d8a2807a772a571c1", + "member_role": "provider", + "member_name": "寮熶緷鍋庨浂鍥" + } + ] +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/audit.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/audit.http" new file mode 100644 index 0000000000000000000000000000000000000000..4a3c85cf4c746cc5b7510b8f141158f960e52ab5 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/audit.http" @@ -0,0 +1,12 @@ +### +POST {{baseUrl}}/project/add/audit +Content-Type: application/json + + +{ + "audit_comment": "", + "audit_result": "agree", + "project_id": "796b3ebb5aed4f5e9b9b7051c67a7c7a" +} + +### \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/dataInfo.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/dataInfo.http" new file mode 100644 index 0000000000000000000000000000000000000000..cc618f4108c0f018f56294361a01f386caf3079f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/dataInfo.http" @@ -0,0 +1,8 @@ +POST {{baseUrl}}/project/data/info +Content-Type: application/json + +{ + "project_id": "bc82138206024e3e977909e56cb417ee" +} + +### \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/detail.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/detail.http" new file mode 100644 index 0000000000000000000000000000000000000000..2931697e4892fd91cae1355cc4e4812cf75a15b8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/detail.http" @@ -0,0 +1,7 @@ +### +POST {{baseUrl}}/project/detail +Content-Type: application/json + +{ + "projectId": "fd1d4a0df470442bb7ffea1c81846385" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/query.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/query.http" new file mode 100644 index 0000000000000000000000000000000000000000..95c5bc4cc2d46a21479a8417541ec686481a1116 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/query.http" @@ -0,0 +1,8 @@ +### +POST {{baseUrl}}/project/query +Content-Type: application/json + +{ +} + +### diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/statistics.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/statistics.http" new file mode 100644 index 0000000000000000000000000000000000000000..a920e338710582bc4bfd885e34344f3d874b8f42 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/project/project/test/statistics.http" @@ -0,0 +1,9 @@ +### +POST {{baseUrl}}/project/count_statistics +Content-Type: application/json + +{ +} + +### +GET {{baseUrl}}/project/count_statistics?name=&member_id=1b750c545b494242997e0d0a054fd853&member_name=%E5%85%8B%E5%8A%B3%E5%BE%B7002&member_role=&audit_status=&start_create_time=&end_create_time=&page_index=1&page_size=20&activeTab=myProjects \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/server/AvailableApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/server/AvailableApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..bfa9f4321c17cadae5a276e0e70f8b318167984d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/server/AvailableApi.java" @@ -0,0 +1,41 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.server; + +import com.welab.wefe.board.service.dto.vo.ServerCheckPointOutput; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractNoneInputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; + +import java.util.List; + +/** + * @author zane + */ +@Api(path = "server/available", name = "list all checkpoint in board service to show its availability.") +public class AvailableApi extends AbstractNoneInputApi { + @Override + protected ApiResult handle() throws StatusCodeWithException { + return null; + } + + public static class Output { + public boolean success; + public List list; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/storage/PreviewDataSetApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/storage/PreviewDataSetApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..6c6dd4a0340c3eaeb8e621dd326e98f488cf3ca4 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/storage/PreviewDataSetApi.java" @@ -0,0 +1,158 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.storage; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.database.repository.DataSetRepository; +import com.welab.wefe.board.service.service.DataSetStorageService; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.http.HttpRequest; +import com.welab.wefe.common.http.HttpResponse; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Zane + */ +@Api(path = "storage/data_set/preview", name = "View data sets in storage") +public class PreviewDataSetApi extends AbstractApi { + + @Autowired + DataSetStorageService dataSetStorageService; + @Autowired + DataSetRepository dataSetRepository; + @Autowired + private GlobalConfigService globalConfigService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + DataSetMysqlModel model = dataSetRepository.findById(input.getId()).orElse(null); + if (model == null) { + return success(); + } + List columns = StringUtil.splitWithoutEmptyItem(model.getColumnNameList(), ","); + List> rows; + if (model.getSourceType() == null) { + rows = dataSetStorageService.previewDataSet(model.getNamespace(), model.getTableName(), 100); + } else { + rows = getRowsFromFlow(model); + } + + List list = new ArrayList<>(); + for (List row : rows) { + + JSONObject item = new JSONObject(); + for (int i = 0; i < columns.size(); i++) { + if (row.size() > i) { + item.put(columns.get(i), row.get(i)); + } + } + + list.add(item); + } + + return success(new Output(columns, list)); + } + + /** + * View the data of the derived data set from flow service + */ + private List> getRowsFromFlow(DataSetMysqlModel model) throws StatusCodeWithException { + String url = globalConfigService.getFlowConfig().intranetBaseUri + String.format("/data_set/view?table_name=%s&table_namespace=%s", model.getTableName(), model.getNamespace()); + + HttpResponse response = HttpRequest + .create(url) + .get(); + + if (!response.success()) { + StatusCode.RPC_ERROR.throwException(response.getError()); + } + + return response + .getBodyAsJson() + .getJSONObject("data") + .toJavaObject(FlowOutput.class) + .list; + } + + + static class FlowOutput { + public List> list; + } + + + public static class Input extends AbstractApiInput { + @Check(require = true, name = "鏁版嵁闆 Id") + private String id; + + //region getter/setter + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + + //endregion + } + + public static class Output { + + private List header; + private List list; + + public Output(List header, List list) { + this.header = header; + this.list = list; + } + + //region getter/setter + + public List getHeader() { + return header; + } + + public void setHeader(List header) { + this.header = header; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/storage/test/storage-data_set-priview-.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/storage/test/storage-data_set-priview-.http" new file mode 100644 index 0000000000000000000000000000000000000000..c398c35146132acbcf322967463305e8dc259f86 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/storage/test/storage-data_set-priview-.http" @@ -0,0 +1,9 @@ + +### 棰勮鏁版嵁闆嗕腑鐨勬暟鎹 +POST {{baseUrl}}/storage/data_set/preview +Content-Type: application/json + +{ + "id": "7d1286926e6a6ece8598fb039dddd600" +} + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/DataSetDetailApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/DataSetDetailApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..c30f1170f165850ec6bc9f1eb07ce4a322044749 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/DataSetDetailApi.java" @@ -0,0 +1,61 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.union; + +import com.welab.wefe.board.service.dto.entity.data_set.DataSetOutputModel; +import com.welab.wefe.board.service.sdk.UnionService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Zane + */ +@Api(path = "union/data_set/detail", name = "Get data set details from union") +public class DataSetDetailApi extends AbstractApi { + + @Autowired + UnionService unionService; + + @Override + protected ApiResult handle(DataSetDetailApi.Input input) throws StatusCodeWithException { + + return success(unionService.queryDataSetDetail(input.getId())); + } + + public static class Input extends AbstractApiInput { + @Check(name = "鏁版嵁闆 Id", require = true) + private String id; + + //region getter/setter + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/DataSetTagListApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/DataSetTagListApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..4007c91c7b4d398c0c4ae938490375cbe5558dc0 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/DataSetTagListApi.java" @@ -0,0 +1,62 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.union; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.sdk.UnionService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Zane + */ +@Api(path = "union/data_set/tag/query", name = "Query the tags of the data set from the union") +public class DataSetTagListApi extends AbstractApi { + + @Autowired + UnionService unionService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + JSONObject result = unionService.queryDataSetTags(input); + return unionApiResultToBoardApiResult(result); + } + + public static class Input extends PagingInput { + @Check(name = "tag 鍚嶇О") + private String tag; + + //region getter/setter + + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } + + + //endregion + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/MemberListApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/MemberListApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..a99e48532f5256181c5b1843128208741230c745 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/MemberListApi.java" @@ -0,0 +1,71 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.union; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.sdk.UnionService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Zane + */ +@Api(path = "union/member/query", name = "Query members from union") +public class MemberListApi extends AbstractApi { + + @Autowired + UnionService unionService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + JSONObject result = unionService.queryMembers(input); + return unionApiResultToBoardApiResult(result); + } + + public static class Input extends PagingInput { + @Check(name = "member 鍚嶇О") + private String name; + + @Check(name = "member id") + private String id; + + //region getter/setter + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +//endregion + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/QueryDataSetApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/QueryDataSetApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..ca18be823b40c39a7db295971d4aafb5a541eac6 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/QueryDataSetApi.java" @@ -0,0 +1,117 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.union; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.sdk.UnionService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; + +/** + * @author Zane + */ +@Api(path = "union/data_set/query", name = "Query data set from union") +public class QueryDataSetApi extends AbstractApi { + + @Autowired + UnionService unionService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + JSONObject result = unionService.queryDataSets(input); + + JSONObject data = result.getJSONObject("data"); + + // Rename the fields of the data from the union so that the front end can access it uniformly. + JSONArray list = data.getJSONArray("list"); + if (list == null) { + data.put("list", new ArrayList<>()); + } + + return unionApiResultToBoardApiResult(result); + } + + public static class Input extends PagingInput { + + private String id; + + @Check(name = "鏁版嵁闆嗗悕绉") + private String name; + + @Check(name = "鏍囩鍚嶇О") + private String tag; + + private String memberId; + + private Boolean containsY; + + + //region getter/setter + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public Boolean getContainsY() { + return containsY; + } + + public void setContainsY(Boolean containsY) { + this.containsY = containsY; + } + + + //endregion + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/SendForgetPasswordSmsCodeApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/SendForgetPasswordSmsCodeApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..756d14f4f0b8ccbe52533e40a435b96f8f84dea8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/SendForgetPasswordSmsCodeApi.java" @@ -0,0 +1,59 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.union; + +import com.welab.wefe.board.service.sdk.UnionService; +import com.welab.wefe.common.enums.SmsBusinessType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import com.welab.wefe.common.web.dto.NoneApiOutput; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; + +/** + * @author aaron.li + * @date 2021/11/11 09:45 + **/ +@Api(path = "union/send_forget_password_sms_code", name = "send sms verification code", login = false) +public class SendForgetPasswordSmsCodeApi extends AbstractApi { + @Autowired + private UnionService unionService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException, IOException { + unionService.sendVerificationCode(input.phoneNumber, SmsBusinessType.AccountForgetPasswordVerificationCode); + return success(); + } + + public static class Input extends AbstractApiInput { + @Check(require = true) + private String phoneNumber; + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/TagListApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/TagListApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..68f4e977b0e9c4126424bbe29e61e5aefec7b76a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/TagListApi.java" @@ -0,0 +1,45 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.union; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.sdk.UnionService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author lonnie + */ +@Api(path = "union/tag/query", name = "Get the default dataset tags from union") +public class TagListApi extends AbstractApi { + + @Autowired + UnionService unionService; + + @Override + protected ApiResult handle(Input input) throws StatusCodeWithException { + JSONObject result = unionService.queryTags(input); + return unionApiResultToBoardApiResult(result); + } + + public static class Input extends PagingInput { + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/UnionOnlineCheckApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/UnionOnlineCheckApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..5333da09ec51762dfcf86e9c44fb70edde7b0d07 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/UnionOnlineCheckApi.java" @@ -0,0 +1,82 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.api.union; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.constant.Config; +import com.welab.wefe.board.service.sdk.UnionService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.api.base.AbstractNoneInputApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author lonnie + */ +@Api(path = "union/online/check", name = "Check the access status of the union") +public class UnionOnlineCheckApi extends AbstractNoneInputApi { + + @Autowired + private UnionService unionService; + + @Autowired + private Config config; + + @Override + protected ApiResult handle() throws StatusCodeWithException { + + OutPut outPut = new OutPut(); + outPut.setUnionUrl(config.getUNION_BASE_URL()); + + try { + + JSONObject unionResult = unionService.queryMember(0, 10); + int code = unionResult.getInteger("code"); + + outPut.setStatus(code == 0); + } catch (StatusCodeWithException e) { + outPut.setStatus(false); + return success(outPut); + } + + return success(outPut); + } + + public static class OutPut { + + private String unionUrl; + + private boolean status; + + public String getUnionUrl() { + return unionUrl; + } + + public void setUnionUrl(String unionUrl) { + this.unionUrl = unionUrl; + } + + public boolean isStatus() { + return status; + } + + public void setStatus(boolean status) { + this.status = status; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/test/data_set-detail.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/test/data_set-detail.http" new file mode 100644 index 0000000000000000000000000000000000000000..01f56977cca310fe2eda77cadfd2cd16bbfd187d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/test/data_set-detail.http" @@ -0,0 +1,9 @@ + +### 鏌ヨ鍏ㄩ儴鏁版嵁闆 +POST {{baseUrl}}/union/data_set/detail +Content-Type: application/json + +{ + "id": "766fb48a78ed4b80b684fd06301c8a84" +} + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/test/data_set-query.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/test/data_set-query.http" new file mode 100644 index 0000000000000000000000000000000000000000..c799ef7c9692197b14b2053392583196175ac4f3 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/test/data_set-query.http" @@ -0,0 +1,7 @@ + +### 鏌ヨ鍏ㄩ儴鏁版嵁闆 +POST {{baseUrl}}/union/data_set/query +Content-Type: application/json + +{} + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/test/member-query.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/test/member-query.http" new file mode 100644 index 0000000000000000000000000000000000000000..f45c186af72c81173aeebf32951ac8931d23a320 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/test/member-query.http" @@ -0,0 +1,32 @@ + +### 鏌ヨ鍏ㄩ儴 member +POST {{baseUrl}}/union/member/query +Content-Type: application/json + +{} + +> {% + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 0, "Response code is not 0"); +}); + +%} + + + +### 鎸夊悕瀛楁煡 +POST {{baseUrl}}/union/member/query +Content-Type: application/json + +{ + "name": "鑵捐" +} + +### 鎸塱d鏌 +POST {{baseUrl}}/union/member/query +Content-Type: application/json + +{ + "id": "601e3c3f150a4bfd9e9d6f2be9563b26" +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/test/tag-query.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/test/tag-query.http" new file mode 100644 index 0000000000000000000000000000000000000000..3aa2dcd1abecf26833e1816d98f668259576412d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/test/tag-query.http" @@ -0,0 +1,24 @@ + +### 鏌ヨ鍏ㄩ儴 tag +POST {{baseUrl}}/union/tag/query +Content-Type: application/json + +{} + +> {% + +client.test("Request executed successfully", function() { + client.assert(response.body.code === 0, "Response code is not 0"); +}); + +%} + + + +### 鎸夊悕瀛楁煡 +POST {{baseUrl}}/union/tag/query +Content-Type: application/json + +{ + "tag": "xlsx" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/test/union-check.http" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/test/union-check.http" new file mode 100644 index 0000000000000000000000000000000000000000..5eab14cd69e2983f6b3719dc7d7edef5709dccfb --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/api/union/test/union-check.http" @@ -0,0 +1,7 @@ +### 妫鏌nion璁块棶鐘舵 +POST {{baseUrl}}/union/online/check +Content-Type: application/json + +{} + +### \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/base/OnlineDemoApi.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/base/OnlineDemoApi.java" new file mode 100644 index 0000000000000000000000000000000000000000..42ef9cbf8a845f7acd7859458c3422d6b2080822 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/base/OnlineDemoApi.java" @@ -0,0 +1,30 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.base; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author zane.luo + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface OnlineDemoApi { +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/Components.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/Components.java" new file mode 100644 index 0000000000000000000000000000000000000000..3f5f61b9e352e65ebfdb1175c16ec0193ae0c3da --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/Components.java" @@ -0,0 +1,176 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component; + +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.feature.*; +import com.welab.wefe.board.service.component.modeling.*; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.web.Launcher; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author zane.luo + */ +@Service +public class Components { + + @Autowired + private DataIOComponent dataIOComponent; + @Autowired + private IntersectionComponent intersectionComponent; + @Autowired + private EvaluationComponent evaluationComponent; + @Autowired + private HorzLRComponent horzLRComponent; + @Autowired + private VertLRComponent vertLRComponent; + @Autowired + private BinningComponent binningComponent; + @Autowired + private HorzSecureBoostComponent horzSecureBoostComponent; + @Autowired + private VertSecureBoostComponent vertSecureBoostComponent; + @Autowired + private FeatureSelectionComponent featureSelectionComponent; + @Autowired + private SegmentComponent segmentComponent; + @Autowired + private FeatureStatisticsComponent featureStatisticsComponent; + @Autowired + private FeatureCalculationComponent featureCalculationComponent; + @Autowired + private FillMissingValueComponent fillMissingValueComponent; + @Autowired + private FeatureStandardizedComponent featureStandardizedComponent; + @Autowired + private VertPearsonComponent vertPearsonComponent; + @Autowired + private MixLrComponent mixLrComponent; + @Autowired + private MixSecureBoostComponent mixSecureBoostComponent; + @Autowired + private MixStatisticComponent mixStatisticComponent; + @Autowired + private OotComponent ootComponent; + @Autowired + private FeatureTransformComponent featureTransformComponent; + @Autowired + private HorzOneHotComponent horzOneHotComponent; + @Autowired + private VertFilterComponent vertFilterComponent; + @Autowired + private VertOneHotComponent vertOneHotComponent; + @Autowired + private VertPCAComponent vertPCAComponent; + @Autowired + private HorzFeatureBinningComponent horzFeatureBinningComponent; + @Autowired + private HorzStatisticComponent horzStatisticComponent; + @Autowired + private VertNNComponent vertNNComponent; + @Autowired + private HorzNNComponent horzNNComponent; + @Autowired + private MixBinningComponent mixBinningComponent; + public static AbstractComponent getDataIOComponent() { + return get(ComponentType.DataIO); + } + + public static AbstractComponent get(ComponentType componentType) { + + switch (componentType) { + case HorzLRValidationDataSetLoader: + case VertLRValidationDataSetLoader: + case HorzXGBoostValidationDataSetLoader: + case VertXGBoostValidationDataSetLoader: + case DataIO: + return Launcher.CONTEXT.getBean(Components.class).dataIOComponent; + case Intersection: + return Launcher.CONTEXT.getBean(Components.class).intersectionComponent; + case Evaluation: + return Launcher.CONTEXT.getBean(Components.class).evaluationComponent; + case HorzLR: + return Launcher.CONTEXT.getBean(Components.class).horzLRComponent; + case VertLR: + return Launcher.CONTEXT.getBean(Components.class).vertLRComponent; + case Binning: + return Launcher.CONTEXT.getBean(Components.class).binningComponent; + case HorzSecureBoost: + return Launcher.CONTEXT.getBean(Components.class).horzSecureBoostComponent; + case VertSecureBoost: + return Launcher.CONTEXT.getBean(Components.class).vertSecureBoostComponent; + case FeatureSelection: + return Launcher.CONTEXT.getBean(Components.class).featureSelectionComponent; + case Segment: + return Launcher.CONTEXT.getBean(Components.class).segmentComponent; + case FeatureStatistic: + return Launcher.CONTEXT.getBean(Components.class).featureStatisticsComponent; + case FeatureCalculation: + return Launcher.CONTEXT.getBean(Components.class).featureCalculationComponent; + case FillMissingValue: + return Launcher.CONTEXT.getBean(Components.class).fillMissingValueComponent; + case FeatureStandardized: + return Launcher.CONTEXT.getBean(Components.class).featureStandardizedComponent; + case VertPearson: + return Launcher.CONTEXT.getBean(Components.class).vertPearsonComponent; + case MixLR: + return Launcher.CONTEXT.getBean(Components.class).mixLrComponent; + case MixSecureBoost: + return Launcher.CONTEXT.getBean(Components.class).mixSecureBoostComponent; + case MixStatistic: + return Launcher.CONTEXT.getBean(Components.class).mixStatisticComponent; + case Oot: + return Launcher.CONTEXT.getBean(Components.class).ootComponent; + case VertFilter: + return Launcher.CONTEXT.getBean(Components.class).vertFilterComponent; + case FeatureTransform: + return Launcher.CONTEXT.getBean(Components.class).featureTransformComponent; + case HorzOneHot: + return Launcher.CONTEXT.getBean(Components.class).horzOneHotComponent; + case VertOneHot: + return Launcher.CONTEXT.getBean(Components.class).vertOneHotComponent; + case VertPCA: + return Launcher.CONTEXT.getBean(Components.class).vertPCAComponent; + case HorzFeatureBinning: + return Launcher.CONTEXT.getBean(Components.class).horzFeatureBinningComponent; + case HorzStatistic: + return Launcher.CONTEXT.getBean(Components.class).horzStatisticComponent; + case HorzNN: + return Launcher.CONTEXT.getBean(Components.class).horzNNComponent; + case VertNN: + return Launcher.CONTEXT.getBean(Components.class).vertNNComponent; + case MixBinning: + return Launcher.CONTEXT.getBean(Components.class).mixBinningComponent; + default: + return null; + } + } + + public static boolean needArbiterTask(ComponentType type) { + return type == ComponentType.HorzLR + || type == ComponentType.HorzSecureBoost + || type == ComponentType.MixLR + || type == ComponentType.MixSecureBoost + || type == ComponentType.MixStatistic + || type == ComponentType.HorzStatistic + || type == ComponentType.HorzFeatureBinning + || type == ComponentType.HorzNN + || type == ComponentType.MixBinning; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/DataIOComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/DataIOComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..513cac34a1daa473fa98384df68b22012f42b8b2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/DataIOComponent.java" @@ -0,0 +1,334 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.database.entity.job.JobMemberMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.board.service.service.DataSetService; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.Launcher; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author zane.luo + */ +@Service +public class DataIOComponent extends AbstractComponent { + + @Autowired + private DataSetService dataSetService; + + @Override + public ComponentType taskType() { + return ComponentType.DataIO; + } + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + List jobMembers = graph.getMembers(); + + if (CollectionUtils.isEmpty(jobMembers) || jobMembers.size() < 2) { + throw new FlowNodeException(node, "璇疯嚦灏戜负涓や釜鎴愬憳鎸囧畾鏁版嵁闆"); + } + + if (CollectionUtils.isEmpty(params.getDataSetList()) || params.getDataSetList().size() < 2) { + throw new FlowNodeException(node, "璇烽夋嫨澶氫釜鏁版嵁闆嗙敤浜庤仈閭"); + } + + if (jobMembers.stream().noneMatch(x -> x.getJobRole() == JobMemberRole.promoter)) { + throw new FlowNodeException(node, "璇蜂负 promoter 鎸囧畾鏁版嵁闆"); + } + + JobMemberMySqlModel promoter = jobMembers.stream().filter( + x -> x.getJobRole() == JobMemberRole.promoter && CacheObjects.getMemberId().equals(x.getMemberId())) + .findFirst().orElse(null); + + if (params.getDataSetList().stream().noneMatch(x -> x.memberId.equals(promoter.getMemberId()))) { + throw new FlowNodeException(node, "璇蜂负 promoter 鎸囧畾鏁版嵁闆"); + } + + for (DataSetItem item : params.getDataSetList()) { + if (CollectionUtils.isEmpty(item.features)) { + throw new FlowNodeException(node, "璇蜂负 " + CacheObjects.getMemberName(item.memberId) + " 鐨勬暟鎹泦閫夋嫨鐗瑰緛"); + } + } + + DataSetItem promoterProjectDataSet = params.getDataSetList().stream().filter(x -> x.memberId.equals(promoter.getMemberId())).findFirst().orElse(null); + DataSetMysqlModel promoterDataSet = dataSetService.findOne(promoterProjectDataSet.dataSetId); + if (!promoterDataSet.getContainsY()) { + throw new FlowNodeException(node, "promoter 鐨勬暟鎹泦蹇呴』鍖呭惈 y 鍊"); + } + + // Check if the data set has been deleted + for (DataSetItem dataSet : params.getDataSetList()) { + if (!CacheObjects.getMemberId().equals(dataSet.memberId)) { + continue; + } + + DataSetMysqlModel one = dataSetService.findOne(dataSet.getDataSetId()); + if (one == null) { + throw new FlowNodeException(node, "鎴愬憳 " + CacheObjects.getMemberName(dataSet.memberId) + " 鐨勬暟鎹泦 " + dataSet.getDataSetId() + " 涓嶅瓨鍦紝璇锋鏌ユ槸鍚﹀凡鍒犻櫎銆"); + } + } + + if (graph.getJob().getFederatedLearningType() == FederatedLearningType.horizontal) { + List dataSetItems = params.getDataSetList(); + for (int i = 0; i < dataSetItems.size() - 1; i++) { + if (!CollectionUtils.isEqualCollection(dataSetItems.get(i).getFeatures(), dataSetItems.get(i + 1).getFeatures())) { + throw new FlowNodeException(node, "妯悜寤烘ā闇瑕佷繚璇佹墍鏈夋牱鏈墍閫夌壒寰佸垪琛ㄤ竴鑷淬"); + } + } + } + + if (graph.getJob().getFederatedLearningType() == FederatedLearningType.mix) { + List dataSetItems = params.getDataSetList().stream() + .filter(s -> s.getMemberRole() == JobMemberRole.promoter).collect(Collectors.toList()); + if (dataSetItems.size() < 2) { + throw new FlowNodeException(node, "娣峰悎寤烘ā闇瑕佸彂璧锋柟鏁版嵁闆嗘渶灏2涓"); + } + for (int i = 0; i < dataSetItems.size() - 1; i++) { + if (!CollectionUtils.isEqualCollection(dataSetItems.get(i).getFeatures(), + dataSetItems.get(i + 1).getFeatures())) { + throw new FlowNodeException(node, "娣峰悎寤烘ā闇瑕佷繚璇佸彂璧锋柟鏍锋湰鎵閫夌壒寰佸垪琛ㄤ竴鑷淬"); + } + } + } + + } + + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + if (graph.getJob().getMyRole() == JobMemberRole.arbiter) { + return null; + } + + // Create the input parameters of the components in the kernel according to the component parameter settings in the interface + JSONObject taskParam = new JSONObject(); + + DataSetItem myDataSetConfig = params.getDataSetList() + .stream() + .filter(x -> x.getMemberId().equals(CacheObjects.getMemberId()) && x.getMemberRole() == graph.getJob().getMyRole()) + .findFirst() + .orElse(null); + + if (myDataSetConfig == null) { + throw new FlowNodeException(node, "璇蜂繚瀛樿嚜宸辩殑鏁版嵁闆嗕俊鎭"); + } + + DataSetMysqlModel myDataSet = dataSetService.findOne(myDataSetConfig.dataSetId); + if (myDataSet == null) { + throw new FlowNodeException(node, "鎵句笉鍒拌嚜宸辩殑鏁版嵁闆嗐"); + } + + JObject dataIoParam = JObject + .create() + .append("data_set_id", myDataSet.getId()) + .append("with_label", myDataSet.getContainsY()) + .append("label_name", "y") + .append("namespace", myDataSet.getNamespace()) + .append("name", myDataSet.getTableName()) + .append("need_features", myDataSetConfig.features); + + // DataIOParam + taskParam.put("params", dataIoParam); + + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + return taskResultService.listAllResult(taskId); + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + + TaskResultMySqlModel resultModel = null; + JObject resultObj = JObject.create(); + + TaskResultMySqlModel dataNormalResult = taskResultService.findByTaskIdAndType(taskId, TaskResultType.data_normal.name()); + if (dataNormalResult != null) { + resultModel = dataNormalResult; + JObject dataNormalObj = JObject.create(dataNormalResult.getResult()); + + int tableCreateCount = dataNormalObj.getInteger("table_create_count"); + resultObj.append("table_create_count", tableCreateCount); + } + + TaskResultMySqlModel modelResult = taskResultService.findByTaskIdAndType(taskId, TaskResultType.model_result.name()); + if (modelResult != null) { + resultModel = modelResult; + + JObject modelResultObj = JObject.create(modelResult.getResult()); + JSONArray header = modelResultObj.getJObject("model_param").getJSONArray("header"); + resultObj.append("header", header); + } + if (resultModel != null) { + resultModel.setResult(resultObj.toJSONString()); + } + + return resultModel; + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return null; + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + + Params params = (Params) node.getParamsModel(); + + // If no data set is selected + if (CollectionUtils.isEmpty(params.dataSetList)) { + return new ArrayList<>(); + } + + DataSetMysqlModel myDataSet = params.getMyDataSet(); + if (myDataSet == null) { + throw new FlowNodeException(node, CacheObjects.getMemberName() + " 鐨勬暟鎹泦宸茶鍒犻櫎锛屼笉鑳藉姞杞藉凡鍒犻櫎鐨勬暟鎹泦銆"); + } + + return Arrays.asList(OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance)); + } + + public static class Params extends AbstractCheckModel { + private List dataSetList; + + /** + * Find my data set object information from the configuration list + */ + public DataSetMysqlModel getMyDataSet() { + + DataSetItem myDataSetConfig = getMyDataSetConfig(); + + if (myDataSetConfig == null) { + return null; + } + + DataSetMysqlModel myDataSet = Launcher + .CONTEXT + .getBean(DataSetService.class) + .findOne(myDataSetConfig.getDataSetId()); + + return myDataSet; + } + + /** + * Find my data set configuration from the configuration list + */ + public DataSetItem getMyDataSetConfig() { + DataSetItem myDataSetConfig = Components + .getDataIOComponent() + .findMyData(dataSetList, x -> x.getMemberId()); + + return myDataSetConfig; + } + + + //region getter/setter + + public List getDataSetList() { + return dataSetList; + } + + public void setDataSetList(List dataSetList) { + this.dataSetList = dataSetList; + } + + //endregion + + } + + public static class DataSetItem extends AbstractCheckModel { + @Check(name = "鎴愬憳Id", require = true) + private String memberId; + @Check(name = "鎴愬憳瑙掕壊", require = true) + private JobMemberRole memberRole; + @Check(name = "鏁版嵁闆 Id", require = true) + private String dataSetId; + @Check(name = "閫夋嫨鐨勭壒寰佸垪") + private List features; + + //region getter/setter + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public List getFeatures() { + return features; + } + + public void setFeatures(List features) { + this.features = features; + } + + //endregion + } + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/EvaluationComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/EvaluationComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..cec425eca245dfdc4e97c1a3c03af1e0fe7655d3 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/EvaluationComponent.java" @@ -0,0 +1,294 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.*; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.TaskService; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author lonnie + */ +@Service +class EvaluationComponent extends AbstractComponent { + + @Autowired + private TaskService taskService; + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + // Find the modeling node + FlowGraphNode modelingNode = graph.findModelingNodeFromParent(node); + + if (modelingNode == null) { + throw new FlowNodeException(node, "璇勪及涔嬪墠蹇呴』鏈夊缓妯¤涓"); + } + } + + + @Override + public ComponentType taskType() { + return ComponentType.Evaluation; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + if (graph.getJob().getMyRole() == JobMemberRole.arbiter) { + return null; + } + + JSONObject taskParam = new JSONObject(); + + // Reassembly parameters + JObject evaluationParam = JObject.create(); + evaluationParam.append("eval_type", params.getEvalType()) + .append("pos_label", params.getPosLabel()); + + taskParam.put("params", evaluationParam); + + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + return taskResultService.listAllResult(taskId); + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + + TaskResultMySqlModel trainTaskResult = taskResultService.findByTaskIdAndType(taskId, TaskResultType.metric_train.name()); + TaskResultMySqlModel validateTaskResult = taskResultService.findByTaskIdAndType(taskId, TaskResultType.metric_validate.name()); + + if (trainTaskResult == null && validateTaskResult == null) { + return null; + } + + // Training and validation evaluation task_result only has different types, + // and finally the results are merged and returned. + TaskResultMySqlModel taskResultMySqlModel = new TaskResultMySqlModel(); + if (trainTaskResult != null) { + BeanUtils.copyProperties(trainTaskResult, taskResultMySqlModel); + } else { + BeanUtils.copyProperties(validateTaskResult, taskResultMySqlModel); + } + + JObject trainObj = JObject.create(trainTaskResult != null ? trainTaskResult.getResult() : ""); + JObject validateObj = JObject.create(validateTaskResult != null ? validateTaskResult.getResult() : ""); + + JObject result = JObject.create(); + + try { + // Find out all the same branch nodes with the evaluation node + // and find the modeling node from them + // (this method solves the problem of null pointer when the evaluation node is deleted in the original editing process again) + List homologousBranchTaskList = taskService.findHomologousBranchByJobId(taskResultMySqlModel.getJobId(), trainTaskResult.getRole(), taskResultMySqlModel.getTaskId()); + TaskMySqlModel modelingTask = homologousBranchTaskList.stream().filter(x -> MODEL_COMPONENT_TYPE_LIST.contains(x.getTaskType())).findFirst().orElse(null); + + String modelComponentType = modelingTask.getTaskType().toString(); + String modelNodeId = modelingTask.getFlowNodeId(); + String suffix = ""; + if (!taskId.endsWith(taskResultMySqlModel.getFlowNodeId())) { + suffix = "_" + taskId.split("_")[taskId.split("_").length - 1]; + } + // Start parsing the required result data + String normalName = modelComponentType + "_" + modelNodeId + suffix; + String preValidateName = "validate_" + modelComponentType + "_" + modelNodeId + suffix; + String preTrainName = "train_" + modelComponentType + "_" + modelNodeId + suffix; + + JObject validate = validateObj.getJObject(preValidateName); + JObject train = trainObj.getJObject(preTrainName); + + result.append("validate", validate) + .append("train", train); + + switch (type) { + case "ks": + result.putAll(parserTrainCurveData(trainObj, "ks_fpr", normalName)); + result.putAll(parserValidateCurveData(validateObj, "ks_fpr", normalName)); + result.putAll(parserTrainCurveData(trainObj, "ks_tpr", normalName)); + result.putAll(parserValidateCurveData(validateObj, "ks_tpr", normalName)); + break; + case "lift": + result.putAll(parserTrainCurveData(trainObj, "lift", normalName)); + result.putAll(parserValidateCurveData(validateObj, "lift", normalName)); + break; + case "gain": + result.putAll(parserTrainCurveData(trainObj, "gain", normalName)); + result.putAll(parserValidateCurveData(validateObj, "gain", normalName)); + break; + case "accuracy": + result.putAll(parserTrainCurveData(trainObj, "accuracy", normalName)); + result.putAll(parserValidateCurveData(validateObj, "accuracy", normalName)); + break; + case "precision_recall": + result.putAll(parserTrainCurveData(trainObj, "precision", normalName)); + result.putAll(parserValidateCurveData(validateObj, "precision", normalName)); + result.putAll(parserTrainCurveData(trainObj, "recall", normalName)); + result.putAll(parserValidateCurveData(validateObj, "recall", normalName)); + break; + case "roc": + result.putAll(parserTrainCurveData(trainObj, "roc", normalName)); + result.putAll(parserValidateCurveData(validateObj, "roc", normalName)); + break; + case "topn": + result.putAll(parserTopN(trainObj, normalName, "train")); + result.putAll(parserTopN(validateObj, normalName, "validate")); + default: + break; + + } + } catch (StatusCodeWithException e) { + e.printStackTrace(); + } + + taskResultMySqlModel.setResult(result.toJSONString()); + + return taskResultMySqlModel; + } + + /** + * Parse topN + */ + private JObject parserTopN(JObject trainObj, String normalName, String dataType) { + String curveKey = dataType + "_" + normalName + "_topn"; + JObject topNData = trainObj.getJObject(curveKey); + JObject data = topNData.getJObject("data"); + + List topN = data.getJSONList("topn"); + + return JObject.create().append(dataType + "_topn", topN); + } + + private JObject parserTrainCurveData(JObject obj, String type, String normalName) { + return parserCurveData(obj, type, normalName, "train_"); + } + + private JObject parserValidateCurveData(JObject obj, String type, String normalName) { + return parserCurveData(obj, type, normalName, "validate_"); + } + + /** + * Get the corresponding curve data node information, dataType: validate_/train_ + *

+ * Since the oot component wants to reuse this method, it can only be changed to public and static. + *

+ */ + public static JObject parserCurveData(JObject obj, String type, String normalName, String dataType) { + String curveKey = dataType + normalName + "_" + type; + + JObject curveObj = obj.getJObject(curveKey); + if (curveObj == null) { + return JObject.create(); + } + JObject curveData = normalizerData(curveObj); + JObject parserResult = JObject.create().append(dataType + type, curveData); + + return parserResult; + } + + /** + * Reassemble the data structure + *

+ * Since the oot component wants to reuse this method, it can only be changed to static + *

+ */ + private static JObject normalizerData(JObject obj) { + JObject data = obj.getJObject("data"); + List dataKey = data.keySet().stream().sorted().collect(Collectors.toList()); + + List> dataList = new ArrayList<>(); + for (String key : dataKey) { + List coordinate = new ArrayList<>(); + Double value = data.getJObject(key).getDoubleValue("value"); + // X-axis + coordinate.add(Double.valueOf(key)); + // Y-axis + coordinate.add(value); + dataList.add(coordinate); + } + obj.append("data", dataList); + return obj; + } + + @Override + protected List inputs(FlowGraph flowGraph, FlowGraphNode flowGraphNode) throws FlowNodeException { + + InputSupplier modelSupplier = (graph, node) -> { + // Find the modeling node + FlowGraphNode modelingNode = flowGraph.findModelingNodeFromParent(flowGraphNode); + return new NodeOutputItem(modelingNode, OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance)); + }; + + return Arrays.asList( + InputMatcher.of(Names.Data.NORMAL_DATA_SET, modelSupplier) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.JSON_RESULT, IODataType.Json) + ); + } + + public static class Params extends AbstractCheckModel { + @Check(require = true) + private String evalType; + + @Check(require = true) + private int posLabel; + + public String getEvalType() { + return evalType; + } + + public void setEvalType(String evalType) { + this.evalType = evalType; + } + + public int getPosLabel() { + return posLabel; + } + + public void setPosLabel(int posLabel) { + this.posLabel = posLabel; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/IntersectionComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/IntersectionComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..e8bc797d1765ea16726c896ffa39419d296443f8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/IntersectionComponent.java" @@ -0,0 +1,151 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author lonnie + */ +@Service +class IntersectionComponent extends AbstractComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + } + + + @Override + public ComponentType taskType() { + return ComponentType.Intersection; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + + // Reassemble front-end parameters + JObject intersectionParam = JObject.create(); + intersectionParam.append("intersect_method", params.getIntersectMethod()) + .append("save_dataset", params.isSaveDataSet()); + + taskParam.put("params", intersectionParam); + + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + List list = taskResultService.listAllResult(taskId) + .stream() + .filter(x -> x.getType().equals(TaskResultType.metric_train)) + .collect(Collectors.toList()); + + // Put the reassembled data in + list.add(getResult(taskId, TaskResultType.metric_train.name())); + + return list; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + + TaskResultMySqlModel resultModel = taskResultService.findByTaskIdAndType(taskId, TaskResultType.metric_train.name()); + + if (resultModel == null) { + return null; + } + TaskResultMySqlModel result = new TaskResultMySqlModel(); + BeanUtils.copyProperties(resultModel, result); + + JObject obj = JObject.create(resultModel.getResult()); + + int count = obj.getIntegerByPath("train_intersection.data.count.value"); + int intersect_count = obj.getIntegerByPath("train_intersection.data.intersect_count.value"); + double intersect_rate = obj.getDoubleByPath("train_intersection.data.intersect_rate.value"); + + JObject resultObj = JObject.create() + .append("count", count) + .append("intersect_count", intersect_count) + .append("intersect_rate", intersect_rate); + + result.setResult(resultObj.toJSONString()); + + return result; + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + InputMatcher.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance) + ); + } + + public static class Params extends AbstractCheckModel { + @Check(name = "瀵归綈鏂瑰紡", require = true) + private String intersectMethod; + + private boolean saveDataSet; + + public String getIntersectMethod() { + return intersectMethod; + } + + public void setIntersectMethod(String intersectMethod) { + this.intersectMethod = intersectMethod; + } + + public boolean isSaveDataSet() { + return saveDataSet; + } + + public void setSaveDataSet(boolean saveDataSet) { + this.saveDataSet = saveDataSet; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/OotComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/OotComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..bbf94e1ef10da299bd3f1eee6b92c38c8722bd58 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/OotComponent.java" @@ -0,0 +1,734 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.api.project.flow.QueryDataIoTaskConfigApi; +import com.welab.wefe.board.service.api.project.member.ListApi; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.constant.Config; +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.database.entity.job.*; +import com.welab.wefe.board.service.dto.kernel.Env; +import com.welab.wefe.board.service.dto.kernel.KernelJob; +import com.welab.wefe.board.service.dto.kernel.TaskConfig; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.*; +import com.welab.wefe.common.enums.*; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.dto.ApiResult; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * OOT Component + *

+ * OOT mode: flow chart with only [start] and [OOT] (the scene clicked in the model list) + *

+ * + * @author aaron.li + **/ +@Service +public class OotComponent extends AbstractComponent { + + /** + * Exclude components to execute in OOT mode + */ + private final static List EXCLUDE_COMPONENT_TYPE_LIST = Arrays.asList(ComponentType.FeatureStatistic, + ComponentType.FeatureCalculation, ComponentType.MixStatistic, + ComponentType.Segment, ComponentType.VertPearson, ComponentType.Oot); + /** + * List of temporarily unsupported components + */ + private final static List TEMP_UNSUPPORTED_COMPONENT_TYPE_LIST = Arrays.asList(ComponentType.MixLR, + ComponentType.MixSecureBoost, ComponentType.HorzNN, ComponentType.VertNN); + + @Autowired + private Config config; + + @Autowired + private DataSetService dataSetService; + @Autowired + private TaskService taskService; + @Autowired + private GatewayService gatewayService; + @Autowired + private ProjectFlowNodeService projectFlowNodeService; + + @Autowired + private ProjectMemberService projectMemberService; + + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + if (graph.getJob().getMyRole() == JobMemberRole.arbiter) { + return; + } + if (FederatedLearningType.mix.equals(graph.getFederatedLearningType())) { + throw new FlowNodeException(node, "銆愭墦鍒嗛獙璇併戠粍浠舵殏鏃朵笉鏀寔娣峰悎鑱旈偊"); + } + + DataIOComponent.DataSetItem myDataSetConfig = getMyDataSetConfig(graph, params); + if (myDataSetConfig == null) { + throw new FlowNodeException(node, "璇蜂繚瀛樻垚鍛榌" + CacheObjects.getMemberName() + "]鐨勬暟鎹泦淇℃伅銆"); + } + + DataSetMysqlModel dataSetMysqlModel = dataSetService.findOne(myDataSetConfig.getDataSetId()); + if (null == dataSetMysqlModel) { + throw new FlowNodeException(node, "鎴愬憳[" + CacheObjects.getMemberName() + "]閫夋嫨鐨勬暟鎹泦淇℃伅涓嶅瓨鍦ㄣ"); + } + + // All characteristic columns of the dataset I selected + List myFeatureNameList = Arrays.asList(dataSetMysqlModel.getFeatureNameList().split(",")); + + List taskMySqlModelList = preTasks; + // Dataio task component + TaskMySqlModel dataIoTaskMysqlModel = null; + // If the jobid is not empty, it means an OOT process (a process containing only two components of [start] and [OOT]). + // This jobid means the jobid of the old process + if (isOotMode(params)) { + if (graph.allNodes.size() > 1) { + throw new FlowNodeException(node, "鍙厑璁稿彧鏈夈愭墦鍒嗛獙璇併戠粍浠躲"); + } + // Find the dataio task from the task list + dataIoTaskMysqlModel = taskService.findDataIoTask(params.jobId, graph.getJob().getMyRole()); + if (null == dataIoTaskMysqlModel) { + throw new FlowNodeException(node, "鏈壘鍒板師娴佺▼涓殑[閫夋嫨鏁版嵁闆哴鑺傜偣淇℃伅銆"); + } + taskMySqlModelList = taskService.listByJobId(params.jobId, graph.getJob().getMyRole()); + + } else { + // Find modeling node + FlowGraphNode modelingNode = graph.findModelingNodeFromParent(node); + // Find evaluation node + FlowGraphNode evaluationNode = graph.findOneNodeFromParent(node, ComponentType.Evaluation); + if (null == evaluationNode && null == modelingNode) { + throw new FlowNodeException(node, "鍦ㄣ愭墦鍒嗛獙璇併戣妭鐐瑰墠蹇呴』鏈夊缓妯¤涓烘垨璇勪及琛屼负"); + } + + dataIoTaskMysqlModel = findDataIoTask(preTasks); + } + + // Feature list of original dataio selection + List needFeatures = JObject.parseArray(JObject.create(dataIoTaskMysqlModel.getTaskConf()) + .getStringByPath("params.need_features")).toJavaList(String.class); + + if (!myFeatureNameList.containsAll(needFeatures)) { + throw new FlowNodeException(node, "鎴愬憳[" + CacheObjects.getMemberName() + "]閫夋嫨鐨勬暟鎹泦鐗瑰緛蹇呴』鍖呭惈鍘熸祦绋嬬殑鍏ユā鐗瑰緛鍒椼"); + } + + // Check the correctness of the feature column of the provider member selected by the OOT component on the promoter side. + // Because the front end should be prompted directly on the initiator side, check it on the promoter side锛 + if (graph.getJob().getMyRole() == JobMemberRole.promoter) { + checkUnsupportedComponent(node, taskMySqlModelList); + checkSelectedFeatures(graph, node, params, myDataSetConfig); + checkSelectedMembersValid(graph, node, params); + } + } + + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + if (graph.getJob().getMyRole() == JobMemberRole.arbiter) { + return null; + } + + // In OOT mode, you need to find out all the task information of the original process + boolean isOotMode = isOotMode(params); + + DataIOComponent.DataSetItem myDataSetConfig = getMyDataSetConfig(graph, params); + boolean isSelectedMyself = (null != myDataSetConfig); + DataSetMysqlModel myDataSet = null; + if (FederatedLearningType.vertical.equals(graph.getFederatedLearningType()) || isOotMode) { + if (!isSelectedMyself) { + throw new FlowNodeException(node, "璇蜂繚瀛樻垚鍛榌" + CacheObjects.getMemberName() + "]鐨勬暟鎹泦淇℃伅銆"); + } + } + if (isSelectedMyself) { + myDataSet = dataSetService.findOne(myDataSetConfig.getDataSetId()); + if (myDataSet == null) { + throw new FlowNodeException(node, "鎵句笉鍒版垚鍛榌" + CacheObjects.getMemberName() + "]鐨勬暟鎹泦銆"); + } + } + + if (isOotMode) { + // Find the original task list of the job + preTasks = taskService.listByJobId(params.jobId, graph.getJob().getMyRole()); + if (CollectionUtils.isEmpty(preTasks)) { + throw new FlowNodeException(node, "鏈壘鍒板師娴佺▼涓换浣曡妭鐐逛俊鎭"); + } + } + + // Find out the homologous branches with OOT components + preTasks = findHomologousBranch(graph, preTasks, node, params); + // Filter sub components that are not executed + preTasks = preTasks.stream().filter(x -> !EXCLUDE_COMPONENT_TYPE_LIST.contains(x.getTaskType())) + .collect(Collectors.toList()); + + // Whether there is an evaluation component. If not, create a new evaluation component and add it to the OOT process + if (!isExistEvaluationComponent(preTasks)) { + // Find the dataio component of the original process + TaskMySqlModel dataIoTaskMysqlModel = findDataIoTask(preTasks); + preTasks.add(createEvaluationTaskMySqlModel(graph, node, dataIoTaskMysqlModel, params)); + } + + // Sub task name list + List subTaskNameList = new ArrayList<>(); + // Sub task configuration + Map subTaskConfigMap = new HashMap<>(16); + // New input parameters for dataio component + JObject newDataIoParam = JObject.create(); + + for (TaskMySqlModel taskMySqlModel : preTasks) { + String taskName = taskMySqlModel.getName(); + ComponentType taskType = taskMySqlModel.getTaskType(); + subTaskNameList.add(taskName); + + // Add new parameter + JObject extendOotParams = JObject.create() + .append("need_run", isSelectedMyself) + .append("task_id", taskMySqlModel.getTaskId()) + .append("task_type", taskType.name()) + .append("flow_node_id", taskMySqlModel.getFlowNodeId()) + .append("component_name", taskName) + .append("job_id", isOotMode ? params.jobId : graph.getJob().getJobId()) + .append("is_model", false); + + // Add the OOT mode parameters and the required parameters in the corresponding OOT mode on the basis of the original task configuration + TaskConfig taskConfig = JObject.parseObject(taskMySqlModel.getTaskConf(), TaskConfig.class); + updateKernelJob(taskConfig, params); + taskConfig.setTask(getTaskMembers(graph, node)); + JObject taskConfigObj = JObject.create(JObject.toJSONString(taskConfig)); + // If it is a dataio component, replace it with a new dataset + if (DATA_IO_COMPONENT_TYPE_LIST.contains(taskType)) { + newDataIoParam.append("with_label", isSelectedMyself ? myDataSet.getContainsY() : false) + .append("label_name", "y") + .append("namespace", isSelectedMyself ? myDataSet.getNamespace() : taskConfigObj.getStringByPath("params.namespace")) + .append("name", isSelectedMyself ? myDataSet.getTableName() : taskConfigObj.getStringByPath("params.name")) + .append("need_features", JObject.parseArray(taskConfigObj.getStringByPath("params.need_features")).toJavaList(String.class)); + taskConfigObj.put("params", newDataIoParam); + } else if (MODEL_COMPONENT_TYPE_LIST.contains(taskType)) { + // In order to match the prediction function of the kernel modeling component, + // the modeling component needs to modify the input configuration (remove the train and add the model) + JObject inputObj = taskConfigObj.getJObject("input"); + JObject dataObj = inputObj.getJObject("data"); + dataObj.remove(Names.Data.TRAIN_DATA_SET); + inputObj.append("model", JObject.create().append(Names.Data.TRAIN_DATA_SET, Arrays.asList(taskName))); + inputObj.append("data", dataObj); + taskConfigObj.put("input", inputObj); + + // Mark as modeling component + extendOotParams.put("is_model", true); + + } + taskConfigObj.append("oot_params", extendOotParams); + subTaskConfigMap.put(taskName, taskConfigObj); + } + + // Create input parameters for OOT components + JObject ootParam = JObject.create(newDataIoParam) + .append("flow_node_id", node.getNodeId()) + .append("task_id", node.createTaskId(graph.getJob())) + .append("sub_component_name_list", subTaskNameList) + .append("sub_component_task_config_dick", subTaskConfigMap); + + // OotParam + return JObject.create().append("params", ootParam); + } + + @Override + public ComponentType taskType() { + return ComponentType.Oot; + } + + @Override + protected List getAllResult(String taskId) { + return null; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + TaskResultMySqlModel taskResultMySqlModel = taskResultService.findByTaskIdAndType(taskId, TaskResultType.metric_predict.name()); + if (null == taskResultMySqlModel) { + return null; + } + + JObject taskResultObj = JObject.create(taskResultMySqlModel.getResult()); + // Parameter configuration of modeling node + JObject modelObj = taskResultObj.getJObject("model"); + + // Evaluation results + JObject evaluationObj = taskResultObj.getJObject("evaluation"); + String evaluationTaskId = findComponentTaskId(evaluationObj); + + // Final output + JObject result = JObject.create("validate", evaluationObj.getJObject(evaluationTaskId)); + + switch (type) { + case "ks": + JObject ksFpr = EvaluationComponent.parserCurveData(evaluationObj, "ks_fpr", evaluationTaskId, ""); + JObject ksTpr = EvaluationComponent.parserCurveData(evaluationObj, "ks_tpr", evaluationTaskId, ""); + JObject newKsFpr = JObject.create().append("validate_ks_fpr", ksFpr.getJObject("ks_fpr")); + JObject newKsTpr = JObject.create().append("validate_ks_tpr", ksTpr.getJObject("ks_tpr")); + + result.putAll(newKsFpr); + result.putAll(newKsTpr); + break; + case "lift": + JObject lift = EvaluationComponent.parserCurveData(evaluationObj, "lift", evaluationTaskId, ""); + JObject newLift = JObject.create().append("validate_lift", lift.getJObject("lift")); + result.putAll(newLift); + break; + case "gain": + JObject gain = EvaluationComponent.parserCurveData(evaluationObj, "gain", evaluationTaskId, ""); + JObject newGain = JObject.create().append("validate_gain", gain.getJObject("gain")); + result.putAll(newGain); + break; + case "accuracy": + JObject accuracy = EvaluationComponent.parserCurveData(evaluationObj, "accuracy", evaluationTaskId, ""); + JObject newAccuracy = JObject.create().append("validate_accuracy", accuracy.getJObject("accuracy")); + result.putAll(newAccuracy); + break; + case "precision_recall": + JObject precision = EvaluationComponent.parserCurveData(evaluationObj, "precision", evaluationTaskId, ""); + JObject recall = EvaluationComponent.parserCurveData(evaluationObj, "recall", evaluationTaskId, ""); + JObject newPrecision = JObject.create().append("validate_precision", precision.getJObject("precision")); + JObject newRecall = JObject.create().append("validate_recall", recall.getJObject("recall")); + + result.putAll(newPrecision); + result.putAll(newRecall); + break; + case "roc": + JObject roc = EvaluationComponent.parserCurveData(evaluationObj, "roc", evaluationTaskId, ""); + JObject newRoc = JObject.create().append("validate_roc", roc.getJObject("roc")); + result.putAll(newRoc); + break; + case "topn": + JObject topNData = evaluationObj.getJObject(evaluationTaskId + "_topn"); + if (null != topNData) { + result.putAll(JObject.create("validate_topn", topNData.getJSONList("data.topn"))); + } + break; + case "model": + // Standardized output results of modeling nodes + result.putAll(normalizerModel(modelObj)); + break; + default: + } + taskResultMySqlModel.setResult(result.toJSONString()); + return taskResultMySqlModel; + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + return null; + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + return Arrays.asList(OutputItem.of(Names.JSON_RESULT, IODataType.Json)); + } + + /** + * Judge whether the dataset feature column selected by the corresponding member of the OOT component + * contains the feature column selected by the original dataio component + */ + private void checkSelectedFeatures(FlowGraph graph, FlowGraphNode node, Params params, DataIOComponent.DataSetItem myDataSetConfig) throws FlowNodeException { + // Relationship between member and selected dataset + Map selectedDataSetItemMap = getSelectedDataSetItemMap(params); + for (Map.Entry entry : selectedDataSetItemMap.entrySet()) { + String memberId = entry.getKey(); + // This is mainly to check the provider, not the promoter + if (memberId.equals(myDataSetConfig.getMemberId())) { + continue; + } + DataIOComponent.DataSetItem dataSetItem = entry.getValue(); + JobMemberRole jobMemberRole = dataSetItem.getMemberRole(); + // List of features selected by OOT component + List ootFeatures = dataSetItem.getFeatures(); + + String memberName = CacheObjects.getMemberName(memberId); + // In OOT mode + if (isOotMode(params)) { + QueryDataIoTaskConfigApi.Input input = new QueryDataIoTaskConfigApi.Input(); + input.setJobId(params.jobId); + input.setRole(jobMemberRole); + try { + ApiResult apiResult = gatewayService.sendToBoardRedirectApi(memberId, JobMemberRole.promoter, input, QueryDataIoTaskConfigApi.class); + if (0 != apiResult.code) { + throw new FlowNodeException(node, "鑾峰彇鎴愬憳[" + memberName + "]鐨勫師鍏ユā鐗瑰緛鍒楀け璐,鍘熷洜锛" + apiResult.message); + } + JObject data = JObject.create(apiResult.data); + if (null == data || data.isEmpty()) { + throw new FlowNodeException(node, "鑾峰彇鎴愬憳[" + memberName + "]鐨勫師鍏ユā鐗瑰緛鍒椾负绌恒"); + } + + // Feature column selected for original dataio modeling + List dataIoFeatures = JObject.parseArray(data.getStringByPath("params.need_features")).toJavaList(String.class); + if (!ootFeatures.containsAll(dataIoFeatures)) { + throw new FlowNodeException(node, "鎴愬憳[" + memberName + "]鏁版嵁闆嗙壒寰佷笉鍏ㄥ寘鍚師鍏ユā鐗瑰緛鍒,璇烽噸鏂伴夋嫨鍏朵粬鏁版嵁闆嗗啀璇"); + } + + } catch (FlowNodeException e) { + LOG.error("Failed to get member features column, memberId: " + memberId + " ,exception: ", e); + throw e; + } catch (Exception e) { + LOG.error("Failed to get member features column, memberId, memberId: " + memberId + ", exception: ", e); + throw new FlowNodeException(node, "鑾峰彇鎴愬憳[" + memberName + "]鐨勫師鍏ユā鐗瑰緛鍒楀け璐ワ紝鍘熷洜锛" + e.getMessage()); + } + } else { + // Find the dataio component in the process + FlowGraphNode dataIoFlowGraphNode = null; + for (ComponentType componentType : DATA_IO_COMPONENT_TYPE_LIST) { + dataIoFlowGraphNode = graph.findOneNodeFromParent(node, componentType); + if (null != dataIoFlowGraphNode) { + break; + } + } + if (null == dataIoFlowGraphNode) { + throw new FlowNodeException(node, "璇风‘淇濇祦绋嬩腑瀛樺湪[閫夋嫨鏁版嵁闆哴鑺傜偣銆"); + } + ProjectFlowNodeMySqlModel projectFlowNodeMySqlModel = projectFlowNodeService.findOne(node.getFlowId(), dataIoFlowGraphNode.getNodeId()); + if (null == projectFlowNodeMySqlModel || StringUtil.isEmpty(projectFlowNodeMySqlModel.getParams())) { + throw new FlowNodeException(node, "璇蜂繚瀛樻祦绋嬩腑鐨刐閫夋嫨鏁版嵁闆哴鑺傜偣鍙傛暟銆"); + } + List dataSetList = JObject.create(projectFlowNodeMySqlModel.getParams()).getJSONList("dataset_list"); + for (JObject dataSet : dataSetList) { + String dataSetMemberId = dataSet.getString("member_id"); + String dataSetMemberRole = dataSet.getString("member_role"); + String dataSetFeaturesStr = dataSet.getString("features"); + if (JobMemberRole.arbiter.name().equals(dataSetMemberRole)) { + continue; + } + + List dataSetFeatures = JObject.parseArray(dataSetFeaturesStr).toJavaList(String.class); + if (memberId.equals(dataSetMemberId) && !ootFeatures.containsAll(dataSetFeatures)) { + throw new FlowNodeException(node, "璇风‘淇濇垚鍛榌" + memberName + "]鍦╗鎵撳垎楠岃瘉]鑺傜偣鐨勬暟鎹泦鐗瑰緛鍖呭惈[閫夋嫨鏁版嵁闆哴鑺傜偣鐩稿簲鎴愬憳宸查夋嫨鐨勭壒寰佸垪銆"); + } + } + } + } + } + + /** + * Check whether the submitted dataset information is valid + */ + private void checkSelectedMembersValid(FlowGraph graph, FlowGraphNode node, Params params) throws FlowNodeException { + List dataSetItemList = params.getDataSetList(); + if (isOotMode(params)) { + JobMySqlModel jobMySqlModel = jobService.findByJobId(params.jobId, JobMemberRole.promoter); + if (null == jobMySqlModel) { + throw new FlowNodeException(node, "鎵句笉鍒板師娴佺▼浠诲姟淇℃伅"); + } + ListApi.Input input = new ListApi.Input(); + input.setProjectId(jobMySqlModel.getProjectId()); + input.setOotJobId(params.jobId); + try { + List projectMemberMySqlModelList = projectMemberService.findList(input); + if (FederatedLearningType.vertical.equals(graph.getFederatedLearningType())) { + List selectedMemberIdList = dataSetItemList.stream().map(DataIOComponent.DataSetItem::getMemberId).collect(Collectors.toList()); + for (ProjectMemberMySqlModel projectMemberMySqlModel : projectMemberMySqlModelList) { + if (!selectedMemberIdList.contains(projectMemberMySqlModel.getMemberId())) { + throw new FlowNodeException(node, "璇烽夋嫨鎴愬憳[" + CacheObjects.getMemberName(projectMemberMySqlModel.getMemberId()) + "]鏁版嵁闆嗕俊鎭"); + } + } + } + } catch (StatusCodeWithException e) { + throw new FlowNodeException(node, e.getMessage()); + } + } + } + + /** + * Check for unsupported components + */ + private void checkUnsupportedComponent(FlowGraphNode node, List taskMySqlModelList) throws FlowNodeException { + if (CollectionUtils.isEmpty(taskMySqlModelList)) { + throw new FlowNodeException(node, "鏈壘浠讳綍鑺傜偣浠诲姟淇℃伅銆"); + } + + for (TaskMySqlModel taskMySqlModel : taskMySqlModelList) { + for (ComponentType componentType : TEMP_UNSUPPORTED_COMPONENT_TYPE_LIST) { + if (componentType.equals(taskMySqlModel.getTaskType())) { + throw new FlowNodeException(node, "鏆傛椂涓嶆敮鎸佺粍浠躲" + componentType.getLabel() + "銆"); + } + } + } + } + + + /** + * Query all task lists of homologous branches + */ + private List findHomologousBranch(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + // Task ID to find + String taskId = null; + if (isOotMode(params)) { + // Find out the modeling node in the original process + TaskMySqlModel modelTaskMysqlModel = preTasks.stream().filter(x -> x.getFlowNodeId().equals(params.modelFlowNodeId)).findFirst().orElse(null); + if (null == modelTaskMysqlModel) { + throw new FlowNodeException(node, "鎵句笉鍒板缓妯¤妭鐐逛换鍔′俊鎭"); + } + taskId = modelTaskMysqlModel.getTaskId(); + } else { + // Parent task ID of the current OOT component + taskId = node.createParentTaskIds(graph.getJob()); + } + return taskService.baseFindHomologousBranch(preTasks, taskId); + } + + /** + * Get my dataset configuration + */ + private DataIOComponent.DataSetItem getMyDataSetConfig(FlowGraph graph, Params params) { + return params.getDataSetList() + .stream() + .filter(x -> x.getMemberId().equals(CacheObjects.getMemberId()) && x.getMemberRole() == graph.getJob().getMyRole()) + .findFirst() + .orElse(null); + } + + /** + * Query dataio components from task list + */ + private TaskMySqlModel findDataIoTask(List taskMySqlModelList) { + return taskMySqlModelList.stream().filter(x -> DATA_IO_COMPONENT_TYPE_LIST.contains(x.getTaskType())).findFirst().orElse(null); + } + + /** + * Returns the mapping relationship between member and dataset + * + * @return KEY锛歁ember ID, Value锛歋elected dataset + */ + private Map getSelectedDataSetItemMap(Params params) { + Map resultMap = new HashMap<>(16); + List dataSetItemList = params.getDataSetList(); + for (DataIOComponent.DataSetItem dataSetItem : dataSetItemList) { + resultMap.put(dataSetItem.getMemberId(), dataSetItem); + } + + return resultMap; + } + + + /** + * Is exist evaluation component in the task list + * + * @param taskMySqlModelList task list + */ + private boolean isExistEvaluationComponent(List taskMySqlModelList) { + if (CollectionUtils.isEmpty(taskMySqlModelList)) { + return false; + } + for (TaskMySqlModel taskMySqlModel : taskMySqlModelList) { + if (ComponentType.Evaluation.equals(taskMySqlModel.getTaskType())) { + return true; + } + } + return false; + } + + /** + * Create task configuration for evaluation component + */ + private TaskMySqlModel createEvaluationTaskMySqlModel(FlowGraph graph, FlowGraphNode node, TaskMySqlModel dataIoTask, OotComponent.Params ootParams) throws FlowNodeException { + if (StringUtil.isEmpty(ootParams.getEvalType()) || null == ootParams.posLabel) { + throw new FlowNodeException(node, "璇峰~鍐欍愭墦鍒嗛獙璇併戣妭鐐圭殑璇勪及绫诲埆鎴栨鏍囩绫诲瀷瀛楁銆"); + } + TaskMySqlModel evaluationTaskMySqlModel = new TaskMySqlModel(); + String evaluationTaskId = dataIoTask.getTaskId(); + for (ComponentType componentType : DATA_IO_COMPONENT_TYPE_LIST) { + evaluationTaskId = evaluationTaskId.replace(componentType.name(), ComponentType.Evaluation.name()); + } + evaluationTaskMySqlModel.setTaskId(evaluationTaskId); + evaluationTaskMySqlModel.setTaskType(ComponentType.Evaluation); + evaluationTaskMySqlModel.setJobId(dataIoTask.getJobId()); + evaluationTaskMySqlModel.setFlowNodeId(System.currentTimeMillis() + ""); + evaluationTaskMySqlModel.setName(ComponentType.Evaluation.name()); + + // Create an evaluated task configuration based on the task configuration of the dataio component + AbstractComponent evaluationComponent = Components.get(ComponentType.Evaluation); + TaskConfig taskConfig = JObject.parseObject(dataIoTask.getTaskConf(), TaskConfig.class); + taskConfig.setInput(JObject.create().append("data", JObject.create(Names.Data.NORMAL_DATA_SET, Arrays.asList(dataIoTask.getTaskId())))); + taskConfig.setOutput(evaluationComponent.getOutputs(graph, node)); + taskConfig.setModule(ComponentType.Evaluation); + // Reassemble evaluation parameters + JObject evaluationParam = JObject.create(); + evaluationParam.append("eval_type", ootParams.evalType) + .append("pos_label", ootParams.posLabel); + taskConfig.setParams(evaluationParam); + evaluationTaskMySqlModel.setTaskConf(JSON.toJSONString(taskConfig)); + return evaluationTaskMySqlModel; + } + + + /** + * Standardized model configuration + */ + private JObject normalizerModel(JObject modelObj) { + JObject result = JObject.create(); + + if (null == modelObj || modelObj.isEmpty()) { + return result; + } + + // Component name + String moduleName = modelObj.getStringByPath("task_config.module"); + // Learning type + String federatedLearningType = modelObj.getStringByPath("task_config.job.federated_learning_type"); + // Component parameters + JObject modelParams = JObject.create(modelObj.getStringByPath("task_config.params")); + // Data set y-value statistics + JObject predictMetricData = modelObj.getJObject("predict_metric_data"); + + return result.append("module_name", moduleName) + .append("federated_learning_type", federatedLearningType) + .append("model_params", modelParams) + .append("predict_metric_data", predictMetricData); + } + + + /** + * Find the task ID key from the evaluation results + * + * @param evaluationObj Evaluation result JSON + */ + private String findComponentTaskId(JObject evaluationObj) { + if (null == evaluationObj || evaluationObj.isEmpty()) { + return ""; + } + + Set keySet = evaluationObj.keySet(); + for (String key : keySet) { + List endsWithKeyList = Arrays.asList("_ks_fpr", "_lift", "_gain", "_roc", "_accuracy", "_precision", + "_recall", "_topn"); + for (String endsWithKey : endsWithKeyList) { + if (key.endsWith(endsWithKey)) { + return key.substring(0, key.lastIndexOf(endsWithKey)); + } + } + + } + + return ""; + } + + + private void updateKernelJob(TaskConfig taskConfig, Params params) { + KernelJob kernelJob = taskConfig.getJob(); + kernelJob.setEnv(createEvn()); + kernelJob.setFederatedLearningMode(FederatedLearningModel.oot); + } + + /** + * Create sub component running environment + */ + private Env createEvn() { + Env env = new Env(); + env.setBackend(config.getBackend()); + env.setDbType(config.getDbType()); + env.setWorkMode(config.getWorkMode()); + env.setName(config.getEnvName()); + return env; + } + + + /** + * Is it OOT mode + *

+ * If the jobid is not empty, it means an OOT process (a process containing only two components of [start] and [OOT]). + * This jobid means the jobid of the old process + *

+ */ + private boolean isOotMode(Params params) { + return StringUtil.isNotEmpty(params.getJobId()); + } + + public static class Params extends AbstractCheckModel { + private List dataSetList; + /** + * Specify jobid to create OOT component (used in OOT mode) + */ + private String jobId; + /** + * Modeled node ID (used to distinguish which branch under the specified jobid is used for OOT) (used in OOT mode) + */ + private String modelFlowNodeId; + /** + * Evaluation category (if there is no evaluation component in the original process, this parameter should be filled in for the input parameter of OOT component) + */ + private String evalType; + /** + * Positive label type (if there is no evaluation component in the original process, this parameter should be filled in the OOT component input parameter) + */ + private Integer posLabel; + + public List getDataSetList() { + return dataSetList; + } + + public void setDataSetList(List dataSetList) { + this.dataSetList = dataSetList; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getEvalType() { + return evalType; + } + + public void setEvalType(String evalType) { + this.evalType = evalType; + } + + public Integer getPosLabel() { + return posLabel; + } + + public void setPosLabel(Integer posLabel) { + this.posLabel = posLabel; + } + + public String getModelFlowNodeId() { + return modelFlowNodeId; + } + + public void setModelFlowNodeId(String modelFlowNodeId) { + this.modelFlowNodeId = modelFlowNodeId; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/SegmentComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/SegmentComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..b7a60530ef038302fc6888576b45436cd35d6734 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/SegmentComponent.java" @@ -0,0 +1,193 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * Segment component + * + * @author lonnie + */ +@Service +class SegmentComponent extends AbstractComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + double trainingRatio = params.getTrainingRatio(); + double verificationRatio = params.getVerificationRatio(); + if (trainingRatio <= 0 || trainingRatio >= 100 || verificationRatio <= 0 || verificationRatio >= 100) { + throw new FlowNodeException(node, "璁粌涓庨獙璇佹暟鎹殑姣斾緥闇瑕佸湪0鍒100涔嬮棿銆"); + } + } + + + @Override + public ComponentType taskType() { + return ComponentType.Segment; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + + // Reassemble front-end parameters + JObject segmentParam = JObject.create(); + + FederatedLearningType federatedLearningType = graph.getJob().getFederatedLearningType(); + if (federatedLearningType == FederatedLearningType.vertical) { + segmentParam.append("mode", "vert"); + } else if (federatedLearningType == FederatedLearningType.horizontal) { + segmentParam.append("mode", "horz"); + } + + // Take with_label from the task parameter of the dataIO component + FlowGraphNode dataIONode = graph.findOneNodeFromParent(node, ComponentType.DataIO); + TaskMySqlModel dataIOTask = findTaskFromPretasks(preTasks, dataIONode); + + if (dataIONode == null || dataIOTask == null) { + throw new FlowNodeException(node, "璇锋坊鍔燚ataIO缁勪欢!"); + } + + JObject taskConfig = JObject.create(dataIOTask.getTaskConf()); + boolean withLabel = taskConfig.getJObject("params").getBooleanValue("with_label"); + + segmentParam.append("random_num", params.getSplitDataRandomNum()) + .append("train_ratio", params.getTrainingRatio() / (params.getTrainingRatio() + params.getVerificationRatio())) + .append("with_label", withLabel) + .append("label_name", "y") + .append("label_type", "int"); + + taskParam.put("params", segmentParam); + + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + return taskResultService.listAllResult(taskId); + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + TaskResultMySqlModel resultModel = taskResultService.findByTaskIdAndType(taskId, TaskResultType.metric_train_eval.name()); + if (resultModel == null) { + return null; + } + JObject resultObj = JObject.create(resultModel.getResult()); + + boolean withLabel = Boolean.parseBoolean(resultObj.getStringByPath("train_eval_segment.data.with_label.value")); + int trainCount = resultObj.getIntegerByPath("train_eval_segment.data.train_count.value", 0); + // Number of positive training examples + int trainyPositiveExampleCount = resultObj.getIntegerByPath("train_eval_segment.data.train_y_positive_example_count.value", 0); + + // Proportion of training positive examples + double trainyPositiveExampleRatio = resultObj.getDoubleByPath("train_eval_segment.data.train_y_positive_example_ratio.value", 0d); + int evalCount = resultObj.getIntegerByPath("train_eval_segment.data.eval_count.value", 0); + + // Verify the number of positive examples + int evalyPositiveExampleCount = resultObj.getIntegerByPath("train_eval_segment.data.eval_y_positive_example_count.value", 0); + + // Verify the proportion of positive cases + double evalyPositiveExampleVatio = resultObj.getDoubleByPath("train_eval_segment.data.eval_y_positive_example_ratio.value", 0d); + + resultModel.setResult(JObject.create() + .append("contains_y", withLabel) + .append("train_count", trainCount) + .append("train_y_positive_example_count", trainyPositiveExampleCount) + .append("train_y_positive_example_ratio", trainyPositiveExampleRatio) + .append("eval_count", evalCount) + .append("eval_y_positive_example_count", evalyPositiveExampleCount) + .append("eval_y_positive_example_ratio", evalyPositiveExampleVatio).toJSONString()); + + return resultModel; + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + + return Arrays.asList( + InputMatcher.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.Data.TRAIN_DATA_SET, IODataType.DataSetInstance), + OutputItem.of(Names.Data.EVALUATION_DATA_SET, IODataType.DataSetInstance) + ); + } + + public static class Params extends AbstractCheckModel { + + @Check(name = "鍒囧垎闅忔満鏁", require = true) + private int splitDataRandomNum; + + @Check(name = "璁粌闆", require = true) + private double trainingRatio; + + @Check(name = "楠岃瘉闆", require = true) + private double verificationRatio; + + public int getSplitDataRandomNum() { + return splitDataRandomNum; + } + + public void setSplitDataRandomNum(int splitDataRandomNum) { + this.splitDataRandomNum = splitDataRandomNum; + } + + public double getTrainingRatio() { + return trainingRatio; + } + + public void setTrainingRatio(double trainingRatio) { + this.trainingRatio = trainingRatio; + } + + public double getVerificationRatio() { + return verificationRatio; + } + + public void setVerificationRatio(double verificationRatio) { + this.verificationRatio = verificationRatio; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/AbstractComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/AbstractComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..31ea1b7a1a9e8adb66c6c591bb0b91be7793b68a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/AbstractComponent.java" @@ -0,0 +1,743 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.base; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.apache.commons.collections.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; +import com.welab.wefe.board.service.component.Components; +import com.welab.wefe.board.service.component.DataIOComponent; +import com.welab.wefe.board.service.component.OotComponent; +import com.welab.wefe.board.service.component.base.io.DataTypeGroup; +import com.welab.wefe.board.service.component.base.io.InputGroup; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.NodeOutputItem; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.database.repository.TaskRepository; +import com.welab.wefe.board.service.dto.entity.job.TaskResultOutputModel; +import com.welab.wefe.board.service.dto.kernel.KernelJob; +import com.welab.wefe.board.service.dto.kernel.KernelTask; +import com.welab.wefe.board.service.dto.kernel.Member; +import com.welab.wefe.board.service.dto.kernel.TaskConfig; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.board.service.service.JobService; +import com.welab.wefe.board.service.service.TaskResultService; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.TaskStatus; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.util.JObject; + +/** + * @author zane.luo + */ +@Service +public abstract class AbstractComponent { + protected final Logger LOG = LoggerFactory.getLogger(this.getClass()); + + /** + * component type about data set + */ + public final static List DATA_IO_COMPONENT_TYPE_LIST = Arrays.asList( + ComponentType.DataIO, + ComponentType.HorzLRValidationDataSetLoader, + ComponentType.VertLRValidationDataSetLoader, + ComponentType.HorzXGBoostValidationDataSetLoader, + ComponentType.VertXGBoostValidationDataSetLoader + ); + + /** + * component type about modeling + */ + public final static List MODEL_COMPONENT_TYPE_LIST = Arrays.asList( + ComponentType.HorzLR, + ComponentType.VertLR, + ComponentType.HorzSecureBoost, + ComponentType.VertSecureBoost, + ComponentType.MixLR, + ComponentType.MixSecureBoost, + ComponentType.HorzNN, + ComponentType.VertNN + ); + + + @Autowired + protected JobService jobService; + @Autowired + protected TaskResultService taskResultService; + @Autowired + protected TaskRepository taskRepository; + + /** + * create mix flow task + * + * @param graph graph + * @param preTasks pre task list + * @param node node + */ + public List buildMixTask(FlowGraph graph, List preTasks, KernelJob jobInfo, FlowGraphNode node) throws StatusCodeWithException { + + T params = (T) node.getParamsModel(); + + // check task params at promoter + if (graph.getJob().getMyRole() == JobMemberRole.promoter) { + checkBeforeBuildTask(graph, preTasks, node, params); + + // need intersected + if (needIntersectedDataSetBeforeMe()) { + if (!parentHasIntersectedDataSet(graph, node)) { + throw new FlowNodeException(node, "璇峰湪鍓嶇疆娴佺▼涓墽琛屾暟鎹泦瀵归綈"); + } + } + } + JSONObject taskParam = createTaskParams(graph, preTasks, node, params); + if (taskParam == null) { + return null; + } + List kernelTasks = getMixTaskMembers(graph, node); + List subTasks = new ArrayList<>(); + int count = 1; + + FlowGraphNode parentNode = null; + List parentNodes = node.getParents(); + if (!CollectionUtils.isEmpty(parentNodes)) { + parentNode = parentNodes.get(0); + } + int randomCipherSeed = new Random().nextInt(100) + 1; + + for (KernelTask kernelTask : kernelTasks) { + TaskMySqlModel task = new TaskMySqlModel(); + task.setDeep(node.getDeep()); + task.setPosition(node.getPosition()); + task.setJobId(graph.getJob().getJobId()); + task.setFlowId(graph.getJob().getFlowId()); + task.setFlowNodeId(node.getNodeId()); + task.setTaskType(taskType()); + // special + node.setTaskName(FlowGraphNode.createTaskName(node.getComponentType(), node.getNodeId()) + "_" + count); + task.setName(node.getTaskName()); + + // special + if (parentNode != null) { + parentNode + .setTaskName(FlowGraphNode.createTaskName(parentNode.getComponentType(), parentNode.getNodeId()) + + "_" + count); + } + + TaskConfig taskConfig = new TaskConfig(); + + if (graph.getJob().getMyRole() == JobMemberRole.provider) { + if (node.getComponentType() == ComponentType.MixLR + || node.getComponentType() == ComponentType.MixSecureBoost) { + JSONObject p = taskParam.getJSONObject("params"); + p.put("random_cipher_seed", randomCipherSeed); + taskParam.put("params", p); + } + } + taskConfig.setJob(jobInfo); + taskConfig.setModule(taskType()); + taskConfig.setParams(taskParam.getJSONObject("params")); + taskConfig.setInput(generateInput(graph, node, count)); + taskConfig.setOutput(getOutputs(graph, node)); + taskConfig.setTask(kernelTask); + task.setTaskConf(JSON.toJSONString(taskConfig)); + task.setRole(graph.getJob().getMyRole()); + task.setStatus(TaskStatus.wait_run); + task.setTaskId(node.createTaskId(graph.getJob(), count)); + task.setParentTaskIdList( + node.createParentTaskIds(graph.getJob(), getCount(preTasks, node.getDeep() - 1, count))); + task.setProjectId(node.getProjectId()); + taskRepository.save(task); + subTasks.add(task); + count++; + + // rollback + node.setTaskName(FlowGraphNode.createTaskName(node.getComponentType(), node.getNodeId())); + if (parentNode != null) { + parentNode.setTaskName( + FlowGraphNode.createTaskName(parentNode.getComponentType(), parentNode.getNodeId())); + } + } + return subTasks; + } + + private Map generateInput(FlowGraph graph, FlowGraphNode node, int count) throws FlowNodeException{ + Map inputs = getInputs(graph, node); + try { + + JSONObject json = JSON.parseObject(JSON.toJSONString(inputs)); + JSONObject data = json.getJSONObject("data"); + Set> entrySet = data.entrySet(); + + for(Map.Entry entry : entrySet){ + List dataSetList = data.getObject(entry.getKey(), TypeReference.LIST_STRING); + String end = "_" + count; + List newDataSet = new ArrayList<>(); + for (String s : dataSetList) { + if (s.endsWith(end)) { + newDataSet.add(s); + } else { + newDataSet.add(s + end); + } + } + + if (!newDataSet.isEmpty()) { + data.put(entry.getKey(), newDataSet); + } + } + if (!data.isEmpty()) { + json.put("data", data); + inputs = json.getInnerMap(); + } + } catch (Exception e) { + LOG.warn("parse inputs error, json = " + JSON.toJSONString(inputs), e); + } + return inputs; + } + private int getCount(List preTasks, int parentDeep, int currentCount) { + if (parentDeep < 0 || preTasks == null || preTasks.isEmpty()) { + return currentCount; + } + List pTasks = preTasks.stream().filter(t -> t.getDeep() == parentDeep) + .collect(Collectors.toList()); + int size = pTasks.size(); + return Math.min(currentCount, size); + } + + /** + * create task instance + * + * @param graph flow graph + * @param preTasks A collection of created tasks + * @param node the node of flow + */ + public TaskMySqlModel buildTask(FlowGraph graph, List preTasks, KernelJob jobInfo, FlowGraphNode node) throws StatusCodeWithException { + + T params = (T) node.getParamsModel(); + + // Check the legitimacy of the task created on the promoter side (the legitimacy of the process, the validity of the parameters) + if (graph.getJob().getMyRole() == JobMemberRole.promoter) { + checkBeforeBuildTask(graph, preTasks, node, params); + + // Requires alignment in front + if (needIntersectedDataSetBeforeMe()) { + if (!parentHasIntersectedDataSet(graph, node)) { + throw new FlowNodeException(node, "璇峰湪鍓嶇疆娴佺▼涓墽琛屾暟鎹泦瀵归綈"); + } + } + } + + JSONObject taskParam = createTaskParams(graph, preTasks, node, params); + if (taskParam == null) { + return null; + } + + TaskMySqlModel task = new TaskMySqlModel(); + task.setDeep(node.getDeep()); + task.setPosition(node.getPosition()); + task.setJobId(graph.getJob().getJobId()); + task.setFlowId(graph.getJob().getFlowId()); + task.setFlowNodeId(node.getNodeId()); + task.setTaskType(taskType()); + task.setName(node.getTaskName()); + + TaskConfig taskConfig = new TaskConfig(); + taskConfig.setJob(jobInfo); + taskConfig.setModule(taskType()); + taskConfig.setParams(taskParam.getJSONObject("params")); + taskConfig.setInput(getInputs(graph, node)); + taskConfig.setOutput(getOutputs(graph, node)); + taskConfig.setTask(getTaskMembers(graph, node)); + + task.setTaskConf( + JSON.toJSONString(taskConfig) + ); + + task.setRole(graph.getJob().getMyRole()); + task.setStatus(TaskStatus.wait_run); + task.setTaskId(node.createTaskId(graph.getJob())); + task.setParentTaskIdList(node.createParentTaskIds(graph.getJob())); + task.setProjectId(node.getProjectId()); + taskRepository.save(task); + + return task; + } + + + protected TaskMySqlModel findTaskFromPretasks(List preTasks, FlowGraphNode node) { + return preTasks + .stream() + .filter(x -> x.getFlowNodeId().equals(node.getNodeId())) + .findFirst() + .orElse(null); + } + + /** + * Do you need to stop creating the task + */ + public boolean stopCreateTask(List preNodes, FlowGraphNode node) throws StatusCodeWithException { + return false; + } + + /** + * Show all execution results + */ + public List getTaskAllResult(String taskId) { + List result = getAllResult(taskId); + if (result == null) { + return null; + } + + return result + .stream() + .filter(Objects::nonNull) + .map(x -> ModelMapper.map(x, TaskResultOutputModel.class)) + .collect(Collectors.toList()); + } + + /** + * Show the specified execution result + */ + public TaskResultOutputModel getTaskResult(String taskId, String type) { + TaskResultMySqlModel result = getResult(taskId, type); + if (result == null) { + return null; + } + + return ModelMapper.map(result, TaskResultOutputModel.class); + } + + /** + * Get the output node object of the task + */ + public Map getOutputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + List outputs = outputs(graph, node); + if (outputs == null) { + return null; + } + + Map> map = outputs + .stream() + .collect(Collectors.groupingBy( + x -> x.getDataType().getGroup(), + Collectors.toList() + )); + + JObject result = JObject.create(); + + map.forEach((k, v) -> + result.put( + k.getKey(), + v.stream() + .map(OutputItem::getName) + .collect(Collectors.toList()) + ) + ); + + return result; + } + + /** + * Get the input node object of the task + */ + public Map getInputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + // If manually specified, use the specified input. + + // else, automatic guess. + List inputNodes = findInputNodes(graph, node); + Map> map = inputNodes + .stream() + .collect(Collectors.groupingBy( + x -> x.getDataType().getGroup(), + Collectors.toList() + )); + + JObject result = JObject.create(); + + map.forEach((k, v) -> result.putAll(new InputGroup(k, v).toJsonNode())); + + // When input is empty, a data node needs to be constructed. + if (result.size() <= 0) { + result.append("data", JObject.create()); + } + + return result; + } + + /** + * Automatic estimation of input and output between nodes + */ + public List findInputNodes(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + List result = new ArrayList<>(); + + List matchers = inputs(graph, node); + if (matchers == null) { + return result; + } + + for (InputMatcher matcher : matchers) { + + NodeOutputItem item = matcher.dopeOut(graph, node); + + result.add(item); + } + + return result; + } + + + /** + * Find the current member's data from the list + */ + public T findMyData(Collection list, Function getMemberIdFunc) { + + if (list == null) { + return null; + } + + for (T item : list) { + String memberId = getMemberIdFunc.apply(item); + if (CacheObjects.getMemberId().equals(memberId)) { + return item; + } + } + + return null; + } + + /** + * Deserialize form parameters into Param objects + */ + public T deserializationParam(FlowGraphNode node, String json) throws FlowNodeException { + if (json == null) { + json = "{}"; + } + Class paramsClass = getParamsClass(this.getClass()); + T params = JObject + .create(json) + .toJavaObject(paramsClass); + + // Basic check of entry (non-empty, regular check) + try { + params.checkAndStandardize(); + } catch (StatusCodeWithException e) { + throw new FlowNodeException(node, e.getMessage()); + } + + return params; + } + + /** + * Get the input parameter type of the current component + */ + private Class getParamsClass(Class clazz) { + + while (!(clazz.getGenericSuperclass() instanceof ParameterizedType)) { + clazz = clazz.getSuperclass(); + } + + Type[] types = ((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments(); + if (types.length > 0) { + Class type = (Class) types[0]; + return (Class) type; + } + + return getParamsClass(clazz.getSuperclass()); + } + + public List getMixTaskMembers(FlowGraph graph, FlowGraphNode node) { + List kernelTasks = new ArrayList<>(); + List allMembers = graph.getMembers().stream().map(Member::new).collect(Collectors.toList()); + List promoters = allMembers.stream().filter(s -> s.getMemberRole() == JobMemberRole.promoter) + .collect(Collectors.toList()); + List providers = allMembers.stream().filter(s -> s.getMemberRole() == JobMemberRole.provider) + .collect(Collectors.toList()); + + Member arbiter = allMembers.stream().filter(x -> x.getMemberRole() == JobMemberRole.arbiter).findFirst() + .orElse(null); + + if (arbiter == null) { + // need arbiter + if (node.getComponentType() == ComponentType.MixLR + || node.getComponentType() == ComponentType.MixSecureBoost + || node.getComponentType() == ComponentType.MixStatistic + || node.getComponentType() == ComponentType.MixBinning) { + Member promoter = allMembers.stream().filter(x -> x.getMemberRole() == JobMemberRole.promoter) + .findFirst().orElse(null); + if (promoter != null) { + arbiter = new Member(); + arbiter.setMemberId(promoter.getMemberId()); + arbiter.setMemberRole(JobMemberRole.arbiter); + arbiter.setMemberName(promoter.getMemberName()); + allMembers.add(arbiter); + } + } + } + + if (graph.getJob().getMyRole() == JobMemberRole.promoter) { + // need arbiter + if (node.getComponentType() == ComponentType.MixLR + || node.getComponentType() == ComponentType.MixSecureBoost + || node.getComponentType() == ComponentType.MixStatistic + || node.getComponentType() == ComponentType.MixBinning) { + KernelTask task = new KernelTask(); + task.setMembers(allMembers); + kernelTasks.add(task); + } else { + List members = new ArrayList<>(); + members.add(promoters.stream().filter(x -> CacheObjects.getMemberId().equals(x.getMemberId())) + .findFirst().orElse(null)); + members.addAll(providers); + KernelTask task = new KernelTask(); + task.setMembers(members); + kernelTasks.add(task); + } + } else if (graph.getJob().getMyRole() == JobMemberRole.arbiter) { + if (node.getComponentType() == ComponentType.MixLR + || node.getComponentType() == ComponentType.MixSecureBoost) { + // do not need provider + List members = new ArrayList<>(promoters); + members.add( + allMembers.stream().filter(s -> s.getMemberRole() == JobMemberRole.arbiter).findFirst().orElse(null)); + KernelTask task = new KernelTask(); + task.setMembers(members); + kernelTasks.add(task); + } else if (node.getComponentType() == ComponentType.MixStatistic + || node.getComponentType() == ComponentType.MixBinning) { + KernelTask task = new KernelTask(); + task.setMembers(allMembers); + kernelTasks.add(task); + } + } + // provider need more tasks + else if (graph.getJob().getMyRole() == JobMemberRole.provider) { + int count = 0; + int providerMasterIndex = 1; + List providerOtherInnerId = new ArrayList<>(); + String providerMasterInnerId = CacheObjects.getMemberId() + "_" + providerMasterIndex; + int size = promoters.size(); + for (int i = 0; i < size; i++) { + if (i != providerMasterIndex) { + providerOtherInnerId.add(CacheObjects.getMemberId() + "_" + i); + } + } + for (Member promoter : promoters) { + if (node.getComponentType() == ComponentType.MixLR + || node.getComponentType() == ComponentType.MixSecureBoost + || node.getComponentType() == ComponentType.MixStatistic + || node.getComponentType() == ComponentType.MixBinning) { + KernelTask task = new KernelTask(); + task.setMembers(allMembers); + task.setMixPromoterMemberId(promoter.getMemberId()); + + // special params + task.setProviderMaster(count == providerMasterIndex); + task.setProviderInnerId(CacheObjects.getMemberId() + "_" + count); + task.setProviderOtherInnerId(providerOtherInnerId); + task.setProviderMasterInnerId(providerMasterInnerId); + count++; + kernelTasks.add(task); + } else { + List members = new ArrayList<>(); + members.add(promoter); + members.addAll(providers); + KernelTask task = new KernelTask(); + task.setMembers(members); + task.setMixPromoterMemberId(promoter.getMemberId()); + + // special params + task.setProviderMaster(count == providerMasterIndex); + task.setProviderInnerId(CacheObjects.getMemberId() + "_" + count); + task.setProviderOtherInnerId(providerOtherInnerId); + task.setProviderMasterInnerId(providerMasterInnerId); + count++; + kernelTasks.add(task); + } + } + } + return kernelTasks; + } + + /** + * Obtain member information of participating components, subject to the members selected by DataIO. + */ + public KernelTask getTaskMembers(FlowGraph graph, FlowGraphNode node) { + + List dataSetItems = null; + if (node.getComponentType() == ComponentType.DataIO) { + dataSetItems = ((DataIOComponent.Params) node.getParamsModel()).getDataSetList(); + } else if (node.getComponentType() == ComponentType.Oot) { + OotComponent.Params params = ((OotComponent.Params) node.getParamsModel()); + dataSetItems = params.getDataSetList(); + } else { + DataIOComponent.Params dataIOParams = (DataIOComponent.Params) graph.findOneNodeFromParent(node, ComponentType.DataIO).getParamsModel(); + dataSetItems = dataIOParams.getDataSetList(); + } + + List members = new ArrayList<>(); + KernelTask task = new KernelTask(); + dataSetItems.forEach(x -> { + Member member = new Member(); + member.setMemberId(x.getMemberId()); + member.setMemberName(CacheObjects.getMemberName(x.getMemberId())); + member.setMemberRole(x.getMemberRole()); + members.add(member); + // Horizontal modeling component, and the current member is a promoter, need to + // increase arbiter. + if (Components.needArbiterTask(node.getComponentType())) { + if (x.getMemberRole() == JobMemberRole.promoter && CacheObjects.getMemberId().equals(x.getMemberId())) { + Member arbiterMember = new Member(); + arbiterMember.setMemberId(x.getMemberId()); + arbiterMember.setMemberName(CacheObjects.getMemberName(x.getMemberId())); + arbiterMember.setMemberRole(JobMemberRole.arbiter); + members.add(arbiterMember); + } + } + }); + + Member promoter = graph.getMembers().stream().map(x -> new Member(x)) + .filter(s -> s.getMemberRole() == JobMemberRole.promoter).findFirst().orElse(null); + + if (Components.needArbiterTask(node.getComponentType())) { + if (graph.getJob().getMyRole() == JobMemberRole.provider && promoter != null) { + Member arbiterMember = new Member(); + arbiterMember.setMemberId(promoter.getMemberId()); + arbiterMember.setMemberName(CacheObjects.getMemberName(promoter.getMemberId())); + arbiterMember.setMemberRole(JobMemberRole.arbiter); + members.add(arbiterMember); + } + } + + task.setMembers(members); + + return task; + } + + /** + * Whether you can select features, Not by default. + */ + public boolean canSelectFeatures() { + return false; + } + + /** + * Whether there are form parameters, there are by default, + * and the components that are not are overridden in subclasses. + */ + public boolean hasParams() { + return true; + } + + /** + * Declare whether data alignment needs to be performed before me + */ + protected boolean needIntersectedDataSetBeforeMe() { + return false; + } + + public boolean parentHasIntersectedDataSet(FlowGraph graph, FlowGraphNode node) { + FlowGraphNode intersectedDataSet = graph.findOneNodeFromParent(node, x -> { + if (x.getComponentType() == ComponentType.Intersection) { + return true; + } + + if (x.getComponentType() == ComponentType.DataIO) { + DataIOComponent.Params dataIOParams = (DataIOComponent.Params) x.getParamsModel(); + DataSetMysqlModel myDataSet = dataIOParams.getMyDataSet(); + + // If it is not a derived data set, it must have been misaligned. + if (myDataSet != null && myDataSet.getSourceType() != null) { + + // If the derived data set comes from alignment + if (myDataSet.getSourceType() == ComponentType.Intersection) { + return true; + } + + /** + * Here is a bit rough for the time being, + * thinking that all the derived data sets are aligned. + * If you don't do this, + * you need to investigate the source job of the derived data set and search recursively. + */ + return true; + } + + + } + + return false; + }); + + return intersectedDataSet != null; + } + + //region abstract + + /** + * Check the validity of the input parameters and throw an exception when the requirements are not met. + */ + protected abstract void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, T params) throws FlowNodeException; + + /** + * Assemble the input parameters of the task according to the component configuration + */ + protected abstract JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, T params) throws FlowNodeException; + + public abstract ComponentType taskType(); + + /** + * Show all execution results + */ + protected abstract List getAllResult(String taskId); + + /** + * Show the specified execution result + */ + protected abstract TaskResultMySqlModel getResult(String taskId, String type); + + /** + * Declare the input parameter type + */ + protected abstract List inputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException; + + /** + * Declare the output type + */ + public abstract List outputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException; + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/filter/BinnedOutputFilter.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/filter/BinnedOutputFilter.java" new file mode 100644 index 0000000000000000000000000000000000000000..a66b470df54b4c75444703c6b53d4990ef81551b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/filter/BinnedOutputFilter.java" @@ -0,0 +1,85 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.base.filter; + +import com.welab.wefe.board.service.component.DataIOComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.enums.ComponentType; + +/** + * Query conditions: include data after binning + * + * @author zane.luo + */ +public class BinnedOutputFilter implements OutputItemFilterFunction { + + private final FlowGraph graph; + + public BinnedOutputFilter(FlowGraph graph) { + this.graph = graph; + } + + @Override + public boolean apply(FlowGraphNode node, OutputItem outputItem) { + return binned(graph, node, outputItem); + } + + /** + * Determine whether the data in a node is the data after binning + */ + public static boolean binned(FlowGraph graph, FlowGraphNode node, OutputItem outputItem) { + + // The aligned data must be Instance + if (outputItem.getDataType() != IODataType.DataSetInstance) { + return false; + } + + // The premise of binning is data alignment + if (!IntersectedOutputFilter.intersected(graph, node, outputItem)) { + return false; + } + + // If the current node is binning, it is directly available + if (node.getComponentType() == ComponentType.Binning) { + return true; + } + + // If the parent node of the node contains binning, it proves that the data is binned data. + if (graph.findOneNodeFromParent(node, ComponentType.Binning) != null) { + return true; + } + + // If the original data source comes from the binned data, it proves that the data is binned data. + FlowGraphNode dataIONode = graph.findOneNodeFromParent(node, ComponentType.DataIO); + if (dataIONode != null) { + DataIOComponent.Params params = (DataIOComponent.Params) dataIONode.getParamsModel(); + DataSetMysqlModel myDataSet = params.getMyDataSet(); + + return myDataSet != null && myDataSet.getSourceType() == ComponentType.Binning; + + } + + + // None of the above + return false; + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/filter/IntersectedOutputFilter.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/filter/IntersectedOutputFilter.java" new file mode 100644 index 0000000000000000000000000000000000000000..e753d5e5b67c615887e1675ae6120dc3c9f12472 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/filter/IntersectedOutputFilter.java" @@ -0,0 +1,95 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.base.filter; + +import com.welab.wefe.board.service.component.DataIOComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.enums.ComponentType; + +/** + * Query condition: aligned data + * + * @author zane.luo + */ +public class IntersectedOutputFilter implements OutputItemFilterFunction { + + private final FlowGraph graph; + + public IntersectedOutputFilter(FlowGraph graph) { + this.graph = graph; + } + + @Override + public boolean apply(FlowGraphNode node, OutputItem outputItem) { + + + return intersected(graph, node, outputItem); + } + + public static boolean intersected(FlowGraph graph, FlowGraphNode node, OutputItem outputItem) { + + // The aligned data must be Instance + if (outputItem.getDataType() != IODataType.DataSetInstance) { + return false; + } + + // If the current node is aligned, it is directly available. + if (node.getComponentType() == ComponentType.Intersection) { + return true; + } + + // If the parent node of the node contains alignment, it proves that the data is aligned data. + if (graph.findOneNodeFromParent(node, ComponentType.Intersection) != null) { + return true; + } + + // If the original data source comes from aligned data, it proves that this data is aligned data. + FlowGraphNode dataIONode = graph.findOneNodeFromParent(node, ComponentType.DataIO); + if (dataIONode != null) { + DataIOComponent.Params params = (DataIOComponent.Params) dataIONode.getParamsModel(); + DataSetMysqlModel myDataSet = params.getMyDataSet(); + + // If it is not a derived data set, it must have been misaligned. + if (myDataSet == null || myDataSet.getSourceType() == null) { + return false; + } + + + // If the derived data set comes from alignment + if (myDataSet.getSourceType() == ComponentType.Intersection) { + return true; + } + + /** + * Here is a bit rough for the time being, + * thinking that all the derived data sets are aligned. + * + * If you don't do this, + * you need to investigate the source job of the derived data set and search recursively. + */ + return true; + + } + + // None of the above + return false; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/filter/OutputDataTypesOutputFilter.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/filter/OutputDataTypesOutputFilter.java" new file mode 100644 index 0000000000000000000000000000000000000000..8cb33754cab7191caea4358aea4bc68927c1160f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/filter/OutputDataTypesOutputFilter.java" @@ -0,0 +1,48 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.base.filter; + +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; + +import java.util.Arrays; +import java.util.List; + +/** + * Query conditions: look for nodes of the specified output type + * + * @author zane.luo + */ +public class OutputDataTypesOutputFilter implements OutputItemFilterFunction { + + private final FlowGraph graph; + private final List types; + + public OutputDataTypesOutputFilter(FlowGraph graph, IODataType... types) { + this.graph = graph; + this.types = Arrays.asList(types); + } + + @Override + public boolean apply(FlowGraphNode node, OutputItem outputItem) { + + return types.contains(outputItem.getDataType()); + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/filter/OutputItemFilterFunction.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/filter/OutputItemFilterFunction.java" new file mode 100644 index 0000000000000000000000000000000000000000..3319758e1f130250aba867d06d1955f855a4dfb1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/filter/OutputItemFilterFunction.java" @@ -0,0 +1,28 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.base.filter; + +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.model.FlowGraphNode; + +/** + * @author zane.luo + */ +@FunctionalInterface +public interface OutputItemFilterFunction { + boolean apply(FlowGraphNode node, OutputItem outputItem); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/DataTypeGroup.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/DataTypeGroup.java" new file mode 100644 index 0000000000000000000000000000000000000000..64367bde72e224e4476734477485d9c9f1157d5e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/DataTypeGroup.java" @@ -0,0 +1,39 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.base.io; + +/** + * @author zane.luo + */ +public enum DataTypeGroup { + /** + * + */ + Data("data"), + Model("model"), + Other("json"); + + private final String key; + + DataTypeGroup(String key) { + this.key = key; + } + + public String getKey() { + return key; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/IODataType.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/IODataType.java" new file mode 100644 index 0000000000000000000000000000000000000000..bc1c172cee356a4b8458dc169ea5e010f46b7c87 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/IODataType.java" @@ -0,0 +1,53 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.base.io; + +/** + * The input and output type of the component + * + * @author zane.luo + */ +public enum IODataType { + /** + * + */ + BoardDataSet("鍘熷鏁版嵁闆", DataTypeGroup.Data), + DataSetInstance("鍔犺浇鍚庣殑鏁版嵁闆", DataTypeGroup.Data), + + ModelFromLr("閫昏緫鍥炲綊妯″瀷", DataTypeGroup.Model), + ModelFromXGBoost("XGBoost妯″瀷", DataTypeGroup.Model), + ModelFromBinning("鍒嗙鍚庣殑妯″瀷", DataTypeGroup.Model), + ModelFromNN("娣卞害瀛︿範妯″瀷", DataTypeGroup.Model), + + Json("Json Result", DataTypeGroup.Other); + + private final String label; + private final DataTypeGroup group; + + IODataType(String label, DataTypeGroup group) { + this.label = label; + this.group = group; + } + + public String getLabel() { + return label; + } + + public DataTypeGroup getGroup() { + return group; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/InputGroup.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/InputGroup.java" new file mode 100644 index 0000000000000000000000000000000000000000..21847f70ed971732743af6ee8297f5097a3ebbfe --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/InputGroup.java" @@ -0,0 +1,91 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.base.io; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.common.util.JObject; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author zane.luo + */ +public class InputGroup { + private DataTypeGroup group; + private List items; + + public InputGroup(DataTypeGroup group, List items) { + this.group = group; + this.items = items; + } + + /** + * splice the data structure required by the kernel + */ + public JSONObject toJsonNode() { + + Map> groupByName = items + .stream() + .collect( + Collectors.groupingBy( + x -> x.getName(), + Collectors.toList() + ) + ); + + Map> map = new HashMap<>(); + groupByName.forEach((k, v) -> + map.put( + k, + v + .stream() + .map(x -> x.getTaskName()) + .collect(Collectors.toList()) + ) + ); + + return JObject + .create() + .put( + group.getKey(), + map + ); + } + + //region getter/setter + + public DataTypeGroup getGroup() { + return group; + } + + public void setGroup(DataTypeGroup group) { + this.group = group; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/InputMatcher.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/InputMatcher.java" new file mode 100644 index 0000000000000000000000000000000000000000..89dcdc7670bcf22bbf62ab41739ea222391980e0 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/InputMatcher.java" @@ -0,0 +1,135 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.base.io; + +import com.welab.wefe.board.service.component.base.filter.OutputDataTypesOutputFilter; +import com.welab.wefe.board.service.component.base.filter.OutputItemFilterFunction; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.enums.ComponentType; + +/** + * Component's input matcher + * + * @author zane.luo + */ +public class InputMatcher { + /** + * Need to match the name of the object + */ + private String name; + /** + * Whether it is an optional parameter + */ + private boolean optional; + /** + * Priority 1: Supply logic output input node directly through input parameter + */ + private InputSupplier supplier; + /** + * Priority 2: Find the node that meets the conditions through the adaptation check logic + */ + private OutputItemFilterFunction filter; + /** + * Priority 3: Automatic search according to the input parameter data type + */ + private IODataType dataType; + + /** + * Guess the input node of the specified node + */ + public NodeOutputItem dopeOut(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + + + NodeOutputItem outputItem = null; + + // Strategy 1: First use supplier to try to find input nodes + if (supplier != null) { + outputItem = supplier.get(graph, node); + } + + // Strategy 2: Try to use filter to find input nodes + if (outputItem == null && filter != null) { + outputItem = graph.findNodeOutputFromParent(node, filter); + } + + // Strategy 3: Automatic search according to the required data type + if (outputItem == null && dataType != null) { + outputItem = graph.findNodeOutputFromParent(node, new OutputDataTypesOutputFilter(graph, dataType)); + } + + if (outputItem == null && !optional) { + throw new FlowNodeException(node, buildMessageWhenDopeOutNone(name)); + } + + return outputItem; + } + + /** + * Generate a message when the front element cannot be found + */ + private String buildMessageWhenDopeOutNone(String name) { + switch (name) { + case Names.Model.BINNING_MODEL: + return "鑷姩鎺ㄦ祴鍓嶇疆瑕佺礌锛" + ComponentType.Binning.getLabel() + " 鏈壘鍒"; + case Names.Data.TRAIN_DATA_SET: + return "鑷姩鎺ㄦ祴鍓嶇疆瑕佺礌锛氳缁冩暟鎹泦 鏈壘鍒帮紝璇锋鏌ユ祦绋嬫槸鍚﹀悎鐞嗐"; + case Names.Data.EVALUATION_DATA_SET: + return "鑷姩鎺ㄦ祴鍓嶇疆瑕佺礌锛氶獙璇佹暟鎹泦 鏈壘鍒帮紝璇蜂娇鐢 鈥" + ComponentType.Segment.getLabel() + "鈥 鐢熸垚楠岃瘉闆嗐"; + case Names.Data.NORMAL_DATA_SET: + return "鑷姩鎺ㄦ祴鍓嶇疆瑕佺礌锛氭暟鎹泦 鏈壘鍒帮紝璇锋鏌ユ祦绋嬫槸鍚﹀悎鐞嗐"; + default: + return "鑷姩鎺ㄦ祴鍓嶇疆瑕佺礌锛" + name + " 鏈壘鍒帮紝璇锋鏌ユ祦绋嬫槸鍚﹀悎鐞嗐"; + } + } + + + //region constructor + + public static InputMatcher of(String name, IODataType dataType) { + InputMatcher matcher = new InputMatcher(); + matcher.name = name; + matcher.dataType = dataType; + return matcher; + } + + public static InputMatcher of(String name, InputSupplier supplier) { + InputMatcher matcher = new InputMatcher(); + matcher.name = name; + matcher.supplier = supplier; + return matcher; + } + + public static InputMatcher of(String name, OutputItemFilterFunction filter) { + InputMatcher matcher = new InputMatcher(); + matcher.name = name; + matcher.filter = filter; + return matcher; + } + + //endregion + + //region getter/setter + + public String getName() { + return name; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/InputSupplier.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/InputSupplier.java" new file mode 100644 index 0000000000000000000000000000000000000000..16a4e8065b167dcd2e4a0e2985f2d4724495a8b1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/InputSupplier.java" @@ -0,0 +1,35 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.base.io; + +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; + +/** + * The delegation used to find the entry node autonomously from it + * + * @author zane.luo + */ +@FunctionalInterface +public interface InputSupplier { + + /** + * Find the input node independently from the graph + */ + NodeOutputItem get(FlowGraph graph, FlowGraphNode node) throws FlowNodeException; +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/Names.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/Names.java" new file mode 100644 index 0000000000000000000000000000000000000000..03b4baf05788b23f58d52d4325c9efa6b200120c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/Names.java" @@ -0,0 +1,41 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.base.io; + +/** + * @author zane.luo + */ +public class Names { + + + public static final class Data { + public static final String NORMAL_DATA_SET = "normal"; + public static final String TRAIN_DATA_SET = "train"; + public static final String EVALUATION_DATA_SET = "evaluation"; + } + + + public static final class Model { + public static final String TRAIN_MODEL = "train"; + public static final String BINNING_MODEL = "binning"; + } + + + public static final String JSON_RESULT = "json_result"; + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/NodeOutputItem.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/NodeOutputItem.java" new file mode 100644 index 0000000000000000000000000000000000000000..dd98b1db918f58329898c633137fcd9747c7e455 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/NodeOutputItem.java" @@ -0,0 +1,69 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.base.io; + +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.enums.ComponentType; + +/** + * @author zane.luo + */ +public class NodeOutputItem extends OutputItem { + private ComponentType componentType; + private String nodeId; + private String taskName; + + public NodeOutputItem() { + } + + public NodeOutputItem(FlowGraphNode node, OutputItem item) { + super.setName(item.getName()); + super.setDataType(item.getDataType()); + + this.componentType = node.getComponentType(); + this.nodeId = node.getNodeId(); + this.taskName = node.getTaskName(); + } + + //region getter/setter + + public ComponentType getComponentType() { + return componentType; + } + + public void setComponentType(ComponentType componentType) { + this.componentType = componentType; + } + + public String getNodeId() { + return nodeId; + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + public String getTaskName() { + return taskName; + } + + public void setTaskName(String taskName) { + this.taskName = taskName; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/OutputItem.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/OutputItem.java" new file mode 100644 index 0000000000000000000000000000000000000000..9e97a3e9a257d42286b9210d078808ccaf776536 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/base/io/OutputItem.java" @@ -0,0 +1,56 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.base.io; + +/** + * Component output + * + * @author zane.luo + */ +public class OutputItem { + + private String name; + private IODataType dataType; + + public static OutputItem of(String name, IODataType dataType) { + OutputItem item = new OutputItem(); + item.name = name; + item.dataType = dataType; + return item; + } + + //region getter/setter + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public IODataType getDataType() { + return dataType; + } + + public void setDataType(IODataType dataType) { + this.dataType = dataType; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/BinningComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/BinningComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..f78c108420f1ce2a80aa5b410631ee919e457f73 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/BinningComponent.java" @@ -0,0 +1,455 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.feature; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.DataIOComponent; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; + +/** + * @author lonnie + */ +@Service +public class BinningComponent extends AbstractComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + FlowGraphNode intersectionNode = graph.findOneNodeFromParent(node, ComponentType.Intersection); + if (intersectionNode == null) { + throw new FlowNodeException(node, "璇峰湪鍓嶉潰娣诲姞鏍锋湰瀵归綈缁勪欢銆"); + } + + if (CollectionUtils.isEmpty(params.getMembers())) { + throw new FlowNodeException(node, "璇锋坊鍔犲垎绠辩瓥鐣"); + } + + DataIOComponent.Params dataIOParams = (DataIOComponent.Params) graph.findOneNodeFromParent(node, ComponentType.DataIO).getParamsModel(); + List dataSetItems = dataIOParams.getDataSetList(); + + AtomicInteger count = new AtomicInteger(); + + dataSetItems.forEach(x -> + params.getMembers().forEach(y -> { + if (x.getMemberId().equals(y.getMemberId()) && x.getMemberRole() == y.getMemberRole()) { + count.addAndGet(1); + } + }) + ); + + if (count.get() != dataSetItems.size()) { + throw new FlowNodeException(node, "璇蜂繚璇佸綋鍓嶈妭鐐规墍鏈夋垚鍛橀兘鍙備笌銆"); + } + + } + + + @Override + public ComponentType taskType() { + return ComponentType.Binning; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + + // Reassemble front-end parameters + JObject transformParam = JObject.create() + .append("transform_cols", -1) + .append("transform_names", new ArrayList<>()) + .append("transform_type", "bin_num"); + + JObject optimalBinningParam = JObject.create() + .append("metric_method", "chi_square") + .append("min_bin_pct", 0.05) + .append("max_bin_pct", 0.8) + .append("init_bucket_method", "quantile") + .append("init_bin_nums", 100) + .append("mixture", true); + + List members = params.members; + List modesObj = new ArrayList<>(); + for (Member member : members) { + + List features = member.features; + + // Integrate the features of the same binning strategy in the same member + Map> featureBinningMap = new HashMap<>(); + + Map> featurePoints = new HashMap<>(); + for (Feature feature : features) { + + if (featureBinningMap.containsKey(feature.method.name() + "," + feature.count)) { + featureBinningMap.get(feature.method.name() + "," + feature.count).add(feature.name); + } else { + List featureList = new ArrayList<>(); + featureList.add(feature.name); + featureBinningMap.put(feature.method.name() + "," + feature.count, featureList); + } + + if (feature.method == BinningMethod.custom) { + String points = feature.getPoints(); + if (!StringUtils.isBlank(points)) { + List pointList = new LinkedList<>(); + if (points.startsWith("[") && points.endsWith("]")) { + points = points.substring(1, points.length() - 1); + } + String pointArr[] = points.split(",|锛"); + for (String p : pointArr) { + pointList.add(Float.parseFloat(p)); + } + featurePoints.put(feature.name, pointList); + } + } + + } + + // Build the array of modes required by the kernel + for (Map.Entry> entry : featureBinningMap.entrySet()) { + String[] strArr = entry.getKey().split(","); + + JObject memberObj = JObject.create().append("role", member.memberRole) + .append("member_id", member.memberId).append("bin_feature_names", entry.getValue()); + if (BinningMethod.custom.name().equals(strArr[0])) { + Map> featurePointsTmp = new HashMap<>(); + for (String s : entry.getValue()) { + featurePointsTmp.put(s, featurePoints.get(s)); + } + memberObj.append("feature_split_points", featurePointsTmp); + } + + if (modesObj.size() < 1) { + // Build the first mode node + JSONArray jsonArray = new JSONArray(); + jsonArray.add(memberObj); + JObject modeObj = JObject.create() + .append("method", strArr[0]) + .append("bin_num", Integer.parseInt(strArr[1])) + .append("members", jsonArray + ); + modesObj.add(modeObj); + } else { + + // If there are the same binning strategies, put them together. + boolean insertFlag = false; + for (JObject obj : modesObj) { + if (obj.getString("method").equals(strArr[0]) && obj.getIntValue("bin_num") == Integer.parseInt(strArr[1])) { + JSONArray list = obj.getJSONArray("members"); + list.add(memberObj); + obj.put("members", list); + insertFlag = true; + break; + } + } + + // The current binning strategy cannot be found in the existing sharing strategies, + // save a new binning strategy node. + if (!insertFlag) { + JSONArray jsonArray = new JSONArray(); + jsonArray.add(memberObj); + JObject modeObj = JObject.create() + .append("method", strArr[0]) + .append("bin_num", strArr[1]) + .append("members", jsonArray + ); + modesObj.add(modeObj); + } + } + } + } + + JObject binningParam = JObject.create() + .append("method", "quantile") + .append("compress_thres", 10000) + .append("head_size", 10000) + .append("error", 0.001) + .append("adjustment_factor", 0.5) + .append("bin_num", 10) + .append("bin_indexes", -1) + .append("bin_names", new ArrayList<>()) + .append("category_indexes", new ArrayList<>()) + .append("category_names", new ArrayList<>()) + .append("local_only", false) + .append("need_run", true) + .append("transform_param", transformParam) + .append("optimal_binning_param", optimalBinningParam) + .append("modes", modesObj); + + taskParam.put("params", binningParam); + + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + List list = taskResultService.listAllResult(taskId) + .stream() + .filter(x -> x.getType().equals(TaskResultType.model_binning)) + .collect(Collectors.toList()); + + // Put the reassembled data in + list.add(getResult(taskId, TaskResultType.model_binning.name())); + + return list; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + + TaskResultMySqlModel taskResult = taskResultService.findByTaskIdAndType(taskId, TaskResultType.model_binning.name()); + + if (taskResult == null) { + return null; + } + TaskResultMySqlModel taskResultMySqlModel = new TaskResultMySqlModel(); + BeanUtils.copyProperties(taskResult, taskResultMySqlModel); + + JObject obj = JObject.create(taskResult.getResult()); + List resultList = new ArrayList<>(); + + if (obj != null) { + JObject modelParam = obj.getJObject("model_param"); + if (modelParam != null) { + JObject binningResult = modelParam.getJObject("binningResult"); + + if (binningResult != null) { + + String memberName = CacheObjects.getMemberName(binningResult.getString("memberId")); + binningResult.append("member_name", memberName) + .append("member_id", binningResult.getString("memberId")) + .append("member_role", binningResult.getString("role")); + + resultList.add(binningResult); + } + + List providerResults = modelParam.getJSONList("providerResults"); + Map biningResultMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(providerResults)) { + for (JObject providerResult : providerResults) { + String memberName = CacheObjects.getMemberName(providerResult.getString("memberId")); + String key = memberName + "_" + providerResult.getString("memberId") + "_" + + providerResult.getString("role"); + if (biningResultMap.containsKey(key)) { + // merge + JObject result = biningResultMap.get(key); + JObject temp = result.getJObject("binningResult"); + temp.putAll(providerResult.getJObject("binningResult")); + result.put("binningResult", temp); + biningResultMap.put(key, result); + } else { + // add + providerResult.append("member_name", memberName) + .append("member_id", providerResult.getString("memberId")) + .append("member_role", providerResult.getString("role")); + biningResultMap.put(key, providerResult); + } + + } + for (Map.Entry entry : biningResultMap.entrySet()) { + resultList.add(entry.getValue()); + } + } + + taskResultMySqlModel.setResult(JObject.create().append("result", resultList).toJSONString()); + } + } + + return taskResultMySqlModel; + + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + InputMatcher.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.Model.BINNING_MODEL, IODataType.ModelFromBinning), + OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance) + ); + } + + @Override + protected boolean needIntersectedDataSetBeforeMe() { + return false; + } + + public enum BinningMethod { + /** + * Equal frequency + */ + quantile, + /** + * Equal width + */ + bucket, + /** + * Bangla + */ + optimal, + + custom + } + + public static class Params extends AbstractCheckModel { + + @Check(require = true) + private List members; + + //region getter/setter + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + + //endregion + } + + + public static class Member extends AbstractCheckModel { + @Check(require = true) + private String memberId; + @Check(require = true) + private JobMemberRole memberRole; + @Check(require = true) + private List features; + + //region getter/setter + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + public List getFeatures() { + return features; + } + + public void setFeatures(List features) { + this.features = features; + } + + + //endregion + } + + public static class Feature extends AbstractCheckModel { + + @Check(require = true) + private String name; + @Check(require = true) + private BinningMethod method; + @Check(require = true) + private int count; + private String points; + + //region getter/setter + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public BinningMethod getMethod() { + return method; + } + + public void setMethod(BinningMethod method) { + this.method = method; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public String getPoints() { + return points; + } + + public void setPoints(String points) { + this.points = points; + } + //endregion + } + + @Override + public boolean canSelectFeatures() { + return true; + } + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FeatureCalculationComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FeatureCalculationComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..3bf1fb07bf072584366cd7d02227b43ee2982f91 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FeatureCalculationComponent.java" @@ -0,0 +1,207 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.feature; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.filter.IntersectedOutputFilter; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.dto.entity.MemberFeatureInfoModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.util.JObject; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author lonnie + */ +@Service +public class FeatureCalculationComponent extends AbstractComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + FlowGraphNode intersectionNode = graph.findOneNodeFromParent(node, ComponentType.Intersection); + if (intersectionNode == null) { + throw new FlowNodeException(node, "璇峰湪鍓嶉潰娣诲姞鏍锋湰瀵归綈缁勪欢銆"); + } + } + + + @Override + public ComponentType taskType() { + return ComponentType.FeatureCalculation; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + List list = taskResultService.listAllResult(taskId) + .stream() + .filter(x -> x.getType().equals(TaskResultType.model_result)) + .collect(Collectors.toList()); + + // Put the reassembled data in + list.add(getResult(taskId, TaskResultType.model_result.name())); + + return list; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + + TaskResultMySqlModel taskResult = taskResultService.findByTaskIdAndType(taskId, TaskResultType.model_result.name()); + + if (taskResult == null) { + return null; + } + TaskResultMySqlModel taskResultMySqlModel = new TaskResultMySqlModel(); + BeanUtils.copyProperties(taskResult, taskResultMySqlModel); + + List members = new ArrayList<>(); + JObject result = JObject.create(taskResult.getResult()); + + JObject modelParam = result.getJObject("model_param"); + + List calculateResults = modelParam.getJSONList("calculateResults"); + + for (JObject obj : calculateResults) { + String memberRole = obj.getString("role"); + String memberId = obj.getString("memberId"); + MemberFeatureInfoModel member = new MemberFeatureInfoModel(); + + List results = obj.getJSONList("results"); + + JSONArray ivValue = new JSONArray(); + JSONArray ivCols = new JSONArray(); + JSONArray cvValue = new JSONArray(); + JSONArray cvCols = new JSONArray(); + List features = new ArrayList<>(); + + Map cvMap = new HashMap<>(); + Map ivMap = new HashMap<>(); + + // Convert the cv/iv value to map form and store + for (JObject resultObj : results) { + + if ("iv_value_thres".equals(resultObj.getString("filterName"))) { + ivValue = resultObj.getJSONArray("values"); + ivCols = resultObj.getJSONArray("cols"); + } + if ("coefficient_of_variation_value_thres".equals(resultObj.getString("filterName"))) { + cvValue = resultObj.getJSONArray("values"); + cvCols = resultObj.getJSONArray("cols"); + } + + + for (int i = 0; i < ivCols.size(); i++) { + ivMap.put(ivCols.getString(i), ivValue.getDoubleValue(i)); + } + + for (int i = 0; i < cvCols.size(); i++) { + cvMap.put(cvCols.getString(i), cvValue.getDoubleValue(i)); + } + } + + // Traverse the iv value map, add the features with the iv value to the feature column, + // and find the corresponding cv value from the cvMap + for (Map.Entry entry : ivMap.entrySet()) { + MemberFeatureInfoModel.Feature feature = new MemberFeatureInfoModel.Feature(); + feature.setName(entry.getKey()); + feature.setIv(entry.getValue()); + if (cvMap.containsKey(entry.getKey())) { + feature.setCv(cvMap.get(entry.getKey())); + } + features.add(feature); + } + + // Traverse the map of cv values and add features with cv values but no iv values to the feature column + for (Map.Entry entry : cvMap.entrySet()) { + if (ivMap.containsKey(entry.getKey())) { + continue; + } + MemberFeatureInfoModel.Feature feature = new MemberFeatureInfoModel.Feature(); + feature.setName(entry.getKey()); + feature.setCv(entry.getValue()); + features.add(feature); + } + + member.setMemberId(memberId); + member.setMemberName(CacheObjects.getMemberName(member.getMemberId())); + member.setMemberRole(JobMemberRole.valueOf(memberRole)); + member.setFeatures(features); + + members.add(member); + } + + taskResultMySqlModel.setResult(JObject.create().append("result", members).toJSONString()); + return taskResultMySqlModel; + + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + InputMatcher.of(Names.Data.NORMAL_DATA_SET, new IntersectedOutputFilter(graph)), + InputMatcher.of(Names.Model.BINNING_MODEL, IODataType.ModelFromBinning) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.JSON_RESULT, IODataType.Json) + ); + } + + @Override + protected boolean needIntersectedDataSetBeforeMe() { + return true; + } + + @Override + public boolean hasParams() { + return false; + } + + public static class Params extends AbstractCheckModel { + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FeatureSelectionComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FeatureSelectionComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..6350f1128ca83acddb800ae412ef1d12c4bc82b2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FeatureSelectionComponent.java" @@ -0,0 +1,181 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.feature; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.DataIOComponent; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.dto.entity.MemberFeatureInfoModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.util.JObject; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + * @author lonnie + */ +@Service +public class FeatureSelectionComponent extends AbstractComponent { + + @Override + public boolean stopCreateTask(List preNodes, FlowGraphNode node) throws StatusCodeWithException { + Params params = (Params) node.getParamsModel(); + + // When no feature is selected, stop creating the task. + if (CollectionUtils.isNotEmpty(params.members) && params.members.size() > 0) { + boolean selectFeature = false; + for (MemberFeatureInfoModel member : params.members) { + if (CollectionUtils.isNotEmpty(member.getFeatures()) && member.getFeatures().size() > 0) { + selectFeature = true; + } + } + // No feature selected, stop creating task. + return !selectFeature; + } else { + // If there is no member node, then there is no feature, stop creating tasks. + return true; + } + } + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + // Get the members selected in dataIO + DataIOComponent.Params dataIOParams = (DataIOComponent.Params) graph.findOneNodeFromParent(node, ComponentType.DataIO).getParamsModel(); + List dataSetItems = dataIOParams.getDataSetList(); + + AtomicInteger count = new AtomicInteger(); + + dataSetItems.forEach(x -> + params.getMembers().forEach(y -> { + if (x.getMemberId().equals(y.getMemberId()) && x.getMemberRole() == y.getMemberRole()) { + count.addAndGet(1); + } + }) + ); + + if (count.get() != dataSetItems.size()) { + throw new FlowNodeException(node, "璇蜂繚璇佸綋鍓嶈妭鐐规墍鏈夋垚鍛橀兘鍙備笌銆"); + } + + if (graph.getJob().getFederatedLearningType() == FederatedLearningType.horizontal) { + List members = params.getMembers(); + List> featuresList = new ArrayList<>(); + members.forEach(member -> { + List features = member.getFeatures(); + List featureNames = new ArrayList<>(); + features.forEach(feature -> featureNames.add(feature.getName())); + featuresList.add(featureNames); + }); + + for (int i = 0; i < featuresList.size() - 1; i++) { + if (!CollectionUtils.isEqualCollection(featuresList.get(i), featuresList.get(i + 1))) { + throw new FlowNodeException(node, "妯悜寤烘ā闇瑕佷繚璇佹墍鏈夋牱鏈墍閫夌壒寰佸垪琛ㄤ竴鑷淬"); + } + } + + } + } + + + @Override + public ComponentType taskType() { + return ComponentType.FeatureSelection; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + + // Reassemble front-end parameters + List members = params.members; + List kernelParam = new ArrayList<>(); + for (MemberFeatureInfoModel member : members) { + + JObject obj = JObject.create().append("member_id", member.getMemberId()) + .append("role", member.getMemberRole()) + .append("features", member.getFeatures().stream().map(x -> x.getName()).collect(Collectors.toList())); + + kernelParam.add(obj); + } + taskParam.put("params", JObject.create().append("members", kernelParam)); + + taskParam.put("env", "test"); + + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + return taskResultService.listAllResult(taskId); + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + return null; + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + InputMatcher.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList(OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance)); + } + + public static class Params extends AbstractCheckModel { + + private List members; + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + } + + @Override + public boolean canSelectFeatures() { + return true; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FeatureStandardizedComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FeatureStandardizedComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..7449cc30283b9725860ef83b503736f2889a93c2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FeatureStandardizedComponent.java" @@ -0,0 +1,173 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.feature; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.dto.entity.MemberFeatureInfoModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.StringUtil; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Data standardization component + * + * @author lonnie + */ +@Service +public class FeatureStandardizedComponent extends AbstractComponent { + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + + // Need to find DataIO data set + FlowGraphNode dataIONode = graph.findOneNodeFromParent(node, ComponentType.DataIO); + TaskMySqlModel dataIOTask = findTaskFromPretasks(preTasks, dataIONode); + if (dataIONode == null || dataIOTask == null) { + throw new FlowNodeException(node, "璇锋坊鍔燚ataIO缁勪欢!"); + } + + JObject resultObj = JObject.create(); + + // Get the withLabel field in the dataIO node + JObject taskConfig = JObject.create(dataIOTask.getTaskConf()); + if (taskConfig.getJObject("params") == null) { + throw new FlowNodeException(node, "鎵句笉鍒癉ataIO_task涓殑with_label瀛楁"); + } + boolean withLabel = taskConfig.getJObject("params").getBooleanValue("with_label"); + + List members = params.getMembers(); + + for (MemberFeatureInfoModel member : members) { + if (CacheObjects.getMemberId().equals(member.getMemberId())) { + List features = member.getFeatures(); + List fields = new ArrayList<>(); + features.forEach(x -> { + if (StringUtil.isNotEmpty(x.getMethod())) { + fields.add(x.getName()); + } + }); + + resultObj.append("fields", fields); + + break; + } + } + + resultObj.append("with_label", withLabel) + .append("save_dataset", true); + + taskParam.put("params", resultObj); + + return taskParam; + } + + + @Override + public ComponentType taskType() { + return ComponentType.FeatureStandardized; + } + + @Override + protected List getAllResult(String taskId) { + return null; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + return null; + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + InputMatcher.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance) + ); + } + + public static class Params extends AbstractCheckModel { + + @Check(name = "鏍囧噯鍖栨柟娉", desc = "'z-score'/'min-max' 鏍囧噯鍖栨柟娉曪紝榛樿z-score") + private String method; + + @Check(name = "鎴愬憳淇℃伅") + private List members; + + @Check(name = "鏄惁淇濆瓨") + private boolean saveDataset; + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + public boolean isSaveDataset() { + return saveDataset; + } + + public void setSaveDataset(boolean saveDataset) { + this.saveDataset = saveDataset; + } + } + + @Override + public boolean canSelectFeatures() { + return true; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FeatureStatisticsComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FeatureStatisticsComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..afe35e0222a4e5a815a486ea69aa97e503595176 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FeatureStatisticsComponent.java" @@ -0,0 +1,260 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.feature; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.DataIOComponent; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.filter.OutputDataTypesOutputFilter; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.dto.entity.MemberModel; +import com.welab.wefe.board.service.dto.kernel.KernelTask; +import com.welab.wefe.board.service.dto.kernel.Member; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + * Characteristic statistics component + * + * @author lonnie + */ +@Service +public class FeatureStatisticsComponent extends AbstractComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + // Get the members selected in dataIO + DataIOComponent.Params dataIOParams = (DataIOComponent.Params) graph.findOneNodeFromParent(node, ComponentType.DataIO).getParamsModel(); + List dataSetItems = dataIOParams.getDataSetList(); + + AtomicInteger count = new AtomicInteger(); + + dataSetItems.forEach(x -> + params.getMembers().forEach(y -> { + if (x.getMemberId().equals(y.getMemberId()) && x.getMemberRole() == y.getMemberRole()) { + count.addAndGet(1); + } + }) + ); + + if (!"local".equals(params.workMode) && count.get() != dataSetItems.size()) { + throw new FlowNodeException(node, "璇蜂繚璇佸綋鍓嶈妭鐐规墍鏈夋垚鍛橀兘鍙備笌銆"); + } + } + + + @Override + public ComponentType taskType() { + return ComponentType.FeatureStatistic; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + + // Need to use dataIO data set + FlowGraphNode dataIONode = graph.findOneNodeFromParent(node, ComponentType.DataIO); + TaskMySqlModel dataIOTask = findTaskFromPretasks(preTasks, dataIONode); + + if (dataIONode == null) { + throw new FlowNodeException(node, "璇锋坊鍔燚ataIO绛栫暐!"); + } + + List featureMethods = params.getFeatureMethods(); + List percentileList = new ArrayList(); + for (Method method : featureMethods) { + if ("percentile".equals(method.getName())) { + percentileList.add(Integer.parseInt(method.getValue())); + } + } + + JObject featureStatisticsParam = JObject.create(); + featureStatisticsParam.append("percentage_list", percentileList); + + // Local non-local federation for local testing + featureStatisticsParam.put("work_mode", params.workMode); + + taskParam.put("params", featureStatisticsParam); + + return taskParam; + } + + @Override + public boolean canSelectFeatures() { + return true; + } + + @Override + protected List getAllResult(String taskId) { + + List list = taskResultService.listAllResult(taskId) + .stream() + .filter(x -> x.getType().equals(TaskResultType.data_feature_statistic)) + .collect(Collectors.toList()); + + + // Put the reassembled data in + list.add(getResult(taskId, TaskResultType.data_feature_statistic.name())); + + return list; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + + TaskResultMySqlModel taskResult = taskResultService.findByTaskIdAndType(taskId, TaskResultType.data_feature_statistic.name()); + + if (taskResult == null) { + return null; + } + TaskResultMySqlModel taskResultMySqlModel = new TaskResultMySqlModel(); + BeanUtils.copyProperties(taskResult, taskResultMySqlModel); + + JObject resultObj = JObject.create(taskResultMySqlModel.getResult().replace("-Infinity", "-99999").replace("Infinity", "99999")); + List members = resultObj.getJSONList("members"); + if (CollectionUtils.isNotEmpty(members)) { + members.forEach(x -> { + String memberId = x.getString("member_id"); + String memberName = CacheObjects.getMemberName(memberId); + x.put("member_name", memberName); + }); + } + resultObj.put("members", members); + taskResultMySqlModel.setResult(resultObj.toJSONString()); + + return taskResultMySqlModel; + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + InputMatcher.of( + Names.Data.NORMAL_DATA_SET, + new OutputDataTypesOutputFilter( + graph, + IODataType.DataSetInstance + )) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.JSON_RESULT, IODataType.Json) + ); + } + + @Override + public KernelTask getTaskMembers(FlowGraph graph, FlowGraphNode node) { + Params params = ((Params) node.getParamsModel()); + List members = new ArrayList<>(); + if ("local".equals(params.getWorkMode())) { + params.getMembers().forEach(x -> { + if (x.getMemberId().equals(CacheObjects.getMemberId())) { + Member member = new Member(); + member.setMemberId(x.getMemberId()); + member.setMemberName(x.getMemberName()); + member.setMemberRole(x.getMemberRole()); + members.add(member); + } + }); + return new KernelTask(members); + } else { + return super.getTaskMembers(graph, node); + } + } + + public static class Params extends AbstractCheckModel { + @Check(require = true) + private List featureMethods; + + @Check(name = "妯″紡鐘舵") + private String workMode; + + private List members; + + public List getFeatureMethods() { + return featureMethods; + } + + public void setFeatureMethods(List featureMethods) { + this.featureMethods = featureMethods; + } + + public String getWorkMode() { + return workMode; + } + + public void setWorkMode(String workMode) { + this.workMode = workMode; + } + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + } + + public static class Method extends AbstractCheckModel { + @Check(require = true) + private String name; + + private String value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FeatureTransformComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FeatureTransformComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..1f4ac1db07bf16dcb221fdc153ff631b39b8415a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FeatureTransformComponent.java" @@ -0,0 +1,169 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.feature; + +import java.util.Arrays; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.dto.kernel.Member; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; + +/** + * @author Winter + * @date 2021-04-25 + */ +@Service +public class FeatureTransformComponent extends AbstractComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, + FeatureTransformComponent.Params params) throws FlowNodeException { + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, + FeatureTransformComponent.Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + + List members = params.getMembers(); + + JObject transformRules = JObject.create(); + members.forEach(x -> { + if (CacheObjects.getMemberId().equals(x.getMemberId()) && graph.getJob().getMyRole() == x.getMemberRole()) { + List features = x.getFeatures(); + + features.forEach(feature -> { + List> maps = feature.getTransforms(); + JObject rulesObj = JObject.create(); + for (List map : maps) { + rulesObj.append(map.get(0), Integer.parseInt(map.get(1))); + } + if(!rulesObj.isEmpty()) { + transformRules.append(feature.getName(), rulesObj); + } + }); + + } + + }); + + taskParam.put("params", JObject.create().append("transform_rules", transformRules.toJSONString())); + + return taskParam; + } + + @Override + public ComponentType taskType() { + return ComponentType.FeatureTransform; + } + + @Override + protected List getAllResult(String taskId) { + return null; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + return null; + } + + @Override + public boolean canSelectFeatures() { + return true; + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + return Arrays.asList(InputMatcher.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance)); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + return Arrays.asList(OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance)); + } + + public static class Params extends AbstractCheckModel { + + @Check(name = "杞崲鎴愬憳淇℃伅", require = true) + private List members; + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + public static class TransformMember extends Member { + + @Check(name = "鐗瑰緛鍒", require = true) + private List features; + + public List getFeatures() { + return features; + } + + public void setFeatures(List features) { + this.features = features; + } + } + + public static class Feature extends AbstractCheckModel { + @Check(name = "鐗瑰緛鍚", require = true) + private String name; + + @Check(name = "杞崲瑙勫垯") + private List> transforms; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List> getTransforms() { + return transforms; + } + + public void setTransforms(List> transforms) { + this.transforms = transforms; + } + + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FillMissingValueComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FillMissingValueComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..08c15a34ca1d9299f0049c22913939512368f49a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/FillMissingValueComponent.java" @@ -0,0 +1,320 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.feature; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.DataIOComponent; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.dto.kernel.KernelTask; +import com.welab.wefe.board.service.dto.kernel.Member; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author lonnie + */ +@Service +public class FillMissingValueComponent extends AbstractComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + DataIOComponent.Params dataIOParams = (DataIOComponent.Params) graph.findOneNodeFromParent(node, ComponentType.DataIO).getParamsModel(); + List dataSetItems = dataIOParams.getDataSetList(); + + AtomicInteger count = new AtomicInteger(); + + dataSetItems.forEach(x -> { + params.getMembers().forEach(y -> { + if (x.getMemberId().equals(y.getMemberId()) && x.getMemberRole() == y.getMemberRole()) { + count.addAndGet(1); + } + }); + }); + + if (count.get() != dataSetItems.size()) { + throw new FlowNodeException(node, "璇蜂繚璇佸綋鍓嶈妭鐐规墍鏈夋垚鍛橀兘鍙備笌銆"); + } + } + + + @Override + public ComponentType taskType() { + return ComponentType.FillMissingValue; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + + // Need to find DataIO data set + FlowGraphNode dataIONode = graph.findOneNodeFromParent(node, ComponentType.DataIO); + TaskMySqlModel dataIOTask = findTaskFromPretasks(preTasks, dataIONode); + if (dataIONode == null || dataIOTask == null) { + throw new FlowNodeException(node, "璇锋坊鍔燚ataIO缁勪欢!"); + } + + // Get the withLabel field in the dataIO node + JObject taskConfig = JObject.create(dataIOTask.getTaskConf()); + if (taskConfig.getJObject("params") == null) { + throw new FlowNodeException(node, "鎵句笉鍒癉ataIO_task涓殑with_label瀛楁"); + } + boolean withLabel = taskConfig.getJObject("params").getBooleanValue("with_label"); + + List members = params.members; + + JObject featuresObj = JObject.create(); + for (Params.Member member : members) { + + if (CacheObjects.getMemberId().equals(member.memberId) && graph.getJobMemberIsMe().getJobRole() == member.memberRole) { + List features = member.features; + + for (Params.Feature feature : features) { + String name = feature.name; + String method = feature.method; + double value = feature.count; + + featuresObj.append(name, JObject.create().append("method", method) + .append("value", value)); + } + break; + } + } + JObject resultObj = JObject.create() + .append("features", featuresObj.toJSONString()) + .append("with_label", withLabel) + .append("save_dataset", true); + + taskParam.put("params", resultObj); + + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + return taskResultService.listAllResult(taskId); + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + + TaskResultMySqlModel taskResult = taskResultService.findByTaskIdAndType(taskId, TaskResultType.data_fill_missing_value.name()); + + if (taskResult == null) { + return null; + } + + TaskResultMySqlModel taskResultMySqlModel = new TaskResultMySqlModel(); + BeanUtils.copyProperties(taskResult, taskResultMySqlModel); + JObject result = JObject.create(taskResult.getResult()); + + List members = result.getJSONList("members"); + members.forEach(member -> { + String memberId = member.getString("member_id"); + String memberName = CacheObjects.getMemberName(memberId); + member.append("member_name", memberName); + }); + + taskResultMySqlModel.setResult(JObject.create().append("members", members).toJSONString()); + + return taskResultMySqlModel; + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + InputMatcher.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance) + ); + } + + @Override + public KernelTask getTaskMembers(FlowGraph graph, FlowGraphNode node) { + List members = new ArrayList<>(); + Params params = (Params) node.getParamsModel(); + + if (CollectionUtils.isNotEmpty(params.getMembers())) { + params.getMembers().forEach(x -> { + Member member = ModelMapper.map(x, Member.class); + member.setMemberName(CacheObjects.getMemberName(x.getMemberId())); + members.add(member); + }); + } + + return new KernelTask(members); + } + + public static class Params extends AbstractCheckModel { + + private List strategies; + + public static class Strategy extends AbstractCheckModel { + private String method; + + private double count; + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public double getCount() { + return count; + } + + public void setCount(double count) { + this.count = count; + } + } + + private boolean saveDataset; + + @Check(require = true) + private List members; + + public static class Member extends AbstractCheckModel { + @Check(name = "鎴愬憳id", require = true) + private String memberId; + + @Check(name = "瑙掕壊", require = true) + private JobMemberRole memberRole; + + @Check(name = "鐗瑰緛淇℃伅", require = true) + private List features; + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + public List getFeatures() { + return features; + } + + public void setFeatures(List features) { + this.features = features; + } + } + + public static class Feature extends AbstractCheckModel { + @Check(name = "濉厖鏂瑰紡", require = true) + private String method; + @Check(name = "鐗瑰緛鍚", require = true) + private String name; + @Check(name = "鏁板") + private double count; + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public double getCount() { + return count; + } + + public void setCount(double count) { + this.count = count; + } + } + + public boolean isSaveDataset() { + return saveDataset; + } + + public void setSaveDataset(boolean saveDataset) { + this.saveDataset = saveDataset; + } + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + public List getStrategies() { + return strategies; + } + + public void setStrategies(List strategies) { + this.strategies = strategies; + } + } + + @Override + public boolean canSelectFeatures() { + return true; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/HorzFeatureBinningComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/HorzFeatureBinningComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..a2c85ef2778813579b1816fb7e5ec66b9512fd9f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/HorzFeatureBinningComponent.java" @@ -0,0 +1,311 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.feature; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.DataIOComponent; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; + +@Service +public class HorzFeatureBinningComponent extends AbstractComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + if (CollectionUtils.isEmpty(params.getMembers())) { + throw new FlowNodeException(node, "璇锋坊鍔犲垎绠辩瓥鐣"); + } + + DataIOComponent.Params dataIOParams = (DataIOComponent.Params) graph.findOneNodeFromParent(node, ComponentType.DataIO).getParamsModel(); + List dataSetItems = dataIOParams.getDataSetList(); + + AtomicInteger count = new AtomicInteger(); + + dataSetItems.forEach(x -> { + params.getMembers().forEach(y -> { + if (x.getMemberId().equals(y.getMemberId()) && x.getMemberRole() == y.getMemberRole()) { + count.addAndGet(1); + } + }); + }); + + if (count.get() != dataSetItems.size()) { + throw new FlowNodeException(node, "璇蜂繚璇佸綋鍓嶈妭鐐规墍鏈夋垚鍛橀兘鍙備笌銆"); + } + + } + + + @Override + public ComponentType taskType() { + return ComponentType.HorzFeatureBinning; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, + Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + List members = params.members; + int bin_num = 10; + List bin_names = new ArrayList<>(); + for (Member member : members) { + if (CacheObjects.getMemberId().equals(member.getMemberId())) { + List features = member.features; + features.stream().forEach(x -> { + bin_names.add(x.getName()); + }); + bin_num = features.get(0).getCount(); + } + } + JObject binningParam = JObject.create() + .append("bin_num", bin_num) + .append("bin_names", bin_names); + + taskParam.put("params", binningParam); + + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + List list = taskResultService.listAllResult(taskId) + .stream() + .filter(x -> x.getType().equals(TaskResultType.model_binning)) + .collect(Collectors.toList()); + + list.add(getResult(taskId, TaskResultType.model_binning.name())); + + return list; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + + TaskResultMySqlModel taskResult = taskResultService.findByTaskIdAndType(taskId, TaskResultType.model_binning.name()); + + if (taskResult == null) { + return null; + } + TaskResultMySqlModel taskResultMySqlModel = new TaskResultMySqlModel(); + BeanUtils.copyProperties(taskResult, taskResultMySqlModel); + + JObject obj = JObject.create(taskResult.getResult()); + List resultList = new ArrayList<>(); + + if (obj != null) { + JObject modelParam = obj.getJObject("model_param"); + if (modelParam != null) { + JObject binningResult = modelParam.getJObject("binningResult"); + + if (binningResult != null) { + + String memberName = CacheObjects.getMemberName(binningResult.getString("memberId")); + binningResult.append("member_name", memberName) + .append("member_id", binningResult.getString("memberId")) + .append("member_role", binningResult.getString("role")); + + resultList.add(binningResult); + } + + List providerResults = modelParam.getJSONList("providerResults"); + if (CollectionUtils.isNotEmpty(providerResults)) { + + for (JObject providerResult : providerResults) { + String memberName = CacheObjects.getMemberName(providerResult.getString("memberId")); + providerResult.append("member_name", memberName) + .append("member_id", providerResult.getString("memberId")) + .append("member_role", providerResult.getString("role")); + + resultList.add(providerResult); + } + } + + taskResultMySqlModel.setResult(JObject.create().append("result", resultList).toJSONString()); + } + } + + return taskResultMySqlModel; + + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + InputMatcher.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.Model.BINNING_MODEL, IODataType.ModelFromBinning), + OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance) + ); + } + + @Override + protected boolean needIntersectedDataSetBeforeMe() { + return false; + } + + public enum BinningMethod { + /** + * 绛夐 + */ + quantile, + /** + * 绛夊 + */ + bucket, + /** + * 鍗℃柟 + */ + optimal + } + + public static class Params extends AbstractCheckModel { + + @Check(require = true) + private List members; + + //region getter/setter + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + + //endregion + } + + + public static class Member extends AbstractCheckModel { + @Check(require = true) + private String memberId; + @Check(require = true) + private JobMemberRole memberRole; + @Check(require = true) + private List features; + + //region getter/setter + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + public List getFeatures() { + return features; + } + + public void setFeatures(List features) { + this.features = features; + } + + + //endregion + } + + public static class Feature extends AbstractCheckModel { + + @Check(require = true) + private String name; + @Check(require = true) + private BinningMethod method; + @Check(require = true) + private int count; + + //region getter/setter + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public BinningMethod getMethod() { + return method; + } + + public void setMethod(BinningMethod method) { + this.method = method; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + + //endregion + } + + @Override + public boolean canSelectFeatures() { + return true; + } + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/HorzOneHotComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/HorzOneHotComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..6ca9f953765eb192f8688966793f9d2fff3abf65 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/HorzOneHotComponent.java" @@ -0,0 +1,101 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.feature; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.util.JObject; + +@Service +public class HorzOneHotComponent extends AbstractComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, + VertOneHotComponent.Params params) throws FlowNodeException { + + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, + VertOneHotComponent.Params params) throws FlowNodeException { + JSONObject taskParam = new JSONObject(); + List members = params.getMembers(); + + List transformColNames = new ArrayList<>(); + members.forEach(member -> { + if (CacheObjects.getMemberId().equals(member.getMemberId()) + && graph.getJob().getMyRole() == member.getMemberRole()) { + List features = member.getFeatures(); + + features.forEach(feature -> { + transformColNames.add(feature); + }); + } + }); + taskParam.put("params", + JObject.create().append("transform_col_names", transformColNames).append("save_dataset", true)); + + return taskParam; + } + + @Override + public ComponentType taskType() { + return ComponentType.HorzOneHot; + } + + @Override + public boolean canSelectFeatures() { + return true; + } + + @Override + protected List getAllResult(String taskId) { + return null; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + return null; + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + return Arrays.asList(InputMatcher.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance)); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + return Arrays.asList(OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance)); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/HorzStatisticComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/HorzStatisticComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..1adb4ca95982fc3da57963c512f39f80fb6e9476 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/HorzStatisticComponent.java" @@ -0,0 +1,155 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.feature; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.filter.OutputDataTypesOutputFilter; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.dto.entity.MemberModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.util.JObject; + +@Service +public class HorzStatisticComponent extends AbstractComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, + Params params) throws FlowNodeException { + } + + @Override + public ComponentType taskType() { + return ComponentType.HorzStatistic; + } + + @Override + public boolean canSelectFeatures() { + return true; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, + Params params) throws FlowNodeException { + JSONObject taskParam = new JSONObject(); + List members = params.members; + for (MemberFeatureInfoModel member : members) { + if (CacheObjects.getMemberId().equals(member.getMemberId())) { + List features = member.features; + taskParam.put("params", JObject.create("col_names", features)); + } + } + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + List list = taskResultService.listAllResult(taskId).stream() + .filter(x -> x.getType().equals(TaskResultType.data_feature_statistic)).collect(Collectors.toList()); + + list.add(getResult(taskId, TaskResultType.data_feature_statistic.name())); + + return list; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + + TaskResultMySqlModel taskResult = taskResultService.findByTaskIdAndType(taskId, + TaskResultType.data_feature_statistic.name()); + + if (taskResult == null) { + return null; + } + TaskResultMySqlModel taskResultMySqlModel = new TaskResultMySqlModel(); + BeanUtils.copyProperties(taskResult, taskResultMySqlModel); + + JObject resultObj = JObject + .create(taskResultMySqlModel.getResult().replace("-Infinity", "-99999").replace("Infinity", "99999")); + List members = resultObj.getJSONList("members"); + if (CollectionUtils.isNotEmpty(members)) { + members.forEach(x -> { + String memberId = x.getString("member_id"); + String memberName = CacheObjects.getMemberName(memberId); + x.put("member_name", memberName); + }); + } + resultObj.put("members", members); + taskResultMySqlModel.setResult(resultObj.toJSONString()); + + return taskResultMySqlModel; + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList(InputMatcher.of(Names.Data.NORMAL_DATA_SET, + new OutputDataTypesOutputFilter(graph, IODataType.DataSetInstance))); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList(OutputItem.of(Names.JSON_RESULT, IODataType.Json)); + } + + public static class Params extends AbstractCheckModel { + + private List members; + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + } + + public static class MemberFeatureInfoModel extends MemberModel { + + private List features; + + public List getFeatures() { + return features; + } + + public void setFeatures(List features) { + this.features = features; + } + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/MixBinningComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/MixBinningComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..0bf4a891f6f5c836f094d632af98eb0c387a2b34 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/MixBinningComponent.java" @@ -0,0 +1,314 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.feature; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.DataIOComponent; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; + +/** + * @author Winter + * @date 2020-12-24 + */ +@Service +public class MixBinningComponent extends AbstractComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + if (CollectionUtils.isEmpty(params.getMembers())) { + throw new FlowNodeException(node, "璇锋坊鍔犲垎绠辩瓥鐣"); + } + + DataIOComponent.Params dataIOParams = (DataIOComponent.Params) graph.findOneNodeFromParent(node, ComponentType.DataIO).getParamsModel(); + List dataSetItems = dataIOParams.getDataSetList(); + + AtomicInteger count = new AtomicInteger(); + + dataSetItems.forEach(x -> { + params.getMembers().forEach(y -> { + if (x.getMemberId().equals(y.getMemberId()) && x.getMemberRole() == y.getMemberRole()) { + count.addAndGet(1); + } + }); + }); + + if (count.get() != dataSetItems.size()) { + throw new FlowNodeException(node, "璇蜂繚璇佸綋鍓嶈妭鐐规墍鏈夋垚鍛橀兘鍙備笌銆"); + } + + } + + + @Override + public ComponentType taskType() { + return ComponentType.MixBinning; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, + Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + List members = params.members; + int bin_num = 10; + List bin_names = new ArrayList<>(); + for (Member member : members) { + if (CacheObjects.getMemberId().equals(member.getMemberId())) { + List features = member.features; + features.stream().forEach(x -> { + bin_names.add(x.getName()); + }); + bin_num = features.get(0).getCount(); + } + } + JObject binningParam = JObject.create().append("bin_num", bin_num).append("bin_names", bin_names); + + taskParam.put("params", binningParam); + + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + List list = taskResultService.listAllResult(taskId) + .stream() + .filter(x -> x.getType().equals(TaskResultType.model_binning)) + .collect(Collectors.toList()); + + //灏嗛噸鏂扮粍瑁呯殑鏁版嵁鏀捐繘鍘 + list.add(getResult(taskId, TaskResultType.model_binning.name())); + + return list; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + + TaskResultMySqlModel taskResult = taskResultService.findByTaskIdAndType(taskId, TaskResultType.model_binning.name()); + + if (taskResult == null) { + return null; + } + TaskResultMySqlModel taskResultMySqlModel = new TaskResultMySqlModel(); + BeanUtils.copyProperties(taskResult, taskResultMySqlModel); + + JObject obj = JObject.create(taskResult.getResult()); + List resultList = new ArrayList<>(); + + if (obj != null) { + JObject modelParam = obj.getJObject("model_param"); + if (modelParam != null) { + JObject binningResult = modelParam.getJObject("binningResult"); + + if (binningResult != null) { + + String memberName = CacheObjects.getMemberName(binningResult.getString("memberId")); + binningResult.append("member_name", memberName) + .append("member_id", binningResult.getString("memberId")) + .append("member_role", binningResult.getString("role")); + + resultList.add(binningResult); + } + + List providerResults = modelParam.getJSONList("providerResults"); + if (CollectionUtils.isNotEmpty(providerResults)) { + + for (JObject providerResult : providerResults) { + String memberName = CacheObjects.getMemberName(providerResult.getString("memberId")); + providerResult.append("member_name", memberName) + .append("member_id", providerResult.getString("memberId")) + .append("member_role", providerResult.getString("role")); + + resultList.add(providerResult); + } + } + + taskResultMySqlModel.setResult(JObject.create().append("result", resultList).toJSONString()); + } + } + + return taskResultMySqlModel; + + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + InputMatcher.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.Model.BINNING_MODEL, IODataType.ModelFromBinning), + OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance) + ); + } + + @Override + protected boolean needIntersectedDataSetBeforeMe() { + return false; + } + + public enum BinningMethod { + /** + * 绛夐 + */ + quantile, + /** + * 绛夊 + */ + bucket, + /** + * 鍗℃柟 + */ + optimal + } + + public static class Params extends AbstractCheckModel { + + @Check(require = true) + private List members; + + //region getter/setter + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + + //endregion + } + + + public static class Member extends AbstractCheckModel { + @Check(require = true) + private String memberId; + @Check(require = true) + private JobMemberRole memberRole; + @Check(require = true) + private List features; + + //region getter/setter + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + public List getFeatures() { + return features; + } + + public void setFeatures(List features) { + this.features = features; + } + + + //endregion + } + + public static class Feature extends AbstractCheckModel { + + @Check(require = true) + private String name; + @Check(require = true) + private BinningMethod method; + @Check(require = true) + private int count; + + //region getter/setter + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public BinningMethod getMethod() { + return method; + } + + public void setMethod(BinningMethod method) { + this.method = method; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + + //endregion + } + + @Override + public boolean canSelectFeatures() { + return true; + } + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/MixStatisticComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/MixStatisticComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..99c787eb9f14a35d959a373304034fdd28d67a5b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/MixStatisticComponent.java" @@ -0,0 +1,159 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.feature; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.filter.OutputDataTypesOutputFilter; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.dto.entity.MemberModel; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.util.JObject; + +/** + * @author Winter + */ +@Service +public class MixStatisticComponent extends AbstractComponent { + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, + Params params) { + } + + @Override + public ComponentType taskType() { + return ComponentType.MixStatistic; + } + + @Override + public boolean canSelectFeatures() { + return true; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, + Params params) { + JSONObject taskParam = new JSONObject(); + List members = params.members; + for (MemberFeatureInfoModel member : members) { + if (CacheObjects.getMemberId().equals(member.getMemberId())) { + List features = member.features; + taskParam.put("params", JObject.create("col_names", features)); + } + } + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + List list = taskResultService.listAllResult(taskId).stream() + .filter(x -> x.getType().equals(TaskResultType.data_feature_statistic.name())) + .collect(Collectors.toList()); + + // Put the reassembled data in + list.add(getResult(taskId, TaskResultType.data_feature_statistic.name())); + + return list; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + + TaskResultMySqlModel taskResult = taskResultService.findByTaskIdAndType(taskId, + TaskResultType.data_feature_statistic.name()); + + if (taskResult == null) { + return null; + } + TaskResultMySqlModel taskResultMySqlModel = new TaskResultMySqlModel(); + BeanUtils.copyProperties(taskResult, taskResultMySqlModel); + + JObject resultObj = JObject + .create(taskResultMySqlModel.getResult().replace("-Infinity", "-99999").replace("Infinity", "99999")); + List members = resultObj.getJSONList("members"); + if (CollectionUtils.isNotEmpty(members)) { + members.forEach(x -> { + String memberId = x.getString("member_id"); + String memberName = CacheObjects.getMemberName(memberId); + x.put("member_name", memberName); + }); + } + resultObj.put("members", members); + taskResultMySqlModel.setResult(resultObj.toJSONString()); + + return taskResultMySqlModel; + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList(InputMatcher.of(Names.Data.NORMAL_DATA_SET, + new OutputDataTypesOutputFilter(graph, IODataType.DataSetInstance))); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList(OutputItem.of(Names.JSON_RESULT, IODataType.Json)); + } + + public static class Params extends AbstractCheckModel { + + private List members; + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + } + + public static class MemberFeatureInfoModel extends MemberModel { + + private List features; + + public List getFeatures() { + return features; + } + + public void setFeatures(List features) { + this.features = features; + } + + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/VertFilterComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/VertFilterComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..99a8af4293e7a285998cf522bc964b13d3d4b181 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/VertFilterComponent.java" @@ -0,0 +1,117 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.feature; + +import java.util.Arrays; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.dto.entity.MemberModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.dto.AbstractApiInput; + +@Service +public class VertFilterComponent extends AbstractComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, + Params params) throws FlowNodeException { + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, + Params params) throws FlowNodeException { + JSONObject taskParam = new JSONObject(); + JObject resultObj = JObject.create(); + params.getMembers().forEach(member -> { + if (CacheObjects.getMemberId().equals(member.getMemberId()) + && graph.getJob().getMyRole() == member.getMemberRole()) { + resultObj.append("filter_rules", member.getFilterRules()); + } + }); + + taskParam.put("params", resultObj); + return taskParam; + } + + @Override + public ComponentType taskType() { + return ComponentType.VertFilter; + } + + @Override + protected List getAllResult(String taskId) { + return null; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + return null; + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + return Arrays.asList(InputMatcher.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance)); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + return Arrays.asList(OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance)); + } + + public static class Params extends AbstractApiInput { + + @Check(name = "鎴愬憳淇℃伅", require = true) + private List members; + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + public static class MemberInfoModel extends MemberModel { + @Check(name = "杩囨护瑙勫垯", desc = "鏀寔 >,<,>=,<=,=,!=", blockXss=false) + private String filterRules; + + public String getFilterRules() { + return filterRules; + } + + public void setFilterRules(String filterRules) { + this.filterRules = filterRules; + } + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/VertOneHotComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/VertOneHotComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..e195083a4cbd1bb9edf265d8b5f542a73433793a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/VertOneHotComponent.java" @@ -0,0 +1,131 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.feature; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.dto.entity.MemberModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.dto.AbstractApiInput; + +@Service +public class VertOneHotComponent extends AbstractComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, + VertOneHotComponent.Params params) throws FlowNodeException { + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, + VertOneHotComponent.Params params) throws FlowNodeException { + JSONObject taskParam = new JSONObject(); + List members = params.getMembers(); + + List transformColNames = new ArrayList<>(); + members.forEach(member -> { + if (CacheObjects.getMemberId().equals(member.getMemberId()) + && graph.getJob().getMyRole() == member.getMemberRole()) { + List features = member.getFeatures(); + + features.forEach(feature -> { + transformColNames.add(feature); + }); + } + }); + taskParam.put("params", + JObject.create().append("transform_col_names", transformColNames).append("save_dataset", true)); + + return taskParam; + } + + @Override + public ComponentType taskType() { + return ComponentType.VertOneHot; + } + + @Override + protected List getAllResult(String taskId) { + return null; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + return null; + } + + @Override + public boolean canSelectFeatures() { + return true; + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + return Arrays.asList(InputMatcher.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance)); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + return Arrays.asList(OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance)); + } + + + public static class Params extends AbstractApiInput { + + @Check(name = "鎴愬憳淇℃伅", require = true) + private List members; + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + public static class MemberInfoModel extends MemberModel { + @Check(name = "鐗瑰緛鍒", require = true) + private List features = new ArrayList<>(); + + public List getFeatures() { + return features; + } + + public void setFeatures(List features) { + this.features = features; + } + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/VertPCAComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/VertPCAComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..262c572124de2808e67c2b9089e307fe7f2a7abd --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/VertPCAComponent.java" @@ -0,0 +1,103 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.feature; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.util.JObject; + +@Service +public class VertPCAComponent extends AbstractComponent { + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, + VertOneHotComponent.Params params) throws FlowNodeException { + FlowGraphNode intersectionNode = graph.findOneNodeFromParent(node, ComponentType.Intersection); + if (intersectionNode == null) { + throw new FlowNodeException(node, "璇峰湪鍓嶉潰娣诲姞鏍锋湰瀵归綈缁勪欢銆"); + } + + List members = params.getMembers(); + if (members.size() > 2) { + throw new FlowNodeException(node, "涓ゆ柟绾靛悜PCA鍙備笌鎴愬憳涓嶈兘瓒呰繃涓ゆ柟銆"); + } + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, + VertOneHotComponent.Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + + JObject resultObj = JObject.create(); + List featureList = new ArrayList<>(); + params.getMembers().forEach(member -> { + if (CacheObjects.getMemberId().equals(member.getMemberId()) + && graph.getJob().getMyRole() == member.getMemberRole()) { + List features = member.getFeatures(); + features.forEach(x -> featureList.add(x)); + } + }); + resultObj.append("column_names", featureList); + + taskParam.put("params", resultObj); + + return taskParam; + } + + @Override + public ComponentType taskType() { + return ComponentType.VertPCA; + } + + @Override + protected List getAllResult(String taskId) { + return null; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + return taskResultService.findByTaskIdAndType(taskId, TaskResultType.metric_statistics.name()); + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + return Arrays.asList(InputMatcher.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance)); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + return Arrays.asList(OutputItem.of(Names.JSON_RESULT, IODataType.Json)); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/VertPearsonComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/VertPearsonComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..b262be347ef66932d1380e6f28069211f86b89dd --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/feature/VertPearsonComponent.java" @@ -0,0 +1,170 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.feature; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.dto.entity.MemberFeatureInfoModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.StringUtil; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Longitudinal Pearson correlation coefficient between the two parties based on the spdz agreement + * + * @author Winter + */ +@Service +public class VertPearsonComponent extends AbstractComponent { + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + List members = params.getMembers(); + if (members.size() > 2) { + throw new FlowNodeException(node, "鐨皵閫婄浉鍏虫у弬涓庢垚鍛樹笉鑳借秴杩囦袱鏂广"); + } + + FlowGraphNode intersectionNode = graph.findOneNodeFromParent(node, ComponentType.Intersection); + if (intersectionNode == null) { + throw new FlowNodeException(node, "璇峰湪鍓嶉潰娣诲姞鏍锋湰瀵归綈缁勪欢銆"); + } + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + + // Need to find DataIO data set + FlowGraphNode dataIONode = graph.findOneNodeFromParent(node, ComponentType.DataIO); + TaskMySqlModel dataIOTask = findTaskFromPretasks(preTasks, dataIONode); + if (dataIONode == null || dataIOTask == null) { + throw new FlowNodeException(node, "璇锋坊鍔燚ataIO缁勪欢!"); + } + + JObject resultObj = JObject.create(); + + params.getMembers().forEach(x -> { + if (x.getMemberId().equals(CacheObjects.getMemberId())) { + List features = new ArrayList<>(); + x.getFeatures().forEach(feature -> { + if (StringUtil.isNotEmpty(feature.getMethod())) { + features.add(feature.getName()); + } + }); + resultObj.append("column_names", features); + } + + }); + + resultObj.append("cross_parties", params.isCrossParties()); + + taskParam.put("params", resultObj); + + return taskParam; + } + + + @Override + public ComponentType taskType() { + return ComponentType.VertPearson; + } + + @Override + protected List getAllResult(String taskId) { + return taskResultService.listAllResult(taskId); + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + return taskResultService.findByTaskIdAndType(taskId, TaskResultType.metric_statistics.name()); + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + InputMatcher.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.JSON_RESULT, IODataType.Json) + ); + } + + public static class Params extends AbstractCheckModel { + + @Check(name = "闇瑕佽绠楃殑鐗瑰緛鍒楀悕", require = true) + private List members; + + @Check(name = "鐗瑰緛鍒楃储寮") + private List columnIndexes; + + @Check(name = "鏄惁瑕佷笌鍙︿竴鏂圭壒寰佽绠楃浉鍏虫х郴鏁", require = true, desc = "鑻ヤ负True锛宯eed_run蹇呴』涓篢rue") + private boolean crossParties; + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + public List getColumnIndexes() { + return columnIndexes; + } + + public void setColumnIndexes(List columnIndexes) { + this.columnIndexes = columnIndexes; + } + + public boolean isCrossParties() { + return crossParties; + } + + public void setCrossParties(boolean crossParties) { + this.crossParties = crossParties; + } + + } + + @Override + public boolean canSelectFeatures() { + return true; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/AbstractModelingComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/AbstractModelingComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..6000cd0ca9bb36f573ac72f50fd385ce54f9f9ae --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/AbstractModelingComponent.java" @@ -0,0 +1,125 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.modeling; + +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.filter.OutputItemFilterFunction; +import com.welab.wefe.board.service.component.base.io.*; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.util.JObject; +import org.springframework.beans.BeanUtils; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author zane.luo + */ +public abstract class AbstractModelingComponent extends AbstractComponent { + + /** + * Find the delegate of the training data set + */ + OutputItemFilterFunction TRAIN_DATA_SET_FILTER = (n, item) -> ComponentType.Segment == n.getComponentType(); + + /** + * Find test/validation data set commission + */ + protected final InputSupplier TEST_DATA_SET_SUPPLIER = (graph, node) -> { + + // Find validation set + FlowGraphNode validationNode = graph.findValidationDataSetFromParent(node, taskType()); + if (validationNode != null) { + return new NodeOutputItem(validationNode, OutputItem.of(Names.Data.EVALUATION_DATA_SET, IODataType.DataSetInstance)); + } + + // Find data cutting + FlowGraphNode segmentNode = graph.findOneNodeFromParent(node, ComponentType.Segment); + if (segmentNode != null) { + return new NodeOutputItem(segmentNode, OutputItem.of(Names.Data.EVALUATION_DATA_SET, IODataType.DataSetInstance)); + } + + return null; + }; + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + TaskResultMySqlModel result = new TaskResultMySqlModel(); + JObject resultObj = JObject.create(); + + TaskResultMySqlModel metricTrainResult = taskResultService.findByTaskIdAndType(taskId, TaskResultType.metric_train.name()); + TaskResultMySqlModel modelTrainResult = taskResultService.findByTaskIdAndType(taskId, TaskResultType.model_train.name()); + + if (metricTrainResult != null) { + BeanUtils.copyProperties(metricTrainResult, result); + } else if (modelTrainResult != null) { + BeanUtils.copyProperties(modelTrainResult, result); + } else { + return null; + } + + if (metricTrainResult != null) { + resultObj = JObject.create(metricTrainResult.getResult()); + JObject trainLoss = resultObj.getJObject("train_loss"); + if (trainLoss != null) { + + JObject data = trainLoss.getJObject("data"); + if (data != null) { + List lossArray = new ArrayList<>(); + List list = data + .keySet() + .stream() + .filter(x -> !"Best".equals(x)) + .sorted(Comparator.reverseOrder()) + .collect(Collectors.toList()); + + // The sort tool method does not work, so I wrote the following sort code. + for (int i = 0; i < list.size() - 1; i++) { + for (int j = i + 1; j < list.size(); j++) { + if (Integer.parseInt(list.get(i)) > Integer.parseInt(list.get(j))) { + String tep = list.get(i); + list.set(i, list.get(j)); + list.set(j, tep); + } + } + } + + for (String str : list) { + lossArray.add(data.getJObject(str).getDouble("value")); + } + trainLoss.put("data", lossArray); + resultObj.put("train_loss", trainLoss); + } + } + } + + if (modelTrainResult != null) { + resultObj.putAll(JObject.create(modelTrainResult.getResult())); + } + + result.setResult(resultObj.toJSONString()); + + return result; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/HorzLRComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/HorzLRComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..6dc313438bcfb66a832864edaaa0c634854e2b30 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/HorzLRComponent.java" @@ -0,0 +1,248 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.modeling; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.dto.AbstractLRInput; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * @author lonnie + */ +@Service +public class HorzLRComponent extends AbstractModelingComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + } + + + @Override + public ComponentType taskType() { + return ComponentType.HorzLR; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + + JObject vertLRParam = JObject.create(); + vertLRParam.append("penalty", params.otherParam.penalty) + .append("tol", params.otherParam.tol) + .append("alpha", params.otherParam.alpha) + .append("optimizer", params.otherParam.optimizer) + .append("batch_size", params.otherParam.batchSize) + .append("learning_rate", params.otherParam.learningRate) + .append("max_iter", params.otherParam.maxIter) + .append("early_stop", params.otherParam.earlyStop) + .append("decay", params.otherParam.decay) + .append("decay_sqrt", params.otherParam.decaySqrt) + .append("multi_class", params.otherParam.multiClass) + .append("init_method", params.getInitParam().getInitMethod()) + .append("fit_intercept", params.getInitParam().getFitIntercept()) + .append("n_splits", params.getCvParam().getnSplits()) + .append("shuffle", params.getCvParam().isShuffle()) + .append("need_cv", params.getCvParam().isNeedCv()); + + taskParam.put("params", vertLRParam); + + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + return taskResultService.listAllResult(taskId); + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + + return super.getResult(taskId, type); + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode flowGraphNode) { + + return Arrays.asList( + InputMatcher.of(Names.Data.TRAIN_DATA_SET, TRAIN_DATA_SET_FILTER), + InputMatcher.of(Names.Data.EVALUATION_DATA_SET, TEST_DATA_SET_SUPPLIER) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance), + OutputItem.of(Names.Model.TRAIN_MODEL, IODataType.ModelFromLr) + ); + } + + public static class Params extends AbstractLRInput { + @Check(require = true) + private OtherParam otherParam; + + public OtherParam getOtherParam() { + return otherParam; + } + + public void setOtherParam(OtherParam otherParam) { + this.otherParam = otherParam; + } + + public static class OtherParam extends AbstractCheckModel { + @Check(name = "鎯╃綒鏂瑰紡", require = true) + private String penalty; + + @Check(name = "鏀舵暃瀹瑰繊搴", require = true) + private float tol; + + @Check(name = "鎯╃綒椤圭郴鏁", require = true) + private float alpha; + + @Check(name = "浼樺寲绠楁硶", require = true) + private String optimizer; + + @Check(name = "鎵归噺澶у皬", require = true) + private int batchSize; + + @Check(name = "瀛︿範鐜", require = true) + private float learningRate; + + @Check(name = "鏈澶ц凯浠f鏁", require = true) + private int maxIter; + + @Check(name = "鍒ゆ柇鏀舵暃涓庡惁鐨勬柟娉", require = true) + private String earlyStop; + + @Check(name = "瀛︿範閫熺巼鐨勮“鍑忕巼", require = true) + private float decay; + + @Check(name = "琛板噺鐜囨槸鍚﹀紑骞虫柟", require = true) + private boolean decaySqrt; + + @Check(name = "澶氬垎绫荤瓥鐣", require = true) + private String multiClass; + + public String getPenalty() { + return penalty; + } + + public void setPenalty(String penalty) { + this.penalty = penalty; + } + + public float getTol() { + return tol; + } + + public void setTol(float tol) { + this.tol = tol; + } + + public float getAlpha() { + return alpha; + } + + public void setAlpha(float alpha) { + this.alpha = alpha; + } + + public String getOptimizer() { + return optimizer; + } + + public void setOptimizer(String optimizer) { + this.optimizer = optimizer; + } + + public int getBatchSize() { + return batchSize; + } + + public void setBatchSize(int batchSize) { + this.batchSize = batchSize; + } + + public float getLearningRate() { + return learningRate; + } + + public void setLearningRate(float learningRate) { + this.learningRate = learningRate; + } + + public int getMaxIter() { + return maxIter; + } + + public void setMaxIter(int maxIter) { + this.maxIter = maxIter; + } + + public String getEarlyStop() { + return earlyStop; + } + + public void setEarlyStop(String earlyStop) { + this.earlyStop = earlyStop; + } + + public float getDecay() { + return decay; + } + + public void setDecay(float decay) { + this.decay = decay; + } + + public boolean isDecaySqrt() { + return decaySqrt; + } + + public void setDecaySqrt(boolean decaySqrt) { + this.decaySqrt = decaySqrt; + } + + public String getMultiClass() { + return multiClass; + } + + public void setMultiClass(String multiClass) { + this.multiClass = multiClass; + } + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/HorzNNComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/HorzNNComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..2e91f01ede8678be1d8a7998bc4ae558f6408503 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/HorzNNComponent.java" @@ -0,0 +1,233 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.modeling; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; + +@Service +public class HorzNNComponent extends AbstractModelingComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, + Params params) throws FlowNodeException { + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, + Params params) throws FlowNodeException { + JSONObject taskParam = new JSONObject(); + JObject horzNNParam = JObject.create(); + horzNNParam.append("encode_label", false).append("max_iter", params.maxIter).append("batch_size", + params.batchSize); + + JObject earlyStop = JObject.create("early_stop", "diff").append("eps", 0.0); + horzNNParam.append("early_stop", earlyStop); + + JObject optimizer = JObject.create().append("learning_rate", params.learningRate) + .append("optimizer", params.optimizer); + List metrics = new ArrayList<>(); + metrics.add("AUC"); + metrics.add("Hinge"); + metrics.add("accuracy"); + horzNNParam.append("optimizer", optimizer).append("loss", params.loss).append("metrics", metrics); + + JObject nnDefine = JObject.create().append("class_name", "Sequential").append("layers", params.nnDefine.layers); + horzNNParam.append("nn_define", nnDefine).append("config_type", "keras"); + + taskParam.put("params", horzNNParam); + return taskParam; + } + + @Override + public ComponentType taskType() { + return ComponentType.HorzNN; + } + + @Override + protected List getAllResult(String taskId) { + return taskResultService.listAllResult(taskId); + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + return super.getResult(taskId, type); + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + return Arrays.asList(InputMatcher.of(Names.Data.TRAIN_DATA_SET, TRAIN_DATA_SET_FILTER), + InputMatcher.of(Names.Data.EVALUATION_DATA_SET, TEST_DATA_SET_SUPPLIER)); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + return Arrays.asList(OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance), + OutputItem.of(Names.Model.TRAIN_MODEL, IODataType.ModelFromNN)); + } + + public static class Params extends AbstractCheckModel { + @Check(name = "鏈澶ц凯浠f鏁", require = true) + private int maxIter; + @Check(name = "鎵归噺澶у皬", require = true) + private int batchSize; + @Check(name = "瀛︿範鐜", require = true) + private float learningRate; + @Check(name = "浼樺寲鍣", require = true) + private String optimizer; + @Check(name = "鎹熷け鍑芥暟", require = true) + private String loss; + @Check(name = "姣忓眰鍙傛暟", require = true) + private NNDefine nnDefine; + + public int getMaxIter() { + return maxIter; + } + + public void setMaxIter(int maxIter) { + this.maxIter = maxIter; + } + + public int getBatchSize() { + return batchSize; + } + + public void setBatchSize(int batchSize) { + this.batchSize = batchSize; + } + + public float getLearningRate() { + return learningRate; + } + + public void setLearningRate(float learningRate) { + this.learningRate = learningRate; + } + + public String getOptimizer() { + return optimizer; + } + + public void setOptimizer(String optimizer) { + this.optimizer = optimizer; + } + + public String getLoss() { + return loss; + } + + public void setLoss(String loss) { + this.loss = loss; + } + + public NNDefine getNnDefine() { + return nnDefine; + } + + public void setNnDefine(NNDefine nnDefine) { + this.nnDefine = nnDefine; + } + + public static class NNDefine extends AbstractCheckModel { + private List layers; + + public List getLayers() { + return layers; + } + + public void setLayers(List layers) { + this.layers = layers; + } + } + + public static class Layer extends AbstractCheckModel { + @Check(name = "瀹氫箟", require = true) + private String className; + @Check(name = "閰嶇疆", require = true) + private LayerConfig config; + + public LayerConfig getConfig() { + return config; + } + + public void setConfig(LayerConfig config) { + this.config = config; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + } + + public static class LayerConfig extends AbstractCheckModel { + @Check(name = "杈撳嚭缁村害", require = true) + private int units; + @Check(name = "杈撳叆缁村害", require = false) + private List inputShape; + @Check(name = "婵娲诲嚱鏁", require = true) + private String activation; + + public int getUnits() { + return units; + } + + public void setUnits(int units) { + this.units = units; + } + + public List getInputShape() { + return inputShape; + } + + public void setInputShape(List inputShape) { + this.inputShape = inputShape; + } + + public String getActivation() { + return activation; + } + + public void setActivation(String activation) { + this.activation = activation; + } + + } + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/HorzSecureBoostComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/HorzSecureBoostComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..677da2a7c6c69119b47183e365e6bd3050b6a02a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/HorzSecureBoostComponent.java" @@ -0,0 +1,209 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.modeling; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.dto.AbstractSecureBoostInput; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * @author lonnie + */ +@Service +public class HorzSecureBoostComponent extends AbstractModelingComponent { + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + } + + + @Override + public ComponentType taskType() { + return ComponentType.HorzSecureBoost; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + + JObject horzSecureBoostParam = JObject.create(); + JObject treeParam = JObject.create().append("criterion_method", "xgboost") + .append("criterion_params", params.getTreeParam().getCriterionParams()) + .append("max_depth", params.getTreeParam().getMaxDepth()) + .append("min_sample_split", params.getTreeParam().getMinSampleSplit()) + .append("min_impurity_split", params.getTreeParam().getMinImpuritySplit()) + .append("min_leaf_node", params.getTreeParam().getMinLeafNode()) + .append("max_split_nodes", params.getTreeParam().getMaxSplitNodes()); + + JObject objectiveParam = JObject.create().append("objective", params.getObjectiveParam().getObjective()) + .append("params", params.getObjectiveParam().getParams()); + + JObject cvParam = JObject.create() + .append("n_splits", params.getCvParam().getnSplits()) + .append("shuffle", params.getCvParam().isShuffle()) + .append("need_cv", params.getCvParam().isNeedCv()); + + + horzSecureBoostParam.append("task_type", params.otherParam.taskType) + .append("learning_rate", params.otherParam.learningRate) + .append("num_trees", params.otherParam.numTrees) + .append("subsample_feature_rate", params.otherParam.subsampleFeatureRate) + .append("n_iter_no_change", params.otherParam.nIterNoChange) + .append("tol", params.otherParam.tol) + .append("bin_num", params.otherParam.binNum) + .append("tree_param", treeParam) + .append("objective_param", objectiveParam) + .append("cv_param", cvParam); + + taskParam.put("params", horzSecureBoostParam); + + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + return taskResultService.listAllResult(taskId); + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + return super.getResult(taskId, type); + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + InputMatcher.of(Names.Data.TRAIN_DATA_SET, IODataType.DataSetInstance), + InputMatcher.of(Names.Data.EVALUATION_DATA_SET, TEST_DATA_SET_SUPPLIER) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance), + OutputItem.of(Names.Model.TRAIN_MODEL, IODataType.ModelFromXGBoost) + ); + } + + + public static class Params extends AbstractSecureBoostInput { + + @Check(require = true) + private OtherParam otherParam; + + public OtherParam getOtherParam() { + return otherParam; + } + + public void setOtherParam(OtherParam otherParam) { + this.otherParam = otherParam; + } + + public static class OtherParam extends AbstractCheckModel { + @Check(name = "浠诲姟绫诲瀷", require = true) + private String taskType; + @Check(name = "瀛︿範鐜", require = true) + private float learningRate; + @Check(name = "鏍戞暟閲", require = true) + private int numTrees; + @Check(name = "鐗瑰緛闅忔満閲囨牱姣旂巼", require = true) + private float subsampleFeatureRate; + @Check(name = "澶氭杩唬鏃犲彉鍖栨槸鍏佽鍋滄", require = true) + private boolean nIterNoChange; + @Check(name = "鏀舵暃闃鍊", require = true) + private float tol; + @Check(name = "鏈澶у垎绠辨暟", require = true) + private int binNum; + + public String getTaskType() { + return taskType; + } + + public void setTaskType(String taskType) { + this.taskType = taskType; + } + + public float getLearningRate() { + return learningRate; + } + + public void setLearningRate(float learningRate) { + this.learningRate = learningRate; + } + + public int getNumTrees() { + return numTrees; + } + + public void setNumTrees(int numTrees) { + this.numTrees = numTrees; + } + + public float getSubsampleFeatureRate() { + return subsampleFeatureRate; + } + + public void setSubsampleFeatureRate(float subsampleFeatureRate) { + this.subsampleFeatureRate = subsampleFeatureRate; + } + + public boolean isnIterNoChange() { + return nIterNoChange; + } + + public void setnIterNoChange(boolean nIterNoChange) { + this.nIterNoChange = nIterNoChange; + } + + public float getTol() { + return tol; + } + + public void setTol(float tol) { + this.tol = tol; + } + + public int getBinNum() { + return binNum; + } + + public void setBinNum(int binNum) { + this.binNum = binNum; + } + } + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/MixLrComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/MixLrComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..bb22b5b3ffebe22ede0f223fbf9da0aa53c94f7f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/MixLrComponent.java" @@ -0,0 +1,250 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.modeling; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.dto.AbstractLRInput; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * @author lonnie + */ +@Service +public class MixLrComponent extends AbstractModelingComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) { + + } + + + @Override + public ComponentType taskType() { + return ComponentType.MixLR; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) { + + JSONObject taskParam = new JSONObject(); + + JObject vertLRParam = JObject.create(); + vertLRParam.append("penalty", params.otherParam.penalty) + .append("tol", params.otherParam.tol) + .append("alpha", params.otherParam.alpha) + .append("optimizer", params.otherParam.optimizer) + .append("batch_size", params.otherParam.batchSize) + .append("learning_rate", params.otherParam.learningRate) + .append("max_iter", params.otherParam.maxIter) + .append("early_stop", params.otherParam.earlyStop) + .append("decay", params.otherParam.decay) + .append("decay_sqrt", params.otherParam.decaySqrt) + .append("multi_class", params.otherParam.multiClass) + .append("init_method", params.getInitParam().getInitMethod()) + .append("fit_intercept", params.getInitParam().getFitIntercept()) + .append("n_splits", params.getCvParam().getnSplits()) + .append("shuffle", params.getCvParam().isShuffle()) + .append("need_cv", params.getCvParam().isNeedCv()); + + taskParam.put("params", vertLRParam); + + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + return taskResultService.listAllResult(taskId); + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + + return super.getResult(taskId, type); + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode flowGraphNode) { + + return Arrays.asList( + InputMatcher.of(Names.Data.TRAIN_DATA_SET, TRAIN_DATA_SET_FILTER), + InputMatcher.of(Names.Data.EVALUATION_DATA_SET, TEST_DATA_SET_SUPPLIER) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance), + OutputItem.of(Names.Model.TRAIN_MODEL, IODataType.ModelFromLr) + ); + } + + public static class Params extends AbstractLRInput { + @Check(require = true) + private OtherParam otherParam; + + + public OtherParam getOtherParam() { + return otherParam; + } + + + public void setOtherParam(OtherParam otherParam) { + this.otherParam = otherParam; + } + + + public static class OtherParam extends AbstractCheckModel { + @Check(name = "鎯╃綒鏂瑰紡", require = true) + private String penalty; + + @Check(name = "鏀舵暃瀹瑰繊搴", require = true) + private float tol; + + @Check(name = "鎯╃綒椤圭郴鏁", require = true) + private float alpha; + + @Check(name = "浼樺寲绠楁硶", require = true) + private String optimizer; + + @Check(name = "鎵归噺澶у皬", require = true) + private int batchSize; + + @Check(name = "瀛︿範鐜", require = true) + private float learningRate; + + @Check(name = "鏈澶ц凯浠f鏁", require = true) + private int maxIter; + + @Check(name = "鍒ゆ柇鏀舵暃涓庡惁鐨勬柟娉", require = true) + private String earlyStop; + + @Check(name = "瀛︿範閫熺巼鐨勮“鍑忕巼", require = true) + private float decay; + + @Check(name = "琛板噺鐜囨槸鍚﹀紑骞虫柟", require = true) + private boolean decaySqrt; + + @Check(name = "澶氬垎绫荤瓥鐣", require = true) + private String multiClass; + + public String getPenalty() { + return penalty; + } + + public void setPenalty(String penalty) { + this.penalty = penalty; + } + + public float getTol() { + return tol; + } + + public void setTol(float tol) { + this.tol = tol; + } + + public float getAlpha() { + return alpha; + } + + public void setAlpha(float alpha) { + this.alpha = alpha; + } + + public String getOptimizer() { + return optimizer; + } + + public void setOptimizer(String optimizer) { + this.optimizer = optimizer; + } + + public int getBatchSize() { + return batchSize; + } + + public void setBatchSize(int batchSize) { + this.batchSize = batchSize; + } + + public float getLearningRate() { + return learningRate; + } + + public void setLearningRate(float learningRate) { + this.learningRate = learningRate; + } + + public int getMaxIter() { + return maxIter; + } + + public void setMaxIter(int maxIter) { + this.maxIter = maxIter; + } + + public String getEarlyStop() { + return earlyStop; + } + + public void setEarlyStop(String earlyStop) { + this.earlyStop = earlyStop; + } + + public float getDecay() { + return decay; + } + + public void setDecay(float decay) { + this.decay = decay; + } + + public boolean isDecaySqrt() { + return decaySqrt; + } + + public void setDecaySqrt(boolean decaySqrt) { + this.decaySqrt = decaySqrt; + } + + public String getMultiClass() { + return multiClass; + } + + public void setMultiClass(String multiClass) { + this.multiClass = multiClass; + } + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/MixSecureBoostComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/MixSecureBoostComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..461ecd911b24a52b909823d96f5daf0ae2b751e3 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/MixSecureBoostComponent.java" @@ -0,0 +1,264 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.modeling; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.filter.IntersectedOutputFilter; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.dto.AbstractSecureBoostInput; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * @author lonnie + */ +@Service +public class MixSecureBoostComponent extends AbstractModelingComponent { + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + } + + + @Override + public ComponentType taskType() { + return ComponentType.MixSecureBoost; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + + JObject vertSecureBoostParam = JObject.create(); + JObject treeParam = JObject.create().append("criterion_method", "xgboost") + .append("criterion_params", params.getTreeParam().getCriterionParams()) + .append("max_depth", params.getTreeParam().getMaxDepth()) + .append("min_sample_split", params.getTreeParam().getMinSampleSplit()) + .append("min_impurity_split", params.getTreeParam().getMinImpuritySplit()) + .append("min_leaf_node", params.getTreeParam().getMinLeafNode()) + .append("max_split_nodes", params.getTreeParam().getMaxSplitNodes()); + + JObject objectiveParam = JObject.create().append("objective", params.getObjectiveParam().getObjective()) + .append("params", params.getObjectiveParam().getParams()); + + JObject encryptParam = JObject.create() + .append("method", params.encryptParam.method); + + JObject cvParam = JObject.create() + .append("n_splits", params.getCvParam().getnSplits()) + .append("shuffle", params.getCvParam().isShuffle()) + .append("need_cv", params.getCvParam().isNeedCv()); + + vertSecureBoostParam.append("task_type", params.otherParam.taskType) + .append("learning_rate", params.otherParam.learningRate) + .append("num_trees", params.otherParam.numTrees) + .append("subsample_feature_rate", params.otherParam.subsampleFeatureRate) + .append("n_iter_no_change", params.otherParam.nIterNoChange) + .append("tol", params.otherParam.tol) + .append("bin_num", params.otherParam.binNum) + .append("validation_freqs", params.otherParam.validationFreqs) + .append("early_stopping_rounds", params.otherParam.earlyStoppingRounds) + .append("tree_param", treeParam) + .append("objective_param", objectiveParam) + .append("encrypt_param", encryptParam) + .append("cv_param", cvParam); + + taskParam.put("params", vertSecureBoostParam); + + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + return taskResultService.listAllResult(taskId); + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + + return super.getResult(taskId, type); + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + InputMatcher.of(Names.Data.TRAIN_DATA_SET, new IntersectedOutputFilter(graph)), + InputMatcher.of(Names.Data.EVALUATION_DATA_SET, TEST_DATA_SET_SUPPLIER) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance), + OutputItem.of(Names.Model.TRAIN_MODEL, IODataType.ModelFromXGBoost) + ); + } + + @Override + protected boolean needIntersectedDataSetBeforeMe() { + return true; + } + + public static class Params extends AbstractSecureBoostInput { + + @Check(require = true) + private EncryptParam encryptParam; + + public EncryptParam getEncryptParam() { + return encryptParam; + } + + public void setEncryptParam(EncryptParam encryptParam) { + this.encryptParam = encryptParam; + } + + public static class EncryptParam extends AbstractCheckModel { + @Check(name = "鍚屾佸姞瀵嗙畻娉", require = true) + private String method; + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + } + + @Check(require = true) + private OtherParam otherParam; + + public OtherParam getOtherParam() { + return otherParam; + } + + public void setOtherParam(OtherParam otherParam) { + this.otherParam = otherParam; + } + + public static class OtherParam extends AbstractCheckModel { + @Check(name = "浠诲姟绫诲瀷", require = true) + private String taskType; + @Check(name = "瀛︿範鐜", require = true) + private float learningRate; + @Check(name = "鏍戞暟閲", require = true) + private int numTrees; + @Check(name = "鐗瑰緛闅忔満閲囨牱姣旂巼", require = true) + private float subsampleFeatureRate; + @Check(name = "澶氭杩唬鏃犲彉鍖栨槸鍏佽鍋滄", require = true) + private boolean nIterNoChange; + @Check(name = "鏀舵暃闃鍊", require = true) + private float tol; + @Check(name = "鏈澶у垎绠辨暟", require = true) + private int binNum; + @Check(name = "楠岃瘉棰戠巼", require = true) + private int validationFreqs; + @Check(name = "鍏佽鎻愬墠缁撴潫鐨勬渶灏忚凯浠f鏁", require = true) + private int earlyStoppingRounds; + + public String getTaskType() { + return taskType; + } + + public void setTaskType(String taskType) { + this.taskType = taskType; + } + + public float getLearningRate() { + return learningRate; + } + + public void setLearningRate(float learningRate) { + this.learningRate = learningRate; + } + + public int getNumTrees() { + return numTrees; + } + + public void setNumTrees(int numTrees) { + this.numTrees = numTrees; + } + + public float getSubsampleFeatureRate() { + return subsampleFeatureRate; + } + + public void setSubsampleFeatureRate(float subsampleFeatureRate) { + this.subsampleFeatureRate = subsampleFeatureRate; + } + + public boolean isnIterNoChange() { + return nIterNoChange; + } + + public void setnIterNoChange(boolean nIterNoChange) { + this.nIterNoChange = nIterNoChange; + } + + public float getTol() { + return tol; + } + + public void setTol(float tol) { + this.tol = tol; + } + + public int getBinNum() { + return binNum; + } + + public void setBinNum(int binNum) { + this.binNum = binNum; + } + + public int getValidationFreqs() { + return validationFreqs; + } + + public void setValidationFreqs(int validationFreqs) { + this.validationFreqs = validationFreqs; + } + + public int getEarlyStoppingRounds() { + return earlyStoppingRounds; + } + + public void setEarlyStoppingRounds(int earlyStoppingRounds) { + this.earlyStoppingRounds = earlyStoppingRounds; + } + } + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/VertLRComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/VertLRComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..0771972bb60418b8321346aa420e864d97733bbd --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/VertLRComponent.java" @@ -0,0 +1,319 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.modeling; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.dto.AbstractLRInput; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author lonnie + */ +@Service +public class VertLRComponent extends AbstractModelingComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + FlowGraphNode intersectionNode = graph.findOneNodeFromParent(node, ComponentType.Intersection); + if (intersectionNode == null) { + throw new FlowNodeException(node, "璇峰湪鍓嶉潰娣诲姞鏍锋湰瀵归綈缁勪欢銆"); + } + } + + + @Override + public ComponentType taskType() { + return ComponentType.VertLR; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + + JObject vertLRParam = JObject.create(); + vertLRParam.append("penalty", params.otherParam.penalty) + .append("tol", params.otherParam.tol) + .append("alpha", params.otherParam.alpha) + .append("optimizer", params.otherParam.optimizer) + .append("batch_size", params.otherParam.batchSize) + .append("learning_rate", params.otherParam.learningRate) + .append("max_iter", params.otherParam.maxIter) + .append("early_stop", params.otherParam.earlyStop) + .append("decay", params.otherParam.decay) + .append("decay_sqrt", params.otherParam.decaySqrt) + .append("multi_class", params.otherParam.multiClass) + .append("validation_freqs", params.otherParam.validationFreqs) + .append("early_stopping_rounds", params.otherParam.earlyStoppingRounds) + .append("init_method", params.getInitParam().getInitMethod()) + .append("fit_intercept", params.getInitParam().getFitIntercept()) + .append("method", params.encryPtParam.method) + .append("key_length", 1024) + .append("n_splits", params.getCvParam().getnSplits()) + .append("shuffle", params.getCvParam().isShuffle()) + .append("need_cv", params.getCvParam().isNeedCv()); + + taskParam.put("params", vertLRParam); + + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + List list = taskResultService.listAllResult(taskId) + .stream() + .filter(x -> x.getType().equals(TaskResultType.metric_train)) + .filter(x -> x.getType().equals(TaskResultType.model_train)) + .collect(Collectors.toList()); + + // Put the reassembled data in + list.add(getResult(taskId, TaskResultType.metric_train.name())); + list.add(getResult(taskId, TaskResultType.model_train.name())); + + return list; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + + return super.getResult(taskId, type); + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + // InputMatcher.of(Names.Data.TRAIN_DATA_SET, new BinnedOutputFilter(graph)), + + return Arrays.asList( + InputMatcher.of(Names.Data.TRAIN_DATA_SET, TRAIN_DATA_SET_FILTER), + InputMatcher.of(Names.Data.EVALUATION_DATA_SET, TEST_DATA_SET_SUPPLIER) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance), + OutputItem.of(Names.Model.TRAIN_MODEL, IODataType.ModelFromLr) + ); + } + + @Override + protected boolean needIntersectedDataSetBeforeMe() { + return true; + } + + public static class Params extends AbstractLRInput { + @Check(require = true) + private OtherParam otherParam; + + public OtherParam getOtherParam() { + return otherParam; + } + + public void setOtherParam(OtherParam otherParam) { + this.otherParam = otherParam; + } + + public static class OtherParam extends AbstractCheckModel { + @Check(name = "鎯╃綒鏂瑰紡", require = true) + private String penalty; + + @Check(name = "鏀舵暃瀹瑰繊搴", require = true) + private float tol; + + @Check(name = "鎯╃綒椤圭郴鏁", require = true) + private float alpha; + + @Check(name = "浼樺寲绠楁硶", require = true) + private String optimizer; + + @Check(name = "鎵归噺澶у皬", require = true) + private int batchSize; + + @Check(name = "瀛︿範鐜", require = true) + private float learningRate; + + @Check(name = "鏈澶ц凯浠f鏁", require = true) + private int maxIter; + + @Check(name = "鍒ゆ柇鏀舵暃涓庡惁鐨勬柟娉", require = true) + private String earlyStop; + + @Check(name = "瀛︿範閫熺巼鐨勮“鍑忕巼", require = true) + private float decay; + + @Check(name = "琛板噺鐜囨槸鍚﹀紑骞虫柟", require = true) + private boolean decaySqrt; + + @Check(name = "澶氬垎绫荤瓥鐣", require = true) + private String multiClass; + + @Check(name = "楠岃瘉棰戞", require = true) + private int validationFreqs; + + @Check(name = "鎻愬墠缁撴潫鐨勮凯浠f鏁", require = true) + private int earlyStoppingRounds; + + public String getPenalty() { + return penalty; + } + + public void setPenalty(String penalty) { + this.penalty = penalty; + } + + public float getTol() { + return tol; + } + + public void setTol(float tol) { + this.tol = tol; + } + + public float getAlpha() { + return alpha; + } + + public void setAlpha(float alpha) { + this.alpha = alpha; + } + + public String getOptimizer() { + return optimizer; + } + + public void setOptimizer(String optimizer) { + this.optimizer = optimizer; + } + + public int getBatchSize() { + return batchSize; + } + + public void setBatchSize(int batchSize) { + this.batchSize = batchSize; + } + + public float getLearningRate() { + return learningRate; + } + + public void setLearningRate(float learningRate) { + this.learningRate = learningRate; + } + + public int getMaxIter() { + return maxIter; + } + + public void setMaxIter(int maxIter) { + this.maxIter = maxIter; + } + + public String getEarlyStop() { + return earlyStop; + } + + public void setEarlyStop(String earlyStop) { + this.earlyStop = earlyStop; + } + + public float getDecay() { + return decay; + } + + public void setDecay(float decay) { + this.decay = decay; + } + + public boolean isDecaySqrt() { + return decaySqrt; + } + + public void setDecaySqrt(boolean decaySqrt) { + this.decaySqrt = decaySqrt; + } + + public String getMultiClass() { + return multiClass; + } + + public void setMultiClass(String multiClass) { + this.multiClass = multiClass; + } + + public int getValidationFreqs() { + return validationFreqs; + } + + public void setValidationFreqs(int validationFreqs) { + this.validationFreqs = validationFreqs; + } + + public int getEarlyStoppingRounds() { + return earlyStoppingRounds; + } + + public void setEarlyStoppingRounds(int earlyStoppingRounds) { + this.earlyStoppingRounds = earlyStoppingRounds; + } + } + + @Check(require = true) + private EncryptParam encryPtParam; + + public EncryptParam getEncryPtParam() { + return encryPtParam; + } + + public void setEncryPtParam(EncryptParam encryPtParam) { + this.encryPtParam = encryPtParam; + } + + public static class EncryptParam extends AbstractCheckModel { + @Check(name = "鍔犲瘑鏂规硶", require = true) + private String method; + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/VertNNComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/VertNNComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..a0d230d0c1cc07a8738b89a3c2076310b07cd3d3 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/VertNNComponent.java" @@ -0,0 +1,312 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.modeling; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.JobMemberMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; + +@Service +public class VertNNComponent extends AbstractModelingComponent { + + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, + Params params) throws FlowNodeException { + List jobMembers = graph.getMembers(); + long providerCount = jobMembers.stream().filter(x -> x.getJobRole() == JobMemberRole.provider).count(); + if(providerCount == 2) { + throw new FlowNodeException(node, "绾靛悜娣卞害瀛︿範涓嶆敮鎸佸涓崗浣滄柟锛岃淇濈暀涓涓崗浣滄柟鏁版嵁闆"); + } + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, + Params params) throws FlowNodeException { + JSONObject taskParam = new JSONObject(); + + JObject vertNNParam = JObject.create(); + vertNNParam.append("epochs", params.epochs).append("interactive_layer_lr", params.interactiveLayerLr) + .append("batch_size", params.batchSize).append("early_stop", "diff"); + + JObject optimizer = JObject.create().append("learning_rate", params.learningRate).append("optimizer", + params.optimizer); + List metrics = new ArrayList<>(); + metrics.add("AUC"); + vertNNParam.append("optimizer", optimizer).append("loss", params.loss).append("metrics", metrics); + + JObject bottomNNDefine = JObject.create().append("class_name", "Sequential").append("layers", + params.bottomNNDefine.layers); + + vertNNParam.append("bottom_nn_define", bottomNNDefine); + + JObject interactiveLayerDefine = JObject.create().append("class_name", "Sequential").append("layers", + params.interactiveLayerDefine.layers); + + vertNNParam.append("interactive_layer_define", interactiveLayerDefine); + + JObject topNNDefine = JObject.create().append("class_name", "Sequential").append("layers", + params.topNNDefine.layers); + + vertNNParam.append("top_nn_define", topNNDefine); + + vertNNParam.append("config_type", "keras"); + + taskParam.put("params", vertNNParam); + + return taskParam; + } + + @Override + public ComponentType taskType() { + return ComponentType.VertNN; + } + + @Override + protected List getAllResult(String taskId) { + return taskResultService.listAllResult(taskId); + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + return super.getResult(taskId, type); + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + return Arrays.asList(InputMatcher.of(Names.Data.TRAIN_DATA_SET, TRAIN_DATA_SET_FILTER), + InputMatcher.of(Names.Data.EVALUATION_DATA_SET, TEST_DATA_SET_SUPPLIER)); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + return Arrays.asList(OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance), + OutputItem.of(Names.Model.TRAIN_MODEL, IODataType.ModelFromNN)); + } + + public static class Params extends AbstractCheckModel { + @Check(name = "鏈澶ц凯浠f鏁", require = true) + private int epochs; + + @Check(name = "浜や簰灞傚涔犵巼", require = true) + private float interactiveLayerLr; + + @Check(name = "鎵归噺澶у皬", require = true) + private int batchSize; + + @Check(name = "瀛︿範鐜", require = true) + private float learningRate; + + @Check(name = "浼樺寲鍣", require = true) + private String optimizer; + + @Check(name = "鎹熷け鍑芥暟", require = true) + private String loss; + + @Check(name = "搴曞眰", require = true) + private BottomNNDefine bottomNNDefine; + + @Check(name = "涓棿浜や簰灞", require = true) + private InteractiveLayerDefine interactiveLayerDefine; + + @Check(name = "椤跺眰", require = true) + private TopNNDefine topNNDefine; + + public static class BottomNNDefine extends AbstractCheckModel { + private List layers; + + public List getLayers() { + return layers; + } + + public void setLayers(List layers) { + this.layers = layers; + } + } + + public static class InteractiveLayerDefine extends AbstractCheckModel { + private List layers; + + public List getLayers() { + return layers; + } + + public void setLayers(List layers) { + this.layers = layers; + } + } + + public static class TopNNDefine extends AbstractCheckModel { + private List layers; + + public List getLayers() { + return layers; + } + + public void setLayers(List layers) { + this.layers = layers; + } + } + + public int getEpochs() { + return epochs; + } + + public void setEpochs(int epochs) { + this.epochs = epochs; + } + + public float getInteractiveLayerLr() { + return interactiveLayerLr; + } + + public void setInteractiveLayerLr(float interactiveLayerLr) { + this.interactiveLayerLr = interactiveLayerLr; + } + + public int getBatchSize() { + return batchSize; + } + + public void setBatchSize(int batchSize) { + this.batchSize = batchSize; + } + + public float getLearningRate() { + return learningRate; + } + + public void setLearningRate(float learningRate) { + this.learningRate = learningRate; + } + + public String getOptimizer() { + return optimizer; + } + + public void setOptimizer(String optimizer) { + this.optimizer = optimizer; + } + + public String getLoss() { + return loss; + } + + public void setLoss(String loss) { + this.loss = loss; + } + + public BottomNNDefine getBottomNNDefine() { + return bottomNNDefine; + } + + public void setBottomNNDefine(BottomNNDefine bottomNNDefine) { + this.bottomNNDefine = bottomNNDefine; + } + + public InteractiveLayerDefine getInteractiveLayerDefine() { + return interactiveLayerDefine; + } + + public void setInteractiveLayerDefine(InteractiveLayerDefine interactiveLayerDefine) { + this.interactiveLayerDefine = interactiveLayerDefine; + } + + public TopNNDefine getTopNNDefine() { + return topNNDefine; + } + + public void setTopNNDefine(TopNNDefine topNNDefine) { + this.topNNDefine = topNNDefine; + } + + public static class Layer extends AbstractCheckModel { + @Check(name = "瀹氫箟", require = true) + private String className; + @Check(name = "閰嶇疆", require = true) + private LayerConfig config; + + public LayerConfig getConfig() { + return config; + } + + public void setConfig(LayerConfig config) { + this.config = config; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + } + + public static class LayerConfig extends AbstractCheckModel { + @Check(name = "杈撳嚭缁村害", require = true) + private int units; + @Check(name = "杈撳叆缁村害", require = false) + private List inputShape; + @Check(name = "婵娲诲嚱鏁", require = true) + private String activation; + + public int getUnits() { + return units; + } + + public void setUnits(int units) { + this.units = units; + } + + public List getInputShape() { + return inputShape; + } + + public void setInputShape(List inputShape) { + this.inputShape = inputShape; + } + + public String getActivation() { + return activation; + } + + public void setActivation(String activation) { + this.activation = activation; + } + + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/VertSecureBoostComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/VertSecureBoostComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..ab3f0f6064cf4ed4ec2b3fe660e7a485aa94a20a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/modeling/VertSecureBoostComponent.java" @@ -0,0 +1,267 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.modeling; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.filter.IntersectedOutputFilter; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.dto.AbstractSecureBoostInput; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * @author lonnie + */ +@Service +public class VertSecureBoostComponent extends AbstractModelingComponent { + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + FlowGraphNode intersectionNode = graph.findOneNodeFromParent(node, ComponentType.Intersection); + if (intersectionNode == null) { + throw new FlowNodeException(node, "璇峰湪鍓嶉潰娣诲姞鏍锋湰瀵归綈缁勪欢銆"); + } + } + + + @Override + public ComponentType taskType() { + return ComponentType.VertSecureBoost; + } + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + JSONObject taskParam = new JSONObject(); + + JObject vertSecureBoostParam = JObject.create(); + JObject treeParam = JObject.create().append("criterion_method", "xgboost") + .append("criterion_params", params.getTreeParam().getCriterionParams()) + .append("max_depth", params.getTreeParam().getMaxDepth()) + .append("min_sample_split", params.getTreeParam().getMinSampleSplit()) + .append("min_impurity_split", params.getTreeParam().getMinImpuritySplit()) + .append("min_leaf_node", params.getTreeParam().getMinLeafNode()) + .append("max_split_nodes", params.getTreeParam().getMaxSplitNodes()); + + JObject objectiveParam = JObject.create().append("objective", params.getObjectiveParam().getObjective()) + .append("params", params.getObjectiveParam().getParams()); + + JObject encryptParam = JObject.create() + .append("method", params.encryptParam.method); + + JObject cvParam = JObject.create() + .append("n_splits", params.getCvParam().getnSplits()) + .append("shuffle", params.getCvParam().isShuffle()) + .append("need_cv", params.getCvParam().isNeedCv()); + + vertSecureBoostParam.append("task_type", params.otherParam.taskType) + .append("learning_rate", params.otherParam.learningRate) + .append("num_trees", params.otherParam.numTrees) + .append("subsample_feature_rate", params.otherParam.subsampleFeatureRate) + .append("n_iter_no_change", params.otherParam.nIterNoChange) + .append("tol", params.otherParam.tol) + .append("bin_num", params.otherParam.binNum) + .append("validation_freqs", params.otherParam.validationFreqs) + .append("early_stopping_rounds", params.otherParam.earlyStoppingRounds) + .append("tree_param", treeParam) + .append("objective_param", objectiveParam) + .append("encrypt_param", encryptParam) + .append("cv_param", cvParam); + + taskParam.put("params", vertSecureBoostParam); + + return taskParam; + } + + @Override + protected List getAllResult(String taskId) { + + return taskResultService.listAllResult(taskId); + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + + return super.getResult(taskId, type); + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + InputMatcher.of(Names.Data.TRAIN_DATA_SET, new IntersectedOutputFilter(graph)), + InputMatcher.of(Names.Data.EVALUATION_DATA_SET, TEST_DATA_SET_SUPPLIER) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + OutputItem.of(Names.Data.NORMAL_DATA_SET, IODataType.DataSetInstance), + OutputItem.of(Names.Model.TRAIN_MODEL, IODataType.ModelFromXGBoost) + ); + } + + @Override + protected boolean needIntersectedDataSetBeforeMe() { + return true; + } + + public static class Params extends AbstractSecureBoostInput { + + @Check(require = true) + private EncryptParam encryptParam; + + public EncryptParam getEncryptParam() { + return encryptParam; + } + + public void setEncryptParam(EncryptParam encryptParam) { + this.encryptParam = encryptParam; + } + + public static class EncryptParam extends AbstractCheckModel { + @Check(name = "鍚屾佸姞瀵嗙畻娉", require = true) + private String method; + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + } + + @Check(require = true) + private OtherParam otherParam; + + public OtherParam getOtherParam() { + return otherParam; + } + + public void setOtherParam(OtherParam otherParam) { + this.otherParam = otherParam; + } + + public static class OtherParam extends AbstractCheckModel { + @Check(name = "浠诲姟绫诲瀷", require = true) + private String taskType; + @Check(name = "瀛︿範鐜", require = true) + private float learningRate; + @Check(name = "鏍戞暟閲", require = true) + private int numTrees; + @Check(name = "鐗瑰緛闅忔満閲囨牱姣旂巼", require = true) + private float subsampleFeatureRate; + @Check(name = "澶氭杩唬鏃犲彉鍖栨槸鍏佽鍋滄", require = true) + private boolean nIterNoChange; + @Check(name = "鏀舵暃闃鍊", require = true) + private float tol; + @Check(name = "鏈澶у垎绠辨暟", require = true) + private int binNum; + @Check(name = "楠岃瘉棰戠巼", require = true) + private int validationFreqs; + @Check(name = "鍏佽鎻愬墠缁撴潫鐨勬渶灏忚凯浠f鏁", require = true) + private int earlyStoppingRounds; + + public String getTaskType() { + return taskType; + } + + public void setTaskType(String taskType) { + this.taskType = taskType; + } + + public float getLearningRate() { + return learningRate; + } + + public void setLearningRate(float learningRate) { + this.learningRate = learningRate; + } + + public int getNumTrees() { + return numTrees; + } + + public void setNumTrees(int numTrees) { + this.numTrees = numTrees; + } + + public float getSubsampleFeatureRate() { + return subsampleFeatureRate; + } + + public void setSubsampleFeatureRate(float subsampleFeatureRate) { + this.subsampleFeatureRate = subsampleFeatureRate; + } + + public boolean isnIterNoChange() { + return nIterNoChange; + } + + public void setnIterNoChange(boolean nIterNoChange) { + this.nIterNoChange = nIterNoChange; + } + + public float getTol() { + return tol; + } + + public void setTol(float tol) { + this.tol = tol; + } + + public int getBinNum() { + return binNum; + } + + public void setBinNum(int binNum) { + this.binNum = binNum; + } + + public int getValidationFreqs() { + return validationFreqs; + } + + public void setValidationFreqs(int validationFreqs) { + this.validationFreqs = validationFreqs; + } + + public int getEarlyStoppingRounds() { + return earlyStoppingRounds; + } + + public void setEarlyStoppingRounds(int earlyStoppingRounds) { + this.earlyStoppingRounds = earlyStoppingRounds; + } + } + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/temp/AbstractValidationDataSetLoaderComponent.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/temp/AbstractValidationDataSetLoaderComponent.java" new file mode 100644 index 0000000000000000000000000000000000000000..6700ceb5ae8631c99ec442254f10365d42b5a2c7 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/component/temp/AbstractValidationDataSetLoaderComponent.java" @@ -0,0 +1,79 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.component.temp; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.component.base.io.IODataType; +import com.welab.wefe.board.service.component.base.io.InputMatcher; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; + +import java.util.Arrays; +import java.util.List; + +/** + * Load validation set + * + * @author zane.luo + */ +public abstract class AbstractValidationDataSetLoaderComponent extends AbstractComponent { + @Override + protected void checkBeforeBuildTask(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + + } + + + @Override + protected JSONObject createTaskParams(FlowGraph graph, List preTasks, FlowGraphNode node, Params params) throws FlowNodeException { + return null; + } + + @Override + protected List getAllResult(String taskId) { + return null; + } + + @Override + protected TaskResultMySqlModel getResult(String taskId, String type) { + return null; + } + + @Override + protected List inputs(FlowGraph graph, FlowGraphNode node) { + return Arrays.asList( + InputMatcher.of( + Names.Data.NORMAL_DATA_SET, + IODataType.BoardDataSet + ) + ); + } + + @Override + public List outputs(FlowGraph graph, FlowGraphNode node) { + return null; + } + + public static class Params extends AbstractCheckModel { + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/config/WebSocketConfig.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/config/WebSocketConfig.java" new file mode 100644 index 0000000000000000000000000000000000000000..016552c1e1de3d5fea3eabc9cba591bb7474b00a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/config/WebSocketConfig.java" @@ -0,0 +1,51 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.config; + +import com.welab.wefe.board.service.service.MemberChatService; +import com.welab.wefe.board.service.service.WebSocketServer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +/** + * @author Johnny.lin + */ +@Configuration +public class WebSocketConfig { + + /** + * This Bean will automatically register the web socket endpoint + * declared with the @ServerEndpoint annotation + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } + + /** + * Because SpringBoot WebSocket creates a WebSocketServer + * (corresponding to the @ServerEndpoint annotation) + * object for each client connection, the Bean injection operation + * will be directly skipped, so manually inject a global variable + */ + @Autowired + public void setMemberChatService(MemberChatService memberChatService) { + WebSocketServer.memberChatService = memberChatService; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/constant/ChatConstant.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/constant/ChatConstant.java" new file mode 100644 index 0000000000000000000000000000000000000000..696d1b9a67ca0afd8cfc615ed1ff4dd6dfbaa02a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/constant/ChatConstant.java" @@ -0,0 +1,70 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.constant; + +/** + * Chat module related constants + * + * @author aaron.li + **/ +public class ChatConstant { + /** + * Message direction: close + */ + public final static int MESSAGE_DIRECTION_RECV = 0; + /** + * Message direction: send + */ + public final static int MESSAGE_DIRECTION_SEND = 1; + + /** + * Have read + */ + public final static int MESSAGE_STATUS_RECV_READ = 0; + /** + * unread + */ + public final static int MESSAGE_STATUS_RECV_UNREAD = 1; + /** + * Sent successfully + */ + public final static int MESSAGE_STATUS_SEND_SUCCESS = 2; + /** + * Failed to send + */ + public final static int MESSAGE_STATUS_SEND_FAIL = 3; + + public final static String KEY_CODE = "code"; + public final static String KEY_MESSAGE = "message"; + public final static String KEY_MEMBER_CHAT_ID = "member_chat_id"; + public final static String KEY_TYPE = "type"; + public final static String KEY_DATA = "data"; + public final static String KEY_FROM_ACCOUNT_ID = "fromAccountId"; + public final static String KEY_FROM_ACCOUNT_NAME = "fromAccountName"; + public final static String KEY_FROM_MEMBER_ID = "fromMemberId"; + public final static String KEY_FROM_MEMBER_NAME = "fromMemberName"; + public final static String KEY_TO_MEMBER_ID = "toMemberId"; + public final static String KEY_TO_MEMBER_NAME = "toMemberName"; + public final static String KEY_TO_ACCOUNT_ID = "toAccountId"; + public final static String KEY_TO_ACCOUNT_NAME = "toAccountName"; + public final static String KEY_CONTENT = "content"; + public final static String KEY_MESSAGE_ID = "messageId"; + public final static String KEY_CHAT = "chat"; + public final static String KEY_NON_CHAT = "non-chat"; + public final static String KEY_CREATED_TIME = "createdTime"; + public final static String KEY_DIRECTION = "direction"; +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/constant/Config.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/constant/Config.java" new file mode 100644 index 0000000000000000000000000000000000000000..a4ecd930e1283ad10faad30abbb6cf36264c8068 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/constant/Config.java" @@ -0,0 +1,126 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.constant; + +import com.welab.wefe.common.data.storage.common.DBType; +import com.welab.wefe.common.enums.JobBackendType; +import com.welab.wefe.common.enums.env.EnvBranch; +import com.welab.wefe.common.enums.env.EnvName; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +/** + * config.properties + * + * @author lonnie + */ +@Component +@PropertySource(value = {"file:${config.path}"}, encoding = "utf-8") +@ConfigurationProperties +public class Config { + + @Value("${wefe.union.base-url}") + private String UNION_BASE_URL; + + + @Value("${wefe.file.upload.dir}") + private String fileUploadDir; + + + @Value("${wefe.job.work_mode}") + private Integer workMode; + + @Value("${wefe.job.backend}") + private JobBackendType backend; + + @Value("${db.storage.type}") + private DBType dbType; + + @Value("${env.name}") + private EnvName envName; + + /** + * The branch of the environment, different branches will have different functions. + *

+ * online_demo: You can only delete data created by yourself锛坋g:flow銆乵ember銆乨ata_set锛 + */ + @Value("${env.branch:master}") + private EnvBranch envBranch; + + public String getUNION_BASE_URL() { + return UNION_BASE_URL; + } + + public void setUNION_BASE_URL(String UNION_BASE_URL) { + this.UNION_BASE_URL = UNION_BASE_URL; + } + + public String getFileUploadDir() { + return fileUploadDir; + } + + public void setFileUploadDir(String fileUploadDir) { + this.fileUploadDir = fileUploadDir; + } + + public Integer getWorkMode() { + return workMode; + } + + public void setWorkMode(Integer workMode) { + this.workMode = workMode; + } + + public JobBackendType getBackend() { + return backend; + } + + public void setBackend(JobBackendType backend) { + this.backend = backend; + } + + public DBType getDbType() { + return dbType; + } + + public void setDbType(DBType dbType) { + this.dbType = dbType; + } + + public EnvName getEnvName() { + return envName; + } + + public void setEnvName(EnvName envName) { + this.envName = envName; + } + + public EnvBranch getEnvBranch() { + return envBranch; + } + + public void setEnvBranch(EnvBranch envBranch) { + this.envBranch = envBranch; + } + + public boolean isOnlineDemo() { + return envBranch == EnvBranch.online_demo; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/constant/DataSetAddMethod.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/constant/DataSetAddMethod.java" new file mode 100644 index 0000000000000000000000000000000000000000..8f866f56b5dc223277fda43b9557b63c9a3755ed --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/constant/DataSetAddMethod.java" @@ -0,0 +1,37 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.constant; + +/** + * How to add data set + * + * @author zane.luo + */ +public enum DataSetAddMethod { + /** + * + */ + HttpUpload, + /** + * + */ + LocalFile, + /** + * + */ + Database +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/constant/ServiceStatus.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/constant/ServiceStatus.java" new file mode 100644 index 0000000000000000000000000000000000000000..4343a1bfef0a84d6e28f46d4912b38b47bb88e64 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/constant/ServiceStatus.java" @@ -0,0 +1,58 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.constant; + +/** + * @author lonnie + */ +public enum ServiceStatus { + + /** + * + */ + success("success", "姝e父"), + + /** + * + */ + offline("offline", "绂荤嚎"); + + + private String value; + private String description; + + ServiceStatus(String value, String description) { + this.value = value; + this.description = description; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/DataSourceConfig.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/DataSourceConfig.java" new file mode 100644 index 0000000000000000000000000000000000000000..024a69f78bdf7a762500e53469f6c96ee1ff34a2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/DataSourceConfig.java" @@ -0,0 +1,77 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database; + +import com.welab.wefe.board.service.BoardService; +import com.welab.wefe.board.service.database.repository.base.BaseRepositoryFactoryBean; +import com.welab.wefe.common.data.mysql.config.AbstractJpaConfig; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; +import org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy; +import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.transaction.PlatformTransactionManager; + +import javax.sql.DataSource; +import java.util.Map; + +/** + * @author aaron.li + **/ +@Configuration +@EntityScan("com.welab.wefe.board.service") +@EnableJpaRepositories(basePackageClasses = BoardService.class, + repositoryFactoryBeanClass = BaseRepositoryFactoryBean.class, + entityManagerFactoryRef = "entityManagerFactoryRefBoard", + transactionManagerRef = "transactionManagerRefWefeBoard") +public class DataSourceConfig extends AbstractJpaConfig { + + @Bean("board") + @ConfigurationProperties(prefix = "db.mysql") + @Primary + DataSource wefeBoard() { + return createDatasource(); + } + + @Bean("entityManagerFactoryRefBoard") + @Primary + LocalContainerEntityManagerFactoryBean entityManagerFactoryRefWefeBoard( + EntityManagerFactoryBuilder builder, @Qualifier("board") DataSource dataSource) { + // Set the naming rules for entities and tables (because custom data sources will override the original rules of jpa) + Map pros = mProperties.getProperties(); + pros.put("hibernate.physical_naming_strategy", SpringPhysicalNamingStrategy.class.getName()); + pros.put("hibernate.implicit_naming_strategy", SpringImplicitNamingStrategy.class.getName()); + + return entityManagerFactoryRef(builder, dataSource, mProperties, BoardService.class); + } + + @Bean + @Primary + PlatformTransactionManager transactionManagerRefWefeBoard( + @Qualifier("entityManagerFactoryRefBoard") LocalContainerEntityManagerFactoryBean factoryBean) { + + return new JpaTransactionManager(factoryBean.getObject()); + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/AccountMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/AccountMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..cfa7e4601df43d1ae2d705a8f323575565ae3ced --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/AccountMySqlModel.java" @@ -0,0 +1,159 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.AuditStatus; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +/** + * @author Zane + */ +@Entity(name = "account") +public class AccountMySqlModel extends AbstractBaseMySqlModel { + + /** + * 鎵嬫満鍙 + */ + private String phoneNumber; + /** + * 瀵嗙爜 + */ + private String password; + /** + * 鐩 + */ + private String salt; + /** + * 鏄电О + */ + private String nickname; + /** + * 閭 + */ + private String email; + /** + * 鏄惁鏄秴绾х鐞嗗憳;瓒呯骇绠$悊鍛橀氬父鏄涓涓垱寤哄苟鍒濆鍖栫郴缁熺殑閭d釜浜 + */ + private Boolean superAdminRole; + /** + * 鏄惁鏄鐞嗗憳;绠$悊鍛樻湁鏇村鏉冮檺锛屾瘮濡傝缃 member 鏄惁瀵瑰鍙銆 + */ + private Boolean adminRole; + /** + * 瀹℃牳鐘舵 + */ + @Enumerated(EnumType.STRING) + private AuditStatus auditStatus; + /** + * 瀹℃牳鎰忚 + */ + private String auditComment; + + /** + * 鏄惁鍙敤 + */ + private Boolean enable; + + + //region getter/setter + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Boolean getSuperAdminRole() { + return superAdminRole; + } + + public void setSuperAdminRole(Boolean superAdminRole) { + this.superAdminRole = superAdminRole; + } + + public Boolean getAdminRole() { + return adminRole; + } + + public void setAdminRole(Boolean adminRole) { + this.adminRole = adminRole; + } + + public AuditStatus getAuditStatus() { + return auditStatus; + } + + public void setAuditStatus(AuditStatus auditStatus) { + this.auditStatus = auditStatus; + } + + public String getAuditComment() { + return auditComment; + } + + public void setAuditComment(String auditComment) { + this.auditComment = auditComment; + } + + public Boolean getEnable() { + return enable; + } + + public void setEnable(Boolean enable) { + this.enable = enable; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/BlacklistMysqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/BlacklistMysqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..2fa905a074978010071d8573047e6b4362882768 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/BlacklistMysqlModel.java" @@ -0,0 +1,70 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; + +import javax.persistence.Column; +import javax.persistence.Entity; + +/** + * @author lonnie + */ +@Entity(name = "blacklist") +public class BlacklistMysqlModel extends AbstractBaseMySqlModel { + + /** + * 褰撳墠鎴愬憳id + */ + @Column(name = "member_id") + private String memberId; + + /** + * 鍔犲叆榛戝悕鍗曠殑鎴愬憳id + */ + @Column(name = "blacklist_member_id") + private String blacklistMemberId; + + /** + * 澶囨敞 + */ + private String remark; + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getBlacklistMemberId() { + return blacklistMemberId; + } + + public void setBlacklistMemberId(String blacklistMemberId) { + this.blacklistMemberId = blacklistMemberId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/DataOutputInfoMysqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/DataOutputInfoMysqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..fb84af4ac2ea6a3d2bdeeecc6c14089d5e573d77 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/DataOutputInfoMysqlModel.java" @@ -0,0 +1,185 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; + +import javax.persistence.Entity; + +/** + * @author aaron.li + **/ +@Entity(name = "data_output_info") +public class DataOutputInfoMysqlModel extends AbstractBaseMySqlModel { + + /** + * 浠诲姟 Id + */ + private String jobId; + /** + * 瀛愪换鍔 Id + */ + private String taskId; + /** + * 缁勪欢鍚嶇О + */ + private String componentName; + /** + * 瑙掕壊 + */ + private String role; + /** + * 鎴愬憳id + */ + private String memberId; + /** + * 琛ㄧ┖闂 + */ + private String tableNamespace; + /** + * 琛ㄥ悕 + */ + private String tableName; + /** + * 鍒涘缓鏃舵暟閲 + */ + private Integer tableCreateCount; + /** + * 褰撳墠鏁伴噺 + */ + private Integer tableCurrentCount; + /** + * 鍒嗗尯鏁 + */ + private Integer partition; + /** + * 妯″瀷id + */ + private String partyModelId; + /** + * 妯″瀷鐗堟湰 + */ + private String modelVersion; + /** + * 鎻忚堪 + */ + private String desc; + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getComponentName() { + return componentName; + } + + public void setComponentName(String componentName) { + this.componentName = componentName; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getTableNamespace() { + return tableNamespace; + } + + public void setTableNamespace(String tableNamespace) { + this.tableNamespace = tableNamespace; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public Integer getTableCreateCount() { + return tableCreateCount; + } + + public void setTableCreateCount(Integer tableCreateCount) { + this.tableCreateCount = tableCreateCount; + } + + public Integer getTableCurrentCount() { + return tableCurrentCount; + } + + public void setTableCurrentCount(Integer tableCurrentCount) { + this.tableCurrentCount = tableCurrentCount; + } + + public Integer getPartition() { + return partition; + } + + public void setPartition(Integer partition) { + this.partition = partition; + } + + public String getPartyModelId() { + return partyModelId; + } + + public void setPartyModelId(String partyModelId) { + this.partyModelId = partyModelId; + } + + public String getModelVersion() { + return modelVersion; + } + + public void setModelVersion(String modelVersion) { + this.modelVersion = modelVersion; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/DataSourceMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/DataSourceMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..0d77b1427e53bb290326f41b2b9365cff312580e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/DataSourceMySqlModel.java" @@ -0,0 +1,123 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.DatabaseType; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +/** + * 鏁版嵁鏉ユ簮锛岀洰鐨勶細浠庢寚瀹氱殑鏁版嵁搴撲腑璇诲彇鏁版嵁锛屽苟涓婁紶鍒癱k浣滀负鍘熷鐨勬暟鎹泦 + * @author Johnny.lin + */ +@Entity(name = "data_source") +public class DataSourceMySqlModel extends AbstractBaseMySqlModel { + /** + * 鏁版嵁婧愬悕绉 + */ + private String name; + + /** + * 鏁版嵁搴撶被鍨嬶紝鏋氫妇(hive銆乮mpala銆乵ysql) + */ + @Enumerated(EnumType.STRING) + private DatabaseType databaseType; + + /** + * 鏁版嵁搴揑P鍦板潃 + */ + private String host; + + /** + * 绔彛 + */ + private Integer port; + + /** + * 瑕佽繛鎺ョ殑鏁版嵁搴撳悕绉 + */ + private String databaseName; + + /** + * 鐢ㄦ埛鍚 + */ + private String userName; + + /** + * 瀵嗙爜 + */ + private String password; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public DatabaseType getDatabaseType() { + return databaseType; + } + + public void setDatabaseType(DatabaseType databaseType) { + this.databaseType = databaseType; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public Integer getPort() { + return port; + } + + public void setPort(Integer port) { + this.port = port; + } + + public String getDatabaseName() { + return databaseName; + } + + public void setDatabaseName(String databaseName) { + this.databaseName = databaseName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/GlobalConfigMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/GlobalConfigMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..f3723c8b56bf31bd5000a550faad3cd40cae87f0 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/GlobalConfigMySqlModel.java" @@ -0,0 +1,82 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; + +import javax.persistence.Column; +import javax.persistence.Entity; + +/** + * @author Zane + */ +@Entity(name = "global_config") +public class GlobalConfigMySqlModel extends AbstractBaseMySqlModel { + /** + * 閰嶇疆椤规墍鍦ㄧ殑缁 + */ + @Column(name = "`group`") + private String group; + /** + * 閰嶇疆椤瑰悕绉 + */ + private String name; + /** + * 閰嶇疆椤圭殑鍊 + */ + private String value; + /** + * 閰嶇疆椤圭殑瑙i噴璇存槑 + */ + private String comment; + + // region getter/setter + + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + // endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/MessageMysqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/MessageMysqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..5ba04c882aaeb838d5af0fb98e87140c4dec18fc --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/MessageMysqlModel.java" @@ -0,0 +1,100 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.MessageLevel; +import com.welab.wefe.common.enums.ProducerType; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +/** + * @author Zane + */ +@Entity(name = "message") +public class MessageMysqlModel extends AbstractBaseMySqlModel { + + /** + * 娑堟伅鐢熶骇鑰;鏋氫妇锛坆oard/gateway锛 + */ + @Enumerated(EnumType.STRING) + private ProducerType producer; + /** + * 娑堟伅绾у埆;鏋氫妇锛坕nfo/success/error/warning锛 + */ + @Enumerated(EnumType.STRING) + private MessageLevel level; + /** + * 鏍囬 + */ + private String title; + /** + * 鍐呭 + */ + private String content; + /** + * 鏈 + */ + private Boolean unread; + + //region getter/setter + + public ProducerType getProducer() { + return producer; + } + + public void setProducer(ProducerType producer) { + this.producer = producer; + } + + public MessageLevel getLevel() { + return level; + } + + public void setLevel(MessageLevel level) { + this.level = level; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Boolean getUnread() { + return unread; + } + + public void setUnread(Boolean unread) { + this.unread = unread; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/OperationLogMysqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/OperationLogMysqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..74453295daf6f5396e0106fd8a67ed0687b6ebc5 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/OperationLogMysqlModel.java" @@ -0,0 +1,172 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity; + +import com.welab.wefe.board.service.database.entity.base.AbstractMySqlModel; + +import javax.persistence.Entity; +import java.util.Date; + +/** + * @author eval + **/ +@Entity(name = "operator_log") +public class OperationLogMysqlModel extends AbstractMySqlModel { + + /** + * 璇锋眰鎺ュ彛 + */ + private String logInterface; + + /** + * 璇锋眰鎺ュ彛鍚嶇О + */ + private String interfaceName; + + /** + * 璇锋眰IP + */ + private String requestIp; + + /** + * 鎿嶄綔浜哄憳缂栧彿 + */ + private String operatorId; + + /** + * 鎿嶄綔浜哄憳鎵嬫満鍙 + */ + private String operatorPhone; + + /** + * 璇锋眰token + */ + private String token; + + /** + * 鎿嶄綔琛屼负 + */ + private String logAction; + + /** + * 璇锋眰缁撴灉缂栫爜 + */ + private int resultCode; + + /** + * 璇锋眰缁撴灉 + */ + private String resultMessage; + + /** + * 璇锋眰鏃堕棿 + */ + private Date requestTime; + + /** + * 鑰楁椂 + */ + private long spend; + + public String getLogInterface() { + return logInterface; + } + + public void setLogInterface(String logInterface) { + this.logInterface = logInterface; + } + + public String getInterfaceName() { + return interfaceName; + } + + public void setInterfaceName(String interfaceName) { + this.interfaceName = interfaceName; + } + + public String getRequestIp() { + return requestIp; + } + + public void setRequestIp(String requestIp) { + this.requestIp = requestIp; + } + + public String getOperatorId() { + return operatorId; + } + + public void setOperatorId(String operatorId) { + this.operatorId = operatorId; + } + + public String getOperatorPhone() { + return operatorPhone; + } + + public void setOperatorPhone(String operatorPhone) { + this.operatorPhone = operatorPhone; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public String getLogAction() { + return logAction; + } + + public void setLogAction(String logAction) { + this.logAction = logAction; + } + + public int getResultCode() { + return resultCode; + } + + public void setResultCode(int resultCode) { + this.resultCode = resultCode; + } + + public String getResultMessage() { + return resultMessage; + } + + public void setResultMessage(String resultMessage) { + this.resultMessage = resultMessage; + } + + public Date getRequestTime() { + return requestTime; + } + + public void setRequestTime(Date requestTime) { + this.requestTime = requestTime; + } + + public long getSpend() { + return spend; + } + + public void setSpend(long spend) { + this.spend = spend; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/OutputModelMysqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/OutputModelMysqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..97274b6bfeea68216bfa9aa0f9c8e2189ca16adb --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/OutputModelMysqlModel.java" @@ -0,0 +1,151 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; + +import javax.persistence.Entity; + +/** + * 杈撳嚭妯″瀷 + * + * @author aaron.li + **/ +@Entity(name = "output_model") +public class OutputModelMysqlModel extends AbstractBaseMySqlModel { + + /** + * 浠诲姟ID + */ + private String jobId; + /** + * 瀛愪换鍔D + */ + private String taskId; + /** + * 缁勪欢鍚嶇О + */ + private String componentName; + /** + * 瑙掕壊 + */ + private String role; + /** + * 鎴愬憳id + */ + private String memberId; + /** + * 妯″瀷id + */ + private String memberModelId; + /** + * 妯″瀷鐗堟湰 + */ + private String modelVersion; + /** + * 妯″瀷key + */ + private String componentModelKey; + /** + * 妯″瀷淇℃伅 + */ + private String modelMeta; + /** + * 妯″瀷鍙傛暟 + */ + private String modelParam; + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getComponentName() { + return componentName; + } + + public void setComponentName(String componentName) { + this.componentName = componentName; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getMemberModelId() { + return memberModelId; + } + + public void setMemberModelId(String memberModelId) { + this.memberModelId = memberModelId; + } + + public String getModelVersion() { + return modelVersion; + } + + public void setModelVersion(String modelVersion) { + this.modelVersion = modelVersion; + } + + public String getComponentModelKey() { + return componentModelKey; + } + + public void setComponentModelKey(String componentModelKey) { + this.componentModelKey = componentModelKey; + } + + public String getModelMeta() { + return modelMeta; + } + + public void setModelMeta(String modelMeta) { + this.modelMeta = modelMeta; + } + + public String getModelParam() { + return modelParam; + } + + public void setModelParam(String modelParam) { + this.modelParam = modelParam; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/TrackingMetricMysqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/TrackingMetricMysqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..7ac0e06e758b30ac39b3f65fd0a1de7625276d5f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/TrackingMetricMysqlModel.java" @@ -0,0 +1,196 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity; + +import com.welab.wefe.board.service.database.entity.base.AbstractMySqlModel; + +import javax.persistence.Entity; + +/** + * 璺熻釜鎸囨爣 + * + * @author aaron.li + **/ +@Entity(name = "tracking_metric") +public class TrackingMetricMysqlModel extends AbstractMySqlModel { + + /** + * 浠诲姟 Id + */ + private String jobId; + /** + * 瀛愪换鍔 Id + */ + private String taskId; + /** + * 缁勪欢鍚嶇О + */ + private String componentName; + /** + * 瑙掕壊 + */ + private String role; + /** + * 鎴愬憳id + */ + private String memberId; + /** + * metric鍛藉悕绌洪棿 + */ + private String metricNamespace; + /** + * metric鍚嶇О + */ + private String metricName; + /** + * metric绫诲瀷 + */ + private String metricType; + /** + * 鏇茬嚎鍚嶇О + */ + private String curveName; + /** + * 妯潗鏍囧悕绉 + */ + private String abscissaName; + /** + * 绾靛潗鏍囧悕绉 + */ + private String ordinateName; + private String pairType; + /** + * key + */ + private String key; + /** + * 鍊 + */ + private String value; + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getComponentName() { + return componentName; + } + + public void setComponentName(String componentName) { + this.componentName = componentName; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getMetricNamespace() { + return metricNamespace; + } + + public void setMetricNamespace(String metricNamespace) { + this.metricNamespace = metricNamespace; + } + + public String getMetricName() { + return metricName; + } + + public void setMetricName(String metricName) { + this.metricName = metricName; + } + + public String getMetricType() { + return metricType; + } + + public void setMetricType(String metricType) { + this.metricType = metricType; + } + + public String getCurveName() { + return curveName; + } + + public void setCurveName(String curveName) { + this.curveName = curveName; + } + + public String getAbscissaName() { + return abscissaName; + } + + public void setAbscissaName(String abscissaName) { + this.abscissaName = abscissaName; + } + + public String getOrdinateName() { + return ordinateName; + } + + public void setOrdinateName(String ordinateName) { + this.ordinateName = ordinateName; + } + + public String getPairType() { + return pairType; + } + + public void setPairType(String pairType) { + this.pairType = pairType; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/base/AbstractBaseMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/base/AbstractBaseMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..b6fcc17be0b3364ae988c6f4e42aac29360ae882 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/base/AbstractBaseMySqlModel.java" @@ -0,0 +1,95 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.base; + +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.web.CurrentAccount; +import com.welab.wefe.common.web.dto.AbstractApiInput; + +import javax.persistence.MappedSuperclass; +import java.util.Date; + +/** + * mysql 鏁版嵁搴撳疄浣撶殑鎶借薄鐖剁被 + * + * @author Zane + */ +@MappedSuperclass +public abstract class AbstractBaseMySqlModel extends AbstractMySqlModel { + + /** + * 鍒涘缓浜 + */ + private String createdBy; + + /** + * 鏇存柊浜 + */ + private String updatedBy; + + public AbstractBaseMySqlModel() { + setCreatedBy(CurrentAccount.id()); + } + + //region getter/setter + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public void setCreatedBy(AbstractApiInput input) { + String id = getOperatorId(createdBy, input); + setCreatedBy(id); + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + super.setUpdatedTime(new Date()); + } + + public void setUpdatedBy(AbstractApiInput input) { + String id = getOperatorId(updatedBy, input); + setUpdatedBy(id); + } + + public String getOperatorId(AbstractApiInput input) { + return getOperatorId(null, input); + } + + public String getOperatorId(String operatorId, AbstractApiInput input) { + + String result; + if (CacheObjects.isMemberId(operatorId)) { + result = operatorId; + } else if (input.fromGateway()) { + result = input.callerMemberInfo.getMemberId(); + } else { + result = CurrentAccount.id(); + } + return result; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/base/AbstractMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/base/AbstractMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..d478928974d73b9e4b0f36be1987172dd428f38f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/base/AbstractMySqlModel.java" @@ -0,0 +1,77 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.base; + +import javax.persistence.Column; +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; +import java.io.Serializable; +import java.util.Date; +import java.util.UUID; + +/** + * mysql 鏁版嵁搴撳疄浣撶殑鎶借薄鐖剁被 + * + * @author Zane + */ +@MappedSuperclass +public abstract class AbstractMySqlModel implements Serializable { + + /** + * 鍏ㄥ眬鍞竴鏍囪瘑 + */ + @Id + @Column(name = "id", updatable = false) + private String id = UUID.randomUUID().toString().replaceAll("-", ""); + /** + * 鍒涘缓鏃堕棿 + */ + private Date createdTime = new Date(); + /** + * 鏇存柊鏃堕棿 + */ + private Date updatedTime; + + //region getter/setter + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/chat/ChatLastAccountMysqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/chat/ChatLastAccountMysqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..c8f5762bdece59ca27659b3cb9641313d3786a23 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/chat/ChatLastAccountMysqlModel.java" @@ -0,0 +1,130 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.chat; + +import com.welab.wefe.board.service.database.entity.base.AbstractMySqlModel; + +import javax.persistence.Entity; + +/** + * Recent chat account + * + * @author aaron.li + **/ +@Entity(name = "chat_last_account") +public class ChatLastAccountMysqlModel extends AbstractMySqlModel { + /** + * Account ID + */ + private String accountId; + /** + * Account name + */ + private String accountName; + + /** + * Member ID + */ + private String memberId; + /** + * Member name + */ + private String memberName; + + /** + * Contact member ID + */ + private String liaisonMemberId; + /** + * Contact member name + */ + private String liaisonMemberName; + + /** + * Contact account ID + */ + private String liaisonAccountId; + /** + * Contact account name + */ + private String liaisonAccountName; + + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + + public String getAccountName() { + return accountName; + } + + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getMemberName() { + return memberName; + } + + public void setMemberName(String memberName) { + this.memberName = memberName; + } + + public String getLiaisonMemberId() { + return liaisonMemberId; + } + + public void setLiaisonMemberId(String liaisonMemberId) { + this.liaisonMemberId = liaisonMemberId; + } + + public String getLiaisonMemberName() { + return liaisonMemberName; + } + + public void setLiaisonMemberName(String liaisonMemberName) { + this.liaisonMemberName = liaisonMemberName; + } + + public String getLiaisonAccountId() { + return liaisonAccountId; + } + + public void setLiaisonAccountId(String liaisonAccountId) { + this.liaisonAccountId = liaisonAccountId; + } + + public String getLiaisonAccountName() { + return liaisonAccountName; + } + + public void setLiaisonAccountName(String liaisonAccountName) { + this.liaisonAccountName = liaisonAccountName; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/chat/ChatUnreadMessageMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/chat/ChatUnreadMessageMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..e33fa7bbe19d5939460bfd4f3124be9ce5e026af --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/chat/ChatUnreadMessageMySqlModel.java" @@ -0,0 +1,94 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.chat; + +import com.welab.wefe.board.service.database.entity.base.AbstractMySqlModel; + +import javax.persistence.Entity; + +/** + * Member chat unread messages + * + * @author Johnny.lin + */ +@Entity(name = "chat_unread_message") +public class ChatUnreadMessageMySqlModel extends AbstractMySqlModel { + /** + * Sender account ID + */ + private String fromAccountId; + + /** + * Sender member ID + */ + private String fromMemberId; + + /** + * Receiver member ID + */ + private String toMemberId; + + /** + * Receiver account ID + */ + private String toAccountId; + + /** + * Number of unread messages + */ + private Integer num; + + public String getFromAccountId() { + return fromAccountId; + } + + public void setFromAccountId(String fromAccountId) { + this.fromAccountId = fromAccountId; + } + + public String getFromMemberId() { + return fromMemberId; + } + + public void setFromMemberId(String fromMemberId) { + this.fromMemberId = fromMemberId; + } + + public String getToMemberId() { + return toMemberId; + } + + public void setToMemberId(String toMemberId) { + this.toMemberId = toMemberId; + } + + public String getToAccountId() { + return toAccountId; + } + + public void setToAccountId(String toAccountId) { + this.toAccountId = toAccountId; + } + + public Integer getNum() { + return num; + } + + public void setNum(Integer num) { + this.num = num; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/chat/MemberChatMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/chat/MemberChatMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..1d8c690ab518be623896b630767e4c8a26dd2ec8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/chat/MemberChatMySqlModel.java" @@ -0,0 +1,177 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.chat; + +import com.welab.wefe.board.service.database.entity.base.AbstractMySqlModel; + +import javax.persistence.Entity; + +/** + * Member chat details + * + * @author Johnny.lin + */ +@Entity(name = "member_chat") +public class MemberChatMySqlModel extends AbstractMySqlModel { + /** + * Sender account ID + */ + private String fromAccountId; + /** + * Sender account name + */ + private String fromAccountName; + + /** + * Sender member ID + */ + private String fromMemberId; + /** + * Sender member name + */ + private String fromMemberName; + + /** + * Receiver member ID + */ + private String toMemberId; + /** + * Recipient member name + */ + private String toMemberName; + /** + * Receiver account ID + */ + private String toAccountId; + /** + * Receiver account name + */ + private String toAccountName; + + /** + * Chat content + */ + private String content; + /** + * Direction: receive: 0 or send: 1 + */ + private Integer direction; + /** + * Status: (0: read, 1: unread, 2: sent successfully, 3: sent failed, 4: read by the other party) + */ + private Integer status; + /** + * Message ID + */ + private String messageId; + + public String getFromAccountId() { + return fromAccountId; + } + + public void setFromAccountId(String fromAccountId) { + this.fromAccountId = fromAccountId; + } + + public String getFromMemberId() { + return fromMemberId; + } + + public void setFromMemberId(String fromMemberId) { + this.fromMemberId = fromMemberId; + } + + public String getToMemberId() { + return toMemberId; + } + + public void setToMemberId(String toMemberId) { + this.toMemberId = toMemberId; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getToAccountId() { + return toAccountId; + } + + public void setToAccountId(String toAccountId) { + this.toAccountId = toAccountId; + } + + public Integer getDirection() { + return direction; + } + + public void setDirection(Integer direction) { + this.direction = direction; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getMessageId() { + return messageId; + } + + public void setMessageId(String messageId) { + this.messageId = messageId; + } + + public String getFromAccountName() { + return fromAccountName; + } + + public void setFromAccountName(String fromAccountName) { + this.fromAccountName = fromAccountName; + } + + public String getFromMemberName() { + return fromMemberName; + } + + public void setFromMemberName(String fromMemberName) { + this.fromMemberName = fromMemberName; + } + + public String getToMemberName() { + return toMemberName; + } + + public void setToMemberName(String toMemberName) { + this.toMemberName = toMemberName; + } + + public String getToAccountName() { + return toAccountName; + } + + public void setToAccountName(String toAccountName) { + this.toAccountName = toAccountName; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/chat/MessageQueueMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/chat/MessageQueueMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..5831c16cb137adf64aaee277dff005cbb4000c08 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/chat/MessageQueueMySqlModel.java" @@ -0,0 +1,85 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.chat; + +import com.welab.wefe.board.service.database.entity.base.AbstractMySqlModel; +import com.welab.wefe.common.enums.GatewayActionType; +import com.welab.wefe.common.enums.ProducerType; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +/** + * Chat message queue list + * + * @author Johnny.lin + */ +@Entity(name = "message_queue") +public class MessageQueueMySqlModel extends AbstractMySqlModel { + /** + * Message producer; Enumeration (board / gateway) + */ + @Enumerated(EnumType.STRING) + private ProducerType producer; + /** + * Priority; Those with higher priority will be consumed first + */ + private Integer priority; + /** + * action name + */ + @Enumerated(EnumType.STRING) + private GatewayActionType action; + + /** + * action params + */ + private String params; + + public ProducerType getProducer() { + return producer; + } + + public void setProducer(ProducerType producer) { + this.producer = producer; + } + + public Integer getPriority() { + return priority; + } + + public void setPriority(Integer priority) { + this.priority = priority; + } + + public GatewayActionType getAction() { + return action; + } + + public void setAction(GatewayActionType action) { + this.action = action; + } + + public String getParams() { + return params; + } + + public void setParams(String params) { + this.params = params; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/data_set/DataSetColumnMysqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/data_set/DataSetColumnMysqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..80ba160cc176f2755f667e4b5bfa8c9afa2dd713 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/data_set/DataSetColumnMysqlModel.java" @@ -0,0 +1,131 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.data_set; + +import com.alibaba.fastjson.JSONObject; +import com.vladmihalcea.hibernate.type.json.JsonStringType; +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.ColumnDataType; +import org.hibernate.annotations.Type; +import org.hibernate.annotations.TypeDef; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +/** + * @author Zane + */ +@Entity(name = "data_set_column") +@TypeDef(name = "json", typeClass = JsonStringType.class) +public class DataSetColumnMysqlModel extends AbstractBaseMySqlModel { + + /** + * 鏁版嵁闆咺d + */ + private String dataSetId; + /** + * 瀛楁搴忓彿 + */ + @Column(name = "`index`") + private Integer index; + /** + * 瀛楁鍚嶇О + */ + private String name; + /** + * 鏁版嵁绫诲瀷 + */ + @Enumerated(EnumType.STRING) + private ColumnDataType dataType; + /** + * 娉ㄩ噴 + */ + private String comment; + /** + * 绌哄兼暟鎹鏁 + */ + private Long emptyRows; + /** + * 鏁板煎垎甯 + */ + @Type(type = "json") + @Column(columnDefinition = "json") + private JSONObject valueDistribution; + + //region getter/setter + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public Integer getIndex() { + return index; + } + + public void setIndex(Integer index) { + this.index = index; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public ColumnDataType getDataType() { + return dataType; + } + + public void setDataType(ColumnDataType dataType) { + this.dataType = dataType; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public Long getEmptyRows() { + return emptyRows; + } + + public void setEmptyRows(Long emptyRows) { + this.emptyRows = emptyRows; + } + + public JSONObject getValueDistribution() { + return valueDistribution; + } + + public void setValueDistribution(JSONObject valueDistribution) { + this.valueDistribution = valueDistribution; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/data_set/DataSetMysqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/data_set/DataSetMysqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..c392db0e39167af74774d3e0c991f53d5f9ea796 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/data_set/DataSetMysqlModel.java" @@ -0,0 +1,356 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.data_set; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.DataSetPublicLevel; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +/** + * @author Zane + */ +@Entity(name = "data_set") +public class DataSetMysqlModel extends AbstractBaseMySqlModel { + + /** + * 鏁版嵁闆嗗悕绉 + */ + private String name; + /** + * 鏍囩 + */ + private String tags; + /** + * 鎻忚堪 + */ + private String description; + /** + * 瀛樺偍绫诲瀷 + */ + private String storageType; + /** + * 鍛藉悕绌洪棿 + */ + private String namespace; + /** + * 琛ㄥ悕 + */ + private String tableName; + /** + * 鏁版嵁琛屾暟 + */ + private Long rowCount; + /** + * 涓婚敭瀛楁 + */ + private String primaryKeyColumn; + /** + * 鏁版嵁闆嗗垪鏁 + */ + private Integer columnCount; + /** + * 鏁版嵁闆嗗瓧娈靛垪琛 + */ + private String columnNameList; + /** + * 鐗瑰緛鏁伴噺 + */ + private Integer featureCount; + /** + * 鐗瑰緛鍒楄〃 + */ + private String featureNameList; + /** + * 鏄惁鍖呭惈 Y 鍊 + */ + @Column(name = "contains_y") + private Boolean containsY; + /** + * y鍒楃殑鏁伴噺 + */ + private Integer yCount; + /** + * y鍒楀悕绉板垪琛 + */ + private String yNameList; + /** + * 鏁版嵁闆嗙殑鍙鎬 + */ + @Enumerated(EnumType.STRING) + private DataSetPublicLevel publicLevel; + /** + * 鍙鎴愬憳鍒楄〃锛屽彧鏈夊湪鍒楄〃涓殑鑱旈偊鎴愬憳鎵嶅彲浠ョ湅鍒拌鏁版嵁闆嗙殑鍩烘湰淇℃伅 + */ + private String publicMemberList; + /** + * 浣跨敤娆℃暟 + */ + private Integer usageCountInJob = 0; + /** + * 浣跨敤娆℃暟 + */ + private Integer usageCountInFlow = 0; + /** + * 浣跨敤娆℃暟 + */ + private Integer usageCountInProject = 0; + /** + * 鏉ユ簮绫诲瀷锛屾灇涓撅紙鍘熷銆佸榻愩佸垎绠憋級 + */ + @Enumerated(EnumType.STRING) + private ComponentType sourceType; + /** + * 鏉ユ簮娴佺▼id + */ + private String sourceFlowId; + /** + * 鏉ユ簮浠诲姟id + */ + private String sourceJobId; + /** + * 鏉ユ簮瀛愪换鍔d + */ + private String sourceTaskId; + + /** + * 姝d緥鏍锋湰鏁伴噺 + */ + private Long yPositiveExampleCount = 0L; + + /** + * 姝d緥鏍锋湰姣斾緥 + */ + private Double yPositiveExampleRatio = 0D; + + + //region getter/setter + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTags() { + return tags; + } + + public void setTags(String tags) { + this.tags = tags; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getStorageType() { + return storageType; + } + + public void setStorageType(String storageType) { + this.storageType = storageType; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public Long getRowCount() { + return rowCount; + } + + public void setRowCount(Long rowCount) { + this.rowCount = rowCount; + } + + public String getPrimaryKeyColumn() { + return primaryKeyColumn; + } + + public void setPrimaryKeyColumn(String primaryKeyColumn) { + this.primaryKeyColumn = primaryKeyColumn; + } + + public Integer getColumnCount() { + return columnCount; + } + + public void setColumnCount(Integer columnCount) { + this.columnCount = columnCount; + } + + public String getColumnNameList() { + return columnNameList; + } + + public void setColumnNameList(String columnNameList) { + this.columnNameList = columnNameList; + } + + public Integer getFeatureCount() { + return featureCount; + } + + public void setFeatureCount(Integer featureCount) { + this.featureCount = featureCount; + } + + public String getFeatureNameList() { + return featureNameList; + } + + public void setFeatureNameList(String featureNameList) { + this.featureNameList = featureNameList; + } + + public Boolean getContainsY() { + return containsY; + } + + public void setContainsY(Boolean containsY) { + this.containsY = containsY; + } + + public Integer getyCount() { + return yCount; + } + + public void setyCount(Integer yCount) { + this.yCount = yCount; + } + + public String getyNameList() { + return yNameList; + } + + public void setyNameList(String yNameList) { + this.yNameList = yNameList; + } + + public DataSetPublicLevel getPublicLevel() { + return publicLevel; + } + + public void setPublicLevel(DataSetPublicLevel publicLevel) { + this.publicLevel = publicLevel; + } + + public String getPublicMemberList() { + return publicMemberList; + } + + public void setPublicMemberList(String publicMemberList) { + this.publicMemberList = publicMemberList; + } + + public Integer getUsageCountInJob() { + return usageCountInJob; + } + + public void setUsageCountInJob(Integer usageCountInJob) { + this.usageCountInJob = usageCountInJob; + } + + public Integer getUsageCountInFlow() { + return usageCountInFlow; + } + + public void setUsageCountInFlow(Integer usageCountInFlow) { + this.usageCountInFlow = usageCountInFlow; + } + + public Integer getUsageCountInProject() { + return usageCountInProject; + } + + public void setUsageCountInProject(Integer usageCountInProject) { + this.usageCountInProject = usageCountInProject; + } + + public ComponentType getSourceType() { + return sourceType; + } + + public void setSourceType(ComponentType sourceType) { + this.sourceType = sourceType; + } + + public String getSourceFlowId() { + return sourceFlowId; + } + + public void setSourceFlowId(String sourceFlowId) { + this.sourceFlowId = sourceFlowId; + } + + public String getSourceJobId() { + return sourceJobId; + } + + public void setSourceJobId(String sourceJobId) { + this.sourceJobId = sourceJobId; + } + + public String getSourceTaskId() { + return sourceTaskId; + } + + public void setSourceTaskId(String sourceTaskId) { + this.sourceTaskId = sourceTaskId; + } + + public Long getyPositiveExampleCount() { + return yPositiveExampleCount; + } + + public void setyPositiveExampleCount(Long yPositiveExampleCount) { + this.yPositiveExampleCount = yPositiveExampleCount; + } + + public Double getyPositiveExampleRatio() { + return yPositiveExampleRatio; + } + + public void setyPositiveExampleRatio(Double yPositiveExampleRatio) { + this.yPositiveExampleRatio = yPositiveExampleRatio; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/data_set/DataSetTaskMysqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/data_set/DataSetTaskMysqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..f8a08dbc11934c0c75fd9798ad7112c0c4089e33 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/data_set/DataSetTaskMysqlModel.java" @@ -0,0 +1,135 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.data_set; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; + +import javax.persistence.Entity; + +/** + * @author lonnie + */ +@Entity(name = "data_set_task") +public class DataSetTaskMysqlModel extends AbstractBaseMySqlModel { + + /** + * 鏁版嵁闆嗗悕 + */ + private String dataSetName; + + /** + * 鏁版嵁闆唅d + */ + private String dataSetId; + + /** + * 鎬绘暟鎹鏁 + */ + private long totalRowCount = 0; + /** + * 宸插啓鍏ユ暟鎹鏁 + */ + private long addedRowCount = 0; + + /** + * 浠诲姟杩涘害鐧惧垎姣 + */ + private int progress; + + /** + * 棰勮鍓╀綑鑰楁椂 + */ + private long estimateTime; + + /** + * 涓婚敭閲嶅鏉℃暟 + */ + private long repeatIdRowCount; + /** + * 閿欒娑堟伅 + */ + private String errorMessage; + + // region getter/setter + + + public String getDataSetName() { + return dataSetName; + } + + public void setDataSetName(String dataSetName) { + this.dataSetName = dataSetName; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public long getTotalRowCount() { + return totalRowCount; + } + + public void setTotalRowCount(long totalRowCount) { + this.totalRowCount = totalRowCount; + } + + public long getAddedRowCount() { + return addedRowCount; + } + + public void setAddedRowCount(long addedRowCount) { + this.addedRowCount = addedRowCount; + } + + public int getProgress() { + return progress; + } + + public void setProgress(int progress) { + this.progress = progress; + } + + public long getEstimateTime() { + return estimateTime; + } + + public void setEstimateTime(long estimateTime) { + this.estimateTime = estimateTime; + } + + public long getRepeatIdRowCount() { + return repeatIdRowCount; + } + + public void setRepeatIdRowCount(long repeatIdRowCount) { + this.repeatIdRowCount = repeatIdRowCount; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + // endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/flow/FlowActionLogMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/flow/FlowActionLogMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..2773fd29c5f9e353801ed589a3afaf7e8fe955c7 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/flow/FlowActionLogMySqlModel.java" @@ -0,0 +1,121 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.flow; + +import com.welab.wefe.board.service.database.entity.base.AbstractMySqlModel; +import com.welab.wefe.common.enums.GatewayActionType; +import com.welab.wefe.common.enums.ProducerType; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +/** + * @author Seven + */ +@Entity(name = "flow_action_log") +public class FlowActionLogMySqlModel extends AbstractMySqlModel { + /** + * 娑堟伅鐢熶骇鑰;鏋氫妇锛坆oard/gateway锛 + */ + @Enumerated(EnumType.STRING) + private ProducerType producer; + /** + * 浼樺厛绾 + */ + private Integer priority; + /** + * 鍔ㄤ綔鍚嶇О + */ + @Enumerated(EnumType.STRING) + private GatewayActionType action; + /** + * 鍔ㄤ綔鍙傛暟 + */ + private String params; + /** + * 鎵ц鐘舵;鏋氫妇锛坰uccess/fail锛 + */ + private String status; + /** + * 澶囨敞淇℃伅 + */ + private String remark; + /** + * 娑堣垂鑰卛p + */ + private String consumerIp; + + //region getter/setter + + public ProducerType getProducer() { + return producer; + } + + public void setProducer(ProducerType producer) { + this.producer = producer; + } + + public Integer getPriority() { + return priority; + } + + public void setPriority(Integer priority) { + this.priority = priority; + } + + public GatewayActionType getAction() { + return action; + } + + public void setAction(GatewayActionType action) { + this.action = action; + } + + public String getParams() { + return params; + } + + public void setParams(String params) { + this.params = params; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getConsumerIp() { + return consumerIp; + } + + public void setConsumerIp(String consumerIp) { + this.consumerIp = consumerIp; + } +//endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/flow/FlowActionQueueMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/flow/FlowActionQueueMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..97543517f73ac0df32d14add0ddd5973bad49d09 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/flow/FlowActionQueueMySqlModel.java" @@ -0,0 +1,88 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.flow; + +import com.welab.wefe.board.service.database.entity.base.AbstractMySqlModel; +import com.welab.wefe.common.enums.FlowActionType; +import com.welab.wefe.common.enums.ProducerType; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +/** + * @author Seven + */ +@Entity(name = "flow_action_queue") +public class FlowActionQueueMySqlModel extends AbstractMySqlModel { + /** + * 娑堟伅鐢熶骇鑰;鏋氫妇锛坆oard/gateway锛 + */ + @Enumerated(EnumType.STRING) + private ProducerType producer; + /** + * 浼樺厛绾;浼樺厛绾уぇ鐨勪細琚厛娑堣垂 + */ + private Integer priority; + /** + * 鍔ㄤ綔鍚嶇О + */ + @Enumerated(EnumType.STRING) + private FlowActionType action; + /** + * 鍔ㄤ綔鍙傛暟 + */ + private String params; + + + //region getter/setter + + public ProducerType getProducer() { + return producer; + } + + public void setProducer(ProducerType producer) { + this.producer = producer; + } + + public Integer getPriority() { + return priority; + } + + public void setPriority(Integer priority) { + this.priority = priority; + } + + public FlowActionType getAction() { + return action; + } + + public void setAction(FlowActionType action) { + this.action = action; + } + + public String getParams() { + return params; + } + + public void setParams(String params) { + this.params = params; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/flow/FlowTemplateMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/flow/FlowTemplateMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..a6117ab1df6f654a751927b340f150352bfc4d3d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/flow/FlowTemplateMySqlModel.java" @@ -0,0 +1,98 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.flow; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.FederatedLearningType; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +/** + * @author zane.luo + */ +@Entity(name = "project_flow_template") +public class FlowTemplateMySqlModel extends AbstractBaseMySqlModel { + + private static final long serialVersionUID = -8452977095072329750L; + + /** + * 妯℃澘鍚嶇О + */ + private String name; + + /** + * 妯℃澘绫诲瀷 + */ + private String enname; + + /** + * 妯℃澘鎻忚堪 + */ + private String description; + /** + * 鐢诲竷涓紪杈戠殑鍥 + */ + private String graph; + + /** + * 妯℃澘涓殑 鑱旈偊绫诲瀷锛堟í鍚/绾靛悜锛 + */ + @Enumerated(EnumType.STRING) + private FederatedLearningType federatedLearningType; + + public String getEnname() { + return enname; + } + + public void setEnname(String enname) { + this.enname = enname; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getGraph() { + return graph; + } + + public void setGraph(String graph) { + this.graph = graph; + } + + public FederatedLearningType getFederatedLearningType() { + return federatedLearningType; + } + + public void setFederatedLearningType(FederatedLearningType federatedLearningType) { + this.federatedLearningType = federatedLearningType; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/JobMemberMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/JobMemberMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..1af60bf619124b495fbb9875705c603b805d961a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/JobMemberMySqlModel.java" @@ -0,0 +1,109 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.job; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.JobMemberRole; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +/** + * @author Zane + */ +@Entity(name = "job_member") +public class JobMemberMySqlModel extends AbstractBaseMySqlModel { + /** + * 椤圭洰Id + */ + private String projectId; + /** + * 娴佺▼Id + */ + private String flowId; + /** + * 浠诲姟Id + */ + private String jobId; + /** + * 鍦ㄤ换鍔′腑鐨勮鑹 鏋氫妇锛坧romoter/provider/arbiter锛 + */ + @Enumerated(EnumType.STRING) + private JobMemberRole jobRole; + /** + * 鎴愬憳 Id + */ + private String memberId; + /** + * 鏁版嵁闆 Id + */ + private String dataSetId; + + //region getter/setter + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public JobMemberRole getJobRole() { + return jobRole; + } + + public void setJobRole(JobMemberRole jobRole) { + this.jobRole = jobRole; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/JobMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/JobMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..915fab3207bcc4c84d39eca55ef2def70159b5be --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/JobMySqlModel.java" @@ -0,0 +1,248 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.job; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.JobStatus; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import java.util.Date; + +/** + * @author Zane + */ +@Entity(name = "job") +public class JobMySqlModel extends AbstractBaseMySqlModel { + private static final long serialVersionUID = 8933206598650203308L; + /** + * 鑱旈偊浠诲姟绫诲瀷锛堟í鍚/绾靛悜锛 + */ + @Enumerated(EnumType.STRING) + private FederatedLearningType federatedLearningType; + /** + * 椤圭洰ID + */ + private String projectId; + /** + * 娴佺▼ID + */ + private String flowId; + /** + * 浠诲姟ID + */ + private String jobId; + /** + * 鍚嶇О + */ + private String name; + /** + * 鎴戞柟韬唤 鏋氫妇锛坧romoter/provider/arbiter锛 + */ + @Enumerated(EnumType.STRING) + private JobMemberRole myRole; + /** + * 鐘舵 鏋氫妇 + */ + @Enumerated(EnumType.STRING) + private JobStatus status; + /** + * 鐘舵佹洿鏂版椂闂 + */ + private Date statusUpdatedTime; + /** + * 寮濮嬫椂闂 + */ + private Date startTime; + /** + * 缁撴潫鏃堕棿 + */ + private Date finishTime; + /** + * 杩涘害 + */ + private Integer progress; + /** + * 杩涘害鏇存柊鏃堕棿 + */ + private Date progressUpdatedTime; + /** + * 娑堟伅澶囨敞 澶辫触鍘熷洜/澶囨敞 + */ + private String message; + /** + * 鏈夊悜鏃犵幆鍥 + */ + private String graph; + /** + * 鏄惁鍖呭惈寤烘ā缁撴灉 + */ + private boolean hasModelingResult; + /** + * 鏀惰棌/缃《/鏍囪 + */ + private boolean star; + /** + * 澶囨敞 + */ + private String remark; + + //region getter/setter + + + public FederatedLearningType getFederatedLearningType() { + return federatedLearningType; + } + + public void setFederatedLearningType(FederatedLearningType federatedLearningType) { + this.federatedLearningType = federatedLearningType; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public JobMemberRole getMyRole() { + return myRole; + } + + public void setMyRole(JobMemberRole myRole) { + this.myRole = myRole; + } + + public JobStatus getStatus() { + return status; + } + + public void setStatus(JobStatus status) { + this.status = status; + } + + public Date getStatusUpdatedTime() { + return statusUpdatedTime; + } + + public void setStatusUpdatedTime(Date statusUpdatedTime) { + this.statusUpdatedTime = statusUpdatedTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getFinishTime() { + return finishTime; + } + + public void setFinishTime(Date finishTime) { + this.finishTime = finishTime; + } + + public Integer getProgress() { + return progress; + } + + public void setProgress(Integer progress) { + this.progress = progress; + } + + public Date getProgressUpdatedTime() { + return progressUpdatedTime; + } + + public void setProgressUpdatedTime(Date progressUpdatedTime) { + this.progressUpdatedTime = progressUpdatedTime; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getGraph() { + return graph; + } + + public void setGraph(String graph) { + this.graph = graph; + } + + public boolean isHasModelingResult() { + return hasModelingResult; + } + + public void setHasModelingResult(boolean hasModelingResult) { + this.hasModelingResult = hasModelingResult; + } + + public boolean isStar() { + return star; + } + + public void setStar(boolean star) { + this.star = star; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ModelOotRecordMysqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ModelOotRecordMysqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..3a2d4264e969a0f6583bdcbdbeef91efcc92cf3b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ModelOotRecordMysqlModel.java" @@ -0,0 +1,67 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.job; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; + +import javax.persistence.Entity; + +/** + * 妯″瀷鎵撳垎楠岃瘉璁板綍 + * + * @author aaron.li + **/ +@Entity(name = "model_oot_record") +public class ModelOotRecordMysqlModel extends AbstractBaseMySqlModel { + /** + * 娴佺▼ID + */ + private String flowId; + + /** + * 琚玱ot鐨勪綔涓欼D + */ + private String ootJobId; + /** + * 琚玱ot鐨勬ā鍨媔d + */ + private String ootModelFlowNodeId; + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getOotJobId() { + return ootJobId; + } + + public void setOotJobId(String ootJobId) { + this.ootJobId = ootJobId; + } + + public String getOotModelFlowNodeId() { + return ootModelFlowNodeId; + } + + public void setOotModelFlowNodeId(String ootModelFlowNodeId) { + this.ootModelFlowNodeId = ootModelFlowNodeId; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectDataSetMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectDataSetMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..b6de66cf2e81d9d12973ec7fdce3b65a426b93e4 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectDataSetMySqlModel.java" @@ -0,0 +1,169 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.job; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import java.util.Date; + +/** + * @author zane.luo + */ +@Entity(name = "project_data_set") +public class ProjectDataSetMySqlModel extends AbstractBaseMySqlModel { + + private static final long serialVersionUID = 7360644396326460699L; + + /** + * 椤圭洰 Id 椤圭洰涓婚敭 + */ + private String projectId; + /** + * 鎴愬憳id + */ + private String memberId; + /** + * 鎴愬憳瑙掕壊 + *

+ * 鐢变簬瀛樺湪鑷繁鍜岃嚜宸卞缓妯$殑鎯呭喌锛屾墍浠ラ渶瑕佺敤瑙掕壊鍖哄垎鏁版嵁闆嗗綊灞炪 + */ + @Enumerated(EnumType.STRING) + private JobMemberRole memberRole; + /** + * 鏁版嵁闆 Id + */ + private String dataSetId; + /** + * 鐘舵 + */ + @Enumerated(EnumType.STRING) + private AuditStatus auditStatus; + /** + * 瀹℃牳鎰忚 + */ + private String auditComment; + /** + * 鐘舵佹洿鏂版椂闂 + */ + private Date statusUpdatedTime; + /** + * 鏉ユ簮缁勪欢绫诲瀷锛屼负绌鸿〃绀哄師濮嬫暟鎹 + */ + @Enumerated(EnumType.STRING) + private ComponentType sourceType; + /** + * 鏉ユ簮浠诲姟id + */ + private String sourceJobId; + /** + * 鏉ユ簮瀛愪换鍔d + */ + private String sourceTaskId; + + + //region getter/setter + + + public String getAuditComment() { + return auditComment; + } + + public void setAuditComment(String auditComment) { + this.auditComment = auditComment; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public AuditStatus getAuditStatus() { + return auditStatus; + } + + public void setAuditStatus(AuditStatus auditStatus) { + this.auditStatus = auditStatus; + } + + public Date getStatusUpdatedTime() { + return statusUpdatedTime; + } + + public void setStatusUpdatedTime(Date statusUpdatedTime) { + this.statusUpdatedTime = statusUpdatedTime; + } + + public ComponentType getSourceType() { + return sourceType; + } + + public void setSourceType(ComponentType sourceType) { + this.sourceType = sourceType; + } + + public String getSourceJobId() { + return sourceJobId; + } + + public void setSourceJobId(String sourceJobId) { + this.sourceJobId = sourceJobId; + } + + public String getSourceTaskId() { + return sourceTaskId; + } + + public void setSourceTaskId(String sourceTaskId) { + this.sourceTaskId = sourceTaskId; + } + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectFlowMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectFlowMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..02aba4b78a95fe76a02a6444b071b5e420a9ee83 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectFlowMySqlModel.java" @@ -0,0 +1,186 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.job; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.ProjectFlowStatus; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import java.util.Date; + +/** + * @author zane.luo + */ +@Entity(name = "project_flow") +public class ProjectFlowMySqlModel extends AbstractBaseMySqlModel { + + private static final long serialVersionUID = -2604406277609318163L; + + /** + * 鏄惁宸茶鍒犻櫎 + */ + private boolean deleted = false; + /** + * 鑱旈偊浠诲姟绫诲瀷锛堟í鍚/绾靛悜锛 + */ + @Enumerated(EnumType.STRING) + private FederatedLearningType federatedLearningType; + /** + * 椤圭洰ID + */ + private String projectId; + /** + * 娴佺▼ID + */ + private String flowId; + /** + * 娴佺▼鍚嶇О + */ + private String flowName; + /** + * 娴佺▼鎻忚堪 + */ + private String flowDesc; + /** + * 鐢诲竷涓紪杈戠殑鍥 + */ + private String graph; + /** + * 鍒涘缓姝ゆ祦绋嬬殑鎴愬憳鐨処D + */ + private String creatorMemberId; + + /** + * 娴佺▼鐨勭姸鎬 + */ + @Enumerated(EnumType.STRING) + private ProjectFlowStatus flowStatus; + private Date statusUpdatedTime; + private String message; + /** + * 鎴戞柟瑙掕壊 + */ + @Enumerated(EnumType.STRING) + private JobMemberRole myRole; + + + //region getter/setter + + + public boolean getDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + public FederatedLearningType getFederatedLearningType() { + return federatedLearningType; + } + + public void setFederatedLearningType(FederatedLearningType federatedLearningType) { + this.federatedLearningType = federatedLearningType; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getFlowName() { + return flowName; + } + + public void setFlowName(String flowName) { + this.flowName = flowName; + } + + public String getFlowDesc() { + return flowDesc; + } + + public void setFlowDesc(String flowDesc) { + this.flowDesc = flowDesc; + } + + public String getGraph() { + return graph; + } + + public void setGraph(String graph) { + this.graph = graph; + } + + public ProjectFlowStatus getFlowStatus() { + return flowStatus; + } + + public void setFlowStatus(ProjectFlowStatus flowStatus) { + this.flowStatus = flowStatus; + } + + public JobMemberRole getMyRole() { + return myRole; + } + + public void setMyRole(JobMemberRole myRole) { + this.myRole = myRole; + } + + public Date getStatusUpdatedTime() { + return statusUpdatedTime; + } + + public void setStatusUpdatedTime(Date statusUpdatedTime) { + this.statusUpdatedTime = statusUpdatedTime; + } + + public String getCreatorMemberId() { + return creatorMemberId; + } + + public void setCreatorMemberId(String creatorMemberId) { + this.creatorMemberId = creatorMemberId; + } + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectFlowNodeMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectFlowNodeMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..1112d841d7caef90b95de589c9d77faec59a24e8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectFlowNodeMySqlModel.java" @@ -0,0 +1,137 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.job; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.ComponentType; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +/** + * @author zane.luo + */ +@Entity(name = "project_flow_node") +public class ProjectFlowNodeMySqlModel extends AbstractBaseMySqlModel { + + private static final long serialVersionUID = 2722275392448819712L; + + /** + * 鏄惁鏄捣濮嬭妭鐐 + */ + private boolean startNode; + /** + * 鍓嶇鐢诲竷涓殑鑺傜偣id锛岀敱鍓嶇鐢熸垚 + */ + private String nodeId; + /** + * 椤圭洰ID + */ + private String projectId; + /** + * 娴佺▼ID + */ + private String flowId; + /** + * 閫楀彿鍒嗛殧鐨勭埗鑺傜偣Id鍒楄〃 + */ + private String parentNodeIdList; + /** + * 缁勪欢绫诲瀷 + */ + @Enumerated(EnumType.STRING) + private ComponentType componentType; + /** + * 缁勪欢鍙傛暟 + */ + private String params; + /** + * 鍙傛暟鐗堟湰鍙凤紙鏃堕棿鎴筹級 + */ + private long paramsVersion = System.currentTimeMillis(); + + + //region getter/setter + + + public boolean isStartNode() { + return startNode; + } + + public void setStartNode(boolean startNode) { + this.startNode = startNode; + } + + public String getNodeId() { + return nodeId; + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public ComponentType getComponentType() { + return componentType; + } + + public void setComponentType(ComponentType componentType) { + this.componentType = componentType; + } + + public String getParams() { + return params; + } + + public void setParams(String params) { + this.params = params; + } + + public String getParentNodeIdList() { + return parentNodeIdList; + } + + public void setParentNodeIdList(String parentNodeId) { + this.parentNodeIdList = parentNodeId; + } + + public long getParamsVersion() { + return paramsVersion; + } + + public void setParamsVersion(long paramsVersion) { + this.paramsVersion = paramsVersion; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectMemberAuditMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectMemberAuditMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..625cb94c2ff220ebcd387ad3db01aa7ae4d2b75e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectMemberAuditMySqlModel.java" @@ -0,0 +1,99 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.job; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.AuditStatus; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +/** + * @author zane.luo + */ +@Entity(name = "project_member_audit") +public class ProjectMemberAuditMySqlModel extends AbstractBaseMySqlModel { + + private static final long serialVersionUID = 8870060097218263816L; + + /** + * 鎵灞為」鐩 Id 椤圭洰涓婚敭 + */ + private String projectId; + + /** + * 鎴愬憳 Id + */ + private String memberId; + + /** + * 瀹℃牳浜 + */ + private String auditorId; + + /** + * 瀹℃牳缁撴灉;鏋氫妇鍊硷紙adopt/disagree锛 + */ + @Enumerated(EnumType.STRING) + private AuditStatus auditResult; + /** + * 瀹℃牳鎰忚 + */ + private String auditComment; + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getAuditorId() { + return auditorId; + } + + public void setAuditorId(String auditorId) { + this.auditorId = auditorId; + } + + public AuditStatus getAuditResult() { + return auditResult; + } + + public void setAuditResult(AuditStatus auditResult) { + this.auditResult = auditResult; + } + + public String getAuditComment() { + return auditComment; + } + + public void setAuditComment(String auditComment) { + this.auditComment = auditComment; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectMemberMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectMemberMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..b8d7e2136edd7bea90092062fd8835c96f719ab3 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectMemberMySqlModel.java" @@ -0,0 +1,181 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.job; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.enums.JobMemberRole; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +/** + * @author zane.luo + */ +@Entity(name = "project_member") +public class ProjectMemberMySqlModel extends AbstractBaseMySqlModel { + + private static final long serialVersionUID = -2632889286058354328L; + + /** + * 閭璇锋柟鎴愬憳Id + */ + private String inviterId; + /** + * 鏄惁鏄垵濮嬪寲椤圭洰鏃舵坊鍔犺繘鏉ョ殑锛堝叧绯诲埌瀹℃牳娴佺▼涓嶅悓锛 + */ + private boolean fromCreateProject; + /** + * 鎵灞為」鐩 Id 椤圭洰涓婚敭 + */ + private String projectId; + + /** + * 鎴愬憳 Id + */ + private String memberId; + /** + * 鍦ㄤ换鍔′腑鐨勮鑹;鏋氫妇锛坧romoter/provider/arbiter锛 + */ + @Enumerated(EnumType.STRING) + private JobMemberRole memberRole; + + /** + * 缁煎悎鐨勫鏍哥粨鏋 + */ + @Enumerated(EnumType.STRING) + private AuditStatus auditStatus; + /** + * 鑷繁鏄惁鍚屾剰 + */ + @Enumerated(EnumType.STRING) + private AuditStatus auditStatusFromMyself; + /** + * 鍏朵粬浜烘槸鍚﹀悓鎰 + */ + @Enumerated(EnumType.STRING) + private AuditStatus auditStatusFromOthers; + /** + * 瀹℃牳鎰忚 + */ + private String auditComment; + + /** + * 鏄惁宸查鍑 + */ + private Boolean exited = false; + + /** + * 鐢ㄤ簬鏌ヨ鎴愬憳鍒楄〃鏃讹紝鎸夎鑹叉帓搴 + */ + public int getProjectRoleIndex() { + switch (memberRole) { + case promoter: + return 1; + default: + return 3; + } + } + + + //region getter/setter + + + public String getInviterId() { + return inviterId; + } + + public void setInviterId(String inviterId) { + this.inviterId = inviterId; + } + + public boolean isFromCreateProject() { + return fromCreateProject; + } + + public void setFromCreateProject(boolean fromCreateProject) { + this.fromCreateProject = fromCreateProject; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + public AuditStatus getAuditStatus() { + return auditStatus; + } + + public void setAuditStatus(AuditStatus auditStatus) { + this.auditStatus = auditStatus; + } + + public AuditStatus getAuditStatusFromMyself() { + return auditStatusFromMyself; + } + + public void setAuditStatusFromMyself(AuditStatus auditStatusFromMyself) { + this.auditStatusFromMyself = auditStatusFromMyself; + } + + public AuditStatus getAuditStatusFromOthers() { + return auditStatusFromOthers; + } + + public void setAuditStatusFromOthers(AuditStatus auditStatusFromOthers) { + this.auditStatusFromOthers = auditStatusFromOthers; + } + + public String getAuditComment() { + return auditComment; + } + + public void setAuditComment(String auditComment) { + this.auditComment = auditComment; + } + + public Boolean isExited() { + return exited; + } + + public void setExited(Boolean exited) { + this.exited = exited; + } + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..2fa4ad024d8cfebd137d4bce06b6e8821ad34dd8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/ProjectMySqlModel.java" @@ -0,0 +1,330 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.job; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.enums.JobMemberRole; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import java.util.Date; + +/** + * @author zane.luo + */ +@Entity(name = "project") +public class ProjectMySqlModel extends AbstractBaseMySqlModel { + + private static final long serialVersionUID = -2632889286058354328L; + + /** + * 鏄惁宸插垹闄 + */ + private boolean deleted; + /** + * 椤圭洰ID + */ + private String projectId; + + /** + * 鍚嶇О + */ + private String name; + + /** + * 椤圭洰鎻忚堪 + */ + private String projectDesc; + + /** + * 缁煎悎鐨勫鏍哥粨鏋 + */ + @Enumerated(EnumType.STRING) + private AuditStatus auditStatus; + /** + * 鑷繁鏄惁鍚屾剰 + */ + @Enumerated(EnumType.STRING) + private AuditStatus auditStatusFromMyself; + /** + * 鍏朵粬浜烘槸鍚﹀悓鎰 + */ + @Enumerated(EnumType.STRING) + private AuditStatus auditStatusFromOthers; + /** + * 瀹℃牳鎰忚 + */ + private String auditComment; + + /** + * 鎴戞柟韬唤;鏋氫妇锛坧romoter/provider锛 + */ + @Enumerated(EnumType.STRING) + private JobMemberRole myRole; + + /** + * 璇ラ」鐩殑鍒涘缓鑰匢D + */ + private String memberId; + + /** + * 鐘舵佹洿鏂版椂闂 + */ + private Date statusUpdatedTime; + + /** + * 寮濮嬫椂闂 + */ + private Date startTime; + /** + * 缁撴潫鏃堕棿 + */ + private Date finishTime; + + /** + * 杩涘害 + */ + private Integer progress; + /** + * 杩涘害鏇存柊鏃堕棿 + */ + private Date progressUpdatedTime; + + /** + * 娑堟伅澶囨敞 澶辫触鍘熷洜/澶囨敞 + */ + private String message; + /** + * 鏄惁宸查鍑 + */ + private boolean exited = false; + /** + * 閫鍑洪」鐩殑鎿嶄綔鑰 + */ + private String exitedBy; + /** + * 閫鍑烘椂闂 + */ + private Date exitedTime; + /** + * 鏄惁宸插叧闂 + */ + private boolean closed = false; + /** + * 鍏抽棴椤圭洰鐨勬搷浣滆 + */ + private String closedBy; + /** + * 鍏抽棴鏃堕棿 + */ + private Date closedTime; + + /** + * 娴佺▼鐘舵佺粺璁″瓧娈 + */ + private String flowStatusStatistics; + + //region getter/setter + + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public JobMemberRole getMyRole() { + return myRole; + } + + public void setMyRole(JobMemberRole myRole) { + this.myRole = myRole; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getProjectDesc() { + return projectDesc; + } + + public void setProjectDesc(String projectDesc) { + this.projectDesc = projectDesc; + } + + public AuditStatus getAuditStatus() { + return auditStatus; + } + + public void setAuditStatus(AuditStatus auditStatus) { + this.auditStatus = auditStatus; + } + + public Date getStatusUpdatedTime() { + return statusUpdatedTime; + } + + public void setStatusUpdatedTime(Date statusUpdatedTime) { + this.statusUpdatedTime = statusUpdatedTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getFinishTime() { + return finishTime; + } + + public void setFinishTime(Date finishTime) { + this.finishTime = finishTime; + } + + public Integer getProgress() { + return progress; + } + + public void setProgress(Integer progress) { + this.progress = progress; + } + + public Date getProgressUpdatedTime() { + return progressUpdatedTime; + } + + public void setProgressUpdatedTime(Date progressUpdatedTime) { + this.progressUpdatedTime = progressUpdatedTime; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public boolean isExited() { + return exited; + } + + public void setExited(boolean exited) { + this.exited = exited; + } + + public AuditStatus getAuditStatusFromMyself() { + return auditStatusFromMyself; + } + + public void setAuditStatusFromMyself(AuditStatus auditStatusFromMyself) { + this.auditStatusFromMyself = auditStatusFromMyself; + } + + public AuditStatus getAuditStatusFromOthers() { + return auditStatusFromOthers; + } + + public void setAuditStatusFromOthers(AuditStatus auditStatusFromOthers) { + this.auditStatusFromOthers = auditStatusFromOthers; + } + + public String getAuditComment() { + return auditComment; + } + + public void setAuditComment(String auditComment) { + this.auditComment = auditComment; + } + + public boolean isClosed() { + return closed; + } + + public void setClosed(boolean closed) { + this.closed = closed; + } + + public String getFlowStatusStatistics() { + return flowStatusStatistics; + } + + public void setFlowStatusStatistics(String flowStatusStatistics) { + this.flowStatusStatistics = flowStatusStatistics; + } + + public String getExitedBy() { + return exitedBy; + } + + public void setExitedBy(String exitedBy) { + this.exitedBy = exitedBy; + } + + public Date getExitedTime() { + return exitedTime; + } + + public void setExitedTime(Date exitedTime) { + this.exitedTime = exitedTime; + } + + public String getClosedBy() { + return closedBy; + } + + public void setClosedBy(String closedBy) { + this.closedBy = closedBy; + } + + public Date getClosedTime() { + return closedTime; + } + + public void setClosedTime(Date closedTime) { + this.closedTime = closedTime; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/TaskContextMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/TaskContextMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..ea1ea812297af5a9d4e159c011208efe21d8450d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/TaskContextMySqlModel.java" @@ -0,0 +1,86 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.job; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; + +import javax.persistence.Entity; + + +/** + * 瀛愪换鍔′笂涓嬫枃锛屼繚瀛樺瓙浠诲姟鐘舵侊紝鐢ㄤ簬鎭㈠涓柇鐨勪换鍔° + * + * @author Zane + */ +@Entity(name = "task_context") +public class TaskContextMySqlModel extends AbstractBaseMySqlModel { + /** + * 浠诲姟Id + */ + private String businessId; + + /** + * 瀛愪换鍔 Id + */ + private String taskId; + /** + * 鍚嶇О + */ + private String name; + /** + * 鍊 + */ + private String value; + + + //region getter/setter + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/TaskMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/TaskMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..935425922472e384efffde7a74f1a919fe0b0fe2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/TaskMySqlModel.java" @@ -0,0 +1,268 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.job; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.TaskStatus; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import java.util.Date; + +/** + * @author Zane + */ +@Entity(name = "task") +public class TaskMySqlModel extends AbstractBaseMySqlModel { + /** + * 鍚嶇О锛屽湪 job 涓敮涓銆 + */ + private String name; + /** + * 娣卞害锛屽悓涓娣卞害鐨 task 鍏佽骞惰鎵ц銆 + */ + private Integer deep; + /** + * 浠诲姟Id + */ + private String jobId; + /** + * 瑙掕壊 + */ + @Enumerated(EnumType.STRING) + private JobMemberRole role; + /** + * 涓氬姟ID锛屽鏂瑰敮涓 + */ + private String taskId; + /** + * 娴佺▼鍙 + */ + private String flowId; + /** + * 浠诲姟鍦ㄦ祦绋嬩腑鐨勮妭鐐笽d + */ + private String flowNodeId; + /** + * 瀛愪换鍔$殑鐖惰妭鐐 + */ + private String parentTaskIdList; + /** + * 瀛愪换鍔′緷璧 + */ + private String dependenceList; + /** + * 瀛愪换鍔$被鍨;鏋氫妇锛圖ataIO/Intersection/HeteroLR...锛 + */ + @Enumerated(EnumType.STRING) + private ComponentType taskType; + /** + * 浠诲姟conf_json + */ + private String taskConf; + /** + * 鐘舵;鏋氫妇锛坮unning/canceled/success/error锛 + */ + @Enumerated(EnumType.STRING) + private TaskStatus status; + /** + * 寮濮嬫椂闂 + */ + private Date startTime; + /** + * 缁撴潫鏃堕棿 + */ + private Date finishTime; + /** + * 娑堟伅澶囨敞;澶辫触鍘熷洜/澶囨敞 + */ + private String message; + /** + * 鍙戠敓閿欒鐨勮缁嗗師鍥狅紝閫氬父鏄爢鏍堜俊鎭 + */ + private String errorCause; + /** + * task鎵ц椤哄簭 + */ + private Integer position; + private Integer spend; + + /** + * 椤圭洰id + */ + private String projectId; + + //region getter/setter + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getDeep() { + return deep; + } + + public void setDeep(Integer deep) { + this.deep = deep; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public Integer getSpend() { + return spend; + } + + public void setSpend(Integer spend) { + this.spend = spend; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public JobMemberRole getRole() { + return role; + } + + public void setRole(JobMemberRole role) { + this.role = role; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getFlowNodeId() { + return flowNodeId; + } + + public void setFlowNodeId(String flowNodeId) { + this.flowNodeId = flowNodeId; + } + + public String getParentTaskIdList() { + return parentTaskIdList; + } + + public void setParentTaskIdList(String parentTaskId) { + this.parentTaskIdList = parentTaskId; + } + + public String getDependenceList() { + return dependenceList; + } + + public void setDependenceList(String dependenceList) { + this.dependenceList = dependenceList; + } + + public ComponentType getTaskType() { + return taskType; + } + + public void setTaskType(ComponentType taskType) { + this.taskType = taskType; + } + + public String getTaskConf() { + return taskConf; + } + + public void setTaskConf(String taskConf) { + this.taskConf = taskConf; + } + + public TaskStatus getStatus() { + return status; + } + + public void setStatus(TaskStatus status) { + this.status = status; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getFinishTime() { + return finishTime; + } + + public void setFinishTime(Date finishTime) { + this.finishTime = finishTime; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getErrorCause() { + return errorCause; + } + + public void setErrorCause(String errorCause) { + this.errorCause = errorCause; + } + + public Integer getPosition() { + return position; + } + + public void setPosition(Integer position) { + this.position = position; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/TaskProgressMysqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/TaskProgressMysqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..217e02493af0064d6728a91b4d8a697e3ca0536f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/TaskProgressMysqlModel.java" @@ -0,0 +1,205 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.job; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import java.util.Date; + +/** + * @author lonnie + */ +@Entity(name = "task_progress") +public class TaskProgressMysqlModel extends AbstractBaseMySqlModel { + + /** + * 椤圭洰id + */ + private String projectId; + + /** + * 娴佺▼鍙 + */ + private String flowId; + + /** + * 浠诲姟id + */ + private String jobId; + + /** + * 瑙掕壊 + */ + @Enumerated(EnumType.STRING) + private JobMemberRole role; + + /** + * 娴佺▼鑺傜偣id + */ + private String flowNodeId; + + /** + * 浠诲姟id + */ + private String taskId; + + /** + * 瀛愪换鍔$被鍨;鏋氫妇锛圖ataIO/Intersection/HeteroLR...锛 + */ + @Enumerated(EnumType.STRING) + private ComponentType taskType; + + /** + * 棰勮鎬诲伐绋嬮噺 + */ + private Integer expectWorkAmount; + + /** + * 瀹為檯鎬诲伐绋嬮噺 + */ + private Integer reallyWorkAmount; + + /** + * 杩涘害 + */ + private Integer progress; + + /** + * 杩涘害鐧惧垎姣 + */ + private Double progressRate; + + /** + * updated_time - created_time锛屾绉掋 + */ + private Integer spend; + + /** + * 棰勮缁撴潫鏃堕棿 + */ + private Date expectEndTime; + + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public JobMemberRole getRole() { + return role; + } + + public void setRole(JobMemberRole role) { + this.role = role; + } + + public String getFlowNodeId() { + return flowNodeId; + } + + public void setFlowNodeId(String flowNodeId) { + this.flowNodeId = flowNodeId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public ComponentType getTaskType() { + return taskType; + } + + public void setTaskType(ComponentType taskType) { + this.taskType = taskType; + } + + public Integer getExpectWorkAmount() { + return expectWorkAmount; + } + + public void setExpectWorkAmount(Integer expectWorkAmount) { + this.expectWorkAmount = expectWorkAmount; + } + + public Integer getReallyWorkAmount() { + return reallyWorkAmount; + } + + public void setReallyWorkAmount(Integer reallyWorkAmount) { + this.reallyWorkAmount = reallyWorkAmount; + } + + public Integer getProgress() { + return progress; + } + + public void setProgress(Integer progress) { + this.progress = progress; + } + + public Double getProgressRate() { + return progressRate; + } + + public void setProgressRate(Double progressRate) { + this.progressRate = progressRate; + } + + public Integer getSpend() { + return spend; + } + + public void setSpend(Integer spend) { + this.spend = spend; + } + + public Date getExpectEndTime() { + return expectEndTime; + } + + public void setExpectEndTime(Date expectEndTime) { + this.expectEndTime = expectEndTime; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/TaskResultMySqlModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/TaskResultMySqlModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..45ca6c9a20d9f77bac14ad9fdaa1410079c0576c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/entity/job/TaskResultMySqlModel.java" @@ -0,0 +1,172 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.entity.job; + +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +/** + * @author zane.luo + */ +@Entity(name = "task_result") +public class TaskResultMySqlModel extends AbstractBaseMySqlModel { + /** + * 浠诲姟Id + */ + private String jobId; + /** + * 娴佺▼Id + */ + private String flowId; + /** + * 娴佺▼鑺傜偣Id + */ + private String flowNodeId; + /** + * 瀛愪换鍔d + */ + private String taskId; + /** + * 浠诲姟鍚嶇О锛屼緥濡傦細vert_lr_0 + */ + private String name; + /** + * 缁勪欢id + */ + @Enumerated(EnumType.STRING) + private ComponentType componentType; + /** + * 鎴愬憳瑙掕壊 + */ + @Enumerated(EnumType.STRING) + private JobMemberRole role; + /** + * 绫诲瀷锛屼竴涓 task 浼氭湁澶氳涓嶅悓绫诲瀷鐨 result + */ + private String type; + /** + * 鎵ц缁撴灉 + */ + private String result; + + /** + * 鏄惁鏄彲浠ュ鍑哄埌 serving 鐨勬ā鍨 + */ + private boolean servingModel; + + /** + * 椤圭洰id + */ + private String projectId; + + //region getter/setter + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getFlowNodeId() { + return flowNodeId; + } + + public void setFlowNodeId(String flowNodeId) { + this.flowNodeId = flowNodeId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public ComponentType getComponentType() { + return componentType; + } + + public void setComponentType(ComponentType componentType) { + this.componentType = componentType; + } + + public JobMemberRole getRole() { + return role; + } + + public void setRole(JobMemberRole role) { + this.role = role; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public boolean isServingModel() { + return servingModel; + } + + public void setServingModel(boolean servingModel) { + this.servingModel = servingModel; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/AccountRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/AccountRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..ed2bbc9099d4e9b99c46ded385d6f1b619e6ce91 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/AccountRepository.java" @@ -0,0 +1,37 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.AccountMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +/** + * @author Zane + */ +@Repository +public interface AccountRepository extends BaseRepository { + + AccountMySqlModel findByPhoneNumber(String phoneNumber); + + + @Modifying(clearAutomatically = true) + @Query(value = "update account a set a.superAdminRole = false,a.adminRole = false where a.id =?1 ") + void cancelSuperAdmin(String id); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/BlacklistRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/BlacklistRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..3c9f30fed8b03608dc6412484c15122d883b1ab3 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/BlacklistRepository.java" @@ -0,0 +1,29 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.BlacklistMysqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author lonnie + */ +@Repository +public interface BlacklistRepository extends BaseRepository { + BlacklistMysqlModel findByBlacklistMemberId(String blacklistMemberId); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ChatLastAccountRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ChatLastAccountRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..2ef3515adc8775da68a244d078acf31f8af1ce7b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ChatLastAccountRepository.java" @@ -0,0 +1,32 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.chat.ChatLastAccountMysqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * 鏈杩戠殑鑱婂ぉ璐﹀彿 + * + * @author aaron.li + **/ +@Repository +public interface ChatLastAccountRepository extends BaseRepository { + + int deleteByAccountIdEqualsAndLiaisonAccountIdEquals(String accountId, String liaisonAccountId); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ChatUnreadMessageRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ChatUnreadMessageRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..fad5fc1dbca3025f899545966902aa8d517039f7 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ChatUnreadMessageRepository.java" @@ -0,0 +1,32 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.chat.ChatUnreadMessageMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author Johnny.lin + */ +@Repository +public interface ChatUnreadMessageRepository extends BaseRepository { + + ChatUnreadMessageMySqlModel findByFromAccountIdAndAndToAccountId(String fromAccountId, String toAccountId); + + int deleteByFromAccountIdAndToAccountId(String fromAccountId, String toAccountId); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/DataOutputInfoRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/DataOutputInfoRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..29ee8d791783e079da03c4c420cfe6059ea596f4 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/DataOutputInfoRepository.java" @@ -0,0 +1,29 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.DataOutputInfoMysqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author aaron.li + **/ +@Repository +public interface DataOutputInfoRepository extends BaseRepository { + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/DataSetColumnRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/DataSetColumnRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..b9834ea741a12b28731cc4e024997ed1c15e3ccd --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/DataSetColumnRepository.java" @@ -0,0 +1,34 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.data_set.DataSetColumnMysqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +/** + * @author Zane + */ +@Repository +public interface DataSetColumnRepository extends BaseRepository { + + @Modifying + @Transactional + void deleteByDataSetId(String dataSetId); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/DataSetRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/DataSetRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..49cccd21ce136f1f4f016299d0708794d82045f5 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/DataSetRepository.java" @@ -0,0 +1,47 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author Zane + */ +@Repository +public interface DataSetRepository extends BaseRepository { + + @Query(value = "select tags,count(tags) as count from #{#entityName} where tags<>'' group by tags;", nativeQuery = true) + List listAllTags(); + + @Query(value = "select count(*) from #{#entityName} where name=?1", nativeQuery = true) + int countByName(String name); + + @Query(value = "select count(*) from #{#entityName} where name=?1 and id<>?2", nativeQuery = true) + int countByName(String name, String id); + + @Modifying + @Transactional + @Query(value = "update data_set set usage_count_in_project=(select count(*) from project_data_set where data_set_id=?1 and audit_status='agree') where id=?1", nativeQuery = true) + void updateUsageCountInProject(String dataSetId); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/DataSetTaskRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/DataSetTaskRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..8baed0fd4198c82c23f42d50e598e30d62315c64 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/DataSetTaskRepository.java" @@ -0,0 +1,28 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.data_set.DataSetTaskMysqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author lonnie + */ +@Repository +public interface DataSetTaskRepository extends BaseRepository { +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/DataSourceRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/DataSourceRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..636d891c3ae631b6adb8a505392c1bb33aaa1bb1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/DataSourceRepository.java" @@ -0,0 +1,32 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.DataSourceMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +/** + * @author Johnny.lin + */ +@Repository +public interface DataSourceRepository extends BaseRepository { + + @Query(value = "select count(*) from #{#entityName} where name=?1", nativeQuery = true) + int countByName(String name); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/FeatureJobMemberRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/FeatureJobMemberRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..7adbaeb1b7d205bf1cc1d26636932ed56d342d2c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/FeatureJobMemberRepository.java" @@ -0,0 +1,29 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.job.JobMemberMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + + +/** + * @author Zane + */ +@Repository +public interface FeatureJobMemberRepository extends BaseRepository { +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/FlowActionLogRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/FlowActionLogRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..750fd63fb11246c7835c92d60ffa3ecb4cd187ca --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/FlowActionLogRepository.java" @@ -0,0 +1,28 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.flow.FlowActionLogMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author seven.zeng + */ +@Repository +public interface FlowActionLogRepository extends BaseRepository { +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/FlowActionQueueRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/FlowActionQueueRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..11afed1bfc4a7778b7861f608a3b36c2a0436f13 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/FlowActionQueueRepository.java" @@ -0,0 +1,28 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.flow.FlowActionQueueMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author seven.zeng + */ +@Repository +public interface FlowActionQueueRepository extends BaseRepository { +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/FlowTemplateRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/FlowTemplateRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..05c97cbbda1a7e6a8c5b2e8c7d74f196e24850dd --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/FlowTemplateRepository.java" @@ -0,0 +1,29 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.flow.FlowTemplateMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author zane.luo + */ +@Repository +public interface FlowTemplateRepository extends BaseRepository { + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/GlobalConfigRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/GlobalConfigRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..87fc55274fda3cc2f8df40fb6dcc6482772a68b6 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/GlobalConfigRepository.java" @@ -0,0 +1,32 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.GlobalConfigMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @author Zane + */ +@Repository +public interface GlobalConfigRepository extends BaseRepository { + + List findByGroup(String group); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/JobMemberRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/JobMemberRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..65d37943f77e64f7f5841129e424630ea37ec006 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/JobMemberRepository.java" @@ -0,0 +1,28 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.job.JobMemberMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author Zane + */ +@Repository +public interface JobMemberRepository extends BaseRepository { +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/JobRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/JobRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..5dc0d0d2caee76913ec75967592347da68a48242 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/JobRepository.java" @@ -0,0 +1,34 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.job.JobMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +/** + * @author Zane + */ +@Repository +public interface JobRepository extends BaseRepository { + @Query(value = "select * from #{#entityName} where job_id=?1 and my_role=?2 ", nativeQuery = true) + JobMySqlModel findByJobId(String jobId, String role); + + @Query(value = "select * from #{#entityName} where flow_id=?1 and my_role=?2 order by created_time desc limit 1;", nativeQuery = true) + JobMySqlModel findLastByFlowId(String flowId, String role); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/MemberChatRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/MemberChatRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..17a1a3f5344ef02adbccb43f4b9fc6afa7587842 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/MemberChatRepository.java" @@ -0,0 +1,54 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.chat.MemberChatMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @author Johnny.lin + */ +@Repository +public interface MemberChatRepository extends BaseRepository { + + @Query(value = "select * from #{#entityName} where (from_member_id = :fromMemberId and to_member_id = :toMemberId) or (from_member_id = :toMemberId and to_member_id = :fromMemberId)", nativeQuery = true) + List queryAllChatDetail(@Param("fromMemberId") String fromMemberId, @Param("toMemberId") String toMemberId); + + @Query(value = "select member_id, max(max_time) from (" + + " select from_member_id as member_id, max(created_time) as max_time from member_chat mc " + + " where from_member_id <> :selfMemberId " + + " group by from_member_id " + + " union " + + " select to_member_id as member_id, max(created_time) as max_time from member_chat mc " + + " where to_member_id <> :selfMemberId " + + " group by to_member_id " + + ") a " + + " group by member_id order by max_time desc", nativeQuery = true) + List queryChatList(@Param("selfMemberId") String selfMemberId); + + + @Modifying + @Query(value = "update member_chat set status = :newStatus where from_account_id = :fromAccountId " + + "and to_account_id = :toAccountId and status = :status", nativeQuery = true) + void updateMessageStatus(@Param("fromAccountId") String fromAccountId, @Param("toAccountId") String toAccountId, @Param("status") int status, @Param("newStatus") int newStatus); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/MessageQueueRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/MessageQueueRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..53047141a996770fe0477c02b1834dea28b505aa --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/MessageQueueRepository.java" @@ -0,0 +1,29 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.chat.MessageQueueMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author Johnny.lin + */ +@Repository +public interface MessageQueueRepository extends BaseRepository { + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/MessageRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/MessageRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..af46f3c336d85a4a54050330cc5251aa5c37f32c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/MessageRepository.java" @@ -0,0 +1,28 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.MessageMysqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author Zane + */ +@Repository +public interface MessageRepository extends BaseRepository { +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ModelOotRecordRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ModelOotRecordRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..44778ac9c3ee2337f26b605514af9d5616aff62e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ModelOotRecordRepository.java" @@ -0,0 +1,28 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.job.ModelOotRecordMysqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author aaron.li + **/ +@Repository +public interface ModelOotRecordRepository extends BaseRepository { +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/OperationLogRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/OperationLogRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..596004b19ef130cc90acdf4bff03b271344bff8f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/OperationLogRepository.java" @@ -0,0 +1,28 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.OperationLogMysqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author zane.luo + */ +@Repository +public interface OperationLogRepository extends BaseRepository { +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/OutputModelRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/OutputModelRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..84382fc62e35a29f98a70750b1d9a968c7d46a5b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/OutputModelRepository.java" @@ -0,0 +1,28 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.OutputModelMysqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author aaron.li + **/ +@Repository +public interface OutputModelRepository extends BaseRepository { +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectDataSetRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectDataSetRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..cdfbf556f34a3a662b1e2f63d475dfdf6abe13c1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectDataSetRepository.java" @@ -0,0 +1,53 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.job.ProjectDataSetMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author zane.luo + */ +@Repository +public interface ProjectDataSetRepository extends BaseRepository { + + /** + * When a member leaves, its data set is disabled. + * + * @param projectId project id + * @param memberId Id of the leaving member + */ + @Modifying + @Transactional + @Query(value = "update #{#entityName} set audit_status='disagree',audit_comment='鎴愬憳宸查鍑猴紝鏁版嵁闆嗕笉鍙敤銆' where project_id=?1 and member_id=?2 and member_role=?3", nativeQuery = true) + void disableDataSetWhenMemberExist(String projectId, String memberId, String memberRole); + + @Query(value = "select * from #{#entityName} where data_set_id=?1 and audit_status='agree'", nativeQuery = true) + List queryUsageInProject(String dataSetId); + + /** + * Query the number of data sets to be reviewed + */ + @Query(value = "select count(*) from #{#entityName} where project_id=?1 and member_id=?2 and audit_status='auditing' and source_type is null", nativeQuery = true) + int queryNeedAuditDataSetCount(String projectId, String memberId); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectFlowNodeRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectFlowNodeRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..c0921458b5513407b34e85e1bba3fdfba0316df5 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectFlowNodeRepository.java" @@ -0,0 +1,44 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.job.ProjectFlowNodeMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author zane.luo + */ +@Repository +public interface ProjectFlowNodeRepository extends BaseRepository { + + @Query(value = "select * from #{#entityName} where flow_id=?1 and node_id=?2", nativeQuery = true) + ProjectFlowNodeMySqlModel findByNodeId(String flowId, String nodeId); + + /** + * 鍒犻櫎涓嶅湪姝ゅ垪琛ㄤ腑鐨勮妭鐐 + */ + @Modifying + @Transactional + @Query(value = "delete from #{#entityName} where flow_id=?1 and node_id not in (?2)", nativeQuery = true) + void deleteNotInNodeIds(String flowId, List nodeIds); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectFlowRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectFlowRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..2bfecfdc8bd86058b62c3726789272b487e98238 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectFlowRepository.java" @@ -0,0 +1,37 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.job.ProjectFlowMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @author zane.luo + */ +@Repository +public interface ProjectFlowRepository extends BaseRepository { + + /** + * Count the number of processes in different states in the project + */ + @Query(value = "select flow_status,count(flow_status) from project_flow where project_id=?1 and deleted = 0 group by flow_status", nativeQuery = true) + List countProjectFlowStatus(String projectId); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectMemberAuditRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectMemberAuditRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..2626d1eeb7e9f54e0095cc484596c0c0a822dd44 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectMemberAuditRepository.java" @@ -0,0 +1,41 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.job.ProjectMemberAuditMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +/** + * @author zane.luo + */ +@Repository +public interface ProjectMemberAuditRepository extends BaseRepository { + + /** + * 绉婚櫎鎸囧畾鎴愬憳鐨勫鏍歌褰 + * 1. 闇瑕佷粬瀹℃牳鐨勮褰 + * 2. 瀵逛粬杩涜瀹℃牳鐨勮褰 + */ + @Modifying + @Transactional + @Query(value = "delete from #{#entityName} where project_id=?1 and (auditor_id=?2 or member_id=?2)", nativeQuery = true) + void deleteAuditingRecord(String projectId, String auditorId); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectMemberRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectMemberRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..b4821f7a7974fb2e85254fde7525b80a7bd9c807 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectMemberRepository.java" @@ -0,0 +1,37 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.job.ProjectMemberMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @author zane.luo + */ +@Repository +public interface ProjectMemberRepository extends BaseRepository { + + /** + * 鑾峰彇涓庢垜鍚堜綔鐨勬墍鏈夋垚鍛 + */ + @Query(value = "select member_id from #{#entityName} group by member_id", nativeQuery = true) + List listAllMemberId(); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..ba29fe7f308e2ab8e671a407527049edb2525f44 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/ProjectRepository.java" @@ -0,0 +1,38 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.job.ProjectMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @author zane.luo + */ +@Repository +public interface ProjectRepository extends BaseRepository { + + @Query(value = "select * from #{#entityName} where name=?1", nativeQuery = true) + List findAllByName(String name); + + @Query(value = "select * from #{#entityName} where project_id=?1 limit 1;", nativeQuery = true) + ProjectMySqlModel findOneById(String projectId); + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/RoleCountsRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/RoleCountsRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..88da7bfb20a84a4e349175059e40c9ccb97de388 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/RoleCountsRepository.java" @@ -0,0 +1,24 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +/** + * @author zane.luo + */ + +public interface RoleCountsRepository { +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/TaskContextRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/TaskContextRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..9a70a37dbc23b7689835cf46d4300d934039e199 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/TaskContextRepository.java" @@ -0,0 +1,28 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.job.TaskContextMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author Zane + */ +@Repository +public interface TaskContextRepository extends BaseRepository { +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/TaskProgressRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/TaskProgressRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..527dc5c25eaaa0290c2e3b062e87d7cd617ae256 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/TaskProgressRepository.java" @@ -0,0 +1,28 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.job.TaskProgressMysqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author lonnie + */ +@Repository +public interface TaskProgressRepository extends BaseRepository { +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/TaskRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/TaskRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..f90b062435ee977a346a19837a40a6a69006247f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/TaskRepository.java" @@ -0,0 +1,31 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +/** + * @author Zane + */ +@Repository +public interface TaskRepository extends BaseRepository { + @Query(value = "select * from #{#entityName} where job_id=?1 and flow_node_id=?2 and role=?3 order by created_time desc limit 1;", nativeQuery = true) + TaskMySqlModel findOne(String jobId, String flowNodeId, String role); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/TaskResultRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/TaskResultRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..abb6b2e1e7e78c1d974645d0b034810f6d268bda --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/TaskResultRepository.java" @@ -0,0 +1,29 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author Zane + */ +@Repository +public interface TaskResultRepository extends BaseRepository { + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/TrackingMetricRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/TrackingMetricRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..c8a3f892a37a68311b64b2b99e42ccc6f5d4c25a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/TrackingMetricRepository.java" @@ -0,0 +1,28 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository; + +import com.welab.wefe.board.service.database.entity.TrackingMetricMysqlModel; +import com.welab.wefe.board.service.database.repository.base.BaseRepository; +import org.springframework.stereotype.Repository; + +/** + * @author aaron.li + **/ +@Repository +public interface TrackingMetricRepository extends BaseRepository { +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/base/BaseRepository.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/base/BaseRepository.java" new file mode 100644 index 0000000000000000000000000000000000000000..254a2ba1b758d7782ed960a7051f8146ff7c4384 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/base/BaseRepository.java" @@ -0,0 +1,108 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository.base; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.repository.NoRepositoryBean; +import org.springframework.lang.Nullable; +import org.springframework.transaction.annotation.Transactional; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @author Zane + */ +@NoRepositoryBean +public interface BaseRepository extends JpaRepository, JpaSpecificationExecutor { + + /** + * 鏍规嵁鎸囧畾瀛楁鑾峰彇涓鏉℃暟鎹 + */ + T findOne(String key, Object value, Class clazz); + + /** + * 鏍规嵁鎸囧畾瀛楁鏌ヨ鏁版嵁琛屾暟 + */ + long count(String key, Object value, Class clazz); + + /** + * 鏍规嵁 Id 鏇存柊涓涓瓧娈 + */ + @Transactional + int updateById(String id, String key, Object value, Class clazz); + + /** + * 鏍规嵁 Id 鏇存柊澶氫釜瀛楁 + */ + @Transactional + int updateById(String id, Map updateParams, Class clazz); + + /** + * 鏍规嵁 Id 鏇存柊涓涓瓧娈, 鏍规嵁涓氬姟闇瑕佸喅瀹氭槸鍚﹀寘鎷洿鏂皍pdatedBy瀛楁 + */ + @Transactional + int updateById(String id, String key, Object value, Class clazz, boolean hasUpdatedBy); + + /** + * 鍒嗛〉鏌ヨ + */ + PagingOutput paging(@Nullable Specification queryCondition, PagingInput pagingInput); + + /** + * 鍒嗛〉鏌ヨ锛屽苟灏 POJO 杞崲涓 DTO + * + * @param DTO 绫诲瀷 + */ + PagingOutput paging(@Nullable Specification queryCondition, PagingInput pagingInput, Class outputClass); + + + /** + * 榛樿鍒嗛〉瀵硅薄 + */ + default Pageable getDefaultPageable(PagingInput input) { + return PageRequest + .of( + input.getPageIndex(), + input.getPageSize(), + Sort.by(Sort.Direction.DESC, "createdTime") + ); + } + + @Transactional(rollbackFor = Exception.class) + int deleteByQuery(String sql, Class clazz); + + /** + * 鏍规嵁鍘熺敓sql鏌ヨ + */ + List query(String sql); + + /** + * 鏍规嵁鍘熺敓sql鏌ヨ,杩斿洖class瀹炰綋 + */ + List queryByClass(String sql, Class clazz); + +} + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/base/BaseRepositoryFactoryBean.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/base/BaseRepositoryFactoryBean.java" new file mode 100644 index 0000000000000000000000000000000000000000..5f9f64510f1fb73ceeb1ad4e6020c65920c6b562 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/base/BaseRepositoryFactoryBean.java" @@ -0,0 +1,68 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository.base; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.support.JpaRepositoryFactory; +import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean; +import org.springframework.data.jpa.repository.support.JpaRepositoryImplementation; +import org.springframework.data.repository.core.RepositoryInformation; +import org.springframework.data.repository.core.RepositoryMetadata; +import org.springframework.data.repository.core.support.RepositoryFactorySupport; + +import javax.persistence.EntityManager; +import java.io.Serializable; + +/** + * @author Zane + */ +public class BaseRepositoryFactoryBean, T, ID extends Serializable> + extends JpaRepositoryFactoryBean { + + /** + * Creates a new {@link JpaRepositoryFactoryBean} for the given repository interface. + * + * @param repositoryInterface must not be {@literal null}. + */ + public BaseRepositoryFactoryBean(Class repositoryInterface) { + super(repositoryInterface); + } + + @Override + protected RepositoryFactorySupport createRepositoryFactory(EntityManager em) { + return new MyRepositoryFactory(em); + } + + + private static class MyRepositoryFactory extends JpaRepositoryFactory { + + public MyRepositoryFactory(EntityManager em) { + super(em); + } + + @Override + protected JpaRepositoryImplementation getTargetRepository(RepositoryInformation information, EntityManager entityManager) { + return new BaseRepositoryImpl((Class) information.getDomainType(), entityManager); + } + + + @Override + protected Class getRepositoryBaseClass(RepositoryMetadata metadata) { + return BaseRepositoryImpl.class; + } + } +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/base/BaseRepositoryImpl.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/base/BaseRepositoryImpl.java" new file mode 100644 index 0000000000000000000000000000000000000000..34cc5f350aa2467fda6437c9f36ac1caf2f1d43c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/database/repository/base/BaseRepositoryImpl.java" @@ -0,0 +1,201 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.database.repository.base; + +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.common.web.CurrentAccount; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.data.domain.Page; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.jpa.repository.support.JpaEntityInformation; +import org.springframework.data.jpa.repository.support.SimpleJpaRepository; +import org.springframework.lang.Nullable; + +import javax.persistence.EntityManager; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.CriteriaUpdate; +import javax.persistence.criteria.Root; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * @author Zane + */ +public class BaseRepositoryImpl extends SimpleJpaRepository implements BaseRepository { + + private final EntityManager entityManager; + + public BaseRepositoryImpl(JpaEntityInformation entityInformation, EntityManager entityManager) { + super(entityInformation, entityManager); + this.entityManager = entityManager; + } + + public BaseRepositoryImpl(Class domainClass, EntityManager entityManager) { + super(domainClass, entityManager); + this.entityManager = entityManager; + } + + @Override + public T findOne(String key, Object value, Class clazz) { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery query = cb.createQuery(clazz); + Root root = query.from(clazz); + + + query + .select(root) + .where(cb.equal(root.get(key), value)); + + List list = entityManager + .createQuery(query) + .setMaxResults(1) + .getResultList(); + + if (CollectionUtils.isEmpty(list)) { + return null; + } + + return list.get(0); + } + + @Override + public long count(String key, Object value, Class clazz) { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery query = cb.createQuery(Long.class); + Root root = query.from(clazz); + + query + .select(cb.count(root)) + .where(cb.equal(root.get(key), value)); + + return entityManager + .createQuery(query) + .getSingleResult(); + } + + @Override + public int updateById(String id, String key, Object value, Class clazz) { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaUpdate update = cb.createCriteriaUpdate(clazz); + Root root = update.from(clazz); + + update + .set(root.get(key), value) + .set(root.get("updatedTime"), new Date()) + .set(root.get("updatedBy"), CurrentAccount.id()) + .where(cb.equal(root.get("id"), id)); + + return entityManager + .createQuery(update) + .executeUpdate(); + } + + @Override + public int updateById(String id, Map updateParams, Class clazz) { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaUpdate update = cb.createCriteriaUpdate(clazz); + Root root = update.from(clazz); + + for (Map.Entry entry : updateParams.entrySet()) { + update.set(entry.getKey(), entry.getValue()); + } + + update + .set(root.get("updatedTime"), new Date()) + .set(root.get("updatedBy"), CurrentAccount.id()) + .where(cb.equal(root.get("id"), id)); + + return entityManager + .createQuery(update) + .executeUpdate(); + + } + + @Override + public int updateById(String id, String key, Object value, Class clazz, boolean hasUpdatedBy) { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaUpdate update = cb.createCriteriaUpdate(clazz); + Root root = update.from(clazz); + + if (hasUpdatedBy) { + update.set(root.get("updatedBy"), CurrentAccount.id()); + } + + update + .set(root.get(key), value) + .set(root.get("updatedTime"), new Date()) + .where(cb.equal(root.get("id"), id)); + + return entityManager + .createQuery(update) + .executeUpdate(); + } + + + @Override + public PagingOutput paging(@Nullable Specification queryCondition, PagingInput pagingInput) { + + Page page = findAll(queryCondition, getDefaultPageable(pagingInput)); + List content = page.getContent(); + return PagingOutput.of( + page.getTotalElements(), + content + ); + } + + @Override + public PagingOutput paging(@Nullable Specification queryCondition, PagingInput pagingInput, Class outputClass) { + + Page page = findAll(queryCondition, getDefaultPageable(pagingInput)); + List content = page.getContent(); + return PagingOutput.of( + page.getTotalElements(), + content, + outputClass + ); + } + + @Override + public int deleteByQuery(String sql, Class clazz) { + Query query = entityManager.createNativeQuery(sql, clazz); + List list = query.getResultList(); + + for (Object o : list) { + entityManager.remove(o); + } + + return list.size(); + } + + @Override + public List query(String sql) { + Query query = entityManager.createNativeQuery(sql); + return query.getResultList(); + } + + @Override + public List queryByClass(String sql, Class clazz) { + Query query = entityManager.createNativeQuery(sql, clazz); + return query.getResultList(); + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/base/PagingInput.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/base/PagingInput.java" new file mode 100644 index 0000000000000000000000000000000000000000..0a76fd7eadfb6e7e2c89d3a34000489bd7440f3d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/base/PagingInput.java" @@ -0,0 +1,62 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.base; + +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.dto.AbstractApiInput; + +/** + * @author Zane + */ +public class PagingInput extends AbstractApiInput { + @Check(desc = "椤电爜锛0 涓虹涓椤点") + private int pageIndex = 0; + @Check(desc = "椤甸潰澶у皬锛岄粯璁 100銆") + private int pageSize = 100; + + public PagingInput() { + } + + public PagingInput(int pageIndex, int pageSize) { + this.pageIndex = pageIndex; + this.pageSize = pageSize; + } + + //region getter/setter + + public int getPageIndex() { + return pageIndex; + } + + public void setPageIndex(int pageIndex) { + if (pageIndex < 0) { + pageIndex = 0; + } + this.pageIndex = pageIndex; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/base/PagingOutput.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/base/PagingOutput.java" new file mode 100644 index 0000000000000000000000000000000000000000..9ee8d45b20cb054df1c25a767c50f449827cf39f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/base/PagingOutput.java" @@ -0,0 +1,79 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.base; + +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.web.dto.AbstractApiOutput; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author Zane + */ +public class PagingOutput extends AbstractApiOutput { + private long total; + private List list; + + public static PagingOutput of(long total, List list) { + PagingOutput output = new PagingOutput<>(); + output.total = total; + output.list = list; + return output; + } + + /** + * 鍒涘缓 PagingOutput 鐨勪究鎹锋柟娉 + *

+ * 璇ユ柟娉曚細灏嗘暟鎹簱瀹炰綋鑷姩鏄犲皠涓 DTO + */ + public static PagingOutput of(long total, List list, Class clazz) { + PagingOutput output = new PagingOutput<>(); + output.total = total; + + if (list != null) { + + output.list = list + .parallelStream() + .map(x -> ModelMapper.map(x, clazz)) + .collect(Collectors.toList()); + } + + return output; + } + + //region getter/setter + + public long getTotal() { + return total; + } + + public void setTotal(long total) { + this.total = total; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/AbstractOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/AbstractOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..a5db2f1c672277ef66a1dc67ac93d0ecd7ec5450 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/AbstractOutputModel.java" @@ -0,0 +1,129 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity; + +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.web.dto.AbstractApiOutput; +import org.apache.commons.lang3.StringUtils; + +import java.util.Date; + +/** + * @author Zane + */ +public class AbstractOutputModel extends AbstractApiOutput { + + /** + * 鍏ㄥ眬鍞竴鏍囪瘑 + */ + private String id; + /** + * 鍒涘缓浜 + */ + private String createdBy; + /** + * 鍒涘缓鏃堕棿 + */ + private Date createdTime; + /** + * 鏇存柊浜 + */ + private String updatedBy; + /** + * 鏇存柊鏃堕棿 + */ + private Date updatedTime; + + /** + * 鍒涘缓鑰呮樀绉 + */ + private String creatorNickname; + + /** + * 淇敼鑰呮樀绉 + */ + private String updaterNickname; + + //region getter/setter + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + this.creatorNickname = CacheObjects.getNickname(createdBy); + if (StringUtils.isBlank(this.creatorNickname)) { + this.creatorNickname = CacheObjects.getMemberName(createdBy); + } + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + this.updaterNickname = CacheObjects.getNickname(updatedBy); + if (StringUtils.isBlank(this.updaterNickname)) { + this.updaterNickname = CacheObjects.getMemberName(updatedBy); + } + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + public String getCreatorNickname() { + return creatorNickname; + } + + public void setCreatorNickname(String creatorNickname) { + this.creatorNickname = creatorNickname; + } + + public String getUpdaterNickname() { + return updaterNickname; + } + + public void setUpdaterNickname(String updaterNickname) { + this.updaterNickname = updaterNickname; + } + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/AccountOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/AccountOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..d93b99cbde2a8780b29aecaada645f7ddbbdeb2f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/AccountOutputModel.java" @@ -0,0 +1,140 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity; + +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.util.Masker; +import com.welab.wefe.common.web.CurrentAccount; + +/** + * @author Zane + */ +public class AccountOutputModel extends AbstractOutputModel { + + /** + * 鎵嬫満鍙 + */ + private String phoneNumber; + + /** + * 鏄电О + */ + private String nickname; + /** + * 閭 + */ + private String email; + /** + * 鏄惁鏄秴绾х鐞嗗憳;瓒呯骇绠$悊鍛橀氬父鏄涓涓垱寤哄苟鍒濆鍖栫郴缁熺殑閭d釜浜 + */ + private Boolean superAdminRole; + /** + * 鏄惁鏄鐞嗗憳;绠$悊鍛樻湁鏇村鏉冮檺锛屾瘮濡傝缃 member 鏄惁瀵瑰鍙銆 + */ + private Boolean adminRole; + /** + * 瀹℃牳鐘舵 + */ + private AuditStatus auditStatus; + /** + * 瀹℃牳鎰忚 + */ + private String auditComment; + + /** + * 鏄惁鍙敤 + */ + private Boolean enable; + + public String getEmail() { + if (!CurrentAccount.isAdmin()) { + return ""; + } else { + return Masker.maskEmail(email); + } + } + + public String getPhoneNumber() { + if (!CurrentAccount.isAdmin()) { + return ""; + } else { + return Masker.maskPhoneNumber(phoneNumber); + } + } + + //region getter/setter + + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public void setEmail(String email) { + this.email = email; + } + + public Boolean getSuperAdminRole() { + return superAdminRole; + } + + public void setSuperAdminRole(Boolean superAdminRole) { + this.superAdminRole = superAdminRole; + } + + public Boolean getAdminRole() { + return adminRole; + } + + public void setAdminRole(Boolean adminRole) { + this.adminRole = adminRole; + } + + public AuditStatus getAuditStatus() { + return auditStatus; + } + + public void setAuditStatus(AuditStatus auditStatus) { + this.auditStatus = auditStatus; + } + + public String getAuditComment() { + return auditComment; + } + + public void setAuditComment(String auditComment) { + this.auditComment = auditComment; + } + + public Boolean getEnable() { + return enable; + } + + public void setEnable(Boolean enable) { + this.enable = enable; + } + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/BlacklistOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/BlacklistOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..9e9a5cf2c3592c56de116cefb413bf281c038563 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/BlacklistOutputModel.java" @@ -0,0 +1,100 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity; + +import java.util.Date; + +/** + * @author lonnie + */ +public class BlacklistOutputModel { + + private String id; + + /** + * Member id + */ + private String memberId; + + /** + * Member name + */ + private String memberName; + + /** + * Remark + */ + private String remark; + + /** + * Creator + */ + private String createdBy; + + /** + * Created time + */ + private Date createdTime; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getMemberName() { + return memberName; + } + + public void setMemberName(String memberName) { + this.memberName = memberName; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/ChatLastAccountOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/ChatLastAccountOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..4e6d4e02491769660251aa166b2dae16f3f047ea --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/ChatLastAccountOutputModel.java" @@ -0,0 +1,138 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity; + +/** + * Recent chat account object output entity + * + * @author aaron.li + **/ +public class ChatLastAccountOutputModel extends AbstractOutputModel { + + /** + * account id + */ + private String accountId; + /** + * account name + */ + private String accountName; + + /** + * member id + */ + private String memberId; + /** + * member name + */ + private String memberName; + + /** + * liaison member id + */ + private String liaisonMemberId; + /** + * liaison member name + */ + private String liaisonMemberName; + + /** + * liaison account id + */ + private String liaisonAccountId; + /** + * liaison account name + */ + private String liaisonAccountName; + + /** + * unread num + */ + private Integer unreadNum = 0; + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + + public String getAccountName() { + return accountName; + } + + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getMemberName() { + return memberName; + } + + public void setMemberName(String memberName) { + this.memberName = memberName; + } + + public String getLiaisonMemberId() { + return liaisonMemberId; + } + + public void setLiaisonMemberId(String liaisonMemberId) { + this.liaisonMemberId = liaisonMemberId; + } + + public String getLiaisonMemberName() { + return liaisonMemberName; + } + + public void setLiaisonMemberName(String liaisonMemberName) { + this.liaisonMemberName = liaisonMemberName; + } + + public String getLiaisonAccountId() { + return liaisonAccountId; + } + + public void setLiaisonAccountId(String liaisonAccountId) { + this.liaisonAccountId = liaisonAccountId; + } + + public String getLiaisonAccountName() { + return liaisonAccountName; + } + + public void setLiaisonAccountName(String liaisonAccountName) { + this.liaisonAccountName = liaisonAccountName; + } + + public Integer getUnreadNum() { + return unreadNum; + } + + public void setUnreadNum(Integer unreadNum) { + this.unreadNum = unreadNum; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/DataIoTaskFeatureInfoOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/DataIoTaskFeatureInfoOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..b2b6269b645edf2908ef2150bec208e5b63f19b1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/DataIoTaskFeatureInfoOutputModel.java" @@ -0,0 +1,90 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity; + +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.web.dto.AbstractApiOutput; + +import java.util.List; + +/** + * DataIo缁勪欢鐨勫叆妯$壒寰佽緭鍑 + * + * @author aaron.li + **/ +public class DataIoTaskFeatureInfoOutputModel extends AbstractApiOutput { + /** + * 鎴愬憳ID + */ + private String memberId; + /** + * 鎴愬憳鍚嶇О + */ + private String memberName; + /** + * 瑙掕壊 + */ + private JobMemberRole role; + /** + * 鏁版嵁闆咺D + */ + private String dataSetId; + /** + * 閫夋嫨鍏ユā鐨勭壒寰佸垪 + */ + private List features; + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public JobMemberRole getRole() { + return role; + } + + public void setRole(JobMemberRole role) { + this.role = role; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public List getFeatures() { + return features; + } + + public void setFeatures(List features) { + this.features = features; + } + + public String getMemberName() { + return memberName; + } + + public void setMemberName(String memberName) { + this.memberName = memberName; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/DataOutputInfoOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/DataOutputInfoOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..20a45a3f2a6da0a111d59af851c6d4b2c104a65e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/DataOutputInfoOutputModel.java" @@ -0,0 +1,60 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity; + +/** + * @author aaron.li + **/ +public class DataOutputInfoOutputModel extends AbstractOutputModel { + /** + * 缁勪欢鍚嶇О + */ + private String componentName; + + /** + * 妯″瀷id + */ + private String partyModelId; + /** + * 妯″瀷鐗堟湰 + */ + private String modelVersion; + + public String getPartyModelId() { + return partyModelId; + } + + public void setPartyModelId(String partyModelId) { + this.partyModelId = partyModelId; + } + + public String getModelVersion() { + return modelVersion; + } + + public void setModelVersion(String modelVersion) { + this.modelVersion = modelVersion; + } + + public String getComponentName() { + return componentName; + } + + public void setComponentName(String componentName) { + this.componentName = componentName; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/DataSetTaskOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/DataSetTaskOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..33457b4024c18127918d36cbe0e2232407ceea2e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/DataSetTaskOutputModel.java" @@ -0,0 +1,130 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity; + +/** + * @author zane.luo + */ +public class DataSetTaskOutputModel extends AbstractOutputModel { + + /** + * 鏁版嵁闆嗗悕 + */ + private String dataSetName; + + /** + * 鏁版嵁闆唅d + */ + private String dataSetId; + + /** + * 鎬绘暟鎹鏁 + */ + private long totalRowCount = 0; + /** + * 宸插啓鍏ユ暟鎹鏁 + */ + private long addedRowCount = 0; + + /** + * 浠诲姟杩涘害鐧惧垎姣 + */ + private int progress; + + /** + * 棰勮鍓╀綑鑰楁椂 + */ + private long estimateTime; + + /** + * 涓婚敭閲嶅鏉℃暟 + */ + private long repeatIdRowCount; + /** + * 閿欒娑堟伅 + */ + private String errorMessage; + + // region getter/setter + + + public String getDataSetName() { + return dataSetName; + } + + public void setDataSetName(String dataSetName) { + this.dataSetName = dataSetName; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public long getTotalRowCount() { + return totalRowCount; + } + + public void setTotalRowCount(long totalRowCount) { + this.totalRowCount = totalRowCount; + } + + public long getAddedRowCount() { + return addedRowCount; + } + + public void setAddedRowCount(long addedRowCount) { + this.addedRowCount = addedRowCount; + } + + public int getProgress() { + return progress; + } + + public void setProgress(int progress) { + this.progress = progress; + } + + public long getEstimateTime() { + return estimateTime; + } + + public void setEstimateTime(long estimateTime) { + this.estimateTime = estimateTime; + } + + public long getRepeatIdRowCount() { + return repeatIdRowCount; + } + + public void setRepeatIdRowCount(long repeatIdRowCount) { + this.repeatIdRowCount = repeatIdRowCount; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + // endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/MemberChatOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/MemberChatOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..83ccc2a4176277f73b6fe1f23a76fdd3722e5967 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/MemberChatOutputModel.java" @@ -0,0 +1,112 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity; + +/** + * 鑱婂ぉ璇︽儏杈撳嚭瀵硅薄 + * + * @author aaron.li + **/ +public class MemberChatOutputModel extends AbstractOutputModel { + + /** + * 鍙戦佹柟鐨勮处鍙穒d + */ + private String fromAccountId; + /** + * 鍙戦佹柟鎴愬憳ID + */ + private String fromMemberId; + + /** + * 鎺ユ敹鏂圭殑璐﹀彿id + */ + private String toAccountId; + /** + * 鍙戦佹柟鎴愬憳鍚嶇О + */ + private String toMemberId; + + /** + * 鑱婂ぉ鍐呭 + */ + private String content; + /** + * 鐘舵侊細锛0锛氬凡璇汇1锛氭湭璇汇2銆佸彂閫佹垚鍔熴3銆佸彂閫佸け璐ワ級 + */ + private Integer status; + /** + * 娑堟伅ID + */ + private String messageId; + + public String getFromAccountId() { + return fromAccountId; + } + + public void setFromAccountId(String fromAccountId) { + this.fromAccountId = fromAccountId; + } + + public String getToAccountId() { + return toAccountId; + } + + public void setToAccountId(String toAccountId) { + this.toAccountId = toAccountId; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getMessageId() { + return messageId; + } + + public void setMessageId(String messageId) { + this.messageId = messageId; + } + + public String getFromMemberId() { + return fromMemberId; + } + + public void setFromMemberId(String fromMemberId) { + this.fromMemberId = fromMemberId; + } + + public String getToMemberId() { + return toMemberId; + } + + public void setToMemberId(String toMemberId) { + this.toMemberId = toMemberId; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/MemberFeatureInfoModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/MemberFeatureInfoModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..22d1cf83e70f4c1185c7c313137da8baf04d3dac --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/MemberFeatureInfoModel.java" @@ -0,0 +1,106 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity; + +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; + +import java.util.ArrayList; +import java.util.List; + +/** + * 鎴愬憳淇℃伅鍙傛暟鎺ユ敹瀹炰綋 + * + * @author lonnie + */ +public class MemberFeatureInfoModel extends MemberModel { + + @Check(name = "鐗瑰緛鍒", require = true) + private List features = new ArrayList<>(); + + private String dataSetId; + + public List getFeatures() { + return features; + } + + public void setFeatures(List features) { + this.features = features; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public static class Feature extends AbstractCheckModel { + @Check(name = "鐗瑰緛鍚") + private String name; + + private double iv; + + private double cv; + + private double missRate; + + private String method; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public double getIv() { + return iv; + } + + public void setIv(double iv) { + this.iv = iv; + } + + public double getCv() { + return cv; + } + + public void setCv(double cv) { + this.cv = cv; + } + + public double getMissRate() { + return missRate; + } + + public void setMissRate(double missRate) { + this.missRate = missRate; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/MemberModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/MemberModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..0ff7090ec04196c5d101fab50900ab20b3ea5f00 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/MemberModel.java" @@ -0,0 +1,60 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity; + +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; + +/** + * @author lonnie + */ +public class MemberModel extends AbstractCheckModel { + + @Check(name = "鎴愬憳id", require = true) + private String memberId; + + @Check(name = "鎴愬憳鍚") + private String memberName; + + @Check(name = "鎴愬憳瑙掕壊", require = true) + private JobMemberRole memberRole; + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getMemberName() { + return memberName; + } + + public void setMemberName(String memberName) { + this.memberName = memberName; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/MemberOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/MemberOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..07b65e69ced46f2072a1067b176f406d57179c7b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/MemberOutputModel.java" @@ -0,0 +1,73 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity; + +/** + * @author lonnie + */ +public class MemberOutputModel { + + private String id; + + private String name; + + private String mobile; + + private String email; + + private Boolean inBlacklist = false; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Boolean isInBlacklist() { + return inBlacklist; + } + + public void setInBlacklist(Boolean inBlacklist) { + this.inBlacklist = inBlacklist; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/MessageOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/MessageOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..8680d50fb9dab2b73b32eca0a97f2c62f0f35c87 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/MessageOutputModel.java" @@ -0,0 +1,91 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity; + +import com.welab.wefe.common.enums.MessageLevel; + +/** + * @author Zane + */ +public class MessageOutputModel extends AbstractOutputModel { + + /** + * 娑堟伅鐢熶骇鑰;鏋氫妇锛坆oard/gateway锛 + */ + private String producer; + /** + * 娑堟伅绾у埆;鏋氫妇锛坕nfo/success/error/warning锛 + */ + private MessageLevel level; + /** + * 鏍囬 + */ + private String title; + /** + * 鍐呭 + */ + private String content; + /** + * 鏈 + */ + private Boolean unread; + + //region getter/setter + + public String getProducer() { + return producer; + } + + public void setProducer(String producer) { + this.producer = producer; + } + + public MessageLevel getLevel() { + return level; + } + + public void setLevel(MessageLevel level) { + this.level = level; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Boolean getUnread() { + return unread; + } + + public void setUnread(Boolean unread) { + this.unread = unread; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/OperationLogOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/OperationLogOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..024303f5d848deec1e7900d0f8aa4f44316b3684 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/OperationLogOutputModel.java" @@ -0,0 +1,145 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity; + +import org.apache.commons.lang3.StringUtils; + +/** + * @author eval + **/ +public class OperationLogOutputModel extends AbstractOutputModel { + /** + * 璇锋眰鎺ュ彛 + */ + private String logInterface; + + /** + * 璇锋眰鎺ュ彛鍚嶇О + */ + private String interfaceName; + + /** + * 璇锋眰IP + */ + private String requestIp; + + /** + * 鎿嶄綔浜哄憳缂栧彿 + */ + private String operatorId; + + /** + * 鎿嶄綔浜哄憳鎵嬫満鍙 + */ + private String operatorPhone; + + /** + * 璇锋眰token + */ + private String token; + + /** + * 鎿嶄綔琛屼负 + */ + private String logAction; + + /** + * 璇锋眰缁撴灉缂栫爜 + */ + private int resultCode; + + /** + * 璇锋眰缁撴灉 + */ + private String resultMessage; + + /** + * 杈撳嚭鐨勬墜鏈哄彿瑕佽劚鏁 + */ + public void setOperatorPhone(String operatorPhone) { + this.operatorPhone = StringUtils.overlay(operatorPhone, "****", 3, 7); + } + + + public String getLogInterface() { + return logInterface; + } + + public void setLogInterface(String logInterface) { + this.logInterface = logInterface; + } + + public String getInterfaceName() { + return interfaceName; + } + + public void setInterfaceName(String interfaceName) { + this.interfaceName = interfaceName; + } + + public String getRequestIp() { + return requestIp; + } + + public void setRequestIp(String requestIp) { + this.requestIp = requestIp; + } + + public String getOperatorId() { + return operatorId; + } + + public void setOperatorId(String operatorId) { + this.operatorId = operatorId; + } + + public String getOperatorPhone() { + return operatorPhone; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public String getLogAction() { + return logAction; + } + + public void setLogAction(String logAction) { + this.logAction = logAction; + } + + public int getResultCode() { + return resultCode; + } + + public void setResultCode(int resultCode) { + this.resultCode = resultCode; + } + + public String getResultMessage() { + return resultMessage; + } + + public void setResultMessage(String resultMessage) { + this.resultMessage = resultMessage; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/ProjectDataSetInput.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/ProjectDataSetInput.java" new file mode 100644 index 0000000000000000000000000000000000000000..d0185a3ef3a441396a1a8eae21977f639965847b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/ProjectDataSetInput.java" @@ -0,0 +1,64 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity; + +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; + +/** + * @author zane.luo + */ +public class ProjectDataSetInput extends AbstractCheckModel { + @Check(name = "鎴愬憳Id", require = true, messageOnEmpty = "璇烽夋嫨椤圭洰鍚堜綔鏂") + private String memberId; + @Check(name = "鎴愬憳瑙掕壊", require = true, desc = "鐢变簬瀛樺湪鑷繁鍜岃嚜宸辫仈閭︾殑鎯呭喌锛屾墍浠ラ渶瑕佸姞涓婅鑹茬敤浜庡尯鍒嗐") + private JobMemberRole memberRole; + + @Check(name = "鏁版嵁闆 Id", require = true) + private String dataSetId; + + //region getter/setter + + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/ProjectMemberAuditOutput.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/ProjectMemberAuditOutput.java" new file mode 100644 index 0000000000000000000000000000000000000000..343ceae425497862047155493d37fbdc4ee59e87 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/ProjectMemberAuditOutput.java" @@ -0,0 +1,98 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity; + +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.AuditStatus; + +/** + * @author zane.luo + */ +public class ProjectMemberAuditOutput extends AbstractOutputModel { + /** + * 鎵灞為」鐩 Id 椤圭洰涓婚敭 + */ + private String projectId; + + /** + * 鎴愬憳 Id + */ + private String memberId; + + /** + * 瀹℃牳浜 + */ + private String auditorId; + + /** + * 瀹℃牳缁撴灉;鏋氫妇鍊硷紙adopt/disagree锛 + */ + private AuditStatus auditResult; + /** + * 瀹℃牳鎰忚 + */ + private String auditComment; + + public String getAuditorName() { + return CacheObjects.getMemberName(auditorId); + } + + //region getter/setter + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getAuditorId() { + return auditorId; + } + + public void setAuditorId(String auditorId) { + this.auditorId = auditorId; + } + + public AuditStatus getAuditResult() { + return auditResult; + } + + public void setAuditResult(AuditStatus auditResult) { + this.auditResult = auditResult; + } + + public String getAuditComment() { + return auditComment; + } + + public void setAuditComment(String auditComment) { + this.auditComment = auditComment; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/ProjectMemberInput.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/ProjectMemberInput.java" new file mode 100644 index 0000000000000000000000000000000000000000..90defb9e693dfa15fb7fa894b5227d97178684e8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/ProjectMemberInput.java" @@ -0,0 +1,66 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity; + +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import com.welab.wefe.common.fieldvalidate.annotation.Check; + +import java.util.List; + +/** + * @author zane.luo + */ +public class ProjectMemberInput extends AbstractCheckModel { + @Check(name = "鎴愬憳Id", require = true, messageOnEmpty = "璇烽夋嫨椤圭洰鍚堜綔鏂") + private String memberId; + @Check(name = "鎴愬憳瑙掕壊", hiddenForFrontEnd = true) + private JobMemberRole memberRole; + + @Check(name = "鏁版嵁闆嗗垪琛") + private List dataSetList; + + + //region getter/setter + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + public List getDataSetList() { + return dataSetList; + } + + public void setDataSetList(List dataSetList) { + this.dataSetList = dataSetList; + } + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/component/ComponentOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/component/ComponentOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..df528cccfa6217be81bcf2e5bc8f8695b4f7e630 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/component/ComponentOutputModel.java" @@ -0,0 +1,72 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.component; + +/** + * @author aaron.li + **/ +public class ComponentOutputModel { + /** + * 缁勪欢鍞竴鏍囪瘑 + */ + private String id; + /** + * 缁勪欢涓枃鍚嶇О + */ + private String name; + /** + * 鎻忚堪 + */ + private String desc; + + public ComponentOutputModel(String id, String name, String desc) { + this.id = id; + this.name = name; + this.desc = desc; + } + + //region getter/setter + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/data_set/DataSetColumnInputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/data_set/DataSetColumnInputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..9817e3248ccf2a5f8348c2042eab53dea6f1a0e3 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/data_set/DataSetColumnInputModel.java" @@ -0,0 +1,69 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.data_set; + +import com.welab.wefe.common.enums.ColumnDataType; +import com.welab.wefe.common.fieldvalidate.annotation.Check; + +/** + * @author Zane + */ +public class DataSetColumnInputModel { + + /** + * 瀛楁鍚嶇О + */ + private String name; + /** + * 鏁版嵁绫诲瀷 + */ + private ColumnDataType dataType; + /** + * 娉ㄩ噴 + */ + @Check(regex = "^.{0,250}$", messageOnInvalid = "娉ㄩ噴澶暱鍟") + private String comment; + + //region getter/setter + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public ColumnDataType getDataType() { + return dataType; + } + + public void setDataType(ColumnDataType dataType) { + this.dataType = dataType; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/data_set/DataSetColumnOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/data_set/DataSetColumnOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..99d3efd2d6845d1c19b0c25c878c5c74c3e7eebf --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/data_set/DataSetColumnOutputModel.java" @@ -0,0 +1,120 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.data_set; + +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.common.enums.ColumnDataType; + +import java.util.Map; + +/** + * @author Zane + */ +public class DataSetColumnOutputModel extends AbstractOutputModel { + + /** + * 鏁版嵁闆咺d + */ + private String dataSetId; + /** + * 瀛楁搴忓彿 + */ + private Integer index; + /** + * 瀛楁鍚嶇О + */ + private String name; + /** + * 鏁版嵁绫诲瀷 + */ + private ColumnDataType dataType; + /** + * 娉ㄩ噴 + */ + private String comment; + /** + * 绌哄兼暟鎹鏁 + */ + private Long emptyRows; + /** + * 鏁板煎垎甯 + */ + private Map valueDistribution; + + + //region getter/setter + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public Integer getIndex() { + return index; + } + + public void setIndex(Integer index) { + this.index = index; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public ColumnDataType getDataType() { + return dataType; + } + + public void setDataType(ColumnDataType dataType) { + this.dataType = dataType; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public Long getEmptyRows() { + return emptyRows; + } + + public void setEmptyRows(Long emptyRows) { + this.emptyRows = emptyRows; + } + + public Map getValueDistribution() { + return valueDistribution; + } + + public void setValueDistribution(Map valueDistribution) { + this.valueDistribution = valueDistribution; + } + + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/data_set/DataSetOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/data_set/DataSetOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..32602def9accd74c3914f9625ee8e7c0d755b6e8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/data_set/DataSetOutputModel.java" @@ -0,0 +1,396 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.data_set; + +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.DataSetPublicLevel; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.StringUtil; + +import java.util.List; +import java.util.TreeMap; + +/** + * @author Zane + */ +public class DataSetOutputModel extends AbstractOutputModel { + /** + * 鏁版嵁闆嗗悕绉 + */ + private String name; + /** + * 鏍囩 + */ + private String tags; + /** + * 鎻忚堪 + */ + private String description; + /** + * 瀛樺偍绫诲瀷 + */ + private String storageType; + /** + * 鍛藉悕绌洪棿 + */ + private String namespace; + /** + * 琛ㄥ悕 + */ + private String tableName; + /** + * 鏁版嵁琛屾暟 + */ + private Long rowCount; + /** + * 涓婚敭瀛楁 + */ + private String primaryKeyColumn; + /** + * 鏁版嵁闆嗗垪鏁 + */ + private Integer columnCount; + /** + * 鏁版嵁闆嗗瓧娈靛垪琛 + */ + private String columnNameList; + /** + * 鐗瑰緛鏁伴噺 + */ + private Integer featureCount; + /** + * 鐗瑰緛鍒楄〃 + */ + private String featureNameList; + /** + * 鏄惁鍖呭惈 Y 鍊 + */ + private Boolean containsY; + /** + * y鍒楃殑鏁伴噺 + */ + private Integer yCount; + /** + * y鍒楀悕绉板垪琛 + */ + private String yNameList; + /** + * 鏁版嵁闆嗙殑鍙鎬 + */ + private DataSetPublicLevel publicLevel; + /** + * 浣跨敤娆℃暟 + */ + private Integer usageCountInJob = 0; + /** + * 浣跨敤娆℃暟 + */ + private Integer usageCountInFlow = 0; + /** + * 浣跨敤娆℃暟 + */ + private Integer usageCountInProject = 0; + /** + * 鍙鎴愬憳鍒楄〃;鍙湁鍦ㄥ垪琛ㄤ腑鐨勮仈閭︽垚鍛樻墠鍙互鐪嬪埌璇ユ暟鎹泦鐨勫熀鏈俊鎭 + */ + private String publicMemberList; + + private TreeMap publicMemberInfoList = new TreeMap<>(); + /** + * 鏉ユ簮绫诲瀷锛屾灇涓撅紙鍘熷銆佸榻愩佸垎绠憋級 + */ + private ComponentType sourceType; + + /** + * 鏉ユ簮绫诲瀷锛屾灇涓撅紙鍘熷銆佸榻愩佸垎绠憋級 + */ + private String sourceTypeCn; + + /** + * 鏉ユ簮浠诲姟id + */ + private String sourceJobId; + /** + * 鏉ユ簮娴佺▼id + */ + private String sourceFlowId; + /** + * 鏉ユ簮瀛愪换鍔d + */ + private String sourceTaskId; + + /** + * 姝d緥鏍锋湰鏁伴噺 + */ + private Long yPositiveExampleCount = 0L; + + /** + * 姝d緥鏍锋湰姣斾緥 + */ + private Double yPositiveExampleRatio = 0D; + + public List getPublicMemberList() { + if ("[\"*\"]".equals(publicMemberList) || "*".equals(publicMemberList)) { + return null; + } + return StringUtil.splitWithoutEmptyItem(publicMemberList, ","); + } + + public void setPublicMemberList(String publicMemberList) throws StatusCodeWithException { + this.publicMemberList = publicMemberList; + + for (String id : StringUtil.splitWithoutEmptyItem(publicMemberList, ",")) { + + if ("[\"*\"]".equals(id) || "*".equals(id)) { + continue; + } + + String memberName = CacheObjects.getMemberName(id); + if (memberName == null) { + CacheObjects.refreshMemberMap(); + memberName = CacheObjects.getMemberName(id); + } + + publicMemberInfoList.put(id, memberName); + } + + } + + + //region getter/setter + + public String getName() { + return name; + } + + public String getSourceTypeCn() { + return sourceTypeCn; + } + + public void setSourceTypeCn(String sourceTypeCn) { + this.sourceTypeCn = sourceTypeCn; + } + + public void setName(String name) { + this.name = name; + } + + public String getTags() { + return tags; + } + + public void setTags(String tags) { + this.tags = tags; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getStorageType() { + return storageType; + } + + public void setStorageType(String storageType) { + this.storageType = storageType; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public Long getRowCount() { + return rowCount; + } + + public void setRowCount(Long rowCount) { + this.rowCount = rowCount; + } + + public String getPrimaryKeyColumn() { + return primaryKeyColumn; + } + + public void setPrimaryKeyColumn(String primaryKeyColumn) { + this.primaryKeyColumn = primaryKeyColumn; + } + + public Integer getColumnCount() { + return columnCount; + } + + public void setColumnCount(Integer columnCount) { + this.columnCount = columnCount; + } + + public String getColumnNameList() { + return columnNameList; + } + + public void setColumnNameList(String columnNameList) { + this.columnNameList = columnNameList; + } + + public Integer getFeatureCount() { + return featureCount; + } + + public void setFeatureCount(Integer featureCount) { + this.featureCount = featureCount; + } + + public String getFeatureNameList() { + return featureNameList; + } + + public void setFeatureNameList(String featureNameList) { + this.featureNameList = featureNameList; + } + + public Boolean getContainsY() { + return containsY; + } + + public void setContainsY(Boolean containsY) { + this.containsY = containsY; + } + + public Integer getyCount() { + return yCount; + } + + public void setyCount(Integer yCount) { + this.yCount = yCount; + } + + public String getyNameList() { + return yNameList; + } + + public void setyNameList(String yNameList) { + this.yNameList = yNameList; + } + + public DataSetPublicLevel getPublicLevel() { + return publicLevel; + } + + public void setPublicLevel(DataSetPublicLevel publicLevel) { + this.publicLevel = publicLevel; + } + + public Integer getUsageCountInJob() { + return usageCountInJob; + } + + public void setUsageCountInJob(Integer usageCountInJob) { + this.usageCountInJob = usageCountInJob; + } + + public Integer getUsageCountInFlow() { + return usageCountInFlow; + } + + public void setUsageCountInFlow(Integer usageCountInFlow) { + this.usageCountInFlow = usageCountInFlow; + } + + public Integer getUsageCountInProject() { + return usageCountInProject; + } + + public void setUsageCountInProject(Integer usageCountInProject) { + this.usageCountInProject = usageCountInProject; + } + + public TreeMap getPublicMemberInfoList() { + return publicMemberInfoList; + } + + public void setPublicMemberInfoList(TreeMap publicMemberInfoList) { + this.publicMemberInfoList = publicMemberInfoList; + } + + public ComponentType getSourceType() { + return sourceType; + } + + public void setSourceType(ComponentType sourceType) { + this.sourceType = sourceType; + } + + public String getSourceJobId() { + return sourceJobId; + } + + public void setSourceJobId(String sourceJobId) { + this.sourceJobId = sourceJobId; + } + + public String getSourceFlowId() { + return sourceFlowId; + } + + public void setSourceFlowId(String sourceFlowId) { + this.sourceFlowId = sourceFlowId; + } + + public String getSourceTaskId() { + return sourceTaskId; + } + + public void setSourceTaskId(String sourceTaskId) { + this.sourceTaskId = sourceTaskId; + } + + public Long getyPositiveExampleCount() { + return yPositiveExampleCount; + } + + public void setyPositiveExampleCount(Long yPositiveExampleCount) { + this.yPositiveExampleCount = yPositiveExampleCount; + } + + public Double getyPositiveExampleRatio() { + return yPositiveExampleRatio; + } + + public void setyPositiveExampleRatio(Double yPositiveExampleRatio) { + this.yPositiveExampleRatio = yPositiveExampleRatio; + } + +//endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/JobListOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/JobListOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..590672cdb90ab91a188473b3a8e0bdbc929e144f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/JobListOutputModel.java" @@ -0,0 +1,228 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job; + +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.JobStatus; + +import java.util.Date; + +/** + * @author zane.luo + */ +public class JobListOutputModel extends AbstractOutputModel { + /** + * 鑱旈偊浠诲姟绫诲瀷锛堟í鍚/绾靛悜锛 + */ + private FederatedLearningType federatedLearningType; + /** + * 椤圭洰ID + */ + private String projectId; + /** + * 娴佺▼ID + */ + private String flowId; + /** + * 浠诲姟ID + */ + private String jobId; + /** + * 鍚嶇О + */ + private String name; + /** + * 鎴戞柟韬唤 鏋氫妇锛坧romoter/provider/arbiter锛 + */ + private JobMemberRole myRole; + /** + * 鐘舵 鏋氫妇 + */ + private JobStatus status; + /** + * 鐘舵佹洿鏂版椂闂 + */ + private Date statusUpdatedTime; + /** + * 寮濮嬫椂闂 + */ + private Date startTime; + /** + * 缁撴潫鏃堕棿 + */ + private Date finishTime; + /** + * 杩涘害 + */ + private Integer progress; + /** + * 杩涘害鏇存柊鏃堕棿 + */ + private Date progressUpdatedTime; + /** + * 娑堟伅澶囨敞 澶辫触鍘熷洜/澶囨敞 + */ + private String message; + /** + * 鏄惁鍖呭惈寤烘ā缁撴灉 + */ + private Boolean hasModelingResult; + /** + * 鏀惰棌/缃《/鏍囪 + */ + private Boolean star; + /** + * 澶囨敞 + */ + private String remark; + + + //region getter/setter + + public FederatedLearningType getFederatedLearningType() { + return federatedLearningType; + } + + public void setFederatedLearningType(FederatedLearningType federatedLearningType) { + this.federatedLearningType = federatedLearningType; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public JobMemberRole getMyRole() { + return myRole; + } + + public void setMyRole(JobMemberRole myRole) { + this.myRole = myRole; + } + + public JobStatus getStatus() { + return status; + } + + public void setStatus(JobStatus status) { + this.status = status; + } + + public Date getStatusUpdatedTime() { + return statusUpdatedTime; + } + + public void setStatusUpdatedTime(Date statusUpdatedTime) { + this.statusUpdatedTime = statusUpdatedTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getFinishTime() { + return finishTime; + } + + public void setFinishTime(Date finishTime) { + this.finishTime = finishTime; + } + + public Integer getProgress() { + return progress; + } + + public void setProgress(Integer progress) { + this.progress = progress; + } + + public Date getProgressUpdatedTime() { + return progressUpdatedTime; + } + + public void setProgressUpdatedTime(Date progressUpdatedTime) { + this.progressUpdatedTime = progressUpdatedTime; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Boolean getHasModelingResult() { + return hasModelingResult; + } + + public void setHasModelingResult(Boolean hasModelingResult) { + this.hasModelingResult = hasModelingResult; + } + + public Boolean getStar() { + return star; + } + + public void setStar(Boolean star) { + this.star = star; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/JobMemberOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/JobMemberOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..3a80c3d4f15c222b127bb445c50bc510584f7910 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/JobMemberOutputModel.java" @@ -0,0 +1,109 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job; + +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.JobMemberRole; + +/** + * @author seven.zeng + */ +public class JobMemberOutputModel extends AbstractOutputModel { + /** + * 椤圭洰Id + */ + private String projectId; + /** + * 娴佺▼Id + */ + private String flowId; + /** + * 浠诲姟Id + */ + private String jobId; + /** + * 鍦ㄤ换鍔′腑鐨勮鑹 鏋氫妇锛坧romoter/provider/arbiter锛 + */ + private JobMemberRole jobRole; + /** + * 鎴愬憳 Id + */ + private String memberId; + /** + * 鏁版嵁闆 Id + */ + private String dataSetId; + + public String getMemberName() { + return CacheObjects.getMemberName(memberId); + } + + + //region getter/setter + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public JobMemberRole getJobRole() { + return jobRole; + } + + public void setJobRole(JobMemberRole jobRole) { + this.jobRole = jobRole; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/JobOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/JobOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..35c2b95483427d0dd23ca86856b4311a4d0e1a1f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/JobOutputModel.java" @@ -0,0 +1,245 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.JobStatus; + +import java.util.Date; + +/** + * @author zane.luo + */ +public class JobOutputModel extends AbstractOutputModel { + /** + * 鑱旈偊浠诲姟绫诲瀷锛堟í鍚/绾靛悜锛 + */ + private FederatedLearningType federatedLearningType; + /** + * 椤圭洰ID + */ + private String projectId; + /** + * 娴佺▼ID + */ + private String flowId; + /** + * 浠诲姟ID + */ + private String jobId; + /** + * 鍚嶇О + */ + private String name; + /** + * 鎴戞柟韬唤 鏋氫妇锛坧romoter/provider/arbiter锛 + */ + private JobMemberRole myRole; + /** + * 鐘舵 鏋氫妇 + */ + private JobStatus status; + /** + * 鐘舵佹洿鏂版椂闂 + */ + private Date statusUpdatedTime; + /** + * 寮濮嬫椂闂 + */ + private Date startTime; + /** + * 缁撴潫鏃堕棿 + */ + private Date finishTime; + /** + * 杩涘害 + */ + private Integer progress; + /** + * 杩涘害鏇存柊鏃堕棿 + */ + private Date progressUpdatedTime; + /** + * 娑堟伅澶囨敞 澶辫触鍘熷洜/澶囨敞 + */ + private String message; + /** + * 鏈夊悜鏃犵幆鍥 + */ + private JSONObject graph; + /** + * 鏄惁鍖呭惈寤烘ā缁撴灉 + */ + private Boolean hasModelingResult; + /** + * 鏀惰棌/缃《/鏍囪 + */ + private Boolean star; + /** + * 澶囨敞 + */ + private String remark; + + public JSONObject getGraph() { + return graph; + } + + public void setGraph(String graph) { + // 灏嗗瓧绗︿覆搴忓垪鍖栦负 json 鍚庡啀杈撳嚭 + if (graph != null) { + this.graph = JSON.parseObject(graph); + } + } + + //region getter/setter + + + public FederatedLearningType getFederatedLearningType() { + return federatedLearningType; + } + + public void setFederatedLearningType(FederatedLearningType federatedLearningType) { + this.federatedLearningType = federatedLearningType; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public JobMemberRole getMyRole() { + return myRole; + } + + public void setMyRole(JobMemberRole myRole) { + this.myRole = myRole; + } + + public JobStatus getStatus() { + return status; + } + + public void setStatus(JobStatus status) { + this.status = status; + } + + public Date getStatusUpdatedTime() { + return statusUpdatedTime; + } + + public void setStatusUpdatedTime(Date statusUpdatedTime) { + this.statusUpdatedTime = statusUpdatedTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getFinishTime() { + return finishTime; + } + + public void setFinishTime(Date finishTime) { + this.finishTime = finishTime; + } + + public Integer getProgress() { + return progress; + } + + public void setProgress(Integer progress) { + this.progress = progress; + } + + public Date getProgressUpdatedTime() { + return progressUpdatedTime; + } + + public void setProgressUpdatedTime(Date progressUpdatedTime) { + this.progressUpdatedTime = progressUpdatedTime; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Boolean getHasModelingResult() { + return hasModelingResult; + } + + public void setHasModelingResult(Boolean hasModelingResult) { + this.hasModelingResult = hasModelingResult; + } + + public Boolean getStar() { + return star; + } + + public void setStar(Boolean star) { + this.star = star; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/PreviewJobNodeOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/PreviewJobNodeOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..38527680b077d9aea9c0495b6076d49248e0602e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/PreviewJobNodeOutputModel.java" @@ -0,0 +1,128 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job; + +import com.welab.wefe.common.enums.ComponentType; + +import java.util.Map; + +/** + * @author zane.luo + */ +public class PreviewJobNodeOutputModel { + /** + * 鍓嶇鐢诲竷涓殑鑺傜偣id锛岀敱鍓嶇鐢熸垚 + */ + private String nodeId; + /** + * 椤圭洰ID + */ + private String projectId; + /** + * 鐖惰妭鐐 + */ + private String parentNodeId; + /** + * 缁勪欢绫诲瀷 + */ + private ComponentType componentType; + /** + * 娣卞害 + */ + private Integer deep; + /** + * 鍦ㄤ换鍔″垪琛ㄤ腑鐨勫簭鍙凤紝濡傛灉涓 null锛岃〃绀鸿鑺傜偣涓嶄細琚墽琛屻 + */ + private Integer position; + /** + * 鏄惁瀛樺湪鍙敤鐨勫巻鍙茬紦瀛樼粨鏋 + */ + private Boolean hasCacheResult; + public Map input; + public Map output; + + /** + * 缁勪欢鍚嶇О + */ + public String getComponentName() { + if (componentType == null) { + return null; + } + return componentType.getLabel(); + } + + + //region getter/setter + + public String getNodeId() { + return nodeId; + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getParentNodeId() { + return parentNodeId; + } + + public void setParentNodeId(String parentNodeId) { + this.parentNodeId = parentNodeId; + } + + public ComponentType getComponentType() { + return componentType; + } + + public void setComponentType(ComponentType componentType) { + this.componentType = componentType; + } + + public Integer getDeep() { + return deep; + } + + public void setDeep(Integer deep) { + this.deep = deep; + } + + public Integer getPosition() { + return position; + } + + public void setPosition(Integer position) { + this.position = position; + } + + public Boolean getHasCacheResult() { + return hasCacheResult; + } + + public void setHasCacheResult(Boolean hasCacheResult) { + this.hasCacheResult = hasCacheResult; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/ProjectFlowNodeOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/ProjectFlowNodeOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..f88d6639a351c675a969e44beac2ed370d1aada6 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/ProjectFlowNodeOutputModel.java" @@ -0,0 +1,141 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.common.enums.ComponentType; + +/** + * @author zane.luo + */ +public class ProjectFlowNodeOutputModel extends AbstractOutputModel { + /** + * 鏄惁鏄捣濮嬭妭鐐 + */ + private boolean startNode; + + /** + * 鍓嶇鐢诲竷涓殑鑺傜偣id锛岀敱鍓嶇鐢熸垚 + */ + private String nodeId; + /** + * 椤圭洰ID + */ + private String projectId; + /** + * 娴佺▼ID + */ + private String flowId; + /** + * 鐖惰妭鐐 + */ + private String parentNodeIdList; + /** + * 缁勪欢绫诲瀷 + */ + private ComponentType componentType; + /** + * 缁勪欢鍙傛暟 + */ + private JSONObject params; + /** + * 鍙傛暟鐗堟湰鍙 + */ + private long paramsVersion; + + /** + * 缁勪欢鍚嶇О + */ + public String getComponentName() { + if (componentType == null) { + return null; + } + return componentType.getLabel(); + } + + + //region getter/setter + + public String getNodeId() { + return nodeId; + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getParentNodeIdList() { + return parentNodeIdList; + } + + public void setParentNodeIdList(String parentNodeIdList) { + this.parentNodeIdList = parentNodeIdList; + } + + public ComponentType getComponentType() { + return componentType; + } + + public void setComponentType(ComponentType componentType) { + this.componentType = componentType; + } + + public JSONObject getParams() { + return params; + } + + public void setParams(String params) { + if (params != null) { + this.params = JSONObject.parseObject(params); + } + } + + public long getParamsVersion() { + return paramsVersion; + } + + public void setParamsVersion(long paramsVersion) { + this.paramsVersion = paramsVersion; + } + + public boolean isStartNode() { + return startNode; + } + + public void setStartNode(boolean startNode) { + this.startNode = startNode; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/RelateDataSetOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/RelateDataSetOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..f7d30b046cb65c89d275d963f90d6d02212911c2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/RelateDataSetOutputModel.java" @@ -0,0 +1,162 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job; + +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.web.dto.AbstractApiOutput; + +/** + * @author lonnie + */ +public class RelateDataSetOutputModel extends AbstractApiOutput { + + /** + * 浠诲姟 Id + */ + private String businessId; + /** + * 鎴愬憳 Id + */ + private String memberId; + /** + * 鎴愬憳鍚嶇О + */ + private String memberName; + /** + * 鍦ㄤ换鍔′腑鐨勮鑹;鏋氫妇锛坧romoter/provider/arbiter锛 + */ + private JobMemberRole jobRole; + /** + * 鏁版嵁闆嗗悕绉 + */ + private String dataSetName; + /** + * 鏁版嵁閲 + */ + private Long dataSetRows; + /** + * 鐗瑰緛鍒 + */ + private String featureColumnList; + /** + * 涓婚敭鍒 + */ + private String primaryKeyColumn; + + /** + * 瀛楁鍒楄〃 + */ + private String columnNameList; + + /** + * 鏉ユ簮鏁版嵁闆唅d + */ + private String sourceJobId; + + /** + * 鏄惁鍖呭惈 Y 鍊 + */ + private Boolean containsY; + + public String getBusinessId() { + return businessId; + } + + public void setBusinessId(String businessId) { + this.businessId = businessId; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getMemberName() { + return memberName; + } + + public void setMemberName(String memberName) { + this.memberName = memberName; + } + + public JobMemberRole getJobRole() { + return jobRole; + } + + public void setJobRole(JobMemberRole jobRole) { + this.jobRole = jobRole; + } + + public String getDataSetName() { + return dataSetName; + } + + public void setDataSetName(String dataSetName) { + this.dataSetName = dataSetName; + } + + public Long getDataSetRows() { + return dataSetRows; + } + + public void setDataSetRows(Long dataSetRows) { + this.dataSetRows = dataSetRows; + } + + public String getFeatureColumnList() { + return featureColumnList; + } + + public void setFeatureColumnList(String featureColumnList) { + this.featureColumnList = featureColumnList; + } + + public String getPrimaryKeyColumn() { + return primaryKeyColumn; + } + + public void setPrimaryKeyColumn(String primaryKeyColumn) { + this.primaryKeyColumn = primaryKeyColumn; + } + + public String getColumnNameList() { + return columnNameList; + } + + public void setColumnNameList(String columnNameList) { + this.columnNameList = columnNameList; + } + + public String getSourceJobId() { + return sourceJobId; + } + + public void setSourceJobId(String sourceJobId) { + this.sourceJobId = sourceJobId; + } + + public Boolean getContainsY() { + return containsY; + } + + public void setContainsY(Boolean containsY) { + this.containsY = containsY; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/TaskOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/TaskOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..d5e6ab91196c6849be8c5f3585a66b724eb57ac8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/TaskOutputModel.java" @@ -0,0 +1,231 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.TaskStatus; + +import java.util.Date; + +/** + * @author seven.zeng + */ +public class TaskOutputModel extends AbstractOutputModel { + /** + * 鍚嶇О + */ + private String name; + /** + * 浠诲姟Id + */ + private String jobId; + /** + * 涓氬姟ID锛屽鏂瑰敮涓 + */ + private String taskId; + /** + * 娴佺▼鍙 + */ + private String flowId; + /** + * 浠诲姟鍦ㄦ祦绋嬩腑鐨勮妭鐐笽d + */ + private String flowNodeId; + /** + * 瀛愪换鍔$殑鐖惰妭鐐 + */ + private String parentTaskIdList; + /** + * 瀛愪换鍔′緷璧 + */ + private String dependenceList; + /** + * 瀛愪换鍔$被鍨;鏋氫妇锛圖ataIO/Intersection/HeteroLR...锛 + */ + private ComponentType taskType; + /** + * 浠诲姟conf_json + */ + private JSONObject taskConf; + /** + * 鐘舵;鏋氫妇锛坈reated/running/canceled/success/error锛 + */ + private TaskStatus status; + /** + * 寮濮嬫椂闂 + */ + private Date startTime; + /** + * 缁撴潫鏃堕棿 + */ + private Date finishTime; + /** + * 娑堟伅澶囨敞;澶辫触鍘熷洜/澶囨敞 + */ + private String message; + /** + * 鍙戠敓閿欒鐨勮缁嗗師鍥狅紝閫氬父鏄爢鏍堜俊鎭 + */ + private String errorCause; + /** + * task鎵ц椤哄簭 + */ + private Integer position; + private Integer spend; + + public void setTaskConf(String taskConf) { + if (taskConf != null) { + this.taskConf = JSON.parseObject(taskConf); + } + } + + public String getComponentName() { + return taskType.getLabel(); + } + + // region getting/setting + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getFlowNodeId() { + return flowNodeId; + } + + public void setFlowNodeId(String flowNodeId) { + this.flowNodeId = flowNodeId; + } + + public String getParentTaskIdList() { + return parentTaskIdList; + } + + public void setParentTaskIdList(String parentTaskIdList) { + this.parentTaskIdList = parentTaskIdList; + } + + public String getDependenceList() { + return dependenceList; + } + + public void setDependenceList(String dependenceList) { + this.dependenceList = dependenceList; + } + + public ComponentType getTaskType() { + return taskType; + } + + public void setTaskType(ComponentType taskType) { + this.taskType = taskType; + } + + public JSONObject getTaskConf() { + return taskConf; + } + + public TaskStatus getStatus() { + return status; + } + + public void setStatus(TaskStatus status) { + this.status = status; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getFinishTime() { + return finishTime; + } + + public void setFinishTime(Date finishTime) { + this.finishTime = finishTime; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getErrorCause() { + return errorCause; + } + + public void setErrorCause(String errorCause) { + this.errorCause = errorCause; + } + + public Integer getPosition() { + return position; + } + + public void setPosition(Integer position) { + this.position = position; + } + + public Integer getSpend() { + return spend; + } + + public void setSpend(Integer spend) { + this.spend = spend; + } + + + // endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/TaskOutputView.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/TaskOutputView.java" new file mode 100644 index 0000000000000000000000000000000000000000..aeb7d7b90c74ed93a8e338d6f815290d07b2305c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/TaskOutputView.java" @@ -0,0 +1,70 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job; + +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.board.service.util.ModelMapper; + +import java.util.List; + +/** + * @author zane.luo + */ +public class TaskOutputView extends AbstractOutputModel { + /** + * 鐢辩粍浠跺垱寤虹殑 task + */ + private TaskOutputModel task; + /** + * task 杈撳嚭鐨勭粨鏋 + */ + private List results; + + public TaskOutputView() { + } + + public TaskOutputView(TaskMySqlModel task) { + this(task, null); + } + + public TaskOutputView(TaskMySqlModel task, List results) { + this.task = ModelMapper.map(task, TaskOutputModel.class); + this.results = results; + } + + //region getter/setter + + public TaskOutputModel getTask() { + return task; + } + + public void setTask(TaskOutputModel task) { + this.task = task; + } + + public List getResults() { + return results; + } + + public void setResults(List results) { + this.results = results; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/TaskProgressOuputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/TaskProgressOuputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..df337ab9d101123f0c0a9f37eb5f44ab7ecf23bc --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/TaskProgressOuputModel.java" @@ -0,0 +1,203 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job; + +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; + +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import java.util.Date; + +/** + * @author lonnie + */ +public class TaskProgressOuputModel extends AbstractOutputModel { + + /** + * 椤圭洰id + */ + private String projectId; + + /** + * 娴佺▼鍙 + */ + private String flowId; + + /** + * 浠诲姟id + */ + private String jobId; + + /** + * 瑙掕壊 + */ + @Enumerated(EnumType.STRING) + private JobMemberRole role; + + /** + * 娴佺▼鑺傜偣id + */ + private String flowNodeId; + + /** + * 浠诲姟id + */ + private String taskId; + + /** + * 瀛愪换鍔$被鍨;鏋氫妇锛圖ataIO/Intersection/HeteroLR...锛 + */ + @Enumerated(EnumType.STRING) + private ComponentType taskType; + + /** + * 棰勮鎬诲伐绋嬮噺 + */ + private int expectWorkAmount; + + /** + * 瀹為檯鎬诲伐绋嬮噺 + */ + private int reallyWorkAmount; + + /** + * 杩涘害 + */ + private int progress; + + /** + * 杩涘害鐧惧垎姣 + */ + private double progressRate; + + /** + * updated_time - created_time锛屾绉掋 + */ + private int spend; + + /** + * 棰勮缁撴潫鏃堕棿 + */ + private Date expectEndTime; + + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public JobMemberRole getRole() { + return role; + } + + public void setRole(JobMemberRole role) { + this.role = role; + } + + public String getFlowNodeId() { + return flowNodeId; + } + + public void setFlowNodeId(String flowNodeId) { + this.flowNodeId = flowNodeId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public ComponentType getTaskType() { + return taskType; + } + + public void setTaskType(ComponentType taskType) { + this.taskType = taskType; + } + + public int getExpectWorkAmount() { + return expectWorkAmount; + } + + public void setExpectWorkAmount(int expectWorkAmount) { + this.expectWorkAmount = expectWorkAmount; + } + + public int getReallyWorkAmount() { + return reallyWorkAmount; + } + + public void setReallyWorkAmount(int reallyWorkAmount) { + this.reallyWorkAmount = reallyWorkAmount; + } + + public int getProgress() { + return progress; + } + + public void setProgress(int progress) { + this.progress = progress; + } + + public double getProgressRate() { + return progressRate; + } + + public void setProgressRate(double progressRate) { + this.progressRate = progressRate; + } + + public int getSpend() { + return spend; + } + + public void setSpend(int spend) { + this.spend = spend; + } + + public Date getExpectEndTime() { + return expectEndTime; + } + + public void setExpectEndTime(Date expectEndTime) { + this.expectEndTime = expectEndTime; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/TaskResultOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/TaskResultOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..662965d9e7270d73935a0af3d1a46f8c01ceaea5 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/TaskResultOutputModel.java" @@ -0,0 +1,252 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job; + +import java.util.Date; +import java.util.List; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.TaskStatus; +import com.welab.wefe.common.util.JObject; + +/** + * @author zane.luo + */ +public class TaskResultOutputModel extends AbstractOutputModel { + /** + * 浠诲姟Id + */ + private String jobId; + /** + * 娴佺▼Id + */ + private String flowId; + /** + * 娴佺▼鑺傜偣Id + */ + private String flowNodeId; + /** + * 瀛愪换鍔d + */ + private String taskId; + /** + * 浠诲姟鍚嶇О锛屼緥濡傦細vert_lr_0 + */ + private String name; + /** + * 缁勪欢id + */ + private ComponentType componentType; + /** + * 鎴愬憳瑙掕壊 + */ + private JobMemberRole role; + /** + * 绫诲瀷锛屼竴涓 task 浼氭湁澶氳涓嶅悓绫诲瀷鐨 result + */ + private String type; + /** + * 鎵ц缁撴灉 + */ + private JSONObject result; + /** + * 鏄惁鏄彲浠ュ鍑哄埌 serving 鐨勬ā鍨 + */ + private boolean servingModel; + + /** + * task鐨勭姸鎬 + */ + private TaskStatus status; + /** + * 寮濮嬫椂闂 + */ + private Date startTime; + /** + * 缁撴潫鏃堕棿 + */ + private Date finishTime; + /** + * 娑堟伅澶囨敞;澶辫触鍘熷洜/澶囨敞 + */ + private String message; + /** + * 鍙戠敓閿欒鐨勮缁嗗師鍥狅紝閫氬父鏄爢鏍堜俊鎭 + */ + private String errorCause; + /** + * task鎵ц椤哄簭 + */ + private Integer position; + private Integer spend; + /** + * 鍙備笌鏂 + * */ + private List members; + + public JSONObject getResult() { + return result; + } + + public void setResult(String result) { + this.result = JSON.parseObject(result); + } + + //region getter/setter + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getFlowNodeId() { + return flowNodeId; + } + + public void setFlowNodeId(String flowNodeId) { + this.flowNodeId = flowNodeId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public ComponentType getComponentType() { + return componentType; + } + + public void setComponentType(ComponentType componentType) { + this.componentType = componentType; + } + + public JobMemberRole getRole() { + return role; + } + + public void setRole(JobMemberRole role) { + this.role = role; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public boolean isServingModel() { + return servingModel; + } + + public void setServingModel(boolean servingModel) { + this.servingModel = servingModel; + } + + public TaskStatus getStatus() { + return status; + } + + public void setStatus(TaskStatus status) { + this.status = status; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getFinishTime() { + return finishTime; + } + + public void setFinishTime(Date finishTime) { + this.finishTime = finishTime; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getErrorCause() { + return errorCause; + } + + public void setErrorCause(String errorCause) { + this.errorCause = errorCause; + } + + public Integer getPosition() { + return position; + } + + public void setPosition(Integer position) { + this.position = position; + } + + public Integer getSpend() { + return spend; + } + + public void setSpend(Integer spend) { + this.spend = spend; + } + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/AbstractJobForGatewayModelingConfigOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/AbstractJobForGatewayModelingConfigOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..a3bb1b28456694e705a5b3ee7f07080bcbeda55b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/AbstractJobForGatewayModelingConfigOutputModel.java" @@ -0,0 +1,47 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job.gateway; + +import com.welab.wefe.common.enums.FederatedLearningType; + +import javax.persistence.MappedSuperclass; + +/** + * @author seven.zeng + */ +@MappedSuperclass +public class AbstractJobForGatewayModelingConfigOutputModel { + + /** + * 鑱旈偊瀛︿範妯″紡 + */ + private FederatedLearningType flType; + + //region getter/setter + + public FederatedLearningType getFlType() { + return flType; + } + + public void setFlType(FederatedLearningType flType) { + this.flType = flType; + } + + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/FlowInfoForGatewayOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/FlowInfoForGatewayOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..4da1f32d940d90449532e1910edfda257d562890 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/FlowInfoForGatewayOutputModel.java" @@ -0,0 +1,134 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job.gateway; + +import com.welab.wefe.common.enums.JobMemberRole; + +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +/** + * @author zane.luo + */ +public class FlowInfoForGatewayOutputModel { + + /** + * 椤圭洰id 闈炰富閿 + */ + private String projectId; + + /** + * 娴佺▼id 闈炰富閿 + */ + private String flowId; + + /** + * 娴佺▼鍚嶇О + */ + private String flowName; + + /** + * 娴佺▼鎻忚堪 + */ + private String flowDesc; + + /** + * 鎴戞柟韬唤;鏋氫妇锛坧romoter/provider锛 + */ + @Enumerated(EnumType.STRING) + private JobMemberRole myRole; + + /** + * 娴佺▼鍥鹃粯璁ら厤缃 + */ + private String defaultConfig; + + /** + * 娴佺▼鍥捐竟 + */ + private String edges; + + /** + * 鍒嗙粍鍒楄〃 + */ + private String combos; + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getFlowName() { + return flowName; + } + + public void setFlowName(String flowName) { + this.flowName = flowName; + } + + public String getFlowDesc() { + return flowDesc; + } + + public void setFlowDesc(String flowDesc) { + this.flowDesc = flowDesc; + } + + public JobMemberRole getMyRole() { + return myRole; + } + + public void setMyRole(JobMemberRole myRole) { + this.myRole = myRole; + } + + public String getDefaultConfig() { + return defaultConfig; + } + + public void setDefaultConfig(String defaultConfig) { + this.defaultConfig = defaultConfig; + } + + public String getEdges() { + return edges; + } + + public void setEdges(String edges) { + this.edges = edges; + } + + public String getCombos() { + return combos; + } + + public void setCombos(String combos) { + this.combos = combos; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/FlowNodeInputForGatewayOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/FlowNodeInputForGatewayOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..d46b289bd8c37bdcb31ca3c50173211481cfde15 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/FlowNodeInputForGatewayOutputModel.java" @@ -0,0 +1,63 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job.gateway; + +/** + * @author zane.luo + */ +public class FlowNodeInputForGatewayOutputModel { + + /** + * 鑺傜偣ID + */ + private String nodeId; + + /** + * 缁勪欢ID + */ + private String componentId; + + /** + * 鍏ュ弬 + */ + private String input; + + public String getNodeId() { + return nodeId; + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + public String getComponentId() { + return componentId; + } + + public void setComponentId(String componentId) { + this.componentId = componentId; + } + + public String getInput() { + return input; + } + + public void setInput(String input) { + this.input = input; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/JobForGatewayMemberOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/JobForGatewayMemberOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..c461fc50253a0fa8710eccabd4c30c4ddd971981 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/JobForGatewayMemberOutputModel.java" @@ -0,0 +1,188 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job.gateway; + +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.enums.JobMemberRole; + +/** + * @author seven.zeng + */ +public class JobForGatewayMemberOutputModel { + /** + * 鎴愬憳 Id + */ + private String memberId; + /** + * 鎴愬憳鍚嶇О + */ + private String memberName; + /** + * 鍦ㄤ换鍔′腑鐨勮鑹;鏋氫妇锛坧romoter/provider/arbiter锛 + */ + private JobMemberRole jobRole; + /** + * 鏁版嵁闆 Id + */ + private String dataSetId; + /** + * 鏁版嵁闆嗗悕绉 + */ + private String dataSetName; + /** + * 鏁版嵁閲 + */ + private Long dataSetRows; + /** + * 鐗瑰緛鍒 + */ + private String featureColumnList; + /** + * 瀛楁鍒楄〃 + */ + private String columnNameList; + /** + * 涓婚敭鍒 + */ + private String primaryKeyColumn; + /** + * 瀹℃牳缁撴灉;鏋氫妇鍊硷紙adopt/disagree锛 + */ + private AuditStatus auditResult; + /** + * 瀹℃牳鎰忚 + */ + private String auditComment; + + /** + * 鍏宠仈鐨勪换鍔d + */ + private String sourceJobId; + + /** + * 鏄惁鍖呭惈 Y 鍊 + */ + private Boolean containsY; + + // region getting/setting + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getMemberName() { + return memberName; + } + + public void setMemberName(String memberName) { + this.memberName = memberName; + } + + public JobMemberRole getJobRole() { + return jobRole; + } + + public void setJobRole(JobMemberRole jobRole) { + this.jobRole = jobRole; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public String getDataSetName() { + return dataSetName; + } + + public void setDataSetName(String dataSetName) { + this.dataSetName = dataSetName; + } + + public Long getDataSetRows() { + return dataSetRows; + } + + public void setDataSetRows(Long dataSetRows) { + this.dataSetRows = dataSetRows; + } + + public String getFeatureColumnList() { + return featureColumnList; + } + + public void setFeatureColumnList(String featureColumnList) { + this.featureColumnList = featureColumnList; + } + + public String getColumnNameList() { + return columnNameList; + } + + public void setColumnNameList(String columnNameList) { + this.columnNameList = columnNameList; + } + + public String getPrimaryKeyColumn() { + return primaryKeyColumn; + } + + public void setPrimaryKeyColumn(String primaryKeyColumn) { + this.primaryKeyColumn = primaryKeyColumn; + } + + public AuditStatus getAuditResult() { + return auditResult; + } + + public void setAuditResult(AuditStatus auditResult) { + this.auditResult = auditResult; + } + + public String getAuditComment() { + return auditComment; + } + + public void setAuditComment(String auditComment) { + this.auditComment = auditComment; + } + + public String getSourceJobId() { + return sourceJobId; + } + + public void setSourceJobId(String sourceJobId) { + this.sourceJobId = sourceJobId; + } + + public Boolean getContainsY() { + return containsY; + } + + public void setContainsY(Boolean containsY) { + this.containsY = containsY; + } + + // endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/ProjectForGatewayDataSetOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/ProjectForGatewayDataSetOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..9abd3800d9cc3068ae9414eb4210e5a9a5acd568 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/ProjectForGatewayDataSetOutputModel.java" @@ -0,0 +1,170 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job.gateway; + +import com.welab.wefe.common.enums.AuditStatus; + +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import java.util.Date; + + +/** + * @author zane.luo + */ +public class ProjectForGatewayDataSetOutputModel { + /** + * 鎴愬憳id + */ + private String memberId; + + /** + * 鎴愬憳id + */ + private String memberName; + + /** + * 鏁版嵁闆 Id + */ + private String dataSetId; + /** + * 鏁版嵁闆嗗悕绉 + */ + private String dataSetName; + /** + * 鏁版嵁閲 + */ + private Long dataSetRows; + /** + * 鍏抽敭瀛 + */ + private String dataSetKeys; + + /** + * 鏁版嵁闆嗗垪鏁 + */ + private long dataSetColumnNum; + + /** + * 鏄惁鍖呭惈 Y 鍊 + */ + private boolean containsY; + + /** + * 鐗瑰緛鍒 + */ + private String featureColumnList; + + /** + * 鐘舵 + */ + @Enumerated(EnumType.STRING) + private AuditStatus dataSetStatus; + /** + * 鐘舵佹洿鏂版椂闂 + */ + private Date statusUpdatedTime; + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getMemberName() { + return memberName; + } + + public void setMemberName(String memberName) { + this.memberName = memberName; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public String getDataSetName() { + return dataSetName; + } + + public void setDataSetName(String dataSetName) { + this.dataSetName = dataSetName; + } + + public Long getDataSetRows() { + return dataSetRows; + } + + public void setDataSetRows(Long dataSetRows) { + this.dataSetRows = dataSetRows; + } + + public String getDataSetKeys() { + return dataSetKeys; + } + + public void setDataSetKeys(String dataSetKeys) { + this.dataSetKeys = dataSetKeys; + } + + public long getDataSetColumnNum() { + return dataSetColumnNum; + } + + public void setDataSetColumnNum(long dataSetColumnNum) { + this.dataSetColumnNum = dataSetColumnNum; + } + + public boolean isContainsY() { + return containsY; + } + + public void setContainsY(boolean containsY) { + this.containsY = containsY; + } + + public String getFeatureColumnList() { + return featureColumnList; + } + + public void setFeatureColumnList(String featureColumnList) { + this.featureColumnList = featureColumnList; + } + + public AuditStatus getDataSetStatus() { + return dataSetStatus; + } + + public void setDataSetStatus(AuditStatus dataSetStatus) { + this.dataSetStatus = dataSetStatus; + } + + public Date getStatusUpdatedTime() { + return statusUpdatedTime; + } + + public void setStatusUpdatedTime(Date statusUpdatedTime) { + this.statusUpdatedTime = statusUpdatedTime; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/ProjectForGatewayMemberOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/ProjectForGatewayMemberOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..6fe64a9da6f66fd960aae9b0bcc399db37b888c8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/ProjectForGatewayMemberOutputModel.java" @@ -0,0 +1,95 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job.gateway; + +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.enums.JobMemberRole; + +import javax.persistence.EnumType; +import javax.persistence.Enumerated; + +/** + * @author zane.luo + */ +public class ProjectForGatewayMemberOutputModel { + + /** + * 鎴愬憳 Id + */ + private String memberId; + /** + * 鎴愬憳鍚嶇О + */ + private String memberName; + + /** + * 鍦ㄤ换鍔′腑鐨勮鑹;鏋氫妇锛坧romoter/provider/arbiter锛 + */ + @Enumerated(EnumType.STRING) + private JobMemberRole memberRole; + + /** + * 瀹℃牳缁撴灉;鏋氫妇鍊硷紙adopt/disagree锛 + */ + @Enumerated(EnumType.STRING) + private AuditStatus auditResult; + /** + * 瀹℃牳鎰忚 + */ + private String auditComment; + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getMemberName() { + return memberName; + } + + public void setMemberName(String memberName) { + this.memberName = memberName; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + public AuditStatus getAuditResult() { + return auditResult; + } + + public void setAuditResult(AuditStatus auditResult) { + this.auditResult = auditResult; + } + + public String getAuditComment() { + return auditComment; + } + + public void setAuditComment(String auditComment) { + this.auditComment = auditComment; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/ProjectForGatewayOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/ProjectForGatewayOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..f55163e8be304d1dbe4071797afc0c358a0a81cc --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/job/gateway/ProjectForGatewayOutputModel.java" @@ -0,0 +1,105 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.job.gateway; + +import com.welab.wefe.common.enums.JobMemberRole; + +import java.util.List; + +/** + * @author zane.luo + */ +public class ProjectForGatewayOutputModel { + + /** + * 椤圭洰ID锛岄潪涓婚敭 + */ + private String projectId; + /** + * 鍚嶇О + */ + private String name; + + /** + * 鎻忚堪 + */ + private String projectDesc; + + /** + * 鍚堜綔鏂 + */ + private List memberList; + + /** + * 鍚堜綔鏂规暟鎹泦 + */ + private List dataSetList; + + /** + * 瑙掕壊 + */ + private JobMemberRole myRole; + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getProjectDesc() { + return projectDesc; + } + + public void setProjectDesc(String projectDesc) { + this.projectDesc = projectDesc; + } + + public List getMemberList() { + return memberList; + } + + public void setMemberList(List memberList) { + this.memberList = memberList; + } + + public JobMemberRole getMyRole() { + return myRole; + } + + public void setMyRole(JobMemberRole myRole) { + this.myRole = myRole; + } + + public List getDataSetList() { + return dataSetList; + } + + public void setDataSetList(List dataSetList) { + this.dataSetList = dataSetList; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/modeling_config/AbstractModelingConfigOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/modeling_config/AbstractModelingConfigOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..bca3dbaed032c298db979520d2b80588eee18f2a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/modeling_config/AbstractModelingConfigOutputModel.java" @@ -0,0 +1,70 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.modeling_config; + +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.common.enums.FederatedLearningType; + +/** + * @author zane.luo + */ +public class AbstractModelingConfigOutputModel extends AbstractOutputModel { + + /** + * 閰嶇疆鍚嶇О + */ + private String name; + /** + * 鑱旈偊瀛︿範妯″紡 + */ + private FederatedLearningType flType; + + /** + * 鏄惁宸插垹闄 + */ + private Boolean deleted = false; + + //region getter/setter + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public FederatedLearningType getFlType() { + return flType; + } + + public void setFlType(FederatedLearningType flType) { + this.flType = flType; + } + + public Boolean getDeleted() { + return deleted; + } + + public void setDeleted(Boolean deleted) { + this.deleted = deleted; + } + + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/modeling_config/ModelingConfigLogisticRegressionOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/modeling_config/ModelingConfigLogisticRegressionOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..419cce0a811b5d2f391613afdc3de3b7935d88dc --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/modeling_config/ModelingConfigLogisticRegressionOutputModel.java" @@ -0,0 +1,256 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.modeling_config; + +/** + * 妯″瀷閰嶇疆路閫昏緫鍥炲綊 + * + * @author Zane + */ +public class ModelingConfigLogisticRegressionOutputModel extends AbstractModelingConfigOutputModel { + /** + * 妯″瀷鍒濆鍖栨柟寮 + */ + private String initParam_InitMethod; + /** + * 鏄惁闇瑕佸亸缃郴鏁 + */ + private Boolean initParam_FitIntercept; + /** + * 鎯╃綒鏂瑰紡 + */ + private String penalty; + /** + * 鏀舵暃瀹瑰繊搴 + */ + private Double tol; + /** + * 鎯╃綒椤圭郴鏁 + */ + private Double alpha; + /** + * 浼樺寲绠楁硶 + */ + private String optimizer; + /** + * 鎵归噺澶у皬 + */ + private Integer batchSize; + /** + * 瀛︿範鐜 + */ + private Double learningRate; + /** + * 鏈澶ц凯浠f鏁 + */ + private Integer maxIter; + /** + * 鍒ゆ柇鏀舵暃鎬т笌鍚︾殑鏂规硶 + */ + private String earlyStop; + /** + * 鍚屾佸姞瀵嗘柟娉 + */ + private String encryptParam_Method; + /** + * 鍦↘Fold涓娇鐢ㄥ垎鍓茬澶у皬 + */ + private Integer cvParam_NSplits; + /** + * 鍦↘Fold涔嬪墠鏄惁杩涜娲楃墝 + */ + private Boolean cvParam_Shuffle; + /** + * 鏄惁闇瑕佽繘琛屾妯″潡 + */ + private Boolean cvParam_NeedCv; + /** + * 瀛︿範閫熺巼鐨勮“鍑忕巼 + */ + private Double decay; + /** + * 琛板噺鐜囨槸鍚﹀紑骞虫柟 + */ + private Boolean decaySqrt; + /** + * 澶氬垎绫荤瓥鐣;鏋氫妇锛坥vr/ovo锛 + */ + private String multiClass; + /** + * 楠岃瘉棰戞 + */ + private Integer validationFreqs; + /** + * 鎻愬墠缁撴潫鐨勮凯浠f鏁 + */ + private Integer earlyStoppingRounds; + + //region getter/setter + + public String getInitParam_InitMethod() { + return initParam_InitMethod; + } + + public void setInitParam_InitMethod(String initParam_InitMethod) { + this.initParam_InitMethod = initParam_InitMethod; + } + + public Boolean getInitParam_FitIntercept() { + return initParam_FitIntercept; + } + + public void setInitParam_FitIntercept(Boolean initParam_FitIntercept) { + this.initParam_FitIntercept = initParam_FitIntercept; + } + + public String getPenalty() { + return penalty; + } + + public void setPenalty(String penalty) { + this.penalty = penalty; + } + + public Double getTol() { + return tol; + } + + public void setTol(Double tol) { + this.tol = tol; + } + + public Double getAlpha() { + return alpha; + } + + public void setAlpha(Double alpha) { + this.alpha = alpha; + } + + public String getOptimizer() { + return optimizer; + } + + public void setOptimizer(String optimizer) { + this.optimizer = optimizer; + } + + public Integer getBatchSize() { + return batchSize; + } + + public void setBatchSize(Integer batchSize) { + this.batchSize = batchSize; + } + + public Double getLearningRate() { + return learningRate; + } + + public void setLearningRate(Double learningRate) { + this.learningRate = learningRate; + } + + public Integer getMaxIter() { + return maxIter; + } + + public void setMaxIter(Integer maxIter) { + this.maxIter = maxIter; + } + + public String getEarlyStop() { + return earlyStop; + } + + public void setEarlyStop(String earlyStop) { + this.earlyStop = earlyStop; + } + + public String getEncryptParam_Method() { + return encryptParam_Method; + } + + public void setEncryptParam_Method(String encryptParam_Method) { + this.encryptParam_Method = encryptParam_Method; + } + + public Integer getCvParam_NSplits() { + return cvParam_NSplits; + } + + public void setCvParam_NSplits(Integer cvParam_NSplits) { + this.cvParam_NSplits = cvParam_NSplits; + } + + public Boolean getCvParam_Shuffle() { + return cvParam_Shuffle; + } + + public void setCvParam_Shuffle(Boolean cvParam_Shuffle) { + this.cvParam_Shuffle = cvParam_Shuffle; + } + + public Boolean getCvParam_NeedCv() { + return cvParam_NeedCv; + } + + public void setCvParam_NeedCv(Boolean cvParam_NeedCv) { + this.cvParam_NeedCv = cvParam_NeedCv; + } + + public Double getDecay() { + return decay; + } + + public void setDecay(Double decay) { + this.decay = decay; + } + + public Boolean getDecaySqrt() { + return decaySqrt; + } + + public void setDecaySqrt(Boolean decaySqrt) { + this.decaySqrt = decaySqrt; + } + + public String getMultiClass() { + return multiClass; + } + + public void setMultiClass(String multiClass) { + this.multiClass = multiClass; + } + + public Integer getValidationFreqs() { + return validationFreqs; + } + + public void setValidationFreqs(Integer validationFreqs) { + this.validationFreqs = validationFreqs; + } + + public Integer getEarlyStoppingRounds() { + return earlyStoppingRounds; + } + + public void setEarlyStoppingRounds(Integer earlyStoppingRounds) { + this.earlyStoppingRounds = earlyStoppingRounds; + } +//endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/modeling_config/ModelingConfigXGBoostOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/modeling_config/ModelingConfigXGBoostOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..7e96138de62b63bd9da9ec1d1422c5d0542d217f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/modeling_config/ModelingConfigXGBoostOutputModel.java" @@ -0,0 +1,293 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.modeling_config; + +/** + * 妯″瀷閰嶇疆路閫昏緫鍥炲綊 + * + * @author Zane + */ +public class ModelingConfigXGBoostOutputModel extends AbstractModelingConfigOutputModel { + /** + * 浠诲姟绫诲瀷;鏋氫妇锛堝垎绫/鍥炲綊锛 + */ + private String taskType; + /** + * 瀛︿範鐜 + */ + private Double learningRate; + /** + * 鏈澶ф爲鏁伴噺 + */ + private Integer numTrees; + /** + * 鐗瑰緛闅忔満閲囨牱姣旂巼 + */ + private Double subsampleFeatureRate; + /** + * n娆¤凯浠f病鍙樺寲鏄惁鍋滄 + */ + private Boolean nIterNoChange; + /** + * 鏀舵暃闃鍊 + */ + private Double tol; + /** + * 鏈澶ф《鏁伴噺 + */ + private Integer binNum; + /** + * 鏍囧噯鍑芥暟;榛樿xgboost + */ + private String treeParam_CriterionMethod; + /** + * 鏍囧噯鍙傛暟 + */ + private String treeParam_CriterionParams; + /** + * 鏍戠殑鏈澶ф繁搴 + */ + private Integer treeParam_MaxDepth; + /** + * 鍒嗚涓涓唴閮ㄨ妭鐐(闈炲彾瀛愯妭鐐)闇瑕佺殑鏈灏忔牱鏈;榛樿2 + */ + private Integer treeParam_MinSampleSplit; + /** + * 姣忎釜鍙跺瓙鑺傜偣鍖呭惈鐨勬渶灏忔牱鏈暟 + */ + private Integer treeParam_MinLeafNode; + /** + * 鍗曚釜鎷嗗垎鐨勮杈惧埌鐨勬渶灏忓鐩 + */ + private Double treeParam_MinImpuritySplit; + /** + * 鍙媶鍒嗙殑鏈澶у苟琛屾暟閲 + */ + private Integer treeParam_MaxSplitNodes; + /** + * 鐩爣鍑芥暟 + */ + private String objectiveParam_Objective; + /** + * 瀛︿範鐩爣鍙傛暟 + */ + private String objectiveParam_Params; + /** + * 鍔犲瘑绠楁硶 + */ + private String encryptParam_Method; + + /** + * 鍦↘Fold涓娇鐢ㄥ垎鍓茬澶у皬 + */ + private Integer cvParam_NSplits; + /** + * 鍦↘Fold涔嬪墠鏄惁杩涜娲楃墝 + */ + private Boolean cvParam_Shuffle; + /** + * 鏄惁闇瑕佽繘琛屾妯″潡 + */ + private Boolean cvParam_NeedCv; + /** + * 楠岃瘉棰戞 + */ + private Integer validationFreqs; + /** + * 鎻愬墠缁撴潫鐨勮凯浠f鏁 + */ + private Integer earlyStoppingRounds; + + //region getter/setter + + public String getTaskType() { + return taskType; + } + + public void setTaskType(String taskType) { + this.taskType = taskType; + } + + public Double getLearningRate() { + return learningRate; + } + + public void setLearningRate(Double learningRate) { + this.learningRate = learningRate; + } + + public Integer getNumTrees() { + return numTrees; + } + + public void setNumTrees(Integer numTrees) { + this.numTrees = numTrees; + } + + public Double getSubsampleFeatureRate() { + return subsampleFeatureRate; + } + + public void setSubsampleFeatureRate(Double subsampleFeatureRate) { + this.subsampleFeatureRate = subsampleFeatureRate; + } + + public Boolean getnIterNoChange() { + return nIterNoChange; + } + + public void setnIterNoChange(Boolean nIterNoChange) { + this.nIterNoChange = nIterNoChange; + } + + public Double getTol() { + return tol; + } + + public void setTol(Double tol) { + this.tol = tol; + } + + public Integer getBinNum() { + return binNum; + } + + public void setBinNum(Integer binNum) { + this.binNum = binNum; + } + + public String getTreeParam_CriterionMethod() { + return treeParam_CriterionMethod; + } + + public void setTreeParam_CriterionMethod(String treeParam_CriterionMethod) { + this.treeParam_CriterionMethod = treeParam_CriterionMethod; + } + + public String getTreeParam_CriterionParams() { + return treeParam_CriterionParams; + } + + public void setTreeParam_CriterionParams(String treeParam_CriterionParams) { + this.treeParam_CriterionParams = treeParam_CriterionParams; + } + + public Integer getTreeParam_MaxDepth() { + return treeParam_MaxDepth; + } + + public void setTreeParam_MaxDepth(Integer treeParam_MaxDepth) { + this.treeParam_MaxDepth = treeParam_MaxDepth; + } + + public Integer getTreeParam_MinSampleSplit() { + return treeParam_MinSampleSplit; + } + + public void setTreeParam_MinSampleSplit(Integer treeParam_MinSampleSplit) { + this.treeParam_MinSampleSplit = treeParam_MinSampleSplit; + } + + public Integer getTreeParam_MinLeafNode() { + return treeParam_MinLeafNode; + } + + public void setTreeParam_MinLeafNode(Integer treeParam_MinLeafNode) { + this.treeParam_MinLeafNode = treeParam_MinLeafNode; + } + + public Double getTreeParam_MinImpuritySplit() { + return treeParam_MinImpuritySplit; + } + + public void setTreeParam_MinImpuritySplit(Double treeParam_MinImpuritySplit) { + this.treeParam_MinImpuritySplit = treeParam_MinImpuritySplit; + } + + public Integer getTreeParam_MaxSplitNodes() { + return treeParam_MaxSplitNodes; + } + + public void setTreeParam_MaxSplitNodes(Integer treeParam_MaxSplitNodes) { + this.treeParam_MaxSplitNodes = treeParam_MaxSplitNodes; + } + + public String getObjectiveParam_Objective() { + return objectiveParam_Objective; + } + + public void setObjectiveParam_Objective(String objectiveParam_Objective) { + this.objectiveParam_Objective = objectiveParam_Objective; + } + + public String getObjectiveParam_Params() { + return objectiveParam_Params; + } + + public void setObjectiveParam_Params(String objectiveParam_Params) { + this.objectiveParam_Params = objectiveParam_Params; + } + + public String getEncryptParam_Method() { + return encryptParam_Method; + } + + public void setEncryptParam_Method(String encryptParam_Method) { + this.encryptParam_Method = encryptParam_Method; + } + + public Integer getCvParam_NSplits() { + return cvParam_NSplits; + } + + public void setCvParam_NSplits(Integer cvParam_NSplits) { + this.cvParam_NSplits = cvParam_NSplits; + } + + public Boolean getCvParam_Shuffle() { + return cvParam_Shuffle; + } + + public void setCvParam_Shuffle(Boolean cvParam_Shuffle) { + this.cvParam_Shuffle = cvParam_Shuffle; + } + + public Boolean getCvParam_NeedCv() { + return cvParam_NeedCv; + } + + public void setCvParam_NeedCv(Boolean cvParam_NeedCv) { + this.cvParam_NeedCv = cvParam_NeedCv; + } + + public Integer getValidationFreqs() { + return validationFreqs; + } + + public void setValidationFreqs(Integer validationFreqs) { + this.validationFreqs = validationFreqs; + } + + public Integer getEarlyStoppingRounds() { + return earlyStoppingRounds; + } + + public void setEarlyStoppingRounds(Integer earlyStoppingRounds) { + this.earlyStoppingRounds = earlyStoppingRounds; + } +//endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/modeling_config/ModelingInfoOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/modeling_config/ModelingInfoOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..bbd4ab9685dc235b57c8c8f38637a234d5b03b58 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/modeling_config/ModelingInfoOutputModel.java" @@ -0,0 +1,173 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.modeling_config; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; + +/** + * @author lonnie + */ +public class ModelingInfoOutputModel extends AbstractOutputModel { + + /** + * 浠诲姟Id + */ + private String jobId; + /** + * 娴佺▼Id + */ + private String flowId; + /** + * 娴佺▼鑺傜偣Id + */ + private String flowNodeId; + /** + * 瀛愪换鍔d + */ + private String taskId; + /** + * 娴佺▼鍚嶇О + */ + private String flowName; + /** + * 浠诲姟鍚嶇О锛屼緥濡傦細vert_lr_0 + */ + private String name; + /** + * 缁勪欢绫诲瀷 + */ + private ComponentType componentType; + /** + * 缁勪欢绫诲瀷涓枃鍚 + */ + private String componentName; + /** + * 鎴愬憳瑙掕壊 + */ + private JobMemberRole role; + /** + * 绫诲瀷锛屼竴涓 task 浼氭湁澶氳涓嶅悓绫诲瀷鐨 result + */ + private String type; + /** + * 鎵ц缁撴灉 + */ + private JSONObject result; + /** + * 鏄惁鏄彲浠ュ鍑哄埌 serving 鐨勬ā鍨 + */ + private boolean servingModel; + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getFlowNodeId() { + return flowNodeId; + } + + public void setFlowNodeId(String flowNodeId) { + this.flowNodeId = flowNodeId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getFlowName() { + return flowName; + } + + public void setFlowName(String flowName) { + this.flowName = flowName; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public ComponentType getComponentType() { + return componentType; + } + + public void setComponentType(ComponentType componentType) { + this.componentType = componentType; + } + + public String getComponentName() { + return componentName; + } + + public void setComponentName(String componentName) { + this.componentName = componentName; + } + + public JobMemberRole getRole() { + return role; + } + + public void setRole(JobMemberRole role) { + this.role = role; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public JSONObject getResult() { + return result; + } + + public void setResult(JSONObject result) { + this.result = result; + } + + public boolean isServingModel() { + return servingModel; + } + + public void setServingModel(boolean servingModel) { + this.servingModel = servingModel; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/DerivedProjectDataSetOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/DerivedProjectDataSetOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..e80471ea60e83bd43f3de5f9fc5dd2d91149fabb --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/DerivedProjectDataSetOutputModel.java" @@ -0,0 +1,45 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.project; + +import com.welab.wefe.board.service.dto.vo.JobMemberWithDataSetOutputModel; + +import java.util.List; + +/** + * 琛嶇敓鏁版嵁闆 + * + * @author zane.luo + */ +public class DerivedProjectDataSetOutputModel extends ProjectDataSetOutputModel { + + private List members; + + + //region getter/setter + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectDataSetOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectDataSetOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..8a7bc9e69743695a5b2bbadad6af2bd29496beac --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectDataSetOutputModel.java" @@ -0,0 +1,151 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.project; + +import com.welab.wefe.board.service.dto.entity.data_set.DataSetOutputModel; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.enums.JobMemberRole; + +import java.util.Date; + +/** + * @author zane.luo + */ +public class ProjectDataSetOutputModel extends DataSetOutputModel { + + /** + * 椤圭洰 Id 椤圭洰涓婚敭 + */ + private String projectId; + /** + * 鎴愬憳id + */ + private String memberId; + /** + * 鎴愬憳瑙掕壊 + *

+ * 鐢变簬瀛樺湪鑷繁鍜岃嚜宸卞缓妯$殑鎯呭喌锛屾墍浠ラ渶瑕佺敤瑙掕壊鍖哄垎鏁版嵁闆嗗綊灞炪 + */ + private JobMemberRole memberRole; + /** + * 鏁版嵁闆 Id + */ + private String dataSetId; + /** + * 鐘舵 + */ + private AuditStatus auditStatus; + /** + * 瀹℃牳鎰忚 + */ + private String auditComment; + /** + * 鐘舵佹洿鏂版椂闂 + */ + private Date statusUpdatedTime; + + /** + * 鏄惁鍖呭惈 Y 鍊 + */ + private Boolean containsY; + + /** + * 鏁版嵁闆嗘槸鍚﹀凡鍒犻櫎 + */ + private boolean deleted; + + + //region getter/setter + + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + public String getAuditComment() { + return auditComment; + } + + public void setAuditComment(String auditComment) { + this.auditComment = auditComment; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getDataSetId() { + return dataSetId; + } + + public void setDataSetId(String dataSetId) { + this.dataSetId = dataSetId; + } + + public AuditStatus getAuditStatus() { + return auditStatus; + } + + public void setAuditStatus(AuditStatus auditStatus) { + this.auditStatus = auditStatus; + } + + public Date getStatusUpdatedTime() { + return statusUpdatedTime; + } + + public void setStatusUpdatedTime(Date statusUpdatedTime) { + this.statusUpdatedTime = statusUpdatedTime; + } + + @Override + public Boolean getContainsY() { + return containsY; + } + + @Override + public void setContainsY(Boolean containsY) { + this.containsY = containsY; + } + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectDetailMemberOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectDetailMemberOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..04e2376a1f33f4532bdc061f28b4881653b38707 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectDetailMemberOutputModel.java" @@ -0,0 +1,39 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.project; + +import java.util.List; + +/** + * @author zane.luo + */ +public class ProjectDetailMemberOutputModel extends ProjectMemberOutputModel { + private List dataSetList; + + //region getter/setter + + public List getDataSetList() { + return dataSetList; + } + + public void setDataSetList(List dataSetList) { + this.dataSetList = dataSetList; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectFlowDetailOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectFlowDetailOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..d5265b7a79c3e214fb10ebbff547238eb3b1cae1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectFlowDetailOutputModel.java" @@ -0,0 +1,81 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.project; + +import com.welab.wefe.board.service.dto.entity.job.ProjectFlowNodeOutputModel; + +import java.util.List; + +/** + * @author zane + */ +public class ProjectFlowDetailOutputModel extends ProjectFlowOutputModel { + private ProjectOutputModel project; + + private List paramsIsNullFlowNodes; + + private boolean isCreator; + + /** + * 琚玱ot鐨勪换鍔D + */ + private String ootJobId; + /** + * 琚玱ot鐨勬ā鍨媔d + */ + private String ootModelFlowNodeId; + + public ProjectOutputModel getProject() { + return project; + } + + public void setProject(ProjectOutputModel project) { + this.project = project; + } + + public List getParamsIsNullFlowNodes() { + return paramsIsNullFlowNodes; + } + + public void setParamsIsNullFlowNodes(List paramsIsNullFlowNodes) { + this.paramsIsNullFlowNodes = paramsIsNullFlowNodes; + } + + public boolean getIsCreator() { + return isCreator; + } + + public void setIsCreator(boolean isCreator) { + this.isCreator = isCreator; + } + + public String getOotJobId() { + return ootJobId; + } + + public void setOotJobId(String ootJobId) { + this.ootJobId = ootJobId; + } + + public String getOotModelFlowNodeId() { + return ootModelFlowNodeId; + } + + public void setOotModelFlowNodeId(String ootModelFlowNodeId) { + this.ootModelFlowNodeId = ootModelFlowNodeId; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectFlowListOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectFlowListOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..893099053aa3d9445c1ee738f25a715dba7dcf4a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectFlowListOutputModel.java" @@ -0,0 +1,192 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.project; + +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.ProjectFlowStatus; + +import java.util.Date; + +/** + * @author zane.luo + */ +public class ProjectFlowListOutputModel extends AbstractOutputModel { + /** + * 鏄惁宸茶鍒犻櫎 + */ + private Boolean deleted; + /** + * 鑱旈偊浠诲姟绫诲瀷锛堟í鍚/绾靛悜锛 + */ + private FederatedLearningType federatedLearningType; + /** + * 椤圭洰ID + */ + private String projectId; + /** + * 娴佺▼ID + */ + private String flowId; + /** + * 娴佺▼鍚嶇О + */ + private String flowName; + /** + * 娴佺▼鎻忚堪 + */ + private String flowDesc; + + /** + * 娴佺▼鐨勭姸鎬 + */ + private ProjectFlowStatus flowStatus; + private Date statusUpdatedTime; + private String message; + /** + * 鎴戞柟瑙掕壊 + */ + private JobMemberRole myRole; + /** + * 鏄惁鏄垱寤鸿 + */ + private boolean isCreator; + /** + * 浠诲姟杩涘害 + */ + private Integer jobProgress; + /** + * 鍒涘缓姝ゆ祦绋嬬殑鎴愬憳鐨処D + */ + private String creatorMemberId; + + public String getCreatorMemberName() { + return CacheObjects.getMemberName(creatorMemberId); + } + + //region getter/setter + + + public Boolean getDeleted() { + return deleted; + } + + public void setDeleted(Boolean deleted) { + this.deleted = deleted; + } + + public FederatedLearningType getFederatedLearningType() { + return federatedLearningType; + } + + public void setFederatedLearningType(FederatedLearningType federatedLearningType) { + this.federatedLearningType = federatedLearningType; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getFlowName() { + return flowName; + } + + public void setFlowName(String flowName) { + this.flowName = flowName; + } + + public String getFlowDesc() { + return flowDesc; + } + + public void setFlowDesc(String flowDesc) { + this.flowDesc = flowDesc; + } + + public ProjectFlowStatus getFlowStatus() { + return flowStatus; + } + + public void setFlowStatus(ProjectFlowStatus flowStatus) { + this.flowStatus = flowStatus; + } + + public JobMemberRole getMyRole() { + return myRole; + } + + public void setMyRole(JobMemberRole myRole) { + this.myRole = myRole; + } + + public Date getStatusUpdatedTime() { + return statusUpdatedTime; + } + + public void setStatusUpdatedTime(Date statusUpdatedTime) { + this.statusUpdatedTime = statusUpdatedTime; + } + + public Integer getJobProgress() { + return jobProgress; + } + + public void setJobProgress(Integer jobProgress) { + this.jobProgress = jobProgress; + } + + public boolean getIsCreator() { + return isCreator; + } + + public void setIsCreator(boolean isCreator) { + this.isCreator = isCreator; + } + + public String getCreatorMemberId() { + return creatorMemberId; + } + + public void setCreatorMemberId(String creatorMemberId) { + this.creatorMemberId = creatorMemberId; + } + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectFlowOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectFlowOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..a7a12d4ed783880b12804f051cac627e8fd75386 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectFlowOutputModel.java" @@ -0,0 +1,194 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.project; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.ProjectFlowStatus; + +import java.util.Date; + +/** + * @author zane.luo + */ +public class ProjectFlowOutputModel extends AbstractOutputModel { + /** + * 鏄惁宸茶鍒犻櫎 + */ + private Boolean deleted; + /** + * 鑱旈偊浠诲姟绫诲瀷锛堟í鍚/绾靛悜锛 + */ + private FederatedLearningType federatedLearningType; + /** + * 椤圭洰ID + */ + private String projectId; + /** + * 娴佺▼ID + */ + private String flowId; + /** + * 娴佺▼鍚嶇О + */ + private String flowName; + /** + * 娴佺▼鎻忚堪 + */ + private String flowDesc; + /** + * 鐢诲竷涓紪杈戠殑鍥 + */ + private JSONObject graph; + /** + * 鍒涘缓姝ゆ祦绋嬬殑鎴愬憳鐨処D + */ + private String creatorMemberId; + + /** + * 娴佺▼鐨勭姸鎬 + */ + private ProjectFlowStatus flowStatus; + private Date statusUpdatedTime; + private String message; + /** + * 鎴戞柟瑙掕壊 + */ + private JobMemberRole myRole; + + private ProjectModelingOutputModel projectModelingOutputModel; + + public void setGraph(String graph) { + // 灏嗗瓧绗︿覆搴忓垪鍖栦负 json 鍚庡啀杈撳嚭 + if (graph != null) { + this.graph = JSON.parseObject(graph); + } + } + + public String getCreatorMemberName() { + return CacheObjects.getMemberName(creatorMemberId); + } + + + //region getter/setter + + + public Boolean getDeleted() { + return deleted; + } + + public void setDeleted(Boolean deleted) { + this.deleted = deleted; + } + + public FederatedLearningType getFederatedLearningType() { + return federatedLearningType; + } + + public void setFederatedLearningType(FederatedLearningType federatedLearningType) { + this.federatedLearningType = federatedLearningType; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getFlowName() { + return flowName; + } + + public void setFlowName(String flowName) { + this.flowName = flowName; + } + + public String getFlowDesc() { + return flowDesc; + } + + public void setFlowDesc(String flowDesc) { + this.flowDesc = flowDesc; + } + + public JSONObject getGraph() { + return graph; + } + + public ProjectFlowStatus getFlowStatus() { + return flowStatus; + } + + public void setFlowStatus(ProjectFlowStatus flowStatus) { + this.flowStatus = flowStatus; + } + + public Date getStatusUpdatedTime() { + return statusUpdatedTime; + } + + public void setStatusUpdatedTime(Date statusUpdatedTime) { + this.statusUpdatedTime = statusUpdatedTime; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public JobMemberRole getMyRole() { + return myRole; + } + + public void setMyRole(JobMemberRole myRole) { + this.myRole = myRole; + } + + public ProjectModelingOutputModel getProjectModelingOutputModel() { + return projectModelingOutputModel; + } + + public void setProjectModelingOutputModel(ProjectModelingOutputModel projectModelingOutputModel) { + this.projectModelingOutputModel = projectModelingOutputModel; + } + + public String getCreatorMemberId() { + return creatorMemberId; + } + + public void setCreatorMemberId(String creatorMemberId) { + this.creatorMemberId = creatorMemberId; + } + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectFlowProgressOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectFlowProgressOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..070dabbb24fb5905b127defc64ab96052fe80207 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectFlowProgressOutputModel.java" @@ -0,0 +1,102 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.project; + +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.common.enums.ProjectFlowStatus; + +import java.util.Date; + +/** + * @author zane.luo + */ +public class ProjectFlowProgressOutputModel extends AbstractOutputModel { + /** + * 椤圭洰ID + */ + private String projectId; + /** + * 娴佺▼ID + */ + private String flowId; + + /** + * 娴佺▼鐨勭姸鎬 + */ + private ProjectFlowStatus flowStatus; + private Date statusUpdatedTime; + private String message; + /** + * 浠诲姟杩涘害 + */ + private Integer jobProgress; + + + //region getter/setter + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public ProjectFlowStatus getFlowStatus() { + return flowStatus; + } + + public void setFlowStatus(ProjectFlowStatus flowStatus) { + this.flowStatus = flowStatus; + } + + public Date getStatusUpdatedTime() { + return statusUpdatedTime; + } + + public void setStatusUpdatedTime(Date statusUpdatedTime) { + this.statusUpdatedTime = statusUpdatedTime; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getJobProgress() { + return jobProgress; + } + + public void setJobProgress(Integer jobProgress) { + this.jobProgress = jobProgress; + } + + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectMemberOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectMemberOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..cd60ff45f776412b7cbf817ed4958505efe8c0d7 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectMemberOutputModel.java" @@ -0,0 +1,181 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.project; + +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; + +/** + * @author zane.luo + */ +public class ProjectMemberOutputModel extends AbstractOutputModel { + + /** + * 閭璇锋柟鎴愬憳Id + */ + private String inviterId; + /** + * 閭璇锋柟鎴愬憳鍚嶇О + */ + private String inviterName; + /** + * 鏄惁鏄垵濮嬪寲椤圭洰鏃舵坊鍔犺繘鏉ョ殑锛堝叧绯诲埌瀹℃牳娴佺▼涓嶅悓锛 + */ + private boolean fromCreateProject; + /** + * 鎵灞為」鐩 Id 椤圭洰涓婚敭 + */ + private String projectId; + + /** + * 鎴愬憳 Id + */ + private String memberId; + + /** + * 鍦ㄤ换鍔′腑鐨勮鑹;鏋氫妇锛坧romoter/provider/arbiter锛 + */ + private JobMemberRole memberRole; + + /** + * 缁煎悎鐨勫鏍哥粨鏋 + */ + private AuditStatus auditStatus; + /** + * 鑷繁鏄惁鍚屾剰 + */ + private AuditStatus auditStatusFromMyself; + /** + * 鍏朵粬浜烘槸鍚﹀悓鎰 + */ + private AuditStatus auditStatusFromOthers; + + /** + * 瀹℃牳鎰忚 + */ + private String auditComment; + + /** + * 鏄惁宸查鍑 + */ + private boolean exited = false; + + + public void setInviterId(String inviterId) throws StatusCodeWithException { + this.inviterId = inviterId; + + // 璁剧疆鎴愬憳鍚嶇О + this.inviterName = CacheObjects.getMemberName(inviterId); + } + + public String getMemberName() { + return CacheObjects.getMemberName(memberId); + } + + //region getter/setter + + + public boolean isFromCreateProject() { + return fromCreateProject; + } + + public void setFromCreateProject(boolean fromCreateProject) { + this.fromCreateProject = fromCreateProject; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public AuditStatus getAuditStatus() { + return auditStatus; + } + + public void setAuditStatus(AuditStatus auditStatus) { + this.auditStatus = auditStatus; + } + + public AuditStatus getAuditStatusFromMyself() { + return auditStatusFromMyself; + } + + public void setAuditStatusFromMyself(AuditStatus auditStatusFromMyself) { + this.auditStatusFromMyself = auditStatusFromMyself; + } + + public AuditStatus getAuditStatusFromOthers() { + return auditStatusFromOthers; + } + + public void setAuditStatusFromOthers(AuditStatus auditStatusFromOthers) { + this.auditStatusFromOthers = auditStatusFromOthers; + } + + public String getAuditComment() { + return auditComment; + } + + public void setAuditComment(String auditComment) { + this.auditComment = auditComment; + } + + public String getInviterName() { + return inviterName; + } + + public void setInviterName(String inviterName) { + this.inviterName = inviterName; + } + + public String getInviterId() { + return inviterId; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getMemberId() { + return memberId; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + public boolean isExited() { + return exited; + } + + public void setExited(boolean exited) { + this.exited = exited; + } + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectModelingOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectModelingOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..bbdbae0c632efa995bdca7ae3f53ae6e7344c47a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectModelingOutputModel.java" @@ -0,0 +1,92 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.project; + +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.common.enums.ComponentType; + +/** + * @author lonnie + */ +public class ProjectModelingOutputModel extends AbstractOutputModel { + + /** + * 娴佺▼id + */ + private String flowId; + + /** + * job_id + */ + private String jobId; + + /** + * job鍚嶅瓧 + */ + private String jobName; + + /** + * 妯″瀷璇勪及浠诲姟id + */ + private String evaluationTaskId; + + /** + * 妯″瀷绫诲瀷 + */ + private ComponentType modelingType; + + public String getFlowId() { + return flowId; + } + + public void setFlowId(String flowId) { + this.flowId = flowId; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getJobName() { + return jobName; + } + + public void setJobName(String jobName) { + this.jobName = jobName; + } + + public String getEvaluationTaskId() { + return evaluationTaskId; + } + + public void setEvaluationTaskId(String evaluationTaskId) { + this.evaluationTaskId = evaluationTaskId; + } + + public ComponentType getModelingType() { + return modelingType; + } + + public void setModelingType(ComponentType modelingType) { + this.modelingType = modelingType; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..de26e5e0dafa9a4fa408fec662ba4df5f25fe47c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectOutputModel.java" @@ -0,0 +1,289 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.project; + +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.util.JObject; + +import java.util.Date; +import java.util.List; + +/** + * @author zane.luo + */ +public class ProjectOutputModel extends AbstractOutputModel { + + /** + * 椤圭洰ID + */ + private String projectId; + + /** + * 鍚嶇О + */ + private String name; + + /** + * 椤圭洰鎻忚堪 + */ + private String projectDesc; + + private AuditStatus auditStatus; + /** + * 鑷繁鏄惁鍚屾剰 + */ + private AuditStatus auditStatusFromMyself; + /** + * 鍏朵粬浜烘槸鍚﹀悓鎰 + */ + private AuditStatus auditStatusFromOthers; + /** + * 瀹℃牳鎰忚 + */ + private String auditComment; + + /** + * 鎴戞柟韬唤;鏋氫妇锛坧romoter/provider锛 + */ + private JobMemberRole myRole; + + /** + * 鏄惁鏄垱寤鸿 + */ + private boolean isCreator; + + /** + * 鎴戞柟鎴愬憳ID + */ + private String memberId; + + /** + * 娑堟伅澶囨敞 澶辫触鍘熷洜/澶囨敞 + */ + private String message; + + private ProjectDetailMemberOutputModel promoter; + private List providerList; + private List promoterList; + + /** + * 閫鍑洪」鐩殑鎿嶄綔鑰 + */ + private String exitedBy; + /** + * 閫鍑烘椂闂 + */ + private Date exitedTime; + + /** + * 褰撳墠鎴愬憳鏄惁閫鍑轰簡椤圭洰 + */ + private boolean isExited; + /** + * 鏄惁宸插叧闂 + */ + private boolean closed = false; + /** + * 鍏抽棴椤圭洰鐨勬搷浣滆 + */ + private String closedBy; + /** + * 鍏抽棴鏃堕棿 + */ + private Date closedTime; + private JObject flowStatusStatistics; + + public String getExitOperatorNickname() { + return CacheObjects.getNickname(exitedBy); + } + + public String getCloseOperatorNickname() { + return CacheObjects.getNickname(closedBy); + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getProjectDesc() { + return projectDesc; + } + + public void setProjectDesc(String projectDesc) { + this.projectDesc = projectDesc; + } + + public AuditStatus getAuditStatus() { + return auditStatus; + } + + public void setAuditStatus(AuditStatus auditStatus) { + this.auditStatus = auditStatus; + } + + public AuditStatus getAuditStatusFromMyself() { + return auditStatusFromMyself; + } + + public void setAuditStatusFromMyself(AuditStatus auditStatusFromMyself) { + this.auditStatusFromMyself = auditStatusFromMyself; + } + + public AuditStatus getAuditStatusFromOthers() { + return auditStatusFromOthers; + } + + public void setAuditStatusFromOthers(AuditStatus auditStatusFromOthers) { + this.auditStatusFromOthers = auditStatusFromOthers; + } + + public String getAuditComment() { + return auditComment; + } + + public void setAuditComment(String auditComment) { + this.auditComment = auditComment; + } + + public JobMemberRole getMyRole() { + return myRole; + } + + public void setMyRole(JobMemberRole myRole) { + this.myRole = myRole; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public ProjectDetailMemberOutputModel getPromoter() { + return promoter; + } + + public void setPromoter(ProjectDetailMemberOutputModel promoter) { + this.promoter = promoter; + } + + public List getProviderList() { + return providerList; + } + + public void setProviderList(List providerList) { + this.providerList = providerList; + } + + public boolean isClosed() { + return closed; + } + + public void setClosed(boolean closed) { + this.closed = closed; + } + + public JObject getFlowStatusStatistics() { + return flowStatusStatistics; + } + + public void setFlowStatusStatistics(String flowStatusStatistics) { + this.flowStatusStatistics = JObject.create(flowStatusStatistics); + } + + public List getPromoterList() { + return promoterList; + } + + public void setPromoterList(List promoterList) { + this.promoterList = promoterList; + } + + public boolean getIsCreator() { + return isCreator; + } + + public void setIsCreator(boolean isCreator) { + this.isCreator = isCreator; + } + + public String getExitedBy() { + return exitedBy; + } + + public void setExitedBy(String exitedBy) { + this.exitedBy = exitedBy; + } + + public Date getExitedTime() { + return exitedTime; + } + + public void setExitedTime(Date exitedTime) { + this.exitedTime = exitedTime; + } + + public String getClosedBy() { + return closedBy; + } + + public void setClosedBy(String closedBy) { + this.closedBy = closedBy; + } + + public Date getClosedTime() { + return closedTime; + } + + public void setClosedTime(Date closedTime) { + this.closedTime = closedTime; + } + + public boolean getIsExited() { + return isExited; + } + + public void setIsExited(boolean isExited) { + this.isExited = isExited; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectQueryOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectQueryOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..472521381ad5f0ab596dfdcc374d82ef4e81fabb --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectQueryOutputModel.java" @@ -0,0 +1,319 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.project; + +import com.welab.wefe.board.service.dto.entity.AbstractOutputModel; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.util.JObject; + +import java.util.Date; +import java.util.List; + +/** + * @author zane.luo + */ +public class ProjectQueryOutputModel extends AbstractOutputModel { + /** + * 椤圭洰ID + */ + private String projectId; + + /** + * 鍚嶇О + */ + private String name; + + /** + * 椤圭洰鎻忚堪 + */ + private String projectDesc; + + private AuditStatus auditStatus; + + /** + * 鎴戞柟韬唤;鏋氫妇锛坧romoter/provider锛 + */ + private JobMemberRole myRole; + + /** + * 鎴戞柟鎴愬憳ID + */ + private String memberId; + + /** + * 鐘舵佹洿鏂版椂闂 + */ + private Date statusUpdatedTime; + + /** + * 寮濮嬫椂闂 + */ + private Date startTime; + /** + * 缁撴潫鏃堕棿 + */ + private Date finishTime; + + /** + * 杩涘害 + */ + private Integer progress; + /** + * 杩涘害鏇存柊鏃堕棿 + */ + private Date progressUpdatedTime; + + /** + * 娑堟伅澶囨敞 澶辫触鍘熷洜/澶囨敞 + */ + private String message; + + private List memberList; + /** + * 鍙戣捣鏂笽D + */ + private String promoter; + + /** + * 鍙戣捣鏂筺ame + */ + private String promoterName; + + /** + * 閫鍑洪」鐩殑鎿嶄綔鑰 + */ + private String exitedBy; + /** + * 閫鍑烘椂闂 + */ + private Date exitedTime; + /** + * 鏄惁宸插叧闂 + */ + private boolean closed = false; + /** + * 鍏抽棴椤圭洰鐨勬搷浣滆 + */ + private String closedBy; + /** + * 鍏抽棴鏃堕棿 + */ + private Date closedTime; + + /** + * 鍚勬祦绋嬬姸鎬佺殑缁熻 + */ + private JObject flowStatusStatistics; + + /** + * 寰呭鏍告暟鎹泦鏁伴噺 + */ + private int needMeAuditDataSetCount; + + + public String getExitOperatorNickname() { + return CacheObjects.getNickname(exitedBy); + } + + public String getCloseOperatorNickname() { + return CacheObjects.getNickname(closedBy); + } + + //region getter/setter + + + public List getMemberList() { + return memberList; + } + + public void setMemberList(List memberList) { + this.memberList = memberList; + } + + public String getPromoter() { + return promoter; + } + + public void setPromoter(String promoter) { + this.promoter = promoter; + } + + public String getPromoterName() { + return promoterName; + } + + public void setPromoterName(String promoterName) { + this.promoterName = promoterName; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getProjectDesc() { + return projectDesc; + } + + public void setProjectDesc(String projectDesc) { + this.projectDesc = projectDesc; + } + + public AuditStatus getAuditStatus() { + return auditStatus; + } + + public void setAuditStatus(AuditStatus auditStatus) { + this.auditStatus = auditStatus; + } + + public JobMemberRole getMyRole() { + return myRole; + } + + public void setMyRole(JobMemberRole myRole) { + this.myRole = myRole; + } + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public Date getStatusUpdatedTime() { + return statusUpdatedTime; + } + + public void setStatusUpdatedTime(Date statusUpdatedTime) { + this.statusUpdatedTime = statusUpdatedTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getFinishTime() { + return finishTime; + } + + public void setFinishTime(Date finishTime) { + this.finishTime = finishTime; + } + + public Integer getProgress() { + return progress; + } + + public void setProgress(Integer progress) { + this.progress = progress; + } + + public Date getProgressUpdatedTime() { + return progressUpdatedTime; + } + + public void setProgressUpdatedTime(Date progressUpdatedTime) { + this.progressUpdatedTime = progressUpdatedTime; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isClosed() { + return closed; + } + + public void setClosed(boolean closed) { + this.closed = closed; + } + + public JObject getFlowStatusStatistics() { + return flowStatusStatistics; + } + + public void setFlowStatusStatistics(String flowStatusStatistics) { + this.flowStatusStatistics = JObject.create(flowStatusStatistics); + } + + public String getExitedBy() { + return exitedBy; + } + + public void setExitedBy(String exitedBy) { + this.exitedBy = exitedBy; + } + + public Date getExitedTime() { + return exitedTime; + } + + public void setExitedTime(Date exitedTime) { + this.exitedTime = exitedTime; + } + + public String getClosedBy() { + return closedBy; + } + + public void setClosedBy(String closedBy) { + this.closedBy = closedBy; + } + + public Date getClosedTime() { + return closedTime; + } + + public void setClosedTime(Date closedTime) { + this.closedTime = closedTime; + } + + public int getNeedMeAuditDataSetCount() { + return needMeAuditDataSetCount; + } + + public void setNeedMeAuditDataSetCount(int needMeAuditDataSetCount) { + this.needMeAuditDataSetCount = needMeAuditDataSetCount; + } + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectUsageDetailOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectUsageDetailOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..30cbbd9a81e01e32db266bd35556d420c6f7d1cb --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/entity/project/ProjectUsageDetailOutputModel.java" @@ -0,0 +1,52 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.entity.project; + +import com.welab.wefe.common.web.dto.AbstractApiOutput; + + +/** + * @author Jacky.jiang + */ +public class ProjectUsageDetailOutputModel extends AbstractApiOutput { + + /** + * 椤圭洰ID + */ + private String projectId; + + /** + * 鍚嶇О + */ + private String name; + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/AlertConfigModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/AlertConfigModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..d3089de1cc02b484ac683d77185578304b91204e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/AlertConfigModel.java" @@ -0,0 +1,29 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.globalconfig; + +/** + * @author zane + */ +public class AlertConfigModel { + /** + * 寮鍏筹細Job 鎵ц澶辫触鐨勯氱煡 + * 娓犻亾锛氶偖浠 + */ + public boolean emailAlertOnJobError = false; + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/BoardConfigModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/BoardConfigModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..298919cdbe1fe6229eef4ca7df8ede183940de44 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/BoardConfigModel.java" @@ -0,0 +1,31 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.globalconfig; + +/** + * @author zane.luo + */ +public class BoardConfigModel { + /*** + * Board service intranet base url + */ + public String intranetBaseUri; + /** + * 鏂版敞鍐岀殑璐﹀彿鏄惁闇瑕佺鐞嗗憳瀹℃牳 + */ + public boolean accountNeedAuditWhenRegister = true; +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/FlowConfigModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/FlowConfigModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..6fb3f2922b5700ed1b58e04fa9de1d0bc92852de --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/FlowConfigModel.java" @@ -0,0 +1,31 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.globalconfig; + +/** + * @author Zane + */ + +/** + * @author zane.luo + */ +public class FlowConfigModel { + /*** + * Flow service intranet base uri + */ + public String intranetBaseUri; +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/GatewayConfigModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/GatewayConfigModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..cfd28c0e9e58eaa15bc3a9024a9b72bcbe1c756a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/GatewayConfigModel.java" @@ -0,0 +1,36 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.globalconfig; + +/** + * @author Zane + */ + +/** + * @author zane.luo + */ +public class GatewayConfigModel { + + /*** + * Gateway service intranet address(ip:port) + */ + public String intranetBaseUri; + /** + * Gateway service ip whitelist + */ + public String ipWhiteList = "*"; +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/GlobalConfigInput.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/GlobalConfigInput.java" new file mode 100644 index 0000000000000000000000000000000000000000..b09b1542dacc53b8bd9793479ca16981c4818a99 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/GlobalConfigInput.java" @@ -0,0 +1,26 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.globalconfig; + +/** + * @author Zane + */ +public class GlobalConfigInput { + public String group; + public String name; + public String value; +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/MailServerModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/MailServerModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..a5748e36c83fd5460c70ba1fc5f5ee7eb5f46d85 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/MailServerModel.java" @@ -0,0 +1,80 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.globalconfig; + +/** + * @author Zane + */ + +/** + * @author zane.luo + */ +public class MailServerModel { + + /** + * 閭欢鏈嶅姟鍣ㄥ湴鍧 + */ + private String mailHost; + /** + * 閭欢鏈嶅姟鍣ㄧ鍙 + */ + private Integer mailPort; + /** + * 閭欢鐢ㄦ埛鍚 + */ + private String mailUsername; + /** + * 閭欢瀵嗙爜 + */ + private String mailPassword; + + // region getter/setter + + public String getMailHost() { + return mailHost; + } + + public void setMailHost(String mailHost) { + this.mailHost = mailHost; + } + + public Integer getMailPort() { + return mailPort; + } + + public void setMailPort(Integer mailPort) { + this.mailPort = mailPort; + } + + public String getMailUsername() { + return mailUsername; + } + + public void setMailUsername(String mailUsername) { + this.mailUsername = mailUsername; + } + + public String getMailPassword() { + return mailPassword; + } + + public void setMailPassword(String mailPassword) { + this.mailPassword = mailPassword; + } + + // endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/MemberInfoModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/MemberInfoModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..a1ac67100c841411a991ae16678869d303ca8efa --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/MemberInfoModel.java" @@ -0,0 +1,156 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.globalconfig; + +/** + * @author Zane + */ + +/** + * @author zane.luo + */ +public class MemberInfoModel { + + /** + * 鑱旈偊鎴愬憳 Id; + * 鍏ㄥ眬鍞竴锛岄粯璁や负uuid銆 + */ + private String memberId; + /** + * 鑱旈偊鎴愬憳鍚嶇О + */ + private String memberName; + /** + * 鑱旈偊鎴愬憳閭 + */ + private String memberEmail; + /** + * 鑱旈偊鎴愬憳鐢佃瘽 + */ + private String memberMobile; + /** + * 鑱旈偊鎴愬憳缃戝叧璁块棶鍦板潃 + */ + private String memberGatewayUri; + /** + * 鏄惁鍏佽瀵瑰鍏紑鏁版嵁闆嗗熀纭淇℃伅 + */ + private Boolean memberAllowPublicDataSet; + + /** + * 绉侀挜 + */ + private String rsaPrivateKey; + /** + * 鍏挜 + */ + private String rsaPublicKey; + + /** + * 鎴愬憳澶村儚 + */ + private String memberLogo; + + /** + * 鎴愬憳闅愯韩鐘舵 + */ + private Boolean memberHidden; + + //region getter/setter + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getMemberName() { + return memberName; + } + + public void setMemberName(String memberName) { + this.memberName = memberName; + } + + public String getMemberEmail() { + return memberEmail; + } + + public void setMemberEmail(String memberEmail) { + this.memberEmail = memberEmail; + } + + public String getMemberMobile() { + return memberMobile; + } + + public void setMemberMobile(String memberMobile) { + this.memberMobile = memberMobile; + } + + public String getMemberGatewayUri() { + return memberGatewayUri; + } + + public void setMemberGatewayUri(String memberGatewayUri) { + this.memberGatewayUri = memberGatewayUri; + } + + public Boolean getMemberAllowPublicDataSet() { + return memberAllowPublicDataSet; + } + + public void setMemberAllowPublicDataSet(Boolean memberAllowPublicDataSet) { + this.memberAllowPublicDataSet = memberAllowPublicDataSet; + } + + public String getRsaPrivateKey() { + return rsaPrivateKey; + } + + public void setRsaPrivateKey(String rsaPrivateKey) { + this.rsaPrivateKey = rsaPrivateKey; + } + + public String getRsaPublicKey() { + return rsaPublicKey; + } + + public void setRsaPublicKey(String rsaPublicKey) { + this.rsaPublicKey = rsaPublicKey; + } + + public String getMemberLogo() { + return memberLogo; + } + + public void setMemberLogo(String memberLogo) { + this.memberLogo = memberLogo; + } + + public Boolean getMemberHidden() { + return memberHidden; + } + + public void setMemberHidden(Boolean memberHidden) { + this.memberHidden = memberHidden; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/ServingConfigModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/ServingConfigModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..60f4a9b112c0267b385ccc3882c477b032f05100 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/globalconfig/ServingConfigModel.java" @@ -0,0 +1,32 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.globalconfig; + +/** + * @author Zane + */ + +/** + * @author zane.luo + */ +public class ServingConfigModel { + + /*** + * Serving service intranet address + */ + public String intranetBaseUri; +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/Env.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/Env.java" new file mode 100644 index 0000000000000000000000000000000000000000..ffd7dd7e75e7e4785d389633ed5e11eebc7a5a79 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/Env.java" @@ -0,0 +1,69 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.kernel; + +import com.welab.wefe.common.data.storage.common.DBType; +import com.welab.wefe.common.enums.JobBackendType; +import com.welab.wefe.common.enums.env.EnvName; + +/** + * @author zane.luo + */ +public class Env { + private DBType dbType; + private JobBackendType backend; + private int workMode; + private EnvName name; + + + //region getter/setter + + public DBType getDbType() { + return dbType; + } + + public void setDbType(DBType dbType) { + this.dbType = dbType; + } + + public JobBackendType getBackend() { + return backend; + } + + public void setBackend(JobBackendType backend) { + this.backend = backend; + } + + public int getWorkMode() { + return workMode; + } + + public void setWorkMode(int workMode) { + this.workMode = workMode; + } + + public EnvName getName() { + return name; + } + + public void setName(EnvName name) { + this.name = name; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/JobDataSet.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/JobDataSet.java" new file mode 100644 index 0000000000000000000000000000000000000000..52ec74d46e1b0ec12e762775ef166cbe09040464 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/JobDataSet.java" @@ -0,0 +1,40 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.kernel; + +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; + +import java.util.List; + +/** + * @author zane.luo + */ +public class JobDataSet { + public String nodeId; + public String taskId; + public ComponentType componentType; + public List members; + + public static class Member { + public String memberId; + public JobMemberRole memberRole; + public String dataSetId; + public long dataSetRows; + public long dataSetFeatures; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/KernelJob.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/KernelJob.java" new file mode 100644 index 0000000000000000000000000000000000000000..34e16965ef91617f53dc11eb290faeb7aa36b262 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/KernelJob.java" @@ -0,0 +1,98 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.kernel; + +import com.welab.wefe.common.enums.FederatedLearningModel; +import com.welab.wefe.common.enums.FederatedLearningType; + +import java.util.List; + +/** + * @author zane.luo + */ +public class KernelJob { + private FederatedLearningType federatedLearningType; + private Project project; + private Env env; + private List members; + private List dataSets; + /** + * Mixed Federation promoter_id + */ + private String mixPromoterMemberId; + private FederatedLearningModel federatedLearningMode; + + //region getter/setter + + + public FederatedLearningType getFederatedLearningType() { + return federatedLearningType; + } + + public void setFederatedLearningType(FederatedLearningType federatedLearningType) { + this.federatedLearningType = federatedLearningType; + } + + public Project getProject() { + return project; + } + + public void setProject(Project project) { + this.project = project; + } + + public Env getEnv() { + return env; + } + + public void setEnv(Env env) { + this.env = env; + } + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + public List getDataSets() { + return dataSets; + } + + public void setDataSets(List dataSets) { + this.dataSets = dataSets; + } + + public String getMixPromoterMemberId() { + return mixPromoterMemberId; + } + + public void setMixPromoterMemberId(String mixPromoterMemberId) { + this.mixPromoterMemberId = mixPromoterMemberId; + } + + public FederatedLearningModel getFederatedLearningMode() { + return federatedLearningMode; + } + + public void setFederatedLearningMode(FederatedLearningModel federatedLearningMode) { + this.federatedLearningMode = federatedLearningMode; + } + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/KernelTask.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/KernelTask.java" new file mode 100644 index 0000000000000000000000000000000000000000..53dd4f9b6fcd349969a6d540399929a691a2842b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/KernelTask.java" @@ -0,0 +1,104 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.kernel; + +import java.util.List; + +/** + * @author lonnie + */ +public class KernelTask { + + public KernelTask() { + } + + public KernelTask(List members) { + this.members = members; + } + + private List members; + + /** + * Mixed Federation promoter_id + */ + private String mixPromoterMemberId; + + /** + * Whether it is the main node of the current provider + */ + private boolean providerMaster; + /** + * The id of the current provider + */ + private String providerInnerId; + /** + * The primary node id of the current provider + */ + private String providerMasterInnerId; + /** + * Other id of the current provider, not including itself + */ + private List providerOtherInnerId; + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } + + public String getMixPromoterMemberId() { + return mixPromoterMemberId; + } + + public void setMixPromoterMemberId(String mixPromoterMemberId) { + this.mixPromoterMemberId = mixPromoterMemberId; + } + + public boolean isProviderMaster() { + return providerMaster; + } + + public void setProviderMaster(boolean providerMaster) { + this.providerMaster = providerMaster; + } + + public String getProviderInnerId() { + return providerInnerId; + } + + public void setProviderInnerId(String providerInnerId) { + this.providerInnerId = providerInnerId; + } + + public String getProviderMasterInnerId() { + return providerMasterInnerId; + } + + public void setProviderMasterInnerId(String providerMasterInnerId) { + this.providerMasterInnerId = providerMasterInnerId; + } + + public List getProviderOtherInnerId() { + return providerOtherInnerId; + } + + public void setProviderOtherInnerId(List providerOtherInnerId) { + this.providerOtherInnerId = providerOtherInnerId; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/Member.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/Member.java" new file mode 100644 index 0000000000000000000000000000000000000000..3bd6eb27efb7592a8bcd31161eb48a961a6b0eb1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/Member.java" @@ -0,0 +1,70 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.kernel; + +import com.welab.wefe.board.service.database.entity.job.JobMemberMySqlModel; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.JobMemberRole; + +/** + * @author zane.luo + */ +public class Member { + + private String memberId; + private String memberName; + private JobMemberRole memberRole; + + public Member() { + } + + public Member(JobMemberMySqlModel member) { + this.memberId = member.getMemberId(); + + this.memberName = CacheObjects.getMemberName(member.getMemberId()); + this.memberRole = member.getJobRole(); + } + + //region getter/setter + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public String getMemberName() { + return memberName; + } + + public void setMemberName(String memberName) { + this.memberName = memberName; + } + + public JobMemberRole getMemberRole() { + return memberRole; + } + + public void setMemberRole(JobMemberRole memberRole) { + this.memberRole = memberRole; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/Project.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/Project.java" new file mode 100644 index 0000000000000000000000000000000000000000..392e4d6452759d33ab27c886b68237dba3cfc507 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/Project.java" @@ -0,0 +1,37 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.kernel; + +/** + * @author zane.luo + */ +public class Project { + private String projectId; + + //region getter/setter + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/TaskConfig.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/TaskConfig.java" new file mode 100644 index 0000000000000000000000000000000000000000..04f8c10264a0d9a86791ec87e68ef25a0f5db47b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/kernel/TaskConfig.java" @@ -0,0 +1,99 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.kernel; + +import com.welab.wefe.common.enums.ComponentType; + +import java.util.Map; + +/** + * @author zane.luo + */ +public class TaskConfig { + private KernelJob job; + private ComponentType module; + + /** + * 缁勪欢鐨勮緭鍏ョ浉鍏充俊鎭 + */ + private Map input; + /** + * 缁勪欢鐨勮緭鍑虹浉鍏充俊鎭 + */ + private Map output; + + /** + * 缁勪欢鍙傛暟 + *

+ * 姝ゅ杩佸氨 kernel锛岄渶瑕佸ぇ鍐欏瓧姣嶅紑澶淬 + */ + private Map params; + + private KernelTask task; + + //region getter/setter + + public KernelJob getJob() { + return job; + } + + public void setJob(KernelJob job) { + this.job = job; + } + + public ComponentType getModule() { + return module; + } + + public void setModule(ComponentType module) { + this.module = module; + } + + public Map getInput() { + return input; + } + + public void setInput(Map input) { + this.input = input; + } + + public Map getOutput() { + return output; + } + + public void setOutput(Map output) { + this.output = output; + } + + public Map getParams() { + return params; + } + + public void setParams(Map params) { + this.params = params; + } + + public KernelTask getTask() { + return task; + } + + public void setTask(KernelTask task) { + this.task = task; + } + +//endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/union/UnionDataSetOutput.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/union/UnionDataSetOutput.java" new file mode 100644 index 0000000000000000000000000000000000000000..4ebc934167f73621181650a53ce854fe24e3bc5e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/union/UnionDataSetOutput.java" @@ -0,0 +1,139 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.union; + +import java.util.Date; +import java.util.List; + +/** + * @author zane.luo + */ +public class UnionDataSetOutput { + private String memberId; + private Date createdTime; + private Date updatedTime; + private Integer dimensionCount; + private String description; + private String tags; + private boolean containsY; + private int useCount; + private String name; + private Long sampleCount; + private String id; + private List dimensions; + + //region getter/setter + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + public Integer getDimensionCount() { + return dimensionCount; + } + + public void setDimensionCount(Integer dimensionCount) { + this.dimensionCount = dimensionCount; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getTags() { + return tags; + } + + public void setTags(String tags) { + this.tags = tags; + } + + public boolean isContainsY() { + return containsY; + } + + public void setContainsY(boolean containsY) { + this.containsY = containsY; + } + + public int getUseCount() { + return useCount; + } + + public void setUseCount(int useCount) { + this.useCount = useCount; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getSampleCount() { + return sampleCount; + } + + public void setSampleCount(Long sampleCount) { + this.sampleCount = sampleCount; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getDimensions() { + return dimensions; + } + + public void setDimensions(List dimensions) { + this.dimensions = dimensions; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/AccountInputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/AccountInputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..1626deba6f3e484735d29419b94342e283d05202 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/AccountInputModel.java" @@ -0,0 +1,76 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.vo; + +import com.welab.wefe.common.fieldvalidate.StandardFieldType; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.dto.AbstractApiInput; + +/** + * @author zane.luo + */ +public class AccountInputModel extends AbstractApiInput { + @Check(require = true, type = StandardFieldType.PhoneNumber) + private String phoneNumber; + + @Check(require = true, regex = "^.{2,15}$") + private String nickname; + + @Check(require = true, regex = "^.{6,128}$") + private String password; + + @Check(require = true, type = StandardFieldType.Email) + private String email; + + + //region getter/setter + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + //endregion + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/AuditStatusCounts.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/AuditStatusCounts.java" new file mode 100644 index 0000000000000000000000000000000000000000..e0789aba4f26df582eb218d3261478be4245dc8a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/AuditStatusCounts.java" @@ -0,0 +1,57 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.vo; + +import com.welab.wefe.common.enums.AuditStatus; + +/** + * @author zane.luo + */ +public class AuditStatusCounts { + private AuditStatus auditStatus; + private long count; + + public AuditStatusCounts() { + } + + public AuditStatusCounts(AuditStatus auditStatus, long count) { + this.auditStatus = auditStatus; + this.count = count; + } + + //region getter/setter + + + public AuditStatus getAuditStatus() { + return auditStatus; + } + + public void setAuditStatus(AuditStatus auditStatus) { + this.auditStatus = auditStatus; + } + + public long getCount() { + return count; + } + + public void setCount(long count) { + this.count = count; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/DataSetAddInputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/DataSetAddInputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..5609fe1eea96ee071685cbfc673abfbc25ace77b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/DataSetAddInputModel.java" @@ -0,0 +1,164 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.vo; + +import com.welab.wefe.board.service.constant.Config; +import com.welab.wefe.board.service.constant.DataSetAddMethod; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.Launcher; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; + +/** + * @author zane.luo + */ +public class DataSetAddInputModel extends DataSetBaseInputModel { + @Check(name = "鏁版嵁闆嗗悕绉", require = true, regex = "^.{4,30}$", messageOnInvalid = "鏁版嵁闆嗗悕绉伴暱搴︿笉鑳藉皯浜4锛屼笉鑳藉ぇ浜30") + private String name; + + @Check(name = "鍏抽敭璇", require = true, regex = "^.{1,128}$", messageOnInvalid = "鍏抽敭璇嶅お澶氫簡鍟") + private List tags; + + @Check(name = "鎻忚堪", regex = "^.{0,3072}$", messageOnInvalid = "浣犲啓鐨勬弿杩板お澶氫簡~") + private String description; + + @Check(messageOnEmpty = "璇锋寚瀹氭暟鎹泦鏂囦欢") + private String filename; + + @Check(require = true) + private DataSetAddMethod dataSetAddMethod; + + @Check(require = true, name = "鏄惁闇瑕佸幓閲") + private boolean deduplication; + + @Check(name = "鏁版嵁婧恑d") + private String dataSourceId; + + @Check(name = "sql鑴氭湰") + private String sql; + + public DataSetAddInputModel() { + } + + public DataSetAddInputModel(String dataSourceId, String sql) { + this.dataSourceId = dataSourceId; + this.sql = sql; + } + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + super.checkAndStandardize(); + + // 濡傛灉鏉ユ簮鏄暟鎹簱锛屽垯瑕佹眰dataSourceId銆乻ql涓嶈兘涓虹┖ + if (DataSetAddMethod.Database.equals(dataSetAddMethod)) { + if (StringUtils.isEmpty(dataSourceId)) { + throw new StatusCodeWithException("dataSourceId鍦ㄦ暟鎹簱涓嶅瓨鍦", StatusCode.DATA_NOT_FOUND); + } + + if (StringUtils.isEmpty(sql)) { + throw new StatusCodeWithException("璇峰~鍏ql鏌ヨ璇彞", StatusCode.PARAMETER_CAN_NOT_BE_EMPTY); + } + } else { + if (StringUtils.isEmpty(filename)) { + throw new StatusCodeWithException("璇锋寚瀹氭暟鎹泦鏂囦欢", StatusCode.PARAMETER_CAN_NOT_BE_EMPTY); + } + + // 濡傛灉鏄寚瀹氭湇鍔″櫒涓婄殑鏈湴鏂囦欢锛屽垯蹇呴』鎸囧畾閰嶇疆鏂囦欢閰嶇疆鐨勭洰褰曚笅鐨勬枃浠躲 + if (DataSetAddMethod.LocalFile.equals(dataSetAddMethod)) { + Config config = Launcher.CONTEXT.getBean(Config.class); + + if (!filename.startsWith(config.getFileUploadDir())) { + StatusCode + .PARAMETER_VALUE_INVALID + .throwException("鎮ㄦ寚瀹氱殑鏂囦欢璺緞蹇呴』浠 " + config.getFileUploadDir() + " 寮澶达紝璇锋墜鍔ㄥ皢鏁版嵁闆嗘枃浠舵嫹璐濆埌璇ョ洰褰曞悗閲嶈瘯銆"); + } + } + + } + } + + //region getter/setter + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + public DataSetAddMethod getDataSetAddMethod() { + return dataSetAddMethod; + } + + public void setDataSetAddMethod(DataSetAddMethod dataSetAddMethod) { + this.dataSetAddMethod = dataSetAddMethod; + } + + public boolean isDeduplication() { + return deduplication; + } + + public void setDeduplication(boolean deduplication) { + this.deduplication = deduplication; + } + + public String getDataSourceId() { + return dataSourceId; + } + + public void setDataSourceId(String dataSourceId) { + this.dataSourceId = dataSourceId; + } + + public String getSql() { + return sql; + } + + public void setSql(String sql) { + this.sql = sql; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/DataSetAddOutput.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/DataSetAddOutput.java" new file mode 100644 index 0000000000000000000000000000000000000000..ce4abc1a0fffb51f6d04b37c6714bdef67d4e332 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/DataSetAddOutput.java" @@ -0,0 +1,55 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.vo; + +/** + * @author Zane + */ +public class DataSetAddOutput { + private String id; + private long repeatDataCount; + + + public DataSetAddOutput() { + } + + public DataSetAddOutput(String id, int repeatDataCount) { + this.id = id; + this.repeatDataCount = repeatDataCount; + } + + + //region getter/setter + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public long getRepeatDataCount() { + return repeatDataCount; + } + + public void setRepeatDataCount(long repeatDataCount) { + this.repeatDataCount = repeatDataCount; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/DataSetBaseInputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/DataSetBaseInputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..cbe90a6cf8be65ab83f5d06521aa9ac217bbc2c9 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/DataSetBaseInputModel.java" @@ -0,0 +1,95 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.vo; + +import com.welab.wefe.board.service.dto.entity.data_set.DataSetColumnInputModel; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.ColumnDataType; +import com.welab.wefe.common.enums.DataSetPublicLevel; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.fieldvalidate.annotation.Check; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; + +/** + * @author zane.luo + */ +public class DataSetBaseInputModel extends AbstractApiInput { + @Check(name = "鍙绾у埆", require = true) + private DataSetPublicLevel publicLevel; + @Check( + name = "鍙鎴愬憳鍒楄〃", + desc = "鍙湁鍦ㄥ垪琛ㄤ腑鐨勮仈閭︽垚鍛樻墠鍙互鐪嬪埌璇ユ暟鎹泦鐨勫熀鏈俊鎭", + regex = "^.{0,3072}$", + messageOnInvalid = "浣犻夋嫨鐨 member 澶浜唦" + ) + private String publicMemberList; + @Check(require = true) + private List metadataList; + + @Override + public void checkAndStandardize() throws StatusCodeWithException { + super.checkAndStandardize(); + + if (publicLevel == DataSetPublicLevel.PublicWithMemberList && StringUtils.isEmpty(publicMemberList)) { + throw new StatusCodeWithException("璇锋寚瀹氬彲瑙佹垚鍛", StatusCode.PARAMETER_VALUE_INVALID); + } + + if (CollectionUtils.isEmpty(metadataList)) { + throw new StatusCodeWithException("璇疯缃鏁版嵁闆嗙殑鍏冩暟鎹", StatusCode.PARAMETER_VALUE_INVALID); + } + + for (DataSetColumnInputModel item : metadataList) { + if (item.getDataType() == null) { + throw new StatusCodeWithException("璇风粰瀛楁銆" + item.getName() + "銆戣缃暟鎹被鍨", StatusCode.PARAMETER_VALUE_INVALID); + } + } + } + + + // region getter/setter + + public DataSetPublicLevel getPublicLevel() { + return publicLevel; + } + + public void setPublicLevel(DataSetPublicLevel publicLevel) { + this.publicLevel = publicLevel; + } + + public String getPublicMemberList() { + return publicMemberList; + } + + public void setPublicMemberList(String publicMemberList) { + this.publicMemberList = publicMemberList; + } + + public List getMetadataList() { + return metadataList; + } + + public void setMetadataList(List metadataList) { + this.metadataList = metadataList; + } + + + // endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/JobArbiterInfo.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/JobArbiterInfo.java" new file mode 100644 index 0000000000000000000000000000000000000000..046eec2cc11c3e4583677c19f2ec0e2000e865e6 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/JobArbiterInfo.java" @@ -0,0 +1,51 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.vo; + +/** + * Save the arbiter information of the current member in a process + * + * @author winter.zou + */ +public class JobArbiterInfo { + /** + * Whether there is an arbiter + */ + private boolean hasArbiter; + + /** + * member_id of arbiter + */ + private String arbiterMemberId; + + public boolean isHasArbiter() { + return hasArbiter; + } + + public void setHasArbiter(boolean hasArbiter) { + this.hasArbiter = hasArbiter; + } + + public String getArbiterMemberId() { + return arbiterMemberId; + } + + public void setArbiterMemberId(String arbiterMemberId) { + this.arbiterMemberId = arbiterMemberId; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/JobMemberWithDataSetOutputModel.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/JobMemberWithDataSetOutputModel.java" new file mode 100644 index 0000000000000000000000000000000000000000..f868cd359b3b5971da0aa24d4f67706719645fde --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/JobMemberWithDataSetOutputModel.java" @@ -0,0 +1,50 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.vo; + +import com.welab.wefe.board.service.dto.entity.job.JobMemberOutputModel; + +/** + * @author zane.luo + */ +public class JobMemberWithDataSetOutputModel extends JobMemberOutputModel { + private String featureNameList; + /** + * 鐗瑰緛鏁伴噺 + */ + private Integer featureCount; + + //region getter/setter + + public String getFeatureNameList() { + return featureNameList; + } + + public void setFeatureNameList(String featureNameList) { + this.featureNameList = featureNameList; + } + + public Integer getFeatureCount() { + return featureCount; + } + + public void setFeatureCount(Integer featureCount) { + this.featureCount = featureCount; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/JobProgressOutput.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/JobProgressOutput.java" new file mode 100644 index 0000000000000000000000000000000000000000..f90dfa7ed745e3cf2ca4bc8cc1f5d240c7645978 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/JobProgressOutput.java" @@ -0,0 +1,150 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.vo; + +import com.welab.wefe.board.service.database.entity.job.JobMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.dto.entity.job.JobMemberOutputModel; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.JobStatus; +import com.welab.wefe.common.enums.TaskStatus; + +/** + * 浠诲姟鎵ц杩涘害 + * + * @author zane.luo + */ +public class JobProgressOutput { + private String memberId; + private JobStatus jobStatus; + private JobMemberRole jobRole; + private int progress; + private String nodeId; + private String taskId; + private TaskStatus taskStatus; + private boolean getProgressSuccess; + private String message; + + public static JobProgressOutput fail(JobMemberOutputModel member, Exception e) { + JobProgressOutput output = new JobProgressOutput(); + output.memberId = member.getMemberId(); + output.jobRole = member.getJobRole(); + output.getProgressSuccess = false; + output.message = e.getMessage(); + + return output; + } + + public static JobProgressOutput success(String memberId, JobMySqlModel job, TaskMySqlModel task) { + JobProgressOutput output = new JobProgressOutput(); + output.memberId = memberId; + output.progress = job.getProgress(); + output.jobStatus = job.getStatus(); + output.jobRole = job.getMyRole(); + output.getProgressSuccess = true; + output.message = job.getMessage(); + + if (task != null) { + output.nodeId = task.getFlowNodeId(); + output.taskId = task.getTaskId(); + output.taskStatus = task.getStatus(); + } + + return output; + } + + public String getMemberName() { + return CacheObjects.getMemberName(memberId); + } + + //region getter/setter + + public String getMemberId() { + return memberId; + } + + public void setMemberId(String memberId) { + this.memberId = memberId; + } + + public JobStatus getJobStatus() { + return jobStatus; + } + + public void setJobStatus(JobStatus jobStatus) { + this.jobStatus = jobStatus; + } + + public JobMemberRole getJobRole() { + return jobRole; + } + + public void setJobRole(JobMemberRole jobRole) { + this.jobRole = jobRole; + } + + public int getProgress() { + return progress; + } + + public void setProgress(int progress) { + this.progress = progress; + } + + public String getNodeId() { + return nodeId; + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public TaskStatus getTaskStatus() { + return taskStatus; + } + + public void setTaskStatus(TaskStatus taskStatus) { + this.taskStatus = taskStatus; + } + + public boolean isGetProgressSuccess() { + return getProgressSuccess; + } + + public void setGetProgressSuccess(boolean getProgressSuccess) { + this.getProgressSuccess = getProgressSuccess; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/MemberServiceStatusOutput.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/MemberServiceStatusOutput.java" new file mode 100644 index 0000000000000000000000000000000000000000..ad3d313efae7cff7c4a656ea02767dd2bb0d4052 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/MemberServiceStatusOutput.java" @@ -0,0 +1,89 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.vo; + +import com.welab.wefe.common.enums.MemberService; + +/** + * @author zane + */ +public class MemberServiceStatusOutput { + private MemberService service; + private String value; + private boolean success; + private String message; + private String name; + private Long spend; + + public MemberServiceStatusOutput() { + } + + public MemberServiceStatusOutput(MemberService service) { + this.service = service; + } + + // region getter/setter + + public MemberService getService() { + return service; + } + + public void setService(MemberService service) { + this.service = service; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getSpend() { + return spend; + } + + public void setSpend(Long spend) { + this.spend = spend; + } + // endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/OnlineAccountOutput.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/OnlineAccountOutput.java" new file mode 100644 index 0000000000000000000000000000000000000000..508b09a41ff196391fe253a7b99ffdc36c1dc4a9 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/OnlineAccountOutput.java" @@ -0,0 +1,38 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.vo; + +/** + * 鍦ㄧ嚎璐﹀彿 + * + * @author aaron.li + **/ +public class OnlineAccountOutput { + /** + * 璐﹀彿ID + */ + private String accountId; + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/RoleCounts.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/RoleCounts.java" new file mode 100644 index 0000000000000000000000000000000000000000..23f23bf3d354291752a24806e86a100cd9af6d06 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/RoleCounts.java" @@ -0,0 +1,56 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.vo; + +import com.welab.wefe.common.enums.JobMemberRole; + +/** + * @author zane.luo + */ +public class RoleCounts { + private JobMemberRole role; + private long count; + + public RoleCounts() { + } + + public RoleCounts(JobMemberRole role, long count) { + this.role = role; + this.count = count; + } + + //region getter/setter + + public JobMemberRole getRole() { + return role; + } + + public void setRole(JobMemberRole role) { + this.role = role; + } + + public long getCount() { + return count; + } + + public void setCount(long count) { + this.count = count; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/ServerCheckPointOutput.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/ServerCheckPointOutput.java" new file mode 100644 index 0000000000000000000000000000000000000000..d7d03b6a2075d187d4e4c60640af093beb924dae --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/ServerCheckPointOutput.java" @@ -0,0 +1,96 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.vo; + +/** + * @author zane + */ +public class ServerCheckPointOutput { + private String desc; + private boolean success; + private String message; + private String value; + private Long spend; + + public ServerCheckPointOutput() { + } + + public static ServerCheckPointOutput success(String name, String desc, String value, long spend) { + ServerCheckPointOutput output = new ServerCheckPointOutput(); + output.setDesc(desc); + output.setSuccess(false); + output.setMessage("success"); + output.setValue(value); + output.setSpend(spend); + return output; + } + + public static ServerCheckPointOutput fail(String name, String desc, String value, long spend, Exception e) { + ServerCheckPointOutput output = new ServerCheckPointOutput(); + output.setDesc(desc); + output.setSuccess(false); + output.setMessage(e.getMessage()); + output.setValue(value); + output.setSpend(spend); + return output; + } + + // region getter/setter + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public Long getSpend() { + return spend; + } + + public void setSpend(Long spend) { + this.spend = spend; + } + + + // endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/ServiceAvailableOutput.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/ServiceAvailableOutput.java" new file mode 100644 index 0000000000000000000000000000000000000000..16b4c8a0a79c2afd4ca389b90e1cfe639727c7f2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/dto/vo/ServiceAvailableOutput.java" @@ -0,0 +1,79 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.dto.vo; + +import com.welab.wefe.common.enums.MemberService; + +import java.util.List; + +/** + * 鏈嶅姟鍙敤鎬 + * + * @author aaron.li + **/ +public class ServiceAvailableOutput { + /** + * 鏈嶅姟鍚 + */ + private MemberService service; + + /** + * 鏄惁鎴愬姛锛堝綋鍏朵笅鐨勬墍鏈夋湇鍔″垪琛ㄤ负true鏃惰鍊兼墠涓簍rue锛屽惁鍒欎负false锛 + */ + private boolean success; + /** + * 鎻忚堪 + */ + private String message; + + /** + * 鐩稿簲鏈嶅姟鍒楄〃 + */ + private List memberServiceStatusOutputList; + + public MemberService getService() { + return service; + } + + public void setService(MemberService service) { + this.service = service; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public List getMemberServiceStatusOutputList() { + return memberServiceStatusOutputList; + } + + public void setMemberServiceStatusOutputList(List memberServiceStatusOutputList) { + this.memberServiceStatusOutputList = memberServiceStatusOutputList; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/exception/FlowNodeException.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/exception/FlowNodeException.java" new file mode 100644 index 0000000000000000000000000000000000000000..74f23dd3acf1e288c0a68ba50c0802164f14645f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/exception/FlowNodeException.java" @@ -0,0 +1,52 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.exception; + +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; + +/** + * @author zane.luo + */ +public class FlowNodeException extends StatusCodeWithException { + private final FlowGraphNode node; + + + public FlowNodeException(FlowGraphNode node, String message) { + super(message, StatusCode.ERROR_IN_FLOW_GRAPH_NODE); + this.node = node; + } + + @Override + public String getMessage() { + if (node != null) { + String message = "缁勪欢銆" + node.getComponentType().getLabel() + "銆戜腑鍙戠敓浜嗗紓甯革細" + super.getMessage(); + + if (node.getDeep() != null) { + message = "浣嶄簬娣卞害 " + node.getDeep() + " 鐨" + message; + } + return message; + } else { + return super.getMessage(); + } + } + + public FlowGraphNode getNode() { + return node; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/exception/MemberGatewayException.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/exception/MemberGatewayException.java" new file mode 100644 index 0000000000000000000000000000000000000000..ed5744e7c1d4a060f4511960b5555ad4834f590d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/exception/MemberGatewayException.java" @@ -0,0 +1,48 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.exception; + +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; + +/** + * @author zane.luo + */ +public class MemberGatewayException extends StatusCodeWithException { + private final String memberId; + + + public MemberGatewayException(String memberId, String message) { + super(message, StatusCode.REMOTE_SERVICE_ERROR); + this.memberId = memberId; + } + + @Override + public String getMessage() { + String memberName = CacheObjects.getMemberName(memberId); + if (memberName == null) { + memberName = memberId; + } + + return "璇锋眰鎴愬憳 " + memberName + " 澶辫触锛" + super.getMessage(); + } + + public String getMemberId() { + return memberId; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/listener/AppListener.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/listener/AppListener.java" new file mode 100644 index 0000000000000000000000000000000000000000..bbd0ec973c10887493db3975aed016e4466c46ab --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/listener/AppListener.java" @@ -0,0 +1,38 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.listener; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.stereotype.Component; + +/** + * @author zane.luo + */ +@Component +public class AppListener implements ApplicationListener { + private static final Logger LOG = LoggerFactory.getLogger(AppListener.class); + + + @Override + public void onApplicationEvent(ApplicationEnvironmentPreparedEvent applicationEnvironmentPreparedEvent) { + + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/listener/ApplicationReadyListener.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/listener/ApplicationReadyListener.java" new file mode 100644 index 0000000000000000000000000000000000000000..c78db3eedfaeabfaf94cce26ea0403630afcfd16 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/listener/ApplicationReadyListener.java" @@ -0,0 +1,69 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.listener; + +import com.welab.wefe.board.service.service.GatewayService; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.util.HostUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.stereotype.Component; + +/** + * IP address reporting + * + * @author aaron.li + **/ +@Component +public class ApplicationReadyListener implements ApplicationListener { + private static final Logger LOG = LoggerFactory.getLogger(ApplicationReadyListener.class); + + @Autowired + private GlobalConfigService globalConfigService; + + @Autowired + private GatewayService gatewayService; + + + @Override + public void onApplicationEvent(ApplicationReadyEvent event) { + appendIpAddressToGatewayWhiteList(); + } + + private void appendIpAddressToGatewayWhiteList() { + try { + // Intranet IP + String localIP = HostUtil.getLocalIp(); + globalConfigService.appendIpToWhiteList( + localIP, + "board 鍐呯綉IP鍦板潃锛岀敱 board 鑷富涓婃姤銆", + true + ); + + LOG.info("涓婃姤IP鍦板潃瀹屾垚."); + // Notify the gateway to update the IP whitelist cache + gatewayService.refreshIpWhiteListCache(); + } catch (Exception e) { + LOG.error("IP鍦板潃涓婃姤寮傚父锛", e); + } + } + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/listener/ApplicationStartedListener.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/listener/ApplicationStartedListener.java" new file mode 100644 index 0000000000000000000000000000000000000000..6b6462f5997c1829840821350596dd23686669af --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/listener/ApplicationStartedListener.java" @@ -0,0 +1,89 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.listener; + +import cn.hutool.core.thread.ThreadUtil; +import com.welab.wefe.board.service.database.entity.chat.MessageQueueMySqlModel; +import com.welab.wefe.board.service.database.repository.ChatUnreadMessageRepository; +import com.welab.wefe.board.service.service.MemberChatService; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.event.ApplicationStartedEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +/** + * Monitor the message queue and process chat messages + * + * @author Johnny.lin + */ +@Component +public class ApplicationStartedListener implements ApplicationListener { + + private static final Logger LOG = LoggerFactory.getLogger(ApplicationStartedListener.class); + + @Autowired + MemberChatService memberChatService; + + @Autowired + ChatUnreadMessageRepository statUnreadMessageRepository; + @Autowired + private GlobalConfigService globalConfigService; + + @Override + public void onApplicationEvent(ApplicationStartedEvent event) { + try { + globalConfigService.init(); + } catch (StatusCodeWithException e) { + LOG.error(e.getMessage(), e); + } + startChatListener(); + } + + private void startChatListener() { + LOG.info("MemberChatListener start"); + // Process received chat messages + ThreadUtil.execAsync(() -> { + while (true) { + try { + MessageQueueMySqlModel message = memberChatService.getOneMessage(); + if (message == null) { + ThreadUtil.sleep(2, TimeUnit.SECONDS); + continue; + } + + switch (message.getAction()) { + case create_chat_msg: { + memberChatService.handleChatMessage(message); + break; + } + default: + LOG.info("Illegal type[" + message.getAction() + "]"); + } + } catch (Exception e) { + ThreadUtil.sleep(5, TimeUnit.SECONDS); + LOG.error("Listening chat message queue exception", e); + } + } + }); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/model/BaseFlowGraph.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/model/BaseFlowGraph.java" new file mode 100644 index 0000000000000000000000000000000000000000..de1bbbf9117734e0bdc437c6853737ca44d5db07 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/model/BaseFlowGraph.java" @@ -0,0 +1,387 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.model; + +import com.welab.wefe.board.service.component.Components; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.database.entity.job.JobMemberMySqlModel; +import com.welab.wefe.board.service.database.entity.job.JobMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectFlowNodeMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.StringUtil; +import org.apache.commons.collections4.CollectionUtils; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * To avoid overcrowding of the code in FlowGraph, + * place non-public basic methods in this parent class. + * + * @author zane.luo + */ +public abstract class BaseFlowGraph { + + protected JobMySqlModel lastJob; + /** + * Job currently to be created + */ + protected JobMySqlModel job; + protected List members; + protected FederatedLearningType federatedLearningType; + /** + * All nodes in the graph + */ + public List allNodes = new ArrayList<>(); + /** + * Starting node in the graph + */ + protected List startNodes; + /** + * Nodes that will be executed in the current graph + */ + protected List jobSteps = new ArrayList<>(); + + public BaseFlowGraph(JobMySqlModel job, JobMySqlModel lastJob, List members, List mysqlNodes) throws StatusCodeWithException { + this(job.getFederatedLearningType(), lastJob, mysqlNodes); + + this.job = job; + this.members = members; + + } + + public BaseFlowGraph(FederatedLearningType federatedLearningType, JobMySqlModel lastJob, List mysqlNodes) throws StatusCodeWithException { + this.federatedLearningType = federatedLearningType; + this.lastJob = lastJob; + + if (CollectionUtils.isEmpty(mysqlNodes)) { + return; + } + + // Type conversion + this.allNodes = mysqlNodes + .stream() + .map(x -> ModelMapper.map(x, FlowGraphNode.class)) + .collect(Collectors.toList()); + + // Filter out the starting node + this.startNodes = allNodes + .stream() + .filter(ProjectFlowNodeMySqlModel::isStartNode) + .collect(Collectors.toList()); + + // Initialize the deep of the starting node + this.startNodes.forEach(x -> x.setDeep(1)); + + /** + * Sort out the parent node relationship of each node + */ + this.allNodes.forEach(x -> x.setParents(findParents(x))); + + /** + * Sort out the child node relationship of each node + */ + this.allNodes.forEach(x -> x.setChildren(findChildren(x))); + + // Check whether it contains an infinite loop + checkEndlessLoop(); + + // Sort out the list of nodes that will be executed + findJobSteps(jobSteps, startNodes); + + // Sort the task nodes that will be executed + sortJobSteps(); + } + + /** + * Sort the task nodes that will be executed + */ + private void sortJobSteps() { + // Sort by depth + jobSteps.sort(Comparator.comparingInt(FlowGraphNode::getDeep)); + + // Set the serial number + for (int i = 0; i < jobSteps.size(); i++) { + FlowGraphNode node = jobSteps.get(i); + node.setPosition(i); + } + } + + /** + * Recursively, traverse the child nodes to find the nodes that will be executed in the current graph. + */ + private void findJobSteps(List preNodes, List nodes) throws StatusCodeWithException { + + if (nodes == null) { + return; + } + + int beforeTaskCount = preNodes.size(); + + boolean stopCreateTask = false; + for (FlowGraphNode node : nodes) { + + // Avoid going back when exploring upwards and skip the nodes that have already been traversed. + if (preNodes.stream().anyMatch(x -> x.getNodeId().equals(node.getNodeId()))) { + continue; + } + + try { + AbstractComponent component = Components.get(node.getComponentType()); + + stopCreateTask = component.stopCreateTask(preNodes, node); + if (stopCreateTask) { + break; + } + + jobSteps.add(node); + + } catch (FlowNodeException e) { + throw e; + } catch (Exception e) { + throw new FlowNodeException(node, e.getMessage()); + } + + } + + if (stopCreateTask) { + return; + } + + // 鍙湁鍦ㄥ綋鍓嶅眰绾т骇鐢熶簡鏂 task 鏃舵墠杩涜鎺㈢储鍔ㄤ綔锛岄伩鍏嶈蛋鍥炲ご璺椂姝诲惊鐜 + // Only when a new task is generated at the current level + // will the exploration action be carried out to avoid an endless loop when going back. + if (preNodes.size() > beforeTaskCount) { + // 鍚戜笂鎺㈢储 + // Explore upward + for (FlowGraphNode node : nodes) { + findJobSteps(preNodes, node.getParents()); + } + + // 鍚戜笅鎺㈢储 + // Explore down + for (FlowGraphNode node : nodes) { + findJobSteps(preNodes, node.getChildren()); + } + } + + + } + + /** + * Get node object according to nodeId + */ + public FlowGraphNode getNode(String nodeId) { + return allNodes + .stream() + .filter(x -> x.getNodeId().equals(nodeId)) + .findFirst() + .orElse(null); + } + + public List getAllJobSteps() throws StatusCodeWithException { + return getJobSteps(null); + } + + /** + * 鑾峰彇浠诲姟鎵ц璺緞鑺傜偣 + * Get task execution path node + *

+ * 娉ㄦ剰锛氳繖閲屾病鏈夎冭檻浣跨敤缂撳瓨鐨勬儏鍐 + * 濡傛灉闇瑕佹煡鐪嬩娇鐢ㄤ簡鑺傜偣缂撳瓨鏃剁殑鎵ц璺緞锛岃鍏堜娇鐢 JobService.setGraphHasCacheResult() 璁剧疆鍚勮妭鐐圭殑缂撳瓨鎯呭喌鍚庡啀璋冪敤姝ゆ柟娉曘 + *

+ * Note: The use of cache is not considered here + * If you need to view the execution path when the node cache is used, + * please use JobService.setGraphHasCacheResult() to set the cache condition of each node before calling this method. + * + * @param endNodeId Specify the end node, if it is null, it will execute to the last node. + */ + public List getJobSteps(String endNodeId) throws StatusCodeWithException { + + if (endNodeId != null) { + FlowGraphNode endNode = getNode(endNodeId); + + if (endNode == null) { + StatusCode.PARAMETER_VALUE_INVALID.throwException("閿欒鐨 end node id锛" + endNodeId); + } + + if (endNode.getPosition() == null) { + StatusCode.PARAMETER_VALUE_INVALID.throwException("鏃犳硶鎵ц鍒版澶"); + } + + return jobSteps + .stream() + .filter(x -> x.getPosition() <= endNode.getPosition()) + .collect(Collectors.toList()); + + } else { + + return jobSteps; + } + + } + + //region private method + + + /** + * 妫鏌ユ槸鍚﹀寘鍚寰幆 + * Check whether it contains an infinite loop + */ + private void checkEndlessLoop() throws StatusCodeWithException { + + for (FlowGraphNode node : startNodes) { + + // 濡傛灉璧峰鑺傜偣鏈夌埗鑺傜偣锛岃偗瀹氭寰幆銆 + // If the starting node has a parent node, there must be an endless loop. + if (StringUtil.isNotEmpty(node.getParentNodeIdList())) { + throw new FlowNodeException(node, "璧峰鑺傜偣闄勮繎鍖呭惈姝诲惊鐜紝璇蜂慨姝c"); + } + + boolean loop = recursiveDescent(node); + if (loop) { + throw new FlowNodeException(node, "鍥句腑鍖呭惈姝诲惊鐜紝璇蜂慨姝c"); + } + } + + } + + /** + * 浣跨敤閫掑綊涓嬮檷鐨勬柟寮忚幏鍙栧瓙鑺傜偣 + * Use recursive descent to get child nodes + * + * @return Whether an infinite loop is detected + */ + private boolean recursiveDescent(FlowGraphNode parentNode) { + + List children = allNodes + .stream() + .filter(x -> { + if (StringUtil.isEmpty(x.getParentNodeIdList())) { + return false; + } + + return x.getParentNodeIdList().contains(parentNode.getNodeId()); + }) + .collect(Collectors.toList()); + + // 濡傛灉鏌愪釜瀛愯妭鐐圭殑 deep 灏忎簬绛変簬鐖惰妭鐐癸紝璇存槑鍙戠敓浜嗘寰幆銆 + // If the deep of a child node is less than or equal to the parent node, an infinite loop has occurred. + if (children.stream().anyMatch(x -> x.getDeep() != null && x.getDeep() <= parentNode.getDeep())) { + return true; + } + + children.forEach(x -> x.setDeep(parentNode.getDeep() + 1)); + + // There are no more child nodes, and the traversal ends. + if (CollectionUtils.isEmpty(children)) { + return false; + } + + + // 瀵瑰瓙鑺傜偣杩涜閫掑綊 + // Recurse on child nodes + for (FlowGraphNode node : children) { + boolean loop = recursiveDescent(node); + if (loop) { + return true; + } + } + + return false; + + } + + /** + * 鏍规嵁 nodeId 鑾峰彇鑺傜偣 + * Get node according to nodeId + */ + private FlowGraphNode findOneById(String nodeId) { + return allNodes + .stream() + .filter(x -> x.getNodeId().equals(nodeId)) + .findFirst() + .orElse(null); + } + + /** + * find parents node + */ + private List findParents(FlowGraphNode node) { + if (StringUtil.isEmpty(node.getParentNodeIdList())) { + return null; + } + + List result = new ArrayList<>(); + + for (String id : StringUtil.splitWithoutEmptyItem(node.getParentNodeIdList(), ",")) { + result.add(findOneById(id)); + } + return result; + } + + /** + * find children node + */ + private List findChildren(FlowGraphNode node) { + + return allNodes + .stream() + .filter(x -> { + if (StringUtil.isEmpty(x.getParentNodeIdList())) { + return false; + } + + return x.getParentNodeIdList().contains(node.getNodeId()); + }) + .collect(Collectors.toList()); + } + + //endregion + + + //region getter/setter + + + public JobMySqlModel getLastJob() { + return lastJob; + } + + public List getStartNodes() { + return startNodes; + } + + public JobMySqlModel getJob() { + return job; + } + + public List getMembers() { + return members; + } + + public FederatedLearningType getFederatedLearningType() { + return federatedLearningType; + } + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/model/FlowGraph.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/model/FlowGraph.java" new file mode 100644 index 0000000000000000000000000000000000000000..f56ae3caaa44cc4ba6e8eb56d8eaa2423db809bb --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/model/FlowGraph.java" @@ -0,0 +1,240 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.model; + +import com.welab.wefe.board.service.component.base.filter.OutputItemFilterFunction; +import com.welab.wefe.board.service.component.base.io.NodeOutputItem; +import com.welab.wefe.board.service.component.base.io.OutputItem; +import com.welab.wefe.board.service.database.entity.job.JobMemberMySqlModel; +import com.welab.wefe.board.service.database.entity.job.JobMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectFlowNodeMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import org.apache.commons.collections4.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +/** + * @author zane.luo + */ +public class FlowGraph extends BaseFlowGraph { + + + public FlowGraph(JobMySqlModel job, JobMySqlModel lastJob, List members, List mysqlNodes) throws StatusCodeWithException { + super(job, lastJob, members, mysqlNodes); + } + + public FlowGraph(FederatedLearningType federatedLearningType, List mysqlNodes) throws StatusCodeWithException { + super(federatedLearningType, null, mysqlNodes); + } + + public FlowGraph(FederatedLearningType federatedLearningType, JobMySqlModel lastJob, List mysqlNodes) throws StatusCodeWithException { + super(federatedLearningType, lastJob, mysqlNodes); + } + + /** + * Find a certain type of node from the parent node of the specified node + */ + public FlowGraphNode findOneNodeFromParent(FlowGraphNode node, ComponentType componentType) { + return findOneNodeFromParent(node, x -> x.getComponentType() == componentType); + } + + /** + * Find the modeling node from the parent node of the specified node + */ + public FlowGraphNode findModelingNodeFromParent(FlowGraphNode node) { + + return findModelingNodeFromParent(node, super.federatedLearningType); + } + + /** + * Manually pass in the federatedLearningType + * (for some FlowGraph created only with node lists, there is no job information) + */ + public FlowGraphNode findModelingNodeFromParent(FlowGraphNode node, FederatedLearningType federatedLearningType) { + FlowGraphNode result; + + switch (federatedLearningType) { + case horizontal: + result = findOneNodeFromParent(node, ComponentType.HorzLR); + if (result == null) { + result = findOneNodeFromParent(node, ComponentType.HorzSecureBoost); + if (result == null) { + result = findOneNodeFromParent(node, ComponentType.HorzNN); + } + } + return result; + + case vertical: + result = findOneNodeFromParent(node, ComponentType.VertLR); + if (result == null) { + result = findOneNodeFromParent(node, ComponentType.VertSecureBoost); + if (result == null) { + result = findOneNodeFromParent(node, ComponentType.VertNN); + } + } + return result; + case mix: + result = findOneNodeFromParent(node, ComponentType.MixLR); + if (result == null) { + result = findOneNodeFromParent(node, ComponentType.MixSecureBoost); + } + return result; + default: + return null; + } + } + + /** + * Find the verification data set node from the parent node of the specified node + * + * @param modelingType Modeling type + */ + public FlowGraphNode findValidationDataSetFromParent(FlowGraphNode node, ComponentType modelingType) { + + switch (modelingType) { + case HorzLR: + return findOneNodeFromParent(node, ComponentType.HorzLRValidationDataSetLoader); + case VertLR: + return findOneNodeFromParent(node, ComponentType.VertLRValidationDataSetLoader); + case HorzSecureBoost: + return findOneNodeFromParent(node, ComponentType.HorzXGBoostValidationDataSetLoader); + case VertSecureBoost: + return findOneNodeFromParent(node, ComponentType.VertXGBoostValidationDataSetLoader); + default: + return null; + } + + } + + /** + * Find a NodeOutputItem that meets the requirements from the parent node of the specified node + */ + public NodeOutputItem findNodeOutputFromParent(FlowGraphNode node, OutputItemFilterFunction filter) throws FlowNodeException { + + List parents = node.getParents(); + if (CollectionUtils.isEmpty(parents)) { + return null; + } + + for (FlowGraphNode parent : parents) { + + // 鑾峰彇姝よ妭鐐圭殑杈撳嚭椤瑰垪琛 + // Get the list of output items of this node + List items = parent + .getComponent() + .outputs(this, parent); + + // Iterate through the output items and try to find a suitable output item. + if (items != null) { + for (OutputItem item : items) { + if (filter.apply(parent, item)) { + return new NodeOutputItem(parent, item); + } + } + } + + } + + for (FlowGraphNode parent : parents) { + NodeOutputItem result = findNodeOutputFromParent(parent, filter); + if (result != null) { + return result; + } + } + + return null; + + } + + /** + * Find the nearest node that meets the requirements from the parent node of the specified node + */ + public FlowGraphNode findOneNodeFromParent(FlowGraphNode node, Function where) { + List parents = node.getParents(); + if (CollectionUtils.isEmpty(parents)) { + return null; + } + + for (FlowGraphNode parent : parents) { + if (where.apply(parent)) { + return parent; + } + } + + for (FlowGraphNode parent : parents) { + FlowGraphNode result = findOneNodeFromParent(parent, where); + if (result != null) { + return result; + } + } + + return null; + } + + /** + * 浠庢寚瀹氳妭鐐圭殑鐖惰妭鐐逛腑鏌ユ壘鎵鏈夋弧瓒宠姹傜殑鑺傜偣 + *

+ * Find all nodes that meet the requirements from the parent node of the specified node + */ + public List findAllNodesFromParent(FlowGraphNode node, Function where) { + List result = new ArrayList<>(); + + findAllNodesFromParent(result, node, where); + + return result; + } + + /** + * Find all nodes that meet the requirements from the parent node of the specified node + */ + private void findAllNodesFromParent(List result, FlowGraphNode node, Function where) { + List parents = node.getParents(); + if (CollectionUtils.isEmpty(parents)) { + return; + } + + for (FlowGraphNode parent : parents) { + if (where.apply(parent)) { + result.add(parent); + } + } + + for (FlowGraphNode parent : parents) { + findAllNodesFromParent(result, parent, where); + } + } + + /** + * 浠庝换鍔℃垚鍛樺垪琛ㄤ腑鍙栧嚭鑷繁 + *

+ * Remove yourself from the task member list + */ + public JobMemberMySqlModel getJobMemberIsMe() { + return members + .stream() + .filter(x -> CacheObjects.getMemberId().equals(x.getMemberId()) && x.getJobRole() == job.getMyRole()) + .findFirst() + .orElse(null); + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/model/FlowGraphNode.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/model/FlowGraphNode.java" new file mode 100644 index 0000000000000000000000000000000000000000..0ab4dae9377ebdb151ae0e5739ca777c8d43c7f3 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/model/FlowGraphNode.java" @@ -0,0 +1,225 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.model; + +import com.welab.wefe.board.service.component.Components; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.database.entity.job.JobMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectFlowNodeMySqlModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.fieldvalidate.AbstractCheckModel; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author zane.luo + */ +public class FlowGraphNode extends ProjectFlowNodeMySqlModel { + + /** + * Node form parameters + */ + private AbstractCheckModel paramsModel; + /** + * Depth + *

+ * When it is empty, + * it means that it is not in the main process, and such a node will not create a task. + */ + private Integer deep; + /** + * The sequence number in the task list, if null, means that the node will not be executed. + */ + private Integer position; + /** + * Whether there are historical cached results available + */ + private Boolean hasCacheResult; + + private String taskName; + /** + * parent nodes + */ + private List parents = new ArrayList<>(); + /** + * children nodes + */ + private List children = new ArrayList<>(); + + + public String getTaskName() { + if (StringUtils.isBlank(this.taskName)) { + this.taskName = createTaskName(super.getComponentType(), super.getNodeId()); + } + return this.taskName; + } + + public void setTaskName(String taskName) { + this.taskName = taskName; + } + + /** + * Generate task name (unique in job scope) + */ + public static String createTaskName(ComponentType componentType, String nodeId) { + return componentType.name() + "_" + nodeId; + } + + + public String createTaskId(JobMySqlModel job) { + return createTaskId(job, super.getComponentType(), super.getNodeId()); + } + + public String createTaskId(JobMySqlModel job, int index) { + return createTaskId(job, super.getComponentType(), super.getNodeId(), index); + } + + /** + * create task id + */ + public static String createTaskId(JobMySqlModel job, ComponentType componentType, String nodeId) { + return job.getJobId() + "_" + job.getMyRole().name() + "_" + createTaskName(componentType, nodeId); + } + + /** + * create task id + */ + public static String createTaskId(JobMySqlModel job, ComponentType componentType, String nodeId, int index) { + return job.getJobId() + "_" + job.getMyRole().name() + "_" + createTaskName(componentType, nodeId) + "_" + + index; + } + + /** + * Join the ParentTaskIds field of the task + */ + public String createParentTaskIds(JobMySqlModel job) { + // 鍙湁涓涓í鍚戝缓妯$殑鏃跺欙紝arbiter浠诲姟娌℃湁鐖惰妭鐐广傜壒娈婃儏鍐碉細涓茶涓や釜妯悜寤烘ā锛岀洰鍓嶅厛涓嶅鐞 + // When there is only one horizontal modeling, the arbiter task has no parent node. + // Special case: two horizontal modeling in series, do not deal with it now. + if (job.getMyRole() == JobMemberRole.arbiter) { + return ""; + } + + return getParents() + .stream() + .map(x -> x.createTaskId(job)) + .collect(Collectors.joining(",")); + } + + /** + * Join the ParentTaskIds field of the task + */ + public String createParentTaskIds(JobMySqlModel job, int index) { + // 鍙湁涓涓í鍚戝缓妯$殑鏃跺欙紝arbiter浠诲姟娌℃湁鐖惰妭鐐广傜壒娈婃儏鍐碉細涓茶涓や釜妯悜寤烘ā锛岀洰鍓嶅厛涓嶅鐞 + if (job.getMyRole() == JobMemberRole.arbiter) { + return ""; + } + + return getParents().stream().map(x -> x.createTaskId(job, index)).collect(Collectors.joining(",")); + } + + /** + * Get the component object corresponding to the node + */ + public AbstractComponent getComponent() { + return Components.get(super.getComponentType()); + } + + /** + * Get form parameter object + */ + public AbstractCheckModel getParamsModel() { + if (paramsModel != null) { + return paramsModel; + } + + try { + paramsModel = Components + .get(super.getComponentType()) + .deserializationParam(this, super.getParams()); + } catch (FlowNodeException e) { + return null; + } + return paramsModel; + } + + //region getter/setter + + + public Integer getDeep() { + return deep; + } + + public void setDeep(int deep) { + this.deep = deep; + } + + public Integer getPosition() { + return position; + } + + public void setPosition(Integer position) { + this.position = position; + } + + public Boolean getHasCacheResult() { + return hasCacheResult; + } + + public void setHasCacheResult(Boolean hasCacheResult) { + this.hasCacheResult = hasCacheResult; + } + + public List getParents() { + if (deep != null && parents != null) { + parents.forEach(x -> x.setDeep(deep - 1)); + } + + if (parents == null) { + parents = new ArrayList<>(); + } + + return parents; + } + + public void setParents(List parents) { + this.parents = parents; + } + + public List getChildren() { + if (deep != null && children != null) { + children.forEach(x -> x.setDeep(deep + 1)); + } + + if (children == null) { + children = new ArrayList<>(); + } + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + + //endregion +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/onlinedemo/OnlineDemoBranchStrategy.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/onlinedemo/OnlineDemoBranchStrategy.java" new file mode 100644 index 0000000000000000000000000000000000000000..704ce5e15c5fdf57625ac91b4de6e27e48ceb948 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/onlinedemo/OnlineDemoBranchStrategy.java" @@ -0,0 +1,60 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.onlinedemo; + +import com.welab.wefe.board.service.constant.Config; +import com.welab.wefe.board.service.database.entity.base.AbstractBaseMySqlModel; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.CurrentAccount; +import com.welab.wefe.common.web.Launcher; +import com.welab.wefe.common.web.dto.AbstractApiInput; + +/** + * Some strategies specific to the online experience environment (demo environment). + * + * @author zane.luo + */ +public class OnlineDemoBranchStrategy { + + public static void hackOnDelete(AbstractApiInput input, AbstractBaseMySqlModel model, String message) throws StatusCodeWithException { + Config config = Launcher.CONTEXT.getBean(Config.class); + + if (!config.isOnlineDemo()) { + return; + } + + if (StringUtil.isEmpty(model.getCreatedBy())) { + return; + } + + if (input.fromGateway()) { + return; + } + + // Administrators can delete other people鈥檚 data + if (CurrentAccount.isAdmin()) { + return; + } + + // If the current data is not created by the current member, deletion is not allowed. + if (!model.getCreatedBy().equals(CurrentAccount.id())) { + throw new StatusCodeWithException(message, StatusCode.UNSUPPORTED_HANDLE); + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/onlinedemo/TianmiantechService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/onlinedemo/TianmiantechService.java" new file mode 100644 index 0000000000000000000000000000000000000000..7da6dce14496a71f9fcfd958fba790678fa873ae --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/onlinedemo/TianmiantechService.java" @@ -0,0 +1,107 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.onlinedemo; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONException; +import com.welab.wefe.board.service.service.AbstractService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.http.HttpRequest; +import com.welab.wefe.common.http.HttpResponse; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.RSAUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author zane + */ +@Service +public class TianmiantechService extends AbstractService { + @Value("${tianmiantech.api.base-url:}") + private String TIANMIANTECH_BASE_URL; + @Value("${tianmiantech.rsa.public:}") + private String TIANMIANTECH_RSA_PUBLIC; + @Value("${tianmiantech.rsa.private:}") + private String TIANMIANTECH_RSA_PRIVATE; + + /** + * call tianmiantech service + */ + public JObject through(String api, Map params) throws StatusCodeWithException { + return request(api, params); + } + + /** + * https://docs.tianmiantech.com/web/#/7/41 + */ + private JObject request(String api, Map params) throws StatusCodeWithException { + if (params == null) { + params = new JObject(); + } + + params.put("timestamp", System.currentTimeMillis()); + params.put("sign", sign(params)); + + if (!api.startsWith("/")) { + api = "/" + api; + } + + HttpResponse response = HttpRequest + .create(TIANMIANTECH_BASE_URL + api) + .setBody(JSON.toJSONString(params)) + .postJson(); + + if (!response.success()) { + StatusCode.RPC_ERROR.throwException(response.getMessage()); + } + + JObject json; + try { + json = new JObject(response.getBodyAsJson()); + } catch (JSONException e) { + throw new StatusCodeWithException("tianmiantech 鍝嶅簲澶辫触锛" + response.getBodyAsString(), StatusCode.RPC_ERROR); + } + + Integer code = json.getInteger("status"); + if (code == null || !code.equals(200)) { + throw new StatusCodeWithException("tianmiantech 鍝嶅簲澶辫触(" + code + ")锛" + json.getString("message"), StatusCode.RPC_ERROR); + } + return json.getJObject("data"); + } + + public String sign(Map params) throws StatusCodeWithException { + List dataList = params.values().stream().map(String::valueOf).collect(Collectors.toList()); + String[] sortDataArr = new String[dataList.size()]; + dataList.toArray(sortDataArr); + Arrays.sort(sortDataArr); + String dataStr = String.join(",", sortDataArr); + + try { + return RSAUtil.sign(dataStr, TIANMIANTECH_RSA_PRIVATE, "utf-8"); + } catch (Exception e) { + StatusCode.RSA_ERROR.throwException(e); + } + return null; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/operation/OperationLogAfterApiExecute.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/operation/OperationLogAfterApiExecute.java" new file mode 100644 index 0000000000000000000000000000000000000000..1297743bb90d81552070c20df98d5133b5484a24 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/operation/OperationLogAfterApiExecute.java" @@ -0,0 +1,123 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.operation; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.database.entity.OperationLogMysqlModel; +import com.welab.wefe.board.service.database.repository.OperationLogRepository; +import com.welab.wefe.common.CommonThreadPool; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.CurrentAccount; +import com.welab.wefe.common.web.CurrentAccount.Info; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.ApiResult; +import com.welab.wefe.common.web.function.AfterApiExecuteFunction; +import com.welab.wefe.common.web.util.HttpServletRequestUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; +import java.util.Date; + +/** + * @author eval + **/ +@Component +public class OperationLogAfterApiExecute implements AfterApiExecuteFunction { + + @Autowired + OperationLogRepository mOperationLogRepository; + + @Override + public void action(HttpServletRequest httpServletRequest, long start, AbstractApi api, JSONObject params, ApiResult result) { + final Info info = CurrentAccount.get(); + CommonThreadPool.run( + () -> log(httpServletRequest, start, api, result, info) + ); + } + + private static final String[] IGNORE_LOG_APIS = { + "project/flow/query", + "project/member/add/audit/list", + "flow/job/get_progress", + "member/service_status_check", + "task/progress/detail", + "data_set_task/query", + "data_set_task/detail", + "file/upload" + }; + + /** + * Check whether the request is ignored + */ + private boolean ignore(HttpServletRequest httpServletRequest, Api annotation) { + // Automatically refresh from the front end without writing logs. + if (httpServletRequest.getQueryString() != null) { + String value = httpServletRequest.getParameter("request-from-refresh"); + if (StringUtil.isNotEmpty(value) && "true".equals(value)) { + return true; + } + } + + // Blacklist, do not write logs. + String api = StringUtil.trim(annotation.path().toLowerCase(), '/', ' '); + return Arrays.asList(IGNORE_LOG_APIS).contains(api); + } + + private void log(HttpServletRequest httpServletRequest, long start, AbstractApi api, ApiResult result, Info info) { + if (info == null) { + return; + } + Api annotation = api.getClass().getAnnotation(Api.class); + + if (ignore(httpServletRequest, annotation)) { + return; + } + + String token = httpServletRequest.getHeader("token"); + String ip = HttpServletRequestUtil.getClientIp(httpServletRequest); + + OperationLogMysqlModel model = new OperationLogMysqlModel(); + model.setRequestTime(new Date(start)); + model.setToken(token); + model.setRequestIp(ip); + model.setOperatorId(info.getId()); + model.setOperatorPhone(info.getPhoneNumber()); + model.setSpend(result.spend); + + + String path = annotation.path(); + String name = annotation.name(); + model.setLogInterface(path); + if (StringUtil.isEmpty(name)) { + model.setInterfaceName(path); + } else { + model.setInterfaceName(name); + } + String action = path; + if (path.lastIndexOf("/") >= 0) { + action = path.substring(path.lastIndexOf("/") + 1); + } + model.setLogAction(action); + model.setResultCode(result.code); + model.setResultMessage(result.message); + + mOperationLogRepository.save(model); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/operation/OperationLogBeforeApiExecute.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/operation/OperationLogBeforeApiExecute.java" new file mode 100644 index 0000000000000000000000000000000000000000..b781c1da3c9a76d5a054a0e83f0b65a64b599bbe --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/operation/OperationLogBeforeApiExecute.java" @@ -0,0 +1,34 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.operation; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.common.web.api.base.AbstractApi; +import com.welab.wefe.common.web.function.BeforeApiExecuteFunction; + +/** + * User operation log + * + * @author eval + **/ +public class OperationLogBeforeApiExecute implements BeforeApiExecuteFunction { + + @Override + public void action(AbstractApi api, JSONObject params) { + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/NetworkDataTransferProxyServiceGrpc.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/NetworkDataTransferProxyServiceGrpc.java" new file mode 100644 index 0000000000000000000000000000000000000000..a7c5bf95e587d0ce6563539a9dd5bbd2b87cc241 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/NetworkDataTransferProxyServiceGrpc.java" @@ -0,0 +1,354 @@ +package com.welab.wefe.board.service.proto; + +import static io.grpc.MethodDescriptor.generateFullMethodName; +import static io.grpc.stub.ClientCalls.asyncBidiStreamingCall; +import static io.grpc.stub.ClientCalls.asyncUnaryCall; +import static io.grpc.stub.ClientCalls.*; +import static io.grpc.stub.ServerCalls.asyncBidiStreamingCall; +import static io.grpc.stub.ServerCalls.asyncUnaryCall; +import static io.grpc.stub.ServerCalls.*; + +/** + * + */ +@javax.annotation.Generated( + value = "by gRPC proto compiler (version 1.29.0)", + comments = "Source: gateway-service.proto") +public final class NetworkDataTransferProxyServiceGrpc { + + private NetworkDataTransferProxyServiceGrpc() { + } + + public static final String SERVICE_NAME = "com.welab.wefe.gateway.api.service.proto.NetworkDataTransferProxyService"; + + // Static method descriptors that strictly reflect the proto. + private static volatile io.grpc.MethodDescriptor getPushMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "push", + requestType = com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta.class, + responseType = com.welab.wefe.board.service.proto.meta.basic.BasicMetaProto.ReturnStatus.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getPushMethod() { + io.grpc.MethodDescriptor getPushMethod; + if ((getPushMethod = NetworkDataTransferProxyServiceGrpc.getPushMethod) == null) { + synchronized (NetworkDataTransferProxyServiceGrpc.class) { + if ((getPushMethod = NetworkDataTransferProxyServiceGrpc.getPushMethod) == null) { + NetworkDataTransferProxyServiceGrpc.getPushMethod = getPushMethod = + io.grpc.MethodDescriptor.newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "push")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + com.welab.wefe.board.service.proto.meta.basic.BasicMetaProto.ReturnStatus.getDefaultInstance())) + .setSchemaDescriptor(new NetworkDataTransferProxyServiceMethodDescriptorSupplier("push")) + .build(); + } + } + } + return getPushMethod; + } + + private static volatile io.grpc.MethodDescriptor getPushDataMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "pushData", + requestType = com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta.class, + responseType = com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta.class, + methodType = io.grpc.MethodDescriptor.MethodType.BIDI_STREAMING) + public static io.grpc.MethodDescriptor getPushDataMethod() { + io.grpc.MethodDescriptor getPushDataMethod; + if ((getPushDataMethod = NetworkDataTransferProxyServiceGrpc.getPushDataMethod) == null) { + synchronized (NetworkDataTransferProxyServiceGrpc.class) { + if ((getPushDataMethod = NetworkDataTransferProxyServiceGrpc.getPushDataMethod) == null) { + NetworkDataTransferProxyServiceGrpc.getPushDataMethod = getPushDataMethod = + io.grpc.MethodDescriptor.newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.BIDI_STREAMING) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "pushData")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta.getDefaultInstance())) + .setSchemaDescriptor(new NetworkDataTransferProxyServiceMethodDescriptorSupplier("pushData")) + .build(); + } + } + } + return getPushDataMethod; + } + + /** + * Creates a new async stub that supports all call types for the service + */ + public static NetworkDataTransferProxyServiceStub newStub(io.grpc.Channel channel) { + io.grpc.stub.AbstractStub.StubFactory factory = + new io.grpc.stub.AbstractStub.StubFactory() { + @Override + public NetworkDataTransferProxyServiceStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new NetworkDataTransferProxyServiceStub(channel, callOptions); + } + }; + return NetworkDataTransferProxyServiceStub.newStub(factory, channel); + } + + /** + * Creates a new blocking-style stub that supports unary and streaming output calls on the service + */ + public static NetworkDataTransferProxyServiceBlockingStub newBlockingStub( + io.grpc.Channel channel) { + io.grpc.stub.AbstractStub.StubFactory factory = + new io.grpc.stub.AbstractStub.StubFactory() { + @Override + public NetworkDataTransferProxyServiceBlockingStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new NetworkDataTransferProxyServiceBlockingStub(channel, callOptions); + } + }; + return NetworkDataTransferProxyServiceBlockingStub.newStub(factory, channel); + } + + /** + * Creates a new ListenableFuture-style stub that supports unary calls on the service + */ + public static NetworkDataTransferProxyServiceFutureStub newFutureStub( + io.grpc.Channel channel) { + io.grpc.stub.AbstractStub.StubFactory factory = + new io.grpc.stub.AbstractStub.StubFactory() { + @Override + public NetworkDataTransferProxyServiceFutureStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new NetworkDataTransferProxyServiceFutureStub(channel, callOptions); + } + }; + return NetworkDataTransferProxyServiceFutureStub.newStub(factory, channel); + } + + /** + * + */ + public static abstract class NetworkDataTransferProxyServiceImplBase implements io.grpc.BindableService { + + /** + * + */ + public void push(com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta request, + io.grpc.stub.StreamObserver responseObserver) { + asyncUnimplementedUnaryCall(getPushMethod(), responseObserver); + } + + /** + * + */ + public io.grpc.stub.StreamObserver pushData( + io.grpc.stub.StreamObserver responseObserver) { + return asyncUnimplementedStreamingCall(getPushDataMethod(), responseObserver); + } + + @Override + public final io.grpc.ServerServiceDefinition bindService() { + return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()) + .addMethod( + getPushMethod(), + asyncUnaryCall( + new MethodHandlers< + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta, + com.welab.wefe.board.service.proto.meta.basic.BasicMetaProto.ReturnStatus>( + this, METHODID_PUSH))) + .addMethod( + getPushDataMethod(), + asyncBidiStreamingCall( + new MethodHandlers< + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta, + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta>( + this, METHODID_PUSH_DATA))) + .build(); + } + } + + /** + * + */ + public static final class NetworkDataTransferProxyServiceStub extends io.grpc.stub.AbstractAsyncStub { + private NetworkDataTransferProxyServiceStub( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + super(channel, callOptions); + } + + @Override + protected NetworkDataTransferProxyServiceStub build( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new NetworkDataTransferProxyServiceStub(channel, callOptions); + } + + /** + * + */ + public void push(com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta request, + io.grpc.stub.StreamObserver responseObserver) { + asyncUnaryCall( + getChannel().newCall(getPushMethod(), getCallOptions()), request, responseObserver); + } + + /** + * + */ + public io.grpc.stub.StreamObserver pushData( + io.grpc.stub.StreamObserver responseObserver) { + return asyncBidiStreamingCall( + getChannel().newCall(getPushDataMethod(), getCallOptions()), responseObserver); + } + } + + /** + * + */ + public static final class NetworkDataTransferProxyServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub { + private NetworkDataTransferProxyServiceBlockingStub( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + super(channel, callOptions); + } + + @Override + protected NetworkDataTransferProxyServiceBlockingStub build( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new NetworkDataTransferProxyServiceBlockingStub(channel, callOptions); + } + + /** + * + */ + public com.welab.wefe.board.service.proto.meta.basic.BasicMetaProto.ReturnStatus push(com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta request) { + return blockingUnaryCall( + getChannel(), getPushMethod(), getCallOptions(), request); + } + } + + /** + * + */ + public static final class NetworkDataTransferProxyServiceFutureStub extends io.grpc.stub.AbstractFutureStub { + private NetworkDataTransferProxyServiceFutureStub( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + super(channel, callOptions); + } + + @Override + protected NetworkDataTransferProxyServiceFutureStub build( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new NetworkDataTransferProxyServiceFutureStub(channel, callOptions); + } + + /** + * + */ + public com.google.common.util.concurrent.ListenableFuture push( + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta request) { + return futureUnaryCall( + getChannel().newCall(getPushMethod(), getCallOptions()), request); + } + } + + private static final int METHODID_PUSH = 0; + private static final int METHODID_PUSH_DATA = 1; + + private static final class MethodHandlers implements + UnaryMethod, + ServerStreamingMethod, + ClientStreamingMethod, + BidiStreamingMethod { + private final NetworkDataTransferProxyServiceImplBase serviceImpl; + private final int methodId; + + MethodHandlers(NetworkDataTransferProxyServiceImplBase serviceImpl, int methodId) { + this.serviceImpl = serviceImpl; + this.methodId = methodId; + } + + @Override + @SuppressWarnings("unchecked") + public void invoke(Req request, io.grpc.stub.StreamObserver responseObserver) { + switch (methodId) { + case METHODID_PUSH: + serviceImpl.push((com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta) request, + (io.grpc.stub.StreamObserver) responseObserver); + break; + default: + throw new AssertionError(); + } + } + + @Override + @SuppressWarnings("unchecked") + public io.grpc.stub.StreamObserver invoke( + io.grpc.stub.StreamObserver responseObserver) { + switch (methodId) { + case METHODID_PUSH_DATA: + return (io.grpc.stub.StreamObserver) serviceImpl.pushData( + (io.grpc.stub.StreamObserver) responseObserver); + default: + throw new AssertionError(); + } + } + } + + private static abstract class NetworkDataTransferProxyServiceBaseDescriptorSupplier + implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier { + NetworkDataTransferProxyServiceBaseDescriptorSupplier() { + } + + @Override + public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() { + return TransferServiceProto.getDescriptor(); + } + + @Override + public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() { + return getFileDescriptor().findServiceByName("NetworkDataTransferProxyService"); + } + } + + private static final class NetworkDataTransferProxyServiceFileDescriptorSupplier + extends NetworkDataTransferProxyServiceBaseDescriptorSupplier { + NetworkDataTransferProxyServiceFileDescriptorSupplier() { + } + } + + private static final class NetworkDataTransferProxyServiceMethodDescriptorSupplier + extends NetworkDataTransferProxyServiceBaseDescriptorSupplier + implements io.grpc.protobuf.ProtoMethodDescriptorSupplier { + private final String methodName; + + NetworkDataTransferProxyServiceMethodDescriptorSupplier(String methodName) { + this.methodName = methodName; + } + + @Override + public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() { + return getServiceDescriptor().findMethodByName(methodName); + } + } + + private static volatile io.grpc.ServiceDescriptor serviceDescriptor; + + public static io.grpc.ServiceDescriptor getServiceDescriptor() { + io.grpc.ServiceDescriptor result = serviceDescriptor; + if (result == null) { + synchronized (NetworkDataTransferProxyServiceGrpc.class) { + result = serviceDescriptor; + if (result == null) { + serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME) + .setSchemaDescriptor(new NetworkDataTransferProxyServiceFileDescriptorSupplier()) + .addMethod(getPushMethod()) + .addMethod(getPushDataMethod()) + .build(); + } + } + } + return result; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/TransferServiceGrpc.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/TransferServiceGrpc.java" new file mode 100644 index 0000000000000000000000000000000000000000..523fd79a71c1ff51212f39f84d7e635c4d6c424e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/TransferServiceGrpc.java" @@ -0,0 +1,457 @@ +package com.welab.wefe.board.service.proto; + +import static io.grpc.MethodDescriptor.generateFullMethodName; +import static io.grpc.stub.ClientCalls.asyncUnaryCall; +import static io.grpc.stub.ClientCalls.blockingUnaryCall; +import static io.grpc.stub.ClientCalls.futureUnaryCall; +import static io.grpc.stub.ServerCalls.asyncUnaryCall; +import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall; + +/** + * + */ +@javax.annotation.Generated( + value = "by gRPC proto compiler (version 1.29.0)", + comments = "Source: gateway-service.proto") +public final class TransferServiceGrpc { + + private TransferServiceGrpc() { + } + + public static final String SERVICE_NAME = "com.welab.wefe.gateway.api.service.proto.TransferService"; + + // Static method descriptors that strictly reflect the proto. + private static volatile io.grpc.MethodDescriptor getSendMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "send", + requestType = com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta.class, + responseType = com.welab.wefe.board.service.proto.meta.basic.BasicMetaProto.ReturnStatus.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getSendMethod() { + io.grpc.MethodDescriptor getSendMethod; + if ((getSendMethod = TransferServiceGrpc.getSendMethod) == null) { + synchronized (TransferServiceGrpc.class) { + if ((getSendMethod = TransferServiceGrpc.getSendMethod) == null) { + TransferServiceGrpc.getSendMethod = getSendMethod = + io.grpc.MethodDescriptor.newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "send")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + com.welab.wefe.board.service.proto.meta.basic.BasicMetaProto.ReturnStatus.getDefaultInstance())) + .setSchemaDescriptor(new TransferServiceMethodDescriptorSupplier("send")) + .build(); + } + } + } + return getSendMethod; + } + + private static volatile io.grpc.MethodDescriptor getRecvMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "recv", + requestType = com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta.class, + responseType = com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getRecvMethod() { + io.grpc.MethodDescriptor getRecvMethod; + if ((getRecvMethod = TransferServiceGrpc.getRecvMethod) == null) { + synchronized (TransferServiceGrpc.class) { + if ((getRecvMethod = TransferServiceGrpc.getRecvMethod) == null) { + TransferServiceGrpc.getRecvMethod = getRecvMethod = + io.grpc.MethodDescriptor.newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "recv")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta.getDefaultInstance())) + .setSchemaDescriptor(new TransferServiceMethodDescriptorSupplier("recv")) + .build(); + } + } + } + return getRecvMethod; + } + + private static volatile io.grpc.MethodDescriptor getCheckStatusNowMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "checkStatusNow", + requestType = com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta.class, + responseType = com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getCheckStatusNowMethod() { + io.grpc.MethodDescriptor getCheckStatusNowMethod; + if ((getCheckStatusNowMethod = TransferServiceGrpc.getCheckStatusNowMethod) == null) { + synchronized (TransferServiceGrpc.class) { + if ((getCheckStatusNowMethod = TransferServiceGrpc.getCheckStatusNowMethod) == null) { + TransferServiceGrpc.getCheckStatusNowMethod = getCheckStatusNowMethod = + io.grpc.MethodDescriptor.newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "checkStatusNow")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta.getDefaultInstance())) + .setSchemaDescriptor(new TransferServiceMethodDescriptorSupplier("checkStatusNow")) + .build(); + } + } + } + return getCheckStatusNowMethod; + } + + /** + * Creates a new async stub that supports all call types for the service + */ + public static TransferServiceStub newStub(io.grpc.Channel channel) { + io.grpc.stub.AbstractStub.StubFactory factory = + new io.grpc.stub.AbstractStub.StubFactory() { + @Override + public TransferServiceStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new TransferServiceStub(channel, callOptions); + } + }; + return TransferServiceStub.newStub(factory, channel); + } + + /** + * Creates a new blocking-style stub that supports unary and streaming output calls on the service + */ + public static TransferServiceBlockingStub newBlockingStub( + io.grpc.Channel channel) { + io.grpc.stub.AbstractStub.StubFactory factory = + new io.grpc.stub.AbstractStub.StubFactory() { + @Override + public TransferServiceBlockingStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new TransferServiceBlockingStub(channel, callOptions); + } + }; + return TransferServiceBlockingStub.newStub(factory, channel); + } + + /** + * Creates a new ListenableFuture-style stub that supports unary calls on the service + */ + public static TransferServiceFutureStub newFutureStub( + io.grpc.Channel channel) { + io.grpc.stub.AbstractStub.StubFactory factory = + new io.grpc.stub.AbstractStub.StubFactory() { + @Override + public TransferServiceFutureStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new TransferServiceFutureStub(channel, callOptions); + } + }; + return TransferServiceFutureStub.newStub(factory, channel); + } + + /** + * + */ + public static abstract class TransferServiceImplBase implements io.grpc.BindableService { + + /** + * + */ + public void send(com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta request, + io.grpc.stub.StreamObserver responseObserver) { + asyncUnimplementedUnaryCall(getSendMethod(), responseObserver); + } + + /** + * + */ + public void recv(com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta request, + io.grpc.stub.StreamObserver responseObserver) { + asyncUnimplementedUnaryCall(getRecvMethod(), responseObserver); + } + + /** + *

+         * check the transfer status, return immediately
+         * 
+ */ + public void checkStatusNow(com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta request, + io.grpc.stub.StreamObserver responseObserver) { + asyncUnimplementedUnaryCall(getCheckStatusNowMethod(), responseObserver); + } + + @Override + public final io.grpc.ServerServiceDefinition bindService() { + return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()) + .addMethod( + getSendMethod(), + asyncUnaryCall( + new MethodHandlers< + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta, + com.welab.wefe.board.service.proto.meta.basic.BasicMetaProto.ReturnStatus>( + this, METHODID_SEND))) + .addMethod( + getRecvMethod(), + asyncUnaryCall( + new MethodHandlers< + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta, + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta>( + this, METHODID_RECV))) + .addMethod( + getCheckStatusNowMethod(), + asyncUnaryCall( + new MethodHandlers< + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta, + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta>( + this, METHODID_CHECK_STATUS_NOW))) + .build(); + } + } + + /** + * + */ + public static final class TransferServiceStub extends io.grpc.stub.AbstractAsyncStub { + private TransferServiceStub( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + super(channel, callOptions); + } + + @Override + protected TransferServiceStub build( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new TransferServiceStub(channel, callOptions); + } + + /** + * + */ + public void send(com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta request, + io.grpc.stub.StreamObserver responseObserver) { + asyncUnaryCall( + getChannel().newCall(getSendMethod(), getCallOptions()), request, responseObserver); + } + + /** + * + */ + public void recv(com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta request, + io.grpc.stub.StreamObserver responseObserver) { + asyncUnaryCall( + getChannel().newCall(getRecvMethod(), getCallOptions()), request, responseObserver); + } + + /** + *
+         * check the transfer status, return immediately
+         * 
+ */ + public void checkStatusNow(com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta request, + io.grpc.stub.StreamObserver responseObserver) { + asyncUnaryCall( + getChannel().newCall(getCheckStatusNowMethod(), getCallOptions()), request, responseObserver); + } + } + + /** + * + */ + public static final class TransferServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub { + private TransferServiceBlockingStub( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + super(channel, callOptions); + } + + @Override + protected TransferServiceBlockingStub build( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new TransferServiceBlockingStub(channel, callOptions); + } + + /** + * + */ + public com.welab.wefe.board.service.proto.meta.basic.BasicMetaProto.ReturnStatus send(com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta request) { + return blockingUnaryCall( + getChannel(), getSendMethod(), getCallOptions(), request); + } + + /** + * + */ + public com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta recv(com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta request) { + return blockingUnaryCall( + getChannel(), getRecvMethod(), getCallOptions(), request); + } + + /** + *
+         * check the transfer status, return immediately
+         * 
+ */ + public com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta checkStatusNow(com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta request) { + return blockingUnaryCall( + getChannel(), getCheckStatusNowMethod(), getCallOptions(), request); + } + } + + /** + * + */ + public static final class TransferServiceFutureStub extends io.grpc.stub.AbstractFutureStub { + private TransferServiceFutureStub( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + super(channel, callOptions); + } + + @Override + protected TransferServiceFutureStub build( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new TransferServiceFutureStub(channel, callOptions); + } + + /** + * + */ + public com.google.common.util.concurrent.ListenableFuture send( + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta request) { + return futureUnaryCall( + getChannel().newCall(getSendMethod(), getCallOptions()), request); + } + + /** + * + */ + public com.google.common.util.concurrent.ListenableFuture recv( + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta request) { + return futureUnaryCall( + getChannel().newCall(getRecvMethod(), getCallOptions()), request); + } + + /** + *
+         * check the transfer status, return immediately
+         * 
+ */ + public com.google.common.util.concurrent.ListenableFuture checkStatusNow( + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta request) { + return futureUnaryCall( + getChannel().newCall(getCheckStatusNowMethod(), getCallOptions()), request); + } + } + + private static final int METHODID_SEND = 0; + private static final int METHODID_RECV = 1; + private static final int METHODID_CHECK_STATUS_NOW = 2; + + private static final class MethodHandlers implements + io.grpc.stub.ServerCalls.UnaryMethod, + io.grpc.stub.ServerCalls.ServerStreamingMethod, + io.grpc.stub.ServerCalls.ClientStreamingMethod, + io.grpc.stub.ServerCalls.BidiStreamingMethod { + private final TransferServiceImplBase serviceImpl; + private final int methodId; + + MethodHandlers(TransferServiceImplBase serviceImpl, int methodId) { + this.serviceImpl = serviceImpl; + this.methodId = methodId; + } + + @Override + @SuppressWarnings("unchecked") + public void invoke(Req request, io.grpc.stub.StreamObserver responseObserver) { + switch (methodId) { + case METHODID_SEND: + serviceImpl.send((com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta) request, + (io.grpc.stub.StreamObserver) responseObserver); + break; + case METHODID_RECV: + serviceImpl.recv((com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta) request, + (io.grpc.stub.StreamObserver) responseObserver); + break; + case METHODID_CHECK_STATUS_NOW: + serviceImpl.checkStatusNow((com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.TransferMeta) request, + (io.grpc.stub.StreamObserver) responseObserver); + break; + default: + throw new AssertionError(); + } + } + + @Override + @SuppressWarnings("unchecked") + public io.grpc.stub.StreamObserver invoke( + io.grpc.stub.StreamObserver responseObserver) { + switch (methodId) { + default: + throw new AssertionError(); + } + } + } + + private static abstract class TransferServiceBaseDescriptorSupplier + implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier { + TransferServiceBaseDescriptorSupplier() { + } + + @Override + public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() { + return TransferServiceProto.getDescriptor(); + } + + @Override + public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() { + return getFileDescriptor().findServiceByName("TransferService"); + } + } + + private static final class TransferServiceFileDescriptorSupplier + extends TransferServiceBaseDescriptorSupplier { + TransferServiceFileDescriptorSupplier() { + } + } + + private static final class TransferServiceMethodDescriptorSupplier + extends TransferServiceBaseDescriptorSupplier + implements io.grpc.protobuf.ProtoMethodDescriptorSupplier { + private final String methodName; + + TransferServiceMethodDescriptorSupplier(String methodName) { + this.methodName = methodName; + } + + @Override + public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() { + return getServiceDescriptor().findMethodByName(methodName); + } + } + + private static volatile io.grpc.ServiceDescriptor serviceDescriptor; + + public static io.grpc.ServiceDescriptor getServiceDescriptor() { + io.grpc.ServiceDescriptor result = serviceDescriptor; + if (result == null) { + synchronized (TransferServiceGrpc.class) { + result = serviceDescriptor; + if (result == null) { + serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME) + .setSchemaDescriptor(new TransferServiceFileDescriptorSupplier()) + .addMethod(getSendMethod()) + .addMethod(getRecvMethod()) + .addMethod(getCheckStatusNowMethod()) + .build(); + } + } + } + return result; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/TransferServiceProto.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/TransferServiceProto.java" new file mode 100644 index 0000000000000000000000000000000000000000..f54bc39b33587a0b820db8d67a5203485ecba5e6 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/TransferServiceProto.java" @@ -0,0 +1,62 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: gateway-service.proto + +package com.welab.wefe.board.service.proto; + +public final class TransferServiceProto { + private TransferServiceProto() { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + + private static final com.google.protobuf.Descriptors.FileDescriptor + descriptor; + + static { + String[] descriptorData = { + "\n\025gateway-service.proto\022(com.welab.wefe." + + "gateway.api.service.proto\032\020basic-meta.pr" + + "oto\032\022gateway-meta.proto2\361\002\n\017TransferServ" + + "ice\022p\n\004send\0223.com.welab.wefe.gateway.api" + + ".meta.basic.TransferMeta\0323.com.welab.wef" + + "e.gateway.api.meta.basic.ReturnStatus\022p\n" + + "\004recv\0223.com.welab.wefe.gateway.api.meta." + + "basic.TransferMeta\0323.com.welab.wefe.gate" + + "way.api.meta.basic.TransferMeta\022z\n\016check" + + "StatusNow\0223.com.welab.wefe.gateway.api.m" + + "eta.basic.TransferMeta\0323.com.welab.wefe." + + "gateway.api.meta.basic.TransferMeta2\215\002\n\037" + + "NetworkDataTransferProxyService\022p\n\004push\022" + + "3.com.welab.wefe.board.service.proto.meta.basic." + + "TransferMeta\0323.com.welab.wefe.gateway.ap" + + "i.meta.basic.ReturnStatus\022x\n\010pushData\0223." + + "com.welab.wefe.board.service.proto.meta.basic.Tr" + + "ansferMeta\0323.com.welab.wefe.gateway.api." + + "meta.basic.TransferMeta(\0010\001B\026B\024TransferS" + + "erviceProtob\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[]{ + com.welab.wefe.board.service.proto.meta.basic.BasicMetaProto.getDescriptor(), + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.getDescriptor(), + }); + com.welab.wefe.board.service.proto.meta.basic.BasicMetaProto.getDescriptor(); + com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/meta/basic/BasicMetaProto.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/meta/basic/BasicMetaProto.java" new file mode 100644 index 0000000000000000000000000000000000000000..c4582c2756e91b03d144e4a24710e34fee8f6acf --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/meta/basic/BasicMetaProto.java" @@ -0,0 +1,2920 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: basic-meta.proto + +package com.welab.wefe.board.service.proto.meta.basic; + +/** + * @author aaron.li + */ +public final class BasicMetaProto { + private BasicMetaProto() { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + + public interface EndpointOrBuilder extends + // @@protoc_insertion_point(interface_extends:com.welab.wefe.gateway.api.meta.basic.Endpoint) + com.google.protobuf.MessageOrBuilder { + + /** + *
+         * ip address
+         * 
+ * + * string ip = 1; + * + * @return The ip. + */ + String getIp(); + + /** + *
+         * ip address
+         * 
+ * + * string ip = 1; + * + * @return The bytes for ip. + */ + com.google.protobuf.ByteString + getIpBytes(); + + /** + *
+         * port
+         * 
+ * + * int32 port = 2; + * + * @return The port. + */ + int getPort(); + + /** + *
+         * host name
+         * 
+ * + * string hostname = 3; + * + * @return The hostname. + */ + String getHostname(); + + /** + *
+         * host name
+         * 
+ * + * string hostname = 3; + * + * @return The bytes for hostname. + */ + com.google.protobuf.ByteString + getHostnameBytes(); + } + + /** + *
+     * network endpoint
+     * 
+ *

+ * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.Endpoint} + */ + public static final class Endpoint extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:com.welab.wefe.gateway.api.meta.basic.Endpoint) + EndpointOrBuilder { + private static final long serialVersionUID = 0L; + + // Use Endpoint.newBuilder() to construct. + private Endpoint(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private Endpoint() { + ip_ = ""; + hostname_ = ""; + } + + @Override + @SuppressWarnings({"unused"}) + protected Object newInstance( + UnusedPrivateParameter unused) { + return new Endpoint(); + } + + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + + private Endpoint( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + String s = input.readStringRequireUtf8(); + + ip_ = s; + break; + } + case 16: { + + port_ = input.readInt32(); + break; + } + case 26: { + String s = input.readStringRequireUtf8(); + + hostname_ = s; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return BasicMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoint_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return BasicMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoint_fieldAccessorTable + .ensureFieldAccessorsInitialized( + Endpoint.class, Builder.class); + } + + public static final int IP_FIELD_NUMBER = 1; + private volatile Object ip_; + + /** + *

+         * ip address
+         * 
+ * + * string ip = 1; + * + * @return The ip. + */ + public String getIp() { + Object ref = ip_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + ip_ = s; + return s; + } + } + + /** + *
+         * ip address
+         * 
+ * + * string ip = 1; + * + * @return The bytes for ip. + */ + public com.google.protobuf.ByteString + getIpBytes() { + Object ref = ip_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + ip_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int PORT_FIELD_NUMBER = 2; + private int port_; + + /** + *
+         * port
+         * 
+ * + * int32 port = 2; + * + * @return The port. + */ + public int getPort() { + return port_; + } + + public static final int HOSTNAME_FIELD_NUMBER = 3; + private volatile Object hostname_; + + /** + *
+         * host name
+         * 
+ * + * string hostname = 3; + * + * @return The hostname. + */ + public String getHostname() { + Object ref = hostname_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + hostname_ = s; + return s; + } + } + + /** + *
+         * host name
+         * 
+ * + * string hostname = 3; + * + * @return The bytes for hostname. + */ + public com.google.protobuf.ByteString + getHostnameBytes() { + Object ref = hostname_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + hostname_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + + @Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!getIpBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, ip_); + } + if (port_ != 0) { + output.writeInt32(2, port_); + } + if (!getHostnameBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, hostname_); + } + unknownFields.writeTo(output); + } + + @Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!getIpBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, ip_); + } + if (port_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(2, port_); + } + if (!getHostnameBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, hostname_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @Override + public boolean equals(final Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof Endpoint)) { + return super.equals(obj); + } + Endpoint other = (Endpoint) obj; + + if (!getIp() + .equals(other.getIp())) return false; + if (getPort() + != other.getPort()) return false; + if (!getHostname() + .equals(other.getHostname())) return false; + return unknownFields.equals(other.unknownFields); + } + + @Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + IP_FIELD_NUMBER; + hash = (53 * hash) + getIp().hashCode(); + hash = (37 * hash) + PORT_FIELD_NUMBER; + hash = (53 * hash) + getPort(); + hash = (37 * hash) + HOSTNAME_FIELD_NUMBER; + hash = (53 * hash) + getHostname().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static Endpoint parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Endpoint parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Endpoint parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Endpoint parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Endpoint parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Endpoint parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Endpoint parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static Endpoint parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static Endpoint parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static Endpoint parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static Endpoint parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static Endpoint parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(Endpoint prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + *
+         * network endpoint
+         * 
+ *

+ * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.Endpoint} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:com.welab.wefe.gateway.api.meta.basic.Endpoint) + EndpointOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return BasicMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoint_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return BasicMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoint_fieldAccessorTable + .ensureFieldAccessorsInitialized( + Endpoint.class, Builder.class); + } + + // Construct using com.welab.wefe.gateway.api.meta.basic.BasicMetaProto.Endpoint.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + + @Override + public Builder clear() { + super.clear(); + ip_ = ""; + + port_ = 0; + + hostname_ = ""; + + return this; + } + + @Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return BasicMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoint_descriptor; + } + + @Override + public Endpoint getDefaultInstanceForType() { + return Endpoint.getDefaultInstance(); + } + + @Override + public Endpoint build() { + Endpoint result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @Override + public Endpoint buildPartial() { + Endpoint result = new Endpoint(this); + result.ip_ = ip_; + result.port_ = port_; + result.hostname_ = hostname_; + onBuilt(); + return result; + } + + @Override + public Builder clone() { + return super.clone(); + } + + @Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.setField(field, value); + } + + @Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, Object value) { + return super.setRepeatedField(field, index, value); + } + + @Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.addRepeatedField(field, value); + } + + @Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof Endpoint) { + return mergeFrom((Endpoint) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(Endpoint other) { + if (other == Endpoint.getDefaultInstance()) return this; + if (!other.getIp().isEmpty()) { + ip_ = other.ip_; + onChanged(); + } + if (other.getPort() != 0) { + setPort(other.getPort()); + } + if (!other.getHostname().isEmpty()) { + hostname_ = other.hostname_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @Override + public final boolean isInitialized() { + return true; + } + + @Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + Endpoint parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (Endpoint) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private Object ip_ = ""; + + /** + *

+             * ip address
+             * 
+ * + * string ip = 1; + * + * @return The ip. + */ + public String getIp() { + Object ref = ip_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + ip_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + *
+             * ip address
+             * 
+ * + * string ip = 1; + * + * @return The bytes for ip. + */ + public com.google.protobuf.ByteString + getIpBytes() { + Object ref = ip_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + ip_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + *
+             * ip address
+             * 
+ * + * string ip = 1; + * + * @param value The ip to set. + * @return This builder for chaining. + */ + public Builder setIp( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + ip_ = value; + onChanged(); + return this; + } + + /** + *
+             * ip address
+             * 
+ * + * string ip = 1; + * + * @return This builder for chaining. + */ + public Builder clearIp() { + + ip_ = getDefaultInstance().getIp(); + onChanged(); + return this; + } + + /** + *
+             * ip address
+             * 
+ * + * string ip = 1; + * + * @param value The bytes for ip to set. + * @return This builder for chaining. + */ + public Builder setIpBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + ip_ = value; + onChanged(); + return this; + } + + private int port_; + + /** + *
+             * port
+             * 
+ * + * int32 port = 2; + * + * @return The port. + */ + public int getPort() { + return port_; + } + + /** + *
+             * port
+             * 
+ * + * int32 port = 2; + * + * @param value The port to set. + * @return This builder for chaining. + */ + public Builder setPort(int value) { + + port_ = value; + onChanged(); + return this; + } + + /** + *
+             * port
+             * 
+ * + * int32 port = 2; + * + * @return This builder for chaining. + */ + public Builder clearPort() { + + port_ = 0; + onChanged(); + return this; + } + + private Object hostname_ = ""; + + /** + *
+             * host name
+             * 
+ * + * string hostname = 3; + * + * @return The hostname. + */ + public String getHostname() { + Object ref = hostname_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + hostname_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + *
+             * host name
+             * 
+ * + * string hostname = 3; + * + * @return The bytes for hostname. + */ + public com.google.protobuf.ByteString + getHostnameBytes() { + Object ref = hostname_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + hostname_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + *
+             * host name
+             * 
+ * + * string hostname = 3; + * + * @param value The hostname to set. + * @return This builder for chaining. + */ + public Builder setHostname( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + hostname_ = value; + onChanged(); + return this; + } + + /** + *
+             * host name
+             * 
+ * + * string hostname = 3; + * + * @return This builder for chaining. + */ + public Builder clearHostname() { + + hostname_ = getDefaultInstance().getHostname(); + onChanged(); + return this; + } + + /** + *
+             * host name
+             * 
+ * + * string hostname = 3; + * + * @param value The bytes for hostname to set. + * @return This builder for chaining. + */ + public Builder setHostnameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + hostname_ = value; + onChanged(); + return this; + } + + @Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:com.welab.wefe.gateway.api.meta.basic.Endpoint) + } + + // @@protoc_insertion_point(class_scope:com.welab.wefe.gateway.api.meta.basic.Endpoint) + private static final Endpoint DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new Endpoint(); + } + + public static Endpoint getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @Override + public Endpoint parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Endpoint(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @Override + public Endpoint getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface EndpointsOrBuilder extends + // @@protoc_insertion_point(interface_extends:com.welab.wefe.gateway.api.meta.basic.Endpoints) + com.google.protobuf.MessageOrBuilder { + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + java.util.List + getEndpointsList(); + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + Endpoint getEndpoints(int index); + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + int getEndpointsCount(); + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + java.util.List + getEndpointsOrBuilderList(); + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + EndpointOrBuilder getEndpointsOrBuilder( + int index); + } + + /** + * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.Endpoints} + */ + public static final class Endpoints extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:com.welab.wefe.gateway.api.meta.basic.Endpoints) + EndpointsOrBuilder { + private static final long serialVersionUID = 0L; + + // Use Endpoints.newBuilder() to construct. + private Endpoints(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private Endpoints() { + endpoints_ = java.util.Collections.emptyList(); + } + + @Override + @SuppressWarnings({"unused"}) + protected Object newInstance( + UnusedPrivateParameter unused) { + return new Endpoints(); + } + + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + + private Endpoints( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + endpoints_ = new java.util.ArrayList<>(); + mutable_bitField0_ |= 0x00000001; + } + endpoints_.add( + input.readMessage(Endpoint.parser(), extensionRegistry)); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + endpoints_ = java.util.Collections.unmodifiableList(endpoints_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return BasicMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoints_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return BasicMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoints_fieldAccessorTable + .ensureFieldAccessorsInitialized( + Endpoints.class, Builder.class); + } + + public static final int ENDPOINTS_FIELD_NUMBER = 1; + private java.util.List endpoints_; + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public java.util.List getEndpointsList() { + return endpoints_; + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public java.util.List + getEndpointsOrBuilderList() { + return endpoints_; + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public int getEndpointsCount() { + return endpoints_.size(); + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public Endpoint getEndpoints(int index) { + return endpoints_.get(index); + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public EndpointOrBuilder getEndpointsOrBuilder( + int index) { + return endpoints_.get(index); + } + + private byte memoizedIsInitialized = -1; + + @Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + for (int i = 0; i < endpoints_.size(); i++) { + output.writeMessage(1, endpoints_.get(i)); + } + unknownFields.writeTo(output); + } + + @Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < endpoints_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, endpoints_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @Override + public boolean equals(final Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof Endpoints)) { + return super.equals(obj); + } + Endpoints other = (Endpoints) obj; + + if (!getEndpointsList() + .equals(other.getEndpointsList())) return false; + return unknownFields.equals(other.unknownFields); + } + + @Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getEndpointsCount() > 0) { + hash = (37 * hash) + ENDPOINTS_FIELD_NUMBER; + hash = (53 * hash) + getEndpointsList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static Endpoints parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Endpoints parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Endpoints parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Endpoints parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Endpoints parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Endpoints parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Endpoints parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static Endpoints parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static Endpoints parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static Endpoints parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static Endpoints parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static Endpoints parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(Endpoints prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.Endpoints} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:com.welab.wefe.gateway.api.meta.basic.Endpoints) + EndpointsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return BasicMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoints_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return BasicMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoints_fieldAccessorTable + .ensureFieldAccessorsInitialized( + Endpoints.class, Builder.class); + } + + // Construct using com.welab.wefe.gateway.api.meta.basic.BasicMetaProto.Endpoints.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getEndpointsFieldBuilder(); + } + } + + @Override + public Builder clear() { + super.clear(); + if (endpointsBuilder_ == null) { + endpoints_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + endpointsBuilder_.clear(); + } + return this; + } + + @Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return BasicMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoints_descriptor; + } + + @Override + public Endpoints getDefaultInstanceForType() { + return Endpoints.getDefaultInstance(); + } + + @Override + public Endpoints build() { + Endpoints result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @Override + public Endpoints buildPartial() { + Endpoints result = new Endpoints(this); + int from_bitField0_ = bitField0_; + if (endpointsBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + endpoints_ = java.util.Collections.unmodifiableList(endpoints_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.endpoints_ = endpoints_; + } else { + result.endpoints_ = endpointsBuilder_.build(); + } + onBuilt(); + return result; + } + + @Override + public Builder clone() { + return super.clone(); + } + + @Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.setField(field, value); + } + + @Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, Object value) { + return super.setRepeatedField(field, index, value); + } + + @Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.addRepeatedField(field, value); + } + + @Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof Endpoints) { + return mergeFrom((Endpoints) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(Endpoints other) { + if (other == Endpoints.getDefaultInstance()) return this; + if (endpointsBuilder_ == null) { + if (!other.endpoints_.isEmpty()) { + if (endpoints_.isEmpty()) { + endpoints_ = other.endpoints_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureEndpointsIsMutable(); + endpoints_.addAll(other.endpoints_); + } + onChanged(); + } + } else { + if (!other.endpoints_.isEmpty()) { + if (endpointsBuilder_.isEmpty()) { + endpointsBuilder_.dispose(); + endpointsBuilder_ = null; + endpoints_ = other.endpoints_; + bitField0_ = (bitField0_ & ~0x00000001); + endpointsBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getEndpointsFieldBuilder() : null; + } else { + endpointsBuilder_.addAllMessages(other.endpoints_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @Override + public final boolean isInitialized() { + return true; + } + + @Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + Endpoints parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (Endpoints) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int bitField0_; + + private java.util.List endpoints_ = + java.util.Collections.emptyList(); + + private void ensureEndpointsIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + endpoints_ = new java.util.ArrayList(endpoints_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + Endpoint, Endpoint.Builder, EndpointOrBuilder> endpointsBuilder_; + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public java.util.List getEndpointsList() { + if (endpointsBuilder_ == null) { + return java.util.Collections.unmodifiableList(endpoints_); + } else { + return endpointsBuilder_.getMessageList(); + } + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public int getEndpointsCount() { + if (endpointsBuilder_ == null) { + return endpoints_.size(); + } else { + return endpointsBuilder_.getCount(); + } + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public Endpoint getEndpoints(int index) { + if (endpointsBuilder_ == null) { + return endpoints_.get(index); + } else { + return endpointsBuilder_.getMessage(index); + } + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public Builder setEndpoints( + int index, Endpoint value) { + if (endpointsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureEndpointsIsMutable(); + endpoints_.set(index, value); + onChanged(); + } else { + endpointsBuilder_.setMessage(index, value); + } + return this; + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public Builder setEndpoints( + int index, Endpoint.Builder builderForValue) { + if (endpointsBuilder_ == null) { + ensureEndpointsIsMutable(); + endpoints_.set(index, builderForValue.build()); + onChanged(); + } else { + endpointsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public Builder addEndpoints(Endpoint value) { + if (endpointsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureEndpointsIsMutable(); + endpoints_.add(value); + onChanged(); + } else { + endpointsBuilder_.addMessage(value); + } + return this; + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public Builder addEndpoints( + int index, Endpoint value) { + if (endpointsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureEndpointsIsMutable(); + endpoints_.add(index, value); + onChanged(); + } else { + endpointsBuilder_.addMessage(index, value); + } + return this; + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public Builder addEndpoints( + Endpoint.Builder builderForValue) { + if (endpointsBuilder_ == null) { + ensureEndpointsIsMutable(); + endpoints_.add(builderForValue.build()); + onChanged(); + } else { + endpointsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public Builder addEndpoints( + int index, Endpoint.Builder builderForValue) { + if (endpointsBuilder_ == null) { + ensureEndpointsIsMutable(); + endpoints_.add(index, builderForValue.build()); + onChanged(); + } else { + endpointsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public Builder addAllEndpoints( + Iterable values) { + if (endpointsBuilder_ == null) { + ensureEndpointsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, endpoints_); + onChanged(); + } else { + endpointsBuilder_.addAllMessages(values); + } + return this; + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public Builder clearEndpoints() { + if (endpointsBuilder_ == null) { + endpoints_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + endpointsBuilder_.clear(); + } + return this; + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public Builder removeEndpoints(int index) { + if (endpointsBuilder_ == null) { + ensureEndpointsIsMutable(); + endpoints_.remove(index); + onChanged(); + } else { + endpointsBuilder_.remove(index); + } + return this; + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public Endpoint.Builder getEndpointsBuilder( + int index) { + return getEndpointsFieldBuilder().getBuilder(index); + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public EndpointOrBuilder getEndpointsOrBuilder( + int index) { + if (endpointsBuilder_ == null) { + return endpoints_.get(index); + } else { + return endpointsBuilder_.getMessageOrBuilder(index); + } + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public java.util.List + getEndpointsOrBuilderList() { + if (endpointsBuilder_ != null) { + return endpointsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(endpoints_); + } + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public Endpoint.Builder addEndpointsBuilder() { + return getEndpointsFieldBuilder().addBuilder( + Endpoint.getDefaultInstance()); + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public Endpoint.Builder addEndpointsBuilder( + int index) { + return getEndpointsFieldBuilder().addBuilder( + index, Endpoint.getDefaultInstance()); + } + + /** + * repeated .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoints = 1; + */ + public java.util.List + getEndpointsBuilderList() { + return getEndpointsFieldBuilder().getBuilderList(); + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + Endpoint, Endpoint.Builder, EndpointOrBuilder> + getEndpointsFieldBuilder() { + if (endpointsBuilder_ == null) { + endpointsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + Endpoint, Endpoint.Builder, EndpointOrBuilder>( + endpoints_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + endpoints_ = null; + } + return endpointsBuilder_; + } + + @Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:com.welab.wefe.gateway.api.meta.basic.Endpoints) + } + + // @@protoc_insertion_point(class_scope:com.welab.wefe.gateway.api.meta.basic.Endpoints) + private static final Endpoints DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new Endpoints(); + } + + public static Endpoints getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @Override + public Endpoints parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Endpoints(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @Override + public Endpoints getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ReturnStatusOrBuilder extends + // @@protoc_insertion_point(interface_extends:com.welab.wefe.gateway.api.meta.basic.ReturnStatus) + com.google.protobuf.MessageOrBuilder { + + /** + * int32 code = 1; + * + * @return The code. + */ + int getCode(); + + /** + * string message = 2; + * + * @return The message. + */ + String getMessage(); + + /** + * string message = 2; + * + * @return The bytes for message. + */ + com.google.protobuf.ByteString + getMessageBytes(); + + /** + * string sessionId = 3; + * + * @return The sessionId. + */ + String getSessionId(); + + /** + * string sessionId = 3; + * + * @return The bytes for sessionId. + */ + com.google.protobuf.ByteString + getSessionIdBytes(); + + /** + * string data = 4; + * + * @return The data. + */ + String getData(); + + /** + * string data = 4; + * + * @return The bytes for data. + */ + com.google.protobuf.ByteString + getDataBytes(); + } + + /** + *
+     * generic return status
+     * 
+ *

+ * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.ReturnStatus} + */ + public static final class ReturnStatus extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:com.welab.wefe.gateway.api.meta.basic.ReturnStatus) + ReturnStatusOrBuilder { + private static final long serialVersionUID = 0L; + + // Use ReturnStatus.newBuilder() to construct. + private ReturnStatus(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private ReturnStatus() { + message_ = ""; + sessionId_ = ""; + data_ = ""; + } + + @Override + @SuppressWarnings({"unused"}) + protected Object newInstance( + UnusedPrivateParameter unused) { + return new ReturnStatus(); + } + + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + + private ReturnStatus( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + + code_ = input.readInt32(); + break; + } + case 18: { + String s = input.readStringRequireUtf8(); + + message_ = s; + break; + } + case 26: { + String s = input.readStringRequireUtf8(); + + sessionId_ = s; + break; + } + case 34: { + String s = input.readStringRequireUtf8(); + + data_ = s; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return BasicMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_ReturnStatus_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return BasicMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_ReturnStatus_fieldAccessorTable + .ensureFieldAccessorsInitialized( + ReturnStatus.class, Builder.class); + } + + public static final int CODE_FIELD_NUMBER = 1; + private int code_; + + /** + * int32 code = 1; + * + * @return The code. + */ + public int getCode() { + return code_; + } + + public static final int MESSAGE_FIELD_NUMBER = 2; + private volatile Object message_; + + /** + * string message = 2; + * + * @return The message. + */ + public String getMessage() { + Object ref = message_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + message_ = s; + return s; + } + } + + /** + * string message = 2; + * + * @return The bytes for message. + */ + public com.google.protobuf.ByteString + getMessageBytes() { + Object ref = message_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + message_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int SESSIONID_FIELD_NUMBER = 3; + private volatile Object sessionId_; + + /** + * string sessionId = 3; + * + * @return The sessionId. + */ + public String getSessionId() { + Object ref = sessionId_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + sessionId_ = s; + return s; + } + } + + /** + * string sessionId = 3; + * + * @return The bytes for sessionId. + */ + public com.google.protobuf.ByteString + getSessionIdBytes() { + Object ref = sessionId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + sessionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int DATA_FIELD_NUMBER = 4; + private volatile Object data_; + + /** + * string data = 4; + * + * @return The data. + */ + public String getData() { + Object ref = data_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + data_ = s; + return s; + } + } + + /** + * string data = 4; + * + * @return The bytes for data. + */ + public com.google.protobuf.ByteString + getDataBytes() { + Object ref = data_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + data_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + + @Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (code_ != 0) { + output.writeInt32(1, code_); + } + if (!getMessageBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, message_); + } + if (!getSessionIdBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, sessionId_); + } + if (!getDataBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, data_); + } + unknownFields.writeTo(output); + } + + @Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (code_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(1, code_); + } + if (!getMessageBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, message_); + } + if (!getSessionIdBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, sessionId_); + } + if (!getDataBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, data_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @Override + public boolean equals(final Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof ReturnStatus)) { + return super.equals(obj); + } + ReturnStatus other = (ReturnStatus) obj; + + if (getCode() + != other.getCode()) return false; + if (!getMessage() + .equals(other.getMessage())) return false; + if (!getSessionId() + .equals(other.getSessionId())) return false; + if (!getData() + .equals(other.getData())) return false; + return unknownFields.equals(other.unknownFields); + } + + @Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + CODE_FIELD_NUMBER; + hash = (53 * hash) + getCode(); + hash = (37 * hash) + MESSAGE_FIELD_NUMBER; + hash = (53 * hash) + getMessage().hashCode(); + hash = (37 * hash) + SESSIONID_FIELD_NUMBER; + hash = (53 * hash) + getSessionId().hashCode(); + hash = (37 * hash) + DATA_FIELD_NUMBER; + hash = (53 * hash) + getData().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static ReturnStatus parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static ReturnStatus parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static ReturnStatus parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static ReturnStatus parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static ReturnStatus parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static ReturnStatus parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static ReturnStatus parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static ReturnStatus parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static ReturnStatus parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static ReturnStatus parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static ReturnStatus parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static ReturnStatus parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(ReturnStatus prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + *

+         * generic return status
+         * 
+ *

+ * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.ReturnStatus} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:com.welab.wefe.gateway.api.meta.basic.ReturnStatus) + ReturnStatusOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return BasicMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_ReturnStatus_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return BasicMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_ReturnStatus_fieldAccessorTable + .ensureFieldAccessorsInitialized( + ReturnStatus.class, Builder.class); + } + + // Construct using com.welab.wefe.gateway.api.meta.basic.BasicMetaProto.ReturnStatus.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + + @Override + public Builder clear() { + super.clear(); + code_ = 0; + + message_ = ""; + + sessionId_ = ""; + + data_ = ""; + + return this; + } + + @Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return BasicMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_ReturnStatus_descriptor; + } + + @Override + public ReturnStatus getDefaultInstanceForType() { + return ReturnStatus.getDefaultInstance(); + } + + @Override + public ReturnStatus build() { + ReturnStatus result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @Override + public ReturnStatus buildPartial() { + ReturnStatus result = new ReturnStatus(this); + result.code_ = code_; + result.message_ = message_; + result.sessionId_ = sessionId_; + result.data_ = data_; + onBuilt(); + return result; + } + + @Override + public Builder clone() { + return super.clone(); + } + + @Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.setField(field, value); + } + + @Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, Object value) { + return super.setRepeatedField(field, index, value); + } + + @Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.addRepeatedField(field, value); + } + + @Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof ReturnStatus) { + return mergeFrom((ReturnStatus) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(ReturnStatus other) { + if (other == ReturnStatus.getDefaultInstance()) return this; + if (other.getCode() != 0) { + setCode(other.getCode()); + } + if (!other.getMessage().isEmpty()) { + message_ = other.message_; + onChanged(); + } + if (!other.getSessionId().isEmpty()) { + sessionId_ = other.sessionId_; + onChanged(); + } + if (!other.getData().isEmpty()) { + data_ = other.data_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @Override + public final boolean isInitialized() { + return true; + } + + @Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + ReturnStatus parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (ReturnStatus) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int code_; + + /** + * int32 code = 1; + * + * @return The code. + */ + public int getCode() { + return code_; + } + + /** + * int32 code = 1; + * + * @param value The code to set. + * @return This builder for chaining. + */ + public Builder setCode(int value) { + + code_ = value; + onChanged(); + return this; + } + + /** + * int32 code = 1; + * + * @return This builder for chaining. + */ + public Builder clearCode() { + + code_ = 0; + onChanged(); + return this; + } + + private Object message_ = ""; + + /** + * string message = 2; + * + * @return The message. + */ + public String getMessage() { + Object ref = message_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + message_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + * string message = 2; + * + * @return The bytes for message. + */ + public com.google.protobuf.ByteString + getMessageBytes() { + Object ref = message_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + message_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string message = 2; + * + * @param value The message to set. + * @return This builder for chaining. + */ + public Builder setMessage( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + message_ = value; + onChanged(); + return this; + } + + /** + * string message = 2; + * + * @return This builder for chaining. + */ + public Builder clearMessage() { + + message_ = getDefaultInstance().getMessage(); + onChanged(); + return this; + } + + /** + * string message = 2; + * + * @param value The bytes for message to set. + * @return This builder for chaining. + */ + public Builder setMessageBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + message_ = value; + onChanged(); + return this; + } + + private Object sessionId_ = ""; + + /** + * string sessionId = 3; + * + * @return The sessionId. + */ + public String getSessionId() { + Object ref = sessionId_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + sessionId_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + * string sessionId = 3; + * + * @return The bytes for sessionId. + */ + public com.google.protobuf.ByteString + getSessionIdBytes() { + Object ref = sessionId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + sessionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string sessionId = 3; + * + * @param value The sessionId to set. + * @return This builder for chaining. + */ + public Builder setSessionId( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + sessionId_ = value; + onChanged(); + return this; + } + + /** + * string sessionId = 3; + * + * @return This builder for chaining. + */ + public Builder clearSessionId() { + + sessionId_ = getDefaultInstance().getSessionId(); + onChanged(); + return this; + } + + /** + * string sessionId = 3; + * + * @param value The bytes for sessionId to set. + * @return This builder for chaining. + */ + public Builder setSessionIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + sessionId_ = value; + onChanged(); + return this; + } + + private Object data_ = ""; + + /** + * string data = 4; + * + * @return The data. + */ + public String getData() { + Object ref = data_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + data_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + * string data = 4; + * + * @return The bytes for data. + */ + public com.google.protobuf.ByteString + getDataBytes() { + Object ref = data_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + data_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string data = 4; + * + * @param value The data to set. + * @return This builder for chaining. + */ + public Builder setData( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + data_ = value; + onChanged(); + return this; + } + + /** + * string data = 4; + * + * @return This builder for chaining. + */ + public Builder clearData() { + + data_ = getDefaultInstance().getData(); + onChanged(); + return this; + } + + /** + * string data = 4; + * + * @param value The bytes for data to set. + * @return This builder for chaining. + */ + public Builder setDataBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + data_ = value; + onChanged(); + return this; + } + + @Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:com.welab.wefe.gateway.api.meta.basic.ReturnStatus) + } + + // @@protoc_insertion_point(class_scope:com.welab.wefe.gateway.api.meta.basic.ReturnStatus) + private static final ReturnStatus DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new ReturnStatus(); + } + + public static ReturnStatus getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @Override + public ReturnStatus parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ReturnStatus(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @Override + public ReturnStatus getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoint_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoint_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoints_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoints_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_com_welab_wefe_gateway_api_meta_basic_ReturnStatus_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_com_welab_wefe_gateway_api_meta_basic_ReturnStatus_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + + private static final com.google.protobuf.Descriptors.FileDescriptor + descriptor; + + static { + String[] descriptorData = { + "\n\020basic-meta.proto\022%com.welab.wefe.gatew" + + "ay.api.meta.basic\"6\n\010Endpoint\022\n\n\002ip\030\001 \001(" + + "\t\022\014\n\004port\030\002 \001(\005\022\020\n\010hostname\030\003 \001(\t\"O\n\tEnd" + + "points\022B\n\tendpoints\030\001 \003(\0132/.com.welab.we" + + "fe.gateway.api.meta.basic.Endpoint\"N\n\014Re" + + "turnStatus\022\014\n\004code\030\001 \001(\005\022\017\n\007message\030\002 \001(" + + "\t\022\021\n\tsessionId\030\003 \001(\t\022\014\n\004data\030\004 \001(\tB\020B\016Ba" + + "sicMetaProtob\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[]{ + }); + internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoint_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoint_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoint_descriptor, + new String[]{"Ip", "Port", "Hostname",}); + internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoints_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoints_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_com_welab_wefe_gateway_api_meta_basic_Endpoints_descriptor, + new String[]{"Endpoints",}); + internal_static_com_welab_wefe_gateway_api_meta_basic_ReturnStatus_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_com_welab_wefe_gateway_api_meta_basic_ReturnStatus_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_com_welab_wefe_gateway_api_meta_basic_ReturnStatus_descriptor, + new String[]{"Code", "Message", "SessionId", "Data",}); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/meta/basic/GatewayMetaProto.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/meta/basic/GatewayMetaProto.java" new file mode 100644 index 0000000000000000000000000000000000000000..77dfde4fc70d2f2daa453f8e8af22a59df65ef76 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/meta/basic/GatewayMetaProto.java" @@ -0,0 +1,8381 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: gateway-meta.proto + +package com.welab.wefe.board.service.proto.meta.basic; + +/** + * @author aaron.li + */ +public final class GatewayMetaProto { + private GatewayMetaProto() { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + + /** + * Protobuf enum {@code com.welab.wefe.gateway.api.meta.basic.TransferStatus} + */ + public enum TransferStatus + implements com.google.protobuf.ProtocolMessageEnum { + /** + * NOT_PROCESSED = 0; + */ + NOT_PROCESSED(0), + /** + * INITIALIZING = 1; + */ + INITIALIZING(1), + /** + * PROCESSING = 2; + */ + PROCESSING(2), + /** + * COMPLETE = 3; + */ + COMPLETE(3), + /** + * ERROR = 4; + */ + ERROR(4), + /** + * CANCELLED = 5; + */ + CANCELLED(5), + UNRECOGNIZED(-1), + ; + + /** + * NOT_PROCESSED = 0; + */ + public static final int NOT_PROCESSED_VALUE = 0; + /** + * INITIALIZING = 1; + */ + public static final int INITIALIZING_VALUE = 1; + /** + * PROCESSING = 2; + */ + public static final int PROCESSING_VALUE = 2; + /** + * COMPLETE = 3; + */ + public static final int COMPLETE_VALUE = 3; + /** + * ERROR = 4; + */ + public static final int ERROR_VALUE = 4; + /** + * CANCELLED = 5; + */ + public static final int CANCELLED_VALUE = 5; + + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @Deprecated + public static TransferStatus valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static TransferStatus forNumber(int value) { + switch (value) { + case 0: + return NOT_PROCESSED; + case 1: + return INITIALIZING; + case 2: + return PROCESSING; + case 3: + return COMPLETE; + case 4: + return ERROR; + case 5: + return CANCELLED; + default: + return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + + private static final com.google.protobuf.Internal.EnumLiteMap< + TransferStatus> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public TransferStatus findValueByNumber(int number) { + return TransferStatus.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return GatewayMetaProto.getDescriptor().getEnumTypes().get(0); + } + + private static final TransferStatus[] VALUES = values(); + + public static TransferStatus valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + TransferStatus(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:com.welab.wefe.gateway.api.meta.basic.TransferStatus) + } + + public interface JobOrBuilder extends + // @@protoc_insertion_point(interface_extends:com.welab.wefe.gateway.api.meta.basic.Job) + com.google.protobuf.MessageOrBuilder { + + /** + *

+         * Id
+         * 
+ * + * string jobId = 1; + * + * @return The jobId. + */ + String getJobId(); + + /** + *
+         * Id
+         * 
+ * + * string jobId = 1; + * + * @return The bytes for jobId. + */ + com.google.protobuf.ByteString + getJobIdBytes(); + + /** + *
+         * 鍚嶇О
+         * 
+ * + * string jobName = 2; + * + * @return The jobName. + */ + String getJobName(); + + /** + *
+         * 鍚嶇О
+         * 
+ * + * string jobName = 2; + * + * @return The bytes for jobName. + */ + com.google.protobuf.ByteString + getJobNameBytes(); + } + + /** + * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.Job} + */ + public static final class Job extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:com.welab.wefe.gateway.api.meta.basic.Job) + JobOrBuilder { + private static final long serialVersionUID = 0L; + + // Use Job.newBuilder() to construct. + private Job(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private Job() { + jobId_ = ""; + jobName_ = ""; + } + + @Override + @SuppressWarnings({"unused"}) + protected Object newInstance( + UnusedPrivateParameter unused) { + return new Job(); + } + + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + + private Job( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + String s = input.readStringRequireUtf8(); + + jobId_ = s; + break; + } + case 18: { + String s = input.readStringRequireUtf8(); + + jobName_ = s; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Job_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Job_fieldAccessorTable + .ensureFieldAccessorsInitialized( + Job.class, Builder.class); + } + + public static final int JOBID_FIELD_NUMBER = 1; + private volatile Object jobId_; + + /** + *
+         * Id
+         * 
+ * + * string jobId = 1; + * + * @return The jobId. + */ + public String getJobId() { + Object ref = jobId_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + jobId_ = s; + return s; + } + } + + /** + *
+         * Id
+         * 
+ * + * string jobId = 1; + * + * @return The bytes for jobId. + */ + public com.google.protobuf.ByteString + getJobIdBytes() { + Object ref = jobId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + jobId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int JOBNAME_FIELD_NUMBER = 2; + private volatile Object jobName_; + + /** + *
+         * 鍚嶇О
+         * 
+ * + * string jobName = 2; + * + * @return The jobName. + */ + public String getJobName() { + Object ref = jobName_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + jobName_ = s; + return s; + } + } + + /** + *
+         * 鍚嶇О
+         * 
+ * + * string jobName = 2; + * + * @return The bytes for jobName. + */ + public com.google.protobuf.ByteString + getJobNameBytes() { + Object ref = jobName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + jobName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + + @Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!getJobIdBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, jobId_); + } + if (!getJobNameBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, jobName_); + } + unknownFields.writeTo(output); + } + + @Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!getJobIdBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, jobId_); + } + if (!getJobNameBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, jobName_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @Override + public boolean equals(final Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof Job)) { + return super.equals(obj); + } + Job other = (Job) obj; + + if (!getJobId() + .equals(other.getJobId())) return false; + if (!getJobName() + .equals(other.getJobName())) return false; + return unknownFields.equals(other.unknownFields); + } + + @Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + JOBID_FIELD_NUMBER; + hash = (53 * hash) + getJobId().hashCode(); + hash = (37 * hash) + JOBNAME_FIELD_NUMBER; + hash = (53 * hash) + getJobName().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static Job parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Job parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Job parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Job parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Job parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Job parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Job parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static Job parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static Job parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static Job parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static Job parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static Job parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(Job prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.Job} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:com.welab.wefe.gateway.api.meta.basic.Job) + JobOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Job_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Job_fieldAccessorTable + .ensureFieldAccessorsInitialized( + Job.class, Builder.class); + } + + // Construct using com.welab.wefe.gateway.api.meta.basic.GatewayMetaProto.Job.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + + @Override + public Builder clear() { + super.clear(); + jobId_ = ""; + + jobName_ = ""; + + return this; + } + + @Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Job_descriptor; + } + + @Override + public Job getDefaultInstanceForType() { + return Job.getDefaultInstance(); + } + + @Override + public Job build() { + Job result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @Override + public Job buildPartial() { + Job result = new Job(this); + result.jobId_ = jobId_; + result.jobName_ = jobName_; + onBuilt(); + return result; + } + + @Override + public Builder clone() { + return super.clone(); + } + + @Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.setField(field, value); + } + + @Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, Object value) { + return super.setRepeatedField(field, index, value); + } + + @Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.addRepeatedField(field, value); + } + + @Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof Job) { + return mergeFrom((Job) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(Job other) { + if (other == Job.getDefaultInstance()) return this; + if (!other.getJobId().isEmpty()) { + jobId_ = other.jobId_; + onChanged(); + } + if (!other.getJobName().isEmpty()) { + jobName_ = other.jobName_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @Override + public final boolean isInitialized() { + return true; + } + + @Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + Job parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (Job) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private Object jobId_ = ""; + + /** + *
+             * Id
+             * 
+ * + * string jobId = 1; + * + * @return The jobId. + */ + public String getJobId() { + Object ref = jobId_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + jobId_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + *
+             * Id
+             * 
+ * + * string jobId = 1; + * + * @return The bytes for jobId. + */ + public com.google.protobuf.ByteString + getJobIdBytes() { + Object ref = jobId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + jobId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + *
+             * Id
+             * 
+ * + * string jobId = 1; + * + * @param value The jobId to set. + * @return This builder for chaining. + */ + public Builder setJobId( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + jobId_ = value; + onChanged(); + return this; + } + + /** + *
+             * Id
+             * 
+ * + * string jobId = 1; + * + * @return This builder for chaining. + */ + public Builder clearJobId() { + + jobId_ = getDefaultInstance().getJobId(); + onChanged(); + return this; + } + + /** + *
+             * Id
+             * 
+ * + * string jobId = 1; + * + * @param value The bytes for jobId to set. + * @return This builder for chaining. + */ + public Builder setJobIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + jobId_ = value; + onChanged(); + return this; + } + + private Object jobName_ = ""; + + /** + *
+             * 鍚嶇О
+             * 
+ * + * string jobName = 2; + * + * @return The jobName. + */ + public String getJobName() { + Object ref = jobName_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + jobName_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + *
+             * 鍚嶇О
+             * 
+ * + * string jobName = 2; + * + * @return The bytes for jobName. + */ + public com.google.protobuf.ByteString + getJobNameBytes() { + Object ref = jobName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + jobName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + *
+             * 鍚嶇О
+             * 
+ * + * string jobName = 2; + * + * @param value The jobName to set. + * @return This builder for chaining. + */ + public Builder setJobName( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + jobName_ = value; + onChanged(); + return this; + } + + /** + *
+             * 鍚嶇О
+             * 
+ * + * string jobName = 2; + * + * @return This builder for chaining. + */ + public Builder clearJobName() { + + jobName_ = getDefaultInstance().getJobName(); + onChanged(); + return this; + } + + /** + *
+             * 鍚嶇О
+             * 
+ * + * string jobName = 2; + * + * @param value The bytes for jobName to set. + * @return This builder for chaining. + */ + public Builder setJobNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + jobName_ = value; + onChanged(); + return this; + } + + @Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:com.welab.wefe.gateway.api.meta.basic.Job) + } + + // @@protoc_insertion_point(class_scope:com.welab.wefe.gateway.api.meta.basic.Job) + private static final Job DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new Job(); + } + + public static Job getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @Override + public Job parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Job(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @Override + public Job getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface TaskOrBuilder extends + // @@protoc_insertion_point(interface_extends:com.welab.wefe.gateway.api.meta.basic.Task) + com.google.protobuf.MessageOrBuilder { + + /** + *
+         * 浠诲姟ID
+         * 
+ * + * string taskId = 1; + * + * @return The taskId. + */ + String getTaskId(); + + /** + *
+         * 浠诲姟ID
+         * 
+ * + * string taskId = 1; + * + * @return The bytes for taskId. + */ + com.google.protobuf.ByteString + getTaskIdBytes(); + + /** + *
+         * 浠诲姟鍚嶇О
+         * 
+ * + * string taskName = 2; + * + * @return The taskName. + */ + String getTaskName(); + + /** + *
+         * 浠诲姟鍚嶇О
+         * 
+ * + * string taskName = 2; + * + * @return The bytes for taskName. + */ + com.google.protobuf.ByteString + getTaskNameBytes(); + + /** + * .com.welab.wefe.gateway.api.meta.basic.Job job = 3; + * + * @return Whether the job field is set. + */ + boolean hasJob(); + + /** + * .com.welab.wefe.gateway.api.meta.basic.Job job = 3; + * + * @return The job. + */ + Job getJob(); + + /** + * .com.welab.wefe.gateway.api.meta.basic.Job job = 3; + */ + JobOrBuilder getJobOrBuilder(); + } + + /** + * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.Task} + */ + public static final class Task extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:com.welab.wefe.gateway.api.meta.basic.Task) + TaskOrBuilder { + private static final long serialVersionUID = 0L; + + // Use Task.newBuilder() to construct. + private Task(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private Task() { + taskId_ = ""; + taskName_ = ""; + } + + @Override + @SuppressWarnings({"unused"}) + protected Object newInstance( + UnusedPrivateParameter unused) { + return new Task(); + } + + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + + private Task( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + String s = input.readStringRequireUtf8(); + + taskId_ = s; + break; + } + case 18: { + String s = input.readStringRequireUtf8(); + + taskName_ = s; + break; + } + case 26: { + Job.Builder subBuilder = null; + if (job_ != null) { + subBuilder = job_.toBuilder(); + } + job_ = input.readMessage(Job.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(job_); + job_ = subBuilder.buildPartial(); + } + + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Task_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Task_fieldAccessorTable + .ensureFieldAccessorsInitialized( + Task.class, Builder.class); + } + + public static final int TASKID_FIELD_NUMBER = 1; + private volatile Object taskId_; + + /** + *
+         * 浠诲姟ID
+         * 
+ * + * string taskId = 1; + * + * @return The taskId. + */ + public String getTaskId() { + Object ref = taskId_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + taskId_ = s; + return s; + } + } + + /** + *
+         * 浠诲姟ID
+         * 
+ * + * string taskId = 1; + * + * @return The bytes for taskId. + */ + public com.google.protobuf.ByteString + getTaskIdBytes() { + Object ref = taskId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + taskId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TASKNAME_FIELD_NUMBER = 2; + private volatile Object taskName_; + + /** + *
+         * 浠诲姟鍚嶇О
+         * 
+ * + * string taskName = 2; + * + * @return The taskName. + */ + public String getTaskName() { + Object ref = taskName_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + taskName_ = s; + return s; + } + } + + /** + *
+         * 浠诲姟鍚嶇О
+         * 
+ * + * string taskName = 2; + * + * @return The bytes for taskName. + */ + public com.google.protobuf.ByteString + getTaskNameBytes() { + Object ref = taskName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + taskName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int JOB_FIELD_NUMBER = 3; + private Job job_; + + /** + * .com.welab.wefe.gateway.api.meta.basic.Job job = 3; + * + * @return Whether the job field is set. + */ + public boolean hasJob() { + return job_ != null; + } + + /** + * .com.welab.wefe.gateway.api.meta.basic.Job job = 3; + * + * @return The job. + */ + public Job getJob() { + return job_ == null ? Job.getDefaultInstance() : job_; + } + + /** + * .com.welab.wefe.gateway.api.meta.basic.Job job = 3; + */ + public JobOrBuilder getJobOrBuilder() { + return getJob(); + } + + private byte memoizedIsInitialized = -1; + + @Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!getTaskIdBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, taskId_); + } + if (!getTaskNameBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, taskName_); + } + if (job_ != null) { + output.writeMessage(3, getJob()); + } + unknownFields.writeTo(output); + } + + @Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!getTaskIdBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, taskId_); + } + if (!getTaskNameBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, taskName_); + } + if (job_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, getJob()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @Override + public boolean equals(final Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof Task)) { + return super.equals(obj); + } + Task other = (Task) obj; + + if (!getTaskId() + .equals(other.getTaskId())) return false; + if (!getTaskName() + .equals(other.getTaskName())) return false; + if (hasJob() != other.hasJob()) return false; + if (hasJob()) { + if (!getJob() + .equals(other.getJob())) return false; + } + return unknownFields.equals(other.unknownFields); + } + + @Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + TASKID_FIELD_NUMBER; + hash = (53 * hash) + getTaskId().hashCode(); + hash = (37 * hash) + TASKNAME_FIELD_NUMBER; + hash = (53 * hash) + getTaskName().hashCode(); + if (hasJob()) { + hash = (37 * hash) + JOB_FIELD_NUMBER; + hash = (53 * hash) + getJob().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static Task parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Task parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Task parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Task parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Task parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Task parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Task parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static Task parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static Task parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static Task parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static Task parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static Task parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(Task prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.Task} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:com.welab.wefe.gateway.api.meta.basic.Task) + TaskOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Task_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Task_fieldAccessorTable + .ensureFieldAccessorsInitialized( + Task.class, Builder.class); + } + + // Construct using com.welab.wefe.gateway.api.meta.basic.GatewayMetaProto.Task.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + + @Override + public Builder clear() { + super.clear(); + taskId_ = ""; + + taskName_ = ""; + + if (jobBuilder_ == null) { + job_ = null; + } else { + job_ = null; + jobBuilder_ = null; + } + return this; + } + + @Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Task_descriptor; + } + + @Override + public Task getDefaultInstanceForType() { + return Task.getDefaultInstance(); + } + + @Override + public Task build() { + Task result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @Override + public Task buildPartial() { + Task result = new Task(this); + result.taskId_ = taskId_; + result.taskName_ = taskName_; + if (jobBuilder_ == null) { + result.job_ = job_; + } else { + result.job_ = jobBuilder_.build(); + } + onBuilt(); + return result; + } + + @Override + public Builder clone() { + return super.clone(); + } + + @Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.setField(field, value); + } + + @Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, Object value) { + return super.setRepeatedField(field, index, value); + } + + @Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.addRepeatedField(field, value); + } + + @Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof Task) { + return mergeFrom((Task) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(Task other) { + if (other == Task.getDefaultInstance()) return this; + if (!other.getTaskId().isEmpty()) { + taskId_ = other.taskId_; + onChanged(); + } + if (!other.getTaskName().isEmpty()) { + taskName_ = other.taskName_; + onChanged(); + } + if (other.hasJob()) { + mergeJob(other.getJob()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @Override + public final boolean isInitialized() { + return true; + } + + @Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + Task parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (Task) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private Object taskId_ = ""; + + /** + *
+             * 浠诲姟ID
+             * 
+ * + * string taskId = 1; + * + * @return The taskId. + */ + public String getTaskId() { + Object ref = taskId_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + taskId_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + *
+             * 浠诲姟ID
+             * 
+ * + * string taskId = 1; + * + * @return The bytes for taskId. + */ + public com.google.protobuf.ByteString + getTaskIdBytes() { + Object ref = taskId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + taskId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + *
+             * 浠诲姟ID
+             * 
+ * + * string taskId = 1; + * + * @param value The taskId to set. + * @return This builder for chaining. + */ + public Builder setTaskId( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + taskId_ = value; + onChanged(); + return this; + } + + /** + *
+             * 浠诲姟ID
+             * 
+ * + * string taskId = 1; + * + * @return This builder for chaining. + */ + public Builder clearTaskId() { + + taskId_ = getDefaultInstance().getTaskId(); + onChanged(); + return this; + } + + /** + *
+             * 浠诲姟ID
+             * 
+ * + * string taskId = 1; + * + * @param value The bytes for taskId to set. + * @return This builder for chaining. + */ + public Builder setTaskIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + taskId_ = value; + onChanged(); + return this; + } + + private Object taskName_ = ""; + + /** + *
+             * 浠诲姟鍚嶇О
+             * 
+ * + * string taskName = 2; + * + * @return The taskName. + */ + public String getTaskName() { + Object ref = taskName_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + taskName_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + *
+             * 浠诲姟鍚嶇О
+             * 
+ * + * string taskName = 2; + * + * @return The bytes for taskName. + */ + public com.google.protobuf.ByteString + getTaskNameBytes() { + Object ref = taskName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + taskName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + *
+             * 浠诲姟鍚嶇О
+             * 
+ * + * string taskName = 2; + * + * @param value The taskName to set. + * @return This builder for chaining. + */ + public Builder setTaskName( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + taskName_ = value; + onChanged(); + return this; + } + + /** + *
+             * 浠诲姟鍚嶇О
+             * 
+ * + * string taskName = 2; + * + * @return This builder for chaining. + */ + public Builder clearTaskName() { + + taskName_ = getDefaultInstance().getTaskName(); + onChanged(); + return this; + } + + /** + *
+             * 浠诲姟鍚嶇О
+             * 
+ * + * string taskName = 2; + * + * @param value The bytes for taskName to set. + * @return This builder for chaining. + */ + public Builder setTaskNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + taskName_ = value; + onChanged(); + return this; + } + + private Job job_; + private com.google.protobuf.SingleFieldBuilderV3< + Job, Job.Builder, JobOrBuilder> jobBuilder_; + + /** + * .com.welab.wefe.gateway.api.meta.basic.Job job = 3; + * + * @return Whether the job field is set. + */ + public boolean hasJob() { + return jobBuilder_ != null || job_ != null; + } + + /** + * .com.welab.wefe.gateway.api.meta.basic.Job job = 3; + * + * @return The job. + */ + public Job getJob() { + if (jobBuilder_ == null) { + return job_ == null ? Job.getDefaultInstance() : job_; + } else { + return jobBuilder_.getMessage(); + } + } + + /** + * .com.welab.wefe.gateway.api.meta.basic.Job job = 3; + */ + public Builder setJob(Job value) { + if (jobBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + job_ = value; + onChanged(); + } else { + jobBuilder_.setMessage(value); + } + + return this; + } + + /** + * .com.welab.wefe.gateway.api.meta.basic.Job job = 3; + */ + public Builder setJob( + Job.Builder builderForValue) { + if (jobBuilder_ == null) { + job_ = builderForValue.build(); + onChanged(); + } else { + jobBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + + /** + * .com.welab.wefe.gateway.api.meta.basic.Job job = 3; + */ + public Builder mergeJob(Job value) { + if (jobBuilder_ == null) { + if (job_ != null) { + job_ = + Job.newBuilder(job_).mergeFrom(value).buildPartial(); + } else { + job_ = value; + } + onChanged(); + } else { + jobBuilder_.mergeFrom(value); + } + + return this; + } + + /** + * .com.welab.wefe.gateway.api.meta.basic.Job job = 3; + */ + public Builder clearJob() { + if (jobBuilder_ == null) { + job_ = null; + onChanged(); + } else { + job_ = null; + jobBuilder_ = null; + } + + return this; + } + + /** + * .com.welab.wefe.gateway.api.meta.basic.Job job = 3; + */ + public Job.Builder getJobBuilder() { + + onChanged(); + return getJobFieldBuilder().getBuilder(); + } + + /** + * .com.welab.wefe.gateway.api.meta.basic.Job job = 3; + */ + public JobOrBuilder getJobOrBuilder() { + if (jobBuilder_ != null) { + return jobBuilder_.getMessageOrBuilder(); + } else { + return job_ == null ? + Job.getDefaultInstance() : job_; + } + } + + /** + * .com.welab.wefe.gateway.api.meta.basic.Job job = 3; + */ + private com.google.protobuf.SingleFieldBuilderV3< + Job, Job.Builder, JobOrBuilder> + getJobFieldBuilder() { + if (jobBuilder_ == null) { + jobBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + Job, Job.Builder, JobOrBuilder>( + getJob(), + getParentForChildren(), + isClean()); + job_ = null; + } + return jobBuilder_; + } + + @Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:com.welab.wefe.gateway.api.meta.basic.Task) + } + + // @@protoc_insertion_point(class_scope:com.welab.wefe.gateway.api.meta.basic.Task) + private static final Task DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new Task(); + } + + public static Task getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @Override + public Task parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Task(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @Override + public Task getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface MemberOrBuilder extends + // @@protoc_insertion_point(interface_extends:com.welab.wefe.gateway.api.meta.basic.Member) + com.google.protobuf.MessageOrBuilder { + + /** + *
+         * 鎴愬憳ID
+         * 
+ * + * string memberId = 1; + * + * @return The memberId. + */ + String getMemberId(); + + /** + *
+         * 鎴愬憳ID
+         * 
+ * + * string memberId = 1; + * + * @return The bytes for memberId. + */ + com.google.protobuf.ByteString + getMemberIdBytes(); + + /** + *
+         * 鎴愬姛鍚嶇О
+         * 
+ * + * string memberName = 2; + * + * @return The memberName. + */ + String getMemberName(); + + /** + *
+         * 鎴愬姛鍚嶇О
+         * 
+ * + * string memberName = 2; + * + * @return The bytes for memberName. + */ + com.google.protobuf.ByteString + getMemberNameBytes(); + + /** + *
+         * 鐩湴鍧
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoint = 3; + * + * @return Whether the endpoint field is set. + */ + boolean hasEndpoint(); + + /** + *
+         * 鐩湴鍧
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoint = 3; + * + * @return The endpoint. + */ + BasicMetaProto.Endpoint getEndpoint(); + + /** + *
+         * 鐩湴鍧
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoint = 3; + */ + BasicMetaProto.EndpointOrBuilder getEndpointOrBuilder(); + } + + /** + * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.Member} + */ + public static final class Member extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:com.welab.wefe.gateway.api.meta.basic.Member) + MemberOrBuilder { + private static final long serialVersionUID = 0L; + + // Use Member.newBuilder() to construct. + private Member(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private Member() { + memberId_ = ""; + memberName_ = ""; + } + + @Override + @SuppressWarnings({"unused"}) + protected Object newInstance( + UnusedPrivateParameter unused) { + return new Member(); + } + + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + + private Member( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + String s = input.readStringRequireUtf8(); + + memberId_ = s; + break; + } + case 18: { + String s = input.readStringRequireUtf8(); + + memberName_ = s; + break; + } + case 26: { + BasicMetaProto.Endpoint.Builder subBuilder = null; + if (endpoint_ != null) { + subBuilder = endpoint_.toBuilder(); + } + endpoint_ = input.readMessage(BasicMetaProto.Endpoint.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(endpoint_); + endpoint_ = subBuilder.buildPartial(); + } + + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Member_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Member_fieldAccessorTable + .ensureFieldAccessorsInitialized( + Member.class, Builder.class); + } + + public static final int MEMBERID_FIELD_NUMBER = 1; + private volatile Object memberId_; + + /** + *
+         * 鎴愬憳ID
+         * 
+ * + * string memberId = 1; + * + * @return The memberId. + */ + public String getMemberId() { + Object ref = memberId_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + memberId_ = s; + return s; + } + } + + /** + *
+         * 鎴愬憳ID
+         * 
+ * + * string memberId = 1; + * + * @return The bytes for memberId. + */ + public com.google.protobuf.ByteString + getMemberIdBytes() { + Object ref = memberId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + memberId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int MEMBERNAME_FIELD_NUMBER = 2; + private volatile Object memberName_; + + /** + *
+         * 鎴愬姛鍚嶇О
+         * 
+ * + * string memberName = 2; + * + * @return The memberName. + */ + public String getMemberName() { + Object ref = memberName_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + memberName_ = s; + return s; + } + } + + /** + *
+         * 鎴愬姛鍚嶇О
+         * 
+ * + * string memberName = 2; + * + * @return The bytes for memberName. + */ + public com.google.protobuf.ByteString + getMemberNameBytes() { + Object ref = memberName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + memberName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int ENDPOINT_FIELD_NUMBER = 3; + private BasicMetaProto.Endpoint endpoint_; + + /** + *
+         * 鐩湴鍧
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoint = 3; + * + * @return Whether the endpoint field is set. + */ + public boolean hasEndpoint() { + return endpoint_ != null; + } + + /** + *
+         * 鐩湴鍧
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoint = 3; + * + * @return The endpoint. + */ + public BasicMetaProto.Endpoint getEndpoint() { + return endpoint_ == null ? BasicMetaProto.Endpoint.getDefaultInstance() : endpoint_; + } + + /** + *
+         * 鐩湴鍧
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoint = 3; + */ + public BasicMetaProto.EndpointOrBuilder getEndpointOrBuilder() { + return getEndpoint(); + } + + private byte memoizedIsInitialized = -1; + + @Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!getMemberIdBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, memberId_); + } + if (!getMemberNameBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, memberName_); + } + if (endpoint_ != null) { + output.writeMessage(3, getEndpoint()); + } + unknownFields.writeTo(output); + } + + @Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!getMemberIdBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, memberId_); + } + if (!getMemberNameBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, memberName_); + } + if (endpoint_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, getEndpoint()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @Override + public boolean equals(final Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof Member)) { + return super.equals(obj); + } + Member other = (Member) obj; + + if (!getMemberId() + .equals(other.getMemberId())) return false; + if (!getMemberName() + .equals(other.getMemberName())) return false; + if (hasEndpoint() != other.hasEndpoint()) return false; + if (hasEndpoint()) { + if (!getEndpoint() + .equals(other.getEndpoint())) return false; + } + return unknownFields.equals(other.unknownFields); + } + + @Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + MEMBERID_FIELD_NUMBER; + hash = (53 * hash) + getMemberId().hashCode(); + hash = (37 * hash) + MEMBERNAME_FIELD_NUMBER; + hash = (53 * hash) + getMemberName().hashCode(); + if (hasEndpoint()) { + hash = (37 * hash) + ENDPOINT_FIELD_NUMBER; + hash = (53 * hash) + getEndpoint().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static Member parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Member parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Member parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Member parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Member parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Member parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Member parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static Member parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static Member parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static Member parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static Member parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static Member parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(Member prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.Member} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:com.welab.wefe.gateway.api.meta.basic.Member) + MemberOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Member_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Member_fieldAccessorTable + .ensureFieldAccessorsInitialized( + Member.class, Builder.class); + } + + // Construct using com.welab.wefe.gateway.api.meta.basic.GatewayMetaProto.Member.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + + @Override + public Builder clear() { + super.clear(); + memberId_ = ""; + + memberName_ = ""; + + if (endpointBuilder_ == null) { + endpoint_ = null; + } else { + endpoint_ = null; + endpointBuilder_ = null; + } + return this; + } + + @Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Member_descriptor; + } + + @Override + public Member getDefaultInstanceForType() { + return Member.getDefaultInstance(); + } + + @Override + public Member build() { + Member result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @Override + public Member buildPartial() { + Member result = new Member(this); + result.memberId_ = memberId_; + result.memberName_ = memberName_; + if (endpointBuilder_ == null) { + result.endpoint_ = endpoint_; + } else { + result.endpoint_ = endpointBuilder_.build(); + } + onBuilt(); + return result; + } + + @Override + public Builder clone() { + return super.clone(); + } + + @Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.setField(field, value); + } + + @Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, Object value) { + return super.setRepeatedField(field, index, value); + } + + @Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.addRepeatedField(field, value); + } + + @Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof Member) { + return mergeFrom((Member) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(Member other) { + if (other == Member.getDefaultInstance()) return this; + if (!other.getMemberId().isEmpty()) { + memberId_ = other.memberId_; + onChanged(); + } + if (!other.getMemberName().isEmpty()) { + memberName_ = other.memberName_; + onChanged(); + } + if (other.hasEndpoint()) { + mergeEndpoint(other.getEndpoint()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @Override + public final boolean isInitialized() { + return true; + } + + @Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + Member parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (Member) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private Object memberId_ = ""; + + /** + *
+             * 鎴愬憳ID
+             * 
+ * + * string memberId = 1; + * + * @return The memberId. + */ + public String getMemberId() { + Object ref = memberId_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + memberId_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + *
+             * 鎴愬憳ID
+             * 
+ * + * string memberId = 1; + * + * @return The bytes for memberId. + */ + public com.google.protobuf.ByteString + getMemberIdBytes() { + Object ref = memberId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + memberId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + *
+             * 鎴愬憳ID
+             * 
+ * + * string memberId = 1; + * + * @param value The memberId to set. + * @return This builder for chaining. + */ + public Builder setMemberId( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + memberId_ = value; + onChanged(); + return this; + } + + /** + *
+             * 鎴愬憳ID
+             * 
+ * + * string memberId = 1; + * + * @return This builder for chaining. + */ + public Builder clearMemberId() { + + memberId_ = getDefaultInstance().getMemberId(); + onChanged(); + return this; + } + + /** + *
+             * 鎴愬憳ID
+             * 
+ * + * string memberId = 1; + * + * @param value The bytes for memberId to set. + * @return This builder for chaining. + */ + public Builder setMemberIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + memberId_ = value; + onChanged(); + return this; + } + + private Object memberName_ = ""; + + /** + *
+             * 鎴愬姛鍚嶇О
+             * 
+ * + * string memberName = 2; + * + * @return The memberName. + */ + public String getMemberName() { + Object ref = memberName_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + memberName_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + *
+             * 鎴愬姛鍚嶇О
+             * 
+ * + * string memberName = 2; + * + * @return The bytes for memberName. + */ + public com.google.protobuf.ByteString + getMemberNameBytes() { + Object ref = memberName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + memberName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + *
+             * 鎴愬姛鍚嶇О
+             * 
+ * + * string memberName = 2; + * + * @param value The memberName to set. + * @return This builder for chaining. + */ + public Builder setMemberName( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + memberName_ = value; + onChanged(); + return this; + } + + /** + *
+             * 鎴愬姛鍚嶇О
+             * 
+ * + * string memberName = 2; + * + * @return This builder for chaining. + */ + public Builder clearMemberName() { + + memberName_ = getDefaultInstance().getMemberName(); + onChanged(); + return this; + } + + /** + *
+             * 鎴愬姛鍚嶇О
+             * 
+ * + * string memberName = 2; + * + * @param value The bytes for memberName to set. + * @return This builder for chaining. + */ + public Builder setMemberNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + memberName_ = value; + onChanged(); + return this; + } + + private BasicMetaProto.Endpoint endpoint_; + private com.google.protobuf.SingleFieldBuilderV3< + BasicMetaProto.Endpoint, BasicMetaProto.Endpoint.Builder, BasicMetaProto.EndpointOrBuilder> endpointBuilder_; + + /** + *
+             * 鐩湴鍧
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoint = 3; + * + * @return Whether the endpoint field is set. + */ + public boolean hasEndpoint() { + return endpointBuilder_ != null || endpoint_ != null; + } + + /** + *
+             * 鐩湴鍧
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoint = 3; + * + * @return The endpoint. + */ + public BasicMetaProto.Endpoint getEndpoint() { + if (endpointBuilder_ == null) { + return endpoint_ == null ? BasicMetaProto.Endpoint.getDefaultInstance() : endpoint_; + } else { + return endpointBuilder_.getMessage(); + } + } + + /** + *
+             * 鐩湴鍧
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoint = 3; + */ + public Builder setEndpoint(BasicMetaProto.Endpoint value) { + if (endpointBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + endpoint_ = value; + onChanged(); + } else { + endpointBuilder_.setMessage(value); + } + + return this; + } + + /** + *
+             * 鐩湴鍧
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoint = 3; + */ + public Builder setEndpoint( + BasicMetaProto.Endpoint.Builder builderForValue) { + if (endpointBuilder_ == null) { + endpoint_ = builderForValue.build(); + onChanged(); + } else { + endpointBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + + /** + *
+             * 鐩湴鍧
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoint = 3; + */ + public Builder mergeEndpoint(BasicMetaProto.Endpoint value) { + if (endpointBuilder_ == null) { + if (endpoint_ != null) { + endpoint_ = + BasicMetaProto.Endpoint.newBuilder(endpoint_).mergeFrom(value).buildPartial(); + } else { + endpoint_ = value; + } + onChanged(); + } else { + endpointBuilder_.mergeFrom(value); + } + + return this; + } + + /** + *
+             * 鐩湴鍧
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoint = 3; + */ + public Builder clearEndpoint() { + if (endpointBuilder_ == null) { + endpoint_ = null; + onChanged(); + } else { + endpoint_ = null; + endpointBuilder_ = null; + } + + return this; + } + + /** + *
+             * 鐩湴鍧
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoint = 3; + */ + public BasicMetaProto.Endpoint.Builder getEndpointBuilder() { + + onChanged(); + return getEndpointFieldBuilder().getBuilder(); + } + + /** + *
+             * 鐩湴鍧
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoint = 3; + */ + public BasicMetaProto.EndpointOrBuilder getEndpointOrBuilder() { + if (endpointBuilder_ != null) { + return endpointBuilder_.getMessageOrBuilder(); + } else { + return endpoint_ == null ? + BasicMetaProto.Endpoint.getDefaultInstance() : endpoint_; + } + } + + /** + *
+             * 鐩湴鍧
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Endpoint endpoint = 3; + */ + private com.google.protobuf.SingleFieldBuilderV3< + BasicMetaProto.Endpoint, BasicMetaProto.Endpoint.Builder, BasicMetaProto.EndpointOrBuilder> + getEndpointFieldBuilder() { + if (endpointBuilder_ == null) { + endpointBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + BasicMetaProto.Endpoint, BasicMetaProto.Endpoint.Builder, BasicMetaProto.EndpointOrBuilder>( + getEndpoint(), + getParentForChildren(), + isClean()); + endpoint_ = null; + } + return endpointBuilder_; + } + + @Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:com.welab.wefe.gateway.api.meta.basic.Member) + } + + // @@protoc_insertion_point(class_scope:com.welab.wefe.gateway.api.meta.basic.Member) + private static final Member DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new Member(); + } + + public static Member getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @Override + public Member parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Member(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @Override + public Member getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ContentOrBuilder extends + // @@protoc_insertion_point(interface_extends:com.welab.wefe.gateway.api.meta.basic.Content) + com.google.protobuf.MessageOrBuilder { + + /** + *
+         * 灏忔暟鎹被鍨嬬殑Action锛涘閰嶇疆鏂囦欢閲岀殑object.actions.memory鍜宱bject.actions.db鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+         * 
+ * + * string objectData = 1; + * + * @return The objectData. + */ + String getObjectData(); + + /** + *
+         * 灏忔暟鎹被鍨嬬殑Action锛涘閰嶇疆鏂囦欢閲岀殑object.actions.memory鍜宱bject.actions.db鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+         * 
+ * + * string objectData = 1; + * + * @return The bytes for objectData. + */ + com.google.protobuf.ByteString + getObjectDataBytes(); + + /** + *
+         * 灏忔暟鎹被鍨嬬殑鐢ㄤ簩杩涘埗鏁版嵁杞戒綋
+         * 
+ * + * bytes objectByteData = 3; + * + * @return The objectByteData. + */ + com.google.protobuf.ByteString getObjectByteData(); + + /** + *
+         * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+         * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + java.util.List + getConfigDatasList(); + + /** + *
+         * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+         * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + ConfigData getConfigDatas(int index); + + /** + *
+         * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+         * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + int getConfigDatasCount(); + + /** + *
+         * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+         * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + java.util.List + getConfigDatasOrBuilderList(); + + /** + *
+         * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+         * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + ConfigDataOrBuilder getConfigDatasOrBuilder( + int index); + } + + /** + *
+     * 浼犺緭鍐呭锛涘鏋淎ction涓簅bject.actions.db鎸囧畾绫诲瀷鐨勶紝鍒檕bjectData鐨刯son缁撴瀯蹇呴』鏈塶amespace锛堝簱鍚嶏級鍜宯ame锛堣〃鍚嶏級杩欎袱涓瓧娈
+     * 
+ *

+ * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.Content} + */ + public static final class Content extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:com.welab.wefe.gateway.api.meta.basic.Content) + ContentOrBuilder { + private static final long serialVersionUID = 0L; + + // Use Content.newBuilder() to construct. + private Content(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private Content() { + objectData_ = ""; + objectByteData_ = com.google.protobuf.ByteString.EMPTY; + configDatas_ = java.util.Collections.emptyList(); + } + + @Override + @SuppressWarnings({"unused"}) + protected Object newInstance( + UnusedPrivateParameter unused) { + return new Content(); + } + + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + + private Content( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + String s = input.readStringRequireUtf8(); + + objectData_ = s; + break; + } + case 18: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + configDatas_ = new java.util.ArrayList<>(); + mutable_bitField0_ |= 0x00000001; + } + configDatas_.add( + input.readMessage(ConfigData.parser(), extensionRegistry)); + break; + } + case 26: { + + objectByteData_ = input.readBytes(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + configDatas_ = java.util.Collections.unmodifiableList(configDatas_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Content_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Content_fieldAccessorTable + .ensureFieldAccessorsInitialized( + Content.class, Builder.class); + } + + public static final int OBJECTDATA_FIELD_NUMBER = 1; + private volatile Object objectData_; + + /** + *

+         * 灏忔暟鎹被鍨嬬殑Action锛涘閰嶇疆鏂囦欢閲岀殑object.actions.memory鍜宱bject.actions.db鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+         * 
+ * + * string objectData = 1; + * + * @return The objectData. + */ + public String getObjectData() { + Object ref = objectData_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + objectData_ = s; + return s; + } + } + + /** + *
+         * 灏忔暟鎹被鍨嬬殑Action锛涘閰嶇疆鏂囦欢閲岀殑object.actions.memory鍜宱bject.actions.db鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+         * 
+ * + * string objectData = 1; + * + * @return The bytes for objectData. + */ + public com.google.protobuf.ByteString + getObjectDataBytes() { + Object ref = objectData_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + objectData_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int OBJECTBYTEDATA_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString objectByteData_; + + /** + *
+         * 灏忔暟鎹被鍨嬬殑鐢ㄤ簩杩涘埗鏁版嵁杞戒綋
+         * 
+ * + * bytes objectByteData = 3; + * + * @return The objectByteData. + */ + public com.google.protobuf.ByteString getObjectByteData() { + return objectByteData_; + } + + public static final int CONFIGDATAS_FIELD_NUMBER = 2; + private java.util.List configDatas_; + + /** + *
+         * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+         * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public java.util.List getConfigDatasList() { + return configDatas_; + } + + /** + *
+         * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+         * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public java.util.List + getConfigDatasOrBuilderList() { + return configDatas_; + } + + /** + *
+         * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+         * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public int getConfigDatasCount() { + return configDatas_.size(); + } + + /** + *
+         * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+         * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public ConfigData getConfigDatas(int index) { + return configDatas_.get(index); + } + + /** + *
+         * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+         * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public ConfigDataOrBuilder getConfigDatasOrBuilder( + int index) { + return configDatas_.get(index); + } + + private byte memoizedIsInitialized = -1; + + @Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!getObjectDataBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, objectData_); + } + for (int i = 0; i < configDatas_.size(); i++) { + output.writeMessage(2, configDatas_.get(i)); + } + if (!objectByteData_.isEmpty()) { + output.writeBytes(3, objectByteData_); + } + unknownFields.writeTo(output); + } + + @Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!getObjectDataBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, objectData_); + } + for (int i = 0; i < configDatas_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, configDatas_.get(i)); + } + if (!objectByteData_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, objectByteData_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @Override + public boolean equals(final Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof Content)) { + return super.equals(obj); + } + Content other = (Content) obj; + + if (!getObjectData() + .equals(other.getObjectData())) return false; + if (!getObjectByteData() + .equals(other.getObjectByteData())) return false; + if (!getConfigDatasList() + .equals(other.getConfigDatasList())) return false; + return unknownFields.equals(other.unknownFields); + } + + @Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + OBJECTDATA_FIELD_NUMBER; + hash = (53 * hash) + getObjectData().hashCode(); + hash = (37 * hash) + OBJECTBYTEDATA_FIELD_NUMBER; + hash = (53 * hash) + getObjectByteData().hashCode(); + if (getConfigDatasCount() > 0) { + hash = (37 * hash) + CONFIGDATAS_FIELD_NUMBER; + hash = (53 * hash) + getConfigDatasList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static Content parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Content parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Content parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Content parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Content parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static Content parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static Content parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static Content parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static Content parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static Content parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static Content parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static Content parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(Content prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + *
+         * 浼犺緭鍐呭锛涘鏋淎ction涓簅bject.actions.db鎸囧畾绫诲瀷鐨勶紝鍒檕bjectData鐨刯son缁撴瀯蹇呴』鏈塶amespace锛堝簱鍚嶏級鍜宯ame锛堣〃鍚嶏級杩欎袱涓瓧娈
+         * 
+ *

+ * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.Content} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:com.welab.wefe.gateway.api.meta.basic.Content) + ContentOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Content_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Content_fieldAccessorTable + .ensureFieldAccessorsInitialized( + Content.class, Builder.class); + } + + // Construct using com.welab.wefe.gateway.api.meta.basic.GatewayMetaProto.Content.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getConfigDatasFieldBuilder(); + } + } + + @Override + public Builder clear() { + super.clear(); + objectData_ = ""; + + objectByteData_ = com.google.protobuf.ByteString.EMPTY; + + if (configDatasBuilder_ == null) { + configDatas_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + configDatasBuilder_.clear(); + } + return this; + } + + @Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_Content_descriptor; + } + + @Override + public Content getDefaultInstanceForType() { + return Content.getDefaultInstance(); + } + + @Override + public Content build() { + Content result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @Override + public Content buildPartial() { + Content result = new Content(this); + int from_bitField0_ = bitField0_; + result.objectData_ = objectData_; + result.objectByteData_ = objectByteData_; + if (configDatasBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + configDatas_ = java.util.Collections.unmodifiableList(configDatas_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.configDatas_ = configDatas_; + } else { + result.configDatas_ = configDatasBuilder_.build(); + } + onBuilt(); + return result; + } + + @Override + public Builder clone() { + return super.clone(); + } + + @Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.setField(field, value); + } + + @Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, Object value) { + return super.setRepeatedField(field, index, value); + } + + @Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.addRepeatedField(field, value); + } + + @Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof Content) { + return mergeFrom((Content) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(Content other) { + if (other == Content.getDefaultInstance()) return this; + if (!other.getObjectData().isEmpty()) { + objectData_ = other.objectData_; + onChanged(); + } + if (other.getObjectByteData() != com.google.protobuf.ByteString.EMPTY) { + setObjectByteData(other.getObjectByteData()); + } + if (configDatasBuilder_ == null) { + if (!other.configDatas_.isEmpty()) { + if (configDatas_.isEmpty()) { + configDatas_ = other.configDatas_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureConfigDatasIsMutable(); + configDatas_.addAll(other.configDatas_); + } + onChanged(); + } + } else { + if (!other.configDatas_.isEmpty()) { + if (configDatasBuilder_.isEmpty()) { + configDatasBuilder_.dispose(); + configDatasBuilder_ = null; + configDatas_ = other.configDatas_; + bitField0_ = (bitField0_ & ~0x00000001); + configDatasBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getConfigDatasFieldBuilder() : null; + } else { + configDatasBuilder_.addAllMessages(other.configDatas_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @Override + public final boolean isInitialized() { + return true; + } + + @Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + Content parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (Content) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int bitField0_; + + private Object objectData_ = ""; + + /** + *

+             * 灏忔暟鎹被鍨嬬殑Action锛涘閰嶇疆鏂囦欢閲岀殑object.actions.memory鍜宱bject.actions.db鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * string objectData = 1; + * + * @return The objectData. + */ + public String getObjectData() { + Object ref = objectData_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + objectData_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + *
+             * 灏忔暟鎹被鍨嬬殑Action锛涘閰嶇疆鏂囦欢閲岀殑object.actions.memory鍜宱bject.actions.db鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * string objectData = 1; + * + * @return The bytes for objectData. + */ + public com.google.protobuf.ByteString + getObjectDataBytes() { + Object ref = objectData_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + objectData_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + *
+             * 灏忔暟鎹被鍨嬬殑Action锛涘閰嶇疆鏂囦欢閲岀殑object.actions.memory鍜宱bject.actions.db鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * string objectData = 1; + * + * @param value The objectData to set. + * @return This builder for chaining. + */ + public Builder setObjectData( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + objectData_ = value; + onChanged(); + return this; + } + + /** + *
+             * 灏忔暟鎹被鍨嬬殑Action锛涘閰嶇疆鏂囦欢閲岀殑object.actions.memory鍜宱bject.actions.db鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * string objectData = 1; + * + * @return This builder for chaining. + */ + public Builder clearObjectData() { + + objectData_ = getDefaultInstance().getObjectData(); + onChanged(); + return this; + } + + /** + *
+             * 灏忔暟鎹被鍨嬬殑Action锛涘閰嶇疆鏂囦欢閲岀殑object.actions.memory鍜宱bject.actions.db鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * string objectData = 1; + * + * @param value The bytes for objectData to set. + * @return This builder for chaining. + */ + public Builder setObjectDataBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + objectData_ = value; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString objectByteData_ = com.google.protobuf.ByteString.EMPTY; + + /** + *
+             * 灏忔暟鎹被鍨嬬殑鐢ㄤ簩杩涘埗鏁版嵁杞戒綋
+             * 
+ * + * bytes objectByteData = 3; + * + * @return The objectByteData. + */ + public com.google.protobuf.ByteString getObjectByteData() { + return objectByteData_; + } + + /** + *
+             * 灏忔暟鎹被鍨嬬殑鐢ㄤ簩杩涘埗鏁版嵁杞戒綋
+             * 
+ * + * bytes objectByteData = 3; + * + * @param value The objectByteData to set. + * @return This builder for chaining. + */ + public Builder setObjectByteData(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + + objectByteData_ = value; + onChanged(); + return this; + } + + /** + *
+             * 灏忔暟鎹被鍨嬬殑鐢ㄤ簩杩涘埗鏁版嵁杞戒綋
+             * 
+ * + * bytes objectByteData = 3; + * + * @return This builder for chaining. + */ + public Builder clearObjectByteData() { + + objectByteData_ = getDefaultInstance().getObjectByteData(); + onChanged(); + return this; + } + + private java.util.List configDatas_ = + java.util.Collections.emptyList(); + + private void ensureConfigDatasIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + configDatas_ = new java.util.ArrayList(configDatas_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + ConfigData, ConfigData.Builder, ConfigDataOrBuilder> configDatasBuilder_; + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public java.util.List getConfigDatasList() { + if (configDatasBuilder_ == null) { + return java.util.Collections.unmodifiableList(configDatas_); + } else { + return configDatasBuilder_.getMessageList(); + } + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public int getConfigDatasCount() { + if (configDatasBuilder_ == null) { + return configDatas_.size(); + } else { + return configDatasBuilder_.getCount(); + } + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public ConfigData getConfigDatas(int index) { + if (configDatasBuilder_ == null) { + return configDatas_.get(index); + } else { + return configDatasBuilder_.getMessage(index); + } + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public Builder setConfigDatas( + int index, ConfigData value) { + if (configDatasBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureConfigDatasIsMutable(); + configDatas_.set(index, value); + onChanged(); + } else { + configDatasBuilder_.setMessage(index, value); + } + return this; + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public Builder setConfigDatas( + int index, ConfigData.Builder builderForValue) { + if (configDatasBuilder_ == null) { + ensureConfigDatasIsMutable(); + configDatas_.set(index, builderForValue.build()); + onChanged(); + } else { + configDatasBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public Builder addConfigDatas(ConfigData value) { + if (configDatasBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureConfigDatasIsMutable(); + configDatas_.add(value); + onChanged(); + } else { + configDatasBuilder_.addMessage(value); + } + return this; + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public Builder addConfigDatas( + int index, ConfigData value) { + if (configDatasBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureConfigDatasIsMutable(); + configDatas_.add(index, value); + onChanged(); + } else { + configDatasBuilder_.addMessage(index, value); + } + return this; + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public Builder addConfigDatas( + ConfigData.Builder builderForValue) { + if (configDatasBuilder_ == null) { + ensureConfigDatasIsMutable(); + configDatas_.add(builderForValue.build()); + onChanged(); + } else { + configDatasBuilder_.addMessage(builderForValue.build()); + } + return this; + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public Builder addConfigDatas( + int index, ConfigData.Builder builderForValue) { + if (configDatasBuilder_ == null) { + ensureConfigDatasIsMutable(); + configDatas_.add(index, builderForValue.build()); + onChanged(); + } else { + configDatasBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public Builder addAllConfigDatas( + Iterable values) { + if (configDatasBuilder_ == null) { + ensureConfigDatasIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, configDatas_); + onChanged(); + } else { + configDatasBuilder_.addAllMessages(values); + } + return this; + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public Builder clearConfigDatas() { + if (configDatasBuilder_ == null) { + configDatas_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + configDatasBuilder_.clear(); + } + return this; + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public Builder removeConfigDatas(int index) { + if (configDatasBuilder_ == null) { + ensureConfigDatasIsMutable(); + configDatas_.remove(index); + onChanged(); + } else { + configDatasBuilder_.remove(index); + } + return this; + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public ConfigData.Builder getConfigDatasBuilder( + int index) { + return getConfigDatasFieldBuilder().getBuilder(index); + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public ConfigDataOrBuilder getConfigDatasOrBuilder( + int index) { + if (configDatasBuilder_ == null) { + return configDatas_.get(index); + } else { + return configDatasBuilder_.getMessageOrBuilder(index); + } + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public java.util.List + getConfigDatasOrBuilderList() { + if (configDatasBuilder_ != null) { + return configDatasBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(configDatas_); + } + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public ConfigData.Builder addConfigDatasBuilder() { + return getConfigDatasFieldBuilder().addBuilder( + ConfigData.getDefaultInstance()); + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public ConfigData.Builder addConfigDatasBuilder( + int index) { + return getConfigDatasFieldBuilder().addBuilder( + index, ConfigData.getDefaultInstance()); + } + + /** + *
+             * Action涓篶onfig.actions鎸囧畾绫诲瀷鐨勬暟鎹浇浣
+             * 
+ * + * repeated .com.welab.wefe.gateway.api.meta.basic.ConfigData configDatas = 2; + */ + public java.util.List + getConfigDatasBuilderList() { + return getConfigDatasFieldBuilder().getBuilderList(); + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + ConfigData, ConfigData.Builder, ConfigDataOrBuilder> + getConfigDatasFieldBuilder() { + if (configDatasBuilder_ == null) { + configDatasBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + ConfigData, ConfigData.Builder, ConfigDataOrBuilder>( + configDatas_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + configDatas_ = null; + } + return configDatasBuilder_; + } + + @Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:com.welab.wefe.gateway.api.meta.basic.Content) + } + + // @@protoc_insertion_point(class_scope:com.welab.wefe.gateway.api.meta.basic.Content) + private static final Content DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new Content(); + } + + public static Content getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @Override + public Content parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Content(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @Override + public Content getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ConfigDataOrBuilder extends + // @@protoc_insertion_point(interface_extends:com.welab.wefe.gateway.api.meta.basic.ConfigData) + com.google.protobuf.MessageOrBuilder { + + /** + * bytes key = 1; + * + * @return The key. + */ + com.google.protobuf.ByteString getKey(); + + /** + * bytes value = 2; + * + * @return The value. + */ + com.google.protobuf.ByteString getValue(); + } + + /** + *
+     * 鐢ㄤ簬浼犻佸ぇ鏁版嵁锛坉source绫诲瀷鐨刟ction锛夌殑杞戒綋
+     * 
+ *

+ * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.ConfigData} + */ + public static final class ConfigData extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:com.welab.wefe.gateway.api.meta.basic.ConfigData) + ConfigDataOrBuilder { + private static final long serialVersionUID = 0L; + + // Use ConfigData.newBuilder() to construct. + private ConfigData(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private ConfigData() { + key_ = com.google.protobuf.ByteString.EMPTY; + value_ = com.google.protobuf.ByteString.EMPTY; + } + + @Override + @SuppressWarnings({"unused"}) + protected Object newInstance( + UnusedPrivateParameter unused) { + return new ConfigData(); + } + + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + + private ConfigData( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + + key_ = input.readBytes(); + break; + } + case 18: { + + value_ = input.readBytes(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_ConfigData_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_ConfigData_fieldAccessorTable + .ensureFieldAccessorsInitialized( + ConfigData.class, Builder.class); + } + + public static final int KEY_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString key_; + + /** + * bytes key = 1; + * + * @return The key. + */ + public com.google.protobuf.ByteString getKey() { + return key_; + } + + public static final int VALUE_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString value_; + + /** + * bytes value = 2; + * + * @return The value. + */ + public com.google.protobuf.ByteString getValue() { + return value_; + } + + private byte memoizedIsInitialized = -1; + + @Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!key_.isEmpty()) { + output.writeBytes(1, key_); + } + if (!value_.isEmpty()) { + output.writeBytes(2, value_); + } + unknownFields.writeTo(output); + } + + @Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!key_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, key_); + } + if (!value_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, value_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @Override + public boolean equals(final Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof ConfigData)) { + return super.equals(obj); + } + ConfigData other = (ConfigData) obj; + + if (!getKey() + .equals(other.getKey())) return false; + if (!getValue() + .equals(other.getValue())) return false; + return unknownFields.equals(other.unknownFields); + } + + @Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + KEY_FIELD_NUMBER; + hash = (53 * hash) + getKey().hashCode(); + hash = (37 * hash) + VALUE_FIELD_NUMBER; + hash = (53 * hash) + getValue().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static ConfigData parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static ConfigData parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static ConfigData parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static ConfigData parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static ConfigData parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static ConfigData parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static ConfigData parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static ConfigData parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static ConfigData parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static ConfigData parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static ConfigData parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static ConfigData parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(ConfigData prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + *

+         * 鐢ㄤ簬浼犻佸ぇ鏁版嵁锛坉source绫诲瀷鐨刟ction锛夌殑杞戒綋
+         * 
+ *

+ * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.ConfigData} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:com.welab.wefe.gateway.api.meta.basic.ConfigData) + ConfigDataOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_ConfigData_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_ConfigData_fieldAccessorTable + .ensureFieldAccessorsInitialized( + ConfigData.class, Builder.class); + } + + // Construct using com.welab.wefe.gateway.api.meta.basic.GatewayMetaProto.ConfigData.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + + @Override + public Builder clear() { + super.clear(); + key_ = com.google.protobuf.ByteString.EMPTY; + + value_ = com.google.protobuf.ByteString.EMPTY; + + return this; + } + + @Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_ConfigData_descriptor; + } + + @Override + public ConfigData getDefaultInstanceForType() { + return ConfigData.getDefaultInstance(); + } + + @Override + public ConfigData build() { + ConfigData result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @Override + public ConfigData buildPartial() { + ConfigData result = new ConfigData(this); + result.key_ = key_; + result.value_ = value_; + onBuilt(); + return result; + } + + @Override + public Builder clone() { + return super.clone(); + } + + @Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.setField(field, value); + } + + @Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, Object value) { + return super.setRepeatedField(field, index, value); + } + + @Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.addRepeatedField(field, value); + } + + @Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof ConfigData) { + return mergeFrom((ConfigData) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(ConfigData other) { + if (other == ConfigData.getDefaultInstance()) return this; + if (other.getKey() != com.google.protobuf.ByteString.EMPTY) { + setKey(other.getKey()); + } + if (other.getValue() != com.google.protobuf.ByteString.EMPTY) { + setValue(other.getValue()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @Override + public final boolean isInitialized() { + return true; + } + + @Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + ConfigData parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (ConfigData) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private com.google.protobuf.ByteString key_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes key = 1; + * + * @return The key. + */ + public com.google.protobuf.ByteString getKey() { + return key_; + } + + /** + * bytes key = 1; + * + * @param value The key to set. + * @return This builder for chaining. + */ + public Builder setKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + + key_ = value; + onChanged(); + return this; + } + + /** + * bytes key = 1; + * + * @return This builder for chaining. + */ + public Builder clearKey() { + + key_ = getDefaultInstance().getKey(); + onChanged(); + return this; + } + + private com.google.protobuf.ByteString value_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes value = 2; + * + * @return The value. + */ + public com.google.protobuf.ByteString getValue() { + return value_; + } + + /** + * bytes value = 2; + * + * @param value The value to set. + * @return This builder for chaining. + */ + public Builder setValue(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + + value_ = value; + onChanged(); + return this; + } + + /** + * bytes value = 2; + * + * @return This builder for chaining. + */ + public Builder clearValue() { + + value_ = getDefaultInstance().getValue(); + onChanged(); + return this; + } + + @Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:com.welab.wefe.gateway.api.meta.basic.ConfigData) + } + + // @@protoc_insertion_point(class_scope:com.welab.wefe.gateway.api.meta.basic.ConfigData) + private static final ConfigData DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new ConfigData(); + } + + public static ConfigData getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @Override + public ConfigData parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ConfigData(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @Override + public ConfigData getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface TransferMetaOrBuilder extends + // @@protoc_insertion_point(interface_extends:com.welab.wefe.gateway.api.meta.basic.TransferMeta) + com.google.protobuf.MessageOrBuilder { + + /** + *

+         * 浣滀笟淇℃伅 瀹㈡埛绔紶锛堝彲绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Job job = 1; + * + * @return Whether the job field is set. + */ + boolean hasJob(); + + /** + *
+         * 浣滀笟淇℃伅 瀹㈡埛绔紶锛堝彲绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Job job = 1; + * + * @return The job. + */ + Job getJob(); + + /** + *
+         * 浣滀笟淇℃伅 瀹㈡埛绔紶锛堝彲绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Job job = 1; + */ + JobOrBuilder getJobOrBuilder(); + + /** + *
+         * 鍙戦佹柟 gateway锛堥潪绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member src = 2; + * + * @return Whether the src field is set. + */ + boolean hasSrc(); + + /** + *
+         * 鍙戦佹柟 gateway锛堥潪绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member src = 2; + * + * @return The src. + */ + Member getSrc(); + + /** + *
+         * 鍙戦佹柟 gateway锛堥潪绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member src = 2; + */ + MemberOrBuilder getSrcOrBuilder(); + + /** + *
+         * 鎺ユ敹鏂筭ateway锛堥潪绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member dst = 3; + * + * @return Whether the dst field is set. + */ + boolean hasDst(); + + /** + *
+         * 鎺ユ敹鏂筭ateway锛堥潪绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member dst = 3; + * + * @return The dst. + */ + Member getDst(); + + /** + *
+         * 鎺ユ敹鏂筭ateway锛堥潪绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member dst = 3; + */ + MemberOrBuilder getDstOrBuilder(); + + /** + *
+         * 鍔ㄤ綔 瀹㈡埛绔紶锛堥潪绌猴級
+         * 
+ * + * string action = 4; + * + * @return The action. + */ + String getAction(); + + /** + *
+         * 鍔ㄤ綔 瀹㈡埛绔紶锛堥潪绌猴級
+         * 
+ * + * string action = 4; + * + * @return The bytes for action. + */ + com.google.protobuf.ByteString + getActionBytes(); + + /** + *
+         * 鍐呭 瀹㈡埛浼狅紙闈炵┖锛
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Content content = 5; + * + * @return Whether the content field is set. + */ + boolean hasContent(); + + /** + *
+         * 鍐呭 瀹㈡埛浼狅紙闈炵┖锛
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Content content = 5; + * + * @return The content. + */ + Content getContent(); + + /** + *
+         * 鍐呭 瀹㈡埛浼狅紙闈炵┖锛
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Content content = 5; + */ + ContentOrBuilder getContentOrBuilder(); + + /** + *
+         * 浼犺緭鐘舵 gateway
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.TransferStatus transferStatus = 6; + * + * @return The enum numeric value on the wire for transferStatus. + */ + int getTransferStatusValue(); + + /** + *
+         * 浼犺緭鐘舵 gateway
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.TransferStatus transferStatus = 6; + * + * @return The transferStatus. + */ + TransferStatus getTransferStatus(); + + /** + *
+         * 鍞竴鏍囪瘑ID锛屽鎴风浼
+         * 
+ * + * string sessionId = 7; + * + * @return The sessionId. + */ + String getSessionId(); + + /** + *
+         * 鍞竴鏍囪瘑ID锛屽鎴风浼
+         * 
+ * + * string sessionId = 7; + * + * @return The bytes for sessionId. + */ + com.google.protobuf.ByteString + getSessionIdBytes(); + + /** + *
+         * 鎺ユ敹鍒版暟鎹殑鏃堕棿 gateway
+         * 
+ * + * int64 receiveDate = 8; + * + * @return The receiveDate. + */ + long getReceiveDate(); + + /** + *
+         * 鏁版嵁杩囨湡鏃堕棿 gateway
+         * 
+ * + * int64 expireDate = 9; + * + * @return The expireDate. + */ + long getExpireDate(); + + /** + *
+         * 搴忓彿 gateway
+         * 
+ * + * int32 sequenceNo = 10; + * + * @return The sequenceNo. + */ + int getSequenceNo(); + + /** + *
+         * 鏄惁缁撴潫 gateway
+         * 
+ * + * bool sequenceIsEnd = 11; + * + * @return The sequenceIsEnd. + */ + boolean getSequenceIsEnd(); + + /** + * bytes taggedVariableName = 12; + * + * @return The taggedVariableName. + */ + com.google.protobuf.ByteString getTaggedVariableName(); + + /** + * string tag = 13; + * + * @return The tag. + */ + String getTag(); + + /** + * string tag = 13; + * + * @return The bytes for tag. + */ + com.google.protobuf.ByteString + getTagBytes(); + + /** + * string channel = 14; + * + * @return The channel. + */ + String getChannel(); + + /** + * string channel = 14; + * + * @return The bytes for channel. + */ + com.google.protobuf.ByteString + getChannelBytes(); + + /** + *
+         * 澶勭悊鍣
+         * 
+ * + * string processor = 15; + * + * @return The processor. + */ + String getProcessor(); + + /** + *
+         * 澶勭悊鍣
+         * 
+ * + * string processor = 15; + * + * @return The bytes for processor. + */ + com.google.protobuf.ByteString + getProcessorBytes(); + } + + /** + *
+     * 缃戝叧鏀跺彂鐨勫厓鏁版嵁
+     * 
+ *

+ * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.TransferMeta} + */ + public static final class TransferMeta extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:com.welab.wefe.gateway.api.meta.basic.TransferMeta) + TransferMetaOrBuilder { + private static final long serialVersionUID = 0L; + + // Use TransferMeta.newBuilder() to construct. + private TransferMeta(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private TransferMeta() { + action_ = ""; + transferStatus_ = 0; + sessionId_ = ""; + taggedVariableName_ = com.google.protobuf.ByteString.EMPTY; + tag_ = ""; + channel_ = ""; + processor_ = ""; + } + + @Override + @SuppressWarnings({"unused"}) + protected Object newInstance( + UnusedPrivateParameter unused) { + return new TransferMeta(); + } + + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + + private TransferMeta( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + Job.Builder subBuilder = null; + if (job_ != null) { + subBuilder = job_.toBuilder(); + } + job_ = input.readMessage(Job.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(job_); + job_ = subBuilder.buildPartial(); + } + + break; + } + case 18: { + Member.Builder subBuilder = null; + if (src_ != null) { + subBuilder = src_.toBuilder(); + } + src_ = input.readMessage(Member.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(src_); + src_ = subBuilder.buildPartial(); + } + + break; + } + case 26: { + Member.Builder subBuilder = null; + if (dst_ != null) { + subBuilder = dst_.toBuilder(); + } + dst_ = input.readMessage(Member.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(dst_); + dst_ = subBuilder.buildPartial(); + } + + break; + } + case 34: { + String s = input.readStringRequireUtf8(); + + action_ = s; + break; + } + case 42: { + Content.Builder subBuilder = null; + if (content_ != null) { + subBuilder = content_.toBuilder(); + } + content_ = input.readMessage(Content.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(content_); + content_ = subBuilder.buildPartial(); + } + + break; + } + case 48: { + int rawValue = input.readEnum(); + + transferStatus_ = rawValue; + break; + } + case 58: { + String s = input.readStringRequireUtf8(); + + sessionId_ = s; + break; + } + case 64: { + + receiveDate_ = input.readInt64(); + break; + } + case 72: { + + expireDate_ = input.readInt64(); + break; + } + case 80: { + + sequenceNo_ = input.readInt32(); + break; + } + case 88: { + + sequenceIsEnd_ = input.readBool(); + break; + } + case 98: { + + taggedVariableName_ = input.readBytes(); + break; + } + case 106: { + String s = input.readStringRequireUtf8(); + + tag_ = s; + break; + } + case 114: { + String s = input.readStringRequireUtf8(); + + channel_ = s; + break; + } + case 122: { + String s = input.readStringRequireUtf8(); + + processor_ = s; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_TransferMeta_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_TransferMeta_fieldAccessorTable + .ensureFieldAccessorsInitialized( + TransferMeta.class, Builder.class); + } + + public static final int JOB_FIELD_NUMBER = 1; + private Job job_; + + /** + *

+         * 浣滀笟淇℃伅 瀹㈡埛绔紶锛堝彲绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Job job = 1; + * + * @return Whether the job field is set. + */ + public boolean hasJob() { + return job_ != null; + } + + /** + *
+         * 浣滀笟淇℃伅 瀹㈡埛绔紶锛堝彲绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Job job = 1; + * + * @return The job. + */ + public Job getJob() { + return job_ == null ? Job.getDefaultInstance() : job_; + } + + /** + *
+         * 浣滀笟淇℃伅 瀹㈡埛绔紶锛堝彲绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Job job = 1; + */ + public JobOrBuilder getJobOrBuilder() { + return getJob(); + } + + public static final int SRC_FIELD_NUMBER = 2; + private Member src_; + + /** + *
+         * 鍙戦佹柟 gateway锛堥潪绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member src = 2; + * + * @return Whether the src field is set. + */ + public boolean hasSrc() { + return src_ != null; + } + + /** + *
+         * 鍙戦佹柟 gateway锛堥潪绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member src = 2; + * + * @return The src. + */ + public Member getSrc() { + return src_ == null ? Member.getDefaultInstance() : src_; + } + + /** + *
+         * 鍙戦佹柟 gateway锛堥潪绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member src = 2; + */ + public MemberOrBuilder getSrcOrBuilder() { + return getSrc(); + } + + public static final int DST_FIELD_NUMBER = 3; + private Member dst_; + + /** + *
+         * 鎺ユ敹鏂筭ateway锛堥潪绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member dst = 3; + * + * @return Whether the dst field is set. + */ + public boolean hasDst() { + return dst_ != null; + } + + /** + *
+         * 鎺ユ敹鏂筭ateway锛堥潪绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member dst = 3; + * + * @return The dst. + */ + public Member getDst() { + return dst_ == null ? Member.getDefaultInstance() : dst_; + } + + /** + *
+         * 鎺ユ敹鏂筭ateway锛堥潪绌猴級
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member dst = 3; + */ + public MemberOrBuilder getDstOrBuilder() { + return getDst(); + } + + public static final int ACTION_FIELD_NUMBER = 4; + private volatile Object action_; + + /** + *
+         * 鍔ㄤ綔 瀹㈡埛绔紶锛堥潪绌猴級
+         * 
+ * + * string action = 4; + * + * @return The action. + */ + public String getAction() { + Object ref = action_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + action_ = s; + return s; + } + } + + /** + *
+         * 鍔ㄤ綔 瀹㈡埛绔紶锛堥潪绌猴級
+         * 
+ * + * string action = 4; + * + * @return The bytes for action. + */ + public com.google.protobuf.ByteString + getActionBytes() { + Object ref = action_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + action_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int CONTENT_FIELD_NUMBER = 5; + private Content content_; + + /** + *
+         * 鍐呭 瀹㈡埛浼狅紙闈炵┖锛
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Content content = 5; + * + * @return Whether the content field is set. + */ + public boolean hasContent() { + return content_ != null; + } + + /** + *
+         * 鍐呭 瀹㈡埛浼狅紙闈炵┖锛
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Content content = 5; + * + * @return The content. + */ + public Content getContent() { + return content_ == null ? Content.getDefaultInstance() : content_; + } + + /** + *
+         * 鍐呭 瀹㈡埛浼狅紙闈炵┖锛
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Content content = 5; + */ + public ContentOrBuilder getContentOrBuilder() { + return getContent(); + } + + public static final int TRANSFERSTATUS_FIELD_NUMBER = 6; + private int transferStatus_; + + /** + *
+         * 浼犺緭鐘舵 gateway
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.TransferStatus transferStatus = 6; + * + * @return The enum numeric value on the wire for transferStatus. + */ + public int getTransferStatusValue() { + return transferStatus_; + } + + /** + *
+         * 浼犺緭鐘舵 gateway
+         * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.TransferStatus transferStatus = 6; + * + * @return The transferStatus. + */ + public TransferStatus getTransferStatus() { + @SuppressWarnings("deprecation") + TransferStatus result = TransferStatus.valueOf(transferStatus_); + return result == null ? TransferStatus.UNRECOGNIZED : result; + } + + public static final int SESSIONID_FIELD_NUMBER = 7; + private volatile Object sessionId_; + + /** + *
+         * 鍞竴鏍囪瘑ID锛屽鎴风浼
+         * 
+ * + * string sessionId = 7; + * + * @return The sessionId. + */ + public String getSessionId() { + Object ref = sessionId_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + sessionId_ = s; + return s; + } + } + + /** + *
+         * 鍞竴鏍囪瘑ID锛屽鎴风浼
+         * 
+ * + * string sessionId = 7; + * + * @return The bytes for sessionId. + */ + public com.google.protobuf.ByteString + getSessionIdBytes() { + Object ref = sessionId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + sessionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int RECEIVEDATE_FIELD_NUMBER = 8; + private long receiveDate_; + + /** + *
+         * 鎺ユ敹鍒版暟鎹殑鏃堕棿 gateway
+         * 
+ * + * int64 receiveDate = 8; + * + * @return The receiveDate. + */ + public long getReceiveDate() { + return receiveDate_; + } + + public static final int EXPIREDATE_FIELD_NUMBER = 9; + private long expireDate_; + + /** + *
+         * 鏁版嵁杩囨湡鏃堕棿 gateway
+         * 
+ * + * int64 expireDate = 9; + * + * @return The expireDate. + */ + public long getExpireDate() { + return expireDate_; + } + + public static final int SEQUENCENO_FIELD_NUMBER = 10; + private int sequenceNo_; + + /** + *
+         * 搴忓彿 gateway
+         * 
+ * + * int32 sequenceNo = 10; + * + * @return The sequenceNo. + */ + public int getSequenceNo() { + return sequenceNo_; + } + + public static final int SEQUENCEISEND_FIELD_NUMBER = 11; + private boolean sequenceIsEnd_; + + /** + *
+         * 鏄惁缁撴潫 gateway
+         * 
+ * + * bool sequenceIsEnd = 11; + * + * @return The sequenceIsEnd. + */ + public boolean getSequenceIsEnd() { + return sequenceIsEnd_; + } + + public static final int TAGGEDVARIABLENAME_FIELD_NUMBER = 12; + private com.google.protobuf.ByteString taggedVariableName_; + + /** + * bytes taggedVariableName = 12; + * + * @return The taggedVariableName. + */ + public com.google.protobuf.ByteString getTaggedVariableName() { + return taggedVariableName_; + } + + public static final int TAG_FIELD_NUMBER = 13; + private volatile Object tag_; + + /** + * string tag = 13; + * + * @return The tag. + */ + public String getTag() { + Object ref = tag_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + tag_ = s; + return s; + } + } + + /** + * string tag = 13; + * + * @return The bytes for tag. + */ + public com.google.protobuf.ByteString + getTagBytes() { + Object ref = tag_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + tag_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int CHANNEL_FIELD_NUMBER = 14; + private volatile Object channel_; + + /** + * string channel = 14; + * + * @return The channel. + */ + public String getChannel() { + Object ref = channel_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + channel_ = s; + return s; + } + } + + /** + * string channel = 14; + * + * @return The bytes for channel. + */ + public com.google.protobuf.ByteString + getChannelBytes() { + Object ref = channel_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + channel_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int PROCESSOR_FIELD_NUMBER = 15; + private volatile Object processor_; + + /** + *
+         * 澶勭悊鍣
+         * 
+ * + * string processor = 15; + * + * @return The processor. + */ + public String getProcessor() { + Object ref = processor_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + processor_ = s; + return s; + } + } + + /** + *
+         * 澶勭悊鍣
+         * 
+ * + * string processor = 15; + * + * @return The bytes for processor. + */ + public com.google.protobuf.ByteString + getProcessorBytes() { + Object ref = processor_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + processor_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + + @Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (job_ != null) { + output.writeMessage(1, getJob()); + } + if (src_ != null) { + output.writeMessage(2, getSrc()); + } + if (dst_ != null) { + output.writeMessage(3, getDst()); + } + if (!getActionBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, action_); + } + if (content_ != null) { + output.writeMessage(5, getContent()); + } + if (transferStatus_ != TransferStatus.NOT_PROCESSED.getNumber()) { + output.writeEnum(6, transferStatus_); + } + if (!getSessionIdBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 7, sessionId_); + } + if (receiveDate_ != 0L) { + output.writeInt64(8, receiveDate_); + } + if (expireDate_ != 0L) { + output.writeInt64(9, expireDate_); + } + if (sequenceNo_ != 0) { + output.writeInt32(10, sequenceNo_); + } + if (sequenceIsEnd_ != false) { + output.writeBool(11, sequenceIsEnd_); + } + if (!taggedVariableName_.isEmpty()) { + output.writeBytes(12, taggedVariableName_); + } + if (!getTagBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 13, tag_); + } + if (!getChannelBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 14, channel_); + } + if (!getProcessorBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 15, processor_); + } + unknownFields.writeTo(output); + } + + @Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (job_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getJob()); + } + if (src_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, getSrc()); + } + if (dst_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, getDst()); + } + if (!getActionBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, action_); + } + if (content_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, getContent()); + } + if (transferStatus_ != TransferStatus.NOT_PROCESSED.getNumber()) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(6, transferStatus_); + } + if (!getSessionIdBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, sessionId_); + } + if (receiveDate_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(8, receiveDate_); + } + if (expireDate_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(9, expireDate_); + } + if (sequenceNo_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(10, sequenceNo_); + } + if (sequenceIsEnd_ != false) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(11, sequenceIsEnd_); + } + if (!taggedVariableName_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(12, taggedVariableName_); + } + if (!getTagBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(13, tag_); + } + if (!getChannelBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(14, channel_); + } + if (!getProcessorBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(15, processor_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @Override + public boolean equals(final Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof TransferMeta)) { + return super.equals(obj); + } + TransferMeta other = (TransferMeta) obj; + + if (hasJob() != other.hasJob()) return false; + if (hasJob()) { + if (!getJob() + .equals(other.getJob())) return false; + } + if (hasSrc() != other.hasSrc()) return false; + if (hasSrc()) { + if (!getSrc() + .equals(other.getSrc())) return false; + } + if (hasDst() != other.hasDst()) return false; + if (hasDst()) { + if (!getDst() + .equals(other.getDst())) return false; + } + if (!getAction() + .equals(other.getAction())) return false; + if (hasContent() != other.hasContent()) return false; + if (hasContent()) { + if (!getContent() + .equals(other.getContent())) return false; + } + if (transferStatus_ != other.transferStatus_) return false; + if (!getSessionId() + .equals(other.getSessionId())) return false; + if (getReceiveDate() + != other.getReceiveDate()) return false; + if (getExpireDate() + != other.getExpireDate()) return false; + if (getSequenceNo() + != other.getSequenceNo()) return false; + if (getSequenceIsEnd() + != other.getSequenceIsEnd()) return false; + if (!getTaggedVariableName() + .equals(other.getTaggedVariableName())) return false; + if (!getTag() + .equals(other.getTag())) return false; + if (!getChannel() + .equals(other.getChannel())) return false; + if (!getProcessor() + .equals(other.getProcessor())) return false; + return unknownFields.equals(other.unknownFields); + } + + @Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasJob()) { + hash = (37 * hash) + JOB_FIELD_NUMBER; + hash = (53 * hash) + getJob().hashCode(); + } + if (hasSrc()) { + hash = (37 * hash) + SRC_FIELD_NUMBER; + hash = (53 * hash) + getSrc().hashCode(); + } + if (hasDst()) { + hash = (37 * hash) + DST_FIELD_NUMBER; + hash = (53 * hash) + getDst().hashCode(); + } + hash = (37 * hash) + ACTION_FIELD_NUMBER; + hash = (53 * hash) + getAction().hashCode(); + if (hasContent()) { + hash = (37 * hash) + CONTENT_FIELD_NUMBER; + hash = (53 * hash) + getContent().hashCode(); + } + hash = (37 * hash) + TRANSFERSTATUS_FIELD_NUMBER; + hash = (53 * hash) + transferStatus_; + hash = (37 * hash) + SESSIONID_FIELD_NUMBER; + hash = (53 * hash) + getSessionId().hashCode(); + hash = (37 * hash) + RECEIVEDATE_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getReceiveDate()); + hash = (37 * hash) + EXPIREDATE_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getExpireDate()); + hash = (37 * hash) + SEQUENCENO_FIELD_NUMBER; + hash = (53 * hash) + getSequenceNo(); + hash = (37 * hash) + SEQUENCEISEND_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getSequenceIsEnd()); + hash = (37 * hash) + TAGGEDVARIABLENAME_FIELD_NUMBER; + hash = (53 * hash) + getTaggedVariableName().hashCode(); + hash = (37 * hash) + TAG_FIELD_NUMBER; + hash = (53 * hash) + getTag().hashCode(); + hash = (37 * hash) + CHANNEL_FIELD_NUMBER; + hash = (53 * hash) + getChannel().hashCode(); + hash = (37 * hash) + PROCESSOR_FIELD_NUMBER; + hash = (53 * hash) + getProcessor().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static TransferMeta parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static TransferMeta parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static TransferMeta parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static TransferMeta parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static TransferMeta parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static TransferMeta parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static TransferMeta parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static TransferMeta parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static TransferMeta parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static TransferMeta parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static TransferMeta parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static TransferMeta parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(TransferMeta prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + *
+         * 缃戝叧鏀跺彂鐨勫厓鏁版嵁
+         * 
+ *

+ * Protobuf type {@code com.welab.wefe.gateway.api.meta.basic.TransferMeta} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:com.welab.wefe.gateway.api.meta.basic.TransferMeta) + TransferMetaOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_TransferMeta_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_TransferMeta_fieldAccessorTable + .ensureFieldAccessorsInitialized( + TransferMeta.class, Builder.class); + } + + // Construct using com.welab.wefe.gateway.api.meta.basic.GatewayMetaProto.TransferMeta.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + + @Override + public Builder clear() { + super.clear(); + if (jobBuilder_ == null) { + job_ = null; + } else { + job_ = null; + jobBuilder_ = null; + } + if (srcBuilder_ == null) { + src_ = null; + } else { + src_ = null; + srcBuilder_ = null; + } + if (dstBuilder_ == null) { + dst_ = null; + } else { + dst_ = null; + dstBuilder_ = null; + } + action_ = ""; + + if (contentBuilder_ == null) { + content_ = null; + } else { + content_ = null; + contentBuilder_ = null; + } + transferStatus_ = 0; + + sessionId_ = ""; + + receiveDate_ = 0L; + + expireDate_ = 0L; + + sequenceNo_ = 0; + + sequenceIsEnd_ = false; + + taggedVariableName_ = com.google.protobuf.ByteString.EMPTY; + + tag_ = ""; + + channel_ = ""; + + processor_ = ""; + + return this; + } + + @Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return GatewayMetaProto.internal_static_com_welab_wefe_gateway_api_meta_basic_TransferMeta_descriptor; + } + + @Override + public TransferMeta getDefaultInstanceForType() { + return TransferMeta.getDefaultInstance(); + } + + @Override + public TransferMeta build() { + TransferMeta result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @Override + public TransferMeta buildPartial() { + TransferMeta result = new TransferMeta(this); + if (jobBuilder_ == null) { + result.job_ = job_; + } else { + result.job_ = jobBuilder_.build(); + } + if (srcBuilder_ == null) { + result.src_ = src_; + } else { + result.src_ = srcBuilder_.build(); + } + if (dstBuilder_ == null) { + result.dst_ = dst_; + } else { + result.dst_ = dstBuilder_.build(); + } + result.action_ = action_; + if (contentBuilder_ == null) { + result.content_ = content_; + } else { + result.content_ = contentBuilder_.build(); + } + result.transferStatus_ = transferStatus_; + result.sessionId_ = sessionId_; + result.receiveDate_ = receiveDate_; + result.expireDate_ = expireDate_; + result.sequenceNo_ = sequenceNo_; + result.sequenceIsEnd_ = sequenceIsEnd_; + result.taggedVariableName_ = taggedVariableName_; + result.tag_ = tag_; + result.channel_ = channel_; + result.processor_ = processor_; + onBuilt(); + return result; + } + + @Override + public Builder clone() { + return super.clone(); + } + + @Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.setField(field, value); + } + + @Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, Object value) { + return super.setRepeatedField(field, index, value); + } + + @Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.addRepeatedField(field, value); + } + + @Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof TransferMeta) { + return mergeFrom((TransferMeta) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(TransferMeta other) { + if (other == TransferMeta.getDefaultInstance()) return this; + if (other.hasJob()) { + mergeJob(other.getJob()); + } + if (other.hasSrc()) { + mergeSrc(other.getSrc()); + } + if (other.hasDst()) { + mergeDst(other.getDst()); + } + if (!other.getAction().isEmpty()) { + action_ = other.action_; + onChanged(); + } + if (other.hasContent()) { + mergeContent(other.getContent()); + } + if (other.transferStatus_ != 0) { + setTransferStatusValue(other.getTransferStatusValue()); + } + if (!other.getSessionId().isEmpty()) { + sessionId_ = other.sessionId_; + onChanged(); + } + if (other.getReceiveDate() != 0L) { + setReceiveDate(other.getReceiveDate()); + } + if (other.getExpireDate() != 0L) { + setExpireDate(other.getExpireDate()); + } + if (other.getSequenceNo() != 0) { + setSequenceNo(other.getSequenceNo()); + } + if (other.getSequenceIsEnd() != false) { + setSequenceIsEnd(other.getSequenceIsEnd()); + } + if (other.getTaggedVariableName() != com.google.protobuf.ByteString.EMPTY) { + setTaggedVariableName(other.getTaggedVariableName()); + } + if (!other.getTag().isEmpty()) { + tag_ = other.tag_; + onChanged(); + } + if (!other.getChannel().isEmpty()) { + channel_ = other.channel_; + onChanged(); + } + if (!other.getProcessor().isEmpty()) { + processor_ = other.processor_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @Override + public final boolean isInitialized() { + return true; + } + + @Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + TransferMeta parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (TransferMeta) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private Job job_; + private com.google.protobuf.SingleFieldBuilderV3< + Job, Job.Builder, JobOrBuilder> jobBuilder_; + + /** + *

+             * 浣滀笟淇℃伅 瀹㈡埛绔紶锛堝彲绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Job job = 1; + * + * @return Whether the job field is set. + */ + public boolean hasJob() { + return jobBuilder_ != null || job_ != null; + } + + /** + *
+             * 浣滀笟淇℃伅 瀹㈡埛绔紶锛堝彲绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Job job = 1; + * + * @return The job. + */ + public Job getJob() { + if (jobBuilder_ == null) { + return job_ == null ? Job.getDefaultInstance() : job_; + } else { + return jobBuilder_.getMessage(); + } + } + + /** + *
+             * 浣滀笟淇℃伅 瀹㈡埛绔紶锛堝彲绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Job job = 1; + */ + public Builder setJob(Job value) { + if (jobBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + job_ = value; + onChanged(); + } else { + jobBuilder_.setMessage(value); + } + + return this; + } + + /** + *
+             * 浣滀笟淇℃伅 瀹㈡埛绔紶锛堝彲绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Job job = 1; + */ + public Builder setJob( + Job.Builder builderForValue) { + if (jobBuilder_ == null) { + job_ = builderForValue.build(); + onChanged(); + } else { + jobBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + + /** + *
+             * 浣滀笟淇℃伅 瀹㈡埛绔紶锛堝彲绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Job job = 1; + */ + public Builder mergeJob(Job value) { + if (jobBuilder_ == null) { + if (job_ != null) { + job_ = + Job.newBuilder(job_).mergeFrom(value).buildPartial(); + } else { + job_ = value; + } + onChanged(); + } else { + jobBuilder_.mergeFrom(value); + } + + return this; + } + + /** + *
+             * 浣滀笟淇℃伅 瀹㈡埛绔紶锛堝彲绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Job job = 1; + */ + public Builder clearJob() { + if (jobBuilder_ == null) { + job_ = null; + onChanged(); + } else { + job_ = null; + jobBuilder_ = null; + } + + return this; + } + + /** + *
+             * 浣滀笟淇℃伅 瀹㈡埛绔紶锛堝彲绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Job job = 1; + */ + public Job.Builder getJobBuilder() { + + onChanged(); + return getJobFieldBuilder().getBuilder(); + } + + /** + *
+             * 浣滀笟淇℃伅 瀹㈡埛绔紶锛堝彲绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Job job = 1; + */ + public JobOrBuilder getJobOrBuilder() { + if (jobBuilder_ != null) { + return jobBuilder_.getMessageOrBuilder(); + } else { + return job_ == null ? + Job.getDefaultInstance() : job_; + } + } + + /** + *
+             * 浣滀笟淇℃伅 瀹㈡埛绔紶锛堝彲绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Job job = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + Job, Job.Builder, JobOrBuilder> + getJobFieldBuilder() { + if (jobBuilder_ == null) { + jobBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + Job, Job.Builder, JobOrBuilder>( + getJob(), + getParentForChildren(), + isClean()); + job_ = null; + } + return jobBuilder_; + } + + private Member src_; + private com.google.protobuf.SingleFieldBuilderV3< + Member, Member.Builder, MemberOrBuilder> srcBuilder_; + + /** + *
+             * 鍙戦佹柟 gateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member src = 2; + * + * @return Whether the src field is set. + */ + public boolean hasSrc() { + return srcBuilder_ != null || src_ != null; + } + + /** + *
+             * 鍙戦佹柟 gateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member src = 2; + * + * @return The src. + */ + public Member getSrc() { + if (srcBuilder_ == null) { + return src_ == null ? Member.getDefaultInstance() : src_; + } else { + return srcBuilder_.getMessage(); + } + } + + /** + *
+             * 鍙戦佹柟 gateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member src = 2; + */ + public Builder setSrc(Member value) { + if (srcBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + src_ = value; + onChanged(); + } else { + srcBuilder_.setMessage(value); + } + + return this; + } + + /** + *
+             * 鍙戦佹柟 gateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member src = 2; + */ + public Builder setSrc( + Member.Builder builderForValue) { + if (srcBuilder_ == null) { + src_ = builderForValue.build(); + onChanged(); + } else { + srcBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + + /** + *
+             * 鍙戦佹柟 gateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member src = 2; + */ + public Builder mergeSrc(Member value) { + if (srcBuilder_ == null) { + if (src_ != null) { + src_ = + Member.newBuilder(src_).mergeFrom(value).buildPartial(); + } else { + src_ = value; + } + onChanged(); + } else { + srcBuilder_.mergeFrom(value); + } + + return this; + } + + /** + *
+             * 鍙戦佹柟 gateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member src = 2; + */ + public Builder clearSrc() { + if (srcBuilder_ == null) { + src_ = null; + onChanged(); + } else { + src_ = null; + srcBuilder_ = null; + } + + return this; + } + + /** + *
+             * 鍙戦佹柟 gateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member src = 2; + */ + public Member.Builder getSrcBuilder() { + + onChanged(); + return getSrcFieldBuilder().getBuilder(); + } + + /** + *
+             * 鍙戦佹柟 gateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member src = 2; + */ + public MemberOrBuilder getSrcOrBuilder() { + if (srcBuilder_ != null) { + return srcBuilder_.getMessageOrBuilder(); + } else { + return src_ == null ? + Member.getDefaultInstance() : src_; + } + } + + /** + *
+             * 鍙戦佹柟 gateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member src = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + Member, Member.Builder, MemberOrBuilder> + getSrcFieldBuilder() { + if (srcBuilder_ == null) { + srcBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + Member, Member.Builder, MemberOrBuilder>( + getSrc(), + getParentForChildren(), + isClean()); + src_ = null; + } + return srcBuilder_; + } + + private Member dst_; + private com.google.protobuf.SingleFieldBuilderV3< + Member, Member.Builder, MemberOrBuilder> dstBuilder_; + + /** + *
+             * 鎺ユ敹鏂筭ateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member dst = 3; + * + * @return Whether the dst field is set. + */ + public boolean hasDst() { + return dstBuilder_ != null || dst_ != null; + } + + /** + *
+             * 鎺ユ敹鏂筭ateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member dst = 3; + * + * @return The dst. + */ + public Member getDst() { + if (dstBuilder_ == null) { + return dst_ == null ? Member.getDefaultInstance() : dst_; + } else { + return dstBuilder_.getMessage(); + } + } + + /** + *
+             * 鎺ユ敹鏂筭ateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member dst = 3; + */ + public Builder setDst(Member value) { + if (dstBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + dst_ = value; + onChanged(); + } else { + dstBuilder_.setMessage(value); + } + + return this; + } + + /** + *
+             * 鎺ユ敹鏂筭ateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member dst = 3; + */ + public Builder setDst( + Member.Builder builderForValue) { + if (dstBuilder_ == null) { + dst_ = builderForValue.build(); + onChanged(); + } else { + dstBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + + /** + *
+             * 鎺ユ敹鏂筭ateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member dst = 3; + */ + public Builder mergeDst(Member value) { + if (dstBuilder_ == null) { + if (dst_ != null) { + dst_ = + Member.newBuilder(dst_).mergeFrom(value).buildPartial(); + } else { + dst_ = value; + } + onChanged(); + } else { + dstBuilder_.mergeFrom(value); + } + + return this; + } + + /** + *
+             * 鎺ユ敹鏂筭ateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member dst = 3; + */ + public Builder clearDst() { + if (dstBuilder_ == null) { + dst_ = null; + onChanged(); + } else { + dst_ = null; + dstBuilder_ = null; + } + + return this; + } + + /** + *
+             * 鎺ユ敹鏂筭ateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member dst = 3; + */ + public Member.Builder getDstBuilder() { + + onChanged(); + return getDstFieldBuilder().getBuilder(); + } + + /** + *
+             * 鎺ユ敹鏂筭ateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member dst = 3; + */ + public MemberOrBuilder getDstOrBuilder() { + if (dstBuilder_ != null) { + return dstBuilder_.getMessageOrBuilder(); + } else { + return dst_ == null ? + Member.getDefaultInstance() : dst_; + } + } + + /** + *
+             * 鎺ユ敹鏂筭ateway锛堥潪绌猴級
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Member dst = 3; + */ + private com.google.protobuf.SingleFieldBuilderV3< + Member, Member.Builder, MemberOrBuilder> + getDstFieldBuilder() { + if (dstBuilder_ == null) { + dstBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + Member, Member.Builder, MemberOrBuilder>( + getDst(), + getParentForChildren(), + isClean()); + dst_ = null; + } + return dstBuilder_; + } + + private Object action_ = ""; + + /** + *
+             * 鍔ㄤ綔 瀹㈡埛绔紶锛堥潪绌猴級
+             * 
+ * + * string action = 4; + * + * @return The action. + */ + public String getAction() { + Object ref = action_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + action_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + *
+             * 鍔ㄤ綔 瀹㈡埛绔紶锛堥潪绌猴級
+             * 
+ * + * string action = 4; + * + * @return The bytes for action. + */ + public com.google.protobuf.ByteString + getActionBytes() { + Object ref = action_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + action_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + *
+             * 鍔ㄤ綔 瀹㈡埛绔紶锛堥潪绌猴級
+             * 
+ * + * string action = 4; + * + * @param value The action to set. + * @return This builder for chaining. + */ + public Builder setAction( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + action_ = value; + onChanged(); + return this; + } + + /** + *
+             * 鍔ㄤ綔 瀹㈡埛绔紶锛堥潪绌猴級
+             * 
+ * + * string action = 4; + * + * @return This builder for chaining. + */ + public Builder clearAction() { + + action_ = getDefaultInstance().getAction(); + onChanged(); + return this; + } + + /** + *
+             * 鍔ㄤ綔 瀹㈡埛绔紶锛堥潪绌猴級
+             * 
+ * + * string action = 4; + * + * @param value The bytes for action to set. + * @return This builder for chaining. + */ + public Builder setActionBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + action_ = value; + onChanged(); + return this; + } + + private Content content_; + private com.google.protobuf.SingleFieldBuilderV3< + Content, Content.Builder, ContentOrBuilder> contentBuilder_; + + /** + *
+             * 鍐呭 瀹㈡埛浼狅紙闈炵┖锛
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Content content = 5; + * + * @return Whether the content field is set. + */ + public boolean hasContent() { + return contentBuilder_ != null || content_ != null; + } + + /** + *
+             * 鍐呭 瀹㈡埛浼狅紙闈炵┖锛
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Content content = 5; + * + * @return The content. + */ + public Content getContent() { + if (contentBuilder_ == null) { + return content_ == null ? Content.getDefaultInstance() : content_; + } else { + return contentBuilder_.getMessage(); + } + } + + /** + *
+             * 鍐呭 瀹㈡埛浼狅紙闈炵┖锛
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Content content = 5; + */ + public Builder setContent(Content value) { + if (contentBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + content_ = value; + onChanged(); + } else { + contentBuilder_.setMessage(value); + } + + return this; + } + + /** + *
+             * 鍐呭 瀹㈡埛浼狅紙闈炵┖锛
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Content content = 5; + */ + public Builder setContent( + Content.Builder builderForValue) { + if (contentBuilder_ == null) { + content_ = builderForValue.build(); + onChanged(); + } else { + contentBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + + /** + *
+             * 鍐呭 瀹㈡埛浼狅紙闈炵┖锛
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Content content = 5; + */ + public Builder mergeContent(Content value) { + if (contentBuilder_ == null) { + if (content_ != null) { + content_ = + Content.newBuilder(content_).mergeFrom(value).buildPartial(); + } else { + content_ = value; + } + onChanged(); + } else { + contentBuilder_.mergeFrom(value); + } + + return this; + } + + /** + *
+             * 鍐呭 瀹㈡埛浼狅紙闈炵┖锛
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Content content = 5; + */ + public Builder clearContent() { + if (contentBuilder_ == null) { + content_ = null; + onChanged(); + } else { + content_ = null; + contentBuilder_ = null; + } + + return this; + } + + /** + *
+             * 鍐呭 瀹㈡埛浼狅紙闈炵┖锛
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Content content = 5; + */ + public Content.Builder getContentBuilder() { + + onChanged(); + return getContentFieldBuilder().getBuilder(); + } + + /** + *
+             * 鍐呭 瀹㈡埛浼狅紙闈炵┖锛
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Content content = 5; + */ + public ContentOrBuilder getContentOrBuilder() { + if (contentBuilder_ != null) { + return contentBuilder_.getMessageOrBuilder(); + } else { + return content_ == null ? + Content.getDefaultInstance() : content_; + } + } + + /** + *
+             * 鍐呭 瀹㈡埛浼狅紙闈炵┖锛
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.Content content = 5; + */ + private com.google.protobuf.SingleFieldBuilderV3< + Content, Content.Builder, ContentOrBuilder> + getContentFieldBuilder() { + if (contentBuilder_ == null) { + contentBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + Content, Content.Builder, ContentOrBuilder>( + getContent(), + getParentForChildren(), + isClean()); + content_ = null; + } + return contentBuilder_; + } + + private int transferStatus_ = 0; + + /** + *
+             * 浼犺緭鐘舵 gateway
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.TransferStatus transferStatus = 6; + * + * @return The enum numeric value on the wire for transferStatus. + */ + public int getTransferStatusValue() { + return transferStatus_; + } + + /** + *
+             * 浼犺緭鐘舵 gateway
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.TransferStatus transferStatus = 6; + * + * @param value The enum numeric value on the wire for transferStatus to set. + * @return This builder for chaining. + */ + public Builder setTransferStatusValue(int value) { + transferStatus_ = value; + onChanged(); + return this; + } + + /** + *
+             * 浼犺緭鐘舵 gateway
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.TransferStatus transferStatus = 6; + * + * @return The transferStatus. + */ + public TransferStatus getTransferStatus() { + @SuppressWarnings("deprecation") + TransferStatus result = TransferStatus.valueOf(transferStatus_); + return result == null ? TransferStatus.UNRECOGNIZED : result; + } + + /** + *
+             * 浼犺緭鐘舵 gateway
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.TransferStatus transferStatus = 6; + * + * @param value The transferStatus to set. + * @return This builder for chaining. + */ + public Builder setTransferStatus(TransferStatus value) { + if (value == null) { + throw new NullPointerException(); + } + + transferStatus_ = value.getNumber(); + onChanged(); + return this; + } + + /** + *
+             * 浼犺緭鐘舵 gateway
+             * 
+ * + * .com.welab.wefe.gateway.api.meta.basic.TransferStatus transferStatus = 6; + * + * @return This builder for chaining. + */ + public Builder clearTransferStatus() { + + transferStatus_ = 0; + onChanged(); + return this; + } + + private Object sessionId_ = ""; + + /** + *
+             * 鍞竴鏍囪瘑ID锛屽鎴风浼
+             * 
+ * + * string sessionId = 7; + * + * @return The sessionId. + */ + public String getSessionId() { + Object ref = sessionId_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + sessionId_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + *
+             * 鍞竴鏍囪瘑ID锛屽鎴风浼
+             * 
+ * + * string sessionId = 7; + * + * @return The bytes for sessionId. + */ + public com.google.protobuf.ByteString + getSessionIdBytes() { + Object ref = sessionId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + sessionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + *
+             * 鍞竴鏍囪瘑ID锛屽鎴风浼
+             * 
+ * + * string sessionId = 7; + * + * @param value The sessionId to set. + * @return This builder for chaining. + */ + public Builder setSessionId( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + sessionId_ = value; + onChanged(); + return this; + } + + /** + *
+             * 鍞竴鏍囪瘑ID锛屽鎴风浼
+             * 
+ * + * string sessionId = 7; + * + * @return This builder for chaining. + */ + public Builder clearSessionId() { + + sessionId_ = getDefaultInstance().getSessionId(); + onChanged(); + return this; + } + + /** + *
+             * 鍞竴鏍囪瘑ID锛屽鎴风浼
+             * 
+ * + * string sessionId = 7; + * + * @param value The bytes for sessionId to set. + * @return This builder for chaining. + */ + public Builder setSessionIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + sessionId_ = value; + onChanged(); + return this; + } + + private long receiveDate_; + + /** + *
+             * 鎺ユ敹鍒版暟鎹殑鏃堕棿 gateway
+             * 
+ * + * int64 receiveDate = 8; + * + * @return The receiveDate. + */ + public long getReceiveDate() { + return receiveDate_; + } + + /** + *
+             * 鎺ユ敹鍒版暟鎹殑鏃堕棿 gateway
+             * 
+ * + * int64 receiveDate = 8; + * + * @param value The receiveDate to set. + * @return This builder for chaining. + */ + public Builder setReceiveDate(long value) { + + receiveDate_ = value; + onChanged(); + return this; + } + + /** + *
+             * 鎺ユ敹鍒版暟鎹殑鏃堕棿 gateway
+             * 
+ * + * int64 receiveDate = 8; + * + * @return This builder for chaining. + */ + public Builder clearReceiveDate() { + + receiveDate_ = 0L; + onChanged(); + return this; + } + + private long expireDate_; + + /** + *
+             * 鏁版嵁杩囨湡鏃堕棿 gateway
+             * 
+ * + * int64 expireDate = 9; + * + * @return The expireDate. + */ + public long getExpireDate() { + return expireDate_; + } + + /** + *
+             * 鏁版嵁杩囨湡鏃堕棿 gateway
+             * 
+ * + * int64 expireDate = 9; + * + * @param value The expireDate to set. + * @return This builder for chaining. + */ + public Builder setExpireDate(long value) { + + expireDate_ = value; + onChanged(); + return this; + } + + /** + *
+             * 鏁版嵁杩囨湡鏃堕棿 gateway
+             * 
+ * + * int64 expireDate = 9; + * + * @return This builder for chaining. + */ + public Builder clearExpireDate() { + + expireDate_ = 0L; + onChanged(); + return this; + } + + private int sequenceNo_; + + /** + *
+             * 搴忓彿 gateway
+             * 
+ * + * int32 sequenceNo = 10; + * + * @return The sequenceNo. + */ + public int getSequenceNo() { + return sequenceNo_; + } + + /** + *
+             * 搴忓彿 gateway
+             * 
+ * + * int32 sequenceNo = 10; + * + * @param value The sequenceNo to set. + * @return This builder for chaining. + */ + public Builder setSequenceNo(int value) { + + sequenceNo_ = value; + onChanged(); + return this; + } + + /** + *
+             * 搴忓彿 gateway
+             * 
+ * + * int32 sequenceNo = 10; + * + * @return This builder for chaining. + */ + public Builder clearSequenceNo() { + + sequenceNo_ = 0; + onChanged(); + return this; + } + + private boolean sequenceIsEnd_; + + /** + *
+             * 鏄惁缁撴潫 gateway
+             * 
+ * + * bool sequenceIsEnd = 11; + * + * @return The sequenceIsEnd. + */ + public boolean getSequenceIsEnd() { + return sequenceIsEnd_; + } + + /** + *
+             * 鏄惁缁撴潫 gateway
+             * 
+ * + * bool sequenceIsEnd = 11; + * + * @param value The sequenceIsEnd to set. + * @return This builder for chaining. + */ + public Builder setSequenceIsEnd(boolean value) { + + sequenceIsEnd_ = value; + onChanged(); + return this; + } + + /** + *
+             * 鏄惁缁撴潫 gateway
+             * 
+ * + * bool sequenceIsEnd = 11; + * + * @return This builder for chaining. + */ + public Builder clearSequenceIsEnd() { + + sequenceIsEnd_ = false; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString taggedVariableName_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes taggedVariableName = 12; + * + * @return The taggedVariableName. + */ + public com.google.protobuf.ByteString getTaggedVariableName() { + return taggedVariableName_; + } + + /** + * bytes taggedVariableName = 12; + * + * @param value The taggedVariableName to set. + * @return This builder for chaining. + */ + public Builder setTaggedVariableName(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + + taggedVariableName_ = value; + onChanged(); + return this; + } + + /** + * bytes taggedVariableName = 12; + * + * @return This builder for chaining. + */ + public Builder clearTaggedVariableName() { + + taggedVariableName_ = getDefaultInstance().getTaggedVariableName(); + onChanged(); + return this; + } + + private Object tag_ = ""; + + /** + * string tag = 13; + * + * @return The tag. + */ + public String getTag() { + Object ref = tag_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + tag_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + * string tag = 13; + * + * @return The bytes for tag. + */ + public com.google.protobuf.ByteString + getTagBytes() { + Object ref = tag_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + tag_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string tag = 13; + * + * @param value The tag to set. + * @return This builder for chaining. + */ + public Builder setTag( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + tag_ = value; + onChanged(); + return this; + } + + /** + * string tag = 13; + * + * @return This builder for chaining. + */ + public Builder clearTag() { + + tag_ = getDefaultInstance().getTag(); + onChanged(); + return this; + } + + /** + * string tag = 13; + * + * @param value The bytes for tag to set. + * @return This builder for chaining. + */ + public Builder setTagBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + tag_ = value; + onChanged(); + return this; + } + + private Object channel_ = ""; + + /** + * string channel = 14; + * + * @return The channel. + */ + public String getChannel() { + Object ref = channel_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + channel_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + * string channel = 14; + * + * @return The bytes for channel. + */ + public com.google.protobuf.ByteString + getChannelBytes() { + Object ref = channel_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + channel_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string channel = 14; + * + * @param value The channel to set. + * @return This builder for chaining. + */ + public Builder setChannel( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + channel_ = value; + onChanged(); + return this; + } + + /** + * string channel = 14; + * + * @return This builder for chaining. + */ + public Builder clearChannel() { + + channel_ = getDefaultInstance().getChannel(); + onChanged(); + return this; + } + + /** + * string channel = 14; + * + * @param value The bytes for channel to set. + * @return This builder for chaining. + */ + public Builder setChannelBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + channel_ = value; + onChanged(); + return this; + } + + private Object processor_ = ""; + + /** + *
+             * 澶勭悊鍣
+             * 
+ * + * string processor = 15; + * + * @return The processor. + */ + public String getProcessor() { + Object ref = processor_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + processor_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + *
+             * 澶勭悊鍣
+             * 
+ * + * string processor = 15; + * + * @return The bytes for processor. + */ + public com.google.protobuf.ByteString + getProcessorBytes() { + Object ref = processor_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + processor_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + *
+             * 澶勭悊鍣
+             * 
+ * + * string processor = 15; + * + * @param value The processor to set. + * @return This builder for chaining. + */ + public Builder setProcessor( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + processor_ = value; + onChanged(); + return this; + } + + /** + *
+             * 澶勭悊鍣
+             * 
+ * + * string processor = 15; + * + * @return This builder for chaining. + */ + public Builder clearProcessor() { + + processor_ = getDefaultInstance().getProcessor(); + onChanged(); + return this; + } + + /** + *
+             * 澶勭悊鍣
+             * 
+ * + * string processor = 15; + * + * @param value The bytes for processor to set. + * @return This builder for chaining. + */ + public Builder setProcessorBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + processor_ = value; + onChanged(); + return this; + } + + @Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:com.welab.wefe.gateway.api.meta.basic.TransferMeta) + } + + // @@protoc_insertion_point(class_scope:com.welab.wefe.gateway.api.meta.basic.TransferMeta) + private static final TransferMeta DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new TransferMeta(); + } + + public static TransferMeta getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @Override + public TransferMeta parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new TransferMeta(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @Override + public TransferMeta getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_com_welab_wefe_gateway_api_meta_basic_Job_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_com_welab_wefe_gateway_api_meta_basic_Job_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_com_welab_wefe_gateway_api_meta_basic_Task_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_com_welab_wefe_gateway_api_meta_basic_Task_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_com_welab_wefe_gateway_api_meta_basic_Member_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_com_welab_wefe_gateway_api_meta_basic_Member_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_com_welab_wefe_gateway_api_meta_basic_Content_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_com_welab_wefe_gateway_api_meta_basic_Content_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_com_welab_wefe_gateway_api_meta_basic_ConfigData_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_com_welab_wefe_gateway_api_meta_basic_ConfigData_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_com_welab_wefe_gateway_api_meta_basic_TransferMeta_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_com_welab_wefe_gateway_api_meta_basic_TransferMeta_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + + private static final com.google.protobuf.Descriptors.FileDescriptor + descriptor; + + static { + String[] descriptorData = { + "\n\022gateway-meta.proto\022%com.welab.wefe.gat" + + "eway.api.meta.basic\032\020basic-meta.proto\032\023s" + + "torage-basic.proto\"%\n\003Job\022\r\n\005jobId\030\001 \001(\t" + + "\022\017\n\007jobName\030\002 \001(\t\"a\n\004Task\022\016\n\006taskId\030\001 \001(" + + "\t\022\020\n\010taskName\030\002 \001(\t\0227\n\003job\030\003 \001(\0132*.com.w" + + "elab.wefe.gateway.api.meta.basic.Job\"q\n\006" + + "Member\022\020\n\010memberId\030\001 \001(\t\022\022\n\nmemberName\030\002" + + " \001(\t\022A\n\010endpoint\030\003 \001(\0132/.com.welab.wefe." + + "gateway.api.meta.basic.Endpoint\"}\n\007Conte" + + "nt\022\022\n\nobjectData\030\001 \001(\t\022\026\n\016objectByteData" + + "\030\003 \001(\014\022F\n\013configDatas\030\002 \003(\01321.com.welab." + + "wefe.gateway.api.meta.basic.ConfigData\"(" + + "\n\nConfigData\022\013\n\003key\030\001 \001(\014\022\r\n\005value\030\002 \001(\014" + + "\"\223\004\n\014TransferMeta\0227\n\003job\030\001 \001(\0132*.com.wel" + + "ab.wefe.gateway.api.meta.basic.Job\022:\n\003sr" + + "c\030\002 \001(\0132-.com.welab.wefe.gateway.api.met" + + "a.basic.Member\022:\n\003dst\030\003 \001(\0132-.com.welab." + + "wefe.gateway.api.meta.basic.Member\022\016\n\006ac" + + "tion\030\004 \001(\t\022?\n\007content\030\005 \001(\0132..com.welab." + + "wefe.gateway.api.meta.basic.Content\022M\n\016t" + + "ransferStatus\030\006 \001(\01625.com.welab.wefe.gat" + + "eway.api.meta.basic.TransferStatus\022\021\n\tse" + + "ssionId\030\007 \001(\t\022\023\n\013receiveDate\030\010 \001(\003\022\022\n\nex" + + "pireDate\030\t \001(\003\022\022\n\nsequenceNo\030\n \001(\005\022\025\n\rse" + + "quenceIsEnd\030\013 \001(\010\022\032\n\022taggedVariableName\030" + + "\014 \001(\014\022\013\n\003tag\030\r \001(\t\022\017\n\007channel\030\016 \001(\t\022\021\n\tp" + + "rocessor\030\017 \001(\t*m\n\016TransferStatus\022\021\n\rNOT_" + + "PROCESSED\020\000\022\020\n\014INITIALIZING\020\001\022\016\n\nPROCESS" + + "ING\020\002\022\014\n\010COMPLETE\020\003\022\t\n\005ERROR\020\004\022\r\n\tCANCEL" + + "LED\020\005B\022B\020GatewayMetaProtob\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[]{ + BasicMetaProto.getDescriptor(), + com.welab.wefe.board.service.proto.meta.storage.StorageMetaProto.getDescriptor(), + }); + internal_static_com_welab_wefe_gateway_api_meta_basic_Job_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_com_welab_wefe_gateway_api_meta_basic_Job_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_com_welab_wefe_gateway_api_meta_basic_Job_descriptor, + new String[]{"JobId", "JobName",}); + internal_static_com_welab_wefe_gateway_api_meta_basic_Task_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_com_welab_wefe_gateway_api_meta_basic_Task_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_com_welab_wefe_gateway_api_meta_basic_Task_descriptor, + new String[]{"TaskId", "TaskName", "Job",}); + internal_static_com_welab_wefe_gateway_api_meta_basic_Member_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_com_welab_wefe_gateway_api_meta_basic_Member_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_com_welab_wefe_gateway_api_meta_basic_Member_descriptor, + new String[]{"MemberId", "MemberName", "Endpoint",}); + internal_static_com_welab_wefe_gateway_api_meta_basic_Content_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_com_welab_wefe_gateway_api_meta_basic_Content_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_com_welab_wefe_gateway_api_meta_basic_Content_descriptor, + new String[]{"ObjectData", "ObjectByteData", "ConfigDatas",}); + internal_static_com_welab_wefe_gateway_api_meta_basic_ConfigData_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_com_welab_wefe_gateway_api_meta_basic_ConfigData_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_com_welab_wefe_gateway_api_meta_basic_ConfigData_descriptor, + new String[]{"Key", "Value",}); + internal_static_com_welab_wefe_gateway_api_meta_basic_TransferMeta_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_com_welab_wefe_gateway_api_meta_basic_TransferMeta_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_com_welab_wefe_gateway_api_meta_basic_TransferMeta_descriptor, + new String[]{"Job", "Src", "Dst", "Action", "Content", "TransferStatus", "SessionId", "ReceiveDate", "ExpireDate", "SequenceNo", "SequenceIsEnd", "TaggedVariableName", "Tag", "Channel", "Processor",}); + BasicMetaProto.getDescriptor(); + com.welab.wefe.board.service.proto.meta.storage.StorageMetaProto.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/meta/storage/StorageMetaProto.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/meta/storage/StorageMetaProto.java" new file mode 100644 index 0000000000000000000000000000000000000000..eabff22024d95104c459e051f254fae80563f22d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/proto/meta/storage/StorageMetaProto.java" @@ -0,0 +1,1149 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: gateway/storage-basic.proto + +package com.welab.wefe.board.service.proto.meta.storage; + +/** + * @author aaron.li + */ +public final class StorageMetaProto { + private StorageMetaProto() { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + + /** + * Protobuf enum {@code com.welab.gateway.api.meta.storage.StorageType} + */ + public enum StorageType + implements com.google.protobuf.ProtocolMessageEnum { + /** + * LMDB = 0; + */ + LMDB(0), + /** + * CLICK_HOUSE = 1; + */ + CLICK_HOUSE(1), + UNRECOGNIZED(-1), + ; + + /** + * LMDB = 0; + */ + public static final int LMDB_VALUE = 0; + /** + * CLICK_HOUSE = 1; + */ + public static final int CLICK_HOUSE_VALUE = 1; + + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @Deprecated + public static StorageType valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static StorageType forNumber(int value) { + switch (value) { + case 0: + return LMDB; + case 1: + return CLICK_HOUSE; + default: + return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + + private static final com.google.protobuf.Internal.EnumLiteMap< + StorageType> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public StorageType findValueByNumber(int number) { + return StorageType.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return StorageMetaProto.getDescriptor().getEnumTypes().get(0); + } + + private static final StorageType[] VALUES = values(); + + public static StorageType valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + StorageType(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:com.welab.gateway.api.meta.storage.StorageType) + } + + public interface StorageLocatorOrBuilder extends + // @@protoc_insertion_point(interface_extends:com.welab.gateway.api.meta.storage.StorageLocator) + com.google.protobuf.MessageOrBuilder { + + /** + * .com.welab.gateway.api.meta.storage.StorageType type = 1; + * + * @return The enum numeric value on the wire for type. + */ + int getTypeValue(); + + /** + * .com.welab.gateway.api.meta.storage.StorageType type = 1; + * + * @return The type. + */ + StorageType getType(); + + /** + * string namespace = 2; + * + * @return The namespace. + */ + String getNamespace(); + + /** + * string namespace = 2; + * + * @return The bytes for namespace. + */ + com.google.protobuf.ByteString + getNamespaceBytes(); + + /** + * string name = 3; + * + * @return The name. + */ + String getName(); + + /** + * string name = 3; + * + * @return The bytes for name. + */ + com.google.protobuf.ByteString + getNameBytes(); + + /** + * int32 fragment = 4; + * + * @return The fragment. + */ + int getFragment(); + } + + /** + * Protobuf type {@code com.welab.gateway.api.meta.storage.StorageLocator} + */ + public static final class StorageLocator extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:com.welab.gateway.api.meta.storage.StorageLocator) + StorageLocatorOrBuilder { + private static final long serialVersionUID = 0L; + + // Use StorageLocator.newBuilder() to construct. + private StorageLocator(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private StorageLocator() { + type_ = 0; + namespace_ = ""; + name_ = ""; + } + + @Override + @SuppressWarnings({"unused"}) + protected Object newInstance( + UnusedPrivateParameter unused) { + return new StorageLocator(); + } + + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + + private StorageLocator( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + int rawValue = input.readEnum(); + + type_ = rawValue; + break; + } + case 18: { + String s = input.readStringRequireUtf8(); + + namespace_ = s; + break; + } + case 26: { + String s = input.readStringRequireUtf8(); + + name_ = s; + break; + } + case 32: { + + fragment_ = input.readInt32(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return StorageMetaProto.internal_static_com_welab_gateway_api_meta_storage_StorageLocator_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return StorageMetaProto.internal_static_com_welab_gateway_api_meta_storage_StorageLocator_fieldAccessorTable + .ensureFieldAccessorsInitialized( + StorageLocator.class, Builder.class); + } + + public static final int TYPE_FIELD_NUMBER = 1; + private int type_; + + /** + * .com.welab.gateway.api.meta.storage.StorageType type = 1; + * + * @return The enum numeric value on the wire for type. + */ + public int getTypeValue() { + return type_; + } + + /** + * .com.welab.gateway.api.meta.storage.StorageType type = 1; + * + * @return The type. + */ + public StorageType getType() { + @SuppressWarnings("deprecation") + StorageType result = StorageType.valueOf(type_); + return result == null ? StorageType.UNRECOGNIZED : result; + } + + public static final int NAMESPACE_FIELD_NUMBER = 2; + private volatile Object namespace_; + + /** + * string namespace = 2; + * + * @return The namespace. + */ + public String getNamespace() { + Object ref = namespace_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + namespace_ = s; + return s; + } + } + + /** + * string namespace = 2; + * + * @return The bytes for namespace. + */ + public com.google.protobuf.ByteString + getNamespaceBytes() { + Object ref = namespace_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + namespace_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int NAME_FIELD_NUMBER = 3; + private volatile Object name_; + + /** + * string name = 3; + * + * @return The name. + */ + public String getName() { + Object ref = name_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + name_ = s; + return s; + } + } + + /** + * string name = 3; + * + * @return The bytes for name. + */ + public com.google.protobuf.ByteString + getNameBytes() { + Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int FRAGMENT_FIELD_NUMBER = 4; + private int fragment_; + + /** + * int32 fragment = 4; + * + * @return The fragment. + */ + public int getFragment() { + return fragment_; + } + + private byte memoizedIsInitialized = -1; + + @Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (type_ != StorageType.LMDB.getNumber()) { + output.writeEnum(1, type_); + } + if (!getNamespaceBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, namespace_); + } + if (!getNameBytes().isEmpty()) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, name_); + } + if (fragment_ != 0) { + output.writeInt32(4, fragment_); + } + unknownFields.writeTo(output); + } + + @Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (type_ != StorageType.LMDB.getNumber()) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, type_); + } + if (!getNamespaceBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, namespace_); + } + if (!getNameBytes().isEmpty()) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, name_); + } + if (fragment_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(4, fragment_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @Override + public boolean equals(final Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof StorageLocator)) { + return super.equals(obj); + } + StorageLocator other = (StorageLocator) obj; + + if (type_ != other.type_) return false; + if (!getNamespace() + .equals(other.getNamespace())) return false; + if (!getName() + .equals(other.getName())) return false; + if (getFragment() + != other.getFragment()) return false; + return unknownFields.equals(other.unknownFields); + } + + @Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + TYPE_FIELD_NUMBER; + hash = (53 * hash) + type_; + hash = (37 * hash) + NAMESPACE_FIELD_NUMBER; + hash = (53 * hash) + getNamespace().hashCode(); + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + hash = (37 * hash) + FRAGMENT_FIELD_NUMBER; + hash = (53 * hash) + getFragment(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static StorageLocator parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static StorageLocator parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static StorageLocator parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static StorageLocator parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static StorageLocator parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static StorageLocator parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static StorageLocator parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static StorageLocator parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static StorageLocator parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static StorageLocator parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static StorageLocator parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + + public static StorageLocator parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(StorageLocator prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code com.welab.gateway.api.meta.storage.StorageLocator} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:com.welab.gateway.api.meta.storage.StorageLocator) + StorageLocatorOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return StorageMetaProto.internal_static_com_welab_gateway_api_meta_storage_StorageLocator_descriptor; + } + + @Override + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return StorageMetaProto.internal_static_com_welab_gateway_api_meta_storage_StorageLocator_fieldAccessorTable + .ensureFieldAccessorsInitialized( + StorageLocator.class, Builder.class); + } + + // Construct using com.welab.gateway.api.meta.storage.StorageMetaProto.StorageLocator.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + + @Override + public Builder clear() { + super.clear(); + type_ = 0; + + namespace_ = ""; + + name_ = ""; + + fragment_ = 0; + + return this; + } + + @Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return StorageMetaProto.internal_static_com_welab_gateway_api_meta_storage_StorageLocator_descriptor; + } + + @Override + public StorageLocator getDefaultInstanceForType() { + return StorageLocator.getDefaultInstance(); + } + + @Override + public StorageLocator build() { + StorageLocator result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @Override + public StorageLocator buildPartial() { + StorageLocator result = new StorageLocator(this); + result.type_ = type_; + result.namespace_ = namespace_; + result.name_ = name_; + result.fragment_ = fragment_; + onBuilt(); + return result; + } + + @Override + public Builder clone() { + return super.clone(); + } + + @Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.setField(field, value); + } + + @Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, Object value) { + return super.setRepeatedField(field, index, value); + } + + @Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + Object value) { + return super.addRepeatedField(field, value); + } + + @Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof StorageLocator) { + return mergeFrom((StorageLocator) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(StorageLocator other) { + if (other == StorageLocator.getDefaultInstance()) return this; + if (other.type_ != 0) { + setTypeValue(other.getTypeValue()); + } + if (!other.getNamespace().isEmpty()) { + namespace_ = other.namespace_; + onChanged(); + } + if (!other.getName().isEmpty()) { + name_ = other.name_; + onChanged(); + } + if (other.getFragment() != 0) { + setFragment(other.getFragment()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @Override + public final boolean isInitialized() { + return true; + } + + @Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + StorageLocator parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (StorageLocator) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + + private int type_ = 0; + + /** + * .com.welab.gateway.api.meta.storage.StorageType type = 1; + * + * @return The enum numeric value on the wire for type. + */ + public int getTypeValue() { + return type_; + } + + /** + * .com.welab.gateway.api.meta.storage.StorageType type = 1; + * + * @param value The enum numeric value on the wire for type to set. + * @return This builder for chaining. + */ + public Builder setTypeValue(int value) { + type_ = value; + onChanged(); + return this; + } + + /** + * .com.welab.gateway.api.meta.storage.StorageType type = 1; + * + * @return The type. + */ + public StorageType getType() { + @SuppressWarnings("deprecation") + StorageType result = StorageType.valueOf(type_); + return result == null ? StorageType.UNRECOGNIZED : result; + } + + /** + * .com.welab.gateway.api.meta.storage.StorageType type = 1; + * + * @param value The type to set. + * @return This builder for chaining. + */ + public Builder setType(StorageType value) { + if (value == null) { + throw new NullPointerException(); + } + + type_ = value.getNumber(); + onChanged(); + return this; + } + + /** + * .com.welab.gateway.api.meta.storage.StorageType type = 1; + * + * @return This builder for chaining. + */ + public Builder clearType() { + + type_ = 0; + onChanged(); + return this; + } + + private Object namespace_ = ""; + + /** + * string namespace = 2; + * + * @return The namespace. + */ + public String getNamespace() { + Object ref = namespace_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + namespace_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + * string namespace = 2; + * + * @return The bytes for namespace. + */ + public com.google.protobuf.ByteString + getNamespaceBytes() { + Object ref = namespace_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + namespace_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string namespace = 2; + * + * @param value The namespace to set. + * @return This builder for chaining. + */ + public Builder setNamespace( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + namespace_ = value; + onChanged(); + return this; + } + + /** + * string namespace = 2; + * + * @return This builder for chaining. + */ + public Builder clearNamespace() { + + namespace_ = getDefaultInstance().getNamespace(); + onChanged(); + return this; + } + + /** + * string namespace = 2; + * + * @param value The bytes for namespace to set. + * @return This builder for chaining. + */ + public Builder setNamespaceBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + namespace_ = value; + onChanged(); + return this; + } + + private Object name_ = ""; + + /** + * string name = 3; + * + * @return The name. + */ + public String getName() { + Object ref = name_; + if (!(ref instanceof String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + name_ = s; + return s; + } else { + return (String) ref; + } + } + + /** + * string name = 3; + * + * @return The bytes for name. + */ + public com.google.protobuf.ByteString + getNameBytes() { + Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string name = 3; + * + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName( + String value) { + if (value == null) { + throw new NullPointerException(); + } + + name_ = value; + onChanged(); + return this; + } + + /** + * string name = 3; + * + * @return This builder for chaining. + */ + public Builder clearName() { + + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + + /** + * string name = 3; + * + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + name_ = value; + onChanged(); + return this; + } + + private int fragment_; + + /** + * int32 fragment = 4; + * + * @return The fragment. + */ + public int getFragment() { + return fragment_; + } + + /** + * int32 fragment = 4; + * + * @param value The fragment to set. + * @return This builder for chaining. + */ + public Builder setFragment(int value) { + + fragment_ = value; + onChanged(); + return this; + } + + /** + * int32 fragment = 4; + * + * @return This builder for chaining. + */ + public Builder clearFragment() { + + fragment_ = 0; + onChanged(); + return this; + } + + @Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:com.welab.gateway.api.meta.storage.StorageLocator) + } + + // @@protoc_insertion_point(class_scope:com.welab.gateway.api.meta.storage.StorageLocator) + private static final StorageLocator DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new StorageLocator(); + } + + public static StorageLocator getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @Override + public StorageLocator parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new StorageLocator(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @Override + public StorageLocator getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_com_welab_gateway_api_meta_storage_StorageLocator_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_com_welab_gateway_api_meta_storage_StorageLocator_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + + private static final com.google.protobuf.Descriptors.FileDescriptor + descriptor; + + static { + String[] descriptorData = { + "\n\033gateway/storage-basic.proto\022\"com.welab" + + ".gateway.api.meta.storage\"\202\001\n\016StorageLoc" + + "ator\022=\n\004type\030\001 \001(\0162/.com.welab.gateway.a" + + "pi.meta.storage.StorageType\022\021\n\tnamespace" + + "\030\002 \001(\t\022\014\n\004name\030\003 \001(\t\022\020\n\010fragment\030\004 \001(\005*(" + + "\n\013StorageType\022\010\n\004LMDB\020\000\022\017\n\013CLICK_HOUSE\020\001" + + "B\022B\020StorageMetaProtob\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[]{ + }); + internal_static_com_welab_gateway_api_meta_storage_StorageLocator_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_com_welab_gateway_api_meta_storage_StorageLocator_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_com_welab_gateway_api_meta_storage_StorageLocator_descriptor, + new String[]{"Type", "Namespace", "Name", "Fragment",}); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/scheduled/OnlineDemoScheduledService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/scheduled/OnlineDemoScheduledService.java" new file mode 100644 index 0000000000000000000000000000000000000000..b539b772f268111712b2d002f33f69ec3527ccb3 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/scheduled/OnlineDemoScheduledService.java" @@ -0,0 +1,188 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ +package com.welab.wefe.board.service.scheduled; + +import com.welab.wefe.board.service.constant.Config; +import com.welab.wefe.board.service.database.entity.OperationLogMysqlModel; +import com.welab.wefe.board.service.database.entity.base.AbstractMySqlModel; +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.database.entity.job.JobMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectDataSetMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectFlowMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectMySqlModel; +import com.welab.wefe.board.service.database.repository.GlobalConfigRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.Entity; +import javax.persistence.Table; + +/** + * Demo 鐜鐨勫畾鏃朵换鍔 + * + * @author zane + * @date 2021/12/13 + */ +@Component +@Lazy(false) +public class OnlineDemoScheduledService { + protected final Logger LOG = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private Config config; + @Autowired + private GlobalConfigRepository globalConfigRepository; + + /** + * 涓存椂娓呯悊鏁版嵁 + */ + private void temporaryClean() { + String commonWhere = "where project_id not in ('0a509f5004c54534b81a1cb7a1b2a0d5','7b7666c87387414db32a572236e583ee')"; + delete( + JobMySqlModel.class, + commonWhere + ); + delete( + ProjectMySqlModel.class, + commonWhere + ); + } + + /** + * 娓呯悊浣撻獙鑰呬骇鐢熺殑杩囧鏃犳晥鏁版嵁 + */ + @Scheduled(fixedDelay = 600_000, initialDelay = 60_000) + //@Scheduled(fixedDelay = 5_000, initialDelay = 1_000) + public void clean() { + if (true) { + return; + } + if (!config.isOnlineDemo()) { + return; + } + LOG.info("寮濮 demo 鐜鏁版嵁娓呯悊..."); + /** + * 鍏叡鍓嶆彁锛 + * 1. 澶箙娌′娇鐢紙缂栬緫銆佸惎鍔級鐨勬暟鎹鍒犳帀 + * 2. 绠$悊鍛樺垱寤虹殑鏁版嵁涓嶅垹 + */ + String commonWhere = "where DATEDIFF(now(), created_time)>20 and" + + "(updated_time is null or DATEDIFF(now(), updated_time)>20) and " + + "created_by not in (select id from account where admin_role=true or super_admin_role=true)"; + + /** + * 娓呯悊 job + * 鏃犳潯浠跺垹闄ゆ墍鏈夋弧瓒冲叕鍏卞墠鎻愮殑 job 璁板綍 + */ + delete( + JobMySqlModel.class, + commonWhere + ); + + /** + * 娓呯悊 project + * 1. 鏃犳祦绋嬫垨宸插叧闂殑椤圭洰鍒犳帀 + */ + delete( + ProjectMySqlModel.class, + commonWhere + + "and (project_id not in (select project_id from project_flow) or closed=true)" + ); + + + /** + * 娓呯悊 project_flow + * 1. 浠庢潵娌″惎鍔ㄨ繃鐨勬祦绋嬪垹鎺(鏃犲叧鑱 job) + * 2. project 宸茶鍒犵殑鍒犳帀 + */ + delete( + ProjectFlowMySqlModel.class, + commonWhere + + "and flow_id not in (select flow_id from job)" + ); + delete( + ProjectFlowMySqlModel.class, + commonWhere + + "and project_id not in (select project_id from project)" + ); + + /** + * 娓呯悊 project_data_set + * 1. project 宸茶鍒犵殑鍒犳帀 + */ + delete( + ProjectDataSetMySqlModel.class, + commonWhere + + "and project_id not in (select project_id from project)" + ); + + /** + * 娓呯悊 data_set + * 1. 鏃犻」鐩紩鐢ㄧ殑鍒犳帀 + */ + delete( + DataSetMysqlModel.class, + commonWhere + + "and id not in (select data_set_id from project_data_set)" + ); + + /** + * 娓呯悊 operator_log + * 1. 涓変釜鏈堜互鍓嶇殑鍒犳帀 + */ + delete( + OperationLogMysqlModel.class, + "where DATEDIFF(now(), created_time)>90" + ); + + LOG.info("demo 鐜鏁版嵁娓呯悊鎵ц瀹屾瘯"); + } + + + @Transactional(rollbackFor = Exception.class) + public void delete(Class clazz, String where) { + + String tableName = ""; + + Entity entity = clazz.getAnnotation(Entity.class); + if (entity != null) { + tableName = entity.name(); + } else { + Table annotation = clazz.getAnnotation(Table.class); + tableName = annotation.name(); + } + + StringBuilder sql = new StringBuilder(1024); + sql + .append("select * from `") + .append(tableName) + .append("` ") + .append(where) + // jpa 鍒犳暟鎹繀椤诲厛鏌ュ嚭鏉 + // 杩欓噷涓轰簡閬垮厤鏁版嵁閲忓法澶у鑷存煡璇㈣秴鏃 + // 鍔犱笂 limit 瀛愬彞 + .append(" limit 1000"); + + String sqlStr = sql.toString().replace(System.lineSeparator(), ""); + int count = globalConfigRepository.deleteByQuery(sqlStr, clazz); + LOG.info("delete " + tableName + " count:" + count); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/sdk/FlowService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/sdk/FlowService.java" new file mode 100644 index 0000000000000000000000000000000000000000..69668a087282eb577b0bf6b0544ca50cc582d66c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/sdk/FlowService.java" @@ -0,0 +1,82 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.sdk; + +import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.dto.globalconfig.FlowConfigModel; +import com.welab.wefe.board.service.service.AbstractService; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.http.HttpRequest; +import com.welab.wefe.common.http.HttpResponse; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author zane.luo + */ +@Service +public class FlowService extends AbstractService { + @Autowired + private GlobalConfigService globalConfigService; + + public JObject dashboard() throws StatusCodeWithException { + return request("/flow/dashboard", null); + } + + private JObject request(String api, JSONObject params) throws StatusCodeWithException { + FlowConfigModel flowConfig = globalConfigService.getFlowConfig(); + if (flowConfig == null || StringUtil.isEmpty(flowConfig.intranetBaseUri)) { + StatusCode.RPC_ERROR.throwException("灏氭湭璁剧疆 flow 鍐呯綉鍦板潃锛岃鍦╗鍏ㄥ眬璁剧疆][绯荤粺璁剧疆]涓缃 flow 鏈嶅姟鐨勫唴缃戝湴鍧銆"); + } + + if (params == null) { + params = new JSONObject(); + } + String data = params.toJSONString(); + + if (!api.startsWith("/")) { + api = "/" + api; + } + + HttpResponse response = HttpRequest + .create(globalConfigService.getFlowConfig().intranetBaseUri + api) + .setBody(data) + .postJson(); + + if (!response.success()) { + StatusCode.RPC_ERROR.throwException(response.getMessage()); + } + + JObject json; + try { + json = new JObject(response.getBodyAsJson()); + } catch (JSONException e) { + throw new StatusCodeWithException("flow 鍝嶅簲澶辫触锛" + response.getBodyAsString(), StatusCode.RPC_ERROR); + } + + Integer code = json.getInteger("code"); + if (code == null || !code.equals(0)) { + throw new StatusCodeWithException("flow 鍝嶅簲澶辫触(" + code + ")锛" + json.getString("message"), StatusCode.RPC_ERROR); + } + return json.getJObject("data"); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/sdk/UnionService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/sdk/UnionService.java" new file mode 100644 index 0000000000000000000000000000000000000000..02773dbf61be611131db8282a4d7980cda1c5e83 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/sdk/UnionService.java" @@ -0,0 +1,446 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.sdk; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.api.union.DataSetTagListApi; +import com.welab.wefe.board.service.api.union.MemberListApi; +import com.welab.wefe.board.service.api.union.QueryDataSetApi; +import com.welab.wefe.board.service.api.union.TagListApi; +import com.welab.wefe.board.service.constant.Config; +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.dto.entity.data_set.DataSetOutputModel; +import com.welab.wefe.board.service.dto.globalconfig.MemberInfoModel; +import com.welab.wefe.board.service.service.AbstractService; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.CommonThreadPool; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.DataSetPublicLevel; +import com.welab.wefe.common.enums.SmsBusinessType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.http.HttpRequest; +import com.welab.wefe.common.http.HttpResponse; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.RSAUtil; +import com.welab.wefe.common.util.StringUtil; +import net.jodah.expiringmap.ExpiringMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.TreeMap; +import java.util.concurrent.TimeUnit; + + +/** + * @author Zane + */ +@Service +public class UnionService extends AbstractService { + + /** + * cache + */ + private static final ExpiringMap CACHE_MAP = ExpiringMap + .builder() + .expiration(60, TimeUnit.SECONDS) + .maxSize(500) + .build(); + + @Autowired + private Config config; + + @Autowired + private GlobalConfigService globalConfigService; + + /** + * initialize wefe system + */ + public void initializeSystem(MemberInfoModel model) throws StatusCodeWithException { + JObject params = JObject + .create() + .put("id", model.getMemberId()) + .put("member_id", model.getMemberId()) + .put("name", model.getMemberName()) + .put("mobile", model.getMemberMobile()) + .put("allow_open_data_set", model.getMemberAllowPublicDataSet()) + .put("public_key", model.getRsaPublicKey()) + .put("email", model.getMemberEmail()) + .put("gateway_uri", model.getMemberGatewayUri()) + .put("logo", model.getMemberLogo()) + .put("hidden", model.getMemberHidden()); + + request("member/add", params, false); + } + + /** + * Report member information + */ + public void uploadMemberInfo(MemberInfoModel model) throws StatusCodeWithException { + JObject params = JObject + .create() + .put("id", model.getMemberId()) + .put("name", model.getMemberName()) + .put("mobile", model.getMemberMobile()) + .put("allow_open_data_set", model.getMemberAllowPublicDataSet()) + .put("public_key", model.getRsaPublicKey()) + .put("email", model.getMemberEmail()) + .put("gateway_uri", model.getMemberGatewayUri()) + .put("logo", model.getMemberLogo()) + .put("hidden", model.getMemberHidden()); + + request("member/update", params); + } + + + /** + * Reset key + */ + public void resetPublicKey(MemberInfoModel model) throws StatusCodeWithException { + JObject params = JObject + .create() + .put("id", model.getMemberId()) + .put("public_key", model.getRsaPublicKey()); + + request("member/update_public_key", params); + } + + /** + * Update member information (not including logo) + */ + public void uploadMemberInfoExcludeLogo(MemberInfoModel model) throws StatusCodeWithException { + JObject params = JObject + .create() + .put("id", model.getMemberId()) + .put("name", model.getMemberName()) + .put("mobile", model.getMemberMobile()) + .put("allow_open_data_set", model.getMemberAllowPublicDataSet()) + .put("public_key", model.getRsaPublicKey()) + .put("email", model.getMemberEmail()) + .put("gateway_uri", model.getMemberGatewayUri()) + .put("hidden", model.getMemberHidden()); + + request("member/update_exclude_logo", params); + } + + /** + * Update member information logo + */ + public void updateMemberLogo(MemberInfoModel model) throws StatusCodeWithException { + JObject params = JObject + .create() + .put("id", model.getMemberId()) + .put("logo", model.getMemberLogo()); + + request("member/update_logo", params); + } + + /** + * Report data set information + */ + public void uploadDataSet(DataSetMysqlModel model) throws StatusCodeWithException { + MemberInfoModel member = globalConfigService.getMemberInfo(); + // If data exposure is prohibited globally, it will not be reported. + if (!member.getMemberAllowPublicDataSet()) { + return; + } + + // If this data set is not publicly available to anyone + if (model.getPublicLevel() == DataSetPublicLevel.OnlyMyself) { + // Notify union to remove the data set + dontPublicDataSet(model.getId()); + return; + } + + // Push data set information to union + JObject params = JObject + .create() + .put("id", model.getId()) + .put("name", model.getName()) + .put("member_id", CacheObjects.getMemberId()) + .put("contains_y", model.getContainsY()) + .put("row_count", model.getRowCount()) + .put("column_count", model.getColumnCount()) + .put("column_name_list", model.getColumnNameList()) + .put("feature_count", model.getFeatureCount()) + .put("feature_name_list", model.getFeatureNameList()) + .put("public_level", model.getPublicLevel()) + .put("public_member_list", model.getPublicMemberList()) + .put("usage_count_in_job", model.getUsageCountInJob()) + .put("usage_count_in_flow", model.getUsageCountInFlow()) + .put("usage_count_in_project", model.getUsageCountInProject()) + .put("tags", model.getTags()) + .put("description", model.getDescription()); + + CommonThreadPool.run(() -> { + try { + request("data_set/put", params); + } catch (StatusCodeWithException e) { + super.log(e); + } + }); + } + + /** + * Hidden data set + */ + public void dontPublicDataSet(String dataSetId) throws StatusCodeWithException { + JObject params = JObject + .create() + .put("id", dataSetId); + + request("data_set/delete", params); + } + + /** + * Pagination query member + */ + public synchronized JSONObject queryMembers(MemberListApi.Input input) throws StatusCodeWithException { + + String key = "queryMembers" + JSON.toJSONString(input); + if (CACHE_MAP.containsKey(key)) { + return (JSONObject) CACHE_MAP.get(key); + } + + JObject params = JObject + .create() + .put("page_index", input.getPageIndex()) + .put("page_size", input.getPageSize()) + .put("name", input.getName()) + .put("id", input.getId()); + + JSONObject response = request("member/query", params); + CACHE_MAP.put(key, response); + return response; + } + + public JSONObject queryMemberById(String id) throws StatusCodeWithException { + return queryMember(id, ""); + } + + public JSONObject queryMember(String id, String name) throws StatusCodeWithException { + return queryMemberByPage(0, 0, id, name); + } + + public JSONObject queryMember(int pageIndex, int pageSize) throws StatusCodeWithException { + return queryMemberByPage(pageIndex, pageSize, "", ""); + } + + public JSONObject queryMemberByPage(int pageIndex, int pageSize, String id, String name) throws StatusCodeWithException { + JObject params = JObject.create() + .put("page_index", pageIndex) + .put("page_size", pageSize); + + if (StringUtil.isNotEmpty(id)) { + params.put("id", id); + } + + if (StringUtil.isNotEmpty(name)) { + params.put("name", name); + } + + return request("member/query", params); + } + + /** + * Paging query data set tag + */ + public JSONObject queryDataSetTags(DataSetTagListApi.Input input) throws StatusCodeWithException { + String key = "queryDataSetTags" + JSON.toJSONString(input); + if (CACHE_MAP.containsKey(key)) { + return (JSONObject) CACHE_MAP.get(key); + } + + JObject params = JObject + .create() + .put("page_index", input.getPageIndex()) + .put("page_size", input.getPageSize()) + .put("tag_name", input.getTag()); + + JSONObject response = request("data_set/tags/query", params); + CACHE_MAP.put(key, response); + return response; + } + + /** + * Pagination query default tags + */ + public JSONObject queryTags(TagListApi.Input input) throws StatusCodeWithException { + + String key = "queryTags" + JSON.toJSONString(input); + if (CACHE_MAP.containsKey(key)) { + return (JSONObject) CACHE_MAP.get(key); + } + + JObject params = JObject + .create() + .put("page_index", input.getPageIndex()) + .put("page_size", input.getPageSize()); + + JSONObject response = request("default_tag/query", params); + CACHE_MAP.put(key, response); + return response; + } + + /** + * Paging query data set + */ + public JSONObject queryDataSets(QueryDataSetApi.Input input) throws StatusCodeWithException { + JObject params = JObject + .create() + .put("page_index", input.getPageIndex()) + .put("page_size", input.getPageSize()) + .put("id", input.getId()) + .put("tag", input.getTag()) + .put("name", input.getName()) + .put("contains_y", input.getContainsY()) + .put("member_id", input.getMemberId()); + + return request("data_set/query", params); + } + + /** + * Get details of a single data set + */ + public DataSetOutputModel queryDataSetDetail(String id) throws StatusCodeWithException { + + if (CACHE_MAP.containsKey(id)) { + return (DataSetOutputModel) CACHE_MAP.get(id); + } + + JObject params = JObject + .create() + .put("id", id); + + JSONObject result = request("data_set/detail", params); + + JSONObject data = result.getJSONObject("data"); + + if (data == null || data.isEmpty()) { + return null; + } + + return data.toJavaObject(DataSetOutputModel.class); + } + + public void sendVerificationCode(String mobile, SmsBusinessType smsBusinessType) throws StatusCodeWithException { + if (!StringUtil.checkPhoneNumber(mobile)) { + throw new StatusCodeWithException("闈炴硶鐨勬墜鏈哄彿", StatusCode.PARAMETER_VALUE_INVALID); + } + JObject params = JObject.create() + .append("mobile", mobile) + .append("smsBusinessType", smsBusinessType); + try { + request("sms/send_verification_code", params, true); + } catch (StatusCodeWithException e) { + throw new StatusCodeWithException(getUnionOrigExceptionMsg(e), StatusCode.SYSTEM_ERROR); + } catch (Exception e) { + throw new StatusCodeWithException(e.getMessage(), StatusCode.SYSTEM_ERROR); + } + } + + /** + * Check verification code + */ + public void checkVerificationCode(String mobile, String code, SmsBusinessType smsBusinessType) throws StatusCodeWithException { + JObject params = JObject.create() + .append("mobile", mobile) + .append("code", code) + .append("smsBusinessType", smsBusinessType); + try { + request("sms/check_verification_code", params, true); + } catch (StatusCodeWithException e) { + throw new StatusCodeWithException(getUnionOrigExceptionMsg(e), StatusCode.SYSTEM_ERROR); + } catch (Exception e) { + throw new StatusCodeWithException(e.getMessage(), StatusCode.SYSTEM_ERROR); + } + } + + private String getUnionOrigExceptionMsg(StatusCodeWithException e) { + String errorMsg = e.getMessage(); + if (StringUtil.isNotEmpty(errorMsg)) { + int index = errorMsg.indexOf("锛"); + if (index != -1) { + errorMsg = errorMsg.substring(index + 1); + } + } + return errorMsg; + } + + private JSONObject request(String api, JSONObject params) throws StatusCodeWithException { + return request(api, params, true); + } + + private JSONObject request(String api, JSONObject params, boolean needSign) throws StatusCodeWithException { + /** + * Prevent the map from being out of order, causing the verification to fail. + */ + params = new JSONObject(new TreeMap(params)); + + String data = params.toJSONString(); + + // rsa signature + if (needSign) { + String sign = null; + try { + sign = RSAUtil.sign(data, CacheObjects.getRsaPrivateKey(), "UTF-8"); + } catch (Exception e) { + e.printStackTrace(); + throw new StatusCodeWithException(e.getMessage(), StatusCode.SYSTEM_ERROR); + } + + + JSONObject body = new JSONObject(); + body.put("member_id", CacheObjects.getMemberId()); + body.put("sign", sign); + body.put("data", data); + + data = body.toJSONString(); + } + + HttpResponse response = HttpRequest + .create(config.getUNION_BASE_URL() + "/" + api) + .setBody(data) + .postJson(); + + if (!response.success()) { + throw new StatusCodeWithException(response.getMessage(), StatusCode.RPC_ERROR); + } + + JSONObject json; + try { + json = response.getBodyAsJson(); + } catch (JSONException e) { + throw new StatusCodeWithException("union 鍝嶅簲澶辫触锛" + response.getBodyAsString(), StatusCode.RPC_ERROR); + } + + if (json == null) { + throw new StatusCodeWithException("union 鍝嶅簲澶辫触锛" + response.getBodyAsString(), StatusCode.RPC_ERROR); + } + + Integer code = json.getInteger("code"); + if (code == null || !code.equals(0)) { + throw new StatusCodeWithException("union 鍝嶅簲澶辫触(" + code + ")锛" + json.getString("message"), StatusCode.RPC_ERROR); + } + return json; + } + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/AbstractService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/AbstractService.java" new file mode 100644 index 0000000000000000000000000000000000000000..f4095b93a5948eec3b871528935b276dc4e8f714 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/AbstractService.java" @@ -0,0 +1,39 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.constant.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Zane + */ +public class AbstractService { + protected final Logger LOG = LoggerFactory.getLogger(this.getClass()); + + @Autowired + protected GatewayService gatewayService; + + @Autowired + protected Config config; + + protected void log(Exception e) { + LOG.error(e.getClass() + " " + e.getMessage(), e); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/BaseGatewayService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/BaseGatewayService.java" new file mode 100644 index 0000000000000000000000000000000000000000..57bc2e9d69346d0e3a21c334c0252e5b57f601e4 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/BaseGatewayService.java" @@ -0,0 +1,247 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.alibaba.fastjson.JSON; +import com.google.protobuf.MessageOrBuilder; +import com.google.protobuf.util.JsonFormat; +import com.welab.wefe.board.service.dto.globalconfig.GatewayConfigModel; +import com.welab.wefe.board.service.proto.TransferServiceGrpc; +import com.welab.wefe.board.service.proto.meta.basic.BasicMetaProto; +import com.welab.wefe.board.service.proto.meta.basic.GatewayMetaProto; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.GatewayActionType; +import com.welab.wefe.common.enums.GatewayProcessorType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.dto.ApiResult; +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +/** + * @author zane + */ +public class BaseGatewayService extends AbstractService { + + @Autowired + private GlobalConfigService globalConfigService; + + + /** + * Send a message to your own gateway service + */ + protected ApiResult sendToMyselfGateway(GatewayActionType action, String data, GatewayProcessorType processorType) { + return sendToMyselfGateway(null, action, data, processorType); + } + + /** + * Send a message to your own gateway service + */ + protected ApiResult sendToMyselfGateway(String gatewayUri, GatewayActionType action, String data, GatewayProcessorType processorType) { + if (gatewayUri == null) { + GatewayConfigModel gatewayConfig = globalConfigService.getGatewayConfig(); + if (gatewayConfig != null) { + gatewayUri = gatewayConfig.intranetBaseUri; + } + } + + return sendMessage( + gatewayUri, + CacheObjects.getMemberId(), + CacheObjects.getMemberName(), + action, + data, + processorType); + } + + /** + * Send message to other party's gateway service + */ + protected ApiResult sendToOtherGateway(String dstMemberId, GatewayActionType action, String data, GatewayProcessorType processorType) { + return sendMessage( + globalConfigService.getGatewayConfig().intranetBaseUri, + dstMemberId, + CacheObjects.getMemberName(dstMemberId), + action, + data, + processorType); + } + + /** + * Basic method send message to gateway service by grpc + * + * @param gatewayUri gateway service address + * @param dstMemberId the member_id of the target member + * @param dstMemberName The member_name of the target member + * @param action action of the message + * @param data data of the message + * @param processorType enum, see:{@link com.welab.wefe.common.enums.GatewayProcessorType} + */ + private ApiResult sendMessage(String gatewayUri, String dstMemberId, String dstMemberName, GatewayActionType action, String data, GatewayProcessorType processorType) { + + if (StringUtil.isEmpty(gatewayUri)) { + ApiResult.ofErrorWithStatusCode(StatusCode.RPC_ERROR, "灏氭湭璁剧疆 gateway 鍐呯綉鍦板潃锛岃鍦╗鍏ㄥ眬璁剧疆][绯荤粺璁剧疆]涓缃 gateway 鏈嶅姟鐨勫唴缃戝湴鍧銆"); + } + + GatewayMetaProto.TransferMeta transferMeta = buildTransferMeta(dstMemberId, dstMemberName, action, data, processorType); + ManagedChannel grpcChannel = null; + ApiResult result = null; + try { + grpcChannel = getGrpcChannel(gatewayUri); + TransferServiceGrpc.TransferServiceBlockingStub clientStub = TransferServiceGrpc.newBlockingStub(grpcChannel); + BasicMetaProto.ReturnStatus returnStatus = clientStub.send(transferMeta); + if (returnStatus.getCode() != 0) { + result = ApiResult.ofErrorWithStatusCode(StatusCode.REMOTE_SERVICE_ERROR, returnStatus.getMessage()); + return result; + } + if (StringUtil.isEmpty(returnStatus.getData())) { + result = ApiResult.ofSuccess(null); + return result; + } + result = JSON + .parseObject(returnStatus.getData()) + .toJavaObject(ApiResult.class); + } catch (Exception e) { + LOG.error("Request gateway exception, message: " + transferMetaToString(transferMeta) + ",exception锛" + e.getMessage(), e); + try { + checkPermission(e); + } catch (StatusCodeWithException ex) { + result = ApiResult.ofErrorWithStatusCode(StatusCode.RPC_ERROR, ex.getMessage()); + return result; + } + result = ApiResult.ofErrorWithStatusCode(StatusCode.RPC_ERROR, e.getMessage()); + + } finally { + if (null != grpcChannel) { + try { + grpcChannel.shutdownNow().awaitTermination(2, TimeUnit.SECONDS); + } catch (Exception e) { + LOG.error("Closing gateway connection exception锛", e); + } + } + + String message = "[grpc] end to " + dstMemberName; + message += " " + (result.success() ? "success" : "fail message:" + result.getMessage() + " request:" + data); + + if (result.success()) { + LOG.info(message); + } else { + LOG.error(message); + } + } + + return result; + } + + + /** + * convert TransferMeta to string + */ + private String transferMetaToString(MessageOrBuilder message) { + try { + return JsonFormat.printer().print(message); + } catch (Exception e) { + LOG.error(e.getMessage(), e); + } + + return null; + } + + /** + * Check gateway permissions issues, such as IP whitelist and signature issues + * + * @param e The exception object returned by the access gateway + */ + protected void checkPermission(Exception e) throws StatusCodeWithException { + String errorMsg = e.getMessage(); + // Connection unavailable + String connectionDisableTips = "UNAVAILABLE"; + // The gateway prompts abnormal information in response to the IP whitelist + String ipPermissionTips = "PERMISSION_DENIED"; + // The gateway responds to the signature and prompts abnormal information + String signPermissionTips = "UNAUTHENTICATED"; + if (StringUtil.isEmpty(errorMsg) || errorMsg.contains(connectionDisableTips)) { + throw new StatusCodeWithException("杩炴帴涓嶅彲鐢紝璇锋鏌ョ綉鍏冲湴鍧鏄惁姝g‘鎴栫綉缁滆繛鎺ユ槸鍚︽甯告垨缃戝叧鏈嶅姟鏄惁宸插惎鍔", StatusCode.RPC_ERROR); + } + if (errorMsg.contains(ipPermissionTips)) { + throw new StatusCodeWithException("璇峰湪 [鍏ㄥ眬璁剧疆] -> [绯荤粺璁剧疆] 鑿滃崟涓嬫坊鍔 board 鏈嶅姟鐨 IP 鍦板潃鍒 gateway 鐧藉悕鍗曪紝璇︾粏淇℃伅璇锋煡鐪 [Dashboard] 鑿滃崟", StatusCode.IP_LIMIT); + } + if (errorMsg.contains(signPermissionTips)) { + throw new StatusCodeWithException("绛惧悕澶辫触锛岃纭繚Member鐨勫叕绉侀挜姝g‘鎬т互鍙婂叕閽ユ槸鍚﹀凡涓婁紶", StatusCode.RPC_ERROR); + } + } + + private ManagedChannel getGrpcChannel(String gatewayUri) throws StatusCodeWithException { + if (StringUtil.isEmpty(gatewayUri)) { + throw new StatusCodeWithException("璇峰埌 [鍏ㄥ眬璁剧疆] -> [绯荤粺璁剧疆] 鑿滃崟涓嬮厤缃綉鍏冲湴鍧淇℃伅锛屾牸寮忎负 IP:PORT", StatusCode.PARAMETER_VALUE_INVALID); + } + + if (!isValidGatewayUri(gatewayUri)) { + throw new StatusCodeWithException("缃戝叧鍦板潃鏍煎紡涓嶆纭紝鏍煎紡搴斾负 IP:PORT", StatusCode.PARAMETER_VALUE_INVALID); + } + + return ManagedChannelBuilder + .forTarget(gatewayUri) + .usePlaintext() + .build(); + } + + protected GatewayMetaProto.TransferMeta buildTransferMeta(String dstMemberId, String dstMemberName, GatewayActionType action, String data, GatewayProcessorType processorType) { + GatewayMetaProto.Member.Builder builder = GatewayMetaProto.Member.newBuilder() + .setMemberId(dstMemberId); + + if (StringUtil.isNotBlank(dstMemberName)) { + builder.setMemberName(dstMemberName); + } + + GatewayMetaProto.Member dstMember = builder + .build(); + + GatewayMetaProto.Content content = GatewayMetaProto.Content.newBuilder() + .setObjectData(data) + .build(); + + return GatewayMetaProto.TransferMeta.newBuilder() + .setAction(action.name()) + .setDst(dstMember) + .setContent(content) + .setSessionId(UUID.randomUUID().toString().replaceAll("-", "")) + .setProcessor(processorType.name()) + .build(); + + } + + /** + * Check if it is a legal gateway format + * + * @param gatewayUri Gateway address, the format must be: : + */ + private boolean isValidGatewayUri(String gatewayUri) { + if (StringUtil.isEmpty(gatewayUri)) { + return false; + } + + String splitSymbol = ":"; + return gatewayUri.contains(splitSymbol) && gatewayUri.split(splitSymbol).length <= 2 && StringUtil.isNumeric(gatewayUri.split(splitSymbol)[1]); + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/BlacklistService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/BlacklistService.java" new file mode 100644 index 0000000000000000000000000000000000000000..c06d23bf60b91bdedc7d279380dadd244067afa2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/BlacklistService.java" @@ -0,0 +1,149 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.api.blacklist.AddApi; +import com.welab.wefe.board.service.api.blacklist.BlacklistApi; +import com.welab.wefe.board.service.api.blacklist.BlacklistMemberApi; +import com.welab.wefe.board.service.api.blacklist.DeleteApi; +import com.welab.wefe.board.service.database.entity.BlacklistMysqlModel; +import com.welab.wefe.board.service.database.repository.BlacklistRepository; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.BlacklistOutputModel; +import com.welab.wefe.board.service.dto.entity.MemberOutputModel; +import com.welab.wefe.board.service.sdk.UnionService; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.CurrentAccount; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author lonnie + */ +@Service +public class BlacklistService extends AbstractService { + + @Autowired + private BlacklistRepository blacklistRepository; + + @Autowired + private UnionService unionService; + + @Autowired + private GatewayService gatewayService; + + public PagingOutput list(BlacklistApi.Input input) throws StatusCodeWithException { + + List resultList = new ArrayList<>(); + + Specification where = Where + .create() + .build(BlacklistMysqlModel.class); + + PagingOutput page = blacklistRepository.paging(where, input); + for (BlacklistMysqlModel model : page.getList()) { + JSONObject memberObj = unionService.queryMemberById(model.getBlacklistMemberId()); + List list = JObject.create(memberObj).getJSONList("data.list"); + + for (JObject obj : list) { + String name = obj.getString("name"); + String id = obj.getString("id"); + BlacklistOutputModel outModel = new BlacklistOutputModel(); + outModel.setId(model.getId()); + outModel.setMemberId(id); + outModel.setMemberName(name); + outModel.setRemark(model.getRemark()); + outModel.setCreatedTime(model.getCreatedTime()); + outModel.setCreatedBy(model.getMemberId()); + resultList.add(outModel); + } + } + + return PagingOutput.of( + page.getTotal(), + resultList + ); + } + + /** + * Add blacklist + */ + public void add(AddApi.Input input) { + + List list = new ArrayList<>(); + if (input.getMemberIds() != null) { + for (String id : input.getMemberIds()) { + BlacklistMysqlModel model = new BlacklistMysqlModel(); + model.setMemberId(CacheObjects.getMemberId()); + model.setBlacklistMemberId(id); + model.setRemark(input.getRemark()); + model.setCreatedTime(new Date()); + model.setCreatedBy(CurrentAccount.id()); + list.add(model); + } + } + + blacklistRepository.saveAll(list); + + CacheObjects.refreshMemberBlacklist(); + // Notify gateway to update blacklist cache + gatewayService.refreshMemberBlacklistCache(); + } + + public void deleteFromBlacklist(DeleteApi.Input input) { + blacklistRepository.deleteById(input.getId()); + CacheObjects.refreshMemberBlacklist(); + // Notify gateway to update blacklist cache + gatewayService.refreshMemberBlacklistCache(); + } + + public PagingOutput queryBlacklistMember(BlacklistMemberApi.Input input) throws StatusCodeWithException { + + JSONObject memberObj = unionService.queryMemberByPage(input.getPageIndex(), input.getPageSize(), input.getId(), input.getName()); + List list = JObject.create(memberObj).getJSONList("data.list"); + + List resultList = new ArrayList<>(); + for (JObject obj : list) { + MemberOutputModel model = new MemberOutputModel(); + String memberId = obj.getStringByPath("id"); + model.setId(memberId); + model.setName(obj.getString("name")); + model.setEmail(obj.getString("email")); + model.setMobile(obj.getString("mobile")); + BlacklistMysqlModel blacklistMysqlModel = blacklistRepository.findByBlacklistMemberId(memberId); + + if (blacklistMysqlModel != null || CacheObjects.getMemberId().equals(memberId)) { + model.setInBlacklist(true); + } + resultList.add(model); + } + + return PagingOutput.of( + JObject.create(memberObj).getIntegerByPath("data.total", 0), + resultList + ); + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/CacheObjects.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/CacheObjects.java" new file mode 100644 index 0000000000000000000000000000000000000000..5d7a2eeb78a1d04a67087a19a3c158125fc7893a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/CacheObjects.java" @@ -0,0 +1,299 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.api.union.MemberListApi; +import com.welab.wefe.board.service.database.entity.AccountMySqlModel; +import com.welab.wefe.board.service.database.repository.AccountRepository; +import com.welab.wefe.board.service.database.repository.BlacklistRepository; +import com.welab.wefe.board.service.database.repository.DataSetRepository; +import com.welab.wefe.board.service.dto.globalconfig.MemberInfoModel; +import com.welab.wefe.board.service.sdk.UnionService; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.Convert; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.Launcher; +import org.springframework.data.domain.Sort; + +import java.util.*; + +/** + * Global cache + *

+ * The unchanged or little changed data in the system is stored + * to reduce the complexity of database query and coding. + *

+ * cache list锛 + * - login status + * - local member info + * - local data set tags + * - local account list + * - union some data + * - ... + * + * @author Zane + */ +public class CacheObjects { + + + private static long LAST_REFRESH_MEMBER_MAP_TIME = 0; + + private static String MEMBER_ID; + private static String RSA_PRIVATE_KEY; + private static String RSA_PUBLIC_KEY; + private static String MEMBER_NAME; + + /** + * Data set tags + * tag : count + */ + private static final TreeMap DATA_SET_TAGS = new TreeMap<>(); + + /** + * accountId : nickname + */ + private static final LinkedHashMap ACCOUNT_MAP = new LinkedHashMap<>(); + + /** + * accountIds + */ + private static final List ACCOUNT_ID_LIST = new ArrayList<>(); + + /** + * accountId : member name + */ + private static final LinkedHashMap MEMBER_MAP = new LinkedHashMap<>(); + + /** + * member blacklist + */ + private static final Set MEMBER_BLACKLIST = new HashSet<>(); + + public static Set getMemberBlackList() { + if (MEMBER_BLACKLIST.isEmpty()) { + refreshMemberBlacklist(); + } + return MEMBER_BLACKLIST; + } + + public synchronized static void refreshMemberBlacklist() { + BlacklistRepository repository = Launcher.CONTEXT.getBean(BlacklistRepository.class); + MEMBER_BLACKLIST.clear(); + repository.findAll().forEach(x -> MEMBER_BLACKLIST.add(x.getBlacklistMemberId())); + } + + public static String getMemberId() { + if (MEMBER_ID == null) { + refreshMemberInfo(); + } + return MEMBER_ID; + } + + public static String getRsaPrivateKey() { + if (RSA_PRIVATE_KEY == null) { + refreshMemberInfo(); + } + return RSA_PRIVATE_KEY; + } + + public static String getRsaPublicKey() { + if (RSA_PUBLIC_KEY == null) { + refreshMemberInfo(); + } + return RSA_PUBLIC_KEY; + } + + public static String getMemberName() { + if (MEMBER_NAME == null) { + refreshMemberInfo(); + } + return MEMBER_NAME; + } + + public static TreeMap getDataSetTags() { + if (DATA_SET_TAGS.isEmpty()) { + refreshDataSetTags(); + } + return DATA_SET_TAGS; + } + + public static List getAccountIdList() { + if (ACCOUNT_ID_LIST.isEmpty()) { + refreshAccountMap(); + } + return ACCOUNT_ID_LIST; + } + + public static LinkedHashMap getAccountMap() { + if (ACCOUNT_MAP.isEmpty()) { + refreshAccountMap(); + } + return ACCOUNT_MAP; + } + + /** + * Get the account's nickname + */ + public static synchronized String getNickname(String accountId) { + if (accountId == null) { + return null; + } + return getAccountMap().get(accountId) == null ? getMemberName(accountId) : getAccountMap().get(accountId); + } + + /** + * Determine whether accountId belongs to the current member + */ + public static synchronized boolean isCurrentMember(String accountId) { + return getAccountIdList().contains(accountId); + } + + private static LinkedHashMap getMemberMap() throws StatusCodeWithException { + if (MEMBER_MAP.isEmpty()) { + refreshMemberMap(); + } + return MEMBER_MAP; + } + + /** + * Check if an id is member_id + */ + public static boolean isMemberId(String memberId) { + return getMemberName(memberId) != null; + } + + public static synchronized String getMemberName(String memberId) { + if (StringUtil.isEmpty(memberId)) { + return null; + } + + try { + String memberName = getMemberMap().get(memberId); + if (memberName == null) { + CacheObjects.refreshMemberMap(); + memberName = getMemberMap().get(memberId); + } + return memberName; + + } catch (StatusCodeWithException e) { + return null; + } + + } + + /** + * Reload member information + */ + public static synchronized void refreshMemberInfo() { + GlobalConfigService service = Launcher.CONTEXT.getBean(GlobalConfigService.class); + MemberInfoModel model = service.getMemberInfo(); + + if (model == null) { + return; + } + + MEMBER_ID = model.getMemberId(); + RSA_PUBLIC_KEY = model.getRsaPublicKey(); + RSA_PRIVATE_KEY = model.getRsaPrivateKey(); + MEMBER_NAME = model.getMemberName(); + } + + /** + * Reload the number of data sets corresponding to each tag + */ + public static synchronized void refreshDataSetTags() { + // Query all tags from the database + DataSetRepository repo = Launcher.CONTEXT.getBean(DataSetRepository.class); + List rows = repo.listAllTags(); + DATA_SET_TAGS.clear(); + + // Count the number of data sets corresponding to each tag + for (Object[] row : rows) { + List tags = StringUtil.splitWithoutEmptyItem(String.valueOf(row[0]), ","); + long count = Convert.toLong(row[1]); + for (String tag : tags) { + if (!DATA_SET_TAGS.containsKey(tag)) { + DATA_SET_TAGS.put(tag, 0L); + } + + DATA_SET_TAGS.put(tag, DATA_SET_TAGS.get(tag) + count); + + } + } + } + + /** + * Reload account list + */ + public static synchronized void refreshAccountMap() { + AccountRepository repo = Launcher.CONTEXT.getBean(AccountRepository.class); + List list = repo.findAll(Sort.by("nickname")); + + ACCOUNT_MAP.clear(); + ACCOUNT_ID_LIST.clear(); + for (AccountMySqlModel item : list) { + ACCOUNT_MAP.put(item.getId(), item.getNickname()); + ACCOUNT_ID_LIST.add(item.getId()); + } + } + + + /** + * Reload the list of union members + */ + public static synchronized void refreshMemberMap() throws StatusCodeWithException { + // Prohibit high frequency refresh + if (System.currentTimeMillis() - LAST_REFRESH_MEMBER_MAP_TIME < 60_000) { + return; + } + LAST_REFRESH_MEMBER_MAP_TIME = System.currentTimeMillis(); + + UnionService service = Launcher.CONTEXT.getBean(UnionService.class); + MEMBER_MAP.clear(); + MemberListApi.Input input = new MemberListApi.Input(); + while (true) { + + JSONObject json = service.queryMembers(input); + + JSONArray list = json + .getJSONObject("data") + .getJSONArray("list"); + + if (list.isEmpty()) { + break; + } + + list + .stream() + .map(x -> (JSONObject) x) + .forEach(x -> MEMBER_MAP.put(x.getString("id"), x.getString("name"))); + + if (list.size() < input.getPageSize()) { + break; + } + + input.setPageIndex(input.getPageIndex() + 1); + + + } + + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ChatLastAccountService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ChatLastAccountService.java" new file mode 100644 index 0000000000000000000000000000000000000000..61ac085d92957ea7034f524cc72d08b1aaa28a82 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ChatLastAccountService.java" @@ -0,0 +1,154 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.api.chat.AddChatLastAccountApi; +import com.welab.wefe.board.service.api.chat.DeleteChatLastAccountApi; +import com.welab.wefe.board.service.database.entity.chat.ChatLastAccountMysqlModel; +import com.welab.wefe.board.service.database.entity.chat.ChatUnreadMessageMySqlModel; +import com.welab.wefe.board.service.database.repository.ChatLastAccountRepository; +import com.welab.wefe.board.service.database.repository.ChatUnreadMessageRepository; +import com.welab.wefe.board.service.dto.entity.ChatLastAccountOutputModel; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.OrderBy; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * Recent chat account service + * + * @author aaron.li + **/ +@Service +public class ChatLastAccountService extends AbstractService { + + @Autowired + private ChatLastAccountRepository chatLastAccountRepository; + + @Autowired + private ChatUnreadMessageRepository chatUnreadMessageRepository; + + /** + * Query the list of all recent chat accounts + * + * @param accountId Primary account ID + */ + public List query(String accountId) { + // Result list + List resultList = new ArrayList<>(); + + // Query recent chat account + Specification where = Where + .create() + .equal("accountId", accountId) + .orderBy("updatedTime", OrderBy.desc) + .build(ChatLastAccountMysqlModel.class); + List chatLastAccountMysqlModelList = chatLastAccountRepository.findAll(where); + if (CollectionUtils.isEmpty(chatLastAccountMysqlModelList)) { + return resultList; + } + + List liaisonAccountIdList = new ArrayList<>(); + ChatLastAccountOutputModel chatLastAccountOutputModel = null; + for (ChatLastAccountMysqlModel model : chatLastAccountMysqlModelList) { + liaisonAccountIdList.add(model.getLiaisonAccountId()); + chatLastAccountOutputModel = new ChatLastAccountOutputModel(); + BeanUtils.copyProperties(model, chatLastAccountOutputModel); + resultList.add(chatLastAccountOutputModel); + } + + + // Query the number of unread messages of this account + Specification where2 = Where.create() + .in("fromAccountId", liaisonAccountIdList) + .equal("toAccountId", accountId) + .build(ChatUnreadMessageMySqlModel.class); + List chatUnreadMessageMySqlModelList = chatUnreadMessageRepository.findAll(where2); + if (CollectionUtils.isEmpty(chatUnreadMessageMySqlModelList)) { + return resultList; + } + + // Set the number of unread messages + for (ChatUnreadMessageMySqlModel model : chatUnreadMessageMySqlModelList) { + for (ChatLastAccountOutputModel resultModel : resultList) { + // Found unread messages from this contact + if (resultModel.getLiaisonAccountId().equals(model.getFromAccountId())) { + resultModel.setUnreadNum(model.getNum()); + break; + } + } + } + + return resultList; + } + + /** + * Add a recent chat account record + */ + public void add(ChatLastAccountMysqlModel model) { + if (null == model) { + return; + } + + Specification where = Where + .create() + .equal("accountId", model.getAccountId()) + .equal("liaisonAccountId", model.getLiaisonAccountId()) + .build(ChatLastAccountMysqlModel.class); + ChatLastAccountMysqlModel chatLastAccountMysqlModel = chatLastAccountRepository.findOne(where).orElse(null); + chatLastAccountMysqlModel = (null == chatLastAccountMysqlModel ? model : chatLastAccountMysqlModel); + chatLastAccountMysqlModel.setUpdatedTime(new Date()); + chatLastAccountMysqlModel.setAccountName(model.getAccountName()); + chatLastAccountMysqlModel.setMemberName(model.getMemberName()); + chatLastAccountMysqlModel.setLiaisonAccountName(model.getLiaisonAccountName()); + chatLastAccountMysqlModel.setLiaisonMemberName(model.getLiaisonMemberName()); + chatLastAccountRepository.save(chatLastAccountMysqlModel); + } + + /** + * Add a recent chat account record + */ + public void add(AddChatLastAccountApi.Input input) { + ChatLastAccountMysqlModel model = new ChatLastAccountMysqlModel(); + model.setAccountId(input.getAccountId()); + model.setAccountName(input.getAccountName()); + model.setMemberId(input.getMemberId()); + model.setMemberName(input.getMemberName()); + model.setLiaisonAccountId(input.getLiaisonAccountId()); + model.setLiaisonAccountName(input.getLiaisonAccountName()); + model.setLiaisonMemberId(input.getLiaisonMemberId()); + model.setLiaisonMemberName(input.getLiaisonMemberName()); + + add(model); + } + + /** + * Delete records according to account ID and contact account ID + */ + @Transactional(rollbackFor = Exception.class) + public void delete(DeleteChatLastAccountApi.Input input) { + chatLastAccountRepository.deleteByAccountIdEqualsAndLiaisonAccountIdEquals(input.getAccountId(), input.getLiaisonAccountId()); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ChatUnreadMessageService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ChatUnreadMessageService.java" new file mode 100644 index 0000000000000000000000000000000000000000..34beaeaf114a924b265f94c6bd96f9e89763a5be --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ChatUnreadMessageService.java" @@ -0,0 +1,72 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.database.entity.chat.ChatUnreadMessageMySqlModel; +import com.welab.wefe.board.service.database.entity.chat.MemberChatMySqlModel; +import com.welab.wefe.board.service.database.repository.ChatUnreadMessageRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +/** + * Unread message service + * + * @author aaron.li + **/ +@Service +public class ChatUnreadMessageService { + + @Autowired + private ChatUnreadMessageRepository chatUnreadMessageRepository; + + + /** + * Unread message plus 1 + */ + public void addChatUnreadMessage(MemberChatMySqlModel memberChatModel) { + ChatUnreadMessageMySqlModel unreadMessageModel = new ChatUnreadMessageMySqlModel(); + unreadMessageModel.setFromAccountId(memberChatModel.getFromAccountId()); + unreadMessageModel.setFromMemberId(memberChatModel.getFromMemberId()); + unreadMessageModel.setToAccountId(memberChatModel.getToAccountId()); + unreadMessageModel.setToMemberId(memberChatModel.getToMemberId()); + unreadMessageModel.setCreatedTime(new Date()); + unreadMessageModel.setUpdatedTime(new Date()); + + ChatUnreadMessageMySqlModel model = chatUnreadMessageRepository.findByFromAccountIdAndAndToAccountId(memberChatModel.getFromAccountId(), memberChatModel.getToAccountId()); + if (null == model) { + unreadMessageModel.setNum(1); + chatUnreadMessageRepository.save(unreadMessageModel); + } else { + model.setNum(model.getNum() + 1); + chatUnreadMessageRepository.save(model); + } + } + + /** + * Delete unread message record + * + * @param fromAccountId Sender account ID + * @param toAccountId Receiver account ID + * @return Number of records deleted + */ + public int delete(String fromAccountId, String toAccountId) { + return chatUnreadMessageRepository.deleteByFromAccountIdAndToAccountId(fromAccountId, toAccountId); + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/DataSetColumnService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/DataSetColumnService.java" new file mode 100644 index 0000000000000000000000000000000000000000..fac692eb1d9431de9082e33ef6a9fcd5f1c01891 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/DataSetColumnService.java" @@ -0,0 +1,76 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.database.entity.data_set.DataSetColumnMysqlModel; +import com.welab.wefe.board.service.database.repository.DataSetColumnRepository; +import com.welab.wefe.board.service.dto.base.PagingInput; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.data_set.DataSetColumnInputModel; +import com.welab.wefe.board.service.dto.entity.data_set.DataSetColumnOutputModel; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.OrderBy; +import com.welab.wefe.common.web.CurrentAccount; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author zane.luo + */ +@Service +public class DataSetColumnService extends AbstractService { + @Autowired + DataSetColumnRepository dataSetColumnRepository; + + public PagingOutput list(String dataSetId) { + Specification where = Where + .create() + .equal("dataSetId", dataSetId) + .orderBy("index", OrderBy.asc) + .build(DataSetColumnMysqlModel.class); + + // The front end does not do paging, + // but considering that there may be a data set with a particularly large number of fields, + // the paging method is used to query here. + return dataSetColumnRepository.paging( + where, + new PagingInput(0, 10000), + DataSetColumnOutputModel.class + ); + } + + public void update(String dataSetId, List list, CurrentAccount.Info userInfo) { + // clear data set columns + dataSetColumnRepository.deleteByDataSetId(dataSetId); + + // save data set columns + for (int i = 0; i < list.size(); i++) { + DataSetColumnInputModel item = list.get(i); + + DataSetColumnMysqlModel column = new ModelMapper().map(item, DataSetColumnMysqlModel.class); + column.setCreatedBy(userInfo.id); + column.setDataSetId(dataSetId); + column.setIndex(i); + + dataSetColumnRepository.save(column); + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/DataSetService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/DataSetService.java" new file mode 100644 index 0000000000000000000000000000000000000000..924e404943ba9c6d2b52264216e2a796a321119e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/DataSetService.java" @@ -0,0 +1,404 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import java.io.File; +import java.sql.Connection; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import com.welab.wefe.board.service.api.dataset.DeleteApi; +import com.welab.wefe.board.service.api.dataset.QueryApi; +import com.welab.wefe.board.service.api.dataset.UpdateApi; +import com.welab.wefe.board.service.constant.Config; +import com.welab.wefe.board.service.constant.DataSetAddMethod; +import com.welab.wefe.board.service.database.entity.DataSourceMySqlModel; +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectDataSetMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectMySqlModel; +import com.welab.wefe.board.service.database.repository.DataSetRepository; +import com.welab.wefe.board.service.database.repository.DataSourceRepository; +import com.welab.wefe.board.service.database.repository.JobMemberRepository; +import com.welab.wefe.board.service.database.repository.JobRepository; +import com.welab.wefe.board.service.database.repository.ProjectDataSetRepository; +import com.welab.wefe.board.service.database.repository.ProjectRepository; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.data_set.DataSetOutputModel; +import com.welab.wefe.board.service.dto.entity.project.ProjectUsageDetailOutputModel; +import com.welab.wefe.board.service.onlinedemo.OnlineDemoBranchStrategy; +import com.welab.wefe.board.service.sdk.UnionService; +import com.welab.wefe.board.service.util.JdbcManager; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.DataSetPublicLevel; +import com.welab.wefe.common.enums.OrderBy; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.CurrentAccount; + +/** + * @author Zane + */ +@Service +public class DataSetService extends AbstractService { + + @Autowired + protected DataSetRepository repo; + @Autowired + protected DataSetColumnService dataSetColumnService; + @Autowired + protected UnionService unionService; + @Autowired + protected DataSetStorageService dataSetStorageService; + @Autowired + protected JobRepository jobRepository; + @Autowired + protected JobMemberRepository jobMemberRepository; + @Autowired + protected JobRepository featureJobRepository; + @Autowired + DataSourceRepository dataSourceRepo; + @Autowired + private DataSetRepository dataSetRepository; + @Autowired + private Config config; + @Autowired + private ProjectDataSetRepository projectDataSetRepository; + @Autowired + private ProjectRepository projectRepository; + + /** + * Get uploaded file + */ + public File getDataSetFile(DataSetAddMethod method, String filename) throws StatusCodeWithException { + File file = null; + switch (method) { + case HttpUpload: + file = new File(config.getFileUploadDir(), filename); + break; + case LocalFile: + file = new File(filename); + break; + case Database: + break; + default: + } + + if (null == file || !file.exists()) { + throw new StatusCodeWithException("鏈壘鍒版枃浠讹細" + filename, StatusCode.PARAMETER_VALUE_INVALID); + } + + return file; + } + + /** + * Paging query data set + */ + public PagingOutput query(QueryApi.Input input) { + + Specification where = Where + .create() + .equal("id", input.getId()) + .contains("name", input.getName()) + .containsItem("tags", input.getTag()) + .equal("containsY", input.getContainsY()) + .equal("createdBy", input.getCreator()) + .equal("sourceType", null, false) + .orderBy("createdTime", OrderBy.desc) + .build(DataSetMysqlModel.class); + + return repo.paging(where, input, DataSetOutputModel.class); + } + + public DataSetMysqlModel query(String sourceJobId, ComponentType sourceType) { + + Specification where = Where.create().equal("sourceJobId", sourceJobId) + .equal("sourceType", sourceType).build(DataSetMysqlModel.class); + + return repo.findOne(where).orElse(null); + } + + public DataSetMysqlModel save(DataSetMysqlModel model) { + return repo.save(model); + } + + /** + * delete data set + */ + public void delete(DeleteApi.Input input) throws StatusCodeWithException { + DataSetMysqlModel model = repo.findById(input.getId()).orElse(null); + if (model == null) { + return; + } + + OnlineDemoBranchStrategy.hackOnDelete(input, model, "鍙兘鍒犻櫎鑷繁娣诲姞鐨勬暟鎹泦銆"); + + delete(model); + } + + /** + * delete data set + */ + public void delete(String dataSetId) throws StatusCodeWithException { + DataSetMysqlModel model = repo.findById(dataSetId).orElse(null); + if (model == null) { + return; + } + + delete(model); + } + + /** + * delete data set + */ + public void delete(DataSetMysqlModel model) throws StatusCodeWithException { + + // delete data set from database + repo.deleteById(model.getId()); + + // delete data set from storage + dataSetStorageService.deleteDataSet(model.getId()); + + // is raw data set + if (model.getSourceType() == null) { + // Notify the union to do not public the data set + unionService.dontPublicDataSet(model.getId()); + + // Refresh the data set tag list + CacheObjects.refreshDataSetTags(); + } + + } + + /** + * update data set info + */ + public void update(UpdateApi.Input input) throws StatusCodeWithException { + + if (repo.countByName(input.getName(), input.getId()) > 0) { + throw new StatusCodeWithException("姝ゆ暟鎹泦鍚嶇О宸插瓨鍦紝璇锋崲涓涓暟鎹泦鍚嶇О", StatusCode.PARAMETER_VALUE_INVALID); + } + + DataSetMysqlModel model = repo.findById(input.getId()).orElse(null); + if (model == null) { + return; + } + + model.setUpdatedBy(CurrentAccount.id()); + model.setName(input.getName()); + model.setTags(StringUtil.join(input.getTags(), ",")); + model.setDescription(input.getDescription()); + model.setPublicMemberList(input.getPublicMemberList()); + model.setPublicLevel(input.getPublicLevel()); + model.setTags(standardizeTags(input.getTags())); + + handlePublicMemberList(model); + + repo.save(model); + + // save data set column info to database + dataSetColumnService.update(input.getId(), input.getMetadataList(), CurrentAccount.get()); + + unionService.uploadDataSet(model); + + CacheObjects.refreshDataSetTags(); + } + + /** + * Process the list of visible members + *

+ * When the scene is visible to the specified members, automatically add itself is also visible. + */ + public void handlePublicMemberList(DataSetMysqlModel model) { + + // When the PublicLevel is PublicWithMemberList, if list contains yourself, + // you will be removed, and union will handle the data that you must be visible. + if (model.getPublicLevel() == DataSetPublicLevel.PublicWithMemberList) { + String memberId = CacheObjects.getMemberId(); + + + if (model.getPublicMemberList().contains(memberId)) { + String list = model.getPublicMemberList() + .replace(memberId, "") + .replace(",,", ","); + + model.setPublicMemberList(list); + } + } + + } + + + /** + * Standardize the tag list + */ + public String standardizeTags(List tags) { + if (tags == null) { + return ""; + } + + tags = tags.stream() + // Remove comma(,锛) + .map(x -> x.replace(",", "").replace("锛", "")) + // Remove empty elements + .filter(x -> !StringUtil.isEmpty(x)) + .distinct() + .sorted() + .collect(Collectors.toList()); + + // Concatenate into a string, add a comma before and after it to facilitate like query. + return "," + StringUtil.join(tags, ',') + ","; + + } + + /** + * get data source by id + */ + public DataSourceMySqlModel getDataSourceById(String dataSourceId) { + return dataSourceRepo.findById(dataSourceId).orElse(null); + } + + /** + * get data sets info from local or union + */ + public DataSetOutputModel findDataSetFromLocalOrUnion(String memberId, String dataSetId) throws StatusCodeWithException { + + if (memberId.equals(CacheObjects.getMemberId())) { + DataSetMysqlModel dataSet = repo.findById(dataSetId).orElse(null); + if (dataSet == null) { + return null; + } + return ModelMapper.map(dataSet, DataSetOutputModel.class); + } else { + return unionService.queryDataSetDetail(dataSetId); + } + } + + public DataSetMysqlModel findOne(String dataSetId) { + return repo.findById(dataSetId).orElse(null); + + } + + /** + * Test whether SQL can be queried normally + */ + public boolean testSqlQuery(String dataSourceId, String sql) throws StatusCodeWithException { + DataSourceMySqlModel model = getDataSourceById(dataSourceId); + if (model == null) { + throw new StatusCodeWithException("dataSourceId鍦ㄦ暟鎹簱涓嶅瓨鍦", StatusCode.DATA_NOT_FOUND); + } + + if (StringUtils.isEmpty(sql)) { + throw new StatusCodeWithException("璇峰~鍏ql鏌ヨ璇彞", StatusCode.PARAMETER_CAN_NOT_BE_EMPTY); + } + + Connection conn = JdbcManager.getConnection( + model.getDatabaseType(), + model.getHost(), + model.getPort(), + model.getUserName(), + model.getPassword(), + model.getDatabaseName() + ); + + return JdbcManager.testQuery(conn, sql, true); + } + + /** + * Update the number of data sets used in the project + */ + public void updateUsageCountInProject(String dataSetId) { + dataSetRepository.updateUsageCountInProject(dataSetId); + + DataSetMysqlModel model = repo.findById(dataSetId).orElse(null); + if (model == null) { + return; + } + + try { + unionService.uploadDataSet(model); + } catch (StatusCodeWithException e) { + super.log(e); + } + } + + /** + * The number of data sets used in the flow ++ + */ + public void usageCountInFlowIncrement(String dataSetId) throws StatusCodeWithException { + updateUsageCount(dataSetId, x -> x.setUsageCountInProject(x.getUsageCountInProject() + 1)); + } + + /** + * The number of data sets used in the flow -- + */ + public void usageCountInFlowDecrement(String dataSetId) throws StatusCodeWithException { + updateUsageCount(dataSetId, x -> x.setUsageCountInFlow(x.getUsageCountInFlow() - 1)); + } + + /** + * The number of data sets used in the job ++ + */ + public void usageCountInJobIncrement(String dataSetId) throws StatusCodeWithException { + updateUsageCount(dataSetId, x -> x.setUsageCountInJob(x.getUsageCountInJob() + 1)); + } + + /** + * Update the various usage count of the data set + */ + private void updateUsageCount(String dataSetId, Consumer func) throws StatusCodeWithException { + DataSetMysqlModel model = repo.findById(dataSetId).orElse(null); + if (model == null) { + return; + } + + func.accept(model); + repo.save(model); + + unionService.uploadDataSet(model); + } + + /** + * Query the project information used by the dataset in the project + */ + public List queryUsageInProject(String dataSetId) { + List ProjectUsageDetailOutputModelList = new ArrayList<>(); + List usageInProjectList = projectDataSetRepository.queryUsageInProject(dataSetId); + if (usageInProjectList == null || usageInProjectList.isEmpty()) { + return ProjectUsageDetailOutputModelList; + } + + for (ProjectDataSetMySqlModel usageInProject : usageInProjectList) { + ProjectMySqlModel projectMySqlModel = projectRepository.findOneById(usageInProject.getProjectId()); + ProjectUsageDetailOutputModel projectUsageDetailOutputModel = new ProjectUsageDetailOutputModel(); + projectUsageDetailOutputModel.setName(projectMySqlModel.getName()); + projectUsageDetailOutputModel.setProjectId(projectMySqlModel.getProjectId()); + ProjectUsageDetailOutputModelList.add(projectUsageDetailOutputModel); + } + + return ProjectUsageDetailOutputModelList; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/DataSetStorageService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/DataSetStorageService.java" new file mode 100644 index 0000000000000000000000000000000000000000..e36dae53a3b4831709f58c390342cb4654fc2448 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/DataSetStorageService.java" @@ -0,0 +1,220 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.alibaba.fastjson.JSON; +import com.welab.wefe.common.data.storage.common.Constant; +import com.welab.wefe.common.data.storage.model.DataItemModel; +import com.welab.wefe.common.data.storage.model.PageInputModel; +import com.welab.wefe.common.data.storage.model.PageOutputModel; +import com.welab.wefe.common.data.storage.service.StorageService; +import com.welab.wefe.common.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Data set storage service read and write class + *

+ * The data set is stored in storage service(LMDB/ClickHouse), not in the mysql database. + * + * @author Zane + */ +@Service +public class DataSetStorageService extends AbstractService { + public static final String DATABASE_NAME = Constant.DBName.WEFE_DATA; + + @Autowired + StorageService storageService; + + /** + * Determine whether the specified key exists + */ + public boolean containsKey(String dataSetId, String key) { + String table = createRawDataSetTableName(dataSetId); + boolean contains = storageService.getByKey(DATABASE_NAME, table, key) != null; + return contains; + } + + /** + * remove data set from storage + */ + public void deleteDataSet(String dataSetId) { + String table = createRawDataSetTableName(dataSetId); + storageService.dropTB(DATABASE_NAME, table); + } + + /** + * save data set header info to storage + */ + public void saveHeaderRow(String dataSetId, List row) { + String sid = null; + List header = new ArrayList<>(); + + for (String item : row) { + if (sid == null) { + sid = String.valueOf(item); + } else { + header.add(String.valueOf(item)); + } + } + + String tableName = createRawDataSetTableName(dataSetId) + ".meta"; + + // According to the convention, + // sid needs to be converted to json string so that double quotation marks are added before and after. + sid = JSON.toJSONString(sid); + save(tableName, "sid", sid); + + // According to the convention, + // the header needs to be converted to json string + // so that double quotation marks are added before and after it. + String headerRow = JSON.toJSONString(StringUtil.join(header, ",")); + save(tableName, "header", headerRow); + + } + + /** + * save data row to storage + */ + public void saveDataRow(String dataSetId, Collection values) { + save(createRawDataSetTableName(dataSetId), buildDataItemModel(values)); + } + + /** + * save data rows to storage + */ + public void saveDataRows(String dataSetId, List> rows) { + + List> list = rows + .stream() + .map(x -> buildDataItemModel(x)) + .collect(Collectors.toList()); + + saveList(createRawDataSetTableName(dataSetId), list); + } + + /** + * Convert the data rows in the dataset to DataItemModel + */ + private DataItemModel buildDataItemModel(Collection values) { + String key = null; + List list = new ArrayList<>(); + + for (Object item : values) { + if (key == null) { + key = String.valueOf(item); + } else { + list.add(String.valueOf(item)); + } + } + return new DataItemModel<>(key, StringUtil.join(list, ",")); + } + + + /** + * view the data set data rows + */ + public List> previewDataSet(String dbName, String tableName, int limit) { + PageOutputModel page = storageService.getPage(dbName, tableName, new PageInputModel(0, limit)); + + List> data = page.getData(); + return data + .stream() + .map(x -> { + List list = new ArrayList<>(); + list.add(String.valueOf(x.getK())); + + Object value = x.getV(); + if (value != null) { + for (String item : String.valueOf(value).split(",")) { + list.add(item); + } + } + + return list; + }) + .collect(Collectors.toList()); + } + + /** + * save a record to storage + */ + private void save(String tableName, String key, String value) { + storageService.save(DATABASE_NAME, tableName, new DataItemModel<>(key, value)); + } + + /** + * save a record to storage + */ + private void save(String tableName, DataItemModel item) { + storageService.save(DATABASE_NAME, tableName, item); + } + + /** + * save multi records to storage + */ + public void saveList(String tableName, List> list) { + storageService.saveList(DATABASE_NAME, tableName, list); + } + + /** + * read by pagination + */ + public PageOutputModel getListByPage(String namespace, String tableName, PageInputModel inputModel) { + return storageService.getPage(namespace, tableName, inputModel); + } + + /** + * real all record from storage table + */ + public List getList(String tableName) { + return storageService.getList(DATABASE_NAME, tableName); + } + + /** + * Generate the raw data set table name + */ + public String createRawDataSetTableName(String dataSetId) { + return "data_set_" + dataSetId; + } + + /** + * Get row count of table + */ + public int count(String tableName) { + return storageService.count(DATABASE_NAME, tableName); + } + + /** + * Get row count of table + */ + public int count(String databaseName, String tableName) { + return storageService.count(databaseName, tableName); + } + + /** + * Calculate the appropriate batch size based on the number of columns in the data set + */ + public int getAddBatchSize(int columns) { + return storageService.getAddBatchSize(columns); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/DataSourceService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/DataSourceService.java" new file mode 100644 index 0000000000000000000000000000000000000000..45a813f95c556676e9a36edf12985624603a22c5 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/DataSourceService.java" @@ -0,0 +1,107 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.api.datasource.AddApi; +import com.welab.wefe.board.service.api.datasource.DeleteApi; +import com.welab.wefe.board.service.api.datasource.QueryApi; +import com.welab.wefe.board.service.api.datasource.TestDBConnectApi; +import com.welab.wefe.board.service.database.entity.DataSourceMySqlModel; +import com.welab.wefe.board.service.database.repository.DataSourceRepository; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.util.JdbcManager; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.Md5; +import com.welab.wefe.common.web.CurrentAccount; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import java.sql.Connection; + +/** + * @author Johnny.lin + */ +@Service +public class DataSourceService extends AbstractService { + @Autowired + DataSourceRepository dataSourceRepo; + + public AddApi.DataSourceAddOutput add(AddApi.DataSourceAddInput input) throws StatusCodeWithException { + + if (dataSourceRepo.countByName(input.getName()) > 0) { + throw new StatusCodeWithException("姝ゆ暟鎹簮鍚嶇О宸插瓨鍦紝璇锋崲涓涓暟鎹簮鍚嶇О", StatusCode.PARAMETER_VALUE_INVALID); + } + + // Test if the connection is available + testdbconnect(input); + + DataSourceMySqlModel model = ModelMapper.map(input, DataSourceMySqlModel.class); + model.setCreatedBy(CurrentAccount.id()); +// model.setPassword(Md5.of(model.getPassword())); + dataSourceRepo.save(model); + + AddApi.DataSourceAddOutput output = new AddApi.DataSourceAddOutput(); + output.setId(model.getId()); + return output; + } + + /** + * Delete data sources + */ + public void delete(DeleteApi.Input input) { + DataSourceMySqlModel model = dataSourceRepo.findById(input.getId()).orElse(null); + if (model == null) { + return; + } + + dataSourceRepo.deleteById(input.getId()); + } + + /** + * Query data source by pagination + */ + public PagingOutput query(QueryApi.Input input) { + Specification where = Where.create() + .equal("name", input.getName()) + .build(DataSourceMySqlModel.class); + + return dataSourceRepo.paging(where, input, QueryApi.Output.class); + } + + /** + * Test database connection + */ + public TestDBConnectApi.Output testdbconnect(AddApi.DataSourceAddInput input) throws StatusCodeWithException { + + Connection conn = JdbcManager.getConnection(input.getDatabaseType(), input.getHost(), input.getPort(), input.getUserName(), input.getPassword(), input.getDatabaseName()); + if (conn != null) { + boolean success = JdbcManager.testQuery(conn); + if (!success) { + throw new StatusCodeWithException(StatusCode.DATABASE_LOST, "鏁版嵁搴撹繛鎺ュけ璐"); + } + } + + TestDBConnectApi.Output output = new TestDBConnectApi.Output(); + output.setResult(true); + return output; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/EmailService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/EmailService.java" new file mode 100644 index 0000000000000000000000000000000000000000..0114d071b9d8a0d53ca8c1a6c19cb5f1291042bc --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/EmailService.java" @@ -0,0 +1,238 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.database.entity.AccountMySqlModel; +import com.welab.wefe.board.service.database.entity.MessageMysqlModel; +import com.welab.wefe.board.service.dto.globalconfig.MailServerModel; +import com.welab.wefe.board.service.service.account.AccountService; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.enums.MessageLevel; +import com.welab.wefe.common.enums.ProducerType; +import com.welab.wefe.common.util.StringUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.MailSendException; +import org.springframework.mail.javamail.JavaMailSenderImpl; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; + +import javax.mail.Address; +import javax.mail.SendFailedException; +import javax.mail.internet.MimeMessage; +import java.util.HashSet; +import java.util.List; +import java.util.Properties; +import java.util.Set; + +/** + * email service + * + * @author aaron.li + **/ +@Service +public class EmailService extends AbstractService { + private static final String MAIL_DEFAULT_ENCODING = "UTF-8"; + private static final String MAIL_SMTP_AUTH = "true"; + private static final String MAIL_SMTP_WRITE_TIMEOUT = "5000"; + private static final String MAIL_SMTP_TIMEOUT = "5000"; + private static final String MAIL_SMTP_CONNECTION_TIMEOUT = "5000"; + + @Autowired + private MessageService messageService; + + @Autowired + private AccountService accountService; + + @Autowired + private GlobalConfigService globalConfigService; + + /** + * Send approval task notification email (multiple persons) + * + * @return Failed to send email address list + */ + public Set sendApprovalJobNotifyMail() { + String subject = "杩欐槸涓涓爣棰"; + String content = "杩欐槸姝f枃"; + + // Failed to send mailbox list + Set sendFailEmails = new HashSet<>(16); + try { + Set totalEmails = getTotalEmails(); + if (CollectionUtils.isEmpty(totalEmails)) { + saveTotalSendFailMessage("閭欢鎺ユ敹浜轰负绌"); + return sendFailEmails; + } + + MailServerModel mailServer = globalConfigService.getMailServer(); + sendFailEmails = sendMail(mailServer.getMailUsername(), totalEmails, subject, content); + // All sent successfully + if (CollectionUtils.isEmpty(sendFailEmails)) { + return sendFailEmails; + } + // There are some invalid recipients, so you need to filter the invalid address and send it again + // (because if there is an invalid recipient address in the receiver list, the whole sending will fail) + totalEmails.removeAll(sendFailEmails); + if (CollectionUtils.isEmpty(totalEmails)) { + saveTotalSendFailMessage("涓嶅瓨鍦ㄦ湁鏁堢殑閭欢鎺ユ敹浜哄湴鍧"); + return sendFailEmails; + } + savePartSendFailMessage("閮ㄥ垎鎺ユ敹浜哄湴鍧鏃犳晥锛" + sendFailEmails); + // Send again + sendFailEmails = sendMail(mailServer.getMailUsername(), totalEmails, subject, content); + } catch (Exception e) { + saveTotalSendFailMessage("澶辫触鍘熷洜锛" + e.getMessage()); + LOG.error("Sending mail exception锛", e); + } + return sendFailEmails; + } + + + /** + * Send multiple emails + * + * @param from Sender + * @param to Recipient list + * @param subject subject + * @param content content + * @return If the sending fails, the list of failed recipient addresses will be returned + */ + public Set sendMail(String from, Set to, String subject, String content) throws Exception { + JavaMailSenderImpl javaMailSender = getMailSender(); + + MimeMessage mimeMessage = javaMailSender.createMimeMessage(); + MimeMessageHelper mineHelper = new MimeMessageHelper(mimeMessage, true); + mineHelper.setFrom(from); + mineHelper.setTo(to.toArray(new String[0])); + mineHelper.setSubject(subject); + mineHelper.setText(content, true); + + try { + javaMailSender.send(mimeMessage); + } catch (MailSendException e) { + LOG.error("The mail recipient has an invalid address锛", e); + // There is an illegal address in the recipient + return getInvalidAddress(e); + } catch (Exception e) { + LOG.error("Sending mail exception锛", e); + throw e; + } + + return new HashSet<>(16); + } + + + /** + * Get message sender + */ + private JavaMailSenderImpl getMailSender() throws Exception { + + MailServerModel mailServer = globalConfigService.getMailServer(); + if (mailServer == null) { + throw new Exception("閭欢鏈嶅姟鍣ㄦ湭璁剧疆"); + } + if (StringUtil.isEmpty(mailServer.getMailHost())) { + throw new Exception("閭欢鏈嶅姟鍣ㄥ湴鍧鏈缃"); + } + if (null == mailServer.getMailPort()) { + throw new Exception("閭欢鏈嶅姟鍣ㄧ鍙f湭璁剧疆"); + } + if (StringUtil.isEmpty(mailServer.getMailUsername())) { + throw new Exception("閭欢鐢ㄦ埛鍚嶆湭璁剧疆"); + } + if (StringUtil.isEmpty(mailServer.getMailPassword())) { + throw new Exception("閭欢瀵嗙爜鏈缃"); + } + JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl(); + javaMailSender.setHost(mailServer.getMailHost()); + javaMailSender.setPort(mailServer.getMailPort()); + javaMailSender.setDefaultEncoding(MAIL_DEFAULT_ENCODING); + javaMailSender.setUsername(mailServer.getMailUsername()); + javaMailSender.setPassword(mailServer.getMailPassword()); + javaMailSender.setProtocol(JavaMailSenderImpl.DEFAULT_PROTOCOL); + + Properties mailProperties = new Properties(); + mailProperties.setProperty("mail.smtp.auth", MAIL_SMTP_AUTH); + mailProperties.setProperty("mail.smtp.writetimeout", MAIL_SMTP_WRITE_TIMEOUT); + mailProperties.setProperty("mail.smtp.timeout", MAIL_SMTP_TIMEOUT); + mailProperties.setProperty("mail.smtp.connectiontimeout", MAIL_SMTP_CONNECTION_TIMEOUT); + javaMailSender.setJavaMailProperties(mailProperties); + + return javaMailSender; + } + + + /** + * Get all email addresses + */ + private Set getTotalEmails() { + Set totalEmails = new HashSet<>(16); + List accountMySqlModelList = accountService.queryAll(); + if (CollectionUtils.isNotEmpty(accountMySqlModelList)) { + for (AccountMySqlModel model : accountMySqlModelList) { + if (StringUtil.isNotEmpty(model.getEmail())) { + totalEmails.add(model.getEmail()); + } + } + } + return totalEmails; + } + + + /** + * Save sending failure information + */ + private void saveTotalSendFailMessage(String errorMsg) { + saveErrorMessage("Board锛氬鎵逛换鍔¢偖浠跺彂閫佸け璐", errorMsg); + } + + private void savePartSendFailMessage(String errorMsg) { + saveErrorMessage("Board锛氬鎵逛换鍔¢偖浠堕儴鍒嗗彂閫佸け璐", errorMsg); + } + + + private void saveErrorMessage(String title, String content) { + try { + MessageMysqlModel messageMysqlModel = new MessageMysqlModel(); + messageMysqlModel.setProducer(ProducerType.board); + messageMysqlModel.setLevel(MessageLevel.error); + messageMysqlModel.setTitle(title); + messageMysqlModel.setContent(content); + messageMysqlModel.setUnread(true); + messageService.add(messageMysqlModel); + } catch (Exception e) { + LOG.error("Save sending failure information Exception锛", e); + } + } + + + /** + * Get invalid recipient list + */ + private static Set getInvalidAddress(MailSendException e) { + Set failMails = new HashSet<>(); + for (Exception exception : e.getFailedMessages().values()) { + if (exception instanceof SendFailedException) { + for (Address address : ((SendFailedException) exception).getInvalidAddresses()) { + failMails.add(address.toString()); + } + } + } + return failMails; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/FeatureDataOutputInfoService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/FeatureDataOutputInfoService.java" new file mode 100644 index 0000000000000000000000000000000000000000..27b57a876a52e9a8045956b427e09ed317ad43a6 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/FeatureDataOutputInfoService.java" @@ -0,0 +1,78 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.database.entity.OutputModelMysqlModel; +import com.welab.wefe.board.service.database.entity.job.JobMySqlModel; +import com.welab.wefe.board.service.database.repository.JobRepository; +import com.welab.wefe.board.service.database.repository.OutputModelRepository; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.util.JObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + + +/** + * @author jacky.jiang + **/ +@Service +public class FeatureDataOutputInfoService extends AbstractService { + @Autowired + JobRepository featureJobRepo; + + @Autowired + JobMemberService jobMemberService; + + @Autowired + TaskService taskService; + + @Autowired + OutputModelRepository outputModelRepository; + + + /** + * Packaging results + */ + private JObject wrapModelResult(OutputModelMysqlModel outputModelMysqlModel) { + JObject resultObj = JObject.create(); + if (null != outputModelMysqlModel) { + resultObj.append("model_meta", JObject.create(outputModelMysqlModel.getModelMeta())) + .append("model_param", JObject.create(outputModelMysqlModel.getModelParam())); + } + return resultObj; + } + + /** + * Fuzzy matching of a task record based on task ID and name + * + * @param myRole my job member role + */ + public JobMySqlModel find(JobMemberRole myRole, String jobId) { + + // Find out the data first + Specification where = Where + .create() + .equal("jobId", jobId) + .equal("myRole", myRole) + .build(JobMySqlModel.class); + + JobMySqlModel featureJobMySqlModel = featureJobRepo.findOne(where).orElse(null); + return featureJobMySqlModel; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/FlowActionQueueService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/FlowActionQueueService.java" new file mode 100644 index 0000000000000000000000000000000000000000..9524da12b7048bfbb6e6a4def3dc7e310ed0d71a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/FlowActionQueueService.java" @@ -0,0 +1,62 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.database.entity.flow.FlowActionQueueMySqlModel; +import com.welab.wefe.board.service.database.entity.job.JobMySqlModel; +import com.welab.wefe.board.service.database.repository.FlowActionQueueRepository; +import com.welab.wefe.common.enums.FlowActionType; +import com.welab.wefe.common.enums.ProducerType; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author zane.luo + */ +@Service +public class FlowActionQueueService extends AbstractService { + + @Autowired + private FlowActionQueueRepository flowActionQueueRepository; + @Autowired + private JobService jobService; + + /** + * send a action message to flow service + */ + public void notifyFlow(AbstractApiInput input, String jobId, FlowActionType actionType) { + + for (JobMySqlModel job : jobService.listByJobId(jobId)) { + + FlowActionQueueMySqlModel action = new FlowActionQueueMySqlModel(); + action.setAction(actionType); + action.setProducer(input.fromGateway() ? ProducerType.gateway : ProducerType.board); + action.setPriority(0); + action.setParams( + JObject + .create() + .put("jobId", job.getJobId()) + .put("dstRole", job.getMyRole().name()) + .toStringWithNull() + ); + flowActionQueueRepository.save(action); + + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/FlowJobService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/FlowJobService.java" new file mode 100644 index 0000000000000000000000000000000000000000..15baf7c2b1f8de255237f2b7b3d3f6be8eb6cb7b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/FlowJobService.java" @@ -0,0 +1,168 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.api.project.job.QueryApi; +import com.welab.wefe.board.service.database.entity.job.JobMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectFlowMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.repository.JobRepository; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.job.JobListOutputModel; +import com.welab.wefe.board.service.dto.entity.job.JobOutputModel; +import com.welab.wefe.board.service.dto.vo.JobProgressOutput; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.JobStatus; +import com.welab.wefe.common.enums.TaskStatus; +import com.welab.wefe.common.util.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author seven.zeng + */ +@Service +public class FlowJobService extends AbstractService { + @Autowired + private JobRepository jobRepo; + @Autowired + private TaskService taskService; + @Autowired + private ProjectFlowService projectFlowService; + @Autowired + private ProjectService projectService; + @Autowired + private JobService jobService; + + /** + * Paging query flow execution history record + */ + public PagingOutput query(QueryApi.Input input) { + Specification where = Where + .create() + .equal("flowId", input.getFlowId()) + .equal("jobId", input.getJobId()) + .equal("status", input.getStatus()) + .contains("name", input.getName()) + .build(JobMySqlModel.class); + + return jobRepo.paging(where, input, JobListOutputModel.class); + } + + /** + * get job details + */ + public JobOutputModel detail(String flowId, String jobId, JobMemberRole role) { + + JobMySqlModel job; + + if (StringUtil.isEmpty(jobId)) { + + ProjectFlowMySqlModel flow = projectFlowService.findOne(flowId); + ProjectMySqlModel project = projectService.findByProjectId(flow.getProjectId()); + job = jobRepo.findLastByFlowId(flowId, project.getMyRole().name()); + + } else { + job = jobRepo.findByJobId(jobId, role.name()); + } + + if (job == null) { + return null; + } + + return ModelMapper.map(job, JobOutputModel.class); + } + + + /** + * get job execution progress + */ + public JobProgressOutput getProgress(String jobId, JobMemberRole role) { + + JobMySqlModel job = jobService.findByJobId(jobId, role); + + if (job == null) { + return null; + } + + List tasks = taskService.listByJobId(jobId, role); + + + TaskMySqlModel task; + if (tasks.isEmpty()) { + task = null; + } + // If the task has ended successfully, the progress is the last node. + else if (job.getStatus() == JobStatus.success) { + task = tasks.get(tasks.size() - 1); + } + // If the task has not started to run, there is no current execution node. + else if (job.getStatus() == JobStatus.wait_run) { + task = null; + } + // If the task is interrupted or is being executed + else { + + // Find the node being executed + task = tasks + .stream() + .filter(x -> x.getStatus() == TaskStatus.running) + .findFirst() + .orElse(null); + + // Looking for abnormally interrupted nodes + if (task == null) { + task = tasks + .stream() + .filter(x -> x.getStatus() == TaskStatus.error) + .findFirst() + .orElse(null); + } + // Look for manually interrupted nodes + if (task == null) { + task = tasks + .stream() + .filter(x -> x.getStatus() == TaskStatus.stop) + .findFirst() + .orElse(null); + } + + /** + * Look for nodes that have not started running + * + * In theory, this is a situation where the process is abnormally stuck and does not run down, + * because after the above conditions are eliminated, there should be no nodes to be executed. + */ + if (task == null) { + task = tasks + .stream() + .filter(x -> x.getStatus() == TaskStatus.wait_run) + .findFirst() + .orElse(null); + } + } + + return JobProgressOutput.success(CacheObjects.getMemberId(), job, task); + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/FlowTemplateService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/FlowTemplateService.java" new file mode 100644 index 0000000000000000000000000000000000000000..f744542315364a27e95c939be806ed732b202585 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/FlowTemplateService.java" @@ -0,0 +1,62 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.api.project.flow.SaveFlowTemplateApi.Input; +import com.welab.wefe.board.service.database.entity.flow.FlowTemplateMySqlModel; +import com.welab.wefe.board.service.database.repository.FlowTemplateRepository; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.web.CurrentAccount; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author winter.zou + */ +@Service +public class FlowTemplateService extends AbstractService { + + @Autowired + FlowTemplateRepository flowTemplateRepository; + + public FlowTemplateMySqlModel save(FlowTemplateMySqlModel entity) { + return flowTemplateRepository.save(entity); + } + + public List query() { + return flowTemplateRepository.findAll(); + } + + public FlowTemplateMySqlModel findById(String templateId) { + Specification where = Where.create().equal("id", templateId) + .build(FlowTemplateMySqlModel.class); + return flowTemplateRepository.findOne(where).orElse(null); + } + + public String addTemplate(Input input) { + FlowTemplateMySqlModel model = new FlowTemplateMySqlModel(); + model.setDescription(input.getDescription()); + model.setGraph(input.getGraph()); + model.setName(input.getName()); + model.setCreatedBy(CurrentAccount.id()); + flowTemplateRepository.save(model); + return model.getId(); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/GatewayService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/GatewayService.java" new file mode 100644 index 0000000000000000000000000000000000000000..07f69f6425cc5b1916730595546841a2c096e426 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/GatewayService.java" @@ -0,0 +1,346 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.api.project.project.AddApi; +import com.welab.wefe.board.service.database.entity.job.JobMemberMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectMemberMySqlModel; +import com.welab.wefe.board.service.database.repository.JobMemberRepository; +import com.welab.wefe.board.service.exception.MemberGatewayException; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.enums.GatewayActionType; +import com.welab.wefe.common.enums.GatewayProcessorType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.api.base.Api; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.yandex.clickhouse.util.apache.StringUtils; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author seven.zeng + */ +@Service +public class GatewayService extends BaseGatewayService { + + @Autowired + JobMemberRepository jobMemberRepo; + + @Autowired + MessageService messageService; + + @Autowired + private ProjectMemberService projectMemberService; + @Autowired + private JobMemberService jobMemberService; + @Autowired + private GlobalConfigService globalConfigService; + + /** + * Synchronize messages to all job participants + * + * @param jobId job id + * @param input Data to send + * @param api Send to target api + */ + public void syncToOtherJobMembers(String jobId, AbstractApiInput input, Class api) throws StatusCodeWithException { + + if (input.fromGateway()) { + return; + } + + List members = jobMemberService.findListByJobId(jobId); + + JobMemberMySqlModel me = members.stream().filter(x -> CacheObjects.getMemberId().equals(x.getMemberId())).findFirst().orElse(null); + // If I'm not in this project, don't send a broadcast + if (me == null) { + return; + } + + checkJobMemberList(members); + for (JobMemberMySqlModel member : members) { + // Skip self + if (CacheObjects.getMemberId().equals(member.getMemberId())) { + continue; + } + + sendToBoardRedirectApi(member.getMemberId(), me.getJobRole(), input, api); + + } + } + + + /** + * Synchronize messages to all members + */ + public void syncToOtherFormalProjectMembers(String projectId, AbstractApiInput input, Class api) throws StatusCodeWithException { + syncToOtherProjectMembers(projectId, input, api, true, false); + } + + /** + * Synchronize messages to all members who have not exited + */ + public void syncToNotExistedMembers(String projectId, AbstractApiInput input, Class api) throws StatusCodeWithException { + syncToOtherProjectMembers(projectId, input, api, false, false); + } + + /** + * Synchronize messages to all members (including informal members and exited members) + */ + public void syncToAllMembers(String projectId, AbstractApiInput input, Class api) throws StatusCodeWithException { + syncToOtherProjectMembers(projectId, input, api, false, true); + } + + /** + * Synchronize messages to all project members + * + * @param projectId project id + * @param input api input parameter + * @param api Send to target api + * @param excludeFormalMember Is exclude informal members? + * @param includeExistedMember Is include exited members? + */ + private void syncToOtherProjectMembers(String projectId, AbstractApiInput input, Class api, boolean excludeFormalMember, boolean includeExistedMember) throws StatusCodeWithException { + // If the request comes from the gateway, it is no longer broadcast. + if (input.fromGateway()) { + return; + } + + List members = findMembersByProjectId(projectId); + + ProjectMemberMySqlModel me = members.stream().filter(x -> CacheObjects.getMemberId().equals(x.getMemberId())).findFirst().orElse(null); + // If I'm not in this project, don't send a broadcast. + if (me == null) { + return; + } + + checkProjectMemberList(members); + for (ProjectMemberMySqlModel member : members) { + // Skip self + if (CacheObjects.getMemberId().equals(member.getMemberId())) { + continue; + } + + // Skip exited members + if (!includeExistedMember && member.isExited()) { + continue; + } + + // Skip members that have disagree the audit + if (excludeFormalMember) { + if (AuditStatus.disagree == member.getAuditStatus()) { + continue; + } + } + if (input instanceof AddApi.Input) { + ((AddApi.Input) input).setRole(member.getMemberRole()); + } + sendToBoardRedirectApi(member.getMemberId(), me.getMemberRole(), input, api); + + } + } + + + private void checkProjectMemberList(List members) throws StatusCodeWithException { + List ids = members.stream().map(x -> x.getMemberId()).collect(Collectors.toList()); + checkMemberList(ids); + } + + private void checkJobMemberList(List members) throws StatusCodeWithException { + List ids = members.stream().map(x -> x.getMemberId()).collect(Collectors.toList()); + checkMemberList(ids); + } + + /** + * check member list, if any member in blacklist, throw exception. + */ + private void checkMemberList(List ids) throws StatusCodeWithException { + List blacklistMembers = ids.stream().filter(x -> CacheObjects.getMemberBlackList().contains(x)).collect(Collectors.toList()); + if (!blacklistMembers.isEmpty()) { + String first = blacklistMembers.get(0); + StatusCode + .ILLEGAL_REQUEST + .throwException("鎴愬憳 " + CacheObjects.getMemberName(first) + + "锛" + first + + "锛夊湪鎴戞柟榛戝悕鍗曚腑锛屾棤娉曞悜鍏跺彂閫佹秷鎭紝濡傛湁蹇呰锛岃鍦ㄩ粦鍚嶅崟涓Щ闄よ鎴愬憳鍚庡啀杩涜鎿嶄綔銆" + ); + } + } + + /** + * Get the member list in the project and de duplicate it. + */ + private List findMembersByProjectId(String projectId) { + List members = projectMemberService.findListByProjectId(projectId); + + ProjectMemberMySqlModel promoter = members.stream() + .filter(x -> x.getMemberRole() == JobMemberRole.promoter && StringUtils.isBlank(x.getInviterId())) + .findFirst().orElse(null); + + // Since the initiator models with itself, the records of the initiator as a provider should be eliminated to + // avoid sending a message to the promoter multiple times + return members + .stream() + .filter(x -> !(x.getMemberRole() == JobMemberRole.provider && x.getMemberId().equals(promoter.getMemberId()))) + .collect(Collectors.toList()); + + } + + /** + * Notify the gateway to update the system configuration cache + */ + public void refreshSystemConfigCache() { + sendToMyselfGateway( + GatewayActionType.refresh_system_config_cache, + "refresh_system_config_cache", + GatewayProcessorType.refreshSystemConfigCacheProcessor + ); + } + + /** + * Notify the gateway to update the member blacklist cache + */ + public void refreshMemberBlacklistCache() { + sendToMyselfGateway( + GatewayActionType.refresh_system_config_cache, + "refresh_member_blacklist_cache", + GatewayProcessorType.refreshMemberBlacklistCacheProcessor + ); + } + + /** + * Notify the gateway to update the IP whitelist cache + */ + public void refreshIpWhiteListCache() { + sendToMyselfGateway( + GatewayActionType.refresh_system_config_cache, + "refresh_ip_white_list_cache", + GatewayProcessorType.refreshSystemConfigCacheProcessor + ); + } + + /** + * Call the board of other members + */ + public ApiResult callOtherMemberBoard(String dstMemberId, Class api, Object data) throws MemberGatewayException { + Api annotation = api.getAnnotation(Api.class); + return callOtherMemberBoard(dstMemberId, annotation.path(), + data instanceof JSONObject + ? (JSONObject) data + : JObject.create(data) + ); + } + + /** + * Call the board of other members + */ + public ApiResult callOtherMemberBoard(String dstMemberId, String api, JSONObject data) throws MemberGatewayException { + + String request = JObject.create() + .append("url", api) + .append("method", "POST") + .append("body", data) + .toStringWithNull(); + + ApiResult result = sendToOtherGateway(dstMemberId, GatewayActionType.http_job, request, GatewayProcessorType.boardHttpProcessor); + if (!result.success()) { + throw new MemberGatewayException(dstMemberId, result.getMessage()); + } + + return result; + } + + /** + * Send the request to the gateway/redirect interface in the board + */ + public ApiResult sendToBoardRedirectApi(String receiverMemberId, JobMemberRole senderRole, Object data, Class api) throws MemberGatewayException { + Api annotation = api.getAnnotation(Api.class); + + return callOtherMemberBoard(receiverMemberId, "gateway/redirect", + JObject + .create() + .put("api", annotation.path()) + .put("data", data) + .put("caller_member_id", CacheObjects.getMemberId()) + .put("caller_member_name", CacheObjects.getMemberName()) + .put("caller_member_role", senderRole.name()) + ); + + } + + + /** + * Check the connectivity of the gateway + * + * @param gatewayUri Gateway IP: prot address. If the value is not empty, it means to directly test its own gateway connectivity + */ + public void checkMemberRouteConnect(String gatewayUri) throws StatusCodeWithException { + + if (StringUtil.isEmpty(gatewayUri)) { + gatewayUri = globalConfigService.getGatewayConfig().intranetBaseUri; + } + + // Create request entity message + String data = JObject.create() + .append("url", "gateway/redirect") + .append("method", "POST") + .append( + "body", + JObject + .create() + .append("api", "gateway/test_route_connect") + .append("data", JObject.create()) + .toString() + ) + .toStringWithNull(); + + ApiResult result = sendToMyselfGateway(gatewayUri, GatewayActionType.http_job, data, GatewayProcessorType.boardHttpProcessor); + if (!result.success()) { + throw new MemberGatewayException(CacheObjects.getMemberId(), result.getMessage()); + } + + } + + /** + * Check the alive of the gateway + * + * @param gatewayUri Gateway IP: prot address. If the value is not empty, it means to directly test its own gateway alive + */ + public void pingGatewayAlive(String gatewayUri) throws StatusCodeWithException { + + if (StringUtil.isEmpty(gatewayUri)) { + gatewayUri = globalConfigService.getGatewayConfig().intranetBaseUri; + } + + ApiResult result = sendToMyselfGateway(gatewayUri, GatewayActionType.not_null, JObject.create().toString(), GatewayProcessorType.gatewayAliveProcessor); + if (!result.success()) { + throw new MemberGatewayException(CacheObjects.getMemberId(), result.getMessage()); + } + } + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/JobMemberService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/JobMemberService.java" new file mode 100644 index 0000000000000000000000000000000000000000..8190f023d2b8c666beffc9b2a04a3ebad5b02477 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/JobMemberService.java" @@ -0,0 +1,108 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.alibaba.fastjson.JSONArray; +import com.welab.wefe.board.service.database.entity.job.JobMemberMySqlModel; +import com.welab.wefe.board.service.database.repository.JobMemberRepository; +import com.welab.wefe.board.service.dto.entity.job.JobMemberOutputModel; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.JobMemberRole; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author Zane + */ +@Service +public class JobMemberService extends AbstractService { + + @Autowired + JobMemberRepository repo; + + /** + * Get the list of participating members of the job + */ + public List list(String jobId) { + return list(jobId, true); + } + + /** + * Get the list of participating members of the job + */ + public List list(String jobId, boolean includeArbiter) { + Where where = Where + .create() + .equal("jobId", jobId); + + if (!includeArbiter) { + where.notEqual("jobRole", JobMemberRole.arbiter); + } + + return repo + .findAll(where.build(JobMemberMySqlModel.class), Sort.by("jobRole")) + .parallelStream() + .map(x -> ModelMapper.map(x, JobMemberOutputModel.class)) + .collect(Collectors.toList()); + } + + public JobMemberMySqlModel findIdByMemberInfo(String jobId, JobMemberRole myRole, String memberId) { + List query = repo.query("select t.id from job_member t left join job j on t.business_id = j.id and t.business_type = 'Job' where j.job_id = '" + jobId + "' and t.job_role = '" + myRole + "' and t.member_id = '" + memberId + "' limit 1"); + if (query != null && !query.isEmpty()) { + String s = JSONArray.toJSONString(query); + JSONArray objects = JSONArray.parseArray(s); + if (objects != null && objects.size() == 1) { + return repo.findById(objects.get(0).toString()).orElse(null); + } + } + return null; + } + + /** + * Query JobMember based on the combination of conditions + */ + public JobMemberMySqlModel findOneByJobRole(String businessId, JobMemberRole jobRole, String memberId) { + Where where = Where + .create() + .equal("businessId", businessId) + .equal("jobRole", jobRole) + .equal("memberId", memberId); + + Specification jobMemberWhere = where.build(JobMemberMySqlModel.class); + + return repo.findOne(jobMemberWhere).orElse(null); + } + + /** + * query JobMember list by job_id + */ + public List findListByJobId(String jobId) { + Where where = Where + .create() + .equal("jobId", jobId); + + Specification jobMemberWhere = where.build(JobMemberMySqlModel.class); + + return repo.findAll(jobMemberWhere); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/JobService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/JobService.java" new file mode 100644 index 0000000000000000000000000000000000000000..ada70839ffa6f5ea99fb69492a8a46afc4c8922d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/JobService.java" @@ -0,0 +1,265 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.api.project.job.UpdateJobStatusApi; +import com.welab.wefe.board.service.database.entity.job.JobMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectFlowMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.repository.DataSetRepository; +import com.welab.wefe.board.service.database.repository.JobMemberRepository; +import com.welab.wefe.board.service.database.repository.JobRepository; +import com.welab.wefe.board.service.database.repository.TaskRepository; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.sdk.UnionService; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.JobStatus; +import com.welab.wefe.common.enums.TaskStatus; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.CurrentAccount; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author seven.zeng + */ +@Service +public class JobService extends AbstractService { + @Autowired + JobRepository jobRepo; + @Autowired + TaskRepository taskRepo; + @Autowired + JobMemberRepository jobMemberRepo; + @Autowired + DataSetRepository dataSetRepository; + @Autowired + UnionService unionService; + @Autowired + JobMemberService jobMemberService; + @Autowired + private ProjectFlowService projectFlowService; + @Autowired + private ProjectFlowNodeService projectFlowNodeService; + @Autowired + private ProjectService projectService; + + public void updateJob(JobMySqlModel model, Function func) { + + if (model == null) { + return; + } + + JobStatus oldStatus = model.getStatus(); + + model = func.apply(model); + model.setUpdatedBy(CurrentAccount.id()); + if (model.getStatus() != oldStatus) { + model.setStatusUpdatedTime(new Date()); + } + + jobRepo.save(model); + } + + /** + * Get the job under the specified role with the specified jobId + *

+ * Note: Due to the existence of arbiter, on the promoter side, one jobId can find two jobs. + */ + public JobMySqlModel findByJobId(String jobId, JobMemberRole role) { + Specification where = Where + .create() + .equal("jobId", jobId) + .equal("myRole", role) + .build(JobMySqlModel.class); + + return jobRepo.findOne(where).orElse(null); + } + + /** + * query jobs by job_id + *

+ * Note: Due to the existence of arbiter, + * as well as the existence of itself and its own modeling scene, multiple pieces of data will be found here. + */ + public List listByJobId(String jobId) { + Specification where = Where + .create() + .equal("jobId", jobId) + .build(JobMySqlModel.class); + + return jobRepo.findAll(where); + } + + + /** + * create FlowGraph instance + */ + public FlowGraph createFlowGraph(String flowId) throws StatusCodeWithException { + ProjectFlowMySqlModel flow = projectFlowService.findOne(flowId); + ProjectMySqlModel project = projectService.findByProjectId(flow.getProjectId()); + + JobMySqlModel lastJob = jobRepo.findLastByFlowId(flow.getFlowId(), project.getMyRole().name()); + return new FlowGraph(flow.getFederatedLearningType(), lastJob, projectFlowNodeService.findNodesByFlowId(flowId)); + } + + @Autowired + private TaskService taskService; + + /** + * Set the HasCacheResult of each node in the graph + * + * @param useCache Whether to use the execution result of the last task as a cache + */ + public void setGraphHasCacheResult(FlowGraph graph, boolean useCache) throws StatusCodeWithException { + + // If the cache is not used, or if the cache does not exist, + // the task needs to be run from beginning to end. + if (!useCache || graph.getLastJob() == null) { + + // Mark that all nodes have no cache available + graph + .getAllJobSteps() + .stream() + .forEach(x -> x.setHasCacheResult(false)); + + return; + } + + // Check the availability of each node's cache + checkCacheEnableStatus(graph, graph.getLastJob()); + + + // Set all child nodes of the node without cache to be available without cache + while (graph.getLastJob().getMyRole() != JobMemberRole.arbiter) { + List before = graph + .getAllJobSteps() + .stream() + .filter(x -> !x.getHasCacheResult()) + .collect(Collectors.toList()); + + // Set all child nodes of the node without cache to be available without cache + before.forEach(x -> x.getChildren().forEach(y -> y.setHasCacheResult(false))); + + // Count the number of non-cached nodes after marking + long afterCount = graph + .getAllJobSteps() + .stream() + .filter(x -> !x.getHasCacheResult()) + .count(); + + // If the caching of more nodes is not disabled, the traversal is over + if (before.size() == afterCount) { + break; + } + } + } + + /** + * Check the availability of each node's cache + *

+ * 1. If the node has been edited after the task is created, the cache is not available. + * 2. The status of the corresponding task of the node is not success is unavailable + */ + private void checkCacheEnableStatus(FlowGraph graph, JobMySqlModel lastJob) throws StatusCodeWithException { + + // Based on the time when the task was created, + // nodes that have been edited after this time cannot use the cache. + long lastJobCreateTime = lastJob.getCreatedTime().getTime(); + + // Temporarily mark all nodes as cache available + graph.getAllJobSteps().forEach(x -> x.setHasCacheResult(true)); + + // Find the nodes whose version number is greater than the base time. + // These nodes have been edited after the task is created, and the cache cannot be used. + graph + .getAllJobSteps() + .stream() + .filter(x -> x.getParamsVersion() >= lastJobCreateTime) + .forEach(x -> x.setHasCacheResult(false)); + + List nodes = graph.getAllJobSteps(); + Collections.sort(nodes, new Comparator() { + @Override + public int compare(FlowGraphNode o1, FlowGraphNode o2) { + return o1.getDeep() - o2.getDeep(); + } + }); + boolean clearCacheResultAfter = false; + for (FlowGraphNode node : nodes) { + if (node.getParamsVersion() >= lastJobCreateTime) { + node.setHasCacheResult(false); + clearCacheResultAfter = true; + } + if (clearCacheResultAfter) { + node.setHasCacheResult(false); + } + } + + // Check whether the cache of the task corresponding to the node is available. + // If the task status is incorrect, the cache is not available. + // A node may correspond to multiple tasks + List taskMysqlList = taskService.listByJobId(lastJob.getJobId(), lastJob.getMyRole()); + Map> taskMap = new HashMap<>(); + for (TaskMySqlModel model : taskMysqlList) { + List taskList = taskMap.get(model.getFlowNodeId()); + if (taskList == null) { + taskList = new ArrayList<>(); + } + taskList.add(model); + taskMap.put(model.getFlowNodeId(), taskList); + } + + graph.getAllJobSteps().stream().filter(x -> x.getHasCacheResult()).filter(x -> { + List taskList = taskMap.get(x.getNodeId()); + if (taskList == null) { + return true; + } else { + for (TaskMySqlModel m : taskList) { + if (m.getStatus() != TaskStatus.success) { + return true; + } + } + } + return false; + }).forEach(x -> x.setHasCacheResult(false)); + } + + /** + * update job status + */ + public void updateJobStatus(UpdateJobStatusApi.Input input) { + JobMySqlModel job = jobRepo.findById(input.getId()).orElse(null); + + if (job != null) { + updateJob(job, x -> { + x.setStatus(input.getJobStatus()); + x.setMessage(input.getMessage()); + return x; + }); + } + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/MemberChatService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/MemberChatService.java" new file mode 100644 index 0000000000000000000000000000000000000000..b689f1809328b8f1418171cbce363cfe8c043f75 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/MemberChatService.java" @@ -0,0 +1,408 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.api.chat.QueryChatDetailApi; +import com.welab.wefe.board.service.api.chat.UpdateToReadApi; +import com.welab.wefe.board.service.constant.ChatConstant; +import com.welab.wefe.board.service.database.entity.chat.ChatLastAccountMysqlModel; +import com.welab.wefe.board.service.database.entity.chat.MemberChatMySqlModel; +import com.welab.wefe.board.service.database.entity.chat.MessageQueueMySqlModel; +import com.welab.wefe.board.service.database.repository.*; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.MemberChatOutputModel; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.GatewayActionType; +import com.welab.wefe.common.enums.GatewayProcessorType; +import com.welab.wefe.common.enums.OrderBy; +import com.welab.wefe.common.enums.ProducerType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.CurrentAccount; +import com.welab.wefe.common.web.dto.ApiResult; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.criteria.Predicate; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +/** + * Member chat service + * + * @author Johnny.lin + */ +@Service +public class MemberChatService extends AbstractService { + + @Autowired + MemberChatRepository memberChatRepository; + + @Autowired + MessageRepository messageRepository; + + @Autowired + GatewayService gatewayService; + + @Autowired + ChatUnreadMessageRepository chatUnreadMessageRepository; + + @Autowired + MessageQueueRepository messageQueueRepository; + + @Autowired + private ChatLastAccountService chatLastAccountService; + + @Autowired + private ChatUnreadMessageService chatUnreadMessageService; + + + /** + * Send the message to the target gateway through its own gateway + * + * @param fromAccountId Sender account id + * @param fromAccountName Sender account name + * @param toMemberId Receiver member id + * @param toAccountId Receiver account id + * @param content message content + */ + @Transactional(rollbackFor = Exception.class) + public JObject sendMessage(String fromAccountId, String fromAccountName, String toMemberId, String toAccountId, String toMemberName, String toAccountName, String content) throws StatusCodeWithException { + JObject ret = JObject.create().append(ChatConstant.KEY_CODE, StatusCode.SUCCESS.getCode()); + + + String fromMemberId = CacheObjects.getMemberId(); + + // Add a recent chat account record + ChatLastAccountMysqlModel model = new ChatLastAccountMysqlModel(); + model.setAccountId(fromAccountId); + model.setMemberId(CacheObjects.getMemberId()); + model.setAccountName(fromAccountName); + model.setMemberName(CacheObjects.getMemberName()); + model.setLiaisonAccountId(toAccountId); + model.setLiaisonMemberId(toMemberId); + model.setLiaisonAccountName(toAccountName); + model.setLiaisonMemberName(toMemberName); + model.setUpdatedTime(new Date()); + chatLastAccountService.add(model); + + + // wrap message + String messageId = generateMessageId(); + String data = JObject.create(ChatConstant.KEY_FROM_MEMBER_ID, fromMemberId) + .append(ChatConstant.KEY_FROM_MEMBER_NAME, CacheObjects.getMemberName()) + .append(ChatConstant.KEY_FROM_ACCOUNT_ID, fromAccountId) + .append(ChatConstant.KEY_FROM_ACCOUNT_NAME, fromAccountName) + .append(ChatConstant.KEY_TO_MEMBER_ID, toMemberId) + .append(ChatConstant.KEY_TO_ACCOUNT_ID, toAccountId) + .append(ChatConstant.KEY_TO_MEMBER_NAME, toMemberName) + .append(ChatConstant.KEY_TO_ACCOUNT_NAME, toAccountName) + .append(ChatConstant.KEY_MESSAGE_ID, messageId) + .append(ChatConstant.KEY_CONTENT, content) + .append(ChatConstant.KEY_CREATED_TIME, System.currentTimeMillis()) + .toString(); + + + // Push the message to the destination member through the gateway + ApiResult result = gatewayService.sendToOtherGateway(toMemberId, GatewayActionType.create_chat_msg, data, GatewayProcessorType.dbChatTableProcessor); + + Date createdTime = new Date(); + // Message detail object + MemberChatMySqlModel memberChatModel = new MemberChatMySqlModel(); + memberChatModel.setFromAccountId(fromAccountId); + memberChatModel.setFromAccountName(fromAccountName); + memberChatModel.setFromMemberId(fromMemberId); + memberChatModel.setFromMemberName(CacheObjects.getMemberName()); + memberChatModel.setToMemberId(toMemberId); + memberChatModel.setToMemberName(toMemberName); + memberChatModel.setToAccountId(toAccountId); + memberChatModel.setToAccountName(toAccountName); + memberChatModel.setContent(content); + memberChatModel.setStatus(ChatConstant.MESSAGE_STATUS_SEND_SUCCESS); + memberChatModel.setDirection(ChatConstant.MESSAGE_DIRECTION_SEND); + memberChatModel.setCreatedTime(createdTime); + memberChatModel.setUpdatedTime(createdTime); + memberChatModel.setMessageId(messageId); + + // Message sending failed + if (!result.success()) { + memberChatModel.setStatus(ChatConstant.MESSAGE_STATUS_SEND_FAIL); + ret.append(ChatConstant.KEY_CODE, StatusCode.SYSTEM_ERROR.getCode()) + .append(ChatConstant.KEY_MESSAGE, result.getMessage()); + } + ret.append(ChatConstant.KEY_MEMBER_CHAT_ID, memberChatModel.getId()); + + // Save message details + memberChatRepository.save(memberChatModel); + + return ret; + } + + + /** + * send message + */ + @Transactional(rollbackFor = Exception.class) + public JObject sendMessage(String toMemberId, String toMemberName, String toAccountId, String toAccountName, + String content) throws StatusCodeWithException { + + CurrentAccount.Info info = CurrentAccount.get(); + if (null == info) { + throw new StatusCodeWithException("璇风櫥褰曞悗璁块棶", StatusCode.LOGIN_REQUIRED); + } + String fromAccountId = info.id; + String fromAccountName = CacheObjects.getAccountMap().get(fromAccountId); + return sendMessage(fromAccountId, fromAccountName, toMemberId, toAccountId, toMemberName, toAccountName, content); + } + + /** + * Failed message resend + * + * @param memberChatId Message primary key ID of back-end database + */ + public void resendMessage(String memberChatId) throws StatusCodeWithException { + MemberChatMySqlModel model = memberChatRepository.findById(memberChatId).orElse(null); + if (null == model) { + throw new StatusCodeWithException("璇ユ秷鎭棤鏁", StatusCode.DATA_NOT_FOUND); + } + if (null == model.getStatus() || ChatConstant.MESSAGE_STATUS_SEND_FAIL != model.getStatus()) { + throw new StatusCodeWithException("璇ユ秷鎭负闈炲彂閫佸け璐ョ姸鎬侊紝绂佹閲嶅彂", StatusCode.ILLEGAL_REQUEST); + } + // splicing messages + String data = JObject.create(ChatConstant.KEY_FROM_MEMBER_ID, model.getFromMemberId()) + .append(ChatConstant.KEY_FROM_MEMBER_NAME, model.getFromMemberName()) + .append(ChatConstant.KEY_FROM_ACCOUNT_ID, model.getFromAccountId()) + .append(ChatConstant.KEY_FROM_ACCOUNT_NAME, model.getFromAccountName()) + .append(ChatConstant.KEY_TO_MEMBER_ID, model.getToMemberId()) + .append(ChatConstant.KEY_TO_ACCOUNT_ID, model.getToAccountId()) + .append(ChatConstant.KEY_TO_MEMBER_NAME, model.getToMemberName()) + .append(ChatConstant.KEY_TO_ACCOUNT_NAME, model.getToAccountName()) + .append(ChatConstant.KEY_MESSAGE_ID, model.getMessageId()) + .append(ChatConstant.KEY_CONTENT, model.getContent()) + .append(ChatConstant.KEY_CREATED_TIME, System.currentTimeMillis()) + .toString(); + + // Push the message to the destination member through the gateway + ApiResult result = gatewayService.sendToOtherGateway(model.getToMemberId(), GatewayActionType.create_chat_msg, data, GatewayProcessorType.dbChatTableProcessor); + // Message sending failed + if (!result.success()) { + throw new StatusCodeWithException(result.getMessage(), StatusCode.RPC_ERROR); + } + // Update message status is successful + memberChatRepository.updateById(model.getId(), "status", ChatConstant.MESSAGE_STATUS_SEND_SUCCESS, MemberChatMySqlModel.class, false); + } + + /** + * Query chat details + * + *

+ * Note: the page turning of this interface is special: the value of the created_time field passed in from the front end will change, + * so only the first page will be returned + *

+ */ + public PagingOutput queryChatDetail(QueryChatDetailApi.Input input) { + String fromAccountId = input.getFromAccountId(); + String toAccountId = input.getToAccountId(); + Specification where = (root, query, cb) -> { + List list = new ArrayList<>(); + Predicate predicate1 = cb.equal(root.get(ChatConstant.KEY_FROM_ACCOUNT_ID), fromAccountId); + Predicate predicate2 = cb.equal(root.get(ChatConstant.KEY_TO_ACCOUNT_ID), toAccountId); + Predicate predicate3 = cb.equal(root.get(ChatConstant.KEY_DIRECTION), 1); + list.add(predicate1); + list.add(predicate2); + list.add(predicate3); + Predicate predicateAnd1 = cb.and(list.toArray(new Predicate[list.size()])); + + List list2 = new ArrayList<>(); + Predicate predicate11 = cb.equal(root.get(ChatConstant.KEY_FROM_ACCOUNT_ID), toAccountId); + Predicate predicate22 = cb.equal(root.get(ChatConstant.KEY_TO_ACCOUNT_ID), fromAccountId); + Predicate predicate33 = cb.equal(root.get(ChatConstant.KEY_DIRECTION), 0); + list2.add(predicate11); + list2.add(predicate22); + list2.add(predicate33); + Predicate predicateAnd2 = cb.and(list2.toArray(new Predicate[list2.size()])); + + Predicate predicateOr = cb.or(predicateAnd1, predicateAnd2); + + Long limitCreateTime = input.getLimitCreateTime(); + if (null != limitCreateTime && limitCreateTime > 0) { + Predicate predicate00 = cb.lessThan(root.get("createdTime"), new Date(limitCreateTime)); + predicateOr = cb.and(predicate00, predicateOr); + } + return predicateOr; + }; + + // Return to page 1 only + Pageable pageable = PageRequest + .of( + 0, + input.getPageSize(), + Sort.by(Sort.Direction.DESC, "createdTime") + ); + + Page page = memberChatRepository.findAll(where, pageable); + + LOG.info("result: " + JObject.toJSONString(page)); + LOG.info("page.getContent(): " + JObject.toJSONString(page.getContent())); + + List models = page.getContent() + .stream() + .map(x -> ModelMapper.map(x, MemberChatMySqlModel.class)) + .collect(Collectors.toList()); + + // Wrap the returned chat content + List outputsList = new ArrayList<>(); + MemberChatOutputModel outputModel = null; + for (MemberChatMySqlModel memberChat : models) { + outputModel = new MemberChatOutputModel(); + outputModel.setId(memberChat.getId()); + outputModel.setFromAccountId(memberChat.getFromAccountId()); + outputModel.setFromMemberId(memberChat.getFromMemberId()); + outputModel.setToAccountId(memberChat.getToAccountId()); + outputModel.setToMemberId(memberChat.getToMemberId()); + outputModel.setContent(memberChat.getContent()); + outputModel.setStatus(memberChat.getStatus()); + outputModel.setCreatedTime(memberChat.getCreatedTime()); + + outputsList.add(outputModel); + } + + return PagingOutput.of( + page.getTotalElements(), + outputsList, + MemberChatOutputModel.class + ); + } + + /** + * Get an unhandled message + */ + public MessageQueueMySqlModel getOneMessage() { + Specification queryCondtion = Where + .create() + .equal("producer", ProducerType.gateway) + .equal("action", GatewayActionType.create_chat_msg) + .orderBy("createdTime", OrderBy.asc) + .build(MessageQueueMySqlModel.class); + + Page list = messageQueueRepository.findAll(queryCondtion, PageRequest.of(0, 1)); + if (list == null || CollectionUtils.isEmpty(list.getContent())) { + return null; + } + + return list.getContent().get(0); + } + + /** + * Process received messages + */ + @Transactional(rollbackFor = Exception.class) + public void handleChatMessage(MessageQueueMySqlModel message) { + if (!StringUtil.isEmpty(message.getParams())) { + JObject jObject = JObject.create(message.getParams()); + String fromMemberId = jObject.getString(ChatConstant.KEY_FROM_MEMBER_ID); + String fromMemberName = jObject.getString(ChatConstant.KEY_FROM_MEMBER_NAME); + String fromAccountId = jObject.getString(ChatConstant.KEY_FROM_ACCOUNT_ID); + String fromAccountName = jObject.getString(ChatConstant.KEY_FROM_ACCOUNT_NAME); + String toMemberId = jObject.getString(ChatConstant.KEY_TO_MEMBER_ID); + String toMemberName = jObject.getString(ChatConstant.KEY_TO_MEMBER_NAME); + String toAccountId = jObject.getString(ChatConstant.KEY_TO_ACCOUNT_ID); + String toAccountName = jObject.getString(ChatConstant.KEY_TO_ACCOUNT_NAME); + String content = jObject.getString(ChatConstant.KEY_CONTENT); + String createdTimeStr = jObject.getString(ChatConstant.KEY_CREATED_TIME); + String messageId = jObject.getString(ChatConstant.KEY_MESSAGE_ID); + + Date createdTime = new Date(Long.parseLong(createdTimeStr)); + + /************ 1.Chat details ************/ + MemberChatMySqlModel memberChatModel = new MemberChatMySqlModel(); + memberChatModel.setFromAccountId(fromAccountId); + memberChatModel.setFromAccountName(fromAccountName); + memberChatModel.setFromMemberId(fromMemberId); + memberChatModel.setFromMemberName(fromMemberName); + memberChatModel.setToMemberId(toMemberId); + memberChatModel.setToMemberName(toMemberName); + memberChatModel.setToAccountId(toAccountId); + memberChatModel.setToAccountName(toAccountName); + memberChatModel.setContent(content); + memberChatModel.setDirection(ChatConstant.MESSAGE_DIRECTION_RECV); + memberChatModel.setStatus(ChatConstant.MESSAGE_STATUS_RECV_READ); + memberChatModel.setCreatedTime(createdTime); + memberChatModel.setUpdatedTime(new Date()); + memberChatModel.setMessageId(messageId); + + + /************** 2.Push to specified user**************/ + if (!WebSocketServer.sendToOnline(toAccountId, JObject.create(JObject.toJSON(memberChatModel)))) { + memberChatModel.setStatus(ChatConstant.MESSAGE_STATUS_RECV_UNREAD); + // If push fails, save the message as unread + chatUnreadMessageService.addChatUnreadMessage(memberChatModel); + } + + // Save details + memberChatRepository.save(memberChatModel); + + /************ 3.Delete the processed message from the queue ************/ + messageQueueRepository.delete(message); + + // Add a recent chat account record + ChatLastAccountMysqlModel model = new ChatLastAccountMysqlModel(); + model.setAccountId(toAccountId); + model.setMemberId(toMemberId); + model.setAccountName(toAccountName); + model.setMemberName(toMemberName); + model.setLiaisonAccountId(fromAccountId); + model.setLiaisonMemberId(fromMemberId); + model.setLiaisonAccountName(fromAccountName); + model.setLiaisonMemberName(fromMemberName); + model.setUpdatedTime(new Date()); + chatLastAccountService.add(model); + } + } + + /** + * Update message status is read + */ + @Transactional(rollbackFor = Exception.class) + public void messageUpdateToRead(UpdateToReadApi.Input input) { + int deleteCount = chatUnreadMessageService.delete(input.getToAccountId(), input.getFromAccountId()); + if (deleteCount > 0) { + memberChatRepository.updateMessageStatus(input.getToAccountId(), input.getFromAccountId(), ChatConstant.MESSAGE_STATUS_RECV_UNREAD, ChatConstant.MESSAGE_STATUS_RECV_READ); + } + } + + + /** + * Generate message ID + */ + private String generateMessageId() { + return UUID.randomUUID().toString().replaceAll("-", ""); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/MessageService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/MessageService.java" new file mode 100644 index 0000000000000000000000000000000000000000..4b6e2dd05e24f04a03f06a5655ea5771de023440 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/MessageService.java" @@ -0,0 +1,57 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + + +import com.welab.wefe.board.service.api.message.QueryApi; +import com.welab.wefe.board.service.database.entity.MessageMysqlModel; +import com.welab.wefe.board.service.database.repository.MessageRepository; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.MessageOutputModel; +import com.welab.wefe.common.data.mysql.Where; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +/** + * @author Zane + */ +@Service +public class MessageService extends AbstractService { + + @Autowired + MessageRepository repo; + + public PagingOutput query(QueryApi.Input input) { + + Specification where = Where + .create() + .equal("level", input.getLevel()) + .equal("unread", input.getUnread()) + .build(MessageMysqlModel.class); + + return repo.paging(where, input, MessageOutputModel.class); + } + + public void read(String id) { + repo.updateById(id, "unread", false, MessageMysqlModel.class); + } + + public void add(MessageMysqlModel model) { + repo.save(model); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ModelOotRecordService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ModelOotRecordService.java" new file mode 100644 index 0000000000000000000000000000000000000000..17a25a93bcd00632ca34f673f04618fd6be2a27e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ModelOotRecordService.java" @@ -0,0 +1,64 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.database.entity.job.ModelOotRecordMysqlModel; +import com.welab.wefe.board.service.database.repository.ModelOotRecordRepository; +import com.welab.wefe.common.data.mysql.Where; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +/** + * @author aaron.li + **/ +@Service +public class ModelOotRecordService { + + @Autowired + private ModelOotRecordRepository modelOotRecordRepository; + + public void save(ModelOotRecordMysqlModel modelOotRecordMysqlModel) { + modelOotRecordRepository.save(modelOotRecordMysqlModel); + } + + /** + * Query model scoring and verification records according to process ID + * + * @param flowId flow id + * @return Model scoring verification record + */ + public ModelOotRecordMysqlModel findByFlowId(String flowId) { + Specification where = Where + .create() + .equal("flowId", flowId) + .build(ModelOotRecordMysqlModel.class); + return modelOotRecordRepository.findOne(where).orElse(null); + } + + /** + * Query model scoring and verification records according to job ID and node ID + */ + public ModelOotRecordMysqlModel findByJobIdAndModelFlowNodeId(String jobId, String nodeId) { + Specification where = Where + .create() + .equal("ootJobId", jobId) + .equal("ootModelFlowNodeId", nodeId) + .build(ModelOotRecordMysqlModel.class); + return modelOotRecordRepository.findOne(where).orElse(null); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/OperationLogService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/OperationLogService.java" new file mode 100644 index 0000000000000000000000000000000000000000..230f6231048685985e5a0859a1133cef8b69cd8c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/OperationLogService.java" @@ -0,0 +1,57 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.api.operation.QueryApi; +import com.welab.wefe.board.service.database.entity.OperationLogMysqlModel; +import com.welab.wefe.board.service.database.repository.OperationLogRepository; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.OperationLogOutputModel; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.OrderBy; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.CurrentAccount; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +/** + * @author eval + **/ +@Service +public class OperationLogService extends AbstractService { + + @Autowired + OperationLogRepository mOperationLogRepository; + + public PagingOutput query(QueryApi.Input input) throws StatusCodeWithException { + if (!CurrentAccount.isAdmin()) { + StatusCode.PERMISSION_DENIED.throwException("鏅氱敤鎴锋棤娉曡繘琛屾鎿嶄綔銆"); + } + + Specification where = Where + .create() + .equal("operatorPhone", input.getOperatorPhone()) + .equal("logAction", input.getAction()) + .betweenAndDate("createdTime", input.getStartTime(), input.getEndTime()) + .orderBy("createdTime", OrderBy.desc) + .build(OperationLogMysqlModel.class); + + return mOperationLogRepository.paging(where, input, OperationLogOutputModel.class); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectDataSetAuditService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectDataSetAuditService.java" new file mode 100644 index 0000000000000000000000000000000000000000..c26dc31cb9cee971f49c94ec94620b2d565a7f02 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectDataSetAuditService.java" @@ -0,0 +1,97 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.welab.wefe.board.service.api.project.dataset.AuditDataSetApi; +import com.welab.wefe.board.service.api.project.dataset.AuditDataSetApi.Input; +import com.welab.wefe.board.service.database.entity.job.ProjectDataSetMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectMySqlModel; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.exception.StatusCodeWithException; + +/** + * @author zane.luo + */ +@Service +public class ProjectDataSetAuditService extends AbstractService { + + @Autowired + ProjectService projectService; + + @Autowired + ProjectMemberService projectMemberService; + + @Autowired + ProjectDataSetService projectDataSetService; + + + /** + * audit data set + */ + @Transactional(rollbackFor = Exception.class) + public synchronized void auditDataSet(Input input) throws StatusCodeWithException { + + ProjectMySqlModel project = projectService.findByProjectId(input.getProjectId()); + if (project == null) { + throw new StatusCodeWithException("鏈壘鍒扮浉搴旂殑椤圭洰锛", StatusCode.ILLEGAL_REQUEST); + } + + if (!input.fromGateway()) { + if (project.getAuditStatus() != AuditStatus.agree || project.isExited()) { + throw new StatusCodeWithException("璇峰湪鎴愪负璇ラ」鐩殑姝e紡鎴愬憳鍚庡啀杩涜鐩稿叧鎿嶄綔", StatusCode.ILLEGAL_REQUEST); + } + } + + List dataSets = projectDataSetService.findAll(input.getProjectId(), + input.getDataSetId()); + if (dataSets == null || dataSets.isEmpty()) { + return; + } + ProjectDataSetMySqlModel dataSet = dataSets.stream().filter(d -> d.getAuditStatus() == AuditStatus.auditing) + .findFirst().orElse(null); + + if (dataSet == null || dataSet.getAuditStatus() != AuditStatus.auditing) { + throw new StatusCodeWithException("璇峰嬁閲嶅瀹℃牳锛", StatusCode.ILLEGAL_REQUEST); + } + + if (!input.fromGateway()) { + if (!CacheObjects.getMemberId().equals(dataSet.getMemberId())) { + throw new StatusCodeWithException("浣犱笉鑳藉鏍稿埆浜虹殑鏁版嵁闆", StatusCode.ILLEGAL_REQUEST); + } + } + + projectDataSetService.update(dataSet, (x) -> x.setAuditStatus(input.getAuditStatus())); + + // Update the number of data sets used in the project + dataSetService.updateUsageCountInProject(dataSet.getDataSetId()); + + + gatewayService.syncToNotExistedMembers(input.getProjectId(), input, AuditDataSetApi.class); + + } + + @Autowired + private DataSetService dataSetService; + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectDataSetService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectDataSetService.java" new file mode 100644 index 0000000000000000000000000000000000000000..e41e94bebe6d1829cbb3b6a5d81ce17707ddef1d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectDataSetService.java" @@ -0,0 +1,372 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.api.gateway.GetDerivedDataSetDetailApi; +import com.welab.wefe.board.service.api.project.dataset.QueryDerivedDataSetApi; +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectDataSetMySqlModel; +import com.welab.wefe.board.service.database.repository.ProjectDataSetRepository; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.data_set.DataSetOutputModel; +import com.welab.wefe.board.service.dto.entity.job.JobMemberOutputModel; +import com.welab.wefe.board.service.dto.entity.project.DerivedProjectDataSetOutputModel; +import com.welab.wefe.board.service.dto.entity.project.ProjectDataSetOutputModel; +import com.welab.wefe.board.service.dto.vo.JobMemberWithDataSetOutputModel; +import com.welab.wefe.board.service.exception.MemberGatewayException; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.OrderBy; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.CurrentAccount; +import com.welab.wefe.common.web.dto.ApiResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +/** + * @author zane.luo + */ +@Service +public class ProjectDataSetService extends AbstractService { + + @Autowired + private DataSetService dataSetService; + @Autowired + private ProjectDataSetRepository projectDataSetRepo; + + + /** + * Get the details of the derived data set + */ + public DerivedProjectDataSetOutputModel getDerivedDataSetDetail(GetDerivedDataSetDetailApi.Input input) throws StatusCodeWithException { + DataSetMysqlModel dataSet = dataSetService.findOne(input.getDataSetId()); + ProjectDataSetMySqlModel projectDataSet = findOne(input.getProjectId(), input.getDataSetId(), input.getMemberRole()); + + if (dataSet == null || projectDataSet == null) { + return null; + } + + if (projectDataSet.getSourceType() == null) { + throw new StatusCodeWithException("鎷掔粷鏌ヨ鍘熷鏁版嵁闆嗕俊鎭", StatusCode.PARAMETER_VALUE_INVALID); + } + + JObject json = JObject.create(); + json.putAll(JObject.create(dataSet)); + json.putAll(JObject.create(projectDataSet)); + + DerivedProjectDataSetOutputModel output = json.toJavaObject(DerivedProjectDataSetOutputModel.class); + List members = ModelMapper.maps(jobMemberService.list(dataSet.getSourceJobId(), false), JobMemberWithDataSetOutputModel.class); + output.setMembers(members); + + LOG.info("members:" + JSON.toJSONString(members, true)); + LOG.info("input.callerMemberInfo:" + JSON.toJSONString(input.callerMemberInfo, true)); + + return output; + } + + /** + * Get a list of derived data sets in the project + */ + public PagingOutput queryDerivedDataSet(QueryDerivedDataSetApi.Input input) { + Where where = Where + .create() + .equal("projectId", input.getProjectId()) + .equal("dataSetId", input.getDataSetId()) + .equal("sourceFlowId", input.getSourceFlowId()) + .equal("sourceJobId", input.getSourceJobId()); + + if (input.getSourceType() == null) { + where.notEqual("sourceType", null, false); + } else { + where.equal("sourceType", input.getSourceType()); + } + + where.orderBy("createdTime", OrderBy.desc); + + PagingOutput page = projectDataSetRepo.paging(where.build(ProjectDataSetMySqlModel.class), input); + + List list = page + .getList() + .parallelStream() + .map(this::buildDerivedProjectDataSetOutputModel) + .collect(Collectors.toList()); + + return PagingOutput.of(page.getTotal(), list); + + } + + private DerivedProjectDataSetOutputModel buildDerivedProjectDataSetOutputModel(ProjectDataSetMySqlModel projectDataSet) { + DataSetMysqlModel dataSet = dataSetService.findOne(projectDataSet.getDataSetId()); + + JObject json = JObject.create(); + if (dataSet != null) { + json.putAll(JObject.create(dataSet)); + } + json.putAll(JObject.create(projectDataSet)); + + // Create a derived dataset object + DerivedProjectDataSetOutputModel derivedDataSet = json.toJavaObject(DerivedProjectDataSetOutputModel.class); + derivedDataSet.setSourceTypeCn( + derivedDataSet.getSourceType() != null ? derivedDataSet.getSourceType().getLabel() : ""); + if (dataSet != null) { + // Query the feature list from each member + List jobMembers = jobMemberService.list(dataSet.getSourceJobId(), false); + List output = jobMembers + .stream() + .map(m -> { + JobMemberWithDataSetOutputModel member = ModelMapper.map(m, JobMemberWithDataSetOutputModel.class); + // Take your own feature list directly + if (member.getMemberId().equals(derivedDataSet.getMemberId())) { + member.setFeatureNameList(derivedDataSet.getFeatureNameList()); + member.setFeatureCount(derivedDataSet.getFeatureCount()); + } + // Others鈥 feature list should be checked remotely + else { + try { + ApiResult apiResult = gatewayService.callOtherMemberBoard( + member.getMemberId(), + GetDerivedDataSetDetailApi.class, + new GetDerivedDataSetDetailApi.Input(member.getProjectId(), projectDataSet.getDataSetId(), member.getJobRole()) + + ); + if (apiResult.data != null) { + DerivedProjectDataSetOutputModel derivedProjectDataSet = ((JSONObject) apiResult.data).toJavaObject(DerivedProjectDataSetOutputModel.class); + member.setFeatureNameList(derivedProjectDataSet.getFeatureNameList()); + member.setFeatureCount(derivedProjectDataSet.getFeatureCount()); + } + + } catch (MemberGatewayException e) { + super.log(e); + } + } + + return member; + }) + .collect(Collectors.toList()); + + derivedDataSet.setMembers(output); + } + + return derivedDataSet; + } + + @Autowired + private JobMemberService jobMemberService; + + /** + * Display the list of data sets of the specified members in the project + *

+ * When memberId is empty, check the data sets of all members. + */ + public List listRawDataSet(String projectId, String memberId, JobMemberRole memberRole, Boolean containsY) { + + Specification where = Where + .create() + .equal("projectId", projectId) + .equal("memberId", memberId) + .equal("memberRole", memberRole) + .equal("sourceType", null, false) + .orderBy("createdTime", OrderBy.desc) + .build(ProjectDataSetMySqlModel.class); + + List list = projectDataSetRepo.findAll(where); + + List output = list + .parallelStream() + .map(x -> { + DataSetOutputModel dataSet = null; + try { + dataSet = dataSetService.findDataSetFromLocalOrUnion(x.getMemberId(), x.getDataSetId()); + // The data set does not exist and is marked as deleted. + if (dataSet == null) { + ProjectDataSetOutputModel foo = JObject + .create(x) + .toJavaObject(ProjectDataSetOutputModel.class); + foo.setName("姝ゆ暟鎹泦宸茶鍒犻櫎鎴栦笉鍙"); + foo.setRowCount(0L); + foo.setDeleted(true); + return foo; + } + } catch (StatusCodeWithException e) { + e.printStackTrace(); + + return null; + } + + JObject item = JObject.create(); + item.putAll(JObject.create(dataSet)); + item.putAll(JObject.create(x)); + + return item.toJavaObject(ProjectDataSetOutputModel.class); + + }) + .filter(x -> { + if (containsY != null) { + return containsY.equals(x.getContainsY()); + } + return true; + }) + .collect(Collectors.toList()); + + return output; + } + + /** + * Show all the original data sets in the project + */ + public List listAllRawDataSet(String projectId, String memberId) { + + Specification where = Where + .create() + .equal("projectId", projectId) + .equal("memberId", memberId) + .equal("sourceType", null, false) + .orderBy("createdTime", OrderBy.desc) + .build(ProjectDataSetMySqlModel.class); + + return projectDataSetRepo.findAll(where); + } + + /** + * Display the list of data sets of the specified members in the project + *

+ * When memberId is empty, check the data sets of all members. + */ + public List list(String projectId, String memberId) { + + Specification where = Where + .create() + .equal("projectId", projectId) + .equal("memberId", memberId) + .build(ProjectDataSetMySqlModel.class); + + List list = projectDataSetRepo.findAll(where); + + List output = list + .parallelStream() + .map(x -> { + DataSetOutputModel dataSet = null; + try { + dataSet = dataSetService.findDataSetFromLocalOrUnion(x.getMemberId(), x.getDataSetId()); + // The data set does not exist and is marked as deleted. + if (dataSet == null) { + ProjectDataSetOutputModel foo = JObject + .create(x) + .toJavaObject(ProjectDataSetOutputModel.class); + foo.setName("姝ゆ暟鎹泦宸茶鍒犻櫎鎴栦笉鍙"); + foo.setRowCount(0L); + foo.setDeleted(true); + return foo; + } + } catch (StatusCodeWithException e) { + e.printStackTrace(); + + return null; + } + + JObject item = JObject.create(); + item.putAll(JObject.create(dataSet)); + item.putAll(JObject.create(x)); + + return item.toJavaObject(ProjectDataSetOutputModel.class); + + }) + .collect(Collectors.toList()); + return output; + } + + /** + * Query ProjectDataSet based on the combination of conditions + */ + public List findDataSetList(String projectId, String memberId, JobMemberRole memberRole) { + + return projectDataSetRepo.findAll( + Where + .create() + .equal("projectId", projectId) + .equal("memberId", memberId) + .equal("memberRole", memberRole) + .build(ProjectDataSetMySqlModel.class) + ); + } + + /** + * Query ProjectDataSet based on the combination of conditions + */ + public ProjectDataSetMySqlModel findOne(String projectId, String dataSetId, JobMemberRole memberRole) { + + return projectDataSetRepo + .findOne( + Where + .create() + .equal("projectId", projectId) + .equal("dataSetId", dataSetId) + .equal("memberRole", memberRole) + .build(ProjectDataSetMySqlModel.class) + ).orElse(null); + } + + public ProjectDataSetMySqlModel findOne(String projectId, String dataSetId) { + + return projectDataSetRepo + .findOne( + Where + .create() + .equal("projectId", projectId) + .equal("dataSetId", dataSetId) + .build(ProjectDataSetMySqlModel.class) + ).orElse(null); + } + + public List findAll(String projectId, String dataSetId) { + return projectDataSetRepo.findAll(Where.create().equal("projectId", projectId).equal("dataSetId", dataSetId) + .build(ProjectDataSetMySqlModel.class)); + } + + public void update(ProjectDataSetMySqlModel dataSet, Consumer func) { + if (dataSet == null) { + return; + } + + func.accept(dataSet); + dataSet.setUpdatedBy(CurrentAccount.id()); + + projectDataSetRepo.save(dataSet); + + } + + public List listByDataSetId(String projectId, String dataSetId, JobMemberRole memberRole) { + return projectDataSetRepo.findAll( + Where + .create() + .equal("projectId", projectId) + .equal("dataSetId", dataSetId) + .equal("memberRole", memberRole) + .build(ProjectDataSetMySqlModel.class) + ); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectFlowJobService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectFlowJobService.java" new file mode 100644 index 0000000000000000000000000000000000000000..a4eb36707fe2246601333beed3b5fd7a39e1dc88 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectFlowJobService.java" @@ -0,0 +1,888 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.welab.wefe.board.service.api.member.ServiceStatusCheckApi; +import com.welab.wefe.board.service.api.project.flow.StartFlowApi; +import com.welab.wefe.board.service.api.project.job.ResumeJobApi; +import com.welab.wefe.board.service.api.project.job.StopJobApi; +import com.welab.wefe.board.service.component.Components; +import com.welab.wefe.board.service.component.DataIOComponent; +import com.welab.wefe.board.service.component.OotComponent; +import com.welab.wefe.board.service.component.base.AbstractComponent; +import com.welab.wefe.board.service.constant.Config; +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.database.entity.job.JobMemberMySqlModel; +import com.welab.wefe.board.service.database.entity.job.JobMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectDataSetMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectFlowMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectFlowNodeMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.database.repository.JobMemberRepository; +import com.welab.wefe.board.service.database.repository.JobRepository; +import com.welab.wefe.board.service.database.repository.ProjectFlowRepository; +import com.welab.wefe.board.service.database.repository.TaskRepository; +import com.welab.wefe.board.service.database.repository.TaskResultRepository; +import com.welab.wefe.board.service.dto.entity.data_set.DataSetOutputModel; +import com.welab.wefe.board.service.dto.kernel.Env; +import com.welab.wefe.board.service.dto.kernel.JobDataSet; +import com.welab.wefe.board.service.dto.kernel.KernelJob; +import com.welab.wefe.board.service.dto.kernel.Member; +import com.welab.wefe.board.service.dto.kernel.Project; +import com.welab.wefe.board.service.dto.vo.JobArbiterInfo; +import com.welab.wefe.board.service.dto.vo.MemberServiceStatusOutput; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.enums.FlowActionType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.JobStatus; +import com.welab.wefe.common.enums.ProjectFlowStatus; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.CurrentAccount; + +/** + * @author winter.zou + */ +@Service +public class ProjectFlowJobService extends AbstractService { + @Autowired + private JobService jobService; + @Autowired + private JobRepository jobRepo; + @Autowired + private TaskResultService taskResultService; + @Autowired + private JobMemberRepository jobMemberRepo; + @Autowired + private TaskResultRepository taskResultRepository; + @Autowired + private TaskService taskService; + @Autowired + private FlowActionQueueService flowActionQueueService; + @Autowired + private GatewayService gatewayService; + @Autowired + private ProjectFlowRepository projectFlowRepo; + @Autowired + private Config config; + @Autowired + private ProjectFlowNodeService projectFlowNodeService; + @Autowired + private ProjectService projectService; + @Autowired + private DataSetService dataSetService; + @Autowired + private ProjectFlowService projectFlowService; + @Autowired + protected TaskRepository taskRepository; + @Autowired + private ProjectDataSetService projectDataSetService; + @Autowired + private ServiceCheckService serviceCheckService; + + public static final int MIX_FLOW_PROMOTER_NUM = 2; + + /** + * start flow + * + * @return jobId + */ + @Transactional(rollbackFor = Exception.class) + public synchronized String startFlow(StartFlowApi.Input input) throws StatusCodeWithException { + + ProjectFlowMySqlModel flow = projectFlowRepo.findOne("flowId", input.getFlowId(), ProjectFlowMySqlModel.class); + if (flow == null) { + throw new StatusCodeWithException("鏈壘鍒扮浉搴旂殑娴佺▼锛", StatusCode.ILLEGAL_REQUEST); + } + + ProjectMySqlModel project = projectService.findByProjectId(flow.getProjectId()); + + if (!input.fromGateway() && (!isCreator(flow, project))) { + throw new StatusCodeWithException("鍙湁 鍒涘缓鑰 鎵嶈兘鍚姩浠诲姟锛", StatusCode.ILLEGAL_REQUEST); + } + + if (!input.fromGateway()) { + input.setJobId(UUID.randomUUID().toString().replaceAll("-", "")); + } + + JobMySqlModel lastJob = jobRepo.findLastByFlowId(flow.getFlowId(), project.getMyRole().name()); + if (lastJob != null && !lastJob.getStatus().finished()) { + throw new StatusCodeWithException("璇风◢绛夛紝褰撳墠浠诲姟灏氭湭缁撴潫锛岃绛夊緟鍏剁粨鏉熷悗閲嶈瘯銆", StatusCode.PARAMETER_VALUE_INVALID); + } + + JobArbiterInfo jobArbiterInfo = calcArbiterInfo(flow, input, project); + boolean isOotMode = StringUtils.isNotEmpty(input.getOotJobId()); + + // save job members + List jobMembers = listJobMembers(project.getProjectId(), input.getFlowId(), + input.getJobId(), jobArbiterInfo, isOotMode); + + if (!input.fromGateway()) { + if (jobMembers.stream().noneMatch(x -> CacheObjects.getMemberId().equals(x.getMemberId()))) { + throw new StatusCodeWithException("褰撳墠浠诲姟涓嶅寘鍚垜鏂规暟鎹泦锛屾棤娉曞惎鍔ㄣ", StatusCode.PARAMETER_VALUE_INVALID); + } + } + long memberCount = jobMembers.stream().filter(x -> x.getJobRole() != JobMemberRole.arbiter).count(); + if (memberCount < MIX_FLOW_PROMOTER_NUM && !isOotMode) { + throw new StatusCodeWithException("闇瑕佸湪銆" + ComponentType.DataIO.getLabel() + "銆戜腑閫夋嫨涓や釜鎴栦袱涓互涓婄殑鏁版嵁闆", StatusCode.PARAMETER_VALUE_INVALID); + } + long promoterMemberCount = jobMembers.stream().filter(x -> x.getJobRole() == JobMemberRole.promoter).count(); + if (promoterMemberCount >= MIX_FLOW_PROMOTER_NUM && !flow.getFederatedLearningType().equals(FederatedLearningType.mix)) { + throw new StatusCodeWithException("銆愰夋嫨鏁版嵁闆嗐戠粍浠跺弬鏁伴敊璇紝璇峰厛绉婚櫎鍐嶉噸鏂版坊鍔", StatusCode.PARAMETER_VALUE_INVALID); + } + for (JobMemberMySqlModel jobMember : jobMembers) { + if (!CacheObjects.getMemberId().equals(jobMember.getMemberId())) { + continue; + } + + lastJob = jobRepo.findLastByFlowId(flow.getFlowId(), jobMember.getJobRole().name()); + + // create new job + JobMySqlModel job = createJob(flow, input.getJobId(), jobMember.getJobRole()); + + // create Graph + FlowGraph graph = new FlowGraph(job, lastJob, jobMembers, projectFlowNodeService.findNodesByFlowId(job.getFlowId())); + + // check + if (jobMember.getJobRole() == JobMemberRole.promoter) { + checkBeforeStartFlow(graph, project, isOotMode); + } + // create task + createJobTasks(graph, input.isUseCache(), input.getEndNodeId(), flow.getFederatedLearningType()); + + } + + gatewayService.syncToOtherJobMembers(input.getJobId(), input, StartFlowApi.class); + + flowActionQueueService.notifyFlow(input, input.getJobId(), FlowActionType.run_job); + + //update flow + projectFlowService.updateFlowStatus(flow.getFlowId(), ProjectFlowStatus.running); + + return input.getJobId(); + + } + + public boolean isCreator(ProjectFlowMySqlModel flow, ProjectMySqlModel project) { + return JobMemberRole.promoter == project.getMyRole() + && CacheObjects.isCurrentMember(flow.getCreatedBy()); + } + + public JobArbiterInfo calcArbiterInfo(ProjectFlowMySqlModel flow, StartFlowApi.Input input, + ProjectMySqlModel project) { + JobArbiterInfo info = new JobArbiterInfo(); + info.setHasArbiter(false); + if (flow.getFederatedLearningType() == FederatedLearningType.horizontal) { + if (project.getMyRole() == JobMemberRole.promoter) { + info.setHasArbiter(true); + } + } + if (flow.getFederatedLearningType() == FederatedLearningType.mix) { + if (!input.fromGateway() && project.getMyRole() == JobMemberRole.promoter) { + info.setHasArbiter(true); + } + } + return info; + } + + /** + * Check the effectiveness of the task before starting the task. + */ + private void checkBeforeStartFlow(FlowGraph graph, ProjectMySqlModel project, boolean isOotMode) throws StatusCodeWithException { + if (CollectionUtils.isEmpty(graph.getStartNodes())) { + throw new StatusCodeWithException("娴佺▼涓病鏈夎捣濮嬭妭鐐癸紝鏃犳硶鎵ц璇ユ祦绋嬨", StatusCode.PARAMETER_VALUE_INVALID); + } + + if (graph.getStartNodes().stream().noneMatch(x -> (x.getComponentType() == ComponentType.DataIO + || x.getComponentType() == ComponentType.Oot))) { + throw new StatusCodeWithException("璧峰鑺傜偣蹇呴』鍖呭惈 " + ComponentType.DataIO.getLabel() + "锛屽惁鍒欐棤娉曟墽琛屾祦绋嬨", StatusCode.PARAMETER_VALUE_INVALID); + } + + if (isOotMode) { + if (graph.allNodes.size() > 1 || graph.allNodes.get(0).getComponentType() != ComponentType.Oot) { + throw new StatusCodeWithException("鍙厑璁稿彧鏈塠" + ComponentType.Oot.getLabel() + "]缁勪欢", StatusCode.PARAMETER_VALUE_INVALID); + } + } + + // Check whether the services of each member are available + for (JobMemberMySqlModel member : graph.getMembers()) { + ServiceStatusCheckApi.Output status = serviceCheckService.checkMemberServiceStatus(new ServiceStatusCheckApi.Input(member.getMemberId())); + MemberServiceStatusOutput errorService = status.getStatus().values().stream().filter(x -> !x.isSuccess()).findFirst().orElse(null); + if (errorService != null) { + throw new StatusCodeWithException("鎴愬憳 " + + CacheObjects.getMemberName(member.getMemberId()) + + " 鐨 " + errorService.getService().name() + " 鏈嶅姟涓嶅彲鐢細" + + errorService.getMessage(), + + StatusCode.REMOTE_SERVICE_ERROR + ); + } + } + + // Check the validity of the dataset + for (JobMemberMySqlModel member : graph.getMembers()) { + // arbiter pass + if (member.getJobRole() == JobMemberRole.arbiter) { + continue; + } + + String memberName = CacheObjects.getMemberName(member.getMemberId()); + if (memberName == null) { + memberName = "鏈煡鎴愬憳"; + } + + // mine + if (CacheObjects.getMemberId().equals(member.getMemberId())) { + ProjectDataSetMySqlModel projectDataSet = projectDataSetService.findOne(project.getProjectId(), member.getDataSetId(), member.getJobRole()); + + + if (projectDataSet == null) { + throw new StatusCodeWithException("鎴愬憳銆" + memberName + " - " + member.getJobRole().name() + "銆戠殑鏁版嵁闆 " + member.getDataSetId() + " 涓嶅瓨鍦紝鍙兘宸插垹闄ゃ", StatusCode.PARAMETER_VALUE_INVALID); + } + + DataSetOutputModel dataSet = dataSetService.findDataSetFromLocalOrUnion(member.getMemberId(), member.getDataSetId()); + if (dataSet == null) { + throw new StatusCodeWithException("鎴愬憳銆" + memberName + " - " + member.getJobRole().name() + "銆戠殑鏁版嵁闆 " + member.getDataSetId() + " 涓嶅瓨鍦紝鍙兘宸茶鍒犻櫎銆", StatusCode.PARAMETER_VALUE_INVALID); + } + + } + // other + else { + List projectDataSetList = projectDataSetService + .listByDataSetId(project.getProjectId(), member.getDataSetId(), member.getJobRole()); + + for (ProjectDataSetMySqlModel projectDataSet : projectDataSetList) { + + + if (projectDataSet.getSourceType() != null) { + continue; + } else { + DataSetOutputModel dataSet = dataSetService.findDataSetFromLocalOrUnion(member.getMemberId(), member.getDataSetId()); + if (dataSet == null) { + throw new StatusCodeWithException("鎴愬憳銆" + memberName + "銆戠殑鏁版嵁闆 " + member.getDataSetId() + " 涓嶅瓨鍦紝鍙兘宸茶鍒犻櫎鎴栦笉鍙銆", StatusCode.PARAMETER_VALUE_INVALID); + } + } + + if (projectDataSet.getAuditStatus() != AuditStatus.agree) { + throw new StatusCodeWithException("鎴愬憳銆" + memberName + "銆戠殑鏁版嵁闆 " + member.getDataSetId() + " 灏氭湭鎺堟潈锛屼笉鍙娇鐢ㄣ", StatusCode.PARAMETER_VALUE_INVALID); + } + } + + + } + + + } + } + + + @Transactional(rollbackFor = Exception.class) + public synchronized void resumeJob(ResumeJobApi.Input input) throws StatusCodeWithException { + + List jobs = jobService.listByJobId(input.getJobId()); + if (jobs.isEmpty()) { + throw new StatusCodeWithException("鏈壘鍒扮浉搴旂殑浠诲姟锛", StatusCode.ILLEGAL_REQUEST); + } + + JobMySqlModel job = jobs.get(0); + + ProjectMySqlModel project = projectService.findByProjectId(job.getProjectId()); + + if (!input.fromGateway() && JobMemberRole.promoter != project.getMyRole()) { + throw new StatusCodeWithException("鍙湁 promoter 鎵嶈兘缁х画浠诲姟锛", StatusCode.ILLEGAL_REQUEST); + } + + if (job.getStatus() != JobStatus.stop_on_running && job.getStatus() != JobStatus.error_on_running) { + throw new StatusCodeWithException("褰撳墠鐘舵佷笉鍏佽杩涜缁х画浠诲姟鎿嶄綔锛", StatusCode.ILLEGAL_REQUEST); + } + + jobs.forEach(y -> + jobService.updateJob(y, (x) -> { + x.setUpdatedBy(input); + x.setStatus(JobStatus.wait_run); + return x; + }) + ); + + flowActionQueueService.notifyFlow(input, input.getJobId(), FlowActionType.run_job); + + gatewayService.syncToOtherJobMembers(job.getJobId(), input, ResumeJobApi.class); + + } + + @Transactional(rollbackFor = Exception.class) + public synchronized void stopFlowJob(StopJobApi.Input input) throws StatusCodeWithException { + + + List jobs = jobService.listByJobId(input.getJobId()); + if (jobs.isEmpty()) { + throw new StatusCodeWithException("鏈壘鍒扮浉搴旂殑浠诲姟锛", StatusCode.ILLEGAL_REQUEST); + } + int finishedJobCount = 0; + for (JobMySqlModel job : jobs) { + if (job.getStatus().onStoping() || job.getStatus().finished()) { + finishedJobCount++; + } + } + // all finished + if (finishedJobCount == jobs.size()) { + return; + } + JobMySqlModel job = jobs.get(0); + ProjectMySqlModel project = projectService.findByProjectId(job.getProjectId()); + + if (!input.fromGateway() && JobMemberRole.promoter != project.getMyRole()) { + throw new StatusCodeWithException("鍙湁 promoter 鎵嶈兘鏆傚仠浠诲姟锛", StatusCode.ILLEGAL_REQUEST); + } + + jobs.forEach(y -> + jobService.updateJob(y, (x) -> { + x.setUpdatedBy(input); + x.setStatus(JobStatus.wait_stop); + return x; + }) + ); + + projectFlowService.updateFlowStatus(job.getFlowId(), ProjectFlowStatus.stop_on_running); + + flowActionQueueService.notifyFlow(input, input.getJobId(), FlowActionType.stop_job); + + gatewayService.syncToOtherJobMembers(job.getJobId(), input, StopJobApi.class); + + } + + + private JobMySqlModel createJob(ProjectFlowMySqlModel flow, String jobId, JobMemberRole myRole) { + JobMySqlModel job = new JobMySqlModel(); + job.setFederatedLearningType(flow.getFederatedLearningType()); + job.setMyRole(myRole); + job.setJobId(jobId); + job.setCreatedBy(CurrentAccount.id()); + job.setName(flow.getFlowName()); + job.setProgress(0); + job.setStatus(JobStatus.wait_run); + job.setStatusUpdatedTime(new Date()); + job.setProjectId(flow.getProjectId()); + job.setFlowId(flow.getFlowId()); + job.setGraph(flow.getGraph()); + + job = jobRepo.save(job); + + return job; + + } + + private List createJobTasks(FlowGraph graph, boolean useCache, String endNodeId, + FederatedLearningType federatedLearningType) throws StatusCodeWithException { + + List startNodes = graph.getStartNodes(); + + if (CollectionUtils.isEmpty(startNodes)) { + throw new StatusCodeWithException("褰撳墠娴佺▼娌℃湁璧峰鑺傜偣锛屾棤娉曡繍琛屻", StatusCode.PARAMETER_VALUE_INVALID); + } + + jobService.setGraphHasCacheResult(graph, useCache); + + List noCacheNodes = graph + .getJobSteps(endNodeId) + .stream() + .filter(x -> !x.getHasCacheResult()) + .collect(Collectors.toList()); + + if (noCacheNodes.isEmpty()) { + throw new StatusCodeWithException("鍒涘缓浠诲姟澶辫触锛氭病鏈夐渶瑕佹墽琛岀殑鑺傜偣锛岃灏濊瘯绂佺敤缂撳瓨鍚庨噸璇曘", StatusCode.PARAMETER_VALUE_INVALID); + } + + List cacheTasks = new ArrayList<>(); + if (useCache) { + List hasCacheNodes = graph + .getJobSteps(endNodeId) + .stream() + .filter(FlowGraphNode::getHasCacheResult) + .collect(Collectors.toList()); + + for (FlowGraphNode node : hasCacheNodes) { + + if (graph.getJob().getMyRole() == JobMemberRole.arbiter) { + if (!Components.needArbiterTask(node.getComponentType())) { + continue; + } + } + if (graph.getFederatedLearningType().equals(FederatedLearningType.mix)) { + List newTasks = copyMixTaskInfoFromLastJob(graph.getLastJob(), graph.getJob(), node, + true); + cacheTasks.addAll(newTasks); + + } else { + TaskMySqlModel newTask = copyNodeInfoFromLastJob(graph.getLastJob(), graph.getJob(), node, true); + cacheTasks.add(newTask); + } + } + + } + + KernelJob kernelJob = createKernelJob(graph.getJob(), graph.getMembers(), graph.getJobSteps(endNodeId)); + + List tasks = new ArrayList<>(); + + for (FlowGraphNode node : noCacheNodes) { + + AbstractComponent component = Components.get(node.getComponentType()); + if (component == null) { + continue; + } + if (graph.getJob().getMyRole() == JobMemberRole.arbiter) { + // need arbiter task + if (!Components.needArbiterTask(component.taskType())) { + continue; + } + } + + if (component.hasParams()) { + if (StringUtil.isEmpty(node.getParams()) || "{}".equals(node.getParams())) { + throw new FlowNodeException(node, "璇ョ粍浠剁殑鍙傛暟灏氭湭淇濆瓨"); + } + } + + try { + addPreTasks(node, tasks, cacheTasks); + if (federatedLearningType == FederatedLearningType.mix) { + List subTasks = component.buildMixTask(graph, tasks, kernelJob, node); + if (subTasks != null && !subTasks.isEmpty()) { + tasks.addAll(subTasks); + } + } else { + TaskMySqlModel task = component.buildTask(graph, tasks, kernelJob, node); + if (task != null) { + tasks.add(task); + } + } + } catch (FlowNodeException e) { + throw e; + } catch (Exception e) { + throw new FlowNodeException(node, e.getMessage()); + } + } + + /** + * If the first node to run is a modeling algorithm node and there is an available cache, + * you need to copy the previously failed task result to the current task. + * 1. Parameter specifies the use of caching锛坲seCache == true锛 + * 2. The first task is the modeling node + * 3. last job is not empty, which indicates that this flow has been run before. + * 4. The modeling node has not been edited since the last job was created + */ + FlowGraphNode firstNode = noCacheNodes.get(0); + if (useCache && firstNode.getComponentType().isModeling() && graph.getLastJob() != null) { + if (firstNode.getParamsVersion() < graph.getLastJob().getCreatedTime().getTime()) { + copyIterationResult(graph.getLastJob(), graph.getJob(), firstNode); + } + } + + if (graph.getJob().getMyRole() != JobMemberRole.arbiter) { + updateDataSetUsageCountInJob(kernelJob); + } + + return tasks; + } + + /** + * Update dataset usage + */ + private void updateDataSetUsageCountInJob(KernelJob kernelJob) throws StatusCodeWithException { + + HashSet dataSetIds = new HashSet<>(); + for (JobDataSet dataSet : kernelJob.getDataSets()) { + for (JobDataSet.Member member : dataSet.members) { + dataSetIds.add(member.dataSetId); + } + } + + for (String dataSetId : dataSetIds) { + dataSetService.usageCountInJobIncrement(dataSetId); + } + } + + /** + * Copy the result of the failed task to the new job + */ + private void copyIterationResult(JobMySqlModel oldJob, JobMySqlModel newJob, FlowGraphNode node) { + if (!node.getComponentType().isModeling()) { + return; + } + if (oldJob.getFederatedLearningType().equals(FederatedLearningType.mix)) { + copyMixTaskInfoFromLastJob(oldJob, newJob, node, false); + } else { + copyNodeInfoFromLastJob(oldJob, newJob, node, false); + } + + } + + private KernelJob createKernelJob(JobMySqlModel job, List memberList, List nodes) throws StatusCodeWithException { + + KernelJob jobInfo = new KernelJob(); + + Project project = new Project(); + project.setProjectId(job.getProjectId()); + + Env env = new Env(); + env.setBackend(config.getBackend()); + env.setDbType(config.getDbType()); + env.setWorkMode(config.getWorkMode()); + env.setName(config.getEnvName()); + + List dataSets = listJobDataSets(job, nodes); + + jobInfo.setFederatedLearningType(job.getFederatedLearningType()); + jobInfo.setProject(project); + jobInfo.setMembers(memberList.stream().map(Member::new).collect(Collectors.toList())); + + Member arbiter = jobInfo + .getMembers() + .stream() + .filter(x -> x.getMemberRole() == JobMemberRole.arbiter) + .findFirst() + .orElse(null); + + if (arbiter == null) { + if (job.getFederatedLearningType() == FederatedLearningType.horizontal + || job.getFederatedLearningType() == FederatedLearningType.mix) { + Member promoter = jobInfo + .getMembers() + .stream() + .filter(x -> x.getMemberRole() == JobMemberRole.promoter) + .findFirst() + .orElse(null); + + if (promoter != null) { + arbiter = new Member(); + arbiter.setMemberId(promoter.getMemberId()); + arbiter.setMemberRole(JobMemberRole.arbiter); + arbiter.setMemberName(promoter.getMemberName()); + jobInfo.getMembers().add(arbiter); + } + } + } + + jobInfo.setEnv(env); + jobInfo.setDataSets(dataSets); + + return jobInfo; + } + + private void addPreTasks(FlowGraphNode node, List tasks, List cacheTasks) { + + // calculate the start index + int start = tasks.isEmpty() ? Integer.MIN_VALUE : tasks.get(tasks.size() - 1).getPosition(); + + // from cache tasks, find the tasks before the current node and add them to tasks. + cacheTasks + .stream() + .filter(x -> x.getPosition() > start && x.getPosition() < node.getPosition()) + .forEach(tasks::add); + + } + + /** + * Copy the task information from the previous job + *

+ * 1. copy task + * 2. copy task_result + */ + private List copyMixTaskInfoFromLastJob(JobMySqlModel oldJob, JobMySqlModel newJob, FlowGraphNode node, boolean copyTask) { + + if (newJob == null) { + return null; + } + + List oldTasks = taskService.findAll(oldJob.getJobId(), node.getNodeId(), oldJob.getMyRole()); + + List newTasks = new ArrayList<>(); + for (TaskMySqlModel oldTask : oldTasks) { + TaskMySqlModel newTask = null; + int count = Integer.parseInt(oldTask.getTaskId().split("_")[oldTask.getTaskId().split("_").length - 1]); + // copy task + if (copyTask) { + newTask = new TaskMySqlModel(); + BeanUtils.copyProperties(oldTask, newTask); + newTask.setId(new TaskMySqlModel().getId()); + newTask.setRole(newJob.getMyRole()); + newTask.setJobId(newJob.getJobId()); + newTask.setDeep(node.getDeep()); + newTask.setPosition(node.getPosition()); + newTask.setTaskId(node.createTaskId(newJob, count)); + newTask.setParentTaskIdList(node.createParentTaskIds(newJob, count)); + taskRepository.save(newTask); + + List oldResults = taskResultService.listAllResult(oldTask.getTaskId()); + // copy task_result + for (TaskResultMySqlModel oldResult : oldResults) { + + TaskResultMySqlModel newResult = new TaskResultMySqlModel(); + BeanUtils.copyProperties(oldResult, newResult); + + newResult.setId(new TaskResultMySqlModel().getId()); + newResult.setRole(newJob.getMyRole()); + newResult.setJobId(newJob.getJobId()); + newResult.setTaskId(node.createTaskId(newJob, count)); + taskResultRepository.save(newResult); + } + + DataSetMysqlModel dataSetModel = dataSetService.query(oldJob.getJobId(), node.getComponentType()); + if (dataSetModel != null) { + DataSetMysqlModel newDataSetModel = new DataSetMysqlModel(); + BeanUtils.copyProperties(dataSetModel, newDataSetModel); + newDataSetModel.setId(new DataSetMysqlModel().getId()); + newDataSetModel.setSourceJobId(newJob.getJobId()); + newDataSetModel.setSourceType(node.getComponentType()); + dataSetService.save(newDataSetModel); + } + } + if (newTask != null) { + newTasks.add(newTask); + } + } + + return newTasks; + } + + /** + * Copy the task information from the previous job + *

+ * 1. copy task + * 2. copy task_result + */ + private TaskMySqlModel copyNodeInfoFromLastJob(JobMySqlModel oldJob, JobMySqlModel newJob, FlowGraphNode node, + boolean copyTask) { + + if (newJob == null) { + return null; + } + + TaskMySqlModel oldTask = taskService.findOne(oldJob.getJobId(), node.getNodeId(), oldJob.getMyRole()); + + TaskMySqlModel newTask = null; + + // copy task + if (copyTask) { + + newTask = new TaskMySqlModel(); + BeanUtils.copyProperties(oldTask, newTask); + + newTask.setId(new TaskMySqlModel().getId()); + newTask.setRole(newJob.getMyRole()); + newTask.setJobId(newJob.getJobId()); + newTask.setDeep(node.getDeep()); + newTask.setPosition(node.getPosition()); + newTask.setTaskId(node.createTaskId(newJob)); + newTask.setParentTaskIdList(node.createParentTaskIds(newJob)); + + taskRepository.save(newTask); + + List oldResults = taskResultService.listAllResult(oldTask.getTaskId()); + // copy task_result + for (TaskResultMySqlModel oldResult : oldResults) { + + TaskResultMySqlModel newResult = new TaskResultMySqlModel(); + BeanUtils.copyProperties(oldResult, newResult); + + newResult.setId(new TaskResultMySqlModel().getId()); + newResult.setRole(newJob.getMyRole()); + newResult.setJobId(newJob.getJobId()); + newResult.setTaskId(node.createTaskId(newJob)); + + taskResultRepository.save(newResult); + } + + DataSetMysqlModel dataSetModel = dataSetService.query(oldJob.getJobId(), node.getComponentType()); + if (dataSetModel != null) { + DataSetMysqlModel newDataSetModel = new DataSetMysqlModel(); + BeanUtils.copyProperties(dataSetModel, newDataSetModel); + newDataSetModel.setId(new DataSetMysqlModel().getId()); + newDataSetModel.setSourceJobId(newJob.getJobId()); + newDataSetModel.setSourceType(node.getComponentType()); + dataSetService.save(newDataSetModel); + } + } + return newTask; + } + + + /** + * save the list of members participating in this job + */ + private List listJobMembers(String projectId, String flowId, String jobId, JobArbiterInfo jobArbiterInfo, boolean isOotMode) throws StatusCodeWithException { + + List nodes = projectFlowNodeService.listAboutLoadDataSetNodes(flowId); + + List jobMembers = new ArrayList<>(); + + String promoterId = null; + for (ProjectFlowNodeMySqlModel node : nodes) { + List dataSetItemList = null; + if (node.getComponentType().equals(ComponentType.Oot)) { + if (isOotMode) { + OotComponent.Params params = (OotComponent.Params) Components + .get(node.getComponentType()) + .deserializationParam(null, node.getParams()); + // oot model + dataSetItemList = StringUtil.isNotEmpty(params.getJobId()) ? params.getDataSetList() : dataSetItemList; + } + } else { + DataIOComponent.Params params = (DataIOComponent.Params) Components + .get(node.getComponentType()) + .deserializationParam(null, node.getParams()); + dataSetItemList = params.getDataSetList(); + } + + if (CollectionUtils.isEmpty(dataSetItemList)) { + continue; + } + + for (DataIOComponent.DataSetItem item : dataSetItemList) { + boolean existMember = jobMembers.stream().anyMatch(x -> + x.getMemberId().equals(item.getMemberId()) + && x.getJobRole().equals(item.getMemberRole()) + ); + + if (existMember) { + continue; + } + + JobMemberMySqlModel jobMember = new JobMemberMySqlModel(); + jobMember.setDataSetId(item.getDataSetId()); + jobMember.setJobRole(item.getMemberRole()); + jobMember.setMemberId(item.getMemberId()); + + jobMembers.add(jobMember); + + if (jobMember.getJobRole() == JobMemberRole.promoter + && jobMember.getMemberId().equals(CacheObjects.getMemberId())) { + promoterId = jobMember.getMemberId(); + } + } + } + + if (jobArbiterInfo.isHasArbiter()) { + JobMemberMySqlModel arbiter = new JobMemberMySqlModel(); + arbiter.setJobRole(JobMemberRole.arbiter); + arbiter.setMemberId(StringUtils.isBlank(promoterId) ? jobArbiterInfo.getArbiterMemberId() : promoterId); + jobMembers.add(arbiter); + } + + jobMembers.forEach(x -> { + x.setCreatedBy(CurrentAccount.id()); + x.setProjectId(projectId); + x.setFlowId(flowId); + x.setJobId(jobId); + + jobMemberRepo.save(x); + }); + + // Sort to ensure that the promoter is at the top + jobMembers.sort(Comparator.comparingInt(o -> o.getJobRole().getIndex())); + + return jobMembers; + } + + + /** + * Sort out all data sets used in the job + */ + private List listJobDataSets(JobMySqlModel job, List nodes) throws StatusCodeWithException { + + List jobDataSetList = new ArrayList<>(); + + List dataSetComponentTypeList = Arrays.asList( + ComponentType.DataIO, + ComponentType.HorzXGBoostValidationDataSetLoader, + ComponentType.VertXGBoostValidationDataSetLoader, + ComponentType.HorzLRValidationDataSetLoader, + ComponentType.VertLRValidationDataSetLoader, + ComponentType.Oot + ); + + for (FlowGraphNode node : nodes) { + if (!dataSetComponentTypeList.contains(node.getComponentType())) { + continue; + } + + List dataSetItemList; + if (ComponentType.Oot.equals(node.getComponentType())) { + OotComponent.Params params = (OotComponent.Params) node.getParamsModel(); + dataSetItemList = params.getDataSetList(); + } else { + DataIOComponent.Params params = (DataIOComponent.Params) node.getParamsModel(); + dataSetItemList = params.getDataSetList(); + } + + if (CollectionUtils.isEmpty(dataSetItemList)) { + continue; + } + + JobDataSet dataSet = new JobDataSet(); + dataSet.componentType = node.getComponentType(); + dataSet.nodeId = node.getNodeId(); + dataSet.taskId = FlowGraphNode.createTaskId(job, node.getComponentType(), node.getNodeId()); + dataSet.members = new ArrayList<>(); + + for (DataIOComponent.DataSetItem item : dataSetItemList) { + JobDataSet.Member member = new JobDataSet.Member(); + member.memberId = item.getMemberId(); + member.memberRole = item.getMemberRole(); + member.dataSetId = item.getDataSetId(); + + DataSetOutputModel dataSetInfo = dataSetService.findDataSetFromLocalOrUnion(member.memberId, member.dataSetId); + if (dataSetInfo != null) { + member.dataSetRows = dataSetInfo.getRowCount(); + member.dataSetFeatures = dataSetInfo.getFeatureCount(); + } + + dataSet.members.add(member); + + } + + jobDataSetList.add(dataSet); + } + + return jobDataSetList; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectFlowNodeService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectFlowNodeService.java" new file mode 100644 index 0000000000000000000000000000000000000000..5c7d517452b5b7573e42d6816bc1f4e758a7bd98 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectFlowNodeService.java" @@ -0,0 +1,283 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.api.project.node.CheckExistEvaluationComponentApi; +import com.welab.wefe.board.service.api.project.node.UpdateApi; +import com.welab.wefe.board.service.component.Components; +import com.welab.wefe.board.service.component.DataIOComponent; +import com.welab.wefe.board.service.database.entity.job.JobMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectFlowMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectFlowNodeMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.repository.ProjectFlowNodeRepository; +import com.welab.wefe.board.service.database.repository.ProjectFlowRepository; +import com.welab.wefe.board.service.dto.entity.data_set.DataSetOutputModel; +import com.welab.wefe.board.service.dto.entity.job.ProjectFlowNodeOutputModel; +import com.welab.wefe.board.service.dto.kernel.JobDataSet; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.ProjectFlowStatus; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.StringUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author zane.luo + */ +@Service +public class ProjectFlowNodeService { + + @Autowired + private ProjectFlowNodeRepository projectFlowNodeRepository; + @Autowired + private GatewayService gatewayService; + @Autowired + private ProjectFlowService projectFlowService; + @Autowired + private DataSetService dataSetService; + + @Autowired + private ProjectFlowRepository projectFlowRepo; + + @Autowired + private ProjectFlowNodeService projectFlowNodeService; + + @Autowired + private JobService jobService; + + @Autowired + private TaskService taskService; + + /** + * Get all nodes in the flow + */ + public List findNodesByFlowId(String flowId) { + Specification where = Where + .create() + .equal("flowId", flowId) + .build(ProjectFlowNodeMySqlModel.class); + + return projectFlowNodeRepository.findAll(where); + } + + public List findFlowDataSetInfo(String flowId) throws StatusCodeWithException { + List mysqlNodes = findNodesByFlowId(flowId); + List allNodes = mysqlNodes.stream().map(x -> ModelMapper.map(x, FlowGraphNode.class)) + .collect(Collectors.toList()); + + List dataSetComponentTypeList = Arrays.asList(ComponentType.DataIO, + ComponentType.HorzXGBoostValidationDataSetLoader, ComponentType.VertXGBoostValidationDataSetLoader, + ComponentType.HorzLRValidationDataSetLoader, ComponentType.VertLRValidationDataSetLoader); + List dataSetItemList = new ArrayList<>(); + for (FlowGraphNode node : allNodes) { + if (!dataSetComponentTypeList.contains(node.getComponentType())) { + continue; + } + // Take out the input parameters of DataIO + DataIOComponent.Params params = (DataIOComponent.Params) node.getParamsModel(); + if (CollectionUtils.isEmpty(params.getDataSetList())) { + continue; + } + JobDataSet dataSet = new JobDataSet(); + dataSet.members = new ArrayList<>(); + for (DataIOComponent.DataSetItem item : params.getDataSetList()) { + JobDataSet.Member member = new JobDataSet.Member(); + member.memberRole = item.getMemberRole(); + DataSetOutputModel dataSetInfo = dataSetService.findDataSetFromLocalOrUnion(item.getMemberId(), + item.getDataSetId()); + if (dataSetInfo != null) { + member.dataSetRows = dataSetInfo.getRowCount(); + member.dataSetFeatures = dataSetInfo.getFeatureCount(); + } + dataSet.members.add(member); + } + dataSetItemList.add(dataSet); + } + return dataSetItemList; + } + + /** + * Find all nodes of the selected data set in the process + */ + public List listAboutLoadDataSetNodes(String flowId) { + + return projectFlowNodeRepository.findAll( + Where + .create() + .equal("flowId", flowId) + .in("componentType", + Arrays.asList( + ComponentType.DataIO, + ComponentType.HorzXGBoostValidationDataSetLoader, + ComponentType.VertXGBoostValidationDataSetLoader, + ComponentType.HorzLRValidationDataSetLoader, + ComponentType.VertLRValidationDataSetLoader, + ComponentType.Oot + ) + ) + .build(ProjectFlowNodeMySqlModel.class) + ); + } + + /** + * Nodes in the update flow + */ + public List updateFlowNode(UpdateApi.Input input) throws StatusCodeWithException { + + // Update flow status + projectFlowService.updateFlowStatus(input.getFlowId(), ProjectFlowStatus.editing); + + ProjectFlowNodeMySqlModel node = findOne(input.getFlowId(), input.getNodeId()); + List list = new ArrayList<>(); + + // If the node does not exist, it will be created automatically. + if (node == null) { + + node = new ProjectFlowNodeMySqlModel(); + + node.setFlowId(input.getFlowId()); + node.setNodeId(input.getNodeId()); + node.setParams(input.getParams()); + node.setCreatedBy(input); + node.setComponentType(input.getComponentType()); + + ProjectFlowMySqlModel flow = projectFlowService.findOne(input.getFlowId()); + node.setProjectId(flow.getProjectId()); + } + // If the node already exists, update it. + else { + // If the parameters have not changed, jump out. + if (input.getParams().equals(node.getParams())) { + + // Repeat the update, the DataIO data has not changed, + // but the previous operation may not be completed. In order to have a better experience, + // the feature selection component list with empty parameters is also returned. + if (node.getComponentType() == ComponentType.DataIO) { + List nodes = findNodesByFlowId(node.getFlowId()); + + list = nodes.stream().filter(x -> Objects.requireNonNull(Components.get(x.getComponentType())).canSelectFeatures() && x.getParams() == null) + .map(x -> ModelMapper.map(x, ProjectFlowNodeOutputModel.class)) + .collect(Collectors.toList()); + } + return list; + } + + node.setParams(input.getParams()); + node.setParamsVersion(System.currentTimeMillis()); + node.setUpdatedBy(input); + } + + // If the parameters of the DataIO node have changed, + // the node parameters with selective features in the child nodes need to be blank. + if (node.getComponentType() == ComponentType.DataIO) { + List nodes = findNodesByFlowId(node.getFlowId()); + for (ProjectFlowNodeMySqlModel flowNode : nodes) { + if (Objects.requireNonNull(Components.get(flowNode.getComponentType())).canSelectFeatures()) { + flowNode.setParams(null); + projectFlowNodeRepository.save(flowNode); + list.add(ModelMapper.map(flowNode, ProjectFlowNodeOutputModel.class)); + } + } + } + + projectFlowNodeRepository.save(node); + + gatewayService.syncToOtherFormalProjectMembers(node.getProjectId(), input, UpdateApi.class); + + return list; + } + + public ProjectFlowNodeMySqlModel findOne(String flowId, String nodeId) { + Specification where = Where + .create() + .equal("flowId", flowId) + .equal("nodeId", nodeId) + .build(ProjectFlowNodeMySqlModel.class); + + return projectFlowNodeRepository.findOne(where).orElse(null); + } + + /** + * Check whether the current node has an evaluation node type + */ + public boolean checkExistEvaluationComponent(CheckExistEvaluationComponentApi.Input input) throws StatusCodeWithException { + // Whether it is oot mode (click into the canvas in the model list, that is, + // oot mode, in oot mode, only check whether there is an evaluation node) + boolean isOotMode = StringUtil.isNotEmpty(input.getJobId()); + if (isOotMode) { + JobMySqlModel jobMySqlModel = jobService.findByJobId(input.getJobId(), JobMemberRole.promoter); + if (null == jobMySqlModel) { + throw new StatusCodeWithException("浣滀笟淇℃伅涓嶅瓨鍦ㄣ", StatusCode.DATA_NOT_FOUND); + } + // Find out all the task information of the promoter under the job + List totalTaskMySqlModelList = taskService.listByJobId(jobMySqlModel.getJobId(), jobMySqlModel.getMyRole()); + if (CollectionUtils.isEmpty(totalTaskMySqlModelList)) { + throw new StatusCodeWithException("浠诲姟淇℃伅涓嶅瓨鍦ㄣ", StatusCode.DATA_NOT_FOUND); + } + + // Find out the task ID of the current model + List myRoleTaskMySqlModelList = taskService.findAll(jobMySqlModel.getJobId(), input.getModelNodeId(), jobMySqlModel.getMyRole()); + if (CollectionUtils.isEmpty(myRoleTaskMySqlModelList)) { + throw new StatusCodeWithException("妯″瀷浠诲姟淇℃伅涓嶅瓨鍦ㄣ", StatusCode.DATA_NOT_FOUND); + } + + // Find out all the branch nodes of the model with the same origin and judge whether there is an evaluation node in all nodes + String modelTaskId = myRoleTaskMySqlModelList.get(0).getTaskId(); + List resultList = taskService.baseFindHomologousBranch(totalTaskMySqlModelList, modelTaskId); + for (TaskMySqlModel taskMySqlModel : resultList) { + if (ComponentType.Evaluation == taskMySqlModel.getTaskType()) { + return true; + } + } + return false; + + } + ProjectFlowMySqlModel projectFlowMySqlModel = projectFlowService.findOne(input.getFlowId()); + if (null == projectFlowMySqlModel) { + throw new StatusCodeWithException("娴佺▼淇℃伅涓嶅瓨鍦ㄣ", StatusCode.DATA_NOT_FOUND); + } + List flowNodeMySqlModelList = projectFlowNodeService.findNodesByFlowId(input.getFlowId()); + if (CollectionUtils.isEmpty(flowNodeMySqlModelList)) { + throw new StatusCodeWithException("娴佺▼鑺傜偣淇℃伅涓嶅瓨鍦ㄣ", StatusCode.DATA_NOT_FOUND); + } + + FlowGraph flowGraph = new FlowGraph(projectFlowMySqlModel.getFederatedLearningType(), flowNodeMySqlModelList); + FlowGraphNode node = flowGraph.getNode(input.getNodeId()); + if (null == node) { + throw new StatusCodeWithException("鑺傜偣淇℃伅涓嶅瓨鍦ㄣ", StatusCode.DATA_NOT_FOUND); + } + + // Find related parent node types + FlowGraphNode preModelNode = flowGraph.findOneNodeFromParent(node, ComponentType.Evaluation); + return null != preModelNode; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectFlowService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectFlowService.java" new file mode 100644 index 0000000000000000000000000000000000000000..0c1db69e7180a4f1e2091756169e6bde2e62424f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectFlowService.java" @@ -0,0 +1,658 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.api.project.flow.*; +import com.welab.wefe.board.service.api.project.job.OnJobFinishedApi; +import com.welab.wefe.board.service.api.project.modeling.DetailApi; +import com.welab.wefe.board.service.api.project.modeling.QueryApi; +import com.welab.wefe.board.service.component.Components; +import com.welab.wefe.board.service.database.entity.flow.FlowTemplateMySqlModel; +import com.welab.wefe.board.service.database.entity.job.*; +import com.welab.wefe.board.service.database.repository.JobRepository; +import com.welab.wefe.board.service.database.repository.ProjectFlowNodeRepository; +import com.welab.wefe.board.service.database.repository.ProjectFlowRepository; +import com.welab.wefe.board.service.database.repository.TaskResultRepository; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.job.ProjectFlowNodeOutputModel; +import com.welab.wefe.board.service.dto.entity.job.TaskResultOutputModel; +import com.welab.wefe.board.service.dto.entity.modeling_config.ModelingInfoOutputModel; +import com.welab.wefe.board.service.dto.entity.project.ProjectFlowListOutputModel; +import com.welab.wefe.board.service.dto.entity.project.ProjectFlowProgressOutputModel; +import com.welab.wefe.board.service.onlinedemo.OnlineDemoBranchStrategy; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.*; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.DateUtil; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.web.CurrentAccount; +import com.welab.wefe.common.web.dto.ApiResult; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author zane.luo + */ +@Service +public class ProjectFlowService extends AbstractService { + + protected final Logger LOG = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private FlowTemplateService flowTemplateService; + @Autowired + private ProjectService projectService; + @Autowired + private ProjectFlowNodeService projectFlowNodeService; + @Autowired + private JobService jobService; + @Autowired + private TaskService taskService; + @Autowired + private ProjectMemberService projectMemberService; + @Autowired + private ProjectFlowRepository projectFlowRepo; + @Autowired + private ProjectFlowNodeRepository projectFlowNodeRepository; + @Autowired + private JobRepository jobRepository; + @Autowired + private TaskResultRepository taskResultRepository; + + @Autowired + private ModelOotRecordService modelOotRecordService; + + /** + * delete flow + */ + @Transactional(rollbackFor = Exception.class) + public synchronized void delete(DeleteApi.Input input) throws StatusCodeWithException { + ProjectFlowMySqlModel flow = findOne(input.getFlowId()); + if (flow == null) { + return; + } + + OnlineDemoBranchStrategy.hackOnDelete(input, flow, "鍙兘鍒犻櫎鑷繁鍒涘缓鐨勬祦绋嬨"); + + ProjectMySqlModel project = projectService.findByProjectId(flow.getProjectId()); + + if (!input.fromGateway() && !flow.getCreatedBy().equals(CurrentAccount.id()) && !CurrentAccount.isAdmin()) { + throw new StatusCodeWithException("鍙兘鍒犻櫎鑷繁鍒涘缓鐨勬祦绋嬨", StatusCode.UNSUPPORTED_HANDLE); + } + + flow.setDeleted(true); + flow.setUpdatedBy(input); + projectFlowRepo.save(flow); + + projectService.updateFlowStatusStatistics(flow.getProjectId()); + + gatewayService.syncToNotExistedMembers(project.getProjectId(), input, DeleteApi.class); + } + + /** + * create flow + */ + @Transactional(rollbackFor = Exception.class) + public synchronized String addFlow(AddFlowApi.Input input) throws StatusCodeWithException { + + ProjectMySqlModel project = projectService.findByProjectId(input.getProjectId()); + + if (!input.fromGateway() && project.getMyRole() != JobMemberRole.promoter) { + throw new StatusCodeWithException("鍙湁 promoter 鎵嶈兘鍒涘缓娴佺▼", StatusCode.ILLEGAL_REQUEST); + } + + ProjectMemberMySqlModel member = projectMemberService.findOneByMemberId(input.getProjectId(), + CacheObjects.getMemberId(), JobMemberRole.promoter); + if (!input.fromGateway()) { + if (member == null || member.isExited()) { + throw new StatusCodeWithException("闈為」鐩垚鍛樹笉鑳芥柊寤烘祦绋", StatusCode.ILLEGAL_REQUEST); + } + } + + if (!input.fromGateway() && member.getAuditStatus() != AuditStatus.agree) { + throw new StatusCodeWithException("闈炴寮忔垚鍛樹笉鑳芥柊寤烘祦绋", StatusCode.ILLEGAL_REQUEST); + } + + if (!input.fromGateway()) { + input.setFlowId(UUID.randomUUID().toString().replaceAll("-", "")); + } + + ProjectFlowMySqlModel flow = new ProjectFlowMySqlModel(); + flow.setFederatedLearningType(input.getFederatedLearningType()); + flow.setCreatedBy(input); + flow.setProjectId(input.getProjectId()); + flow.setFlowId(input.getFlowId()); + flow.setFlowName(input.getName()); + flow.setFlowDesc(input.getDesc()); + flow.setFlowStatus(ProjectFlowStatus.editing); + flow.setMyRole(input.fromGateway() ? project.getMyRole() : JobMemberRole.promoter); + flow.setCreatorMemberId(input.fromGateway() ? input.callerMemberInfo.getMemberId() : CacheObjects.getMemberId()); + + if (StringUtils.isNotBlank(input.getTemplateId())) { + FlowTemplateMySqlModel template = flowTemplateService.findById(input.getTemplateId()); + if (template == null) { + throw new StatusCodeWithException("鏈壘鍒扮浉搴旂殑娴佺▼妯℃澘锛", StatusCode.ILLEGAL_REQUEST); + } else { + flow.setGraph(template.getGraph()); + flow.setFederatedLearningType(input.isOotMode() ? input.getFederatedLearningType() : template.getFederatedLearningType()); + + } + } + projectFlowRepo.save(flow); + + projectService.updateFlowStatusStatistics(input.getProjectId()); + + gatewayService.syncToOtherFormalProjectMembers(flow.getProjectId(), input, AddFlowApi.class); + + if (!input.fromGateway() && StringUtils.isNotBlank(input.getTemplateId())) { + UpdateFlowGraphApi.Input updateFlowGraphInput = new UpdateFlowGraphApi.Input(); + updateFlowGraphInput.setFlowId(flow.getFlowId()); + updateFlowGraphInput.setGraph(flow.getGraph()); + updateFlowGraph(updateFlowGraphInput); + } + + return flow.getFlowId(); + } + + /** + * update flow - basic info + */ + @Transactional(rollbackFor = Exception.class) + public synchronized void updateFlowBaseInfo(UpdateFlowBaseInfoApi.Input input) throws StatusCodeWithException { + ProjectFlowMySqlModel flow = projectFlowRepo.findOne("flowId", input.getFlowId(), ProjectFlowMySqlModel.class); + if (flow == null) { + throw new StatusCodeWithException("鏈壘鍒拌娴佺▼", StatusCode.ILLEGAL_REQUEST); + } + if (input.getFederatedLearningType() != null + && flow.getFederatedLearningType() != input.getFederatedLearningType()) { + throw new StatusCodeWithException("璁粌绫诲瀷涓嶅厑璁告洿鏀", StatusCode.ILLEGAL_REQUEST); + } +// List nodes = projectFlowNodeService.findNodesByFlowId(flow.getFlowId()); +// if (nodes != null && !nodes.isEmpty()) { +// for (ProjectFlowNodeMySqlModel node : nodes) { +// if (node.getComponentType().getFederatedLearningTypes() != null && !node.getComponentType() +// .getFederatedLearningTypes().contains(input.getFederatedLearningType())) { +// throw new StatusCodeWithException("璁粌绫诲瀷閫夋嫨閿欒锛岃鍏堢Щ闄ょ粍浠 銆" + node.getComponentType().getLabel() + "銆", +// StatusCode.ILLEGAL_REQUEST); +// } +// } +// } +// flow.setFederatedLearningType(input.getFederatedLearningType()); + flow.setFlowName(input.getName()); + flow.setFlowDesc(input.getDesc()); + flow.setUpdatedBy(input); + + projectFlowRepo.save(flow); + + gatewayService.syncToOtherFormalProjectMembers(flow.getProjectId(), input, UpdateFlowBaseInfoApi.class); + } + + /** + * update flow graph + */ + @Transactional(rollbackFor = Exception.class) + public synchronized void updateFlowGraph(UpdateFlowGraphApi.Input input) throws StatusCodeWithException { + + ProjectFlowMySqlModel flow = findOne(input.getFlowId()); + if (flow == null) { + throw new StatusCodeWithException("鏈壘鍒扮浉搴旂殑娴佺▼锛", StatusCode.ILLEGAL_REQUEST); + } + + flow.setGraph(input.getGraph()); + flow.setUpdatedBy(input); + projectFlowRepo.save(flow); + + updateFlowStatus(input.getFlowId(), ProjectFlowStatus.editing); + + // Create a component corresponding to the flow + JSONObject graph = JSON.parseObject(input.getGraph()); + JSONArray nodes = graph.getJSONArray("nodes"); + JSONArray edges = graph.getJSONArray("edges"); + + // List of nodes to save to the database + List newNodes = new ArrayList<>(); + + // create ProjectFlowNodeMySqlModel + for (int i = 0; i < nodes.size(); i++) { + + ProjectFlowNodeMySqlModel node = graphNodeToFlowNode( + flow.getProjectId(), + flow.getFlowId(), + nodes.getJSONObject(i) + ); + + if (node == null) { + continue; + } + + newNodes.add(node); + } + + Map> parentNodeIdSetMap = new HashMap<>(); + + // update parent node id + for (int i = 0; i < edges.size(); i++) { + JSONObject edge = edges.getJSONObject(i); + + String source = edge.getString("source"); + String target = edge.getString("target"); + + ProjectFlowNodeMySqlModel node = newNodes + .stream() + .filter(x -> target.equals(x.getNodeId())) + .findFirst() + .orElse(null); + + if (node != null) { + node.setStartNode(false); + + if ("start".equals(source)) { + node.setStartNode(true); + } else { + if (!parentNodeIdSetMap.containsKey(node.getNodeId())) { + parentNodeIdSetMap.put(node.getNodeId(), new TreeSet<>()); + } + TreeSet parentIds = parentNodeIdSetMap.get(node.getNodeId()); + parentIds.add(source); + } + + } + } + + // Save all nodes + newNodes.forEach(x -> { + String beforeParentIds = x.getParentNodeIdList(); + String nowParentIds = parentNodeIdSetMap.containsKey(x.getNodeId()) + ? StringUtils.join(parentNodeIdSetMap.get(x.getNodeId()), ",") + : null; + + // If the parent node changes, reset its parameter version number. + if (!Objects.equals(beforeParentIds, nowParentIds)) { + x.setParamsVersion(System.currentTimeMillis()); + } + + x.setParentNodeIdList(nowParentIds); + projectFlowNodeRepository.save(x); + }); + + + // Remove nodes that are not in the graph + List nodeIds = newNodes.stream().map(x -> x.getNodeId()).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(nodeIds)) { + projectFlowNodeRepository.deleteNotInNodeIds(flow.getFlowId(), nodeIds); + } + + gatewayService.syncToOtherFormalProjectMembers(flow.getProjectId(), input, UpdateFlowGraphApi.class); + + } + + + /** + * Create a ProjectFlowNodeMySqlModel object according to the node information transmitted from the front + */ + private ProjectFlowNodeMySqlModel graphNodeToFlowNode(String projectId, String flowId, JSONObject input) { + String nodeId = input.getString("id"); + JSONObject data = input.getJSONObject("data"); + + if ("system".equals(data.getString("nodeType"))) { + return null; + } + + ProjectFlowNodeMySqlModel node = projectFlowNodeRepository.findByNodeId(flowId, nodeId); + + // is new + if (node == null) { + node = new ProjectFlowNodeMySqlModel(); + node.setCreatedBy(CurrentAccount.id()); + } else { + node.setUpdatedBy(CurrentAccount.id()); + } + + node.setComponentType(ComponentType.valueOf(data.getString("componentType"))); + node.setFlowId(flowId); + node.setNodeId(nodeId); + node.setProjectId(projectId); + + + return node; + + } + + + public ProjectFlowMySqlModel findOne(String flowId) { + return projectFlowRepo.findOne("flowId", flowId, ProjectFlowMySqlModel.class); + } + + public PagingOutput query(QueryFlowListApi.Input input) { + + Specification where = Where + .create() + .equal("projectId", input.getProjectId()) + .equal("deleted", input.isDeleted()) + .build(ProjectFlowMySqlModel.class); + + PagingOutput page = projectFlowRepo.paging(where, input, ProjectFlowListOutputModel.class); + page + .getList() + .forEach(x -> { + + JobMySqlModel lastJob = jobRepository.findLastByFlowId(x.getFlowId(), x.getMyRole().name()); + if (lastJob != null) { + x.setJobProgress(lastJob.getProgress()); + } + x.setIsCreator(CacheObjects.isCurrentMember(x.getCreatedBy())); + }); + return page; + } + + + public List findFlowsByProjectId(String projectId) { + Specification where = Where + .create() + .equal("projectId", projectId) + .build(ProjectFlowMySqlModel.class); + + return projectFlowRepo.findAll(where); + } + + /** + * copy flow + */ + @Transactional(rollbackFor = Exception.class) + public synchronized void copy(CopyFlowApi.Input input) throws StatusCodeWithException { + + List projectMembers = projectMemberService.listFormalProjectMembers(input.getTargetProjectId()); + ProjectMemberMySqlModel targetPromoterProjectMember = projectMembers + .stream() + .filter(x -> x.getMemberRole() == JobMemberRole.promoter && StringUtils.isEmpty(x.getInviterId())) + .findFirst() + .orElse(null); + + if (targetPromoterProjectMember == null) { + throw new StatusCodeWithException(StatusCode.DATA_NOT_FOUND, "鎵句笉鍒皃romoter鎴愬憳淇℃伅"); + } + + ProjectMySqlModel targetProjectMySqlModel = projectService.findByProjectId(input.getTargetProjectId()); + if (null == targetProjectMySqlModel) { + throw new StatusCodeWithException(StatusCode.DATA_NOT_FOUND, "鎵句笉鍒扮洰鏍囬」鐩俊鎭"); + } + + ProjectFlowMySqlModel sourceProjectFlow = findOne(input.getSourceFlowId()); + if (sourceProjectFlow == null) { + // If the source replication flow cannot be found locally, obtain the source flow from the initiator + ApiResult flowDetail = gatewayService.sendToBoardRedirectApi(targetPromoterProjectMember.getMemberId(), JobMemberRole.provider, new DetailFlowApi.Input(input.getSourceFlowId()), DetailFlowApi.class); + sourceProjectFlow = JSONObject.toJavaObject(JObject.create(flowDetail.data), ProjectFlowMySqlModel.class); + } + if (sourceProjectFlow == null) { + throw new StatusCodeWithException(StatusCode.DATA_NOT_FOUND, "鎵句笉鍒板師娴佺▼淇℃伅锛" + input.getSourceFlowId()); + } + + // Get the node information of the original process + ApiResult sourceProjectFlowNodeListApiResult = gatewayService.sendToBoardRedirectApi(targetPromoterProjectMember.getMemberId(), JobMemberRole.provider, new QueryFlowNodeListApi.Input(input.getSourceFlowId()), QueryFlowNodeListApi.class); + JObject sourceProjectFlowNodeDataObj = JObject.create(sourceProjectFlowNodeListApiResult.data); + List sourceProjectFlowNodeList = JObject.parseArray(sourceProjectFlowNodeDataObj.getStringByPath("list")).toJavaList(ProjectFlowNodeOutputModel.class); + if (CollectionUtils.isEmpty(sourceProjectFlowNodeList)) { + throw new StatusCodeWithException(StatusCode.DATA_NOT_FOUND, "鎵句笉鍒板師娴佺▼鑺傜偣淇℃伅锛" + input.getSourceFlowId()); + } + + // Create target flow + ProjectFlowMySqlModel targetProjectFlow = new ProjectFlowMySqlModel(); + BeanUtils.copyProperties(sourceProjectFlow, targetProjectFlow); + targetProjectFlow.setId(UUID.randomUUID().toString().replaceAll("-", "")); + targetProjectFlow.setProjectId(input.getTargetProjectId()); + targetProjectFlow.setFlowName(StringUtils.isEmpty(input.getFlowRename()) ? ("Copy of " + targetProjectFlow.getFlowName()) : input.getFlowRename()); + targetProjectFlow.setFlowId(input.fromGateway() ? input.getNewFlowId() : UUID.randomUUID().toString().replaceAll("-", "")); + targetProjectFlow.setMyRole(targetProjectMySqlModel.getMyRole()); + targetProjectFlow.setFlowStatus(ProjectFlowStatus.editing); + targetProjectFlow.setCreatedTime(new Date()); + targetProjectFlow.setCreatedBy(input); + targetProjectFlow.setCreatorMemberId(sourceProjectFlow.getCreatorMemberId()); + projectFlowRepo.save(targetProjectFlow); + + for (ProjectFlowNodeOutputModel sourceProjectFlowNode : sourceProjectFlowNodeList) { + ProjectFlowNodeMySqlModel targetProjectFlowNode = new ProjectFlowNodeMySqlModel(); + BeanUtils.copyProperties(sourceProjectFlowNode, targetProjectFlowNode); + targetProjectFlowNode.setId(UUID.randomUUID().toString().replaceAll("-", "")); + targetProjectFlowNode.setProjectId(input.getTargetProjectId()); + targetProjectFlowNode.setFlowId(targetProjectFlow.getFlowId()); + targetProjectFlowNode.setParams(JObject.create(sourceProjectFlowNode.getParams()).toJSONString()); + // Copy in different projects, clear node parameters + if (!input.getTargetProjectId().equals(sourceProjectFlow.getProjectId())) { + targetProjectFlowNode.setParams(null); + } + targetProjectFlowNode.setCreatedBy(input); + targetProjectFlowNode.setCreatedTime(new Date()); + projectFlowNodeRepository.save(targetProjectFlowNode); + } + + projectService.updateFlowStatusStatistics(input.getTargetProjectId()); + + //Notify other members of the project to synchronize the new flow + input.setNewFlowId(targetProjectFlow.getFlowId()); + gatewayService.syncToOtherFormalProjectMembers(input.getTargetProjectId(), input, CopyFlowApi.class); + } + + + public void flowFinished(OnJobFinishedApi.Input input) throws StatusCodeWithException { + List jobs = jobService.listByJobId(input.getJobId()); + JobMySqlModel job = null; + + if (CollectionUtils.isNotEmpty(jobs)) { + job = jobs.get(0); + } + if (job != null) { + projectService.updateFlowStatusStatistics(job.getProjectId()); + } + } + + public void updateFlowStatus(String flowId, ProjectFlowStatus projectFlowStatus) throws StatusCodeWithException { + + ProjectFlowMySqlModel flow = findOne(flowId); + if (flow == null) { + throw new StatusCodeWithException(StatusCode.DATA_NOT_FOUND, "鎵句笉鍒伴渶瑕佹洿鏂扮殑娴佺▼锛"); + } + + flow.setFlowStatus(projectFlowStatus); + flow.setStatusUpdatedTime(new Date()); + flow.setUpdatedBy(CurrentAccount.id()); + projectFlowRepo.save(flow); + + projectService.updateFlowStatusStatistics(flow.getProjectId()); + } + + /** + * Query the successfully modeled flow information in the project by page + */ + public PagingOutput queryModelingInfo(QueryApi.Input input) { + + Specification where = Where + .create() + .equal("projectId", input.getProjectId()) + .equal("servingModel", true) + .equal("jobId", input.getJobId()) + .equal("flowId", input.getFlowId()) + .equal("componentType", input.getComponentType()) + .orderBy("createdTime", OrderBy.desc) + .build(TaskResultMySqlModel.class); + + PagingOutput pagingOutput = taskResultRepository.paging(where, input, ModelingInfoOutputModel.class); + + pagingOutput.getList().forEach(x -> { + ProjectFlowMySqlModel flow = findOne(x.getFlowId()); + if (flow != null) { + x.setFlowName(flow.getFlowName()); + x.setComponentName(x.getComponentType().getLabel()); + } + }); + + return pagingOutput; + } + + /** + * Query model details: including model evaluation results. + */ + public TaskResultOutputModel findModelingResult(DetailApi.Input input) { + + TaskResultOutputModel result = null; + + TaskMySqlModel modelTask = taskService.findOne(input); + + if (modelTask == null) { + return null; + } + + List evaluationTasks = taskService.findAll(input.getJobId(), modelTask.getFlowId(), ComponentType.Evaluation); + + evaluationTasks.sort(Comparator.comparingInt(x -> x.getRole().getIndex())); + + if (CollectionUtils.isNotEmpty(evaluationTasks)) { + TaskMySqlModel evaluationTask = evaluationTasks.get(0); + if (evaluationTask != null) { + result = Components + .get(ComponentType.Evaluation) + .getTaskResult(evaluationTask.getTaskId(), input.getType()); + } + } else { + result = Components + .get(modelTask.getTaskType()) + .getTaskResult(modelTask.getTaskId(), input.getType()); + } + + return result; + } + + /** + * if DataIO node params is not null,Returns the node with empty params in the flow + */ + public List getParamsIsNullFlowNodes(String flowId) { + List flowNodes = projectFlowNodeService.findNodesByFlowId(flowId); + + ProjectFlowNodeMySqlModel dataIONode = flowNodes.stream().filter(x -> x.getComponentType() == ComponentType.DataIO).findFirst().orElse(null); + + if (dataIONode != null && StringUtils.isNotEmpty(dataIONode.getParams())) { + + return flowNodes + .stream() + .filter(x -> x.getParams() == null && Objects.requireNonNull(Components.get(x.getComponentType())).canSelectFeatures()) + .map(x -> ModelMapper.map(x, ProjectFlowNodeOutputModel.class)) + .collect(Collectors.toList()); + } + + return new ArrayList<>(); + } + + public List getProgress(List flowIdList) { + Specification where = Where + .create() + .in("flowId", flowIdList.stream().map(x -> (Object) x).collect(Collectors.toList())) + .build(ProjectFlowMySqlModel.class); + + return projectFlowRepo + .findAll(where) + .stream() + .map(x -> { + ProjectFlowProgressOutputModel output = ModelMapper.map(x, ProjectFlowProgressOutputModel.class); + JobMySqlModel lastJob = jobRepository.findLastByFlowId(x.getFlowId(), x.getMyRole().name()); + if (lastJob != null) { + output.setJobProgress(lastJob.getProgress()); + } + return output; + }) + .collect(Collectors.toList()); + + } + + /** + * add oot flow + */ + public AddOotFlowApi.Output addOotFlow(AddOotFlowApi.Input input) throws StatusCodeWithException { + List models = flowTemplateService.query(); + List jobMySqlModelList = jobService.listByJobId(input.getOotJobId()); + if (CollectionUtils.isEmpty(jobMySqlModelList)) { + throw new StatusCodeWithException("鎵句笉鍒板師浣滀笟淇℃伅", StatusCode.DATA_NOT_FOUND); + } + JobMySqlModel jobMySqlModel = jobMySqlModelList.stream().filter(x -> JobMemberRole.promoter.equals(x.getMyRole())).findFirst().orElse(null); + if (null == jobMySqlModel) { + throw new StatusCodeWithException("鍙湁 promoter 鎵嶈兘鍒涘缓娴佺▼", StatusCode.ILLEGAL_REQUEST); + } + + if (FederatedLearningType.mix.equals(jobMySqlModel.getFederatedLearningType())) { + throw new StatusCodeWithException("鏆傛椂涓嶆敮鎸佹贩鍚堣仈閭︾被鍨", StatusCode.UNSUPPORTED_HANDLE); + } + + FlowTemplateMySqlModel ootFlowTemplateMySqlModel = models.stream().filter(x -> "oot".equals(x.getEnname())).findFirst().orElse(null); + if (null == ootFlowTemplateMySqlModel) { + throw new StatusCodeWithException("鎵句笉鍒版墦鍒嗛獙璇佺粍浠舵ā鏉", StatusCode.DATA_NOT_FOUND); + } + + AddOotFlowApi.Output output = new AddOotFlowApi.Output(); + // is oot? + ModelOotRecordMysqlModel modelOotRecordMysqlModel = null; + modelOotRecordMysqlModel = modelOotRecordService.findByJobIdAndModelFlowNodeId(input.getOotJobId(), + input.getOotModelFlowNodeId()); + if (null != modelOotRecordMysqlModel) { + ProjectFlowMySqlModel projectFlowMySqlModel = findOne(modelOotRecordMysqlModel.getFlowId()); + if (null != projectFlowMySqlModel && !projectFlowMySqlModel.getDeleted()) { + output.setFlowId(modelOotRecordMysqlModel.getFlowId()); + return output; + } + } + + AddFlowApi.Input addFlowInput = new AddFlowApi.Input(); + addFlowInput.setProjectId(jobMySqlModel.getProjectId()); + addFlowInput.setTemplateId(ootFlowTemplateMySqlModel.getId()); + addFlowInput.setFederatedLearningType(jobMySqlModel.getFederatedLearningType()); + addFlowInput.setName(jobMySqlModel.getName() + "- [鎵撳垎楠岃瘉-" + DateUtil.toStringYYYY_MM_DD_HH_MM_SS2(new Date()).substring(11, 19) + "]"); + addFlowInput.setOotMode(true); + output.setFlowId(addFlow(addFlowInput)); + + modelOotRecordMysqlModel = (null != modelOotRecordMysqlModel ? modelOotRecordMysqlModel : new ModelOotRecordMysqlModel()); + modelOotRecordMysqlModel.setFlowId(output.getFlowId()); + modelOotRecordMysqlModel.setOotJobId(input.getOotJobId()); + modelOotRecordMysqlModel.setOotModelFlowNodeId(input.getOotModelFlowNodeId()); + modelOotRecordService.save(modelOotRecordMysqlModel); + + return output; + } + + + public List getFlowNodes(String flowId) { + List flowNodes = projectFlowNodeService.findNodesByFlowId(flowId); + if (CollectionUtils.isEmpty(flowNodes)) { + return new ArrayList<>(); + } + return flowNodes + .stream() + .map(x -> ModelMapper.map(x, ProjectFlowNodeOutputModel.class)) + .collect(Collectors.toList()); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectMemberAuditService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectMemberAuditService.java" new file mode 100644 index 0000000000000000000000000000000000000000..6229fab301649bece41538e5aa002d0e67c1a0e0 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectMemberAuditService.java" @@ -0,0 +1,207 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.api.project.member.audit.AuditApi; +import com.welab.wefe.board.service.database.entity.job.ProjectMemberAuditMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectMemberMySqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectMySqlModel; +import com.welab.wefe.board.service.database.repository.*; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.exception.StatusCodeWithException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; + +/** + * @author zane.luo + */ +@Service +public class ProjectMemberAuditService { + + @Autowired + ProjectRepository projectRepo; + @Autowired + ProjectService projectService; + @Autowired + ProjectMemberRepository projectMemberRepo; + + @Autowired + ProjectMemberService projectMemberService; + + @Autowired + ProjectDataSetRepository projectDataSetRepo; + + @Autowired + ProjectDataSetService projectDataSetService; + + @Autowired + DataSetRepository dataSetRepository; + + @Autowired + GatewayService gatewayService; + + @Autowired + ProjectMemberAuditRepository projectMemberAuditRepository; + + public List findAllAuditList(String projectId, String memberId) { + Where where = Where.create().equal("projectId", projectId).equal("memberId", memberId); + + Specification projectMemberAuditWhere = where + .build(ProjectMemberAuditMySqlModel.class); + + return projectMemberAuditRepository.findAll(projectMemberAuditWhere); + } + + /** + * Check whether all formal members in the project have agreed to add new people + * + * @param projectId project id + * @param memberId id of the audited member + */ + public boolean allMemberAgreed(String projectId, String memberId) { + Specification where = Where + .create() + .equal("projectId", projectId) + .equal("memberId", memberId) + .notEqual("auditResult", AuditStatus.agree) + .build(ProjectMemberAuditMySqlModel.class); + + return projectMemberAuditRepository.findAll(where).isEmpty(); + } + + /** + * audit newly added project members + *

+ * new provider + * call api: project/add/audit + *

+ * other + * project_member: result + * project_member_audit: result + */ + @Transactional(rollbackFor = Exception.class) + public synchronized void auditMember(AuditApi.Input input) throws StatusCodeWithException { + + ProjectMySqlModel project = projectService.findByProjectId(input.getProjectId()); + if (project == null) { + throw new StatusCodeWithException("鏈壘鍒扮浉搴旂殑椤圭洰锛", StatusCode.ILLEGAL_REQUEST); + } + + List needAuditMembers = projectMemberService.findListByMemberId(input.getProjectId(), + input.getMemberId()); + if (needAuditMembers == null || needAuditMembers.isEmpty()) { + throw new StatusCodeWithException("鏈壘鍒伴」鐩叧鑱旂殑member锛", StatusCode.ILLEGAL_REQUEST); + } + + ProjectMemberMySqlModel needAuditMember = needAuditMembers.stream() + .filter(s -> s.getAuditStatus() == AuditStatus.auditing && !s.isExited()).findFirst().get(); + + if (needAuditMember == null) { + throw new StatusCodeWithException("鏈壘鍒伴」鐩叧鑱旂殑member锛", StatusCode.ILLEGAL_REQUEST); + } + + String auditorId = input.fromGateway() ? input.callerMemberInfo.getMemberId() : CacheObjects.getMemberId(); + + // Since there is a situation where you model yourself and yourself, + // you may get two people here through the member Id. + List auditors = projectMemberService.findListByMemberId(input.getProjectId(), auditorId); + + if (auditors.stream().anyMatch(x -> !AuditStatus.agree.equals(x.getAuditStatus()))) { + throw new StatusCodeWithException("鍙湁姝e紡鎴愬憳鎵嶈兘瀵瑰叾浠栦汉杩涜瀹℃牳", StatusCode.ILLEGAL_REQUEST); + } + + // save audit result + ProjectMemberAuditMySqlModel model = findOne(input.getProjectId(), input.getMemberId(), auditorId); + model.setAuditComment(input.getAuditComment()); + model.setAuditResult(input.getAuditResult()); + model.setUpdatedBy(input); + projectMemberAuditRepository.save(model); + + gatewayService.syncToNotExistedMembers(input.getProjectId(), input, AuditApi.class); + + // audit completed: someone rejected + if (input.getAuditResult() == AuditStatus.disagree) { + projectMemberService + .updateProjectMember(needAuditMember, (x) -> { + x.setAuditStatus(AuditStatus.disagree); + x.setAuditStatusFromOthers(AuditStatus.disagree); + x.setAuditComment(input.getAuditComment()); + x.setExited(true); + return x; + }); + } + // audit completed: all formal members agree + else if (allMemberAgreed(input.getProjectId(), input.getMemberId())) { + projectMemberService + .updateProjectMember(needAuditMember, (x) -> { + x.setAuditStatus(AuditStatus.agree); + x.setAuditStatusFromOthers(AuditStatus.agree); + x.setAuditComment("瀹℃牳閫氳繃"); + x.setExited(false); + return x; + }); + + // Update project audit status + if (CacheObjects.getMemberId().equals(needAuditMember.getMemberId())) { + project.setAuditStatus(AuditStatus.agree); + project.setAuditStatusFromOthers(AuditStatus.agree); + project.setAuditComment(null); + project.setStatusUpdatedTime(new Date()); + projectRepo.save(project); + } + } + + } + + + /** + * Get an audit record + */ + public ProjectMemberAuditMySqlModel findOne(String projectId, String memberId, String auditorId) { + return projectMemberAuditRepository + .findOne( + Where + .create() + .equal("projectId", projectId) + .equal("memberId", memberId) + .equal("auditorId", auditorId) + .build(ProjectMemberAuditMySqlModel.class) + ) + .orElse(null); + } + + /** + * Get the review status of new members in the specified project + */ + public List listAll(String projectId, String memberId) { + return projectMemberAuditRepository + .findAll( + Where + .create() + .equal("projectId", projectId) + .equal("memberId", memberId) + .build(ProjectMemberAuditMySqlModel.class) + ); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectMemberService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectMemberService.java" new file mode 100644 index 0000000000000000000000000000000000000000..32c1dbec4e291fb0e83fd5d406ec2809e607fe9c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectMemberService.java" @@ -0,0 +1,390 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.api.project.member.AddApi; +import com.welab.wefe.board.service.api.project.member.ListApi; +import com.welab.wefe.board.service.database.entity.job.*; +import com.welab.wefe.board.service.database.repository.ProjectMemberAuditRepository; +import com.welab.wefe.board.service.database.repository.ProjectMemberRepository; +import com.welab.wefe.board.service.dto.entity.ProjectMemberInput; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.OrderBy; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.CurrentAccount; +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author zane.luo + */ +@Service +public class ProjectMemberService { + + protected final Logger LOG = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private ProjectMemberRepository projectMemberRepo; + @Autowired + private ProjectService projectService; + @Autowired + private GatewayService gatewayService; + @Autowired + private ProjectDataSetService projectDataSetService; + @Autowired + private JobService jobService; + @Autowired + private JobMemberService jobMemberService; + @Autowired + private ProjectMemberAuditRepository projectMemberAuditRepository; + + /** + * Add members to an existing project + *

+ * adder + * project_member: auditing + * project_member_audit: agree + *

+ * exist member + * project_member: auditing + * project_member_audit: auditing + *

+ * new member + * project: auditing + * project_member: auditing + */ + @Transactional(rollbackFor = Exception.class) + public synchronized void addMember(AddApi.Input input) throws StatusCodeWithException { + + List members = findListByProjectId(input.getProjectId()); + + for (ProjectMemberInput item : input.getMemberList()) { + if (checkExistMember(item.getMemberId(), members)) { + throw new StatusCodeWithException("鎮ㄦ娆℃坊鍔犵殑鎴愬憳 " + CacheObjects.getMemberName(item.getMemberId()) + " 宸插湪璇ラ」鐩腑锛屼笉鍙噸澶嶆坊鍔", StatusCode.PARAMETER_VALUE_INVALID); + } + JobMemberRole role = item.getMemberRole(); + if (role.equals(JobMemberRole.provider)) { + addProviderMember(input, item); + } else if (role.equals(JobMemberRole.promoter)) { + addPromoterMember(input, item); + } + // 鐢变簬璇ユ垚鍛樺彲鑳芥槸涔嬪墠瀹℃牳涓嶈繃鐒跺悗閲嶆柊娣诲姞鐨勶紝鎵浠ラ渶瑕佸皢杩欎釜鎴愬憳鐨勫巻鍙插鏍歌褰曢兘娓呴櫎鎺夈 + projectMemberAuditRepository.deleteAuditingRecord(input.getProjectId(), item.getMemberId()); + } + members = findListByProjectId(input.getProjectId()); + if (!checkMembers(members)) { + throw new StatusCodeWithException("鏀瑰彉椤圭洰绫诲瀷鏃朵笉鍏佽鏈夐噸澶嶆垚鍛樺瓨鍦ㄣ", StatusCode.PARAMETER_VALUE_INVALID); + } + + + /** + * Notify other members that there are new members waiting to join + */ + gatewayService.syncToNotExistedMembers(input.getProjectId(), input, AddApi.class); + + } + + /** + * @see AddApi.Input#checkAndStandardize() + */ + private boolean checkExistMember(String currentMemberId, List members) { + List promoters = members.stream() + .filter(x -> x.getMemberRole() == JobMemberRole.promoter && !x.isExited()).collect(Collectors.toList()); + Set promoterIds = new HashSet<>(); + promoters.forEach(p -> promoterIds.add(p.getMemberId())); + if (promoters.size() != promoterIds.size()) { + return true; + } + boolean mixFlag = promoters.size() >= 2; + for (ProjectMemberMySqlModel m : members) { + if (m.getMemberId().equals(currentMemberId) && mixFlag && !m.isExited()) { + return true; + } + } + return false; + } + + private boolean checkMembers(List members) { + members = members.stream().filter(x -> !x.isExited() && x.getAuditStatus() != AuditStatus.disagree) + .collect(Collectors.toList()); + List promoters = members.stream() + .filter(x -> x.getMemberRole() == JobMemberRole.promoter).collect(Collectors.toList()); + Set mIds = new HashSet<>(); + members.forEach(m -> mIds.add(m.getMemberId())); + boolean mixFlag = promoters.size() >= 2; + if (mixFlag && mIds.size() != members.size()) { + return false; + } + return true; + + } + + private void addPromoterMember(AddApi.Input input, ProjectMemberInput item) throws StatusCodeWithException { + + ProjectMemberMySqlModel member = findOneByMemberId(input.getProjectId(), item.getMemberId(), + JobMemberRole.promoter); + if (member == null) { + + member = new ProjectMemberMySqlModel(); + member.setProjectId(input.getProjectId()); + member.setCreatedBy(input); + member.setMemberId(item.getMemberId()); + member.setMemberRole(JobMemberRole.promoter); + } + AuditStatus auditStatus = AuditStatus.auditing; + + member.setExited(false); + member.setAuditStatus(auditStatus); + member.setAuditStatusFromMyself(auditStatus); + member.setAuditStatusFromOthers(null); + member.setAuditComment("宸查個璇凤紝绛夊緟 " + CacheObjects.getMemberName(member.getMemberId()) + " 鍚屾剰鍔犲叆銆"); + member.setInviterId(input.fromGateway() ? input.callerMemberInfo.getMemberId() : CacheObjects.getMemberId()); + projectMemberRepo.save(member); + + // The member鈥檚 history has been added to the project, + // and the historical data set status is unavailable. At this time, + // the review status of the member鈥檚 data set needs to be updated. + List dataSets = projectDataSetService.findDataSetList(input.getProjectId(), + item.getMemberId(), item.getMemberRole()); + AuditStatus finalAuditStatus = auditStatus; + dataSets.forEach(dataSet -> projectDataSetService.update(dataSet, x -> { + x.setAuditStatus(finalAuditStatus); + x.setAuditComment(""); + })); + + // If I was invited, I have to create/update the project. + if (CacheObjects.getMemberId().equals(member.getMemberId()) && input.fromGateway()) { + projectService.pullNewestProjectInfo( + input, + input.getProjectId(), + input.callerMemberInfo.getMemberId(), + JobMemberRole.promoter + ); + } + } + + private void addProviderMember(AddApi.Input input, ProjectMemberInput item) throws StatusCodeWithException { + + ProjectMemberMySqlModel member = findOneByMemberId(input.getProjectId(), item.getMemberId(), + JobMemberRole.provider); + + if (member == null) { + + member = new ProjectMemberMySqlModel(); + member.setProjectId(input.getProjectId()); + member.setCreatedBy(input); + member.setMemberId(item.getMemberId()); + member.setMemberRole(JobMemberRole.provider); + } + + AuditStatus auditStatus = AuditStatus.auditing; + + // If other members pull member + if (input.fromGateway()) { + // If the added member is the provider identity of the promoter, the review status is passed. + if (input.callerMemberInfo.getMemberRole() == JobMemberRole.promoter) { + if (input.callerMemberInfo.getMemberId().equals(member.getMemberId())) { + auditStatus = AuditStatus.agree; + } + } + } + // If I pull member by myself + else { + ProjectMySqlModel project = projectService.findByProjectId(input.getProjectId()); + // If the added member is the provider identity of the promoter, the review status is passed. + auditStatus = project.getMemberId().equals(member.getMemberId()) ? AuditStatus.agree : AuditStatus.auditing; + } + + member.setExited(false); + member.setAuditStatus(auditStatus); + member.setAuditStatusFromMyself(auditStatus); + member.setAuditStatusFromOthers(null); + member.setAuditComment("宸查個璇凤紝绛夊緟 " + CacheObjects.getMemberName(member.getMemberId()) + " 鍚屾剰鍔犲叆銆"); + member.setInviterId(input.fromGateway() ? input.callerMemberInfo.getMemberId() : CacheObjects.getMemberId()); + projectMemberRepo.save(member); + + // The member鈥檚 history has been added to the project, + // and the historical data set status is unavailable. At this time, + // the review status of the member鈥檚 data set needs to be updated. + List dataSets = projectDataSetService.findDataSetList(input.getProjectId(), + item.getMemberId(), item.getMemberRole()); + AuditStatus finalAuditStatus = auditStatus; + dataSets.forEach(dataSet -> projectDataSetService.update(dataSet, x -> { + x.setAuditStatus(finalAuditStatus); + x.setAuditComment(""); + })); + + // If I was invited, I have to create/update the project + if (CacheObjects.getMemberId().equals(member.getMemberId()) && input.fromGateway()) { + projectService.pullNewestProjectInfo( + input, + input.getProjectId(), + input.callerMemberInfo.getMemberId(), + JobMemberRole.provider + ); + } + } + + /** + * Get the list of official members in the project + */ + public List listFormalProjectMembers(String projectId) { + Specification where = Where + .create() + .equal("projectId", projectId) + .equal("auditStatus", AuditStatus.agree) + .equal("exited", false) + .build(ProjectMemberMySqlModel.class); + + return projectMemberRepo.findAll(where); + } + + /** + * Query ProjectMember based on the combination of conditions + */ + public List findListByProjectId(String projectId) { + Specification where = Where + .create() + .equal("projectId", projectId) + .orderBy("createdTime", OrderBy.asc) + .build(ProjectMemberMySqlModel.class); + + return projectMemberRepo.findAll(where); + } + + + /** + * Get information about a single project member + */ + public ProjectMemberMySqlModel findOneByMemberId(String projectId, String memberId, JobMemberRole role) { + + return projectMemberRepo.findOne( + Where + .create() + .equal("projectId", projectId) + .equal("memberId", memberId) + .equal("memberRole", role) + .build(ProjectMemberMySqlModel.class) + + ).orElse(null); + } + + /** + * Get member list based on memberId + *

+ * Note: Due to the fact that you and your own federation are modeled, + * you may get the list according to the memberId. + */ + public List findListByMemberId(String projectId, String memberId) { + + return projectMemberRepo.findAll( + Where + .create() + .equal("projectId", projectId) + .equal("memberId", memberId) + .build(ProjectMemberMySqlModel.class) + + ); + } + + /** + * Update some fields of the projectMember table + */ + public ProjectMemberMySqlModel updateProjectMember(ProjectMemberMySqlModel projectMemberMySqlModel, + Function func) { + if (projectMemberMySqlModel == null) { + return null; + } + + projectMemberMySqlModel = func.apply(projectMemberMySqlModel); + projectMemberMySqlModel.setUpdatedBy(CurrentAccount.id()); + + return projectMemberRepo.save(projectMemberMySqlModel); + } + + public ProjectMemberMySqlModel update(ProjectMemberMySqlModel projectMemberMySqlModel, Consumer func) { + if (projectMemberMySqlModel == null) { + return null; + } + + func.accept(projectMemberMySqlModel); + projectMemberMySqlModel.setUpdatedBy(CurrentAccount.id()); + + return projectMemberRepo.save(projectMemberMySqlModel); + + } + + public List findList(ListApi.Input input) throws StatusCodeWithException { + List projectMemberMySqlModelList = findListByProjectId(input.getProjectId()); + if (StringUtil.isEmpty(input.getOotJobId())) { + return projectMemberMySqlModelList; + } + + if (CollectionUtils.isEmpty(projectMemberMySqlModelList)) { + throw new StatusCodeWithException("鎵句笉鍒伴」鐩殑浠讳綍鍙備笌鏂逛俊鎭", StatusCode.DATA_NOT_FOUND); + } + JobMySqlModel jobMySqlModel = jobService.findByJobId(input.getOotJobId(), JobMemberRole.promoter); + if (null == jobMySqlModel) { + throw new StatusCodeWithException("鎵句笉鍒板師娴佺▼浠诲姟淇℃伅銆", StatusCode.DATA_NOT_FOUND); + } + + List jobMemberMySqlModelList = jobMemberService.findListByJobId(input.getOotJobId()); + if (CollectionUtils.isEmpty(jobMemberMySqlModelList)) { + throw new StatusCodeWithException("鎵句笉鍒板師娴佺▼浠讳綍鍙備笌鏂逛俊鎭", StatusCode.DATA_NOT_FOUND); + } + + List resultList = new ArrayList<>(); + for (JobMemberMySqlModel jobMemberMySqlModel : jobMemberMySqlModelList) { + if (jobMemberMySqlModel.getJobRole() == JobMemberRole.arbiter) { + continue; + } + String memberId = jobMemberMySqlModel.getMemberId(); + ProjectMemberMySqlModel projectMemberMySqlModel = projectMemberMySqlModelList.stream(). + filter(x -> x.getMemberId().equals(memberId)).findFirst().orElse(null); + if (FederatedLearningType.vertical.equals(jobMySqlModel.getFederatedLearningType())) { + if (null == projectMemberMySqlModel || projectMemberMySqlModel.isExited()) { + throw new StatusCodeWithException("鎴愬憳: " + CacheObjects.getMemberName(memberId) + " 宸查鍑, 绂佹鎵撳垎楠岃瘉", StatusCode.DATA_NOT_FOUND); + } + } + if (null != projectMemberMySqlModel) { + resultList.add(projectMemberMySqlModel); + } + } + + return resultList; + } + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectService.java" new file mode 100644 index 0000000000000000000000000000000000000000..39c70c8d5705e87743b2d5c6e9e86531ec556d84 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ProjectService.java" @@ -0,0 +1,1306 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.api.project.dataset.AddDataSetApi; +import com.welab.wefe.board.service.api.project.dataset.RemoveDataSetApi; +import com.welab.wefe.board.service.api.project.member.ExitProjectApi; +import com.welab.wefe.board.service.api.project.member.ListApi; +import com.welab.wefe.board.service.api.project.member.RemoveApi; +import com.welab.wefe.board.service.api.project.project.*; +import com.welab.wefe.board.service.database.entity.job.*; +import com.welab.wefe.board.service.database.repository.*; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.ProjectDataSetInput; +import com.welab.wefe.board.service.dto.entity.ProjectMemberInput; +import com.welab.wefe.board.service.dto.entity.project.*; +import com.welab.wefe.board.service.dto.vo.AuditStatusCounts; +import com.welab.wefe.board.service.dto.vo.RoleCounts; +import com.welab.wefe.board.service.onlinedemo.OnlineDemoBranchStrategy; +import com.welab.wefe.board.service.util.ModelMapper; +import com.welab.wefe.common.Convert; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.AuditStatus; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.ProjectFlowStatus; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.util.ThreadUtil; +import com.welab.wefe.common.web.CurrentAccount; +import com.welab.wefe.common.web.dto.AbstractApiInput; +import com.welab.wefe.common.web.dto.ApiResult; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author zane.luo + */ +@Service +public class ProjectService extends AbstractService { + + @Autowired + private ProjectMemberService projectMemberService; + + @Autowired + private ProjectDataSetService projectDataSetService; + + @Autowired + private ProjectFlowService projectFlowService; + + @Autowired + private ProjectFlowNodeService projectFlowNodeService; + + @Autowired + private JobService jobService; + + @Autowired + private ProjectService projectService; + + @Autowired + private ProjectRepository projectRepo; + + @Autowired + private ProjectMemberRepository projectMemberRepo; + + @Autowired + private ProjectDataSetRepository projectDataSetRepo; + + @Autowired + private DataSetService dataSetService; + + @Autowired + private ProjectMemberAuditRepository projectMemberAuditRepository; + @Autowired + ProjectMemberAuditService projectMemberAuditService; + + @Autowired + private ProjectFlowRepository projectFlowRepository; + + @Autowired + private ProjectFlowNodeRepository projectFlowNodeRepository; + + /** + * New Project + *

+ * promoter + * project: agree + * project_member: agree + *

+ * provider + * project: auditing + * project_member: auditing + */ + @Transactional(rollbackFor = Exception.class) + public synchronized String addProject(AddApi.Input input) throws StatusCodeWithException { + + if (!input.fromGateway()) { + // create projectId + input.setProjectId(UUID.randomUUID().toString().replaceAll("-", "")); + + ProjectMemberInput promoter = new ProjectMemberInput(); + promoter.setMemberRole(JobMemberRole.promoter); + promoter.setMemberId(CacheObjects.getMemberId()); + promoter.setDataSetList(input.getPromoterDataSetList()); + + input.getProviderList().forEach(x -> x.setMemberRole(JobMemberRole.provider)); + List members = new ArrayList<>(); + input.getProviderList().forEach(x -> members.add(x)); + input.setMembers(members); + if (input.getPromoterList() != null && CollectionUtils.isNotEmpty(input.getPromoterList())) { + input.getPromoterList().forEach(x -> x.setMemberRole(JobMemberRole.promoter)); + input.getMembers().addAll(0, input.getPromoterList().stream() + .filter(s -> !s.getMemberId().equals(promoter.getMemberId())).collect(Collectors.toList())); + } + input.getMembers().add(0, promoter); + } + + + ProjectMySqlModel project = new ProjectMySqlModel(); + project.setCreatedBy(input); + project.setMemberId(input.fromGateway() ? input.callerMemberInfo.getMemberId() : CacheObjects.getMemberId()); + project.setMyRole(input.fromGateway() ? input.getRole() : JobMemberRole.promoter); + project.setProjectId(input.getProjectId()); + project.setName(input.getName()); + project.setProjectDesc(input.getDesc()); + project.setAuditStatus(input.fromGateway() ? AuditStatus.auditing : AuditStatus.agree); + project.setStatusUpdatedTime(new Date()); + project.setProgress(0); + project.setProgressUpdatedTime(new Date()); + project.setUpdatedBy(input); + project.setAuditStatusFromMyself(input.fromGateway() ? AuditStatus.auditing : AuditStatus.agree); + project.setFlowStatusStatistics(JObject.create() + .append(ProjectFlowStatus.editing.name(), 0) + .append(ProjectFlowStatus.running.name(), 0) + .append(ProjectFlowStatus.finished.name(), 0).toJSONString()); + projectRepo.save(project); + + // create and save ProjectMember to database + for (ProjectMemberInput item : input.getMembers()) { + ProjectMemberMySqlModel member = new ProjectMemberMySqlModel(); + member.setProjectId(project.getProjectId()); + member.setCreatedBy(input); + member.setMemberId(item.getMemberId()); + member.setMemberRole(item.getMemberRole()); + + // I directly agree to a project initiated by myself + AuditStatus auditStatus = item.getMemberId().equals(project.getMemberId()) ? AuditStatus.agree : AuditStatus.auditing; + member.setAuditStatus(auditStatus); + member.setAuditStatusFromMyself(auditStatus); + member.setAuditComment(item.getMemberId().equals(project.getMemberId()) ? "椤圭洰鍒涘缓鑰" : null); + member.setInviterId(item.getMemberId().equals(project.getMemberId()) ? null + : input.fromGateway() ? input.callerMemberInfo.getMemberId() : CacheObjects.getMemberId()); + member.setFromCreateProject(true); + projectMemberRepo.save(member); + + // The pause of 2ms here is to generate the createdTime of each member in order, + // which is convenient for displaying in order on the interface. + ThreadUtil.sleep(2); + + + // save ProjectDataSet to database + for (ProjectDataSetInput dataSetInput : item.getDataSetList()) { + ProjectDataSetMySqlModel dataSet = new ProjectDataSetMySqlModel(); + dataSet.setProjectId(project.getProjectId()); + dataSet.setCreatedBy(input); + dataSet.setMemberId(dataSetInput.getMemberId()); + dataSet.setMemberRole(dataSetInput.getMemberRole()); + dataSet.setDataSetId(dataSetInput.getDataSetId()); + dataSet.setStatusUpdatedTime(new Date()); + dataSet.setAuditStatus(auditStatus); + dataSet.setSourceType(null); + + projectDataSetRepo.save(dataSet); + + // Update the usage count of the dataset in the project + if (auditStatus == AuditStatus.agree) { + dataSetService.updateUsageCountInProject(dataSet.getDataSetId()); + } + } + + } + + gatewayService.syncToNotExistedMembers(project.getProjectId(), input, AddApi.class); + + return project.getProjectId(); + + } + + + public DataInfoApi.Output getDataInfo(DataInfoApi.Input input) throws StatusCodeWithException { + + DataInfoApi.Output output = new DataInfoApi.Output(); + + ProjectMySqlModel project = projectRepo.findOne("projectId", input.getProjectId(), ProjectMySqlModel.class); + + if (project == null) { + throw new StatusCodeWithException("鏈壘鍒扮浉搴旂殑椤圭洰锛", StatusCode.DATA_NOT_FOUND); + } + + List projectMembers = projectMemberService.findListByProjectId(input.getProjectId()); + + List projectDataSets = new ArrayList<>(); + for (ProjectMemberMySqlModel projectMember : projectMembers) { + if (projectMember.getMemberRole() == JobMemberRole.provider) { + ProjectMemberMySqlModel sameData = projectMembers + .stream() + .filter(x -> x.getMemberId().equals(projectMember.getMemberId()) && x.getMemberRole() == JobMemberRole.promoter) + .findFirst().orElse(null); + if (sameData != null) { + continue; + } + } + List projectMemberDataSets = projectDataSetService + .findDataSetList(input.getProjectId(), projectMember.getMemberId(), projectMember.getMemberRole()); + projectDataSets.addAll(projectMemberDataSets); + } + + List projectFlows = projectFlowService.findFlowsByProjectId(input.getProjectId()); + + + List projectFlowNodes = new ArrayList<>(); + for (ProjectFlowMySqlModel projectFlow : projectFlows) { + + List projectFlowNodeList = projectFlowNodeService.findNodesByFlowId(projectFlow.getFlowId()); + projectFlowNodes.addAll(projectFlowNodeList); + } + + output.setProject(project); + output.setProjectMembers(projectMembers); + output.setProjectDataSets(projectDataSets); + output.setProjectFlows(projectFlows); + output.setProjectFlowNodes(projectFlowNodes); + + return output; + + } + + public ProjectOutputModel detail(String projectId) throws StatusCodeWithException { + ProjectMySqlModel project = projectRepo.findOne("projectId", projectId, ProjectMySqlModel.class); + if (project == null) { + throw new StatusCodeWithException("鏈壘鍒扮浉搴旂殑椤圭洰锛", StatusCode.ILLEGAL_REQUEST); + } + + + List allMemberList = projectMemberService + .findListByProjectId(projectId) + .parallelStream() + .map(x -> ModelMapper.map(x, ProjectDetailMemberOutputModel.class)) + .collect(Collectors.toList()); + + List allDataSetList = projectDataSetService.listRawDataSet(projectId, null, null, null); + + + // Populate the member's data set list + allMemberList.forEach(member -> + member.setDataSetList( + allDataSetList + .stream() + .filter(dataSet -> + dataSet != null + && dataSet.getMemberId().equals(member.getMemberId()) + && dataSet.getMemberRole() == member.getMemberRole() + ) + .collect(Collectors.toList()) + ) + ); + List promoters = allMemberList.stream() + .filter(x -> x.getMemberRole() == JobMemberRole.promoter).collect(Collectors.toList()); + ProjectDetailMemberOutputModel promoter = null; + if (promoters.size() == 1) { + promoter = allMemberList.stream().filter(x -> x.getMemberRole() == JobMemberRole.promoter).findFirst() + .orElse(null); + promoters = null; + } else if (promoters.size() > 1) { + promoter = allMemberList.stream() + .filter(x -> x.getMemberRole() == JobMemberRole.promoter && StringUtils.isBlank(x.getInviterId())) + .findFirst().orElse(null); + String creator = promoter.getMemberId(); + promoters = promoters.stream().filter(p -> !p.getMemberId().equals(creator)).collect(Collectors.toList()); + } + + List providers = allMemberList.stream() + .filter(x -> x.getMemberRole() == JobMemberRole.provider).collect(Collectors.toList()); + + ProjectOutputModel output = ModelMapper.map(project, ProjectOutputModel.class); + ProjectDetailMemberOutputModel newPromoter = JSONObject.parseObject(JSONObject.toJSONString(promoter), + ProjectDetailMemberOutputModel.class); + output.setPromoter(newPromoter); + output.setProviderList(providers); + output.setPromoterList(promoters); + output.setIsCreator( + promoter != null ? promoter.getMemberId().equalsIgnoreCase(CacheObjects.getMemberId()) : null); + output.setIsExited(!(allMemberList.stream() + .anyMatch(s -> s.getMemberId().equals(CacheObjects.getMemberId()) && !s.isExited()))); + return output; + } + + + /** + * remove member + */ + @Transactional(rollbackFor = Exception.class) + public synchronized void removeMember(RemoveApi.Input input) throws StatusCodeWithException { + ProjectMySqlModel project = findByProjectId(input.getProjectId()); + if (project == null) { + throw new StatusCodeWithException("鏈壘鍒扮浉搴旂殑椤圭洰锛", StatusCode.PARAMETER_VALUE_INVALID); + } + if (project.getMyRole() != JobMemberRole.promoter && !input.fromGateway()) { + throw new StatusCodeWithException("绉婚櫎鎴愬憳鐨勬搷浣滃彧鏈 promoter 鑳藉彂璧", StatusCode.ILLEGAL_REQUEST); + } + ProjectMemberMySqlModel member = projectMemberService.findOneByMemberId(input.getProjectId(), input.getMemberId(), input.getMemberRole()); + if (member == null) { + return; + } + + OnlineDemoBranchStrategy.hackOnDelete(input, member, "鍙兘鍒犻櫎鑷繁鍔犵殑鎴愬憳銆"); + + // Mark all data sets belonging to the member as unavailable + projectDataSetRepo.disableDataSetWhenMemberExist(input.getProjectId(), input.getMemberId(), input.getMemberRole().name()); + + // Update the usage count of the dataset in the project + projectDataSetService + .listAllRawDataSet(project.getProjectId(), member.getMemberId()) + .stream() + .forEach(x -> dataSetService.updateUsageCountInProject(x.getDataSetId())); + + checkAuditingRecord(input.getProjectId(), input.getMemberId()); + + gatewayService.syncToNotExistedMembers(input.getProjectId(), input, RemoveApi.class); + + projectMemberService.updateProjectMember(member, (x) -> { + member.setExited(true); + member.setFromCreateProject(false); + member.setAuditComment("璇ユ垚鍛樺凡琚 promoter 绉婚櫎"); + return x; + }); + + // If you remove myself + if (input.fromGateway() && input.getMemberId().equals(CacheObjects.getMemberId())) { + project.setExited(true); + project.setExitedBy(input.callerMemberInfo.getMemberId()); + project.setExitedTime(new Date()); + projectRepo.save(project); + } + + } + + /** + * Process and delete the audit information of a member + * todo: winter + */ + private void checkAuditingRecord(String projectId, String memberId) { + // Find all audit information for this project + Specification where = Where.create().equal("projectId", projectId) + .build(ProjectMemberAuditMySqlModel.class); + List allAuditList = projectMemberAuditRepository.findAll(where); + if (CollectionUtils.isNotEmpty(allAuditList)) { + + // Auditee, audit list + Map auditMap = new HashMap<>(); + for (ProjectMemberAuditMySqlModel audit : allAuditList) { + // Information that needs to be reviewed by A + if (audit.getAuditorId().equals(memberId) && audit.getAuditResult() == AuditStatus.auditing) { + // A was removed and temporarily set to agree + audit.setAuditComment("鎴愬憳宸茶绉婚櫎锛岃嚜鍔ㄥ悓鎰"); + audit.setAuditResult(AuditStatus.agree); + } + + Boolean agree = auditMap.get(audit.getMemberId()); + if (agree == null) { + agree = audit.getAuditResult() == AuditStatus.agree; + } else { + agree = audit.getAuditResult() == AuditStatus.agree && agree; + } + auditMap.put(audit.getMemberId(), agree); + } + + for (Map.Entry auditEntry : auditMap.entrySet()) { + // Person being audited + String mId = auditEntry.getKey(); + boolean agree = auditEntry.getValue(); + if (!agree) { + continue; + } + // Person being audited + List needAuditMembers = projectMemberService.findListByMemberId(projectId, + mId); + ProjectMemberMySqlModel needAuditMember = needAuditMembers.stream() + .filter(s -> s.getAuditStatus() == AuditStatus.auditing && !s.isExited()).findFirst().orElse(null); + if (needAuditMember != null) { + projectMemberService.updateProjectMember(needAuditMember, (x) -> { + x.setAuditStatus(AuditStatus.agree); + x.setAuditStatusFromOthers(AuditStatus.agree); + x.setAuditComment("鏈夋垚鍛樿绉婚櫎锛岃嚜鍔ㄥ鏍搁氳繃"); + x.setExited(false); + return x; + }); + // If the person being reviewed is yourself, + // update the review status of the project + if (CacheObjects.getMemberId().equals(needAuditMember.getMemberId())) { + ProjectMySqlModel project = projectService.findByProjectId(projectId); + project.setAuditStatus(AuditStatus.agree); + project.setAuditStatusFromOthers(AuditStatus.agree); + project.setAuditComment(null); + project.setStatusUpdatedTime(new Date()); + projectRepo.save(project); + } + } + } + } + // Delete all the members' pending audit records of this member, + // and he no longer needs to review + projectMemberAuditRepository.deleteAuditingRecord(projectId, memberId); + } + + /** + * Add a dataset to an existing project + */ + @Transactional(rollbackFor = Exception.class) + public synchronized ProjectMySqlModel addProjectDataSet(AddDataSetApi.Input input) throws StatusCodeWithException { + ProjectMySqlModel project = findByProjectId(input.getProjectId()); + if (project == null) { + throw new StatusCodeWithException("鏈壘鍒扮浉搴旂殑椤圭洰锛", StatusCode.ILLEGAL_REQUEST); + } + + if (!input.fromGateway()) { + if (project.getAuditStatus() != AuditStatus.agree || project.isExited()) { + throw new StatusCodeWithException("璇峰湪鎴愪负璇ラ」鐩殑姝e紡鎴愬憳鍚庡啀杩涜鐩稿叧鎿嶄綔", StatusCode.ILLEGAL_REQUEST); + } + } + + if (CollectionUtils.isEmpty(input.getDataSetList())) { + throw new StatusCodeWithException("鏁版嵁闆嗕笉鑳戒负绌", StatusCode.ILLEGAL_REQUEST); + } + + for (ProjectDataSetInput item : input.getDataSetList()) { + // Determine whether the member exists + ProjectMemberMySqlModel member = projectMemberService.findOneByMemberId(input.getProjectId(), item.getMemberId(), item.getMemberRole()); + if (member == null) { + throw new StatusCodeWithException("璇ユ垚鍛樹笉瀛樺湪", StatusCode.ILLEGAL_REQUEST); + } + + // Add your own data set by yourself, the review status is agreed, + // and add another person's data set, the status is under review. + AuditStatus auditStatus; + if (input.fromGateway()) { + auditStatus = item.getMemberId().equals(input.callerMemberInfo.getMemberId()) + ? AuditStatus.agree + : AuditStatus.auditing; + } else { + auditStatus = item.getMemberId().equals(CacheObjects.getMemberId()) + ? AuditStatus.agree + : AuditStatus.auditing; + } + + // Determine whether the data set exists + ProjectDataSetMySqlModel projectDataSet = projectDataSetService.findOne(input.getProjectId(), item.getDataSetId(), item.getMemberRole()); + if (projectDataSet != null) { + projectDataSet.setAuditStatus(auditStatus); + } else { + projectDataSet = ModelMapper.map(item, ProjectDataSetMySqlModel.class); + projectDataSet.setProjectId(project.getProjectId()); + projectDataSet.setCreatedBy(input); + projectDataSet.setAuditStatus(auditStatus); + + projectDataSet.setMemberRole(item.getMemberRole()); + projectDataSet.setStatusUpdatedTime(new Date()); + projectDataSet.setSourceType(null); + + } + + projectDataSetRepo.save(projectDataSet); + // Update the usage count of the dataset in the project + if (projectDataSet.getAuditStatus() == AuditStatus.agree) { + dataSetService.updateUsageCountInProject(projectDataSet.getDataSetId()); + } + + } + + gatewayService.syncToNotExistedMembers(input.getProjectId(), input, AddDataSetApi.class); + + return project; + } + + + /** + * Remove the data set in the project + */ + @Transactional(rollbackFor = Exception.class) + public synchronized void removeDataSet(RemoveDataSetApi.Input input) throws StatusCodeWithException { + + ProjectMySqlModel project = findByProjectId(input.getProjectId()); + if (project == null) { + throw new StatusCodeWithException("鏈壘鍒扮浉搴旂殑椤圭洰锛", StatusCode.ILLEGAL_REQUEST); + } + + if (!input.fromGateway()) { + if (project.getAuditStatus() != AuditStatus.agree || project.isExited()) { + throw new StatusCodeWithException("璇峰湪鎴愪负璇ラ」鐩殑姝e紡鎴愬憳鍚庡啀杩涜鐩稿叧鎿嶄綔", StatusCode.ILLEGAL_REQUEST); + } + } + + // Determine whether the data set exists + ProjectDataSetMySqlModel projectDataSet = projectDataSetService.findOne(input.getProjectId(), input.getDataSetId(), input.getMemberRole()); + if (projectDataSet == null) { + return; + } + + if (!input.fromGateway()) { + + // If it is the raw data set + if (projectDataSet.getSourceType() == null) { + // Not a promoter, you can't delete other people's data sets + if (project.getMyRole() != JobMemberRole.promoter && !CacheObjects.getMemberId().equals(projectDataSet.getMemberId())) { + throw new StatusCodeWithException("涓嶈兘鍒犻櫎鍒汉鐨勬暟鎹泦", StatusCode.ILLEGAL_REQUEST); + } + + OnlineDemoBranchStrategy.hackOnDelete(input, projectDataSet, "鍙兘鍒犻櫎鑷繁娣诲姞鐨勬暟鎹泦銆"); + } + // If it is the derived data set + else { + if (project.getMyRole() != JobMemberRole.promoter) { + throw new StatusCodeWithException("鍙湁 promoter 鎵嶈兘鍒犻櫎琛嶇敓鏁版嵁闆", StatusCode.ILLEGAL_REQUEST); + } + + dataSetService.delete(projectDataSet.getDataSetId()); + } + + } + + // delete ProjectDataSet + projectDataSetRepo.deleteById(projectDataSet.getId()); + + // Update the usage count of the dataset in the project + dataSetService.updateUsageCountInProject(projectDataSet.getDataSetId()); + + gatewayService.syncToNotExistedMembers(input.getProjectId(), input, RemoveDataSetApi.class); + + } + + /** + * Count the number of items from roles and audit status respectively + */ + public CountStatisticsApi.Output statistics(QueryApi.Input input) { + // Statistics by role + StringBuffer sql = new StringBuffer() + .append("select my_role,count(*) as 'count' from project p ") + .append(buildQueryWhere(input)) + .append(" group by my_role"); + + Map byRole = projectRepo + .query(sql.toString()) + .stream() + .map(x -> + new RoleCounts( + JobMemberRole.valueOf(String.valueOf(x[0])), + Long.parseLong(String.valueOf(x[1])) + ) + ).collect(Collectors.toMap(x -> x.getRole(), x -> x.getCount())); + + for (JobMemberRole value : JobMemberRole.values()) { + if (!byRole.containsKey(value)) { + byRole.put(value, 0L); + } + } + + long total = 0; + + for (Long value : byRole.values()) { + total += value; + } + + // Statistics by audit status + sql = new StringBuffer() + .append("select p.audit_status,count(*) as 'count' from project p ") + .append(buildQueryWhere(input)) + .append(" group by p.audit_status"); + + Map byAuditStatus = projectRepo + .query(sql.toString()) + .stream() + .map(x -> + new AuditStatusCounts( + AuditStatus.valueOf(String.valueOf(x[0])), + Long.parseLong(String.valueOf(x[1])) + ) + ).collect(Collectors.toMap(x -> x.getAuditStatus(), x -> x.getCount())); + + for (AuditStatus value : AuditStatus.values()) { + if (!byAuditStatus.containsKey(value)) { + byAuditStatus.put(value, 0L); + } + } + + return new CountStatisticsApi.Output(total, byRole, byAuditStatus); + + } + + public PagingOutput query(QueryApi.Input input) { + + StringBuffer sql = new StringBuffer( + "select distinct(p.id),p.flow_status_statistics,p.deleted,p.name,p.project_desc,p.audit_status,p.status_updated_time" + + ",p.audit_status_from_myself,p.audit_status_from_others,p.audit_comment,p.exited,p.closed" + + ",p.closed_by,p.closed_time,p.exited_by,p.exited_time" + + ",p.project_id,p.member_id,p.my_role" + + ",p.start_time,p.finish_time,p.progress,p.progress_updated_time,p.message" + + ",p.created_by,p.created_time,p.updated_by,p.updated_time" + " from project p"); + + int total = projectRepo.queryByClass(sql.append(buildQueryWhere(input)).toString(), ProjectMySqlModel.class).size(); + + sql.append(" order by p.created_time desc"); + sql.append(" limit " + input.getPageIndex() * input.getPageSize() + "," + input.getPageSize()); + + List projectList = projectRepo.queryByClass(sql.toString(), ProjectMySqlModel.class); + List list = projectList + .parallelStream() + .map(this::buildJobOutputModel) + .collect(Collectors.toList()); + return PagingOutput.of(total, list); + } + + private String buildQueryWhere(QueryApi.Input input) { + StringBuffer where = new StringBuffer(); + + if (StringUtil.isNotBlank(input.getMemberId())) { + where.append(" inner join project_member pm on p.project_id=pm.project_id where 1=1"); + where.append(" and pm.member_id = '" + input.getMemberId() + "'"); + if (input.getMemberRole() != null) { + where.append(" and pm.member_role = '" + input.getMemberRole() + "'"); + } + } else { + where.append(" where 1=1"); + } + + + where.append(" and p.deleted != true "); + if (StringUtil.isNotBlank(input.getName())) { + where.append(" and p.name like '%" + input.getName() + "%'"); + } + + if (StringUtil.isNotBlank(input.getStartCreateTime())) { + where.append(" and p.created_time >= '" + input.getStartCreateTime() + "'"); + } + + if (StringUtil.isNotBlank(input.getEndCreateTime())) { + where.append(" and p.created_time <= '" + input.getEndCreateTime() + "'"); + } + + if (input.getMyRole() != null) { + where.append(" and p.my_role = '" + input.getMyRole() + "'"); + } + + if (input.getClosed() != null) { + where.append(" and p.closed = " + input.getClosed()); + } + + where.append(" and p.exited = 0"); + + if (input.getAuditStatus() != null) { + if (input.getAuditStatus() == AuditStatus.auditing) { + where.append("" + + " and (" + + "p.audit_status= '" + input.getAuditStatus() + "'" + + " or " + + " p.project_id in (" + + "select project_id from project_data_set where member_id='" + CacheObjects.getMemberId() + + "' and audit_status='" + AuditStatus.auditing.name() + "' and source_type is null" + + ")" + + ")" + ); + } else { + where.append(" and p.audit_status= '" + input.getAuditStatus() + "'"); + } + + } + + return where.toString(); + } + + private ProjectQueryOutputModel buildJobOutputModel(ProjectMySqlModel project) { + ProjectQueryOutputModel output = ModelMapper.map(project, ProjectQueryOutputModel.class); + + // fill the list of members under the project + List members = projectMemberService + .findListByProjectId(project.getProjectId()) + .stream() + .filter(m -> !m.isExited()) + .map(member -> { + + if (member.getMemberRole().equals(JobMemberRole.promoter) + && member.getMemberId().equals(project.getMemberId())) { + output.setPromoter(member.getMemberId()); + output.setPromoterName(CacheObjects.getMemberName(member.getMemberId())); + } + return ModelMapper.map(member, ProjectMemberOutputModel.class); + + }) + .collect(Collectors.toList()); + + output.setNeedMeAuditDataSetCount( + projectDataSetRepo.queryNeedAuditDataSetCount(project.getProjectId(), CacheObjects.getMemberId()) + ); + + output.setMemberList(members); + return output; + } + + @Transactional(rollbackFor = Exception.class) + public synchronized void updateProject(UpdateProjectApi.Input input) throws StatusCodeWithException { + ProjectMySqlModel project = findByProjectId(input.getProjectId()); + if (project == null) { + throw new StatusCodeWithException("鏈壘鍒扮浉搴旂殑椤圭洰锛", StatusCode.ILLEGAL_REQUEST); + } + + if (!input.fromGateway()) { + if (project.getMyRole() != JobMemberRole.promoter + || !project.getMemberId().equals(CacheObjects.getMemberId())) { + throw new StatusCodeWithException("鍙湁鍙戣捣鏂规墠鑳芥洿鏀归」鐩紒", StatusCode.ILLEGAL_REQUEST); + } + } + + project.setName(input.getName()); + project.setProjectDesc(input.getDesc()); + project.setUpdatedBy(input); + + projectRepo.save(project); + + gatewayService.syncToNotExistedMembers(input.getProjectId(), input, UpdateProjectApi.class); + } + + public ProjectMySqlModel findByProjectId(String projectId) { + Specification where = Where.create().equal("projectId", projectId) + .build(ProjectMySqlModel.class); + return projectRepo.findOne(where).orElse(null); + } + + /** + * audit new projects + *

+ * auditor + * pullProjectInfo() + * project: result + * project_member: result + *

+ * other + * project_member: result + */ + @Transactional(rollbackFor = Exception.class) + public synchronized void auditProject(AuditApi.Input input) throws StatusCodeWithException { + ProjectMySqlModel project = findByProjectId(input.getProjectId()); + if (project == null) { + throw new StatusCodeWithException("鏈壘鍒扮浉搴旂殑椤圭洰锛", StatusCode.PARAMETER_VALUE_INVALID); + } + + if (!input.fromGateway() && project.getAuditStatus() != AuditStatus.auditing) { + throw new StatusCodeWithException("涓嶈兘閲嶅瀹℃牳锛", StatusCode.PARAMETER_VALUE_INVALID); + } + + String auditorId = input.fromGateway() ? input.callerMemberInfo.getMemberId() : CacheObjects.getMemberId(); + List list = projectMemberService.findListByMemberId(project.getProjectId(), auditorId); + if (list == null || list.isEmpty()) { + throw new StatusCodeWithException("鏈壘鍒伴」鐩叧鑱旂殑member锛", StatusCode.PARAMETER_VALUE_INVALID); + } + + ProjectMemberMySqlModel member = list.stream() + .filter(s -> s.getAuditStatus() == AuditStatus.auditing && !s.isExited()).findFirst().get(); + if (member == null) { + throw new StatusCodeWithException("鏈壘鍒伴」鐩叧鑱旂殑member锛", StatusCode.PARAMETER_VALUE_INVALID); + } + AuditStatus auditStatusFromMyself = input.getAuditResult(); + AuditStatus auditStatusFromOthers = null; + AuditStatus auditStatus; + + // self audit passed + if (auditStatusFromMyself == AuditStatus.agree) { + + // If it is a start-up member, pass it directly. + if (member.isFromCreateProject()) { + auditStatus = AuditStatus.agree; + } else { + auditStatus = AuditStatus.auditing; + auditStatusFromOthers = AuditStatus.auditing; + member.setAuditComment("鑷繁宸插悓鎰忥紝绛夊緟鍏朵粬鎴愬憳瀹℃牳涓"); + } + } + // self audit not pass + else { + auditStatus = AuditStatus.disagree; + member.setAuditComment(input.getAuditComment()); + member.setFromCreateProject(false); + member.setExited(true); + } + + + // update the audit status of the project + if (!input.fromGateway()) { + + project.setAuditStatus(auditStatus); + project.setAuditStatusFromMyself(auditStatusFromMyself); + project.setAuditStatusFromOthers(auditStatusFromOthers); + project.setAuditComment(input.getAuditComment()); + project.setStatusUpdatedTime(new Date()); + projectRepo.save(project); + } + + // update the audit status of project members + member.setAuditStatus(auditStatus); + member.setAuditStatusFromMyself(auditStatusFromMyself); + member.setAuditStatusFromOthers(auditStatusFromOthers); + member.setUpdatedBy(input); + projectMemberRepo.save(member); + + + // If I am a newcomer, after I agree, I need other formal members to review myself. + if (!member.isFromCreateProject() && input.getAuditResult() == AuditStatus.agree) { + + projectMemberService + .findListByProjectId(input.getProjectId()) + .stream() + // Skip the auditor himself + .filter(x -> !x.getMemberId().equals(member.getMemberId())) + // Skip exited members + .filter(x -> !x.isExited()) + // Select official members only + .filter(x -> AuditStatus.agree == x.getAuditStatus()) + .forEach(x -> { + boolean isInviter = x.getMemberId().equals(member.getInviterId()); + + /** + * This person may have been pulled in, kicked out and pulled in before, so there is an audit record before. + * Since the database has a unique primary key setting, data cannot be added repeatedly. + * Make a judgment here + */ + ProjectMemberAuditMySqlModel audit = projectMemberAuditService.findOne(input.getProjectId(), member.getMemberId(), x.getMemberId()); + + if (audit == null) { + audit = new ProjectMemberAuditMySqlModel(); + audit.setCreatedBy(input); + audit.setAuditorId(x.getMemberId()); + audit.setProjectId(input.getProjectId()); + audit.setMemberId(member.getMemberId()); + } + audit.setUpdatedBy(input); + audit.setAuditResult(isInviter ? AuditStatus.agree : AuditStatus.auditing); + audit.setAuditComment(isInviter ? "閭璇蜂汉锛岃嚜鍔ㄩ氳繃銆" : null); + projectMemberAuditRepository.save(audit); + }); + + // Check if all official members have agreed + if (projectMemberAuditService.allMemberAgreed(input.getProjectId(), member.getMemberId())) { + projectMemberService + .updateProjectMember(member, (x) -> { + x.setAuditStatus(AuditStatus.agree); + x.setAuditStatusFromOthers(AuditStatus.agree); + x.setAuditComment("瀹℃牳閫氳繃"); + return x; + }); + + // Update project audit status + if (!input.fromGateway()) { + project.setAuditStatus(AuditStatus.agree); + project.setAuditStatusFromOthers(AuditStatus.agree); + project.setAuditComment(null); + project.setStatusUpdatedTime(new Date()); + + project.setExited(false); + projectRepo.save(project); + } + } + } + + gatewayService.syncToNotExistedMembers(input.getProjectId(), input, AuditApi.class); + if (!input.fromGateway()) { + + // Pull the latest status of the project from the promoter to the local + if (input.getAuditResult() == AuditStatus.agree) { + syncAuditProjectInfo(input.getProjectId(), input); + } + } + + } + + /** + * after audit the project, pull the latest data from the promoter and synchronize the data. + */ + public void syncAuditProjectInfo(String projectId, AuditApi.Input input) throws StatusCodeWithException { + + List projectMembers = projectMemberService.listFormalProjectMembers(projectId); + ProjectMemberMySqlModel promoterProjectMember = projectMembers.stream().filter(x -> x.getMemberRole() == JobMemberRole.promoter).findFirst().orElse(null); + long promoterCount = projectMembers.stream().filter(x -> x.getMemberRole() == JobMemberRole.promoter).count(); + ProjectMySqlModel project = findByProjectId(projectId); + + if (promoterProjectMember == null) { + throw new StatusCodeWithException(StatusCode.DATA_NOT_FOUND, "鎵句笉鍒皃romoter鎴愬憳淇℃伅"); + } + + ApiResult detailResult = gatewayService.sendToBoardRedirectApi(promoterProjectMember.getMemberId(), JobMemberRole.provider, new DataInfoApi.Input(projectId), DataInfoApi.class); + + DataInfoApi.Output dataInfoOutput = JSONObject.toJavaObject(JObject.create(detailResult.data), DataInfoApi.Output.class); + + for (ProjectMemberMySqlModel projectMemberMySqlModel : dataInfoOutput.getProjectMembers()) { + + // If the record exists, update the status; + // if the record does not exist, insert the record. + ProjectMemberMySqlModel projectMember = projectMemberService.findOneByMemberId(projectId, projectMemberMySqlModel.getMemberId(), projectMemberMySqlModel.getMemberRole()); + if (projectMember != null) { + projectMemberService.update(projectMember, y -> { + y.setAuditStatus(projectMember.getAuditStatus()); + y.setAuditStatusFromMyself(projectMember.getAuditStatusFromMyself()); + y.setAuditStatusFromOthers(projectMember.getAuditStatusFromOthers()); + y.setAuditComment(projectMember.getAuditComment()); + }); + } else { + projectMemberRepo.save(projectMemberMySqlModel); + } + + } + + for (ProjectDataSetMySqlModel dataSetMySqlModel : dataInfoOutput.getProjectDataSets()) { + // Filter derived data sets + if (dataSetMySqlModel.getSourceType() != null) { + continue; + } + ProjectDataSetMySqlModel projectDataSet = projectDataSetService.findOne(dataSetMySqlModel.getProjectId(), dataSetMySqlModel.getDataSetId(), dataSetMySqlModel.getMemberRole()); + if (projectDataSet != null) { + projectDataSetService.update(projectDataSet, dataSet -> { + dataSet.setAuditStatus(projectDataSet.getAuditStatus()); + dataSet.setAuditComment(projectDataSet.getAuditComment()); + }); + + } else { + + projectDataSetRepo.save(dataSetMySqlModel); + } + } + List excludeFlowIds = new ArrayList<>(); + for (ProjectFlowMySqlModel projectFlowMySqlModel : dataInfoOutput.getProjectFlows()) { + + // Eligible flow do not need to be copied + if (promoterCount >= 2 && project.getMyRole() == JobMemberRole.promoter) { + if (projectFlowMySqlModel.getFederatedLearningType() != FederatedLearningType.mix) { + excludeFlowIds.add(projectFlowMySqlModel.getFlowId()); + continue; + } + } + if (projectFlowService.findOne(projectFlowMySqlModel.getFlowId()) == null) { + projectFlowMySqlModel.setMyRole(project.getMyRole()); + projectFlowMySqlModel.setFlowStatus(ProjectFlowStatus.editing); + // todo: put creator_member_id on next version + projectFlowMySqlModel.setCreatedBy(""); + projectFlowRepository.save(projectFlowMySqlModel); + } + } + + for (ProjectFlowNodeMySqlModel projectFlowNodeMySqlModel : dataInfoOutput.getProjectFlowNodes()) { + // Eligible flow nodes do not need to be copied + if (excludeFlowIds.contains(projectFlowNodeMySqlModel.getFlowId())) { + continue; + } + if (projectFlowNodeService.findOne(projectFlowNodeMySqlModel.getFlowId(), projectFlowNodeMySqlModel.getNodeId()) == null) { + projectFlowNodeRepository.save(projectFlowNodeMySqlModel); + } + } + + } + + /** + * Pull the latest data of the project from the promoter + *

+ * Due to changes in the project (data sets, processes, tasks) will only be synchronized to formal members + * New members need to get data from the promoter + */ + public void pullNewestProjectInfo(AbstractApiInput input, String projectId, String callerMemberId, JobMemberRole myRole) throws StatusCodeWithException { + ProjectMySqlModel project = findByProjectId(projectId); + DataInfoApi.Output projectOutputModel = getPromoterDataInfo(projectId, callerMemberId); + + // If the project does not exist, it means that it is a new member, + // and the project and related data sets need to be created. + if (project == null) { + + ProjectMySqlModel projectMySqlModel = projectOutputModel.getProject(); + + project = new ProjectMySqlModel(); + project.setCreatedBy(input); + project.setMemberId(CacheObjects.getMemberId()); + project.setMyRole(myRole); + project.setProjectId(projectId); + project.setName(projectMySqlModel.getName()); + project.setProjectDesc(projectMySqlModel.getProjectDesc()); + project.setStatusUpdatedTime(new Date()); + project.setProgress(0); + project.setProgressUpdatedTime(new Date()); + project.setUpdatedBy(CurrentAccount.id()); + project.setAuditStatus(AuditStatus.auditing); + project.setAuditStatusFromMyself(AuditStatus.auditing); + project.setFlowStatusStatistics(JObject.create() + .append(ProjectFlowStatus.editing.name(), 0) + .append(ProjectFlowStatus.running.name(), 0) + .append(ProjectFlowStatus.finished.name(), 0).toJSONString()); + projectRepo.save(project); + + // save ProjectMember to database + projectOutputModel.getProjectMembers() + .stream() + .filter(x -> !x.getMemberId().equals(CacheObjects.getMemberId())) + .forEach(x -> { + ProjectMemberMySqlModel member = new ProjectMemberMySqlModel(); + member.setProjectId(x.getProjectId()); + member.setCreatedBy(x.getCreatedBy()); + member.setMemberId(x.getMemberId()); + member.setMemberRole(x.getMemberRole()); + member.setAuditComment(x.getAuditComment()); + member.setInviterId(x.getInviterId()); + member.setFromCreateProject(x.isFromCreateProject()); + member.setAuditStatus(x.getMemberId().equals(CacheObjects.getMemberId()) ? AuditStatus.auditing : x.getAuditStatus()); + member.setAuditStatusFromMyself(x.getMemberId().equals(CacheObjects.getMemberId()) ? AuditStatus.auditing : x.getAuditStatusFromMyself()); + member.setExited(x.isExited()); + projectMemberRepo.save(member); + }); + + // save ProjectDataSet to database + projectOutputModel.getProjectDataSets() + .stream() + .filter(x -> x.getSourceType() == null) + .forEach(x -> { + ProjectDataSetMySqlModel dataSet = new ProjectDataSetMySqlModel(); + dataSet.setProjectId(x.getProjectId()); + dataSet.setCreatedBy(x.getCreatedBy()); + dataSet.setMemberId(x.getMemberId()); + dataSet.setMemberRole(x.getMemberRole()); + dataSet.setDataSetId(x.getDataSetId()); + dataSet.setStatusUpdatedTime(x.getStatusUpdatedTime()); + dataSet.setAuditStatus(x.getMemberId().equals(CacheObjects.getMemberId()) ? AuditStatus.auditing : x.getAuditStatus()); + dataSet.setAuditComment(x.getMemberId().equals(CacheObjects.getMemberId()) ? "" : x.getAuditComment()); + projectDataSetRepo.save(dataSet); + }); + + } else { + + // The project exists, has joined the project in history. + ProjectMySqlModel projectMySqlModel = projectOutputModel.getProject(); + Map projectUpdateMap = new HashMap<>(); + projectUpdateMap.put("name", projectMySqlModel.getName()); + projectUpdateMap.put("projectDesc", projectMySqlModel.getProjectDesc()); + projectUpdateMap.put("statusUpdatedTime", new Date()); + projectUpdateMap.put("progress", 0); + projectUpdateMap.put("progressUpdatedTime", new Date()); + projectUpdateMap.put("updatedBy", CurrentAccount.id()); + projectUpdateMap.put("auditStatus", AuditStatus.auditing); + projectUpdateMap.put("auditStatusFromMyself", AuditStatus.auditing); + projectUpdateMap.put("auditStatusFromOthers", null); + projectUpdateMap.put("exited", false); + projectUpdateMap.put("myRole", myRole); + projectRepo.updateById(project.getId(), projectUpdateMap, ProjectMySqlModel.class); + + projectOutputModel.getProjectMembers().forEach(x -> { + + ProjectMemberMySqlModel model = projectMemberService.findOneByMemberId(x.getProjectId(), x.getMemberId(), x.getMemberRole()); + if (model != null) { + Map params = new HashMap<>(); + if (model.getMemberRole() == myRole && model.getMemberId().equals(CacheObjects.getMemberId())) { + params.put("auditStatus", AuditStatus.auditing); + params.put("auditStatusFromMyself", AuditStatus.auditing); + params.put("auditStatusFromOthers", null); + params.put("exited", false); + params.put("auditComment", ""); + params.put("fromCreateProject", x.isFromCreateProject()); + } else { + params.put("auditStatus", x.getAuditStatus()); + params.put("auditStatusFromMyself", x.getAuditStatus()); + params.put("auditStatusFromOthers", x.getAuditStatusFromOthers()); + params.put("exited", x.isExited()); + params.put("fromCreateProject", x.isFromCreateProject()); + params.put("auditComment", x.getAuditComment()); + } + projectMemberRepo.updateById(model.getId(), params, ProjectMemberMySqlModel.class); + } else { + if (x.getMemberId().equals(CacheObjects.getMemberId())) { + x.setAuditStatus(AuditStatus.auditing); + x.setAuditStatusFromMyself(AuditStatus.auditing); + x.setAuditStatusFromOthers(null); + x.setAuditComment(""); + } + projectMemberRepo.save(x); + } + + }); + + projectOutputModel.getProjectDataSets() + .stream() + .filter(x -> x.getSourceType() == null) + .forEach(x -> { + + ProjectDataSetMySqlModel model = projectDataSetService.findOne(x.getProjectId(), x.getDataSetId(), x.getMemberRole()); + if (model != null) { + Map params = new HashMap<>(); + params.put("auditStatus", + model.getMemberId().equals(CacheObjects.getMemberId()) + && model.getMemberRole() == myRole ? AuditStatus.auditing + : model.getAuditStatus()); + params.put("auditComment", model.getMemberId().equals(CacheObjects.getMemberId()) ? "" + : model.getAuditComment()); + projectDataSetRepo.updateById(model.getId(), params, ProjectDataSetMySqlModel.class); + } else { +// x.setAuditStatus(AuditStatus.auditing); +// x.setAuditComment(""); + projectDataSetRepo.save(x); + } + }); + } + + } + + public DataInfoApi.Output getPromoterDataInfo(String projectId, String callerMemberId) throws StatusCodeWithException { + // Get all project members from the sender + ApiResult membersResult = gatewayService.sendToBoardRedirectApi(callerMemberId, JobMemberRole.provider, new ListApi.Input(projectId), ListApi.class); + + // Find the promoter in the current project from all members of the sender + ProjectMemberOutputModel promoterMember = JObject.create(membersResult.data) + .getJSONList("list") + .stream() + .map(x -> JSONObject.toJavaObject(x, ProjectMemberOutputModel.class)) + .filter(x -> x.getMemberRole() == JobMemberRole.promoter) + .findFirst() + .orElse(null); + + if (promoterMember == null) { + throw new StatusCodeWithException(StatusCode.DATA_NOT_FOUND, "鎵句笉鍒皃romoter鏂"); + } + + String promoterMemberId = promoterMember.getMemberId(); + + // Get project details from the promoter + ApiResult detailResult = gatewayService.sendToBoardRedirectApi(promoterMemberId, JobMemberRole.provider, new DataInfoApi.Input(projectId), DataInfoApi.class); + + DataInfoApi.Output projectOutputModel = JSONObject.toJavaObject(JObject.create(detailResult.data), DataInfoApi.Output.class); + + return projectOutputModel; + } + + + /** + * Exit the project + */ + public void exitProject(ExitProjectApi.Input input) throws StatusCodeWithException { + + ProjectMySqlModel project = findByProjectId(input.getProjectId()); + if (project == null) { + throw new StatusCodeWithException(StatusCode.DATA_NOT_FOUND, "鎵句笉鍒板搴旂殑椤圭洰銆"); + } + + + if (!input.fromGateway()) { + if (project.getMyRole() == JobMemberRole.promoter) { + throw new StatusCodeWithException("promoter 涓嶈兘閫鍑洪」鐩", StatusCode.PARAMETER_VALUE_INVALID); + } + + + project.setExited(true); + project.setExitedTime(new Date()); + project.setExitedBy(project.getOperatorId(input)); + projectRepo.save(project); + } + + // Notify other members + gatewayService.syncToOtherFormalProjectMembers(input.getProjectId(), input, ExitProjectApi.class); + + String memberId = input.fromGateway() ? input.callerMemberInfo.getMemberId() : CacheObjects.getMemberId(); + ProjectMemberMySqlModel member = projectMemberService.findOneByMemberId(input.getProjectId(), memberId, JobMemberRole.provider); + member.setExited(true); + member.setUpdatedBy(input); + projectMemberRepo.save(member); + + + // Mark all data sets belonging to the member as unavailable + projectDataSetRepo.disableDataSetWhenMemberExist(input.getProjectId(), memberId, member.getMemberRole().name()); + + // Delete all the members' pending audit records of this member, and he no longer needs to audit. + projectMemberAuditRepository.deleteAuditingRecord(input.getProjectId(), memberId); + + // Update the usage count of the dataset in the project + projectDataSetService + .listAllRawDataSet(project.getProjectId(), memberId) + .stream() + .forEach(x -> dataSetService.updateUsageCountInProject(x.getDataSetId())); + } + + + /** + * close project + */ + public void closeProject(CloseProjectApi.Input input) throws StatusCodeWithException { + + ProjectMySqlModel project = findByProjectId(input.getProjectId()); + if (project == null) { + throw new StatusCodeWithException(StatusCode.DATA_NOT_FOUND, "鎵句笉鍒板搴旂殑椤圭洰銆"); + } + + if (!input.fromGateway()) { + if (project.getMyRole() != JobMemberRole.promoter || !project.getMemberId().equals(CacheObjects.getMemberId())) { + throw new StatusCodeWithException("闈炲彂璧锋柟鏃犳硶鍏抽棴椤圭洰銆", StatusCode.ILLEGAL_REQUEST); + } + } + + OnlineDemoBranchStrategy.hackOnDelete(input, project, "鍙兘鍏抽棴鑷繁鍒涘缓鐨勯」鐩"); + + project.setClosed(true); + project.setClosedTime(new Date()); + project.setClosedBy(project.getOperatorId(input)); + + projectRepo.save(project); + + projectDataSetService + .listAllRawDataSet(project.getProjectId(), null) + .stream() + .forEach(x -> dataSetService.updateUsageCountInProject(x.getDataSetId())); + + // Notify other members that the project is closed + try { + gatewayService.syncToNotExistedMembers(input.getProjectId(), input, CloseProjectApi.class); + } catch (Exception e) { + LOG.error(e.getMessage(), e); + } + } + + /** + * update flow_status_statistics + */ + public void updateFlowStatusStatistics(String projectId) { + + List projectFlowStatusCount = projectFlowRepository.countProjectFlowStatus(projectId); + + int runningCount = 0; + int editingCount = 0; + int finishedCount = 0; + for (Object[] row : projectFlowStatusCount) { + String flowStatus = String.valueOf(row[0]); + int count = Convert.toInt(row[1]); + + switch (ProjectFlowStatus.valueOf(flowStatus)) { + case editing: + editingCount += count; + break; + + case running: + case wait_run: + case wait_stop: + case wait_success: + runningCount += count; + break; + + case success: + case stop_on_running: + case error_on_running: + finishedCount += count; + break; + default: + } + } + JObject result = JObject.create() + .append(ProjectFlowStatus.editing.name(), editingCount) + .append(ProjectFlowStatus.running.name(), runningCount) + .append(ProjectFlowStatus.finished.name(), finishedCount); + + ProjectMySqlModel project = findByProjectId(projectId); + projectRepo.updateById(project.getId(), "flowStatusStatistics", result.toJSONString(), ProjectMySqlModel.class); + } + + /** + * find project by job_id + */ + public ProjectMySqlModel findProjectByJobId(String jobId) { + List jobs = jobService.listByJobId(jobId); + + if (CollectionUtils.isEmpty(jobs)) { + return null; + } + + return projectService.findByProjectId(jobs.get(0).getProjectId()); + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ServiceCheckService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ServiceCheckService.java" new file mode 100644 index 0000000000000000000000000000000000000000..d8a3cab05f336812fd253e6b1fde5b6cf424c3bc --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ServiceCheckService.java" @@ -0,0 +1,322 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.api.member.ServiceStatusCheckApi; +import com.welab.wefe.board.service.constant.Config; +import com.welab.wefe.board.service.database.entity.job.ProjectMemberMySqlModel; +import com.welab.wefe.board.service.dto.vo.MemberServiceStatusOutput; +import com.welab.wefe.board.service.exception.MemberGatewayException; +import com.welab.wefe.board.service.sdk.FlowService; +import com.welab.wefe.board.service.sdk.UnionService; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.data.storage.config.JdbcParamConfig; +import com.welab.wefe.common.data.storage.model.DataItemModel; +import com.welab.wefe.common.data.storage.repo.Storage; +import com.welab.wefe.common.data.storage.service.StorageService; +import com.welab.wefe.common.enums.MemberService; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.dto.ApiResult; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.RandomStringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.stream.Collectors; + +import static com.welab.wefe.board.service.service.DataSetStorageService.DATABASE_NAME; + +/** + * @author lonnie + */ +@Service +public class ServiceCheckService { + + protected final Logger LOG = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private FlowService flowService; + @Autowired + private UnionService unionService; + + @Autowired + private GatewayService gatewayService; + + @Autowired + private ProjectMemberService projectMemberService; + + @Autowired + private StorageService storageService; + + @Autowired + private JdbcParamConfig jdbcParamConfig; + + @Autowired + private Config config; + + @Autowired + private GlobalConfigService globalConfigService; + + /** + * check if each service is available + */ + public ServiceStatusCheckApi.Output checkMemberServiceStatus(ServiceStatusCheckApi.Input input) throws MemberGatewayException { + + String memberId = input.getMemberId(); + // If you are not checking your own status, go to the gateway. + if (!CacheObjects.getMemberId().equals(memberId)) { + ApiResult result = gatewayService.callOtherMemberBoard(memberId, ServiceStatusCheckApi.class, JObject.create(input)); + return JObject.create(result.data).toJavaObject(ServiceStatusCheckApi.Output.class); + + } + + LinkedHashMap result = new LinkedHashMap<>(); + + if (input.getService() == null) { + result.put(MemberService.gateway, checkLocalGatewayStatus()); + result.put(MemberService.flow, checkFlowServiceStatus(!input.fromGateway())); + result.put(MemberService.union, checkUnionServiceStatus()); + result.put(MemberService.storage, checkStorageServiceStatus(!input.fromGateway())); + return new ServiceStatusCheckApi.Output(result); + } + + switch (input.getService()) { + case union: + result.put(MemberService.union, checkUnionServiceStatus()); + break; + + case gateway: + result.put(MemberService.gateway, checkLocalGatewayStatus()); + break; + + case flow: + result.put(MemberService.flow, checkFlowServiceStatus(!input.fromGateway())); + break; + + case storage: + result.put(MemberService.storage, checkStorageServiceStatus(!input.fromGateway())); + break; + + default: + break; + } + + return new ServiceStatusCheckApi.Output(result); + } + + /** + * check if the union service is available + */ + public MemberServiceStatusOutput checkUnionServiceStatus() { + MemberServiceStatusOutput output = new MemberServiceStatusOutput(MemberService.union); + output.setValue(config.getUNION_BASE_URL()); + try { + unionService.queryMember(0, 1); + output.setSuccess(true); + } catch (StatusCodeWithException e) { + output.setSuccess(false); + output.setMessage(e.getMessage()); + } + + return output; + } + + /** + * check if the gateway service is available + */ + public MemberServiceStatusOutput checkLocalGatewayStatus() { + MemberServiceStatusOutput output = new MemberServiceStatusOutput(MemberService.gateway); + output.setValue(globalConfigService.getGatewayConfig().intranetBaseUri); + + try { + GatewayOnlineCheckResult result = checkGatewayConnect(globalConfigService.getGatewayConfig().intranetBaseUri); + + output.setSuccess(result.online); + output.setMessage(result.error); + + } catch (Exception e) { + output.setSuccess(false); + output.setMessage(e.getMessage()); + } + + + return output; + } + + /** + * Check gateway connectivity + * + * @param local Whether to check the local gateway + */ + public List gatewayOnlineCheck(boolean local, String projectId, List memberIds) { + List checkResultList = new ArrayList<>(); + GatewayOnlineCheckResult result = null; + if (local) { + result = checkGatewayConnect(globalConfigService.getGatewayConfig().intranetBaseUri); + checkResultList.add(result); + } + + // Detect that the board of other members cannot communicate with the gateway + if (StringUtil.isNotEmpty(projectId)) { + List members = projectMemberService.findListByProjectId(projectId); + members.stream().filter(x -> x.getMemberId().equals(CacheObjects.getMemberId())).collect(Collectors.toList()); + for (ProjectMemberMySqlModel member : members) { + checkResultList.add(checkGatewayConnect(null)); + } + } + // When creating a project, check that the board and gateway of other members are not connected. + if (CollectionUtils.isNotEmpty(memberIds)) { + for (String memberId : memberIds) { + checkResultList.add(checkGatewayConnect(null)); + } + } + + return checkResultList; + } + + /** + * check if the storage service is available + */ + public MemberServiceStatusOutput checkStorageServiceStatus(boolean checkerIsMyself) { + MemberServiceStatusOutput output = new MemberServiceStatusOutput(MemberService.storage); + + // The connection string is non-exposed information and cannot be output to other members. + if (checkerIsMyself) { + output.setValue(jdbcParamConfig.getUrl()); + } + + + Storage storage = storageService.getStorage(); + String name = RandomStringUtils.randomAlphabetic(6); + try { + storage.put(DATABASE_NAME, name, new DataItemModel<>(name, "test")); + output.setSuccess(true); + } catch (Exception e) { + LOG.error(e.getMessage()); + e.printStackTrace(); + output.setSuccess(false); + output.setMessage(config.getDbType().name() + " put寮傚父锛岃妫鏌ョ浉鍏抽厤缃槸鍚︽纭"); + return output; + } + + try { + storage.dropTB(DATABASE_NAME, name); + output.setSuccess(true); + } catch (Exception e) { + output.setSuccess(false); + output.setMessage(config.getDbType().name() + " drop寮傚父锛岃妫鏌ョ浉鍏抽厤缃槸鍚︽纭"); + } + + return output; + } + + /** + * check if the flow service is available + */ + public MemberServiceStatusOutput checkFlowServiceStatus(boolean checkerIsMyself) { + MemberServiceStatusOutput output = new MemberServiceStatusOutput(MemberService.flow); + + if (checkerIsMyself) { + output.setValue(globalConfigService.getFlowConfig().intranetBaseUri); + } + + try { + JObject result = flowService.dashboard(); + + JObject board = result.getJObject(MemberService.board.name()); + JObject gateway = result.getJObject(MemberService.gateway.name()); + + output = buildResult(MemberService.board.name(), board, output); + output = buildResult(MemberService.gateway.name(), gateway, output); + + } catch (Exception e) { + output.setSuccess(false); + output.setMessage(e.getMessage()); + } + + return output; + } + + private MemberServiceStatusOutput buildResult(String checkpoint, JObject obj, MemberServiceStatusOutput output) { + + if (obj == null) { + output.setSuccess(false); + output.setMessage("flow 鏈嶅姟涓嶅彲鐢紝妫鏌ョ偣 " + checkpoint + " 妫鏌ュけ璐ャ"); + } else if (obj.getInteger("code") != null && obj.getInteger("code") == 0) { + output.setSuccess(true); + output.setMessage(obj.getString("message")); + } else { + output.setSuccess(false); + output.setMessage(obj.getString("message")); + } + + return output; + } + + + /** + * check if the flow gateway is available + */ + private GatewayOnlineCheckResult checkGatewayConnect(String gatewayUri) { + GatewayOnlineCheckResult result = new GatewayOnlineCheckResult(); + try { + gatewayService.checkMemberRouteConnect(gatewayUri); + // No exception is reported to prove that the connection is normal + result.setOnline(true); + } catch (StatusCodeWithException e) { + result.setError(e.getMessage()); + } + + return result; + } + + + /** + * Gateway connectivity check result + */ + public static class GatewayOnlineCheckResult { + /** + * error message + */ + private String error; + + private boolean online; + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public boolean isOnline() { + return online; + } + + public void setOnline(boolean online) { + this.online = online; + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ServingService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ServingService.java" new file mode 100644 index 0000000000000000000000000000000000000000..9f459bcb810629ec9f3848b1418e67d2a8e29734 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/ServingService.java" @@ -0,0 +1,268 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.api.data_output_info.SyncModelToServingApi; +import com.welab.wefe.board.service.database.entity.job.JobMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.database.repository.JobRepository; +import com.welab.wefe.board.service.dto.entity.job.JobMemberOutputModel; +import com.welab.wefe.board.service.dto.globalconfig.MemberInfoModel; +import com.welab.wefe.board.service.dto.globalconfig.ServingConfigModel; +import com.welab.wefe.board.service.sdk.UnionService; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.CommonThreadPool; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.Algorithm; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.http.HttpRequest; +import com.welab.wefe.common.http.HttpResponse; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.RSAUtil; +import com.welab.wefe.common.util.StringUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + + +/** + * @author Zane + */ +@Service +public class ServingService extends AbstractService { + + private static final String SEPARATOR = "_"; + + @Autowired + UnionService unionService; + + @Autowired + JobRepository jobRepository; + + @Autowired + JobMemberService jobMemberService; + + @Autowired + TaskResultService taskResultService; + + @Autowired + TaskService taskService; + + @Autowired + private GlobalConfigService globalConfigService; + + /** + * Update serving global configuration + */ + public void asynRefreshMemberInfo(MemberInfoModel model) throws StatusCodeWithException { + + CommonThreadPool.run(() -> { + try { + refreshMemberInfo(model); + } catch (StatusCodeWithException e) { + e.printStackTrace(); + LOG.error("serving 鍝嶅簲澶辫触锛" + e.getMessage(), StatusCode.REMOTE_SERVICE_ERROR); + } + }); + } + + /** + * Update serving global configuration + */ + public void refreshMemberInfo(MemberInfoModel model) throws StatusCodeWithException { + + TreeMap params = new TreeMap<>(); + params.put("member_id", model.getMemberId()); + params.put("member_name", model.getMemberName()); + params.put("rsa_private_key", model.getRsaPrivateKey()); + params.put("rsa_public_key", model.getRsaPublicKey()); + + request("global_setting/refresh", params); + } + + private JSONObject request(String api, TreeMap params) throws StatusCodeWithException { + return request(api, params, true); + } + + /** + * call serving service + * + * @param params TreeMap prevents the map from being out of order, causing the verification to fail. + */ + private JSONObject request(String api, + TreeMap params, + Boolean needSign) throws StatusCodeWithException { + + String data = new JSONObject(params).toJSONString(); + + // sign + if (needSign) { + + String sign = null; + try { + sign = RSAUtil.sign(data, CacheObjects.getRsaPrivateKey()); + } catch (Exception e) { + e.printStackTrace(); + throw new StatusCodeWithException(e.getMessage(), StatusCode.SYSTEM_ERROR); + } + + JSONObject body = new JSONObject(); + body.put("memberId", CacheObjects.getMemberId()); + body.put("sign", sign); + body.put("data", data); + + data = body.toJSONString(); + } + + ServingConfigModel servingConfig = globalConfigService.getServingConfig(); + if (servingConfig == null || StringUtil.isEmpty(servingConfig.intranetBaseUri)) { + StatusCode.RPC_ERROR.throwException("璇峰湪[鍏ㄥ眬璁剧疆][绯荤粺璁剧疆]涓寚瀹 Serving 鏈嶅姟鍦板潃鍚庨噸璇"); + } + + if (!api.startsWith("/")) { + api = "/" + api; + } + + // send request + HttpResponse response = HttpRequest + .create(servingConfig.intranetBaseUri + api) + .setBody(data) + .postJson(); + + if (!response.success()) { + throw new StatusCodeWithException(response.getMessage(), StatusCode.RPC_ERROR); + } + + JSONObject json = response.getBodyAsJson(); + Integer code = json.getInteger("code"); + if (code == null || !code.equals(0)) { + throw new StatusCodeWithException("serving 鍝嶅簲澶辫触(" + code + ")锛" + response.getMessage(), StatusCode.RPC_ERROR); + } + return json; + } + + + /** + * Modeling synchronization to serving + */ + public void syncModelToServing(SyncModelToServingApi.Input input) throws StatusCodeWithException { + + TaskResultMySqlModel taskResult = taskResultService.findByTaskIdAndTypeAndRole(input.getTaskId(), TaskResultType.model_train.name(), input.getRole()); + + if (taskResult == null) { + LOG.error("鏌ヨtask浠诲姟寮傚父"); + throw new StatusCodeWithException(StatusCode.PARAMETER_VALUE_INVALID); + } + + + List memberList = jobMemberService.list(taskResult.getJobId(), false); + + if (CollectionUtils.isEmpty(memberList)) { + LOG.error("鏌ヨjob_member寮傚父"); + throw new StatusCodeWithException(StatusCode.PARAMETER_VALUE_INVALID); + } + + JobMySqlModel job = jobRepository.findByJobId(taskResult.getJobId(), input.getRole().name()); + + if (job == null) { + LOG.error("鏌ヨjob寮傚父"); + throw new StatusCodeWithException(StatusCode.PARAMETER_VALUE_INVALID); + } + + // Feature engineering + List featureEngineerResults = taskResultService.findByTaskIdAndRoleNotEqualType(input.getTaskId(), TaskResultType.model_train.name(), input.getRole()); + Map featrueEngineerMap = new TreeMap<>(); + for (TaskResultMySqlModel fe : featureEngineerResults) { + TaskMySqlModel taskMySqlModel = taskService.findOne(fe.getTaskId()); + if (taskMySqlModel == null) { + LOG.error("鏌ヨtask浠诲姟寮傚父"); + throw new StatusCodeWithException(StatusCode.PARAMETER_VALUE_INVALID); + } + featrueEngineerMap.put(taskMySqlModel.getPosition(), getModelParam(fe.getResult())); + } + + request(memberList, taskResult, featrueEngineerMap, job); + } + + private void request(List memberList, TaskResultMySqlModel taskResult, Map featrueEngineerMap, JobMySqlModel job) throws StatusCodeWithException { + + List members = new ArrayList<>(); + + memberList.forEach(mem -> { + JSONObject member = new JSONObject(); + member.put("memberId", mem.getMemberId()); + member.put("role", mem.getJobRole()); + + // Find the public key + try { + JSONObject json = unionService.queryMemberById(mem.getMemberId()); + member.put("name", json.getJSONObject("data"). + getJSONArray("list"). + getJSONObject(0). + getString("name")); + member.put("publicKey", json.getJSONObject("data"). + getJSONArray("list"). + getJSONObject(0). + getString("public_key")); + } catch (StatusCodeWithException e) { + e.printStackTrace(); + } + + members.add(member); + }); + + + // body + TreeMap params = new TreeMap<>(); + params.put("modelId", taskResult.getJobId() + SEPARATOR + taskResult.getComponentType() + SEPARATOR + taskResult.getFlowNodeId()); + // The v2 version job does not have Algorithm and flType parameters + params.put("algorithm", getAlgorithm(taskResult.getComponentType())); + params.put("flType", job.getFederatedLearningType().name()); + params.put("modelParam", taskResult.getResult()); + params.put("memberParams", members); + params.put("featrueEngineerMap", featrueEngineerMap); + + request("model_save", params, true); + } + + private Algorithm getAlgorithm(ComponentType componentType) { + switch (componentType) { + case HorzLR: + case VertLR: + return Algorithm.LogisticRegression; + case HorzSecureBoost: + case VertSecureBoost: + return Algorithm.XGBoost; + default: + throw new RuntimeException("棰勭畻涔嬪鐨勭粍浠剁被鍨"); + } + } + + private String getModelParam(String taskResult) { + return JObject.create(taskResult).getString("model_param"); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/SystemInitializeService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/SystemInitializeService.java" new file mode 100644 index 0000000000000000000000000000000000000000..ffcf61f039e51e57cfcf76b941963cbeb75e0afd --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/SystemInitializeService.java" @@ -0,0 +1,213 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.api.member.InitializeApi; +import com.welab.wefe.board.service.api.member.UpdateMemberInfoApi; +import com.welab.wefe.board.service.api.member.UpdateMemberLogoApi; +import com.welab.wefe.board.service.database.entity.AccountMySqlModel; +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.database.repository.AccountRepository; +import com.welab.wefe.board.service.database.repository.DataSetRepository; +import com.welab.wefe.board.service.dto.globalconfig.MemberInfoModel; +import com.welab.wefe.board.service.sdk.UnionService; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.FileUtil; +import com.welab.wefe.common.util.RSAUtil; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.CurrentAccount; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.security.NoSuchAlgorithmException; +import java.util.UUID; + +/** + * @author zane.luo + */ +@Service +public class SystemInitializeService extends AbstractService { + + @Autowired + private GlobalConfigService globalConfigService; + + @Autowired + private AccountRepository accountRepository; + + @Autowired + private UnionService unionService; + + @Autowired + private GatewayService gatewayService; + + @Autowired + private ServingService servingService; + + @Autowired + private DataSetRepository dataSetRepository; + + /** + * Synchronize member information to union for the recovery of membership after union data is lost. + */ + public synchronized void syncMemberToUnion() throws StatusCodeWithException { + + AccountMySqlModel account = accountRepository.findByPhoneNumber(CurrentAccount.phoneNumber()); + if (!account.getSuperAdminRole()) { + throw new StatusCodeWithException("鎮ㄦ病鏈夊垵濮嬪寲绯荤粺鐨勬潈闄愶紝璇疯仈绯昏秴绾х鐞嗗憳锛堢涓涓敞鍐岀殑浜猴級杩涜鎿嶄綔銆", StatusCode.INVALID_USER); + } + + unionService.initializeSystem(globalConfigService.getMemberInfo()); + + for (DataSetMysqlModel model : dataSetRepository.findAll()) { + unionService.uploadDataSet(model); + } + } + + + /** + * Is the system initialized + */ + public boolean isInitialized() { + return globalConfigService.getMemberInfo() != null; + } + + /** + * Initialize the system + */ + @Transactional(rollbackFor = Exception.class) + public synchronized void initialize(InitializeApi.Input input) throws StatusCodeWithException { + if (isInitialized()) { + throw new StatusCodeWithException(StatusCode.UNSUPPORTED_HANDLE, "绯荤粺宸插垵濮嬪寲锛屼笉鑳介噸澶嶆搷浣溿"); + } + + AccountMySqlModel account = accountRepository.findByPhoneNumber(CurrentAccount.phoneNumber()); + if (!account.getSuperAdminRole()) { + throw new StatusCodeWithException("鎮ㄦ病鏈夊垵濮嬪寲绯荤粺鐨勬潈闄愶紝璇疯仈绯昏秴绾х鐞嗗憳锛堢涓涓敞鍐岀殑浜猴級杩涜鎿嶄綔銆", StatusCode.INVALID_USER); + } + + MemberInfoModel model = new MemberInfoModel(); + model.setMemberId(UUID.randomUUID().toString().replaceAll("-", "")); + model.setMemberName(input.getMemberName()); + model.setMemberEmail(input.getMemberEmail()); + model.setMemberMobile(input.getMemberMobile()); + model.setMemberAllowPublicDataSet(input.getMemberAllowPublicDataSet()); + model.setMemberHidden(false); + + try { + RSAUtil.RsaKeyPair pair = RSAUtil.generateKeyPair(); + model.setRsaPrivateKey(pair.privateKey); + model.setRsaPublicKey(pair.publicKey); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + throw new StatusCodeWithException(e.getMessage(), StatusCode.SYSTEM_ERROR); + } + + globalConfigService.setMemberInfo(model); + + CacheObjects.refreshMemberInfo(); + + unionService.initializeSystem(model); + + } + + @Transactional(rollbackFor = Exception.class) + public void updateMemberInfo(UpdateMemberInfoApi.Input input) throws StatusCodeWithException { + + AccountMySqlModel account = accountRepository.findByPhoneNumber(CurrentAccount.phoneNumber()); + if (!account.getSuperAdminRole()) { + throw new StatusCodeWithException("鎮ㄦ病鏈夌紪杈戞潈闄愶紝璇疯仈绯昏秴绾х鐞嗗憳锛堢涓涓敞鍐岀殑浜猴級杩涜鎿嶄綔銆", StatusCode.INVALID_USER); + } + + MemberInfoModel model = globalConfigService.getMemberInfo(); + model.setMemberName(input.getMemberName()); + model.setMemberEmail(input.getMemberEmail()); + model.setMemberMobile(input.getMemberMobile()); + model.setMemberAllowPublicDataSet(input.getMemberAllowPublicDataSet()); + model.setMemberGatewayUri(input.getMemberGatewayUri()); + if (StringUtil.isNotEmpty(input.getMemberLogo()) && input.getMemberLogo().contains(",")) { + LOG.info("鍘嬬缉鍓嶏細" + input.getMemberLogo().length()); + String[] strs = input.getMemberLogo().split(","); + model.setMemberLogo(strs[0] + "," + FileUtil.compressPicForScale(strs[1], 200, 0.7)); + LOG.info("鍘嬬缉鍚庯細" + model.getMemberLogo().length()); + } + model.setMemberHidden(input.getMemberHidden()); + + globalConfigService.setMemberInfo(model); + + unionService.uploadMemberInfoExcludeLogo(model); + + CacheObjects.refreshMemberInfo(); + // Notify the gateway to also refresh the corresponding cache + gatewayService.refreshSystemConfigCache(); + } + + + @Transactional(rollbackFor = Exception.class) + public void updateMemberRsaKey() throws StatusCodeWithException { + + AccountMySqlModel account = accountRepository.findByPhoneNumber(CurrentAccount.phoneNumber()); + if (!account.getSuperAdminRole()) { + throw new StatusCodeWithException("鎮ㄦ病鏈夌紪杈戞潈闄愶紝璇疯仈绯昏秴绾х鐞嗗憳锛堢涓涓敞鍐岀殑浜猴級杩涜鎿嶄綔銆", StatusCode.INVALID_USER); + } + + MemberInfoModel model = globalConfigService.getMemberInfo(); + + try { + RSAUtil.RsaKeyPair pair = RSAUtil.generateKeyPair(); + model.setRsaPrivateKey(pair.privateKey); + model.setRsaPublicKey(pair.publicKey); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + throw new StatusCodeWithException(e.getMessage(), StatusCode.SYSTEM_ERROR); + } + + // notify union + unionService.resetPublicKey(model); + globalConfigService.setMemberInfo(model); + + // Update serving global settings + servingService.asynRefreshMemberInfo(model); + + CacheObjects.refreshMemberInfo(); + + // Notify the gateway to also refresh the corresponding cache + gatewayService.refreshSystemConfigCache(); + } + + + /** + * Update member logo + */ + @Transactional(rollbackFor = Exception.class) + public void updateMemberLogo(UpdateMemberLogoApi.Input input) throws StatusCodeWithException { + AccountMySqlModel account = accountRepository.findByPhoneNumber(CurrentAccount.phoneNumber()); + if (!account.getSuperAdminRole()) { + throw new StatusCodeWithException("鎮ㄦ病鏈夌紪杈戞潈闄愶紝璇疯仈绯昏秴绾х鐞嗗憳锛堢涓涓敞鍐岀殑浜猴級杩涜鎿嶄綔銆", StatusCode.INVALID_USER); + } + + MemberInfoModel model = globalConfigService.getMemberInfo(); + model.setMemberLogo(input.getMemberLogo()); + globalConfigService.setMemberInfo(model); + + unionService.updateMemberLogo(model); + } + +} + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/TaskProgressService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/TaskProgressService.java" new file mode 100644 index 0000000000000000000000000000000000000000..714a33ccccc0d644ade6df550eef8043f20e7bec --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/TaskProgressService.java" @@ -0,0 +1,45 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.database.entity.job.TaskProgressMysqlModel; +import com.welab.wefe.board.service.database.repository.TaskProgressRepository; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.JobMemberRole; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +/** + * @author lonnie + */ +@Service +public class TaskProgressService extends AbstractService { + + @Autowired + private TaskProgressRepository taskProgressRepository; + + public TaskProgressMysqlModel findOne(String taskId, JobMemberRole role) { + Specification where = Where + .create() + .equal("taskId", taskId) + .equal("role", role) + .build(TaskProgressMysqlModel.class); + + return taskProgressRepository.findOne(where).orElse(null); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/TaskResultService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/TaskResultService.java" new file mode 100644 index 0000000000000000000000000000000000000000..ac6d96215efd25db83287e3fbbbe8188a34aaa76 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/TaskResultService.java" @@ -0,0 +1,822 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSONArray; +import com.welab.wefe.board.service.api.dataset.DetailApi; +import com.welab.wefe.board.service.api.project.job.task.GetFeatureApi; +import com.welab.wefe.board.service.api.project.job.task.SelectFeatureApi; +import com.welab.wefe.board.service.api.project.job.task.SelectFeatureApi.Input.MemberModel; +import com.welab.wefe.board.service.component.DataIOComponent; +import com.welab.wefe.board.service.component.base.io.Names; +import com.welab.wefe.board.service.component.base.io.NodeOutputItem; +import com.welab.wefe.board.service.component.feature.FeatureSelectionComponent; +import com.welab.wefe.board.service.component.feature.VertOneHotComponent; +import com.welab.wefe.board.service.component.feature.VertOneHotComponent.Params.MemberInfoModel; +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.database.entity.job.ProjectMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.database.repository.TaskRepository; +import com.welab.wefe.board.service.database.repository.TaskResultRepository; +import com.welab.wefe.board.service.dto.entity.MemberFeatureInfoModel; +import com.welab.wefe.board.service.dto.entity.data_set.DataSetOutputModel; +import com.welab.wefe.board.service.exception.FlowNodeException; +import com.welab.wefe.board.service.exception.MemberGatewayException; +import com.welab.wefe.board.service.model.FlowGraph; +import com.welab.wefe.board.service.model.FlowGraphNode; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.TaskResultType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.dto.ApiResult; + +/** + * @author zane.luo + */ +@Service +public class TaskResultService extends AbstractService { + + @Autowired + TaskResultRepository taskResultRepository; + + @Autowired + ProjectFlowNodeService projectFlowNodeService; + + @Autowired + TaskRepository taskRepository; + + @Autowired + ProjectMemberService projectMemberService; + + @Autowired + private JobService jobService; + + @Autowired + private ProjectService projectService; + + @Autowired + private DataSetService datasetService; + + @Autowired + private GatewayService gatewayService; + + /** + * There are multiple results for mixed federations + */ + public List findList(String jobId, String nodeId, JobMemberRole role, String type) { + + Specification where = Where + .create() + .equal("jobId", jobId) + .equal("flowNodeId", nodeId) + .equal("role", role).equal("type", type) + .build(TaskResultMySqlModel.class); + + return taskResultRepository.findAll(where); + } + + + public TaskResultMySqlModel findOne(String jobId, String nodeId, JobMemberRole role, String type) { + + Specification where = Where + .create() + .equal("jobId", jobId) + .equal("flowNodeId", nodeId) + .equal("role", role) + .equal("type", type) + .build(TaskResultMySqlModel.class); + + return taskResultRepository.findOne(where).orElse(null); + } + + public List listAllResult(String taskId) { + Specification where = Where + .create() + .equal("taskId", taskId) + .build(TaskResultMySqlModel.class); + + return taskResultRepository.findAll(where); + } + + /** + * find task result by id and type + */ + public TaskResultMySqlModel findByTaskIdAndType(String taskId, String type) { + + Specification where = Where + .create() + .equal("taskId", taskId) + .equal("type", type) + .build(TaskResultMySqlModel.class); + + return taskResultRepository.findOne(where).orElse(null); + } + + /** + * filter the features + * (1).cv/iv + * (2). Missing rate + * (3). Manually select to + */ + public JObject selectFeature(SelectFeatureApi.Input input) throws StatusCodeWithException { + + FlowGraph flowGraph = jobService.createFlowGraph(input.getFlowId()); + FlowGraphNode node = flowGraph.getNode(input.getFlowNodeId()); + + if (input.getSelectType() == SelectFeatureApi.SelectType.cv_iv) { + return selectByCvIv(flowGraph, node, input); + } else if (input.getSelectType() == SelectFeatureApi.SelectType.miss_rate) { + return selectByMissRate(flowGraph, node, input); + } else { + + List members = input.getMembers(); + + return JObject.create().append("members", members) + .append("featureNum", members.size()); + } + + } + + /** + * filter the features by cv/iv + */ + private JObject selectByCvIv(FlowGraph flowGraph, FlowGraphNode node, SelectFeatureApi.Input input) throws FlowNodeException { + + JObject result = JObject.create(); + List selectMembers = new ArrayList<>(); + // mix flow + if (flowGraph.getFederatedLearningType() == FederatedLearningType.mix) { + FlowGraphNode featureStatisticNode = flowGraph.findOneNodeFromParent(node, ComponentType.MixStatistic); + if (featureStatisticNode == null) { + throw new FlowNodeException(node, "璇锋坊鍔犵壒寰佺粺璁$粍浠躲"); + } + + FlowGraphNode featureBinningNode = flowGraph.findOneNodeFromParent(node, ComponentType.MixBinning); + if (featureBinningNode == null) { + throw new FlowNodeException(node, "璇锋坊鍔犵壒寰佸垎绠辩粍浠躲"); + } + + // Find the task corresponding to the FeatureStatistic node + ProjectMySqlModel project = projectService.findProjectByJobId(input.getJobId()); + TaskMySqlModel featureStatisticTask = taskRepository.findOne(input.getJobId(), featureStatisticNode.getNodeId(), project.getMyRole().name()); + if (featureStatisticTask == null) { + throw new FlowNodeException(node, "鎵句笉鍒板搴旂殑鐗瑰緛缁熻浠诲姟銆"); + } + + // Find the task result of FeatureStatistic + TaskResultMySqlModel featureStatisticTaskResult = findByTaskIdAndType(featureStatisticTask.getTaskId(), TaskResultType.data_feature_statistic.name()); + + if (featureStatisticTaskResult == null) { + return JObject.create(); + } + + JObject statisticResult = JObject.create(featureStatisticTaskResult.getResult()); + + TaskMySqlModel featureBinningTask = taskRepository.findOne(input.getJobId(), featureBinningNode.getNodeId(), project.getMyRole().name()); + if (featureBinningTask == null) { + throw new FlowNodeException(node, "鎵句笉鍒板搴旂殑鐗瑰緛鍒嗙浠诲姟銆"); + } + // Find the task result of FeatureBinning + TaskResultMySqlModel featureBinningTaskResult = findByTaskIdAndType(featureBinningTask.getTaskId(), TaskResultType.model_binning.name()); + + if (featureBinningTaskResult == null) { + return JObject.create(); + } + + List featureBinningResults = parseBinningResult(featureBinningTaskResult); + List statisticResultMembers = statisticResult.getJSONList("members"); + for (JObject memberObj : statisticResultMembers) { + Map cvMap = new HashMap<>(); + Map ivMap = new HashMap<>(); + + String memberId = memberObj.getString("member_id"); + String role = memberObj.getString("role"); + + JObject featureBinningResult = featureBinningResults.stream() + .filter(s -> role.equalsIgnoreCase(s.getString("role")) + && memberId.equalsIgnoreCase(s.getString("memberId"))) + .findFirst().orElse(null); + if (featureBinningResult != null) { + featureBinningResult = featureBinningResult.getJObject("binningResult"); + } + JObject feature_statistic = memberObj.getJObject("feature_statistic"); + Set featuresKey = feature_statistic.keySet(); + for (String feature : featuresKey) { + JObject statisticData = feature_statistic.getJObject(feature); + double cv = statisticData.getDouble("cv"); + BigDecimal bg = new BigDecimal(cv); + cvMap.put(feature, bg.setScale(4, RoundingMode.HALF_UP).doubleValue()); + } + if (featureBinningResult != null) { + featuresKey = featureBinningResult.keySet(); + for (String feature : featuresKey) { + JObject binningData = featureBinningResult.getJObject(feature); + double iv = binningData.getDouble("iv"); + BigDecimal bgiv = new BigDecimal(iv); + ivMap.put(feature, bgiv.setScale(4, RoundingMode.HALF_UP).doubleValue()); + } + } + + // Get the feature column of the current member + List currentMembers = input.getMembers().stream().filter( + x -> x.getMemberId().equals(memberId) && x.getMemberRole() == JobMemberRole.valueOf(role)) + .collect(Collectors.toList()); + if (JobMemberRole.promoter.name().equalsIgnoreCase(role)) { + currentMembers = input.getMembers().stream() + .filter(x -> x.getMemberRole() == JobMemberRole.promoter).collect(Collectors.toList()); + } + + for (MemberModel model : currentMembers) { + if (cvMap.get(model.getName()) != null) { + model.setCv(cvMap.get(model.getName())); + } + if (ivMap.get(model.getName()) != null) { + model.setIv(ivMap.get(model.getName())); + } + } + + // Perform cv filtering + for (MemberModel model : currentMembers) { + if (model.getIv() >= input.getIv() && model.getCv() >= input.getCv()) { + selectMembers.add(model); + } + } + } + + } + else { + // Find the FeatureCalculation node in the parent node + FlowGraphNode featureCalculationNode = flowGraph.findOneNodeFromParent(node, ComponentType.FeatureCalculation); + + if (featureCalculationNode == null) { + throw new FlowNodeException(node, "璇锋坊鍔犵壒寰佽绠楃粍浠躲"); + } + + // Find the task corresponding to the FeatureCalculation node + ProjectMySqlModel project = projectService.findProjectByJobId(input.getJobId()); + TaskMySqlModel featureCalculationTask = taskRepository.findOne(input.getJobId(), featureCalculationNode.getNodeId(), project.getMyRole().name()); + if (featureCalculationTask == null) { + throw new FlowNodeException(node, "鎵句笉鍒板搴旂殑鐗瑰緛璁$畻浠诲姟銆"); + } + + // Find the task result of FeatureCalculation + TaskResultMySqlModel featureCalculationTaskResult = findByTaskIdAndType(featureCalculationTask.getTaskId(), TaskResultType.model_result.name()); + if (featureCalculationTaskResult == null) { + return JObject.create(); + } + + result = JObject.create(featureCalculationTaskResult.getResult()); + List calculateResults = result.getJSONList("model_param.calculateResults"); + + for (JObject obj : calculateResults) { + String role = obj.getString("role"); + String memberId = obj.getString("memberId"); + + List results = obj.getJSONList("results"); + + JSONArray ivValue = new JSONArray(); + JSONArray ivCols = new JSONArray(); + JSONArray cvValue = new JSONArray(); + JSONArray cvCols = new JSONArray(); + Map cvMap = new HashMap<>(); + Map ivMap = new HashMap<>(); + + // Store the cv/iv value in the map in the form of key: "x1" value: 0.123 + for (JObject resultObj : results) { + + if ("iv_value_thres".equals(resultObj.getString("filterName"))) { + ivValue = resultObj.getJSONArray("values"); + ivCols = resultObj.getJSONArray("cols"); + } + if ("coefficient_of_variation_value_thres".equals(resultObj.getString("filterName"))) { + cvValue = resultObj.getJSONArray("values"); + cvCols = resultObj.getJSONArray("cols"); + } + + for (int i = 0; i < ivCols.size(); i++) { + ivMap.put(ivCols.getString(i), ivValue.getDoubleValue(i)); + } + + for (int i = 0; i < cvCols.size(); i++) { + cvMap.put(cvCols.getString(i), cvValue.getDoubleValue(i)); + } + } + + // Get the feature column of the current member + List currentMembers = input.getMembers().stream().filter(x -> x.getMemberId().equals(memberId) && x.getMemberRole() == JobMemberRole.valueOf(role)) + .collect(Collectors.toList()); + + // Assign cv/iv values to features + for (MemberModel model : currentMembers) { + if (cvMap.get(model.getName()) != null) { + model.setCv(cvMap.get(model.getName())); + } + if (ivMap.get(model.getName()) != null) { + model.setIv(ivMap.get(model.getName())); + } + } + + // Filter + for (MemberModel model : currentMembers) { + if (model.getIv() >= input.getIv() && model.getCv() >= input.getCv()) { + selectMembers.add(model); + } + } + } + + } + + return JObject + .create() + .append("members", selectMembers) + .append("featureNum", selectMembers.size()); + } + + private List parseBinningResult(TaskResultMySqlModel featureBinningTaskResult) { + JObject binningResult = JObject.create(featureBinningTaskResult.getResult()); + JObject promoterBinningResult = binningResult.getJObject("model_param").getJObject("binningResult"); + List providerBinningResults = binningResult.getJSONList("model_param.providerResults"); + List binningResults = new ArrayList<>(); + binningResults.add(promoterBinningResult); + binningResults.addAll(providerBinningResults); + return binningResults; + } + + /** + * filter the features by missing rate + */ + private JObject selectByMissRate(FlowGraph flowGraph, FlowGraphNode node, SelectFeatureApi.Input input) throws FlowNodeException { + // Find the FeatureStatistic node in the parent node + FlowGraphNode featureStatisticNode = flowGraph.findOneNodeFromParent(node, + x -> x.getComponentType() == ComponentType.FeatureStatistic + || x.getComponentType() == ComponentType.MixStatistic); + + if (featureStatisticNode == null) { + throw new FlowNodeException(node, "璇锋坊鍔犵壒寰佺粺璁$粍浠躲"); + } + + // Find the task corresponding to the FeatureStatistic node + ProjectMySqlModel project = projectService.findProjectByJobId(input.getJobId()); + TaskMySqlModel featureStatisticTask = taskRepository.findOne(input.getJobId(), featureStatisticNode.getNodeId(), project.getMyRole().name()); + if (featureStatisticTask == null) { + throw new FlowNodeException(node, "鎵句笉鍒扮壒寰佺粺璁¤妭鐐瑰搴旂殑浠诲姟銆"); + } + + // Find the task result of FeatureStatistic + TaskResultMySqlModel featureStatisticTaskResult = findByTaskIdAndType(featureStatisticTask.getTaskId(), TaskResultType.data_feature_statistic.name()); + + if (featureStatisticTaskResult == null) { + return JObject.create(); + } + + JObject result = JObject.create(featureStatisticTaskResult.getResult()); + + List resultMembers = result.getJSONList("members"); + List selectMembers = new ArrayList<>(); + + for (JObject memberObj : resultMembers) { + Map missingValueMap = new HashMap<>(); + + String memberId = memberObj.getString("member_id"); + String role = memberObj.getString("role"); + + JObject feature_statistic = memberObj.getJObject("feature_statistic"); + + Set featuresKey = feature_statistic.keySet(); + + // Calculate the missing rate from the statistical data of the feature and store it in the map, key: "x1" value: 0.01 + for (String feature : featuresKey) { + JObject statisticData = feature_statistic.getJObject(feature); + + double not_null_count = statisticData.getDouble("not_null_count"); + double missing_count = statisticData.getDouble("missing_count"); + double missingValue = missing_count / (missing_count + not_null_count); + BigDecimal bg = new BigDecimal(missingValue); + + missingValueMap.put(feature, bg.setScale(4, RoundingMode.HALF_UP).doubleValue()); + } + + // Get the feature column of the current member + List currentMembers = input.getMembers().stream().filter(x -> x.getMemberId().equals(memberId) && x.getMemberRole() == JobMemberRole.valueOf(role)) + .collect(Collectors.toList()); + + // Assign values to features with missing values + for (MemberModel model : currentMembers) { + if (missingValueMap.get(model.getName()) != null) { + model.setMissRate(missingValueMap.get(model.getName())); + } + } + + // Perform missingValue filtering + for (MemberModel model : currentMembers) { + if (model.getMissRate() >= input.getMissRate()) { + selectMembers.add(model); + } + } + } + + return JObject + .create() + .append("members", selectMembers) + .append("featureNum", selectMembers.size()); + } + + /** + * Get feature list + */ + public GetFeatureApi.Output getResultFeature(GetFeatureApi.Input input) throws StatusCodeWithException { + GetFeatureApi.Output out = new GetFeatureApi.Output(); + FlowGraph graph = jobService.createFlowGraph(input.getFlowId()); + + FlowGraphNode node = graph.getNode(input.getFlowNodeId()); + + // If the current node is a feature screening node, + // it is necessary to determine whether the previous component has feature calculation (the result has cv/iv)/feature statistics (the result has a missing rate) + if (node.getComponentType() == ComponentType.FeatureSelection) { + FlowGraphNode featureStatisticNode = graph.findOneNodeFromParent(node, + x -> x.getComponentType() == ComponentType.MixStatistic + || x.getComponentType() == ComponentType.FeatureStatistic); + out.setHasFeatureStatistic(false); + out.setHasFeatureCalculation(false); + if (featureStatisticNode != null && StringUtil.isNotEmpty(input.getJobId())) { + ProjectMySqlModel project = projectService.findProjectByJobId(input.getJobId()); + TaskMySqlModel featureStatisticTask = taskRepository.findOne(input.getJobId(), featureStatisticNode.getNodeId(), project.getMyRole().name()); + if (featureStatisticTask != null) { + + TaskResultMySqlModel featureStatisticResult = findByTaskIdAndTypeAndRole(featureStatisticTask.getTaskId(), TaskResultType.data_feature_statistic.name(), project.getMyRole()); + if (featureStatisticResult != null) { + out.setHasFeatureStatistic(true); + } + } + } + + FlowGraphNode featureCalculationNode = graph.findOneNodeFromParent(node, ComponentType.FeatureCalculation); + if (featureCalculationNode != null && StringUtil.isNotEmpty(input.getJobId())) { + ProjectMySqlModel project = projectService.findProjectByJobId(input.getJobId()); + TaskMySqlModel featureCalculationTask = taskRepository.findOne(input.getJobId(), featureCalculationNode.getNodeId(), project.getMyRole().name()); + if (featureCalculationTask != null) { + + TaskResultMySqlModel featureCalculationResult = findByTaskIdAndTypeAndRole(featureCalculationTask.getTaskId(), TaskResultType.model_result.name(), project.getMyRole()); + if (featureCalculationResult != null) { + out.setHasFeatureCalculation(true); + } + } + } + + FlowGraphNode featureBinningNode = graph.findOneNodeFromParent(node, + x -> x.getComponentType() == ComponentType.MixBinning + || x.getComponentType() == ComponentType.Binning); + if (featureBinningNode != null && StringUtil.isNotEmpty(input.getJobId())) { + ProjectMySqlModel project = projectService.findProjectByJobId(input.getJobId()); + TaskMySqlModel featureBinningTask = taskRepository.findOne(input.getJobId(), + featureBinningNode.getNodeId(), project.getMyRole().name()); + if (featureBinningTask != null) { + TaskResultMySqlModel featureBinningResult = findByTaskIdAndTypeAndRole( + featureBinningTask.getTaskId(), TaskResultType.model_binning.name(), project.getMyRole()); + if (featureBinningResult != null) { + out.setHasFeatureCalculation(true && out.isHasFeatureStatistic()); + } + } + } + } + + List members = getMemberFeatures(graph, node); + out.setMembers(members); + return out; + } + + /** + * Find the feature column in the training data set: + * take the feature column from (DataIO/binning/feature filtering) + */ + public List getMemberFeatures(FlowGraph graph, FlowGraphNode node) throws FlowNodeException { + List nodeOutputItems = node.getComponent().findInputNodes(graph, node); + + // There is only one training data set by default, + // and the situation where there are multiple training data sets will not be processed for the time being. + NodeOutputItem trainDataSetNodeOutputItem = nodeOutputItems.stream().filter(x -> x.getName().equals(Names.Data.NORMAL_DATA_SET)).findFirst().orElse(null); + if (trainDataSetNodeOutputItem == null) { + for (NodeOutputItem item : nodeOutputItems) { + // Going here shows that the training data set is not found, + // and you need to continue to look for the parent node. + return getMemberFeatures(graph, graph.getNode(item.getNodeId())); + } + } + + if (trainDataSetNodeOutputItem.getComponentType() == ComponentType.DataIO) { + + return getDataIOFeature(graph.getNode(trainDataSetNodeOutputItem.getNodeId())); + } else if (trainDataSetNodeOutputItem.getComponentType() == ComponentType.FeatureSelection) { + + return getFeatureSelectFeature(graph.getNode(trainDataSetNodeOutputItem.getNodeId()), graph); + } else if (trainDataSetNodeOutputItem.getComponentType() == ComponentType.HorzOneHot || trainDataSetNodeOutputItem.getComponentType() == ComponentType.VertOneHot){ + return getOneHotFeature(graph.getNode(trainDataSetNodeOutputItem.getNodeId()), graph); + } else { + return getMemberFeatures(graph, graph.getNode(trainDataSetNodeOutputItem.getNodeId())); + } + } + + private List getOneHotFeature(FlowGraphNode node, FlowGraph flowGraph) + throws FlowNodeException { + List members = new ArrayList<>(); + + FlowGraphNode dataIONode = flowGraph.findOneNodeFromParent(node, ComponentType.DataIO); + DataIOComponent.Params dataIOParams = JObject.create(dataIONode.getParams()) + .toJavaObject(DataIOComponent.Params.class); + + List dataSetItems = dataIOParams.getDataSetList(); + + // need filter + VertOneHotComponent.Params params = JObject.create(node.getParams()) + .toJavaObject(VertOneHotComponent.Params.class); + if (params == null || CollectionUtils.isEmpty(params.getMembers())) { + return getMemberFeatures(flowGraph, flowGraph.getNode(node.getNodeId())); + } + for (MemberInfoModel memberInfoModel : params.getMembers()) { + for (DataIOComponent.DataSetItem dataSetItem : dataSetItems) { + if (memberInfoModel.getMemberRole() == dataSetItem.getMemberRole() + && memberInfoModel.getMemberId().equals(dataSetItem.getMemberId())) { + List needPassFeatures = memberInfoModel.getFeatures(); + MemberFeatureInfoModel member = new MemberFeatureInfoModel(); + member.setMemberId(dataSetItem.getMemberId()); + member.setMemberRole(dataSetItem.getMemberRole()); + List features = new ArrayList<>(); + for (String name : dataSetItem.getFeatures()) { + if (needPassFeatures != null && needPassFeatures.contains(name)) { + continue; // pass + } + MemberFeatureInfoModel.Feature feature = new MemberFeatureInfoModel.Feature(); + feature.setName(name); + features.add(feature); + } + member.setFeatures(features); + member.setDataSetId(dataSetItem.getDataSetId()); + member.setMemberName(CacheObjects.getMemberName(member.getMemberId())); + members.add(member); + } + } + } + DataSetMysqlModel myTmpDataSet = datasetService.query(flowGraph.getLastJob().getJobId(), + node.getComponentType()); + if (myTmpDataSet != null) { + for (MemberFeatureInfoModel member : members) { + if (!member.getMemberId().equalsIgnoreCase(CacheObjects.getMemberId())) { + DetailApi.Input input = new DetailApi.Input(); + input.setId(myTmpDataSet.getId()); + try { + ApiResult apiResult = gatewayService.sendToBoardRedirectApi(member.getMemberId(), + JobMemberRole.promoter, input, DetailApi.class); + if (apiResult.data != null) { + DataSetOutputModel output = JObject.create(apiResult.data) + .toJavaObject(DataSetOutputModel.class); + LOG.info("getOneHotFeature request : " + JObject.toJSONString(input)); + List newColumnNameList = new ArrayList<>( + Arrays.asList(output.getFeatureNameList().split(","))); + List oldFeatures = member.getFeatures(); + + List newFeatures = new ArrayList<>(); + for (MemberFeatureInfoModel.Feature feature : oldFeatures) { + if (newColumnNameList.contains(feature.getName())) { + newFeatures.add(feature); + newColumnNameList.remove(feature.getName()); + } + } + if (newColumnNameList != null && !newColumnNameList.isEmpty()) { + for (String s : newColumnNameList) { + MemberFeatureInfoModel.Feature f = new MemberFeatureInfoModel.Feature(); + f.setName(s); + newFeatures.add(f); + } + } + member.setFeatures(newFeatures); + } + } catch (MemberGatewayException e) { + throw new FlowNodeException(node, member.getMemberId()); + } + } else { + List newColumnNameList = new ArrayList<>( + Arrays.asList(myTmpDataSet.getFeatureNameList().split(","))); + List oldFeatures = member.getFeatures(); + + List newFeatures = new ArrayList<>(); + for (MemberFeatureInfoModel.Feature feature : oldFeatures) { + if (newColumnNameList.contains(feature.getName())) { + newFeatures.add(feature); + newColumnNameList.remove(feature.getName()); + } + } + if (newColumnNameList != null && !newColumnNameList.isEmpty()) { + for (String s : newColumnNameList) { + MemberFeatureInfoModel.Feature f = new MemberFeatureInfoModel.Feature(); + f.setName(s); + newFeatures.add(f); + } + } + member.setFeatures(newFeatures); + } + } + } + return members; + } + + + /** + * From the feature column in the DataIO node params + */ + public List getDataIOFeature(FlowGraphNode node) { + + List members = new ArrayList<>(); + + // Find the params of the DataIO node and assemble the feature column + DataIOComponent.Params params = JObject + .create(node.getParams()) + .toJavaObject(DataIOComponent.Params.class); + + List dataSetItems = params.getDataSetList(); + for (DataIOComponent.DataSetItem dataSetItem : dataSetItems) { + MemberFeatureInfoModel member = new MemberFeatureInfoModel(); + member.setMemberId(dataSetItem.getMemberId()); + member.setMemberRole(dataSetItem.getMemberRole()); + + List features = new ArrayList<>(); + for (String name : dataSetItem.getFeatures()) { + MemberFeatureInfoModel.Feature feature = new MemberFeatureInfoModel.Feature(); + feature.setName(name); + features.add(feature); + } + member.setFeatures(features); + member.setDataSetId(dataSetItem.getDataSetId()); + member.setMemberName(CacheObjects.getMemberName(member.getMemberId())); + members.add(member); + } + + return members; + } + + /** + * Filter the feature column in the node params from the feature + */ + public List getFeatureSelectFeature(FlowGraphNode node, FlowGraph flowGraph) { + JObject featureSelectFeature = JObject.create(); + + FeatureSelectionComponent.Params params = JObject + .create(node.getParams()) + .toJavaObject(FeatureSelectionComponent.Params.class); + + FlowGraphNode dataIONode = flowGraph.findOneNodeFromParent(node, ComponentType.DataIO); + DataIOComponent.Params dataIOParams = JObject + .create(dataIONode.getParams()) + .toJavaObject(DataIOComponent.Params.class); + + List dataSetList = dataIOParams.getDataSetList(); + + for (MemberFeatureInfoModel memberFeatureInfoModel : params.getMembers()) { + for (DataIOComponent.DataSetItem dataSetItem : dataSetList) { + if (memberFeatureInfoModel.getMemberRole() == dataSetItem.getMemberRole() && memberFeatureInfoModel.getMemberId().equals(dataSetItem.getMemberId())) { + memberFeatureInfoModel.setDataSetId(dataSetItem.getDataSetId()); + } + } + } + + featureSelectFeature.append("members", params.getMembers()); + + return params.getMembers(); + } + + /** + * Get the feature column in the binning component result + */ + public List getBinningResultFeature(TaskMySqlModel task) { + List members = new ArrayList<>(); + + TaskResultMySqlModel taskResultMySqlModel = findByTaskIdAndType(task.getTaskId(), TaskResultType.model_binning.name()); + + if (taskResultMySqlModel == null) { + return members; + } + JObject resultObj = JObject.create(taskResultMySqlModel.getResult()); + JObject modelParam = resultObj.getJObject("model_param"); + JObject binningResult = modelParam.getJObject("binningResult"); + List providerResults = modelParam.getJSONList("providerResults"); + + // Analyze the feature column of the promoter side + members.add(parserBinningResult(binningResult)); + + // Analyze the characteristics of the provider + for (JObject providerObj : providerResults) { + members.add(parserBinningResult(providerObj)); + } + + return members; + } + + + public MemberFeatureInfoModel parserBinningResult(JObject result) { + MemberFeatureInfoModel member = new MemberFeatureInfoModel(); + member.setMemberId(result.getString("memberId")); + member.setMemberRole(JobMemberRole.valueOf(result.getString("role"))); + Set featureNames = result.getJObject("binningResult").keySet(); + List features = new ArrayList<>(); + for (String name : featureNames) { + MemberFeatureInfoModel.Feature feature = new MemberFeatureInfoModel.Feature(); + feature.setName(name); + features.add(feature); + } + + member.setFeatures(features); + member.setMemberName(CacheObjects.getMemberName(member.getMemberId())); + + return member; + } + + public List findTaskResult(String jobId, String taskId, ComponentType componentType) { + + Specification where = Where + .create() + .equal("jobId", jobId) + .equal("componentType", componentType) + .equal("taskId", taskId) + .notEqual("role", JobMemberRole.arbiter) + .build(TaskResultMySqlModel.class); + + return taskResultRepository.findAll(where); + + } + + /** + * Find out the task result by id, type and role. + */ + public TaskResultMySqlModel findByTaskIdAndTypeAndRole(String taskId, String type, JobMemberRole role) { + + Specification where = Where + .create() + .equal("taskId", taskId) + .equal("type", type) + .equal("role", role) + .build(TaskResultMySqlModel.class); + + return taskResultRepository.findOne(where).orElse(null); + } + + + /** + * Find out the task result by id, type and role. + */ + public List findByTaskIdAndRoleNotEqualType(String taskId, String type, JobMemberRole role) { + + Specification where = Where + .create() + .equal("taskId", taskId) + .notEqual("type", type) + .equal("role", role) + .equal("servingModel", true) + .build(TaskResultMySqlModel.class); + + return taskResultRepository.findAll(where); + } + + public TaskResultMySqlModel findModelByJobIdAndNodeIdAndRole(String jobId, String flowNodeId, JobMemberRole role) { + Specification where = Where + .create() + .equal("jobId", jobId) + .equal("flowNodeId", flowNodeId) + .equal("role", role) + .equal("servingModel", true) + .build(TaskResultMySqlModel.class); + return taskResultRepository.findOne(where).orElse(null); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/TaskService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/TaskService.java" new file mode 100644 index 0000000000000000000000000000000000000000..fd6e46c0ff7bad9bb83e0245cefe1eb223397366 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/TaskService.java" @@ -0,0 +1,480 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.welab.wefe.board.service.api.project.flow.QueryDataIoTaskConfigApi; +import com.welab.wefe.board.service.api.project.flow.QueryDataIoTaskFeaturesApi; +import com.welab.wefe.board.service.api.project.job.task.DetailApi; +import com.welab.wefe.board.service.component.OotComponent; +import com.welab.wefe.board.service.database.entity.job.*; +import com.welab.wefe.board.service.database.repository.TaskRepository; +import com.welab.wefe.board.service.dto.entity.DataIoTaskFeatureInfoOutputModel; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.OrderBy; +import com.welab.wefe.common.enums.TaskStatus; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.CurrentAccount; +import com.welab.wefe.common.web.dto.ApiResult; +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author seven.zeng + */ +@Service +public class TaskService { + protected final Logger LOG = LoggerFactory.getLogger(this.getClass()); + + @Autowired + TaskRepository taskRepo; + + @Autowired + private ProjectService projectService; + + @Autowired + private JobService jobService; + + @Autowired + private JobMemberService jobMemberService; + + @Autowired + private GatewayService gatewayService; + + @Autowired + private ProjectFlowService projectFlowService; + + @Autowired + private ProjectFlowNodeService projectFlowNodeService; + + /** + * Query all execution records of a node + */ + public List findTaskHistory(String flowId, String flowNodeId, JobMemberRole role) { + return taskRepo + .findAll( + Where + .create() + .equal("flowId", flowId) + .equal("flowNodeId", flowNodeId) + .equal("role", role) + .notEqual("status", TaskStatus.wait_run) + .orderBy("createdTime", OrderBy.desc) + .build(TaskMySqlModel.class) + ); + } + + public TaskMySqlModel findOne(DetailApi.Input input) { + if (StringUtil.isNotEmpty(input.getTaskId())) { + return findOne(input.getTaskId()); + } else { + + ProjectMySqlModel project = projectService.findProjectByJobId(input.getJobId()); + + if (project == null) { + return null; + } + + return taskRepo.findOne(input.getJobId(), input.getFlowNodeId(), project.getMyRole().name()); + } + } + + public List findAll(DetailApi.Input input) { + ProjectMySqlModel project = projectService.findProjectByJobId(input.getJobId()); + if (project == null) { + return null; + } + return findAll(input.getJobId(), input.getFlowNodeId(), project.getMyRole()); + } + + public TaskMySqlModel findOne(String taskId) { + return taskRepo + .findOne( + Where + .create() + .equal("taskId", taskId) + .notEqual("role", JobMemberRole.arbiter) + .build(TaskMySqlModel.class) + ) + .orElse(null); + } + + public TaskMySqlModel findOne(String jobId, String flowNodeId, JobMemberRole role) { + return taskRepo + .findOne( + Where + .create() + .equal("jobId", jobId) + .equal("flowNodeId", flowNodeId) + .equal("role", role) + .build(TaskMySqlModel.class) + ) + .orElse(null); + } + + public List findAll(String jobId, String flowNodeId, JobMemberRole role) { + return taskRepo + .findAll( + Where + .create() + .equal("jobId", jobId) + .equal("flowNodeId", flowNodeId) + .equal("role", role) + .build(TaskMySqlModel.class) + ); + } + + /** + * Due to the existence of arbit, there may be two pieces of data here. + */ + public List findAll(String jobId, String flowNodeId) { + return taskRepo + .findAll( + Where + .create() + .equal("jobId", jobId) + .equal("flowNodeId", flowNodeId) + .build(TaskMySqlModel.class) + ); + } + + /** + * Get all tasks under job + */ + public List listByJobId(String jobId, JobMemberRole role) { + + Specification where = Where + .create() + .equal("jobId", jobId) + .equal("role", role) + .orderBy("position", OrderBy.asc) + .build(TaskMySqlModel.class); + + return taskRepo.findAll(where); + } + + public TaskMySqlModel updateTask(TaskMySqlModel model, Function func) { + + if (model == null) { + return null; + } + + model = func.apply(model); + model.setUpdatedBy(CurrentAccount.id()); + + return taskRepo.save(model); + } + + public TaskMySqlModel findByParentTaskId(String parentTaskId) { + + return taskRepo.findOne("parentTaskId", parentTaskId, TaskMySqlModel.class); + } + + /** + * Find out all tasks that meet the conditions + */ + public List findAll(String jobId, String flowId, ComponentType componentType) { + Specification where = Where + .create() + .equal("jobId", jobId) + .equal("flowId", flowId) + .equal("taskType", componentType) + .orderBy("createdTime", OrderBy.desc) + .build(TaskMySqlModel.class); + + return taskRepo.findAll(where); + } + + /** + * get config of DataIO task + */ + public JObject findDataIoTaskConfig(QueryDataIoTaskConfigApi.Input input) { + TaskMySqlModel taskMySqlModel = findDataIoTask(input.getJobId(), input.getRole()); + if (null == taskMySqlModel) { + return JObject.create(); + } + + return JObject.create(taskMySqlModel.getTaskConf()); + } + + public TaskMySqlModel findDataIoTask(String jobId, JobMemberRole role) { + List taskMySqlModelList = listByJobId(jobId, role); + if (CollectionUtils.isEmpty(taskMySqlModelList)) { + return null; + } + + return taskMySqlModelList.stream().filter(x -> OotComponent.DATA_IO_COMPONENT_TYPE_LIST.contains(x.getTaskType())).findFirst().orElse(null); + } + + /** + * According to JobId, role and task ID, + * find out the list of all nodes in the same branch of task id. + */ + public List findHomologousBranchByJobId(String jobId, JobMemberRole role, String taskId) throws StatusCodeWithException { + JobMySqlModel jobMySqlModel = jobService.findByJobId(jobId, role); + if (null == jobMySqlModel) { + throw new StatusCodeWithException("鎵句笉鍒颁换鍔′俊鎭", StatusCode.DATA_NOT_FOUND); + } + + List totalTaskList = listByJobId(jobId, role); + + return baseFindHomologousBranch(totalTaskList, taskId); + } + + /** + * Find out the branch node of the specified task id from the list of all tasks + */ + public List baseFindHomologousBranch(List totalTaskList, String taskId) { + // List of all nodes in the same branch + List resultTaskList = new ArrayList<>(); + if (CollectionUtils.isEmpty(totalTaskList)) { + return resultTaskList; + } + + // First find out all the child nodes under the taskId + List totalSubTaskMysqlModelList = new ArrayList<>(); + findTotalSubTaskMysqlModelList(totalSubTaskMysqlModelList, totalTaskList, taskId); + // The child node is not empty to prove that there are child nodes under the node, + // then take the last child node as the end node and then go forward to get all the parent nodes of its branch. + if (CollectionUtils.isNotEmpty(totalSubTaskMysqlModelList)) { + taskId = totalSubTaskMysqlModelList.get(totalSubTaskMysqlModelList.size() - 1).getTaskId(); + } + + findTotalParentTaskMysqlModelList(resultTaskList, totalTaskList, taskId); + // Since the returned parent node result is from bottom to top, + // it needs to be reversed + // (normally it should be sorted in ascending order according to the deep field, + // but since the incoming original list is already sorted according to the deep field, + // it can be reversed directly) + Collections.reverse(resultTaskList); + return resultTaskList; + } + + + /** + * Query the entry feature information of DataIo + */ + public List findDataIoTaskFeatures(QueryDataIoTaskFeaturesApi.Input input) throws StatusCodeWithException { + + boolean isOotMode = StringUtil.isNotEmpty(input.getJobId()); + return isOotMode ? findDataIoTaskFeaturesWithOot(input) : findDataIoTaskFeaturesWithNonOot(input); + } + + + /** + * Query DataIo's entry feature information (oot mode) + *

+ * In oot mode, the entry feature list of other members is stored in its own database, + * so it is necessary to send a request to get the entry feature list to the other party's system. + */ + private List findDataIoTaskFeaturesWithOot(QueryDataIoTaskFeaturesApi.Input input) throws StatusCodeWithException { + List resultList = new ArrayList<>(); + + JobMySqlModel jobMySqlModel = jobService.findByJobId(input.getJobId(), JobMemberRole.promoter); + if (null == jobMySqlModel) { + throw new StatusCodeWithException("鎵句笉鍒扮浉鍏硃romoter鐩稿簲浠诲姟淇℃伅锛岃纭璇ヨ姹傛槸鐢眕romoter鍙戣捣銆", StatusCode.DATA_NOT_FOUND); + } + + List jobMemberMySqlModelList = jobMemberService.findListByJobId(input.getJobId()); + if (CollectionUtils.isEmpty(jobMemberMySqlModelList)) { + throw new StatusCodeWithException("涓嶅瓨鍦ㄤ换浣曟垚鍛樹俊鎭", StatusCode.DATA_NOT_FOUND); + } + // Filter arbiter role + jobMemberMySqlModelList = jobMemberMySqlModelList.stream().filter(x -> !JobMemberRole.arbiter.equals(x.getJobRole())).collect(Collectors.toList()); + // Query designated members + if (StringUtil.isNotEmpty(input.getMemberId())) { + jobMemberMySqlModelList = jobMemberMySqlModelList.stream().filter(x -> x.getMemberId().equals(input.getMemberId())).collect(Collectors.toList()); + } + + if (CollectionUtils.isEmpty(jobMemberMySqlModelList)) { + throw new StatusCodeWithException("鎵句笉鍒拌鎴愬憳鐨勪换鍔′俊鎭", StatusCode.DATA_NOT_FOUND); + } + + DataIoTaskFeatureInfoOutputModel dataIoTaskFeatureInfoOutputModel = null; + // Obtain the job configuration of the provider + for (JobMemberMySqlModel jobMemberMySqlModel : jobMemberMySqlModelList) { + dataIoTaskFeatureInfoOutputModel = new DataIoTaskFeatureInfoOutputModel(); + dataIoTaskFeatureInfoOutputModel.setMemberId(jobMemberMySqlModel.getMemberId()); + dataIoTaskFeatureInfoOutputModel.setRole(jobMemberMySqlModel.getJobRole()); + dataIoTaskFeatureInfoOutputModel.setDataSetId(jobMemberMySqlModel.getDataSetId()); + String memberName = CacheObjects.getMemberName(jobMemberMySqlModel.getMemberId()); + dataIoTaskFeatureInfoOutputModel.setMemberName(memberName); + QueryDataIoTaskConfigApi.Input queryTaskConfigInput = new QueryDataIoTaskConfigApi.Input(); + queryTaskConfigInput.setJobId(input.getJobId()); + queryTaskConfigInput.setRole(jobMemberMySqlModel.getJobRole()); + try { + // The promoter can directly query the local + if (JobMemberRole.promoter.equals(jobMemberMySqlModel.getJobRole())) { + TaskMySqlModel taskMySqlModel = findDataIoTask(input.getJobId(), jobMemberMySqlModel.getJobRole()); + if (null != taskMySqlModel) { + List dataIoFeatures = JObject.parseArray(JObject.create(taskMySqlModel.getTaskConf()).getStringByPath("params.need_features")) + .toJavaList(String.class); + dataIoTaskFeatureInfoOutputModel.setFeatures(dataIoFeatures); + } + } else if (JobMemberRole.provider.equals(jobMemberMySqlModel.getJobRole())) { + // The provider needs to send a request to the other party to obtain + ApiResult apiResult = gatewayService.sendToBoardRedirectApi(jobMemberMySqlModel.getMemberId(), JobMemberRole.promoter, queryTaskConfigInput, QueryDataIoTaskConfigApi.class); + if (0 != apiResult.code) { + throw new StatusCodeWithException("鑾峰彇鎴愬憳[" + memberName + "]鐨勫叆妯$壒寰佸け璐,鍘熷洜锛" + apiResult.message, StatusCode.SYSTEM_ERROR); + } + JObject data = JObject.create(apiResult.data); + if (null == data || data.isEmpty()) { + throw new StatusCodeWithException("鑾峰彇鎴愬憳[" + memberName + "]鐨勫叆妯$壒寰佷负绌恒", StatusCode.DATA_NOT_FOUND); + } + + // The feature column selected during the original dataIO modeling + List dataIoFeatures = JObject.parseArray(data.getStringByPath("params.need_features")).toJavaList(String.class); + dataIoTaskFeatureInfoOutputModel.setFeatures(dataIoFeatures); + } + } catch (StatusCodeWithException e) { + LOG.error("鑾峰彇鎴愬憳[" + memberName + "]鐨勭壒寰佸紓甯革細", e); + throw e; + } catch (Exception e) { + LOG.error("鑾峰彇鎴愬憳[" + memberName + "]鐨勭壒寰佸紓甯革細", e); + throw new StatusCodeWithException("鑾峰彇鎴愬憳[" + memberName + "]鐨勫叆妯$壒寰佸紓甯: " + e.getMessage(), StatusCode.SYSTEM_ERROR); + } + + resultList.add(dataIoTaskFeatureInfoOutputModel); + } + return resultList; + } + + + /** + * Query DataIo's entry feature information (non-oot mode) + */ + private List findDataIoTaskFeaturesWithNonOot(QueryDataIoTaskFeaturesApi.Input input) throws StatusCodeWithException { + List resultList = new ArrayList<>(); + + ProjectFlowMySqlModel projectFlowMySqlModel = projectFlowService.findOne(input.getFlowId()); + if (null == projectFlowMySqlModel) { + throw new StatusCodeWithException("娴佺▼淇℃伅涓嶅瓨鍦ㄣ", StatusCode.DATA_NOT_FOUND); + } + List projectFlowNodeMySqlModelList = projectFlowNodeService.findNodesByFlowId(input.getFlowId()); + if (CollectionUtils.isEmpty(projectFlowNodeMySqlModelList)) { + throw new StatusCodeWithException("娴佺▼鑺傜偣淇℃伅涓虹┖銆", StatusCode.DATA_NOT_FOUND); + } + // Find the dataIo node of the process + ProjectFlowNodeMySqlModel dataIoFlowNode = projectFlowNodeMySqlModelList.stream() + .filter(x -> OotComponent.DATA_IO_COMPONENT_TYPE_LIST.contains(x.getComponentType())).findFirst().orElse(null); + if (null == dataIoFlowNode || StringUtil.isEmpty(dataIoFlowNode.getParams())) { + throw new StatusCodeWithException("璇蜂繚瀛榌閫夋嫨鏁版嵁闆哴鑺傜偣淇℃伅銆", StatusCode.DATA_NOT_FOUND); + } + + List dataSetList = JObject.create(dataIoFlowNode.getParams()).getJSONList("dataset_list"); + DataIoTaskFeatureInfoOutputModel dataIoTaskFeatureInfoOutputModel = null; + // If memberId is empty, it means to query all + boolean queryTotal = StringUtil.isEmpty(input.getMemberId()); + for (JObject dataSet : dataSetList) { + String memberId = dataSet.getString("member_id"); + String memberRole = dataSet.getString("member_role"); + String dataSetId = dataSet.getString("data_set_id"); + // Ignore arbiter + if (JobMemberRole.arbiter.name().equals(memberRole)) { + continue; + } + dataIoTaskFeatureInfoOutputModel = new DataIoTaskFeatureInfoOutputModel(); + dataIoTaskFeatureInfoOutputModel.setMemberId(memberId); + dataIoTaskFeatureInfoOutputModel.setMemberName(CacheObjects.getMemberName(memberId)); + dataIoTaskFeatureInfoOutputModel.setDataSetId(dataSetId); + dataIoTaskFeatureInfoOutputModel.setRole(JobMemberRole.valueOf(memberRole)); + List features = JObject.parseArray(dataSet.getString("features")).toJavaList(String.class); + dataIoTaskFeatureInfoOutputModel.setFeatures(features); + if (queryTotal) { + resultList.add(dataIoTaskFeatureInfoOutputModel); + } else if (input.getMemberId().equals(memberId)) { + resultList.add(dataIoTaskFeatureInfoOutputModel); + break; + } + } + + return resultList; + } + + /** + * Query the list of all child nodes up to the end node (excluding the child nodes specified by startTaskId) + *

+ * Currently only supports single-branch node query, the sub-nodes of multiple branches are too complicated, and currently only the child nodes of one branch are supported from the modeling node) + * + * @param resultList result list + * @param totalTaskList List of all task results under a jobId + * @param startTaskId List of node IDs to start querying + */ + private void findTotalSubTaskMysqlModelList(List resultList, List totalTaskList, final String startTaskId) { + TaskMySqlModel subTaskMySqlModel = null; + String newStartTaskId = null; + for (TaskMySqlModel taskMySqlModel : totalTaskList) { + String parentTaskIdList = taskMySqlModel.getParentTaskIdList(); + if (StringUtil.isNotEmpty(parentTaskIdList) && Arrays.asList(parentTaskIdList.split(",")).contains(startTaskId)) { + resultList.add(taskMySqlModel); + subTaskMySqlModel = taskMySqlModel; + newStartTaskId = taskMySqlModel.getTaskId(); + break; + } + } + // Prove that the child node was found + if (null != subTaskMySqlModel) { + findTotalSubTaskMysqlModelList(resultList, totalTaskList, newStartTaskId); + } + } + + /** + * Query the list of all parent nodes of the specified node + * (the returned result list contains the node itself specified by startTaskId) + * + * @param resultList Result list + * @param totalTaskList List of all task results under a jobId + * @param startTaskIds List of node IDs to start the query (multiple separated by commas) + */ + private void findTotalParentTaskMysqlModelList(List resultList, List totalTaskList, final String startTaskIds) { + List taskMysqlModelList = totalTaskList.stream().filter(x -> Arrays.asList(startTaskIds.split(",")).contains(x.getTaskId()) + ).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(taskMysqlModelList)) { + resultList.addAll(taskMysqlModelList); + List parentTaskIdList = new ArrayList<>(); + for (TaskMySqlModel taskMySqlModel : taskMysqlModelList) { + if (StringUtil.isNotEmpty(taskMySqlModel.getParentTaskIdList())) { + parentTaskIdList.addAll(Stream.of(taskMySqlModel.getParentTaskIdList().split(",")).collect(Collectors.toList())); + } + } + // No parent node ID proof has reached the top + if (CollectionUtils.isEmpty(parentTaskIdList)) { + return; + } + String parentTaskIds = parentTaskIdList.stream().collect(Collectors.joining(",")); + findTotalParentTaskMysqlModelList(resultList, totalTaskList, parentTaskIds); + } + } + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/WebSocketServer.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/WebSocketServer.java" new file mode 100644 index 0000000000000000000000000000000000000000..f5ca53484c528ecd19070093133d27655d26adac --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/WebSocketServer.java" @@ -0,0 +1,277 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.constant.ChatConstant; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.CurrentAccount; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Websocket service class, serverendpoint is the URL exposed to the client connection + * + * @author Johnny.lin + */ +@ServerEndpoint("/chatserver/{token}") +@Component +public class WebSocketServer { + + public static Logger log = LoggerFactory.getLogger(WebSocketServer.class); + + public static MemberChatService memberChatService; + + /** + * Static variable, used to record the current number of online connections + */ + private static final AtomicInteger ONLINE_COUNT = new AtomicInteger(0); + + /** + * The concurrenthashmap stores the websocketserver object corresponding to each client + */ + public static ConcurrentHashMap webSocketMap = new ConcurrentHashMap<>(); + + /** + * The connection session with a client needs to send data to the client through it + */ + private Session session; + + /** + * token + */ + private String token = ""; + /** + * Current account ID + */ + private String accountId; + + /** + * Call this method after successful connection establishment. + */ + @OnOpen + public void onOpen(Session session, @PathParam("token") String token) { + this.session = session; + this.token = token; + + CurrentAccount.Info info = CurrentAccount.get(token); + if (info == null) { + log.error("Illegal user, the token does not exist: " + token); + try { + sendMessage(responseNonchatMessage(StatusCode.LOGIN_REQUIRED.getCode(), "token鏃犳晥锛岃閲嶆柊鐧诲綍鍐嶈瘯", null)); + } catch (IOException e) { + log.error("token: " + this.token + ", network exception!"); + } + return; + } + accountId = info.id; + if (!webSocketMap.containsKey(accountId)) { + //Online number plus 1 + ONLINE_COUNT.incrementAndGet(); + } + webSocketMap.put(accountId, this); + + log.info("User connection: " + info.phoneNumber + "锛宼oken: " + this.token + ", the number of people currently online is:" + ONLINE_COUNT.get()); + + try { + sendMessage(responseNonchatMessage(StatusCode.SUCCESS.getCode(), "杩炴帴鎴愬姛", null)); + } catch (IOException e) { + log.error("token: " + this.token + ",network exception!"); + } + } + + /** + * Call this method when the connection is closed + */ + @OnClose + public void onClose() { + if (StringUtil.isEmpty(accountId)) { + return; + } + if (webSocketMap.containsKey(accountId)) { + webSocketMap.remove(accountId); + ONLINE_COUNT.decrementAndGet(); + } + + CurrentAccount.Info info = CurrentAccount.get(token); + log.info("User exit: " + info.phoneNumber + ", token: " + token + ",the number of people currently online is:" + ONLINE_COUNT.get()); + } + + /** + * Call this method after receiving client message. + * + * @param message Messages sent by the client + */ + @OnMessage + public void onMessage(String message, Session session) throws IOException { + log.info("User message: {},content: {}", token, message); + + CurrentAccount.Info info = CurrentAccount.get(token); + if (info == null) { + sendMessage(responseNonchatMessage(StatusCode.LOGIN_REQUIRED.getCode(), "token鏃犳晥锛岃閲嶆柊鐧诲綍鍐嶈瘯", null)); + return; + } + + log.info("user锛" + info.phoneNumber); + if (StringUtil.isEmpty(message)) { + sendMessage(responseNonchatMessage(StatusCode.ILLEGAL_REQUEST.getCode(), "娑堟伅涓嶈兘涓虹┖", null)); + return; + } + // Business data returned to the front end + JObject data = JObject.create(); + try { + // If it is a Ping, it indicates that it is the heartbeat sent by the client and directly returns a pong + if ("ping".equals(message)) { + sendMessage(responseNonchatMessage(StatusCode.SUCCESS.getCode(), "pong", null)); + return; + } + + //Parsing message + JSONObject jsonObject = JSON.parseObject(message); + + String fromAccountId = info.getId(); + String toMemberId = jsonObject.getString(ChatConstant.KEY_TO_MEMBER_ID); + String toMemberName = jsonObject.getString(ChatConstant.KEY_TO_MEMBER_NAME); + String toAccountId = jsonObject.getString(ChatConstant.KEY_TO_ACCOUNT_ID); + String toAccountName = jsonObject.getString(ChatConstant.KEY_TO_ACCOUNT_NAME); + String content = jsonObject.getString(ChatConstant.KEY_CONTENT); + // The message ID is returned to the front end for use + String messageId = jsonObject.getString(ChatConstant.KEY_MESSAGE_ID); + data = JObject.create().append(ChatConstant.KEY_MESSAGE_ID, messageId); + + // Check the validity of the data + if (StringUtil.isEmpty(fromAccountId)) { + throw new StatusCodeWithException("fromAccountId is empty", StatusCode.PARAMETER_VALUE_INVALID); + } + + if (StringUtil.isEmpty(toMemberId)) { + throw new StatusCodeWithException("toMemberId is empty", StatusCode.PARAMETER_VALUE_INVALID); + } + if (StringUtil.isEmpty(toAccountId)) { + throw new StatusCodeWithException("toAccountId is empty", StatusCode.PARAMETER_VALUE_INVALID); + } + + if (StringUtil.isEmpty(toMemberName)) { + throw new StatusCodeWithException("toMemberName is empty", StatusCode.PARAMETER_VALUE_INVALID); + } + + if (StringUtil.isEmpty(toAccountName)) { + throw new StatusCodeWithException("toAccountName is empty", StatusCode.PARAMETER_VALUE_INVALID); + } + + if (StringUtil.isEmpty(content)) { + throw new StatusCodeWithException("content is empty", StatusCode.PARAMETER_VALUE_INVALID); + } + + if (StringUtil.isEmpty(messageId)) { + throw new StatusCodeWithException("messageId is empty", StatusCode.PARAMETER_VALUE_INVALID); + } + + if (fromAccountId.equals(toAccountId)) { + throw new StatusCodeWithException("鑷凡涓嶈兘鍙戦佹秷鎭粰鑷繁", StatusCode.PARAMETER_VALUE_INVALID); + } + + String nickName = CacheObjects.getAccountMap().get(fromAccountId); + if (StringUtil.isEmpty(nickName)) { + throw new StatusCodeWithException(nickName + " is empty", StatusCode.INVALID_USER); + } + + // send message + JObject ret = memberChatService.sendMessage(fromAccountId, nickName, toMemberId, toAccountId, toMemberName, toAccountName, content); + // send fail + if (!"0".equals(ret.getString(ChatConstant.KEY_CODE))) { + sendMessage(responseNonchatMessage(StatusCode.SYSTEM_ERROR.getCode(), ret.getString(ChatConstant.KEY_MESSAGE), data.append(ChatConstant.KEY_MEMBER_CHAT_ID, ret.getString(ChatConstant.KEY_MEMBER_CHAT_ID)))); + } else { + sendMessage(responseNonchatMessage(StatusCode.SUCCESS.getCode(), "鍙戦佹垚鍔", data)); + } + } catch (StatusCodeWithException e) { + sendMessage(responseNonchatMessage(e.getStatusCode().getCode(), e.getMessage(), data)); + } catch (Exception e) { + log.error("User: " + info.phoneNumber + ", token: " + this.token + ", handle client message exception", e); + sendMessage(responseNonchatMessage(StatusCode.SYSTEM_ERROR.getCode(), e.getMessage(), data)); + } + } + + @OnError + public void onError(Session session, Throwable error) { + log.error("Error : " + this.token + ",reason: ", error); + } + + /** + * Server active push + */ + public void sendMessage(String message) throws IOException { + this.session.getBasicRemote().sendText(message); + } + + + /** + * Send a chat message to an online user + * + * @param data Chat data + */ + public static boolean sendToOnline(String accountId, JObject data) { + WebSocketServer webSocketServer = webSocketMap.get(accountId); + if (null == webSocketServer) { + log.info("Current user锛歿} not online, push message锛歿} fail.", accountId, data.toString()); + return false; + } + try { + webSocketServer.sendMessage(responseChatMessage(StatusCode.SUCCESS.getCode(), StatusCode.SUCCESS.getMessage(), JObject.create().append("message", data))); + return true; + } catch (Exception e) { + log.error("Current user锛" + accountId + ", push message: " + data.toString() + ", exception锛", e); + } + return false; + } + + + /** + * Message sending status in response to the front end + * + * @param code status code + * @param message message content + * @param data business data + */ + private static String responseNonchatMessage(int code, String message, JObject data) { + return responseMessage(code, ChatConstant.KEY_NON_CHAT, message, data); + } + + private static String responseChatMessage(int code, String message, JObject data) { + return responseMessage(code, ChatConstant.KEY_CHAT, message, data); + } + + private static String responseMessage(int code, String type, String message, JObject data) { + data = (null == data ? JObject.create() : data); + return JObject.create().append(ChatConstant.KEY_CODE, code) + .append(ChatConstant.KEY_TYPE, type) + .append(ChatConstant.KEY_MESSAGE, message) + .append(ChatConstant.KEY_DATA, data).toJSONString(); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/account/AccountService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/account/AccountService.java" new file mode 100644 index 0000000000000000000000000000000000000000..57016fa9c8f591a674eb305c356fb113ced4f0a2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/account/AccountService.java" @@ -0,0 +1,522 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.account; + +import com.alibaba.fastjson.JSONObject; +import com.welab.wefe.board.service.api.account.*; +import com.welab.wefe.board.service.database.entity.AccountMySqlModel; +import com.welab.wefe.board.service.database.repository.AccountRepository; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.AccountOutputModel; +import com.welab.wefe.board.service.dto.vo.AccountInputModel; +import com.welab.wefe.board.service.dto.vo.OnlineAccountOutput; +import com.welab.wefe.board.service.sdk.UnionService; +import com.welab.wefe.board.service.service.AbstractService; +import com.welab.wefe.board.service.service.CacheObjects; +import com.welab.wefe.board.service.service.GatewayService; +import com.welab.wefe.board.service.service.WebSocketServer; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.enums.*; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.*; +import com.welab.wefe.common.web.CurrentAccount; +import com.welab.wefe.common.web.LoginSecurityPolicy; +import com.welab.wefe.common.web.dto.ApiResult; +import com.welab.wefe.common.web.service.CaptchaService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.RandomStringUtils; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.security.SecureRandom; +import java.util.*; + +/** + * @author Zane + */ +@Service +public class AccountService extends AbstractService { + + @Autowired + private AccountRepository accountRepository; + + @Autowired + private GatewayService gatewayService; + @Autowired + private GlobalConfigService globalConfigService; + + @Autowired + private UnionService unionService; + + /** + * Paging query account + */ + public PagingOutput query(QueryApi.Input input) throws StatusCodeWithException { + + Specification where = Where + .create() + .contains("phoneNumber", input.getPhoneNumber()) + .equal("auditStatus", input.getAuditStatus()) + .contains("nickname", input.getNickname()) + .orderBy("createdTime", OrderBy.desc) + .build(AccountMySqlModel.class); + + return accountRepository.paging(where, input, AccountOutputModel.class); + } + + /** + * register a account + */ + public void register(AccountInputModel input, BoardUserSource userSource) throws StatusCodeWithException { + + // Determine whether the account is registered + AccountMySqlModel one = accountRepository.findOne("phoneNumber", input.getPhoneNumber(), AccountMySqlModel.class); + if (one != null) { + throw new StatusCodeWithException("璇ユ墜鏈哄彿宸茶娉ㄥ唽锛", StatusCode.DATA_EXISTED); + } + + // generate salt + String salt = createRandomSalt(); + + // sha hash + String password = Sha1.of(input.getPassword() + salt); + + AccountMySqlModel model = new AccountMySqlModel(); + model.setCreatedBy(CurrentAccount.id()); + model.setPhoneNumber(input.getPhoneNumber()); + model.setNickname(input.getNickname()); + model.setEmail(input.getEmail()); + model.setPassword(password); + model.setSalt(salt); + model.setSuperAdminRole(accountRepository.count() < 1); + model.setAdminRole(model.getSuperAdminRole()); + model.setEnable(true); + + // Super administrator does not need to review + if (model.getSuperAdminRole() || userSource == BoardUserSource.online_demo) { + model.setAuditStatus(AuditStatus.agree); + + if (userSource == BoardUserSource.online_demo) { + model.setAuditComment("鏉ヨ嚜鍦ㄧ嚎浣撻獙璐﹀彿鐢宠"); + } + } + // Whether others want to review it depends on the configuration. + else { + model.setAuditStatus( + globalConfigService.getBoardConfig().accountNeedAuditWhenRegister + ? AuditStatus.auditing + : AuditStatus.agree + ); + } + + + accountRepository.save(model); + + CacheObjects.refreshAccountMap(); + } + + /** + * login + */ + public LoginApi.Output login(String phoneNumber, String password, String key, String code) throws StatusCodeWithException { + + if (!config.getEnvName().isTestEnv()) { + // Verification code verification + if (!CaptchaService.verify(key, code)) { + throw new StatusCodeWithException("楠岃瘉鐮侀敊璇紒", StatusCode.PARAMETER_VALUE_INVALID); + } + } + + // Check if it's in the small black room + if (LoginSecurityPolicy.inDarkRoom(phoneNumber)) { + throw new StatusCodeWithException("璐﹀彿宸茶绂佹鐧婚檰锛岃涓涓皬鏃跺悗鍐嶈瘯锛屾垨鑱旂郴绠$悊鍛樸", StatusCode.PARAMETER_VALUE_INVALID); + } + + AccountMySqlModel model = accountRepository.findOne("phoneNumber", phoneNumber, AccountMySqlModel.class); + // phone number error + if (model == null) { + throw new StatusCodeWithException("鎵嬫満鍙烽敊璇紝璇ョ敤鎴蜂笉瀛樺湪銆", StatusCode.PARAMETER_VALUE_INVALID); + } + + if (!model.getEnable()) { + throw new StatusCodeWithException("鐢ㄦ埛琚鐢紝璇疯仈绯荤鐞嗗憳銆", StatusCode.PERMISSION_DENIED); + } + + // wrong password + if (!model.getPassword().equals(Sha1.of(password + model.getSalt()))) { + + // Log a login failure event + LoginSecurityPolicy.onLoginFail(phoneNumber); + throw new StatusCodeWithException("鎵嬫満鍙锋垨瀵嗙爜閿欒锛岃繛缁敊璇 6 娆′細琚姝㈢櫥闄嗭紝鍙互鑱旂郴绠$悊鍛橀噸缃瘑鐮佹壘鍥炶处鍙枫", StatusCode.PARAMETER_VALUE_INVALID); + } + + // Check audit status + if (model.getAuditStatus() != null) { + switch (model.getAuditStatus()) { + case auditing: + AccountMySqlModel superAdmin = findSuperAdmin(); + + throw new StatusCodeWithException("璐﹀彿灏氭湭瀹℃牳锛岃鑱旂郴绠$悊鍛 " + superAdmin.getNickname() + " 锛堟垨鍏朵粬浠绘剰绠$悊鍛橈級瀵规偍鐨勮处鍙疯繘琛屽鏍稿悗鍐嶅皾璇曠櫥褰曪紒", StatusCode.PARAMETER_VALUE_INVALID); + case disagree: + throw new StatusCodeWithException("璐﹀彿瀹℃牳涓嶉氳繃锛" + model.getAuditComment(), StatusCode.PARAMETER_VALUE_INVALID); + default: + } + } + + String token = UUID.randomUUID().toString(); + CurrentAccount.logined(token, model.getId(), model.getPhoneNumber(), model.getAdminRole(), model.getSuperAdminRole()); + + LoginApi.Output output = new ModelMapper().map(model, LoginApi.Output.class); + output.setToken(token); + + // Record a successful login event + LoginSecurityPolicy.onLoginSuccess(phoneNumber); + + return output; + } + + /** + * update password + */ + public void updatePassword(String oldPassword, String newPassword) throws StatusCodeWithException { + + String phoneNumber = CurrentAccount.phoneNumber(); + if (phoneNumber == null) { + throw new StatusCodeWithException(StatusCode.LOGIN_REQUIRED); + } + + AccountMySqlModel model = accountRepository.findByPhoneNumber(phoneNumber); + + // Check old password + if (!StringUtil.equals(model.getPassword(), Sha1.of(oldPassword + model.getSalt()))) { + throw new StatusCodeWithException("鎮ㄨ緭鍏ョ殑鏃у瘑鐮佷笉姝g‘", StatusCode.PARAMETER_VALUE_INVALID); + } + + // Regenerate salt + String salt = createRandomSalt(); + + // sha hash + newPassword = Sha1.of(newPassword + salt); + + model.setSalt(salt); + model.setPassword(newPassword); + + accountRepository.save(model); + } + + + /** + * query all of account + */ + public List queryAll() { + return accountRepository.findAll(); + } + + private String createRandomSalt() { + final Random r = new SecureRandom(); + byte[] salt = new byte[16]; + r.nextBytes(salt); + + return Base64Util.encode(salt); + } + + /** + * The administrator reviews the account + */ + public void audit(AuditApi.Input input) throws StatusCodeWithException { + AccountMySqlModel auditor = accountRepository.findById(CurrentAccount.id()).orElse(null); + if (!auditor.getAdminRole()) { + throw new StatusCodeWithException("鎮ㄤ笉鏄鐞嗗憳锛屾棤鏉冩墽琛屽鏍告搷浣滐紒", StatusCode.PARAMETER_VALUE_INVALID); + } + + AccountMySqlModel account = accountRepository.findById(input.getAccountId()).orElse(null); + if (account.getAuditStatus() != AuditStatus.auditing) { + throw new StatusCodeWithException("璇ョ敤鎴峰凡琚鏍革紝璇峰嬁閲嶅鎿嶄綔锛", StatusCode.PARAMETER_VALUE_INVALID); + } + + account.setAuditStatus(input.getAuditStatus()); + account.setAuditComment(CacheObjects.getNickname(CurrentAccount.id()) + "锛" + input.getAuditComment()); + account.setUpdatedBy(CurrentAccount.id()); + accountRepository.save(account); + + } + + /** + * Query super administrator + */ + public AccountMySqlModel findSuperAdmin() { + List list = accountRepository.findAll(Where + .create() + .equal("superAdminRole", true) + .build(AccountMySqlModel.class) + ); + + if (list.isEmpty()) { + return null; + } + + return list.get(0); + } + + /** + * Update user basic information + */ + public void update(UpdateApi.Input input) throws StatusCodeWithException { + /** + * 杩欓噷鍒嗕负涓ょ鎯呭喌 + * 1. 鐢ㄦ埛淇敼鑷繁鐨勮祫鏂 + * 2. 瓒呯骇绠$悊鍛樻妸鏅氱敤鎴疯缃负绠$悊鍛橈紝鎴栧皢绠$悊鍛樿缃负鏅氱敤鎴枫傝繖绉嶆儏鍐电悊璁轰笂涓嶅簲璇ュ瓨鍦紝浣嗘槸鐢变簬妗f湡闂鏆傛椂鍏辩敤涓涓帴鍙o紝绛夊墠绔湁鏃堕棿涔嬪悗鍐嶅崟鐙紑涓涓帴鍙c + */ + if (CurrentAccount.id().equals(input.id)) { + updateBaseInfo(input); + } else { + updateAdminRole(input); + } + } + + private void updateAdminRole(UpdateApi.Input input) throws StatusCodeWithException { + if (!CurrentAccount.isSuperAdmin()) { + throw new StatusCodeWithException("闈炶秴绾х鐞嗗憳鏃犳硶杩涜姝ゆ搷浣溿", StatusCode.PERMISSION_DENIED); + } + + if (input.getAdminRole() == null) { + return; + } + + AccountMySqlModel account = accountRepository.findById(input.id).orElse(null); + + if (account == null) { + throw new StatusCodeWithException("鎵句笉鍒版洿鏂扮殑鐢ㄦ埛淇℃伅銆", StatusCode.DATA_NOT_FOUND); + } + + account.setAdminRole(input.getAdminRole()); + account.setUpdatedBy(CurrentAccount.id()); + account.setUpdatedTime(new Date()); + + accountRepository.save(account); + } + + private void updateBaseInfo(UpdateApi.Input input) throws StatusCodeWithException { + AccountMySqlModel account = accountRepository.findById(CurrentAccount.id()).orElse(null); + + if (StringUtil.isNotEmpty(input.getNickname())) { + account.setNickname(input.getNickname()); + } + + if (StringUtil.isNotEmpty(input.getEmail())) { + account.setEmail(input.getEmail()); + } + + account.setUpdatedBy(CurrentAccount.id()); + account.setUpdatedTime(new Date()); + + accountRepository.save(account); + } + + /** + * Update the user's enable status + */ + public void enable(EnableApi.Input input) throws StatusCodeWithException { + + if (!CurrentAccount.isAdmin() && !CurrentAccount.isSuperAdmin()) { + throw new StatusCodeWithException("鏅氱敤鎴锋棤娉曡繘琛屾鎿嶄綔銆", StatusCode.PERMISSION_DENIED); + } + + if (input.getId().equals(CurrentAccount.id())) { + throw new StatusCodeWithException("鏃犳硶瀵硅嚜宸辫繘琛屾鎿嶄綔銆", StatusCode.PERMISSION_DENIED); + } + + AccountMySqlModel account = accountRepository.findById(input.getId()).orElse(null); + if (account == null) { + throw new StatusCodeWithException("鎵句笉鍒版洿鏂扮殑鐢ㄦ埛淇℃伅銆", StatusCode.DATA_NOT_FOUND); + } + + if (account.getAdminRole() && !CurrentAccount.isSuperAdmin()) { + throw new StatusCodeWithException("闈炶秴绾х鐞嗗憳鏃犳硶杩涜姝ゆ搷浣溿", StatusCode.PERMISSION_DENIED); + } + + account.setEnable(input.getEnable()); + account.setUpdatedBy(CurrentAccount.id()); + account.setUpdatedTime(new Date()); + account.setAuditComment(input.getEnable() + ? CacheObjects.getNickname(CurrentAccount.id()) + "鍚敤浜嗚璐﹀彿" + : CacheObjects.getNickname(CurrentAccount.id()) + "绂佺敤浜嗚璐﹀彿"); + + accountRepository.save(account); + + CurrentAccount.logout(input.getId()); + } + + /** + * Reset user password (administrator rights) + */ + public String resetPassword(ResetPasswordApi.Input input) throws StatusCodeWithException { + AccountMySqlModel model = accountRepository.findById(input.getId()).orElse(null); + + if (model == null) { + throw new StatusCodeWithException("鎵句笉鍒版洿鏂扮殑鐢ㄦ埛淇℃伅銆", StatusCode.DATA_NOT_FOUND); + } + + if (!CurrentAccount.isAdmin()) { + throw new StatusCodeWithException("闈炵鐞嗗憳鏃犳硶閲嶇疆瀵嗙爜銆", StatusCode.PERMISSION_DENIED); + } + + String salt = createRandomSalt(); + String newPassword = RandomStringUtils.randomAlphanumeric(2) + new Random().nextInt(999999); + + String websitePassword = model.getPhoneNumber() + newPassword + model.getPhoneNumber() + model.getPhoneNumber().substring(0, 3) + newPassword.substring(newPassword.length() - 3); + + model.setSalt(salt); + model.setPassword(Sha1.of(Md5.of(websitePassword) + salt)); + model.setUpdatedBy(CurrentAccount.id()); + model.setUpdatedTime(new Date()); + accountRepository.save(model); + + CurrentAccount.logout(model.getId()); + + return newPassword; + } + + + /** + * Query user information by member ID + */ + public PagingOutput queryMemberAccounts(QueryMemberAccountsApi.Input input) throws StatusCodeWithException { + PagingOutput pagingOutput = new PagingOutput<>(); + if (CacheObjects.getMemberId().equals(input.getMemberId())) { + pagingOutput = query(input); + } else { + ApiResult apiResult = gatewayService.sendToBoardRedirectApi(input.getMemberId(), JobMemberRole.promoter, input, QueryApi.class); + if (0 == apiResult.code) { + if (null == apiResult.data) { + return null; + } + JObject dataObj = JObject.create(apiResult.data); + pagingOutput = JObject.parseObject(dataObj.toJSONString(), pagingOutput.getClass()); + } else { + throw new StatusCodeWithException(apiResult.message, StatusCode.SYSTEM_ERROR); + } + } + + List accountOutputModelList = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(pagingOutput.getList())) { + for (Object obj : pagingOutput.getList()) { + AccountOutputModel accountOutputModel = JObject.parseObject(JObject.create(obj).toString(), AccountOutputModel.class); + // Remove sensitive information + accountOutputModel.setEmail(null); + accountOutputModel.setPhoneNumber(null); + accountOutputModelList.add(accountOutputModel); + } + pagingOutput.setList(accountOutputModelList); + } + + return pagingOutput; + } + + /** + * Query the online account of the exchange center + */ + public List queryOnlineAccount(QueryOnlineApi.Input input) throws StatusCodeWithException { + List resultList = new ArrayList<>(); + // Don't need to go through the gateway to query the online accounts of your own members + if (CacheObjects.getMemberId().equals(input.getMemberId()) || input.fromGateway()) { + WebSocketServer.webSocketMap.forEach((k, v) -> { + OnlineAccountOutput onlineAccountOutput = new OnlineAccountOutput(); + if (StringUtil.isEmpty(input.getAccountId())) { + onlineAccountOutput.setAccountId(k); + resultList.add(onlineAccountOutput); + } else if (k.equals(input.getAccountId())) { + onlineAccountOutput.setAccountId(k); + resultList.add(onlineAccountOutput); + } + + }); + return resultList; + } + try { + JObject data = JObject.create().append("memberId", input.getMemberId()) + .append("accountId", input.getAccountId()); + ApiResult apiResult = gatewayService.sendToBoardRedirectApi(input.getMemberId(), JobMemberRole.promoter, data, QueryOnlineApi.class); + if (apiResult.code != 0) { + throw new StatusCodeWithException("绯荤粺寮傚父: " + apiResult.message, StatusCode.SYSTEM_ERROR); + } + QueryOnlineApi.Output output = JSONObject.toJavaObject(JObject.create(apiResult.data), QueryOnlineApi.Output.class); + return output.getList(); + } catch (Exception e) { + throw new StatusCodeWithException("绯荤粺寮傚父: " + e.getMessage(), StatusCode.SYSTEM_ERROR); + } + } + + /** + * Check whether the user with the specified mobile phone number exists + */ + public boolean exist(String phoneNumber) { + AccountMySqlModel model = accountRepository.findOne("phoneNumber", phoneNumber, AccountMySqlModel.class); + return model != null; + } + + + /** + * Transfer the super administrator status to another account + */ + @Transactional(rollbackFor = Exception.class) + public void changeSuperAdmin(AccountMySqlModel account) throws StatusCodeWithException { + account.setAdminRole(true); + account.setSuperAdminRole(true); + account.setUpdatedBy(CurrentAccount.id()); + account.setUpdatedTime(new Date()); + + // Update designated user as super administrator + accountRepository.save(account); + // Cancel the super administrator privileges of the current account + accountRepository.cancelSuperAdmin(CurrentAccount.id()); + } + + public void forgetPassword(ForgetPasswordApi.Input input) throws StatusCodeWithException { + if (StringUtil.isEmpty(input.getPhoneNumber())) { + throw new StatusCodeWithException("鎵嬫満鍙蜂笉鑳戒负绌恒", StatusCode.PARAMETER_VALUE_INVALID); + } + if (StringUtil.isEmpty(input.getPassword())) { + throw new StatusCodeWithException("瀵嗙爜涓嶈兘涓虹┖銆", StatusCode.PARAMETER_VALUE_INVALID); + } + if (StringUtil.isEmpty(input.getSmsVerificationCode())) { + throw new StatusCodeWithException("鐭俊楠岃瘉鐮佷笉鑳戒负绌恒", StatusCode.PARAMETER_VALUE_INVALID); + } + + AccountMySqlModel model = accountRepository.findOne("phoneNumber", input.getPhoneNumber(), AccountMySqlModel.class); + // phone number error + if (model == null) { + throw new StatusCodeWithException("鎵嬫満鍙烽敊璇紝璇ョ敤鎴蜂笉瀛樺湪銆", StatusCode.PARAMETER_VALUE_INVALID); + } + if (!model.getEnable()) { + throw new StatusCodeWithException("鐢ㄦ埛琚鐢紝璇疯仈绯荤鐞嗗憳銆", StatusCode.PERMISSION_DENIED); + } + + unionService.checkVerificationCode(input.getPhoneNumber(), input.getSmsVerificationCode(), SmsBusinessType.AccountForgetPasswordVerificationCode); + + // Regenerate salt + String salt = createRandomSalt(); + model.setSalt(salt); + model.setPassword(Sha1.of(input.getPassword() + salt)); + accountRepository.save(model); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/available/ServerAvailableCheckService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/available/ServerAvailableCheckService.java" new file mode 100644 index 0000000000000000000000000000000000000000..fe6ba934fa1ac85683716bde950bde4c4345c9ca --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/available/ServerAvailableCheckService.java" @@ -0,0 +1,28 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.available; + +import com.welab.wefe.board.service.service.AbstractService; +import org.springframework.stereotype.Service; + +/** + * @author zane + */ +@Service +public class ServerAvailableCheckService extends AbstractService { + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/available/checkpoint/AbstractCheckpoint.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/available/checkpoint/AbstractCheckpoint.java" new file mode 100644 index 0000000000000000000000000000000000000000..ede56cd06e0a2b14a3dacb5bec47a27cfd565551 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/available/checkpoint/AbstractCheckpoint.java" @@ -0,0 +1,84 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.available.checkpoint; + +import com.welab.wefe.board.service.constant.Config; +import com.welab.wefe.board.service.dto.vo.ServerCheckPointOutput; +import com.welab.wefe.board.service.service.globalconfig.GlobalConfigService; +import com.welab.wefe.common.CommonThreadPool; +import com.welab.wefe.common.web.Launcher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + +/** + * @author zane + */ +public abstract class AbstractCheckpoint { + protected final Logger LOG = LoggerFactory.getLogger(this.getClass()); + protected final Config config = Launcher.CONTEXT.getBean(Config.class); + protected final GlobalConfigService globalConfigService = Launcher.CONTEXT.getBean(GlobalConfigService.class); + + public abstract String desc(); + + public abstract String value(); + + protected abstract void doCheck() throws Exception; + + public ServerCheckPointOutput check() { + long start = System.currentTimeMillis(); + + Future future = CommonThreadPool.submit(() -> { + try { + if (value() == null) { + throw new Exception("鐩稿叧閰嶇疆涓虹┖锛岃杩涜璁剧疆鍚庡啀杩涜妫鏌ャ"); + } + doCheck(); + } catch (Exception e) { + return e; + } + return null; + }); + + Exception e; + try { + e = future.get(5, TimeUnit.SECONDS); + } catch (Exception ex) { + e = ex; + } + + ServerCheckPointOutput output = new ServerCheckPointOutput(); + output.setDesc(desc()); + output.setValue(value()); + output.setSpend(System.currentTimeMillis() - start); + + if (e == null) { + output.setSuccess(true); + output.setMessage("success"); + } else { + output.setSuccess(false); + output.setMessage(e.getMessage()); + } + return output; + } + + protected void log(Exception e) { + LOG.error(e.getClass() + " " + e.getMessage(), e); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/available/checkpoint/GatewayInternetCheckpoint.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/available/checkpoint/GatewayInternetCheckpoint.java" new file mode 100644 index 0000000000000000000000000000000000000000..8e9b47132dbf11a90f3aa8970b694b484cd19429 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/available/checkpoint/GatewayInternetCheckpoint.java" @@ -0,0 +1,44 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.available.checkpoint; + +import com.welab.wefe.board.service.dto.globalconfig.MemberInfoModel; + +/** + * @author zane + */ +public class GatewayInternetCheckpoint extends AbstractCheckpoint { + + @Override + public String desc() { + return "妫鏌 board 涓 gateway 鏈嶅姟鍦ㄥ叕缃戠殑鐨勮繛閫氭"; + } + + @Override + public String value() { + MemberInfoModel memberInfo = globalConfigService.getMemberInfo(); + if (memberInfo == null) { + return null; + } + return memberInfo.getMemberGatewayUri(); + } + + @Override + protected void doCheck() throws Exception { + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/available/checkpoint/GatewayIntranetCheckpoint.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/available/checkpoint/GatewayIntranetCheckpoint.java" new file mode 100644 index 0000000000000000000000000000000000000000..13eef59bb8addc775e3df198df4db3e79dc534c8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/available/checkpoint/GatewayIntranetCheckpoint.java" @@ -0,0 +1,46 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.available.checkpoint; + +import com.welab.wefe.board.service.service.GatewayService; +import com.welab.wefe.common.web.Launcher; + +/** + * @author zane + */ +public class GatewayIntranetCheckpoint extends AbstractCheckpoint { + + @Override + public String desc() { + return "妫鏌 board 涓 gateway 鏈嶅姟鍦ㄥ唴缃戠殑鐨勮繛閫氭"; + } + + @Override + public String value() { + return globalConfigService.getGatewayConfig().intranetBaseUri; + } + + @Override + protected void doCheck() throws Exception { + GatewayService gatewayService = Launcher.CONTEXT.getBean(GatewayService.class); + + // Since the gateway does not currently have an alive interface, + // temporarily adjust a method to test the connectivity between the board and the gateway. + gatewayService.refreshMemberBlacklistCache(); + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/available/checkpoint/StorageCheckpoint.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/available/checkpoint/StorageCheckpoint.java" new file mode 100644 index 0000000000000000000000000000000000000000..543a5cb1ba3d8cc8fc8335e27bbe353bd20f1d69 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/available/checkpoint/StorageCheckpoint.java" @@ -0,0 +1,65 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.available.checkpoint; + +import com.welab.wefe.common.data.storage.config.JdbcParamConfig; +import com.welab.wefe.common.data.storage.model.DataItemModel; +import com.welab.wefe.common.data.storage.repo.Storage; +import com.welab.wefe.common.data.storage.service.StorageService; +import com.welab.wefe.common.web.Launcher; +import org.apache.commons.lang3.RandomStringUtils; + +import static com.welab.wefe.board.service.service.DataSetStorageService.DATABASE_NAME; + +/** + * @author zane + */ +public class StorageCheckpoint extends AbstractCheckpoint { + + @Override + public String desc() { + return "妫鏌 board 瀵 storage 鏈嶅姟鐨勮闂槸鍚︽甯"; + } + + @Override + public String value() { + JdbcParamConfig storageConfig = Launcher.CONTEXT.getBean(JdbcParamConfig.class); + return storageConfig.getUrl(); + } + + @Override + protected void doCheck() throws Exception { + + StorageService service = Launcher.CONTEXT.getBean(StorageService.class); + Storage storage = service.getStorage(); + String name = RandomStringUtils.randomAlphabetic(6); + try { + storage.put(DATABASE_NAME, name, new DataItemModel<>(name, "test")); + } catch (Exception e) { + super.log(e); + throw new Exception(config.getDbType().name() + " put寮傚父锛岃妫鏌ョ浉鍏抽厤缃槸鍚︽纭"); + } + + try { + storage.dropTB(DATABASE_NAME, name); + } catch (Exception e) { + super.log(e); + throw new Exception(config.getDbType().name() + " drop寮傚父锛岃妫鏌ョ浉鍏抽厤缃槸鍚︽纭"); + } + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/dataset/DataSetAddService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/dataset/DataSetAddService.java" new file mode 100644 index 0000000000000000000000000000000000000000..fd39eb85e1920abcd97361b94569de5fd42c2afc --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/dataset/DataSetAddService.java" @@ -0,0 +1,264 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.dataset; + +import com.welab.wefe.board.service.constant.DataSetAddMethod; +import com.welab.wefe.board.service.database.entity.DataSourceMySqlModel; +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.database.entity.data_set.DataSetTaskMysqlModel; +import com.welab.wefe.board.service.database.repository.DataSetRepository; +import com.welab.wefe.board.service.database.repository.DataSetTaskRepository; +import com.welab.wefe.board.service.dto.vo.DataSetAddInputModel; +import com.welab.wefe.board.service.sdk.UnionService; +import com.welab.wefe.board.service.service.*; +import com.welab.wefe.board.service.util.*; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.CurrentAccount; +import org.apache.commons.io.FileUtils; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.IOException; +import java.sql.Connection; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * The service class for add data set + * + * @author Zane + */ +@Service +public class DataSetAddService extends AbstractService { + + @Autowired + protected DataSetRepository repo; + @Autowired + protected DataSetService dataSetService; + @Autowired + protected DataSetStorageService dataSetStorageService; + @Autowired + protected DataSetColumnService dataSetColumnService; + @Autowired + protected UnionService unionService; + @Autowired + protected DataSetTaskService dataSetTaskService; + @Autowired + protected DataSetTaskRepository repository; + + /** + * Asynchronous execution of data writing + * + * @param userInfo Since this method is executed in an asynchronous thread, + * the CurrentAccount information cannot be obtained, so it needs to be passed. + */ + @Async + public void add(DataSetAddInputModel input, DataSetTaskMysqlModel dataSetTask, CurrentAccount.Info userInfo) { + + DataSetMysqlModel model = new ModelMapper().map(input, DataSetMysqlModel.class); + model.setId(dataSetTask.getDataSetId()); + model.setCreatedBy(userInfo.id); + model.setTags(dataSetService.standardizeTags(input.getTags())); + dataSetService.handlePublicMemberList(model); + + // Parse and save the original data set + try { + AbstractDataSetReader dataSetReader = createDataSetReader(input); + readAllToStorage(model, dataSetReader, input.isDeduplication()); + } catch (Exception e) { + LOG.error(e.getClass().getSimpleName() + " " + e.getMessage(), e); + + // 濡傛灉鏄〃鍗曢敊璇紝鍒欑敤鎴烽噸鏂扮紪杈戣〃鍗曞悗鎻愪氦鍗冲彲锛屼笉鐢ㄩ噸鏂颁笂浼犳枃浠躲 + boolean isFormError = false; + if (e instanceof StatusCodeWithException) { + isFormError = ((StatusCodeWithException) e).getStatusCode().equals(StatusCode.ERROR_IN_DATA_RESOURCE_ADD_FORM); + } + if (!isFormError) { + deleteFile(input); + } + + dataSetTaskService.onError(dataSetTask.getDataSetId(), e); + return; + } + + + model.setNamespace(DataSetStorageService.DATABASE_NAME); + model.setTableName(dataSetStorageService.createRawDataSetTableName(model.getId())); + + // save data set info to database + repo.save(model); + + // save data set column info to database + dataSetColumnService.update(model.getId(), input.getMetadataList(), userInfo); + + // Mark upload task completed + dataSetTaskService.complete(dataSetTask.getDataSetId()); + + deleteFile(input); + + // Synchronize information to union + try { + unionService.uploadDataSet(model); + } catch (StatusCodeWithException e) { + super.log(e); + } + + // Refresh the data set tag list + CacheObjects.refreshDataSetTags(); + + } + + private void deleteFile(DataSetAddInputModel input) { + // Delete files uploaded by HttpUpload + try { + if (input.getDataSetAddMethod().equals(DataSetAddMethod.HttpUpload)) { + File file = dataSetService.getDataSetFile(input.getDataSetAddMethod(), input.getFilename()); + FileUtils.deleteQuietly(file); + } + } catch (StatusCodeWithException e) { + super.log(e); + } + } + + /** + * create AbstractDataSetReader + */ + private AbstractDataSetReader createDataSetReader(DataSetAddInputModel input) throws StatusCodeWithException { + switch (input.getDataSetAddMethod()) { + case Database: + return createSqlDataSetReader(input); + case HttpUpload: + case LocalFile: + return createFileDataSetReader(input); + default: + StatusCode + .UNEXPECTED_ENUM_CASE + .throwException("鏆備笉鏀寔鐨勬暟鎹泦瑙f瀽鏂瑰紡锛" + input.getDataSetAddMethod()); + } + + return null; + } + + /** + * create CsvDataSetReader/ExcelDataSetReader + */ + private AbstractDataSetReader createFileDataSetReader(DataSetAddInputModel input) throws StatusCodeWithException { + try { + File file = dataSetService.getDataSetFile(input.getDataSetAddMethod(), input.getFilename()); + boolean isCsv = file.getName().endsWith("csv"); + return isCsv + ? new CsvDataSetReader(input.getMetadataList(), file) + : new ExcelDataSetReader(input.getMetadataList(), file); + + } catch (IOException e) { + StatusCode.FILE_IO_ERROR.throwException(e); + return null; + } + } + + /** + * create SqlDataSetReader + */ + private SqlDataSetReader createSqlDataSetReader(DataSetAddInputModel input) throws StatusCodeWithException { + DataSourceMySqlModel dataSource = dataSetService.getDataSourceById(input.getDataSourceId()); + if (dataSource == null) { + throw new StatusCodeWithException("姝ataSourceId鍦ㄦ暟鎹簱涓嶅瓨鍦", StatusCode.DATA_NOT_FOUND); + } + Connection conn = JdbcManager.getConnection( + dataSource.getDatabaseType(), + dataSource.getHost(), + dataSource.getPort(), + dataSource.getUserName(), + dataSource.getPassword(), + dataSource.getDatabaseName() + ); + + return new SqlDataSetReader(input.getMetadataList(), conn, input.getSql()); + } + + /** + * Parse the dataset file and save it to lmdb/clickhouse + * + * @param deduplication Do you need to de-duplicate the data set + */ + private void readAllToStorage(DataSetMysqlModel model, AbstractDataSetReader dataSetReader, boolean deduplication) throws StatusCodeWithException { + long start = System.currentTimeMillis(); + LOG.info("寮濮嬭В鏋愭暟鎹泦锛" + model.getId()); + + // update data set upload task info + DataSetTaskMysqlModel dataSetTask = dataSetTaskService.findByDataSetId(model.getId()); + dataSetTaskService.update(dataSetTask, x -> x.setTotalRowCount(dataSetReader.getTotalDataRowCount())); + + // get data set headers + List rawHeaders = dataSetReader.getHeader(); + // order headers + List sortedHeaders = sortHeaders(rawHeaders); + + // save headers info to storage + dataSetStorageService.saveHeaderRow(model.getId(), sortedHeaders); + // data row consumption method + DataSetAddServiceDataRowConsumer dataRowConsumer = new DataSetAddServiceDataRowConsumer(model.getId(), deduplication, dataSetReader); + + // read all data rows of the raw data set + dataSetReader.readAll(dataRowConsumer); + + // wait for the consumption queue to finish + dataRowConsumer.waitForFinishAndClose(); + + LOG.info("鏁版嵁闆嗚В鏋愬畬姣曪細" + model.getId() + " spend:" + ((System.currentTimeMillis() - start) / 1000) + "s"); + + // fill model + model.setContainsY(dataSetReader.isContainsY()); + model.setPrimaryKeyColumn(rawHeaders.get(0)); + model.setRowCount(dataSetReader.getReadDataRows() - dataRowConsumer.getRepeatDataCount()); + model.setColumnCount(rawHeaders.size()); + model.setColumnNameList(StringUtil.join(sortedHeaders, ',')); + model.setFeatureCount(dataSetReader.isContainsY() ? rawHeaders.size() - 2 : rawHeaders.size() - 1); + model.setFeatureNameList(StringUtil.join(rawHeaders.stream().filter(x -> !model.getPrimaryKeyColumn().equals(x) && !"y".equals(x)).collect(Collectors.toList()), ',')); + model.setyCount(dataSetReader.isContainsY() ? 1 : 0); + model.setyNameList(dataSetReader.isContainsY() ? "y" : null); + model.setyPositiveExampleCount(dataRowConsumer.getPositiveExampleCount()); + model.setyPositiveExampleRatio(dataRowConsumer.getPositiveExampleRatio()); + + } + + /** + * sort headers, move column y to the second column. + */ + private List sortHeaders(List headers) { + if (!headers.contains("y")) { + return headers; + } + + // A new list must be opened here, and the original column header cannot be modified. + List list = new ArrayList<>(); + for (String name : headers) { + if ("y".equals(name)) { + continue; + } + list.add(name); + } + list.add(1, "y"); + return list; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/dataset/DataSetAddServiceDataRowConsumer.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/dataset/DataSetAddServiceDataRowConsumer.java" new file mode 100644 index 0000000000000000000000000000000000000000..7e14f7dc7643210bef459a1dd1234d5fa48d46df --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/dataset/DataSetAddServiceDataRowConsumer.java" @@ -0,0 +1,307 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.dataset; + +import com.welab.wefe.board.service.service.DataSetStorageService; +import com.welab.wefe.board.service.util.AbstractDataSetReader; +import com.welab.wefe.board.service.util.unique.AbstractDataSetUniqueFilter; +import com.welab.wefe.board.service.util.unique.ContainResult; +import com.welab.wefe.board.service.util.unique.DataSetBloomUniqueFilter; +import com.welab.wefe.board.service.util.unique.DataSetMemoryUniqueFilter; +import com.welab.wefe.common.BatchConsumer; +import com.welab.wefe.common.Validator; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.ListUtil; +import com.welab.wefe.common.util.Md5; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.Launcher; +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.LongAdder; +import java.util.function.Consumer; + +/** + * @author zane.luo + */ +public class DataSetAddServiceDataRowConsumer implements Consumer> { + private final Logger LOG = LoggerFactory.getLogger(DataSetAddServiceDataRowConsumer.class); + + //region construction parameters + + /** + * data set id + */ + private final String dataSetId; + /** + * Do you need to de-duplicate + */ + private final boolean deduplication; + + //endregion + + /** + * To increase the writing speed, batch processing is used. + */ + private final BatchConsumer> batchConsumer; + private int maxBatchSize = 0; + /** + * deduplication filter + */ + private AbstractDataSetUniqueFilter uniqueFilter; + private final DataSetStorageService dataSetStorageService; + private final DataSetTaskService dataSetTaskService; + private final AbstractDataSetReader dataSetReader; + + /** + * first column name in headers + */ + private final String firstColumnName; + /** + * is headers contains y column + */ + private final boolean containsY; + /** + * index of y in headers + */ + private final int yIndex; + + /** + * Number of positive cases + */ + private final AtomicLong yPositiveExampleCount = new AtomicLong(0); + + /** + * The number of duplicate data in the primary key + */ + private final LongAdder repeatDataCount = new LongAdder(); + + public DataSetAddServiceDataRowConsumer(String dataSetId, boolean deduplication, AbstractDataSetReader dataSetReader) throws StatusCodeWithException { + this.dataSetId = dataSetId; + this.deduplication = deduplication; + this.dataSetReader = dataSetReader; + + if (deduplication) { + uniqueFilter = createUniqueFilter(dataSetReader.getTotalDataRowCount()); + } + + List headers = dataSetReader.getHeader(); + this.firstColumnName = headers.get(0); + this.containsY = headers.contains("y"); + this.yIndex = headers.indexOf("y"); + + this.dataSetStorageService = Launcher.CONTEXT.getBean(DataSetStorageService.class); + this.dataSetTaskService = Launcher.CONTEXT.getBean(DataSetTaskService.class); + + batchConsumer = new BatchConsumer<>(10, 1_000, rows -> { + + try { + // save data row to storage + dataSetStorageService.saveDataRows(dataSetId, rows); + + // statistic positive rate + statisticPositiveExampleCount(this.containsY, this.yIndex, rows); + + // update data set upload progress + dataSetTaskService.updateProgress( + dataSetId, + dataSetReader.getTotalDataRowCount(), + dataSetReader.getReadDataRows(), + getRepeatDataCount() + ); + } catch (Exception e) { + LOG.error(e.getMessage(), e); + dataSetTaskService.onError(dataSetId, e); + } + + }); + + } + + + @Override + public void accept(LinkedHashMap row) { + + // In order to enable the upload progress bar to start as soon as possible, + // the initial batch size is set to be smaller. + if (dataSetReader.getReadDataRows() < 100) { + batchConsumer.setMaxBatchSize(50); + } else if (dataSetReader.getReadDataRows() < 1000) { + batchConsumer.setMaxBatchSize(100); + } + // Later processing according to reasonable batch size + else { + // Update the batch size of batch write according to the number of columns + if (this.maxBatchSize < 1) { + this.maxBatchSize = dataSetStorageService.getAddBatchSize(row.size()); + batchConsumer.setMaxBatchSize(this.maxBatchSize); + } + } + + + // Salt and hash the primary key + String id = String.valueOf(row.get(firstColumnName)); + id = Md5.of("hello" + id + "world"); + row.put(firstColumnName, id); + + + List values = new ArrayList<>(row.values()); + + // Move column y to the second column (the first column is the primary key) + if (containsY) { + moveY(values, values.get(yIndex)); + } + + // Save the data row + if (deduplication) { + saveRowWithDeduplication(values); + } else { + batchConsumer.add(values); + } + } + + /** + * Wait for the consumption queue to finish + */ + public void waitForFinishAndClose() { + batchConsumer.waitForFinishAndClose(); + } + + /** + * The count of data duplicated by the primary key + */ + public long getRepeatDataCount() { + return repeatDataCount.longValue(); + } + + /** + * Move column y to the second column (the first column is the primary key) + */ + private void moveY(List values, Object y) { + + if (!Validator.isInteger(y)) { + throw new RuntimeException( + "y 鍒楀繀椤讳负鏁存暟锛屾暟鎹泦绗 " + + dataSetReader.getReadDataRows() + + " 琛岋紝鍙戠幇闈炴暣鏁帮細" + + (StringUtil.isEmpty(String.valueOf(y)) ? "绌" : y) + + "锛岃淇鏁版嵁闆嗗悗閲嶈瘯銆" + ); + } + + ListUtil.moveElement(values, yIndex, 1); + } + + /** + * Save data to storage and ensure that the data is not duplicated + */ + private void saveRowWithDeduplication(List row) { + String id = String.valueOf(row.get(0)); + + ContainResult containResult = uniqueFilter.contains(id); + while (true) { + switch (containResult) { + // Already exists: discard duplicate data + case In: + repeatDataCount.increment(); + return; + + // Does not exist, write + case NotIn: + batchConsumer.add(row); + return; + + // Not sure: Wait for the data written in the queue to be written to confirm the query + case MaybeIn: + // Waiting for all data in the queue to be written to storage + batchConsumer.waitForClean(); + + // Query in the storage to confirm whether it exists + containResult = dataSetStorageService.containsKey(dataSetId, id) + ? ContainResult.In + : ContainResult.NotIn; + continue; + + default: + return; + } + } + } + + /** + * Create a deduplication filter + */ + private AbstractDataSetUniqueFilter createUniqueFilter(long totalDataRowCount) { + + // Use memory filters when the amount of data is small + if (totalDataRowCount > 100_000) { + return new DataSetBloomUniqueFilter(totalDataRowCount); + } else { + return new DataSetMemoryUniqueFilter(); + } + } + + /** + * Count the number of positive cases + */ + private void statisticPositiveExampleCount(boolean containsY, int yIndex, List> rows) { + if (!containsY || yIndex < 0 || CollectionUtils.isEmpty(rows)) { + return; + } + + for (List row : rows) { + Object value = row.get(yIndex); + if (null == value) { + continue; + } + String yValue = String.valueOf(value); + + if ("0".equals(yValue)) { + continue; + } + + yPositiveExampleCount.incrementAndGet(); + } + } + + /** + * Calculate the proportion of positive examples + */ + public double getPositiveExampleRatio() { + long totalCount = this.dataSetReader.getReadDataRows() - this.getRepeatDataCount(); + if (totalCount <= 0) { + return 0; + } + return new BigDecimal(this.yPositiveExampleCount.get()) + .divide(new BigDecimal(totalCount), 4, RoundingMode.HALF_UP) + .doubleValue(); + } + + /** + * Get the number of positive cases + */ + public long getPositiveExampleCount() { + return yPositiveExampleCount.get(); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/dataset/DataSetTaskService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/dataset/DataSetTaskService.java" new file mode 100644 index 0000000000000000000000000000000000000000..fa890f5f8c35778993015dc7b7391e3127c9c091 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/dataset/DataSetTaskService.java" @@ -0,0 +1,203 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.dataset; + +import com.welab.wefe.board.service.api.dataset_task.QueryApi; +import com.welab.wefe.board.service.constant.Config; +import com.welab.wefe.board.service.database.entity.data_set.DataSetMysqlModel; +import com.welab.wefe.board.service.database.entity.data_set.DataSetTaskMysqlModel; +import com.welab.wefe.board.service.database.repository.DataSetRepository; +import com.welab.wefe.board.service.database.repository.DataSetTaskRepository; +import com.welab.wefe.board.service.dto.base.PagingOutput; +import com.welab.wefe.board.service.dto.entity.DataSetTaskOutputModel; +import com.welab.wefe.board.service.dto.vo.DataSetAddInputModel; +import com.welab.wefe.board.service.dto.vo.MemberServiceStatusOutput; +import com.welab.wefe.board.service.service.AbstractService; +import com.welab.wefe.board.service.service.ServiceCheckService; +import com.welab.wefe.common.Convert; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.TimeSpan; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.DateUtil; +import com.welab.wefe.common.web.CurrentAccount; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.Date; +import java.util.function.Consumer; + +/** + * @author lonnie + */ +@Service +public class DataSetTaskService extends AbstractService { + + private static final Object LOCKER = new Object(); + @Autowired + private Config config; + @Autowired + private DataSetAddService dataSetAddService; + @Autowired + private ServiceCheckService serviceCheckService; + @Autowired + protected DataSetRepository dataSetRepository; + @Autowired + private DataSetTaskRepository dataSetTaskRepository; + + public DataSetTaskMysqlModel add(DataSetAddInputModel input) throws StatusCodeWithException, IOException { + + // Check database connection + MemberServiceStatusOutput storageServiceStatus = serviceCheckService.checkStorageServiceStatus(true); + if (!storageServiceStatus.isSuccess()) { + throw new StatusCodeWithException(StatusCode.DATABASE_LOST, config.getDbType() + "杩炴帴澶辫触锛岃妫鏈嶅姟鏄惁姝e父銆"); + } + + if (dataSetRepository.countByName(input.getName()) > 0) { + throw new StatusCodeWithException("姝ゆ暟鎹泦鍚嶇О宸插瓨鍦紝璇锋崲涓涓暟鎹泦鍚嶇О", StatusCode.PARAMETER_VALUE_INVALID); + } + + DataSetTaskMysqlModel dataSetTask = new DataSetTaskMysqlModel(); + dataSetTask.setDataSetName(input.getName()); + dataSetTask.setProgress(0); + dataSetTask.setDataSetId(new DataSetMysqlModel().getId()); + dataSetTaskRepository.save(dataSetTask); + + dataSetAddService.add(input, dataSetTask, CurrentAccount.get()); + + return dataSetTask; + } + + public DataSetTaskMysqlModel findByDataSetId(String dataSetId) { + Specification where = Where + .create() + .equal("dataSetId", dataSetId) + .build(DataSetTaskMysqlModel.class); + + return dataSetTaskRepository.findOne(where).orElse(null); + } + + /** + * Update upload progress + */ + public void updateProgress(String dataSetId, long totalDataRowCount, long readedDataRows, long repeatDataCount) { + // Since storing data sets into storage is a concurrent operation, onerror, updateprogress, complete and other operations may occur simultaneously to update the same task. + // In order to avoid disordered update sequence, lock operation is required here. + synchronized (LOCKER) { + DataSetTaskMysqlModel dataSetTask = findByDataSetId(dataSetId); + + // Calculate progress + int progress = Convert.toInt(readedDataRows * 100L / totalDataRowCount); + + // When the early reading speed is slow, force progress++ + if (dataSetTask.getProgress() < 5 + && readedDataRows < 10000 + && readedDataRows > dataSetTask.getAddedRowCount() + && progress <= dataSetTask.getProgress() + ) { + progress = dataSetTask.getProgress() + 1; + } + + // Avoid dividing by 0 + if (progress == 0) { + progress = 1; + } + + // Because the data_set has not been updated yet. The progress cannot be set to 100 temporarily, otherwise the front end will jump in advance. + if (progress == 100) { + progress = 99; + } + + // Calculate estimated time + long estimateTime = 0; + if (progress < 100) { + long spend = System.currentTimeMillis() - dataSetTask.getCreatedTime().getTime(); + estimateTime = spend / progress * (100 - progress); + } + + dataSetTask.setRepeatIdRowCount(repeatDataCount); + dataSetTask.setAddedRowCount(readedDataRows); + dataSetTask.setEstimateTime(estimateTime); + dataSetTask.setProgress(progress); + dataSetTask.setUpdatedTime(new Date()); + + dataSetTaskRepository.save(dataSetTask); + + LOG.info("鏁版嵁闆嗕换鍔¤繘搴︼細" + dataSetTask.getProgress() + " , " + readedDataRows + "/" + totalDataRowCount); + } + } + + /** + * Upload complete + */ + public void complete(String dataSetId) { + synchronized (LOCKER) { + DataSetTaskMysqlModel dataSetTask = findByDataSetId(dataSetId); + dataSetTask.setAddedRowCount(dataSetTask.getTotalRowCount()); + dataSetTask.setEstimateTime(0); + dataSetTask.setProgress(100); + dataSetTask.setUpdatedTime(new Date()); + + dataSetTaskRepository.save(dataSetTask); + } + } + + public DataSetTaskMysqlModel findById(String id) { + return dataSetTaskRepository.findById(id).orElse(null); + } + + public void update(DataSetTaskMysqlModel dataSetTask, Consumer func) { + if (dataSetTask == null) { + return; + } + + func.accept(dataSetTask); + dataSetTask.setUpdatedTime(new Date()); + dataSetTaskRepository.save(dataSetTask); + } + + public PagingOutput query(QueryApi.Input input) { + Specification where = Where + .create() + .greaterThan("progress", 0) + .lessThan("progress", 100) + .greaterThan("updatedTime", DateUtil.getDate(System.currentTimeMillis() - TimeSpan.fromMinute(10).toMs())) + .build(DataSetTaskMysqlModel.class); + + return dataSetTaskRepository.paging(where, input, DataSetTaskOutputModel.class); + } + + /** + * An exception occurred while saving the dataset + */ + public void onError(String dataSetId, Exception e) { + synchronized (LOCKER) { + DataSetTaskMysqlModel dataSetTask = findByDataSetId(dataSetId); + if (dataSetTask == null) { + return; + } + + dataSetTask = findByDataSetId(dataSetTask.getDataSetId()); + dataSetTask.setErrorMessage(e.getMessage()); + dataSetTask.setUpdatedTime(new Date()); + + dataSetTaskRepository.save(dataSetTask); + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/globalconfig/BaseGlobalConfigService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/globalconfig/BaseGlobalConfigService.java" new file mode 100644 index 0000000000000000000000000000000000000000..27450532fc13a773f88e77ba7da62f3b48d26ea7 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/globalconfig/BaseGlobalConfigService.java" @@ -0,0 +1,157 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.globalconfig; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.PropertyNamingStrategy; +import com.alibaba.fastjson.serializer.SerializeConfig; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.welab.wefe.board.service.database.entity.GlobalConfigMySqlModel; +import com.welab.wefe.board.service.database.repository.GlobalConfigRepository; +import com.welab.wefe.board.service.dto.globalconfig.GlobalConfigInput; +import com.welab.wefe.board.service.service.AbstractService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.data.mysql.Where; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.web.CurrentAccount; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; + +import java.util.List; +import java.util.Objects; + +/** + * @author zane + */ +public class BaseGlobalConfigService extends AbstractService { + + protected static class Group { + public static String MEMBER_INFO = "member_info"; + public static String MAIL_SERVER = "mail_server"; + public static String ALERT_CONFIG = "alert_config"; + public static String WEFE_GATEWAY = "wefe_gateway"; + public static String WEFE_BOARD = "wefe_board"; + public static String WEFE_FLOW = "wefe_flow"; + public static String WEFE_SERVING = "wefe_serving"; + } + + @Autowired + protected GlobalConfigRepository globalConfigRepository; + + /** + * Add or update multiple records + */ + protected void put(List list) throws StatusCodeWithException { + for (GlobalConfigInput item : list) { + put(item.group, item.name, item.value, null); + } + } + + /** + * Add or update an object (multiple records) + */ + protected void put(String group, Object obj) throws StatusCodeWithException { + /** + * 1. The names stored in the database are unified as underscores + * 2. Since fastjson discards fields with a value of null by default, + * it should be set to be preserved during serialization here. + */ + SerializeConfig config = new SerializeConfig(); + config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase; + String json_string = JSON.toJSONString(obj, config, SerializerFeature.WriteMapNullValue); + + JSONObject json = JSON.parseObject(json_string); + for (String name : json.keySet()) { + put(group, name, json.getString(name), null); + } + } + + /** + * Add or update a record + */ + protected synchronized void put(String group, String name, String value, String comment) throws StatusCodeWithException { + GlobalConfigMySqlModel one = findOne(group, name); + if (one == null) { + one = new GlobalConfigMySqlModel(); + one.setGroup(group); + one.setName(name); + one.setCreatedBy(CurrentAccount.id()); + } else { + + if (one.getValue() != null && value == null) { + StatusCode.SQL_ERROR.throwException("涓嶈兘璇曠敤 null 瑕嗙洊闈炴帶鍊"); + } + + // If there is no need to update, jump out + if (Objects.equals(one.getValue(), value)) { + if (comment != null && Objects.equals(one.getComment(), comment)) { + return; + } + } + } + + one.setValue(value); + one.setUpdatedBy(CurrentAccount.id()); + + if (comment != null) { + one.setComment(comment); + } + + globalConfigRepository.save(one); + } + + public GlobalConfigMySqlModel findOne(String group, String name) { + Specification where = Where + .create() + .equal("group", group) + .equal("name", name) + .build(GlobalConfigMySqlModel.class); + + return globalConfigRepository.findOne(where).orElse(null); + } + + /** + * Query list according to group + */ + public List list(String group) { + return globalConfigRepository.findByGroup(group); + } + + /** + * Get the entity corresponding to the specified group + */ + protected T getModel(String group, Class clazz) { + List list = list(group); + return toModel(list, clazz); + } + + /** + * Turn the list of configuration items into entities + */ + private T toModel(List list, Class clazz) { + if (list == null || list.isEmpty()) { + return null; + } + + JSONObject json = new JSONObject(); + for (GlobalConfigMySqlModel item : list) { + json.put(item.getName(), item.getValue()); + } + return json.toJavaObject(clazz); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/globalconfig/GlobalConfigService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/globalconfig/GlobalConfigService.java" new file mode 100644 index 0000000000000000000000000000000000000000..fac50335a47f92447ff9a88cde5d833f56ade113 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/globalconfig/GlobalConfigService.java" @@ -0,0 +1,190 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.globalconfig; + +import com.welab.wefe.board.service.api.global_config.GlobalConfigUpdateApi; +import com.welab.wefe.board.service.dto.globalconfig.*; +import com.welab.wefe.board.service.service.GatewayService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.IpAddressUtil; +import com.welab.wefe.common.util.StringUtil; +import com.welab.wefe.common.web.CurrentAccount; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author Zane + */ +@Service +public class GlobalConfigService extends BaseGlobalConfigService { + @Autowired + private GatewayService gatewayService; + + + public void update(GlobalConfigUpdateApi.Input input) throws StatusCodeWithException { + if (!CurrentAccount.isAdmin()) { + StatusCode.ILLEGAL_REQUEST.throwException("鍙湁绠$悊鍛樻墠鑳芥墽琛屾鎿嶄綔銆"); + } + + input.groups.forEach((groupName, groupItems) -> + groupItems.forEach((key, value) -> { + try { + put(groupName, key, value, null); + } catch (StatusCodeWithException e) { + e.printStackTrace(); + } + }) + ); + + // Notify the gateway to update the system configuration cache + gatewayService.refreshSystemConfigCache(); + } + + + /** + * Add the ip of the board service to the gateway whitelist + * + * @param fuzzy Whether it is a fuzzy match, if it is, + * the last paragraph of the four paragraphs of ip will be changed to *. + */ + public synchronized void appendIpToWhiteList(String ip, String comment, boolean fuzzy) throws StatusCodeWithException { + + if (fuzzy) { + String[] array = ip.split("\\."); + array[array.length - 1] = "*"; + ip = StringUtil.join(array, "."); + } + + GatewayConfigModel gatewayConfig = getGatewayConfig(); + List list = IpAddressUtil.parseStringToIpList(gatewayConfig.ipWhiteList); + + // Already exist, do not add repeatedly. + if (list.contains(ip)) { + return; + } + + gatewayConfig.ipWhiteList = gatewayConfig.ipWhiteList + + System.lineSeparator() + + "# " + comment + + System.lineSeparator() + + ip + + System.lineSeparator(); + + setGatewayConfig(gatewayConfig); + } + + + /** + * init global config items + */ + public void init() throws StatusCodeWithException { + LOG.info("start init global config"); + GatewayConfigModel gatewayConfig = getGatewayConfig(); + if (gatewayConfig == null) { + setGatewayConfig(new GatewayConfigModel()); + } + + MailServerModel mailServer = getMailServer(); + if (mailServer == null) { + setMailServer(new MailServerModel()); + } + + BoardConfigModel boardConfig = getBoardConfig(); + if (boardConfig == null) { + setBoardConfig(new BoardConfigModel()); + } + + AlertConfigModel alertConfig = getAlertConfig(); + if (alertConfig == null) { + setAlertConfig(new AlertConfigModel()); + } + + FlowConfigModel flowConfig = getFlowConfig(); + if (flowConfig == null) { + setFlowConfig(new FlowConfigModel()); + } + + ServingConfigModel servingConfig = getServingConfig(); + if (servingConfig == null) { + setServingConfig(new ServingConfigModel()); + } + + LOG.info("init global config success!"); + } + + + public GatewayConfigModel getGatewayConfig() { + return getModel(Group.WEFE_GATEWAY, GatewayConfigModel.class); + } + + public void setGatewayConfig(GatewayConfigModel model) throws StatusCodeWithException { + put(Group.WEFE_GATEWAY, model); + } + + public void setMemberInfo(MemberInfoModel model) throws StatusCodeWithException { + put(Group.MEMBER_INFO, model); + } + + public MemberInfoModel getMemberInfo() { + return getModel(Group.MEMBER_INFO, MemberInfoModel.class); + } + + public void setMailServer(MailServerModel model) throws StatusCodeWithException { + put(Group.MAIL_SERVER, model); + } + + public MailServerModel getMailServer() { + return getModel(Group.MAIL_SERVER, MailServerModel.class); + } + + public void setBoardConfig(BoardConfigModel model) throws StatusCodeWithException { + put(Group.WEFE_BOARD, model); + } + + public BoardConfigModel getBoardConfig() { + return getModel(Group.WEFE_BOARD, BoardConfigModel.class); + } + + public void setAlertConfig(AlertConfigModel model) throws StatusCodeWithException { + put(Group.ALERT_CONFIG, model); + } + + public AlertConfigModel getAlertConfig() { + return getModel(Group.ALERT_CONFIG, AlertConfigModel.class); + } + + + public void setFlowConfig(FlowConfigModel model) throws StatusCodeWithException { + put(Group.WEFE_FLOW, model); + } + + public FlowConfigModel getFlowConfig() { + return getModel(Group.WEFE_FLOW, FlowConfigModel.class); + } + + public void setServingConfig(ServingConfigModel model) throws StatusCodeWithException { + put(Group.WEFE_SERVING, model); + } + + public ServingConfigModel getServingConfig() { + return getModel(Group.WEFE_SERVING, ServingConfigModel.class); + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/init/AbstractManifest.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/init/AbstractManifest.java" new file mode 100644 index 0000000000000000000000000000000000000000..8a04657bea88f78aee11d4382f87f009f5fbc77f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/init/AbstractManifest.java" @@ -0,0 +1,24 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.init; + +/** + * @author zane.luo + */ +public class AbstractManifest { + public String type; +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/init/MainfestType.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/init/MainfestType.java" new file mode 100644 index 0000000000000000000000000000000000000000..e6b093839a9598e62158113041592889b999ec00 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/init/MainfestType.java" @@ -0,0 +1,26 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.init; + +/** + * @author zane.luo + */ +public enum MainfestType { + list, + data_set, + project +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/BaseLogisticRegressionLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/BaseLogisticRegressionLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..026037e375fe9648b1835c8e5cc3caf9f28af643 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/BaseLogisticRegressionLanguage.java" @@ -0,0 +1,148 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import org.apache.commons.collections4.CollectionUtils; + +import java.util.List; +import java.util.Map; + +/** + * Basic classes of logistic regression language + * + * @author aaron.li + **/ +public class BaseLogisticRegressionLanguage { + + /** + * Method body placeholder + */ + public static final String METHOD_BODY_PLACEHOLDER = "#body#"; + + /** + * Code indent unit character + */ + public static final String INDENTATION_UNIT_CHAR = " "; + + + /** + * Generate complete code + * + * @param headers Header information + * @param weightMap Weight information + * @param intercept intercept + */ + public String generateMethodCode(List headers, Map weightMap, String intercept) { + // Method pre signature code + String preMethodSignNameCode = generatePreMethodSignNameCode(); + // Method body code + String methodBodyCode = generateMethodBodyCode(headers, weightMap, intercept); + + return preMethodSignNameCode.replace(METHOD_BODY_PLACEHOLDER, methodBodyCode); + } + + + /** + * Generate method pre signature code + */ + protected String generatePreMethodSignNameCode() { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("public class Model {") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append("public static double score(double[] input) {") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append(INDENTATION_UNIT_CHAR) + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append("}") + .append("\n") + .append("}"); + + return preMethodCode.toString(); + } + + /** + * Generate method body code + */ + protected String generateMethodBodyCode(List headers, Map weightMap, String intercept) { + StringBuilder bodyCode = new StringBuilder(); + if (CollectionUtils.isEmpty(headers)) { + return bodyCode.toString(); + } + bodyCode.append(generateReturnChar()) + .append("((") + .append(intercept) + .append(") + "); + for (int i = 0; i < headers.size(); i++) { + String feature = headers.get(i); + bodyCode.append("((") + .append(generateCompareVarName(i)) + .append(") * (") + .append(weightMap.get(feature)) + .append("))"); + if (i < headers.size() - 1) { + bodyCode.append(" + "); + } + } + bodyCode.append(")") + .append(lineEndSymbol()); + return bodyCode.toString(); + } + + /** + * Line end symbol + */ + protected String lineEndSymbol() { + return ";"; + } + + /** + * Generate indent symbol + * + * @param num Indent number + */ + protected String generateIndentationChar(int num) { + StringBuilder blankCharSb = new StringBuilder(); + // Root node + for (int i = 1; i <= num; i++) { + blankCharSb.append(INDENTATION_UNIT_CHAR); + } + + return blankCharSb.toString(); + } + + + /** + * Generate comparison variable name + * + * @param index index + */ + protected String generateCompareVarName(int index) { + return "input[" + index + "]"; + } + + /** + * Generate return value characters + */ + protected String generateReturnChar() { + return "return "; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/BaseXgboostLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/BaseXgboostLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..62ae487ba2fc484066350d0fd9c24dcefb2e903a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/BaseXgboostLanguage.java" @@ -0,0 +1,551 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import com.welab.wefe.common.util.JObject; +import org.apache.commons.collections4.CollectionUtils; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Basic classes of xgboost language + * + * @author aaron.li + **/ +public class BaseXgboostLanguage { + /** + * Root node key value + */ + public static final String ROOT_NODE_KEY = "0"; + /** + * Method body placeholder + */ + public static final String METHOD_BODY_PLACEHOLDER = "#body#"; + + public static final String SPECIAL_NUMERIC = "#"; + /** + * Maximum number of cycles + */ + public static final int MAX_LOOP_COUNT = 1000; + + /** + * Code indent unit character + */ + public static final String INDENTATION_UNIT_CHAR = " "; + /** + * Second classification + */ + private static final int NUM_CLASSES_2_CLASSIFICATIONS = 2; + + /** + * Generate complete code + * + * @param treeMapList One dimensional array structure of tree + */ + public String buildWholeCode(List> treeMapList, int treeDim, int numClasses, String initScore, JObject featureNameFidMappingObj) { + // Preprocessing (that is, the code corresponding to each node of the spanning tree) + preGenerateTreeNodeCode(treeMapList); + + // Number of trees + int treeNum = treeMapList.size(); + + // Pre generated method signature code + String preMethodSignNameCode = null; + // Second classification + if (numClasses <= NUM_CLASSES_2_CLASSIFICATIONS) { + // Method pre signature code + preMethodSignNameCode = preBuild2ClassificationsMethodSignNameCode(treeNum, initScore); + } else { + // Multi classification + // Classification quantity锛圔ecause the method signature of Haskell language is generated according to the result classification, only rewritable method signature methods can be defined锛 + int treeMultipleClassificationsNum = treeMultipleClassificationsModMap(treeNum, treeDim).size(); + // Subclasses do not override this method, which is the same as that of the second category by default + preMethodSignNameCode = preBuildMultipleClassificationsMethodSignNameCode(treeNum, treeMultipleClassificationsNum, initScore); + } + + // Method body code + String methodBodyCode = buildMethodBodyCode(treeMapList, treeDim, numClasses, initScore); + // Method complete code + return preMethodSignNameCode.replace(METHOD_BODY_PLACEHOLDER, methodBodyCode); + } + + + /** + * Pre generated binary classification method signature code + * + * @param treeNum tree number + */ + protected String preBuild2ClassificationsMethodSignNameCode(int treeNum, String initScore) { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("public class Model {") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append("public static double[] score(double[] input) {") + .append("\n") + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append(indentationByNodeLayer(1, false) + "}") + .append("\n") + .append("}"); + return preMethodCode.toString(); + } + + /** + * Pre generated multi classification method signature code + * + * @param treeNum tree number + * @param classificationsNum classifications number + * @param initScore init score + */ + protected String preBuildMultipleClassificationsMethodSignNameCode(int treeNum, int classificationsNum, String initScore) { + return preBuild2ClassificationsMethodSignNameCode(treeNum, initScore); + } + + /** + * Generate method body code + * + * @param preTreeMapList Preprocessing list of all trees + */ + protected String buildMethodBodyCode(List> preTreeMapList, int treeDim, int numClasses, String initScore) { + StringBuilder bodyCode = new StringBuilder(); + if (CollectionUtils.isEmpty(preTreeMapList)) { + return bodyCode.toString(); + } + for (int i = 0; i < preTreeMapList.size(); i++) { + bodyCode.append(buildTreeCode(preTreeMapList.get(i), i)); + bodyCode.append("\n"); + } + bodyCode.append(buildMethodResultLogicCode(preTreeMapList.size(), treeDim, numClasses, initScore)); + return bodyCode.toString(); + } + + /** + * Generate the result logical code of the return value of the method + * + * @param treeNum tree number + */ + protected String buildMethodResultLogicCode(int treeNum, int treeDim, int numClasses, String initScore) { + StringBuilder methodSummaryCode = new StringBuilder(); + + // Second classification + if (numClasses <= NUM_CLASSES_2_CLASSIFICATIONS) { + methodSummaryCode.append(build2ClassificationsResultLogicCode(treeNum, initScore)); + } else { + // Multi classification + methodSummaryCode.append(buildMultipleClassificationsResultLogicCode(treeNum, treeDim, initScore)); + } + + return methodSummaryCode.toString(); + } + + /** + * Generate the result logic code of the second classification + */ + protected String build2ClassificationsResultLogicCode(int treeNum, String initScore) { + StringBuilder methodCalcCode = new StringBuilder(); + String summaryVar = "s1"; + methodCalcCode.append(indentationByNodeLayer(1, true)); + methodCalcCode.append(generateVarDef(summaryVar)) + .append("\n") + .append(indentationByNodeLayer(1, true)) + .append(summaryVar) + .append(" = 1 / (1 + Math.exp(0 - (") + .append(generateTreeSum(treeNum, initScore)) + .append(")))") + .append(lineEndSymbol()) + .append("\n") + .append(build2ClassificationsReturnCode(summaryVar, initScore)); + + return methodCalcCode.toString(); + } + + /** + * Generate secondary classification return result code + * + * @param varName Variable name of classification + */ + protected String build2ClassificationsReturnCode(String varName, String initScore) { + StringBuilder methodResultCode = new StringBuilder(); + methodResultCode.append(indentationByNodeLayer(1, true)) + .append("return new double[] {1 - " + varName + ", " + varName + "}" + lineEndSymbol()); + + return methodResultCode.toString(); + } + + + /** + * Generate multi classification result logic code + */ + protected String buildMultipleClassificationsResultLogicCode(int treeNum, int treeDim, String initScore) { + StringBuilder methodCalcCode = new StringBuilder(); + // Tree result variable classification map (key: module; value: variable name of each tree) + Map> treeClassificationMap = treeMultipleClassificationsModMap(treeNum, treeDim); + + // Generate classified variables and calculation logic + int index = 0; + for (Map.Entry> entry : treeClassificationMap.entrySet()) { + String rVarName = generateResultVarName(index); + String rVarNameDef = generateVarDef(generateResultVarName(index)); + methodCalcCode.append(resultIndentationNum(2)) + .append(rVarNameDef) + .append("\n") + .append(resultIndentationNum(2)) + .append(rVarName) + .append(" = 1 / (1 + ") + .append(buildExpFunction(entry.getValue(), initScore)) + .append(")") + .append(lineEndSymbol()) + .append("\n"); + index++; + } + + // Generate and return the results of each classification + methodCalcCode.append(buildMultipleClassificationsReturnCode(treeClassificationMap.size())); + return methodCalcCode.toString(); + } + + + /** + * Modular regression map of tree multi classification + */ + protected Map> treeMultipleClassificationsModMap(int treeNum, int treeDim) { + // Tree result variable classification map (key: tree index module, value: result variable of each tree) + Map> treeClassificationMap = new LinkedHashMap<>(16); + for (int i = 1; i <= treeNum; i++) { + int mod = i % treeDim; + List treeClassificationList = treeClassificationMap.get(mod); + treeClassificationList = CollectionUtils.isEmpty(treeClassificationList) ? new ArrayList<>() : treeClassificationList; + treeClassificationList.add(generateVarName(i - 1)); + treeClassificationMap.put(mod, treeClassificationList); + } + + return treeClassificationMap; + } + + + /** + * Generate the sum of all trees + * + * @param treeNum tree number + * @param initScore init score + */ + protected String generateTreeSum(int treeNum, String initScore) { + List treeVarNameList = buildTreeVarNameList(treeNum); + return generateTreeSum(treeVarNameList, initScore); + } + + + /** + * Generate the sum of all trees + * + * @param treeVarNameList List of variable names for all trees + * @param initScore init score + */ + protected String generateTreeSum(List treeVarNameList, String initScore) { + StringBuilder sumSb = new StringBuilder(); + sumSb.append("(" + initScore + ")"); + if (CollectionUtils.isNotEmpty(treeVarNameList)) { + sumSb.append(" + "); + for (int i = 0; i < treeVarNameList.size(); i++) { + sumSb.append("(") + .append(treeVarNameList.get(i)) + .append(")"); + if (i < treeVarNameList.size() - 1) { + sumSb.append(" + "); + } + } + } + + return sumSb.toString(); + } + + + /** + * Calculation of double power function generating Euler number e + */ + protected String buildExpFunction(List treeVarNameList, String initScore) { + StringBuilder code = new StringBuilder(); + code.append("Math.exp(0 - (") + .append(generateTreeSum(treeVarNameList, initScore)) + .append("))"); + + return code.toString(); + } + + + /** + * Generate multi category return statements + * + * @param classificationsNum classifications number + */ + protected String buildMultipleClassificationsReturnCode(int classificationsNum) { + StringBuilder code = new StringBuilder(); + code.append(resultIndentationNum(2)) + .append("return new double[] {"); + code.append(generateCodeByClassificationsNum(classificationsNum)); + code.append("}").append(lineEndSymbol()); + return code.toString(); + } + + protected String generateCodeByClassificationsNum(int classificationsNum) { + StringBuilder code = new StringBuilder(); + for (int i = 0; i < classificationsNum; i++) { + code.append(generateResultVarName(i)) + .append(" / (") + // Generate the sum of categories + .append(generateTreeClassificationsResultSum(classificationsNum)) + .append(")"); + if (i < classificationsNum - 1) { + code.append(", "); + } + } + return code.toString(); + } + + + protected String generateTreeClassificationsResultSum(int classificationsNum) { + StringBuilder sumCode = new StringBuilder(); + for (int i = 0; i < classificationsNum; i++) { + sumCode.append(generateResultVarName(i)); + if (i < classificationsNum - 1) { + sumCode.append(" + "); + } + } + + return sumCode.toString(); + } + + + /** + * Pre generated node code + * + * @param node node + * @param treeIndex The tree index of the tree to which the node belongs + * @return Node pre code + */ + protected String preGenerateNodeCode(Node node, int treeIndex) { + StringBuilder codeSb = new StringBuilder(); + codeSb.append(indentationByNodeLayer(node, true)); + // Leaf node + if (node.isLeaf()) { + codeSb.append(generateVarName(treeIndex)).append(" = ").append(node.getWeight()).append(lineEndSymbol()); + } else { + codeSb.append("if ((").append(generateCompareVarName(node.getFid())).append(") " + greaterThanSymbol() + " (").append(node.getBid()).append(")) {") + .append("\n") + .append(generateIdPlaceholder(node.getRightNodeId())) + .append("\n") + .append(indentationByNodeLayer(node, true)) + .append(" } else {") + .append("\n") + .append(generateIdPlaceholder(node.getLeftNodeId())) + .append("\n") + .append(indentationByNodeLayer(node, true)) + .append("}"); + } + + return codeSb.toString(); + + } + + + /** + * Code to build the tree + * + * @param treeMap tree node Map + * @param treeIndex Tree index, starting at 0 + * @return tree code + */ + private String buildTreeCode(Map treeMap, int treeIndex) { + // root node + Node rootNode = treeMap.get(ROOT_NODE_KEY); + // code + String code = indentationByNodeLayer(rootNode, true) + generateVarDef(generateVarName(treeIndex)) + "\n" + rootNode.getCode(); + // Current number of cycles + int currentIndex = 1; + // Add the maximum number of cycles, as long as it is to avoid dead cycles caused by incorrect tree structure + while (code.contains(SPECIAL_NUMERIC) && currentIndex <= MAX_LOOP_COUNT) { + // Intercept the variable ID + List ids = findReplaceIds(code); + if (CollectionUtils.isNotEmpty(ids)) { + for (String id : ids) { + Node subNode = treeMap.get(id.replace(SPECIAL_NUMERIC, "")); + code = code.replace(id, subNode.getCode()); + } + } + currentIndex++; + } + return code; + } + + + /** + * Pre generated tree node code (that is, the code corresponding to each node of the tree) + * + * @param treeMapList One dimensional array of trees + */ + private void preGenerateTreeNodeCode(List> treeMapList) { + for (int i = 0; i < treeMapList.size(); i++) { + Map treeMap = treeMapList.get(i); + for (Map.Entry entry : treeMap.entrySet()) { + Node node = entry.getValue(); + node.setCode(preGenerateNodeCode(node, i)); + } + } + } + + + /** + * Extract the ID to replace from the string + */ + private static List findReplaceIds(String code) { + List result = new ArrayList<>(); + String regex = "#(\\d+)#"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(code); + while (matcher.find()) { + result.add(matcher.group()); + } + + return result; + } + + /** + * List of result variable names for the spanning tree + * + * @param treeNum tree number + */ + protected List buildTreeVarNameList(int treeNum) { + List treeVarNameList = new ArrayList<>(); + for (int i = 0; i < treeNum; i++) { + treeVarNameList.add(generateVarName(i)); + } + + return treeVarNameList; + } + + + /** + * Generate indented space characters based on node hierarchy + * + * @param node node + * @param initIndentation Need initial indent + */ + protected String indentationByNodeLayer(Node node, boolean initIndentation) { + int layer = node.getLayer(); + StringBuilder blankCharSb = new StringBuilder(initIndentation ? INDENTATION_UNIT_CHAR : ""); + for (int i = 1; i <= layer; i++) { + blankCharSb.append(INDENTATION_UNIT_CHAR); + } + + return blankCharSb.toString(); + } + + protected String indentationByNodeLayer(int layer, boolean initIndentation) { + StringBuilder blankCharSb = new StringBuilder(initIndentation ? INDENTATION_UNIT_CHAR : ""); + for (int i = 1; i <= layer; i++) { + blankCharSb.append(INDENTATION_UNIT_CHAR); + } + + return blankCharSb.toString(); + } + + /** + * Number of indent tab keys for multi category results + * + * @param num indented Number + */ + protected String resultIndentationNum(int num) { + return indentationNum(num); + } + + + protected String indentationNum(int num) { + StringBuilder indentation = new StringBuilder(); + for (int i = 0; i < num; i++) { + indentation.append(INDENTATION_UNIT_CHAR); + } + return indentation.toString(); + } + + + /** + * Line end symbol + */ + protected String lineEndSymbol() { + return ";"; + } + + /** + * Generate greater than sign + */ + protected String greaterThanSymbol() { + return ">"; + } + + + /** + * Generate node ID placeholder + * + * @param nodeId node id + */ + protected String generateIdPlaceholder(String nodeId) { + return "#" + nodeId + "#"; + } + + /** + * generate var name + * + * @param varSerialNo var serialNo + */ + protected String generateVarName(int varSerialNo) { + return "var" + varSerialNo; + } + + /** + * generate result var name + * + * @param varSerialNo var serial no + */ + protected String generateResultVarName(int varSerialNo) { + return "s" + varSerialNo; + } + + /** + * generate var def + * + * @param varName var name + */ + protected String generateVarDef(String varName) { + return "double " + varName + lineEndSymbol(); + } + + /** + * generate compare var name + * + * @param index index + */ + protected String generateCompareVarName(String index) { + return "input[" + index + "]"; + } + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionCLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionCLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..f0efbaabb630b71685150bad09a6630d4ac4e102 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionCLanguage.java" @@ -0,0 +1,37 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * C language + * + * @author aaron.li + **/ +public class LogisticRegressionCLanguage extends BaseLogisticRegressionLanguage { + + @Override + protected String generatePreMethodSignNameCode() { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("double score(double * input) {") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("}"); + return preMethodCode.toString(); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionCSharpLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionCSharpLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..306b1243bfec10081daf93a77539803c70a38f8f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionCSharpLanguage.java" @@ -0,0 +1,45 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * C# language + * + * @author aaron.li + **/ +public class LogisticRegressionCSharpLanguage extends BaseLogisticRegressionLanguage { + + @Override + protected String generatePreMethodSignNameCode() { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("namespace ML {") + .append("\n") + .append(generateIndentationChar(1)) + .append("public static class Model {") + .append("\n") + .append(generateIndentationChar(2)) + .append("public static double Score(double[] input) {") + .append("\n") + .append(generateIndentationChar(3)) + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("}}}"); + + + return preMethodCode.toString(); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionDartLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionDartLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..9e62167297fce855527885bd85d18668c608ac93 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionDartLanguage.java" @@ -0,0 +1,39 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * Dart language + * + * @author aaron.li + **/ +public class LogisticRegressionDartLanguage extends BaseLogisticRegressionLanguage { + + @Override + protected String generatePreMethodSignNameCode() { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("double score(List input) {") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("}"); + + return preMethodCode.toString(); + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionGoLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionGoLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..fead3f8b347a14d6cceb4f62441e12e16c03ecce --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionGoLanguage.java" @@ -0,0 +1,38 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * GO language + * + * @author aaron.li + **/ +public class LogisticRegressionGoLanguage extends BaseLogisticRegressionLanguage { + + @Override + protected String generatePreMethodSignNameCode() { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("func score(input []float64) float64 {") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("}"); + + return preMethodCode.toString(); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionHaskellLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionHaskellLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..7e94eecc96fc1f43e9c1bd4b12fcaae5e3afba52 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionHaskellLanguage.java" @@ -0,0 +1,55 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * haskell language + * + * @author aaron.li + **/ +public class LogisticRegressionHaskellLanguage extends BaseLogisticRegressionLanguage { + + @Override + protected String generatePreMethodSignNameCode() { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("module Model where") + .append("\n") + .append("score :: [Double] -> Double") + .append("\n") + .append("score input =") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append(METHOD_BODY_PLACEHOLDER); + + return preMethodCode.toString(); + } + + @Override + protected String generateCompareVarName(int index) { + return "(input) !! (" + index + ")"; + } + + @Override + protected String lineEndSymbol() { + return ""; + } + + @Override + protected String generateReturnChar() { + return ""; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionJavaLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionJavaLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..7c4854f7edf85ce648d82f7662641d0b8d4fbad5 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionJavaLanguage.java" @@ -0,0 +1,25 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * java language + * + * @author aaron.li + **/ +public class LogisticRegressionJavaLanguage extends BaseLogisticRegressionLanguage { +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionJavaScriptLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionJavaScriptLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..adc0169abc731384fde75d5582c2445e58c49bf1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionJavaScriptLanguage.java" @@ -0,0 +1,37 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * JavaScript language + * + * @author aaron.li + **/ +public class LogisticRegressionJavaScriptLanguage extends BaseLogisticRegressionLanguage { + + @Override + protected String generatePreMethodSignNameCode() { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("function score(input) {") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("}"); + return preMethodCode.toString(); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionLanguageSelector.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionLanguageSelector.java" new file mode 100644 index 0000000000000000000000000000000000000000..75338c33d58fa73d5af6de7a42cc86574db0f27b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionLanguageSelector.java" @@ -0,0 +1,57 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import com.welab.wefe.common.enums.ModelExportLanguage; + +import java.util.HashMap; +import java.util.Map; + +/** + * Language selector for logistic regression + * + * @author aaron.li + **/ +public class LogisticRegressionLanguageSelector { + private final String language; + private static final Map LANGUAGE_MAP = new HashMap<>(16); + + static { + LANGUAGE_MAP.put(ModelExportLanguage.c.name(), new LogisticRegressionCLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.cSharp.name(), new LogisticRegressionCSharpLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.dart.name(), new LogisticRegressionDartLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.go.name(), new LogisticRegressionGoLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.haskell.name(), new LogisticRegressionHaskellLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.java.name(), new LogisticRegressionJavaLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.javaScript.name(), new LogisticRegressionJavaScriptLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.php.name(), new LogisticRegressionPhpLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.powerShell.name(), new LogisticRegressionPowerShellLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.python.name(), new LogisticRegressionPythonLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.r.name(), new LogisticRegressionRLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.ruby.name(), new LogisticRegressionRubyLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.visualBasic.name(), new LogisticRegressionVisualBasicLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.pmml.name(), new LogisticRegressionPmmlLanguage()); + } + + public LogisticRegressionLanguageSelector(String language) { + this.language = language; + } + + public BaseLogisticRegressionLanguage getSelector() { + return LANGUAGE_MAP.get(language); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionModelExportService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionModelExportService.java" new file mode 100644 index 0000000000000000000000000000000000000000..9ee4f22dc132cc5085371c0bbf11d7ed783f30e4 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionModelExportService.java" @@ -0,0 +1,69 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import com.alibaba.fastjson.JSONArray; +import com.welab.wefe.common.util.JObject; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Logistic regression model export service + * + * @author aaron.li + **/ +@Service +public class LogisticRegressionModelExportService { + + /** + * export model + * + * @param modelParam model param + * @param language language + */ + public String export(JObject modelParam, String language) { + // Get the corresponding language interpreter + BaseLogisticRegressionLanguage baseLogisticRegressionLanguage = getXgboostLanguage(language); + JSONArray headerArray = modelParam.getJSONArray("header"); + String intercept = modelParam.getString("intercept"); + JObject weight = modelParam.getJObject("weight"); + + List headers = new ArrayList<>(); + for (Object header : headerArray) { + headers.add(String.valueOf(header)); + } + + Map weightMap = new HashMap<>(16); + for (Map.Entry entry : weight.getInnerMap().entrySet()) { + weightMap.put(entry.getKey(), String.valueOf(entry.getValue())); + } + + return baseLogisticRegressionLanguage.generateMethodCode(headers, weightMap, intercept); + } + + + /** + * language interpreter + */ + private BaseLogisticRegressionLanguage getXgboostLanguage(String language) { + return new LogisticRegressionLanguageSelector(language).getSelector(); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionPhpLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionPhpLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..32ce92d2b2ba678b2825a304ee2d131f29f0c5b7 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionPhpLanguage.java" @@ -0,0 +1,44 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * PHP language + * + * @author aaron.li + **/ +public class LogisticRegressionPhpLanguage extends BaseLogisticRegressionLanguage { + + @Override + protected String generatePreMethodSignNameCode() { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append(" headers, Map weightMap, String intercept) { + PMML pmml = new PMML(); + pmml.setVersion("4.3"); + pmml.setHeader(buildHeader()); + pmml.setDataDictionary(buildDataDictionary(headers)); + pmml.addModels(buildRegressionModel(headers, weightMap, intercept)); + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + PMMLUtil.marshal(pmml, outputStream); + return outputStream.toString(); + } catch (Exception e) { + LOG.error("Model export logistic regression generates PMML language exception锛", e); + } + return ""; + } + + + /** + * Header information + */ + private Header buildHeader() { + Header header = new Header(); + Application application = new Application("Logistic Regression Model"); + application.setVersion("1.0"); + header.setApplication(application); + header.setTimestamp(new Timestamp()); + return header; + } + + /** + * Dictionary input parameter information + */ + private DataDictionary buildDataDictionary(List headers) { + DataDictionary dataDictionary = new DataDictionary(); + List dataFields = new ArrayList<>(); + // Initialize Y parameter + dataFields.add(new DataField() + .setName(new FieldName("y")) + .setOpType(OpType.CONTINUOUS) + .setDataType(DataType.DOUBLE)); + // Other input parameters + for (String param : headers) { + dataFields.add(new DataField() + .setName(new FieldName(param)) + .setOpType(OpType.CONTINUOUS) + .setDataType(DataType.DOUBLE)); + } + + dataDictionary.addDataFields(dataFields.toArray(new DataField[0])); + return dataDictionary; + } + + /** + * regression model + */ + private RegressionModel buildRegressionModel(List headers, Map weightMap, String intercept) { + RegressionModel regressionModel = new RegressionModel(); + regressionModel.setMiningFunction(MiningFunction.REGRESSION); + regressionModel.setMiningSchema(buildMiningSchema(headers)); + regressionModel.addRegressionTables(buildRegressionTable(headers, weightMap, intercept)); + return regressionModel; + } + + /** + * Mining schema + */ + private MiningSchema buildMiningSchema(List headers) { + MiningSchema miningSchema = new MiningSchema(); + // Y + miningSchema.addMiningFields(new MiningField().setName(new FieldName("y")) + .setUsageType(MiningField.UsageType.TARGET)); + for (String param : headers) { + miningSchema.addMiningFields(new MiningField().setName(new FieldName(param))); + } + return miningSchema; + } + + /** + * Regression table + */ + private RegressionTable buildRegressionTable(List headers, Map weightMap, String intercept) { + RegressionTable regressionTable = new RegressionTable(); + regressionTable.setIntercept(NumberUtils.toDouble(intercept, 0)); + + for (String param : headers) { + regressionTable.addNumericPredictors(new NumericPredictor() + .setName(new FieldName(param)) + .setCoefficient(NumberUtils.toDouble(weightMap.get(param)))); + } + + return regressionTable; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionPowerShellLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionPowerShellLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..9b46ca04833b6f0265c38092bdc8b4d6a35f47f8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionPowerShellLanguage.java" @@ -0,0 +1,47 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * powerShell language + * + * @author aaron.li + **/ +public class LogisticRegressionPowerShellLanguage extends BaseLogisticRegressionLanguage { + + @Override + protected String generatePreMethodSignNameCode() { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("function Score([double[]] $InputVector) {") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("}"); + return preMethodCode.toString(); + } + + @Override + protected String generateCompareVarName(int index) { + return "$InputVector[" + index + "]"; + } + + @Override + protected String lineEndSymbol() { + return ""; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionPythonLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionPythonLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..7a63810fd46c707adcdd543cbc2e330c252688be --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionPythonLanguage.java" @@ -0,0 +1,40 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * Python language + * + * @author aaron.li + **/ +public class LogisticRegressionPythonLanguage extends BaseLogisticRegressionLanguage { + + @Override + protected String generatePreMethodSignNameCode() { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("def score(input):") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append(METHOD_BODY_PLACEHOLDER); + return preMethodCode.toString(); + } + + @Override + protected String lineEndSymbol() { + return ""; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionRLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionRLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..40678c18d6b73a626362a3520933a3d9717cf7b0 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionRLanguage.java" @@ -0,0 +1,42 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * R language + * + * @author aaron.li + **/ +public class LogisticRegressionRLanguage extends BaseLogisticRegressionLanguage { + + @Override + protected String generatePreMethodSignNameCode() { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("score <- function(input) {") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("}"); + return preMethodCode.toString(); + } + + @Override + protected String lineEndSymbol() { + return ""; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionRubyLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionRubyLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..4a43a193ace630a2f6e0405d098b91b7b0f5229d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionRubyLanguage.java" @@ -0,0 +1,47 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * Ruby language + * + * @author aaron.li + **/ +public class LogisticRegressionRubyLanguage extends BaseLogisticRegressionLanguage { + + @Override + protected String generatePreMethodSignNameCode() { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("def score(input)") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("end"); + return preMethodCode.toString(); + } + + @Override + protected String lineEndSymbol() { + return ""; + } + + @Override + protected String generateReturnChar() { + return ""; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionVisualBasicLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionVisualBasicLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..8fbe998a970525e7877e3a2764a3462ec41fe2c8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/LogisticRegressionVisualBasicLanguage.java" @@ -0,0 +1,56 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * visualBasic language + * + * @author aaron.li + **/ +public class LogisticRegressionVisualBasicLanguage extends BaseLogisticRegressionLanguage { + + @Override + protected String generatePreMethodSignNameCode() { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("Module Model") + .append("\n") + .append("Function Score(ByRef inputVector() As Double) As Double") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("End Function") + .append("\n") + .append("End Module"); + return preMethodCode.toString(); + } + + @Override + protected String generateReturnChar() { + return "Score = "; + } + + @Override + protected String lineEndSymbol() { + return ""; + } + + @Override + protected String generateCompareVarName(int index) { + return "inputVector(" + index + ")"; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/ModelExportService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/ModelExportService.java" new file mode 100644 index 0000000000000000000000000000000000000000..8532aa073f31b9ead99b5286961fbc029ec5b730 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/ModelExportService.java" @@ -0,0 +1,99 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import com.welab.wefe.board.service.database.entity.job.JobMySqlModel; +import com.welab.wefe.board.service.database.entity.job.TaskResultMySqlModel; +import com.welab.wefe.board.service.service.JobService; +import com.welab.wefe.board.service.service.TaskResultService; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.ComponentType; +import com.welab.wefe.common.enums.FederatedLearningType; +import com.welab.wefe.common.enums.JobMemberRole; +import com.welab.wefe.common.enums.ModelExportLanguage; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.util.JObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * Model export unified entry + * + * @author aaron.li + **/ +@Service +public class ModelExportService { + protected final Logger LOG = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private JobService jobService; + + @Autowired + private LogisticRegressionModelExportService logisticRegressionModelExportService; + + @Autowired + private XgboostModelExportService xgboostModelExportService; + + @Autowired + private TaskResultService taskResultService; + + /** + * Execute export + * + * @param jobId job id + * @param modelFlowNodeId model flow node id + * @param language export language + * @return Export results + */ + public String handle(String jobId, String modelFlowNodeId, String role, String language) throws StatusCodeWithException { + try { + if (!ModelExportLanguage.isExist(language)) { + throw new StatusCodeWithException("language 鍙傛暟鍊奸潪娉", StatusCode.PARAMETER_VALUE_INVALID); + } + + JobMySqlModel jobMySqlModel = jobService.findByJobId(jobId, JobMemberRole.valueOf(role)); + if (null == jobMySqlModel) { + throw new StatusCodeWithException("浠诲姟淇℃伅涓嶅瓨鍦", StatusCode.DATA_NOT_FOUND); + } + + if (!FederatedLearningType.horizontal.equals(jobMySqlModel.getFederatedLearningType())) { + throw new StatusCodeWithException("鍙敮鎸佹í鍚戝鍑", StatusCode.DATA_NOT_FOUND); + } + + TaskResultMySqlModel taskResultMySqlModel = taskResultService.findModelByJobIdAndNodeIdAndRole(jobId, modelFlowNodeId, JobMemberRole.valueOf(role)); + if (null == taskResultMySqlModel) { + throw new StatusCodeWithException("鎵句笉鍒版ā鍨嬩俊鎭", StatusCode.DATA_NOT_FOUND); + } + JObject modelParam = JObject.create(taskResultMySqlModel.getResult()); + + if (ComponentType.HorzLR.equals(taskResultMySqlModel.getComponentType())) { + return logisticRegressionModelExportService.export(modelParam.getJObject("model_param"), language); + } + return xgboostModelExportService.export(modelParam.getJObject("model_param"), language); + + } catch (StatusCodeWithException e) { + LOG.error("Export model exception锛", e); + throw e; + } catch (Exception e) { + LOG.error("Export model exception锛", e); + throw new StatusCodeWithException("绯荤粺寮傚父: " + e.getMessage(), StatusCode.SYSTEM_ERROR); + } + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/Node.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/Node.java" new file mode 100644 index 0000000000000000000000000000000000000000..82fbc5f0baa12d31e4b654532dc03f96cb9e3b53 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/Node.java" @@ -0,0 +1,169 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * Node of tree + * + * @author aaron.li + **/ +public class Node { + + private String sitename; + private String id; + private String fid; + private String fidName; + private String bid; + private String weight; + private String leftNodeId; + private String rightNodeId; + private String missingDir; + private boolean leaf; + + private Node leftNode; + private Node rigthNode; + private Node parentNode; + + /** + * code + */ + private String code; + /** + * layer + */ + private int layer; + + public String getSitename() { + return sitename; + } + + public void setSitename(String sitename) { + this.sitename = sitename; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getFid() { + return fid; + } + + public void setFid(String fid) { + this.fid = fid; + } + + public String getBid() { + return bid; + } + + public void setBid(String bid) { + this.bid = bid; + } + + public String getWeight() { + return weight; + } + + public void setWeight(String weight) { + this.weight = weight; + } + + public String getLeftNodeId() { + return leftNodeId; + } + + public void setLeftNodeId(String leftNodeId) { + this.leftNodeId = leftNodeId; + } + + public String getRightNodeId() { + return rightNodeId; + } + + public void setRightNodeId(String rightNodeId) { + this.rightNodeId = rightNodeId; + } + + public String getMissingDir() { + return missingDir; + } + + public void setMissingDir(String missingDir) { + this.missingDir = missingDir; + } + + public boolean isLeaf() { + return leaf; + } + + public void setLeaf(boolean leaf) { + this.leaf = leaf; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public Node getLeftNode() { + return leftNode; + } + + public void setLeftNode(Node leftNode) { + this.leftNode = leftNode; + } + + public Node getRigthNode() { + return rigthNode; + } + + public void setRigthNode(Node rigthNode) { + this.rigthNode = rigthNode; + } + + public int getLayer() { + return layer; + } + + public void setLayer(int layer) { + this.layer = layer; + } + + public Node getParentNode() { + return parentNode; + } + + public void setParentNode(Node parentNode) { + this.parentNode = parentNode; + } + + public String getFidName() { + return fidName; + } + + public void setFidName(String fidName) { + this.fidName = fidName; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostCLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostCLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..f1f37a25d5976578f7b04402b144003d2891265c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostCLanguage.java" @@ -0,0 +1,107 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import java.util.List; + +/** + * C language + * + * @author aaron.li + **/ +public class XgboostCLanguage extends BaseXgboostLanguage { + + @Override + protected String preBuild2ClassificationsMethodSignNameCode(int treeNum, String initScore) { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("#include ") + .append("\n") + .append("#include ") + .append("\n") + .append("void score(double * input, double * output) {") + .append("\n") + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("}"); + + return preMethodCode.toString(); + } + + @Override + protected String build2ClassificationsResultLogicCode(int treeNum, String initScore) { + StringBuilder methodCalcCode = new StringBuilder(); + String summaryVar = "s1"; + methodCalcCode.append(indentationByNodeLayer(1, false)); + methodCalcCode.append(generateVarDef(summaryVar)) + .append("\n") + .append(indentationByNodeLayer(1, false)) + .append(summaryVar) + .append(" = 1 / (1 + exp(0 - (") + .append(generateTreeSum(treeNum, initScore)) + .append(")));") + .append("\n") + .append(build2ClassificationsReturnCode(summaryVar, initScore)); + + return methodCalcCode.toString(); + } + + + @Override + protected String build2ClassificationsReturnCode(String varName, String initScore) { + StringBuilder methodResultCode = new StringBuilder(); + methodResultCode.append(indentationByNodeLayer(1, false)) + .append("memcpy(output, (double[]){1 - " + varName + ", " + varName + "}, 2 * sizeof(double));"); + + return methodResultCode.toString(); + } + + @Override + protected String resultIndentationNum(int num) { + return super.resultIndentationNum(1); + } + + @Override + protected String buildExpFunction(List treeVarNameList, String initScore) { + StringBuilder code = new StringBuilder(); + code.append("exp(0 - (") + .append(generateTreeSum(treeVarNameList, initScore)) + .append("))"); + + return code.toString(); + } + + @Override + protected String buildMultipleClassificationsReturnCode(int classificationsNum) { + StringBuilder code = new StringBuilder(); + code.append(resultIndentationNum(2)) + .append("memcpy(output, (double[]){"); + code.append(generateCodeByClassificationsNum(classificationsNum)); + code.append("}, " + classificationsNum + " * sizeof(double));"); + return code.toString(); + } + + + @Override + protected String indentationByNodeLayer(Node node, boolean initIndentation) { + return super.indentationByNodeLayer(node, false); + } + + @Override + protected String indentationByNodeLayer(int layer, boolean initIndentation) { + return super.indentationByNodeLayer(layer, false); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostCSharpLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostCSharpLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..047f26d3996b4c8236f17c05c50f8c8c8fa5d20b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostCSharpLanguage.java" @@ -0,0 +1,104 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import java.util.List; + +/** + * C# + * + * @author aaron.li + **/ +public class XgboostCSharpLanguage extends BaseXgboostLanguage { + + @Override + protected String preBuild2ClassificationsMethodSignNameCode(int treeNum, String initScore) { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("using static System.Math;") + .append("\n") + .append("namespace ML {") + .append("\n") + .append(" public static class Model {") + .append("\n") + .append(" public static double[] Score(double[] input) {") + .append("\n") + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append(indentationNum(2) + "}") + .append("\n") + .append(indentationNum(1) + "}") + .append("\n") + .append("}"); + return preMethodCode.toString(); + } + + @Override + protected String build2ClassificationsResultLogicCode(int treeNum, String initScore) { + StringBuilder methodCalcCode = new StringBuilder(); + String summaryVar = "s1"; + methodCalcCode.append(indentationByNodeLayer(1, true)); + methodCalcCode.append(generateVarDef(summaryVar)) + .append("\n") + .append(indentationByNodeLayer(1, true)) + .append(summaryVar) + .append(" = 1 / (1 + Exp(0 - (") + .append(generateTreeSum(treeNum, initScore)) + .append(")));") + .append("\n") + .append(build2ClassificationsReturnCode(summaryVar, initScore)); + + return methodCalcCode.toString(); + } + + @Override + protected String build2ClassificationsReturnCode(String varName, String initScore) { + StringBuilder methodResultCode = new StringBuilder(); + methodResultCode.append(indentationByNodeLayer(1, true)) + .append("return new double[2] {1 - " + varName + ", " + varName + "}" + lineEndSymbol()); + + return methodResultCode.toString(); + } + + @Override + protected String buildExpFunction(List treeVarNameList, String initScore) { + StringBuilder code = new StringBuilder(); + code.append("Exp(0 - (") + .append(generateTreeSum(treeVarNameList, initScore)) + .append("))"); + + return code.toString(); + } + + @Override + protected String buildMultipleClassificationsReturnCode(int classificationsNum) { + StringBuilder code = new StringBuilder(); + code.append(resultIndentationNum(2)) + .append("return new double[" + classificationsNum + "] {"); + for (int i = 0; i < classificationsNum; i++) { + code.append(generateResultVarName(i)) + .append(" / (") + .append(generateTreeClassificationsResultSum(classificationsNum)) + .append(")"); + if (i < classificationsNum - 1) { + code.append(", "); + } + } + code.append("}").append(lineEndSymbol()); + return code.toString(); + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostDartLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostDartLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..3a13148aac5b6b572fff4a8cf66dc42b77c54b1a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostDartLanguage.java" @@ -0,0 +1,59 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * dart + * + * @author aaron.li + **/ +public class XgboostDartLanguage extends XgboostCLanguage { + + @Override + protected String preBuild2ClassificationsMethodSignNameCode(int treeNum, String initScore) { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("import 'dart:math';") + .append("\n") + .append("List score(List input) {") + .append("\n") + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append(" }"); + + return preMethodCode.toString(); + } + + @Override + protected String build2ClassificationsReturnCode(String varName, String initScore) { + StringBuilder methodResultCode = new StringBuilder(); + methodResultCode.append(indentationByNodeLayer(1, false)) + .append("return [1 - " + varName + ", " + varName + "];"); + + return methodResultCode.toString(); + } + + @Override + protected String buildMultipleClassificationsReturnCode(int classificationsNum) { + StringBuilder code = new StringBuilder(); + code.append(resultIndentationNum(2)) + .append("return ["); + code.append(generateCodeByClassificationsNum(classificationsNum)) + .append("]").append(lineEndSymbol()); + return code.toString(); + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostGoLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostGoLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..d614d59a559dac2b295c0da54e7dcd5e594ee535 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostGoLanguage.java" @@ -0,0 +1,115 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import java.util.List; + +/** + * Go + * + * @author aaron.li + **/ +public class XgboostGoLanguage extends BaseXgboostLanguage { + + @Override + protected String preBuild2ClassificationsMethodSignNameCode(int treeNum, String initScore) { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("import \"math\"") + .append("\n") + .append("func score(input []float64) []float64 {") + .append("\n") + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("}"); + return preMethodCode.toString(); + } + + @Override + protected String build2ClassificationsResultLogicCode(int treeNum, String initScore) { + StringBuilder methodCalcCode = new StringBuilder(); + String summaryVar = "s1"; + methodCalcCode.append(indentationByNodeLayer(1, false)); + methodCalcCode.append(generateVarDef(summaryVar)) + .append("\n") + .append(indentationByNodeLayer(1, false)) + .append(summaryVar) + .append(" = 1 / (1 + math.Exp(0 - (") + .append(generateTreeSum(treeNum, initScore)) + .append(")));") + .append("\n") + .append(build2ClassificationsReturnCode(summaryVar, initScore)); + + return methodCalcCode.toString(); + } + + @Override + protected String build2ClassificationsReturnCode(String varName, String initScore) { + StringBuilder methodResultCode = new StringBuilder(); + methodResultCode.append(indentationByNodeLayer(1, false)) + .append("return []float64{1 - " + varName + ", " + varName + "}"); + + return methodResultCode.toString(); + } + + @Override + protected String buildExpFunction(List treeVarNameList, String initScore) { + StringBuilder code = new StringBuilder(); + code.append("math.Exp(0 - (") + .append(generateTreeSum(treeVarNameList, initScore)) + .append("))"); + + return code.toString(); + } + + @Override + protected String buildMultipleClassificationsReturnCode(int classificationsNum) { + StringBuilder code = new StringBuilder(); + code.append(resultIndentationNum(2)) + .append("return []float64{"); + code.append(generateCodeByClassificationsNum(classificationsNum)); + code.append("}").append(lineEndSymbol()); + return code.toString(); + } + + + @Override + protected String resultIndentationNum(int num) { + return super.resultIndentationNum(1); + } + + + @Override + protected String indentationByNodeLayer(Node node, boolean initIndentation) { + return super.indentationByNodeLayer(node, false); + } + + @Override + protected String indentationByNodeLayer(int layer, boolean initIndentation) { + return super.indentationByNodeLayer(layer, false); + } + + @Override + protected String generateVarDef(String varName) { + return "var " + varName + " float64"; + } + + @Override + protected String lineEndSymbol() { + return ""; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostHaskellLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostHaskellLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..2962a07cdc084916b77eca8494308f7df150ea4b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostHaskellLanguage.java" @@ -0,0 +1,198 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import java.util.List; +import java.util.Map; + +/** + * Haskell + * + * @author aaron.li + **/ +public class XgboostHaskellLanguage extends BaseXgboostLanguage { + + @Override + protected String preBuild2ClassificationsMethodSignNameCode(int treeNum, String initScore) { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("module Model where") + .append("\n") + .append("score :: [Double] -> [Double]") + .append("\n") + .append("score input =") + .append("\n") + .append(INDENTATION_UNIT_CHAR + "[(1) - (s1), s1]") + .append("\n") + .append(" where") + .append("\n") + .append(METHOD_BODY_PLACEHOLDER); + return preMethodCode.toString(); + } + + @Override + protected String preBuildMultipleClassificationsMethodSignNameCode(int treeNum, int classificationsNum, String initScore) { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("module Model where") + .append("\n") + .append("score :: [Double] -> [Double]") + .append("\n") + .append("score input =") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append("["); + for (int i = 0; i < classificationsNum; i++) { + preMethodCode.append("r" + i); + if (i < classificationsNum - 1) { + preMethodCode.append(", "); + } + } + preMethodCode.append("]") + .append("\n") + .append(" where") + .append("\n") + .append(METHOD_BODY_PLACEHOLDER); + return preMethodCode.toString(); + } + + + @Override + protected String preGenerateNodeCode(Node node, int treeIndex) { + StringBuilder codeSb = new StringBuilder(); + Node parentNode = node.getParentNode(); + int baseLayer = (null != parentNode ? (node.getLayer() * 2) : node.getLayer() + 1); + codeSb.append(indentationByNodeLayer(baseLayer, true)); + if (node.isLeaf()) { + codeSb.append(node.getWeight()).append(lineEndSymbol()); + } else { + codeSb.append("if ((").append(generateCompareVarName(node.getFid())).append(") " + greaterThanSymbol() + " (").append(node.getBid()).append("))") + .append("\n") + .append(indentationByNodeLayer(baseLayer, true)) + .append(INDENTATION_UNIT_CHAR) + .append("then") + .append("\n") + .append(generateIdPlaceholder(node.getRightNodeId())) + .append("\n") + .append(indentationByNodeLayer(baseLayer, true)) + .append(INDENTATION_UNIT_CHAR) + .append("else") + .append("\n") + .append(generateIdPlaceholder(node.getLeftNodeId())); + } + + return codeSb.toString(); + + } + + @Override + protected String build2ClassificationsResultLogicCode(int treeNum, String initScore) { + StringBuilder methodCalcCode = new StringBuilder(); + String summaryVar = "s1"; + methodCalcCode.append(indentationByNodeLayer(1, true)); + methodCalcCode.append(generateVarDef(summaryVar)) + .append("\n") + .append(indentationByNodeLayer(2, true)) + .append("1 / (1 + exp(0 - (") + .append(generateTreeSum(treeNum, initScore)) + .append(")))") + .append(lineEndSymbol()) + .append("\n") + .append(build2ClassificationsReturnCode(summaryVar, initScore)); + + return methodCalcCode.toString(); + } + + + @Override + protected String buildMultipleClassificationsResultLogicCode(int treeNum, int treeDim, String initScore) { + StringBuilder methodCalcCode = new StringBuilder(); + // Tree result variable classification map (key: module; value: variable name of each tree) + Map> treeClassificationMap = treeMultipleClassificationsModMap(treeNum, treeDim); + + // Generate the variable quantity of classification and calculation logic + int index = 0; + for (Map.Entry> entry : treeClassificationMap.entrySet()) { + String rVarNameDef = generateVarDef(generateResultVarName(index)); + methodCalcCode.append(resultIndentationNum(2)) + .append(rVarNameDef) + .append("\n") + .append(resultIndentationNum(3)) + .append(" 1 / (1 + ") + .append(buildExpFunction(entry.getValue(), initScore)) + .append(")") + .append(lineEndSymbol()) + .append("\n"); + index++; + } + + // Generate and return the results of each classification + methodCalcCode.append(buildMultipleClassificationsReturnCode(treeClassificationMap.size())); + return methodCalcCode.toString(); + } + + @Override + protected String buildExpFunction(List treeVarNameList, String initScore) { + StringBuilder code = new StringBuilder(); + code.append("exp(0 - (") + .append(generateTreeSum(treeVarNameList, initScore)) + .append("))"); + + return code.toString(); + } + + @Override + protected String buildMultipleClassificationsReturnCode(int classificationsNum) { + StringBuilder code = new StringBuilder(); + for (int i = 0; i < classificationsNum; i++) { + code.append(resultIndentationNum(2)) + .append("r" + i + " = ") + .append("\n") + .append(resultIndentationNum(3)) + .append(generateResultVarName(i) + " / (" + generateTreeClassificationsResultSum(classificationsNum) + ")") + .append("\n"); + } + + + return code.toString(); + } + + + @Override + protected String build2ClassificationsReturnCode(String varName, String initScore) { + return ""; + } + + + @Override + protected String generateCompareVarName(String index) { + return "(input) !! (" + index + ")"; + } + + @Override + protected String generateVarName(int treeIndex) { + return "func" + treeIndex; + } + + @Override + protected String generateVarDef(String varName) { + return varName + " ="; + } + + @Override + protected String lineEndSymbol() { + return ""; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostJavaLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostJavaLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..c1644c9124264cb937d9f3878b1f2297b46d35b0 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostJavaLanguage.java" @@ -0,0 +1,27 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * java + * + * @author aaron.li + **/ +public class XgboostJavaLanguage extends BaseXgboostLanguage { + + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostJavaScriptLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostJavaScriptLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..1ee0efee0f7f0c9e72c9d1db54fb31c0f51ffcfe --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostJavaScriptLanguage.java" @@ -0,0 +1,77 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +/** + * JavaScript + * + * @author aaron.li + **/ +public class XgboostJavaScriptLanguage extends BaseXgboostLanguage { + + @Override + protected String preBuild2ClassificationsMethodSignNameCode(int treeNum, String initScore) { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("function score(input) {") + .append("\n") + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("}"); + return preMethodCode.toString(); + } + + @Override + protected String build2ClassificationsReturnCode(String varName, String initScore) { + StringBuilder methodResultCode = new StringBuilder(); + methodResultCode.append(indentationByNodeLayer(1, false)) + .append("return [1 - " + varName + ", " + varName + "]"); + + return methodResultCode.toString(); + } + + @Override + protected String buildMultipleClassificationsReturnCode(int classificationsNum) { + StringBuilder code = new StringBuilder(); + code.append(resultIndentationNum(1)) + .append("return ["); + code.append(generateCodeByClassificationsNum(classificationsNum)); + code.append("]").append(lineEndSymbol()); + return code.toString(); + } + + + @Override + protected String resultIndentationNum(int num) { + return super.resultIndentationNum(1); + } + + @Override + protected String indentationByNodeLayer(Node node, boolean initIndentation) { + return super.indentationByNodeLayer(node, false); + } + + @Override + protected String indentationByNodeLayer(int layer, boolean initIndentation) { + return super.indentationByNodeLayer(layer, false); + } + + + @Override + protected String generateVarDef(String varName) { + return "var " + varName + ";"; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostLanguageSelector.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostLanguageSelector.java" new file mode 100644 index 0000000000000000000000000000000000000000..80f0692ebb86f441fd30d51d6a4283799d65c851 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostLanguageSelector.java" @@ -0,0 +1,58 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import com.welab.wefe.common.enums.ModelExportLanguage; + +import java.util.HashMap; +import java.util.Map; + +/** + * Xgboost language selector + * + * @author aaron.li + **/ +public class XgboostLanguageSelector { + private final String language; + private static final Map LANGUAGE_MAP = new HashMap<>(16); + + static { + LANGUAGE_MAP.put(ModelExportLanguage.c.name(), new XgboostCLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.cSharp.name(), new XgboostCSharpLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.dart.name(), new XgboostDartLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.go.name(), new XgboostGoLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.haskell.name(), new XgboostHaskellLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.java.name(), new XgboostJavaLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.javaScript.name(), new XgboostJavaScriptLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.php.name(), new XgboostPhpLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.powerShell.name(), new XgboostPowerShellLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.python.name(), new XgboostPythonLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.r.name(), new XgboostRLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.ruby.name(), new XgboostRubyLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.visualBasic.name(), new XgboostVisualBasicLanguage()); + LANGUAGE_MAP.put(ModelExportLanguage.pmml.name(), new XgboostPmmlLanguage()); + + } + + public XgboostLanguageSelector(String language) { + this.language = language; + } + + public BaseXgboostLanguage getSelector() { + return LANGUAGE_MAP.get(language); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostModelExportService.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostModelExportService.java" new file mode 100644 index 0000000000000000000000000000000000000000..27ff7a71223fede9f4224d43f0b61785afaf54b7 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostModelExportService.java" @@ -0,0 +1,156 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import com.alibaba.fastjson.JSONArray; +import com.welab.wefe.common.util.JObject; +import com.welab.wefe.common.util.StringUtil; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * XGBoots model export service + * + * @author aaron.li + **/ +@Service +public class XgboostModelExportService { + + /** + * export model + * + * @param modelParam model param + * @param language language + */ + public String export(JObject modelParam, String language) { + // Get the corresponding language interpreter + BaseXgboostLanguage baseXgboostLanguage = getXgboostLanguage(language); + + // feature name mapping + JObject featureNameFidMappingObj = modelParam.getJObject("featureNameFidMapping"); + // Tree data preprocessing list + List> treeMapList = treesPreHandle(modelParam.getJSONArray("trees"), featureNameFidMappingObj); + int treeDim = modelParam.getInteger("treeDim"); + int numClasses = modelParam.getInteger("numClasses"); + // Initialization score + JSONArray initScoreArray = modelParam.getJSONArray("initScore"); + String initScore = (null != initScoreArray && initScoreArray.size() > 0) ? initScoreArray.getString(0) : "0"; + + return baseXgboostLanguage.buildWholeCode(treeMapList, treeDim, numClasses, initScore, featureNameFidMappingObj); + } + + + /** + * Tree list preprocessing + * + * @param trees List of all trees + * @parm featureNameFidMappingObj Parameter name mapping + * @return List of all trees; Map structure description: key: node ID, value: node information + */ + private List> treesPreHandle(JSONArray trees, JObject featureNameFidMappingObj) { + List> treeMapList = new ArrayList<>(); + for (int i = 0; i < trees.size(); i++) { + JSONArray tree = trees.getJSONObject(i).getJSONArray("tree"); + Map treeMap = new HashMap<>(16); + Node node = null; + for (int index = 0; index < tree.size(); index++) { + node = new Node(); + JObject obj = JObject.create(tree.getJSONObject(index)); + String id = obj.getString("id"); + node.setId(StringUtil.isEmpty(id) ? "0" : id); + node.setSitename(obj.getString("sitename")); + node.setFid(obj.getString("fid")); + node.setFidName(featureNameFidMappingObj.getString(node.getFid())); + node.setBid(obj.getString("bid")); + node.setWeight(obj.getString("weight")); + node.setLeftNodeId(obj.getString("leftNodeid")); + node.setRightNodeId(obj.getString("rightNodeid")); + node.setMissingDir(obj.getString("missingDir")); + node.setLeaf(obj.getBooleanValue("isLeaf")); + + treeMap.put(node.getId(), node); + } + // Set the height of each node of the tree + setTreeLayer(treeMap); + treeMapList.add(treeMap); + } + + return treeMapList; + } + + /** + * Set the height of the node name tree (the root node is 1) + */ + private Node setTreeLayer(Map treeMap) { + // get root node + Node root = treeMap.get("0"); + root.setLayer(1); + List list = new ArrayList<>(); + list.add(root); + + Node node = null; + while ((node = getNonLeaf(list)) != null) { + // Non leaf node + Node leftNode = treeMap.get(node.getLeftNodeId()); + Node rightNode = treeMap.get(node.getRightNodeId()); + + leftNode.setLayer(node.getLayer() + 1); + rightNode.setLayer(node.getLayer() + 1); + + node.setLeftNode(leftNode); + node.setRigthNode(rightNode); + + leftNode.setParentNode(node); + rightNode.setParentNode(node); + + list.add(leftNode); + list.add(rightNode); + } + + return root; + } + + /** + * Get non leaf node + */ + private Node getNonLeaf(List nodeList) { + for (Node node : nodeList) { + if (null != node && !node.isLeaf()) { + Node leftNode = node.getLeftNode(); + Node rightNode = node.getRigthNode(); + + if (null == leftNode && null == rightNode) { + return node; + } + + } + } + return null; + } + + + /** + * Get the corresponding language interpreter + */ + private BaseXgboostLanguage getXgboostLanguage(String language) { + return new XgboostLanguageSelector(language).getSelector(); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostPhpLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostPhpLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..7739450e9f41cd7e6070655b01e9499f8695287e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostPhpLanguage.java" @@ -0,0 +1,129 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import java.util.List; + +/** + * PHP + * + * @author aaron.li + **/ +public class XgboostPhpLanguage extends BaseXgboostLanguage { + + @Override + protected String preBuild2ClassificationsMethodSignNameCode(int treeNum, String initScore) { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append(" treeVarNameList, String initScore) { + StringBuilder code = new StringBuilder(); + code.append("exp(0 - (") + .append(generateTreeSum(treeVarNameList, initScore)) + .append("))"); + + return code.toString(); + } + + @Override + protected String buildMultipleClassificationsReturnCode(int classificationsNum) { + StringBuilder code = new StringBuilder(); + code.append(resultIndentationNum(2)) + .append("return array("); + code.append(generateCodeByClassificationsNum(classificationsNum)); + code.append(")").append(lineEndSymbol()); + return code.toString(); + } + + + @Override + protected String resultIndentationNum(int num) { + return super.resultIndentationNum(1); + } + + + @Override + protected String indentationByNodeLayer(Node node, boolean initIndentation) { + return super.indentationByNodeLayer(node, false); + } + + @Override + protected String indentationByNodeLayer(int layer, boolean initIndentation) { + return super.indentationByNodeLayer(layer, false); + } + + + @Override + protected String generateVarDef(String varName) { + return varName + " = null;"; + } + + @Override + protected String generateCompareVarName(String index) { + return "$input[" + index + "]"; + } + + @Override + protected String generateVarName(int treeIndex) { + return "$var" + treeIndex; + } + + @Override + protected String generateResultVarName(int treeIndex) { + return "$s" + treeIndex; + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostPmmlLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostPmmlLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..5c06e1a4f3c777a5e74c353570d9d8e4be769a06 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostPmmlLanguage.java" @@ -0,0 +1,429 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import com.welab.wefe.common.util.JObject; +import org.dmg.pmml.*; +import org.dmg.pmml.mining.MiningModel; +import org.dmg.pmml.mining.Segment; +import org.dmg.pmml.mining.Segmentation; +import org.dmg.pmml.regression.NumericPredictor; +import org.dmg.pmml.regression.RegressionModel; +import org.dmg.pmml.regression.RegressionTable; +import org.dmg.pmml.tree.TreeModel; +import org.jpmml.model.PMMLUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.ByteArrayOutputStream; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * PMML + *

+ * TODO At present, it only supports the export of secondary classification, and multi classification has not been implemented + * + * @author aaron.li + **/ +public class XgboostPmmlLanguage extends BaseXgboostLanguage { + protected final Logger LOG = LoggerFactory.getLogger(this.getClass()); + + @Override + public String buildWholeCode(List> treeMapList, int treeDim, int numClasses, String initScore, JObject featureNameFidMappingObj) { + PMML pmml = new PMML(); + pmml.setVersion("4.3"); + pmml.setHeader(buildHeader()); + pmml.setMiningBuildTask(buildMiningBuildTask()); + pmml.setDataDictionary(buildDataDictionary(featureNameFidMappingObj)); + pmml.addModels(buildTopMiningModel(treeMapList, featureNameFidMappingObj, initScore)); + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + PMMLUtil.marshal(pmml, outputStream); + return outputStream.toString(); + } catch (Exception e) { + LOG.error("Model export xgboost generates PMML language exception锛", e); + } + return ""; + } + + + /** + * Build header node + */ + private Header buildHeader() { + Header header = new Header(); + header.setApplication(new Application("Xgboost Regression Model") + .setVersion("1.0")) + .setTimestamp(new Timestamp()); + return header; + } + + + /** + * Build mining task node + */ + private MiningBuildTask buildMiningBuildTask() { + MiningBuildTask miningBuildTask = new MiningBuildTask(); + + return miningBuildTask; + } + + + /** + * Build in reference dictionary + */ + private DataDictionary buildDataDictionary(JObject featureNameFidMappingObj) { + DataDictionary dataDictionary = new DataDictionary(); + dataDictionary.addDataFields(new DataField() + .setName(new FieldName("flag")) + .setOpType(OpType.CATEGORICAL) + .setDataType(DataType.INTEGER) + .addValues(new Value("0"), new Value("1"))); + + for (Map.Entry entity : featureNameFidMappingObj.getInnerMap().entrySet()) { + String value = String.valueOf(entity.getValue()); + dataDictionary.addDataFields(new DataField() + .setName(new FieldName(value)) + .setOpType(OpType.CONTINUOUS) + .setDataType(DataType.DOUBLE)); + } + + return dataDictionary; + } + + + /** + * Build the top-level mining model + */ + private MiningModel buildTopMiningModel(List> treeMapList, JObject featureNameFidMappingObj, String initScore) { + MiningModel miningModel = new MiningModel(); + miningModel.setMiningFunction(MiningFunction.CLASSIFICATION) + .setAlgorithmName("XGBoost (GBTree)") + .setMathContext(MathContext.DOUBLE); + + MiningSchema miningSchema = new MiningSchema(); + miningSchema.addMiningFields(new MiningField() + .setName(new FieldName("flag")) + .setUsageType(MiningField.UsageType.TARGET)); + for (Map.Entry entity : featureNameFidMappingObj.getInnerMap().entrySet()) { + miningSchema.addMiningFields(new MiningField() + .setName(new FieldName(String.valueOf(entity.getValue())))); + } + + miningModel.setMiningSchema(miningSchema) + .setSegmentation(buildTopSegmentation(treeMapList, featureNameFidMappingObj, initScore)); + + return miningModel; + } + + + /** + * Build the top-level segment structure + * + * @param treeMapList All tree information + * @param featureNameFidMappingObj feature name fid mapping + */ + private Segmentation buildTopSegmentation(List> treeMapList, JObject featureNameFidMappingObj, String initScore) { + Segmentation segmentation = new Segmentation(); + segmentation.setMultipleModelMethod(Segmentation.MultipleModelMethod.MODEL_CHAIN) + .addSegments(buildTreeLogicSegment(treeMapList, featureNameFidMappingObj, initScore)) + .addSegments(buildClassificationSegmen()); + + return segmentation; + } + + + /** + * Construct tree logical segment structure + * + * @param treeMapList All tree information + * @param featureNameFidMappingObj feature name fid mapping + */ + private Segment buildTreeLogicSegment(List> treeMapList, JObject featureNameFidMappingObj, String initScore) { + Segment segment = new Segment(); + segment.setId("1") + .setPredicate(new True()) + .setModel(buildMiningModel(treeMapList, featureNameFidMappingObj, initScore)); + return segment; + } + + + /** + * Construction of classification segment structure + */ + private Segment buildClassificationSegmen() { + Segment segment = new Segment(); + segment.setPredicate(new True()) + .setId("2"); + + RegressionModel regressionModel = new RegressionModel(); + regressionModel.setMiningFunction(MiningFunction.CLASSIFICATION) + .setNormalizationMethod(RegressionModel.NormalizationMethod.LOGIT) + .setMathContext(MathContext.DOUBLE); + + MiningSchema miningSchema = new MiningSchema() + .addMiningFields(new MiningField() + .setName(new FieldName("flag")) + .setUsageType(MiningField.UsageType.TARGET)) + .addMiningFields(new MiningField() + .setName(new FieldName("xgbValue"))); + + regressionModel.setMiningSchema(miningSchema); + + Output output = new Output() + .addOutputFields(new OutputField() + .setName(new FieldName("probability(0)")) + .setOpType(OpType.CONTINUOUS) + .setDataType(DataType.DOUBLE) + .setResultFeature(ResultFeature.PROBABILITY) + .setValue("0")) + .addOutputFields(new OutputField() + .setName(new FieldName("probability(1)")) + .setOpType(OpType.CONTINUOUS) + .setDataType(DataType.DOUBLE) + .setResultFeature(ResultFeature.PROBABILITY) + .setValue("1")); + + regressionModel.setOutput(output); + + RegressionTable regressionTable = new RegressionTable() + .setIntercept(0) + .setTargetCategory("1") + .addNumericPredictors(new NumericPredictor() + .setName(new FieldName("xgbValue")) + .setCoefficient(1.0)); + + + regressionModel.addRegressionTables(regressionTable) + .addRegressionTables(new RegressionTable() + .setIntercept(0) + .setTargetCategory("0")); + + segment.setModel(regressionModel); + return segment; + } + + + /** + * Build mining model + * + * @param treeMapList All tree information + * @param featureNameFidMappingObj feature name fid mapping + */ + private MiningModel buildMiningModel(List> treeMapList, JObject featureNameFidMappingObj, String initScore) { + MiningModel miningModel = new MiningModel(); + miningModel.setMiningFunction(MiningFunction.REGRESSION) + .setMathContext(MathContext.DOUBLE) + .setMiningSchema(buildMiningSchema(featureNameFidMappingObj)) + .setOutput(buildOutput()) + .setLocalTransformations(buildLocalTransformations(featureNameFidMappingObj)) + .setSegmentation(buildSegmentation(treeMapList, initScore)); + + return miningModel; + } + + + /** + * Build mining parameters + * + * @param featureNameFidMappingObj feature name fid mapping + */ + private MiningSchema buildMiningSchema(JObject featureNameFidMappingObj) { + MiningSchema miningSchema = new MiningSchema(); + Map featureNameFidMapping = featureNameFidMappingObj.getInnerMap(); + MiningField miningField = null; + for (Map.Entry entity : featureNameFidMapping.entrySet()) { + miningField = new MiningField() + .setName(new FieldName(String.valueOf(entity.getValue()))); + + miningSchema.addMiningFields(miningField); + } + return miningSchema; + } + + /** + * Output of the build tree + */ + private Output buildOutput() { + Output output = new Output(); + output.addOutputFields(new OutputField().setName(new FieldName("xgbValue")) + .setOpType(OpType.CONTINUOUS) + .setDataType(DataType.DOUBLE) + .setFinalResult(false)); + + return output; + } + + + /** + * Build local variable transformation node information + * + * @param featureNameFidMappingObj feature name fid mapping + */ + private LocalTransformations buildLocalTransformations(JObject featureNameFidMappingObj) { + LocalTransformations localTransformations = new LocalTransformations(); + Map featureNameFidMapping = featureNameFidMappingObj.getInnerMap(); + DerivedField derivedField = null; + for (Map.Entry entity : featureNameFidMapping.entrySet()) { + String value = String.valueOf(entity.getValue()); + derivedField = new DerivedField(); + derivedField.setName(new FieldName("double(" + value + ")")) + .setOpType(OpType.CONTINUOUS) + .setDataType(DataType.DOUBLE) + .setExpression(new FieldRef().setField(new FieldName(value))); + + localTransformations.addDerivedFields(derivedField); + } + return localTransformations; + } + + + /** + * Build segmentation node information + * + * @param treeMapList All tree information + */ + private Segmentation buildSegmentation(List> treeMapList, String initScore) { + Segmentation segmentation = new Segmentation(); + segmentation.setMultipleModelMethod(Segmentation.MultipleModelMethod.SUM); + segmentation.addSegments(buildInitScoreSegment(initScore)); + for (int i = 0; i < treeMapList.size(); i++) { + segmentation.addSegments(buildTreeSegment(treeMapList.get(i), i + 1)); + } + return segmentation; + } + + + /** + * Build the segment node of the tree + * + * @param treeMap All node information of the tree + * @param treeIndex tree index + */ + private Segment buildTreeSegment(Map treeMap, int treeIndex) { + Segment segment = new Segment(); + segment.setPredicate(new True()) + .setId(treeIndex + "") + .setModel(buildTreeModel(treeMap)); + + return segment; + } + + /** + * Build the segment node of the initial score + * + * @param initScore init score + */ + private Segment buildInitScoreSegment(String initScore) { + Segment segment = new Segment(); + segment.setPredicate(new True()) + .setId("0") + .setModel(new TreeModel() + .setMiningFunction(MiningFunction.REGRESSION) + .setNoTrueChildStrategy(TreeModel.NoTrueChildStrategy.RETURN_LAST_PREDICTION) + .setMathContext(MathContext.DOUBLE) + .setMiningSchema(new MiningSchema()) + .setNode(new org.dmg.pmml.tree.Node() + .setPredicate(new True()) + .setScore(initScore))); + return segment; + } + + + /** + * PMML structure of treemodel of spanning tree + * + * @param treeMap All node information of the tree + */ + private TreeModel buildTreeModel(Map treeMap) { + // root node + Node root = treeMap.get("0"); + org.dmg.pmml.tree.Node rootPmmlNode = new org.dmg.pmml.tree.Node(); + rootPmmlNode.setScore("0.0"); + rootPmmlNode.setPredicate(new True()); + buildNode(root, rootPmmlNode); + + TreeModel treeModel = new TreeModel(); + treeModel.setMiningFunction(MiningFunction.REGRESSION) + .setNoTrueChildStrategy(TreeModel.NoTrueChildStrategy.RETURN_LAST_PREDICTION) + .setMathContext(MathContext.DOUBLE) + .setMiningSchema(buildTreeModelMiningSchema(treeMap)) + .setNode(rootPmmlNode); + + return treeModel; + } + + + private MiningSchema buildTreeModelMiningSchema(Map treeMap) { + MiningSchema miningSchema = new MiningSchema(); + Set fidNameSet = new HashSet<>(16); + for (Map.Entry entry : treeMap.entrySet()) { + Node node = entry.getValue(); + if (!node.isLeaf()) { + fidNameSet.add(node.getFidName()); + } + } + for (String fidName : fidNameSet) { + MiningField miningField = new MiningField(); + miningField.setName(new FieldName("double(" + fidName + ")")); + miningSchema.addMiningFields(miningField); + } + + return miningSchema; + } + + + /** + * XML of node structure of spanning tree + */ + private void buildNode(Node treeNode, org.dmg.pmml.tree.Node parentPmmlNode) { + // Leaf node + if (treeNode.isLeaf()) { + org.dmg.pmml.tree.Node pmmlNode = new org.dmg.pmml.tree.Node(); + pmmlNode.setScore(treeNode.getWeight()); + pmmlNode.setPredicate(new True()); + parentPmmlNode.addNodes(pmmlNode); + } else { + // Generate left node + org.dmg.pmml.tree.Node leftPmmlNode = new org.dmg.pmml.tree.Node(); + leftPmmlNode.setScore(treeNode.getWeight()); + leftPmmlNode.setPredicate(new SimplePredicate().setField(new FieldName("double(" + treeNode.getFidName() + ")")).setOperator(SimplePredicate.Operator.LESS_OR_EQUAL).setValue(treeNode.getBid())); + parentPmmlNode.addNodes(leftPmmlNode); + + // Generate right node + org.dmg.pmml.tree.Node rightPmmlNode = new org.dmg.pmml.tree.Node(); + rightPmmlNode.setScore(treeNode.getWeight()); + rightPmmlNode.setPredicate(new SimplePredicate().setField(new FieldName("double(" + treeNode.getFidName() + ")")).setOperator(SimplePredicate.Operator.GREATER_THAN).setValue(treeNode.getBid())); + parentPmmlNode.addNodes(rightPmmlNode); + + + // Regenerate the XML of tree child nodes + Node leftTreeNode = treeNode.getLeftNode(); + Node rightTreeNode = treeNode.getRigthNode(); + + if (null != leftTreeNode) { + buildNode(leftTreeNode, leftPmmlNode); + } + if (null != rightTreeNode) { + buildNode(rightTreeNode, rightPmmlNode); + } + } + } + +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostPowerShellLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostPowerShellLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..8eefaeb3d3dbc272ef66057ac9acf90f1ab84c89 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostPowerShellLanguage.java" @@ -0,0 +1,144 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import java.util.List; + +/** + * PowerShell + * + * @author aaron.li + **/ +public class XgboostPowerShellLanguage extends BaseXgboostLanguage { + + @Override + protected String preBuild2ClassificationsMethodSignNameCode(int treeNum, String initScore) { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("function Score([double[]] $InputVector) {") + .append("\n") + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("}"); + return preMethodCode.toString(); + } + + @Override + protected String build2ClassificationsResultLogicCode(int treeNum, String initScore) { + StringBuilder methodCalcCode = new StringBuilder(); + String summaryVar = "s1"; + methodCalcCode.append(indentationByNodeLayer(1, false)); + methodCalcCode.append(generateVarDef("$" + summaryVar)) + .append("\n") + .append(indentationByNodeLayer(1, false)) + .append("$") + .append(summaryVar) + .append(" = 1 / (1 + [math]::Exp(0 - (") + .append(generateTreeSum(treeNum, initScore)) + .append(")))") + .append(lineEndSymbol()) + .append("\n") + .append(build2ClassificationsReturnCode(summaryVar, initScore)); + + return methodCalcCode.toString(); + } + + @Override + protected String build2ClassificationsReturnCode(String varName, String initScore) { + StringBuilder methodResultCode = new StringBuilder(); + methodResultCode.append(indentationByNodeLayer(1, false)) + .append("return @($((1) - ($" + varName + ")), $($" + varName + "))" + lineEndSymbol()); + + return methodResultCode.toString(); + } + + + @Override + protected String buildExpFunction(List treeVarNameList, String initScore) { + StringBuilder code = new StringBuilder(); + code.append("[math]::Exp(0 - (") + .append(generateTreeSum(treeVarNameList, initScore)) + .append("))"); + + return code.toString(); + } + + @Override + protected String buildMultipleClassificationsReturnCode(int classificationsNum) { + StringBuilder code = new StringBuilder(); + code.append(resultIndentationNum(2)) + .append("return @("); + for (int i = 0; i < classificationsNum; i++) { + code.append("$("); + code.append(generateResultVarName(i)) + .append(" / (") + .append(generateTreeClassificationsResultSum(classificationsNum)) + .append("))"); + if (i < classificationsNum - 1) { + code.append(", "); + } + } + code.append(")").append(lineEndSymbol()); + return code.toString(); + } + + + @Override + protected String indentationByNodeLayer(Node node, boolean initIndentation) { + return super.indentationByNodeLayer(node, false); + } + + @Override + protected String indentationByNodeLayer(int layer, boolean initIndentation) { + return super.indentationByNodeLayer(layer, false); + } + + + @Override + protected String generateVarDef(String varName) { + return "[double]" + varName + " = 0"; + } + + @Override + protected String generateCompareVarName(String index) { + return "$InputVector[" + index + "]"; + } + + @Override + protected String greaterThanSymbol() { + return "-gt"; + } + + @Override + protected String lineEndSymbol() { + return ""; + } + + @Override + protected String generateVarName(int treeIndex) { + return "$var" + treeIndex; + } + + @Override + protected String generateResultVarName(int treeIndex) { + return "$s" + treeIndex; + } + + @Override + protected String resultIndentationNum(int num) { + return super.resultIndentationNum(1); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostPythonLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostPythonLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..03cb9ebe72e82db2211b16db1f18963e871c3c41 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostPythonLanguage.java" @@ -0,0 +1,134 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import java.util.List; + +/** + * Python + * + * @author aaron.li + **/ +public class XgboostPythonLanguage extends BaseXgboostLanguage { + + @Override + protected String preBuild2ClassificationsMethodSignNameCode(int treeNum, String initScore) { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("import math") + .append("\n") + .append("def score(input):") + .append("\n") + .append(METHOD_BODY_PLACEHOLDER) + .append("\n"); + return preMethodCode.toString(); + } + + @Override + protected String preGenerateNodeCode(Node node, int treeIndex) { + StringBuilder codeSb = new StringBuilder(); + codeSb.append(indentationByNodeLayer(node, false)); + if (node.isLeaf()) { + codeSb.append(generateVarName(treeIndex)).append(" = ").append(node.getWeight()); + } else { + codeSb.append("if (").append(generateCompareVarName(node.getFid())).append(") " + greaterThanSymbol() + " (").append(node.getBid()).append("):") + .append("\n") + .append(generateIdPlaceholder(node.getRightNodeId())) + .append("\n") + .append(indentationByNodeLayer(node, false)) + .append("else:") + .append("\n") + .append(generateIdPlaceholder(node.getLeftNodeId())); + + } + return codeSb.toString(); + } + + @Override + protected String build2ClassificationsResultLogicCode(int treeNum, String initScore) { + StringBuilder methodCalcCode = new StringBuilder(); + String summaryVar = "s1"; + methodCalcCode.append(indentationByNodeLayer(1, false)); + methodCalcCode.append(generateVarDef(summaryVar)) + .append("\n") + .append(indentationByNodeLayer(1, false)) + .append(summaryVar) + .append(" = 1 / (1 + math.exp(0 - (") + .append(generateTreeSum(treeNum, initScore)) + .append(")))") + .append(lineEndSymbol()) + .append("\n") + .append(build2ClassificationsReturnCode(summaryVar, initScore)); + + return methodCalcCode.toString(); + } + + @Override + protected String build2ClassificationsReturnCode(String varName, String initScore) { + StringBuilder methodResultCode = new StringBuilder(); + methodResultCode.append(indentationByNodeLayer(1, false)) + .append("return [(1) - (" + varName + "), " + varName + "]" + lineEndSymbol()); + + return methodResultCode.toString(); + } + + @Override + protected String buildExpFunction(List treeVarNameList, String initScore) { + StringBuilder code = new StringBuilder(); + code.append("math.exp(0 - (") + .append(generateTreeSum(treeVarNameList, initScore)) + .append("))"); + + return code.toString(); + } + + @Override + protected String buildMultipleClassificationsReturnCode(int classificationsNum) { + StringBuilder code = new StringBuilder(); + code.append(resultIndentationNum(2)) + .append("return ["); + code.append(generateCodeByClassificationsNum(classificationsNum)); + code.append("]").append(lineEndSymbol()); + return code.toString(); + } + + + @Override + protected String indentationByNodeLayer(Node node, boolean initIndentation) { + return super.indentationByNodeLayer(node, false); + } + + @Override + protected String indentationByNodeLayer(int layer, boolean initIndentation) { + return super.indentationByNodeLayer(layer, false); + } + + @Override + protected String generateVarDef(String varName) { + return varName + " = 0.0"; + } + + @Override + protected String lineEndSymbol() { + return ""; + } + + @Override + protected String resultIndentationNum(int num) { + return super.resultIndentationNum(1); + } +} + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostRLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostRLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..37f5f99337f64aa567337aa1002e663120dde311 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostRLanguage.java" @@ -0,0 +1,179 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import java.util.List; +import java.util.Map; + +/** + * R + * + * @author aaron.li + **/ +public class XgboostRLanguage extends BaseXgboostLanguage { + + @Override + protected String preBuild2ClassificationsMethodSignNameCode(int treeNum, String initScore) { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("score <- function(input) {") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append("s1 <- (1) / ((1) + (exp((0) - (subroutine(input)))))") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append("return(c((1) - (s1), s1))") + .append("\n") + .append("}") + .append("\n") + .append("subroutine <- function(input) {") + .append("\n") + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("}"); + return preMethodCode.toString(); + } + + @Override + protected String preBuildMultipleClassificationsMethodSignNameCode(int treeNum, int classificationsNum, String initScore) { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("score <- function(input) {") + .append("\n") + .append(INDENTATION_UNIT_CHAR) + .append("return(subroutine(input))") + .append("\n") + .append("}") + .append("\n") + .append("subroutine <- function(input) {") + .append("\n") + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("}"); + return preMethodCode.toString(); + } + + + @Override + protected String preGenerateNodeCode(Node node, int treeIndex) { + StringBuilder codeSb = new StringBuilder(); + codeSb.append(indentationByNodeLayer(node, false)); + if (node.isLeaf()) { + codeSb.append(generateVarName(treeIndex)).append(" <- ").append(node.getWeight()).append(lineEndSymbol()); + } else { + codeSb.append("if ((").append(generateCompareVarName(node.getFid())).append(") " + greaterThanSymbol() + " (").append(node.getBid()).append(")) {") + .append("\n") + .append(generateIdPlaceholder(node.getRightNodeId())) + .append("\n") + .append(indentationByNodeLayer(node, false)) + .append(" } else {") + .append("\n") + .append(generateIdPlaceholder(node.getLeftNodeId())) + .append("\n") + .append(indentationByNodeLayer(node, false)) + .append("}"); + } + + return codeSb.toString(); + + } + + @Override + protected String build2ClassificationsResultLogicCode(int treeNum, String initScore) { + StringBuilder methodCalcCode = new StringBuilder(); + methodCalcCode.append(INDENTATION_UNIT_CHAR) + .append("return(") + .append(generateTreeSum(treeNum, initScore)) + .append(")") + .append(lineEndSymbol()); + + return methodCalcCode.toString(); + } + + @Override + protected String buildMultipleClassificationsResultLogicCode(int treeNum, int treeDim, String initScore) { + StringBuilder methodCalcCode = new StringBuilder(); + Map> treeClassificationMap = treeMultipleClassificationsModMap(treeNum, treeDim); + + // Generate the variable quantity of classification and calculation logic + int index = 0; + for (Map.Entry> entry : treeClassificationMap.entrySet()) { + String rVarName = generateResultVarName(index); + String rVarNameDef = generateVarDef(generateResultVarName(index)); + methodCalcCode.append(resultIndentationNum(2)) + .append(rVarNameDef) + .append("\n") + .append(resultIndentationNum(2)) + .append(rVarName) + .append(" <- 1 / (1 + ") + .append(buildExpFunction(entry.getValue(), initScore)) + .append(")") + .append(lineEndSymbol()) + .append("\n"); + index++; + } + + methodCalcCode.append(buildMultipleClassificationsReturnCode(treeClassificationMap.size())); + return methodCalcCode.toString(); + } + + @Override + protected String buildExpFunction(List treeVarNameList, String initScore) { + StringBuilder code = new StringBuilder(); + code.append("exp(0 - (") + .append(generateTreeSum(treeVarNameList, initScore)) + .append("))"); + + return code.toString(); + } + + @Override + protected String buildMultipleClassificationsReturnCode(int classificationsNum) { + StringBuilder code = new StringBuilder(); + code.append(resultIndentationNum(2)) + .append("return c("); + code.append(generateCodeByClassificationsNum(classificationsNum)); + code.append(")").append(lineEndSymbol()); + return code.toString(); + } + + + @Override + protected String indentationByNodeLayer(Node node, boolean initIndentation) { + return super.indentationByNodeLayer(node, false); + } + + @Override + protected String indentationByNodeLayer(int layer, boolean initIndentation) { + return super.indentationByNodeLayer(layer, false); + } + + + @Override + protected String generateVarDef(String varName) { + return varName + " <- 0.0" + lineEndSymbol(); + } + + + @Override + protected String lineEndSymbol() { + return ""; + } + + @Override + protected String resultIndentationNum(int num) { + return super.resultIndentationNum(1); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostRubyLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostRubyLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..36710654698b0e6e9af679c327f98e061c8c101d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostRubyLanguage.java" @@ -0,0 +1,149 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import java.util.List; +import java.util.Map; + +/** + * Ruby + * + * @author aaron.li + **/ +public class XgboostRubyLanguage extends XgboostPythonLanguage { + + @Override + protected String preBuild2ClassificationsMethodSignNameCode(int treeNum, String initScore) { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("def score(input)") + .append("\n") + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("end"); + return preMethodCode.toString(); + } + + + @Override + protected String preGenerateNodeCode(Node node, int treeIndex) { + StringBuilder codeSb = new StringBuilder(); + codeSb.append(indentationByNodeLayer(node, false)); + if (node.isLeaf()) { + codeSb.append(generateVarName(treeIndex)).append(" = ").append(node.getWeight()); + } else { + codeSb.append("if (").append(generateCompareVarName(node.getFid())).append(") " + greaterThanSymbol() + " (").append(node.getBid()).append(")") + .append("\n") + .append(generateIdPlaceholder(node.getRightNodeId())) + .append("\n") + .append(indentationByNodeLayer(node, false)) + .append("else") + .append("\n") + .append(generateIdPlaceholder(node.getLeftNodeId())) + .append("\n") + .append(indentationByNodeLayer(node, false)) + .append("end"); + + } + return codeSb.toString(); + } + + @Override + protected String build2ClassificationsResultLogicCode(int treeNum, String initScore) { + StringBuilder methodCalcCode = new StringBuilder(); + String summaryVar = "s1"; + methodCalcCode.append(indentationByNodeLayer(1, false)); + methodCalcCode.append(generateVarDef(summaryVar)) + .append("\n") + .append(indentationByNodeLayer(1, false)) + .append(summaryVar) + .append(" = 1.fdiv(1 + Math.exp(0 - (") + .append(generateTreeSum(treeNum, initScore)) + .append(")))") + .append(lineEndSymbol()) + .append("\n") + .append(build2ClassificationsReturnCode(summaryVar, initScore)); + + return methodCalcCode.toString(); + } + + + @Override + protected String build2ClassificationsReturnCode(String varName, String initScore) { + StringBuilder methodResultCode = new StringBuilder(); + methodResultCode.append(indentationByNodeLayer(1, false)) + .append("[(1) - (" + varName + "), " + varName + "]" + lineEndSymbol()); + + return methodResultCode.toString(); + } + + + @Override + protected String buildMultipleClassificationsResultLogicCode(int treeNum, int treeDim, String initScore) { + StringBuilder methodCalcCode = new StringBuilder(); + Map> treeClassificationMap = treeMultipleClassificationsModMap(treeNum, treeDim); + + // Generate the variable quantity of classification and calculation logic + int index = 0; + for (Map.Entry> entry : treeClassificationMap.entrySet()) { + String rVarName = generateResultVarName(index); + String rVarNameDef = generateVarDef(generateResultVarName(index)); + methodCalcCode.append(resultIndentationNum(2)) + .append(rVarNameDef) + .append("\n") + .append(resultIndentationNum(2)) + .append(rVarName) + .append(" = 1.fdiv(1 + ") + .append(buildExpFunction(entry.getValue(), initScore)) + .append(")") + .append(lineEndSymbol()) + .append("\n"); + index++; + } + + // Generate and return the results of each classification + methodCalcCode.append(buildMultipleClassificationsReturnCode(treeClassificationMap.size())); + return methodCalcCode.toString(); + } + + + @Override + protected String buildExpFunction(List treeVarNameList, String initScore) { + StringBuilder code = new StringBuilder(); + code.append("Math.exp(0 - (") + .append(generateTreeSum(treeVarNameList, initScore)) + .append("))"); + + return code.toString(); + } + + + @Override + protected String buildMultipleClassificationsReturnCode(int classificationsNum) { + StringBuilder code = new StringBuilder(); + code.append(resultIndentationNum(2)) + .append("["); + code.append(generateCodeByClassificationsNum(classificationsNum)); + code.append("]").append(lineEndSymbol()); + return code.toString(); + } + + + @Override + protected String lineEndSymbol() { + return ""; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostVisualBasicLanguage.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostVisualBasicLanguage.java" new file mode 100644 index 0000000000000000000000000000000000000000..61b74440d4cf31d9a4b7a5772449f31f83b808d1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/service/modelexport/XgboostVisualBasicLanguage.java" @@ -0,0 +1,144 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.service.modelexport; + +import java.util.List; + +/** + * Visual Basic + * + * @author aaron.li + **/ +public class XgboostVisualBasicLanguage extends XgboostPythonLanguage { + + @Override + protected String preBuild2ClassificationsMethodSignNameCode(int treeNum, String initScore) { + StringBuilder preMethodCode = new StringBuilder(); + preMethodCode.append("Module Model") + .append("\n") + .append("Function Score(ByRef inputVector() As Double) As Double()") + .append("\n") + .append(METHOD_BODY_PLACEHOLDER) + .append("\n") + .append("End Function") + .append("\n") + .append("End Module"); + return preMethodCode.toString(); + } + + @Override + protected String preGenerateNodeCode(Node node, int treeIndex) { + StringBuilder codeSb = new StringBuilder(); + codeSb.append(indentationByNodeLayer(node, false)); + if (node.isLeaf()) { + codeSb.append(generateVarName(treeIndex)).append(" = ").append(node.getWeight()); + } else { + codeSb.append("If (").append(generateCompareVarName(node.getFid())).append(") " + greaterThanSymbol() + " (").append(node.getBid()).append(") Then") + .append("\n") + .append(generateIdPlaceholder(node.getRightNodeId())) + .append("\n") + .append(indentationByNodeLayer(node, false)) + .append("Else") + .append("\n") + .append(generateIdPlaceholder(node.getLeftNodeId())) + .append("\n") + .append(indentationByNodeLayer(node, false)) + .append("End If"); + + } + return codeSb.toString(); + } + + + @Override + protected String build2ClassificationsResultLogicCode(int treeNum, String initScore) { + StringBuilder methodCalcCode = new StringBuilder(); + String summaryVar = "s1"; + methodCalcCode.append(indentationByNodeLayer(1, false)); + methodCalcCode.append(generateVarDef(summaryVar)) + .append("\n") + .append(indentationByNodeLayer(1, false)) + .append(summaryVar) + .append(" = 1 / (1 + Math.Exp(0 - (") + .append(generateTreeSum(treeNum, initScore)); + + String summaryVar2 = "s2"; + methodCalcCode.append(")))") + .append(lineEndSymbol()) + .append("\n") + .append(indentationByNodeLayer(1, false)) + .append("Dim " + summaryVar2 + "(1) As Double") + .append("\n") + .append(indentationByNodeLayer(1, false)) + .append(summaryVar2 + "(0) = (1) - (" + summaryVar + ")") + .append("\n") + .append(indentationByNodeLayer(1, false)) + .append(summaryVar2 + "(1) = ") + .append(summaryVar) + .append("\n") + .append(indentationByNodeLayer(1, false)) + .append("Score = ") + .append(summaryVar2); + + return methodCalcCode.toString(); + } + + @Override + protected String buildExpFunction(List treeVarNameList, String initScore) { + StringBuilder code = new StringBuilder(); + code.append("Math.Exp(0 - (") + .append(generateTreeSum(treeVarNameList, initScore)) + .append("))"); + + return code.toString(); + } + + + @Override + protected String buildMultipleClassificationsReturnCode(int classificationsNum) { + StringBuilder code = new StringBuilder(); + code.append(resultIndentationNum(1)) + .append(generateVarDef(generateResultVarName(classificationsNum) + "(" + (classificationsNum - 1) + ")")) + .append("\n"); + + for (int i = 0; i < classificationsNum; i++) { + code.append(resultIndentationNum(1)) + .append(generateResultVarName(classificationsNum) + "(" + i + ") = " + generateResultVarName(i) + " / (" + generateTreeClassificationsResultSum(classificationsNum) + ")") + .append("\n"); + } + code.append(resultIndentationNum(1)) + .append("Score = " + generateResultVarName(classificationsNum)); + return code.toString(); + } + + + @Override + protected String generateCompareVarName(String index) { + return "inputVector(" + index + ")"; + } + + + @Override + protected String generateVarDef(String varName) { + return "Dim " + varName + " As Double"; + } + + @Override + protected String lineEndSymbol() { + return ""; + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/AbstractDataSetReader.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/AbstractDataSetReader.java" new file mode 100644 index 0000000000000000000000000000000000000000..e55192ce6019e82cf9014898b23449d092d2622f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/AbstractDataSetReader.java" @@ -0,0 +1,218 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.util; + +import com.welab.wefe.board.service.dto.entity.data_set.DataSetColumnInputModel; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; + +import java.io.Closeable; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * data set reader + * + * @author zane.luo + */ +public abstract class AbstractDataSetReader implements Closeable { + + private final static List NULL_VALUE_LIST = Arrays.asList("", "null", "NA", "nan", "None"); + + private final static Pattern MATCH_INTEGER_PATTERN = Pattern.compile("^([+\\-])?\\d{1,10}(\\.0+)?$"); + private final static Pattern MATCH_LONG_PATTERN = Pattern.compile("^([+\\-])?\\d+(\\.0+)?$"); + private final static Pattern MATCH_DOUBLE_PATTERN = Pattern.compile("^([+\\-])?\\d+(\\.\\d*)?$"); + private final static Pattern MATCH_BOOLEAN_PATTERN = Pattern.compile("^true$|^false$|^0$|^1$", Pattern.CASE_INSENSITIVE); + + protected List header; + protected boolean containsY; + /** + * Number of rows of data read + */ + protected int readDataRows = 0; + private Map metadataMap; + + public AbstractDataSetReader(List metadataList) { + if (metadataList != null) { + this.metadataMap = metadataList.stream().collect(Collectors.toMap(x -> x.getName(), x -> x)); + } + } + + public List getHeader() throws StatusCodeWithException { + if (header != null) { + return header; + } + + List list = null; + try { + list = doGetHeader(); + } catch (Exception e) { + throw new StatusCodeWithException("璇诲彇鏁版嵁闆 header 淇℃伅澶辫触锛" + e.getMessage(), StatusCode.SYSTEM_ERROR); + } + + // trim column name + list = list + .stream() + .map(x -> x.trim()) + .collect(Collectors.toList()); + + if (list.stream().distinct().count() != list.size()) { + throw new StatusCodeWithException("鏁版嵁闆嗗寘鍚噸澶嶇殑瀛楁锛岃澶勭悊鍚庨噸鏂颁笂浼犮", StatusCode.PARAMETER_VALUE_INVALID); + } + + if (list.size() == 0) { + throw new StatusCodeWithException("鏁版嵁闆嗛琛屼负绌", StatusCode.PARAMETER_VALUE_INVALID); + } + if (list.size() == 1) { + throw new StatusCodeWithException("鏁版嵁闆嗕粎涓鍒楋紝涓嶆敮鎸佷粎鏈 Id 鍒楃殑鏁版嵁闆嗕笂浼犮", StatusCode.PARAMETER_VALUE_INVALID); + } + + // Convert uppercase Y to lowercase y + list = list.stream().map(x -> "Y".equals(x) ? "y" : x).collect(Collectors.toList()); + + containsY = list.contains("y"); + + header = list; + + return header; + } + + /** + * Read all data rows + * + * @param dataRowConsumer Data row consumption method + */ + public void readAll(Consumer> dataRowConsumer) throws StatusCodeWithException { + read(dataRowConsumer, -1, -1); + } + + /** + * Read data row + * + * @param dataRowConsumer Data row consumption method + * @param maxReadRows Maximum number of read lines allowed + * @param maxReadTimeInMs Maximum read time allowed + */ + public void read(Consumer> dataRowConsumer, long maxReadRows, long maxReadTimeInMs) throws StatusCodeWithException { + + long start = System.currentTimeMillis(); + + LinkedHashMap row; + while ((row = readOneRow()) != null) { + + checkValue(row); + + dataRowConsumer.accept(row); + + readDataRows++; + + // Limit the number of rows read + if (maxReadRows > 0 && readDataRows >= maxReadRows) { + break; + } + + // Limit the duration of reading + if (maxReadTimeInMs > 0 && System.currentTimeMillis() - start > maxReadTimeInMs) { + break; + } + } + } + + public static boolean isEmptyValue(String value) { + return NULL_VALUE_LIST.stream().anyMatch(x -> x.equalsIgnoreCase(value)); + } + + /** + * Check whether the value of the feature matches the declared data type + */ + private void checkValue(LinkedHashMap row) throws StatusCodeWithException { + + if (this.metadataMap == null || this.metadataMap.isEmpty()) { + return; + } + + for (Map.Entry entry : row.entrySet()) { + + // skip null value + String value = String.valueOf(entry.getValue()); + if (isEmptyValue(value)) { + return; + } + + DataSetColumnInputModel column = this.metadataMap.get(entry.getKey()); + Pattern pattern; + switch (column.getDataType()) { + case Long: + pattern = MATCH_LONG_PATTERN; + break; + case Double: + pattern = MATCH_DOUBLE_PATTERN; + break; + case Boolean: + pattern = MATCH_BOOLEAN_PATTERN; + break; + case Integer: + pattern = MATCH_INTEGER_PATTERN; + break; + case Enum: + case String: + default: + return; + } + + if (!pattern.matcher(value).find()) { + StatusCode.ERROR_IN_DATA_RESOURCE_ADD_FORM.throwException( + "鏁版嵁闆嗙殑鐗瑰緛 " + column.getName() + + " 澹版槑涓 " + column.getDataType() + + " 绫诲瀷锛屼絾鍦 " + (readDataRows + 1) + + " 琛屽彂鐜颁笉婊¤冻绫诲瀷鐨勫硷細" + value + ); + } + } + + } + + public boolean isContainsY() throws StatusCodeWithException { + if (header == null) { + getHeader(); + } + + return containsY; + } + + public long getReadDataRows() { + return readDataRows; + } + + + protected abstract List doGetHeader() throws Exception; + + /** + * Get the total number of rows in the data set + */ + public abstract long getTotalDataRowCount(); + + /** + * Read data row + */ + protected abstract LinkedHashMap readOneRow() throws StatusCodeWithException; +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/CsvDataSetReader.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/CsvDataSetReader.java" new file mode 100644 index 0000000000000000000000000000000000000000..7d38f468ae4a099469170264ecdbc132c39c5d99 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/CsvDataSetReader.java" @@ -0,0 +1,115 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.util; + +import com.welab.wefe.board.service.dto.entity.data_set.DataSetColumnInputModel; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import de.siegmar.fastcsv.reader.CsvParser; +import de.siegmar.fastcsv.reader.CsvReader; +import de.siegmar.fastcsv.reader.CsvRow; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.LineNumberReader; +import java.nio.charset.StandardCharsets; +import java.util.LinkedHashMap; +import java.util.List; + +/** + * Used to read data set files in csv format + *

+ * https://github.com/osiegmar/FastCSV + * + * @author zane.luo + */ +public class CsvDataSetReader extends AbstractDataSetReader { + + private final CsvParser parser; + private long totalRowCount; + private final File file; + + public CsvDataSetReader(File file) throws IOException { + this(null, file); + } + + public CsvDataSetReader(List metadataList, File file) throws IOException { + super(metadataList); + this.file = file; + + CsvReader reader = new CsvReader(); + reader.setContainsHeader(false); + reader.setSkipEmptyRows(true); + this.parser = reader.parse(file, StandardCharsets.UTF_8); + } + + @Override + protected List doGetHeader() throws Exception { + + CsvRow row = parser.nextRow(); + return row.getFields(); + } + + @Override + public long getTotalDataRowCount() { + if (totalRowCount > 0) { + return totalRowCount; + } + + // Get the number of file lines + try { + FileReader fr = new FileReader(file); + LineNumberReader lnr = new LineNumberReader(fr); + lnr.skip(Long.MAX_VALUE); + totalRowCount = lnr.getLineNumber() - 1L; + lnr.close(); + fr.close(); + } catch (IOException e) { + return 0; + } + + return totalRowCount; + } + + @Override + protected LinkedHashMap readOneRow() throws StatusCodeWithException { + + LinkedHashMap map = new LinkedHashMap<>(); + try { + CsvRow row = parser.nextRow(); + if (row == null) { + return null; + } + + for (int i = 0; i < header.size(); i++) { + map.put(header.get(i), row.getField(i)); + } + + } catch (IOException e) { + throw new StatusCodeWithException("璇诲彇鏁版嵁闆嗕腑鐨勬暟鎹澶辫触锛" + e.getMessage(), StatusCode.SYSTEM_ERROR); + } + + return map; + } + + + @Override + public void close() throws IOException { + parser.close(); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/ExcelDataSetReader.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/ExcelDataSetReader.java" new file mode 100644 index 0000000000000000000000000000000000000000..8e95716735634051cbd7b0fa91af187f1c86893e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/ExcelDataSetReader.java" @@ -0,0 +1,80 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.util; + +import com.welab.wefe.board.service.dto.entity.data_set.DataSetColumnInputModel; +import com.welab.wefe.common.exception.StatusCodeWithException; +import com.welab.wefe.common.io.excel.ExcelReader; + +import java.io.File; +import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.List; + +/** + * Used to read data set files in excel format + * + * @author zane.luo + */ +public class ExcelDataSetReader extends AbstractDataSetReader { + private final ExcelReader reader; + + public ExcelDataSetReader(File file) throws IOException { + this(null, file); + } + + public ExcelDataSetReader(List metadataList, File file) throws IOException { + super(metadataList); + reader = new ExcelReader(file); + } + + @Override + protected List doGetHeader() throws Exception { + return reader.getColumnNames(0); + } + + @Override + public long getTotalDataRowCount() { + return reader.getRowCount(0) - 1; + } + + @Override + protected LinkedHashMap readOneRow() throws StatusCodeWithException { + + // Read data row + List row = reader.getRowData(0, readDataRows + 1); + + if (row == null) { + return null; + } + + LinkedHashMap map = new LinkedHashMap<>(); + for (int i = 0; i < header.size(); i++) { + + // Supplement the default column of the data row to null + Object value = row.size() > i ? row.get(i) : null; + + map.put(header.get(i), value); + } + return map; + } + + @Override + public void close() throws IOException { + reader.close(); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/JdbcManager.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/JdbcManager.java" new file mode 100644 index 0000000000000000000000000000000000000000..2582ea7eb664e436eb81ee4cef23b5f381b36082 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/JdbcManager.java" @@ -0,0 +1,237 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.util; + +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.enums.DatabaseType; +import com.welab.wefe.common.exception.StatusCodeWithException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.*; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.function.Consumer; + +/** + * jdbc management tool + * + * @author Johnny.lin + */ +public class JdbcManager { + private static final Logger LOG = LoggerFactory.getLogger(JdbcManager.class); + + private JdbcManager() { + + } + + public static Connection getConnection(DatabaseType databaseType, String host, Integer port, String userName + , String password, String dbName) throws StatusCodeWithException { + + Connection conn; + try { + String url; + switch (databaseType) { + case Hive: + Class.forName("org.apache.hive.jdbc.HiveDriver"); + url = String.format("jdbc:hive2://%s:%d/%s", host, port, dbName); + break; + case MySql: + Class.forName("com.mysql.jdbc.Driver"); + url = String.format("jdbc:mysql://%s:%d/%s", host, port, dbName); + break; + case Impala: + Class.forName("org.apache.hive.jdbc.HiveDriver"); + url = String.format("jdbc:hive2://%s:%d/%s", host, port, dbName); + break; + case Cassandra: + case PgSql: + default: + throw new StatusCodeWithException(StatusCode.PARAMETER_VALUE_INVALID, databaseType.toString()); + } + + LOG.info("url: " + url); + conn = DriverManager.getConnection(url, userName, password); + } catch (Exception e) { + LOG.error("鏁版嵁搴撹繛鎺ュけ璐", e); + throw new StatusCodeWithException("鏁版嵁搴撹繛鎺ュけ璐ワ細" + e.getMessage(), StatusCode.DATABASE_LOST); + } + + return conn; + } + + public static boolean testQuery(Connection conn) throws StatusCodeWithException { + return testQuery(conn, "select 1", false); + } + + public static boolean testQuery(Connection conn, String sql, boolean judgeFieldNum) throws StatusCodeWithException { + PreparedStatement ps = null; + ResultSet rs = null; + + try { + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + + if (!rs.next()) { + return false; + } + + // Determine the number of column fields + if (judgeFieldNum) { + ResultSetMetaData metaData = rs.getMetaData(); + int columnCount = metaData.getColumnCount(); + + if (columnCount < 2) { + throw new StatusCodeWithException("鍒楀瓧娈垫暟閲忓繀椤诲ぇ浜1", StatusCode.ILLEGAL_REQUEST); + } + } + } catch (SQLException e) { + LOG.error(e.getMessage(), e); + return false; + } finally { + close(conn, ps, rs); + } + + return true; + } + + /** + * Traverse the data read from the database + */ + public static void readWithFieldRow(Connection conn, String sql, Consumer> dataRowConsumer, long maxReadLineCount) { + PreparedStatement ps = null; + ResultSet rs = null; + long readLineCount = 0; + + try { + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + ResultSetMetaData metaData = rs.getMetaData(); + int columnCount = metaData.getColumnCount(); + + while (rs.next()) { + // Data loading, a map corresponds to a row of data + LinkedHashMap map = new LinkedHashMap<>(); + for (int i = 1; i <= columnCount; i++) { + String header = metaData.getColumnName(i); + if (header.contains(".")) { + header = header.split("\\.")[1]; + } + map.put(header, rs.getObject(i)); + } + + dataRowConsumer.accept(map); + + readLineCount++; + // End the traversal after reading the specified number of rows + if (maxReadLineCount > 0 && readLineCount == maxReadLineCount) { + break; + } + } + } catch (SQLException e) { + LOG.error(e.getMessage(), e); + } finally { + close(conn, ps, rs); + } + } + + /** + * Get the total number of records of query data + */ + public static long count(Connection conn, String sql) { + PreparedStatement ps = null; + ResultSet rs = null; + long totalCount = 0; + + try { + ps = conn.prepareStatement("select count(*) from (" + sql + ") t"); + rs = ps.executeQuery(); + while (rs.next()) { + totalCount = rs.getLong(1); + } + } catch (SQLException e) { + LOG.error(e.getMessage(), e); + } finally { + close(ps, rs); + } + + return totalCount; + } + + /** + * Get the column header name of the query sql data + */ + public static List getRowHeaders(Connection conn, String sql) { + List headers = null; + PreparedStatement ps = null; + ResultSet rs = null; + + try { + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + ResultSetMetaData metaData = rs.getMetaData(); + int columnCount = metaData.getColumnCount(); + + if (rs.next()) { + // Get all field names + headers = new ArrayList<>(); + for (int i = 1; i <= columnCount; i++) { + String header = metaData.getColumnName(i); + if (header.contains(".")) { + header = header.split("\\.")[1]; + } + headers.add(header); + } + } + } catch (SQLException e) { + LOG.error(e.getMessage(), e); + } finally { + close(ps, rs); + } + + return headers; + } + + public static void close(Connection conn, PreparedStatement ps, ResultSet rs) { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + LOG.error(e.getMessage(), e); + } + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + LOG.error(e.getMessage(), e); + } + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + LOG.error(e.getMessage(), e); + } + } + } + + public static void close(PreparedStatement ps, ResultSet rs) { + close(null, ps, rs); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/ModelMapper.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/ModelMapper.java" new file mode 100644 index 0000000000000000000000000000000000000000..2a5d548b9f866b567ccae18ad25caeb6c0b6cf66 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/ModelMapper.java" @@ -0,0 +1,53 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.util; + +import org.modelmapper.convention.MatchingStrategies; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * Entity class mapping tool + * + * @author Zane + */ +public class ModelMapper { + private ModelMapper() { + } + + public static T map(Object source, Class destinationType) { + + if (source == null) { + return null; + } + + org.modelmapper.ModelMapper mapper = new org.modelmapper.ModelMapper(); + mapper.getConfiguration().setFullTypeMatchingRequired(true); + mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); + + return mapper.map(source, destinationType); + + } + + public static List maps(List list, Class destinationType) { + return list + .stream() + .map(x -> map(x, destinationType)) + .collect(Collectors.toList()); + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/SqlDataSetReader.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/SqlDataSetReader.java" new file mode 100644 index 0000000000000000000000000000000000000000..04e1d7471dee4e693247312dfff2ee7cda42024e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/SqlDataSetReader.java" @@ -0,0 +1,136 @@ +/* + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.util; + +import com.welab.wefe.board.service.dto.entity.data_set.DataSetColumnInputModel; +import com.welab.wefe.common.StatusCode; +import com.welab.wefe.common.exception.StatusCodeWithException; +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.sql.*; +import java.util.LinkedHashMap; +import java.util.List; + + +/** + * Used to read data sets in Sql format + * + * @author jacky.jiang + */ +public class SqlDataSetReader extends AbstractDataSetReader { + private static final Logger LOG = LoggerFactory.getLogger(SqlDataSetReader.class); + private long totalRowCount; + private List headers; + private final Connection conn; + private final String sql; + private PreparedStatement ps = null; + private ResultSet rs = null; + private ResultSetMetaData metaData; + private int columnCount; + + public SqlDataSetReader(Connection conn, String sql) throws StatusCodeWithException { + this(null, conn, sql); + } + + public SqlDataSetReader(List metadataList, Connection conn, String sql) throws StatusCodeWithException { + super(metadataList); + this.conn = conn; + this.sql = sql; + + try { + this.ps = conn.prepareStatement(sql); + this.rs = ps.executeQuery(); + this.metaData = rs.getMetaData(); + this.columnCount = metaData.getColumnCount(); + } catch (SQLException e) { + StatusCode.SQL_ERROR.throwException(e); + } + + } + + @Override + protected List doGetHeader() throws Exception { + if (!CollectionUtils.isEmpty(this.headers)) { + return this.headers; + } + + this.headers = JdbcManager.getRowHeaders(conn, sql); + return this.headers; + } + + @Override + public long getTotalDataRowCount() { + if (totalRowCount > 0) { + return totalRowCount; + } + + totalRowCount = JdbcManager.count(conn, sql); + return totalRowCount; + } + + @Override + protected LinkedHashMap readOneRow() throws StatusCodeWithException { + try { + if (!rs.next()) { + return null; + } + + // Data loading, a map corresponds to a row of data + LinkedHashMap map = new LinkedHashMap<>(); + for (int i = 1; i <= columnCount; i++) { + if (rs.getObject(i) == null) { + map.put(metaData.getColumnName(i), ""); + } else { + map.put(metaData.getColumnName(i), rs.getObject(i)); + } + } + return map; + } catch (SQLException e) { + StatusCode.SQL_ERROR.throwException(e.getClass().getSimpleName() + " " + e.getMessage()); + return null; + } + } + + + @Override + public void close() throws IOException { + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + LOG.error("ResultSet is null" + e); + } + } + if (ps != null) { + try { + ps.close(); + } catch (SQLException e) { + LOG.error("PreparedStatement is null" + e); + } + } + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + LOG.error("Connection is null" + e); + } + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/unique/AbstractDataSetUniqueFilter.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/unique/AbstractDataSetUniqueFilter.java" new file mode 100644 index 0000000000000000000000000000000000000000..9a689f14d3d421b52973b4870680e2a71001dba2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/unique/AbstractDataSetUniqueFilter.java" @@ -0,0 +1,30 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.util.unique; + +/** + * Data set primary key deduplication filter + * + * @author zane.luo + */ +public abstract class AbstractDataSetUniqueFilter { + + /** + * Determine whether the filter contains the specified element + */ + public abstract ContainResult contains(String item); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/unique/ContainResult.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/unique/ContainResult.java" new file mode 100644 index 0000000000000000000000000000000000000000..c05e7ba4eaab49989e32694efc75faa77d883210 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/unique/ContainResult.java" @@ -0,0 +1,35 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.util.unique; + +/** + * @author zane.luo + */ +public enum ContainResult { + /** + * Be sure to include + */ + In, + /** + * Sure not to include + */ + NotIn, + /** + * May contain + */ + MaybeIn +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/unique/DataSetBloomUniqueFilter.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/unique/DataSetBloomUniqueFilter.java" new file mode 100644 index 0000000000000000000000000000000000000000..6f61ab780464ef4f6b09b2ba442727fa2835120d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/unique/DataSetBloomUniqueFilter.java" @@ -0,0 +1,51 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.util.unique; + +import com.google.common.base.Charsets; +import com.google.common.hash.BloomFilter; +import com.google.common.hash.Funnels; + +/** + * Bloom filter + * + * @author zane.luo + */ +public class DataSetBloomUniqueFilter extends AbstractDataSetUniqueFilter { + + private final BloomFilter bloomFilter; + + public DataSetBloomUniqueFilter(long width) { + width *= 2; + int minWidth = 100_000_000; + width = width < minWidth ? minWidth : width; + bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), width, 0.01); + } + + @Override + public ContainResult contains(String item) { + + boolean mightContain = bloomFilter.mightContain(item); + bloomFilter.put(item); + if (mightContain) { + return ContainResult.MaybeIn; + } else { + return ContainResult.NotIn; + } + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/unique/DataSetMemoryUniqueFilter.java" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/unique/DataSetMemoryUniqueFilter.java" new file mode 100644 index 0000000000000000000000000000000000000000..deaa72bb9e2412a93883ed42ee97a6f4af897ea9 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/unique/DataSetMemoryUniqueFilter.java" @@ -0,0 +1,43 @@ +/** + * Copyright 2021 Tianmian Tech. All Rights Reserved. + * + * 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. + */ + +package com.welab.wefe.board.service.util.unique; + +import java.util.HashSet; +import java.util.Set; + +/** + * Memory implemented filter + * + * @author zane.luo + */ +public class DataSetMemoryUniqueFilter extends AbstractDataSetUniqueFilter { + private final Set keys = new HashSet<>(); + + @Override + public ContainResult contains(String item) { + + boolean contain = keys.contains(item); + + if (contain) { + return ContainResult.In; + } else { + keys.add(item); + return ContainResult.NotIn; + } + + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/unique/README.md" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/unique/README.md" new file mode 100644 index 0000000000000000000000000000000000000000..c7c678aa25c2f4e371894748689eabb83e9ffdfa --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/java/com/welab/wefe/board/service/util/unique/README.md" @@ -0,0 +1,9 @@ +# 鍘婚噸杩囨护鍣 + +濡傛灉鏁版嵁闆嗙殑涓婚敭瀛樺湪閲嶅锛岄偅涔堝鏁版嵁闆嗙殑浣跨敤浼氭湁寮傚父銆 + +涓轰簡涓鍔虫案閫歌В鍐宠繖涓棶棰橈紝鍦ㄦ坊鍔犳暟鎹泦鐨勮繃绋嬩腑锛岄渶瑕佸鏁版嵁闆嗙殑涓婚敭杩涜鍘婚噸銆 + +鐩墠鐨勬柟妗堟湁涓ょ锛歚甯冮殕杩囨护鍣╜ 鍜 `鍐呭瓨杩囨护鍣╜銆 + +甯冮殕杩囨护鍣ㄦ敮鎸佽秴澶ф暟鎹噺锛屽唴瀛樿繃婊ゅ櫒鍦ㄦ暟鎹噺杩囧ぇ鏃朵細 OOM銆 diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/resources/META-INF/additional-spring-configuration-metadata.json" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/resources/META-INF/additional-spring-configuration-metadata.json" new file mode 100644 index 0000000000000000000000000000000000000000..269f73e557c58428021ccb8178c9f8b4e4c4b55b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/resources/META-INF/additional-spring-configuration-metadata.json" @@ -0,0 +1,14 @@ +{ + "properties": [ + { + "name": "config.path", + "type": "java.lang.String", + "description": "Description for config.path." + }, + { + "name": "wefe.profiles.active", + "type": "java.lang.String", + "description": "Description for wefe.profiles.active." + } + ] +} \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/resources/META-INF/spring.factories" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/resources/META-INF/spring.factories" new file mode 100644 index 0000000000000000000000000000000000000000..47b59e03af9d7758ebb6d454cd70ab57bea4f563 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-service/src/main/resources/META-INF/spring.factories" @@ -0,0 +1 @@ +org.springframework.context.ApplicationListener=com.welab.wefe.board.service.listener.AppListener \ No newline at end of file diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.editorconfig" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.editorconfig" new file mode 100644 index 0000000000000000000000000000000000000000..3c44241cc4f49d29009e01f1f221d04f0d64b68b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.editorconfig" @@ -0,0 +1,9 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.env.development.local.example" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.env.development.local.example" new file mode 100644 index 0000000000000000000000000000000000000000..6d00cba79e85734b1c0f7d853dcc1a7dae89106e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.env.development.local.example" @@ -0,0 +1 @@ +VUE_APP_DEV = 'https://dev.xxx.com/' diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.env.local.example" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.env.local.example" new file mode 100644 index 0000000000000000000000000000000000000000..a4f69a14e1678acd253b233c7957a5ee6884507d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.env.local.example" @@ -0,0 +1,2 @@ +VUE_APP_DEV = 'https://xxx.com' +VUE_APP_PROD = 'https://xxx.com' diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.env.production.local.example" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.env.production.local.example" new file mode 100644 index 0000000000000000000000000000000000000000..ddb1183dc108cbbe67c4ded70dfe63d49d50d188 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.env.production.local.example" @@ -0,0 +1 @@ +VUE_APP_PROD = 'https://dev.xxx.com/' diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.eslintrc.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.eslintrc.js" new file mode 100644 index 0000000000000000000000000000000000000000..aeac4ec8301dcc0f198b74ff530c84eedf018fa9 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.eslintrc.js" @@ -0,0 +1,162 @@ +module.exports = { + root: true, + env: { + browser: true, + node: false, + }, + ignorePatterns: ['dist/*', '*.min.*', 'babel.config.js'], + extends: ['plugin:vue/vue3-essential', 'eslint:recommended'], + parserOptions: { + parser: '@babel/eslint-parser', + sourceType: 'module', + ecmaVersion: 2018, + }, + plugins: ['vue'], + globals: { + $: true, + $app: true, + process: true, + module: true, + require: true, + __dirname: true, + }, + rules: { + // 鏁扮粍鑺辨嫭鍙蜂袱杈圭殑绌烘牸 + 'array-bracket-spacing': [2, 'never'], + // 'brace-style': [2, '1tbs', { 'allowSingleLine': true }], + // 鍦ㄥ璞″拰鏁扮粍涓娇鐢ㄥ熬闅忛楀彿 + 'comma-dangle': [2, 'always-multiline'], + // 鎺у埗閫楀彿鍦ㄨ灏惧嚭鐜拌繕鏄湪琛岄鍑虹幇 + 'comma-style': [2, 'last'], + // 鍦ㄩ潪绌烘枃浠剁殑鏈熬娣诲姞绌鸿 + 'eol-last': 2, + // 浣跨敤鍏ㄧ瓑 + eqeqeq: [2, 'allow-null'], + // 缁欏嚱鏁拌〃杈惧紡鍛藉悕 + 'func-names': 0, + // 鏃犳硶瑙f瀽 import 瀵煎叆鐨勫 + 'import/no-unresolved': 'off', + // 寮哄埗鍦ㄥ璞″啋鍙峰悗闈㈡坊鍔犵┖鏍 + 'key-spacing': [ + 2, + { + multiLine: { + beforeColon: false, + afterColon: true, + align: 'value', + }, + }, + ], + // 鏋勯犲嚱鏁伴瀛楁瘝蹇呴』澶у啓 + 'new-cap': 2, + // 閫氳繃new鍏抽敭瀛楄皟鐢ㄥ嚱鏁版椂涓嶅厑璁哥渷鐣ユ嫭鍙 + 'new-parens': 2, + // 澹版槑鐨勫彉閲忓悗鏂板绌鸿 + 'newline-after-var': 2, + // 涓嶈兘浣跨敤 alert + 'no-alert': 2, + // 鍏佽浣跨敤 console.log + 'no-console': 0, + // 鐢熶骇鐜涓嶅厑璁镐娇鐢 debugger + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', + // 涓嶈兘澹版槑閲嶅鐨 key + 'no-dupe-keys': 2, + // 涓嶈兘澹版槑閲嶅鐨勫彉閲 + 'no-dupe-args': 2, + // 绂佹浣跨敤涓嶅繀瑕佺殑鍒嗗彿 + 'no-extra-semi': 2, + // 涓嶅厑璁哥渷鐣ュ皬鏁扮偣鍓嶇殑 0 + 'no-floating-decimal': 2, + // 涓嶅厑璁镐娇鐢ㄦ棤鏁堢殑姝e垯琛ㄨ揪寮忓瓧绗︿覆 + 'no-invalid-regexp': 2, + // 绌鸿涓嶅厑璁歌秴杩囦袱琛 + 'no-multiple-empty-lines': [1, { max: 2 }], + // 涓嶅厑璁 new String锛孨umber, Boolean + 'no-new-wrappers': 2, + // 涓嶅厑璁歌皟鐢 Math()锛孞SON()鍜孯eflect() + 'no-obj-calls': 2, + // 鍏佽浣跨敤++ + 'no-plusplus': 0, + // 鍏佽鐩存帴璋冪敤 hasOwnProperty 绛 + 'no-prototype-builtins': 0, + // 涓嶅厑璁哥浉鍚屼綔鐢ㄥ煙涓嬪嚭鐜伴噸澶嶅0鏄庣殑鍙橀噺 + 'no-redeclare': 2, + // 'no-shadow': 2, + // 璋冪敤鐨勬嫭鍙疯绱ц窡鍑芥暟鍚 + 'func-call-spacing': 2, + // 涓嶅厑璁哥█鐤忔暟缁 + 'no-sparse-arrays': 2, + // 鍏佽浣跨敤_寮澶存垨缁撳熬 + 'no-underscore-dangle': 0, + // 褰撳瓨鍦ㄦ洿绠鍗曠殑閫夋嫨鏃讹紝涓嶅厑璁镐娇鐢ㄤ笁鍏冭繍绠楃銆 + 'no-unneeded-ternary': 2, + // 涓嶅厑璁告湭浣跨敤鐨勮〃杈惧紡 + 'no-unused-expressions': 0, + // 鏈娇鐢ㄧ殑鍙橀噺 + 'no-unused-vars': [ + 'error', + { + vars: 'all', + args: 'none', + ignoreRestSiblings: false, + varsIgnorePattern: '[_$iI]ndex|key|tem|val|value|[iI]gnored', + }, + ], + // 浣跨敤鍓嶅繀椤诲厛澹版槑 + 'no-use-before-define': 0, + // 涓嶅厑璁镐娇鐢 var 澹版槑鍙橀噺 + 'no-var': 2, + 'object-curly-spacing': [2, 'always'], + // 寮哄埗浣跨敤绠鍐欒娉 + 'object-shorthand': 2, + // 鍏佽浣跨敤缂╁啓杩愮畻绗 + 'operator-assignment': [0, 'always'], + // 鎺ㄨ崘浣跨敤 const + 'prefer-const': 2, + // 浣跨敤灞曞紑杩愮畻绗 + 'prefer-spread': 2, + // 浣跨敤鍗曞紩鍙 + quotes: [1, 'single'], + // 寮哄埗鎻愪緵鍩烘暟 parseInt("071", 10) + radix: 2, + // 涓嶅厑璁镐娇鐢ㄥ師瀛愮骇鍙橀噺鏇存柊, 渚嬪 ctx.body = xxx; 鏀逛负 const _ctx = ctx; _ctx.body = xxx; + 'require-atomic-updates': 2, + // 寮哄埗浣跨敤鍒嗗彿 + semi: [2, 'always'], + // 涓鍏冭繍绠楃鍓嶅悗绌烘牸 + 'space-unary-ops': [2, { words: true, nonwords: false }], + // 涓ユ牸妯″紡 + strict: 2, + // 涓嶅厑璁告瘮杈'NaN', 搴旇浣跨敤 isNaN(foo) + 'use-isnan': 2, + // 寮哄埗鎵ц鏈夋晥鐨凧SDoc娉ㄩ噴 + 'valid-jsdoc': 0, + // 鍏佽浣跨敤 v-html + 'vue/no-v-html': 0, + // vue html 涓殑缂╄繘 + 'vue/html-indent': [ + 'error', + 4, + { + attribute: 1, + baseIndent: 1, + closeBracket: 0, + alignAttributesVertically: true, + ignores: [], + }, + ], + 'vue/script-indent': ['error', 4, { 'baseIndent': 1 }], + // vue 灞炴ч粯璁ゅ + 'vue/require-default-prop': 0, + // 鍗曡鍏冪礌鍙婂琛屽唴瀹规牸寮 + 'vue/singleline-html-element-content-newline': [ + 'error', + { + ignoreWhenEmpty: true, + ignoreWhenNoAttributes: true, + ignores: ['html', 'body', 'article', 'hgroup', 'figure', 'main', 'section', 'header', 'footer', 'aside', 'nav', 'video', 'audio', 'canvas', 'details', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'p', 'dl', 'dd', 'ul', 'li', 'ol', 'label', 'form', 'input', 'img', 'textarea', 'th', 'tr', 'td', 'button', 'select', 'a', 'span', 'em', 'i', 'sub', 'sup', 'pre', 'code', 'table'], + }, + ], + 'vue/no-v-for-template-key': 0, + }, +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.gitignore" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.gitignore" new file mode 100644 index 0000000000000000000000000000000000000000..a94fe4545ea00c11314357cb43a74b62fb5ec7bb --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.gitignore" @@ -0,0 +1,23 @@ +.cache +.DS_Store +.eslintcache +node_modules/ +/dist + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.husky/commit-msg" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.husky/commit-msg" new file mode 100644 index 0000000000000000000000000000000000000000..afc5b56c343da1b6ade1a73bb06dcffedad4bc57 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.husky/commit-msg" @@ -0,0 +1,5 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +cd board/board-website +npx --no-install commitlint -H '!!!璇锋鏌ユ彁浜ゆ牸寮忔槸鍚︾鍚堣姹 feat|fix|build: your message 瀹樻柟鏂囨。 https://github.com/conventional-changelog/commitlint/#what-is-commitlint' --edit $1 -g commitlint.config.js diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.husky/pre-commit" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.husky/pre-commit" new file mode 100644 index 0000000000000000000000000000000000000000..0cc690682d420a4a331c299c10e4a5106e6f46b1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.husky/pre-commit" @@ -0,0 +1,5 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +cd board/board-website +node .lintstagedrc.js diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.lintstagedrc.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.lintstagedrc.js" new file mode 100644 index 0000000000000000000000000000000000000000..5d46181c6c9dbbf9e11dbece63e381ede60394de --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.lintstagedrc.js" @@ -0,0 +1,43 @@ +/** + * lintstage config + * @description eslint codes before commit + */ + +const lintStaged = require('lint-staged'); + +async function startLinting() { + try { + const success = await lintStaged({ + allowEmpty: false, + concurrent: true, + config: { + '*.{js,vue}': [ + // 'prettier --write', + 'eslint --fix --cache --fix-type suggestion,layout,problem .', + ], + }, + debug: false, + cwd: process.cwd(), + maxArgLength: null, + relative: false, + shell: false, + quiet: true, + stash: true, + verbose: false, + }); + + if (success) { + console.log('Linting was successful!\n'); + process.exit(0); + } else { + console.log('Linting failed!\n'); + process.exit(1); + } + } catch (e) { + // Failed to load configuration + console.error(e); + process.exit(1); + } +} + +startLinting(); diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.prettierrc" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.prettierrc" new file mode 100644 index 0000000000000000000000000000000000000000..f9148847022bdb0746b793dd41ff3d8b809d382a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/.prettierrc" @@ -0,0 +1,6 @@ +{ + "trailingComma": "es5", + "tabWidth": 4, + "semi": true, + "singleQuote": true +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/README.md" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/README.md" new file mode 100644 index 0000000000000000000000000000000000000000..17d4ae649319c4e2b91fc3107a29a6c6383e89b6 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/README.md" @@ -0,0 +1,93 @@ +board-wesite 鎻愪緵鐢ㄦ埛鍙嬪ソ鐨勫彲瑙嗗寲鎿嶄綔鐣岄潰銆 + +# 椤圭洰鐨勬墦鍖呬笌鍚姩 + +**瀹夎渚濊禆** + +鍩轰簬 nodejs v12 - v16 鐜瀹夎椤圭洰渚濊禆锛孾nodejs 瀹樻柟涓嬭浇鍦板潃](http://nodejs.cn/download/)銆 + +``` zsh +# 鍦 board-website 鐩綍涓嬭繍琛 +npm install +``` + +**寮鍙戦厤缃** + +.env 鐢ㄤ簬涓嶅悓鐜鎵撳寘閰嶇疆 +package.json 涓 context 鐢ㄤ簬閰嶇疆鎵撳寘鍚庣殑鏂囦欢澶瑰悕绉, 鐣欑┖鍒欎笉鍒涘缓鏂囦欢澶 +vue.config.js 鐢ㄤ簬寮鍙戞椂浠g悊閰嶇疆, target 涓烘帴鍙d唬鐞嗗湴鍧 + +**椤圭洰鍚姩** + +``` zsh +# 澶嶅埗 .env.local.example 骞堕噸鍛藉悕涓 .env.local, 灏 env 涓殑閰嶇疆鎸夐渶鏇存敼 +# 鍚姩鏈嶅姟锛屾墽琛屽娆′細寮鍚涓鍙g洃鍚紝 榛樿浠 8080 绔彛绱姞 +npm run dev +``` + +**椤圭洰鎵撳寘** + +``` zsh +# 榛樿: +npm run build +# 绛変簬: +npm run build -- prod=board-website +# prod 琛ㄧず浣跨敤 /.env 鏂囦欢涓搴旂殑鎺ュ彛鍦板潃, board-website 琛ㄧず鍓嶅彴璁块棶涓婁笅鏂囧湴鍧 +``` + +# 鍙傝冩枃妗 + +[鍓嶇妗嗘灦 ElementPlus](https://element-plus.gitee.io/#/zh-CN) + +# 寮鍙戣鑼 + +Visual Studio Code 浠g爜鏍煎紡鍖栭厤缃」銆 + +缂栬緫鍣ㄦ彃浠: prettier, eslint, vetur, JavaScript (ES6) code snippets, tabnine銆 + +```json +{ + "editor.formatOnSave": false, // 蹇呴 + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "eslint.validate": [ + "javascript", + "javascriptreact", + "react", + "html", + "vue", + ], + "emmet.syntaxProfiles": { + "postcss": "css", + "vue-html": "html", + "vue": "html", + }, + "vetur.format.defaultFormatter.html": "js-beautify-html", + "vetur.format.defaultFormatter.ts": "vscode-typescript", + "vetur.format.defaultFormatter.js": "vscode-typescript", + "vetur.format.options.tabSize": 4, + "vetur.format.options.useTabs": false, + "vetur.format.scriptInitialIndent": true, + "vetur.format.styleInitialIndent": true, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[json]": { + "editor.defaultFormatter": "vscode.json-language-features" + }, + "[html]": { + "editor.defaultFormatter": "vscode.html-language-features" + }, + "[css]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[less]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[scss]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, +} +``` diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/babel.config.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/babel.config.js" new file mode 100644 index 0000000000000000000000000000000000000000..218963bd8c2b100f6bf8131db6035f76f3b5368e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/babel.config.js" @@ -0,0 +1,3 @@ +module.exports = { + presets: ['@vue/cli-plugin-babel/preset'], +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/commitlint.config.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/commitlint.config.js" new file mode 100644 index 0000000000000000000000000000000000000000..d29440e124e0319abeac0be74cc0614dd2dd8b5b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/commitlint.config.js" @@ -0,0 +1,22 @@ +module.exports = { + extends: ['@commitlint/config-conventional'], + rules: { + 'type-enum': [ + 2, + 'always', + [ + 'build', // 鍙戝竷鐗堟湰 + 'chore', // 鏀瑰彉鏋勫缓娴佺▼銆佹垨鑰呭鍔犱緷璧栧簱銆佸伐鍏风瓑 + 'ci', // 鎸佺画闆嗘垚淇敼 + 'docs', // 鏂囨。淇敼 + 'feat', // 鏂板鍔熻兘 + 'fix', // 淇缂洪櫡 + 'perf', // 浼樺寲鐩稿叧锛屾瘮濡傛彁鍗囨ц兘銆佷綋楠 + 'refactor', // 浠g爜閲嶆瀯 + 'revert', // 鍥為鐗堟湰 + 'style', // 鏍峰紡淇敼 + 'test', // 娴嬭瘯鐢ㄤ緥淇敼 + ], + ], + }, +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/index.html" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/index.html" new file mode 100644 index 0000000000000000000000000000000000000000..c30084c9c32d745dda833b4989830ba1c8625577 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/index.html" @@ -0,0 +1,45 @@ + + + + + WeFe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/jsconfig.json" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/jsconfig.json" new file mode 100644 index 0000000000000000000000000000000000000000..afbd7336dda181a226b27453f7a7630166359df8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/jsconfig.json" @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@/*": ["./*"], + "@src/*": ["src/*"], + "@comp/*": ["src/components/*"], + "@assets/*": ["src/assets/*"], + "@js/*": ["src/assets/js/*"], + "@styles/*": ["src/assets/styles/*"], + "@views/*": ["src/views/*"] + }, + "target": "es6", + "module": "es6", + "allowSyntheticDefaultImports": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", ".git"] +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/package-lock.json" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/package-lock.json" new file mode 100644 index 0000000000000000000000000000000000000000..9edbb24bf147c66c67d7767a5f220b724abc29e7 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/package-lock.json" @@ -0,0 +1,33961 @@ +{ + "name": "wefe-board-website", + "version": "2.3.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "wefe-board-website", + "version": "2.3.0", + "license": "ISC", + "dependencies": { + "@antv/g6": "^4.3.11", + "@element-plus/icons": "^0.0.11", + "axios": "^0.21.4", + "echarts": "^5.2.0", + "element-plus": "^1.2.0-beta.6", + "js-md5": "^0.7.3", + "simple-uploader.js": "^0.5.6", + "tiny-emitter": "^2.1.0", + "vue": "^3.2.21", + "vue-cheetah-grid": "^1.1.5", + "vue-router": "^4.0.11", + "vue3-virtual-list": "^1.0.2", + "vuex": "^4.0.2", + "welabx-g6": "^0.6.8" + }, + "devDependencies": { + "@babel/core": "^7.15.5", + "@babel/eslint-parser": "^7.15.4", + "@babel/plugin-transform-runtime": "^7.15.0", + "@commitlint/cli": "^11.0.0", + "@commitlint/config-conventional": "^11.0.0", + "@vue/babel-preset-app": "^4.5.15", + "@vue/cli-plugin-babel": "~4.5.15", + "@vue/cli-service": "~4.5.15", + "@vue/compiler-sfc": "^3.2.11", + "autoprefixer": "^9.8.6", + "babel-plugin-import": "^1.13.3", + "copy-webpack-plugin": "^5.1.2", + "eslint": "^7.32.0", + "eslint-friendly-formatter": "^4.0.1", + "eslint-plugin-html": "^6.1.2", + "eslint-plugin-vue": "^7.17.0", + "husky": "^7.0.2", + "lint-staged": "^10.5.4", + "minimist": "^1.2.5", + "sass": "^1.43.2", + "sass-loader": "^10.2.0", + "sass-resources-loader": "^2.2.4", + "speed-measure-webpack-plugin": "^1.5.0", + "style-loader": "^2.0.0", + "unplugin-vue-components": "^0.17.2", + "webpack-bundle-analyzer": "^4.4.2" + }, + "engines": { + "node": ">= 8.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/@ant-design/colors": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-4.0.5.tgz", + "integrity": "sha512-3mnuX2prnWOWvpFTS2WH2LoouWlOgtnIpc6IarWN6GOzzLF8dW/U8UctuvIPhoboETehZfJ61XP+CGakBEPJ3Q==", + "dependencies": { + "tinycolor2": "^1.4.1" + } + }, + "node_modules/@antfu/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-UU8TLr/EoXdg7OjMp0h9oDoIAVr+Z/oW9cpOxQQyrsz6Qzd2ms/1CdWx8fl2OQdFpxGmq5Vc4TwfLHId6nAZjA==", + "dev": true, + "dependencies": { + "@types/throttle-debounce": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antv/algorithm": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/@antv/algorithm/-/algorithm-0.1.13.tgz", + "integrity": "sha512-AXHybK/OQlbk99Qgj7Dix3hNsIP+GvpVS4Oisb9gJkCBZLML9lZIM2/0m/MRqLvVxoIyglEg6aNjGUWBRMGRRQ==", + "dependencies": { + "@antv/util": "^2.0.13", + "tslib": "^2.0.0" + } + }, + "node_modules/@antv/dom-util": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@antv/dom-util/-/dom-util-2.0.3.tgz", + "integrity": "sha512-dUHsUT4U9X1T1/Y9bH3jRMe0MzvWJk2jSQm1vm3w9NX+Ra0ftq5VUBiGTNbthm3nFwG0fFFjip904rYjl50g4A==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/event-emitter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@antv/event-emitter/-/event-emitter-0.1.2.tgz", + "integrity": "sha512-6C6NJOdoNVptCr5y9BVOhKkCgW7LFs/SpcRyAExUeSjAm0zJqcqNkSIRGsXYhj4PJI+CZICHzGwwiSnIsE68Ug==" + }, + "node_modules/@antv/g-base": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@antv/g-base/-/g-base-0.5.9.tgz", + "integrity": "sha512-IAzuCLRmz9cKCWUKR3cKWgLZ/6OQYpTCIOgxAP8Bc+HRw0mu8iC3OTz+tWKGv9L8unpvCvpQd1H+OTTjdg/TpQ==", + "dependencies": { + "@antv/event-emitter": "^0.1.1", + "@antv/g-math": "^0.1.6", + "@antv/matrix-util": "^3.1.0-beta.1", + "@antv/path-util": "~2.0.5", + "@antv/util": "~2.0.0", + "@types/d3-timer": "^2.0.0", + "d3-ease": "^1.0.5", + "d3-interpolate": "^1.3.2", + "d3-timer": "^1.0.9", + "detect-browser": "^5.1.0", + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/g-canvas": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/@antv/g-canvas/-/g-canvas-0.5.12.tgz", + "integrity": "sha512-iJ/muwwqCCNONVlPIzv/7OL5iLguaKRj2BxNMytUO3TWwamM+kHkiyYEOkS0dPn9h/hBsHYlLUluSVz2Fp6/bw==", + "dependencies": { + "@antv/g-base": "^0.5.3", + "@antv/g-math": "^0.1.6", + "@antv/matrix-util": "^3.1.0-beta.1", + "@antv/path-util": "~2.0.5", + "@antv/util": "~2.0.0", + "gl-matrix": "^3.0.0", + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/g-math": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@antv/g-math/-/g-math-0.1.7.tgz", + "integrity": "sha512-xGyXaloD1ynfp7gS4VuV+MjSptZIwHvLHr8ekXJSFAeWPYLu84yOW2wOZHDdp1bzDAIuRv6xDBW58YGHrWsFcA==", + "dependencies": { + "@antv/util": "~2.0.0", + "gl-matrix": "^3.0.0" + } + }, + "node_modules/@antv/g-svg": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@antv/g-svg/-/g-svg-0.5.6.tgz", + "integrity": "sha512-Xve1EUGk4HMbl2nq4ozR4QLh6GyoZ8Xw/+9kHYI4B5P2lIUQU95MuRsaLFfW5NNpZDx85ZeH97tqEmC9L96E7A==", + "dependencies": { + "@antv/g-base": "^0.5.3", + "@antv/g-math": "^0.1.6", + "@antv/util": "~2.0.0", + "detect-browser": "^5.0.0", + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/g-webgpu": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@antv/g-webgpu/-/g-webgpu-0.5.5.tgz", + "integrity": "sha512-TxtBniINFq1jFGEPo46xjJfrbJbUqkFd5wmsRs3tcg/7J7xoldOP1kEadpI3AJG9knMYdE92VpILw1VPd6DgzQ==", + "dependencies": { + "@antv/g-webgpu-core": "^0.5.5", + "@antv/g-webgpu-engine": "^0.5.5", + "@webgpu/types": "^0.0.31", + "gl-matrix": "^3.1.0", + "gl-vec2": "^1.3.0", + "hammerjs": "^2.0.8", + "inversify": "^5.0.1", + "inversify-inject-decorators": "^3.1.0", + "polyline-miter-util": "^1.0.1", + "polyline-normals": "^2.0.2", + "probe.gl": "^3.1.1", + "reflect-metadata": "^0.1.13" + } + }, + "node_modules/@antv/g-webgpu-core": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@antv/g-webgpu-core/-/g-webgpu-core-0.5.6.tgz", + "integrity": "sha512-DPiH3GkAUiT0Q+LAKeImpI+IOQ/gP2w6HstYKivpFIpBPIvZ/9equM3icVrn1iDfDkZANVXQ1PppcO3xBv1ZTw==", + "dependencies": { + "eventemitter3": "^4.0.0", + "gl-matrix": "^3.1.0", + "inversify": "^5.0.1", + "inversify-inject-decorators": "^3.1.0", + "probe.gl": "^3.1.1", + "reflect-metadata": "^0.1.13" + } + }, + "node_modules/@antv/g-webgpu-engine": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@antv/g-webgpu-engine/-/g-webgpu-engine-0.5.6.tgz", + "integrity": "sha512-D311qYUefdEFwLayutIHqucrAY3cAGH3BdnXS37nq+0nsglrHcNP0Ab1YTinn9RihLoY3yXFTLzrYkJHJbZXDg==", + "dependencies": { + "@antv/g-webgpu-core": "^0.5.6", + "@webgpu/glslang": "^0.0.15", + "@webgpu/types": "^0.0.31", + "gl-matrix": "^3.1.0", + "hammerjs": "^2.0.8", + "inversify": "^5.0.1", + "inversify-inject-decorators": "^3.1.0", + "probe.gl": "^3.1.1", + "reflect-metadata": "^0.1.13", + "regl": "^1.3.11" + } + }, + "node_modules/@antv/g6": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@antv/g6/-/g6-4.5.0.tgz", + "integrity": "sha512-d6lVmbQP+12JwIqvyZ5iuJg7Xq77JANFn9SLJjn8cZCjsQ9Ns1aYXzY66siPICn3Zqj286V3JdurwNHoQqmcyg==", + "dependencies": { + "@antv/g6-pc": "0.5.0" + } + }, + "node_modules/@antv/g6-core": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@antv/g6-core/-/g6-core-0.5.0.tgz", + "integrity": "sha512-tBfd0moxWzDIVD1CRlEoEFVps7bQsps5JB0LBtvobNT0a0Y8Kd2Rdxv0hRGrnlQgKYC93NrCftkRcxCIvTQO1A==", + "dependencies": { + "@antv/algorithm": "^0.1.8", + "@antv/dom-util": "^2.0.1", + "@antv/event-emitter": "~0.1.0", + "@antv/g-base": "^0.5.1", + "@antv/g-math": "^0.1.1", + "@antv/matrix-util": "^3.1.0-beta.3", + "@antv/path-util": "^2.0.3", + "@antv/util": "~2.0.5", + "ml-matrix": "^6.5.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@antv/g6-element": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@antv/g6-element/-/g6-element-0.5.0.tgz", + "integrity": "sha512-WkhFwHmFLMPeJ1tUhxpnuIuVPEtn4OkYAKfnoVlyiBZnGG2jqkHAG03Ll7YoF0A40EUy+a/x2GukBhLEm/kuJw==", + "dependencies": { + "@antv/g-base": "^0.5.1", + "@antv/g6-core": "0.5.0", + "@antv/util": "~2.0.5" + } + }, + "node_modules/@antv/g6-pc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@antv/g6-pc/-/g6-pc-0.5.0.tgz", + "integrity": "sha512-/yeIymYQ2GpULwDDxn3RadhzxRemS8o9oTYCVTuPPt9pvJ0XJ7P3nB3z2gwnIoRjoNF6qvlmFWgW9DBbfNzeiw==", + "dependencies": { + "@ant-design/colors": "^4.0.5", + "@antv/algorithm": "^0.1.8", + "@antv/dom-util": "^2.0.1", + "@antv/event-emitter": "~0.1.0", + "@antv/g-base": "^0.5.1", + "@antv/g-canvas": "^0.5.2", + "@antv/g-math": "^0.1.1", + "@antv/g-svg": "^0.5.1", + "@antv/g6-core": "0.5.0", + "@antv/g6-element": "0.5.0", + "@antv/g6-plugin": "0.5.0", + "@antv/hierarchy": "^0.6.7", + "@antv/layout": "0.1.19-beta.5", + "@antv/matrix-util": "^3.1.0-beta.3", + "@antv/path-util": "^2.0.3", + "@antv/util": "~2.0.5", + "color": "^3.1.3", + "d3-force": "^2.0.1", + "dagre": "^0.8.5", + "insert-css": "^2.0.0", + "ml-matrix": "^6.5.0" + } + }, + "node_modules/@antv/g6-plugin": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@antv/g6-plugin/-/g6-plugin-0.5.0.tgz", + "integrity": "sha512-Fxv2G6QYkuluGxbK4gH6PInvWZGwx0GEELmuRkw/Owqn1nw43N37+iDlDA+JgdyDxts3pqC+JQKeHGO270Uo0w==", + "dependencies": { + "@antv/dom-util": "^2.0.2", + "@antv/g-base": "^0.5.1", + "@antv/g-canvas": "^0.5.2", + "@antv/g-svg": "^0.5.2", + "@antv/g6-core": "0.5.0", + "@antv/matrix-util": "^3.1.0-beta.3", + "@antv/scale": "^0.3.4", + "@antv/util": "^2.0.9", + "insert-css": "^2.0.0" + } + }, + "node_modules/@antv/hierarchy": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@antv/hierarchy/-/hierarchy-0.6.8.tgz", + "integrity": "sha512-wVzUl+pxny5gyGJ2mkWx8IiEypX6bnMHgr/NILgbxY6shoy0Vf4FhZpI3CY8Ez7bQT6js8fMkB2NymPW7d7i8A==", + "dependencies": { + "@antv/util": "^2.0.7" + } + }, + "node_modules/@antv/layout": { + "version": "0.1.19-beta.5", + "resolved": "https://registry.npmjs.org/@antv/layout/-/layout-0.1.19-beta.5.tgz", + "integrity": "sha512-t5H9WNoI4werPqjOR1ebZeThwkEofoLyYXEscmU36u0kEa0aXxzFtvdSl6XrYgZRXuEZ+2f6H1FNvGho8jmS7Q==", + "dependencies": { + "@antv/g-webgpu": "0.5.5", + "d3-force": "^2.0.1", + "dagrejs": "^0.2.1", + "ml-matrix": "^6.5.0" + } + }, + "node_modules/@antv/matrix-util": { + "version": "3.1.0-beta.3", + "resolved": "https://registry.npmjs.org/@antv/matrix-util/-/matrix-util-3.1.0-beta.3.tgz", + "integrity": "sha512-W2R6Za3A6CmG51Y/4jZUM/tFgYSq7vTqJL1VD9dKrvwxS4sE0ZcXINtkp55CdyBwJ6Cwm8pfoRpnD4FnHahN0A==", + "dependencies": { + "@antv/util": "^2.0.9", + "gl-matrix": "^3.4.3", + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/path-util": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@antv/path-util/-/path-util-2.0.15.tgz", + "integrity": "sha512-R2VLZ5C8PLPtr3VciNyxtjKqJ0XlANzpFb5sE9GE61UQqSRuSVSzIakMxjEPrpqbgc+s+y8i+fmc89Snu7qbNw==", + "dependencies": { + "@antv/matrix-util": "^3.0.4", + "@antv/util": "^2.0.9", + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/path-util/node_modules/@antv/matrix-util": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@antv/matrix-util/-/matrix-util-3.0.4.tgz", + "integrity": "sha512-BAPyu6dUliHcQ7fm9hZSGKqkwcjEDVLVAstlHULLvcMZvANHeLXgHEgV7JqcAV/GIhIz8aZChIlzM1ZboiXpYQ==", + "dependencies": { + "@antv/util": "^2.0.9", + "gl-matrix": "^3.3.0", + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/scale": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@antv/scale/-/scale-0.3.14.tgz", + "integrity": "sha512-G19Mh9VYPX/Z5PXKJrORIYCjrA+Fmko6ZB4HN6Y8K0T9FeKaSJq+idIe7AUJhIIXDCrFk4LzW+t908NsORqxPg==", + "dependencies": { + "@antv/util": "~2.0.3", + "fecha": "~4.2.0", + "tslib": "^2.0.0" + } + }, + "node_modules/@antv/util": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@antv/util/-/util-2.0.17.tgz", + "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", + "dependencies": { + "csstype": "^3.0.8", + "tslib": "^2.0.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.3.tgz", + "integrity": "sha512-iB4ElZT0jAt7PKVaeVulOECdGe6UnmA/O0P9jlF5g5GBOwDVbna8AXhHRu4s27xQf6OkveyA8iTDv1jHdDejgQ==", + "dev": true, + "dependencies": { + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.11.0", + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", + "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz", + "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz", + "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz", + "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "regexpu-core": "^4.7.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", + "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", + "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz", + "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-wrap-function": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz", + "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.3", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", + "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz", + "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz", + "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", + "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.16.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", + "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz", + "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.4.tgz", + "integrity": "sha512-RESBNX16eNqnBeEVR5sCJpnW0mHiNLNNvGA8PrRuK/4ZJ4TO+6bHleRUuGQYDERVySOKtOhSya/C4MIhwAMAgg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-decorators": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz", + "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz", + "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz", + "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz", + "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz", + "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz", + "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz", + "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz", + "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz", + "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz", + "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz", + "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz", + "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.0.tgz", + "integrity": "sha512-nxnnngZClvlY13nHJAIDow0S7Qzhq64fQ/NlqS+VER3kjW/4F0jLhXjeL8jcwSwz6Ca3rotT5NJD2T9I7lcv7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz", + "integrity": "sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz", + "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", + "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz", + "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz", + "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz", + "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz", + "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz", + "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz", + "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz", + "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz", + "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz", + "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz", + "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz", + "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz", + "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz", + "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz", + "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.16.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz", + "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.15.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz", + "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz", + "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz", + "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz", + "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", + "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz", + "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz", + "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz", + "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz", + "integrity": "sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz", + "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz", + "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz", + "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz", + "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz", + "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz", + "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz", + "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", + "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.4", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-class-static-block": "^7.16.0", + "@babel/plugin-proposal-dynamic-import": "^7.16.0", + "@babel/plugin-proposal-export-namespace-from": "^7.16.0", + "@babel/plugin-proposal-json-strings": "^7.16.0", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-object-rest-spread": "^7.16.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.0", + "@babel/plugin-transform-async-to-generator": "^7.16.0", + "@babel/plugin-transform-block-scoped-functions": "^7.16.0", + "@babel/plugin-transform-block-scoping": "^7.16.0", + "@babel/plugin-transform-classes": "^7.16.0", + "@babel/plugin-transform-computed-properties": "^7.16.0", + "@babel/plugin-transform-destructuring": "^7.16.0", + "@babel/plugin-transform-dotall-regex": "^7.16.0", + "@babel/plugin-transform-duplicate-keys": "^7.16.0", + "@babel/plugin-transform-exponentiation-operator": "^7.16.0", + "@babel/plugin-transform-for-of": "^7.16.0", + "@babel/plugin-transform-function-name": "^7.16.0", + "@babel/plugin-transform-literals": "^7.16.0", + "@babel/plugin-transform-member-expression-literals": "^7.16.0", + "@babel/plugin-transform-modules-amd": "^7.16.0", + "@babel/plugin-transform-modules-commonjs": "^7.16.0", + "@babel/plugin-transform-modules-systemjs": "^7.16.0", + "@babel/plugin-transform-modules-umd": "^7.16.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", + "@babel/plugin-transform-new-target": "^7.16.0", + "@babel/plugin-transform-object-super": "^7.16.0", + "@babel/plugin-transform-parameters": "^7.16.3", + "@babel/plugin-transform-property-literals": "^7.16.0", + "@babel/plugin-transform-regenerator": "^7.16.0", + "@babel/plugin-transform-reserved-words": "^7.16.0", + "@babel/plugin-transform-shorthand-properties": "^7.16.0", + "@babel/plugin-transform-spread": "^7.16.0", + "@babel/plugin-transform-sticky-regex": "^7.16.0", + "@babel/plugin-transform-template-literals": "^7.16.0", + "@babel/plugin-transform-typeof-symbol": "^7.16.0", + "@babel/plugin-transform-unicode-escapes": "^7.16.0", + "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.0", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.19.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", + "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.3", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@commitlint/cli": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-11.0.0.tgz", + "integrity": "sha512-YWZWg1DuqqO5Zjh7vUOeSX76vm0FFyz4y0cpGMFhrhvUi5unc4IVfCXZ6337R9zxuBtmveiRuuhQqnRRer+13g==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.11.2", + "@commitlint/format": "^11.0.0", + "@commitlint/lint": "^11.0.0", + "@commitlint/load": "^11.0.0", + "@commitlint/read": "^11.0.0", + "chalk": "4.1.0", + "core-js": "^3.6.1", + "get-stdin": "8.0.0", + "lodash": "^4.17.19", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^15.1.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@commitlint/cli/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@commitlint/cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@commitlint/cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-11.0.0.tgz", + "integrity": "sha512-SNDRsb5gLuDd2PL83yCOQX6pE7gevC79UPFx+GLbLfw6jGnnbO9/tlL76MLD8MOViqGbo7ZicjChO9Gn+7tHhA==", + "dev": true, + "dependencies": { + "conventional-changelog-conventionalcommits": "^4.3.1" + }, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/ensure": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-11.0.0.tgz", + "integrity": "sha512-/T4tjseSwlirKZdnx4AuICMNNlFvRyPQimbZIOYujp9DSO6XRtOy9NrmvWujwHsq9F5Wb80QWi4WMW6HMaENug==", + "dev": true, + "dependencies": { + "@commitlint/types": "^11.0.0", + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz", + "integrity": "sha512-g01p1g4BmYlZ2+tdotCavrMunnPFPhTzG1ZiLKTCYrooHRbmvqo42ZZn4QMStUEIcn+jfLb6BRZX3JzIwA1ezQ==", + "dev": true, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/format": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-11.0.0.tgz", + "integrity": "sha512-bpBLWmG0wfZH/svzqD1hsGTpm79TKJWcf6EXZllh2J/LSSYKxGlv967lpw0hNojme0sZd4a/97R3qA2QHWWSLg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^11.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/format/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@commitlint/format/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/format/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@commitlint/format/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@commitlint/format/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/format/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-11.0.0.tgz", + "integrity": "sha512-VLHOUBN+sOlkYC4tGuzE41yNPO2w09sQnOpfS+pSPnBFkNUUHawEuA44PLHtDvQgVuYrMAmSWFQpWabMoP5/Xg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^11.0.0", + "semver": "7.3.2" + }, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/lint": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-11.0.0.tgz", + "integrity": "sha512-Q8IIqGIHfwKr8ecVZyYh6NtXFmKw4YSEWEr2GJTB/fTZXgaOGtGFZDWOesCZllQ63f1s/oWJYtVv5RAEuwN8BQ==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^11.0.0", + "@commitlint/parse": "^11.0.0", + "@commitlint/rules": "^11.0.0", + "@commitlint/types": "^11.0.0" + }, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/load": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-11.0.0.tgz", + "integrity": "sha512-t5ZBrtgvgCwPfxmG811FCp39/o3SJ7L+SNsxFL92OR4WQxPcu6c8taD0CG2lzOHGuRyuMxZ7ps3EbngT2WpiCg==", + "dev": true, + "dependencies": { + "@commitlint/execute-rule": "^11.0.0", + "@commitlint/resolve-extends": "^11.0.0", + "@commitlint/types": "^11.0.0", + "chalk": "4.1.0", + "cosmiconfig": "^7.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/load/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/load/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@commitlint/load/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@commitlint/load/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/load/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/message": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-11.0.0.tgz", + "integrity": "sha512-01ObK/18JL7PEIE3dBRtoMmU6S3ecPYDTQWWhcO+ErA3Ai0KDYqV5VWWEijdcVafNpdeUNrEMigRkxXHQLbyJA==", + "dev": true, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-11.0.0.tgz", + "integrity": "sha512-DekKQAIYWAXIcyAZ6/PDBJylWJ1BROTfDIzr9PMVxZRxBPc1gW2TG8fLgjZfBP5mc0cuthPkVi91KQQKGri/7A==", + "dev": true, + "dependencies": { + "conventional-changelog-angular": "^5.0.0", + "conventional-commits-parser": "^3.0.0" + }, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/read": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-11.0.0.tgz", + "integrity": "sha512-37V0V91GSv0aDzMzJioKpCoZw6l0shk7+tRG8RkW1GfZzUIytdg3XqJmM+IaIYpaop0m6BbZtfq+idzUwJnw7g==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^11.0.0", + "fs-extra": "^9.0.0", + "git-raw-commits": "^2.0.0" + }, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-11.0.0.tgz", + "integrity": "sha512-WinU6Uv6L7HDGLqn/To13KM1CWvZ09VHZqryqxXa1OY+EvJkfU734CwnOEeNlSCK7FVLrB4kmodLJtL1dkEpXw==", + "dev": true, + "dependencies": { + "import-fresh": "^3.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/rules": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-11.0.0.tgz", + "integrity": "sha512-2hD9y9Ep5ZfoNxDDPkQadd2jJeocrwC4vJ98I0g8pNYn/W8hS9+/FuNpolREHN8PhmexXbkjrwyQrWbuC0DVaA==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^11.0.0", + "@commitlint/message": "^11.0.0", + "@commitlint/to-lines": "^11.0.0", + "@commitlint/types": "^11.0.0" + }, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-11.0.0.tgz", + "integrity": "sha512-TIDTB0Y23jlCNubDROUVokbJk6860idYB5cZkLWcRS9tlb6YSoeLn1NLafPlrhhkkkZzTYnlKYzCVrBNVes1iw==", + "dev": true, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/top-level": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-11.0.0.tgz", + "integrity": "sha512-O0nFU8o+Ws+py5pfMQIuyxOtfR/kwtr5ybqTvR+C2lUPer2x6lnQU+OnfD7hPM+A+COIUZWx10mYQvkR3MmtAA==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/types": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz", + "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==", + "dev": true, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@element-plus/icons": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@element-plus/icons/-/icons-0.0.11.tgz", + "integrity": "sha512-iKQXSxXu131Ai+I9Ymtcof9WId7kaXvB1+WRfAfpQCW7UiAMYgdNDqb/u0hgTo2Yq3MwC4MWJnNuTBEpG8r7+A==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info." + }, + "node_modules/@element-plus/icons-vue": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-0.2.4.tgz", + "integrity": "sha512-RsJNyL58rwxtsjeMy34o8txkL6UlME1stWsUlRpTac6UE9Bx9gdJvnDXbIKhOJqBLX17fBjmposdrn6VTqim2w==", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "deprecated": "Moved to 'npm install @sideway/address'", + "dev": true + }, + "node_modules/@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true + }, + "node_modules/@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true + }, + "node_modules/@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "deprecated": "Switch to 'npm install joi'", + "dev": true, + "dependencies": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "node_modules/@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true, + "dependencies": { + "@hapi/hoek": "^8.3.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@intervolga/optimize-cssnano-plugin": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", + "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", + "dev": true, + "dependencies": { + "cssnano": "^4.0.0", + "cssnano-preset-default": "^4.0.0", + "postcss": "^7.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "dependencies": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.scandir/node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true + }, + "node_modules/@popperjs/core": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.0.tgz", + "integrity": "sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@probe.gl/stats": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-3.4.1.tgz", + "integrity": "sha512-1Ol5cH8MQqIrGNgU4NCBj2cw1qiXYfHP1QCFX+u/xyrvgwLkPrOGkdSYMzw4VKTjJzNae4i7urOTf2m2hduZzQ==", + "dependencies": { + "@babel/runtime": "^7.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.1.tgz", + "integrity": "sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", + "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "error-stack-parser": "^2.0.6", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@soda/get-current-script": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@soda/get-current-script/-/get-current-script-1.0.2.tgz", + "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/d3-timer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-2.0.1.tgz", + "integrity": "sha512-TF8aoF5cHcLO7W7403blM7L1T+6NF3XMyN3fxyUolq2uOcFeicG/khQg/dGxiCJWoAcmYulYN7LYSRKO54IXaA==" + }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.26", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.26.tgz", + "integrity": "sha512-zeu3tpouA043RHxW0gzRxwCHchMgftE8GArRsvYT0ByDMbn19olQHx5jLue0LxWY6iYtXb7rXmuVtSkhy9YZvQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", + "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "16.11.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", + "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "node_modules/@types/tapable": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==", + "dev": true + }, + "node_modules/@types/throttle-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz", + "integrity": "sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==", + "dev": true + }, + "node_modules/@types/uglify-js": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/webpack": { + "version": "4.41.32", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.32.tgz", + "integrity": "sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-dev-server": { + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz", + "integrity": "sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ==", + "dev": true, + "dependencies": { + "@types/connect-history-api-fallback": "*", + "@types/express": "*", + "@types/serve-static": "*", + "@types/webpack": "^4", + "http-proxy-middleware": "^1.0.0" + } + }, + "node_modules/@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz", + "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==", + "dev": true + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", + "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==", + "dev": true + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz", + "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "@vue/babel-helper-vue-transform-on": "^1.0.2", + "camelcase": "^6.0.0", + "html-tags": "^3.1.0", + "svg-tags": "^1.0.0" + } + }, + "node_modules/@vue/babel-plugin-transform-vue-jsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz", + "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-plugin-transform-vue-jsx/node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/babel-preset-app": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.15.tgz", + "integrity": "sha512-J+YttzvwRfV1BPczf8r3qCevznYk+jh531agVF+5EYlHF4Sgh/cGXTz9qkkiux3LQgvhEGXgmCteg1n38WuuKg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.0", + "@babel/helper-compilation-targets": "^7.9.6", + "@babel/helper-module-imports": "^7.8.3", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.11.0", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.0", + "@vue/babel-plugin-jsx": "^1.0.3", + "@vue/babel-preset-jsx": "^1.2.4", + "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.6.5", + "core-js-compat": "^3.6.5", + "semver": "^6.1.0" + }, + "peerDependencies": { + "@babel/core": "*", + "core-js": "^3", + "vue": "^2 || ^3.0.0-0" + }, + "peerDependenciesMeta": { + "core-js": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-preset-jsx": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz", + "integrity": "sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==", + "dev": true, + "dependencies": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "@vue/babel-sugar-composition-api-inject-h": "^1.2.1", + "@vue/babel-sugar-composition-api-render-instance": "^1.2.4", + "@vue/babel-sugar-functional-vue": "^1.2.2", + "@vue/babel-sugar-inject-h": "^1.2.2", + "@vue/babel-sugar-v-model": "^1.2.3", + "@vue/babel-sugar-v-on": "^1.2.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-composition-api-inject-h": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz", + "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-composition-api-render-instance": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz", + "integrity": "sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-functional-vue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz", + "integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-inject-h": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz", + "integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz", + "integrity": "sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/babel-sugar-v-model/node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/babel-sugar-v-on": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz", + "integrity": "sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-on/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/cli-overlay": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-4.5.15.tgz", + "integrity": "sha512-0zI0kANAVmjFO2LWGUIzdGPMeE3+9k+KeRDXsUqB30YfRF7abjfiiRPq5BU9pOzlJbVdpRkisschBrvdJqDuDg==", + "dev": true + }, + "node_modules/@vue/cli-plugin-babel": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.15.tgz", + "integrity": "sha512-hBLrwYfFkHldEe34op/YNgPhpOWI5n5DB2Qt9I/1Epeif4M4iFaayrgjvOR9AVM6WbD3Yx7WCFszYpWrQZpBzQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.0", + "@vue/babel-preset-app": "^4.5.15", + "@vue/cli-shared-utils": "^4.5.15", + "babel-loader": "^8.1.0", + "cache-loader": "^4.1.0", + "thread-loader": "^2.1.3", + "webpack": "^4.0.0" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0-0" + } + }, + "node_modules/@vue/cli-plugin-router": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.5.15.tgz", + "integrity": "sha512-q7Y6kP9b3k55Ca2j59xJ7XPA6x+iSRB+N4ac0ZbcL1TbInVQ4j5wCzyE+uqid40hLy4fUdlpl4X9fHJEwuVxPA==", + "dev": true, + "dependencies": { + "@vue/cli-shared-utils": "^4.5.15" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0-0" + } + }, + "node_modules/@vue/cli-plugin-vuex": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.15.tgz", + "integrity": "sha512-fqap+4HN+w+InDxlA3hZTOGE0tzBTgXhKLoDydhywqgmhQ1D9JA6Feh94ze6tG8DsWX58/ujYUqA8jAz17FJtg==", + "dev": true, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0-0" + } + }, + "node_modules/@vue/cli-service": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-4.5.15.tgz", + "integrity": "sha512-sFWnLYVCn4zRfu45IcsIE9eXM0YpDV3S11vlM2/DVbIPAGoYo5ySpSof6aHcIvkeGsIsrHFpPHzNvDZ/efs7jA==", + "dev": true, + "dependencies": { + "@intervolga/optimize-cssnano-plugin": "^1.0.5", + "@soda/friendly-errors-webpack-plugin": "^1.7.1", + "@soda/get-current-script": "^1.0.0", + "@types/minimist": "^1.2.0", + "@types/webpack": "^4.0.0", + "@types/webpack-dev-server": "^3.11.0", + "@vue/cli-overlay": "^4.5.15", + "@vue/cli-plugin-router": "^4.5.15", + "@vue/cli-plugin-vuex": "^4.5.15", + "@vue/cli-shared-utils": "^4.5.15", + "@vue/component-compiler-utils": "^3.1.2", + "@vue/preload-webpack-plugin": "^1.1.0", + "@vue/web-component-wrapper": "^1.2.0", + "acorn": "^7.4.0", + "acorn-walk": "^7.1.1", + "address": "^1.1.2", + "autoprefixer": "^9.8.6", + "browserslist": "^4.12.0", + "cache-loader": "^4.1.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "cli-highlight": "^2.1.4", + "clipboardy": "^2.3.0", + "cliui": "^6.0.0", + "copy-webpack-plugin": "^5.1.1", + "css-loader": "^3.5.3", + "cssnano": "^4.1.10", + "debug": "^4.1.1", + "default-gateway": "^5.0.5", + "dotenv": "^8.2.0", + "dotenv-expand": "^5.1.0", + "file-loader": "^4.2.0", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "hash-sum": "^2.0.0", + "html-webpack-plugin": "^3.2.0", + "launch-editor-middleware": "^2.2.1", + "lodash.defaultsdeep": "^4.6.1", + "lodash.mapvalues": "^4.6.0", + "lodash.transform": "^4.6.0", + "mini-css-extract-plugin": "^0.9.0", + "minimist": "^1.2.5", + "pnp-webpack-plugin": "^1.6.4", + "portfinder": "^1.0.26", + "postcss-loader": "^3.0.0", + "ssri": "^8.0.1", + "terser-webpack-plugin": "^1.4.4", + "thread-loader": "^2.1.3", + "url-loader": "^2.2.0", + "vue-loader": "^15.9.2", + "vue-style-loader": "^4.1.2", + "webpack": "^4.0.0", + "webpack-bundle-analyzer": "^3.8.0", + "webpack-chain": "^6.4.0", + "webpack-dev-server": "^3.11.0", + "webpack-merge": "^4.2.2" + }, + "bin": { + "vue-cli-service": "bin/vue-cli-service.js" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "vue-loader-v16": "npm:vue-loader@^16.1.0" + }, + "peerDependencies": { + "@vue/compiler-sfc": "^3.0.0-beta.14", + "vue-template-compiler": "^2.0.0" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + }, + "less-loader": { + "optional": true + }, + "pug-plain-loader": { + "optional": true + }, + "raw-loader": { + "optional": true + }, + "sass-loader": { + "optional": true + }, + "stylus-loader": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/@vue/cli-service/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/@vue/cli-service/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@vue/cli-service/node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/cli-service/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@vue/cli-service/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@vue/cli-service/node_modules/webpack-bundle-analyzer": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz", + "integrity": "sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.19", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 6.14.4" + } + }, + "node_modules/@vue/cli-service/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/@vue/cli-shared-utils": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.5.15.tgz", + "integrity": "sha512-SKaej9hHzzjKSOw1NlFmc6BSE0vcqUQMQiv1cxQ2DhVyy4QxZXBmzmiLBUBe+hYZZs1neXW7n//udeN9bCAY+Q==", + "dev": true, + "dependencies": { + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.2", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "node-ipc": "^9.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "read-pkg": "^5.1.1", + "request": "^2.88.2", + "semver": "^6.1.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.23.tgz", + "integrity": "sha512-4ZhiI/orx+7EJ1B+0zjgvXMV2uRN+XBfG06UN2sJfND9rH5gtEQT3QmO4erum1o6Irl7y754W8/KSaDJh4EUQg==", + "dependencies": { + "@babel/parser": "^7.15.0", + "@vue/shared": "3.2.23", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.23.tgz", + "integrity": "sha512-X2Nw8QFc5lgoK3kio5ktM95nqmLUH+q+N/PbV4kCHzF1avqv/EGLnAhaaF0Iu4bewNvHJAAhhwPZFeoV/22nbw==", + "dependencies": { + "@vue/compiler-core": "3.2.23", + "@vue/shared": "3.2.23" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.23.tgz", + "integrity": "sha512-Aw+pb50Q5zTjyvWod8mNKmYZDRGHJBptmNNWE+84ZxrzEztPgMz8cNYIzWGbwcFVkmJlhvioAMvKnB+LM/sjSA==", + "dependencies": { + "@babel/parser": "^7.15.0", + "@vue/compiler-core": "3.2.23", + "@vue/compiler-dom": "3.2.23", + "@vue/compiler-ssr": "3.2.23", + "@vue/ref-transform": "3.2.23", + "@vue/shared": "3.2.23", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/@vue/compiler-sfc/node_modules/postcss": { + "version": "8.4.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz", + "integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==", + "dependencies": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.23.tgz", + "integrity": "sha512-Bqzn4jFyXPK1Ehqiq7e/czS8n62gtYF1Zfeu0DrR5uv+SBllh7LIvZjZU6+c8qbocAd3/T3I3gn2cZGmnDb6zg==", + "dependencies": { + "@vue/compiler-dom": "3.2.23", + "@vue/shared": "3.2.23" + } + }, + "node_modules/@vue/component-compiler-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", + "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", + "dev": true, + "dependencies": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.36", + "postcss-selector-parser": "^6.0.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "optionalDependencies": { + "prettier": "^1.18.2 || ^2.0.0" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "node_modules/@vue/devtools-api": { + "version": "6.0.0-beta.20.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.0.0-beta.20.1.tgz", + "integrity": "sha512-R2rfiRY+kZugzWh9ZyITaovx+jpU4vgivAEAiz80kvh3yviiTU3CBuGuyWpSwGz9/C7TkSWVM/FtQRGlZ16n8Q==" + }, + "node_modules/@vue/preload-webpack-plugin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", + "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "html-webpack-plugin": ">=2.26.0", + "webpack": ">=4.0.0" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.23.tgz", + "integrity": "sha512-8RGVr/5Kpgb/EkCjgHXqttgA5IMc6n0lIXFY4TVbMkzdXrvaIhzBd7Te44oIDsTSYVKZLpfHd6/wEnuDqE8vFw==", + "dependencies": { + "@vue/shared": "3.2.23" + } + }, + "node_modules/@vue/ref-transform": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.23.tgz", + "integrity": "sha512-gW0GD2PSAs/th7mC7tPB/UwpIQxclbApVtsDtscDmOJXb2+cdu60ny+SuHNgfrlUT/JqWKQHq7jFKO4woxLNaA==", + "dependencies": { + "@babel/parser": "^7.15.0", + "@vue/compiler-core": "3.2.23", + "@vue/shared": "3.2.23", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.23.tgz", + "integrity": "sha512-wSI5lmY2kCGLf89iiygqxVh6/5bsawz78Me9n1x4U2bHnN0yf3PWyuhN0WgIE8VfEaF7e75E333uboNEIFjgkg==", + "dependencies": { + "@vue/reactivity": "3.2.23", + "@vue/shared": "3.2.23" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.23.tgz", + "integrity": "sha512-z6lp0888NkLmxD9j2sGoll8Kb7J743s8s6w7GbiyUc4WZwm0KJ35B4qTFDMoIU0G7CatS6Z+yRTpPHc6srtByg==", + "dependencies": { + "@vue/runtime-core": "3.2.23", + "@vue/shared": "3.2.23", + "csstype": "^2.6.8" + } + }, + "node_modules/@vue/runtime-dom/node_modules/csstype": { + "version": "2.6.19", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", + "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" + }, + "node_modules/@vue/server-renderer": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.23.tgz", + "integrity": "sha512-mgQ2VAE5WjeZELJKNbwE69uiBNpN+3LyL0ZDki1bJWVwHD2fhPfx7pwyYuiucE81xz2LxVsyGxhKKUL997g8vw==", + "dependencies": { + "@vue/compiler-ssr": "3.2.23", + "@vue/shared": "3.2.23" + }, + "peerDependencies": { + "vue": "3.2.23" + } + }, + "node_modules/@vue/shared": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.23.tgz", + "integrity": "sha512-U+/Jefa0QfXUF2qVy9Dqlrb6HKJSr9/wJcM66wXmWcTOoqg7hOWzF4qruDle51pyF4x3wMn6TSH54UdjKjCKMA==" + }, + "node_modules/@vue/web-component-wrapper": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz", + "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-7.1.2.tgz", + "integrity": "sha512-SLoOPfhZdNRNUkZfx+wrHj6WycWdSw2RmNS8E4ngQ2kmBoJjRarGy51/GkGdjqHQqmhuwuFoNO2WaU0yBn3ffg==", + "dependencies": { + "@vueuse/shared": "7.1.2", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.1.0", + "vue": "^2.6.0 || ^3.2.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vueuse/core/node_modules/@vueuse/shared": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-7.1.2.tgz", + "integrity": "sha512-AjYh4y9S5FMOoHDsysqcXY/1mpqNTrnWUD50yaaiyf+5kGWQVIpAkkjKZlYSC/NHKxxCRn0cLR4nWMzceUWewQ==", + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.1.0", + "vue": "^2.6.0 || ^3.2.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.12.1.tgz", + "integrity": "sha512-QL3ny+wX8c6Xm1/EZylbgzdoDolye+VpCXRhI2hug9dJTP3OUJ3lmiKN3CsVV3mOJKwFi0nsstbgob0vG7aoIw==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webgpu/glslang": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/@webgpu/glslang/-/glslang-0.0.15.tgz", + "integrity": "sha512-niT+Prh3Aff8Uf1MVBVUsaNjFj9rJAKDXuoHIKiQbB+6IUP/3J3JIhBNyZ7lDhytvXxw6ppgnwKZdDJ08UMj4Q==" + }, + "node_modules/@webgpu/types": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.0.31.tgz", + "integrity": "sha512-cvvCMSZBT4VsRNtt0lI6XQqvOIIWw6+NRUtnPUMDVDgsI4pCZColz3qzF5QcP9wIYOHEc3jssIBse8UWONKhlQ==" + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "dev": true, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/async-validator": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.0.7.tgz", + "integrity": "sha512-Pj2IR7u8hmUEDOwB++su6baaRi+QvsgajuFB9j95foM1N2gy5HM4z60hfusIO0fBPG5uLAEl6yCJr1jNSVugEQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dev": true, + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/babel-loader": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-import": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/babel-plugin-import/-/babel-plugin-import-1.13.3.tgz", + "integrity": "sha512-1qCWdljJOrDRH/ybaCZuDgySii4yYrtQ8OJQwrcDqdt0y67N30ng3X3nABg6j7gR7qUJgcMa9OMhc4AGViDwWw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/runtime": "^7.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", + "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.0", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", + "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.0", + "core-js-compat": "^3.18.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", + "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", + "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001280", + "electron-to-chromium": "^1.3.896", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/browserslist/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "node_modules/builtins": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-4.0.0.tgz", + "integrity": "sha512-qC0E2Dxgou1IHhvJSLwGDSTvokbRovU5zZFuDY6oY8Y2lF3nGt5Ad8YZK7GMtqzY84Wu7pXTPeHQeHcXSXsRhw==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/builtins/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/builtins/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/builtins/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/cacache/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "dev": true, + "dependencies": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001283", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz", + "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", + "dev": true + }, + "node_modules/cheetah-grid": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/cheetah-grid/-/cheetah-grid-1.1.10.tgz", + "integrity": "sha512-wYtcCMVtusNdUjQYO1M9JkP9ScrNBXCNtMg8jbTI1pO3MHGCPhkK/p8bF5D1isGCCrb1qAW8GrZLq/xSxBYJQw==" + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chokidar/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/chokidar/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/cli-highlight/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", + "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "dev": true, + "dependencies": { + "arch": "^2.1.1", + "execa": "^1.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coalescy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/coalescy/-/coalescy-1.0.0.tgz", + "integrity": "sha1-SwZYRrg2NhrabEtKSr9LwcrDG/E=", + "dev": true + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/color-string": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.8.2.tgz", + "integrity": "sha512-w5ZkKRdLsc5NOYsmnpS2DpyRW71npwZGwbRpLrJTuqjfTs2Bhrba7UiV59IX9siBlCPl2pne5NtiwnVWUzvYFA==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "dependencies": { + "bluebird": "^3.1.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.1.tgz", + "integrity": "sha512-lzWJpPZhbM1R0PIzkwzGBCnAkH5RKJzJfFQZcl/D+2lsJxAwGnDKBqn/F4C1RD31GJNn8NuKWQzAZDAVXPp2Mw==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.3.tgz", + "integrity": "sha512-YyRDR7On9H07ICFpRm/igcdjIqebXbvf4Cff+Pf0BrBys1i1EOzx9iFXNlAbdrLAR8jf7bkUYkDAr8pEy0q4Pw==", + "dev": true, + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dev": true, + "dependencies": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "node_modules/copy-webpack-plugin/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "3.19.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.2.tgz", + "integrity": "sha512-ciYCResnLIATSsXuXnIOH4CbdfgV+H1Ltg16hJFN7/v6OxqnFr/IFGeLacaZ+fHLAm0TBbXwNK9/DNBzBUrO/g==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.19.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.2.tgz", + "integrity": "sha512-ObBY1W5vx/LFFMaL1P5Udo4Npib6fu+cMokeziWkA8Tns4FcDemKF5j9JvaI5JhdkW8EQJQGJN1EcrzmEwuAqQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.18.1", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/css-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dev": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/csstype": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" + }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "node_modules/d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "node_modules/d3-dispatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", + "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==" + }, + "node_modules/d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "node_modules/d3-force": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-2.1.1.tgz", + "integrity": "sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==", + "dependencies": { + "d3-dispatch": "1 - 2", + "d3-quadtree": "1 - 2", + "d3-timer": "1 - 2" + } + }, + "node_modules/d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "dependencies": { + "d3-color": "1" + } + }, + "node_modules/d3-quadtree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-2.0.0.tgz", + "integrity": "sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==" + }, + "node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "node_modules/dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "dependencies": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "node_modules/dagrejs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/dagrejs/-/dagrejs-0.2.1.tgz", + "integrity": "sha512-4bb1y+4aM1xtkK7ieP0V7Xn/34GQfnCapl0yubrOMX8Qb/PIwM1Dii2uUBv/KtuzrQtxPliSP4r5MQBsnP6gNg==", + "dependencies": { + "graphlib": "^2.1.8", + "lodash": "^4.17.19" + } + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dayjs": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", + "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" + }, + "node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-5.0.5.tgz", + "integrity": "sha512-z2RnruVmj8hVMmAnEJMTIJNijhKCDiGjbLP+BHJFOT7ld3Bo5qcIBpVYDniqhbMIIf+jZDlkP2MkPXiQy/DBLA==", + "dev": true, + "dependencies": { + "execa": "^3.3.0" + }, + "engines": { + "node": "^8.12.0 || >=9.7.0" + } + }, + "node_modules/default-gateway/node_modules/execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": "^8.12.0 || >=9.7.0" + } + }, + "node_modules/default-gateway/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "node_modules/detect-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.2.1.tgz", + "integrity": "sha512-eAcRiEPTs7utXWPaAgu/OX1HRJpxW7xSHpw4LTDrGFaeWnJ37HRlqpUkKsDm0AoTbtrvHQhH+5U2Cd87EGhJTg==" + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dir-glob/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/easy-stack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", + "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/echarts": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.2.2.tgz", + "integrity": "sha512-yxuBfeIH5c+0FsoRP60w4De6omXhA06c7eUYBsC1ykB6Ys2yK5fSteIYWvkJ4xJVLQgCvAdO8C4mN6MLeJpBaw==", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.2.1" + } + }, + "node_modules/echarts/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "node_modules/ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true, + "hasInstallScript": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.5.tgz", + "integrity": "sha512-YKaB+t8ul5crdh6OeqT2qXdxJGI0fAYb6/X8pDIyye+c3a7ndOCk5gVeKX+ABwivCGNS56vOAif3TN0qJMpEHw==", + "dev": true + }, + "node_modules/element-plus": { + "version": "1.2.0-beta.6", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-1.2.0-beta.6.tgz", + "integrity": "sha512-8EdSIR/5/FHcSB8w1diAh+gJMHgxIvxuZoayY99k6taAR1QyEFHuPTgFccZLopJ1+iP4UEsZFz49l57qS08Utw==", + "dependencies": { + "@element-plus/icons-vue": "^0.2.2", + "@popperjs/core": "^2.10.2", + "@vueuse/core": "^7.0.0", + "async-validator": "^4.0.7", + "dayjs": "^1.10.7", + "lodash": "^4.17.21", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.1.1" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "dev": true, + "dependencies": { + "stackframe": "^1.1.1" + } + }, + "node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-friendly-formatter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-4.0.1.tgz", + "integrity": "sha1-J9UE3IN/fK3b8gGy6EpO5zC6Pvo=", + "dev": true, + "dependencies": { + "chalk": "^2.0.1", + "coalescy": "1.0.0", + "extend": "^3.0.0", + "minimist": "^1.2.0", + "strip-ansi": "^4.0.0", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-friendly-formatter/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-friendly-formatter/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-html": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-6.2.0.tgz", + "integrity": "sha512-vi3NW0E8AJombTvt8beMwkL1R/fdRWl4QSNRNMhVQKWm36/X0KF0unGNAY4mqUF06mnwVWZcIcerrCnfn9025g==", + "dev": true, + "dependencies": { + "htmlparser2": "^7.1.2" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz", + "integrity": "sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.1.0", + "natural-compare": "^1.4.0", + "semver": "^6.3.0", + "vue-eslint-parser": "^7.10.0" + }, + "engines": { + "node": ">=8.10" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "dev": true, + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/express/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "dependencies": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fecha": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", + "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", + "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", + "dev": true, + "dependencies": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "dev": true + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", + "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.10.tgz", + "integrity": "sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ==", + "dev": true, + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gl-matrix": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" + }, + "node_modules/gl-vec2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/gl-vec2/-/gl-vec2-1.3.0.tgz", + "integrity": "sha512-YiqaAuNsheWmUV0Sa8k94kBB0D6RWjwZztyO+trEYS8KzJ6OQB/4686gdrf59wld4hHFIvaxynO3nRxpk1Ij/A==" + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "deprecated": "3.x is no longer supported", + "dev": true, + "dependencies": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/html-webpack-plugin/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/http-parser-js": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", + "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", + "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/http-proxy-middleware/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/husky": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", + "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "dependencies": { + "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-meta-resolve": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-1.1.1.tgz", + "integrity": "sha512-JiTuIvVyPaUg11eTrNDx5bgQ/yMKMZffc7YSjvQeSMXy58DO2SQ8BtAf3xteZvmzvjYh14wnqNjL8XVeDy2o9A==", + "dev": true, + "dependencies": { + "builtins": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/insert-css": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-2.0.0.tgz", + "integrity": "sha1-610Ql7dUL0x56jBg067gfQU4gPQ=" + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-ip/node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/inversify": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-5.1.1.tgz", + "integrity": "sha512-j8grHGDzv1v+8T1sAQ+3boTCntFPfvxLCkNcxB1J8qA0lUN+fAlSyYd+RXKvaPRL4AGyPxViutBEJHNXOyUdFQ==" + }, + "node_modules/inversify-inject-decorators": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/inversify-inject-decorators/-/inversify-inject-decorators-3.1.0.tgz", + "integrity": "sha512-/seBlVp5bXrLQS3DpKEmlgeZL6C7Tf/QITd+IMQrbBBGuCbxb7k3hRAWu9XSreNpFzLgSboz3sClLSEmGwHphw==" + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-any-array": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-1.0.1.tgz", + "integrity": "sha512-m+FSiaONxBt2W0h9XOUngMBu/WW8uzAKbSk4Ty2aeCcQJ+muBqENexvxUHtDpX65fk5AMCROxqgNX0sSAHstcw==" + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "dev": true + }, + "node_modules/js-md5": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.7.3.tgz", + "integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==" + }, + "node_modules/js-message": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", + "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", + "dev": true, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/js-queue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.2.tgz", + "integrity": "sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==", + "dev": true, + "dependencies": { + "easy-stack": "^1.0.1" + }, + "engines": { + "node": ">=1.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/launch-editor": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.2.1.tgz", + "integrity": "sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw==", + "dev": true, + "dependencies": { + "chalk": "^2.3.0", + "shell-quote": "^1.6.1" + } + }, + "node_modules/launch-editor-middleware": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz", + "integrity": "sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg==", + "dev": true, + "dependencies": { + "launch-editor": "^2.2.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/lint-staged": { + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.4.tgz", + "integrity": "sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "commander": "^6.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.2.0", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^4.1.0", + "listr2": "^3.2.2", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/lint-staged/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lint-staged/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/lint-staged/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/lint-staged/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lint-staged/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lint-staged/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/listr2": { + "version": "3.13.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.13.5.tgz", + "integrity": "sha512-3n8heFQDSk+NcwBn3CgxEibZGaRzx+pC64n3YjpMD1qguV4nWus3Al+Oo3KooqFKTQEJ1v7MmnbnyyNspgx3NA==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.4.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/listr2/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/local-pkg": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.1.0.tgz", + "integrity": "sha512-WsR2tHvRGIxcC2clC30ECb5fjywzsjQagaHIy1+ykZaHz0ByoB0OL2riHqIYA5YYnensRXLszwbzHkhKzehZDg==", + "dev": true, + "dependencies": { + "mlly": "^0.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "node_modules/lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "node_modules/lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.transform": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", + "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-update/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.4.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/minipass": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", + "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mississippi/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ml-array-max": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/ml-array-max/-/ml-array-max-1.2.3.tgz", + "integrity": "sha512-49YwnLlAf4/E/VyezUz+SNfSBhPE8JTahxRPuyM9S9Uv+ft5x0C8A4trtkDgrttMxoxbhudTA1yg8zgJZaYtpA==", + "dependencies": { + "is-any-array": "^1.0.0" + } + }, + "node_modules/ml-array-min": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ml-array-min/-/ml-array-min-1.2.2.tgz", + "integrity": "sha512-yidQcOHFaGEuVr6FcwAn+QvKXJv1Lxel5fyKrO+aXGJGp97Mt+p8r21WYtikS/PTVbxdSrliQ0UK4wSHYHHgzQ==", + "dependencies": { + "is-any-array": "^1.0.0" + } + }, + "node_modules/ml-array-rescale": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/ml-array-rescale/-/ml-array-rescale-1.3.6.tgz", + "integrity": "sha512-Lzj45T6hvHNdht924JQhHzInIK+ilC55zn98uraZUvLBkOWOJGOztEkRM0xyzAjWvVuhpszLADOnoVwfBSnj8w==", + "dependencies": { + "is-any-array": "^1.0.0", + "ml-array-max": "^1.2.3", + "ml-array-min": "^1.2.2" + } + }, + "node_modules/ml-matrix": { + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.8.2.tgz", + "integrity": "sha512-5o2gVLFyieDSgsStEU5mqty4MZqfeytYA/gJqBSw5/Xuob0X2UrFX/k7FDh+YAwjzG/1l8nYa0oDaJ0sGs/RlA==", + "dependencies": { + "ml-array-rescale": "^1.3.6" + } + }, + "node_modules/mlly": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-0.2.10.tgz", + "integrity": "sha512-xfyW6c2QBGArtctzNnTV5leOKX8nOMz2simeubtXofdsdSJFSNw+Ncvrs8kxcN3pBrQLXuYBHNFV6NgZ5Ryf4A==", + "dev": true, + "dependencies": { + "import-meta-resolve": "^1.1.1" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true, + "optional": true + }, + "node_modules/nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-ipc": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.2.1.tgz", + "integrity": "sha512-mJzaM6O3xHf9VT8BULvJSbdVbmHUKRNOH7zDDkCrA1/T+CVjq2WVIDfLt0azZRXpgArJtl3rtmEozrbXPZ9GaQ==", + "dev": true, + "dependencies": { + "event-pubsub": "4.3.0", + "js-message": "1.0.7", + "js-queue": "2.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "dependencies": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/normalize-wheel-es": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.1.1.tgz", + "integrity": "sha512-157VNH4CngrcsvF8xOVOe22cwniIR3nxSltdctvQeHZj8JttEeOXffK28jucWfWBXs0QNetAumjc1GiInnwX4w==" + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/open/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/pnp-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==", + "dev": true, + "dependencies": { + "ts-pnp": "^1.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/polyline-miter-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/polyline-miter-util/-/polyline-miter-util-1.0.1.tgz", + "integrity": "sha1-tpPyOJ6g3tNqa89ezS7OS2kX2Vc=", + "dependencies": { + "gl-vec2": "^1.0.0" + } + }, + "node_modules/polyline-normals": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/polyline-normals/-/polyline-normals-2.0.2.tgz", + "integrity": "sha1-oXN+ddjA3MsaWR+csn8J7vS30TU=", + "dependencies": { + "polyline-miter-util": "^1.0.1" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-colormin/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-load-config/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-load-config/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-load-config/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-load-config/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "dependencies": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "dependencies": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-svgo/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prettier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz", + "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", + "dev": true, + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/probe.gl": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/probe.gl/-/probe.gl-3.4.1.tgz", + "integrity": "sha512-k/6YoZr6cBwnFpQLs/s4yZ8cCxapQzRrxl16EQg1b2wYXLlerDJ4PkNoQ3YDN9yu3Jcipipr+Avy1GRpyBF6ZA==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "@probe.gl/stats": "3.4.1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/regl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/regl/-/regl-1.7.0.tgz", + "integrity": "sha512-bEAtp/qrtKucxXSJkD4ebopFZYP0q1+3Vb2WECWv/T8yQEgKxDxJ7ztO285tAMaYZVR6mM1GgI6CCn8FROtL1w==" + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/rxjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "dev": true, + "dependencies": { + "tslib": "~2.1.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.44.0.tgz", + "integrity": "sha512-0hLREbHFXGQqls/K8X+koeP+ogFRPF4ZqetVB19b7Cst9Er8cOR0rc6RU7MaI4W1JmUShd1BPgPoeqmmgMMYFw==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sass-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz", + "integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0", + "sass": "^1.3.0", + "webpack": "^4.36.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/sass-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sass-loader/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sass-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/sass-loader/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sass-loader/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/sass-resources-loader": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-resources-loader/-/sass-resources-loader-2.2.4.tgz", + "integrity": "sha512-hIQhBygYky+rLf+4cuoGYONZ623CEH4Swo1fs1WRJkukbqdvN1VIu2KCL59du6vX92bNELzNkGPLx+NorN73xA==", + "dev": true, + "dependencies": { + "async": "^3.2.0", + "chalk": "^4.1.0", + "glob": "^7.1.6", + "loader-utils": "^2.0.0" + } + }, + "node_modules/sass-resources-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/sass-resources-loader/node_modules/async": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", + "dev": true + }, + "node_modules/sass-resources-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/sass-resources-loader/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/sass-resources-loader/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/sass-resources-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sass-resources-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sass-resources-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "node_modules/selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dev": true, + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/simple-uploader.js": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/simple-uploader.js/-/simple-uploader.js-0.5.6.tgz", + "integrity": "sha512-ukjL0wZhK1dNMaQa6sd+UpCSmnUjblaUGbAd/B8f5IFrChMzDsC/7eFSK4bs4BS5NPJFSZVLI+l6Ri7THTkQtw==" + }, + "node_modules/sirv": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.18.tgz", + "integrity": "sha512-f2AOPogZmXgJ9Ma2M22ZEhc1dNtRIzcEkiflMFeVTRq+OViOZMvH1IPMVOwrKaxpSaHioBJiDR0SluRqGa7atA==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", + "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", + "dev": true, + "dependencies": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.3" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/speed-measure-webpack-plugin": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-Re0wX5CtM6gW7bZA64ONOfEPEhwbiSF/vz6e2GvadjuaPrQcHTQdRGsD8+BE7iUOysXH8tIenkPCQBEcspXsNg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "webpack": "^1 || ^2 || ^3 || ^4 || ^5" + } + }, + "node_modules/speed-measure-webpack-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/speed-measure-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/speed-measure-webpack-plugin/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/speed-measure-webpack-plugin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/speed-measure-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/speed-measure-webpack-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/split2/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "node_modules/stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", + "dev": true + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stringify-object/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/style-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/style-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/svgo/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/table": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.3.tgz", + "integrity": "sha512-5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/table/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/table/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/thread-loader": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz", + "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==", + "dev": true, + "dependencies": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + }, + "engines": { + "node": ">= 6.9.0 <7.0.0 || >= 8.9.0" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "node_modules/tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==", + "engines": { + "node": "*" + } + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "node_modules/ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unplugin": { + "version": "0.2.21", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-0.2.21.tgz", + "integrity": "sha512-IJ15/L5XbhnV7J09Zjk0FT5HEkBjkXucWAXQWRsmEtUxmmxwh23yavrmDbCF6ZPxWiVB28+wnKIHePTRRpQPbQ==", + "dev": true, + "dependencies": { + "webpack-virtual-modules": "^0.4.3" + }, + "peerDependencies": { + "rollup": "^2.50.0", + "vite": "^2.3.0", + "webpack": "4 || 5" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.17.2.tgz", + "integrity": "sha512-e4ZdOpnzFMQJx3rDLotLyucTap0bUlMy+6BRYyoN6jE1ZyGAgR6jodmpHZAPR3xkC4pkqW5PLlyDfIH/+lzkng==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.3.0", + "@rollup/pluginutils": "^4.1.1", + "chokidar": "^3.5.2", + "debug": "^4.3.2", + "fast-glob": "^3.2.7", + "local-pkg": "^0.1.0", + "magic-string": "^0.25.7", + "minimatch": "^3.0.4", + "resolve": "^1.20.0", + "unplugin": "^0.2.13" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@babel/traverse": "^7.15.4", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@babel/traverse": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components/node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/unplugin-vue-components/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unplugin-vue-components/node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unplugin-vue-components/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unplugin-vue-components/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/unplugin-vue-components/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/unplugin-vue-components/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/unplugin-vue-components/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-loader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", + "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "dev": true, + "dependencies": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/vue": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.23.tgz", + "integrity": "sha512-MGp9JZC37lzGhwSu6c1tQxrQbXbw7XKFqtYh7SFwNrNK899FPxGAHwSHMZijMChTSC3uZrD2BGO/3EHOgMJ0cw==", + "dependencies": { + "@vue/compiler-dom": "3.2.23", + "@vue/compiler-sfc": "3.2.23", + "@vue/runtime-dom": "3.2.23", + "@vue/server-renderer": "3.2.23", + "@vue/shared": "3.2.23" + } + }, + "node_modules/vue-cheetah-grid": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/vue-cheetah-grid/-/vue-cheetah-grid-1.1.11.tgz", + "integrity": "sha512-R92Mel9Y/+D7T229Aen0PtyDVukVnf3hpC3lH65Le0UfrtkXnKIZov6Z6t3kVkQ218/VRnnFTD9i2K2UXNvRXQ==", + "dependencies": { + "cheetah-grid": "^1.1.3" + }, + "peerDependencies": { + "vue": "^2.5.16 || ^3.0.0" + } + }, + "node_modules/vue-eslint-parser": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz", + "integrity": "sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8.10" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/vue-eslint-parser/node_modules/espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "node_modules/vue-loader": { + "version": "15.9.8", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.8.tgz", + "integrity": "sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==", + "dev": true, + "dependencies": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "peerDependencies": { + "css-loader": "*", + "webpack": "^3.0.0 || ^4.1.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "cache-loader": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/vue-loader-v16": { + "name": "vue-loader", + "version": "16.8.3", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", + "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", + "dev": true, + "optional": true, + "dependencies": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "peerDependencies": { + "webpack": "^4.1.0 || ^5.0.0-0" + } + }, + "node_modules/vue-loader-v16/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/vue-loader-v16/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/vue-loader-v16/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/vue-loader-v16/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true + }, + "node_modules/vue-loader-v16/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/vue-loader-v16/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "optional": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/vue-loader-v16/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vue-loader/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "node_modules/vue-router": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.12.tgz", + "integrity": "sha512-CPXvfqe+mZLB1kBWssssTiWg4EQERyqJZes7USiqfW9B5N2x+nHlnsM1D3b5CaJ6qgCvMmYJnz+G0iWjNCvXrg==", + "dependencies": { + "@vue/devtools-api": "^6.0.0-beta.18" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "dependencies": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "node_modules/vue-style-loader/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "node_modules/vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "node_modules/vue3-virtual-list": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vue3-virtual-list/-/vue3-virtual-list-1.0.2.tgz", + "integrity": "sha512-WzJPe785hQqAWwVWsRoxUuZ0cLrI8rdQHjthE3a4Izl3l6YcgSELpjKKhhq/C1dXS1QfakjQON7Z4wb387yDhw==", + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vuex": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.0.2.tgz", + "integrity": "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==", + "dependencies": { + "@vue/devtools-api": "^6.0.0-beta.11" + }, + "peerDependencies": { + "vue": "^3.0.2" + } + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "dev": true, + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-chain": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "dev": true, + "dependencies": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", + "dev": true, + "dependencies": { + "ansi-html-community": "0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-log/node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.3.tgz", + "integrity": "sha512-5NUqC2JquIL2pBAAo/VfBP6KuGkHIZQXW/lNKupLPfhViwh8wNsu0BObtl09yuKZszeEUfbXz8xhrHvSG16Nqw==", + "dev": true + }, + "node_modules/webpack/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/welabx-g6": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/welabx-g6/-/welabx-g6-0.6.8.tgz", + "integrity": "sha512-Ljn7FKxNmIWWq2DeriE4NN0WCjQ7Qomw21Z+NQWnD7RyJgWHZSBnF4mplvPfytit8AVlC3oOF+DkNjsvWjR8kA==", + "dependencies": { + "@antv/g6": "^4.3.6", + "insert-css": "^2.0.0" + }, + "engines": { + "node": ">= 8.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zrender": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.2.1.tgz", + "integrity": "sha512-M3bPGZuyLTNBC6LiNKXJwSCtglMp8XUEqEBG+2MdICDI3d1s500Y4P0CzldQGsqpRVB7fkvf3BKQQRxsEaTlsw==", + "dependencies": { + "tslib": "2.3.0" + } + }, + "node_modules/zrender/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + }, + "dependencies": { + "@ant-design/colors": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-4.0.5.tgz", + "integrity": "sha512-3mnuX2prnWOWvpFTS2WH2LoouWlOgtnIpc6IarWN6GOzzLF8dW/U8UctuvIPhoboETehZfJ61XP+CGakBEPJ3Q==", + "requires": { + "tinycolor2": "^1.4.1" + } + }, + "@antfu/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-UU8TLr/EoXdg7OjMp0h9oDoIAVr+Z/oW9cpOxQQyrsz6Qzd2ms/1CdWx8fl2OQdFpxGmq5Vc4TwfLHId6nAZjA==", + "dev": true, + "requires": { + "@types/throttle-debounce": "^2.1.0" + } + }, + "@antv/algorithm": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/@antv/algorithm/-/algorithm-0.1.13.tgz", + "integrity": "sha512-AXHybK/OQlbk99Qgj7Dix3hNsIP+GvpVS4Oisb9gJkCBZLML9lZIM2/0m/MRqLvVxoIyglEg6aNjGUWBRMGRRQ==", + "requires": { + "@antv/util": "^2.0.13", + "tslib": "^2.0.0" + } + }, + "@antv/dom-util": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@antv/dom-util/-/dom-util-2.0.3.tgz", + "integrity": "sha512-dUHsUT4U9X1T1/Y9bH3jRMe0MzvWJk2jSQm1vm3w9NX+Ra0ftq5VUBiGTNbthm3nFwG0fFFjip904rYjl50g4A==", + "requires": { + "tslib": "^2.0.3" + } + }, + "@antv/event-emitter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@antv/event-emitter/-/event-emitter-0.1.2.tgz", + "integrity": "sha512-6C6NJOdoNVptCr5y9BVOhKkCgW7LFs/SpcRyAExUeSjAm0zJqcqNkSIRGsXYhj4PJI+CZICHzGwwiSnIsE68Ug==" + }, + "@antv/g-base": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@antv/g-base/-/g-base-0.5.9.tgz", + "integrity": "sha512-IAzuCLRmz9cKCWUKR3cKWgLZ/6OQYpTCIOgxAP8Bc+HRw0mu8iC3OTz+tWKGv9L8unpvCvpQd1H+OTTjdg/TpQ==", + "requires": { + "@antv/event-emitter": "^0.1.1", + "@antv/g-math": "^0.1.6", + "@antv/matrix-util": "^3.1.0-beta.1", + "@antv/path-util": "~2.0.5", + "@antv/util": "~2.0.0", + "@types/d3-timer": "^2.0.0", + "d3-ease": "^1.0.5", + "d3-interpolate": "^1.3.2", + "d3-timer": "^1.0.9", + "detect-browser": "^5.1.0", + "tslib": "^2.0.3" + } + }, + "@antv/g-canvas": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/@antv/g-canvas/-/g-canvas-0.5.12.tgz", + "integrity": "sha512-iJ/muwwqCCNONVlPIzv/7OL5iLguaKRj2BxNMytUO3TWwamM+kHkiyYEOkS0dPn9h/hBsHYlLUluSVz2Fp6/bw==", + "requires": { + "@antv/g-base": "^0.5.3", + "@antv/g-math": "^0.1.6", + "@antv/matrix-util": "^3.1.0-beta.1", + "@antv/path-util": "~2.0.5", + "@antv/util": "~2.0.0", + "gl-matrix": "^3.0.0", + "tslib": "^2.0.3" + } + }, + "@antv/g-math": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@antv/g-math/-/g-math-0.1.7.tgz", + "integrity": "sha512-xGyXaloD1ynfp7gS4VuV+MjSptZIwHvLHr8ekXJSFAeWPYLu84yOW2wOZHDdp1bzDAIuRv6xDBW58YGHrWsFcA==", + "requires": { + "@antv/util": "~2.0.0", + "gl-matrix": "^3.0.0" + } + }, + "@antv/g-svg": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@antv/g-svg/-/g-svg-0.5.6.tgz", + "integrity": "sha512-Xve1EUGk4HMbl2nq4ozR4QLh6GyoZ8Xw/+9kHYI4B5P2lIUQU95MuRsaLFfW5NNpZDx85ZeH97tqEmC9L96E7A==", + "requires": { + "@antv/g-base": "^0.5.3", + "@antv/g-math": "^0.1.6", + "@antv/util": "~2.0.0", + "detect-browser": "^5.0.0", + "tslib": "^2.0.3" + } + }, + "@antv/g-webgpu": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@antv/g-webgpu/-/g-webgpu-0.5.5.tgz", + "integrity": "sha512-TxtBniINFq1jFGEPo46xjJfrbJbUqkFd5wmsRs3tcg/7J7xoldOP1kEadpI3AJG9knMYdE92VpILw1VPd6DgzQ==", + "requires": { + "@antv/g-webgpu-core": "^0.5.5", + "@antv/g-webgpu-engine": "^0.5.5", + "@webgpu/types": "^0.0.31", + "gl-matrix": "^3.1.0", + "gl-vec2": "^1.3.0", + "hammerjs": "^2.0.8", + "inversify": "^5.0.1", + "inversify-inject-decorators": "^3.1.0", + "polyline-miter-util": "^1.0.1", + "polyline-normals": "^2.0.2", + "probe.gl": "^3.1.1", + "reflect-metadata": "^0.1.13" + } + }, + "@antv/g-webgpu-core": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@antv/g-webgpu-core/-/g-webgpu-core-0.5.6.tgz", + "integrity": "sha512-DPiH3GkAUiT0Q+LAKeImpI+IOQ/gP2w6HstYKivpFIpBPIvZ/9equM3icVrn1iDfDkZANVXQ1PppcO3xBv1ZTw==", + "requires": { + "eventemitter3": "^4.0.0", + "gl-matrix": "^3.1.0", + "inversify": "^5.0.1", + "inversify-inject-decorators": "^3.1.0", + "probe.gl": "^3.1.1", + "reflect-metadata": "^0.1.13" + } + }, + "@antv/g-webgpu-engine": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@antv/g-webgpu-engine/-/g-webgpu-engine-0.5.6.tgz", + "integrity": "sha512-D311qYUefdEFwLayutIHqucrAY3cAGH3BdnXS37nq+0nsglrHcNP0Ab1YTinn9RihLoY3yXFTLzrYkJHJbZXDg==", + "requires": { + "@antv/g-webgpu-core": "^0.5.6", + "@webgpu/glslang": "^0.0.15", + "@webgpu/types": "^0.0.31", + "gl-matrix": "^3.1.0", + "hammerjs": "^2.0.8", + "inversify": "^5.0.1", + "inversify-inject-decorators": "^3.1.0", + "probe.gl": "^3.1.1", + "reflect-metadata": "^0.1.13", + "regl": "^1.3.11" + } + }, + "@antv/g6": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@antv/g6/-/g6-4.5.0.tgz", + "integrity": "sha512-d6lVmbQP+12JwIqvyZ5iuJg7Xq77JANFn9SLJjn8cZCjsQ9Ns1aYXzY66siPICn3Zqj286V3JdurwNHoQqmcyg==", + "requires": { + "@antv/g6-pc": "0.5.0" + } + }, + "@antv/g6-core": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@antv/g6-core/-/g6-core-0.5.0.tgz", + "integrity": "sha512-tBfd0moxWzDIVD1CRlEoEFVps7bQsps5JB0LBtvobNT0a0Y8Kd2Rdxv0hRGrnlQgKYC93NrCftkRcxCIvTQO1A==", + "requires": { + "@antv/algorithm": "^0.1.8", + "@antv/dom-util": "^2.0.1", + "@antv/event-emitter": "~0.1.0", + "@antv/g-base": "^0.5.1", + "@antv/g-math": "^0.1.1", + "@antv/matrix-util": "^3.1.0-beta.3", + "@antv/path-util": "^2.0.3", + "@antv/util": "~2.0.5", + "ml-matrix": "^6.5.0", + "tslib": "^2.1.0" + } + }, + "@antv/g6-element": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@antv/g6-element/-/g6-element-0.5.0.tgz", + "integrity": "sha512-WkhFwHmFLMPeJ1tUhxpnuIuVPEtn4OkYAKfnoVlyiBZnGG2jqkHAG03Ll7YoF0A40EUy+a/x2GukBhLEm/kuJw==", + "requires": { + "@antv/g-base": "^0.5.1", + "@antv/g6-core": "0.5.0", + "@antv/util": "~2.0.5" + } + }, + "@antv/g6-pc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@antv/g6-pc/-/g6-pc-0.5.0.tgz", + "integrity": "sha512-/yeIymYQ2GpULwDDxn3RadhzxRemS8o9oTYCVTuPPt9pvJ0XJ7P3nB3z2gwnIoRjoNF6qvlmFWgW9DBbfNzeiw==", + "requires": { + "@ant-design/colors": "^4.0.5", + "@antv/algorithm": "^0.1.8", + "@antv/dom-util": "^2.0.1", + "@antv/event-emitter": "~0.1.0", + "@antv/g-base": "^0.5.1", + "@antv/g-canvas": "^0.5.2", + "@antv/g-math": "^0.1.1", + "@antv/g-svg": "^0.5.1", + "@antv/g6-core": "0.5.0", + "@antv/g6-element": "0.5.0", + "@antv/g6-plugin": "0.5.0", + "@antv/hierarchy": "^0.6.7", + "@antv/layout": "0.1.19-beta.5", + "@antv/matrix-util": "^3.1.0-beta.3", + "@antv/path-util": "^2.0.3", + "@antv/util": "~2.0.5", + "color": "^3.1.3", + "d3-force": "^2.0.1", + "dagre": "^0.8.5", + "insert-css": "^2.0.0", + "ml-matrix": "^6.5.0" + } + }, + "@antv/g6-plugin": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@antv/g6-plugin/-/g6-plugin-0.5.0.tgz", + "integrity": "sha512-Fxv2G6QYkuluGxbK4gH6PInvWZGwx0GEELmuRkw/Owqn1nw43N37+iDlDA+JgdyDxts3pqC+JQKeHGO270Uo0w==", + "requires": { + "@antv/dom-util": "^2.0.2", + "@antv/g-base": "^0.5.1", + "@antv/g-canvas": "^0.5.2", + "@antv/g-svg": "^0.5.2", + "@antv/g6-core": "0.5.0", + "@antv/matrix-util": "^3.1.0-beta.3", + "@antv/scale": "^0.3.4", + "@antv/util": "^2.0.9", + "insert-css": "^2.0.0" + } + }, + "@antv/hierarchy": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@antv/hierarchy/-/hierarchy-0.6.8.tgz", + "integrity": "sha512-wVzUl+pxny5gyGJ2mkWx8IiEypX6bnMHgr/NILgbxY6shoy0Vf4FhZpI3CY8Ez7bQT6js8fMkB2NymPW7d7i8A==", + "requires": { + "@antv/util": "^2.0.7" + } + }, + "@antv/layout": { + "version": "0.1.19-beta.5", + "resolved": "https://registry.npmjs.org/@antv/layout/-/layout-0.1.19-beta.5.tgz", + "integrity": "sha512-t5H9WNoI4werPqjOR1ebZeThwkEofoLyYXEscmU36u0kEa0aXxzFtvdSl6XrYgZRXuEZ+2f6H1FNvGho8jmS7Q==", + "requires": { + "@antv/g-webgpu": "0.5.5", + "d3-force": "^2.0.1", + "dagrejs": "^0.2.1", + "ml-matrix": "^6.5.0" + } + }, + "@antv/matrix-util": { + "version": "3.1.0-beta.3", + "resolved": "https://registry.npmjs.org/@antv/matrix-util/-/matrix-util-3.1.0-beta.3.tgz", + "integrity": "sha512-W2R6Za3A6CmG51Y/4jZUM/tFgYSq7vTqJL1VD9dKrvwxS4sE0ZcXINtkp55CdyBwJ6Cwm8pfoRpnD4FnHahN0A==", + "requires": { + "@antv/util": "^2.0.9", + "gl-matrix": "^3.4.3", + "tslib": "^2.0.3" + } + }, + "@antv/path-util": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@antv/path-util/-/path-util-2.0.15.tgz", + "integrity": "sha512-R2VLZ5C8PLPtr3VciNyxtjKqJ0XlANzpFb5sE9GE61UQqSRuSVSzIakMxjEPrpqbgc+s+y8i+fmc89Snu7qbNw==", + "requires": { + "@antv/matrix-util": "^3.0.4", + "@antv/util": "^2.0.9", + "tslib": "^2.0.3" + }, + "dependencies": { + "@antv/matrix-util": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@antv/matrix-util/-/matrix-util-3.0.4.tgz", + "integrity": "sha512-BAPyu6dUliHcQ7fm9hZSGKqkwcjEDVLVAstlHULLvcMZvANHeLXgHEgV7JqcAV/GIhIz8aZChIlzM1ZboiXpYQ==", + "requires": { + "@antv/util": "^2.0.9", + "gl-matrix": "^3.3.0", + "tslib": "^2.0.3" + } + } + } + }, + "@antv/scale": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@antv/scale/-/scale-0.3.14.tgz", + "integrity": "sha512-G19Mh9VYPX/Z5PXKJrORIYCjrA+Fmko6ZB4HN6Y8K0T9FeKaSJq+idIe7AUJhIIXDCrFk4LzW+t908NsORqxPg==", + "requires": { + "@antv/util": "~2.0.3", + "fecha": "~4.2.0", + "tslib": "^2.0.0" + } + }, + "@antv/util": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@antv/util/-/util-2.0.17.tgz", + "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", + "requires": { + "csstype": "^3.0.8", + "tslib": "^2.0.3" + } + }, + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/compat-data": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "dev": true + }, + "@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + } + }, + "@babel/eslint-parser": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.3.tgz", + "integrity": "sha512-iB4ElZT0jAt7PKVaeVulOECdGe6UnmA/O0P9jlF5g5GBOwDVbna8AXhHRu4s27xQf6OkveyA8iTDv1jHdDejgQ==", + "dev": true, + "requires": { + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", + "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz", + "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz", + "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz", + "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", + "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", + "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz", + "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-wrap-function": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz", + "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helpers": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "dev": true, + "requires": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.3", + "@babel/types": "^7.16.0" + } + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", + "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz", + "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz", + "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", + "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.16.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", + "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz", + "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.4.tgz", + "integrity": "sha512-RESBNX16eNqnBeEVR5sCJpnW0mHiNLNNvGA8PrRuK/4ZJ4TO+6bHleRUuGQYDERVySOKtOhSya/C4MIhwAMAgg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-decorators": "^7.16.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz", + "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz", + "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz", + "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz", + "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz", + "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz", + "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz", + "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz", + "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz", + "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz", + "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz", + "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz", + "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.0.tgz", + "integrity": "sha512-nxnnngZClvlY13nHJAIDow0S7Qzhq64fQ/NlqS+VER3kjW/4F0jLhXjeL8jcwSwz6Ca3rotT5NJD2T9I7lcv7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz", + "integrity": "sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz", + "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", + "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.16.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz", + "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz", + "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz", + "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz", + "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz", + "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz", + "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz", + "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz", + "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz", + "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz", + "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz", + "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz", + "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz", + "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz", + "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.16.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz", + "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.15.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz", + "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz", + "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz", + "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz", + "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.16.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", + "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz", + "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz", + "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz", + "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz", + "integrity": "sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz", + "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz", + "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz", + "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz", + "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz", + "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz", + "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz", + "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", + "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.4", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-class-static-block": "^7.16.0", + "@babel/plugin-proposal-dynamic-import": "^7.16.0", + "@babel/plugin-proposal-export-namespace-from": "^7.16.0", + "@babel/plugin-proposal-json-strings": "^7.16.0", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-object-rest-spread": "^7.16.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.0", + "@babel/plugin-transform-async-to-generator": "^7.16.0", + "@babel/plugin-transform-block-scoped-functions": "^7.16.0", + "@babel/plugin-transform-block-scoping": "^7.16.0", + "@babel/plugin-transform-classes": "^7.16.0", + "@babel/plugin-transform-computed-properties": "^7.16.0", + "@babel/plugin-transform-destructuring": "^7.16.0", + "@babel/plugin-transform-dotall-regex": "^7.16.0", + "@babel/plugin-transform-duplicate-keys": "^7.16.0", + "@babel/plugin-transform-exponentiation-operator": "^7.16.0", + "@babel/plugin-transform-for-of": "^7.16.0", + "@babel/plugin-transform-function-name": "^7.16.0", + "@babel/plugin-transform-literals": "^7.16.0", + "@babel/plugin-transform-member-expression-literals": "^7.16.0", + "@babel/plugin-transform-modules-amd": "^7.16.0", + "@babel/plugin-transform-modules-commonjs": "^7.16.0", + "@babel/plugin-transform-modules-systemjs": "^7.16.0", + "@babel/plugin-transform-modules-umd": "^7.16.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", + "@babel/plugin-transform-new-target": "^7.16.0", + "@babel/plugin-transform-object-super": "^7.16.0", + "@babel/plugin-transform-parameters": "^7.16.3", + "@babel/plugin-transform-property-literals": "^7.16.0", + "@babel/plugin-transform-regenerator": "^7.16.0", + "@babel/plugin-transform-reserved-words": "^7.16.0", + "@babel/plugin-transform-shorthand-properties": "^7.16.0", + "@babel/plugin-transform-spread": "^7.16.0", + "@babel/plugin-transform-sticky-regex": "^7.16.0", + "@babel/plugin-transform-template-literals": "^7.16.0", + "@babel/plugin-transform-typeof-symbol": "^7.16.0", + "@babel/plugin-transform-unicode-escapes": "^7.16.0", + "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.0", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.19.1", + "semver": "^6.3.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", + "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.3", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "@commitlint/cli": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-11.0.0.tgz", + "integrity": "sha512-YWZWg1DuqqO5Zjh7vUOeSX76vm0FFyz4y0cpGMFhrhvUi5unc4IVfCXZ6337R9zxuBtmveiRuuhQqnRRer+13g==", + "dev": true, + "requires": { + "@babel/runtime": "^7.11.2", + "@commitlint/format": "^11.0.0", + "@commitlint/lint": "^11.0.0", + "@commitlint/load": "^11.0.0", + "@commitlint/read": "^11.0.0", + "chalk": "4.1.0", + "core-js": "^3.6.1", + "get-stdin": "8.0.0", + "lodash": "^4.17.19", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^15.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@commitlint/config-conventional": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-11.0.0.tgz", + "integrity": "sha512-SNDRsb5gLuDd2PL83yCOQX6pE7gevC79UPFx+GLbLfw6jGnnbO9/tlL76MLD8MOViqGbo7ZicjChO9Gn+7tHhA==", + "dev": true, + "requires": { + "conventional-changelog-conventionalcommits": "^4.3.1" + } + }, + "@commitlint/ensure": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-11.0.0.tgz", + "integrity": "sha512-/T4tjseSwlirKZdnx4AuICMNNlFvRyPQimbZIOYujp9DSO6XRtOy9NrmvWujwHsq9F5Wb80QWi4WMW6HMaENug==", + "dev": true, + "requires": { + "@commitlint/types": "^11.0.0", + "lodash": "^4.17.19" + } + }, + "@commitlint/execute-rule": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz", + "integrity": "sha512-g01p1g4BmYlZ2+tdotCavrMunnPFPhTzG1ZiLKTCYrooHRbmvqo42ZZn4QMStUEIcn+jfLb6BRZX3JzIwA1ezQ==", + "dev": true + }, + "@commitlint/format": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-11.0.0.tgz", + "integrity": "sha512-bpBLWmG0wfZH/svzqD1hsGTpm79TKJWcf6EXZllh2J/LSSYKxGlv967lpw0hNojme0sZd4a/97R3qA2QHWWSLg==", + "dev": true, + "requires": { + "@commitlint/types": "^11.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@commitlint/is-ignored": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-11.0.0.tgz", + "integrity": "sha512-VLHOUBN+sOlkYC4tGuzE41yNPO2w09sQnOpfS+pSPnBFkNUUHawEuA44PLHtDvQgVuYrMAmSWFQpWabMoP5/Xg==", + "dev": true, + "requires": { + "@commitlint/types": "^11.0.0", + "semver": "7.3.2" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "@commitlint/lint": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-11.0.0.tgz", + "integrity": "sha512-Q8IIqGIHfwKr8ecVZyYh6NtXFmKw4YSEWEr2GJTB/fTZXgaOGtGFZDWOesCZllQ63f1s/oWJYtVv5RAEuwN8BQ==", + "dev": true, + "requires": { + "@commitlint/is-ignored": "^11.0.0", + "@commitlint/parse": "^11.0.0", + "@commitlint/rules": "^11.0.0", + "@commitlint/types": "^11.0.0" + } + }, + "@commitlint/load": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-11.0.0.tgz", + "integrity": "sha512-t5ZBrtgvgCwPfxmG811FCp39/o3SJ7L+SNsxFL92OR4WQxPcu6c8taD0CG2lzOHGuRyuMxZ7ps3EbngT2WpiCg==", + "dev": true, + "requires": { + "@commitlint/execute-rule": "^11.0.0", + "@commitlint/resolve-extends": "^11.0.0", + "@commitlint/types": "^11.0.0", + "chalk": "4.1.0", + "cosmiconfig": "^7.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@commitlint/message": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-11.0.0.tgz", + "integrity": "sha512-01ObK/18JL7PEIE3dBRtoMmU6S3ecPYDTQWWhcO+ErA3Ai0KDYqV5VWWEijdcVafNpdeUNrEMigRkxXHQLbyJA==", + "dev": true + }, + "@commitlint/parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-11.0.0.tgz", + "integrity": "sha512-DekKQAIYWAXIcyAZ6/PDBJylWJ1BROTfDIzr9PMVxZRxBPc1gW2TG8fLgjZfBP5mc0cuthPkVi91KQQKGri/7A==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.0", + "conventional-commits-parser": "^3.0.0" + } + }, + "@commitlint/read": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-11.0.0.tgz", + "integrity": "sha512-37V0V91GSv0aDzMzJioKpCoZw6l0shk7+tRG8RkW1GfZzUIytdg3XqJmM+IaIYpaop0m6BbZtfq+idzUwJnw7g==", + "dev": true, + "requires": { + "@commitlint/top-level": "^11.0.0", + "fs-extra": "^9.0.0", + "git-raw-commits": "^2.0.0" + } + }, + "@commitlint/resolve-extends": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-11.0.0.tgz", + "integrity": "sha512-WinU6Uv6L7HDGLqn/To13KM1CWvZ09VHZqryqxXa1OY+EvJkfU734CwnOEeNlSCK7FVLrB4kmodLJtL1dkEpXw==", + "dev": true, + "requires": { + "import-fresh": "^3.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + } + }, + "@commitlint/rules": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-11.0.0.tgz", + "integrity": "sha512-2hD9y9Ep5ZfoNxDDPkQadd2jJeocrwC4vJ98I0g8pNYn/W8hS9+/FuNpolREHN8PhmexXbkjrwyQrWbuC0DVaA==", + "dev": true, + "requires": { + "@commitlint/ensure": "^11.0.0", + "@commitlint/message": "^11.0.0", + "@commitlint/to-lines": "^11.0.0", + "@commitlint/types": "^11.0.0" + } + }, + "@commitlint/to-lines": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-11.0.0.tgz", + "integrity": "sha512-TIDTB0Y23jlCNubDROUVokbJk6860idYB5cZkLWcRS9tlb6YSoeLn1NLafPlrhhkkkZzTYnlKYzCVrBNVes1iw==", + "dev": true + }, + "@commitlint/top-level": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-11.0.0.tgz", + "integrity": "sha512-O0nFU8o+Ws+py5pfMQIuyxOtfR/kwtr5ybqTvR+C2lUPer2x6lnQU+OnfD7hPM+A+COIUZWx10mYQvkR3MmtAA==", + "dev": true, + "requires": { + "find-up": "^5.0.0" + } + }, + "@commitlint/types": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz", + "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==", + "dev": true + }, + "@element-plus/icons": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@element-plus/icons/-/icons-0.0.11.tgz", + "integrity": "sha512-iKQXSxXu131Ai+I9Ymtcof9WId7kaXvB1+WRfAfpQCW7UiAMYgdNDqb/u0hgTo2Yq3MwC4MWJnNuTBEpG8r7+A==" + }, + "@element-plus/icons-vue": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-0.2.4.tgz", + "integrity": "sha512-RsJNyL58rwxtsjeMy34o8txkL6UlME1stWsUlRpTac6UE9Bx9gdJvnDXbIKhOJqBLX17fBjmposdrn6VTqim2w==", + "requires": {} + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "dev": true, + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@intervolga/optimize-cssnano-plugin": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", + "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", + "dev": true, + "requires": { + "cssnano": "^4.0.0", + "cssnano-preset-default": "^4.0.0", + "postcss": "^7.0.0" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + } + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true + }, + "@popperjs/core": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.0.tgz", + "integrity": "sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==" + }, + "@probe.gl/stats": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-3.4.1.tgz", + "integrity": "sha512-1Ol5cH8MQqIrGNgU4NCBj2cw1qiXYfHP1QCFX+u/xyrvgwLkPrOGkdSYMzw4VKTjJzNae4i7urOTf2m2hduZzQ==", + "requires": { + "@babel/runtime": "^7.0.0" + } + }, + "@rollup/pluginutils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.1.tgz", + "integrity": "sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==", + "dev": true, + "requires": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + } + }, + "@soda/friendly-errors-webpack-plugin": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", + "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "error-stack-parser": "^2.0.6", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@soda/get-current-script": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@soda/get-current-script/-/get-current-script-1.0.2.tgz", + "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", + "dev": true + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/d3-timer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-2.0.1.tgz", + "integrity": "sha512-TF8aoF5cHcLO7W7403blM7L1T+6NF3XMyN3fxyUolq2uOcFeicG/khQg/dGxiCJWoAcmYulYN7LYSRKO54IXaA==" + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.26", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.26.tgz", + "integrity": "sha512-zeu3tpouA043RHxW0gzRxwCHchMgftE8GArRsvYT0ByDMbn19olQHx5jLue0LxWY6iYtXb7rXmuVtSkhy9YZvQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/http-proxy": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", + "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "@types/node": { + "version": "16.11.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz", + "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", + "dev": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/tapable": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==", + "dev": true + }, + "@types/throttle-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz", + "integrity": "sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack": { + "version": "4.41.32", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.32.tgz", + "integrity": "sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack-dev-server": { + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz", + "integrity": "sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ==", + "dev": true, + "requires": { + "@types/connect-history-api-fallback": "*", + "@types/express": "*", + "@types/serve-static": "*", + "@types/webpack": "^4", + "http-proxy-middleware": "^1.0.0" + } + }, + "@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz", + "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==", + "dev": true + }, + "@vue/babel-helper-vue-transform-on": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", + "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==", + "dev": true + }, + "@vue/babel-plugin-jsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz", + "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "@vue/babel-helper-vue-transform-on": "^1.0.2", + "camelcase": "^6.0.0", + "html-tags": "^3.1.0", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-plugin-transform-vue-jsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz", + "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "dependencies": { + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + } + } + }, + "@vue/babel-preset-app": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.15.tgz", + "integrity": "sha512-J+YttzvwRfV1BPczf8r3qCevznYk+jh531agVF+5EYlHF4Sgh/cGXTz9qkkiux3LQgvhEGXgmCteg1n38WuuKg==", + "dev": true, + "requires": { + "@babel/core": "^7.11.0", + "@babel/helper-compilation-targets": "^7.9.6", + "@babel/helper-module-imports": "^7.8.3", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.11.0", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.0", + "@vue/babel-plugin-jsx": "^1.0.3", + "@vue/babel-preset-jsx": "^1.2.4", + "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.6.5", + "core-js-compat": "^3.6.5", + "semver": "^6.1.0" + } + }, + "@vue/babel-preset-jsx": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz", + "integrity": "sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==", + "dev": true, + "requires": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "@vue/babel-sugar-composition-api-inject-h": "^1.2.1", + "@vue/babel-sugar-composition-api-render-instance": "^1.2.4", + "@vue/babel-sugar-functional-vue": "^1.2.2", + "@vue/babel-sugar-inject-h": "^1.2.2", + "@vue/babel-sugar-v-model": "^1.2.3", + "@vue/babel-sugar-v-on": "^1.2.3" + } + }, + "@vue/babel-sugar-composition-api-inject-h": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz", + "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-composition-api-render-instance": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz", + "integrity": "sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-functional-vue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz", + "integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-inject-h": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz", + "integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-v-model": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz", + "integrity": "sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + } + } + }, + "@vue/babel-sugar-v-on": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz", + "integrity": "sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "@vue/cli-overlay": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-4.5.15.tgz", + "integrity": "sha512-0zI0kANAVmjFO2LWGUIzdGPMeE3+9k+KeRDXsUqB30YfRF7abjfiiRPq5BU9pOzlJbVdpRkisschBrvdJqDuDg==", + "dev": true + }, + "@vue/cli-plugin-babel": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.15.tgz", + "integrity": "sha512-hBLrwYfFkHldEe34op/YNgPhpOWI5n5DB2Qt9I/1Epeif4M4iFaayrgjvOR9AVM6WbD3Yx7WCFszYpWrQZpBzQ==", + "dev": true, + "requires": { + "@babel/core": "^7.11.0", + "@vue/babel-preset-app": "^4.5.15", + "@vue/cli-shared-utils": "^4.5.15", + "babel-loader": "^8.1.0", + "cache-loader": "^4.1.0", + "thread-loader": "^2.1.3", + "webpack": "^4.0.0" + } + }, + "@vue/cli-plugin-router": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.5.15.tgz", + "integrity": "sha512-q7Y6kP9b3k55Ca2j59xJ7XPA6x+iSRB+N4ac0ZbcL1TbInVQ4j5wCzyE+uqid40hLy4fUdlpl4X9fHJEwuVxPA==", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^4.5.15" + } + }, + "@vue/cli-plugin-vuex": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.15.tgz", + "integrity": "sha512-fqap+4HN+w+InDxlA3hZTOGE0tzBTgXhKLoDydhywqgmhQ1D9JA6Feh94ze6tG8DsWX58/ujYUqA8jAz17FJtg==", + "dev": true, + "requires": {} + }, + "@vue/cli-service": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-4.5.15.tgz", + "integrity": "sha512-sFWnLYVCn4zRfu45IcsIE9eXM0YpDV3S11vlM2/DVbIPAGoYo5ySpSof6aHcIvkeGsIsrHFpPHzNvDZ/efs7jA==", + "dev": true, + "requires": { + "@intervolga/optimize-cssnano-plugin": "^1.0.5", + "@soda/friendly-errors-webpack-plugin": "^1.7.1", + "@soda/get-current-script": "^1.0.0", + "@types/minimist": "^1.2.0", + "@types/webpack": "^4.0.0", + "@types/webpack-dev-server": "^3.11.0", + "@vue/cli-overlay": "^4.5.15", + "@vue/cli-plugin-router": "^4.5.15", + "@vue/cli-plugin-vuex": "^4.5.15", + "@vue/cli-shared-utils": "^4.5.15", + "@vue/component-compiler-utils": "^3.1.2", + "@vue/preload-webpack-plugin": "^1.1.0", + "@vue/web-component-wrapper": "^1.2.0", + "acorn": "^7.4.0", + "acorn-walk": "^7.1.1", + "address": "^1.1.2", + "autoprefixer": "^9.8.6", + "browserslist": "^4.12.0", + "cache-loader": "^4.1.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "cli-highlight": "^2.1.4", + "clipboardy": "^2.3.0", + "cliui": "^6.0.0", + "copy-webpack-plugin": "^5.1.1", + "css-loader": "^3.5.3", + "cssnano": "^4.1.10", + "debug": "^4.1.1", + "default-gateway": "^5.0.5", + "dotenv": "^8.2.0", + "dotenv-expand": "^5.1.0", + "file-loader": "^4.2.0", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "hash-sum": "^2.0.0", + "html-webpack-plugin": "^3.2.0", + "launch-editor-middleware": "^2.2.1", + "lodash.defaultsdeep": "^4.6.1", + "lodash.mapvalues": "^4.6.0", + "lodash.transform": "^4.6.0", + "mini-css-extract-plugin": "^0.9.0", + "minimist": "^1.2.5", + "pnp-webpack-plugin": "^1.6.4", + "portfinder": "^1.0.26", + "postcss-loader": "^3.0.0", + "ssri": "^8.0.1", + "terser-webpack-plugin": "^1.4.4", + "thread-loader": "^2.1.3", + "url-loader": "^2.2.0", + "vue-loader": "^15.9.2", + "vue-loader-v16": "npm:vue-loader@^16.1.0", + "vue-style-loader": "^4.1.2", + "webpack": "^4.0.0", + "webpack-bundle-analyzer": "^3.8.0", + "webpack-chain": "^6.4.0", + "webpack-dev-server": "^3.11.0", + "webpack-merge": "^4.2.2" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "webpack-bundle-analyzer": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz", + "integrity": "sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.19", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "@vue/cli-shared-utils": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.5.15.tgz", + "integrity": "sha512-SKaej9hHzzjKSOw1NlFmc6BSE0vcqUQMQiv1cxQ2DhVyy4QxZXBmzmiLBUBe+hYZZs1neXW7n//udeN9bCAY+Q==", + "dev": true, + "requires": { + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.2", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "node-ipc": "^9.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "read-pkg": "^5.1.1", + "request": "^2.88.2", + "semver": "^6.1.0", + "strip-ansi": "^6.0.0" + } + }, + "@vue/compiler-core": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.23.tgz", + "integrity": "sha512-4ZhiI/orx+7EJ1B+0zjgvXMV2uRN+XBfG06UN2sJfND9rH5gtEQT3QmO4erum1o6Irl7y754W8/KSaDJh4EUQg==", + "requires": { + "@babel/parser": "^7.15.0", + "@vue/shared": "3.2.23", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@vue/compiler-dom": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.23.tgz", + "integrity": "sha512-X2Nw8QFc5lgoK3kio5ktM95nqmLUH+q+N/PbV4kCHzF1avqv/EGLnAhaaF0Iu4bewNvHJAAhhwPZFeoV/22nbw==", + "requires": { + "@vue/compiler-core": "3.2.23", + "@vue/shared": "3.2.23" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.23.tgz", + "integrity": "sha512-Aw+pb50Q5zTjyvWod8mNKmYZDRGHJBptmNNWE+84ZxrzEztPgMz8cNYIzWGbwcFVkmJlhvioAMvKnB+LM/sjSA==", + "requires": { + "@babel/parser": "^7.15.0", + "@vue/compiler-core": "3.2.23", + "@vue/compiler-dom": "3.2.23", + "@vue/compiler-ssr": "3.2.23", + "@vue/ref-transform": "3.2.23", + "@vue/shared": "3.2.23", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "postcss": { + "version": "8.4.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz", + "integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==", + "requires": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@vue/compiler-ssr": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.23.tgz", + "integrity": "sha512-Bqzn4jFyXPK1Ehqiq7e/czS8n62gtYF1Zfeu0DrR5uv+SBllh7LIvZjZU6+c8qbocAd3/T3I3gn2cZGmnDb6zg==", + "requires": { + "@vue/compiler-dom": "3.2.23", + "@vue/shared": "3.2.23" + } + }, + "@vue/component-compiler-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", + "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.36", + "postcss-selector-parser": "^6.0.2", + "prettier": "^1.18.2 || ^2.0.0", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "@vue/devtools-api": { + "version": "6.0.0-beta.20.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.0.0-beta.20.1.tgz", + "integrity": "sha512-R2rfiRY+kZugzWh9ZyITaovx+jpU4vgivAEAiz80kvh3yviiTU3CBuGuyWpSwGz9/C7TkSWVM/FtQRGlZ16n8Q==" + }, + "@vue/preload-webpack-plugin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", + "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==", + "dev": true, + "requires": {} + }, + "@vue/reactivity": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.23.tgz", + "integrity": "sha512-8RGVr/5Kpgb/EkCjgHXqttgA5IMc6n0lIXFY4TVbMkzdXrvaIhzBd7Te44oIDsTSYVKZLpfHd6/wEnuDqE8vFw==", + "requires": { + "@vue/shared": "3.2.23" + } + }, + "@vue/ref-transform": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.23.tgz", + "integrity": "sha512-gW0GD2PSAs/th7mC7tPB/UwpIQxclbApVtsDtscDmOJXb2+cdu60ny+SuHNgfrlUT/JqWKQHq7jFKO4woxLNaA==", + "requires": { + "@babel/parser": "^7.15.0", + "@vue/compiler-core": "3.2.23", + "@vue/shared": "3.2.23", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "@vue/runtime-core": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.23.tgz", + "integrity": "sha512-wSI5lmY2kCGLf89iiygqxVh6/5bsawz78Me9n1x4U2bHnN0yf3PWyuhN0WgIE8VfEaF7e75E333uboNEIFjgkg==", + "requires": { + "@vue/reactivity": "3.2.23", + "@vue/shared": "3.2.23" + } + }, + "@vue/runtime-dom": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.23.tgz", + "integrity": "sha512-z6lp0888NkLmxD9j2sGoll8Kb7J743s8s6w7GbiyUc4WZwm0KJ35B4qTFDMoIU0G7CatS6Z+yRTpPHc6srtByg==", + "requires": { + "@vue/runtime-core": "3.2.23", + "@vue/shared": "3.2.23", + "csstype": "^2.6.8" + }, + "dependencies": { + "csstype": { + "version": "2.6.19", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", + "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" + } + } + }, + "@vue/server-renderer": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.23.tgz", + "integrity": "sha512-mgQ2VAE5WjeZELJKNbwE69uiBNpN+3LyL0ZDki1bJWVwHD2fhPfx7pwyYuiucE81xz2LxVsyGxhKKUL997g8vw==", + "requires": { + "@vue/compiler-ssr": "3.2.23", + "@vue/shared": "3.2.23" + } + }, + "@vue/shared": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.23.tgz", + "integrity": "sha512-U+/Jefa0QfXUF2qVy9Dqlrb6HKJSr9/wJcM66wXmWcTOoqg7hOWzF4qruDle51pyF4x3wMn6TSH54UdjKjCKMA==" + }, + "@vue/web-component-wrapper": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz", + "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==", + "dev": true + }, + "@vueuse/core": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-7.1.2.tgz", + "integrity": "sha512-SLoOPfhZdNRNUkZfx+wrHj6WycWdSw2RmNS8E4ngQ2kmBoJjRarGy51/GkGdjqHQqmhuwuFoNO2WaU0yBn3ffg==", + "requires": { + "@vueuse/shared": "7.1.2", + "vue-demi": "*" + }, + "dependencies": { + "@vueuse/shared": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-7.1.2.tgz", + "integrity": "sha512-AjYh4y9S5FMOoHDsysqcXY/1mpqNTrnWUD50yaaiyf+5kGWQVIpAkkjKZlYSC/NHKxxCRn0cLR4nWMzceUWewQ==", + "requires": { + "vue-demi": "*" + } + }, + "vue-demi": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.12.1.tgz", + "integrity": "sha512-QL3ny+wX8c6Xm1/EZylbgzdoDolye+VpCXRhI2hug9dJTP3OUJ3lmiKN3CsVV3mOJKwFi0nsstbgob0vG7aoIw==", + "requires": {} + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webgpu/glslang": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/@webgpu/glslang/-/glslang-0.0.15.tgz", + "integrity": "sha512-niT+Prh3Aff8Uf1MVBVUsaNjFj9rJAKDXuoHIKiQbB+6IUP/3J3JIhBNyZ7lDhytvXxw6ppgnwKZdDJ08UMj4Q==" + }, + "@webgpu/types": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.0.31.tgz", + "integrity": "sha512-cvvCMSZBT4VsRNtt0lI6XQqvOIIWw6+NRUtnPUMDVDgsI4pCZColz3qzF5QcP9wIYOHEc3jssIBse8UWONKhlQ==" + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "dev": true + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "requires": {} + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "async-validator": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.0.7.tgz", + "integrity": "sha512-Pj2IR7u8hmUEDOwB++su6baaRi+QvsgajuFB9j95foM1N2gy5HM4z60hfusIO0fBPG5uLAEl6yCJr1jNSVugEQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "babel-loader": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-import": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/babel-plugin-import/-/babel-plugin-import-1.13.3.tgz", + "integrity": "sha512-1qCWdljJOrDRH/ybaCZuDgySii4yYrtQ8OJQwrcDqdt0y67N30ng3X3nABg6j7gR7qUJgcMa9OMhc4AGViDwWw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/runtime": "^7.0.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", + "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.0", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", + "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.0", + "core-js-compat": "^3.18.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", + "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", + "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001280", + "electron-to-chromium": "^1.3.896", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + } + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-4.0.0.tgz", + "integrity": "sha512-qC0E2Dxgou1IHhvJSLwGDSTvokbRovU5zZFuDY6oY8Y2lF3nGt5Ad8YZK7GMtqzY84Wu7pXTPeHQeHcXSXsRhw==", + "dev": true, + "requires": { + "semver": "^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "dev": true, + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001283", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz", + "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==", + "dev": true + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", + "dev": true + }, + "cheetah-grid": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/cheetah-grid/-/cheetah-grid-1.1.10.tgz", + "integrity": "sha512-wYtcCMVtusNdUjQYO1M9JkP9ScrNBXCNtMg8jbTI1pO3MHGCPhkK/p8bF5D1isGCCrb1qAW8GrZLq/xSxBYJQw==" + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "clipboardy": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", + "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "dev": true, + "requires": { + "arch": "^2.1.1", + "execa": "^1.0.0", + "is-wsl": "^2.1.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "coalescy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/coalescy/-/coalescy-1.0.0.tgz", + "integrity": "sha1-SwZYRrg2NhrabEtKSr9LwcrDG/E=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.8.2.tgz", + "integrity": "sha512-w5ZkKRdLsc5NOYsmnpS2DpyRW71npwZGwbRpLrJTuqjfTs2Bhrba7UiV59IX9siBlCPl2pne5NtiwnVWUzvYFA==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-conventionalcommits": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.1.tgz", + "integrity": "sha512-lzWJpPZhbM1R0PIzkwzGBCnAkH5RKJzJfFQZcl/D+2lsJxAwGnDKBqn/F4C1RD31GJNn8NuKWQzAZDAVXPp2Mw==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + } + }, + "conventional-commits-parser": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.3.tgz", + "integrity": "sha512-YyRDR7On9H07ICFpRm/igcdjIqebXbvf4Cff+Pf0BrBys1i1EOzx9iFXNlAbdrLAR8jf7bkUYkDAr8pEy0q4Pw==", + "dev": true, + "requires": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + } + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dev": true, + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } + } + }, + "core-js": { + "version": "3.19.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.2.tgz", + "integrity": "sha512-ciYCResnLIATSsXuXnIOH4CbdfgV+H1Ltg16hJFN7/v6OxqnFr/IFGeLacaZ+fHLAm0TBbXwNK9/DNBzBUrO/g==", + "dev": true + }, + "core-js-compat": { + "version": "3.19.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.2.tgz", + "integrity": "sha512-ObBY1W5vx/LFFMaL1P5Udo4Npib6fu+cMokeziWkA8Tns4FcDemKF5j9JvaI5JhdkW8EQJQGJN1EcrzmEwuAqQ==", + "dev": true, + "requires": { + "browserslist": "^4.18.1", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "csstype": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", + "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "d3-dispatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", + "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==" + }, + "d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "d3-force": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-2.1.1.tgz", + "integrity": "sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==", + "requires": { + "d3-dispatch": "1 - 2", + "d3-quadtree": "1 - 2", + "d3-timer": "1 - 2" + } + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-quadtree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-2.0.0.tgz", + "integrity": "sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==" + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "requires": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "dagrejs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/dagrejs/-/dagrejs-0.2.1.tgz", + "integrity": "sha512-4bb1y+4aM1xtkK7ieP0V7Xn/34GQfnCapl0yubrOMX8Qb/PIwM1Dii2uUBv/KtuzrQtxPliSP4r5MQBsnP6gNg==", + "requires": { + "graphlib": "^2.1.8", + "lodash": "^4.17.19" + } + }, + "dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dayjs": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", + "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true + }, + "default-gateway": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-5.0.5.tgz", + "integrity": "sha512-z2RnruVmj8hVMmAnEJMTIJNijhKCDiGjbLP+BHJFOT7ld3Bo5qcIBpVYDniqhbMIIf+jZDlkP2MkPXiQy/DBLA==", + "dev": true, + "requires": { + "execa": "^3.3.0" + }, + "dependencies": { + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.2.1.tgz", + "integrity": "sha512-eAcRiEPTs7utXWPaAgu/OX1HRJpxW7xSHpw4LTDrGFaeWnJ37HRlqpUkKsDm0AoTbtrvHQhH+5U2Cd87EGhJTg==" + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "dependencies": { + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domhandler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "easy-stack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", + "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "echarts": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.2.2.tgz", + "integrity": "sha512-yxuBfeIH5c+0FsoRP60w4De6omXhA06c7eUYBsC1ykB6Ys2yK5fSteIYWvkJ4xJVLQgCvAdO8C4mN6MLeJpBaw==", + "requires": { + "tslib": "2.3.0", + "zrender": "5.2.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.5.tgz", + "integrity": "sha512-YKaB+t8ul5crdh6OeqT2qXdxJGI0fAYb6/X8pDIyye+c3a7ndOCk5gVeKX+ABwivCGNS56vOAif3TN0qJMpEHw==", + "dev": true + }, + "element-plus": { + "version": "1.2.0-beta.6", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-1.2.0-beta.6.tgz", + "integrity": "sha512-8EdSIR/5/FHcSB8w1diAh+gJMHgxIvxuZoayY99k6taAR1QyEFHuPTgFccZLopJ1+iP4UEsZFz49l57qS08Utw==", + "requires": { + "@element-plus/icons-vue": "^0.2.2", + "@popperjs/core": "^2.10.2", + "@vueuse/core": "^7.0.0", + "async-validator": "^4.0.7", + "dayjs": "^1.10.7", + "lodash": "^4.17.21", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.1.1" + } + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "dev": true, + "requires": { + "stackframe": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "eslint-friendly-formatter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-4.0.1.tgz", + "integrity": "sha1-J9UE3IN/fK3b8gGy6EpO5zC6Pvo=", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "coalescy": "1.0.0", + "extend": "^3.0.0", + "minimist": "^1.2.0", + "strip-ansi": "^4.0.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "eslint-plugin-html": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-6.2.0.tgz", + "integrity": "sha512-vi3NW0E8AJombTvt8beMwkL1R/fdRWl4QSNRNMhVQKWm36/X0KF0unGNAY4mqUF06mnwVWZcIcerrCnfn9025g==", + "dev": true, + "requires": { + "htmlparser2": "^7.1.2" + } + }, + "eslint-plugin-vue": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz", + "integrity": "sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==", + "dev": true, + "requires": { + "eslint-utils": "^2.1.0", + "natural-compare": "^1.4.0", + "semver": "^6.3.0", + "vue-eslint-parser": "^7.10.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fecha": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", + "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", + "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", + "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "git-raw-commits": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.10.tgz", + "integrity": "sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ==", + "dev": true, + "requires": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + } + }, + "gl-matrix": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" + }, + "gl-vec2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/gl-vec2/-/gl-vec2-1.3.0.tgz", + "integrity": "sha512-YiqaAuNsheWmUV0Sa8k94kBB0D6RWjwZztyO+trEYS8KzJ6OQB/4686gdrf59wld4hHFIvaxynO3nRxpk1Ij/A==" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "requires": { + "lodash": "^4.17.15" + } + }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "requires": { + "duplexer": "^0.1.2" + } + }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, + "hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", + "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", + "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "husky": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", + "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "import-meta-resolve": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-1.1.1.tgz", + "integrity": "sha512-JiTuIvVyPaUg11eTrNDx5bgQ/yMKMZffc7YSjvQeSMXy58DO2SQ8BtAf3xteZvmzvjYh14wnqNjL8XVeDy2o9A==", + "dev": true, + "requires": { + "builtins": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "insert-css": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-2.0.0.tgz", + "integrity": "sha1-610Ql7dUL0x56jBg067gfQU4gPQ=" + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "dependencies": { + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + } + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "inversify": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-5.1.1.tgz", + "integrity": "sha512-j8grHGDzv1v+8T1sAQ+3boTCntFPfvxLCkNcxB1J8qA0lUN+fAlSyYd+RXKvaPRL4AGyPxViutBEJHNXOyUdFQ==" + }, + "inversify-inject-decorators": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/inversify-inject-decorators/-/inversify-inject-decorators-3.1.0.tgz", + "integrity": "sha512-/seBlVp5bXrLQS3DpKEmlgeZL6C7Tf/QITd+IMQrbBBGuCbxb7k3hRAWu9XSreNpFzLgSboz3sClLSEmGwHphw==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-any-array": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-1.0.1.tgz", + "integrity": "sha512-m+FSiaONxBt2W0h9XOUngMBu/WW8uzAKbSk4Ty2aeCcQJ+muBqENexvxUHtDpX65fk5AMCROxqgNX0sSAHstcw==" + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "dev": true + }, + "js-md5": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.7.3.tgz", + "integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==" + }, + "js-message": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", + "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", + "dev": true + }, + "js-queue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.2.tgz", + "integrity": "sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==", + "dev": true, + "requires": { + "easy-stack": "^1.0.1" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true + }, + "launch-editor": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.2.1.tgz", + "integrity": "sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "shell-quote": "^1.6.1" + } + }, + "launch-editor-middleware": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz", + "integrity": "sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg==", + "dev": true, + "requires": { + "launch-editor": "^2.2.1" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "lint-staged": { + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.4.tgz", + "integrity": "sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "commander": "^6.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.2.0", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^4.1.0", + "listr2": "^3.2.2", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "listr2": { + "version": "3.13.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.13.5.tgz", + "integrity": "sha512-3n8heFQDSk+NcwBn3CgxEibZGaRzx+pC64n3YjpMD1qguV4nWus3Al+Oo3KooqFKTQEJ1v7MmnbnyyNspgx3NA==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.4.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "local-pkg": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.1.0.tgz", + "integrity": "sha512-WsR2tHvRGIxcC2clC30ECb5fjywzsjQagaHIy1+ykZaHz0ByoB0OL2riHqIYA5YYnensRXLszwbzHkhKzehZDg==", + "dev": true, + "requires": { + "mlly": "^0.2.2" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.transform": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", + "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, + "loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "dev": true + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "requires": { + "mime-db": "1.51.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + } + } + }, + "minipass": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", + "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ml-array-max": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/ml-array-max/-/ml-array-max-1.2.3.tgz", + "integrity": "sha512-49YwnLlAf4/E/VyezUz+SNfSBhPE8JTahxRPuyM9S9Uv+ft5x0C8A4trtkDgrttMxoxbhudTA1yg8zgJZaYtpA==", + "requires": { + "is-any-array": "^1.0.0" + } + }, + "ml-array-min": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ml-array-min/-/ml-array-min-1.2.2.tgz", + "integrity": "sha512-yidQcOHFaGEuVr6FcwAn+QvKXJv1Lxel5fyKrO+aXGJGp97Mt+p8r21WYtikS/PTVbxdSrliQ0UK4wSHYHHgzQ==", + "requires": { + "is-any-array": "^1.0.0" + } + }, + "ml-array-rescale": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/ml-array-rescale/-/ml-array-rescale-1.3.6.tgz", + "integrity": "sha512-Lzj45T6hvHNdht924JQhHzInIK+ilC55zn98uraZUvLBkOWOJGOztEkRM0xyzAjWvVuhpszLADOnoVwfBSnj8w==", + "requires": { + "is-any-array": "^1.0.0", + "ml-array-max": "^1.2.3", + "ml-array-min": "^1.2.2" + } + }, + "ml-matrix": { + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.8.2.tgz", + "integrity": "sha512-5o2gVLFyieDSgsStEU5mqty4MZqfeytYA/gJqBSw5/Xuob0X2UrFX/k7FDh+YAwjzG/1l8nYa0oDaJ0sGs/RlA==", + "requires": { + "ml-array-rescale": "^1.3.6" + } + }, + "mlly": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-0.2.10.tgz", + "integrity": "sha512-xfyW6c2QBGArtctzNnTV5leOKX8nOMz2simeubtXofdsdSJFSNw+Ncvrs8kxcN3pBrQLXuYBHNFV6NgZ5Ryf4A==", + "dev": true, + "requires": { + "import-meta-resolve": "^1.1.1" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true, + "optional": true + }, + "nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, + "node-ipc": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.2.1.tgz", + "integrity": "sha512-mJzaM6O3xHf9VT8BULvJSbdVbmHUKRNOH7zDDkCrA1/T+CVjq2WVIDfLt0azZRXpgArJtl3rtmEozrbXPZ9GaQ==", + "dev": true, + "requires": { + "event-pubsub": "4.3.0", + "js-message": "1.0.7", + "js-queue": "2.0.2" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "normalize-wheel-es": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.1.1.tgz", + "integrity": "sha512-157VNH4CngrcsvF8xOVOe22cwniIR3nxSltdctvQeHZj8JttEeOXffK28jucWfWBXs0QNetAumjc1GiInnwX4w==" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + } + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + } + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + } + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + } + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "pnp-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==", + "dev": true, + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "polyline-miter-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/polyline-miter-util/-/polyline-miter-util-1.0.1.tgz", + "integrity": "sha1-tpPyOJ6g3tNqa89ezS7OS2kX2Vc=", + "requires": { + "gl-vec2": "^1.0.0" + } + }, + "polyline-normals": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/polyline-normals/-/polyline-normals-2.0.2.tgz", + "integrity": "sha1-oXN+ddjA3MsaWR+csn8J7vS30TU=", + "requires": { + "polyline-miter-util": "^1.0.1" + } + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prettier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz", + "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", + "dev": true, + "optional": true + }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "probe.gl": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/probe.gl/-/probe.gl-3.4.1.tgz", + "integrity": "sha512-k/6YoZr6cBwnFpQLs/s4yZ8cCxapQzRrxl16EQg1b2wYXLlerDJ4PkNoQ3YDN9yu3Jcipipr+Avy1GRpyBF6ZA==", + "requires": { + "@babel/runtime": "^7.0.0", + "@probe.gl/stats": "3.4.1" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "regl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/regl/-/regl-1.7.0.tgz", + "integrity": "sha512-bEAtp/qrtKucxXSJkD4ebopFZYP0q1+3Vb2WECWv/T8yQEgKxDxJ7ztO285tAMaYZVR6mM1GgI6CCn8FROtL1w==" + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dev": true, + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "requires": { + "global-dirs": "^0.1.1" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "dev": true, + "requires": { + "tslib": "~2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.44.0.tgz", + "integrity": "sha512-0hLREbHFXGQqls/K8X+koeP+ogFRPF4ZqetVB19b7Cst9Er8cOR0rc6RU7MaI4W1JmUShd1BPgPoeqmmgMMYFw==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0" + } + }, + "sass-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz", + "integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "sass-resources-loader": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-resources-loader/-/sass-resources-loader-2.2.4.tgz", + "integrity": "sha512-hIQhBygYky+rLf+4cuoGYONZ623CEH4Swo1fs1WRJkukbqdvN1VIu2KCL59du6vX92bNELzNkGPLx+NorN73xA==", + "dev": true, + "requires": { + "async": "^3.2.0", + "chalk": "^4.1.0", + "glob": "^7.1.6", + "loader-utils": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "async": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, + "simple-uploader.js": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/simple-uploader.js/-/simple-uploader.js-0.5.6.tgz", + "integrity": "sha512-ukjL0wZhK1dNMaQa6sd+UpCSmnUjblaUGbAd/B8f5IFrChMzDsC/7eFSK4bs4BS5NPJFSZVLI+l6Ri7THTkQtw==" + }, + "sirv": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.18.tgz", + "integrity": "sha512-f2AOPogZmXgJ9Ma2M22ZEhc1dNtRIzcEkiflMFeVTRq+OViOZMvH1IPMVOwrKaxpSaHioBJiDR0SluRqGa7atA==", + "dev": true, + "requires": { + "@polka/url": "^1.0.0-next.20", + "mime": "^2.3.1", + "totalist": "^1.0.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "sockjs-client": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", + "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", + "dev": true, + "requires": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.3" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "speed-measure-webpack-plugin": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-Re0wX5CtM6gW7bZA64ONOfEPEhwbiSF/vz6e2GvadjuaPrQcHTQdRGsD8+BE7iUOysXH8tIenkPCQBEcspXsNg==", + "dev": true, + "requires": { + "chalk": "^4.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "requires": { + "readable-stream": "^3.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + } + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + } + } + }, + "table": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.3.tgz", + "integrity": "sha512-5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "thread-loader": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz", + "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==", + "dev": true, + "requires": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "dev": true + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unplugin": { + "version": "0.2.21", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-0.2.21.tgz", + "integrity": "sha512-IJ15/L5XbhnV7J09Zjk0FT5HEkBjkXucWAXQWRsmEtUxmmxwh23yavrmDbCF6ZPxWiVB28+wnKIHePTRRpQPbQ==", + "dev": true, + "requires": { + "webpack-virtual-modules": "^0.4.3" + } + }, + "unplugin-vue-components": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.17.2.tgz", + "integrity": "sha512-e4ZdOpnzFMQJx3rDLotLyucTap0bUlMy+6BRYyoN6jE1ZyGAgR6jodmpHZAPR3xkC4pkqW5PLlyDfIH/+lzkng==", + "dev": true, + "requires": { + "@antfu/utils": "^0.3.0", + "@rollup/pluginutils": "^4.1.1", + "chokidar": "^3.5.2", + "debug": "^4.3.2", + "fast-glob": "^3.2.7", + "local-pkg": "^0.1.0", + "magic-string": "^0.25.7", + "minimatch": "^3.0.4", + "resolve": "^1.20.0", + "unplugin": "^0.2.13" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", + "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" + } + }, + "url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + } + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "vue": { + "version": "3.2.23", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.23.tgz", + "integrity": "sha512-MGp9JZC37lzGhwSu6c1tQxrQbXbw7XKFqtYh7SFwNrNK899FPxGAHwSHMZijMChTSC3uZrD2BGO/3EHOgMJ0cw==", + "requires": { + "@vue/compiler-dom": "3.2.23", + "@vue/compiler-sfc": "3.2.23", + "@vue/runtime-dom": "3.2.23", + "@vue/server-renderer": "3.2.23", + "@vue/shared": "3.2.23" + } + }, + "vue-cheetah-grid": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/vue-cheetah-grid/-/vue-cheetah-grid-1.1.11.tgz", + "integrity": "sha512-R92Mel9Y/+D7T229Aen0PtyDVukVnf3hpC3lH65Le0UfrtkXnKIZov6Z6t3kVkQ218/VRnnFTD9i2K2UXNvRXQ==", + "requires": { + "cheetah-grid": "^1.1.3" + } + }, + "vue-eslint-parser": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz", + "integrity": "sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^6.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + } + } + }, + "vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "vue-loader": { + "version": "15.9.8", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.8.tgz", + "integrity": "sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + } + } + }, + "vue-loader-v16": { + "version": "npm:vue-loader@16.8.3", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", + "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true + }, + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "optional": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "vue-router": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.12.tgz", + "integrity": "sha512-CPXvfqe+mZLB1kBWssssTiWg4EQERyqJZes7USiqfW9B5N2x+nHlnsM1D3b5CaJ6qgCvMmYJnz+G0iWjNCvXrg==", + "requires": { + "@vue/devtools-api": "^6.0.0-beta.18" + } + }, + "vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + } + } + }, + "vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "vue3-virtual-list": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vue3-virtual-list/-/vue3-virtual-list-1.0.2.tgz", + "integrity": "sha512-WzJPe785hQqAWwVWsRoxUuZ0cLrI8rdQHjthE3a4Izl3l6YcgSELpjKKhhq/C1dXS1QfakjQON7Z4wb387yDhw==", + "requires": {} + }, + "vuex": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.0.2.tgz", + "integrity": "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==", + "requires": { + "@vue/devtools-api": "^6.0.0-beta.11" + } + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "dev": true, + "requires": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "dependencies": { + "acorn": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "webpack-chain": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "dev": true, + "requires": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + } + }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + }, + "webpack-dev-server": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", + "dev": true, + "requires": { + "ansi-html-community": "0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-virtual-modules": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.3.tgz", + "integrity": "sha512-5NUqC2JquIL2pBAAo/VfBP6KuGkHIZQXW/lNKupLPfhViwh8wNsu0BObtl09yuKZszeEUfbXz8xhrHvSG16Nqw==", + "dev": true + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "welabx-g6": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/welabx-g6/-/welabx-g6-0.6.8.tgz", + "integrity": "sha512-Ljn7FKxNmIWWq2DeriE4NN0WCjQ7Qomw21Z+NQWnD7RyJgWHZSBnF4mplvPfytit8AVlC3oOF+DkNjsvWjR8kA==", + "requires": { + "@antv/g6": "^4.3.6", + "insert-css": "^2.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", + "dev": true, + "requires": {} + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "zrender": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.2.1.tgz", + "integrity": "sha512-M3bPGZuyLTNBC6LiNKXJwSCtglMp8XUEqEBG+2MdICDI3d1s500Y4P0CzldQGsqpRVB7fkvf3BKQQRxsEaTlsw==", + "requires": { + "tslib": "2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + } + } +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/package.json" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/package.json" new file mode 100644 index 0000000000000000000000000000000000000000..6a8838330c567743e34ac21f5c1eb8ab77bc38f9 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/package.json" @@ -0,0 +1,74 @@ +{ + "name": "wefe-board-website", + "version": "2.3.0", + "description": "wefe 鑱旈偊瀛︿範鍓嶅彴鏈嶅姟", + "author": "claude.wu", + "welab": { + "contextPath": "board-website" + }, + "scripts": { + "build": "vue-cli-service build", + "dev": "vue-cli-service serve", + "report": "vue-cli-service build --report", + "prepare": "cd ../../ && husky install board/board-website/.husky" + }, + "dependencies": { + "@antv/g6": "^4.3.11", + "@element-plus/icons": "^0.0.11", + "axios": "^0.21.4", + "echarts": "^5.2.0", + "element-plus": "^1.2.0-beta.6", + "js-md5": "^0.7.3", + "simple-uploader.js": "^0.5.6", + "tiny-emitter": "^2.1.0", + "vue": "^3.2.21", + "vue-cheetah-grid": "^1.1.5", + "vue-router": "^4.0.11", + "vue3-virtual-list": "^1.0.2", + "vuex": "^4.0.2", + "welabx-g6": "^0.6.8" + }, + "devDependencies": { + "@babel/core": "^7.15.5", + "@babel/eslint-parser": "^7.15.4", + "@babel/plugin-transform-runtime": "^7.15.0", + "@commitlint/cli": "^11.0.0", + "@commitlint/config-conventional": "^11.0.0", + "@vue/babel-preset-app": "^4.5.15", + "@vue/cli-plugin-babel": "~4.5.15", + "@vue/cli-service": "~4.5.15", + "@vue/compiler-sfc": "^3.2.11", + "autoprefixer": "^9.8.6", + "babel-plugin-import": "^1.13.3", + "copy-webpack-plugin": "^5.1.2", + "eslint": "^7.32.0", + "eslint-friendly-formatter": "^4.0.1", + "eslint-plugin-html": "^6.1.2", + "eslint-plugin-vue": "^7.17.0", + "husky": "^7.0.2", + "lint-staged": "^10.5.4", + "minimist": "^1.2.5", + "sass": "^1.43.2", + "sass-loader": "^10.2.0", + "sass-resources-loader": "^2.2.4", + "speed-measure-webpack-plugin": "^1.5.0", + "style-loader": "^2.0.0", + "unplugin-vue-components": "^0.17.2", + "webpack-bundle-analyzer": "^4.4.2" + }, + "browserslist": [ + "> 1%", + "last 20 versions", + "not ie <= 8" + ], + "context": "", + "engines": { + "node": ">= 8.0.0", + "npm": ">= 3.0.0" + }, + "keywords": [ + "vue", + "vuex" + ], + "license": "ISC" +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/public/favicon.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/public/favicon.png" new file mode 100644 index 0000000000000000000000000000000000000000..1d4ac5deddfcc349e040f23a50c617ab28430a1c Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/public/favicon.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/app/App.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/app/App.vue" new file mode 100644 index 0000000000000000000000000000000000000000..b6a717911e3a7fcbbdc5360f0dca76a1278105d4 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/app/App.vue" @@ -0,0 +1,37 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/app/app.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/app/app.js" new file mode 100644 index 0000000000000000000000000000000000000000..65e861a5a3e0dd2d4515ea20e70c8a9a798410ac --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/app/app.js" @@ -0,0 +1,60 @@ +/*! + * @author claude + * date 07/05/2021 + * app entry + */ + +import { createApp, h } from 'vue'; +import store from '@src/store/store'; +import router from '@src/router/index'; +import guards from '@src/router/guards'; +import { syncTabsUserState } from '@src/router/auth'; +import components from './components'; +import App from './App.vue'; + +const context = process.env.CONTEXT_ENV.replace(/\//g, ''); +const tail = process.env.NODE_ENV === 'production' && process.env.TAIL ? `-${context.substr(context.length - 2)}` : ''; +const proxyPrefix = process.env.NODE_ENV === 'development' ? '/api' : process.env[`VUE_APP_${process.env.DEPLOY_ENV.toUpperCase()}`] + `${!process.env.DEPLOY_ENV.includes('prod') ? tail : ''}`; // http(s) url + context, e.g. https://test.com/[context/]login +const prefixPath = process.env.NODE_ENV === 'development' ? '/' : `${process.env.CONTEXT_ENV}`; + +// global api +// export window.clientApi to index.html +window.api = { + env: window.clientApi ? window.clientApi.env : process.env.DEPLOY_ENV, + baseUrl: window.clientApi ? window.clientApi.baseUrl : proxyPrefix, + prefixPath: window.clientApi ? window.clientApi.prefixPath : prefixPath, +}; + +// create app +const app = createApp({ + mounted () { + syncTabsUserState(); + }, + render: () => h(App), +}); + +// add router/vuex +app.use(components) + .use(router) + .use(store(app)) + .mount('#app'); +// global error handler +app.config.errorHandler = ({ message }, vm, info) => { + console.log(message); + /* setTimeout(() => { + app.config.globalProperties.$message.error(`鍙戠敓閿欒: ${message}, 璇峰埛鏂伴噸璇昤); + }, 200); */ +}; +// add app to router +router.$app = app; +// add router guards +guards(router); + +window.$app = app; + +// use origin scrollbar style for MacOS +const isMac = /macintosh|mac os x/i.test(navigator.userAgent); + +if (!isMac) { + document.body.classList.add('customed-scrollbar'); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/app/components.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/app/components.js" new file mode 100644 index 0000000000000000000000000000000000000000..b95c0e59cd53e808ffe27ba04d202147cad1e6c0 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/app/components.js" @@ -0,0 +1,57 @@ +/** + * install 3rd party plugins + */ +import bus from './eventHub'; +import http from '@src/http/http'; +import CGrid from 'vue-cheetah-grid'; +import { VirtualList } from 'vue3-virtual-list'; +import { elIcons, elComponents } from './element-import'; +import locale from 'element-plus/lib/locale/lang/zh-cn'; +import VueSimpleUploader from '@comp/VueSimpleUploader/install'; +import CommonComponents from '@comp/components-install.js'; +import VueDragResize from '@comp/DragResize/install.js'; +import { dateFormat, dateLast } from '@src/utils/date'; +import { timeFormat } from '@src/utils/timer'; +import '@js/polyfill/requestAnimationFrame'; +import '@styles/base.scss'; + +export default { + install (app) { + // global properties for date + app.config.globalProperties.dateLast = dateLast; + app.config.globalProperties.dateFormat = dateFormat; + app.config.globalProperties.timeFormat = timeFormat; + app.config.globalProperties.$http = http; + app.config.globalProperties.$bus = bus; + + // register element-plus components on demand + for (const component in elComponents) { + app.use(elComponents[component]); + } + for (const component in elIcons) { + app.component(`elicon${component}`, elIcons[component]); + } + + // set default language & size + app.config.globalProperties.$ELEMENT = { + size: 'small', + locale, + }; + + const messageBox = elComponents['ElMessageBox']; + + app.config.globalProperties.$message = elComponents['ElMessage']; + app.config.globalProperties.$alert = messageBox.alert; + app.config.globalProperties.$confirm = messageBox.confirm; + app.config.globalProperties.$prompt = messageBox.prompt; + app.config.globalProperties.$notify = elComponents['ElNotification']; + + CommonComponents.forEach(component => { + app.component(component.name, component); + }); + app.component('VirtualList', VirtualList); + app.use(VueSimpleUploader); + app.use(VueDragResize); + app.use(CGrid); + }, +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/app/element-import.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/app/element-import.js" new file mode 100644 index 0000000000000000000000000000000000000000..d8f88f4da9b5be3a8f9f34385a6495f6fd45539c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/app/element-import.js" @@ -0,0 +1,103 @@ +// icons +import * as elIcons from '@element-plus/icons'; + +// components +import { + ElAutocomplete, + ElDescriptions, + ElRow, + ElCol, + ElContainer, + ElIcon, + ElButton, + ElLink, + ElRadio, + ElCheckbox, + ElInput, + ElInputNumber, + ElProgress, + ElSelect, + ElSwitch, + ElTimePicker, + ElDatePicker, + ElUpload, + ElForm, + ElTag, + ElTree, + ElPagination, + ElBadge, + ElAlert, + ElMessage, + ElLoading, + ElMenu, + ElTabs, + ElBreadcrumb, + ElSlider, + ElSteps, + ElPopover, + ElDropdown, + ElDialog, + ElMessageBox, + ElNotification, + ElTooltip, + ElCard, + ElCarousel, + ElCollapse, + ElDivider, + ElImage, + ElInfiniteScroll, + ElDrawer, + ElScrollbar, + ElTable, +} from 'element-plus'; + +const elComponents = { + ElAutocomplete, + ElDescriptions, + ElRow, + ElCol, + ElContainer, + ElIcon, + ElButton, + ElLink, + ElRadio, + ElCheckbox, + ElInput, + ElInputNumber, + ElProgress, + ElSelect, + ElSwitch, + ElTimePicker, + ElDatePicker, + ElUpload, + ElForm, + ElTag, + ElTree, + ElPagination, + ElBadge, + ElAlert, + ElMessage, + ElLoading, + ElMenu, + ElTabs, + ElBreadcrumb, + ElSlider, + ElDropdown, + ElSteps, + ElDialog, + ElMessageBox, + ElNotification, + ElTooltip, + ElPopover, + ElCard, + ElCarousel, + ElCollapse, + ElDivider, + ElImage, + ElInfiniteScroll, + ElDrawer, + ElScrollbar, + ElTable, +}; + +export { elIcons, elComponents }; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/app/eventHub.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/app/eventHub.js" new file mode 100644 index 0000000000000000000000000000000000000000..1aaaac363b4b5fb95386aba835cbc599e6e39026 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/app/eventHub.js" @@ -0,0 +1,8 @@ +import emitter from 'tiny-emitter/instance'; + +export default { + $on: (...args) => emitter.on(...args), + $once: (...args) => emitter.once(...args), + $off: (...args) => emitter.off(...args), + $emit: (...args) => emitter.emit(...args), +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/fonts/iconfont.eot" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/fonts/iconfont.eot" new file mode 100644 index 0000000000000000000000000000000000000000..90937b4efeb1b4d15019005c2a8e405895f25230 Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/fonts/iconfont.eot" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/fonts/iconfont.svg" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/fonts/iconfont.svg" new file mode 100644 index 0000000000000000000000000000000000000000..8e87f7a47f0a9a2f57a51f7deb14bdd41a6b84eb --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/fonts/iconfont.svg" @@ -0,0 +1,149 @@ + + + + Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/fonts/iconfont.ttf" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/fonts/iconfont.ttf" new file mode 100644 index 0000000000000000000000000000000000000000..ad447c880c43b1b1645e1eb290749ccedd2c8f12 Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/fonts/iconfont.ttf" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/fonts/iconfont.woff" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/fonts/iconfont.woff" new file mode 100644 index 0000000000000000000000000000000000000000..be7d07d34e9b2cbc574b099eebe17fbd9a93f52f Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/fonts/iconfont.woff" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/fonts/iconfont.woff2" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/fonts/iconfont.woff2" new file mode 100644 index 0000000000000000000000000000000000000000..bb6caef57b2d23925a458d3be590ef8de4b070b9 Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/fonts/iconfont.woff2" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/bangbangda.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/bangbangda.png" new file mode 100644 index 0000000000000000000000000000000000000000..6e7319711172dd2df5fb6315e59380d2f195087d Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/bangbangda.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/card-back.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/card-back.png" new file mode 100644 index 0000000000000000000000000000000000000000..6a3cc659a44ee490a6dc85ddde17523f9c70e4a8 Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/card-back.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/card-front.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/card-front.png" new file mode 100644 index 0000000000000000000000000000000000000000..adb0251a0277f3ab357e82df8ba7f2d1eae05d09 Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/card-front.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/dq.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/dq.png" new file mode 100644 index 0000000000000000000000000000000000000000..57026361ed5ba589d4f44d281d615288b6fae49c Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/dq.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/empty_data.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/empty_data.png" new file mode 100644 index 0000000000000000000000000000000000000000..226b3f097d04dd56465352554a501cc7327e3490 Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/empty_data.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/empty_data_gray.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/empty_data_gray.png" new file mode 100644 index 0000000000000000000000000000000000000000..78e3957467f11cfa25865af109f7f6152de7863c Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/empty_data_gray.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/error.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/error.png" new file mode 100644 index 0000000000000000000000000000000000000000..31f8ef9f63e41974e68f3753e1a4c77fdd747800 Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/error.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/fx.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/fx.png" new file mode 100644 index 0000000000000000000000000000000000000000..d1350b0e38da0193ad4205c1a3fc7e095c4277ca Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/fx.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/horz_lr.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/horz_lr.png" new file mode 100644 index 0000000000000000000000000000000000000000..bf6993158d9188c352029069b5128086a36252fa Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/horz_lr.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/horz_xgb.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/horz_xgb.png" new file mode 100644 index 0000000000000000000000000000000000000000..d1ac6ca36a32af346c525f5fdf906e81e2a47ffa Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/horz_xgb.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/lbsjdqqf.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/lbsjdqqf.png" new file mode 100644 index 0000000000000000000000000000000000000000..438607f7293a66de501e836768833542b4485f7e Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/lbsjdqqf.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/ljhg.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/ljhg.png" new file mode 100644 index 0000000000000000000000000000000000000000..3bde28006d1f59f5061d756919a9339bd6666c96 Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/ljhg.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/mix_lr.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/mix_lr.png" new file mode 100644 index 0000000000000000000000000000000000000000..5bb875508db16ba190e094d1b7b6c3e5a6a2ca80 Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/mix_lr.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/mix_xgb.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/mix_xgb.png" new file mode 100644 index 0000000000000000000000000000000000000000..c3b08666d285283e97a63743ca39c187898f3c6d Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/mix_xgb.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/mxxl.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/mxxl.png" new file mode 100644 index 0000000000000000000000000000000000000000..620230465192202c597971e5e3189ad0aae382e3 Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/mxxl.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/node.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/node.png" new file mode 100644 index 0000000000000000000000000000000000000000..1e0ae3a3266f0f8a32bb542aacb285e53e9047c9 Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/node.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/sjqf.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/sjqf.png" new file mode 100644 index 0000000000000000000000000000000000000000..a81dfb5ee63d2c79f5401a7270c61fc2d8872b8a Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/sjqf.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/sjqg.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/sjqg.png" new file mode 100644 index 0000000000000000000000000000000000000000..976898ae39e41cd40b5c955b6a091324d620baf5 Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/sjqg.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/tzfx.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/tzfx.png" new file mode 100644 index 0000000000000000000000000000000000000000..75ffda04d6af5844963b67ee5e9fb19839d58afe Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/tzfx.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/tzsx.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/tzsx.png" new file mode 100644 index 0000000000000000000000000000000000000000..b7569818053f99b8b2bac921e6782dace85b789f Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/tzsx.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/vert_lr.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/vert_lr.png" new file mode 100644 index 0000000000000000000000000000000000000000..c10dfbda1957f4a7d646349509c65afda8cf1b2d Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/vert_lr.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/vert_xgb.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/vert_xgb.png" new file mode 100644 index 0000000000000000000000000000000000000000..8c41b69ac18e9c02d7713ab5fdebc7c799a93b3a Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/vert_xgb.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/x-logo.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/x-logo.png" new file mode 100644 index 0000000000000000000000000000000000000000..7e0b45d48cf99cc553e09555dd627838634519ac Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/x-logo.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/xgboost.png" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/xgboost.png" new file mode 100644 index 0000000000000000000000000000000000000000..5f9f616837952d21f9d3f751ecc14e99ca3b9cee Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/images/xgboost.png" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/js/const/reg.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/js/const/reg.js" new file mode 100644 index 0000000000000000000000000000000000000000..695cbf3bfe20483614b7fdb836694d07289bc72c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/js/const/reg.js" @@ -0,0 +1,14 @@ +/*! + * @author claude + * regExp + */ + +// email +export const EMAILREG = /^(?:\w+\.?)*\w+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/; + +/** + * Password strength + * include special symbol combination of numbers and letters + * 8-30 long + */ +export const PASSWORDREG = /^(?![\d]+$)(?![a-zA-Z]+$)(?![^\da-zA-Z]+$).{8,30}$/; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/js/directives/directives.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/js/directives/directives.js" new file mode 100644 index 0000000000000000000000000000000000000000..401b74670fe65cce3eb01ff92262db195c1d2e01 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/js/directives/directives.js" @@ -0,0 +1,16 @@ +/** + * global directives + */ + +// e.g. +export const btnPermission = { + inserted(el, bindings, vnode) { + const value = bindings.value; + + // permission + const flag = vnode.context.$store.state.security.btnPermission[value]; + + // has no permission, remove it + !flag && el.parentNode.removeChild(el); + }, +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/js/polyfill/requestAnimationFrame.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/js/polyfill/requestAnimationFrame.js" new file mode 100644 index 0000000000000000000000000000000000000000..49d3f6a82df00e3426f3946568227295ee42a63e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/js/polyfill/requestAnimationFrame.js" @@ -0,0 +1,34 @@ +/*! + * @author claude + * compatible the requestAnimationFrame + */ + +(function () { + let lastTime = 0; + + const vendors = ['ms', 'moz', 'webkit', 'o']; + + for (let x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { + window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; + window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame']; + } + + if (!window.requestAnimationFrame) + window.requestAnimationFrame = function (callback) { + const currTime = new Date().getTime(); + + const timeToCall = Math.max(0, 16 - (currTime - lastTime)); + + const id = window.setTimeout(function () { + callback(currTime + timeToCall); + }, timeToCall); + + lastTime = currTime + timeToCall; + return id; + }; + + if (!window.cancelAnimationFrame) + window.cancelAnimationFrame = function (id) { + clearTimeout(id); + }; +}()); diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_element-ui.scss" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_element-ui.scss" new file mode 100644 index 0000000000000000000000000000000000000000..f19904f1bfdf5ac575ff02921d507fbf411dc7c4 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_element-ui.scss" @@ -0,0 +1,96 @@ +@charset "UTF-8"; +@import './_variable.scss'; + +:root { + --el-color-success : #35c895; + --el-color-primary : #438bff; + --el-color-danger : #f85564; + --el-color-error : #f85564; +} + +.color-danger{color: $--color-danger !important;} +.el-input__suffix{ + .el-input__suffix-inner{ + align-items: center; + } +} +.el-message-box__status{ + &.el-icon{ + position: absolute; + top: 50%; + } +} +.el-header{ + --el-header-height: 80px !important; + height: var(--el-header-height); +} +.el-table__empty-block{min-height:100px;} +.el-alert{border-radius: 4px;} +.el-form{ + &.el-form--inline{ + .el-form-item{display: inline-flex;} + } + &.flex-form{ + .el-form-item{display: flex;} + } + .el-range-editor.el-input__inner{display: flex;} + .el-form-item{display: block;} + .el-button{vertical-align:top;} +} +.el-date-editor{ + .el-icon{line-height:2.3;} +} +#pane-result{ + .result{ + min-height: 200px; + padding-right:20px; + } + .el-form-item{ + display: flex; + margin-bottom: 0; + } +} +.el-input{ + .el-button{vertical-align:middle;} +} +.el-tag--dark.el-tag--success{ + background-color: var(--el-color-success); + border-color: var(--el-color-success); +} +.el-button--primary{ + background-color: var(--el-color-primary); + border-color: var(--el-color-primary); +} +.el-button--danger{ + background-color: var(--el-color-danger); + border-color: var(--el-color-danger); +} +.el-radio__input{ + &.is-checked{ + .el-radio__inner{background: var(--el-color-primary);} + & + .el-radio__label{color: var(--el-color-primary);} + } +} +.el-dialog__title{font-size: 16px;} +.el-overlay-dialog{overflow:auto;} +.el-tabs__nav-wrap.is-top{ + .el-tabs__nav-scroll{height:auto;} + .el-tabs__nav-next, + .el-tabs__nav-prev{ + padding-top: 16px; + line-height: 1px; + } +} +.el-upload-list{ + .el-progress {top:0;} + .el-progress__text { + top: -17px; + max-width: 50px; + overflow: hidden; + white-space: nowrap; + word-break: break-all; + text-overflow: ellipsis; + } +} +.el-upload-list__item-thumbnail{object-fit: contain;} +.el-badge.el-message__badge{position:absolute;} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_font.scss" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_font.scss" new file mode 100644 index 0000000000000000000000000000000000000000..4fb7d31370c5177c2a3a8cd9dbee060f62088fec --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_font.scss" @@ -0,0 +1,279 @@ +/* https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=2273296 */ + +@font-face { + font-family: "iconfont"; /* Project id 2273296 */ + src: url('../fonts/iconfont.eot?t=1637151200'); /* IE9 */ + src: url('../fonts/iconfont.eot?t=1637151200#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAACl4AAsAAAAAT7wAACknAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACLcAqBgjTrRAE2AiQDgggLgQYABCAFhGcHhTEbAUNlhhxsHABsbb7moqgLi5I6+/8vCdoYoVB/aLUpUAjpkZGpSKI51WgqBwQZ026OzPVQmJsKiy9v81n/wUVToB2Tbb0FtgefSc2Vfp1BsKSjKdLjYoOmEAwpzPTKw/2/eM1895CkaBJEa/1bs7t3DxHlV2QRAsKFVYSPi5ARKi6KQHZQGL57nfrCTaS0NRPDglt+zfRbm+p+iANkSzre6QDbv89b5uFneN5tvc8SlO1iKAqoOEDxMwQXWxBBRQERBHfm2KVeWtoy29amtmdDWzam1tncXt2qbNzY3l3jtn/2U9P73+nOSHaKTAIn7KTMvkjbmzS9GYoEgoUrUUyOzO7XCjBUdVN8BOlxl83yAqEkAUqA5vZ8rzq3Cjer5uwG54U84iAG3fr65M7h9P8kjOz6+LpVZ46cqE8DLbQJjOw6+BPRNUWq5vc/Av5+aUq1J7kVOenIysymvnTAOg2Cgf//0/n0t5z1d92+5CadfaOVLrH25KKVW5Pl1AJIRQZo1/Jkdl13XaVUKb3DVlB4mBEygKEhLADGMOkUOkGeAGYDRKO6YnS7xPhyK6N3ACY+NDNnXbsEzjhQUqCOwirQ0et4kJ2HEDmh/EQk1Fp2KDt/8+mrOn8OEtS1grl3Yrdwem5rUOlIVziiSXVPmbvd4jrpvxLZR32mfBx99ukP65SSKeXMPt14+LpUd9/47/RMkv/oX30rYMsZSsgxL2xS9qW7N31hvCnMy9VmvT0n6ZPj3DNTRfRiiRQnHkxMrpBbjRZtFvHabr/DRpw0GX/5v1RtS9nr6fzQdv2Vv9sIUIMYIZbgyjgut3r9GiM5t/PEg59+X5m/l/Xu/waPebuGDFsyYtSYfeMmTJoybcCcHoNaNdrQoE61Q92SJutWtOmwaUenNasyubIZy7osqNHv2JV2R7bsaXag1qJts6qcuNanXklBKsOC9ZD36/4TKoAF5gkI2CUQwBCBBIYJFLBEoIERAgOMEj7AGIEF9gkcME74AhOEHzBJ4IEpggBME0RggCABcwQZ6CEowCBBFYwMf8lcCQCwQQQCDUQQUEcEA9UEDTgk6JKkwgCQCBbQREQA60QksELEAm1EHNBBCIBNIh7YIWCgkxADa4Rc4lIcADKiEMgJN1AmaoAZogVYJtqALmKRRIbiBVBDbAf6if3AMRWHgRZiBGgnTgJHxCSwRfwF7BH/A838AgEH/IIFavkFxyxqxRfMNpQEMLNQ7GCqoPSAOYFyHkAvv9GAPv5YD9TzZzlX8vYfR9cHj3yqtvEuaYSOO0rxP17FnOjaNzJ++MjuLShNYKPChxP1nhrenOI7TlATFvH4JFoCNRKZeLJkUQ/Z1RHfTRgRxOvsRHGHFT0uOeoc5H+2yvHuGHtjA/YKgZXbl/1926Y8993FRZrGof3+dbX9+0Dw4MCiDL7hqzNm1coHley4L9ePhxhYlJE5JVZ9HbHTudpPNNBTHMh7CFv4VB+EezYiptr2PImOXxVdOSm9nGbNJmMHbyrR87gc68ExsH0/21CMJ7e4919QIJeSJ2E3NbO7dY74tOSTRY7LdqvNan08hSzM5mqpy9FJwtSVywaejJZ9jlUijDXMjZXUant0IEkqmUxJub3S2oSxsgwGIklFICFgPOgQqF9pc8owlXJJJ2HypDZnb5csvx9rP0a84UxYuPBVUH4KvZJI2++9m17beexRZtzoTxesdJPF1VSFgV9YQpSBSseEKdZxPz9GMhkdlHybpP1/PPwv3L/M/pMtCEq30AnJi6bdauMXmApoTsWSqiLR9nOiSonsjiBR1SG/yGkkUhPyg2FFNgu11dKIrGmC4kVFRbOw5IwLimYAlh+tKgYDzZnjdQk8SMyxkljHfKar20isjNJqce2OOXoKSwyJrXw7WGcBO4AL4nq0dnlEKpSqVVNrh+TQLXysN2RTi4ycJM49p12bYaMmB0JoKM14jBd0v/MM4DBIwBMkJZqjbcY8QZlNpsflHAIQvQsTJeZF0p0yAGIiLfxSpeew3CKUqikK1SPdxrvQd7Fb7SCq+ek4sCa35uQa0D7PcPteLmb5eqFDiJ29YEJoq7Rk2y4TQiW2pBFV/4FtjLaOBLPDRniTiYpdhOzfTyqlUlnD+/wFg9nZfDuPvYbWqODA5KVrtBm/5pfsy91Ke+0SN0LpfIuzlZarEJNU3OJO9PSWyw623uXRA4KhwZ49xw9Uhaq3JVKexR07fgIY+Hjr8XJpnP3THW2oqKBCGTtRPmd5cK7X5NPw/Pyl3pJyafXJ8dLH9KMi/oKp6HPqhl3hqy8Lnejx5eNplmVoWV1tBa+vWK+JLOZMYgrvvVnQLINwhEJUZgVNLngERmJ9g0pd8qbZFT5TipbBsPRJnuFAW3snT+lfy3pX3UfiJMqWojpoQiaONDRZgBKV+irZM8GV6qk+E+ufdtvDyV6wjILq6D5A0uGJsbQOh8nMvsIbbDXTnBoYguJ1qmFBWCdp8m2CBbd2IVcuR3UrmbDIfiVM19rFS9iL6y0QjP3zm5n7oIH3sxH9uLLY1TrkS9cGCem8cH7l49W2Dx7sv/am9xdOr9pTag4x0mKDViw6krjhhXoZuLuNMB0YHTiwvrvcdzpzbvDafaOJ/T6MUoAk4+9loaOW1h5bDq43rlGGpSgFoUxUk11mO/l7EmN9gjUFhxes70O2WMh+1kwKqGRCNUiIyUJXzfxJpx4ghWRsKxCGD46BShd85eusTOZ/wccTWVPsEtNFesmuTWzt2UDbmDcePPXapSOy65yJg9cHuWxT6D8SNZunMZVSQgBpQXGPY4yho1Q3TUHgUEvyEiOn5LiHycIY4uZbBVl04cQuhXiYUhIcwWqJZ3rXAnau/NpCxlrvBlLcX6NpOXeLGYDaRDphSVStlJCTjyEpa26Sd//1iOvnwH6JNQtk8xKtw93d8I5XXjY57QtpVD23LTNbrzN//6QRzhVM0pd2PbN+/Zl53vBcbYn2GfXNmgfF1yQPrTNJ55o5Xehwd3OJItiySOzm7SQrULpY+PkCBelKTKd0oKCtX4tVRFELgeNr4mmnK+5+l7ilC5vP7Fm/dWbrwqBnJZcX+fIodjCrT5ZZOQB95hXYCY6MZwP7/9WhFvEGj+RaZbaPfldQI9QEqN00b3agmjYmVfST/uzdCjyzb5WYI9NQ9VXcZ/2YqSVQGTH7Rsvg7P4xjm7t6gESt69Md6MnEyS/MsdmQYRjVehMcbo2sfM+XEKia0fGP8srgGdgpvrvxyRaqyfObuARDjUNA4FpR/8BjzfJ1fvAVMFpTlfcFFw1gkKY5SnnE516e1JlMdS4BEIiBq2OVpH6GWkkE8dMHLLaBRvIUg9QyxmVp/XwNCyZk++dP1jOtiAMR3csL2x5oHimEe51J3I9a7mj2a8w3Lvy5Ebu3FcmUP1Ff/SekVztiZcUYyHwYdEeC08XlaUhKSglBBEyX7nXVLZKB4BMxrO2+slMJsT40CA/XclM6efT8242WjYHS9Q839jMgoSc+XeGRJmRWk7OJrdJX72phq+ZDzeQltizCVnPqLPGvDb3jjbh0aWv+vPzdtWwfAz+Oe1V+ll93FlHbyD/w7iDSL9pCYKieC00x9x4wWwEMV3HAImru5T1kcOrr7shCuhjyV2CMzdRiS6cbxA5jHu9nnou8i0k0hZ2JlXYdiwPS3we5FUk+im/spfezcHBzdP7yVN6icO1KSHruD0JHr/VVtg+uU2UxuufKSLaIFjeEJQvGpWnnL8TgZhnGGYiDe24OC5NpGIV8WVjUjKLiPu+MPf25x4cLlvfwD1humd1PgJ1jxCEUZq1vPVdyGLAQMwdFCF5G889oO4gBFWkHNYEnAtolrnPIEbsXjvlmmpqc8ne9+qzus89AGrXaxqme+a+0iRsfHRssU75hIQssLbn8bxmgTfcdPImLGwZdNdXG8mx16NSTxt1CyEpNbcu8aNUxhRFJ8Hh2PoIhaOYTN+WP8wv9XNzCbYUBRElfuQJBHCM04ggwOKQ0AK5+AjCc31Q4SGZJpeec8xS/ECpA8oL/xKBe65FFpiRjsQ7NM+pjBNrCfISbEhsVnIYESNaquWtOV6tMul63Ft6NdU2k8XRSTspsHedlRTb9B8CPA/CMbtiy82CBZhnqGPocaRZ4bteUAyQb3uuFNfpjDnnJxOSiFgKFQ/x30ErHAtTLdebpocyGtVYrPWM45h6TmiopEBddmnDUX/9zX6I/sbrzdPsW2/kjd4Gab8UKrcChJ0vZt18a2kONKdtx/C6EEgIk+i+XEhY2IJc4Lq95dJkcLaktRsVRADlhWjCOCetZWHhpWykU+Y9Px8PQ5WxtE/sYpdChFxNhY6tM2sIoFLPmlkb5Vw2tVqCvlJVzGJqs9JbUA5c5vvzj1WKQsOl4nPV++QMV1oxWDNYz5ydrfJndHiviHNmOy/FF1mrkIruWXWWJ/VltVj9rZHbbsr6pvpGCOC7l5/LFx9GAsERrJS0pm8g2UI+B5TBmen5/uLppY/Dmk/eudM+QfRi5V2rnYQSl4fbLVTKABOfVSWGMQtwTZ4Q58V7ISAVLDBiAkQriYFyodOVikKWUtku2EJF++RT47udvUmns/G8x/E07D2/mQ4dztjtuNdM3PlsMj5Ihq+GifNZhwvphKmUYsvC8kAC8q77N9NC9t5EzHoBKsH6OC2cuqn74ZyO7J5HU5evo0gOXiEphFEKMKTMtVsQq6GrVfJ2qendP72HXMsdVKuffz9qAngfoydf+GDmfho7vaxejpl68SM7/yu397Kec/dgjbChin7mDlwzs+/8018P1E9xs+R+9Zm/hhaMqs9Yk76mYRISNvCULywB1t100iU/G+WwHKwXYRyUMaZzeXWi5bRbSk6HvIAfLzXUgFcPE1LRubfjqAsSJhDL831V48r4/CIim4IGOTr2duyL/L7qhp+lCp8NC/BQxCveQR7s9z8lgLfWQQbVQv29au0IyQqjJhsXYyUDaEwikW364JWZwAfbZhN7EfziIUy0zoRj6DZ/4yUPorgNOsVzUC56W+2dNKb7tb4pfaIHbEQ+PAhM7HmfK2RspUev0+XGC0N5nyFT7jnqI1ndOuyYcww6Tt9DXwHWUkvJqWzht5W5ESLXbEHW972GvbgbrRwIUlaO8lQaDkDSljThSuqBc7/tlhh0o9WJ3jSZUKwsR/eETNnsnjMmyzzuilNFCpwwU/+qzaA6qI8ebcsiJH2uhbfDRg6WJkr23pgjOVv+xAhaPnpM33zZ4UNt+dvIJxuuthv0TO7tRJwbrx65ll6BgZqrfGx4kRa63GkJl77pLJtddBSqjiuaHKAJfUgZkYw5gkiYrz9HCbn4heutt15BiVr6SqNsTUkdwnj7RygdUKIinkQBOlI0FuESQE0EodcdQlVNOIfsu13cACVZzDUZZVvcw58wFX1MuT7MhBVZrX5ojtLs9Ej2Q3HE24gUo0PTe4qhYBJ7bISr+AuoMh4EEvtVmHxhLQN5ZjA+H5HM81qsbS6HQXkFygUC74aPHgqOLTrW50Lj5hzPV7712vwR2mkIr2gQD07Q6WRMFTNxDQAq8hz8RaDWPqe2G0LwIDg83trzl/RLK7OsAYeoYGcCgFau2M0A8ZEyqirDqk/Bzyx2zAWj38/j40Xfqa07OFn8gzkR5oalocWFeRinLOOuqk5gzExmvSnGYYZJN3GkoR1JRLK4AVnJEY7f6ZigDHs7gmCx9k2MznpZsmMkpYbkbP+vOqwaX3k4+YtjM//nDJHQQmfttxN7n1MeH6Y6l8QBww6J6zMiJR2w1/5MF9X+RfiFENFlRsDxTUCvqD5D8HrrMvx09zRehzZI2K8vLU21hhTRt6mkdG4vvHGxyE18CvduFC1+UlJ6LDS/pE0/lvgik9eXlvAW8eSHxr1IdJ92OcTq2S+n5vZYIV0TFR+ZK9irpUXE50Y+orM3aOgmFlfH3kIRCKiK3iIQuncNAamqGwBh9vFAyPX+9Mcz9246cRogoMScnRE7cVCDEKCAgzFTMG6IAlyBqLjzqXoICaXpo0Kxzc5AMgVCuylmTAEHQCC/gD432RkYEHcordFU/flYpCsIokAIfMKa3/FQ8PPzdKQrkAxSDcuWhRJpNwHZFYikj70IxhRBwM4xDKxCrErM7diwy5GkgbmYoqAXRc6dop/UIpkHHQoDK3g+qWS0BzTb0PssSuAxb0ao1u3sY1DofW4Xp4fbe6lmodlQIz8rjvwGkqHKnmM2y2YmldnntD/nM7eZ4c/YbLMc6yGwmRxCT2R2lLqr3ZYjHH2LtLU3R7jiI+YROAwOYd62gfbmzT1URl9Xe5Q6O7KHwGGy8bFxsZmZsXYgf2XiApXgr4OA3TBLBac33QhOb/b7WReJjf1xZPWiPAQtxByWVrP0XEPRbtztsrT02kw6gURgfgH4ERU3bGspOv158DsOiE9sZgEF2y08lj207tqutMIa98Pd/wUNveXNmNq9S5i4bsPrT6ppyZ/tvjHv729Hi5am6xjZeB8GGs1rRL9f+Ur3ABZ6uo039wZPTPqpAATtGtg427Hs5OBfDbCq8KWJVf2T4W3AN1cfQWDcGgWPFkUyHVfvvvh4fiWMelBaCwImxpXjDYY7vUu+2rukrHeWLPE7rBxXfmq19PcZESO/g8vP5QKmPxZ+Cfg+UROsDf/peuZUYro259vuF3Dxk/GOTN5m5ub67Pv6EbhNQrKQsglHNWe4gLA/9Jv4ipgPf2uE3H2eVAunnTJmEx/8HoZRf9sNv/njmtOCOMoLm/9X1Blafbsv79dbjXv2dNuoXxnte4becI4aK54iaTzqfkQz/L8iV3K9Sx8iebM+BO4l7g2ULyQvd1Ng6tKxcT4FYzwNXnb/888zBiTE2e1xABZlOWK0PJ42xhHL02h52C0Nj6eJdcTwtBpews+0vj6aI3izH2zp5mAHrW9p8Nelhw7VEaaYgHCCSLL7Mt03Raw7dKiPRqEtaDtBAEwSYZ/25XpUIok5TbxNmALwZXUruF6ClYgixCp85y0NwyNQLYHEnCIgji++veMI4hSTRKyFhkf66GR6dVtsw468voE0F40jkOmAgMNDdEox3Jm0YX3Q+g1qTcIYvZ8+uoprwByO7Y89jDFwu6TxRbArASSWofV5BQ0JcxsT2suhf2GqUJL4uWb4DVKLlPlgKkb/QxcMzCuMvvjJhuOHqkjlLJOefDF6jlCNzlu+nixCyjgtf2OG+bkkhany4d8BozqGgTjMLeVglc4glAYF3KhZcO52AzsmMS8BtpCRIqSgSwm+hgzMOZw0ZKtyBgq1SOBBtcLFTQjviG+NGFT7CkyCeLOg2dIsEJhNgjnbYzrvlmgcztX2DG3b2sur27Rihr93sYFj/bM178jlzFff1fG7HqENt9dG93z+Mf/0Yxw+nfAddkNJZd7VvrSivkfHBSFZaTeu4fxCYkJyNgLB6wzwXEv2TmqfJSff1pG2kDT/a4ni/22kYYLuWXLKHd3a+FX7wPorY7sP8p+nJN/REnRAO5n/i5U0IsXoHacOtKy/Vad0b/cGhKI3IdmvvhblodBl6CT9zPjCH4OWj5GHiJIXb2/EWopZknSMoKAZNGC3kLyY+ezvRRPoVdjhybMYvDWQfvxVXi8WRUBsQI0h8T4HJs/40Apo76hK4HseOzw1hEEe7seSoqQR4VDiX7mOj14e2FRqJS3/zVp++u4fc6o3+OswCDZH0hWGxaG/ieFl5rK5mndAPlXy6ItTbZxK6CJSkJm6+HF4095g78PXP7y5AahoH99sS06yfK27ndJGnWPdIp+GLUC9cWHcMenhQA3D38zyYwZlLwlDGq7TjILZJ6nMjmOR4we/O+jz/Ap+I/W76bqeXH/RmP7mu5iv+/ZXvNzs2Zvzl3wqZ/8Eo+7Z+GpXRssGodIRPB0/Hey74NwOS8KPzGurNNFKq9QZHqVNx246RQgmCUj8XwFXJWl/v9n4xQeHyOAjS+LV/DJ2XkOCyohJ1oq8mfxre2Zmnus9FRPfe2OIF9a91lBnIGs2cHVpR0y/OWoDssxmYfSMOXMikyY30HTmQTNW/ji7M4cplCskbUMyoUI2aZoUV7OlP/g0K5p3m3ZbFBZ0bgqt+Gcp40Ta4OsE5iLV62DZrX8ZSgVBr9S3mFo6lB043p57YHqCbEZMdk5spTxLFlOZkzMjtolIaKVlWXLqK4YVfM+ULKnwKBZPF3cVadXVafMc+VtecRewLxNtW5XtbcrtQ4ptHR3bFEPblW3tyq32Vnm5rLhYVi63nCcK/sezBES8k3rPVzGXQcghBEABQfekROpH+xMtJeN5tGwuTc3R0OCp49+1syjAdCroheDX2F+76/UmlyUsJ7SriZ3JNe3nZgEtdH5HeWFOiet7S20qFnHtaCKtvURPV2XYHGVVB7M19AzmNiI1XOW+fVcri6522i10+qzqlG+/GSygJmZnMDT0mUWyOUswSbWhpX7+g7uBvzZpBbISBZ7OofvZMP5a2XCew8frgy9PUoRlv1W+zVYMp/BgBml30BhrOG3Icx1uy8PexlF4/Zp+HgV3m7KLQuKzTHEuIhWF4G47E5H1Mal3cEjsHeptn/a9jLvtEE4lcNfjGaWOgTdnSBwWh5QkLSqSJJEoYRRS5ERaLzeljkuQzc8y8c2CotRfApmdBkPnNf4o0rS9aiHKX18MsxFO53CgIyB/w1cvX325Pj/AHrDf6RQ9fpxoX1j1uQk5urRYvmix3IPe9BFuU6a5XZKZUj9ytCFlfX672ewt2begFkFGeEO8TqdthdStLM8o9uh1ySapLkIlCHBOu937L3WCzIHB5XuF/QER0OZ/mHJuVsHUx7RSdkwjkoGx30+sKj2+/7/+qYV5GdsW/f55aVdrg+cs7WxziTC4duTPtZ39Xd4F0Cg4AcZfjYANkRe4esLavoqfmIjvIwBC6J6aCAx4H/fQKSI2TKHAdD6dCnNgChWmC5JjOTCVM4iEXecikQgvUutSGgwnJlIoHDqfQe3XpVA5dAGDIoITqZR+Z9KDDYqi9nMonP3W/fvzzb5kJb1iy/v8cQrivFfE4fNpYBTrTFjMg4Ak5ktVXiDxRFgkWK0PKUOphOxR0hAjECghTLcotavTuQL6vI/tz6cn+xgEAX5UySDK+j/QuLC/ZgJ6t0LcDJvKp2NVycMB+B9UHC9U5Qr+y1CfyCh1H1bpUvevVdnOFNeUINUfwSQvGdkafcn/QVsE/DmH0inVTnbVJ1VLM4oZB5Iz9ppdoLk4yS2VupOKm+vFbn+r0JczXzOT54lyrVzpivLwqoDQwoez0xdF/qhOL6A5A3TJbCuuSGTMiYsvjYAzYYP9F8DegXKoiucIygpCjNKZcv4bsLOjTmFR6Bt+zzH8W3e+f+7xiUYOp1vHCcB3j6GQ+zA7diElP/u1vXKrqRzPKNsCQXZMth6jgUjGlqCYJTKPB3Cpw/WOZ0meq/cr9Vu+C3M0dOvMAFKBDtJCmuUdTlu6qlQ7frsb/o5YuQM7hsKuxNY2UpCNNESx74JdyH1Q+NL6AJJOiVIglNoqvj2+FWGAdHooy88IMGDGqUJ1bhpBrz6dUe4ZUerTzgyobaPFdSUozRw4wUsOmM175D/VHqHudNC50ozJ7oakWqmhOPZ2SsZ+sxu0lCYV9wR5SDLOJmQI0Q2sXumOKuHNBIn5ApE5fmEUr1SXLrIlwtZK4pCVRopts1GdqQbdvscwuH1+Xi/OhJiFGHRCzc9rqOHd6y5jMCgk8SHGakdB+ShTNnRv/NgtKNPM9a+hB9B65IxZQTV0N2HBECbROCYdKi4KQtQwURWY5RdlOio1RonQpol0CBMSpUnLDnAEsBCabv9DR+4iPdt1y9Ll/r//atCTzhxj/27oHoTH4O9hjuP8DmA2bcOYoHLkHgeU/NVMEnOul5yDhHJQ+ZnIfAjhQGRf+WBbz5mSLNU8qzFYmSDOQh9CIr+GXv8epgkf9AvoyyGVdssuDaRCQrshL0hSpnJGOe1WgUNEyoUm4hI/Y5/9hH8zuPPOPlVXBpSVtXCxaash80ZkAZ2qa19ZXM9+wsxIHyTuq/2XLnmtLwT5ZFnnLTaZUWRsjxWtizsbvuT5rBFMuMQqSyiAqiQFTlEtcAlldvTMeKc9GdTOBwCKstm8pCKJpKjBkU9s2PglvgtW9Q0o/cnhVLTaXBx1NiOsfGqkfLx0Z+2cuX3JR3zdNGilqwNb8nylyC6LKvavMGRW+nt4cps4XmA2C9SL7to8M4SVGWkzAu4J21LzXZ82fhUAxAg7S/Ao9TE/lf849ZHg+2NxsfdRdtQI2oY6irKhfxjZ+zvTzjxqhZGgC9cVMPJQ1l0F/fmofIalIHewGl8zmBuV1+CrB9EfFdBFkaIXMIJLWgqwo5RRbAFuzTL/1L6PjmDp4rkxMbHkI9G66CPkOFWaKjUG0bs5NprPTeBQfjm3KSJGmapKj+l5CZuxkOwIGeC4PXkL7+GAuheUT54FWOK5vYsvlpBF+JpXoT7U129GiouzNCdnSYlJH5qthZmSO7HzPgk5RlpzPAvaDGYQUCG46doNaw1g8twW5E1NiRCnFDaR/Op5OJwsZXxkIjqAl9mGawot0U6eppWwFWmtvKZyriqgANpSEpn9FVh2Jzc7ewi9Nif8nxZBKRLw3Krp/MhHGxqj+yhRLhJWWv2yyMOQ6fZdrHGiJbFBuAeTuzzGjgFkOJxQikduJGH4TZWDVXsHXoY2TUgwIz0AvhzhYDe+Z0+y3zeyic5HrEnWIycxYZIVRGojHVadjNwWp6SsCz/f+V/8f3MuhK9r28MuzBnaef4bX3ziki3/VVWnmu6UudAM9KiEgM8KG0337AH4p8ohssGwTeS4z02HbTbYIbqfaCpMecvo+wDaO7SuFYy3gz7d+IqsWAQV0lUDlP84KFREbHhmFFWnA5S6JxOzd6v6X/a2Xs5QmQ8NgxDNOnngaPObt+U+2P7J3vLH0o23jKhdWOrJpdKU8W3GmIrswXTNgkZVXXp6naoRRSS07rtRhUq4YbmLrV7F7NnKrfsU3rY2zN63VTnr/fW91hZ5aZLHk1QqRzumbNM2Ow09fCrKwY7rrb2JQ9vFnCYZQj9u3jgw/eEdE98YF2fkm44BKWmMO2sfm9g6VLVFEodY7JAUPXHkD+0QF0meqOLM5VcXYq9h66Ig6g/WyYWzUYvfbRudfsbNr7PCq7FNcJndUM1uwpXBBju7GtcoLFn/Y9AKy48lqvn4dfwVJS0LNBvwK/gtJZoFGCPBX83vHEjW5XMceOfGx1uYh76QfnFIOmiMCbrkcjNhkYuvjdeTrPIX+saCjrmwPqOjI2MVkZKrdfNUXX+7jqPXpX5+rlV0fHbOOio+SUeeqFBA0oCcZIvP4OsWu0wEuYrSUaBvWnEwGRYMNps+nE82Exc3MUTQKvB98B3yrfaWux2tG9Wg7wP6x8m/6j1Sl0TsTPI8k7rFLpfYLX1O5P7FLqn7WZJH7HRJPNK66TJroiUhwZJovQIEtO7bmngl4QSm6/HT9R/w092koDFSf5fv7G1dvVGvWpZs61wS9cfwTzVOSQEsKhA7J4j00AWwUzKh89WPnGbB1ZsmMJ9wAnTWPjGxB9NkrUtaKBIVSl1PHOmhC0Uu6RNlW/OjxyLMiY/PEVrGDBla920Rjmlf8Outly22335rj5TdDap8906nwH47jEplfbh2ZZO3cLYjAHwbsW5e/tzIf9iS/IN3RPK9VwKS1172eUcUk4QWdD3mwopz3VVjX0lXMDvTz9G1Ry2ApPHzH8+NmpyDABJuyoRKFflb9ZXAkPk0ENNqWMKY1b1SQhyBmvHZyPt06+7hKfIFv3DfC+QSKAG6TK+vH2ZJX5355arvGkYgY43v1VHvw/3wlpDlTU1bHpwB4lb1Kk6TD6dm+TRxNuatFhalnWKwnJV6CuoqOMew2NgmtoHdhGWzYih7+9ZvSR65ndNOzqO0g7DjJfMb0mvS0quUtf8qa9Jn1qQ2KBD1itrUNU1R8+9tTa+qTatPn1/UeJcUiSSF0qKnQFfOJfZInhHBkBQmuZ6+y7Wk0CXySBvsp1GJi3zn+NIWE0+XUyqJ4xo0mJ7sHNTMm6cZPG7I7j2oOU7s0es01YViOwzbxYUPDdlD2+FC8cOEy5VPCByCCrfqKfXbeTjVnnQLzE//lvLtKp9A1LxcbBy0FCEUX/u+GEB8n7LgJvtGtbIXXhdPe6noQ3vgjMhDjd9HQWwn1oZ8wCFgazPuGnIkVcXISFRn6Im34mzZCbxovFiD+HWlqWX68uEuXw31/hPehJFRBoEJM0taSKrK1lSDHO3tnVTIOmbvXjUcQYkYtg8P22xKspOZkjIw7gGOtxS4NxhC4ySeaey2lc6WGyONxJ0k3J1vzsmTRTJxinz40y/ppE8Wo2phS1Sa2lG9nZXsX8s1aHPD1BKbVl5pkNlDajhdPspDAXtDwi0cpAHXg6G7d4dDdawt9+TCGuJ9+k9hwW5NV5dm9yEioJU4bOXP8vNDW0IaQ5oGmg1N71ChF0YYFkvZWoaSqUboEVmrGWqKWMnQMF8uRugvDZ2i1dE8wUXBLkNm21DWG0gRkWfVkUVsjaj0BMO4KylcNpdSOYs8AwS9dhlPr21YY4rq1542+rX2zOnML78k09adypyp0+vqJQ6d9JZ78VuAd3zo3v3nll6wusZhza5hIa0oZ7Tm5+GkXgkVQFk76Wo2gIyIPzWMqCu4qETbUA6JGdLQCAE/m+5PxQy/u5LKBZeoo+hlmtiA5zyFGwZIs6LjhPXXPCTSeMhL+hEnOJI51XXxVK54St8rvDCIjWhcBx54zTlZbRSeqBTrig50LX1AQ1vpQ8o5+S2OKFenVXP7IzaOIT12xg2kM566KPq0/HKXUmv8wz1H5dnb3uexL+wVle/prJ4sex/jbkoBMizyf7DL/GhkQI7CPwa9m/iBhnvUv1HjNfTwSd3GRcepVOyc05SxT42QTOv2XwKDfnUpwhHR7v7b7E4vlR6yJ5UtvLUC/pLJ7ZJj/xmDMX60QSDSf1tCuzjnIPs+z72/NnzLUpc8qXNy5fwlTj11/RJhKdED4gqTnvX/rY2+0zRv8AFFNP5P4S3d9r39Ka6pn/z+0tX30zXOi8jpasQ9nV7VoEM0Lci/gHlRjdcRul/VYi6nxd/D1p+tgnZ3oMbrvs1ScHKpTU++2qazuprGmDypALvXjYSbKUu+YKBT38YGjhmesSGjFf5nPKvVz5dObWOTgFaT+FDMVOkTc9VGhWLQrFhSZ1Usq3Yg1ppzseM6bV4bS0UNJr3TE5Nmn4qZRp+JuWafC8Wgb8SSTr+IZc3+E2vdTAR/dSaTeckIgmVW7DNrKFTskWhTP2PdOeC03HfkaNGXrRaX49e/xYBchUfs67VIlVVMPnsz2Dd0jrKWaYNG5o1Ie7tYepgVeG7Iq5cYAgKVMnftg0s/YZCgqi30i/cZqnUcwEzhO2dRE7XpmRWLlhnCWzmwVinE+pZebe1txSuZpayu8zKXI47cvEAyr7ONDWTm6bnHJYzWrSWv1kOuPG9f9U+t6h5cjdn6eqsDDwgBJohAwL/gOQxChgIzVFAAESaUcSGVNtb5IIziJM3yoqzqpu36YZzmZd3247zu5/3+n1W0l6ppAA421Dl14mzASeu6OGnQtWcGWWxlDYilMC66Wn8iKHmTtIu2cwrMNOQFiZA/SQ1nZ1s3MvMDtljOuvBpvw445AKFxuCAa9SMhnpkLZRLY+PUgGkwdVhJXkg4rZI1kGPuA3TP6x2I/DQ2tpLjQIGMs2Y7Hpr9xDQgZ72NVtbN5Aa4nHkqrMMperBOexushzbNjQog9dxotTtpiA8QjPPPuoicr16RB5GHkXXkJvIo8iTyeMRTHV0tz8b31mDex8THOzNtxxsqNITbFOK9bhl7i0MaKAeYTpxObY88YSxkIaRGJrXQoacyCrBo7gJlSka01QNAx2YVQKVYHjmMMcLmZrhriWUSoaecAftpCwUy0gLMlrCsnKYzAEVXxCZJI1HPbYxeDGVqzFMnCgA=') format('woff2'), + url('../fonts/iconfont.woff?t=1637151200') format('woff'), + url('../fonts/iconfont.ttf?t=1637151200') format('truetype'), + url('../fonts/iconfont.svg?t=1637151200#iconfont') format('svg'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-warning-outline:before { + content: "\e61a"; +} + +.icon-plus:before { + content: "\e658"; +} + +.icon-help:before { + content: "\e659"; +} + +.icon-certification:before { + content: "\fc6c"; +} + +.icon-bug:before { + content: "\ec63"; +} + +.icon-Loading:before { + content: "\e65d"; +} + +.icon-loading:before { + content: "\e756"; +} + +.icon-arrow-bottom:before { + content: "\e617"; +} + +.icon-arrow-right:before { + content: "\e699"; +} + +.icon-marked:before { + content: "\e708"; +} + +.icon-unmark:before { + content: "\e616"; +} + +.icon-new-tab:before { + content: "\eb94"; +} + +.icon-enlarge:before { + content: "\e615"; +} + +.icon-recover:before { + content: "\e613"; +} + +.icon-to-this:before { + content: "\e61e"; +} + +.icon-cache:before { + content: "\e6fe"; +} + +.icon-left-btn:before { + content: "\e6ae"; +} + +.icon-fingers-move:before { + content: "\e612"; +} + +.icon-fingers-zoom:before { + content: "\e62a"; +} + +.icon-shift:before { + content: "\e6b0"; +} + +.icon-left-click:before { + content: "\e62b"; +} + +.icon-why:before { + content: "\e632"; +} + +.icon-chat:before { + content: "\e676"; +} + +.icon-visiting-card:before { + content: "\e619"; +} + +.icon-mobile:before { + content: "\e610"; +} + +.icon-email:before { + content: "\e7bd"; +} + +.icon-minimap:before { + content: "\e918"; +} + +.icon-vertical:before { + content: "\e69d"; +} + +.icon-1x:before { + content: "\e60e"; +} + +.icon-horzantical:before { + content: "\e611"; +} + +.icon-user-1:before { + content: "\e602"; +} + +.icon-user-4:before { + content: "\e603"; +} + +.icon-user-5:before { + content: "\e605"; +} + +.icon-user-2:before { + content: "\e606"; +} + +.icon-user-3:before { + content: "\e607"; +} + +.icon-user-6:before { + content: "\e609"; +} + +.icon-user-8:before { + content: "\e60a"; +} + +.icon-user-7:before { + content: "\e60b"; +} + +.icon-user-9:before { + content: "\e60c"; +} + +.icon-user-10:before { + content: "\e60d"; +} + +.icon-service-error:before { + content: "\e66a"; +} + +.icon-service-ok:before { + content: "\e72f"; +} + +.icon-job:before { + content: "\e60f"; +} + +.icon-history:before { + content: "\e600"; +} + +.icon-preview:before { + content: "\e684"; +} + +.icon-no-cache:before { + content: "\e709"; +} + +.icon-stop:before { + content: "\e604"; +} + +.icon-more-than:before { + content: "\e672"; +} + +.icon-continue:before { + content: "\e625"; +} + +.icon-restart:before { + content: "\e639"; +} + +.icon-running:before { + content: "\e634"; +} + +.icon-ok:before { + content: "\e624"; +} + +.icon-waiting:before { + content: "\e614"; +} + +.icon-failed:before { + content: "\e62d"; +} + +.icon-less-than:before { + content: "\e6e0"; +} + +.icon-export:before { + content: "\e70a"; +} + +.icon-save:before { + content: "\e62e"; +} + +.icon-play:before { + content: "\e601"; +} + +.icon-pause:before { + content: "\e6f9"; +} + +.icon-backward:before { + content: "\e608"; +} + +.icon-reset:before { + content: "\e701"; +} + +.icon-forward:before { + content: "\e618"; +} + +.icon-zoom-in:before { + content: "\e6b5"; +} + +.icon-expend:before { + content: "\e6a8"; +} + +.icon-zoom-out:before { + content: "\e780"; +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_main.scss" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_main.scss" new file mode 100644 index 0000000000000000000000000000000000000000..58050f7f3ac4abe1570d25e1768f32df39fbc7bf --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_main.scss" @@ -0,0 +1,17 @@ +@import './_mixins.scss'; + +@mixin layout() { + @include gap('40', 40px); + @include gap('30', 30px); + @include gap('20', 20px); + @include gap('10', 10px); + @include gap('15', 15px); + @include gap('5', 5px); + @include gap('0', 0); + @include font-size(); + @include _flex(); + @include txt(); + @include word-wrap(1); +} + +@include layout(); diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_mixins.scss" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_mixins.scss" new file mode 100644 index 0000000000000000000000000000000000000000..9b6283cb5e424a8d8538c1b8ee8803dd73bad979 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_mixins.scss" @@ -0,0 +1,193 @@ +@mixin p($v, $n:0) { + /* padding */ + @if $v=='t' { + padding-top: $n; + } + @else if $v=='r' { + padding-right: $n; + } + @else if $v=='b' { + padding-bottom: $n; + } + @else if $v=='l' { + padding-left: $n; + } + @else if $v=='tb' { + padding-top: $n; + padding-bottom: $n; + } + @else if $v=='lr' { + padding-left: $n; + padding-right: $n; + } + @else { + padding: $v; + } +} + +@mixin m($v, $n:0) { + /* margin */ + @if $v=='t' { + margin-top: $n; + } + @else if $v=='r' { + margin-right: $n; + } + @else if $v=='b' { + margin-bottom: $n; + } + @else if $v=='l' { + margin-left: $n; + } + @else if $v=='lr' { + margin-left: $n; + margin-right: $n; + } + @else if $v=='tb' { + margin-top: $n; + margin-bottom: $n; + } + @else { + margin: $v; + } +} + +@mixin gap($v, $n:0) { + .p#{$v} { + @include p($n) + } + .pt#{$v} { + @include p('t', $n) + } + .pr#{$v} { + @include p('r', $n) + } + .pb#{$v} { + @include p('b', $n) + } + .pl#{$v} { + @include p('l', $n) + } + .plr#{$v} { + @include p('lr', $n) + } + .ptb#{$v} { + @include p('tb', $n) + } + .m#{$v} { + @include m($n) + } + .mt#{$v} { + @include m('t', $n) + } + .mr#{$v} { + @include m('r', $n) + } + .mb#{$v} { + @include m('b', $n) + } + .ml#{$v} { + @include m('l', $n) + } + .mlr#{$v} { + @include m('lr', $n) + } + .mtb#{$v} { + @include m('tb', $n) + } +} + +@mixin font-size($v:10px) { + .font-bold { + font-weight: bold; + } + .font-normal { + font-weight: normal; + } + /* fontSize */ + @for $i from 10 through 30 { + .f#{$i} { + font-size: 0px + $i + } + } +} + +@mixin _flex() { + .flex-wrap { + flex-wrap: wrap; + } + .flex-v-dir { + flex-direction: column + } + .flex-h-dir { + flex-direction: row + } + .flexbox { + display: flex + } + .flexbox-v { + display: flex; + flex-direction: column + } + .flex-vhcenter, + .flex-hvcenter + { + align-items: center; + justify-content: center; + } + .flex-vstart { + align-items: flex-start; + } + .flex-vcenter { + align-items: center; + } + .flex-hcenter { + justify-content: center; + } + .flex-hbetween { + justify-content: space-between; + } + .flex-haround { + justify-content: space-around; + } + .flex-hend { + justify-content: flex-end; + } + .align-self-end { + align-self: flex-end; + } +} + +@mixin txt() { + .text-r { + text-align: right + } + .text-l { + text-align: left + } + .text-c { + text-align: center + } + .text-m { + vertical-align: middle + } +} + +@mixin text-overflow($val) { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: $val; + -webkit-box-orient: vertical; +} + +@mixin word-wrap($val) { + .word-wrap#{$val} { + @include text-overflow($val) + } +} + +@mixin inlineblock{ + display: inline-block; + vertical-align: top; +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_normalize.scss" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_normalize.scss" new file mode 100644 index 0000000000000000000000000000000000000000..ec8e9a016174d8b29a0e2a12611ce52f90045842 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_normalize.scss" @@ -0,0 +1,336 @@ + /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + + /* Document + ========================================================================== */ + + /** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + + html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + } + + /* Sections + ========================================================================== */ + + /** + * Remove the margin in all browsers. + */ + + body { + margin: 0; + } + + /** + * Render the `main` element consistently in IE. + */ + + main { + display: block; + } + + /** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + + h1 { + font-size: 2em; + margin: 0.67em 0; + } + + /* Grouping content + ========================================================================== */ + + /** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + + hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /* Text-level semantics + ========================================================================== */ + + /** + * Remove the gray background on active links in IE 10. + */ + + a { + background-color: transparent; + } + + /** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + + abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + } + + /** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + + b, + strong { + font-weight: bolder; + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + code, + kbd, + samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /** + * Add the correct font size in all browsers. + */ + + small { + font-size: 80%; + } + + /** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + + sub { + bottom: -0.25em; + } + + sup { + top: -0.5em; + } + + /* Embedded content + ========================================================================== */ + + /** + * Remove the border on images inside links in IE 10. + */ + + img { + border-style: none; + } + + /* Forms + ========================================================================== */ + + /** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + + button, + input, + optgroup, + select, + textarea { + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ + } + + /** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + + button, + input { /* 1 */ + overflow: visible; + } + + /** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + + button, + select { /* 1 */ + text-transform: none; + } + + /** + * Remove the inner border and padding in Firefox. + */ + + button::-moz-focus-inner, + [type="button"]::-moz-focus-inner, + [type="reset"]::-moz-focus-inner, + [type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; + } + + /** + * Restore the focus styles unset by the previous rule. + */ + + button:-moz-focusring, + [type="button"]:-moz-focusring, + [type="reset"]:-moz-focusring, + [type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; + } + + /** + * Correct the padding in Firefox. + */ + + fieldset { + border-radius: 4px; + border: 1px solid #aaa; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); + padding: 0.35em 0.75em 0.625em;margin-bottom: 8px; + } + + /** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + + legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ + } + + /** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + + progress { + vertical-align: baseline; + } + + /** + * Remove the default vertical scrollbar in IE 10+. + */ + + textarea { + overflow: auto; + } + + /** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + + [type="checkbox"], + [type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + } + + /** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + + [type="number"]::-webkit-inner-spin-button, + [type="number"]::-webkit-outer-spin-button { + height: auto; + } + + /** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + + [type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ + } + + /** + * Remove the inner padding in Chrome and Safari on macOS. + */ + + [type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + } + + /** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + + ::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ + } + + /* Interactive + ========================================================================== */ + + /* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + + details { + display: block; + } + + /* + * Add the correct display in all browsers. + */ + + summary { + display: list-item; + } + + /* Misc + ========================================================================== */ + + /** + * Add the correct display in IE 10+. + */ + template { + display: none; + } + /** + * Add the correct display in IE 10. + */ + [hidden] { + display: none; + } diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_reset.scss" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_reset.scss" new file mode 100644 index 0000000000000000000000000000000000000000..1a6f7688ec8df3975d864ecbcbb98929c0a5825d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_reset.scss" @@ -0,0 +1,85 @@ +@import './_normalize.scss'; + +html, body, article, hgroup, figure, main, section, header, footer, aside, nav, video, audio, canvas, details, h1, h2, h3, h4, h5, h6, div, p, dl, dd, ul, li, ol, label, form, input, img, textarea, th, tr, td, button, select, a, span, em, i, sub, sup, pre, code, table { + box-sizing:border-box; +} + +/** + * font, line height... + */ +body { + font-family: $font-family; + font-size: $font-size-larger; + background-color: #fff; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: $color-text-base; + line-height: 1.4; +} + +h1, h2, h3, h4, h5, h6, +ul, li, ol, dl, dt, dd, +figure, p { + padding: 0; + margin: 0; + font-weight: normal; + word-wrap: break-word; +} + +/** + * a tag color + */ + +a {display: inline-block; + color: $color-link-base; + text-decoration: none; + font-size: inherit; + outline: none; + cursor: pointer; /* fix for IOS10.3 */ + &:hover{ + color: $color-link-base-hover; + text-decoration: underline; + } +} + +img{ + max-width: 100%; + vertical-align: middle; + height: auto; +} + +ul{list-style: none; + padding-inline-start:0; +} + +// scrollbar style for windows +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button{ + -webkit-appearance: none !important; +} +input[type="number"]{-moz-appearance:textfield;} + +// reset element-plus style +.el-table__body{ + .el-tag{ + height: auto; + white-space: normal; + } +} +.el-card{z-index: 1;} +.el-radio__label{padding-left: 5px;} +.el-dialog__header{min-height: 50px;} +.el-loading-parent--relative{z-index: 10;} +.el-table__empty-block{width: 100% !important;} +.el-scrollbar__bar{z-index: 1000;} +.el-button--medium, +.el-button--small{ + .el-loading-spinner{margin-top: -10px;} + .circular{ + width: 20px; + height: 20px; + } +} +.el-table th.is-leaf { + font-size: 14px; +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_variable.scss" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_variable.scss" new file mode 100644 index 0000000000000000000000000000000000000000..1fa265d54da7e7b3643492bb0939d4cfdcf77c45 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/_variable.scss" @@ -0,0 +1,62 @@ +/* base color +-------------------------- */ + +$--color-primary : #438bff; +$color-light : #909399; +$color-primary-darken : #978755; + +$--color-info : #28c2d7; +$--color-success : #35c895; +$--color-warning : #FFB403; +$--color-danger : #f85564; +$--color-error : #f85564; + +/* layout navigate +-------------------------- */ +$nav-background : #2C3143; +$nav-background-active : #5088fc; +$nav-text-color : #a6aaae; +$nav-active-color : #fff; +$header-background : #fff; +$layout-main-background : #F5F7FA; +$sub-menu-list_bg : #464e6c; + +/* link +-------------------------- */ +$color-link-base : #4c84ff; +$color-link-base-hover : #0050ff; + +/* text color +-------------------------- */ +$color-text-base : #303133; +$color-text-light : #666; +$color-text-placeholder : #999; +$color-text-disabled : #D8D8D8; +$color-text-selected : #FF8A00; + +/* background-color +-------------------------- */ +$background-color-selected : #F2F2F2; +$background-color-hover : #F7F7F7; +$background-color-light : #FBFBFB; + +/* border +-------------------------- */ +$border-color-base : #e5e9f2; +$border-color-light : #D8D8D8; +$border-base-style : 1px solid $border-color-base; + +/* Font +-------------------------- */ +$font-size-small : 12px; +$font-size-large : 14px; +$font-size-larger : 16px; +$font-size-largest : 18px; +$font-weight-medium : 500; +$font-family : Avenir,Helvetica,Arial,Helvetica,PingFang SC,Microsoft YaHei,SimSun,sans-serif; +$font-line-height : 1; + +/* Animation +-------------------------- */ +$animation-transition-time : 300ms; +$animation-transition-timing : ease-in-out; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/base.scss" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/base.scss" new file mode 100644 index 0000000000000000000000000000000000000000..5523108b6407c5a63436cfd283c3d158358823f1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/assets/styles/base.scss" @@ -0,0 +1,85 @@ +@import "./_variable.scss"; +@import "./_element-ui.scss"; +@import "./_reset.scss"; +@import "./_main.scss"; +@import "./_font.scss"; + +#app { + width: 100%; + min-height: 100vh; +} + +/* global router view animate */ +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.2s ease-in; +} + +.fade-enter, +.fade-leave-to { + opacity: 0; +} + +.plr{position: relative;} +.pla{position: absolute;} +.float-left{float: left;} +.float-right{float: right;} +.p-id { + color: #666; + font-weight: 200; + font-size: 12px; + line-height:18px; +} + +/* container */ +.el-container{min-height: 100vh;} +.base-container { + overflow-x: hidden; + position: relative; + padding-top: 50px; +} + +.base-wrapper{ + min-height: calc(100vh - 80px); + &>.fade-enter-active, + &>.fade-leave-active { + position: absolute; + left: 20px; + right: 20px; + } +} + +.page{min-height: calc(100vh - 80px);} + +.el-dialog__header, +.el-message-box__header{background:#F5F7FA;} +.el-dialog__body{padding: 20px;} + +fieldset legend { + color: $color-link-base; + padding-left: 8px; + padding-right: 8px; +} + +/* reset scrollbar style for windows */ +.customed-scrollbar{ + ::-webkit-scrollbar { + width: 5px; + height: 5px; + } + ::-webkit-scrollbar-thumb { + border-radius: 5px; + background: rgba(0,0,0,0.1); + } + ::-webkit-scrollbar-track { + border-radius: 0; + background: rgba(0,0,0,0.05); + } + ::-webkit-scrollbar-corner{background: rgba(0,0,0,0.1);} +} +.popper-max-width{max-width: 70%;} +.small-width{max-width:500px;} +.mid-width{max-width:700px;} +.large-width{max-width:1000px;} +.mid-min-width{min-width:700px;} +.large-min-width{min-width:1000px;} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/BreadCrumb.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/BreadCrumb.vue" new file mode 100644 index 0000000000000000000000000000000000000000..57b01e9e9ee1fb874c918c192ddee57e98ac3032 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/BreadCrumb.vue" @@ -0,0 +1,67 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/BarChart.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/BarChart.vue" new file mode 100644 index 0000000000000000000000000000000000000000..b6dacbc416353436fb6d8cc73d4f3c8b9c7f8bff --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/BarChart.vue" @@ -0,0 +1,179 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/ChartTypesMap.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/ChartTypesMap.js" new file mode 100644 index 0000000000000000000000000000000000000000..35679aa88c518d7296348bf766d7451bde936347 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/ChartTypesMap.js" @@ -0,0 +1,249 @@ +/* + * Chart config + */ + +// base config +const commonConfig = { + show: true, + loading: true, + legend: [], + xAxis: [], + series: [], + thresholds: {}, + settings: { + xAxisType: 'value', + }, + train: { + auc: '', + ks: '', + }, + validate: { + auc: '', + ks: '', + }, +}; +const chart = { + roc: { + type: 'line', + config: { + ...commonConfig, + type: 'ks', // draw roc with ks + settings: { + area: true, + xAxisType: 'value', + }, + }, + }, + accuracy: { + type: 'line', + config: { + ...commonConfig, + type: 'accuracy', + xAxis: { axisLabel: {} }, + }, + }, + gain: { + type: 'line', + config: { + ...commonConfig, + type: 'gain', + showThreshold: false, + xAxis: { axisLabel: {} }, + }, + }, + lift: { + type: 'line', + config: { + ...commonConfig, + type: 'lift', + showThreshold: false, + xAxis: { axisLabel: {} }, + }, + }, + ks: { + type: 'line', + config: { + ...commonConfig, + type: 'ks', + thresholds: [], + markLine: { + name: '宸肩嚎', + symbol: 'none', // no arrow + lineStyle: { + width: 2, + }, + data: [ + [ + { + name: 'train 宸', + type: 'min', + coord: ['0', '0'], + lineStyle: { + color: '#000', + width: 2, + }, + }, + { + type: 'max', + coord: ['0', '0'], + lineStyle: { + color: '#000', + width: 2, + }, + }, + ], + [ + { + name: 'validate 宸', + type: 'min', + coord: ['0', '0'], + }, + { + type: 'max', + coord: ['0', '0'], + }, + ], + ], + }, + formatter: ({ + seriesNames, + train_ks_fpr, + train_ks_tpr, + validate_ks_fpr, + validate_ks_tpr, + thresholds, + dataIndex, + }) => { + const series = { + train_ks_fpr: `${train_ks_fpr[dataIndex][1]}
`, + train_ks_tpr: `${train_ks_tpr[dataIndex][1]}
`, + validate_ks_fpr: `${validate_ks_fpr[dataIndex][1]}
`, + validate_ks_tpr: `${validate_ks_tpr[dataIndex][1]}
`, + }; + const result = seriesNames.map(name => `${name}: ${series[name]}`).join(''); + + return `${result}thresholds: ${thresholds[dataIndex]}
`; + }, + }, + }, + precisionRecall: { + type: 'line', + config: { + ...commonConfig, + thresholds: [], + type: 'precision_recall', + formatter: ({ + seriesNames, + thresholds, + dataIndex, + train_precision, + train_recall, + validate_precision, + validate_recall, + }) => { + const series = { + train_precision: `${train_precision[dataIndex][1]}
`, + train_recall: `${train_recall[dataIndex][1]}
`, + validate_precision: `${validate_precision[dataIndex][1]}
`, + validate_recall: `${validate_recall[dataIndex][1]}
`, + }; + const result = seriesNames.map(name => `${name}: ${series[name]}`).join(''); + + return `${result}thresholds: ${thresholds[dataIndex]}
`; + }, + }, + }, + train_loss: { + type: 'line', + config: { + ...commonConfig, + type: 'ks', + xAxis: { axisLabel: {} }, + }, + }, +}; + +export default { + Evaluation: { + tabs: [{ + label: 'Roc', + name: 'roc', + chart: chart.roc, + }, { + label: 'K-S', + name: 'ks', + chart: chart.ks, + }, { + label: 'Lift', + name: 'lift', + chart: chart.lift, + }, { + label: 'Gain', + name: 'gain', + chart: chart.gain, + }, { + label: 'Precision Recall', + name: 'precisionRecall', + chart: chart.precisionRecall, + }, { + label: 'Accuracy', + name: 'accuracy', + chart: chart.accuracy, + }], + }, + Oot: { + tabs: [{ + label: 'Roc', + name: 'roc', + chart: chart.roc, + }, { + label: 'K-S', + name: 'ks', + chart: chart.ks, + }, { + label: 'Lift', + name: 'lift', + chart: chart.lift, + }, { + label: 'Gain', + name: 'gain', + chart: chart.gain, + }, { + label: 'Precision Recall', + name: 'precisionRecall', + chart: chart.precisionRecall, + }, { + label: 'Accuracy', + name: 'accuracy', + chart: chart.accuracy, + }], + }, + VertLR: { + tabs: [{ + label: 'Train loss', + name: 'train_loss', + chart: chart.train_loss, + }], + }, + HorzLR: { + tabs: [{ + label: 'Train loss', + name: 'train_loss', + chart: chart.train_loss, + }], + }, + VertSecureBoost: { + tabs: [{ + label: 'Train loss', + name: 'train_loss', + chart: chart.train_loss, + }], + }, + HorzSecureBoost: { + tabs: [{ + label: 'Train loss', + name: 'train_loss', + chart: chart.train_loss, + }], + }, +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/ChartsWithTabs.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/ChartsWithTabs.vue" new file mode 100644 index 0000000000000000000000000000000000000000..bca504b1f435d00d9728fe06457fdce28529df36 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/ChartsWithTabs.vue" @@ -0,0 +1,421 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/HeatmapChart.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/HeatmapChart.vue" new file mode 100644 index 0000000000000000000000000000000000000000..d8825bcc54d03ce0ffcc319ce05c35a0a599d7d1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/HeatmapChart.vue" @@ -0,0 +1,182 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/LineChart.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/LineChart.vue" new file mode 100644 index 0000000000000000000000000000000000000000..3c9297bf679a6296ddfb45610cb7cdd12d51571c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/LineChart.vue" @@ -0,0 +1,242 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/PieChart.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/PieChart.vue" new file mode 100644 index 0000000000000000000000000000000000000000..8c3a44a470fa315ed066d2983934b0bd629831b8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Charts/PieChart.vue" @@ -0,0 +1,193 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/ChatUI/ChatLog.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/ChatUI/ChatLog.vue" new file mode 100644 index 0000000000000000000000000000000000000000..92606c7ec28f55740f76b2211ec496954a3a5ebf --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/ChatUI/ChatLog.vue" @@ -0,0 +1,289 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/ChatUI/ChatMembers.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/ChatUI/ChatMembers.vue" new file mode 100644 index 0000000000000000000000000000000000000000..e408d7a06cf5e106c06e877fbfa7c56cad35537b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/ChatUI/ChatMembers.vue" @@ -0,0 +1,157 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/ChatUI/ChatUI.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/ChatUI/ChatUI.vue" new file mode 100644 index 0000000000000000000000000000000000000000..aa36062c5bf8687ce94ed111cb6079b45c87a026 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/ChatUI/ChatUI.vue" @@ -0,0 +1,765 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/BetterCheckbox.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/BetterCheckbox.vue" new file mode 100644 index 0000000000000000000000000000000000000000..be5c8d16e86aecf094141e6a6a8f521fefeb3a1e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/BetterCheckbox.vue" @@ -0,0 +1,71 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/DateTimePicker.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/DateTimePicker.vue" new file mode 100644 index 0000000000000000000000000000000000000000..adc0b6dc176b82878767f7129b0f1a78a42dfc4f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/DateTimePicker.vue" @@ -0,0 +1,79 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/EmptyData.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/EmptyData.vue" new file mode 100644 index 0000000000000000000000000000000000000000..87fc0d33109d2cca7f67fd53a0222184018b14e8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/EmptyData.vue" @@ -0,0 +1,29 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/MemberAvatar.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/MemberAvatar.vue" new file mode 100644 index 0000000000000000000000000000000000000000..8bfbcebc415b7d6a46d3ca57207435fabc17f3ed --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/MemberAvatar.vue" @@ -0,0 +1,162 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/MemberCard.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/MemberCard.vue" new file mode 100644 index 0000000000000000000000000000000000000000..9679f73ef53e4c3ffdcd4d85a4af495623b0586e --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/MemberCard.vue" @@ -0,0 +1,171 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/TitleNavigator.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/TitleNavigator.vue" new file mode 100644 index 0000000000000000000000000000000000000000..eb567a4311d778d086875ae852102f6f8eaf8a3d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/TitleNavigator.vue" @@ -0,0 +1,231 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/VideoGuideDialog.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/VideoGuideDialog.vue" new file mode 100644 index 0000000000000000000000000000000000000000..64c55e6b266d649b752539a3329cc938ed864b86 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/Common/VideoGuideDialog.vue" @@ -0,0 +1,192 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/DragResize/install.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/DragResize/install.js" new file mode 100644 index 0000000000000000000000000000000000000000..3afbde53c62ef9eb3993bd7cd8846ca5b19de81c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/DragResize/install.js" @@ -0,0 +1,7 @@ +import VueDragResize from './src/DragResize.vue'; + +function install (Vue) { + Vue.component('VueDragResize', VueDragResize); +} + +export default install; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/DragResize/src/DragResize.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/DragResize/src/DragResize.vue" new file mode 100644 index 0000000000000000000000000000000000000000..aa9b5b15635ba36fdc19624f1250b5e36e437f4d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/DragResize/src/DragResize.vue" @@ -0,0 +1,382 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutBase.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutBase.vue" new file mode 100644 index 0000000000000000000000000000000000000000..e388fe0f8632947daa5915aca10d1c94891bee3f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutBase.vue" @@ -0,0 +1,225 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutFullScreen.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutFullScreen.vue" new file mode 100644 index 0000000000000000000000000000000000000000..5c3680dd3f29d0016e89d52eedc210cf5de1a712 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutFullScreen.vue" @@ -0,0 +1,32 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutHeader.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutHeader.vue" new file mode 100644 index 0000000000000000000000000000000000000000..93312d7c7a96d7dc6da22f827afd6b4a2aaf8a54 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutHeader.vue" @@ -0,0 +1,426 @@ + + + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutSide/LayoutSide.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutSide/LayoutSide.js" new file mode 100644 index 0000000000000000000000000000000000000000..e8c4224e208003204767484fb0b2640ec8813fc7 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutSide/LayoutSide.js" @@ -0,0 +1,74 @@ +import { + computed, + onBeforeMount, + getCurrentInstance, + reactive, + watch, +} from 'vue'; +import { + useRoute, + useRouter, +} from 'vue-router'; +import { useStore } from 'vuex'; +import menuTemp from './MenuTemp.vue'; + +const { prefixPath } = window.api; +const asideCollapsedKey = `${prefixPath}AsideCollapsed`; + +export default { + inject: ['refresh'], + components: { + menuTemp, + }, + setup () { + const store = useStore(); + const route = useRoute(); + const router = useRouter(); + const userInfo = computed(() => store.state.base.userInfo); + const { appContext } = getCurrentInstance(); + const { $bus } = appContext.config.globalProperties; + const vData = reactive({ + defaultActive: '', + defaultOpens: [], + menuList: [], + isCollapsed: false, + }); + const changeCollapsed = () => { + vData.isCollapsed = !vData.isCollapsed; + window.localStorage.setItem(asideCollapsedKey, vData.isCollapsed); + setTimeout(() => { + $bus.$emit('sideCollapsed', vData.isCollapsed); + }, 330); + }; + + onBeforeMount(() => { + const currentIndex = `${route.meta.index || 0}`; + + // left menus last collapse state + const isCollapsed = window.localStorage.getItem(asideCollapsedKey); + + vData.isCollapsed = isCollapsed === 'false' ? false : Boolean(isCollapsed); + + router.options.routes.forEach(route => { + if (route.meta && !route.meta.requiresLogout) { + vData.menuList.push(route); + } + }); + vData.defaultActive = route.meta.active || route.path; + vData.defaultOpens = [currentIndex.substring(0, 1), currentIndex]; + }); + + watch( + () => route.path, + () => { + vData.defaultActive = route.meta.active || route.path; + }, + ); + + return { + vData, + userInfo, + changeCollapsed, + }; + }, +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutSide/LayoutSide.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutSide/LayoutSide.vue" new file mode 100644 index 0000000000000000000000000000000000000000..8a9f6a0786857a172c55683b00ecb0a72487a255 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutSide/LayoutSide.vue" @@ -0,0 +1,177 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutSide/MenuTemp.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutSide/MenuTemp.vue" new file mode 100644 index 0000000000000000000000000000000000000000..ccc743d0defb538ecd8871270c1cc8a25d62edfe --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutSide/MenuTemp.vue" @@ -0,0 +1,90 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutTags.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutTags.vue" new file mode 100644 index 0000000000000000000000000000000000000000..173985018b151bcb5ada84caa15be89b8a86ef13 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LayoutTags.vue" @@ -0,0 +1,183 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LoginDialog.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LoginDialog.vue" new file mode 100644 index 0000000000000000000000000000000000000000..4665ed5490c89e4010644919ce938e7328672ed2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/LoginDialog.vue" @@ -0,0 +1,207 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/common/file-events.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/common/file-events.js" new file mode 100644 index 0000000000000000000000000000000000000000..e6213c9e54b83a0b4c1a3e80e29a3222c9448dc0 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/common/file-events.js" @@ -0,0 +1,3 @@ +const events = ['fileProgress', 'fileSuccess', 'fileComplete', 'fileError']; + +export default events; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/common/mixins.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/common/mixins.js" new file mode 100644 index 0000000000000000000000000000000000000000..77bc3e2a3967f6a6b6bbcc41f01ad8bac4d11e30 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/common/mixins.js" @@ -0,0 +1,14 @@ +export const uploaderMixin = { + inject: ['uploader'], +}; + +export const supportMixin = { + data () { + return { + support: true, + }; + }, + mounted () { + this.support = this.uploader.uploader.support; + }, +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/common/utils.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/common/utils.js" new file mode 100644 index 0000000000000000000000000000000000000000..e44c6e4c0dd87309ad91f68a70a366c5885da06d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/common/utils.js" @@ -0,0 +1,32 @@ +export function secondsToStr (temp) { + const years = Math.floor(temp / 31536000); + + if (years) { + return years + ' year' + numberEnding(years); + } + const days = Math.floor((temp %= 31536000) / 86400); + + if (days) { + return days + ' day' + numberEnding(days); + } + const hours = Math.floor((temp %= 86400) / 3600); + + if (hours) { + return hours + ' hour' + numberEnding(hours); + } + const minutes = Math.floor((temp %= 3600) / 60); + + if (minutes) { + return minutes + ' minute' + numberEnding(minutes); + } + const seconds = temp % 60; + + return seconds + ' second' + numberEnding(seconds); + function numberEnding (number) { + return (number > 1) ? 's' : ''; + } +} + +export function kebabCase (s) { + return s.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`); +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/btn.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/btn.vue" new file mode 100644 index 0000000000000000000000000000000000000000..73d6d6c0eb5295734064e1de0374403229307324 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/btn.vue" @@ -0,0 +1,56 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/drop.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/drop.vue" new file mode 100644 index 0000000000000000000000000000000000000000..5d783e1d04c3acae4ec25f5c03a17ba5778ac1ca --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/drop.vue" @@ -0,0 +1,66 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/file.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/file.vue" new file mode 100644 index 0000000000000000000000000000000000000000..82f603976bc1f30ee81faf9bcc0881c1d9432c74 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/file.vue" @@ -0,0 +1,461 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/files.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/files.vue" new file mode 100644 index 0000000000000000000000000000000000000000..6a9390680b3508f1ceeb360ec1027e458015c4a5 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/files.vue" @@ -0,0 +1,42 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..ed3de791851c6f0084301ca32e736d479fbfab47 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/list.vue" @@ -0,0 +1,43 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/unsupport.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/unsupport.vue" new file mode 100644 index 0000000000000000000000000000000000000000..43a5dfc01081cbeecd354b6e40ffc0ad4a2e0a50 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/unsupport.vue" @@ -0,0 +1,28 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/uploader.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/uploader.vue" new file mode 100644 index 0000000000000000000000000000000000000000..27f0c6ab226699b24b77f8c2092cab1a634095c3 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/components/uploader.vue" @@ -0,0 +1,152 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/install.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/install.js" new file mode 100644 index 0000000000000000000000000000000000000000..0eef2772d05cad8eb9092d87e9d6aabf43ea8e08 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/VueSimpleUploader/install.js" @@ -0,0 +1,38 @@ +/** + * forked from https://github.com/simple-uploader/vue-uploader for vue3 + */ + +import Uploader from './components/uploader.vue'; +import UploaderBtn from './components/btn.vue'; +import UploaderDrop from './components/drop.vue'; +import UploaderUnsupport from './components/unsupport.vue'; +import UploaderList from './components/list.vue'; +import UploaderFiles from './components/files.vue'; +import UploaderFile from './components/file.vue'; + +function install (Vue) { + if (install.installed) { + return; + } + Vue.component(Uploader.name, Uploader); + Vue.component(UploaderBtn.name, UploaderBtn); + Vue.component(UploaderDrop.name, UploaderDrop); + Vue.component(UploaderUnsupport.name, UploaderUnsupport); + Vue.component(UploaderList.name, UploaderList); + Vue.component(UploaderFiles.name, UploaderFiles); + Vue.component(UploaderFile.name, UploaderFile); +} + +const uploader = { + version: '0.7.6', + install, + Uploader, + UploaderBtn, + UploaderDrop, + UploaderUnsupport, + UploaderList, + UploaderFiles, + UploaderFile, +}; + +export default uploader; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/components-install.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/components-install.js" new file mode 100644 index 0000000000000000000000000000000000000000..56b643260c7bf5c320cead5d69de674488aff556 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/components-install.js" @@ -0,0 +1,10 @@ +/** + * install components automatically +*/ + +const requireAll = context => context.keys().map(context); +const files = require.context('./Common', false, /.vue$/); +const charts = require.context('./Charts', false, /.vue$/); +const components = [...requireAll(files), ...requireAll(charts)]; + +export default components.map(component => component.default); diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/data-set-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/data-set-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..99a6797de9d64223f83cef307cdd7878ae1f5118 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/data-set-list.vue" @@ -0,0 +1,450 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/data_set-preview.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/data_set-preview.vue" new file mode 100644 index 0000000000000000000000000000000000000000..71718742f6a9cf8a2d0eedad4dfa4765345d3de9 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/data_set-preview.vue" @@ -0,0 +1,83 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/flow-status-tag.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/flow-status-tag.vue" new file mode 100644 index 0000000000000000000000000000000000000000..769b8d9c504209b337c149c36f2eb83b4bff4754 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/flow-status-tag.vue" @@ -0,0 +1,84 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/job-status-tag.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/job-status-tag.vue" new file mode 100644 index 0000000000000000000000000000000000000000..89ffb0bb96a8816a82d1ecf31fa53adf2ed5b00b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/job-status-tag.vue" @@ -0,0 +1,72 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/role-tag.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/role-tag.vue" new file mode 100644 index 0000000000000000000000000000000000000000..772ba36e322bb13d1ccc998e5741c2d22f1d0b7a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/role-tag.vue" @@ -0,0 +1,52 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/select-data-set-dialog.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/select-data-set-dialog.vue" new file mode 100644 index 0000000000000000000000000000000000000000..afde33d1424f1704f9a9f76ee8feaaf09e2fc963 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/select-data-set-dialog.vue" @@ -0,0 +1,229 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/select-member-dialog.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/select-member-dialog.vue" new file mode 100644 index 0000000000000000000000000000000000000000..9fc66e1783b1ae3e1ab23b8452cf7951305a136f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/components/views/select-member-dialog.vue" @@ -0,0 +1,277 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/http/http.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/http/http.js" new file mode 100644 index 0000000000000000000000000000000000000000..8af469bc1c72d5a3dcf75275d25e5fd7fa14d25f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/http/http.js" @@ -0,0 +1,70 @@ +/** + * @author claude + * http service + * @param {Object} options request params, same as axios default params + * + * urltail will be join to url + * params: + * config = { + * (add) urltail, url suffix + * (add) btnState: { + * type, can be ['loading', 'disabled'], default:'loading', false: no effect + * target, click event + * }, + * (add) isCancel, cancel last request + * (add) isLogin, true: need to login before request + * (add) systemError, default: true, show system error dialog + * baseURL, url prefix + * timeout (Number), request timeout + * headers (Object), request header + * params (Object), key=value, add to url ?, e.g. https://example.com?a=b + * data (Object), for post + * } + * + * @param {isCancel} Object use: + * isCancel: { + * state: true / 'all', true: cancel last one, 'all': cancel all requests + * msg: String, reason for cancel, opational + * } + * + * callback always get code & msg, + * you can deal with 'code' + * there are 'cancelled', 'timeout' by me + */ + +import baseService from './httpCreate.js'; +import { deepMerge } from '@src/utils/types'; + +// some methods normally +const methods = ['get', 'post', 'delete', 'put']; + +// create http object +const http = { + // add cancelToken + // cancelToken: () => axios.CancelToken.source(), + // isCancel: (thrown) => String(thrown).includes('Cancel menually: '), +}; + +// add method to http object +methods.forEach(method => { + http[method] = (config = {}, options = {}) => { + if (typeof config === 'string') { + options.url = config; + } else if (!config.url) { + window.$app.config.globalProperties.$message.error('鎺ュ彛涓嶅瓨鍦!'); + return new Promise(() => { + Promise.reject('鎺ュ彛鍏ュ弬鏈夎'); + }); + } + + const result = deepMerge(config, options); + + result.method = method; + //! deepMerge cannot merge the dom Object + result.btnState = config.btnState || options.btnState; + // result.cancelToken = options.cancelToken; // deepMerge cannot merge promise + return baseService(result); + }; +}); + +export default http; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/http/httpCreate.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/http/httpCreate.js" new file mode 100644 index 0000000000000000000000000000000000000000..ad6f5be5d04477ade7c6cb486107331b19dcfb3f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/http/httpCreate.js" @@ -0,0 +1,396 @@ +/*! + * @author claude + * http serve creater + */ + +import axios from 'axios'; +import { baseLogout } from '@src/router/auth'; +import { deepMerge } from '@src/utils/types'; + +function setStorage () { + /* const { baseUrl } = window.api; + const KEEPALIVE = `${baseUrl}_keepAlive`; + + let keepAlive = localStorage.getItem(KEEPALIVE); + + keepAlive = keepAlive ? JSON.parse(keepAlive) : false; + + return keepAlive ? localStorage : sessionStorage; */ + return window.localStorage; +} + +const cancelTokenQueue = {}; // cancel token queue +// create axios instance +const httpInstance = axios.create({ + baseURL: '', + headers: {}, // global request headers + timeout: 1000 * 20, + // withCredentials: true, + // responseType: 'json', // default + // responseEncoding: 'utf8', // default + // xsrfCookieName: 'XSRF-TOKEN', // default + // xsrfHeaderName: 'X-XSRF-TOKEN', // default +}); + +// request interceptors +httpInstance.interceptors.request.use( + config => { + config.baseURL = window.api.baseUrl; + // must logged in before sending request + if (config.isLogin) { + // cancel all requests first + for (const key in cancelTokenQueue) { + cancelTokenQueue[key].cancel(); + } + // to login + baseLogout(); + } + return config; + }, + error => { + window.$app.config.globalProperties.$message.error({ + message: error, + grouping: true, + }); + return { + msg: error, + }; + }, +); + +// time stamp for last message dialog +let lastErrorMessageTime = 0; + +// respones interceptors +httpInstance.interceptors.response.use( + response => { + const { config, data } = response; + + // global error for request + if (config.systemError !== false) { + if (config.responseType !== 'blob' && data && data.code !== 0) { + + // login dialog + if (data.code === 10006) { + window.$app.config.globalProperties.$bus.$emit('show-login-dialog'); + + if (new Date().valueOf() - lastErrorMessageTime > 2000) { + lastErrorMessageTime = new Date().valueOf(); + window.$app.config.globalProperties.$message.error({ + message: data.message, + grouping: true, + }); + } + + } else if (data.code === 10000) { + // system is not inited, logout + baseLogout(); + } else if(data.code === 30001) { + // graph node has exception occurred + window.$app.config.globalProperties.$bus.$emit('node-error', { + ...data.data, + message: data.message, + }); + } else { + window.$app.config.globalProperties.$message.error({ + message: data.message || '鏈煡閿欒!', + grouping: true, + }); + } + } + } + + // compatible the error data + if (data.code == null) { + // Convert to standard structure + return { + code: 0, + data, + response, + }; + } + + // 娣诲姞鑷畾涔夊瓧娈典互澶囩敤 + data._axios_response = response; + return data; + }, + result => { + const { $message } = window.$app.config.globalProperties; + const { code, response, isCancel, systemError, message } = result; + + if (systemError !== false) { + if (isCancel) { + // Actively cancel pop-up prompt + const msg = isCancel.msg ? `璇锋眰宸插彇娑: ${isCancel.msg}` : '璇锋眰宸插彇娑'; + + $message.error({ + message: msg, + grouping: true, + }); + return { + code: 'cancelled', + msg, + }; + } else if (code === 'ECONNABORTED') { + // Capture error + const msg = '璇锋眰瓒呮椂 !'; + + $message.error({ + message: msg, + grouping: true, + }); + return { + code: 'timeout', + msg, + }; + } else if (response) { + const status = +response.status; + const msg = `${status}: ${response.statusText}`; + + switch (status) { + case 401: + // to login + $message.error({ + message: '鐧诲綍宸茶繃鏈, 璇烽噸鏂扮櫥褰', + grouping: true, + }); + baseLogout(); + break; + /* case 504: + $message.error({ + message: msg, + grouping: true, + }); + break; */ + default: + $message.error({ + message: msg, + grouping: true, + }); + } + return { + code: status, + msg, + }; + } else if (message) { + // Cross domain / network error... + $message.error({ + message, + grouping: true, + }); + return { + code: 1, + msg: message, + }; + } + } + return { + code: 1, + msg: message, + }; + }, +); + +/** + * public service function + */ +let loadingCount = 0; // loading count +const btnQueue = {}; // request queue for buttons +const policy = { + isCancel(options, state, msg) { + if (state === true) { + const cancelToken = cancelTokenQueue[`${options.url}`]; + + if (cancelToken) { + cancelToken.cancel(); + if (msg) { + window.$app.config.globalProperties.$message.error({ + message: msg, + grouping: true, + }); + } + } + } else if (state === 'all') { + // cancel all requests + for (const key in cancelTokenQueue) { + cancelTokenQueue[key].cancel(); + } + } + }, + urlTail(options) { + if (options.urltail) { + const { url, urltail } = options; + + options.url = `${url}/${ + urltail.substr(0, 1) === '/' ? urltail.substr(1) : urltail + }`; + } + }, + btnState(btnState) { + if (!btnState || !btnState.target) return; + + let srcElement = btnState.target.srcElement; + + if (srcElement.nodeName !== 'BUTTON') { + while (srcElement.nodeName !== 'BUTTON') { + srcElement = srcElement.parentElement; + } + } + + if (!srcElement) return false; + + const locker = srcElement.getAttribute('locker'); + + if (!locker) { + if (btnState.type !== false) { + srcElement.classList.add('is-loading'); + srcElement.setAttribute('locker', +Date.now()); + // insert loading element + const icon = document.createElement('i'); + + icon.classList.add('el-icon-loading'); + srcElement.insertBefore(icon, srcElement.children[0]); + // add to queue + btnQueue[locker] = srcElement; + } + } else { + // Block duplicate requests + return false; + } + + return srcElement; + }, + loading(options) { + let loadingInstance = null; + + if (options.loading && loadingCount === 0) { + delete options.loading; + loadingInstance = window.$app.config.globalProperties.$loading({ fullscreen: true }); + loadingCount++; + } + return loadingInstance; + }, +}; +const createTimeoutLayer = () => { + const now = Date.now(); + const timer = setTimeout(_ => { + // check the global loading + if (!document.body.classList.contains('el-loading-parent--relative')) { + const loadingLayer = document.createElement('div'); + + loadingLayer.id = now; + loadingLayer.className = 'el-loading-mask is-fullscreen'; + loadingLayer.style.zIndex = 20000000; + loadingLayer.innerHTML = `
+ + + +

绛夊緟鏈嶅姟鍣ㄥ搷搴, 璇风◢鍊...

+
`; + document.body.appendChild(loadingLayer); + } + }, 10000); + + return { + timer, + now, + }; +}; + +const baseService = (config = {}) => { + const options = deepMerge( + { + loading: false, + isLogin: false, + timeoutLayer: false, + }, + config, + ); + const { isCancel } = options; + + policy.isCancel(options, isCancel); + if (isCancel && isCancel.state) { + policy.isCancel(options, isCancel.state, isCancel.msg); + } + + const source = axios.CancelToken.source(); + + cancelTokenQueue[`${options.url}`] = source; + options.cancelToken = source.token; + + // add url tail + policy.urlTail(options); + + const srcElement = policy.btnState(config.btnState); // must be config + + // Block duplicate requests + if (srcElement === false) { + return false; + } + + // set default headers + const { headers } = options; + + if (headers !== false) { + const { baseUrl } = window.api; + const userInfo = setStorage().getItem(`${baseUrl}_userInfo`); + + if (userInfo && userInfo !== 'undefined') { + options.headers = { + ...headers, + token: JSON.parse(userInfo).token, + }; + } + } + + // add global loading + const loadingInstance = policy.loading(options); + + // call httpInstance + return new Promise((resolve, reject) => { + + let timeout = null; + + if (options.timeoutLayer) { + // request tiemout after 5s, then create global loading + timeout = createTimeoutLayer(); + } + + httpInstance({ ...options }) + .then(res => { + resolve(res); + }) + .catch(error => { + reject(error); + }) + .finally(() => { + if (timeout) { + clearTimeout(timeout.timer); + const layer = document.getElementById(timeout.now); + + layer && document.body.removeChild(layer); + } + setTimeout(() => { + // restore button status + if (srcElement) { + const locker = srcElement.getAttribute('locker'); + + if (options.btnState.type !== false) { + srcElement.classList.remove('is-loading'); + srcElement.removeChild(srcElement.children[0]); + } + btnQueue[locker] = null; + srcElement.removeAttribute('locker'); + } + + // close global loading + if (loadingInstance) { + loadingCount--; + loadingInstance.close(); + } + }, 400); + }); + }); +}; + +export default baseService; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/http/http\346\250\241\345\235\227\346\265\201\347\250\213.graffle" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/http/http\346\250\241\345\235\227\346\265\201\347\250\213.graffle" new file mode 100644 index 0000000000000000000000000000000000000000..6fd162094cd2be04c90c07e64f26e31447753419 Binary files /dev/null and "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/http/http\346\250\241\345\235\227\346\265\201\347\250\213.graffle" differ diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/mixins/table.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/mixins/table.js" new file mode 100644 index 0000000000000000000000000000000000000000..31cbb2c2228990518cc177c7572559240fec25e2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/mixins/table.js" @@ -0,0 +1,189 @@ +/** + * table mixins + */ + +export default (function () { + return { + name: 'mixin-table', + data () { + return { + loading: true, + // $parent: {}, + getListApi: '', + requestMethod: 'get', + list: [], + datePicker: [], + search: {}, + pagination: { + page_index: 1, + page_size: 20, + total: 0, + }, + defaultSearch: false, // default calling + fillUrlQuery: true, // fill form from url query + watchRoute: true, // watch the $route //! over 1 table in one page, must set to false, and let parent component watch the $route + turnPageRoute: true, // turn pages update route path + unUseParams: [], // ignore url query, will not fill form + }; + }, + watch: { + $route: { + handler (to, from) { + if (to.name === from.name) { + if (this.fillUrlQuery) { + this._getUrlParams(); + } + if (this.watchRoute) { + this.getList(); + } + } + }, + deep: true, + }, + }, + created () { + if (this.fillUrlQuery) { + this._getUrlParams(); + } + if (this.defaultSearch) { + this.getList(); + } + }, + methods: { + _getUrlParams () { + const { query } = this.$route; + + for (const $key in this.search) { + this.search[$key] = ''; + } + if(this.unUseParams) { + for (const key in query) { + if (!this.unUseParams.includes(key)) { + this.search[key] = query[key] || ''; + } + } + } + this.pagination.page_index = +(query.page_index || 1); + this.pagination.page_size = +(query.page_size || this.pagination.page_size); + }, + + async getList (opt = { + to: false, // call router.push automatically + resetSearch: false, // reset search fields + resetPagination: false, // reset pagination fields + }) { + if (this.vData) { + for (const key in this.vData) { + const val = this.vData[key]; + + this[key] = val; + } + this.getListApi = this.vData.getListApi; + } + if (!this.getListApi) return; + + this.loading = true; + + // reset search fields + if (opt.resetSearch) { + for (const key in this.search) { + this.search[key] = ''; + } + this.pagination.total = 0; + this.pagination.page_index = 1; + } + // reset pagination fields + if (opt.resetPagination) { + this.pagination.total = 0; + this.pagination.page_index = 1; + } + + // call router.push automatically + if (opt.to) { + const { watchRoute } = this; + + if (watchRoute) { + this.watchRoute = false; + } + this.$router.push({ + query: { + ...this.search, + page_index: this.pagination.page_index, + page_size: this.pagination.page_size, + }, + }); + if (watchRoute) { + setTimeout(_ => { + this.watchRoute = true; + }); + } + } + // watch $route + if (this.watchRoute) { + // update pagination + const { query } = this.$route; + + this.pagination.page_index = +(query.page_index || 1); + this.pagination.page_size = +(query.page_size || this.pagination.page_size); + } + this.unUseParams && this.unUseParams.forEach(key => { + this.search[key] = ''; + }); + const params = { + [this.requestMethod === 'get' ? 'params' : 'data']: Object.assign(this.search, { + page_index: this.pagination.page_index - 1, + page_size: this.pagination.page_size || 20, + }), + }; + + const { code, data } = await this.$http[this.requestMethod](this.getListApi, params); + + if (code === 0) { + this.list = data.list || []; + if (this.vData) { + this.vData.list = data.list || []; + } + this.pagination.total = data.total; + this.afterTableRender(data.list); + } + + setTimeout(() => { + this.loading = false; + if (this.vData) { + this.vData.loading = false; + } + }, 100); + }, + + afterTableRender () { }, + + currentPageChange (val) { + if (this.watchRoute || this.turnPageRoute) { + this.$router.push({ + query: { + ...this.search, + page_index: val, + }, + }); + } else { + this.pagination.page_index = val; + this.getList(); + } + }, + + pageSizeChange (val) { + if (this.watchRoute || this.turnPageRoute) { + this.$router.push({ + query: { + ...this.search, + page_size: val, + }, + }); + } else { + this.pagination.page_size = val; + this.getList(); + } + }, + }, + }; +})(); diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/router/auth.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/router/auth.js" new file mode 100644 index 0000000000000000000000000000000000000000..4cbe17fa94e452114744170010f044674b44ef80 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/router/auth.js" @@ -0,0 +1,111 @@ +/*! + * @author claude + * User authentication + */ + +const prefixPath = process.env.NODE_ENV === 'development' ? '/' : `${process.env.CONTEXT_ENV ? `/${process.env.CONTEXT_ENV}/` : '/'}`; + +export const setStorage = () => { + /* const KEEPALIVE = `${baseUrl}_keepAlive`; + + let keepAlive = localStorage.getItem(KEEPALIVE); + + keepAlive = keepAlive ? JSON.parse(keepAlive) : false; + + return keepAlive ? localStorage : sessionStorage; */ + return window.localStorage; +}; + +/** + * clear user cache + */ +export const clearUserInfo = () => { + const { baseUrl } = window.api; + + setStorage().removeItem(`${baseUrl}_userInfo`); +}; + +/** + * check login state + */ +export const baseIsLogin = () => { + const { baseUrl } = window.api; + const userInfo = setStorage().getItem(`${baseUrl}_userInfo`); + + if (userInfo) { + // sync store user info + syncLogin(userInfo); + } else { + clearUserInfo(); + } + return Boolean(userInfo); +}; + +/** + * sync login state + */ +export const syncLogin = async (userInfo = {}) => { + + if (userInfo.token) { + const { $route, $router } = window.$app.config.globalProperties; + + if ($route.meta.requiresLogout) { + const { href } = window.location; + const url = window.decodeURIComponent(href); + const target = url.split('?redirect=')[1]; + + $router.replace(target || prefixPath); + } else { + window.location.reload(); + } + } +}; + +/** + * force to logout + */ +export const baseLogout = (opt = { redirect: true }) => { + const { baseUrl } = window.api; + + // reset store & localstorage + clearUserInfo(); + setStorage().removeItem(`${baseUrl}_system_inited`); + + let query = {}; + const { $router } = window.$app.config.globalProperties; + + if(opt.redirect) { + if ($router.currentRoute.path !== prefixPath) { + query = { + redirect: $router.currentRoute.fullPath, + }; + } + } + + $router.replace({ + name: 'login', + query, + }); +}; + +/** + * sync login state for all browser tabs + */ +export const syncTabsUserState = async () => { + + window.addEventListener('storage', (e) => { + + const { baseUrl } = window.api; + + if (e.key === setStorage().getItem(`${baseUrl}_userInfo`)) { + + if (e.newValue) { + // logged in + syncLogin(e.newValue); + + } else { + baseLogout(); + } + } + }); +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/router/guards.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/router/guards.js" new file mode 100644 index 0000000000000000000000000000000000000000..79be0aedb8dc37514be3518088d69e86ded24b1f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/router/guards.js" @@ -0,0 +1,144 @@ +/*! + * @author claude + * global router guards + */ + +/** + * thinking path: + * - get to.meta go different path + * 1, need to login + * 1.1 logged in + * 1.1.1 url has redirect + * 1.1.1.1 redirect has params + * to.path === redirect => next + * 1.1.1.2 no params + * next => redirect + * 1.2 not login + * next => login + * 2, no need to login + * next + * logged in and to.path === login or like register, go index + */ + +import { baseIsLogin, setStorage } from './auth'; + +const prefixPath = process.env.NODE_ENV === 'development' ? '/' : `${process.env.CONTEXT_ENV ? `/${process.env.CONTEXT_ENV}/` : '/'}`; +const blacklist = ['register', 'find-password', 'init', 'upload']; + +export default router => { + router.beforeEach((to, from, next) => { + const { baseUrl } = window.api; + const isLogin = baseIsLogin(); + + let inited = setStorage().getItem(`${baseUrl}_system_inited`); + + inited == null ? inited = false : inited = JSON.parse(inited); + + if (inited && to.name === 'init') { + next({ name: 'index', replace: true }); + } + + // matched is all path + if (to.matched.some(record => record.meta.requiresAuth !== false)) { + // need to login + if (isLogin) { + const { redirect } = from.query; + + if(redirect) { + let pathIsBlackList = false; + const redirectUrl = decodeURIComponent(redirect); + const params = redirectUrl.split('?'); + const path = params[0]; + const query = params[1]; + const queryArr = query && query.length ? query.split(/=|&/) : []; + const queryObject = {}; + + queryArr.forEach((val, i) => { + if (i % 2 === 0) { + queryObject[val] = ''; + } else { + queryObject[queryArr[i - 1]] = val; + } + }); + + for (let i = 0; i < blacklist.length; i++) { + if (path === `${prefixPath}${blacklist[i]}`) { + pathIsBlackList = true; + break; + } + } + + if (pathIsBlackList) { + next(); + } else { + if (to.fullPath === redirectUrl) { // break the loop + next(); + } else { + next({ path, query: queryObject, replace: true }); + } + } + } else { + if (inited) { + next(); + } else { + if (to.fullPath === `${prefixPath}init`) { + next(); + } else { + next({ + name: 'init', + replace: true, + }); + } + } + } + } else { + next({ + path: `${prefixPath}login`, + query: { redirect: encodeURIComponent(to.fullPath) }, + replace: true, + }); + } + } else if (to.matched.some(record => record.meta.requiresLogout)) { + // logged in and to.path === login + if (isLogin) { + next({ name: 'index', replace: true }); + } else { + next(); + } + } else { + // no need to login + next(); + } + }); + + router.beforeResolve((to, from, next) => { + const { baseUrl } = window.api; + const isLogin = baseIsLogin(); + + let inited = setStorage().getItem(`${baseUrl}_system_inited`); + + inited == null ? inited = false : inited = JSON.parse(inited); + + if (!isLogin) { + router.$app.config.globalProperties.$bus.$emit('change-layout-header-title', ''); + } else { + if (inited) { + router.$app.config.globalProperties.$bus.$emit('change-layout-header-title', ''); + } else { + if (to.name !== 'init') { + return next({ + name: 'init', + replace: true, + }); + } + } + } + next(); + }); + + router.afterEach(route => { + if (route.meta) { + document.title = route.meta.title || ''; + } + }); +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/router/index.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/router/index.js" new file mode 100644 index 0000000000000000000000000000000000000000..2a45899f98cd2c8f8b576382eb66751d42f68bbc --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/router/index.js" @@ -0,0 +1,31 @@ +/*! + * @author claude + * global router + */ + +import { createRouter, createWebHistory } from 'vue-router'; +import baseRoutes from './routes'; + +const router = createRouter({ + routes: baseRoutes, + history: createWebHistory(), + scrollBehavior (to, from, savedPosition) { + const scrollBehavior = { + el: '#layout-main', + top: savedPosition ? savedPosition.top : 0, + left: savedPosition ? savedPosition.left : 0, + behavior: 'smooth', + }; + + return new Promise((resolve, reject) => { + setTimeout(() => { + const el = document.getElementById('layout-main'); + + el && el.scrollTo(scrollBehavior); + resolve(); + }, 200); + }); + }, +}); + +export default router; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/router/routes.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/router/routes.js" new file mode 100644 index 0000000000000000000000000000000000000000..033ff951b0552a6718d1c7b200e201fd4e3eefda --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/router/routes.js" @@ -0,0 +1,404 @@ +/* + * @author claude + */ + +/** + * @param {meta: hidden} Boolean false show in menus + * @param {meta: requiresAuth} Boolean false no need to login + * @param {meta: requiresLogout} Boolean true must to login + * @param {meta: loginAndRefresh} Boolean login with dialog refresh current page + * @param {meta: active} String highlight parent path + * @param {meta: icon} String menu icon + * @param {meta: title} String menu title + * @param {meta: asmenu} Boolean show as a menu, no children menu + * @param {meta: navigation} Boolean show page fixed navigation on the right + */ +const prefixPath = process.env.NODE_ENV === 'development' ? '/' : `${process.env.CONTEXT_ENV ? `/${process.env.CONTEXT_ENV}/` : '/'}`; + +// all routes +const baseRoutes = [ + { + path: prefixPath, + meta: { + title: '涓婚〉', + requiresLogout: false, + asmenu: true, + }, + component: () => import('@comp/LayoutBase.vue'), + children: [ + { + path: prefixPath, + name: 'index', + meta: { + title: '涓婚〉', + icon: 'monitor', + loginAndRefresh: true, + }, + component: () => import('../views/index/dashboard.vue'), + }, + ], + }, + { + path: `${prefixPath}union-center`, + meta: { + title: '鑱旈偊', + icon: 'connection', + }, + component: () => import('@comp/LayoutBase.vue'), + children: [ + { + path: `${prefixPath}member-list`, + name: 'member-list', + meta: { + loginAndRefresh: true, + title: '鎴愬憳鍒楄〃', + }, + component: () => import('../views/account/member-list'), + }, + { + path: `${prefixPath}union-data-list`, + name: 'union-data-list', + meta: { + loginAndRefresh: true, + title: '鑱旈偊鏁版嵁闆', + }, + component: () => import('../views/data-center/union-data-list'), + }, + { + path: `${prefixPath}union-data-view`, + name: 'union-data-view', + meta: { + loginAndRefresh: true, + hidden: true, + title: '鑱旈偊鏁版嵁闆嗚鎯', + active: `${prefixPath}union-data-list`, + }, + component: () => import('../views/data-center/union-data-view'), + }, + ], + }, + { + path: `${prefixPath}data-center`, + meta: { + title: '鏁版嵁涓績', + icon: 'coin', + }, + component: () => import('@comp/LayoutBase.vue'), + children: [ + { + path: `${prefixPath}data-list`, + name: 'data-list', + meta: { + loginAndRefresh: true, + title: '鎴戠殑鏁版嵁闆', + }, + component: () => import('../views/data-center/data-list'), + }, + { + path: `${prefixPath}data-add`, + name: 'data-add', + meta: { + title: '娣诲姞鏁版嵁闆', + }, + component: () => import('../views/data-center/data-add.vue'), + }, + { + path: `${prefixPath}data-view`, + name: 'data-view', + meta: { + title: '鏌ョ湅鏁版嵁闆', + hidden: true, + active: `${prefixPath}data-list`, + }, + component: () => import('../views/data-center/data-view.vue'), + }, + { + path: `${prefixPath}data-update`, + name: 'data-update', + meta: { + hidden: true, + title: '缂栬緫鏁版嵁闆', + active: `${prefixPath}data-list`, + }, + component: () => import('../views/data-center/data-update.vue'), + }, + ], + }, + { + path: `${prefixPath}teamwork`, + meta: { + title: '鍚堜綔涓績', + icon: 'list', + }, + component: () => import('@comp/LayoutBase.vue'), + children: [ + { + path: `${prefixPath}teamwork`, + name: 'project-list', + meta: { + loginAndRefresh: true, + title: '椤圭洰鍒楄〃', + }, + component: () => import('../views/teamwork/project'), + }, + { + path: `${prefixPath}teamwork/create`, + name: 'project-create', + meta: { + loginAndRefresh: true, + title: '鍒涘缓椤圭洰', + }, + component: () => import('../views/teamwork/create'), + }, + { + path: `${prefixPath}teamwork/detail`, + name: 'project-detail', + meta: { + hidden: true, + loginAndRefresh: true, + title: '椤圭洰璇︽儏', + active: `${prefixPath}teamwork`, + navigation: true, + }, + component: () => import('../views/teamwork/detail'), + }, + { + path: `${prefixPath}teamwork/detail/flow`, + name: 'project-flow', + meta: { + hidden: true, + loginAndRefresh: true, + title: '娴佺▼璇︽儏', + active: `${prefixPath}teamwork`, + titleParams: { + parentTitle: '椤圭洰璇︽儏', + title: '椤圭洰璇︽儏', + htmlTitle: '椤圭洰璇︽儏', + backward: true, + }, + }, + component: () => import('../views/teamwork/visual/visual'), + }, + { + path: `${prefixPath}teamwork/detail/job/history`, + name: 'project-job-history', + meta: { + hidden: true, + loginAndRefresh: true, + title: '娴佺▼鎵ц璁板綍', + active: `${prefixPath}teamwork`, + titleParams: { + params: ['project_id'], + name: 'project-detail', + parentTitle: '娴佺▼鍒楄〃', + title: '娴佺▼鎵ц璁板綍', + }, + }, + component: () => import('../views/teamwork/job/history'), + }, + { + path: `${prefixPath}teamwork/detail/job/detail`, + name: 'project-job-detail', + meta: { + hidden: true, + loginAndRefresh: true, + title: '浠诲姟鎵ц缁撴灉', + active: `${prefixPath}teamwork`, + titleParams: { + params: ['flow_id'], + name: 'project-flow', + title: '娴佺▼鎵ц璁板綍', + backward: true, + }, + navigation: true, + }, + component: () => import('../views/teamwork/job/detail'), + }, + { + path: `${prefixPath}teamwork/detail/job/compare`, + name: 'project-job-compare', + meta: { + hidden: true, + loginAndRefresh: true, + title: '浠诲姟瀵规瘮', + active: `${prefixPath}teamwork`, + titleParams: { + params: ['flow_id', 'project_id'], + name: 'project-job-history', + title: '娴佺▼鎵ц璁板綍', + }, + navigation: true, + }, + component: () => import('../views/teamwork/job/compare'), + }, + ], + }, + { + path: `${prefixPath}modeling-list`, + meta: { + title: '妯″瀷鍒楄〃', + hidden: true, + }, + component: () => import('@comp/LayoutFullScreen.vue'), + children: [ + { + path: `${prefixPath}modeling-list`, + name: 'modeling-list', + meta: { + loginAndRefresh: true, + title: '妯″瀷鍒楄〃', + }, + component: () => import('../views/teamwork/modeling-list.vue'), + }, + ], + }, + { + path: `${prefixPath}account`, + meta: { + title: '鐢ㄦ埛绠$悊', + icon: 'user', + }, + component: () => import('@comp/LayoutBase.vue'), + children: [ + { + path: `${prefixPath}account-list`, + name: 'account-list', + meta: { + loginAndRefresh: true, + title: '鐢ㄦ埛鍒楄〃', + normalUserCanSee: false, + }, + component: () => import('../views/account/account-list'), + }, + { + path: `${prefixPath}log-list`, + name: 'log-list', + meta: { + loginAndRefresh: true, + title: '鐢ㄦ埛鏃ュ織', + normalUserCanSee: false, + }, + component: () => import('../views/account/log-list'), + }, + { + path: `${prefixPath}account-setting`, + name: 'account-setting', + meta: { + loginAndRefresh: true, + title: '璐︽埛璁剧疆', + }, + component: () => import('../views/system-config/account-setting'), + }, + ], + }, + { + path: `${prefixPath}global`, + meta: { + title: '鍏ㄥ眬璁剧疆', + icon: 'setting', + tooltip: '* 鍙湁绠$悊鍛樿兘瀵光滃叏灞璁剧疆鈥濅腑鐨勯厤缃」杩涜鍙樻洿
* 鍙湁瓒呯骇绠$悊鍛樿兘瀵光滄垚鍛樹俊鎭濅腑鐨勯厤缃」杩涜鍙樻洿', + }, + component: () => import('@comp/LayoutBase.vue'), + children: [ + { + path: `${prefixPath}member-view`, + name: 'member-view', + meta: { + loginAndRefresh: true, + title: '鎴愬憳淇℃伅', + }, + component: () => import('../views/system-config/member-view'), + }, + { + path: `${prefixPath}blacklist`, + name: 'blacklist', + meta: { + loginAndRefresh: true, + title: '鎴愬憳榛戝悕鍗', + }, + component: () => import('../views/blacklist/blacklist-list'), + }, + { + path: `${prefixPath}system-config-view`, + name: 'system-config-view', + meta: { + loginAndRefresh: true, + title: '绯荤粺璁剧疆', + }, + component: () => import('../views/system-config/system-config-view'), + }, + ], + }, + { + path: `${prefixPath}login`, + name: 'login', + meta: { + title: '鐧诲綍', + requiresAuth: false, + requiresLogout: true, + }, + component: () => import('../views/sign/login.vue'), + }, + { + path: `${prefixPath}register`, + name: 'register', + meta: { + title: '娉ㄥ唽', + requiresAuth: false, + requiresLogout: true, + }, + component: () => import('../views/sign/register.vue'), + }, + { + path: `${prefixPath}find-password`, + name: 'find-password', + meta: { + title: '鎵惧洖瀵嗙爜', + requiresAuth: false, + requiresLogout: true, + }, + component: () => import('../views/sign/find-password.vue'), + }, + { + path: `${prefixPath}notfound`, + name: 'notfound', + meta: { + requiresAuth: false, + hidden: true, + }, + component: () => import('../views/error/404.vue'), + }, + { + path: `${prefixPath}forbidden`, + name: 'forbidden', + meta: { + requiresAuth: false, + hidden: true, + }, + component: () => import('../views/error/403.vue'), + }, + { + path: `${prefixPath}init`, + name: 'init', + meta: { + hidden: true, + }, + component: () => import('../views/member/member-initialize'), + }, + { + path: `${prefixPath}upload`, + name: 'upload', + meta: { + hidden: true, + }, + component: () => import('../views/data-center/data-uploader'), + }, + { + path: `${prefixPath}:catchAll(.*)`, + redirect: { + path: `${prefixPath}notfound`, + }, + }, +]; + +export default baseRoutes; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/store/modules/base.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/store/modules/base.js" new file mode 100644 index 0000000000000000000000000000000000000000..b5f9e5deeab9c873acb733aaced290feea13a807 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/store/modules/base.js" @@ -0,0 +1,78 @@ +function setStorage () { + /* let keepAlive = localStorage.getItem(KEEPALIVE); + + keepAlive = keepAlive ? JSON.parse(keepAlive) : false; + + return keepAlive ? localStorage : sessionStorage; */ + return window.localStorage; +} + +function parseKey (key, defaultType = null) { + try { + return JSON.parse(key); + } catch (e) { + return defaultType; + } +} + +export default _ => { + /** + * Distinguish between multiple environments + */ + const { baseUrl } = window.api; + const { localStorage } = window; + const USERINFO = `${baseUrl}_userInfo`; + const KEEPALIVE = `${baseUrl}_keepAlive`; + const TAGSLIST = `${baseUrl}_tagsList`; + const SYSTEM_INITED = `${baseUrl}_system_inited`; + + let keepAlive = localStorage.getItem(KEEPALIVE), + userInfo = localStorage.getItem(USERINFO), + tagsList = localStorage.getItem(TAGSLIST), + systemInited = localStorage.getItem(SYSTEM_INITED); + + keepAlive = keepAlive ? parseKey(keepAlive, false) : false; + userInfo = userInfo ? parseKey(userInfo, {}) : {}; + tagsList = tagsList ? parseKey(tagsList, []) : []; + systemInited = systemInited ? parseKey(systemInited, false) : false; + + const state = { + keepAlive, + userInfo, + tagsList, + systemInited, + }; + + const getters = { + keepAlive: state => state.keepAlive, + tagsList: state => state.tagsList, + userInfo: state => state.userInfo, + systemInited: state => state.systemInited, + }; + + const mutations = { + 'KEEP_ALIVE' (state, data) { + state.keepAlive = data; + setStorage().setItem(KEEPALIVE, JSON.stringify(data)); + }, + 'UPDATE_USERINFO' (state, data) { + state.userInfo = data; + setStorage().setItem(USERINFO, data ? JSON.stringify(data) : ''); + }, + // update tag list + 'UPDATE_TAGSLIST' (state, list) { + state.tagsList = list || []; + setStorage().setItem(TAGSLIST, JSON.stringify(list)); + }, + 'SYSTEM_INITED' (state, data) { + state.systemInited = data; + setStorage().setItem(SYSTEM_INITED, JSON.stringify(data)); + }, + }; + + return { + getters, + mutations, + state, + }; +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/store/store.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/store/store.js" new file mode 100644 index 0000000000000000000000000000000000000000..ab71f7dbbe1eab4c9acb168877fcfab3922bf0ce --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/store/store.js" @@ -0,0 +1,16 @@ +/*! + * @author claude + * global store + */ + +import { createStore } from 'vuex'; +import base from './modules/base'; + +export default _ => { + return createStore({ + // strict: true, + modules: { + base: base(), + }, + }); +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/date.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/date.js" new file mode 100644 index 0000000000000000000000000000000000000000..5bc6c6fe8f47500e379ddc6b415c13699966af2f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/date.js" @@ -0,0 +1,47 @@ +/*! + * @author claude + * dateFormat + */ +export const dateFormat = (timestamp, format = 'yyyy-MM-dd hh:mm:ss') => { + + if (!timestamp) { + return ''; + } + + const $date = new Date(timestamp); + + const map = { + y: $date.getFullYear(), + M: $date.getMonth() + 1, + d: $date.getDate(), + h: $date.getHours(), + m: $date.getMinutes(), + s: $date.getSeconds(), + }; + + return format.replace(/(([yMdhmsT])(\2)*)/g, (all, t1, t2) => { + const value = map[t2]; + + if (t2 === 'y') { + return `${value}`.substr(4 - t1.length); + } else if (t2 === 'M' && t1.length > 2) { + if (t1.length === 3) { + return dateFormat.months[value - 1].substr(0, 3); + } + return dateFormat.months[value - 1]; + } + return t1.length > 1 ? `0${value}`.substr(-2) : value; + }); +}; + +/** + * the last xx ms + * @param {Number} ms + * @returns {Array: [before, now]} + */ +export const dateLast = ([ms, now]) => { + const $now = now || +new Date(); + const before = $now.setTime($now.getTime() - ms); + + return [before, $now]; +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/dbUtil.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/dbUtil.js" new file mode 100644 index 0000000000000000000000000000000000000000..365aafdde5df0d8723a6e81b4b04972a1fdbd1cb --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/dbUtil.js" @@ -0,0 +1,143 @@ + +class DBUtil { + db = null + dbname + keyPath // db key + table // db table + indexedDB = null + constructor(options = { + dbname: 'wefe-chat', + table: 'accountId', + keyPath: 'time', + }) { + this.dbname = options.dbname; + this.keyPath = options.keyPath; + this.table = options.table; + this.indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.msIndexedDB; + + return this.openDB(); + } + + openDB () { + return new Promise((resolve, reject) => { + if (this.indexedDB) { + const connect = this.indexedDB.open(this.dbname); + + connect.onsuccess = (e) => { + this.db = connect.result; + console.log('鏁版嵁搴撹繛鎺ユ垚鍔!'); + resolve(this); + }; + connect.onerror = (e) => { + this.onerror(e); + }; + // update + connect.onupgradeneeded = (e) => { + this.onupgradeneeded(e); + }; + + } else { + reject('indexedDB is not supported!'); + } + }); + } + + onerror (event) { + console.log('鏁版嵁搴撹繛鎺ュけ璐'); + } + + onupgradeneeded (event) { + console.log('鏇存柊鏁版嵁搴...'); + this.db = event.target.result; + // create table + if (!this.db.objectStoreNames.contains(this.table)) { + this.db.createObjectStore(this.table, { keyPath: this.keyPath }); + } + } + + addData (data) { + const connect = this.db.transaction([this.table], 'readwrite').objectStore(this.table).add(data); + + return new Promise((resolve, reject) => { + connect.onsuccess = () => { + console.log('鏁版嵁鍐欏叆鎴愬姛'); + resolve(); + }; + connect.onerror = (event) => { + reject(event.target.error.message); + }; + }); + } + + deleteData (key) { + const transaction = this.db.transaction([this.table], 'readwrite'); + const objectStore = transaction.objectStore(this.table); + const connect = objectStore.delete(key); + + return new Promise((resolve, reject) => { + connect.onsuccess = () => { + resolve(); + }; + connect.onerror = (event) => { + reject(event.target.error.message); + }; + }); + } + + putData (key, data) { + const transaction = this.db.transaction([this.table]); + const objectStore = transaction.objectStore(this.table); + const connect = objectStore.put({ id: key, ...data }); + + return new Promise((resolve, reject) => { + connect.onsuccess = () => { + resolve(); + }; + connect.onerror = (event) => { + reject(event.target.error.message); + }; + }); + } + + getData (key) { + const transaction = this.db.transaction([this.table]); + const objectStore = transaction.objectStore(this.table); + const connect = objectStore.get(key); + + return new Promise((resolve, reject) => { + + connect.onerror = () => { + reject(null); + }; + + connect.onsuccess = () => { + resolve(connect.result); + }; + }); + } + + readAll () { + const objectStore = this.db.transaction(this.table).objectStore(this.table); + + return new Promise(resolve => { + const all = []; + + objectStore.openCursor().onsuccess = (event) => { + const cursor = event.target.result; + + if (cursor) { + all.push(cursor.value); + cursor.continue(); + } else { + resolve(all); + } + }; + }); + } + + close () { + this.db && this.db.close(); + } +} + +export default DBUtil; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/filters.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/filters.js" new file mode 100644 index 0000000000000000000000000000000000000000..8afaeb3a2fa3890a14246b152a49dfe7b56ea046 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/filters.js" @@ -0,0 +1,12 @@ +/** + * global filters + */ + +import { dateFormat, dateLast } from '@src/utils/date'; +import { timeFormat } from '@src/utils/timer'; + +export default app => { + app.filter('dateFormat', dateFormat); + app.filter('dateLast', dateLast); + app.filter('timeFormat', timeFormat); +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/timer.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/timer.js" new file mode 100644 index 0000000000000000000000000000000000000000..24faca4f42e64cede060aa00f52e7c7c7c7b26b9 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/timer.js" @@ -0,0 +1,41 @@ + +/** + * timeFormat + * @param {Number} interval seconds + * @param {String} format + */ +export const timeFormat = (interval, format = 'D澶 HH灏忔椂MM鍒嗛挓SS绉') => { + // const noSpace = /(^\s+)|(\s+$)/g; + if (interval) { + const seconds = interval; + const minutes = Math.floor(seconds / 60); + const hours = Math.floor(minutes / 60); + const day = Math.floor(hours / 60); + + const map = { + D: day, + H: hours % 24, + M: minutes % 60, + S: Math.floor(seconds % 60), + }; + + let regExp = 'DHMS'; + + if (map.D === 0) { + regExp = 'HMS'; + format = format.replace('D澶', ''); + if (map.H === 0) { + regExp = 'MS'; + format = format.replace('HH灏忔椂', ''); + if (map.M === 0) { + format = format.replace('MM鍒嗛挓', ''); + } + } + } + return format.replace(new RegExp(`(([${regExp}])+)`, 'g'), (all, t1, t2) => { + return t1.length > 1 ? `0${map[t2] || 0}`.substr(-2) : (map[t2] || 0); + }); + } else { + return '0 鍒 0 绉'; + } +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/tools.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/tools.js" new file mode 100644 index 0000000000000000000000000000000000000000..0d5e0e3901ffaaad0fa8ea54bc399c461bfb64e8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/tools.js" @@ -0,0 +1,26 @@ +/* throttle */ + +function throttle(callback, delay = 300, duration = 200) { + const _this = this; + const timer = this.timer; + + let begin = new Date().getTime(); + + return function() { + const current = new Date().getTime(); + + clearTimeout(timer); + if (current - begin >= duration) { + callback(); + begin = current; + } else { + _this.timer = setTimeout(function () { + callback(); + }, delay); + } + }; +} + +export { + throttle, +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/types.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/types.js" new file mode 100644 index 0000000000000000000000000000000000000000..8177388212fbdf4af1cccb3f64f31fc1aca26368 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/types.js" @@ -0,0 +1,103 @@ +/*! + * @author claude + * data transform + */ + +/** + * is empty (empty Object/array/string) + * @param {*} (obj / array / string) + */ +export const isEmpty = obj => { + if (!obj || obj === '' || obj == null) return true; + + if (obj.constructor === Array) { + if (obj.length === 0) return true; + } else { + if (Object.keys(obj).length === 0) return true; + } + return false; +}; + +/** + * deep clone + * @param {Object} obj + */ +export const deepClone = (obj) => { + if (obj == null) return obj; + if (obj instanceof Date) return new Date(obj); + if (obj instanceof RegExp) return new RegExp(obj); + if (typeof obj !== 'object') return obj; + + let target = new obj.constructor(); + + Object.keys(target).forEach((key) => { + if (obj.hasOwnProperty(key)) { + target = deepClone(obj[key]); + } + }); + + return target; +}; + +/** + * val is or not an array + * + * @param {Object} val + * @returns {boolean} true/false + */ +export const isArray = (val) => { + return toString.call(val) === '[object Array]'; +}; + +function forEach(obj, fn) { + // Don't bother if no value provided + if (obj === null || typeof obj === 'undefined') { + return; + } + + // Force an array if not already something iterable + if (typeof obj !== 'object') { + /*eslint no-param-reassign:0*/ + obj = [obj]; + } + + if (isArray(obj)) { + // Iterate over array values + for (let i = 0, l = obj.length; i < l; i++) { + fn.call(null, obj[i], i, obj); + } + } else { + // Iterate over object keys + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + fn.call(null, obj[key], key, obj); + } + } + } +} + +/** + * deep merge two objects (deep coverage) + * @param {target} obj + * @param {origin} obj + */ +export const deepMerge = (/* obj1, obj2, obj3, ... */...args) => { + /* for (const key in origin) { + target[key] = target[key] && origin[key] !== undefined && origin[key].toString() === '[object Object]' ? deepMerge(target[key], origin[key]) : target[key] = origin[key]; + } + return target; */ + const result = {}; + + function assignValue(val, key) { + if (typeof result[key] === 'object' && typeof val === 'object') { + result[key] = deepMerge(result[key], val); + } else { + result[key] = val; + } + } + + for (let i = 0, l = args.length; i < l; i++) { + forEach(args[i], assignValue); + } + return result; +}; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/url.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/url.js" new file mode 100644 index 0000000000000000000000000000000000000000..6d1f5ce6cd39675170051e2286f9f9b2eda46a30 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/utils/url.js" @@ -0,0 +1,31 @@ +/** + * @author claude + * url query string + * @returns {Object} + */ + +export const mapQuery = () => { + const search = location.search; + + const result = {}; + + if (search.length < 2) { + return false; + } else { + const query = search.substring(1); + + const queryArr = query.split('&'); + + for (const item of queryArr) { + const eq = item.indexOf('='); + + const key = item.substring(0, eq), + value = item.substring(eq + 1); + + result[key] = value; + } + } + return result; +}; + +export const query = mapQuery(); diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/account/account-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/account/account-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..f0e883613b060dabea2e449b9946c8325e286290 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/account/account-list.vue" @@ -0,0 +1,618 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/account/log-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/account/log-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..fdbc7442db4df25b38d4a14c8854cf9cfc7dec28 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/account/log-list.vue" @@ -0,0 +1,150 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/account/member-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/account/member-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..7268cc2655342f300910641da719b847afe2a1c6 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/account/member-list.vue" @@ -0,0 +1,116 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/blacklist/blacklist-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/blacklist/blacklist-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..02695bf0bfb4d70804d76959ed38919c3972744a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/blacklist/blacklist-list.vue" @@ -0,0 +1,164 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/blacklist/select-member.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/blacklist/select-member.vue" new file mode 100644 index 0000000000000000000000000000000000000000..a9542d9ba1e73679d36a0dee7c1d98994f66291d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/blacklist/select-member.vue" @@ -0,0 +1,164 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/components/all-data-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/components/all-data-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..c335920e3758b21ff41649a5e6b95f6daae1f4c5 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/components/all-data-list.vue" @@ -0,0 +1,239 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/components/data-set-public-tips.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/components/data-set-public-tips.vue" new file mode 100644 index 0000000000000000000000000000000000000000..d3511b31509b6138879e57373281dd9789717f73 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/components/data-set-public-tips.vue" @@ -0,0 +1,76 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/components/select-member.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/components/select-member.vue" new file mode 100644 index 0000000000000000000000000000000000000000..371172e8d0c111258ca7003ea88dae1be270932a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/components/select-member.vue" @@ -0,0 +1,252 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/components/speed-cart.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/components/speed-cart.vue" new file mode 100644 index 0000000000000000000000000000000000000000..ccd562ada49b38f3c54a65163c2853c1863c0333 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/components/speed-cart.vue" @@ -0,0 +1,405 @@ + + + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/components/uploading-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/components/uploading-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..5760a0debd4b4cfcabc082a61009b3554129660b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/components/uploading-list.vue" @@ -0,0 +1,113 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/data-add.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/data-add.vue" new file mode 100644 index 0000000000000000000000000000000000000000..f5af50d50f5f88e958018cdfddf1311511ed7359 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/data-add.vue" @@ -0,0 +1,1156 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/data-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/data-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..eea7b8aee393a108de11903999936dbf39a06fbc --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/data-list.vue" @@ -0,0 +1,333 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/data-update.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/data-update.vue" new file mode 100644 index 0000000000000000000000000000000000000000..aa75a64dd88d131d6deb61dd0cb32bd306dc5d14 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/data-update.vue" @@ -0,0 +1,536 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/data-uploader.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/data-uploader.vue" new file mode 100644 index 0000000000000000000000000000000000000000..c21127b2e0bf1abed42daf7d80d8906805cb4736 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/data-uploader.vue" @@ -0,0 +1,71 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/data-view.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/data-view.vue" new file mode 100644 index 0000000000000000000000000000000000000000..5c8fed329ab6c68b0ddc5888590f43954f9d34c2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/data-view.vue" @@ -0,0 +1,198 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/union-data-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/union-data-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..72d4fc2cf8c4d9ecb0d505684374d07bbf93df18 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/union-data-list.vue" @@ -0,0 +1,407 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/union-data-view.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/union-data-view.vue" new file mode 100644 index 0000000000000000000000000000000000000000..f81881736b03ebf4464031f033d8ee2674d4ecf3 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/data-center/union-data-view.vue" @@ -0,0 +1,120 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/error/403.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/error/403.vue" new file mode 100644 index 0000000000000000000000000000000000000000..601b29206ce8585a870661c9614e3ae2d82cb208 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/error/403.vue" @@ -0,0 +1,5 @@ + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/error/404.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/error/404.vue" new file mode 100644 index 0000000000000000000000000000000000000000..09e3a45b065895f788bd01e2041b93ab18ca2f82 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/error/404.vue" @@ -0,0 +1,30 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/index/components/message-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/index/components/message-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..2f7a16971192564ab1ecd426182f5c7aec5d7b32 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/index/components/message-list.vue" @@ -0,0 +1,212 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/index/components/service-status-item.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/index/components/service-status-item.vue" new file mode 100644 index 0000000000000000000000000000000000000000..4f21e8375a5f9ee9167ee56ff9e8608d724f659f --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/index/components/service-status-item.vue" @@ -0,0 +1,138 @@ + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/index/components/service-status.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/index/components/service-status.vue" new file mode 100644 index 0000000000000000000000000000000000000000..2923b94fc330f609b638827d0db63e9239b62ac2 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/index/components/service-status.vue" @@ -0,0 +1,55 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/index/dashboard.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/index/dashboard.vue" new file mode 100644 index 0000000000000000000000000000000000000000..fce6109e67a93dd16aaed2d61233e30131887d87 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/index/dashboard.vue" @@ -0,0 +1,24 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/member/member-initialize.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/member/member-initialize.vue" new file mode 100644 index 0000000000000000000000000000000000000000..ac4cd889b484958ad2776f7635fa9be967fbd948 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/member/member-initialize.vue" @@ -0,0 +1,351 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/monitor/service-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/monitor/service-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..f258afe99422b70ec039e664361d771db230a24c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/monitor/service-list.vue" @@ -0,0 +1,154 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/sign/find-password.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/sign/find-password.vue" new file mode 100644 index 0000000000000000000000000000000000000000..10daba5b3e5a976330b0d5bab05fe8ef4484ebbb --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/sign/find-password.vue" @@ -0,0 +1,247 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/sign/login.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/sign/login.vue" new file mode 100644 index 0000000000000000000000000000000000000000..c5e0904ee85cb48e60ac938da6deb8f68cc595f7 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/sign/login.vue" @@ -0,0 +1,306 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/sign/register.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/sign/register.vue" new file mode 100644 index 0000000000000000000000000000000000000000..d7155e42cc9b303b950b70894ade840062e51058 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/sign/register.vue" @@ -0,0 +1,332 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/sign/sign.scss" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/sign/sign.scss" new file mode 100644 index 0000000000000000000000000000000000000000..34471c58fb08d295048aefad8aaf8a088f1bd8d6 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/sign/sign.scss" @@ -0,0 +1,61 @@ +.sign-box { + padding: 70px 40px 30px; + padding-top: 10vh; + margin: 0 auto; + width: 440px; +} +.sign-form{ + max-width: 300px; + margin: 0 auto; +} +.logo { + width : 150px; + height: 150px; + display: block; + margin: 0 auto; + img {height: 100%;} +} + +.sign-title { + font-size: 20px; + color: rgb(73, 80, 87, .6); +} + +.sub-title{ + font-size: 16px; +} + +.el-divider{ + margin: 14px 0; + background:#e9ecef; +} + +.el-form-item{ + margin-bottom: 16px; +} + +.form-code{ + :deep(.el-input-group__append){ + padding:0; + width: 85px; + overflow: hidden; + } +} +.code-img{ + width: 85px; + height: 30px; + cursor: pointer; +} +.el-checkbox{ + font-weight: normal; +} + +:deep(.el-form-item__label, + .el-checkbox__label) { + font-size: 13px; + } + +.sign-action { + text-align: right; + font-size: 14px; +} diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/system-config/account-setting.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/system-config/account-setting.vue" new file mode 100644 index 0000000000000000000000000000000000000000..66ab99cdf736c9baf06807794c49897648f91f3d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/system-config/account-setting.vue" @@ -0,0 +1,211 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/system-config/member-view.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/system-config/member-view.vue" new file mode 100644 index 0000000000000000000000000000000000000000..0ac2b2b80e76bdbd738c01912226f516d66c57fb --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/system-config/member-view.vue" @@ -0,0 +1,425 @@ + + + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/system-config/system-config-view.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/system-config/system-config-view.vue" new file mode 100644 index 0000000000000000000000000000000000000000..993bf2688e4dbf68d2147808949f11873de5ccec --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/system-config/system-config-view.vue" @@ -0,0 +1,229 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/derived-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/derived-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..419ab8d6906f0280deaaea859d94b793021046d6 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/derived-list.vue" @@ -0,0 +1,259 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/download-job-log.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/download-job-log.vue" new file mode 100644 index 0000000000000000000000000000000000000000..3364883a42398b158ea0b09f3589218b732f46b4 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/download-job-log.vue" @@ -0,0 +1,38 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/flow-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/flow-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..b165480c9ace739992c290ab27a77bcbb8e7f09c --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/flow-list.vue" @@ -0,0 +1,606 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/member-data-set.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/member-data-set.vue" new file mode 100644 index 0000000000000000000000000000000000000000..47e107b47f173b35aea1157e25b2a24b215ef8da --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/member-data-set.vue" @@ -0,0 +1,658 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/member-service-status.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/member-service-status.vue" new file mode 100644 index 0000000000000000000000000000000000000000..4d0dd93433f970e93e24ca80bc7f86aacd1bb4b5 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/member-service-status.vue" @@ -0,0 +1,126 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/member-setting.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/member-setting.vue" new file mode 100644 index 0000000000000000000000000000000000000000..ddbc20353460b2b9f462d1f433cba22f079ea38b --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/member-setting.vue" @@ -0,0 +1,82 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/member-tab-audit.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/member-tab-audit.vue" new file mode 100644 index 0000000000000000000000000000000000000000..e1845b97a7f5275a820461ddd43f8e61983cfb5d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/member-tab-audit.vue" @@ -0,0 +1,46 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/member-tab-head.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/member-tab-head.vue" new file mode 100644 index 0000000000000000000000000000000000000000..ba0e1612e17c76fe5a72ee77985a349f88006d7a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/member-tab-head.vue" @@ -0,0 +1,37 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/members-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/members-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..60df12fa6a2bff902f0e0250e29a982b95795675 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/members-list.vue" @@ -0,0 +1,555 @@ + + + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/modeling-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/modeling-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..2933da1c26bc75b6be246eb519cd3f7993e51dd5 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/modeling-list.vue" @@ -0,0 +1,457 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/promoter-project-setting.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/promoter-project-setting.vue" new file mode 100644 index 0000000000000000000000000000000000000000..56065574b6ac9882409e4bbabbbb3f72ac116461 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/promoter-project-setting.vue" @@ -0,0 +1,131 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/provider-project-setting.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/provider-project-setting.vue" new file mode 100644 index 0000000000000000000000000000000000000000..283e69e1695436a139d4faf5cf2d94e4e53ca0ae --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/components/provider-project-setting.vue" @@ -0,0 +1,70 @@ + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/create.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/create.vue" new file mode 100644 index 0000000000000000000000000000000000000000..a4f8ed4816cc2a6140ef134fa6f66bca4934a75d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/create.vue" @@ -0,0 +1,668 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/detail.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/detail.vue" new file mode 100644 index 0000000000000000000000000000000000000000..e22215dcdfe6e3833001080340d5a7d97056dced --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/detail.vue" @@ -0,0 +1,586 @@ + + + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/job/compare.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/job/compare.vue" new file mode 100644 index 0000000000000000000000000000000000000000..19a9ebb8bbbc2525dc44b7587fb84903d1d4bccd --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/job/compare.vue" @@ -0,0 +1,290 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/job/detail.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/job/detail.vue" new file mode 100644 index 0000000000000000000000000000000000000000..1994fb005477b13494254aee77d247c06a51499a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/job/detail.vue" @@ -0,0 +1,470 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/job/history.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/job/history.vue" new file mode 100644 index 0000000000000000000000000000000000000000..13fb1c67cd4d839b51ae83cc091abdf779100439 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/job/history.vue" @@ -0,0 +1,424 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/job/model-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/job/model-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..7b17329bf63f3e2dcc1a8b8603b1eea3d1b61ba8 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/job/model-list.vue" @@ -0,0 +1,25 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/job/result-components-map.js" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/job/result-components-map.js" new file mode 100644 index 0000000000000000000000000000000000000000..177c94247e211b149c4345be891316c7f1cb4de1 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/job/result-components-map.js" @@ -0,0 +1,15 @@ +/* +* component map +* component name map to the server interface +*/ + +const requireAll = context => context.keys().map(context); +const files = require.context('./components', false, /\.vue$/); +const components = requireAll(files); +const modules = {}; + +components.forEach(component => { + modules[component.default.name] = component.default; +}); + +export default modules; diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/modeling-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/modeling-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..294e262258c144a1f8b47501618bbd46b11e161d --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/modeling-list.vue" @@ -0,0 +1,156 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/project-list.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/project-list.vue" new file mode 100644 index 0000000000000000000000000000000000000000..ffa41d426d7a6f9fbac8e006193aa2e111e36090 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/project-list.vue" @@ -0,0 +1,372 @@ + + + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/project.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/project.vue" new file mode 100644 index 0000000000000000000000000000000000000000..b9b3701bfa3aae86b2d825c18a3dd5a33407687a --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/project.vue" @@ -0,0 +1,331 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/visual/component-design.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/visual/component-design.vue" new file mode 100644 index 0000000000000000000000000000000000000000..e3b3f0a98c2e2b9bf5a764c279ad2be8bbf68835 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/visual/component-design.vue" @@ -0,0 +1,64 @@ + + + + + diff --git "a/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/visual/component-list/Binning/help.vue" "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/visual/component-list/Binning/help.vue" new file mode 100644 index 0000000000000000000000000000000000000000..d0835317b6e99ae87b6933baf605520914b36920 --- /dev/null +++ "b/BFLP234/FederationStudy/03.\346\272\220\347\240\201\351\225\234\345\203\217/WeFe/board/board-website/src/views/teamwork/visual/component-list/Binning/help.vue" @@ -0,0 +1,36 @@ +