@micdrop/ai-sdk
Advanced tools
+1
-2
@@ -11,4 +11,3 @@ import { AgentOptions, Agent } from '@micdrop/server'; | ||
| private abortController?; | ||
| answer(): PassThrough; | ||
| private generateAnswer; | ||
| protected generateAnswer(stream: PassThrough): Promise<void>; | ||
| private buildMessages; | ||
@@ -15,0 +14,0 @@ private buildTools; |
+1
-2
@@ -11,4 +11,3 @@ import { AgentOptions, Agent } from '@micdrop/server'; | ||
| private abortController?; | ||
| answer(): PassThrough; | ||
| private generateAnswer; | ||
| protected generateAnswer(stream: PassThrough): Promise<void>; | ||
| private buildMessages; | ||
@@ -15,0 +14,0 @@ private buildTools; |
+0
-12
@@ -30,16 +30,4 @@ "use strict"; | ||
| var import_ai = require("ai"); | ||
| var import_stream = require("stream"); | ||
| var import_zod = require("zod"); | ||
| var AiSdkAgent = class extends import_server.Agent { | ||
| answer() { | ||
| this.cancel(); | ||
| this.log("Start answering"); | ||
| const stream = new import_stream.PassThrough(); | ||
| this.generateAnswer(stream).then(() => { | ||
| if (stream.writable) { | ||
| stream.end(); | ||
| } | ||
| }); | ||
| return stream; | ||
| } | ||
| async generateAnswer(stream) { | ||
@@ -46,0 +34,0 @@ const abortController = new AbortController(); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/index.ts","../src/AiSdkAgent.ts"],"sourcesContent":["export * from './AiSdkAgent'","import { Agent, AgentOptions } from '@micdrop/server'\nimport {\n CallSettings,\n LanguageModel,\n ModelMessage,\n stepCountIs,\n streamText,\n tool,\n ToolSet,\n} from 'ai'\nimport { PassThrough } from 'stream'\nimport { z } from 'zod'\n\nexport interface AiSdkAgentOptions extends AgentOptions {\n model: LanguageModel\n settings?: CallSettings\n}\n\nexport class AiSdkAgent extends Agent<AiSdkAgentOptions> {\n private abortController?: AbortController\n\n answer() {\n this.cancel()\n this.log('Start answering')\n const stream = new PassThrough()\n\n this.generateAnswer(stream).then(() => {\n if (stream.writable) {\n stream.end()\n }\n })\n\n return stream\n }\n\n private async generateAnswer(stream: PassThrough): Promise<void> {\n const abortController = new AbortController()\n this.abortController = abortController\n const signal = this.abortController.signal\n let skipAnswer = false\n\n // Prepare extracting\n let extracting = false\n const extractOptions = this.getExtractOptions()\n\n try {\n // Generate response using AI SDK\n const result = streamText({\n model: this.options.model,\n messages: this.buildMessages(),\n tools: this.buildTools(),\n maxRetries: 3,\n stopWhen: stepCountIs(5),\n onStepFinish: (step) => {\n const tools = step.toolCalls.map((toolCall) =>\n this.getTool(toolCall.toolName)\n )\n if (tools.some((t) => t?.skipAnswer)) {\n skipAnswer = true\n }\n },\n ...this.options.settings,\n abortSignal: signal,\n })\n\n for await (const textPart of result.textStream) {\n if (skipAnswer) return\n this.log(`Answer chunk: \"${textPart}\"`)\n\n // Extracting value?\n if (extractOptions) {\n if (!extracting) {\n const startTagIndex = textPart.indexOf(extractOptions.startTag)\n if (startTagIndex !== -1) {\n extracting = true\n const messagePart = textPart.slice(0, startTagIndex).trimEnd()\n stream.write(messagePart)\n continue\n }\n } else {\n // Extracting, don't write to stream\n continue\n }\n }\n\n // Send chunk\n stream.write(textPart)\n }\n if (skipAnswer) return\n\n const fullText = await result.text\n const { message, metadata } = this.extract(fullText)\n\n // Emit message\n this.addAssistantMessage(message, metadata)\n this.abortController = undefined\n } catch (error: any) {\n if (abortController === this.abortController) {\n console.error('[AiSdkAgent] Error answering:', error)\n }\n }\n }\n\n private buildMessages(): ModelMessage[] {\n return this.conversation.map((message): ModelMessage => {\n switch (message.role) {\n case 'user':\n case 'assistant':\n case 'system':\n return {\n role: message.role,\n content: message.content,\n }\n case 'tool_call':\n return {\n role: 'assistant',\n content: [\n {\n type: 'tool-call',\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n input: JSON.parse(message.parameters),\n },\n ],\n }\n case 'tool_result':\n return {\n role: 'tool',\n content: [\n {\n type: 'tool-result',\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n output: {\n type: 'json',\n value: JSON.parse(message.output),\n },\n },\n ],\n }\n }\n })\n }\n\n private buildTools() {\n const tools: ToolSet = {}\n\n // Disable tools if first message\n const enableTools = this.conversation.length > 1\n if (!enableTools) return tools\n\n this.tools.forEach((t) => {\n tools[t.name] = tool({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema || z.object({}),\n execute: (args, { toolCallId }) =>\n this.executeTool({\n role: 'tool_call',\n toolCallId,\n toolName: t.name,\n parameters: JSON.stringify(args),\n }),\n })\n })\n return tools\n }\n\n cancel() {\n if (!this.abortController) return\n this.log('Cancel')\n this.abortController.abort()\n this.abortController = undefined\n }\n}\n"],"mappings":"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","names":[]} | ||
| {"version":3,"sources":["../src/index.ts","../src/AiSdkAgent.ts"],"sourcesContent":["export * from './AiSdkAgent'","import { Agent, AgentOptions } from '@micdrop/server'\nimport {\n CallSettings,\n LanguageModel,\n ModelMessage,\n stepCountIs,\n streamText,\n tool,\n ToolSet,\n} from 'ai'\nimport { PassThrough } from 'stream'\nimport { z } from 'zod'\n\nexport interface AiSdkAgentOptions extends AgentOptions {\n model: LanguageModel\n settings?: CallSettings\n}\n\nexport class AiSdkAgent extends Agent<AiSdkAgentOptions> {\n private abortController?: AbortController\n\n protected async generateAnswer(stream: PassThrough): Promise<void> {\n const abortController = new AbortController()\n this.abortController = abortController\n const signal = this.abortController.signal\n let skipAnswer = false\n\n // Prepare extracting\n let extracting = false\n const extractOptions = this.getExtractOptions()\n\n try {\n // Generate response using AI SDK\n const result = streamText({\n model: this.options.model,\n messages: this.buildMessages(),\n tools: this.buildTools(),\n maxRetries: 3,\n stopWhen: stepCountIs(5),\n onStepFinish: (step) => {\n const tools = step.toolCalls.map((toolCall) =>\n this.getTool(toolCall.toolName)\n )\n if (tools.some((t) => t?.skipAnswer)) {\n skipAnswer = true\n }\n },\n ...this.options.settings,\n abortSignal: signal,\n })\n\n for await (const textPart of result.textStream) {\n if (skipAnswer) return\n this.log(`Answer chunk: \"${textPart}\"`)\n\n // Extracting value?\n if (extractOptions) {\n if (!extracting) {\n const startTagIndex = textPart.indexOf(extractOptions.startTag)\n if (startTagIndex !== -1) {\n extracting = true\n const messagePart = textPart.slice(0, startTagIndex).trimEnd()\n stream.write(messagePart)\n continue\n }\n } else {\n // Extracting, don't write to stream\n continue\n }\n }\n\n // Send chunk\n stream.write(textPart)\n }\n if (skipAnswer) return\n\n const fullText = await result.text\n const { message, metadata } = this.extract(fullText)\n\n // Emit message\n this.addAssistantMessage(message, metadata)\n this.abortController = undefined\n } catch (error: any) {\n if (abortController === this.abortController) {\n console.error('[AiSdkAgent] Error answering:', error)\n }\n }\n }\n\n private buildMessages(): ModelMessage[] {\n return this.conversation.map((message): ModelMessage => {\n switch (message.role) {\n case 'user':\n case 'assistant':\n case 'system':\n return {\n role: message.role,\n content: message.content,\n }\n case 'tool_call':\n return {\n role: 'assistant',\n content: [\n {\n type: 'tool-call',\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n input: JSON.parse(message.parameters),\n },\n ],\n }\n case 'tool_result':\n return {\n role: 'tool',\n content: [\n {\n type: 'tool-result',\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n output: {\n type: 'json',\n value: JSON.parse(message.output),\n },\n },\n ],\n }\n }\n })\n }\n\n private buildTools() {\n const tools: ToolSet = {}\n\n // Disable tools if first message\n const enableTools = this.conversation.length > 1\n if (!enableTools) return tools\n\n this.tools.forEach((t) => {\n tools[t.name] = tool({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema || z.object({}),\n execute: (args, { toolCallId }) =>\n this.executeTool({\n role: 'tool_call',\n toolCallId,\n toolName: t.name,\n parameters: JSON.stringify(args),\n }),\n })\n })\n return tools\n }\n\n cancel() {\n if (!this.abortController) return\n this.log('Cancel')\n this.abortController.abort()\n this.abortController = undefined\n }\n}\n"],"mappings":"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","names":[]} |
+0
-12
@@ -8,16 +8,4 @@ // src/AiSdkAgent.ts | ||
| } from "ai"; | ||
| import { PassThrough } from "stream"; | ||
| import { z } from "zod"; | ||
| var AiSdkAgent = class extends Agent { | ||
| answer() { | ||
| this.cancel(); | ||
| this.log("Start answering"); | ||
| const stream = new PassThrough(); | ||
| this.generateAnswer(stream).then(() => { | ||
| if (stream.writable) { | ||
| stream.end(); | ||
| } | ||
| }); | ||
| return stream; | ||
| } | ||
| async generateAnswer(stream) { | ||
@@ -24,0 +12,0 @@ const abortController = new AbortController(); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/AiSdkAgent.ts"],"sourcesContent":["import { Agent, AgentOptions } from '@micdrop/server'\nimport {\n CallSettings,\n LanguageModel,\n ModelMessage,\n stepCountIs,\n streamText,\n tool,\n ToolSet,\n} from 'ai'\nimport { PassThrough } from 'stream'\nimport { z } from 'zod'\n\nexport interface AiSdkAgentOptions extends AgentOptions {\n model: LanguageModel\n settings?: CallSettings\n}\n\nexport class AiSdkAgent extends Agent<AiSdkAgentOptions> {\n private abortController?: AbortController\n\n answer() {\n this.cancel()\n this.log('Start answering')\n const stream = new PassThrough()\n\n this.generateAnswer(stream).then(() => {\n if (stream.writable) {\n stream.end()\n }\n })\n\n return stream\n }\n\n private async generateAnswer(stream: PassThrough): Promise<void> {\n const abortController = new AbortController()\n this.abortController = abortController\n const signal = this.abortController.signal\n let skipAnswer = false\n\n // Prepare extracting\n let extracting = false\n const extractOptions = this.getExtractOptions()\n\n try {\n // Generate response using AI SDK\n const result = streamText({\n model: this.options.model,\n messages: this.buildMessages(),\n tools: this.buildTools(),\n maxRetries: 3,\n stopWhen: stepCountIs(5),\n onStepFinish: (step) => {\n const tools = step.toolCalls.map((toolCall) =>\n this.getTool(toolCall.toolName)\n )\n if (tools.some((t) => t?.skipAnswer)) {\n skipAnswer = true\n }\n },\n ...this.options.settings,\n abortSignal: signal,\n })\n\n for await (const textPart of result.textStream) {\n if (skipAnswer) return\n this.log(`Answer chunk: \"${textPart}\"`)\n\n // Extracting value?\n if (extractOptions) {\n if (!extracting) {\n const startTagIndex = textPart.indexOf(extractOptions.startTag)\n if (startTagIndex !== -1) {\n extracting = true\n const messagePart = textPart.slice(0, startTagIndex).trimEnd()\n stream.write(messagePart)\n continue\n }\n } else {\n // Extracting, don't write to stream\n continue\n }\n }\n\n // Send chunk\n stream.write(textPart)\n }\n if (skipAnswer) return\n\n const fullText = await result.text\n const { message, metadata } = this.extract(fullText)\n\n // Emit message\n this.addAssistantMessage(message, metadata)\n this.abortController = undefined\n } catch (error: any) {\n if (abortController === this.abortController) {\n console.error('[AiSdkAgent] Error answering:', error)\n }\n }\n }\n\n private buildMessages(): ModelMessage[] {\n return this.conversation.map((message): ModelMessage => {\n switch (message.role) {\n case 'user':\n case 'assistant':\n case 'system':\n return {\n role: message.role,\n content: message.content,\n }\n case 'tool_call':\n return {\n role: 'assistant',\n content: [\n {\n type: 'tool-call',\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n input: JSON.parse(message.parameters),\n },\n ],\n }\n case 'tool_result':\n return {\n role: 'tool',\n content: [\n {\n type: 'tool-result',\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n output: {\n type: 'json',\n value: JSON.parse(message.output),\n },\n },\n ],\n }\n }\n })\n }\n\n private buildTools() {\n const tools: ToolSet = {}\n\n // Disable tools if first message\n const enableTools = this.conversation.length > 1\n if (!enableTools) return tools\n\n this.tools.forEach((t) => {\n tools[t.name] = tool({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema || z.object({}),\n execute: (args, { toolCallId }) =>\n this.executeTool({\n role: 'tool_call',\n toolCallId,\n toolName: t.name,\n parameters: JSON.stringify(args),\n }),\n })\n })\n return tools\n }\n\n cancel() {\n if (!this.abortController) return\n this.log('Cancel')\n this.abortController.abort()\n this.abortController = undefined\n }\n}\n"],"mappings":"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","names":[]} | ||
| {"version":3,"sources":["../src/AiSdkAgent.ts"],"sourcesContent":["import { Agent, AgentOptions } from '@micdrop/server'\nimport {\n CallSettings,\n LanguageModel,\n ModelMessage,\n stepCountIs,\n streamText,\n tool,\n ToolSet,\n} from 'ai'\nimport { PassThrough } from 'stream'\nimport { z } from 'zod'\n\nexport interface AiSdkAgentOptions extends AgentOptions {\n model: LanguageModel\n settings?: CallSettings\n}\n\nexport class AiSdkAgent extends Agent<AiSdkAgentOptions> {\n private abortController?: AbortController\n\n protected async generateAnswer(stream: PassThrough): Promise<void> {\n const abortController = new AbortController()\n this.abortController = abortController\n const signal = this.abortController.signal\n let skipAnswer = false\n\n // Prepare extracting\n let extracting = false\n const extractOptions = this.getExtractOptions()\n\n try {\n // Generate response using AI SDK\n const result = streamText({\n model: this.options.model,\n messages: this.buildMessages(),\n tools: this.buildTools(),\n maxRetries: 3,\n stopWhen: stepCountIs(5),\n onStepFinish: (step) => {\n const tools = step.toolCalls.map((toolCall) =>\n this.getTool(toolCall.toolName)\n )\n if (tools.some((t) => t?.skipAnswer)) {\n skipAnswer = true\n }\n },\n ...this.options.settings,\n abortSignal: signal,\n })\n\n for await (const textPart of result.textStream) {\n if (skipAnswer) return\n this.log(`Answer chunk: \"${textPart}\"`)\n\n // Extracting value?\n if (extractOptions) {\n if (!extracting) {\n const startTagIndex = textPart.indexOf(extractOptions.startTag)\n if (startTagIndex !== -1) {\n extracting = true\n const messagePart = textPart.slice(0, startTagIndex).trimEnd()\n stream.write(messagePart)\n continue\n }\n } else {\n // Extracting, don't write to stream\n continue\n }\n }\n\n // Send chunk\n stream.write(textPart)\n }\n if (skipAnswer) return\n\n const fullText = await result.text\n const { message, metadata } = this.extract(fullText)\n\n // Emit message\n this.addAssistantMessage(message, metadata)\n this.abortController = undefined\n } catch (error: any) {\n if (abortController === this.abortController) {\n console.error('[AiSdkAgent] Error answering:', error)\n }\n }\n }\n\n private buildMessages(): ModelMessage[] {\n return this.conversation.map((message): ModelMessage => {\n switch (message.role) {\n case 'user':\n case 'assistant':\n case 'system':\n return {\n role: message.role,\n content: message.content,\n }\n case 'tool_call':\n return {\n role: 'assistant',\n content: [\n {\n type: 'tool-call',\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n input: JSON.parse(message.parameters),\n },\n ],\n }\n case 'tool_result':\n return {\n role: 'tool',\n content: [\n {\n type: 'tool-result',\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n output: {\n type: 'json',\n value: JSON.parse(message.output),\n },\n },\n ],\n }\n }\n })\n }\n\n private buildTools() {\n const tools: ToolSet = {}\n\n // Disable tools if first message\n const enableTools = this.conversation.length > 1\n if (!enableTools) return tools\n\n this.tools.forEach((t) => {\n tools[t.name] = tool({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema || z.object({}),\n execute: (args, { toolCallId }) =>\n this.executeTool({\n role: 'tool_call',\n toolCallId,\n toolName: t.name,\n parameters: JSON.stringify(args),\n }),\n })\n })\n return tools\n }\n\n cancel() {\n if (!this.abortController) return\n this.log('Cancel')\n this.abortController.abort()\n this.abortController = undefined\n }\n}\n"],"mappings":";AAAA,SAAS,aAA2B;AACpC;AAAA,EAIE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAEP,SAAS,SAAS;AAOX,IAAM,aAAN,cAAyB,MAAyB;AAAA,EAGvD,MAAgB,eAAe,QAAoC;AACjE,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,SAAK,kBAAkB;AACvB,UAAM,SAAS,KAAK,gBAAgB;AACpC,QAAI,aAAa;AAGjB,QAAI,aAAa;AACjB,UAAM,iBAAiB,KAAK,kBAAkB;AAE9C,QAAI;AAEF,YAAM,SAAS,WAAW;AAAA,QACxB,OAAO,KAAK,QAAQ;AAAA,QACpB,UAAU,KAAK,cAAc;AAAA,QAC7B,OAAO,KAAK,WAAW;AAAA,QACvB,YAAY;AAAA,QACZ,UAAU,YAAY,CAAC;AAAA,QACvB,cAAc,CAAC,SAAS;AACtB,gBAAM,QAAQ,KAAK,UAAU;AAAA,YAAI,CAAC,aAChC,KAAK,QAAQ,SAAS,QAAQ;AAAA,UAChC;AACA,cAAI,MAAM,KAAK,CAAC,MAAM,GAAG,UAAU,GAAG;AACpC,yBAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,GAAG,KAAK,QAAQ;AAAA,QAChB,aAAa;AAAA,MACf,CAAC;AAED,uBAAiB,YAAY,OAAO,YAAY;AAC9C,YAAI,WAAY;AAChB,aAAK,IAAI,kBAAkB,QAAQ,GAAG;AAGtC,YAAI,gBAAgB;AAClB,cAAI,CAAC,YAAY;AACf,kBAAM,gBAAgB,SAAS,QAAQ,eAAe,QAAQ;AAC9D,gBAAI,kBAAkB,IAAI;AACxB,2BAAa;AACb,oBAAM,cAAc,SAAS,MAAM,GAAG,aAAa,EAAE,QAAQ;AAC7D,qBAAO,MAAM,WAAW;AACxB;AAAA,YACF;AAAA,UACF,OAAO;AAEL;AAAA,UACF;AAAA,QACF;AAGA,eAAO,MAAM,QAAQ;AAAA,MACvB;AACA,UAAI,WAAY;AAEhB,YAAM,WAAW,MAAM,OAAO;AAC9B,YAAM,EAAE,SAAS,SAAS,IAAI,KAAK,QAAQ,QAAQ;AAGnD,WAAK,oBAAoB,SAAS,QAAQ;AAC1C,WAAK,kBAAkB;AAAA,IACzB,SAAS,OAAY;AACnB,UAAI,oBAAoB,KAAK,iBAAiB;AAC5C,gBAAQ,MAAM,iCAAiC,KAAK;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAgC;AACtC,WAAO,KAAK,aAAa,IAAI,CAAC,YAA0B;AACtD,cAAQ,QAAQ,MAAM;AAAA,QACpB,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAO;AAAA,YACL,MAAM,QAAQ;AAAA,YACd,SAAS,QAAQ;AAAA,UACnB;AAAA,QACF,KAAK;AACH,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,YAAY,QAAQ;AAAA,gBACpB,UAAU,QAAQ;AAAA,gBAClB,OAAO,KAAK,MAAM,QAAQ,UAAU;AAAA,cACtC;AAAA,YACF;AAAA,UACF;AAAA,QACF,KAAK;AACH,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,YAAY,QAAQ;AAAA,gBACpB,UAAU,QAAQ;AAAA,gBAClB,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,OAAO,KAAK,MAAM,QAAQ,MAAM;AAAA,gBAClC;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,MACJ;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,aAAa;AACnB,UAAM,QAAiB,CAAC;AAGxB,UAAM,cAAc,KAAK,aAAa,SAAS;AAC/C,QAAI,CAAC,YAAa,QAAO;AAEzB,SAAK,MAAM,QAAQ,CAAC,MAAM;AACxB,YAAM,EAAE,IAAI,IAAI,KAAK;AAAA,QACnB,MAAM,EAAE;AAAA,QACR,aAAa,EAAE;AAAA,QACf,aAAa,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;AAAA,QACzC,SAAS,CAAC,MAAM,EAAE,WAAW,MAC3B,KAAK,YAAY;AAAA,UACf,MAAM;AAAA,UACN;AAAA,UACA,UAAU,EAAE;AAAA,UACZ,YAAY,KAAK,UAAU,IAAI;AAAA,QACjC,CAAC;AAAA,MACL,CAAC;AAAA,IACH,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,SAAS;AACP,QAAI,CAAC,KAAK,gBAAiB;AAC3B,SAAK,IAAI,QAAQ;AACjB,SAAK,gBAAgB,MAAM;AAC3B,SAAK,kBAAkB;AAAA,EACzB;AACF;","names":[]} |
+1
-1
| { | ||
| "name": "@micdrop/ai-sdk", | ||
| "version": "1.0.3", | ||
| "version": "1.0.4", | ||
| "description": "AI SDK implementation for @micdrop/server", | ||
@@ -5,0 +5,0 @@ "author": "Lonestone", |
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
0
-100%26735
-5.18%300
-7.69%