remove unuse code
parent
a8b40fa813
commit
00dbc71db9
Binary file not shown.
Before Width: | Height: | Size: 389 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.1 MiB |
@ -1,315 +0,0 @@
|
|||||||
import asyncio
|
|
||||||
import json
|
|
||||||
import websockets
|
|
||||||
import time
|
|
||||||
import logging
|
|
||||||
import tracemalloc
|
|
||||||
import numpy as np
|
|
||||||
import argparse
|
|
||||||
import ssl
|
|
||||||
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser()
|
|
||||||
parser.add_argument("--host",
|
|
||||||
type=str,
|
|
||||||
default="0.0.0.0",
|
|
||||||
required=False,
|
|
||||||
help="host ip, localhost, 0.0.0.0")
|
|
||||||
parser.add_argument("--port",
|
|
||||||
type=int,
|
|
||||||
default=10095,
|
|
||||||
required=False,
|
|
||||||
help="grpc server port")
|
|
||||||
parser.add_argument("--asr_model",
|
|
||||||
type=str,
|
|
||||||
default="iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch",
|
|
||||||
help="model from modelscope")
|
|
||||||
parser.add_argument("--asr_model_revision",
|
|
||||||
type=str,
|
|
||||||
default="v2.0.4",
|
|
||||||
help="")
|
|
||||||
parser.add_argument("--asr_model_online",
|
|
||||||
type=str,
|
|
||||||
default="iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online",
|
|
||||||
help="model from modelscope")
|
|
||||||
parser.add_argument("--asr_model_online_revision",
|
|
||||||
type=str,
|
|
||||||
default="v2.0.4",
|
|
||||||
help="")
|
|
||||||
parser.add_argument("--vad_model",
|
|
||||||
type=str,
|
|
||||||
default="iic/speech_fsmn_vad_zh-cn-16k-common-pytorch",
|
|
||||||
help="model from modelscope")
|
|
||||||
parser.add_argument("--vad_model_revision",
|
|
||||||
type=str,
|
|
||||||
default="v2.0.4",
|
|
||||||
help="")
|
|
||||||
parser.add_argument("--punc_model",
|
|
||||||
type=str,
|
|
||||||
default="iic/punc_ct-transformer_zh-cn-common-vad_realtime-vocab272727",
|
|
||||||
help="model from modelscope")
|
|
||||||
parser.add_argument("--punc_model_revision",
|
|
||||||
type=str,
|
|
||||||
default="v2.0.4",
|
|
||||||
help="")
|
|
||||||
parser.add_argument("--ngpu",
|
|
||||||
type=int,
|
|
||||||
default=1,
|
|
||||||
help="0 for cpu, 1 for gpu")
|
|
||||||
parser.add_argument("--device",
|
|
||||||
type=str,
|
|
||||||
default="cuda",
|
|
||||||
help="cuda, cpu")
|
|
||||||
parser.add_argument("--ncpu",
|
|
||||||
type=int,
|
|
||||||
default=4,
|
|
||||||
help="cpu cores")
|
|
||||||
parser.add_argument("--certfile",
|
|
||||||
type=str,
|
|
||||||
default="ssl_key/server.crt",
|
|
||||||
required=False,
|
|
||||||
help="certfile for ssl")
|
|
||||||
|
|
||||||
parser.add_argument("--keyfile",
|
|
||||||
type=str,
|
|
||||||
default="ssl_key/server.key",
|
|
||||||
required=False,
|
|
||||||
help="keyfile for ssl")
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
|
|
||||||
websocket_users = set()
|
|
||||||
|
|
||||||
print("model loading")
|
|
||||||
from funasr import AutoModel
|
|
||||||
|
|
||||||
# asr
|
|
||||||
model_asr = AutoModel(model=args.asr_model,
|
|
||||||
model_revision=args.asr_model_revision,
|
|
||||||
ngpu=args.ngpu,
|
|
||||||
ncpu=args.ncpu,
|
|
||||||
device=args.device,
|
|
||||||
disable_pbar=True,
|
|
||||||
disable_log=True,
|
|
||||||
)
|
|
||||||
# asr
|
|
||||||
model_asr_streaming = AutoModel(model=args.asr_model_online,
|
|
||||||
model_revision=args.asr_model_online_revision,
|
|
||||||
ngpu=args.ngpu,
|
|
||||||
ncpu=args.ncpu,
|
|
||||||
device=args.device,
|
|
||||||
disable_pbar=True,
|
|
||||||
disable_log=True,
|
|
||||||
)
|
|
||||||
# vad
|
|
||||||
model_vad = AutoModel(model=args.vad_model,
|
|
||||||
model_revision=args.vad_model_revision,
|
|
||||||
ngpu=args.ngpu,
|
|
||||||
ncpu=args.ncpu,
|
|
||||||
device=args.device,
|
|
||||||
disable_pbar=True,
|
|
||||||
disable_log=True,
|
|
||||||
# chunk_size=60,
|
|
||||||
)
|
|
||||||
|
|
||||||
if args.punc_model != "":
|
|
||||||
model_punc = AutoModel(model=args.punc_model,
|
|
||||||
model_revision=args.punc_model_revision,
|
|
||||||
ngpu=args.ngpu,
|
|
||||||
ncpu=args.ncpu,
|
|
||||||
device=args.device,
|
|
||||||
disable_pbar=True,
|
|
||||||
disable_log=True,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
model_punc = None
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
print("model loaded! only support one client at the same time now!!!!")
|
|
||||||
|
|
||||||
async def ws_reset(websocket):
|
|
||||||
print("ws reset now, total num is ",len(websocket_users))
|
|
||||||
|
|
||||||
websocket.status_dict_asr_online["cache"] = {}
|
|
||||||
websocket.status_dict_asr_online["is_final"] = True
|
|
||||||
websocket.status_dict_vad["cache"] = {}
|
|
||||||
websocket.status_dict_vad["is_final"] = True
|
|
||||||
websocket.status_dict_punc["cache"] = {}
|
|
||||||
|
|
||||||
await websocket.close()
|
|
||||||
|
|
||||||
|
|
||||||
async def clear_websocket():
|
|
||||||
for websocket in websocket_users:
|
|
||||||
await ws_reset(websocket)
|
|
||||||
websocket_users.clear()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async def ws_serve(websocket, path):
|
|
||||||
frames = []
|
|
||||||
frames_asr = []
|
|
||||||
frames_asr_online = []
|
|
||||||
global websocket_users
|
|
||||||
# await clear_websocket()
|
|
||||||
websocket_users.add(websocket)
|
|
||||||
websocket.status_dict_asr = {}
|
|
||||||
websocket.status_dict_asr_online = {"cache": {}, "is_final": False}
|
|
||||||
websocket.status_dict_vad = {'cache': {}, "is_final": False}
|
|
||||||
websocket.status_dict_punc = {'cache': {}}
|
|
||||||
websocket.chunk_interval = 10
|
|
||||||
websocket.vad_pre_idx = 0
|
|
||||||
speech_start = False
|
|
||||||
speech_end_i = -1
|
|
||||||
websocket.wav_name = "microphone"
|
|
||||||
websocket.mode = "2pass"
|
|
||||||
print("new user connected", flush=True)
|
|
||||||
|
|
||||||
try:
|
|
||||||
async for message in websocket:
|
|
||||||
if isinstance(message, str):
|
|
||||||
messagejson = json.loads(message)
|
|
||||||
|
|
||||||
if "is_speaking" in messagejson:
|
|
||||||
websocket.is_speaking = messagejson["is_speaking"]
|
|
||||||
websocket.status_dict_asr_online["is_final"] = not websocket.is_speaking
|
|
||||||
if "chunk_interval" in messagejson:
|
|
||||||
websocket.chunk_interval = messagejson["chunk_interval"]
|
|
||||||
if "wav_name" in messagejson:
|
|
||||||
websocket.wav_name = messagejson.get("wav_name")
|
|
||||||
if "chunk_size" in messagejson:
|
|
||||||
chunk_size = messagejson["chunk_size"]
|
|
||||||
if isinstance(chunk_size, str):
|
|
||||||
chunk_size = chunk_size.split(',')
|
|
||||||
websocket.status_dict_asr_online["chunk_size"] = [int(x) for x in chunk_size]
|
|
||||||
if "encoder_chunk_look_back" in messagejson:
|
|
||||||
websocket.status_dict_asr_online["encoder_chunk_look_back"] = messagejson["encoder_chunk_look_back"]
|
|
||||||
if "decoder_chunk_look_back" in messagejson:
|
|
||||||
websocket.status_dict_asr_online["decoder_chunk_look_back"] = messagejson["decoder_chunk_look_back"]
|
|
||||||
if "hotword" in messagejson:
|
|
||||||
websocket.status_dict_asr["hotword"] = messagejson["hotword"]
|
|
||||||
if "mode" in messagejson:
|
|
||||||
websocket.mode = messagejson["mode"]
|
|
||||||
|
|
||||||
websocket.status_dict_vad["chunk_size"] = int(websocket.status_dict_asr_online["chunk_size"][1]*60/websocket.chunk_interval)
|
|
||||||
if len(frames_asr_online) > 0 or len(frames_asr) > 0 or not isinstance(message, str):
|
|
||||||
if not isinstance(message, str):
|
|
||||||
frames.append(message)
|
|
||||||
duration_ms = len(message)//32
|
|
||||||
websocket.vad_pre_idx += duration_ms
|
|
||||||
|
|
||||||
# asr online
|
|
||||||
frames_asr_online.append(message)
|
|
||||||
websocket.status_dict_asr_online["is_final"] = speech_end_i != -1
|
|
||||||
if len(frames_asr_online) % websocket.chunk_interval == 0 or websocket.status_dict_asr_online["is_final"]:
|
|
||||||
if websocket.mode == "2pass" or websocket.mode == "online":
|
|
||||||
audio_in = b"".join(frames_asr_online)
|
|
||||||
try:
|
|
||||||
await async_asr_online(websocket, audio_in)
|
|
||||||
except:
|
|
||||||
print(f"error in asr streaming, {websocket.status_dict_asr_online}")
|
|
||||||
frames_asr_online = []
|
|
||||||
if speech_start:
|
|
||||||
frames_asr.append(message)
|
|
||||||
# vad online
|
|
||||||
try:
|
|
||||||
speech_start_i, speech_end_i = await async_vad(websocket, message)
|
|
||||||
except:
|
|
||||||
print("error in vad")
|
|
||||||
if speech_start_i != -1:
|
|
||||||
speech_start = True
|
|
||||||
beg_bias = (websocket.vad_pre_idx-speech_start_i)//duration_ms
|
|
||||||
frames_pre = frames[-beg_bias:]
|
|
||||||
frames_asr = []
|
|
||||||
frames_asr.extend(frames_pre)
|
|
||||||
# asr punc offline
|
|
||||||
if speech_end_i != -1 or not websocket.is_speaking:
|
|
||||||
# print("vad end point")
|
|
||||||
if websocket.mode == "2pass" or websocket.mode == "offline":
|
|
||||||
audio_in = b"".join(frames_asr)
|
|
||||||
try:
|
|
||||||
await async_asr(websocket, audio_in)
|
|
||||||
except:
|
|
||||||
print("error in asr offline")
|
|
||||||
frames_asr = []
|
|
||||||
speech_start = False
|
|
||||||
frames_asr_online = []
|
|
||||||
websocket.status_dict_asr_online["cache"] = {}
|
|
||||||
if not websocket.is_speaking:
|
|
||||||
websocket.vad_pre_idx = 0
|
|
||||||
frames = []
|
|
||||||
websocket.status_dict_vad["cache"] = {}
|
|
||||||
else:
|
|
||||||
frames = frames[-20:]
|
|
||||||
|
|
||||||
|
|
||||||
except websockets.ConnectionClosed:
|
|
||||||
print("ConnectionClosed...", websocket_users,flush=True)
|
|
||||||
await ws_reset(websocket)
|
|
||||||
websocket_users.remove(websocket)
|
|
||||||
except websockets.InvalidState:
|
|
||||||
print("InvalidState...")
|
|
||||||
except Exception as e:
|
|
||||||
print("Exception:", e)
|
|
||||||
|
|
||||||
|
|
||||||
async def async_vad(websocket, audio_in):
|
|
||||||
|
|
||||||
segments_result = model_vad.generate(input=audio_in, **websocket.status_dict_vad)[0]["value"]
|
|
||||||
# print(segments_result)
|
|
||||||
|
|
||||||
speech_start = -1
|
|
||||||
speech_end = -1
|
|
||||||
|
|
||||||
if len(segments_result) == 0 or len(segments_result) > 1:
|
|
||||||
return speech_start, speech_end
|
|
||||||
if segments_result[0][0] != -1:
|
|
||||||
speech_start = segments_result[0][0]
|
|
||||||
if segments_result[0][1] != -1:
|
|
||||||
speech_end = segments_result[0][1]
|
|
||||||
return speech_start, speech_end
|
|
||||||
|
|
||||||
|
|
||||||
async def async_asr(websocket, audio_in):
|
|
||||||
if len(audio_in) > 0:
|
|
||||||
# print(len(audio_in))
|
|
||||||
rec_result = model_asr.generate(input=audio_in, **websocket.status_dict_asr)[0]
|
|
||||||
# print("offline_asr, ", rec_result)
|
|
||||||
if model_punc is not None and len(rec_result["text"])>0:
|
|
||||||
# print("offline, before punc", rec_result, "cache", websocket.status_dict_punc)
|
|
||||||
rec_result = model_punc.generate(input=rec_result['text'], **websocket.status_dict_punc)[0]
|
|
||||||
# print("offline, after punc", rec_result)
|
|
||||||
if len(rec_result["text"])>0:
|
|
||||||
# print("offline", rec_result)
|
|
||||||
mode = "2pass-offline" if "2pass" in websocket.mode else websocket.mode
|
|
||||||
message = json.dumps({"mode": mode, "text": rec_result["text"], "wav_name": websocket.wav_name,"is_final":websocket.is_speaking})
|
|
||||||
await websocket.send(message)
|
|
||||||
|
|
||||||
|
|
||||||
async def async_asr_online(websocket, audio_in):
|
|
||||||
if len(audio_in) > 0:
|
|
||||||
# print(websocket.status_dict_asr_online.get("is_final", False))
|
|
||||||
rec_result = model_asr_streaming.generate(input=audio_in, **websocket.status_dict_asr_online)[0]
|
|
||||||
# print("online, ", rec_result)
|
|
||||||
if websocket.mode == "2pass" and websocket.status_dict_asr_online.get("is_final", False):
|
|
||||||
return
|
|
||||||
# websocket.status_dict_asr_online["cache"] = dict()
|
|
||||||
if len(rec_result["text"]):
|
|
||||||
mode = "2pass-online" if "2pass" in websocket.mode else websocket.mode
|
|
||||||
message = json.dumps({"mode": mode, "text": rec_result["text"], "wav_name": websocket.wav_name,"is_final":websocket.is_speaking})
|
|
||||||
await websocket.send(message)
|
|
||||||
|
|
||||||
if len(args.certfile)>0:
|
|
||||||
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
|
|
||||||
|
|
||||||
# Generate with Lets Encrypt, copied to this location, chown to current user and 400 permissions
|
|
||||||
ssl_cert = args.certfile
|
|
||||||
ssl_key = args.keyfile
|
|
||||||
|
|
||||||
ssl_context.load_cert_chain(ssl_cert, keyfile=ssl_key)
|
|
||||||
start_server = websockets.serve(ws_serve, args.host, args.port, subprotocols=["binary"], ping_interval=None,ssl=ssl_context)
|
|
||||||
else:
|
|
||||||
start_server = websockets.serve(ws_serve, args.host, args.port, subprotocols=["binary"], ping_interval=None)
|
|
||||||
asyncio.get_event_loop().run_until_complete(start_server)
|
|
||||||
asyncio.get_event_loop().run_forever()
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@ -1,119 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright FunASR (https://github.com/alibaba-damo-academy/FunASR). All Rights
|
|
||||||
* Reserved. MIT License (https://opensource.org/licenses/MIT)
|
|
||||||
*/
|
|
||||||
/* 2021-2023 by zhaoming,mali aihealthx.com */
|
|
||||||
|
|
||||||
function WebSocketConnectMethod( config ) { //定义socket连接方法类
|
|
||||||
|
|
||||||
|
|
||||||
var speechSokt;
|
|
||||||
var connKeeperID;
|
|
||||||
|
|
||||||
var msgHandle = config.msgHandle;
|
|
||||||
var stateHandle = config.stateHandle;
|
|
||||||
|
|
||||||
this.wsStart = function () {
|
|
||||||
var Uri = document.getElementById('wssip').value; //"wss://111.205.137.58:5821/wss/" //设置wss asr online接口地址 如 wss://X.X.X.X:port/wss/
|
|
||||||
if(Uri.match(/wss:\S*|ws:\S*/))
|
|
||||||
{
|
|
||||||
console.log("Uri"+Uri);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
alert("请检查wss地址正确性");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( 'WebSocket' in window ) {
|
|
||||||
speechSokt = new WebSocket( Uri ); // 定义socket连接对象
|
|
||||||
speechSokt.onopen = function(e){onOpen(e);}; // 定义响应函数
|
|
||||||
speechSokt.onclose = function(e){
|
|
||||||
console.log("onclose ws!");
|
|
||||||
//speechSokt.close();
|
|
||||||
onClose(e);
|
|
||||||
};
|
|
||||||
speechSokt.onmessage = function(e){onMessage(e);};
|
|
||||||
speechSokt.onerror = function(e){onError(e);};
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
alert('当前浏览器不支持 WebSocket');
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// 定义停止与发送函数
|
|
||||||
this.wsStop = function () {
|
|
||||||
if(speechSokt != undefined) {
|
|
||||||
console.log("stop ws!");
|
|
||||||
speechSokt.close();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
this.wsSend = function ( oneData ) {
|
|
||||||
|
|
||||||
if(speechSokt == undefined) return;
|
|
||||||
if ( speechSokt.readyState === 1 ) { // 0:CONNECTING, 1:OPEN, 2:CLOSING, 3:CLOSED
|
|
||||||
|
|
||||||
speechSokt.send( oneData );
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// SOCEKT连接中的消息与状态响应
|
|
||||||
function onOpen( e ) {
|
|
||||||
// 发送json
|
|
||||||
var chunk_size = new Array( 5, 10, 5 );
|
|
||||||
var request = {
|
|
||||||
"chunk_size": chunk_size,
|
|
||||||
"wav_name": "h5",
|
|
||||||
"is_speaking": true,
|
|
||||||
"chunk_interval":10,
|
|
||||||
"itn":false,
|
|
||||||
"mode":getAsrMode(),
|
|
||||||
|
|
||||||
};
|
|
||||||
if(isfilemode)
|
|
||||||
{
|
|
||||||
request.wav_format=file_ext;
|
|
||||||
if(file_ext=="wav")
|
|
||||||
{
|
|
||||||
request.wav_format="PCM";
|
|
||||||
request.audio_fs=file_sample_rate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var hotwords=getHotwords();
|
|
||||||
|
|
||||||
if(hotwords!=null )
|
|
||||||
{
|
|
||||||
request.hotwords=hotwords;
|
|
||||||
}
|
|
||||||
console.log(JSON.stringify(request));
|
|
||||||
speechSokt.send(JSON.stringify(request));
|
|
||||||
console.log("连接成功");
|
|
||||||
stateHandle(0);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function onClose( e ) {
|
|
||||||
stateHandle(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function onMessage( e ) {
|
|
||||||
|
|
||||||
msgHandle( e );
|
|
||||||
}
|
|
||||||
|
|
||||||
function onError( e ) {
|
|
||||||
|
|
||||||
info_div.innerHTML="连接"+e;
|
|
||||||
console.log(e);
|
|
||||||
stateHandle(2);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
1、启动语言识别服务端
|
|
||||||
创建虚拟环境
|
|
||||||
conda create -n funasr
|
|
||||||
conda activate funasr
|
|
||||||
安装依赖库
|
|
||||||
pip install torch
|
|
||||||
pip install modelscope
|
|
||||||
pip install testresources
|
|
||||||
pip install websockets
|
|
||||||
pip install torchaudio
|
|
||||||
pip install FunASR
|
|
||||||
pip install pyaudio
|
|
||||||
|
|
||||||
|
|
||||||
python funasr_wss_server.py --port 10095
|
|
||||||
或者
|
|
||||||
python funasr_wss_server.py --host "0.0.0.0" --port 10197 --ngpu 0
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
https://github.com/alibaba-damo-academy/FunASR
|
|
||||||
https://zhuanlan.zhihu.com/p/649935170
|
|
@ -1,17 +0,0 @@
|
|||||||
## certificate generation by yourself
|
|
||||||
generated certificate may not suitable for all browsers due to security concerns. you'd better buy or download an authenticated ssl certificate from authorized agency.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
### 1) Generate a private key
|
|
||||||
openssl genrsa -des3 -out server.key 2048
|
|
||||||
|
|
||||||
### 2) Generate a csr file
|
|
||||||
openssl req -new -key server.key -out server.csr
|
|
||||||
|
|
||||||
### 3) Remove pass
|
|
||||||
cp server.key server.key.org
|
|
||||||
openssl rsa -in server.key.org -out server.key
|
|
||||||
|
|
||||||
### 4) Generated a crt file, valid for 1 year
|
|
||||||
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
|
|
||||||
```
|
|
@ -1,21 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIDhTCCAm0CFGB0Po2IZ0hESavFpcSGRNb9xrNXMA0GCSqGSIb3DQEBCwUAMH8x
|
|
||||||
CzAJBgNVBAYTAkNOMRAwDgYDVQQIDAdiZWlqaW5nMRAwDgYDVQQHDAdiZWlqaW5n
|
|
||||||
MRAwDgYDVQQKDAdhbGliYWJhMRAwDgYDVQQLDAdhbGliYWJhMRAwDgYDVQQDDAdh
|
|
||||||
bGliYWJhMRYwFAYJKoZIhvcNAQkBFgdhbGliYWJhMB4XDTIzMDYxODA2NTcxM1oX
|
|
||||||
DTI0MDYxNzA2NTcxM1owfzELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB2JlaWppbmcx
|
|
||||||
EDAOBgNVBAcMB2JlaWppbmcxEDAOBgNVBAoMB2FsaWJhYmExEDAOBgNVBAsMB2Fs
|
|
||||||
aWJhYmExEDAOBgNVBAMMB2FsaWJhYmExFjAUBgkqhkiG9w0BCQEWB2FsaWJhYmEw
|
|
||||||
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDH9Np1oBunQKMt5M/nU2nD
|
|
||||||
qVHojXwKKwyiK9DSeGikKwArH2S9NUZNu5RDg46u0iWmT+Vz+toQhkJnfatOVskW
|
|
||||||
f2bsI54n5eOvmoWOKDXYm2MscvjkuNiYRbqzgUuP9ZSx8k3uyRs++wvmwIoU+PV1
|
|
||||||
EYFcjk1P2jUGUvKaUlmIDsjs1wOMIbKO6I0UX20FNKlGWacqMR/Dx2ltmGKT1Kaz
|
|
||||||
Y335lor0bcfQtH542rGS7PDz6JMRNjFT1VFcmnrjRElf4STbaOiIfOjMVZ/9O8Hr
|
|
||||||
LFItyvkb01Mt7O0jhAXHuE1l/8Y0N3MCYkELG9mQA0BYCFHY0FLuJrGoU03b8KWj
|
|
||||||
AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAEjC9jB1WZe2ki2JgCS+eAMFsFegiNEz
|
|
||||||
D0klVB3kiCPK0g7DCxvfWR6kAgEynxRxVX6TN9QcLr4paZItC1Fu2gUMTteNqEuc
|
|
||||||
dcixJdu9jumuUMBlAKgL5Yyk3alSErsn9ZVF/Q8Kx5arMO/TW3Ulsd8SWQL5C/vq
|
|
||||||
Fe0SRhpKKoADPfl8MT/XMfB/MwNxVhYDSHzJ1EiN8O5ce6q2tTdi1mlGquzNxhjC
|
|
||||||
7Q0F36V1HksfzolrlRWRKYP16isnaKUdFfeAzaJsYw33o6VRbk6fo2fTQDHS0wOs
|
|
||||||
Q48Moc5UxKMLaMMCqLPpWu0TZse+kIw1nTWXk7yJtK0HK5PN3rTocEw=
|
|
||||||
-----END CERTIFICATE-----
|
|
@ -1,27 +0,0 @@
|
|||||||
-----BEGIN RSA PRIVATE KEY-----
|
|
||||||
MIIEowIBAAKCAQEAx/TadaAbp0CjLeTP51Npw6lR6I18CisMoivQ0nhopCsAKx9k
|
|
||||||
vTVGTbuUQ4OOrtIlpk/lc/raEIZCZ32rTlbJFn9m7COeJ+Xjr5qFjig12JtjLHL4
|
|
||||||
5LjYmEW6s4FLj/WUsfJN7skbPvsL5sCKFPj1dRGBXI5NT9o1BlLymlJZiA7I7NcD
|
|
||||||
jCGyjuiNFF9tBTSpRlmnKjEfw8dpbZhik9Sms2N9+ZaK9G3H0LR+eNqxkuzw8+iT
|
|
||||||
ETYxU9VRXJp640RJX+Ek22joiHzozFWf/TvB6yxSLcr5G9NTLeztI4QFx7hNZf/G
|
|
||||||
NDdzAmJBCxvZkANAWAhR2NBS7iaxqFNN2/ClowIDAQABAoIBAQC1/STX6eFBWJMs
|
|
||||||
MhUHdePNMU5bWmqK1qOo9jgZV33l7T06Alit3M8f8JoA2LwEYT/jHtS3upi+cXP+
|
|
||||||
vWIs6tAaqdoDEmff6FxSd1EXEYHwo3yf+ASQJ6z66nwC5KrhW6L6Uo6bxm4F5Hfw
|
|
||||||
jU0fyXeeFVCn7Nxw0SlxmA02Z70VFsL8BK9i3kajU18y6drf4VUm55oMEtdEmOh2
|
|
||||||
eKn4qspBcNblbw+L0QJ+5kN1iRUyJHesQ1GpS+L3yeMVFCW7ctL4Bgw8Z7LE+z7i
|
|
||||||
C0Weyhul8vuT+7nfF2T37zsSa8iixqpkTokeYh96CZ5nDqa2IDx3oNHWSlkIsV6g
|
|
||||||
6EUEl9gBAoGBAPIw/M6fIDetMj8f1wG7mIRgJsxI817IS6aBSwB5HkoCJFfrR9Ua
|
|
||||||
jMNCFIWNs/Om8xeGhq/91hbnCYDNK06V5CUa/uk4CYRs2eQZ3FKoNowtp6u/ieuU
|
|
||||||
qg8bXM/vR2VWtWVixAMdouT3+KtvlgaVmSnrPiwO4pecGrwu5NW1oJCFAoGBANNb
|
|
||||||
aE3AcwTDYsqh0N/75G56Q5s1GZ6MCDQGQSh8IkxL6Vg59KnJiIKQ7AxNKFgJZMtY
|
|
||||||
zZHaqjazeHjOGTiYiC7MMVJtCcOBEfjCouIG8btNYv7Y3dWnOXRZni2telAsRrH9
|
|
||||||
xS5LaFdCRTjVAwSsppMGwiQtyl6sGLMyz0SXoYoHAoGAKdkFFb6xFm26zOV3hTkg
|
|
||||||
9V6X1ZyVUL9TMwYMK5zB+w+7r+VbmBrqT6LPYPRHL8adImeARlCZ+YMaRUMuRHnp
|
|
||||||
3e94NFwWaOdWDu/Y/f9KzZXl7us9rZMWf12+/77cm0oMNeSG8fLg/qdKNHUneyPG
|
|
||||||
P1QCfiJkTMYQaIvBxpuHjvECgYAKlZ9JlYOtD2PZJfVh4il0ZucP1L7ts7GNeWq1
|
|
||||||
7lGBZKPQ6UYZYqBVeZB4pTyJ/B5yGIZi8YJoruAvnJKixPC89zjZGeDNS59sx8KE
|
|
||||||
cziT2rJEdPPXCULVUs+bFf70GOOJcl33jYsyI3139SLrjwHghwwd57UkvJWYE8lR
|
|
||||||
dA6A7QKBgEfTC+NlzqLPhbB+HPl6CvcUczcXcI9M0heVz/DNMA+4pjxPnv2aeIwh
|
|
||||||
cL2wq2xr+g1wDBWGVGkVSuZhXm5E6gDetdyVeJnbIUhVjBblnbhHV6GrudjbXGnJ
|
|
||||||
W9cBgu6DswyHU2cOsqmimu8zLmG6/dQYFHt+kUWGxN8opCzVjgWa
|
|
||||||
-----END RSA PRIVATE KEY-----
|
|
Loading…
Reference in New Issue