العودة إلى الإصدار السابق Apigee Edge 4.19.01

Edge for Private Cloud الإصدار 4.19.01

إذا واجهت خطأ أثناء التحديث إلى Edge 4.19.01، يمكنك التراجع عن المكوّن الذي تسبب في الخطأ ثم إعادة محاولة التحديث.

يمكنك العودة من الإصدار 4.19.01 من Edge إلى نسخ الإصدارات التالية من الميزات:

  • الإصدار 4.18.05
  • الإصدار 4.18.01
  • الإصدار 4.17.09*

* للعودة من الإصدار 4.19.01 إلى الإصدار 4.17.09، عليك العودة إلى إصدار Postgres السابق بالإضافة إلى العودة إلى إصدار المكوّنات السابق على كل عقدة. إذا تراجعت إلى الإصدار 4.18.01 أو 4.18.05، لن تحتاج إلى التراجع عن Postgres لأنّ عملية الترقية لم تتضمّن تحديث Postgres.

هناك سيناريوهان قد تحتاج فيهما إلى إجراء عملية تراجع:

  1. العودة إلى إصدار ميزات سابق على سبيل المثال، من 4.19.01 إلى 4.18.05.
  2. العودة إلى إصدار تحديث سابق في الإصدار نفسه على سبيل المثال، من 4.19.01.02 إلى 4.19.01.01.

لمزيد من المعلومات، يُرجى الاطّلاع على عملية إصدار Apigee Edge.

المستخدمون الذين يمكنهم العودة إلى إصدار سابق

يجب أن يكون المستخدم الذي يُجري عملية العودة إلى إصدار سابق هو نفسه المستخدم الذي حدّث Edge في الأصل، أو مستخدمًا لديه إذن الوصول الجذر.

يتم تشغيل مكوّنات Edge تلقائيًا كمستخدم "apigee". في بعض الحالات، قد تكون مكوّنات Edge قيد التشغيل كمستخدمين مختلفين. على سبيل المثال، إذا كان على جهاز التوجيه الوصول إلى منافذ مميزة، مثل تلك التي تقل عن 1000، فعليك تشغيل جهاز التوجيه كجذر أو كمستخدم لديه حق الوصول إلى تلك المنافذ. أو يمكنك تشغيل مكوّن واحد كمستخدم واحد، ومكوّن آخر كمستخدم آخر.

مكوّنات تتضمّن رمزًا شائعًا

تتشارك مكوّنات Edge التالية في الرمز البرمجي الشائع. لذلك، لإعادة أي من هذه المكوّنات إلى إصدار سابق على عقدة، يجب إعادة جميع هذه المكوّنات الموجودة على تلك العقدة إلى إصدار سابق.

  • ‫edge-management-server (خادم الإدارة)
  • ‫edge-message-processor (معالج الرسائل)
  • edge-router (جهاز توجيه)
  • edge-postgres-server (خادم Postgres)
  • edge-qpid-server (خادم Qpid)

على سبيل المثال، إذا كان لديك خادم الإدارة والموجّه ومعالج الرسائل مثبّتًا على العقدة، عليك التراجع عن تثبيت الثلاثة معًا للتراجع عن تثبيت أيّ منها.

العودة إلى إصدار ميزات سابق

للعودة من الإصدار 4.19.01 إلى الإصدار 4.17.09، عليك العودة إلى إصدار Postgres السابق بالإضافة إلى العودة إلى إصدار المكوّنات السابق على كل عقدة. في حال العودة إلى الإصدار 4.18.01 أو 4.18.05، لن تحتاج إلى العودة إلى إصدار Postgres السابق لأنّ عملية الترقية لم تتضمّن تحديث Postgres.

