mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-07-09 05:12:12 +02:00
update more languages
Signed-off-by: Alex Jenkins <kjenkins60@gatech.edu>
This commit is contained in:
parent
835acaa70e
commit
16c2f12a54
249 changed files with 117186 additions and 186 deletions
|
|
@ -36,10 +36,17 @@
|
|||
الإعلان عن المعلمات في تعريفات "خطط سير العمل".
|
||||
التحقق من صحة المعلمات عند بدء تشغيل سير العمل.
|
||||
استبدال المعلمات في معلمات المعالج.
|
||||
<<<<<<< HEAD
|
||||
الكشف عنها من خلال واجهات برمجة التطبيقات وواجهات المستخدم.
|
||||
|
||||
من خلال الاستفادة من معلمات معلمات المعالج، يمكن لـ TrustGraph:
|
||||
تقليل تكرار "خطط سير العمل" باستخدام المعلمات للتغيرات.
|
||||
=======
|
||||
الكشف عن المعلمات من خلال واجهات برمجة التطبيقات وواجهات المستخدم.
|
||||
|
||||
من خلال الاستفادة من معلمات معلمات المعالج، يمكن لـ TrustGraph:
|
||||
تقليل تكرار "خطط سير العمل" باستخدام المعلمات للتنوعات.
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
تمكين المستخدمين من ضبط سلوك المعالج دون تعديل التعريفات.
|
||||
دعم التكوينات الخاصة بالبيئة من خلال قيم المعلمات.
|
||||
الحفاظ على الأمان من النوع من خلال التحقق من صحة مخططات المعلمات.
|
||||
|
|
@ -148,7 +155,11 @@
|
|||
|
||||
#### مخطط سير العمل مع مراجع المعلمات
|
||||
|
||||
<<<<<<< HEAD
|
||||
تحدد مخططات سير العمل بيانات وصفية للمعلمات مع مراجع للأنواع والأوصاف والترتيب:
|
||||
=======
|
||||
تحدد مخططات سير العمل بيانات تعريف المعلمات مع مراجع الأنواع والأوصاف والترتيب:
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
|
||||
```json
|
||||
{
|
||||
|
|
@ -217,9 +228,15 @@
|
|||
}
|
||||
```
|
||||
|
||||
<<<<<<< HEAD
|
||||
القسم `parameters` يربط أسماء المعلمات الخاصة بالتدفق (المفاتيح) بكائنات بيانات تعريف المعلمات التي تحتوي على:
|
||||
`type`: مرجع إلى تعريف المعلمة المحدد مركزيًا (مثل "llm-model")
|
||||
`description`: وصف يمكن قراءته بواسطة الإنسان للعرض في واجهة المستخدم
|
||||
=======
|
||||
القسم `parameters` يربط أسماء المعلمات الخاصة بالتدفق (المفاتيح) بكائنات بيانات وصفية للمعلمات والتي تحتوي على:
|
||||
`type`: مرجع إلى تعريف المعلمة المحدد مركزيًا (مثل "llm-model")
|
||||
`description`: وصف قابل للقراءة بواسطة الإنسان للعرض في واجهة المستخدم
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
`order`: ترتيب العرض لنماذج المعلمات (تظهر الأرقام الأقل أولاً)
|
||||
`advanced` (اختياري): علامة منطقية تشير إلى ما إذا كانت هذه معلمة متقدمة (افتراضي: خطأ). عند تعيينها على "صحيح"، قد تخفي واجهة المستخدم هذه المعلمة افتراضيًا أو تضعها في قسم "متقدم"
|
||||
`controlled-by` (اختياري): اسم معلمة أخرى تتحكم في قيمة هذه المعلمة عند التواجد في الوضع البسيط. عند تحديدها، ترث هذه المعلمة قيمتها من المعلمة المتحكمة ما لم يتم تجاوزها بشكل صريح
|
||||
|
|
@ -227,7 +244,11 @@
|
|||
تسمح هذه الطريقة بما يلي:
|
||||
تعريفات أنواع معلمات قابلة لإعادة الاستخدام عبر قوالب تدفق متعددة
|
||||
إدارة مركزية لأنواع المعلمات والتحقق من صحتها
|
||||
<<<<<<< HEAD
|
||||
أوصاف وترتيب المعلمات الخاصة بالتدفق
|
||||
=======
|
||||
أوصاف وترتيب معلمات خاصة بالتدفق
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
تجربة واجهة مستخدم محسنة مع نماذج معلمات وصفية
|
||||
التحقق من صحة المعلمات بشكل متسق عبر التدفقات
|
||||
إضافة سهلة لأنواع معلمات قياسية جديدة
|
||||
|
|
@ -253,9 +274,15 @@
|
|||
ملاحظة: في هذا المثال، `llm-rag-model` غير مقدمة بشكل صريح ولكنها سترث القيمة "claude-3" من `llm-model` بسبب علاقتها مع `controlled-by`. وبالمثل، يمكن أن ترث `chunk-overlap` قيمة محسوبة بناءً على `chunk-size`.
|
||||
|
||||
سيقوم النظام بما يلي:
|
||||
<<<<<<< HEAD
|
||||
1. استخراج بيانات تعريف المعلمات من تعريف مخطط التدفق
|
||||
2. مطابقة أسماء معلمات التدفق مع تعريفات أنواعها (على سبيل المثال، `llm-model` → نوع `llm-model`)
|
||||
3. حل علاقات "يتم التحكم بها" (على سبيل المثال، ترث `llm-rag-model` من `llm-model`)
|
||||
=======
|
||||
1. استخراج بيانات وصفية للمعلمات من تعريف مخطط التدفق
|
||||
2. ربط أسماء معلمات التدفق بتعريفات أنواعها (مثل: `llm-model` → نوع `llm-model`)
|
||||
3. حل علاقات "التحكم بواسطة" (مثل: `llm-rag-model` ترث من `llm-model`)
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
4. التحقق من صحة القيم المقدمة من المستخدم والقيم الموروثة مقابل تعريفات أنواع المعلمات
|
||||
5. استبدال القيم التي تم حلها في معلمات المعالج أثناء إنشاء التدفق
|
||||
|
||||
|
|
@ -265,25 +292,41 @@
|
|||
|
||||
عندما يتم بدء تدفق، يقوم النظام بتنفيذ الخطوات التالية لحل المعلمات:
|
||||
|
||||
<<<<<<< HEAD
|
||||
1. **تحميل مخطط التدفق**: تحميل تعريف مخطط التدفق واستخراج بيانات تعريف المعلمات
|
||||
2. **استخراج البيانات الوصفية**: استخراج `type`، `description`، `order`، `advanced`، و `controlled-by` لكل معلمة معرفة في قسم `parameters` الخاص بمخطط التدفق
|
||||
3. **البحث عن تعريف النوع**: لكل معلمة في مخطط التدفق:
|
||||
استرجاع تعريف نوع المعلمة من متجر المخطط/التكوين باستخدام حقل `type`
|
||||
=======
|
||||
1. **تحميل مخطط التدفق**: تحميل تعريف مخطط التدفق واستخراج بيانات وصفية للمعلمات
|
||||
2. **استخراج البيانات الوصفية**: استخراج `type`، `description`، `order`، `advanced`، و `controlled-by` لكل معلمة معرفة في قسم `parameters` الخاص بمخطط التدفق
|
||||
3. **البحث عن تعريف النوع**: لكل معلمة في مخطط التدفق:
|
||||
استرجاع تعريف نوع المعلمة من متجر المخططات/التكوين باستخدام حقل `type`
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
يتم تخزين تعريفات الأنواع مع النوع "parameter-type" في نظام التكوين
|
||||
يحتوي كل تعريف نوع على مخطط المعلمة والقيمة الافتراضية وقواعد التحقق من الصحة
|
||||
4. **حل القيمة الافتراضية**:
|
||||
لكل معلمة معرفة في مخطط التدفق:
|
||||
التحقق مما إذا كان المستخدم قد قدم قيمة لهذه المعلمة
|
||||
إذا لم يتم تقديم قيمة من قبل المستخدم، استخدم القيمة `default` من تعريف نوع المعلمة
|
||||
<<<<<<< HEAD
|
||||
إنشاء خريطة معلمات كاملة تحتوي على كل من القيم المقدمة من قبل المستخدم والقيم الافتراضية
|
||||
5. **حل إرث المعلمات** (علاقات "يتم التحكم بها"):
|
||||
=======
|
||||
إنشاء خريطة كاملة للمعلمات تحتوي على كل من القيم المقدمة من قبل المستخدم والقيم الافتراضية
|
||||
5. **حل إرث المعلمات** (علاقات "التحكم بواسطة"):
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
للمعلمات التي تحتوي على حقل `controlled-by`، تحقق مما إذا تم توفير قيمة بشكل صريح
|
||||
إذا لم يتم توفير قيمة صريحة، فقم بوراثة القيمة من المعلمة المسيطرة
|
||||
إذا كانت المعلمة المسيطرة أيضًا لا تحتوي على قيمة، فاستخدم القيمة الافتراضية من تعريف النوع
|
||||
التحقق من عدم وجود تبعيات دائرية في علاقات `controlled-by`
|
||||
6. **التحقق من الصحة**: التحقق من صحة مجموعة المعلمات الكاملة (القيم المقدمة من قبل المستخدم والقيم الافتراضية والقيم الموروثة) مقابل تعريفات الأنواع
|
||||
7. **التخزين**: تخزين مجموعة المعلمات التي تم حلها بالكامل مع مثيل التدفق لأغراض التدقيق
|
||||
<<<<<<< HEAD
|
||||
8. **الاستبدال القالب**: استبدال عناصر نائب المعلمات في معلمات المعالج بالقيم التي تم حلها
|
||||
=======
|
||||
8. **استبدال القوالب**: استبدال عناصر نطق المعلمات في معلمات المعالج بالقيم التي تم حلها
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
9. **إنشاء المعالجات**: إنشاء معالجات بمعلمات مستبدلة
|
||||
|
||||
**ملاحظات تنفيذ مهمة:**
|
||||
|
|
@ -292,7 +335,11 @@
|
|||
يحدث حل المعلمات في وقت بدء التدفق، وليس في وقت إنشاء المعالج
|
||||
يجب أن يؤدي عدم وجود معلمات مطلوبة بدون قيم افتراضية إلى فشل بدء التدفق مع رسالة خطأ واضحة
|
||||
|
||||
<<<<<<< HEAD
|
||||
#### إرث المعلمات مع "يتم التحكم بها"
|
||||
=======
|
||||
#### إرث المعلمات مع "التحكم بواسطة"
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
|
||||
يتيح الحقل `controlled-by` وراثة قيمة المعلمة، وهو مفيد بشكل خاص لتبسيط واجهات المستخدم مع الحفاظ على المرونة:
|
||||
|
||||
|
|
@ -370,34 +417,57 @@
|
|||
```
|
||||
|
||||
يجب أن تقوم هذه الدالة بما يلي:
|
||||
<<<<<<< HEAD
|
||||
استخراج بيانات تعريف المعلمات من قسم `parameters` في مخطط سير العمل.
|
||||
لكل معلمة، استرداد تعريف النوع الخاص بها من مستودع التكوين.
|
||||
=======
|
||||
استخراج بيانات تعريف المعلمات من قسم `parameters` في مخطط التدفق.
|
||||
لكل معلمة، استرجاع تعريف النوع الخاص بها من مستودع التكوين.
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
تطبيق القيم الافتراضية لأي معلمات لم يتم توفيرها من قبل المستخدم.
|
||||
التعامل مع علاقات الوراثة `controlled-by`.
|
||||
إرجاع المجموعة الكاملة للمعلمات.
|
||||
|
||||
2. **الطريقة المعدلة `handle_start_flow`**
|
||||
<<<<<<< HEAD
|
||||
استدعاء `resolve_parameters` بعد تحميل مخطط سير العمل.
|
||||
استخدام المجموعة الكاملة للمعلمات التي تم حلها للاستبدال في القوالب.
|
||||
تخزين المجموعة الكاملة للمعلمات (وليس فقط المعلمات التي قدمها المستخدم) مع سير العمل.
|
||||
التحقق من أن جميع المعلمات المطلوبة لها قيم.
|
||||
|
||||
3. **استرداد أنواع المعلمات**
|
||||
=======
|
||||
استدعاء `resolve_parameters` بعد تحميل مخطط التدفق.
|
||||
استخدام المجموعة الكاملة للمعلمات التي تم حلها للاستبدال في القوالب.
|
||||
تخزين المجموعة الكاملة للمعلمات (وليس فقط المعلمات التي قدمها المستخدم) مع التدفق.
|
||||
التحقق من أن جميع المعلمات المطلوبة لها قيم.
|
||||
|
||||
3. **استرجاع أنواع المعلمات**
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
يتم تخزين تعريفات أنواع المعلمات في التكوين بنوع "parameter-type".
|
||||
يحتوي كل تعريف نوع على مخطط وقيمة افتراضية وقواعد تحقق.
|
||||
تخزين أنواع المعلمات المستخدمة بشكل متكرر في ذاكرة التخزين المؤقت لتقليل عمليات البحث في التكوين.
|
||||
|
||||
#### تكامل نظام التكوين
|
||||
|
||||
<<<<<<< HEAD
|
||||
3. **تخزين كائنات سير العمل**
|
||||
عندما تتم إضافة سير عمل إلى نظام التكوين بواسطة مكون سير العمل في مدير التكوين، يجب أن تتضمن كائن سير العمل قيم المعلمات التي تم حلها.
|
||||
يحتاج مدير التكوين إلى تخزين كل من المعلمات التي قدمها المستخدم في الأصل والقيم التي تم حلها (مع تطبيق القيم الافتراضية).
|
||||
يجب أن تتضمن كائنات سير العمل في نظام التكوين:
|
||||
`parameters`: القيم النهائية للمعلمات التي تم حلها والتي تم استخدامها لسير العمل.
|
||||
=======
|
||||
3. **تخزين كائنات التدفق**
|
||||
عندما تتم إضافة تدفق إلى نظام التكوين بواسطة مكون التدفق في مدير التكوين، يجب أن تتضمن كائن التدفق قيم المعلمات التي تم حلها.
|
||||
يحتاج مدير التكوين إلى تخزين كل من المعلمات التي قدمها المستخدم في الأصل والقيم التي تم حلها (مع تطبيق القيم الافتراضية).
|
||||
يجب أن تتضمن كائنات التدفق في نظام التكوين:
|
||||
`parameters`: القيم النهائية للمعلمات التي تم حلها والتي تم استخدامها للتدفق.
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
|
||||
#### تكامل واجهة سطر الأوامر
|
||||
|
||||
4. **أوامر واجهة سطر الأوامر الخاصة بالمكتبة**
|
||||
<<<<<<< HEAD
|
||||
تحتاج أوامر واجهة سطر الأوامر التي تبدأ سير العمل إلى دعم المعلمات:
|
||||
قبول قيم المعلمات عبر علامات سطر الأوامر أو ملفات التكوين.
|
||||
التحقق من صحة المعلمات مقابل تعريفات مخطط سير العمل قبل الإرسال.
|
||||
|
|
@ -406,16 +476,34 @@
|
|||
تحتاج أوامر واجهة سطر الأوامر التي تعرض سير العمل إلى عرض معلومات المعلمات:
|
||||
عرض قيم المعلمات المستخدمة عند بدء سير العمل.
|
||||
عرض المعلمات المتاحة لمخطط سير عمل.
|
||||
=======
|
||||
تحتاج أوامر واجهة سطر الأوامر التي تبدأ التدفقات إلى دعم المعلمات:
|
||||
قبول قيم المعلمات عبر علامات سطر الأوامر أو ملفات التكوين.
|
||||
التحقق من صحة المعلمات مقابل تعريفات مخطط التدفق قبل الإرسال.
|
||||
دعم إدخال ملفات المعلمات (JSON/YAML) لمجموعات المعلمات المعقدة.
|
||||
|
||||
تحتاج أوامر واجهة سطر الأوامر التي تعرض التدفقات إلى عرض معلومات المعلمات:
|
||||
عرض قيم المعلمات المستخدمة عند بدء التدفق.
|
||||
عرض المعلمات المتاحة لمخطط تدفق.
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
عرض مخططات التحقق من صحة المعلمات والقيم الافتراضية.
|
||||
|
||||
#### تكامل الفئة الأساسية للمعالج
|
||||
|
||||
5. **دعم ParameterSpec**
|
||||
<<<<<<< HEAD
|
||||
تحتاج الفئات الأساسية للمعالج إلى دعم استبدال المعلمات من خلال آلية ParametersSpec الحالية.
|
||||
يجب تحسين فئة ParametersSpec (الموجودة في نفس الوحدة النمطية مثل ConsumerSpec و ProducerSpec) إذا لزم الأمر لدعم استبدال القوالب للمعلمات.
|
||||
يجب أن تكون المعالجات قادرة على استدعاء ParametersSpec لتكوين معامها باستخدام قيم المعلمات التي تم حلها في وقت بدء سير العمل.
|
||||
يجب أن تقوم تنفيذ ParametersSpec بما يلي:
|
||||
قبول تكوينات المعلمات التي تحتوي على عناصر نائبة للمعلمات (مثل `{model}`، `{temperature}`).
|
||||
=======
|
||||
يجب أن تدعم الفئات الأساسية للمعالج استبدال المعلمات من خلال آلية ParametersSpec الحالية.
|
||||
يجب تحسين فئة ParametersSpec (الموجودة في نفس الوحدة كما ConsumerSpec و ProducerSpec) إذا لزم الأمر لدعم استبدال القوالب للمعلمات.
|
||||
يجب أن تكون المعالجات قادرة على استدعاء ParametersSpec لتكوين معامها باستخدام قيم المعلمات التي تم حلها في وقت بدء التدفق.
|
||||
يجب أن تقوم تنفيذ ParametersSpec بما يلي:
|
||||
قبول تكوينات المعلمات التي تحتوي على عناصر نائب للمعلمات (مثل `{model}`، `{temperature}`).
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
دعم استبدال المعلمات في وقت التشغيل عند إنشاء المعالج.
|
||||
التحقق من أن القيم المستبدلة تتطابق مع الأنواع والقيود المتوقعة.
|
||||
توفير معالجة الأخطاء للإشارات المفقودة أو غير الصالحة للمعلمات.
|
||||
|
|
@ -423,7 +511,11 @@
|
|||
#### قواعد الاستبدال
|
||||
|
||||
تستخدم المعلمات التنسيق `{parameter-name}` في معلمات المعالج.
|
||||
<<<<<<< HEAD
|
||||
تتطابق أسماء المعلمات في المعلمات مع المفاتيح في قسم `parameters` في سير العمل.
|
||||
=======
|
||||
تتطابق أسماء المعلمات في المعلمات مع المفاتيح في قسم `parameters` في التدفق.
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
يحدث الاستبدال جنبًا إلى جنب مع استبدال `{id}` و `{class}`.
|
||||
تؤدي الإشارات غير الصالحة للمعلمات إلى أخطاء في وقت بدء التشغيل.
|
||||
يحدث التحقق من النوع بناءً على تعريف المعلمة المخزن مركزيًا.
|
||||
|
|
@ -449,21 +541,35 @@ Substituted in processor: "0.7" (string)
|
|||
|
||||
اختبارات الوحدة للتحقق من صحة مخططات المعلمات.
|
||||
اختبارات التكامل لاستبدال المعلمات في معلمات المعالج.
|
||||
<<<<<<< HEAD
|
||||
اختبارات شاملة لإطلاق العمليات التدفقية بقيم معلمات مختلفة.
|
||||
اختبارات واجهة المستخدم لإنشاء النموذج والتحقق من صحة المعلمات.
|
||||
اختبارات الأداء للعمليات التدفقية التي تحتوي على العديد من المعلمات.
|
||||
=======
|
||||
اختبارات شاملة لإطلاق العمليات مع قيم معلمات مختلفة.
|
||||
اختبارات واجهة المستخدم لإنشاء النموذج والتحقق من صحة المعلمات.
|
||||
اختبارات الأداء للعمليات التي تحتوي على العديد من المعلمات.
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
حالات حافة: معلمات مفقودة، وأنواع غير صالحة، وإشارات غير معرفة للمعلمات.
|
||||
|
||||
## خطة الترحيل
|
||||
|
||||
<<<<<<< HEAD
|
||||
1. يجب أن يستمر النظام في دعم مخططات العمليات التدفقية التي لا تحتوي على معلمات.
|
||||
معلنة.
|
||||
2. يجب أن يستمر النظام في دعم العمليات التدفقية التي لا يتم فيها تحديد أي معلمات:
|
||||
هذا يعمل للعمليات التدفقية التي لا تحتوي على معلمات، وللعمليات التدفقية التي تحتوي على معلمات
|
||||
=======
|
||||
1. يجب أن يستمر النظام في دعم نماذج العمليات بدون معلمات
|
||||
مُعرّفة.
|
||||
2. يجب أن يستمر النظام في دعم العمليات بدون تحديد معلمات:
|
||||
هذا يعمل للعمليات التي لا تحتوي على معلمات، وللعمليات التي تحتوي على معلمات
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
(لديها قيم افتراضية).
|
||||
|
||||
## أسئلة مفتوحة
|
||||
|
||||
<<<<<<< HEAD
|
||||
س: هل يجب أن تدعم المعلمات كائنات متداخلة معقدة أم يجب الالتزام بأنواع بسيطة؟
|
||||
ج: سيتم ترميز قيم المعلمات كسلاسل نصية، لذلك من المحتمل أن نلتزم بالسلاسل النصية.
|
||||
|
||||
|
|
@ -478,8 +584,28 @@ Substituted in processor: "0.7" (string)
|
|||
|
||||
س: هل يجب أن ندعم المعلمات المحسوبة (المشتقة من معلمات أخرى)؟
|
||||
ج: مجرد استبدال السلاسل النصية لإزالة عمليات الحقن والحالات الحافة الغريبة.
|
||||
=======
|
||||
س: هل يجب أن تدعم المعلمات كائنات متداخلة معقدة أم تقتصر على الأنواع البسيطة؟
|
||||
ج: سيتم ترميز قيم المعلمات كسلاسل نصية، ومن المحتمل أن نلتزم بالسلاسل النصية.
|
||||
|
||||
|
||||
س: هل يجب السماح بوضع إشارات المعلمات في أسماء قوائم الانتظار أم فقط في
|
||||
المعلمات؟
|
||||
ج: فقط في المعلمات لإزالة الحقن والحالات الحافة الغريبة.
|
||||
|
||||
س: كيف نتعامل مع التعارضات بين أسماء المعلمات ومتغيرات النظام مثل
|
||||
`id` و `class`؟
|
||||
ج: من غير المسموح بتحديد المعرف (id) والفئة (class) عند إطلاق عملية.
|
||||
|
||||
س: هل يجب أن ندعم المعلمات المحسوبة (المشتقة من معلمات أخرى)؟
|
||||
ج: مجرد استبدال السلاسل النصية لإزالة الحقن والحالات الحافة الغريبة.
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
|
||||
## المراجع
|
||||
|
||||
مواصفات مخطط JSON: https://json-schema.org/
|
||||
<<<<<<< HEAD
|
||||
مواصفات تعريف مخطط العمليات التدفقية: docs/tech-specs/flow-class-definition.md
|
||||
=======
|
||||
مواصفات تعريف نموذج العملية: docs/tech-specs/flow-class-definition.md
|
||||
>>>>>>> 82edf2d (New md files from RunPod)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue