From 479b971b0cce3b3bfbff06c0fac02398fb913237 Mon Sep 17 00:00:00 2001 From: pk5ls20 Date: Mon, 4 Nov 2024 23:52:52 +0800 Subject: [PATCH 01/15] refactor: automatically select the optimal packet backend --- src/core/apis/packet.ts | 17 +- src/core/packet/client.ts | 183 ------------------ .../packet/{native.ts => client/client.ts} | 101 ++++------ src/core/packet/client/nativeClient.ts | 67 +++++++ src/core/packet/client/wsClient.ts | 113 +++++++++++ src/core/packet/highway/session.ts | 2 +- src/core/packet/packer.ts | 2 +- src/core/packet/session.ts | 39 +++- 8 files changed, 265 insertions(+), 259 deletions(-) delete mode 100644 src/core/packet/client.ts rename src/core/packet/{native.ts => client/client.ts} (54%) create mode 100644 src/core/packet/client/nativeClient.ts create mode 100644 src/core/packet/client/wsClient.ts diff --git a/src/core/apis/packet.ts b/src/core/apis/packet.ts index f112da87..3d743ad4 100644 --- a/src/core/apis/packet.ts +++ b/src/core/apis/packet.ts @@ -2,7 +2,6 @@ import * as crypto from 'crypto'; import * as os from 'os'; import { ChatType, InstanceContext, NapCatCore } from '..'; import offset from '@/core/external/offset.json'; -import { PacketClient, RecvPacketData } from '@/core/packet/client'; import { PacketSession } from "@/core/packet/session"; import { OidbPacket, PacketHexStr } from "@/core/packet/packer"; import { NapProtoEncodeStructType, NapProtoDecodeStructType, NapProtoMsg } from '@/core/packet/proto/NapProto'; @@ -25,6 +24,7 @@ import { AIVoiceChatType, AIVoiceItemList } from "@/core/packet/entities/aiChat" import { OidbSvcTrpcTcp0X929B_0Resp, OidbSvcTrpcTcp0X929D_0Resp } from "@/core/packet/proto/oidb/Oidb.0x929"; import { IndexNode, MsgInfo } from "@/core/packet/proto/oidb/common/Ntv2.RichMediaReq"; import { NTV2RichMediaResp } from "@/core/packet/proto/oidb/common/Ntv2.RichMediaResp"; +import { RecvPacketData } from "@/core/packet/client/client"; interface OffsetType { @@ -40,7 +40,6 @@ export class NTQQPacketApi { context: InstanceContext; core: NapCatCore; logger: LogWrapper; - serverUrl: string | undefined; qqVersion: string | undefined; packetSession: PacketSession | undefined; @@ -50,9 +49,8 @@ export class NTQQPacketApi { this.logger = core.context.logger; this.packetSession = undefined; const config = this.core.configLoader.configData; - if (config && config.packetServer && config.packetServer.length > 0) { - const serverUrl = this.core.configLoader.configData.packetServer ?? '127.0.0.1:8086'; - this.InitSendPacket(serverUrl, this.context.basicInfoWrapper.getFullQQVesion()) + if (config) { + this.InitSendPacket(this.context.basicInfoWrapper.getFullQQVesion()) .then() .catch(this.core.context.logger.logError.bind(this.core.context.logger)); } else { @@ -64,17 +62,14 @@ export class NTQQPacketApi { return this.packetSession?.client.available ?? false; } - async InitSendPacket(serverUrl: string, qqversion: string) { - this.serverUrl = serverUrl; + async InitSendPacket(qqversion: string) { this.qqVersion = qqversion; - const offsetTable: OffsetType = offset; - const table = offsetTable[qqversion + '-' + os.arch()]; + const table = typedOffset[qqversion + '-' + os.arch()]; if (!table) { this.logger.logError('PacketServer Offset table not found for QQVersion: ', qqversion + '-' + os.arch()); return false; } - const url = 'ws://' + this.serverUrl + '/ws'; - this.packetSession = new PacketSession(this.core.context.logger, new PacketClient(url, this.core)); + this.packetSession = new PacketSession(this.core); const cb = () => { if (this.packetSession && this.packetSession.client) { this.packetSession.client.init(process.pid, table.recv, table.send).then().catch(this.logger.logError.bind(this.logger)); diff --git a/src/core/packet/client.ts b/src/core/packet/client.ts deleted file mode 100644 index 49400798..00000000 --- a/src/core/packet/client.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { LogWrapper } from "@/common/log"; -import { LRUCache } from "@/common/lru-cache"; -import WebSocket, { Data } from "ws"; -import crypto, { createHash } from "crypto"; -import { NapCatCore } from "@/core"; -import { OidbPacket, PacketHexStr } from "@/core/packet/packer"; - -export interface RecvPacket { - type: string, // 仅recv - trace_id_md5?: string, - data: RecvPacketData -} - -export interface RecvPacketData { - seq: number - cmd: string - hex_data: string -} - -export class PacketClient { - private websocket: WebSocket | undefined; - private isConnected: boolean = false; - private reconnectAttempts: number = 0; - private readonly maxReconnectAttempts: number = 60;//现在暂时不可配置 - private readonly cb = new LRUCache Promise>(500); // trace_id-type callback - private readonly clientUrl: string = ''; - readonly napCatCore: NapCatCore; - private readonly logger: LogWrapper; - - constructor(url: string, core: NapCatCore) { - this.clientUrl = url; - this.napCatCore = core; - this.logger = core.context.logger; - } - - get available(): boolean { - return this.isConnected && this.websocket !== undefined; - } - - private randText(len: number) { - let text = ''; - const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - for (let i = 0; i < len; i++) { - text += possible.charAt(Math.floor(Math.random() * possible.length)); - } - return text; - } - - connect(cb: any): Promise { - return new Promise((resolve, reject) => { - //this.logger.log.bind(this.logger)(`[Core] [Packet Server] Attempting to connect to ${this.clientUrl}`); - this.websocket = new WebSocket(this.clientUrl); - this.websocket.on('error', (err) => { }/*this.logger.logError.bind(this.logger)('[Core] [Packet Server] Error:', err.message)*/); - - this.websocket.onopen = () => { - this.isConnected = true; - this.reconnectAttempts = 0; - this.logger.log.bind(this.logger)(`[Core] [Packet Server] 已连接到 ${this.clientUrl}`); - cb(); - resolve(); - }; - - this.websocket.onerror = (error) => { - //this.logger.logError.bind(this.logger)(`WebSocket error: ${error}`); - reject(new Error(`${error.message}`)); - }; - - this.websocket.onmessage = (event) => { - // const message = JSON.parse(event.data.toString()); - // console.log("Received message:", message); - this.handleMessage(event.data).then().catch(); - }; - - this.websocket.onclose = () => { - this.isConnected = false; - //this.logger.logWarn.bind(this.logger)(`[Core] [Packet Server] Disconnected from ${this.clientUrl}`); - this.attemptReconnect(cb); - }; - }); - } - - private attemptReconnect(cb: any): void { - try { - if (this.reconnectAttempts < this.maxReconnectAttempts) { - this.reconnectAttempts++; - setTimeout(() => { - this.connect(cb).catch((error) => { - this.logger.logError.bind(this.logger)(`[Core] [Packet Server] 尝试重连失败:${error.message}`); - }); - }, 5000 * this.reconnectAttempts); - } else { - this.logger.logError.bind(this.logger)(`[Core] [Packet Server] ${this.clientUrl} 已达到最大重连次数!`); - } - } catch (error: any) { - this.logger.logError.bind(this.logger)(`[Core] [Packet Server] 重连时出错: ${error.message}`); - } - } - - private async registerCallback(trace_id: string, type: string, callback: (json: RecvPacketData) => Promise): Promise { - this.cb.put(createHash('md5').update(trace_id).digest('hex') + type, callback); - } - - async init(pid: number, recv: string, send: string): Promise { - if (!this.isConnected || !this.websocket) { - throw new Error("WebSocket is not connected"); - } - const initMessage = { - action: 'init', - pid: pid, - recv: recv, - send: send - }; - this.websocket.send(JSON.stringify(initMessage)); - } - - private async sendCommand(cmd: string, data: string, trace_id: string, rsp: boolean = false, timeout: number = 20000, sendcb: (json: RecvPacketData) => void = () => { - }): Promise { - return new Promise((resolve, reject) => { - if (!this.isConnected || !this.websocket) { - throw new Error("WebSocket is not connected"); - } - const commandMessage = { - action: 'send', - cmd: cmd, - data: data, - trace_id: trace_id - }; - this.websocket.send(JSON.stringify(commandMessage)); - if (rsp) { - this.registerCallback(trace_id, 'recv', async (json: RecvPacketData) => { - clearTimeout(timeoutHandle); - resolve(json); - }); - } - this.registerCallback(trace_id, 'send', async (json: RecvPacketData) => { - sendcb(json); - if (!rsp) { - clearTimeout(timeoutHandle); - resolve(json); - } - }); - const timeoutHandle = setTimeout(() => { - reject(new Error(`sendCommand timed out after ${timeout} ms for ${cmd} with trace_id ${trace_id}`)); - }, timeout); - }); - } - - private async handleMessage(message: Data): Promise { - try { - const json: RecvPacket = JSON.parse(message.toString()); - const trace_id_md5 = json.trace_id_md5; - const action = json?.type ?? 'init'; - const event = this.cb.get(trace_id_md5 + action); - if (event) { - await event(json.data); - } - //console.log("Received message:", json); - } catch (error) { - this.logger.logError.bind(this.logger)(`Error parsing message: ${error}`); - } - } - - async sendPacket(cmd: string, data: PacketHexStr, rsp = false): Promise { - // wtfk tx - // 校验失败和异常 可能返回undefined - return new Promise((resolve, reject) => { - if (!this.available) { - this.logger.logError('NapCat.Packet 未初始化!'); - return undefined; - } - const md5 = crypto.createHash('md5').update(data).digest('hex'); - const trace_id = (this.randText(4) + md5 + data).slice(0, data.length / 2); - this.sendCommand(cmd, data, trace_id, rsp, 20000, async () => { - // await sleep(10); - await this.napCatCore.context.session.getMsgService().sendSsoCmdReqByContend(cmd, trace_id); - }).then((res) => resolve(res)).catch((e: Error) => reject(e)); - }); - } - - async sendOidbPacket(pkt: OidbPacket, rsp = false): Promise { - return this.sendPacket(pkt.cmd, pkt.data, rsp); - } -} diff --git a/src/core/packet/native.ts b/src/core/packet/client/client.ts similarity index 54% rename from src/core/packet/native.ts rename to src/core/packet/client/client.ts index d5e16cb2..fae30594 100644 --- a/src/core/packet/native.ts +++ b/src/core/packet/client/client.ts @@ -1,35 +1,37 @@ -import { LogWrapper } from "@/common/log"; import { LRUCache } from "@/common/lru-cache"; -import crypto, { createHash } from "crypto"; import { NapCatCore } from "@/core"; +import { LogWrapper } from "@/common/log"; +import crypto, { createHash } from "crypto"; import { OidbPacket, PacketHexStr } from "@/core/packet/packer"; -import path, { dirname } from "path"; -import { fileURLToPath } from "url"; -import fs from "fs"; -import { constants } from "os"; -import { console } from "inspector"; +import { NapCatConfig } from "@/core/helper/config"; -export interface RecvPacketData { - seq: number; - cmd: string; - hex_data: string; +export interface RecvPacket { + type: string, // 仅recv + trace_id_md5?: string, + data: RecvPacketData } -export class NativePacketClient { - private isInit: boolean = false; - private readonly cb = new LRUCache Promise>(500); // trace_id-type callback - readonly napCatCore: NapCatCore; - private readonly logger: LogWrapper; - private supportedPlatforms = ['win32.x64']; - private MoeHooExport: any = { exports: {} }; +export interface RecvPacketData { + seq: number + cmd: string + hex_data: string +} - constructor(core: NapCatCore) { +export abstract class PacketClient { + readonly napCatCore: NapCatCore; + protected readonly logger: LogWrapper; + protected readonly cb = new LRUCache Promise>(500); // trace_id-type callback + protected isAvailable: boolean = false; + protected config: NapCatConfig; + + protected constructor(core: NapCatCore) { this.napCatCore = core; this.logger = core.context.logger; + this.config = core.configLoader.configData; } get available(): boolean { - return this.isInit; + return this.isAvailable; } private randText(len: number): string { @@ -41,55 +43,37 @@ export class NativePacketClient { return text; } + static create(core: NapCatCore): PacketClient { + throw new Error("Must be implemented by subclasses"); + } + + static compatibilityScore(logger: LogWrapper): number { + throw new Error("Must be implemented by subclasses"); + } + + abstract init(pid: number, recv: string, send: string): Promise; + + abstract connect(cb: () => void): Promise; + + abstract sendCommandImpl(cmd: string, data: string, trace_id: string): void; + private async registerCallback(trace_id: string, type: string, callback: (json: RecvPacketData) => Promise): Promise { this.cb.put(createHash('md5').update(trace_id).digest('hex') + type, callback); } - async init(pid: number, recv: string, send: string): Promise { - const platform = process.platform + '.' + process.arch; - if (!this.supportedPlatforms.includes(platform)) { - throw new Error(`Unsupported platform: ${platform}`); - } - - const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './moehoo/moehoo.' + platform + '.node'); - if (!fs.existsSync(moehoo_path)) { - throw new Error(`moehoo.${platform}.node not found`); - } - - process.dlopen(this.MoeHooExport, moehoo_path, constants.dlopen.RTLD_LAZY); - this.MoeHooExport.exports.InitHook(pid, recv, send, (type: number, uin: string, seq: number, cmd: string, hex_data: string) => { - const callback = this.cb.get(createHash('md5').update(Buffer.from(hex_data, 'hex')).digest('hex') + (type === 0 ? 'send' : 'recv')); - if (callback) { - callback({ seq, cmd, hex_data }); - } else { - this.logger.logError(`Callback not found for hex_data: ${hex_data}`); - } - console.log('type:', type, 'uin:', uin, 'seq:', seq, 'cmd:', cmd, 'hex_data:', hex_data); - }); - } - - private async sendCommand( - cmd: string, - data: string, - trace_id: string, - rsp: boolean = false, - timeout: number = 20000, - sendcb: (json: RecvPacketData) => void = () => { } - ): Promise { + private async sendCommand(cmd: string, data: string, trace_id: string, rsp: boolean = false, timeout: number = 20000, sendcb: (json: RecvPacketData) => void = () => { + }): Promise { return new Promise((resolve, reject) => { - if (!this.available) { - throw new Error("MoeHoo is not Init"); + if (!this.isAvailable) { + throw new Error("WebSocket is not connected"); } - - this.MoeHooExport.exports.SendPacket(cmd, data, crypto.createHash('md5').update(trace_id).digest('hex')); - + this.sendCommandImpl(cmd, data, trace_id); if (rsp) { this.registerCallback(trace_id, 'recv', async (json: RecvPacketData) => { clearTimeout(timeoutHandle); resolve(json); }); } - this.registerCallback(trace_id, 'send', async (json: RecvPacketData) => { sendcb(json); if (!rsp) { @@ -97,7 +81,6 @@ export class NativePacketClient { resolve(json); } }); - const timeoutHandle = setTimeout(() => { reject(new Error(`sendCommand timed out after ${timeout} ms for ${cmd} with trace_id ${trace_id}`)); }, timeout); @@ -123,4 +106,4 @@ export class NativePacketClient { async sendOidbPacket(pkt: OidbPacket, rsp = false): Promise { return this.sendPacket(pkt.cmd, pkt.data, rsp); } -} \ No newline at end of file +} diff --git a/src/core/packet/client/nativeClient.ts b/src/core/packet/client/nativeClient.ts new file mode 100644 index 00000000..0ee13e0c --- /dev/null +++ b/src/core/packet/client/nativeClient.ts @@ -0,0 +1,67 @@ +import crypto, { createHash } from "crypto"; +import { NapCatCore } from "@/core"; +import path, { dirname } from "path"; +import { fileURLToPath } from "url"; +import fs from "fs"; +import { console } from "inspector"; +import { PacketClient } from "@/core/packet/client/client"; +import { constants, platform, type } from "node:os"; +import { LogWrapper } from "@/common/log"; + +export class NativePacketClient extends PacketClient { + static supportedPlatforms = ['win32.x64']; + private MoeHooExport: any = { exports: {} }; + + protected constructor(core: NapCatCore) { + super(core); + } + + get available(): boolean { + return this.isAvailable; + } + + static compatibilityScore(logger: LogWrapper): number { + const platform = process.platform + '.' + process.arch; + if (!this.supportedPlatforms.includes(platform)) { + logger.logError(`[NativePacketClient] Unsupported platform: ${platform}`); + return 0; + } + const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './moehoo/moehoo.' + platform + '.node'); + if (!fs.existsSync(moehoo_path)) { + logger.logError(`[NativePacketClient] Missing moehoo binary: ${moehoo_path}`); + return 0; + } + return 10; + } + + static create(core: NapCatCore): NativePacketClient { + return new NativePacketClient(core); + } + + async init(pid: number, recv: string, send: string): Promise { + const platform = process.platform + '.' + process.arch; + const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './moehoo/moehoo.' + platform + '.node'); + process.dlopen(this.MoeHooExport, moehoo_path, constants.dlopen.RTLD_LAZY); + this.MoeHooExport.exports.InitHook(pid, recv, send, (type: number, uin: string, seq: number, cmd: string, hex_data: string) => { + const callback = this.cb.get(createHash('md5').update(Buffer.from(hex_data, 'hex')).digest('hex') + (type === 0 ? 'send' : 'recv')); + if (callback) { + callback({ seq, cmd, hex_data }); + } else { + this.logger.logError(`Callback not found for hex_data: ${hex_data}`); + } + // TODO: cannot use console.log here, fxxk tx + // Error [ERR_INSPECTOR_NOT_AVAILABLE]: Inspector is not available + // console.log('type:', type, 'uin:', uin, 'seq:', seq, 'cmd:', cmd, 'hex_data:', hex_data); + }); + this.isAvailable = true; + } + + sendCommandImpl(cmd: string, data: string, trace_id: string): void { + this.MoeHooExport.exports.SendPacket(cmd, data, crypto.createHash('md5').update(trace_id).digest('hex')); + } + + connect(cb: () => void): Promise { + cb(); + return Promise.resolve(); + } +} diff --git a/src/core/packet/client/wsClient.ts b/src/core/packet/client/wsClient.ts new file mode 100644 index 00000000..bf34e0e0 --- /dev/null +++ b/src/core/packet/client/wsClient.ts @@ -0,0 +1,113 @@ +import { Data, WebSocket } from "ws"; +import { NapCatCore } from "@/core"; +import { PacketClient, RecvPacket } from "@/core/packet/client/client"; +import { LogWrapper } from "@/common/log"; + +export class wsPacketClient extends PacketClient { + private websocket: WebSocket | undefined; + private reconnectAttempts: number = 0; + private readonly maxReconnectAttempts: number = 60; // 现在暂时不可配置 + private readonly clientUrl: string = ''; + private clientUrlWrap: (url: string) => string = (url: string) => `ws://${url}/ws`; + + protected constructor(core: NapCatCore) { + super(core); + this.clientUrl = this.clientUrlWrap(this.config.packetServer ?? '127.0.0.1:8086'); + } + + static compatibilityScore(logger: LogWrapper): number { + return 10; + } + + static create(core: NapCatCore): wsPacketClient { + return new wsPacketClient(core); + } + + connect(cb: () => void): Promise { + return new Promise((resolve, reject) => { + //this.logger.log.bind(this.logger)(`[Core] [Packet Server] Attempting to connect to ${this.clientUrl}`); + this.websocket = new WebSocket(this.clientUrl); + this.websocket.on('error', (err) => { }/*this.logger.logError.bind(this.logger)('[Core] [Packet Server] Error:', err.message)*/); + + this.websocket.onopen = () => { + this.isAvailable = true; + this.reconnectAttempts = 0; + this.logger.log.bind(this.logger)(`[Core] [Packet Server] 已连接到 ${this.clientUrl}`); + cb(); + resolve(); + }; + + this.websocket.onerror = (error) => { + //this.logger.logError.bind(this.logger)(`WebSocket error: ${error}`); + reject(new Error(`${error.message}`)); + }; + + this.websocket.onmessage = (event) => { + // const message = JSON.parse(event.data.toString()); + // console.log("Received message:", message); + this.handleMessage(event.data).then().catch(); + }; + + this.websocket.onclose = () => { + this.isAvailable = false; + //this.logger.logWarn.bind(this.logger)(`[Core] [Packet Server] Disconnected from ${this.clientUrl}`); + this.attemptReconnect(cb); + }; + }); + } + + private attemptReconnect(cb: any): void { + try { + if (this.reconnectAttempts < this.maxReconnectAttempts) { + this.reconnectAttempts++; + setTimeout(() => { + this.connect(cb).catch((error) => { + this.logger.logError.bind(this.logger)(`[Core] [Packet Server] 尝试重连失败:${error.message}`); + }); + }, 5000 * this.reconnectAttempts); + } else { + this.logger.logError.bind(this.logger)(`[Core] [Packet Server] ${this.clientUrl} 已达到最大重连次数!`); + } + } catch (error: any) { + this.logger.logError.bind(this.logger)(`[Core] [Packet Server] 重连时出错: ${error.message}`); + } + } + + async init(pid: number, recv: string, send: string): Promise { + if (!this.isAvailable || !this.websocket) { + throw new Error("WebSocket is not connected"); + } + const initMessage = { + action: 'init', + pid: pid, + recv: recv, + send: send + }; + this.websocket.send(JSON.stringify(initMessage)); + } + + sendCommandImpl(cmd: string, data: string, trace_id: string) : void { + const commandMessage = { + action: 'send', + cmd: cmd, + data: data, + trace_id: trace_id + }; + this.websocket!.send(JSON.stringify(commandMessage)); + } + + private async handleMessage(message: Data): Promise { + try { + const json: RecvPacket = JSON.parse(message.toString()); + const trace_id_md5 = json.trace_id_md5; + const action = json?.type ?? 'init'; + const event = this.cb.get(trace_id_md5 + action); + if (event) { + await event(json.data); + } + //console.log("Received message:", json); + } catch (error) { + this.logger.logError.bind(this.logger)(`Error parsing message: ${error}`); + } + } +} diff --git a/src/core/packet/highway/session.ts b/src/core/packet/highway/session.ts index 997c5aa9..bb870164 100644 --- a/src/core/packet/highway/session.ts +++ b/src/core/packet/highway/session.ts @@ -1,7 +1,6 @@ import * as fs from "node:fs"; import { ChatType, Peer } from "@/core"; import { LogWrapper } from "@/common/log"; -import { PacketClient } from "@/core/packet/client"; import { PacketPacker } from "@/core/packet/packer"; import { NapProtoMsg } from "@/core/packet/proto/NapProto"; import { HttpConn0x6ff_501Response } from "@/core/packet/proto/action/action"; @@ -19,6 +18,7 @@ import { int32ip2str, oidbIpv4s2HighwayIpv4s } from "@/core/packet/highway/utils import { calculateSha1, calculateSha1StreamBytes, computeMd5AndLengthWithLimit } from "@/core/packet/utils/crypto/hash"; import { OidbSvcTrpcTcp0x6D6Response } from "@/core/packet/proto/oidb/Oidb.0x6D6"; import { OidbSvcTrpcTcp0XE37_800Response, OidbSvcTrpcTcp0XE37Response } from "@/core/packet/proto/oidb/Oidb.0XE37_800"; +import { PacketClient } from "@/core/packet/client/client"; export const BlockSize = 1024 * 1024; diff --git a/src/core/packet/packer.ts b/src/core/packet/packer.ts index 848742a4..4e738306 100644 --- a/src/core/packet/packer.ts +++ b/src/core/packet/packer.ts @@ -22,7 +22,6 @@ import { PacketMsg } from "@/core/packet/message/message"; import { OidbSvcTrpcTcp0x6D6 } from "@/core/packet/proto/oidb/Oidb.0x6D6"; import { OidbSvcTrpcTcp0XE37_1200 } from "@/core/packet/proto/oidb/Oidb.0xE37_1200"; import { PacketMsgConverter } from "@/core/packet/message/converter"; -import { PacketClient } from "@/core/packet/client"; import { OidbSvcTrpcTcp0XE37_1700 } from "@/core/packet/proto/oidb/Oidb.0xE37_1700"; import { OidbSvcTrpcTcp0XE37_800 } from "@/core/packet/proto/oidb/Oidb.0XE37_800"; import { OidbSvcTrpcTcp0XEB7 } from "./proto/oidb/Oidb.0xEB7"; @@ -30,6 +29,7 @@ import { MiniAppReqParams } from "@/core/packet/entities/miniApp"; import { MiniAppAdaptShareInfoReq } from "@/core/packet/proto/action/miniAppAdaptShareInfo"; import { AIVoiceChatType } from "@/core/packet/entities/aiChat"; import { OidbSvcTrpcTcp0X929B_0, OidbSvcTrpcTcp0X929D_0 } from "@/core/packet/proto/oidb/Oidb.0x929"; +import { PacketClient } from "@/core/packet/client/client"; export type PacketHexStr = string & { readonly hexNya: unique symbol }; diff --git a/src/core/packet/session.ts b/src/core/packet/session.ts index 7e636281..208997dc 100644 --- a/src/core/packet/session.ts +++ b/src/core/packet/session.ts @@ -1,7 +1,19 @@ -import { PacketClient } from "@/core/packet/client"; import { PacketHighwaySession } from "@/core/packet/highway/session"; import { LogWrapper } from "@/common/log"; import { PacketPacker } from "@/core/packet/packer"; +import { PacketClient } from "@/core/packet/client/client"; +import { NativePacketClient } from "@/core/packet/client/nativeClient"; +import { wsPacketClient } from "@/core/packet/client/wsClient"; +import { NapCatCore } from "@/core"; + +type clientPriority = { + [key: number]: typeof PacketClient; +} + +const clientPriority: clientPriority = { + 10: NativePacketClient, + 1: wsPacketClient, +}; export class PacketSession { readonly logger: LogWrapper; @@ -9,10 +21,29 @@ export class PacketSession { readonly packer: PacketPacker; readonly highwaySession: PacketHighwaySession; - constructor(logger: LogWrapper, client: PacketClient) { - this.logger = logger; - this.client = client; + constructor(core: NapCatCore) { + this.logger = core.context.logger; + this.client = this.judgeClient(core); this.packer = new PacketPacker(this.logger, this.client); this.highwaySession = new PacketHighwaySession(this.logger, this.client, this.packer); } + + private judgeClient(core: NapCatCore): PacketClient { + let selectedClient: typeof PacketClient | null = null; + let maxScore = -1; + for (const key in clientPriority) { + const priority = parseInt(key); + const ClientClass = clientPriority[priority]; + const score = priority * ClientClass.compatibilityScore(core.context.logger); + if (score > maxScore) { + maxScore = score; + selectedClient = ClientClass; + } + } + if (!selectedClient) { + throw new Error("No compatible PacketClient found"); + } + this.logger.log(`[Packet] 自动选择了: ${selectedClient.name}`); + return selectedClient.create(core); + } } From f7c1951191838a155deb414f750a91ebf8387905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Tue, 5 Nov 2024 10:07:56 +0800 Subject: [PATCH 02/15] =?UTF-8?q?fix:=20=E4=B8=80=E4=BA=9B=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/packet/client/client.ts | 2 +- src/core/packet/client/nativeClient.ts | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/core/packet/client/client.ts b/src/core/packet/client/client.ts index fae30594..f348bfdb 100644 --- a/src/core/packet/client/client.ts +++ b/src/core/packet/client/client.ts @@ -65,7 +65,7 @@ export abstract class PacketClient { }): Promise { return new Promise((resolve, reject) => { if (!this.isAvailable) { - throw new Error("WebSocket is not connected"); + throw new Error("Packet Service is not available"); } this.sendCommandImpl(cmd, data, trace_id); if (rsp) { diff --git a/src/core/packet/client/nativeClient.ts b/src/core/packet/client/nativeClient.ts index 0ee13e0c..173ec597 100644 --- a/src/core/packet/client/nativeClient.ts +++ b/src/core/packet/client/nativeClient.ts @@ -3,14 +3,17 @@ import { NapCatCore } from "@/core"; import path, { dirname } from "path"; import { fileURLToPath } from "url"; import fs from "fs"; -import { console } from "inspector"; import { PacketClient } from "@/core/packet/client/client"; -import { constants, platform, type } from "node:os"; +import { constants } from "node:os"; import { LogWrapper } from "@/common/log"; +export interface NativePacketExportType { + InitHook: (recv: string, send: string, callback: (type: number, uin: string, seq: number, cmd: string, hex_data: string) => void) => boolean; + SendPacket: (cmd: string, data: string, trace_id: string) => void; +} export class NativePacketClient extends PacketClient { static supportedPlatforms = ['win32.x64']; - private MoeHooExport: any = { exports: {} }; + private MoeHooExport: { exports?: NativePacketExportType } = { exports: undefined }; protected constructor(core: NapCatCore) { super(core); @@ -42,22 +45,20 @@ export class NativePacketClient extends PacketClient { const platform = process.platform + '.' + process.arch; const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './moehoo/moehoo.' + platform + '.node'); process.dlopen(this.MoeHooExport, moehoo_path, constants.dlopen.RTLD_LAZY); - this.MoeHooExport.exports.InitHook(pid, recv, send, (type: number, uin: string, seq: number, cmd: string, hex_data: string) => { + this.MoeHooExport.exports?.InitHook(recv, send, (type: number, uin: string, seq: number, cmd: string, hex_data: string) => { const callback = this.cb.get(createHash('md5').update(Buffer.from(hex_data, 'hex')).digest('hex') + (type === 0 ? 'send' : 'recv')); if (callback) { callback({ seq, cmd, hex_data }); } else { this.logger.logError(`Callback not found for hex_data: ${hex_data}`); } - // TODO: cannot use console.log here, fxxk tx - // Error [ERR_INSPECTOR_NOT_AVAILABLE]: Inspector is not available - // console.log('type:', type, 'uin:', uin, 'seq:', seq, 'cmd:', cmd, 'hex_data:', hex_data); + console.log('type:', type, 'uin:', uin, 'seq:', seq, 'cmd:', cmd, 'hex_data:', hex_data); }); this.isAvailable = true; } sendCommandImpl(cmd: string, data: string, trace_id: string): void { - this.MoeHooExport.exports.SendPacket(cmd, data, crypto.createHash('md5').update(trace_id).digest('hex')); + this.MoeHooExport.exports?.SendPacket(cmd, data, crypto.createHash('md5').update(trace_id).digest('hex')); } connect(cb: () => void): Promise { From 25e42720cf734b00bcfcfb9415269b7cb2bd1861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Tue, 5 Nov 2024 10:14:00 +0800 Subject: [PATCH 03/15] =?UTF-8?q?fix:=20=E5=BC=80=E5=A7=8B=E5=88=9D?= =?UTF-8?q?=E6=AD=A5=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/packet/client/nativeClient.ts | 4 ++-- src/native/packet/MoeHoo.win32.node | Bin 0 -> 134144 bytes vite.config.ts | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 src/native/packet/MoeHoo.win32.node diff --git a/src/core/packet/client/nativeClient.ts b/src/core/packet/client/nativeClient.ts index 173ec597..0401e0f3 100644 --- a/src/core/packet/client/nativeClient.ts +++ b/src/core/packet/client/nativeClient.ts @@ -29,7 +29,7 @@ export class NativePacketClient extends PacketClient { logger.logError(`[NativePacketClient] Unsupported platform: ${platform}`); return 0; } - const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './moehoo/moehoo.' + platform + '.node'); + const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './moehoo/MoeHoo.' + platform + '.node'); if (!fs.existsSync(moehoo_path)) { logger.logError(`[NativePacketClient] Missing moehoo binary: ${moehoo_path}`); return 0; @@ -43,7 +43,7 @@ export class NativePacketClient extends PacketClient { async init(pid: number, recv: string, send: string): Promise { const platform = process.platform + '.' + process.arch; - const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './moehoo/moehoo.' + platform + '.node'); + const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './moehoo/MoeHoo.' + platform + '.node'); process.dlopen(this.MoeHooExport, moehoo_path, constants.dlopen.RTLD_LAZY); this.MoeHooExport.exports?.InitHook(recv, send, (type: number, uin: string, seq: number, cmd: string, hex_data: string) => { const callback = this.cb.get(createHash('md5').update(Buffer.from(hex_data, 'hex')).digest('hex') + (type === 0 ? 'send' : 'recv')); diff --git a/src/native/packet/MoeHoo.win32.node b/src/native/packet/MoeHoo.win32.node new file mode 100644 index 0000000000000000000000000000000000000000..2beecff7544135e59d6d60853359ef26c22c443b GIT binary patch literal 134144 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 literal 0 HcmV?d00001 diff --git a/vite.config.ts b/vite.config.ts index d52133c2..b74c214c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -26,6 +26,7 @@ const FrameworkBaseConfigPlugin: PluginOption[] = [ targets: [ { src: './manifest.json', dest: 'dist' }, { src: './src/core/external/napcat.json', dest: 'dist/config/' }, + { src: './src/native/packet', dest: 'dist/moehoo', flatten: false }, { src: './static/', dest: 'dist/static/', flatten: false }, { src: './src/onebot/config/onebot11.json', dest: 'dist/config/' }, { src: './src/framework/liteloader.cjs', dest: 'dist' }, @@ -42,6 +43,7 @@ const ShellBaseConfigPlugin: PluginOption[] = [ cp({ targets: [ { src: './src/native/external', dest: 'dist/native', flatten: false }, + { src: './src/native/packet', dest: 'dist/moehoo', flatten: false }, { src: './static/', dest: 'dist/static/', flatten: false }, { src: './src/core/external/napcat.json', dest: 'dist/config/' }, { src: './src/onebot/config/onebot11.json', dest: 'dist/config/' }, From 34d0669ca8c3c8e63560c6a50435253b7870eaa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Tue, 5 Nov 2024 10:16:06 +0800 Subject: [PATCH 04/15] fix --- .../{MoeHoo.win32.node => MoeHoo.win32.x64.node} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename src/native/packet/{MoeHoo.win32.node => MoeHoo.win32.x64.node} (100%) diff --git a/src/native/packet/MoeHoo.win32.node b/src/native/packet/MoeHoo.win32.x64.node similarity index 100% rename from src/native/packet/MoeHoo.win32.node rename to src/native/packet/MoeHoo.win32.x64.node From b9297e3f1d3503d7da38257772d8410b270a38e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Tue, 5 Nov 2024 10:18:11 +0800 Subject: [PATCH 05/15] fix --- src/core/packet/client/nativeClient.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/core/packet/client/nativeClient.ts b/src/core/packet/client/nativeClient.ts index 0401e0f3..f91aaf48 100644 --- a/src/core/packet/client/nativeClient.ts +++ b/src/core/packet/client/nativeClient.ts @@ -8,12 +8,12 @@ import { constants } from "node:os"; import { LogWrapper } from "@/common/log"; export interface NativePacketExportType { - InitHook: (recv: string, send: string, callback: (type: number, uin: string, seq: number, cmd: string, hex_data: string) => void) => boolean; - SendPacket: (cmd: string, data: string, trace_id: string) => void; + InitHook?: (recv: string, send: string, callback: (type: number, uin: string, seq: number, cmd: string, hex_data: string) => void) => boolean; + SendPacket?: (cmd: string, data: string, trace_id: string) => void; } export class NativePacketClient extends PacketClient { static supportedPlatforms = ['win32.x64']; - private MoeHooExport: { exports?: NativePacketExportType } = { exports: undefined }; + private MoeHooExport: { exports: NativePacketExportType } = { exports: {} }; protected constructor(core: NapCatCore) { super(core); @@ -45,7 +45,7 @@ export class NativePacketClient extends PacketClient { const platform = process.platform + '.' + process.arch; const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './moehoo/MoeHoo.' + platform + '.node'); process.dlopen(this.MoeHooExport, moehoo_path, constants.dlopen.RTLD_LAZY); - this.MoeHooExport.exports?.InitHook(recv, send, (type: number, uin: string, seq: number, cmd: string, hex_data: string) => { + this.MoeHooExport.exports.InitHook?.(recv, send, (type: number, uin: string, seq: number, cmd: string, hex_data: string) => { const callback = this.cb.get(createHash('md5').update(Buffer.from(hex_data, 'hex')).digest('hex') + (type === 0 ? 'send' : 'recv')); if (callback) { callback({ seq, cmd, hex_data }); @@ -58,7 +58,7 @@ export class NativePacketClient extends PacketClient { } sendCommandImpl(cmd: string, data: string, trace_id: string): void { - this.MoeHooExport.exports?.SendPacket(cmd, data, crypto.createHash('md5').update(trace_id).digest('hex')); + this.MoeHooExport.exports.SendPacket?.(cmd, data, crypto.createHash('md5').update(trace_id).digest('hex')); } connect(cb: () => void): Promise { From e1ac0f02b4b9a89c5c20931ef8a49093ea9ccf9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Tue, 5 Nov 2024 10:22:52 +0800 Subject: [PATCH 06/15] =?UTF-8?q?fix:=20=E6=90=9E=E7=82=B8=E4=BA=86=20?= =?UTF-8?q?=E8=AE=A9=E6=88=91=E6=80=9D=E8=80=83=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/packet/client/nativeClient.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/core/packet/client/nativeClient.ts b/src/core/packet/client/nativeClient.ts index f91aaf48..9399d133 100644 --- a/src/core/packet/client/nativeClient.ts +++ b/src/core/packet/client/nativeClient.ts @@ -45,15 +45,16 @@ export class NativePacketClient extends PacketClient { const platform = process.platform + '.' + process.arch; const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './moehoo/MoeHoo.' + platform + '.node'); process.dlopen(this.MoeHooExport, moehoo_path, constants.dlopen.RTLD_LAZY); - this.MoeHooExport.exports.InitHook?.(recv, send, (type: number, uin: string, seq: number, cmd: string, hex_data: string) => { - const callback = this.cb.get(createHash('md5').update(Buffer.from(hex_data, 'hex')).digest('hex') + (type === 0 ? 'send' : 'recv')); - if (callback) { - callback({ seq, cmd, hex_data }); - } else { - this.logger.logError(`Callback not found for hex_data: ${hex_data}`); - } - console.log('type:', type, 'uin:', uin, 'seq:', seq, 'cmd:', cmd, 'hex_data:', hex_data); - }); + console.log('MoeHooExport:', this.MoeHooExport); + // this.MoeHooExport.exports.InitHook?.(recv, send, (type: number, uin: string, seq: number, cmd: string, hex_data: string) => { + // const callback = this.cb.get(createHash('md5').update(Buffer.from(hex_data, 'hex')).digest('hex') + (type === 0 ? 'send' : 'recv')); + // if (callback) { + // callback({ seq, cmd, hex_data }); + // } else { + // this.logger.logError(`Callback not found for hex_data: ${hex_data}`); + // } + // console.log('type:', type, 'uin:', uin, 'seq:', seq, 'cmd:', cmd, 'hex_data:', hex_data); + // }); this.isAvailable = true; } From 000ef55273e764fd85fe880e7e3a387c12ace9c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Tue, 5 Nov 2024 10:25:41 +0800 Subject: [PATCH 07/15] =?UTF-8?q?fix:=20=E4=B8=80=E7=82=B9=E5=B0=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/packet/client/nativeClient.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/core/packet/client/nativeClient.ts b/src/core/packet/client/nativeClient.ts index 9399d133..7bfb43ab 100644 --- a/src/core/packet/client/nativeClient.ts +++ b/src/core/packet/client/nativeClient.ts @@ -46,15 +46,16 @@ export class NativePacketClient extends PacketClient { const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './moehoo/MoeHoo.' + platform + '.node'); process.dlopen(this.MoeHooExport, moehoo_path, constants.dlopen.RTLD_LAZY); console.log('MoeHooExport:', this.MoeHooExport); - // this.MoeHooExport.exports.InitHook?.(recv, send, (type: number, uin: string, seq: number, cmd: string, hex_data: string) => { - // const callback = this.cb.get(createHash('md5').update(Buffer.from(hex_data, 'hex')).digest('hex') + (type === 0 ? 'send' : 'recv')); - // if (callback) { - // callback({ seq, cmd, hex_data }); - // } else { - // this.logger.logError(`Callback not found for hex_data: ${hex_data}`); - // } - // console.log('type:', type, 'uin:', uin, 'seq:', seq, 'cmd:', cmd, 'hex_data:', hex_data); - // }); + console.log('recv:', recv, 'send:', ); + this.MoeHooExport.exports.InitHook?.(send, recv, (type: number, uin: string, seq: number, cmd: string, hex_data: string) => { + const callback = this.cb.get(createHash('md5').update(Buffer.from(hex_data, 'hex')).digest('hex') + (type === 0 ? 'send' : 'recv')); + if (callback) { + callback({ seq, cmd, hex_data }); + } else { + this.logger.logError(`Callback not found for hex_data: ${hex_data}`); + } + console.log('type:', type, 'uin:', uin, 'seq:', seq, 'cmd:', cmd, 'hex_data:', hex_data); + }); this.isAvailable = true; } From f9996a99870a03fd8c695fced764f803d82a8f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Tue, 5 Nov 2024 11:24:36 +0800 Subject: [PATCH 08/15] =?UTF-8?q?fix:=20=E6=97=A5=E5=BF=97=E4=B9=B1?= =?UTF-8?q?=E9=A3=9E=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/lru-cache.ts | 2 +- src/core/packet/client/client.ts | 4 ++- src/core/packet/client/nativeClient.ts | 41 ++++++++++++++++++-------- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/common/lru-cache.ts b/src/common/lru-cache.ts index 0e537b6a..39c879f0 100644 --- a/src/common/lru-cache.ts +++ b/src/common/lru-cache.ts @@ -1,6 +1,6 @@ export class LRUCache { private capacity: number; - private cache: Map; + public cache: Map; constructor(capacity: number) { this.capacity = capacity; diff --git a/src/core/packet/client/client.ts b/src/core/packet/client/client.ts index f348bfdb..88147054 100644 --- a/src/core/packet/client/client.ts +++ b/src/core/packet/client/client.ts @@ -59,6 +59,7 @@ export abstract class PacketClient { private async registerCallback(trace_id: string, type: string, callback: (json: RecvPacketData) => Promise): Promise { this.cb.put(createHash('md5').update(trace_id).digest('hex') + type, callback); + console.log(this.cb.cache); } private async sendCommand(cmd: string, data: string, trace_id: string, rsp: boolean = false, timeout: number = 20000, sendcb: (json: RecvPacketData) => void = () => { @@ -67,7 +68,6 @@ export abstract class PacketClient { if (!this.isAvailable) { throw new Error("Packet Service is not available"); } - this.sendCommandImpl(cmd, data, trace_id); if (rsp) { this.registerCallback(trace_id, 'recv', async (json: RecvPacketData) => { clearTimeout(timeoutHandle); @@ -81,6 +81,7 @@ export abstract class PacketClient { resolve(json); } }); + this.sendCommandImpl(cmd, data, trace_id); const timeoutHandle = setTimeout(() => { reject(new Error(`sendCommand timed out after ${timeout} ms for ${cmd} with trace_id ${trace_id}`)); }, timeout); @@ -98,6 +99,7 @@ export abstract class PacketClient { const trace_id = (this.randText(4) + md5 + data).slice(0, data.length / 2); this.sendCommand(cmd, data, trace_id, rsp, 20000, async () => { + console.log('sendPacket:', cmd, data, trace_id); await this.napCatCore.context.session.getMsgService().sendSsoCmdReqByContend(cmd, trace_id); }).then((res) => resolve(res)).catch((e: Error) => reject(e)); }); diff --git a/src/core/packet/client/nativeClient.ts b/src/core/packet/client/nativeClient.ts index 7bfb43ab..c409f443 100644 --- a/src/core/packet/client/nativeClient.ts +++ b/src/core/packet/client/nativeClient.ts @@ -6,15 +6,16 @@ import fs from "fs"; import { PacketClient } from "@/core/packet/client/client"; import { constants } from "node:os"; import { LogWrapper } from "@/common/log"; - +import { LRUCache } from "@/common/lru-cache"; +//0 send 1recv export interface NativePacketExportType { - InitHook?: (recv: string, send: string, callback: (type: number, uin: string, seq: number, cmd: string, hex_data: string) => void) => boolean; + InitHook?: (recv: string, send: string, callback: (type: number, uin: string, cmd: string, seq: number, hex_data: string) => void) => boolean; SendPacket?: (cmd: string, data: string, trace_id: string) => void; } export class NativePacketClient extends PacketClient { static supportedPlatforms = ['win32.x64']; private MoeHooExport: { exports: NativePacketExportType } = { exports: {} }; - + private sendEvent = new LRUCache(500);//seq->trace_id protected constructor(core: NapCatCore) { super(core); } @@ -46,21 +47,37 @@ export class NativePacketClient extends PacketClient { const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './moehoo/MoeHoo.' + platform + '.node'); process.dlopen(this.MoeHooExport, moehoo_path, constants.dlopen.RTLD_LAZY); console.log('MoeHooExport:', this.MoeHooExport); - console.log('recv:', recv, 'send:', ); - this.MoeHooExport.exports.InitHook?.(send, recv, (type: number, uin: string, seq: number, cmd: string, hex_data: string) => { - const callback = this.cb.get(createHash('md5').update(Buffer.from(hex_data, 'hex')).digest('hex') + (type === 0 ? 'send' : 'recv')); - if (callback) { - callback({ seq, cmd, hex_data }); - } else { - this.logger.logError(`Callback not found for hex_data: ${hex_data}`); + console.log('recv:', recv, 'send:',); + this.MoeHooExport.exports.InitHook?.(send, recv, (type: number, uin: string, cmd: string, seq: number, hex_data: string) => { + const trace_id = createHash('md5').update(Buffer.from(hex_data, 'hex')).digest('hex'); + if (type === 0 && this.cb.get(trace_id + 'recv')) { + //此时为send 提取seq + this.sendEvent.put(seq, trace_id); } - console.log('type:', type, 'uin:', uin, 'seq:', seq, 'cmd:', cmd, 'hex_data:', hex_data); + if (type === 1 && this.sendEvent.get(seq)) { + //此时为recv 调用callback + const trace_id = this.sendEvent.get(seq); + const callback = this.cb.get(trace_id + 'recv'); + console.log('callback:', callback, trace_id); + callback?.({ seq, cmd, hex_data }); + } + + // const callback = this.cb.get(createHash('md5').update(Buffer.from(hex_data, 'hex')).digest('hex') + (type === 0 ? 'send' : 'recv')); + // if (callback) { + // callback({ seq, cmd, hex_data }); + // } else { + // this.logger.logError(`Callback not found for hex_data: ${hex_data}`); + // } + console.log('type:', type, 'cmd:', cmd, 'trace_id:', trace_id); }); this.isAvailable = true; } sendCommandImpl(cmd: string, data: string, trace_id: string): void { - this.MoeHooExport.exports.SendPacket?.(cmd, data, crypto.createHash('md5').update(trace_id).digest('hex')); + const trace_id_md5 = createHash('md5').update(trace_id).digest('hex'); + console.log('sendCommandImpl:', cmd, data, trace_id_md5); + this.MoeHooExport.exports.SendPacket?.(cmd, data, trace_id_md5); + this.cb.get(trace_id_md5 + 'send')?.({ seq: 0, cmd, hex_data: '' }); } connect(cb: () => void): Promise { From 9b448b17e6c48132d57a55b0b174629e7338aafe Mon Sep 17 00:00:00 2001 From: pk5ls20 Date: Tue, 5 Nov 2024 12:47:28 +0800 Subject: [PATCH 09/15] refactor: NapProto -> https://github.com/NapNeko/NapProto --- package.json | 1 + src/core/apis/packet.ts | 2 +- src/core/packet/highway/session.ts | 2 +- src/core/packet/highway/uploader.ts | 2 +- src/core/packet/highway/utils.ts | 2 +- src/core/packet/message/builder.ts | 2 +- src/core/packet/message/element.ts | 2 +- src/core/packet/packer.ts | 2 +- src/core/packet/proto/NapProto.ts | 161 ------------------ src/core/packet/proto/action/action.ts | 2 +- .../proto/action/miniAppAdaptShareInfo.ts | 2 +- src/core/packet/proto/highway/highway.ts | 2 +- src/core/packet/proto/message/action.ts | 2 +- src/core/packet/proto/message/c2c.ts | 2 +- src/core/packet/proto/message/component.ts | 2 +- src/core/packet/proto/message/element.ts | 2 +- src/core/packet/proto/message/group.ts | 2 +- src/core/packet/proto/message/message.ts | 2 +- src/core/packet/proto/message/notify.ts | 2 +- src/core/packet/proto/message/routing.ts | 2 +- src/core/packet/proto/oidb/Oidb.0XE37_800.ts | 2 +- src/core/packet/proto/oidb/Oidb.0XFE1_2.ts | 2 +- src/core/packet/proto/oidb/Oidb.0x6D6.ts | 2 +- src/core/packet/proto/oidb/Oidb.0x8FC_2.ts | 4 +- src/core/packet/proto/oidb/Oidb.0x9067_202.ts | 2 +- src/core/packet/proto/oidb/Oidb.0x929.ts | 2 +- src/core/packet/proto/oidb/Oidb.0xE37_1200.ts | 2 +- src/core/packet/proto/oidb/Oidb.0xE37_1700.ts | 2 +- src/core/packet/proto/oidb/Oidb.0xEB7.ts | 4 +- src/core/packet/proto/oidb/Oidb.0xED3_1.ts | 2 +- src/core/packet/proto/oidb/OidbBase.ts | 2 +- .../proto/oidb/common/Ntv2.RichMediaReq.ts | 2 +- .../proto/oidb/common/Ntv2.RichMediaResp.ts | 2 +- 33 files changed, 34 insertions(+), 194 deletions(-) delete mode 100644 src/core/packet/proto/NapProto.ts diff --git a/package.json b/package.json index 446b9961..95af5bdc 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "devDependencies": { "@babel/preset-typescript": "^7.24.7", "@log4js-node/log4js-api": "^1.0.2", + "@napneko/nap-proto-core": "^0.0.2", "@protobuf-ts/runtime": "^2.9.4", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-typescript": "^11.1.6", diff --git a/src/core/apis/packet.ts b/src/core/apis/packet.ts index 3d743ad4..23b6ef73 100644 --- a/src/core/apis/packet.ts +++ b/src/core/apis/packet.ts @@ -4,7 +4,7 @@ import { ChatType, InstanceContext, NapCatCore } from '..'; import offset from '@/core/external/offset.json'; import { PacketSession } from "@/core/packet/session"; import { OidbPacket, PacketHexStr } from "@/core/packet/packer"; -import { NapProtoEncodeStructType, NapProtoDecodeStructType, NapProtoMsg } from '@/core/packet/proto/NapProto'; +import { NapProtoMsg, NapProtoEncodeStructType, NapProtoDecodeStructType } from "@napneko/nap-proto-core"; import { OidbSvcTrpcTcp0X9067_202_Rsp_Body } from '@/core/packet/proto/oidb/Oidb.0x9067_202'; import { OidbSvcTrpcTcpBase, OidbSvcTrpcTcpBaseRsp } from '@/core/packet/proto/oidb/OidbBase'; import { OidbSvcTrpcTcp0XFE1_2RSP } from '@/core/packet/proto/oidb/Oidb.0XFE1_2'; diff --git a/src/core/packet/highway/session.ts b/src/core/packet/highway/session.ts index bb870164..c1c5b1d1 100644 --- a/src/core/packet/highway/session.ts +++ b/src/core/packet/highway/session.ts @@ -2,7 +2,7 @@ import * as fs from "node:fs"; import { ChatType, Peer } from "@/core"; import { LogWrapper } from "@/common/log"; import { PacketPacker } from "@/core/packet/packer"; -import { NapProtoMsg } from "@/core/packet/proto/NapProto"; +import { NapProtoMsg } from "@napneko/nap-proto-core"; import { HttpConn0x6ff_501Response } from "@/core/packet/proto/action/action"; import { PacketHighwayClient } from "@/core/packet/highway/client"; import { NTV2RichMediaResp } from "@/core/packet/proto/oidb/common/Ntv2.RichMediaResp"; diff --git a/src/core/packet/highway/uploader.ts b/src/core/packet/highway/uploader.ts index 49ee5fe7..34822df4 100644 --- a/src/core/packet/highway/uploader.ts +++ b/src/core/packet/highway/uploader.ts @@ -4,7 +4,7 @@ import * as http from "node:http"; import * as stream from "node:stream"; import { LogWrapper } from "@/common/log"; import * as tea from "@/core/packet/utils/crypto/tea"; -import { NapProtoMsg } from "@/core/packet/proto/NapProto"; +import { NapProtoMsg } from "@napneko/nap-proto-core"; import { ReqDataHighwayHead, RespDataHighwayHead } from "@/core/packet/proto/highway/highway"; import { BlockSize } from "@/core/packet/highway/session"; import { PacketHighwayTrans } from "@/core/packet/highway/client"; diff --git a/src/core/packet/highway/utils.ts b/src/core/packet/highway/utils.ts index e786afbd..383155d3 100644 --- a/src/core/packet/highway/utils.ts +++ b/src/core/packet/highway/utils.ts @@ -1,4 +1,4 @@ -import { NapProtoEncodeStructType } from "@/core/packet/proto/NapProto"; +import { NapProtoEncodeStructType } from "@napneko/nap-proto-core"; import { IPv4 } from "@/core/packet/proto/oidb/common/Ntv2.RichMediaResp"; import { NTHighwayIPv4 } from "@/core/packet/proto/highway/highway"; diff --git a/src/core/packet/message/builder.ts b/src/core/packet/message/builder.ts index 63f92593..12fa374b 100644 --- a/src/core/packet/message/builder.ts +++ b/src/core/packet/message/builder.ts @@ -1,6 +1,6 @@ import * as crypto from "crypto"; import { PushMsgBody } from "@/core/packet/proto/message/message"; -import { NapProtoEncodeStructType } from "@/core/packet/proto/NapProto"; +import { NapProtoEncodeStructType } from "@napneko/nap-proto-core"; import { LogWrapper } from "@/common/log"; import { PacketMsg, PacketSendMsgElement } from "@/core/packet/message/message"; import { IPacketMsgElement, PacketMsgTextElement } from "@/core/packet/message/element"; diff --git a/src/core/packet/message/element.ts b/src/core/packet/message/element.ts index 6086fb31..9deb598d 100644 --- a/src/core/packet/message/element.ts +++ b/src/core/packet/message/element.ts @@ -1,5 +1,5 @@ import * as zlib from "node:zlib"; -import { NapProtoEncodeStructType, NapProtoMsg } from "@/core/packet/proto/NapProto"; +import { NapProtoEncodeStructType, NapProtoMsg } from "@napneko/nap-proto-core"; import { CustomFace, Elem, diff --git a/src/core/packet/packer.ts b/src/core/packet/packer.ts index 4e738306..039cf11e 100644 --- a/src/core/packet/packer.ts +++ b/src/core/packet/packer.ts @@ -1,7 +1,7 @@ import * as zlib from "node:zlib"; import * as crypto from "node:crypto"; import { computeMd5AndLengthWithLimit } from "@/core/packet/utils/crypto/hash"; -import { NapProtoEncodeStructType, NapProtoMsg } from "@/core/packet/proto/NapProto"; +import { NapProtoEncodeStructType, NapProtoMsg } from "@napneko/nap-proto-core"; import { OidbSvcTrpcTcpBase } from "@/core/packet/proto/oidb/OidbBase"; import { OidbSvcTrpcTcp0X9067_202 } from "@/core/packet/proto/oidb/Oidb.0x9067_202"; import { OidbSvcTrpcTcp0X8FC_2, OidbSvcTrpcTcp0X8FC_2_Body } from "@/core/packet/proto/oidb/Oidb.0x8FC_2"; diff --git a/src/core/packet/proto/NapProto.ts b/src/core/packet/proto/NapProto.ts deleted file mode 100644 index 06593487..00000000 --- a/src/core/packet/proto/NapProto.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { MessageType, PartialMessage, RepeatType, ScalarType } from '@protobuf-ts/runtime'; -import { PartialFieldInfo } from "@protobuf-ts/runtime/build/types/reflection-info"; - -type LowerCamelCase = CamelCaseHelper; - -type CamelCaseHelper< - S extends string, - CapNext extends boolean, - IsFirstChar extends boolean -> = S extends `${infer F}${infer R}` - ? F extends '_' - ? CamelCaseHelper - : F extends `${number}` - ? `${F}${CamelCaseHelper}` - : CapNext extends true - ? `${Uppercase}${CamelCaseHelper}` - : IsFirstChar extends true - ? `${Lowercase}${CamelCaseHelper}` - : `${F}${CamelCaseHelper}` - : ''; - -type ScalarTypeToTsType = - T extends ScalarType.DOUBLE | ScalarType.FLOAT | ScalarType.INT32 | ScalarType.FIXED32 | ScalarType.UINT32 | ScalarType.SFIXED32 | ScalarType.SINT32 ? number : - T extends ScalarType.INT64 | ScalarType.UINT64 | ScalarType.FIXED64 | ScalarType.SFIXED64 | ScalarType.SINT64 ? bigint : - T extends ScalarType.BOOL ? boolean : - T extends ScalarType.STRING ? string : - T extends ScalarType.BYTES ? Uint8Array : - never; - -interface BaseProtoFieldType { - kind: 'scalar' | 'message'; - no: number; - type: T; - optional: O; - repeat: R; -} - -interface ScalarProtoFieldType extends BaseProtoFieldType { - kind: 'scalar'; -} - -interface MessageProtoFieldType ProtoMessageType, O extends boolean, R extends O extends true ? false : boolean> extends BaseProtoFieldType { - kind: 'message'; -} - -type ProtoFieldType = - | ScalarProtoFieldType - | MessageProtoFieldType<() => ProtoMessageType, boolean, boolean>; - -type ProtoMessageType = { - [key: string]: ProtoFieldType; -}; - -export function ProtoField(no: number, type: T, optional?: O, repeat?: R): ScalarProtoFieldType; -export function ProtoField ProtoMessageType, O extends boolean = false, R extends O extends true ? false : boolean = false>(no: number, type: T, optional?: O, repeat?: R): MessageProtoFieldType; -export function ProtoField(no: number, type: ScalarType | (() => ProtoMessageType), optional?: boolean, repeat?: boolean): ProtoFieldType { - if (typeof type === 'function') { - return { kind: 'message', no: no, type: type, optional: optional ?? false, repeat: repeat ?? false }; - } else { - return { kind: 'scalar', no: no, type: type, optional: optional ?? false, repeat: repeat ?? false }; - } -} - -type ProtoFieldReturnType = NonNullable extends ScalarProtoFieldType - ? ScalarTypeToTsType - : T extends NonNullable> - ? NonNullable, E>> - : never; - -type RequiredFieldsBaseType = { - [K in keyof T as T[K] extends { optional: true } ? never : LowerCamelCase]: - T[K] extends { repeat: true } - ? ProtoFieldReturnType[] - : ProtoFieldReturnType -} - -type OptionalFieldsBaseType = { - [K in keyof T as T[K] extends { optional: true } ? LowerCamelCase : never]?: - T[K] extends { repeat: true } - ? ProtoFieldReturnType[] - : ProtoFieldReturnType -} - -type RequiredFieldsType = E extends true ? Partial> : RequiredFieldsBaseType; - -type OptionalFieldsType = E extends true ? Partial> : OptionalFieldsBaseType; - -type NapProtoStructType = RequiredFieldsType & OptionalFieldsType; - -export type NapProtoEncodeStructType = NapProtoStructType; - -export type NapProtoDecodeStructType = NapProtoStructType; - -class NapProtoRealMsg { - private readonly _field: PartialFieldInfo[]; - private readonly _proto_msg: MessageType>; - private static cache = new WeakMap>(); - - private constructor(fields: T) { - this._field = Object.keys(fields).map(key => { - const field = fields[key]; - if (field.kind === 'scalar') { - const repeatType = field.repeat - ? [ScalarType.STRING, ScalarType.BYTES].includes(field.type) - ? RepeatType.UNPACKED - : RepeatType.PACKED - : RepeatType.NO; - return { - no: field.no, - name: key, - kind: 'scalar', - T: field.type, - opt: field.optional, - repeat: repeatType, - }; - } else if (field.kind === 'message') { - return { - no: field.no, - name: key, - kind: 'message', - repeat: field.repeat ? RepeatType.PACKED : RepeatType.NO, - T: () => NapProtoRealMsg.getInstance(field.type())._proto_msg, - }; - } - }) as PartialFieldInfo[]; - this._proto_msg = new MessageType>('nya', this._field); - } - - static getInstance(fields: T): NapProtoRealMsg { - let instance = this.cache.get(fields); - if (!instance) { - instance = new NapProtoRealMsg(fields); - this.cache.set(fields, instance); - } - return instance; - } - - encode(data: NapProtoEncodeStructType): Uint8Array { - return this._proto_msg.toBinary(this._proto_msg.create(data as PartialMessage>)); - } - - decode(data: Uint8Array): NapProtoDecodeStructType { - return this._proto_msg.fromBinary(data) as NapProtoDecodeStructType; - } -} - -export class NapProtoMsg { - private realMsg: NapProtoRealMsg; - - constructor(fields: T) { - this.realMsg = NapProtoRealMsg.getInstance(fields); - } - - encode(data: NapProtoEncodeStructType): Uint8Array { - return this.realMsg.encode(data); - } - - decode(data: Uint8Array): NapProtoDecodeStructType { - return this.realMsg.decode(data); - } -} diff --git a/src/core/packet/proto/action/action.ts b/src/core/packet/proto/action/action.ts index af6b45d6..78452bbc 100644 --- a/src/core/packet/proto/action/action.ts +++ b/src/core/packet/proto/action/action.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; import { ContentHead, MessageBody, MessageControl, RoutingHead } from "@/core/packet/proto/message/message"; export const FaceRoamRequest = { diff --git a/src/core/packet/proto/action/miniAppAdaptShareInfo.ts b/src/core/packet/proto/action/miniAppAdaptShareInfo.ts index 76bb2829..0c137253 100644 --- a/src/core/packet/proto/action/miniAppAdaptShareInfo.ts +++ b/src/core/packet/proto/action/miniAppAdaptShareInfo.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; export const MiniAppAdaptShareInfoReq = { appId: ProtoField(2, ScalarType.STRING), diff --git a/src/core/packet/proto/highway/highway.ts b/src/core/packet/proto/highway/highway.ts index f69b9e4b..1e96074d 100644 --- a/src/core/packet/proto/highway/highway.ts +++ b/src/core/packet/proto/highway/highway.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; import { MsgInfo, MsgInfoBody } from "@/core/packet/proto/oidb/common/Ntv2.RichMediaReq"; export const DataHighwayHead = { diff --git a/src/core/packet/proto/message/action.ts b/src/core/packet/proto/message/action.ts index 29d7945f..df26d42f 100644 --- a/src/core/packet/proto/message/action.ts +++ b/src/core/packet/proto/message/action.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; import { PushMsgBody } from "@/core/packet/proto/message/message"; export const LongMsgResult = { diff --git a/src/core/packet/proto/message/c2c.ts b/src/core/packet/proto/message/c2c.ts index 2a93e5eb..6db5b646 100644 --- a/src/core/packet/proto/message/c2c.ts +++ b/src/core/packet/proto/message/c2c.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; export const C2C = { uin: ProtoField(1, ScalarType.UINT32, true), diff --git a/src/core/packet/proto/message/component.ts b/src/core/packet/proto/message/component.ts index 0981a73e..04d0468d 100644 --- a/src/core/packet/proto/message/component.ts +++ b/src/core/packet/proto/message/component.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; import { Elem } from "@/core/packet/proto/message/element"; export const Attr = { diff --git a/src/core/packet/proto/message/element.ts b/src/core/packet/proto/message/element.ts index 3ed728e3..ed6a237f 100644 --- a/src/core/packet/proto/message/element.ts +++ b/src/core/packet/proto/message/element.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; export const Elem = { text: ProtoField(1, () => Text, true), diff --git a/src/core/packet/proto/message/group.ts b/src/core/packet/proto/message/group.ts index 3416f1e5..2c8ef617 100644 --- a/src/core/packet/proto/message/group.ts +++ b/src/core/packet/proto/message/group.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; export const GroupRecallMsg = { type: ProtoField(1, ScalarType.UINT32), diff --git a/src/core/packet/proto/message/message.ts b/src/core/packet/proto/message/message.ts index 5203f285..11a43665 100644 --- a/src/core/packet/proto/message/message.ts +++ b/src/core/packet/proto/message/message.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; import { ForwardHead, Grp, GrpTmp, ResponseForward, ResponseGrp, Trans0X211, WPATmp } from "@/core/packet/proto/message/routing"; import { RichText } from "@/core/packet/proto/message/component"; import { C2C } from "@/core/packet/proto/message/c2c"; diff --git a/src/core/packet/proto/message/notify.ts b/src/core/packet/proto/message/notify.ts index e739e151..efedfd45 100644 --- a/src/core/packet/proto/message/notify.ts +++ b/src/core/packet/proto/message/notify.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; export const FriendRecall = { info: ProtoField(1, () => FriendRecallInfo), diff --git a/src/core/packet/proto/message/routing.ts b/src/core/packet/proto/message/routing.ts index 7de44012..b8d539b0 100644 --- a/src/core/packet/proto/message/routing.ts +++ b/src/core/packet/proto/message/routing.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; export const ForwardHead = { field1: ProtoField(1, ScalarType.UINT32, true), diff --git a/src/core/packet/proto/oidb/Oidb.0XE37_800.ts b/src/core/packet/proto/oidb/Oidb.0XE37_800.ts index dc708071..a8418e76 100644 --- a/src/core/packet/proto/oidb/Oidb.0XE37_800.ts +++ b/src/core/packet/proto/oidb/Oidb.0XE37_800.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; import { OidbSvcTrpcTcp0XE37_800_1200Metadata } from "@/core/packet/proto/oidb/Oidb.0xE37_1200"; export const OidbSvcTrpcTcp0XE37_800 = { diff --git a/src/core/packet/proto/oidb/Oidb.0XFE1_2.ts b/src/core/packet/proto/oidb/Oidb.0XFE1_2.ts index 7c6b37be..13d7f428 100644 --- a/src/core/packet/proto/oidb/Oidb.0XFE1_2.ts +++ b/src/core/packet/proto/oidb/Oidb.0XFE1_2.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; export const OidbSvcTrpcTcp0XFE1_2 = { uin: ProtoField(1, ScalarType.UINT32), diff --git a/src/core/packet/proto/oidb/Oidb.0x6D6.ts b/src/core/packet/proto/oidb/Oidb.0x6D6.ts index be16da98..2824035a 100644 --- a/src/core/packet/proto/oidb/Oidb.0x6D6.ts +++ b/src/core/packet/proto/oidb/Oidb.0x6D6.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; export const OidbSvcTrpcTcp0x6D6 = { file: ProtoField(1, () => OidbSvcTrpcTcp0x6D6Upload, true), diff --git a/src/core/packet/proto/oidb/Oidb.0x8FC_2.ts b/src/core/packet/proto/oidb/Oidb.0x8FC_2.ts index 3721ee8b..c39cdbbe 100644 --- a/src/core/packet/proto/oidb/Oidb.0x8FC_2.ts +++ b/src/core/packet/proto/oidb/Oidb.0x8FC_2.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; //设置群头衔 OidbSvcTrpcTcp.0x8fc_2 @@ -13,4 +13,4 @@ export const OidbSvcTrpcTcp0X8FC_2_Body = { export const OidbSvcTrpcTcp0X8FC_2 = { groupUin: ProtoField(1, ScalarType.UINT32), body: ProtoField(3, ScalarType.BYTES), -}; \ No newline at end of file +}; diff --git a/src/core/packet/proto/oidb/Oidb.0x9067_202.ts b/src/core/packet/proto/oidb/Oidb.0x9067_202.ts index 2ee31688..c72fceef 100644 --- a/src/core/packet/proto/oidb/Oidb.0x9067_202.ts +++ b/src/core/packet/proto/oidb/Oidb.0x9067_202.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; import { MultiMediaReqHead } from "./common/Ntv2.RichMediaReq"; //Req diff --git a/src/core/packet/proto/oidb/Oidb.0x929.ts b/src/core/packet/proto/oidb/Oidb.0x929.ts index cc04e64b..b401d13d 100644 --- a/src/core/packet/proto/oidb/Oidb.0x929.ts +++ b/src/core/packet/proto/oidb/Oidb.0x929.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; import { MsgInfo } from "@/core/packet/proto/oidb/common/Ntv2.RichMediaReq"; export const OidbSvcTrpcTcp0X929D_0 = { diff --git a/src/core/packet/proto/oidb/Oidb.0xE37_1200.ts b/src/core/packet/proto/oidb/Oidb.0xE37_1200.ts index ba2b0f16..969b36f2 100644 --- a/src/core/packet/proto/oidb/Oidb.0xE37_1200.ts +++ b/src/core/packet/proto/oidb/Oidb.0xE37_1200.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; export const OidbSvcTrpcTcp0XE37_1200 = { subCommand: ProtoField(1, ScalarType.UINT32, true), diff --git a/src/core/packet/proto/oidb/Oidb.0xE37_1700.ts b/src/core/packet/proto/oidb/Oidb.0xE37_1700.ts index 046dff8f..4c800f4e 100644 --- a/src/core/packet/proto/oidb/Oidb.0xE37_1700.ts +++ b/src/core/packet/proto/oidb/Oidb.0xE37_1700.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; export const OidbSvcTrpcTcp0XE37_1700 = { command: ProtoField(1, ScalarType.UINT32, true), diff --git a/src/core/packet/proto/oidb/Oidb.0xEB7.ts b/src/core/packet/proto/oidb/Oidb.0xEB7.ts index 27cf8cee..947a2268 100644 --- a/src/core/packet/proto/oidb/Oidb.0xEB7.ts +++ b/src/core/packet/proto/oidb/Oidb.0xEB7.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; export const OidbSvcTrpcTcp0XEB7_Body = { uin: ProtoField(1, ScalarType.STRING), @@ -9,4 +9,4 @@ export const OidbSvcTrpcTcp0XEB7_Body = { export const OidbSvcTrpcTcp0XEB7 = { body: ProtoField(2, () => OidbSvcTrpcTcp0XEB7_Body), -}; \ No newline at end of file +}; diff --git a/src/core/packet/proto/oidb/Oidb.0xED3_1.ts b/src/core/packet/proto/oidb/Oidb.0xED3_1.ts index 5e644c50..c8d6af21 100644 --- a/src/core/packet/proto/oidb/Oidb.0xED3_1.ts +++ b/src/core/packet/proto/oidb/Oidb.0xED3_1.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; // Send Poke export const OidbSvcTrpcTcp0XED3_1 = { diff --git a/src/core/packet/proto/oidb/OidbBase.ts b/src/core/packet/proto/oidb/OidbBase.ts index 49e9e5cd..fe1d1fab 100644 --- a/src/core/packet/proto/oidb/OidbBase.ts +++ b/src/core/packet/proto/oidb/OidbBase.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; export const OidbSvcTrpcTcpBase = { command: ProtoField(1, ScalarType.UINT32), diff --git a/src/core/packet/proto/oidb/common/Ntv2.RichMediaReq.ts b/src/core/packet/proto/oidb/common/Ntv2.RichMediaReq.ts index 2f117520..e279de3d 100644 --- a/src/core/packet/proto/oidb/common/Ntv2.RichMediaReq.ts +++ b/src/core/packet/proto/oidb/common/Ntv2.RichMediaReq.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; export const NTV2RichMediaReq = { ReqHead: ProtoField(1, () => MultiMediaReqHead), diff --git a/src/core/packet/proto/oidb/common/Ntv2.RichMediaResp.ts b/src/core/packet/proto/oidb/common/Ntv2.RichMediaResp.ts index e1d16556..fe7ac659 100644 --- a/src/core/packet/proto/oidb/common/Ntv2.RichMediaResp.ts +++ b/src/core/packet/proto/oidb/common/Ntv2.RichMediaResp.ts @@ -1,5 +1,5 @@ import { ScalarType } from "@protobuf-ts/runtime"; -import { ProtoField } from "../../NapProto"; +import { ProtoField } from "@napneko/nap-proto-core"; import { CommonHead, MsgInfo, PicUrlExtInfo, VideoExtInfo } from "@/core/packet/proto/oidb/common/Ntv2.RichMediaReq"; export const NTV2RichMediaResp = { From 017b8b7f1520d12ca7e2a8966a0720e62e99face Mon Sep 17 00:00:00 2001 From: pk5ls20 Date: Tue, 5 Nov 2024 13:52:56 +0800 Subject: [PATCH 10/15] chore: better log --- src/core/apis/packet.ts | 11 +++-------- src/core/packet/client/client.ts | 3 --- src/core/packet/client/nativeClient.ts | 4 ++-- src/core/packet/client/wsClient.ts | 8 ++++---- src/core/packet/session.ts | 4 ++-- 5 files changed, 11 insertions(+), 19 deletions(-) diff --git a/src/core/apis/packet.ts b/src/core/apis/packet.ts index 23b6ef73..0bbb9cef 100644 --- a/src/core/apis/packet.ts +++ b/src/core/apis/packet.ts @@ -48,14 +48,9 @@ export class NTQQPacketApi { this.core = core; this.logger = core.context.logger; this.packetSession = undefined; - const config = this.core.configLoader.configData; - if (config) { - this.InitSendPacket(this.context.basicInfoWrapper.getFullQQVesion()) - .then() - .catch(this.core.context.logger.logError.bind(this.core.context.logger)); - } else { - this.core.context.logger.logWarn('PacketServer未配置,NapCat.Packet将不会加载!'); - } + this.InitSendPacket(this.context.basicInfoWrapper.getFullQQVesion()) + .then() + .catch(this.core.context.logger.logError.bind(this.core.context.logger)); } get available(): boolean { diff --git a/src/core/packet/client/client.ts b/src/core/packet/client/client.ts index 88147054..fee48dd2 100644 --- a/src/core/packet/client/client.ts +++ b/src/core/packet/client/client.ts @@ -65,9 +65,6 @@ export abstract class PacketClient { private async sendCommand(cmd: string, data: string, trace_id: string, rsp: boolean = false, timeout: number = 20000, sendcb: (json: RecvPacketData) => void = () => { }): Promise { return new Promise((resolve, reject) => { - if (!this.isAvailable) { - throw new Error("Packet Service is not available"); - } if (rsp) { this.registerCallback(trace_id, 'recv', async (json: RecvPacketData) => { clearTimeout(timeoutHandle); diff --git a/src/core/packet/client/nativeClient.ts b/src/core/packet/client/nativeClient.ts index c409f443..c374e41c 100644 --- a/src/core/packet/client/nativeClient.ts +++ b/src/core/packet/client/nativeClient.ts @@ -27,12 +27,12 @@ export class NativePacketClient extends PacketClient { static compatibilityScore(logger: LogWrapper): number { const platform = process.platform + '.' + process.arch; if (!this.supportedPlatforms.includes(platform)) { - logger.logError(`[NativePacketClient] Unsupported platform: ${platform}`); + logger.logError(`[Core] [Packet:Native] 不支持的平台: ${platform}`); return 0; } const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './moehoo/MoeHoo.' + platform + '.node'); if (!fs.existsSync(moehoo_path)) { - logger.logError(`[NativePacketClient] Missing moehoo binary: ${moehoo_path}`); + logger.logError(`[Core] [Packet:Native] 缺失运行时文件: ${moehoo_path}`); return 0; } return 10; diff --git a/src/core/packet/client/wsClient.ts b/src/core/packet/client/wsClient.ts index bf34e0e0..dd91f533 100644 --- a/src/core/packet/client/wsClient.ts +++ b/src/core/packet/client/wsClient.ts @@ -32,7 +32,7 @@ export class wsPacketClient extends PacketClient { this.websocket.onopen = () => { this.isAvailable = true; this.reconnectAttempts = 0; - this.logger.log.bind(this.logger)(`[Core] [Packet Server] 已连接到 ${this.clientUrl}`); + this.logger.log.bind(this.logger)(`[Core] [Packet:Server] 已连接到 ${this.clientUrl}`); cb(); resolve(); }; @@ -62,14 +62,14 @@ export class wsPacketClient extends PacketClient { this.reconnectAttempts++; setTimeout(() => { this.connect(cb).catch((error) => { - this.logger.logError.bind(this.logger)(`[Core] [Packet Server] 尝试重连失败:${error.message}`); + this.logger.logError.bind(this.logger)(`[Core] [Packet:Server] 尝试重连失败:${error.message}`); }); }, 5000 * this.reconnectAttempts); } else { - this.logger.logError.bind(this.logger)(`[Core] [Packet Server] ${this.clientUrl} 已达到最大重连次数!`); + this.logger.logError.bind(this.logger)(`[Core] [Packet:Server] ${this.clientUrl} 已达到最大重连次数!`); } } catch (error: any) { - this.logger.logError.bind(this.logger)(`[Core] [Packet Server] 重连时出错: ${error.message}`); + this.logger.logError.bind(this.logger)(`[Core] [Packet:Server] 重连时出错: ${error.message}`); } } diff --git a/src/core/packet/session.ts b/src/core/packet/session.ts index 208997dc..3b6df17b 100644 --- a/src/core/packet/session.ts +++ b/src/core/packet/session.ts @@ -41,9 +41,9 @@ export class PacketSession { } } if (!selectedClient) { - throw new Error("No compatible PacketClient found"); + throw new Error("[Core] [Packet] 无可用的后端,NapCat.Packet将不会加载!"); } - this.logger.log(`[Packet] 自动选择了: ${selectedClient.name}`); + this.logger.log(`[Core] [Packet] 自动选择 ${selectedClient.name} 作为后端`); return selectedClient.create(core); } } From ad6f21980cc3740df93d0b515ce5dd023ad7f720 Mon Sep 17 00:00:00 2001 From: pk5ls20 Date: Tue, 5 Nov 2024 14:24:54 +0800 Subject: [PATCH 11/15] refactor: auto judge client --- src/core/packet/client/client.ts | 12 +++-------- src/core/packet/client/nativeClient.ts | 21 +++++++----------- src/core/packet/client/wsClient.ts | 21 +++++++++--------- src/core/packet/session.ts | 30 ++++++++++++-------------- 4 files changed, 35 insertions(+), 49 deletions(-) diff --git a/src/core/packet/client/client.ts b/src/core/packet/client/client.ts index fee48dd2..1b08f0b0 100644 --- a/src/core/packet/client/client.ts +++ b/src/core/packet/client/client.ts @@ -30,10 +30,6 @@ export abstract class PacketClient { this.config = core.configLoader.configData; } - get available(): boolean { - return this.isAvailable; - } - private randText(len: number): string { let text = ''; const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; @@ -43,13 +39,11 @@ export abstract class PacketClient { return text; } - static create(core: NapCatCore): PacketClient { - throw new Error("Must be implemented by subclasses"); + get available(): boolean { + return this.isAvailable; } - static compatibilityScore(logger: LogWrapper): number { - throw new Error("Must be implemented by subclasses"); - } + abstract check(core: NapCatCore): boolean; abstract init(pid: number, recv: string, send: string): Promise; diff --git a/src/core/packet/client/nativeClient.ts b/src/core/packet/client/nativeClient.ts index c374e41c..a6e6b5ca 100644 --- a/src/core/packet/client/nativeClient.ts +++ b/src/core/packet/client/nativeClient.ts @@ -5,7 +5,6 @@ import { fileURLToPath } from "url"; import fs from "fs"; import { PacketClient } from "@/core/packet/client/client"; import { constants } from "node:os"; -import { LogWrapper } from "@/common/log"; import { LRUCache } from "@/common/lru-cache"; //0 send 1recv export interface NativePacketExportType { @@ -13,10 +12,10 @@ export interface NativePacketExportType { SendPacket?: (cmd: string, data: string, trace_id: string) => void; } export class NativePacketClient extends PacketClient { - static supportedPlatforms = ['win32.x64']; + private readonly supportedPlatforms = ['win32.x64']; private MoeHooExport: { exports: NativePacketExportType } = { exports: {} }; private sendEvent = new LRUCache(500);//seq->trace_id - protected constructor(core: NapCatCore) { + constructor(core: NapCatCore) { super(core); } @@ -24,22 +23,18 @@ export class NativePacketClient extends PacketClient { return this.isAvailable; } - static compatibilityScore(logger: LogWrapper): number { + check(): boolean { const platform = process.platform + '.' + process.arch; if (!this.supportedPlatforms.includes(platform)) { - logger.logError(`[Core] [Packet:Native] 不支持的平台: ${platform}`); - return 0; + this.logger.logWarn(`[Core] [Packet:Native] 不支持的平台: ${platform}`); + return false; } const moehoo_path = path.join(dirname(fileURLToPath(import.meta.url)), './moehoo/MoeHoo.' + platform + '.node'); if (!fs.existsSync(moehoo_path)) { - logger.logError(`[Core] [Packet:Native] 缺失运行时文件: ${moehoo_path}`); - return 0; + this.logger.logWarn(`[Core] [Packet:Native] 缺失运行时文件: ${moehoo_path}`); + return false; } - return 10; - } - - static create(core: NapCatCore): NativePacketClient { - return new NativePacketClient(core); + return true; } async init(pid: number, recv: string, send: string): Promise { diff --git a/src/core/packet/client/wsClient.ts b/src/core/packet/client/wsClient.ts index dd91f533..0111018a 100644 --- a/src/core/packet/client/wsClient.ts +++ b/src/core/packet/client/wsClient.ts @@ -1,32 +1,31 @@ import { Data, WebSocket } from "ws"; import { NapCatCore } from "@/core"; import { PacketClient, RecvPacket } from "@/core/packet/client/client"; -import { LogWrapper } from "@/common/log"; export class wsPacketClient extends PacketClient { private websocket: WebSocket | undefined; private reconnectAttempts: number = 0; private readonly maxReconnectAttempts: number = 60; // 现在暂时不可配置 - private readonly clientUrl: string = ''; + private readonly clientUrl: string | null = null; private clientUrlWrap: (url: string) => string = (url: string) => `ws://${url}/ws`; - protected constructor(core: NapCatCore) { + constructor(core: NapCatCore) { super(core); - this.clientUrl = this.clientUrlWrap(this.config.packetServer ?? '127.0.0.1:8086'); + this.clientUrl = this.config.packetServer ? this.clientUrlWrap( this.config.packetServer) : null; } - static compatibilityScore(logger: LogWrapper): number { - return 10; - } - - static create(core: NapCatCore): wsPacketClient { - return new wsPacketClient(core); + check(): boolean { + if (!this.clientUrl) { + this.logger.logWarn(`[Core] [Packet:Server] 未配置服务器地址`); + return false; + } + return true; } connect(cb: () => void): Promise { return new Promise((resolve, reject) => { //this.logger.log.bind(this.logger)(`[Core] [Packet Server] Attempting to connect to ${this.clientUrl}`); - this.websocket = new WebSocket(this.clientUrl); + this.websocket = new WebSocket(this.clientUrl!); this.websocket.on('error', (err) => { }/*this.logger.logError.bind(this.logger)('[Core] [Packet Server] Error:', err.message)*/); this.websocket.onopen = () => { diff --git a/src/core/packet/session.ts b/src/core/packet/session.ts index 3b6df17b..993822ae 100644 --- a/src/core/packet/session.ts +++ b/src/core/packet/session.ts @@ -7,12 +7,12 @@ import { wsPacketClient } from "@/core/packet/client/wsClient"; import { NapCatCore } from "@/core"; type clientPriority = { - [key: number]: typeof PacketClient; + [key: number]: (core: NapCatCore) => PacketClient; } const clientPriority: clientPriority = { - 10: NativePacketClient, - 1: wsPacketClient, + 10: (core: NapCatCore) => new NativePacketClient(core), + 1: (core: NapCatCore) => new wsPacketClient(core), }; export class PacketSession { @@ -29,21 +29,19 @@ export class PacketSession { } private judgeClient(core: NapCatCore): PacketClient { - let selectedClient: typeof PacketClient | null = null; - let maxScore = -1; - for (const key in clientPriority) { - const priority = parseInt(key); - const ClientClass = clientPriority[priority]; - const score = priority * ClientClass.compatibilityScore(core.context.logger); - if (score > maxScore) { - maxScore = score; - selectedClient = ClientClass; - } - } + const sortedClients = Object.entries(clientPriority) + .map(([priority, clientFactory]) => { + const client = clientFactory(core); + const score = +priority * +client.check(core); + return { client, score }; + }) + .filter(({ score }) => score > 0) + .sort((a, b) => b.score - a.score); + const selectedClient = sortedClients[0]?.client; if (!selectedClient) { throw new Error("[Core] [Packet] 无可用的后端,NapCat.Packet将不会加载!"); } - this.logger.log(`[Core] [Packet] 自动选择 ${selectedClient.name} 作为后端`); - return selectedClient.create(core); + this.logger.log(`[Core] [Packet] 自动选择 ${selectedClient.constructor.name} 作为后端`); + return selectedClient; } } From e46d274a7522f855f2510d14fbb7fbf33a9d20d7 Mon Sep 17 00:00:00 2001 From: pk5ls20 Date: Tue, 5 Nov 2024 14:45:02 +0800 Subject: [PATCH 12/15] feat: add new NapCat config key: `packetBackend` - Acceptable values: `native`, `frida`, `auto`, `disable` - Default value is set to `auto` --- src/core/apis/packet.ts | 6 +++++- src/core/external/napcat.json | 3 ++- src/core/packet/highway/session.ts | 2 +- src/core/packet/session.ts | 17 ++++++++++++++++- src/onebot/action/packet/GetPacketStatus.ts | 2 +- 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/core/apis/packet.ts b/src/core/apis/packet.ts index 0bbb9cef..beb47362 100644 --- a/src/core/apis/packet.ts +++ b/src/core/apis/packet.ts @@ -61,7 +61,11 @@ export class NTQQPacketApi { this.qqVersion = qqversion; const table = typedOffset[qqversion + '-' + os.arch()]; if (!table) { - this.logger.logError('PacketServer Offset table not found for QQVersion: ', qqversion + '-' + os.arch()); + this.logger.logError('[Core] [Packet] PacketServer Offset table not found for QQVersion: ', qqversion + '-' + os.arch()); + return false; + } + if (this.core.configLoader.configData.packetBackend === 'disable') { + this.logger.logWarn('[Core] [Packet] 已禁用Packet后端,NapCat.Packet将不会加载!'); return false; } this.packetSession = new PacketSession(this.core); diff --git a/src/core/external/napcat.json b/src/core/external/napcat.json index 92432677..6abfe1e6 100644 --- a/src/core/external/napcat.json +++ b/src/core/external/napcat.json @@ -3,5 +3,6 @@ "consoleLog": true, "fileLogLevel": "debug", "consoleLogLevel": "info", + "packetBackend": "auto", "packetServer": "" -} \ No newline at end of file +} diff --git a/src/core/packet/highway/session.ts b/src/core/packet/highway/session.ts index c1c5b1d1..8cc534d3 100644 --- a/src/core/packet/highway/session.ts +++ b/src/core/packet/highway/session.ts @@ -59,7 +59,7 @@ export class PacketHighwaySession { private async checkAvailable() { if (!this.packetClient.available) { - throw new Error('packetServer不可用,请参照文档 https://napneko.github.io/config/advanced 检查packetServer状态或进行配置'); + throw new Error('packetBackend不可用,请参照文档 https://napneko.github.io/config/advanced 和启动日志检查packetBackend状态或进行配置!'); } if (this.sig.sigSession === null || this.sig.sessionKey === null) { this.logger.logWarn('[Highway] sigSession or sessionKey not available!'); diff --git a/src/core/packet/session.ts b/src/core/packet/session.ts index 993822ae..3413bc3b 100644 --- a/src/core/packet/session.ts +++ b/src/core/packet/session.ts @@ -23,11 +23,26 @@ export class PacketSession { constructor(core: NapCatCore) { this.logger = core.context.logger; - this.client = this.judgeClient(core); + this.client = this.newClient(core); this.packer = new PacketPacker(this.logger, this.client); this.highwaySession = new PacketHighwaySession(this.logger, this.client, this.packer); } + private newClient(core: NapCatCore): PacketClient { + const prefer = core.configLoader.configData.packetBackend; + switch (prefer) { + case "native": + return new NativePacketClient(core); + case "frida": + return new wsPacketClient(core); + case "auto": + case undefined: + return this.judgeClient(core); + default: + throw new Error(`[Core] [Packet] 未知的Packet后端类型 ${prefer},请检查配置文件!`); + } + } + private judgeClient(core: NapCatCore): PacketClient { const sortedClients = Object.entries(clientPriority) .map(([priority, clientFactory]) => { diff --git a/src/onebot/action/packet/GetPacketStatus.ts b/src/onebot/action/packet/GetPacketStatus.ts index 265e7126..2c611135 100644 --- a/src/onebot/action/packet/GetPacketStatus.ts +++ b/src/onebot/action/packet/GetPacketStatus.ts @@ -9,7 +9,7 @@ export abstract class GetPacketStatusDepends extends BaseAction if (!this.core.apis.PacketApi.available) { return { valid: false, - message: "packetServer不可用,请参照文档 https://napneko.github.io/config/advanced 检查packetServer状态或进行配置!", + message: "packetBackend不可用,请参照文档 https://napneko.github.io/config/advanced 和启动日志检查packetBackend状态或进行配置!", }; } return await super.check(payload); From 393815b11ea6ae750d7c185dbe6d43d1b9a6d4f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Tue, 5 Nov 2024 20:33:55 +0800 Subject: [PATCH 13/15] fix --- src/native/packet/MoeHoo.win32.x64.node | Bin 134144 -> 134656 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/native/packet/MoeHoo.win32.x64.node b/src/native/packet/MoeHoo.win32.x64.node index 2beecff7544135e59d6d60853359ef26c22c443b..ab1701c09cd53e4e9d802c5179b438df9b0c3e3e 100644 GIT binary patch delta 28223 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 From 591ab1b1df6c3efd8410310979f100075b578cdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Tue, 5 Nov 2024 20:40:25 +0800 Subject: [PATCH 14/15] =?UTF-8?q?feat:=20=E5=8E=BB=E6=8E=89=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/packet/client/client.ts | 2 +- src/core/packet/client/nativeClient.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/packet/client/client.ts b/src/core/packet/client/client.ts index 1b08f0b0..c8aac93e 100644 --- a/src/core/packet/client/client.ts +++ b/src/core/packet/client/client.ts @@ -90,7 +90,7 @@ export abstract class PacketClient { const trace_id = (this.randText(4) + md5 + data).slice(0, data.length / 2); this.sendCommand(cmd, data, trace_id, rsp, 20000, async () => { - console.log('sendPacket:', cmd, data, trace_id); + //console.log('sendPacket:', cmd, data, trace_id); await this.napCatCore.context.session.getMsgService().sendSsoCmdReqByContend(cmd, trace_id); }).then((res) => resolve(res)).catch((e: Error) => reject(e)); }); diff --git a/src/core/packet/client/nativeClient.ts b/src/core/packet/client/nativeClient.ts index a6e6b5ca..a0efae6e 100644 --- a/src/core/packet/client/nativeClient.ts +++ b/src/core/packet/client/nativeClient.ts @@ -63,14 +63,14 @@ export class NativePacketClient extends PacketClient { // } else { // this.logger.logError(`Callback not found for hex_data: ${hex_data}`); // } - console.log('type:', type, 'cmd:', cmd, 'trace_id:', trace_id); + //console.log('type:', type, 'cmd:', cmd, 'trace_id:', trace_id); }); this.isAvailable = true; } sendCommandImpl(cmd: string, data: string, trace_id: string): void { const trace_id_md5 = createHash('md5').update(trace_id).digest('hex'); - console.log('sendCommandImpl:', cmd, data, trace_id_md5); + //console.log('sendCommandImpl:', cmd, data, trace_id_md5); this.MoeHooExport.exports.SendPacket?.(cmd, data, trace_id_md5); this.cb.get(trace_id_md5 + 'send')?.({ seq: 0, cmd, hex_data: '' }); } From 8519b7f4df9a278f35eb22127eeccb9e8ae2d294 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Tue, 5 Nov 2024 20:48:28 +0800 Subject: [PATCH 15/15] update: LiteLoader --- external/LiteLoaderWrapper.zip | Bin 67048 -> 68860 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/external/LiteLoaderWrapper.zip b/external/LiteLoaderWrapper.zip index a6edb42f314d2666b84252e60f52e735354ce216..1b30ba64e25e3d81c2af0d6d4b77a3fd9a9f4e06 100644 GIT binary patch literal 68860 zcmbTe1$10njy76mW@cuNnVFfHnVBhe%*^bVDQ1rCm}6#UW@e^8xjpk{R=<0@Z%?gt z3f8HT&X#nfPufx`NP~c)0)9VUicB^Cc=KOR$N)lsjHQdIjJ=_Wsgt^sp@V~|6N9P> z901}4h1whfmD>FF*Q=`s3;+o9_iz4qQuu=&BmfeCs;2P&(Tn_bn(|NS{SOCy8ADe) zV+&I!dMoEYxP(z5nE&_jPh5DTm|%Js5yc*a{KZca&fO|F(6WE-3B=rX&3H&&C~Z%$ z6MyIBTYpHJk4}EJTL#gIngxJ@L2V*N28BuM%B7Kyo|iu6Bi|iW(Mr?qk8hWAP5_GW zKL^))Yc%7m?CZOM6r(O0?^Eh`fUW-AkPOwzd$^cnBT$frfYi?Wmg4?vIlq_mkH!9a z^Zyeb+Mh30=5NaHH_69;(g)sOk)$`bbg^(X`UmOXD*3mnarOBh)ieVCrD|jt{+qOz zs+@?VoH)Iwt<4{*8Mi?&|L^0UR1=&qBG=1^DEjae5#LHS#wSfpgeXBc3)VJRJ20fM zV*Dg{w6ViCBil25-J;INtk>=KGmH>eXms6KqEx`VWDw3kGY`mKWE$6|;#*IWq5EB|wMMa3i8ipqBK#aVJ`995cAK*` zJ90BV=gHQxDA}bFadI~SXTjgo=LZaSf>*Pq^e|0 zgJa-7i1tiv_YiwX?vx!W-Ppnsa?2@Lw29VeHK7Gn99TK#d%aJ6OhyKit2^*3gzJca z8=FeluyLU!`wy*<7cVjqh)Al@56$qW^XF3h6s+y z1ctgCizVyxXrM6@6oM$Wco0D*1xN^UTfpJYvLLpFS7U38L^{LlO7RFj&8$of!&PEU z-Iw!3mEY(`6KhFf2HPg^uziBgNc&8DF5Z@HF=)c zoYv`dLoKKbCJcilNr5_zFj<10+RD?`z7bz11}?vxUyyt*h7drKIGU8oCXf*b%RGSR z0&;VQR^iY*iz#c^nqtL;W{8xwAPx3vq>@$>z~9(&aoX8g3`?(hKmk5@?@^1h1X^0Z zve>v}1EO`9)*U16HoD0UW8h0nsouJMT!2pNnhN+{JZxhIB!wd}DMWfoDK; z6@z5paHy3n$UxPqR9sY4e#uk3_>j%$!Ye*m$y2H0o0c(uFYy)@v?U*6)+}+DL^%=F zLta|;PCW?y=?TIG(%D1``;DebUER>DMu<^V=?vAvEp%jzun$u5u~t8caYx{K2WPTI z$kSor;KtZR9~n2c=JqlYOY{D@f1tlu)U)57z}3TS;5__O#{p87Mn>A>)_Yqlas7iY zRHK_f0iFQlf-s~`BM`s%2NW>4^Xj!&Bab9lxhDUUtZt+Y^b1Z=8L-=5FiGl z%lBOai>znzy?w|mW-wNC{9rknk>4H*D{JnHdbnM+{&_Q#+r$z+zuQO?C+*tmSOs=G zdbB_WEpJY~GN#oK!jAvOkwf~%x!&($3dIBR z#_H)=+N~Y*^?3NXFP4_H;H1TCquc6iMjz0ARdU^WKjURTt{lk3{wS8mem*#C4H;Y$ zurk-(F_fAZHb zq2#=wKRl{oGl=5nzVH#4jRN}2iyMue8@oCI zgfE+MZ-FOfpdw2wPI(_Ng7%he!Jy89)5*fqdhNl=n#eX4es-2!O2I)wsjLJ*dBG`d z7NT??zv3hWWDNXOr6@Q6@H=Mx577MIXa?w4RAu`QqnWY2otdTi-@!K0!;+&TF%z`( z^s;m@@?+96!;-SKN|aR8vU^hF6Eu=C^x+djqa*Z9+e!+Ps)N#_vW-fRl4Fvx3{s=2 z9v${Wk^S_!QGr61iZRJTVv>@AwaFcR;d*x8I^@kHzsdUkmGS%xR~ zj2vZtUjCesb9(4o>vJ{JGzR^Z5W=8-doMqn0fz#`RP=|ln30~I6?~nl{0jx&+SIF! z;Yz*d%2(Ny%OCYSOIfV)ZVbN58+Q$^V>98pI)6y9Hte0}8T3g~h z0NaQ=EF3%=c$8yTo*e9K)#!lHjs9`^(pusR$}_z1fl$#5fyoHmAxPtFb5*5um;ryb; zi<-i!UW8EnYXkqq==l@}2VrP0M*zfJk!xr#%5}R7H=+~q-5&Z+P*T$wjAt@Pe;XWYp2;YXKa!38a(pgB)1xBS37aLy~BwV8~nog z(o?Hz9Bc$Kx9C_VOM5xN z8a2(6`7O)`;UgNb*rA~Ybkd{-m0pO=8^ajJ0uUTa8B;s$5J8*a@mBiFWCkVb8 zsY72X({JqeRgY&>R=#;j5e-24WkIanv@hZkp~VkoXmMrMmc>kGbFI@oKTx7#^jyaRzv%Z0iTtd!I3?eZ8*g@$1UMi&5p-+q*7G{ zJj-s#PjRMLjjQ4KSY|f);XzqPZD24#s^S1B-wT$>{J-fUwVTYv3<_XyQ>MgAld0~z z^r}T*W?Tq;`oy;@b3stA_2p3A>^jO!;3Reaos;$(Ol#e}5ngIOx0VlixdlOj)@ZgR>4YAsJoYzOyBeGDp+-3jf<{Lm#% z--t?fZ+!iDE3J}f3ae*EYby~mCcCK25imL^9^}T`)lL#mwnw4d=?O@;diPmU-YD5( zK!6`jPTY4;L#r}6a7xaeIF5pq&l5UNZr0hg8!bcH9Cbm3ES=k6L<0N5k4OGtFNm0}@^vzCNQKBXy+vgJn z^+F;*A=V9A&Xv1C!5!;uic7#g-Z*WR$0!Fb zZp2cf;oFQ7PF;3EU^QC%)9F{gERb2NSsphx2><co*I0fZ*gzyY~=@@D-%Zo?Sy^k%NJQ)!$Ot%N^Ag;y;Z_TTeTTHYfD zlH;!ZKq}o~cB8m!DW2!7b=SP%F_7Fi;gfc+1G)3%MaLo`-N~uTkK*LyjQnVVn{+sZ zw!NPmPLv^!oPyB|t2Xw$D`ypzG|!J8lvdOn>F)@a#)&V<56qDg0v?(8>ie;MrMUZ) zUX4^suXzQpAn5sE^KJngL>OaF@>9X~a&VMlBIo1s%%6DbyzUu4wf)-{q#q-u5bG$l zs^*>IVr{edEyYkESde=uZG;Svkv{u`EUMKWrCze984FzGDQDUEz_b@#K?vvNY6t7M zX#1QE)1gKtK0j?aISlE(AiRuo(%t2zxH~}EGXa6c&r;P+ks=l%fm7gizoSN_1#+|J&~^xqYxXa=cdCq`-Zr6g%3cco}42Zvh$lL*gD^uzxZ7&Fs%FgW*?w6Zfw!Lq<|qR8Cp+-(7>Ql634cBVxykdKAZ*)Kt^* zx)*b}W!Euu)h!V!Qvmi`y%h?_{sn!4F7lw zP0kG#^0G~%ts4%aG*6H!B(YXFWAoukDHc6cyHxlxx;!31Ya=VxEzFg)z5T@YbK9b3 znkxIxQ$J)&+cjo(z}>o*gJbQ@0b~K3qYIoP>1IeVfAj8Ee8!TGFy7IvOzWuN+5j1UEo;sle2Yj5t+b zgV0iydM4zb(ypL4>OtA2Y3G&!au#}NbfsXIMlhWw@nnR4sah&%lw-T!MvJ;KXs3O$ zhqj^i!)Q?bdXYO#NLisJF2%@1MNMe(X2|%SboQrhP@3Y33CDw{yYhCI2VJtA;r6sr zzadlR5ZMw%28*H9A_sd4s8$4cbVH~}e?1`Wd&FL|zJ@5HZr0+XgQHdb3Pn2(#! zqf^AFlHuGUMYu!rPD-96gg$0*dJNAdEl4)K^C%sy0@f#?YRJNeB2zZT?LtBm4_K(n z52kItU^>r*JAZ)fsC2-)(v+T8U&q)FDGUc^}+Eo_($$!=zDPG{;S^j z+l>F*z{P%@CHgA^cQ7=zHZ(W=RhzfB`*&8JtpgJM^|OhP2L7q@1?NMS_p0#Sl~RI& z{pTN;sL@#IO10dXMZ+sgDF-SN24zQ!y}qmVmsH6CfGQnZ7B1WZ>dsdU-emLU%zVn~ zi>aCvTrEj$zlo~jNVdM?8y0c<35&Nl)mVys)ef_{k(R#m>$^T#W-=m!y;=s*O<`zg zf}!F;u+i{O`^l5D0ZgDQ$!t^I@82!Sv_xfQH`!chJXVT~7vbrQW)P|R_PQQ~72>~c zekSt^HKvkgr!j)sBQ5MK;~!yd>yv}h*s;$SekxI1V~{92dJqHMlL<63nu_^`zPemy z`jJ?D!+Ni~yM7Jx+xrch>i1Fr0RX>c|L0nv|8*Asue72hDkvf=N^fiO?^L22J7U!% zfEoO7g9@^C(lJ2@){S9NHv3tna>m!H0fXU6h)OX~s!Lj$yA~&tErwy|^=Tlv+8{%q z_I!LRt9O7ik1EbFaMg|tQF{(Zk65*W)MuPYw<3PUSJjAGFOS{>`I-W|(bsEXNSALM)_tRh zU>nk#!Ymk0Yo9H_7RXuj3lHq^tP3^*m|wGJ#fK3euTbrcafF~0&si9)x-A0Tb`C#* z+2tLct9`*W?z^`9l#X!Ylawm8K5V*{zJaMJ^-Ho zX=?@RujK3OWc-h^`s06XtNecbrwxz4CQJIS$Qs+*I@sHp+POIYO%A{J)c*H{YZCps zng1pSCsVs$dwBn|wf1`%zYm!y%70$YndX??4jW>}0o8Zvnz%_3G4H5M^k1nT#vpkl z*P$sAXoH0I>2yA|(iJ!i2rqj3?P89y_eq(3qv#7dUP3|z0d)!r#9`i##T1TSd$SHK zc*`ak(c(Cj=B#{A@{~asaV5jP{CH1HF(ogHK9#6-V%N-R-hfdWPHAnYMpY*An}35$G_GPNnw;oAJXl$(B6GG}l~IYd3f;y8Q$eHGDK z{VF8TynOp4f+VLRHbm(|XkWLhZL)FFu~$NwyVQy9;<90ly32Ah`1q3KC|JOxi-QBx zONbaXsmnO>^CuLlvDwPbO{0(}(@|0hnKGqZ)1D*bigc?D8DpvBTllFJ5YQd)8{E|b zLlInQO`iE3-j;L(34PsY_UbM}pOAuuGmHdu$6BKfMS|I+<2-=Q;L4;V8y2(;w-p zL7ap5ZO6|Bwu6RWmZCmNG?YMb^P%DoM@BHr`)+{K9bHqzrA+u5?W?fLc2YdQNw#Xv zY<5d+QGV@D3rqe$rvsaM0(X%i+*(eowqC7HfY#9y`r#{g9NAn1R4^STueIE>EsE(V zvFiMJ^9xl22}4V1P?6v(8maH2tz7*IRfTob!!2z!opxr7GGojmoJ8YMyCw!O!K>Hp z^@iY0Q73JBsE?&w<6wyMaN z(-IE#guPysV|0S1cUXtImX_2+v9)VMZ6+S{gE?NnvF?_xsH**Cc>`dV&|*4??`rW=a)ToSIykw(+eua3*RZB38@9oN`us+|7K z?#fvTe5=hMzNU@f+(cV4-^3w5*?8<@7;1`=#ts!oIK(IqnYqF9bYDIfzY3=Pyo@-N zKsFW$C1UC`5eT4iVJy{uFkcE?=R3&^fWHfovFrLUH^7r^Xh$-ivUW(`P_InVpyjCS z*;T;o6?!{8*^c|J&tF8-c&~!<)SS$GiAl)>!-+ zo-u9a&(Z^<&C_sN1X}lswGFz~^tvKk8ZvQY1p+g)9cdPdX{O|NU z0DLmy;nd>1K}yi-%i>=3otWX_N9u^oK$l>-%`PCh!PJ^|j!R7A3=6MYLIxBX`_oy2 z?Z(W-Wy?@UyywzAeYwQoh?mXGK6BJSfwvT@?k3lTfb!^hmY2N=|BjbNQRd-t*?iny z%GqPMyT=^C=vsF0HQUhnTLltm{ng$Wy`i>*E#KR2Uu573v{N&LiO>MLlq1^vC8If= zX5~y3dq;4iR5RygjOQ1353rb*dvjVz=TH_xW#T1z{J`X=`0TS5gdThFTQAOP7>os~ z)*_Ip^^_`=4Siwl(Yd3mLU|SbZrXSpL-pbc!uFrTQ=f|i1Nv#@1CZw2#rIiKn=t}t z#8hBY=qVdCq{GA=lh{nDCNU89`j!@+frlTWJ}-F77KR!xlx;QZPLrg??Pl3`w$}kw z%})vzV@HxqbD8bymO6lc{T$oJsi$-cDz)R{X$Wu|r6384B@a%0)H=qO_(bNJm&yRbE@ z2k(scP;LR^Y5Zya=B73k_cXNG`je zk6ed-C6>Qq5ZNL(GK%3V)mMr zwmoh$n%_fp8Z>1Mjz!W^^6nrFC?q1`1lY3*Xn$Z^@0#h)?DTPm1{w??9a7fQR=MlR z&{oID)lASZ5LAoYCbnyHHJT?X|Gdy$9SL}IH&QImL!Lt+CwPR3J#LI~oFR^=ni;Io zo*>ukjkWJvUCf9D_K835Bm>1zUz(efp~N!-QnOB>NLa{EO*TEa+d}&eIieF8@i_zs zbwn(`clmK*1(Oc7;>Bo7Z_QQhF zQb3a0TTq;nrZFMQtbxX2L4C1fFG#UvI-!~!Ale(?5OW-G#nP)YL`~$3kZ;{{Bsc6@ z1tXuq8c~nPQRiwIaQYh++RZKpo!USW9otW34I)5T<~2g@sb$Tz$#)qKN$&bKzvV) zgoQ7o-w^w;ihLO=&qbmy{u7Y>0rSk3kr?JVwK#5YEy6ttNlsyS&*cP_nXrYgeCl#} zHAf_t5qzehc|uHVmbzYLJSo{`a4X@)J(BRIZEeHkLbHI{5zk`lnotkx@d8h|5I;PI z+cruB+EPa%d6bNtfa_)_kOU3T!N56WJy?H0Fhob^j;5zW!cJM;PT->rIKxj5z3HLk z{Mb57up!bY!DGik#9q9Kftjk>&zFfUe%K`M5TPZ0M!G$NS>=Wa;KnV;1)wY8hD0b6 zaug9;Doo-%fr6QbKw^TKsG?9nlzTPZRAdG*!-aYAW9PF1e2XEdE zz`a5;TN@od@h)!mCAMMczrCLhEhJRdd&f?^U-ll~w#^;s8USNz@q4&jt=~kJY@lXI ze#OR|J}vy_)9jvmxKUF(Iso9`r~YO>MFk_m&){*0JN^ul?v%4v!A6chmbp zNv_IdGYd@3d_6*^{@cSy{Yy>-zXxFFdgE?@zly-OspDg6DO5ioyh5&XkL~3)bMAMKl0bD;<+QLIQz|ijHk8GVR2^UhAD$P76cI*4k*-CuO33!g3RaaMjg zoMR2#Y#<9s%!Fk#TtMmI^`t`>>QhZFa4ON0@@osk?*x_3Ijh5LCQrnk5f$KWC$YDR zmkP?aP`S?x9_x%-cupBiO1SvbA_f^3#tI;kGYu;#?extuiSY@tkHetRGeL}JK!8AA zL25~wIZq9Fjo&8PlaudG09;ZcJjYTi2EiAVKrfrHM+NuAnm7fasz<%YC%ssLY}vACIUVs97fvaWzBms^pn8CEzF7 zX}+_W;Uwa-8L>uTWJci;qRc3H72Ye5e7hCqU&g9JHx6JEW=(Q0@ynP?{RD_ARpudjKUg+pR6*`t%OY_gcVr zq@O8YUsHEPyG;__hCq6>FWSN7^lb^oO^2RtFLnl2gcbZA4v0rhzCSUT-h}y@I`x)u(}qYw=5!2b4eM zHwx#%>#-}DBsj7vqYi##v}fmA%JLViePAaXff?>-w)3;IO*&yVXDv8Pt{3q%aDYMu z)gNO{VY*Z=L|~PWd;)K15q4O;a&tpy!n4op?1TvRkR2#7O$1leVyb)(K;w6_Zv6T{ z$#!B6%JXQJW$U6WZ2aPy$NDu!VIVPZtM1Cq6>R%z`BF=ZZMd;#?#JPW(i5*Y>iJ5d zFPM&rx7U|o%wbh7)NT3UOjI5pS9al`3bqrXd`Ys;(@{}KW0{D+ZKep?+yX`UwjrOF zJAnMDIfGhqqwoeqTtpG7_vN<1>UC^V3rx@^$ds+=oTrG;Y?j7gPs}=ft>G+Y!LX*# zj3|)&d}+S8S5m1=EhhgQAmD9>3~_Q~Eu{QpE6&3$KV(Y=X1&d6Ae?<&!#}H3Z_|p< z*H`DbAT{hZXIrmQ<+dY6hE6u7I%{DIqLQSZ$h1IZrws4N`?fTFn3_xAtyMYPi7(mW zqm?9g4jdZ;Ia9C)3<_BsgS1<W|YmNdNMUX5FfYEbrgdliYo0MDLEZCVRtu+-NN6bV1ocr8lR(S100fR9@B2Yj1#Q*mihraf0}GqC`zZ z7oCa?EzbT|2+)WtJR)fjBI}kWN4tZLeb9O3LyD-&;smN^QH#(+#<2p zp)(g?i8RaGn*GDMl*%Dfc)_4+lw>K&wZ#LQh;FfxdL|w1PLC~l-yJbD zFGC~SnV&}rTEe>D7VTEB#QaPr^0(AEr4=)!xM>;uf^6>|9*A^M`E%FXmnxYzF8c_T7eQCa)XI2!6IM|YQ7G&8NOVgE`=i_V-@wHv&rK}3S{p!4^ zR$@GMTyO^UqoY}%8%ycjX)lhfP?L%yie}~W8-I+JW zjhG{w`@{;Wefc?Pj=TLV+4${6j^Cy4N5B0utNIy2bcsS-%2EBJ}$s9o^&5b3MG&MA?~IgL^bF|~ZO z);ViQU#7B56?ULCLR88;RY96Mn=miwvJtF>o66R)awlh)U5)AYH0;HoS?vQ&aI-V4 z8ZLGyj~={UFSJXpG}%?N3#$U!A)wo&*{}TO3$j;ZBz%^B$HsZ?q_>-_b4O7W8gF2~ zOPYbDcjE@X%EiBJ`LA;tvVUderiRWgrcU~%=H~y`;^R670KoWnS^Njp$07~g*i|*G zjtzZBMvUyDlX||51JWfGVrXimCQ5}WA(lI@AIxfIXO(A5vSn%!rBd3<-%tyovA>}g z1|ov}`c^>kYx*d8`?3C^GY>QO*QN9ZXf-|_zKesK9~URiKiXyc{XZ^_taEZYu7)4& zFJkolj=CubY))gZ3&$g}PR%_pjv09+Zd#R#dRfXMogzuE9KK^vG_wsw;()3v?W)Q~ zv{Tc?PA8nk$+@4L9*{4!@FZuB6r*G!o}mp5ZcHDDTR!!~7W0i~+3NAkjNVI{e`{X) zw1}Av?$YGvXy}PPtlW^Q3P~7xRAON+`Az0TF+H&rx9BD~@fX&5^U#o8ps?nvupi@b zVOz=DJ7QYGo2w1IhF}h7);YYbV*X-aO;v8ypq^^!l?P>MZAevh@@WNU&eGKod1~9~ z(_l!uwWg}P%fXV(I5Gdy;v(Py;k<+QeNSBf^<7{8$3y6qb|+Tn)p*v+&UZO*{`alM zk{zo_&Eg+JUK*sbb}j&kQx^e&Da3qk98IMWD`<;y;CO@CtS z2QT$lK>P&NSb!0uu1vXNLZK>}P5ii05pT~CE~0^41W$UP4}R_y1D}V-#rorV4#B#w zFZ@_dn76udkdofnL%H1Ys+;oa#3wyKbz;;o^3)4~wBR`g*^!Lbw&=F;3h@me$iN#P z_HhvEi%D?e(%z6oOB(YOX&dd@cip80Wq)a3$GTZqicDq)a%N*CUWAX^fh%o$ds-sr zf~mBZ2OwQS$~fxE6WR-io7U{$08_5f<5_JfY3Q%L?cYhq;P44n5Bpqk)p`~E51;_e zId^U1nqIFz$5JXSi7_P1k0~yM+G8GC*L%KkSz-!w3Y`=7X+T#AUTdNBFi+@p;#b7c z@BC25b-9`9)?>bP+wl^32n8!vcjnd|6fm}eYP)rOzEe^Vml zCe;#cStxe(YU@ziy)(HVzkb8+XvUBIiOv~hw5fWS1&>%yEcN*3MNt z)PVa;ZddJ+O~yI_mRW+luXKn?OX%rGI$CcbQ>|GLi`qW@SD)+cmc8PSWyMp(j)X5{ z+6TSay7-0W5nL-1E>T58xt6+bgvflro4eF);b@$AJwb*UpMS8 zK3?W#xC!_?F2;}6TKu7h(y6D@RQmPY^ zX)+J;bWnMgemq7?zYvaJ-?{3NjMmV@znN(1wxguen-JEyZK_!6kbgOMRJ?y3T^fM( zC(>Xgulw>nM{Vtqv7FFjM<>5Kw+f*gW@UwhK`7A&=fmC{!uLbpc>W`<`EYB~0SsqD z=B?zT#E*4OU!k*wTK7k)*cj~T_Qe)r`^q{MxoHGN{en6piY9*aLG)%{n4ACe(wa5n z!)oAV5oR=&`rLRB=(W!w)z1dl_VoR}`eRMZeNj(DgfAlpj4iVxF=lM)7H(}=U*nT$ zzObBE)+}mN#ymThuZsx02EExidQ*f+1gXQNj`0Jv_%e*IV&Sg}*W*Y0oxT&=MqLk2lG{tSm)_*Q=BeqA!cK zF-daCiz$t%s0$2^a?6jqqzf;~5D#%K5$eZN z6@!Lz526yIQ-RZQHnaE%x-%UQCY_*Y96U+v^mBv61|G3EC8%N9G2f?VFaw88c7nPp ziVWt6$f+;bwTIG(RO!<)B?OUp01a|#2;*ao;%>ukD-+D9E-1#R2&4$k7%GLB;(!Tg z7?@&;*E5_>PXZ9(v<8+Ya8{Dzs;0ET7b_|o(2cx+s{PM!Q{9fFqJ^@9l!8Lpr|NAldr*y9^cSXBZ60z%;OukLUIEu6oo`q zgXENB3sf1)e3H8%IiOZb&wB{&vR*ntS%H-^tj~3jo2WiP%43^v@i!=_Z;o<(p78Y) z0Cx$7J^maF1QT*ElAR$Y8tg#)T^M^cM1~lqCR7WiQY0)M5m(ocRSEcpGD`u3rvcl! z!_~(>Z(6hB3y&Pcv4I@*((BTdKVIeNfbRexUVK$GM5%EO-QB#TM%|yfZIA) ztTBs)$+09FDC;H-(nu&?bFa%21!Vy?WQ=|xMN9vJ(uJ7uQyd(!3bkfvZb2#T0Nrjn z=sPm4hPCf9^qFDz`fTtOiLj0#GA?&PzJxZY-CLYs8H*2hI1`uwlvfT{%xRGroaS&5 zs*YAo1RHyxGi(7=IXpjNnD`_S*_Q-jS(*5sN*v)(+1*{2pU}WTgsqGz9;r})Zm`1! z^TR+h&_SdGTEbNw^cCQZiwpyM!NMG5T?ywU06n@#wTfxf*p@hAjxYdLd97NuM?qYo z2-8kWk}<`;L5O7v@OuPp3QawoP}-VM&#NR>D%`Tg;{zM+r-fFP)+pDe!19smIvxPQ@|AzQC2>a&i_8K0aiB z>IWJ0Wo;?;ryIb5a@~JP)#SOe4b|&*J_u4hc*b~jmKl)z;G&;(x*6|zA|H!;oQT?sbw({~@s6?>q08@bnF zqdqwc9PK=`*z#Tu|6TZ@4|sb2t8?v=&KHCyy?O?mjknis>*_8f7YtdwIoXXYqSky<*Y?W^1G zRHP2{%B@^nyO$Jg*q#!Q$oos!lgP$yZ&4PxI#zPXjnFtIdyQq^r`wz%bp+UG)#xI; zKO-yw>C&DV+-!4Yn$H7J7>`}YEqt>I&icp3BK7~6eiPiS9o_turv1i{f1akH{(`rJ z{|a4N+F82%_n7FvNXLTXWUYG{VM8w7(8wupLT2u25QMxg4)aQMzZ_eXX$`o&GJzL- z_{s?n45O1XVjj(rv|n?OUJt@(T1Ax7H5}qNsN4&P;R_Re>yw`%RhTzEaycGkQ9f?I zMd)&$6XZb^!l%PJ|DlQ*c#COs{nR$n$F26++0-vO#AFu8SF*S-7KVug18ArCqLwUd zu*Kjm!csD8!`K}!!pYM5}+ zYt`KSSTB&(i6uFm9b_Pvy}z1dfmNHg8vg?91~ZYJmVg9js*rHMH3;C>ugMDIqs2#S z{`sTMuGK8ry!%FXBL5lqcg~Opa(D{{1OWUN>|f^$e=(se!|=Ne!sgc~u+1N%!1{&` zmjB0|g}z@ccK@q@5B;(mdn)wk_fkeQ0r?W6@ONX!TkO$sCMHr`GvXX-!~LA`xybnF!UxQR0pi@hVc3Vg^* z|9E-uAN5Eh=Mg9Q6cfQg&{fTpos0H!Ffs7c_8pVnHtB@rr!8roSSKzWrOZn{`NWRS zRb|{5q_GfvF%~GqoCFRr=S-OJAx882ciQ2S`xsKZcm*C7?fxINhNFFTda+{l;w)cy zzaA7MPfR)@bW2x`<-aAtfx=b5GKjI`MN$+8Va^sQMk1}~md5&KYkO@yvp1mw%Us3BC(Cu(Ui|OT%a~evb zB6OimSj;0#(&C{pO(E}JXaCG);V$lRDCK5{au|>rzhbYQYE(oGKTa(2HS2hexx3_p& z@lxT%1zR=iE05%LFb{e_RsW2crvPS&<@8rN>H>(KpKLSSdzQsN^pI(jzC%_+T~Aq= z8X8l%_!v5{g0JrPpq5HElg1Aa;R8tx=FuCN-tV3c3UwG;_l`r;D|C^z`9&&jgQ1V% zgZLB)Cg>S2)oZ)}sfdV$fN>mt4$74joLt>=8U(O5ck8XNN_}BCw_oe#F;{RqdK_d< z2}l;jg*Ze(oMgDZ63@usRlTncTfG+|pUXQk(=-P`EZq={r3 zyG&L~kGdc_`7E~zO7BcOwPvFAHJ^7J0rjP0B&|4F2?U20l&zTnEf$;2SW8G3zn_)gDmF+e5!)kpw&E7Zltu_uoA zc-rX64?-sXc|1QT25Lf8FE^8Y3a&Bwnzb~pm&a6GmnT|t;M36VqiIo) z5$JNI;3qG?NW&(#1Q6Lta@11UrTH2=&yF|R;Zi^NHGXo=DZ*5ZDFPVMIppvC8VisL zODCB{@0?UB%_3V1;!^x{u*zVrrBxud3o(;E&6%k(XU?VFA?KT6slgSK??^g9)cnJ_ zvA1Bw+|3hha25~r_8t#9)ofle!r|-N6gM$kn_UFD4d|zW9qbW;(p)C*jnr9b#?CRO#lBr~<(h4Wy zQenVRzZc|5Xi6@Za(&YuL0j%8%|kzq`BnInCwc)5r@H5Gg?g>JVxyQDM^5NIdAET; z&WG@URZp;l#b@N%&wauNW`Y5tw$$>IP3YT;I9w%eum^*o&w$R>WBMa`l9^S}Ai4+S zvA1iZ%2pF9v;=ikvl)lsY0VY3MnnyBLf4svx<;M4GkLs`dX8bkuCG|z*Wt1SbhS_z zE4U3UYSo-kBNlik5P;fAx=p~h8qc3FW1JIbS}3(@*`=~2r6h&p%Is54CN6BG`EWn&RM)e2 zX8C>GEw#B*Y;^E>Uabse9&phhlo0DUY=#!DmX&49 zn*tYBt(ueO6c+$QZF=ayGMl-=J2DhN{bmXR-(s}Z?z%vS9G9%XC+}CnK~L7;r_YhJ zZjd`l?do3l)<1p+`(mm3Tj*cYHNS)HpX00F|JU*9U*W5N3d0Uge}w+O5s9M{6|H+1 zQG+*bXoPaKDDQL~Yr6442TX8IIhz(T=+<2%sUvPXFG5_H*HpX+q>$x0oSj9)#BT@U{ zojO38=Tygo%WV7Qqm;26D!UiUAQz@hsPJeTb9;%kBE-l!I{{g>F{2bHe(3cFcMxPW z)Qb{9$y0Ec?lRUz3qtL-MPr`3LW^;h3@R`)emmuq5gfTieJ4mG)<`5KDIY?V9;3IS zbZdjp7iHDht4SrhI9{xsks0Yh)~M`6n$!IJ9|JWznD?WYgsnuiinerDN@|k5#7V8^ zXjNX-dS1NFq6NDKu+)_HafN8stng@s#;pPJ>pN>tg76hv3LII2axQ~dUISTBE!Q020>uNeM9bHCO2*J$ov zR)GHt$r=BeoA^IMxdJc%;4lB7;t#<153u+Li@%BE`jiA?W_~q}AE2ff#7hj;=U8Au z{j3TT#i0Erwd3fA!(4{N{r%qEplYudsE_6QT&ts8yB2jH(%3S4D4vcEZP z<02DEr8dT8jKM%sqHonV?U9`dEG*ei`@R3zM}IywEFY3Av>;azrIaOnwA9W_1Skap z7UR9=+JUIchonIZh>Nemdq};%1F7y-I88b4q6y_9z=ja7zxxDy#8BP#fxB?6ejAAl z{xNVzBAvoEf%LMa81K4S=*S@abx4YE8qg*^VFb0+#)gnK{WA+r%*UL1 zhAdqc@v92G6ju=r$G#1LGGTE7M>}01BqeX((dilJa&{85C;y#6h>zCeA|*_$^)5-B zn~eyEW}VA)p?*AW1uGu}cN36EZHTj5<0X`4-2wL|l1;T9ql?gb7W3vBgmsS9b`7^r zpNiLtZ&Mq8fxc$FXw5}3{pfuom|(4J^P1h^CX0y_!Ng@asO;#=qFC0j3xDd53rha0 zre>yshLZ-xK7Y$ruIqo9-9M%R z_5We)f5UsNX=ulyilX{$=qtL+7Y;A>-ce9wvoQ%#Z*Le9PVn{cjWD>fYDM72KEE3_P`pyq zgw;^D41K=H)Pohuh}|??oO2-Rn$-C68K0Il9>m-pO}l25*mYKcXvoMu7#|t#-E}0p z^14q5!E5l$QDy;{{;}n5(b>8H2hJD!Dd{Uyienn$hHIdP0(xQ%Ow}W$L^gQ@GCxe& zd>qEdOxz5W#eA)lK&u--KuomXNMvC;2j_w=P>WZQGTuw5>{2+O}=mwr$(CZQIUD+nF!V z>3H|u*YWkaU-#V+`@bDO#9njGvE~?aEZVIop`0aEE>s9NsE9lZNS@^M@%ys5BD8*D z*qW&X9@Hv%T0oyn>p)*_8y|=`j3s`G6L;OE;2gVWc{lAE$9{Xm+=4(IR%*WsWWKQF zJfntJAOxhAa>1885Y4pm7=x4YNZ1n8i9AB!GTQW`EzFoz39+> zF{uSmh?GX2$8efsO2_T|B6z99UaoL#bV)kg3xT7dG_`^=QY9E7@S-;gJz(Qn_7_(=}i=5 z^o4=LNr5L4hdO{#P`PsLy`TzCa-%i2 z8jsr;48NNV5Je@BCSs^RUV;>}ywou5Ai!6q{Z&>kXlKi-;7>kR+k!c$eVBNkx^v3P zL-8jhP;35k9}q3;1lc~*A>|EUU28*Oo}di%Yz0mDf}0s<1DCAwcWHjY5A#6p)EW$^ zL(s&}=qD#U3z+I{oJ|+D*W1rW_@`iXRth+m+vj@Y^lSyD91Q+(jaK$|ck{QQ&5KCw zW>zn3uLppW-RprIVME+y_I52@5k)Dj5cg0{OpA6u{}pjU1Spyy6qNu7vSx_eTaiSC z!(?7otrR|eI!c1w#Wu(G8(=Ab+2sL)iJC{CYFWxaApus^BKPO82FWs^Kb>?13K!*~ z>V!Z^BV!HK7DvzWR+l}iO1n|xoGO?6nQ(UJoH}DA9r(C-($*P3kasW{pqJXgLsZUc zIUMtU>L^&7%A4C{CN#{Xrz_N2Bmy2?sul?679LeZDN~!6ZPv~K04Ub^ij@Ty7>8yk zogNc=OTcl8tKvFqT@LK5v2QC}n&ADWQV72ACXCV^kMz+H3Ab+MJ-bG^2MJ&0o4}-AeV8)g6R}e10g6dGryzGJrBvXQvRw#s+EMVjts*@3g8nLM zK&#p?UZ0Ay8*pwhoknQ6Q3#jcXxHKAr5=;P7Uc!R?;f2}LTcA6)lp$~F<}G*t`6lP zdspD5m|vq&LR(2Ab0rf-E6f{uuc~tPBRJkL?$FlKS!^EiOzP*${dkeJSfi*iC5z|N zKePkh8WHSTin+8)&bT8wDF}^m2EYq5VSlOpssLCA%3JG+s7x-sM{QsAmvHIsGQ>#m z%A$|iM_>9X&zP^~+3uOojtW>_BJgP3PN@BrVJ*hPele`Cb$amFaXS(2K)`Q#ZBrSh zHDdcR_zwTqK2Lt%tmN$*Ed8~*{`I=s`0ld*qe|m{-v<0QR2q|tlUDP*f6a)Y&H7XS zp5m50&HV#d8WP6Ou8>%#DZN)XW!2DbRU+37z|YUW7Xm^nW2GT8INlIAtkcmhb-p5c z3c4$>mzlYJm5v$B&IN9JB=O@f)E7RnR~nKCw^NhKa9Ze-x} zoo~FXCjrJT5O4r$fjjr@+1cXc^t3!EIY+DK)8W&@!^PrTyLGmi16P_Y;<##q;BAlU zIXOvU)oa795y~oc$S)bYK4uW828rohDThp&BmhoIwZ0~S8g{}}f-RD=r%2&z03^xm=GTI|P)8aODmeS zp9d1_%y9~$?A&u-AQqc4``7{*+HO*AMP~lfpk3nV-`Q5GG-M;dnD9exqi+2`mp+}D z`8<_+cbPlf1*fqClej`f%e z3F((A0Z+cW*y(}ycYJ|E{IGm$y8R|l{)(!99dG^LU6+64t^Un@aHgW9IWiwc*Htyf zQv>w4U^VP-vrZIqSj7{9fSSuL$tDYBvio$biQkuf}gSt_uCGZUO`vq z!gcAAX*)Pht55r`zm8R-8B0eXT~EL)lG}M87zon^d+NRLdl*cqB?>H~p-UcS!tg}r ztFT-3iCgyY;Gc4lMHC&UA1qHDbDIGO?G&3&^12(BM(#~L8g%H$3QSj-bbRZO#`}5h z6navpj$B-%uYEym5$Lkvo0vmR+{fgqPJHYjx|#xPf}?~y;vg*T^bojA2l)0v5TADG zK%`}@sbM4p^%u+zUhg&EAKO8We#W6h!|jlh=KGL~Hqua*=E^rEt+1);y|&1rz!hVb zSm8Gd4iiXLpD}>t3Xm0+Bv7~S6iC~MR7^m)9|d~;C@{QaYFdB#fqUL4>Apokseik# z&h_c|aZ1?rE;DN`gL^^qEg#?AXW{9{>OOw-v9LmlxBcOS=hKrD%_oL4RkZ~VmN%qI zy4nk9b*F{m2V^gcRG)eeyh)3T(638})hf`5iGunN=ykd!6EV&SSU)pWg%uTXs12l` zUGqI9y8Wq|f?}hf68Zd)JbGv-;3H+d>eN6lXf)Tej<0Mv*71R*9#4Div0R^*o+zd3 zNXbDT=s+>`Dm70OrN07;Qh=U9%HPYbmm=pff+7kE$)13qR*uc#YK!)*eSH0(@M6r$ z$o?*RMrt0zalZ>%EkU2Jo<9}`rv+IwOBlK#Y*3#uT`sd5=~0&=5$zTd(5t3-hW4v( z#^;~+qGM3*D=HL?fpUYPaFDwzxkLc z$7ha8kMJEf5bTD!tDVgY{%d|Rrny^|S`2SmVp>Q)SDWBZMWrdopzsuAdcP?^R|Gz> zuLw`gufWyGxu>kPa9p~KgGAjU{G*xD#7MBVy*sizb8YqB2Q|gq#@ufoNgZN*9oL;F`98-{NE=lS5Oe{R zywC@!y=24Mi^o01x0k`gN1{Cr86$KEGAD$HK|Yj&nv~+!CK$i zLfih^M%wa!+SuIqhEx9tnr!U;|F`)!lX{|jZ&do<+HjgR|JagzEmg}x#YHj7Lj;nw zM}*&+v@pGuwWXHd5c=JH7!1iTuW}3!hViO%cT%D%(eXgUWxk+*e(h9aJb}!nfXI2E zr&T-f zP|#h}#|+S!r0}%{;x->@=ZOYwW*B}KG+Kld1F*X;Zi-~KjkU5+2Lz-$*$GR?L)UZp z&(RSbQ8y?iq9LRBdjMM%BG%tRVl>nR=zKJVJQh72Avj&8cgQe%nWo03tt^lAd(%i& z^D9lJ4Yu0v*4x#1RkA9yX`U}osjw~8;j47#Po6Cq z1oMdRH%Ik+v$XnV)_ePjQ!$+Q6-?3s=)u8Jf?fE%S&FtJ#nh97T$MY5YS35gZ(FqH zfb2AT_FsGDYnDa~FmlDCklI<#!@cPWB_|7?fgKDCmGqKNg4wr%a)}m}VidePxBx{!}pQ_?|pjA%ch%{@9d9xu{_zF%oy6F&GetSHYnV zlR_W~3Iu@^iKY{cSnwPLEh!#KS=$LYd}s!=_YIYCwT8v}6|En3LDthXB{V_g=m;x9 zvSZ?(uqF!{aZYA^jmaN4D?f@MfEN?viiqLB}YczsBPoNe2iKLK*Sulb3}7Ucui%I zNSG=>!pRV#RS7CPl2RM0m=WWmveSA$MJSDOI+jh?G)lNhU_mx>C`yIJ05&S*{xk_n zkjF+h0J+vrl~79+yT;-k$t^aOn{h}Ug||Ifce^)wyqvZF`11Ik*dIsVrpoTtdieA! zb#Sxua7i9DMQZ9OYuhnZ#Lmovf>TsGfiXbxp2J41;0jmQX~Ao(;NVH{34Fe;b>%5l zR87L2KqQn$P6*Mn2*h_x^GmQzChje`fM^2(q5s(-K|OK?uxKs|d_PV5i&ncMOs$2u z6s;wA?EQKV+l5OM8oT`skYiD8B!>R691|*ZAX~#*K;I1aoScOag4 z%<9_FTq?Jtfg@XA#>-Y1fCXQiUplKc*!VZ=6R5YFX?fX{=tJ`va_CH{7z#3SPh`)s zB>{$6&S?K1J6smw<)DX(-hAw6aEF!cG0rI?-eZz!9o}3M`^e(lyNHdopRD{_t9+tI zrKE>a`$q*_$5`zL?_l`p!T=2JM-ond+KMvFY|w-`1*ra@njbfA8brQF=~|eidZ}cu zRXTUnbqYc20%Bt;K8-e>0l&8M>Ai4eFnd_uq|~0Lk{1NtUHUT%d3evEegbqca0=Sxn_cM)o|o z$9vM$Yp#zd0F9p;C%c6zNSui&)SV*EGGDRx(t~Na#;$Y6=_r~|&83u@3$*lW&9w6Z z!_;!m9&*qBX(YwK>*n`{mP2e}m^>ge@Tm-63|9K546~VIOYgx_ph(oFOKQ@y#fFBR z@~YbM4|DqI!fejwS=P@+ zjS}69(XLUI6n9123TPjJELidiw~EdlCMFP>#Jq~**Ib9N2X952Y!+`LmDq{}RB+_i zZc_}N2JAwxt*GlMukqt2OO83Y_T8oZU<{c}-*%)?J77F^$PtL8 z%9x(7%^L;md4n9IEkHmN$1Cu_3klyF>%M$;U}E#hT%70v&`u&}PP=wl5L&tpT}FV5 zmum%dpl0!(4VO?O?UUtJo)u{*d)?ah$rZ4Ma51tG6C6m3?WKtAO zp!NyB=;do?YSTYzS~N{*Y5_ZuJHoEoK5sDMn`GQ!31U{FX^+}Z=5AIqdcAojonUjY zuA*nm;?I|>(>d%6zelW4?Jk{v+I(J5(oJ^^!HMV4y)g1&*9*&vql_2r)gM(YtPMC> zlunUg0~KV$)`efxX%{SHa`=d2jRq za1T9e&_oV$!WgPVr0#_>BUESX0BtYZ84SSXah}b@p!Y>a(Oavr?6^JBj_PTkPqxVE zRIV7POA+y7zK#lXj^K7kE_2f8(CrvyEkE~)m2J0}CyUA|Em^FsxB*05QOaJMy`gOH zD>UH})#sh{!mb~wqp@+!vU#}vf&PNKOo|`MhHSWARBcEEyQ&0*7HqgS{QFn&dQ3P~ z2WTw37BYdhr2GyPK)lXia(PxVfk|6Q6r`IFi&$1bh|s#AP^5VR!V$HX9$dw2!Lf~D zlqeU}8G0Co+Ll5IB5^xEv@(ZqPl9krrndLTA}fi50dsV0St*-ax#+eS;Vv6BHics( zJqaEd?5Rqr=d&5^OHJV;3#jc((RST}poU#+vgU4pQiQ-zhwf`i5|t2jrk|gCSER-? zNd71qrq?G{Dv1_$D+=9dhcUQurc@Ap<4?w8XU$Y(u5=(=QzdBpJez|Ry+{}` z8yJLXrI@;t+_N&ydYtxHEB{iLtBcFB$VemW-v{XzeB-t8a(vqi-W^=5tRLS!{K2w3 z1zP-Vee%3LSNh8l>)QKztFuzQxbHC0<`70F=(q|@dCGc|2fM<`BKyVkZ0^_3u?ylq z-`D-*2aH`WFHeuI4lY)TXQ8U5#tfi=`yj{~`~8_nkr z;%i~!Xy5+R;aR_*h>8@b6SjxtKh2L5E2EYCv9I75Bv3cE_sIqw#{r zoBgJL)ItE#>xF=IxD5wM4Ae5RV=J?Q<#)@AU%z{56=sac;b& zEeT;Xz0bY-A~@8~;)W&7{2DBDjkhNrIwO!j!-BQz}Nm8bGBl7G7jUGi8xC2T_^F zrty@6x_%xDhHY;QyeXHE;|LaP++{8Ygn7xm2@zlQ#xL`vq{i=Ue;^?t_^kRDkJMyC zkHW$a+FYYS*hPMCj}#?~6$%gKDKqX|JM7yzk9Ehj7^%rnrVU%BtCRwD1VOn z&3jJ|bza_VPAS=eQo28fU2odEDHw?tMKdzG$Vc~YAp*g+!soJ3p32$bG$V6GdnR!IvcZQU%`{k}zhF49kO`m8!NIW2|9 zLL{$>`3Srl=&R1bTCvr7ZJfY{WqjMC)SdTke9+NnI%iG8t2`fy$2m85hwE9l29X7R zq03bX#lQw&&N2|9?i(U?lIO+AmD4T9&`i76^IJN*(;vHs>g=!RdEf<(>e<_nQ(4en zt>EU=9UUOi3w$tqZzl?J-a#?VX<4KTFb08KjA5Pton|`^Wdx&n32q!wO3K|(zrG+H z5Vcym?f*#BcqAtoO0&@L=_Wp2YLYk58uC;UI#&*q*!Hljg@6?=vzOYmdB=(bsaE4W zK~h{-NA?>{Eq&n>O5z-n@a=Ffu%V{G9FQPXFet2G|2DRW(;y`Bbrw06w8`uOEr@d( zqaFq)*_~j16uQPX*q>ov5>OE=N!mNYwBTxyR-O&nCz3HB-k4ZVb7DI_{=fN!dj#-i!Utr+O&Y5SI1B-tFUH;ZTIbIEzK^HXXmh* z2!9I!p!M1P>Jarbb8w4uz?{bfYbWXB^eR<|-$XOTPqBN40E_D|h&$b9fsKA+=B+mZ zhlI%*qFdG9s5{n#-}KMW%0CtZM{(nkx_yG?vjcZ11l;S}3HINGC zv}@i(MTE_hk=x6FX`fYVDNYpe;;g2*g0~VK3xS*K1DUD$(mPS z9D)Yb6%d8MppArPQW1vdghKRd+W?zfJs6P5R5xGebGGTzAKZI#gAYksrg6wS_o|9Vo9kFdT++aOKR}5K!!hL*nvfT3MK}Y$gehzP~kc<#IzR?R^256W5r8Yv~DN5$iNWn{>(fmt}z(Mt|R*7iI&srN-er-<`&7uD%w7u z;D4Q=m>+U(K5vKU1?T8@_@d}cwQUrh8yG^c)HG5d<{pP$W?B9PiRZx|y|I`?M5oRQsD8m*I@-4xm8xi? zoSop|I{#MGpMFBb$101tVkEnY+qe79YiMEf3au5!L>%CR+YF$2Lk~TbQf!3mSNlk^ zVRy0Z5yudf9!AYf`tz!c+-*~Iw{Ly*ugv^MT}?RlihH$J{?kcTdV)4_GE;SM6u?)P zn?c(beb>_IQPp5Ut%q@zhSckG=U(q$idhy^lpTe=;7IgNiIa`$4WYmR#>PYS{36Ao z6gu{np2tJKO9A>8z+Dy^;-Fm|4Bw7XOMOD=_>B?psjmhgW6Mq}|jGI9h&it&m~L-|!-jd_*uurnQm9%Nl)7W}g^6xP;YD z^RymZ!q(PEfJ~bigq_p#4-xKq5A7SQ6u$dQ?|u)mf%a^yyR{4lv<|9!r?8zGGv!_Z z@`lPqRLz?{?e#OAQo09O#&7eY&@)hsez0@-Z=U>W%P+i@BMls-z@C?FJ+86N3Z=`n z68qR8hzoLjun2f@gFXz^P5amcQPesr+HayvPE^k6;J$o@TR2WP7hm6|kOyhftR8q7mm~SAejl>*@c|_J=X=EWjKDdHN$#eT@0Q2|KDN;n>Iz1}6F~E{UT+&v|os zYFAs@!`~Z+Pm}udsL#_y`f7{VjpIf-Z$b@r^*O^3o>8T(RDjkkTv+8DS24%L?<5KO zGu{)Rot*v)hpJ>?ASlr@KR73)%{;rkWDB7<@vj|@06kkQ zH`OAGGGb}brt3UdP+AU)7%=+biSxB4=|{Dqke0Jxm_S3EtBGl+e<1denI$AHUR7U3 zxIO&Djo^>!;YLWWrg-VJO^ag@jzU_;XXt z&%016Y3Dg#ooFf6l`AVV6ZeVzrtK~NP8bBJH@oOj>@4WBU|rTarIHEjg26g$wM?$` z-mO!rIDQq8rIN%8I+TW3sM>6yrC0*f!|GyNZG&42&Yl*M1uIgnEU$v5_H@`iYSo0@ zs9{@!Su|HBK^ynsXquK<@lONp!fBTvVE?IilHNnigdF7~T zfKA1Xa3S>ScO8p+gS*hvooxG%Q7K7Ll4s?#hMzb}tc9W0<1|(J6PQs*4@G98CSo$3 zlzTSO)$#pzJFgpwio$gx z#3~@ZW~mDfv&1Ldb#SL;-H^N5C71cVke zU;iveu)#Qh2xc3+zL$ZtEIaxeI5;>tGv>u^BqKjT&E9SeZVmH&bl=bBu@oBPr!4N) zpde9iV*(r97$P49p5ZNges-CzVX;@hFD&N?_visVD}#^wavXN%h_MF-G4ct zK=eONw)Rf{$7E}nz-_<&J;uR6hIsGhHWMNWX1j@L@tgin&bgFS?%pKMNkO1|{0#J9e0*#IB1;aSSafEO& zQQgc^exb<%J1KHFVT%*zkO{w7z=R2~5pV&u(!5NbtoX#F{F8{QElMLm23sY)Vh`!^ zK(k-2=P0u&3sFRyEW|F0IvU?a-bjIh1bLuE2{SL`hVch^wj+Zz{{alE$!UhOV;jvi zu|pkBJ#5ds&l&>nV^#rfbz|hpwKx*eOy{k<#F zUm(!1JW=1g6C)>25YeB%;!{PPUIMhlk{W4St_?W3MgU^=@$FZv(O){|*x zR`Y#}OX($uS7HD>xq0dE&bux`Ql{8lFY{C8Cq2GaKKl{nnV2M?egwwRGRjU_gL9%t z$DqQ6nDsE{KCy8qN@%>AXzX9ng;C=f2ib`dmT|PVn+OA0;bPdgS`BY#?&XJn3JNLo zfv_+<%^D?Jyv8s$Rm8k?eDT)G!R)dkI;DxeD z;kZsIF^Tfq7tmr+XUzK=oD&HM%WclW25hWs1@NF%dm6+}pOFk`OBMug@h&mvHI6ba zT6Cyo5$hV=yi8@o$Ev2(LMMg_$TVUCZ4Cht5jFA%mX-s5NG&AW>vLCAIHEW}DeIW% z-DS=Qn znKO^NqS&8q>*T@`CTu5KYEJ;Q%XS-{qE5u&Sgt$Q;FwC^8-`3WZ~7M>Hh(Gq(Ehl& zDb}{q{&c)+>KN@AN+AjF`{>A^-8HO?oxY#(pOVYt_wS!0poaFv`*5RCVYKsF^HBr*Y~q5l@Fz|XM?#Cn zV0GOp{10DWgO%PI$0JC~=%j}&(unheIRFs3HC|mMbew3VYCR77vWc1-7j~S7gx^PUv78%j)m4OMT`hixyVT* z$0F5nMrrK}Ya6zVe`0=HfUkT1y+@Iy34z@E7IyuWNB(t&nIigcW*8?^L+5|Xlk-qb zUH)7D;&rTSau4Tqg)!|Qw?-!rPukB(bPh^65=T@iFn{V#&bFdqAy4CoBLyXtF2Z|{Obn2ZEnnoYP_z-FjxX}8lb$sefwo<)q1+>Fc2T*2m^wQg-#;4b%bdg zzOE(q5mx4V$O#Za)l2Q$E62^=$CK}cT_`TdG$|Vi3=@&g;lp*Ys5TI01hQsnk@mV_ z`fPTMN`e~Pgcr2;X=bg!lqL((cggi9N-N}XCS#jfC~`+ zd+Eu|R-I#Pu-qUcTW0 zF6-xw2|()dnYIa2`Gxu~$>I$S}D6YoJLT6dm)v*AMPLI=GG zyPsw$NsG&S>%fxn^QSakV*mA)>kfPve@JA&n%i{`U57K?H9r7X z{Mw#(z+_OCXf{+=Vv8!2n(?ddc?PpoPerCj!@d~L`Y<+xSS9(WeHjhT8dAZ51YY6x z=sKk9Sq53IzSu>Wl7`1so(j(3S4@6zrTAhMdDF_zwGnP|bhCxHePd@c>o7FTxzMd; zr>&^zT(V@DCw(@jsd4q6;{019wou3nJg%hPvjp6RVETux$iEUL3^uYW?8U z;uP{V)V6()_b4kTvh|~3F%3%uvsJQ}P|>^5E!G^;*9Mf9I{E-m?V?b4WN-$B^yh7l zJcaH_*IxY9dAZlr=z zqyp!Ftoebk9e%P`qnM}q&`-$B!okDv_&i=Mlx1d{^?Z4{UoAW=L`IS-?0!dF~@z(mq9$0LYz+Bhy$fAM0LBpTSk^E8i(xk&?J( zE}=Tl>>UODk{O#wSbH!*LxG)xR$G&^8`K60@$e{gptKcPqrW`7n-Uw{L_IxXC+3Sn zCxNUp2d5HgCXM3LGt`dr*+sTXRp`n~&MMBtFx+DPOXzrJD{9H`l-04TAcI6i`_@`m zn~80qkf!X9odOD0$9KAp-F`GL}yjH~d1a?&!C%xzWxutdXx9ys1U4uBnZR^&_Hokgo z2-i!}0;?G*(r#miXka*r{nsoxE4YL{zx9CrT!d#7g>Zgi5AD>d^Gd~|rMI5@0e}2{ zec21}eJ_SY?2PT<%6tNZpm9DlC`KR@(gvY6x71Q}vF5>Zfqimj5mV54Ta@-0!ZEBj z?vkHsfs3TtjZdJTp;kN5&4cUU%-!MCx)4Lh&~U z{i_)Ke`SKnLq_#4E%4tTIRJp4|589CrE4Rg>!56E#cyrxAYyH8PGewU@pt!1!2;g+ z|NZ`_v%4-lU|r;g6Hi2vEOe=eLw;L)68eQqX4g^!fdMDgND2vp>002wkMbwgVynv) zQqqx&N`SyVRyJ8QZO+iFlO#x*q+ial{0cfKWFTD$$OaHa7MZI|FS>Bdkj&@^05HvW zo|;Ic#!i1fU%u*m@>I0DN@ce{nn-0do?>T=BUf)uCPw5}xE|08Xh8a`jiJ4fMPT^T zq@O<`Pc$WErMNOJRaH_6jr9Szo#a#Ad*bBU$Wdyql_n)AY~jt`OsA8;v8*E#z!skfona45byzmZAG@qZdQ5W3s9sffI)fQRKb8pLrGmWV!a0mV<53nYzz^V9)X!Z-u? z0^kOc;P_Z>^6N4}3FUw-Ui8Tudwv$-Zmy#`f@e@aK-O5tIpRBY9+b@Dt>YsOeocCg zVOR(8k?mjS0{vHp^C6G%9xIy1Vh-U-d<8!J4Cjn?}Y ztE^4Rb&t#)n%OH`9lZs`lTPtQ4_M}bj*X76_alwr*77%LFJkpNx9feh!xptsB%t_0SQs!VaG{J^+{gOo7U&ACx_16c-F-lK>hT zkcKV%VlK5!_B5I=0g)}A+x6<6Mmq%KWU{%=2nFu#7se@}xCam?XRqKvZS-uc)2z$^ z_~zxzlpyq5Mrz_3Sx~OF&!8YLZoV6Z(StJBR8yod5ATp>8CVh=l{LjoSJJ*x>WuUZ z?6~N&vDs+0uc>mCmvZo)EmrEBCoL#nm1$$~clxQK5e$95Zp=f(JuG#{w9E~NrB-?F zWTOu5C(PQ0NkbJ_kkIQH#ut}~Kw^jZApAujZd?&J)hP@R7^ zM=3*mmV4=nRDULi+Da{RBwpfVcd2pTY^}v)wO@il^8r?5h0ILm@(ehbT;U5Hf{Ijh z)Flr|fk-&u`W;|OjHX31>vZ9swaFc6rzDqf`j3&AHc})#?$R_t8SGYt3RYAZnP$)j zDcvZcvm&QcV^cP6qo*`x3;sQ977WiJLkcZ`CIt`GS9-cUL`8yQVBE|Li|`6P_X4>s zk|74!y6|OLz&+tdOjm^lvlAFlPns%xwUw&%2c(H9yiz%t*`i`bpUc=j&)P0+hbrDgnAwASnDwVz39!j!>O1|=x6ev@dP6fv%u@%-RkEgZ*?M$!=?n8B9>v&YXhuTHAo3K*{$MbLRV>hQIBxDV> z{G4?v+jv*tdpO|TUQTEPZOpQ3Tya85rX~Sq4*7|5;QKaCf2veZF5`pF-l7E_KTxmU z-gCN`&gY0e$%DWJqD#Dc!svWiY*_qVw%LiVnD>#4=Fr_i;s*3@ulNXAc(0z22704t8sMCjV4^dWv`iPJAnh7X;L0;6zqMla6H5(Y*YbQ@YjK?nw<6t{3R%1^PH*=bz^p0Sp zNfCJ-QgmnUL9kmQaC+_d-W7Li|^7HyNMRg4UTfr;UimNDm9@N!eU#K=HX#`M>xl7k-oyU$$|!JQ`x}a&0UH_V8|0_cp|lYF=W}ZeZmGZ& zc^eZ?arV%0gY6##dp|N6T5E$0-1Cgz+x}Guzp7LRwImQ}pqu?9f_qO2>uM*|N~#?4 zvTs-|glpdN=n!8aSEO4&Ju6GIXIfG2hLbPycBRM?Lw*um`hTC@1N?EWwo$E!A3JCo z-pNhYls_3-9KBmhV&pP3VBtz5G|d%bg7Q=wXQ1Oky@`v=WD@qrz(S^5CTs__XJG1y zY;rar0N^o2Q(0=8G1xI>r%7KZz<-9#W7IrXZ^u+o2Z~D2hQxtf(k~a_Ly8zX=lA*Yfdxz&ca#8pcZ} z;rWO_@O0TEYRP0PWSyp(MknC$RyqL&JMZ1 zGu{I{$*qoZT~HPE)e#}+?$ONl5Z0Tthne!RjcM*dnKIHSw+M`)$hjy!&45#BmL*_h z^G_Xn0A-U4T(5Fa7(F}F#dOm5Mohy?$ZqeFHH4Z0eiu>@TgZw$BO7Imt@ zVcPK7N?H(yo`y6eq2@53XU+%Uxwhh_?%*VX&{{0ZnH+ROlj{cEB+&So`2R3=j?I}x zZQ71)+eybZ?sRP1R>!vObZpzUZQHi(Oh4~iH6NyGs^$mmT3=S}wb!+e^E@sk7BXq) zD8*+|S(zZy#oBRx8;DQPDWrISv?}1CTqQz zjaS83)Frh7PU2;yivhBR9lwU~u6%;vpK*D&(ZxNIllwG6L@5sYmSM_>(8r4b|wt8xM>@(D@(!+7oxoEz2^yW<2l0h{6!680)BD!P2amQMJ0Kch(cQxge8e8VnKnb7vJvxu+prZ(2z z@Zl8KOQgfDkgrT`hvuvOTXRTlEJ6#L2xrLf#?nBy{dP4) zX&>{=*mM;&yn}Hn`7R+@6HCfn=$eeeQI&5wUi?|+gMu}-{^E)h4!KZz1*re$7dE~+wQCv^XWYf|jm|D3b67Ft!qUkJqVERfe4;;2u9!oWji?)= zOz2{k0N`t_67(co+4CUGFWce@Svk~3mm*t}LJsrgpDG-S)#ZS?zSf}gwzCD$m#-#c zAxTwB+%UJ~XSw2LSfH7%J4kT9`_L}m!$>hE*hY@*Kobtkjof~dJxWD(>jWu8gD0ou zkc56ylAQEDrGmmzkm8Pw%OG-OE{DPC+bY#zw!FO7{>`N)mhKr{B&tOwwi(DqxgUtM z4V4EIpiP_Rl*w>*VAqO0LH5t_-=oBxJN7%1pn+Of6XpS-aTA!ZHtm3T`243zL-MFf zcd-%MyNHO>)C8JuVGixLfh(pD4s@{kvqa{V(%=g1Ig=H%Nn0T)!r0DHxyP^F6j@TK z7B)_=i)2$5fgzK&k@x->&vypm?7Ci}UE8*i5`I?8AMr#2E`n}Zok$t))Gxlp0yLo0 z^;{_1@kXBE_Q%_`nD$S9NwKKw2E9*?YU!1(xVX67#`+^$PVf7w zt9vYh%mpf)RE>K7oqzI4oo`Hz8vv9~vPZF?PB}o0dtoc@_`|TZ13AMD(fp%;*(r64 zo%1a6q}O+ybcnhPlU9sYCGAhOwjm5HK4FuOM;RHFW_^b`c~rviaCl zHRHZxSSf$6NPm!k{ZXr+xJh_pBXeN2AWXon6NaIFKdZ*(CGz%K{)En8M;EC~YD(6IrjSGIw>91(Sw;F)wb3Pt=m!gs zq6$tV<3iyF7nk(*Z2!iJ(MJHQ@q2QT9*5Sw5nV}9ivY$%wR)-e`10*XhaIrL43Lip zJE{_pn9n`dMC71j>UYFCzl`52MhB9TucA2Af`acd_!a9T-^@HfS#G(_5{h=oBo6-L@u zMrY1swED-oDLE{KR0zHrnSGMjuu2ubXGhQZgGQ!-LBN=2{FJRB%?!wFgH~n6;l~_6 zOLxHaM#bf=S7(b5jk5?r`g?{P3&>;k`X=Di48;qY;KV1BSZ@VyvKQ%(;nK7bsWRDk zGfA|JwJ_ec)9;pmf|h#Ju@JapKgF1Q{Ol|U2tIG%%5yn&0+j%&AP*;E9PZ=+1thhv zRS*~R)|gxk@0)+e;#=@~3s8#ymA>67g7chL_XPJMd)wl8OyrBG{fT;=S*T%=-wdTxC^P9Kw z`e64*DdGtErr6Vo3Z@Zl4UFl?L-|gB4A+8pWHH0YSn1#bmelH!oFGx*%n{+|Rwdys za%U|cS+4<1DD}b!+>f7`Vx4mAuclN3#Kl3%seyZX-Izp^+joS@6jPx5lxAn_GVF0v z&h4~~Qw1Len9SneL!10)OG%A=)Up{9TRnk39t7nV$INnB9mt?Bw#3c;$=*vso_#QrzjSZ04cP2q zr5pFl7Vi8v_3bWReTF}Kp{7uHzUC03h?5LQHX+TSmQ0IyVy1USh|;f~dt1yg&Zo>` z8eLk#Y&~!T1ybGFUE&AgEc@o_M3)8eV(o!w?7AtFLOZ!Y5{XSSqUdZMY=9 zwLYx2dfkpHFfYY(a`5s-Y<3||97m0b$#NxTX`FDA%aKfS~Lli`>0Kv@l8-67w7+rDEtv7`Of3jj9LIN;#nuh7< zO9Nd>(SiilFN0}P*Dh?yJVe~>R5|heF4u+ploKQIF4|HT9k?QiNEO=dX{9j=lS3c! z{A-B%=i9{z@u?d|8jC}T1aP61>6d&gZ-$BO4>645SZ9V+QKdUP{l_ul)C5BH zX=eT)9a5PS>NnTQ_Jk+7QyunLXhFnPRUhizp?5|v1c?o5YdfI*#^^!bkeukSy)Zs% z&!gsWdAlK`Zu^$QP^iF=5a2j0ynN}g#^KmLTM1dQ&tP@Ng|__~fop2Xjk?0&eQ`y6y{5~%5#Ls0E4`UCcqbTPk==QL z8x^*VNtZiANDi|uI_8iXj9kv@((O~S-Fj2VS}~$QmW%8!hk}fXqoNJBRmUF%Rh%4S71+ISVo;ltFcIi2(ZG%v(Qf1`yAu5Kmy`l% zpX;+u`au}f7ME}n;Rd>os8%hr#M&13OgxO|($Z{H-qu!cmOzuV{3lA!(e)4aV$BrA zC8pHWxmuoa*SrlHOn=re!qZPcc{&>}N5)qi)tT2=q7->>iXe7WLYbujW@@+#f1_sl zF935!Xq(mKU+`vK4>KOAb_3G%f`=tfe~^9=&wU97cIT|@ES5D-dQY>47tUu{qnn{i znY9m6{O%otn>x6Kq3w*dj({#g{TtFto$2iziQW&?Tio~894<%UIRuC1oVL3KUxH}o ztTy+LMIaw4LW{ngJ11XU5Vmq%y)l*v*D`gDr5~Nhr?7pjkG#}A78qOpeSQoh9~)9# z3Nojr$f7u16?VnCO3C-zo;f;!u(S8ft=i_?BA1?TF{f?1*N4n&tz4_{7j!9^J$mp< zTI*G#cRWsGDVp!mdp^=);?9?w9qieG)s=xTK3c^M9%#PXUy@rtZ_~SH@Yw={J;}@% zVH_^8JqT?sAnTOTtuabi!ZYDF9XP+HO~#eNE?el<%%`5io&$A1*#ye;Dl1Ji-LI9V zsZtyb`6f$TF#OQPoOdiyH-O~6n+Y|?_8_orlJ*F&uT%DXN99)s_b9NFM;XOJu$e!- zNJDKWZZqLxM{hlut>O)$;U+i`5^Fr*Lqm;I+f|c=LVkz`TuoBF5kq;5UjyKhE;zNR z2fQn|tP=M$v8R&^+Tr-)PrOA#s+fHOXlHOMAjf%J`9c$n-6RMYs0Yl9Ukl-UDF>FA zzjWKa=i2?f*e)QK8Q{xvu$6uFs(a`Lm~bJQZ&EIrm^-N#uHrAGOgNQ74*oqQ{bG$> z4sjPf{%Qs>ro@)Q=K1+WpR)EJ+<3y==Fy`W`+{$qPLS>%8pfad2BTp20sF#xo33!WV@X9%%^D7-oBOnud~x>!~R1CY(G+ieg! zu0!0Y_?pSCY`+yH+v%CI>Y9;v9fCgO+qSBuC15#5adG?J0~B7Vi*vqB|EG(Ls=yu0 zN~4O-r2`Bv|8HlD`a9=LBb?S9gx15aRxX3AiwkcXOpfH$+}I=EdJWtAI%W7P$UiA| zUI+08pMyK%*?R!OjgaI4hKUuj0Y2tUngMU<`w`!Y>fjT1PO&A1z+XQXV+oW}mgs|W zPHKd?3Wb6njRkhm|#Mvk?R6wtE*=&KXRITA$X!PZdJ z(_2d%lZ1LI_{(CTaq@{*xz~|_3kA3AAhQ!E%7F$`4B`m~qMU#e1@VrTfrnpi!+u>! zeGkOz_?bl6grI;Qm(i8n^BfT70DC|Vq&wPTg8#AJKI+m#&P_uP2cyagaXGYI%$U74 zsH5>o-i`KrEX&dH^W9$SaCeWzXxTsyG2>SFmwrzJ*U{l|yQO{#o*%a^=?PkjTIw>! zK?=^{Ey}kUEOU&BOBU#v`m?hS(Dd-TE>4({lMbjIg6J>!L8kU?;8qw>S7)LaGw-3G zEaL-TOaG5MBau!U7$WFb(Hct0Om)ZZ@>cRh3hdJAYZfts_=4IdW*%i#87ej9kkPp>-*gFn|` z*vfTn;Gj0B##yT+;Xi+4qdpX~RsL3jeJCGOE2@w=%Q8z$$vx93!{mEFtt0hwn~mGy zN7aKqsx_hNj-xPh^Q9H4S&F}BqQz&|ycm7>n2&$Ey77gxT38C0sZjfSfqF|8^J2_r z`5mt}+-Cxx$|i>{KPmih25RW{; z!ox81Ed(D}DB7ciiby1uM^e648O<_2=bOC?DBgpPTd9bbDHl@PZ^um5;V`?zBuCK^ zE>zs$pvyeOR`$1*Q~`CT-H!Kz@TM<%=Q>K+^f?qO6)Cde){f7~oWA+w$#zL*t4%3V zUmfD&(DRIHGoctmW$ds@Im<1ry zas#Dj1x&m1Xi(n{FFeJZi?ZaRneiLg08u1-@HMJ#+`9_@tiglhlrV+nf*hHjTxF_& z@OBmIFvV_PToN~Md2b;pYkWj@EJ6imp?9LcO+VO-0tHN=NkG1JX%Xxq@ZpKO=FR&-SZY4_<^z075BZN z;v7a!&AQ?VEH_6-0CQwgkyPdM(X4bc8T!&AL`QSY^JUAwuKPLn(jTA<1ATJu&H znns=!|G1wbYM6JSfDJ|CfM@O&7D_PQ>X4~C94QHtzhgQVFr2}D6|zv8l5QtH7>QH& zFPVWa7j|~^LOM(W|60~ZNWs8UcF&B!4SkssnikveunNl~gW78rox_(D{^;P}>>fBE zZcyz6;P|Smpp_1{d0*LgtMhr0VODzUcz>zkmV$Xs8&q81`3zNCu}SrotASbK(CMkt zeN6xf{i2D8IQBWpR-Ki#$sS_j(2e&u!Iv!j%DFX8-cv;P_t)&ki0$-(U67)?9+a}$@Za|mp=4w z6Gzro^|dSsCC6J|>m%{)8mE=dz;bN?F11nfsw?2$TGPmMF1nC- zSoAIt@$B~E@jihpV?TOsIU=XyM0@5P?ApH{ zKSFP=pYO(|FwAtvh@rVY^mtpzF1S0VwM2y$QCIvB z>pyv7U51wJYiipbSRP+EwGRyvfHyMWt?ak@bZ)>2XlPz?H){j!uhfj4;I9DKs&3P2 zlmxE7nLJNXf)Llpuk1>YVGI8y`jRRAO{m4^4~&*mIv)IPm_oQbsdV{J@2hrD6V~wI z^%C+aMQoQpmgEr(v|1(!Pv^iae+J&X6!a;fb9Pj$x@DFpwZ{BAyHxiGIm8-}R~>ef z?1mzUAT&*+=H*{RfH{8T=LC{6RHKP~57x}X3!I$cwnfBb4#AmbJ85RMWULE<;eu31 z>_=86;iuEYN9l$`{kv?L$fwJXd_LazLhDh*WfcdlJr0yeA>7Q-d;&v`h<3 z=v?y|?rfmba#8UV`=j`D;WKT+s$1#K_8qD0vwi$>oX$Ds=i5Z#LolPmee0Q+Npf)x z(3=^UsCCNFNhN^P-pJZT%i=|kam7w1*gD3%y^4fLW_YUk_0@AXhsuncea`&6#jQb> zLI=b#enjo}GGWqL(PIWj+%>T$4Szewgx7<(yR5al*$y(D34}OsKzVR`<|No1xS|GB zgR@K99w5|N(d%g(^yGlOXV4bqO0#lwuLrcxw^PlG@Z(Ss1*x9aH{m9M6H-EOG^W2J zkWeztnVC3t#027nnf;RcNzjWqeCL3s|K>J|BG3%uCpO~vuIrbDx|i9SIgl*zZ$I~d z-ga+5t%1Jc1Kq)b8*qh+y0ItPrpdSaX|^!n| zj#~n=%N}@`gK#=>pJLqs1und`g7oH09FYR;{GEWR89V9$Vx8JG33@oX7xeouv&$mo zB|SiP88ZnwFulJA^OKuAWF~|#PXlj6K&UXY=j{*E1^~&A6CWBuh8C}R(IKgh9sTk1 z=)~0-^O+Ic4*3OoGk5>ysym$YwUZz*!38&F(n1)FM$g5zH zX!s}5(Z2z^DVQclM~9}^e7Y?)I4F%G8cFC z(cwIB*jH>hKtOHn6fg>VVFRu;e1SP0t||#1;RFqFN>Q69oO{7|ci{Rcv;Tsw(!al-gtFh*q_<|pn7Jnehha1Lg2N3h5kf=zbVv0bi$wISG~o0 z`#AXtL?r(Ik<>YI>O3lne-zq32JL^L)AIjMbehb6tcE6TCjU*Ry`xh9KSJ$)(rMnX zUP>a%uZ1#%j{+d<@@T~3e$)ZMs#X?t(AK*UD3nFNRT$~4B`dtsHXDzqaN3coH98Q{ zbXG)EwO!P7x^1_>wbfunGztC)s70P?>bSOTdFX{qgdO@?UT}S8|+-x_^^c z_(Vkn?&SN*YR*w~Yrn!o>)vqT4=!0JfPD2>C~MA{z28B z7>}HYv(ejjoC-?(q>QI6o2^v5Zy$3eW4Agbi-+ZSqrEwSYLX_S?q4tn629k#A;Z@W zYizv*6vczQ?}U;`40Q!fLF&bZtV53RQ=!8Eq1H{nXssA2;vp2L`PI(Wmgwk;)6C3*_4m>C zXkv3))%0Ff)KgcbpcCYund99VT7G?%4Gs4vny88eO_G@MIFaH^rssMjjGSSbtT1m3 z|CcxsUeC4nBwC?Ypl)10*0(~>bdppN{V-HK#@qA)h-@Sg9Y-Q`w$KPc!$;PX za?6``OJtct3gtO^VT(Z5F%^e;j8zFU8LU!ByKgsG$axmyAmou^C zg?wrD2>qeQcRtM~Mb^#I17Y7C>v5rfK02S?X~BsrrX63#cSHl)A5Xw}A6itSrvX3T zCrUl5XBvqtaP)j8+#0^f#%Vil@HekyF(7q(Jh=2(DBzJ><>Ll(Hm23g&{3l=?CdKe z17~qlN7B(q;ciBOIOH5)4}9)}RbPkdtVjAZw14gkjePW(Mtn}#ZAbLP-=_cji6&jo zzr6=Ek-=@5OjM(2ZGGKN0B73*V(woXB3YkVI+-zEsZ7B5Jsr#6G}S^5>04GA6kdG% z0JT$K2Z<>k9r)CBdv`Yy57!6YC;VLR~S=1{yYt`sOuo1?NeYy?W36ogx{ z|3En7TOE&K3Qcx8K%}>cyn{^gB2RjC+djh8+R?>uGv2r2p*60=k+^k-muH2%-;ygE zLXmI2pckc@CrLA2Bg)oG+kg`Sk7d_6E79(fVE|cRF>C)TxCT>J%#A`_aInMDP{pIV z(F@+`5kJLeAod|;)O}PvBe4D*MMRvjXp!cn9tS{YM)-4`GeK_gU=rg;@87Oa{38VN zRa^6W=K}_Oy#UJTaY{OuFCfvVRO3`>rZ&V?s|z<5*A+x8gjK*}>U@GsIkyFN9xGMu zP^Tfu-r#S{1mXbx?IgGk_eMqaMN%`-RLMLBMGlJBn)LczfD=qe@TUzmtM%;#AS)E0 z<)NgDB)BX-#_X`I1%Ad@PL8>x==X=}atVsf(EZMCQIz-maK2r=3SAfG6hsqLr%}C) z9t_>1C|@{|!I`YqSkyPV-L1j~>o%xaz}aBx^t2|@{ol3$HiamU%-)?3md5xTj~$`Sj#Ow8!LWcBx5$S+^P*$*A{+kme5{}O zBzbnylXD_vmkU7)c#>g+vYAAf?+2+4mIL3()TQ%^5HiJP=U%Jn*Z_%d0D4kA@LTjO z)9f^&O;H*)prbZAV8rm%oA0UZ+e3sycvyxN2t1(4heH^Eiqhv3V`F6ga}e~!d%Lsh zY?Py*_!0{!02vYN{hnd@ARNE)rv}g>mqaYFFWtqU?)*0Y_c8i zUU6nOT}AC6a{P70n#&8bkL#b|$~Fs~KWDj+V#jt*YaPZ1S)~&N>V{6y3ae~aR^A=( zk>fyR8j1EJlrUZ@6ci}3!JgUOOdr-H9{UuaZr zcv93S!T70~<+N&BMbqhK@u;^DfRWiDonNO*sOLji|zF~zCgGQDg! zk8kidz5S0&de>P1gYz7(UM4hz=IVo!35)|^jx^>n0`glqU-Y&GCL7eC=xSg9kswq|u(RK4aPy}g zX!#QSF28W5#3GLqR=qY`Q)M@ik|j#Mc|t_Mk%FZsu5~7?M@8`k4EbbO3&ytQc*VOe z8bJR>X_Zkzs2x7!_>3uHFpFnV{bEXId3VmJx9~%`3kWU4y5!aM<5kZwcI44Op?hW4 zE6yKJ%{rZjn&&+oGq;N<*{W#oSCqBYHX_lIwWN=m;IYcbh&)8cH+%(s9y5cmBw*Popt5lO049)wRMxVMbOPNVsb^Qk_;mwC@gYRi?H>r&rNPDke`} zM9hzGJ<|cK#6vqCrw2Rcxs4js!95?s#<6iheWL?(bk^_C988)h!uz~DZRg(`Bxkuvh@ zGHRs>PTiHMg66r5#x0^TRZrkS#*d(mGE_p78z^Ko^jT~TbPkXsYk>(T$iwmb<5+6; zd(5xV_b&l6<9l@hR&a~G#{&Xv%o-mfPvNUj{`0A5qlyU@z=MW3BYiMxx06eQc9xLA zm^IR9m76~@tu;UqZYfI3v%NpsQ)QSAH~+0LAp~JS+`98E!hKOYX2h}K{lV>i*@t&~ zK6E6-R3~}F@6sEYO`9tFYq5Xm!T_HYmaV-Nq8RY96!6$U=R`-xrf3(35b@7NW`D&^ zB3iJ<5L*-zRW5NW_b;bX=DVpd1XlJX_3mcV#{rN*9CVZd~I_%^`4an}xEPVLwNd zz8-Wg>l=HVAlx`yR8$n0^jn*58UIfb)DbjPDq6RP2?Kw;uv*TnAnhbZAM1he!H%9}HDmngixVzV`d$wT zR~xa>MoTNk33_EXRfZ}jFBKlVtu})-c9cS1XDYzpjO1@z`r&`Y539spej$hbST>e6 zkhkKXdYQ;Uy<`oQ$oNtfIP(XxrMeDjVR5Z)Px#x(W;Q6<8+^F*aO}l}jN?6DCuy zO1;QUA%e)Q*paIi+%&Vz<4Ya%m<0|LjRCQFTejiJa=;o%bE;tZ#^oM3BM_W)HQCPN zI7*09c4-JUI=>=i)brEc#-x+4e|(K*RKe?8^?0bR9TNoVh1DchI-4IO#iJ8 z*ivese5V$E5xvxfKZOO>(VQ2Y8-ZZD&O1~4YX3OHs=boof_9i=e%m9!hm&x`O443~ zi;#RunW?K{H1Pv_vU_M>!W>~bnUpt%^T-2{<+4cHKbh7~GG{zmL2iA*6T+6L`EVwb z4>j-{tGO^O>q_Sz?mOloFR0HIP{?y zTBnP=L((Uz)!MfS$4&SD*8ey{w&CzY!=gXVPFyIWJ7y3E!wS08ne#u6gKge{PXb%; z;d4S#6ve{#@U!^Ahu9grmB zAWX^NW^_fCa3Pa*BXV)R3dtW+otS2-=3{AU zG%Xd(lE6N`eFZz0h#%>2f*`B1MLoAe~Xm|u#X>s3q z>{LTLvbixf-!(Dr3U~PNiHy#SwC(vjT?T9y8ey>z(rE12>fu9WFMILL4+?(M^&^R> z3d7G61$*rMJ*LLnCvVYb3I{xr(yY!HG2;?#+hz5kIvnkDbU}tCl8UgxO->bEa9ENU zhNmrb1XaMBucIi^j|5T$y?@L^&Dom|+yqT1r8FS-&>w($)(vv{fNE9)NU#@!t3WNdeVbs+Jr8KVSJfYCjIDBVx?9v3+=&5yk>Bbe zce^%W6V)tg)1=G{4t~YTuHw`0kLm$#_?9&HvXl0?*6Qg&&U(8ct`l1-N^+&G`ojA9RcTXG0kIri%6l?2$O2YH^`j~BLi_&eGLUih(s2r>Y7N%SD zni))QQ&7t-;qw!%9Wz|(ucD)x;k2sVo9bDq2)D)4eAkQ7{fd*Q27y~;Jf3+5za_w6 z`OL>*xczHhHN`LwvDV9ez-rrFGsCHteUqXuePw?F%}!503_PVkOp5=<+oIW( zb&?OVLli8XUo$;$Kqux*5eLx%^Cb$U?!cpa$py{Kc1FQ>TnuR`Iep$%`w;NUm{zi~ zBl{eQ#OLyvH7qLxc3Y&i!ln;DLha~_qrOB;=Wf-l-s=!Rl*db?cgKQV%WZc9Pl)`@rz#sECVX@&{!oaBW(1+Cf4V_y3owhXKuityI7|Qo zZ7>h8X^nBSYj8F+ewM`#C5q?)7$I&69b_-M)#JsyZT>MLa({6sl#b?~kYL#DrryPrGxoIn!uSUfvu3B2O5Hf;jg9b?OTO(nwMQC~|u00!-llW+~}1oR=~T z`s!xM2yVHv0P;h|E|kRUd1`z8%%@~@S@N5N9Rj7T#lZkdsc;b zXomH_j8EP^p=geJNT2fU z-P(#`xL{Si*$OZA)*L^ttL~tiH;}rVc^yYvXR@PtvgTs~ z&BS0}S((@}eUK<;uA>?_^louWl9OXB^FB|H<3LpKh1WicA2lZXTC3Ki%XFdHju!=` z2+q?na_Pbi7I34%TjdkkQ|4sTZczP!2UvYs(>yG?>Dx4WGQjFOI>MI8KC`Eg|*?&;5}>DG@~Q(3t2F1H2D`V4X^1~ z1R3tjuK7xrVF;n>^y6@h3PQXdfW@9towBmikG=jV4_Y>L z>ns^n103k5DOE&hhz+T%#oWwLRXQ=h9@6MVO6daI#Epf?u6L{*Swaps zCIg?1#YMFRRCt~|>gWe2jg`O(|1#SESxZ(0`VvrqxIvcr>joFSzFI289p!kuX*kY( zzNQ0b*rPzt6&=(b>hPln$bPJYUrenrzL>D!tSAmZa4R)NQ8q@MRY(JY!C`^pVqiy$ zAGc0)o&f7KNt{pU4&;j4uu|sX`V*=Xi}L}ir(n7%0+R6~Z6Egd8wI{n>*&(=P8?zR zAiYq3hXW0tP{b#kSj%9(=h1~2Y{cMI+K6kbS?2gdELlF!{Vtr=Q-pyF9p{2+XWotEDw!b&*nn$h(Q7TT(OEMA{NT+o#aqdzwm;6owtAxVx znc(`eU!3`i+)B3L%$i-Vmm7c18XQ> zq#zWjCa7xRG1YRd@aRIfZR#aq67=U*9+-a;qvV$eGL5R%!o~QekU+D~*5?KCj|m3= z0@dpor&e!Ww87jzQ_(g;Z-vF*2dO)tIVmM+@uN~;s>Bs+ATz+Z3bbvC{?8p`EhO3yzg3}2_wY>2KW z$QC!I-pi4Hq%~~#<-6Yh6D)?_p4}`7i(;SQc~66J=4Zle{tOJtX6p11D*zH(uv?w# z8ne9L22^2Pfo1_ZeEhNKtjgdCVtYrPsKt!1s0*7Gyd0I?4kk6M<$R9D59f16Ghy6g z*B{H$-_kqYsjHez5E$crXk3R$^4!kU>fM;AMXhe2Z~$_%J)JO&uvo zdHo4i+?H9DVQ$?{!erWU1Q4d&u`F>9r!^E-r`YU2UGs!Y^Qp-8p;| zYxG1>ws782G8_<_WWUj0!^28YGB;pTb%LA3gMsm8G6=6QJz@}W!f<&u2cfMb^EP?| zIdg)BGu=iCq=H9P3txx_m2~&Gh3mB1jtM>9tq1@x_+%cL$}_ZuaTM|T22A#nQufft zUQ79rLh!?E+pDmuR~5sm&%d7GKV*Qcn^*5e;q%xs;oBbwBbh>9BZw@)(ufsV zHu`!*&=?Uonp(auIk6!A07^8$g;>Sxg={slZoM*pPFr+)Y@jl~7&nLI-(NvzW>*3` zQ?sh?9qRfsp@oo7 z*p{)Yhp0#qYM7&|ygzxJ2eBd%sz>LR)0m_&wd1Tn%8}>n(jYH|)_ApD2k9bBd6qOy zRzCY_3kPmvqlHYEa5`M|FTKw6asijtRH!;7P(m{Ap|$q@23Gy?UZ7vBQkqP22%$f8 zo%e!7#jur)+ObF~U*XE%Cm2C-0)APh5`5U#rep5nIn{RR(iuA zSfvF{cJbD=^+J?&v*xcBO=j7?@&l~;#xpWnEvu{Kv69Met0i8&ex$cY%0}wk0`=aC zl{r`ZLUx$}cRMv@7bHcO10jQ{Sg+ME!a?{i*r0@K|K#IfpDnxGr7+a5Z}~F|UFpkr z?_G@2rhTsBTNm{>Yb=`ASPR{#$g5~RhuPaaB9y!K?UjEw#zl8b0KXR}M$=lQ^ba9| zN#B_$MrJ?S9*9{TJ9NMT`gnJ4{WJK*CR>Px8A?;uP89Uy<2;sWmXO8RJJTX}2gNQG z^601xDD3)(3=F70<&-Y>+3`6Qi$Bw;2ENRUJ<$(N0~L;UfNy{&+;tX>-E7n2bpS#8 zPxD`!77<#l=@C^Sc-o|+cbn56-7q}^>#uyx;JS)pV%=cbe_wYSs#p?GfRoy&;sN)C z6EMPG&4*Zj{xBwosF;G&BZ|C%@`4;hzE%NO^>!-Uvgxac+xT;0Q)hTxz)@GU49ds8 zvdPb$>hyr_M>1WyZ_kv5e0#%d*z7$#m_zH?fnuyEVDt<{6Kn>In!A{R!>G;mztj|CoMl5T(GZU`>PZ=OLk+kUp9-G7 zNu368+eR9SIeNi!%v(p1BIW-U+i-`xBj?>zPD`+1Y@ZR};h1;vQm6NQg4wE`1fSYl zp9!w2*8(>Ry?p5z)ZUs39nNcOx+UQ~elyy{F@rbKXH{pZI7RU2bY@*T+?j<^jIFb# z++mMkieb*Du|A2Q!>MwDNjtk*1Z8ny8Pn`=;Id~jx%{l+f#7BXjWDp~=T z*9!)*d}pzyUcd3)luX74W)QhCui%0p-CCSHqMIJZAg=za$0^%_;(rXkqCnAhFT)U> z3%iQ3t3JUsJhET!gy#u8muN^n?Msb@B1EbFv7$4I!}4(~D$lz$a`>C zui+{#rH-zkMtyBEh`AoJ2ks32DfAdO@sNa_Q%cV-iJJzyh#2!Qx4j|2?R3o&`*^Ir zB5X`v>Zpj4s07M*xGvAbYMk(<%W*|QJ`#(e#;4uI?>rD{9Lk%-uqDL&o%Kb0MT*k= z{wW#U_6a!_&2*%U2MfpJe>>9X=b=GCmP% zFpWvEX+=J(FkDuX@h>MlYcqnG_pvfr)aE1r$yCz$>HMw>=dpk1XEbca@tPY8os4Xr zQ1h{P(-M?(;eo;npK;`L0IUS?P`_ghqq?ycf#31EbMA&mxX5AX*-mGugZFUi!6_8m#TrbN~09pW(3a9+b2A4^pAsqpls zowja#lsW%aRs6QD{{%}V1h}?AoE^P6sPQMd!wcGrs zn1~7E{iZsmIFFGplkmQfIqheoEejxsr0pUSci(P;!pO(DE*Q2{Lo z;=`Yg5iQ1KGxA|j`LD+(7%dE&l-gd}Q}c@vhGh7t;FZK?v?MSRz?(PH&BqX>6*WkLH znP2uz-kq6EX1C9IPRk$9r|Mg`>Q>*=eXo9qv6SPcCKbu_o_0JSF`hagYhsU0%r9-x z^sJ8vs}&wbx*widF%`$;9p`dHtg%G!nm)40b3H1jwj_IW7lPt=UJE1;U!j3uMJ%AF zI2q%rX}Y{<-9U>zJ%E3}ntMMAoqg9@y=*p+e4si;q&^dUCQYt+ZJk3ubM}>t7kv;v zfx@Ey@;P|%8%T_cHXF$!WgXt9rf91+h4VlL8o4pl(Db9+bmEn+NXL@k=~BxH_`3h` zd4|mZj#xY^FZ)nDIF{<9Yn1Xmyx<3LAwr_N1*EFp8p9FEx}A)f@_G-6dlBmK6Z?+0qTV5% z7G^Df`~dfIAiC*7;yo-A+6hE!snFgkoU>Fk3eB|+S3ho;E=?gFpE<(my@|RROhIT$ z#yApuYnD_N{iM#IyjP^>gr!sv&zfV09U=@?IGKY*3#I_P_s)u+RL%BF>PLsHl@!8= z8kR$ObR=@_d?-G=Dd#E?pEd`K)ObWB4d7@+6`+Krdxrw|f@PX>x8c1_5yi(mNyV=? zuf5-BALXN6+xy&d8_5uk=?cH#B9~n8%0PjnaC1SmhUCi|w(W{C+_%V00GF z61}tOad{5cRt~muH{q7T6KP{XbjpA{+xKv`&s9uSPW{hCu&Tdk&e!ovjw8LjkeNac zJ;@Ap$Axb-LFZI)1glimOo}V_Q_2$}rlRz*Sh>`L z-3oLftil_9x=MR>L3|~bVYE0#O`|BQ_j}J5F1EEK66Q+TlMUqoM0Ji3OLs?K2v+A^ z;4&}wt~gEAY*Sm{9dC@l#sXf*HPmO78(OGJ@=P+n&j4j(D#1v9OM{Eg%0mtF~56XViTGS zXh5sgyXC#^QChL$TAOoV`Fxx~lMUJ$+_N2UU!74fKh?QO2z0A`T2B{sqxaIC)hQr* zF23*-&JW4j!u(tY*Puts3widUw(F8@;lR9m#ohctvboYx8;Quke0!GeoX+kLs)K`O` zD#G&E%#&rQR!TV4@dCj`4S9;y_Hntnad=Zzd+c@;e!y_D*=LC*!K3G0ph+Ks_a~}O z*)YAjf%IHKS|Jk=fUm$>n*x!ErqvZ@-uVdFZL+Y#!lJ#q=2J3JH%1#6hvMVRN}xfl zJX{ir$4Dkho&NYCPXMImB+~1-F|KYRj-@>ot}utvi(P&nMK^|lDlM^S$$0b8PBfK; zvD2y0*L+de`d{hKaXBUxK-)JO)9Cx{@Ywh%RfEfRVf?5?Tf8@R2KX-tHa|tXZx-tj zgC@A}TTvG*j^)+y7H+&~mV${WBykQ#sGWhUD57PuDlHO{;b-kPJnbcyNkvp;s<3Ev z$7l(-@|!PqcF)d@xp35SbeM$PYk8v!HsV&unCYBX9d@2aUpZxo<@AzdHtBKz@l^21QwOT1NVHl~hiFPqb(iP(B z&L0W8Ic}INF3Ff4-GeiL#y*G6oQSfX7_#eTuKOIly#;_$*@T69PV5qEvy5^#K+Fv9GZF8u9HjxHh3>+_}OG>Q!BDcjr zZe!xo(!d7XSw=%rM+T?G3o4`P5CgWOSy_YQ>C#~zaAHjgF_ccizIa|r8@!ul@2FOs z-eWn7grfd9R4%1`^svB`4!%N82g@nk{uS? zE_`=7A{`$m4Gch~1WV@32wkD!}bjqf>Q$?64K0LE}iR zCXq@0*hc8360R%kc&)@4?;V-gLW?=?Ro-nfxi(6<;F=zY^08o{F)2$hETsblp`^c^ z9_YZ4CF7=kb^Olhey3{5Mg>mli?Dn!LYe5M9i|tZWc~c2OSO#>T>y0G2TWerTESf% zZhacA$&9pZ>rqv$a+l92uu~Ur9nlL1YMv(yNXp#QBP2%|nR!f4Zx_wUY94Pw@CcZg zd4T5Jf+h#D$o6>Oot(8utoSnWl8KF6 zc=&G~Cr8+7t+{7qoK*tgxv3mew&o7MPHM{!G?-Rrq7hDFUWXAr1U~cFXNe%;mh$o2 zyqeT;JE0mptmC`<;?-kzLGmdz;C9K@vo58}8hMV(!?!1yKIanUE~Kl7%X0Nd7Wtu1 zA0?PMJu0(@xOU8=>6BkvZ}cF5Vm5&EOtpPp|M3T`e6ocf9nT6+=R=u9dxVBzF78;2w75 z7A`^t=Hzkk$L;U*SD}y+?Js$dJC-y@+XUqX1>Yj%@Eg^GVzZznJ3YQIB|DR^_!zVQ$z z$Cc-1p5#zuv*^|fHdx-?i~G`(J~%XeOa^(=7VIb@q5S$q!`GVu&NgB%-JFR{*N(L- zm$Q|xtWg)wg3DWPWxYDmmq<1*V7cZ8a>{CZR!kSiY>^pHZnxS`w(_DEuJ$%vu_RTQ ziVvX@EP78S+|LZ0Ns9LG?p9*#H-<+IuXNWRYw^#{IH2?}CigC%Tf!u%ENBC@)e2mu zad^yoPj+adbk_)RJKSS#6T~R4$%|@C>)MAEiz;nZ%F&POoL12@Hh`t422OSDxy|NS zZ(JVhbTkeI3Mk4Lqush0P`#n->lM;El1I4^6Mbp~qP&-4)-tA+K%$yAfqDiZQ}C=d zePhh`dLtjQN@`gr0G)3Fi|ix((kms5sl{oplNSGHfO&k=(va107w5+oR$a{LK@S_1s|B8Fg zaI%ejx67VSBV5F#Tv#uQgHc8~fHK}EqA;vBpd<3&x%YU_K}^XlK3z{ME)bsh%YVJu z1`oMFw{yx-}ZwUf$1TCHXELgIzpK042K0YR0O@PV&)anGA|h7ubi-j`i+ zi9SFO21FS}^lVNd{K1!=3#~!@i>q3~O0%T0furm9>XOXwRK}ssdXQbj^eljSu}05> zkFT`n&@S7E%I2Wg423F*yc$$rD6}0;@keoDOyd=M(w#0mvciOVR+J}8+oIf?r6m+qe_g}pQtof))T%xj>X@)EtMz0E zt}KwIp?{uo>H8Qw>*)rxQWSFw%^b&Jo2fX-{zPpnX18_daCYP-mWK131gN5dgTu^X z)nR&2N=YlkK`hYIruZ^|Z=@D;tzr!^@xPpyL;D4!hUkJ%> zI}z#MYo2*4FfC11Xk$OQ;vhP>7W1=ZQuN)B--4&7eyF6_mOU! zg7ofpZ)#Io;`j=-!;8xClAle&9W|_Vgbx*wE5@lCdLFW}atsWC2y;Z1T5|8kMmR7*X{aU= zS-hk3M5z)uxbDJV6ZIC`CtBy2D`}pN3(uME#|5WYd7iu_TOdxA*meq7-%xsGZ%W*^ zi##+^XLzsddkh7vE7H;LZ3Z=KS5pGxn$N3v|iWSKMiNZMd7dEvD&@LAlAr zsp>3BY|Ksp=DAX(QhUUcu@mgA@Z+3qP+9n>`Lrw%qH-wGs(r;TWXzw2rVwl7DV2s? zdr^yU5@b`pHkC36p>%?qT<`n9G*9-F62%rH_l58f>gyO3CbqDrG9QI?kn)4$po{9= zO(nE6Wt1IdRrEmz)N(eI5uetw6S^^uu)y20P>4cC3VJ>hKoonS+x=0jHuDIt~BDg6r3bcI;T6z?R}LBP}aqe14KyOn%ZBAg7|7b=E^L+WPRKw5= zIhBsN=R0y@^uVXN+wk17F+QEFc~BFTL2(n}qj)xour3j)h(W)leWL+l_^jqxNi+t@ zGYZW!3IOk!eU`AvBY0FKBAEFQ(5sOzxA6(LM&Owx3KyO#S3rL5VsK;x<&&>#Lxa=m zEG#HbmGcUCsVV}S*Oo2tJ;;NRn=pb#=r4_YE0Z6uf2cxtG6Y2#>^60s$DsfbZ2T*$ z28Ni-KTb|pRF}bQSLlQb6ovCrMut-3VgQN;K18r&^I{BzjITBuawoUZ zu_#1_k>&N0fiPz;i*Kn}5OyL`D|T@cFl8&Soz{0=L)$y;0M~cMYn!N}YbNILYbzPa z>|*OPpiXA<&P#f*eFcDzqbYm78V=gx`u7y|z(FlAd*%9OQTL|ci%iRlsWMdmEk~&5gYY8UPitw-W8l2(Lg#&3)E93?Ql5+ zDPR?n>m$e*bBg%w!R+REt}nmY@eporjqBpRboD<-Xdb&>jbf6TEgHwPHsy3KqW|4=9(F|%L zx?R*8@qj4VYpK278Y$m`!@s3($W58_uqZ}N73pg$RZIiy2|}0#VUCvJQOc9)ghRyj zg(f0OlH{*-LZ@GNA@3n~5+7|~3F;86*THUN+&!8#fp5P;A0)WOo$$XbXNF_MJ9(9D zEsLtduwEy!a825ZKe!8M{gB-nOv;FNbpB}L4)5fY0@S%1>;R8+Z_D7@MKVUgblKAc z?R@v`-Jv_f%GatUWV>p0a!g=?3a70V{Kco4galg~`bzucL4#fVFV_ZEl+mTjs~Wlz zZREwRf(_l(wj0`lVT56W117aVvD_ygHMI9Sfi@^Z z&fKI=#uYW_xlcxxVT|L)XWWpJTHapV6ArA-WP74F)y~s2httYjG7TaLnRu9 zJ>KHdr}+?){;5QI9t(NhLr9S#Bq$xeK^4b0U6niB^nu_1W;GW96VXfwVkto^_i-_1 zx$quT4wsL>QhGzDrECg+U4E_~DosSvXhnstc;YkmO&W^v66_={TH4XGD1(MArjP!r z&^5p}#Z;8%Pe=4iXscBc!Z*aQHY^CkM{)+7Uu%D%Zs+N^wwAy;H7e-YrlqU&H6orN z%AF@k+*Gft>Q`i2s{V|$&mVFTK99V)Qy_+A4Qq_1Jf@^vA+}QZ8e~Kfv8zfG(56PIv~(8EZlP!!iYsuodRZue>oz6Nc(&|- zVrNq4M<@z@%r&x2#_yFt9j$NsIjy))?nbK0a>JT)XBgapPIgYf^6JLsUPUds&uZ9B zuLzQ@-ZBE_ZF*{kOCvO3q6}&oM>Gr?${jYmg=!zWC4{@xG1`>J?WyL&6tOJY}-T_C>zc>N8ezZ-cjwSX&9}`m!UnhTl(3 zowZNc1*TBjIzErFoW&=Q`LNu|FmsYfjJ|hU} zQY!tbzHYny@X%QIi%L@ciTT#Wg+k>nm) zSV=e)@2`KTEsr`)9)j!y&ME znV?heK6^i7T)+)0fe0{59zHH2Rc!~gh14)XC5lfNiT~sptGLaUm1aH@0HMb(fQq_b@y2^d2 zC1a$;;e!&|C~yM{YpFbkuq;K&ghpb`PvPxWgH-0)UK%RPI#pdm;X19O?>;=3 z!J3R+3EC3A%lAEXedNSg{-VcQ+=+jRns^q!A_l?qwRn`vV`CIGIoSMD?8||-JI%wn zB{O|XE^kF`?2$f%Q6y>7%Ic=h69}ZieZorwB3YQICffI5EIuzwgCs7-{TS=7(jIS? zI*3{38CuAwJy-8)=6p~)4XXEM%A6I_qi|OI)JK+*Kc%RlRfE5@@1tVmRPH|?Mw1*0 zhc|HSu6BFAYTnycq3ab2HTyUL3dYZt-%8KNe z8%df7BpE)rdEhhUrv-hDZ^R{uXbP~S$HS||nKfkfW$O@mW#5DsSd%+Tavv~c#Y)w` zp5mUrCkOHPuD)b4JCPR0`;05Jrx)cir;iVf1XbNq>USXYTCW5P7}d z9I!Etu+t{#LcQ-;Wmx3e@kY=tayVbwy;C7YQ?QBDDyAvpHS9>k$61>2+B#9Cu(VhZ z7JNi~Zt4k5LIur41`X*7jhst@y3Tg860_BCEzPLqjb4?=MHieW^Dv;eT`aJF2T9}k#j~$&r9*a)9f}Uqnj3SSq@7FqA{g;{R-Nk zc0bjew)p$mM09&;1%^3-U>S6bs8&V#b$_8`t;Y9}G;i5>O*KCuVADQ-!O#PGpYr&7qPI7)YiJ_7^4klyV7;7 zOt~n%xdBB}#?$(*uH`#Fay-_aA+3ctj>kpFSi%a3BD?FrY@%&9A=W5LoZMw*AqtmFaV4}Q6{?>;M+ZDV^#LFkIEZ~~pj^=?A z63J+5=x`~BSz)iJp&A7xBzL)mkAeqT#L-_@5$AIH5TL_v``ktX)+#91x1Esq?H@}E zz#L^vBEhb7GfyB-LE!RW52KOjA$!>G;%SY)CxF1-$;og+TE(jjx4`Xn&=2uf_+rMJ z7wCNm@!pkxpDc3`naP2d%x0Q(7J|f%$o~^eaSb-VtLS9s(Q%_ejqe!|3W7Ie77l4- zFnVQ5=aj4K*C==-Sd`k;9E~$`7=d-OfI19#H{`94P`qrhlSvR!nWB5HiOLLgg&H?@)&n%gx0?HS=xLVFn)^Y%Pd>&Fec=KcL;X0aQ>)g?n2WgN5 z(3a15J)d-H@LEB0n$u<~KUxG>`$va30{WLk2Pq{jAntMbBV(+gIayO;=qCn7LD%-QNTWGk7~b&JoHe$hNFv!fDOQSD`ai4-Lihk1Bto$$j22IYy5oehMWsAS>`As zHtXxDA>g6jXDEkg`6%#N2H;2y5pN9H$E;~0=?sZs+~^99!1Wbkr$4VJ-14@TIPCa4 zo#pLtKoULV{Mp{IWgpj0igwWQ8& z`w#gPR}O{wvQsUh>g$+56*Vqn*_Zpavct`6{FF6=8}=#{W$NXykiZI!xcRY?l!{dr z38PpGDI>S)n$JLOS~=fGhoj_b8`Gc7;!djow2V%Ty#-z65HxN4%8t$2aix8dH}S>U605$Sp6`;B7G@X8ZlPqR7&yZG!dp4JEe*zo>1!eCIg8ECK9$rF zrC5M1Yw<8*SI3iCV122v+FeCt3%<+#Y@PeZOzrZP&(5($xmi>E3AZYrmHUeVitMv! zUCl?7Bjv5UOY~e;4&E-Xwd}gs%(of2tR3vPxa=*qxsM-swxl^X99YjSw6_?#47@*i zzn-#XGMxG8ax~GTcASzg?bh;hO}|N?$+0$-2ae5BR20!?s;NwB4})hEriEBKq*MW!rkr~?Y2vRw+sSr4D_EZgFrtVXtxUi01*7;fp&Iw){YG3 z4mQ?*Y!g%lKE&?(^$ozB?)bV z7bm_0nKzbd{9KMW8j`paf%A&>(&ahpYw-Z&E%H zx6ZD%fn4|yp6A<}rLf)L|Dx%T3z?+=E>z!su!U!ET}#AHaJ_5UyUpLq(u8G1kLP|O z;{70dq}L}<^OCuw?0wEI;=37cXJ0>_0i&3kG}*UWgnu47TNocrg9(=Ro5Tvz5RjNq zn1380cvE2XpYsI4pP+-~|NeLo`u0l3%+W~3MjvEkuV$}rYinfB_(u$Gz}qyzV$zzN zf}j5@2H)=w2Y>@$sw!w`=9DD5fbSFzzNmk=f4#55U*7*eL|qwuCu>7fBYSY{|DcA@ zpqPBW{)P&^CE&lk!uo;wAjAjpS6<1;{IX-;5SRZY9MMmRn7>0Xn3y@5IvM%d2o|E%G+i2g^h?=b><^BpA)loNd+C&A!m_2&_gW8m!he*J@n z|Lx$jpB(fBA7K2C)ECOiKrvkvFj&&kzI}L$z zLW2xELVh6D`{w^5(cZ`!JjMQJru*jRw@YS{`gh!=`vLwSv_t-D?m9T?JDUBv&fmSJ zo0S%Tf(HPwXaIocKY;6fm7n|;*ul}w(ul#(;m=9_7hL~tfnV|2m>xJ!n&AKd&Yvup zefC=xI2u{mTIxF*F_=33&m8d!R{Yg?qxiv!2cdSxf3U(x-@(zyUf0OP0X*UMfh*I`DXq@?>r|_6+nfHn%ijgg z=4hMK2MY`Vo^4ou5_n1E*WtGIe+cj!{Qvui?iBkc{-1Iig6G%Y*1Ld5VC@dTu*+kB?F4T2>*YmC80jN@B6{@9&oPxTuV5B z|3Lqjv5v5u8)*Uy%?@s2pZpYS3-y1X{r|}%nje4j3`xYxVot zM4+pu3G*$c-~sh>OmBY&`!7`%ej!{9115(e0RTTXVD-K}+W+A6zZgY-Rj|l^lKE2q zABYY{j*e#5|6=|%702qEL;(P#gaH8hA9(e?>IT2U`~T$X&m$_|{#Vfdve~OZjD->c z%k2ohes1;<9exA*Ki`7?_gdaB^a0=NlR8R zVH+DqNgEpr29V{S%U~+t@BH7dzxh7-9s1+S^^ed8UykzsD^&IuH@N?C)%4q<_>U{L m-xkHcKk9wW&;APf%S+@6(vQH+&bK~;5%2(Rc{b0#z58E49Ef)S delta 60282 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