للعودة إلى إصدار ميزات سابق، اتّبِع الخطوات التالية على كل عقدة تستضيف المكوّن:

  1. نزِّل ملف bootstrap.sh للإصدار الذي تريد الرجوع إليه:

    • للعودة إلى الإصدار 4.18.05، نزِّل bootstrap_4.18.05.sh:
      curl https://software.apigee.com/bootstrap_4.18.05.sh -o /tmp/bootstrap_4.18.05.sh 
    • للعودة إلى الإصدار 4.18.01، نزِّل bootstrap_4.18.01.sh:
      curl https://software.apigee.com/bootstrap_4.18.01.sh -o /tmp/bootstrap_4.18.01.sh 
    • للعودة إلى الإصدار 4.17.09، نزِّل bootstrap_4.17.09.sh:
      curl https://software.apigee.com/bootstrap_4.17.09.sh -o /tmp/bootstrap_4.17.09.sh 
  2. أوقِف المكوّن للتراجع عن التغييرات:
    1. لإعادة أي من المكوّنات التي تتضمّن رمزًا شائعًا على العقدة، يجب إيقافها جميعًا، كما يوضّح المثال التالي:
      /opt/apigee/apigee-service/bin/apigee-service edge-management-server stop
      /opt/apigee/apigee-service/bin/apigee-service edge-router stop
      /opt/apigee/apigee-service/bin/apigee-service edge-message-processor stop
      /opt/apigee/apigee-service/bin/apigee-service edge-qpid-server stop
      /opt/apigee/apigee-service/bin/apigee-service edge-postgres-server stop
    2. للتراجع عن أي مكوّن آخر على العقدة، أوقِف هذا المكوّن فقط:
      • /opt/apigee/apigee-service/bin/apigee-service component stop
  3. في حال التراجع عن تثبيت ميزة "تحقيق الربح"، عليك إلغاء تثبيتها من جميع عُقد خادم الإدارة ومعالج الرسائل:
    /opt/apigee/apigee-service/bin/apigee-service edge-mint-gateway uninstall
  4. ألغِ تثبيت المكوّن للعودة إلى الإصدار السابق على العقدة:
    1. للعودة إلى إصدار سابق من أي من المكوّنات التي تتضمّن رمزًا شائعًا على العقدة، يجب إلغاء تثبيتها جميعًا من خلال إلغاء تثبيت مجموعة المكوّنات edge-gateway ، كما يوضّح المثال التالي:
      /opt/apigee/apigee-service/bin/apigee-service edge-gateway uninstall
    2. لإرجاع أي مكوّن آخر على العقدة، عليك إلغاء تثبيت هذا المكوّن فقط، كما هو موضّح في المثال التالي:
      /opt/apigee/apigee-service/bin/apigee-service component uninstall

      حيث component هو اسم المكوّن.

    3. للعودة إلى الإصدار السابق من Edge Router، يجب حذف محتوى ملف /opt/nginx/conf.d بالإضافة إلى إلغاء تثبيت مجموعة مكوّنات edge-gateway:
      cd /opt/nginx/conf.d
      rm -rf *
  5. إلغاء تثبيت الإصدار 4.19.01 من تطبيق "apigee-setup":
    /opt/apigee/apigee-service/bin/apigee-service apigee-setup uninstall
  6. ثبِّت الإصدار 4.18.05 أو 4.18.01 أو 4.17.09 من الأداة المساعدة apigee-service وتبعياتها. يثبّت المثال التالي الإصدار 4.17.09 من apigee-service:
    sudo bash /tmp/bootstrap_4.17.09.sh apigeeuser=uName apigeepassword=pWord

    حيث uName وpWord هما اسم المستخدم وكلمة المرور اللذان تلقيتهما من Apigee. إذا حذفت pWord، سيُطلب منك إدخاله.

    إذا ظهرت لك رسالة خطأ، تأكَّد من تنزيل ملف bootstrap.sh في الخطوة 1.

  7. تثبيت "apigee-setup":
    /opt/apigee/apigee-service/bin/apigee-service apigee-setup install
  8. ثبِّت الإصدار القديم من المكوّن:
    /opt/apigee/apigee-setup/bin/setup.sh -p component -f configFile

    حيث component هو المكوّن المطلوب تثبيته وconfigFile هو ملف الإعداد للإصدار الأقدم.

  9. في حال التراجع عن Qpid، يمكنك تفريغ iptables:
    sudo iptables -F
  10. كرِّر هذه العملية لكل عقدة تستضيف المكوّن الذي تريد التراجع عنه.

للعودة من الإصدار 4.19.01 إلى الإصدار 4.17.09، عليك العودة إلى إصدار Postgres السابق بالإضافة إلى العودة إلى إصدار المكوّنات السابق على كل عقدة. إذا تراجعت عن الإصدار 4.18.01 أو 4.18.05، لن تحتاج إلى التراجع عن Postgres لأنّ عملية الترقية لم تتضمّن تحديث Postgres.

