From c39c84dd4f17ce27428308cd7acb20fcefa5a8b1 Mon Sep 17 00:00:00 2001 From: roostAI <108646238+roostAI@users.noreply.github.com> Date: Wed, 10 Dec 2025 12:43:21 +0000 Subject: [PATCH] Functional test generated by RoostGPT Using AI Model claude-opus-4-5-20251101 --- functional_tests/README.md | 17 ++ .../ZBIO-7556/.roost/roost_metadata.json | 19 ++ functional_tests/ZBIO-7556/ZBIO-7556.csv | 16 ++ functional_tests/ZBIO-7556/ZBIO-7556.feature | 230 ++++++++++++++++++ functional_tests/ZBIO-7556/ZBIO-7556.json | 104 ++++++++ functional_tests/ZBIO-7556/ZBIO-7556.xlsx | Bin 0 -> 8950 bytes 6 files changed, 386 insertions(+) create mode 100644 functional_tests/README.md create mode 100644 functional_tests/ZBIO-7556/.roost/roost_metadata.json create mode 100644 functional_tests/ZBIO-7556/ZBIO-7556.csv create mode 100644 functional_tests/ZBIO-7556/ZBIO-7556.feature create mode 100644 functional_tests/ZBIO-7556/ZBIO-7556.json create mode 100644 functional_tests/ZBIO-7556/ZBIO-7556.xlsx diff --git a/functional_tests/README.md b/functional_tests/README.md new file mode 100644 index 0000000..daab98b --- /dev/null +++ b/functional_tests/README.md @@ -0,0 +1,17 @@ +# Roost Generated Functional Test + +**Execution Date:** 12/10/2025, 12:43:19 PM + +**Test Unique Identifier:** "ZBIO-7556" + +**Input(s):** + 1. JIRA ID: ZBIO-7556 + +**Test Output Folder:** + 1. [ZBIO-7556.json](ZBIO-7556/ZBIO-7556.json) + 2. [ZBIO-7556.feature](ZBIO-7556/ZBIO-7556.feature) + 3. [ZBIO-7556.csv](ZBIO-7556/ZBIO-7556.csv) + 4. [ZBIO-7556.xlsx](ZBIO-7556/ZBIO-7556.xlsx) + +--- + diff --git a/functional_tests/ZBIO-7556/.roost/roost_metadata.json b/functional_tests/ZBIO-7556/.roost/roost_metadata.json new file mode 100644 index 0000000..a19f244 --- /dev/null +++ b/functional_tests/ZBIO-7556/.roost/roost_metadata.json @@ -0,0 +1,19 @@ +{ + "project": { + "name": "ZBIO-7556", + "created_at": "2025-12-10T12:43:19.610Z", + "updated_at": "2025-12-10T12:43:19.610Z" + }, + "files": { + "input_files": [ + { + "fileName": "ZBIO-7556.txt", + "fileURI": "/var/tmp/Roost/RoostGPT/hebrew-dec10/631a5fd2-9d45-4abb-849e-f706172a6a1c/functional_tests/ZBIO-7556/ZBIO-7556.txt", + "fileSha": "b0650ff01f" + } + ] + }, + "api_files": { + "input_files": [] + } +} \ No newline at end of file diff --git a/functional_tests/ZBIO-7556/ZBIO-7556.csv b/functional_tests/ZBIO-7556/ZBIO-7556.csv new file mode 100644 index 0000000..8f5abe0 --- /dev/null +++ b/functional_tests/ZBIO-7556/ZBIO-7556.csv @@ -0,0 +1,16 @@ +הגשת בקשה למשכנתא עם פרטים תקינים +חישוב החזר חודשי למשכנתא +אימות שדות חובה בטופס משכנתא +הגשת טופס משכנתא עם כל השדות ריקים +בדיקת מסלולי משכנתא שונים +העלאת מסמכים לבקשת משכנתא +העלאת מספר מסמכים לבקשת משכנתא +בדיקת הזנת סכום משכנתא לא תקין +צפייה בסטטוס בקשת משכנתא +צפייה בפרטי בקשת משכנתא מלאים +שמירת טיוטת בקשת משכנתא +אחזור טיוטת בקשת משכנתא שמורה +בדיקת זמן טעינת דף בקשת משכנתא +בדיקת זמני טעינה של דפים שונים במערכת +בדיקת אבטחת נתוני משכנתא - העברת נתונים מוצפנת +בדיקת אבטחת העברת נתונים רגישים \ No newline at end of file diff --git a/functional_tests/ZBIO-7556/ZBIO-7556.feature b/functional_tests/ZBIO-7556/ZBIO-7556.feature new file mode 100644 index 0000000..d9ed6f1 --- /dev/null +++ b/functional_tests/ZBIO-7556/ZBIO-7556.feature @@ -0,0 +1,230 @@ +Feature: מערכת בקשות משכנתא + כמשתמש במערכת הבנקאית + אני רוצה להגיש ולנהל בקשות משכנתא + כדי לקבל מימון לרכישת נכס + + Background: + Given המשתמש מחובר למערכת עם חשבון פעיל + And הדפדפן פתוח ומוכן לשימוש + + # ==================== בדיקות פונקציונליות - הגשת בקשה ==================== + + @functional @ui @TC-001 + Scenario Outline: הגשת בקשה למשכנתא עם פרטים תקינים + Given אני נמצא בדף בקשת משכנתא + When אני מזין סכום משכנתא מבוקש '<סכום_משכנתא>' + And אני מזין תקופת החזר '<תקופת_החזר>' + And אני מזין הכנסה חודשית '<הכנסה_חודשית>' + And אני מעלה מסמך '<סוג_מסמך>' + And אני לוחץ על כפתור 'הגש בקשה' + Then אני אמור לראות הודעת אישור 'הבקשה נשלחה בהצלחה' + And אני אמור לראות מספר בקשה ייחודי + + Examples: + | סכום_משכנתא | תקופת_החזר | הכנסה_חודשית | סוג_מסמך | + | 1,000,000 | 20 שנים | 25,000 | תלוש שכר | + | 500,000 | 15 שנים | 18,000 | אישור העסקה | + | 1,500,000 | 25 שנים | 35,000 | תלוש שכר | + | 800,000 | 10 שנים | 22,000 | אישור העסקה | + + # ==================== בדיקות מחשבון משכנתא ==================== + + @functional @ui @TC-002 + Scenario Outline: חישוב החזר חודשי למשכנתא + Given אני נמצא בדף מחשבון המשכנתא + When אני מזין סכום משכנתא '<סכום>' + And אני מזין תקופת החזר '<תקופה>' + And אני מזין שיעור ריבית '<ריבית>' + And אני לוחץ על כפתור 'חשב' + Then אני אמור לראות החזר חודשי משוער של כ-'<החזר_צפוי>' + + Examples: + | סכום | תקופה | ריבית | החזר_צפוי | + | 500,000 | 15 שנים | 4% | 3,698 ₪ | + | 1,000,000 | 20 שנים | 3.5% | 5,800 ₪ | + | 750,000 | 25 שנים | 4.5% | 4,170 ₪ | + | 300,000 | 10 שנים | 3% | 2,897 ₪ | + + # ==================== בדיקות ולידציה - שדות חובה ==================== + + @functional @ui @negative @TC-003 + Scenario Outline: אימות שדות חובה בטופס משכנתא + Given אני נמצא בדף בקשת משכנתא + When אני משאיר את שדה '<שם_שדה>' ריק + And אני לוחץ על כפתור 'הגש בקשה' + Then אני אמור לראות הודעת שגיאה '<הודעת_שגיאה>' + And הטופס לא אמור להישלח + + Examples: + | שם_שדה | הודעת_שגיאה | + | סכום משכנתא | שדה סכום משכנתא הוא שדה חובה | + | תקופת החזר | שדה תקופת החזר הוא שדה חובה | + | הכנסה חודשית | שדה הכנסה חודשית הוא שדה חובה | + | מסמכים נדרשים | יש להעלות מסמכים נדרשים | + + @functional @ui @negative @TC-003 + Scenario: הגשת טופס משכנתא עם כל השדות ריקים + Given אני נמצא בדף בקשת משכנתא + When אני משאיר את כל שדות החובה ריקים + And אני לוחץ על כפתור 'הגש בקשה' + Then אני אמור לראות הודעות שגיאה ליד כל שדה חובה + And הטופס לא אמור להישלח + + # ==================== בדיקות מסלולי משכנתא ==================== + + @functional @ui @TC-004 + Scenario Outline: בדיקת מסלולי משכנתא שונים + Given אני נמצא בדף בחירת מסלול משכנתא + When אני בוחר מסלול '<שם_מסלול>' + Then אני אמור לראות שיעור ריבית '<שיעור_ריבית>' + And אני אמור לראות סוג הצמדה '<סוג_הצמדה>' + And אני אמור לראות תקופת החזר מקסימלית '<תקופה_מקסימלית>' + + Examples: + | שם_מסלול | שיעור_ריבית | סוג_הצמדה | תקופה_מקסימלית | + | פריים | פריים + 0.5% | לא צמודה | 30 שנים | + | קבועה לא צמודה | 4.5% | לא צמודה | 25 שנים | + | משתנה צמודה למדד | 3.5% | צמודה למדד | 30 שנים | + | קבועה צמודה למדד | 3% | צמודה למדד | 20 שנים | + + # ==================== בדיקות העלאת מסמכים ==================== + + @functional @ui @TC-005 + Scenario Outline: העלאת מסמכים לבקשת משכנתא + Given אני נמצא בשלב העלאת מסמכים בתהליך הבקשה + When אני לוחץ על כפתור 'העלה מסמך' + And אני בוחר קובץ '<סוג_קובץ>' בשם '<שם_קובץ>' + And אני מאשר את ההעלאה + Then המסמך '<שם_קובץ>' אמור להופיע ברשימת המסמכים המצורפים + And אני אמור לראות הודעה 'המסמך הועלה בהצלחה' + + Examples: + | סוג_קובץ | שם_קובץ | + | PDF | תלוש_שכר.pdf | + | JPG | תעודת_זהות.jpg | + | PNG | אישור_העסקה.png | + | PDF | דוח_בנקאי.pdf | + + @functional @ui @TC-005 + Scenario: העלאת מספר מסמכים לבקשת משכנתא + Given אני נמצא בשלב העלאת מסמכים בתהליך הבקשה + When אני מעלה קובץ PDF של תלוש שכר + And אני מעלה קובץ תמונה JPG של תעודת זהות + Then שני המסמכים אמורים להופיע ברשימת המסמכים המצורפים + And אני אמור לראות 2 מסמכים ברשימה + + # ==================== בדיקות קלט לא תקין ==================== + + @functional @ui @negative @TC-006 + Scenario Outline: בדיקת הזנת סכום משכנתא לא תקין + Given אני נמצא בדף בקשת משכנתא + When אני מזין '<ערך_לא_תקין>' בשדה סכום המשכנתא + And אני מנסה להמשיך לשלב הבא + Then אני אמור לראות הודעת שגיאה '<הודעת_שגיאה>' + And אני לא אמור להצליח להמשיך בתהליך + + Examples: + | ערך_לא_תקין | הודעת_שגיאה | + | -100,000 | סכום המשכנתא חייב להיות חיובי | + | אבג | יש להזין מספרים בלבד | + | 50,000,000 | סכום המשכנתא חורג מהמקסימום המותר | + | 0 | סכום המשכנתא חייב להיות גדול מאפס | + | 10,000 | סכום המשכנתא נמוך מהמינימום הנדרש | + + # ==================== בדיקות סטטוס בקשה ==================== + + @functional @ui @TC-007 + Scenario Outline: צפייה בסטטוס בקשת משכנתא + Given המשתמש הגיש בקשת משכנתא בעבר + And אני מחובר למערכת + When אני נווט לאזור 'הבקשות שלי' + And אני לוחץ על בקשת המשכנתא עם סטטוס '<סטטוס>' + Then אני אמור לראות את סטטוס הבקשה '<סטטוס>' + And אני אמור לראות תאריך עדכון אחרון + + Examples: + | סטטוס | + | ממתין לאישור | + | בבדיקה | + | מאושר | + | נדחה | + + @functional @ui @TC-007 + Scenario: צפייה בפרטי בקשת משכנתא מלאים + Given המשתמש הגיש בקשת משכנתא בעבר + And אני מחובר למערכת + When אני נווט לאזור 'הבקשות שלי' + And אני לוחץ על בקשת המשכנתא לצפייה בפרטים + Then אני אמור לראות את סכום המשכנתא המבוקש + And אני אמור לראות את תקופת ההחזר + And אני אמור לראות את סטטוס הבקשה + And אני אמור לראות את תאריך הגשת הבקשה + + # ==================== בדיקות שמירת טיוטה ==================== + + @functional @ui @TC-008 + Scenario: שמירת טיוטת בקשת משכנתא + Given אני מחובר למערכת + And אני נמצא בדף בקשת משכנתא + When אני ממלא סכום משכנתא '750,000' + And אני ממלא תקופת החזר '18 שנים' + And אני לוחץ על כפתור 'שמור כטיוטה' + Then אני אמור לראות הודעה 'הטיוטה נשמרה בהצלחה' + + @functional @ui @TC-008 + Scenario: אחזור טיוטת בקשת משכנתא שמורה + Given שמרתי טיוטת בקשת משכנתא עם סכום '750,000' ותקופה '18 שנים' + And התנתקתי מהמערכת + When אני מתחבר מחדש למערכת + And אני נווט לאזור 'טיוטות' + And אני פותח את הטיוטה השמורה + Then אני אמור לראות סכום משכנתא '750,000' + And אני אמור לראות תקופת החזר '18 שנים' + + # ==================== בדיקות לא פונקציונליות - ביצועים ==================== + + @non-functional @performance @TC-009 + Scenario: בדיקת זמן טעינת דף בקשת משכנתא + Given הדפדפן פתוח עם מטמון נקי + And חיבור האינטרנט יציב בקצב סטנדרטי + When אני נווט לדף בקשת משכנתא + Then הדף אמור להיטען במלואו תוך פחות מ-3 שניות + And כל האלמנטים בדף אמורים להיות מוצגים + + @non-functional @performance @TC-009 + Scenario Outline: בדיקת זמני טעינה של דפים שונים במערכת + Given הדפדפן פתוח עם מטמון נקי + When אני נווט לדף '<שם_דף>' + Then הדף אמור להיטען תוך פחות מ-'<זמן_מקסימלי>' שניות + + Examples: + | שם_דף | זמן_מקסימלי | + | בקשת משכנתא | 3 | + | מחשבון משכנתא | 2 | + | הבקשות שלי | 3 | + | בחירת מסלול | 2 | + + # ==================== בדיקות לא פונקציונליות - אבטחה ==================== + + @non-functional @security @TC-010 + Scenario: בדיקת אבטחת נתוני משכנתא - העברת נתונים מוצפנת + Given כלי ניטור רשת פעיל + And אני נמצא בדף בקשת משכנתא + When אני ממלא את הטופס עם נתונים רגישים + And אני מגיש את הבקשה + Then כל התעבורה אמורה להיות מועברת באמצעות HTTPS + And הנתונים הרגישים אמורים להיות מוצפנים + + @non-functional @security @TC-010 + Scenario Outline: בדיקת אבטחת העברת נתונים רגישים + Given כלי ניטור רשת פעיל + When אני שולח נתון רגיש מסוג '<סוג_נתון>' + Then הנתון אמור להיות מוצפן בתעבורת הרשת + And הנתון לא אמור להיות קריא בטקסט גלוי + + Examples: + | סוג_נתון | + | מספר תעודת זהות | + | הכנסה חודשית | + | פרטי חשבון בנק | + | סכום משכנתא | diff --git a/functional_tests/ZBIO-7556/ZBIO-7556.json b/functional_tests/ZBIO-7556/ZBIO-7556.json new file mode 100644 index 0000000..571553c --- /dev/null +++ b/functional_tests/ZBIO-7556/ZBIO-7556.json @@ -0,0 +1,104 @@ +{ + "scenarios": [ + { + "type": "functional", + "title": "הגשת בקשה למשכנתא עם פרטים תקינים", + "description": "אימות הגשת בקשה למשכנתא עם כל הפרטים הנדרשים.", + "testId": "TC-001", + "testDescription": "משתמש ממלא את כל השדות הנדרשים בטופס בקשת משכנתא ומגיש את הבקשה בהצלחה.", + "prerequisites": "המשתמש מחובר למערכת ויש לו חשבון פעיל.", + "stepsToPerform": "1. נווט לדף בקשת משכנתא.\n2. הזן סכום משכנתא מבוקש (לדוגמה: 1,000,000 ₪).\n3. הזן תקופת החזר (לדוגמה: 20 שנים).\n4. הזן הכנסה חודשית (לדוגמה: 25,000 ₪).\n5. העלה מסמכים נדרשים (תלושי שכר, אישור העסקה).\n6. לחץ על כפתור 'הגש בקשה'.", + "expectedResult": "הבקשה נשלחת בהצלחה ומוצגת הודעת אישור עם מספר בקשה ייחודי." + }, + { + "type": "functional", + "title": "חישוב החזר חודשי למשכנתא", + "description": "אימות נכונות חישוב ההחזר החודשי על פי הפרמטרים שהוזנו.", + "testId": "TC-002", + "testDescription": "המערכת מחשבת את ההחזר החודשי המשוער על בסיס סכום המשכנתא, תקופת ההחזר ושיעור הריבית.", + "prerequisites": "מחשבון המשכנתא זמין בדף הבקשה.", + "stepsToPerform": "1. נווט למחשבון המשכנתא.\n2. הזן סכום משכנתא: 500,000 ₪.\n3. הזן תקופת החזר: 15 שנים.\n4. הזן שיעור ריבית: 4%.\n5. לחץ על כפתור 'חשב'.", + "expectedResult": "המערכת מציגה החזר חודשי משוער של כ-3,698 ₪ (בהתאם לנוסחת החישוב)." + }, + { + "type": "functional", + "title": "אימות שדות חובה בטופס משכנתא", + "description": "בדיקה שהמערכת מציגה הודעות שגיאה כאשר שדות חובה ריקים.", + "testId": "TC-003", + "testDescription": "המשתמש מנסה להגיש טופס משכנתא ללא מילוי שדות חובה.", + "prerequisites": "המשתמש נמצא בדף בקשת משכנתא.", + "stepsToPerform": "1. נווט לדף בקשת משכנתא.\n2. השאר את שדה סכום המשכנתא ריק.\n3. השאר את שדה תקופת ההחזר ריק.\n4. לחץ על כפתור 'הגש בקשה'.", + "expectedResult": "המערכת מציגה הודעות שגיאה ליד כל שדה חובה ריק ומונעת את הגשת הטופס." + }, + { + "type": "functional", + "title": "בדיקת מסלולי משכנתא שונים", + "description": "אימות אפשרות בחירה בין מסלולי משכנתא שונים.", + "testId": "TC-004", + "testDescription": "המשתמש בוחר מסלולי משכנתא שונים ורואה את ההבדלים בתנאים.", + "prerequisites": "קיימים מספר מסלולי משכנתא במערכת.", + "stepsToPerform": "1. נווט לדף בחירת מסלול משכנתא.\n2. בחר מסלול 'פריים'.\n3. צפה בתנאי המסלול.\n4. בחר מסלול 'קבועה לא צמודה'.\n5. צפה בתנאי המסלול.\n6. בחר מסלול 'משתנה צמודה למדד'.\n7. צפה בתנאי המסלול.", + "expectedResult": "כל מסלול מציג תנאים שונים כולל שיעור ריבית, סוג הצמדה ותקופת החזר מקסימלית." + }, + { + "type": "functional", + "title": "העלאת מסמכים לבקשת משכנתא", + "description": "אימות יכולת העלאת מסמכים נדרשים לבקשה.", + "testId": "TC-005", + "testDescription": "המשתמש מעלה מסמכים בפורמטים שונים לתמיכה בבקשת המשכנתא.", + "prerequisites": "המשתמש נמצא בשלב העלאת מסמכים בתהליך הבקשה.", + "stepsToPerform": "1. לחץ על כפתור 'העלה מסמך'.\n2. בחר קובץ PDF של תלוש שכר.\n3. אשר את ההעלאה.\n4. לחץ שוב על 'העלה מסמך'.\n5. בחר קובץ תמונה (JPG) של תעודת זהות.\n6. אשר את ההעלאה.", + "expectedResult": "שני המסמכים מועלים בהצלחה ומוצגים ברשימת המסמכים המצורפים." + }, + { + "type": "functional", + "title": "בדיקת הזנת סכום משכנתא לא תקין", + "description": "אימות טיפול המערכת בהזנת ערכים לא תקינים.", + "testId": "TC-006", + "testDescription": "המשתמש מזין ערכים לא תקינים בשדה סכום המשכנתא.", + "prerequisites": "המשתמש נמצא בדף בקשת משכנתא.", + "stepsToPerform": "1. נווט לדף בקשת משכנתא.\n2. הזן ערך שלילי בשדה סכום: -100,000.\n3. נסה להמשיך.\n4. הזן אותיות בשדה סכום: 'אבג'.\n5. נסה להמשיך.\n6. הזן סכום מעל המקסימום המותר: 50,000,000.", + "expectedResult": "המערכת מציגה הודעות שגיאה מתאימות לכל קלט לא תקין ומונעת המשך התהליך." + }, + { + "type": "functional", + "title": "צפייה בסטטוס בקשת משכנתא", + "description": "אימות יכולת המשתמש לעקוב אחר סטטוס הבקשה.", + "testId": "TC-007", + "testDescription": "המשתמש צופה בסטטוס העדכני של בקשת המשכנתא שהגיש.", + "prerequisites": "המשתמש הגיש בקשת משכנתא בעבר.", + "stepsToPerform": "1. התחבר למערכת.\n2. נווט לאזור 'הבקשות שלי'.\n3. אתר את בקשת המשכנתא.\n4. לחץ על הבקשה לצפייה בפרטים.", + "expectedResult": "המערכת מציגה את סטטוס הבקשה (ממתין לאישור/בבדיקה/מאושר/נדחה) עם תאריך עדכון אחרון." + }, + { + "type": "functional", + "title": "שמירת טיוטת בקשת משכנתא", + "description": "אימות יכולת שמירת בקשה כטיוטה להמשך מאוחר יותר.", + "testId": "TC-008", + "testDescription": "המשתמש שומר בקשת משכנתא חלקית כטיוטה ומאחזר אותה מאוחר יותר.", + "prerequisites": "המשתמש מחובר למערכת.", + "stepsToPerform": "1. התחל למלא בקשת משכנתא.\n2. מלא חלק מהשדות.\n3. לחץ על כפתור 'שמור כטיוטה'.\n4. התנתק מהמערכת.\n5. התחבר מחדש.\n6. נווט לאזור 'טיוטות'.\n7. פתח את הטיוטה השמורה.", + "expectedResult": "הטיוטה נשמרת בהצלחה וכל הנתונים שהוזנו נשמרים ומוצגים בעת פתיחה מחדש." + }, + { + "type": "non-functional", + "title": "בדיקת זמן טעינת דף בקשת משכנתא", + "description": "אימות שדף בקשת המשכנתא נטען בזמן סביר.", + "testId": "TC-009", + "testDescription": "מדידת זמן הטעינה של דף בקשת המשכנתא תחת תנאים רגילים.", + "prerequisites": "חיבור אינטרנט יציב בקצב סטנדרטי.", + "stepsToPerform": "1. פתח את הדפדפן.\n2. נקה את המטמון.\n3. הפעל כלי מדידת ביצועים.\n4. נווט לדף בקשת משכנתא.\n5. מדוד את זמן הטעינה המלא.", + "expectedResult": "הדף נטען במלואו תוך פחות מ-3 שניות." + }, + { + "type": "non-functional", + "title": "בדיקת אבטחת נתוני משכנתא", + "description": "אימות שנתוני המשכנתא מוצפנים ומאובטחים.", + "testId": "TC-010", + "testDescription": "בדיקה שכל הנתונים הרגישים מועברים בצורה מאובטחת.", + "prerequisites": "גישה לכלי ניטור תעבורת רשת.", + "stepsToPerform": "1. הפעל כלי ניטור רשת (כגון Wireshark).\n2. מלא טופס בקשת משכנתא עם נתונים רגישים.\n3. הגש את הבקשה.\n4. בדוק את התעבורה שנשלחה לשרת.", + "expectedResult": "כל הנתונים מועברים באמצעות HTTPS והנתונים הרגישים מוצפנים ואינם קריאים בתעבורת הרשת." + } + ] +} diff --git a/functional_tests/ZBIO-7556/ZBIO-7556.xlsx b/functional_tests/ZBIO-7556/ZBIO-7556.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a3af681ac3ffe666110bf302558335999f1205d6 GIT binary patch literal 8950 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 literal 0 HcmV?d00001