العودة إلى إصدار سابق

لإعادة مكوّن إلى إصدار معيّن من إصدار، اتّبِع الخطوات التالية على كل عقدة تستضيف المكوّن:

  1. نزِّل إصدار المكوّن المحدّد:
    /opt/apigee/apigee-service/bin/apigee-service component_version install

    حيث يمثّل component_version المكوّن وإصدار التحديث المطلوب تثبيته. على سبيل المثال:

    /opt/apigee/apigee-service/bin/apigee-service edge-ui-4.17.09-0.0.3749 install

    إذا كنت تستخدم مستودع Apigee على الإنترنت، يمكنك تحديد إصدارات المكوّنات المتاحة باستخدام الأمر التالي:

    yum --showduplicates list comp

    على سبيل المثال:

    yum --showduplicates list edge-ui
  2. استخدِم apigee-setup لتثبيت المكوّن:
    /opt/apigee/apigee-setup/bin/setup.sh -p comp -f configFile

    على سبيل المثال:

    /opt/apigee/apigee-setup/bin/setup.sh -p ui -f configFile

    يُرجى العِلم أنّه عليك تحديد اسم المكوّن فقط عند تثبيته، وليس الإصدار.

  3. كرِّر هذه العملية لكل عقدة تستضيف المكوّن الذي تريد التراجع عنه.

للعودة من الإصدار 4.19.01 إلى الإصدار 4.17.09، عليك العودة إلى إصدار Postgres السابق بالإضافة إلى العودة إلى إصدار المكوّنات السابق على كل عقدة. في حال العودة إلى الإصدار 4.18.01 أو 4.18.05، لن تحتاج إلى العودة إلى إصدار Postgres السابق لأنّ عملية الترقية لم تتضمّن تحديث Postgres.

العودة إلى الإصدار السابق من تحديث Postgres 9.6

إذا أجريت الترقية إلى الإصدار 4.19.01 من الإصدار 4.17.09، عليك التراجع عن تحديث Postgres بالإضافة إلى مكوّنات Edge.

للتراجع عن تحديث Postgres عند تحديث Postgres في إعدادات "الرئيسي-الاحتياطي":

  • ترقية عقدة الاستعداد الجديدة لتصبح عقدة Postgres الرئيسية سيكون Postgres الرئيسي الجديد هو الإصدار نفسه من تثبيت Edge السابق.
  • اضبط عقدة الاستعداد القديمة لتكون عقدة استعداد للعقدة الرئيسية الجديدة. وستكون العقدة الاحتياطية القديمة بالإصدار نفسه من تثبيت Edge السابق.
  • سجِّل العُقد الرئيسية والاحتياطية الجديدة مع مجموعات الإحصاءات والمستهلكين.

عند الانتهاء من عملية العودة إلى الإصدار السابق، لن تكون العُقدة الرئيسية القديمة ضرورية. ويمكنك بعد ذلك إيقاف تشغيل العقدة الرئيسية القديمة.

  1. تأكَّد من تشغيل عقدة Postgres الاحتياطية الجديدة:
    /opt/apigee/apigee-service/bin/apigee-all status

    إذا لم يكن Postgres قيد التشغيل، ابدأ تشغيله:

    /opt/apigee/apigee-service/bin/apigee-all start
  2. تأكَّد من إيقاف Postgres على العقدة الرئيسية القديمة والعقدة الاحتياطية القديمة:
    /opt/apigee/apigee-service/bin/apigee-all status

    إذا كان Postgres قيد التشغيل، أوقِفه:

    /opt/apigee/apigee-service/bin/apigee-service edge-postgres-server stop > /opt/apigee/apigee-service/bin/apigee-service apigee-postgresql stop
  3. في حال تثبيته، ابدأ تشغيل Qpid على العقدة الاحتياطية القديمة:
    /opt/apigee/apigee-service/bin/apigee-service edge-qpid-server start
  4. يمكنك ترقية عقدة الاستعداد الجديدة لتصبح عقدة Postgres الرئيسية:
    1. رقِّ العقدة الاحتياطية الجديدة لتصبح العقدة الرئيسية الجديدة:
      apigee-service apigee-postgresql promote-standby-to-master new_standby_IP

      أدخِل كلمة مرور Postgres لمستخدم "apigee"، والتي تكون تلقائيًا "postgres"، إذا طُلب منك ذلك.

    2. عدِّل ملف الإعداد الذي استخدمته لتثبيت الإصدار الحالي من Edge لتحديد ما يلي:
      # IP address of the new master:
      PG_MASTER=new_standby_IP
      # IP address of the old standby node
      PG_STANDBY=old_standby_IP
    3. اضبط النسخة الرئيسية الجديدة:
      /opt/apigee/apigee-service/bin/apigee-service apigee-postgresql setup-replication-on-master -f configFile
  5. أعِد إنشاء العقدة الاحتياطية القديمة:
    1. عدِّل ملف الإعداد الذي استخدمته لتثبيت الإصدار الحالي من Edge لتحديد ما يلي:
      # IP address of the new master:
      PG_MASTER=new_standby_IP
      # IP address of the old standby node
      PG_STANDBY=old_standby_IP
    2. أزِل دليل البيانات في عقدة الاستعداد القديمة:
      cd /opt/apigee/data/apigee-postgresql/pgdata > rm -rf *
    3. أعِد ضبط العقدة الاحتياطية القديمة لتصبح عقدة احتياطية للعقدة الرئيسية الجديدة:
      /opt/apigee/apigee-service/bin/apigee-service apigee-postgresql setup-replication-on-standby -f configFile
    4. تأكَّد من تشغيل Postgres على العقدة الاحتياطية القديمة:
      /opt/apigee/apigee-service/bin/apigee-all status

      إذا لم يكن قيد التشغيل، ابدأ تشغيله:

      /opt/apigee/apigee-service/bin/apigee-service edge-postgres-server start
  6. تحقَّق من إضافة العقدة الاحتياطية الجديدة من خلال الاطّلاع على ملف /opt/apigee/apigee-postgresql/conf/pg_hba.conf في العقدة الرئيسية الجديدة.
  7. يمكنك الاطّلاع على معلومات الإحصاءات ومجموعة المستهلكين الحالية من خلال تشغيل الأمر التالي على خادم الإدارة:
    curl -u sysAdminEmail:password http://ms_IP:8080/v1/analytics/groups/ax

    يعرض هذا الأمر اسم مجموعة الإحصاءات في الحقل name، واسم مجموعة المستهلكين في الحقل name ضمن consumer-groups. وتعرض أيضًا المعرّفات الفريدة العالمية (UUID) للعُقد الرئيسية والاحتياطية القديمة في Postgres في الحقل postgres-server والحقل datastores. من المفترض أن تظهر لك النتيجة بالشكل التالي:

    {
      "name" : "axgroup-001",
      "properties" : {
      },
      "scopes" : [ "VALIDATE~test", "sgilson~prod" ],
      "uuids" : {
        "qpid-server" : [ "8381a053-433f-4382-bd2a-100fd37a1592", "4b6856ec-ef05-498f-bac6-ef5f0d5f6521" ],
        "postgres-server" : [
          "ab1158bd-1d59-4e2a-9c95-24cc2cfa6edc:27f90844-efab-4b32-8a23-8f85cdc9a256"
        ]
      },
      "consumer-groups" : [ {
        "name" : "consumer-group-001",
        "consumers" : [ "8381a053-433f-4382-bd2a-100fd37a1592", "4b6856ec-ef05-498f-bac6-ef5f0d5f6521" ],
        "datastores" :
          [ "ab1158bd-1d59-4e2a-9c95-24cc2cfa6edc:27f90844-efab-4b32-8a23-8f85cdc9a256" ],
          "properties" : {     }
        }
      ],
      "data-processors" : {
      }
    }
  8. احصل على عنوان UUID الخاص بالجهاز الرئيسي القديم من خلال تنفيذ الأمر curl التالي على عقدة الجهاز الرئيسي القديم:
    curl -u sysAdminEmail:password http://node_IP:8084/v1/servers/self

    من المفترض أن يظهر لك معرّف UUID للعقدة في نهاية الناتج، بالشكل التالي:

    "type" : [ "postgres-server" ],
    "uUID" : "599e8ebf-5d69-4ae4-aa71-154970a8ec75"
  9. كرِّر الخطوة السابقة للحصول على عناوين IP للعقدة الاحتياطية القديمة والعقدة الرئيسية الجديدة.
  10. أزِل العُقد الرئيسية والاحتياطية القديمة من مجموعة المستهلكين:
    curl -u sysAdminEmail:password -X DELETE \
      "http://ms_IP:8080/v1/analytics/groups/ax/axgroup-001/consumer-groups/consumer-group-001/datastores/masterUUID,standbyUUID" -v

    حيث axgroup-001 وconsumer-group-001 هما الاسمان التلقائيان لمجموعتَي التحليلات والمستهلكين. masterUUID,standbyUUID بالترتيب نفسه الذي ظهرت به أعلاه عند عرض معلومات الإحصاءات ومجموعة المستهلكين الحالية أعلاه. وقد يكون عليك تحديدها على أنّها standbyUUID,masterUUID.

    من المفترض أن تكون السمة datastores لـ consumer-groups فارغة الآن.

  11. أزِل العُقد الرئيسية والاحتياطية القديمة من مجموعة الإحصاءات:
    curl -u sysAdminEmail:password -X DELETE \
      "http://ms_IP:8080/v1/analytics/groups/ax/axgroup-001/servers?uuid=masterUUID,standbyUUID&type=postgres-server" -v

    من المفترض أن تكون السمة postgres-server ضمن uuids فارغة الآن.

  12. تسجيل عُقد PG الرئيسية والاحتياطية الجديدة مع مجموعات الإحصاءات والمستهلكين:
    curl -u sysAdminEmail:password -X POST -H "Content-Type: application/json" -d ''
      "http://ms_IP:8080/v1/analytics/groups/ax/axgroup-001/servers?uuid=masterUUID,standbyUUID&type=postgres-server" -v
    curl -u sysAdminEmail:password -X POST -H "Content-Type:application/json" -d ''
      "http://ms_IP:8080/v1/analytics/groups/ax/axgroup-001/consumer-groups/consumer-group-001/datastores?uuid=masterUUID,standbyUUID" -v
  13. التحقّق من صحة مجموعة الإحصاءات:
    curl -u sysAdminEmail:password http://ms_IP:8080/v1/analytics/groups/ax

    من المفترض أن تظهر لك معرّفات UUID للعُقد الرئيسية والاحتياطية الجديدة المُدرَجة في مجموعة الإحصاءات ومجموعة المستهلكين.

  14. أعِد تشغيل خادم إدارة Edge:
    /opt/apigee/apigee-service/bin/apigee-service edge-management-server restart
  15. أعِد تشغيل جميع خوادم Qpid:
    /opt/apigee/apigee-service/bin/apigee-service edge-qpid-server restart
  16. أعِد تشغيل جميع خوادم Postgres:
    /opt/apigee/apigee-service/bin/apigee-service edge-postgres-server restart
  17. تحقَّق من حالة النسخ المتماثل من خلال إصدار النصوص البرمجية التالية على كلا الخادمَين. من المفترض أن يعرض النظام نتائج متطابقة على كلا الخادمَين لضمان نجاح عملية النسخ المتماثل:

    على الجهاز الرئيسي الجديد، نفِّذ ما يلي:

    /opt/apigee/apigee-service/bin/apigee-service apigee-postgresql postgres-check-master

    تأكَّد من أنّه يشير إلى أنّه الجهاز الرئيسي. على العُقدة الاحتياطية القديمة:

    /opt/apigee/apigee-service/bin/apigee-service apigee-postgresql postgres-check-standby

    تأكَّد من أنّه يشير إلى أنّه في وضع الاستعداد.

  18. كرِّر الخطوة السابقة بعد إجراء عدة طلبات بيانات من واجهة برمجة التطبيقات للتأكّد من أنّ العُقد متزامنة.
  19. أوقِف تشغيل Postgres الرئيسي القديم باستخدام الإجراء الوارد في تحديث Apigee Edge من الإصدار 4.16.01/4.16.05 إلى الإصدار 4.17.09.

    بدلاً من ذلك، يمكنك إلغاء تثبيت Qpid من العقدة الرئيسية القديمة وتثبيت Qpid على العقدة الرئيسية الجديدة. بعد إلغاء تثبيت Qpid، يمكنك إيقاف تشغيل العقدة الرئيسية القديمة.

إلغاء تثبيت Qpid من الجهاز الرئيسي القديم وتثبيت Qpid على الجهاز الرئيسي الجديد

لإلغاء تثبيت Qpid من الخادم الرئيسي القديم وتثبيته على الخادم الرئيسي الجديد:

  1. يمكنك حظر وصول معالجات الرسائل إلى منفذ Qpid رقم 5672 على الخادم الرئيسي القديم من خلال تشغيل الأمر التالي على جميع معالجات الرسائل:
    iptables -A OUTPUT -p tcp -d 10.233.147.20 --dport 5672 -j DROP
  2. تأكَّد من أنّ قائمة انتظار رسائل Qpid فارغة من خلال تشغيل الأمر التالي. لا يمكنك إلغاء تثبيت Qpid إلى أن تتم معالجة جميع الرسائل في انتظار المراجعة:
    qpid-stat -q

    يعرض هذا الأمر جدولاً يحتوي على عدد msg, msgIn, and msgOut. ستتم معالجة جميع الرسائل عند msg=0، وmsgIn=msgOut.

  3. حدِّد معرّف UUID لخادم Qpid على الخادم الرئيسي القديم من خلال تنفيذ الأمر التالي على الخادم الرئيسي القديم. احفظ هذه المعلومات لاستخدامها لاحقًا في الإجراء:
    curl -u sysAdminEmail:password http://node_IP::8083/v1/servers/self
  4. أوقِف Qpid على الجهاز الرئيسي القديم:
    /opt/apigee/apigee-service/bin/apigee-service edge-qpid-server stop
    /opt/apigee/apigee-service/bin/apigee-service apigee-qpidd stop
  5. إلغاء تثبيت خادم Qpid:
    /opt/apigee/apigee-service/bin/apigee-service edge-qpid-server uninstall
    /opt/apigee/apigee-service/bin/apigee-service apigee-qpidd uninstall
  6. أزِل خادم Qpid القديم من مجموعات الإحصاءات والمستهلكين:
    curl -u sysAdminEmail:password -X DELETE -H "Content-Type: application/json" -d '' \
      "http://ms_IP:8080/v1/analytics/groups/ax/axgroup-001/consumer-groups/consumer-group-001/consumers/qpid_UUID" -v
    curl -u sysAdminEmail:password -X DELETE \
      "http://ms_IP:8080/v1/analytics/groups/ax/axgroup-001/servers?uuid=qpid_UUID&type=qpid-server" -v
  7. أزِل خادم Qpid القديم من Zookeeper:
    curl -u sysAdminEmail:password -X DELETE \
      http://ms_IP:8080/v1/servers/qpid_UUID
  8. ثبِّت Qpid على الخادم الرئيسي الجديد:
    /opt/apigee/apigee-setup/bin/setup.sh -p qs -f configFile
  9. حدِّد المعرّف الفريد العالمي (UUID) لخادم Qpid على الجهاز الرئيسي الجديد من خلال تنفيذ الأمر التالي على الجهاز الرئيسي الجديد. احفظ هذه المعلومات لاستخدامها لاحقًا في الإجراء:
    curl -u sysAdminEmail:password
      http://node_IP::8083/v1/servers/self
  10. سجِّل خادم Qpid الجديد مع مجموعات الإحصاءات والمستهلكين:
    curl -u sysAdminEmail:password -X POST -H "Content-Type: application/json" -d '' \
      "http://ms_IP:8080/v1/analytics/groups/ax/axgroup-001/servers?uuid=qpid_UUID&type=qpid-server" -v
    curl -u sysAdminEmail:password -X POST -H "Content-Type:application/json" -d '' \
      "http://ms_IP:8080/v1/analytics/groups/ax/axgroup-001/consumer-groups/consumer-group-001/consumers?uuid=qpid_UUID" -v
  11. أعِد تشغيل جميع معالِجات الرسائل:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
  12. شغِّل الأمر التالي على خادم Qpid الجديد للتحقّق من إنشاء قوائم الانتظار:
    qpid-stat -q

    تأكَّد من ظهور msg وmsgIn وmsgOut يتم تعديلها أثناء معالجة خادم Qpid للرسائل.

يُرجى التواصل مع فريق دعم Apigee Edge إذا واجهت مشاكل عند العودة إلى الإصدار السابق.