Der Supercomputer Raspberry Pi auf der Java One 2022
von Chris Bensen
Wenn Sie es vorziehen, können Sie diesen Blogbeitrag hier auf GitHub lesen .
Der Raspberry Pi Super Computer wurde ursprünglich im Oktober 2019 für Oracle Open World gebaut. Es gibt 1050 Raspberry Pi 3b+ in vier Server-Racks, die in einer großen quadratischen Box konfiguriert sind, die an eine britische Polizeibox erinnert, die in einer bestimmten BBC-Fernsehserie populär wurde. Schneller Vorlauf bis heute, und der Raspberry Pi Super Computer (Pi Cluster) wurde in den Elektroschrott geschickt, einige Teile wurden entfernt und blieb zwei Jahre lang inaktiv, bis er im Mai dieses Jahres seinen Weg in meine Garage fand komplette Überholung.
Für eine zeitliche Geschichte, wie 1050 Raspberry Pi entstanden sind, können Sie A Temporal History of the World's Largest Raspberry Pi Cluster lesen .
Es beginnt damit, dass Gerald Venzl von Oracle Schweiz mich auf den 12-Knoten-Cluster aufmerksam macht, dann haben wir mit Stephen Chin ein Brainstorming zu einem großen Cluster gemacht. Erfahren Sie, wie der Pi-Cluster während der COVID-Sperren und der kalifornischen Brände in den Elektroschrott gewandert ist und wie Eric Sedlar ihn gerettet und schließlich in Oracle Labs gelagert hat. Wenn Sie das zu lang finden, sehen Sie sich das Original-Build-Video des weltgrößten Raspberry-Pi-Clusters an, das wir kennen , dieses Bauen des weltweit größten Raspberry-Pi-Clusters von Gerald Venzl und dieses Video des Big-Pi-Clusters in meiner Garage – Teil I .
Und übrigens, wenn Sie dies lesen, besteht eine hohe Wahrscheinlichkeit, dass Sie eine großartige Koryphäe wären. Was ist eine Leuchte? Es ist unsere kürzlich gegründete Entwicklergruppe, die Entwickler wie Sie mit exklusiven technischen Inhalten, kostenlosen Swags und einer Community verbindet, die Ihnen hilft, etwas so Cooles wie diesen Cluster aufzubauen, werden Sie noch heute eine Koryphäe .
Auferstehung
Als CloudWorld angekündigt wurde, schlugen wir sofort vor, den weltgrößten Raspberry-Pi-Supercomputer (den wir kennen) wiederzubeleben . Wer mag keine gute Auferstehungsgeschichte? Die Vorschläge gingen ungefähr so:
1. Spende es dem Computer History Museum als nicht funktionales Kunstwerk für den Pi-Day.
2. Raspberry Pi's sind jetzt wertvoll. Verlosen Sie ein Stück des Pi, um einen kostenlosen Raspberry Pi 3B+ von einem der größten Raspberry Pi-Cluster der Welt zu gewinnen.
3. Wir haben eine Gelegenheit, Geschichte zu schreiben. Wir reparieren es für CloudWorld, fügen Lüfter hinzu, damit es nicht überhitzt, und betreiben es als „On-Prem“- und „Edge“-Gerät, das die in den Labors gebaute Technologie vorführt. Wir werden GraalPython , Java und Oracle Linux 9 einschließen, die auf jedem Gerät im Pi-Cluster ausgeführt werden. Es ist alles über Site-to-Site mit Oracle Cloud Infrastructure (OCI) verbunden (scrollen Sie nach unten, um Anweisungen dazu zu erhalten).VPN für On-Premises und über Microservices, Compute-Instanzen, Autonomous Database, Services Gateway und Load Balancer. AR-Visualisierungen wären ideal, und wir könnten etwas Cooles darauf ausführen – wie damals, als wir SETI@home auf dem Raspberry Pi Mini Super Computer, einem 84-Pi-Cluster, ausgeführt haben. Ich hatte die Idee, einen Dienst einzurichten, damit jeder auf der Welt Code an den Cluster senden kann, um eine Workload auszuführen, während wir unsere Digital Twin AR/VR-Dienste vorführen und Blogs und Videos erstellen, um Entwickler und Studenten zu inspirieren. Wir können Menschen zeigen, warum Entwickler und Studenten viel Spaß beim Lernen und Verwenden des kostenlosen Kontingents von Oracle haben . Außerdem können wir einen Guinness-Buch-Weltrekord aufstellen.
Wir entscheiden uns für Option drei und die Suche nach einem neuen Labor begann. Ich habe mit der Führung verschiedener oben erwähnter Produktteams sowie mit Führungskräften der Raspberry Pi-Community wie Jeff Geerling und Eben Upton gesprochen und einen Plan entworfen. Ich kann Ihnen nicht über den gesamten Plan erzählen, weil wir gerade erst die Grundlage dafür gelegt haben, aber es kommt noch viel mehr. Dies ist nur die Geschichte, wie der Pi-Cluster zu DevNucleus bei CloudWorld gebracht wurde, und eine kurze Erwähnung dessen, was danach passiert. Es stellt sich heraus, dass eine Guinness-Buch-Entscheidung wirklich teuer ist!
Der erste Schritt bestand darin, ein Budget und eine Schätzung der Arbeit zu ermitteln, um zu sehen, ob es machbar war. Wir wussten, dass wir Folgendes brauchten:
1. Ventilatoren. Viele Fans.
2. Um fehlende Teile zu ersetzen.
3. Um alles auszuprobieren.
4. Um neue Software zu schreiben.
Jedes Pi-Netzwerk bootet. 2019 hatte ich Oracle Linux 7 auf dem gesamten Cluster laufen, aber hat es noch funktioniert? Hatten wir den gesamten Quellcode, die MAC-Adressen und alles, was nötig war, um es noch einmal zu machen?
Der zweite Schritt bestand darin, einen Arbeitsplatz auf dem Pi-Cluster zu bekommen. Versuchen Sie, einen Ort mit Doppeltüren zu finden, in der Nähe eines Lastenaufzugs, mit genügend Strom und Platz, um daran zu arbeiten, und einem Netzwerk, das nicht fest verschlossen ist – nicht einfach! Ich habe mir Oracle-Einrichtungen auf der ganzen Welt angesehen. Die Logistik, an so etwas aus der Ferne zu arbeiten, und all die physische Arbeit, die dafür aufgewendet werden müsste, bedeutete, dass überall auf der Welt nur funktionieren würde, wenn bestimmte Anforderungen erfüllt würden. Ich müsste dorthin reisen, alles aufbauen und ein Dutzend Leute haben, die mir helfen. Wir haben es für den Fernzugriff eingerichtet, aber jemand musste persönlich verfügbar sein, wenn die Dinge nicht richtig funktionierten. Nach einem netten Mittagessen mit meiner großartigen Frau entschieden wir, dass unsere Garage am besten funktionierte, und damit begann #BigPiClusterInMyGarage .
Hinzufügen von Lüftern – Kühlen des Raspberry Pi
Sobald es geliefert wurde, machte ich mich an die Arbeit, um sicherzustellen, dass unser Budget korrekt war, dann korrigierte und testete ich die Dinge, während ich Ersatzteile (meistens Lüfter) bestellte. Viele Fans: 250 neue Fans, um genau zu sein. Der Cluster endete mit 257 Lüftern und das zählt nicht die Lüfter, die sich in jedem der Switches, dem Server oder den Netzteilen befinden. Dazu musste ich den gesamten Cluster zerlegen und wieder zusammenbauen. Nicht jede Schraube wurde entfernt, aber alle 21 Pi 2U-Bänke wurden zerlegt, jeder 5. Pi entfernt und ersetzt, was bedeutete, dass 250 neue Pi-Caddies mit Halterungen für Lüfter gedruckt werden mussten. Das können Sie hier erfahren . Victor Agreda verwendete seinen neu erworbenen Ultimaker S5, um ein paar Dutzend der Fan-Version der Caddies zu drucken. Die Fans brauchten alle Power, und vielen Dank an Eli Schillingzum Erstellen vieler Kabelbäume. Außerdem haben wir einige Ostereier hinzugefügt. Ich weiß, es ist kein Osterei, wenn ich der Welt davon erzähle, aber ich werde es im Abschnitt Warble weiter unten ausführlicher erklären (weil es zu cool ist, um nichts zu sagen). Ich habe ein paar Videos, die einige der Arbeiten dokumentieren, die in A Temporal History of The World’s Largest Raspberry Pi Cluster zu finden sind .
Betriebssystem – Das intelligenteste Betriebssystem, das es gibt
Ich denke, viele von uns unterschätzen den Wert eines guten Betriebssystems beim Aufbau von Infrastruktur und Hardware, und Oracle Linux ist erstklassig. Ich gehe in A Temporal History of The World's Largest Raspberry Pi Cluster näher auf das Betriebssystem ein (und ich habe einige andere Dinge, an denen ich arbeite, damit Sie Pi zu Hause über das Netzwerk booten können).Da wir auf so viel Arbeit aufbauen mussten, mussten wir von Oracle Linux 7 auf Oracle Linux 9 upgraden. Ich verrate Ihnen ein Geheimnis: Es war nicht so einfach. Nichtsdestotrotz war die Zusammenarbeit mit dem Oracle Linux-Team erstaunlich und verdient wirklich alle Anerkennung für die Einrichtung des Betriebssystems für den Pi-Cluster. Schauen Sie sich Oracle Linux 9 an, es lohnt sich, es zu verwenden oder darauf zu aktualisieren. Es gab ein paar Schluckauf, wie die zusätzliche Sicherheitsebene, die bedeutete, dass das Root-Konto standardmäßig keinen SSH-Zugriff mehr hatte.
Erwähnenswert ist hier, wie wir den Pi booten. Jeder Pi im Cluster bootet über das Netzwerk von einem einzelnen, schreibgeschützten NFS-Mount auf dem Server, und wir haben einen systemd-Dienst hinzugefügt, um ein Bash-Skript auszuführen, wenn der Server oder Pi hochfährt. Dies macht die Konfiguration dessen, was wir ausführen, fast mühelos.
Software und Cloud-Dienste – GraalVM läuft schnell auf dem Client oder in der Cloud
Die gesamte Software ist Open Source und kann hier in unserem DevRel GitHub-Repository gefunden werden. Es gibt einige Dinge, die aus den Labors kommen und nicht einmal als technische Vorschau verfügbar sind (ich habe es versucht, sie waren einfach noch nicht fertig) , also sind diese nicht enthalten. Seien Sie gewarnt, der größte Teil dieses Codes wurde schnell geschrieben. Was Sie finden, macht vielleicht nicht viel Sinn, also lassen Sie es mich erklären.
Da ist zunächst die Software auf dem Cluster. Der Server führt einen Docker-Container aus, der aus GraalPython auf GraalVM besteht . Dieses Dockerfile wird kontinuierlich verbessert, daher empfehle ich noch nicht, es zu kopieren. Ich habe einige Fehlerberichte bereitgestellt, aber sobald die Graal-Umgebungsvariablen und STRG+C funktionieren (und vielleicht ein neues Image für GraalPython erstellt wird) , möchten Sie sofort loslegen. In der Zwischenzeit sollten Sie wissen, dass dies eine Möglichkeit ist es tun. Ich habe eine etwa 8-fache Leistungssteigerung beim Ausführen von reinem Python-Code unter GraalVM gesehen . Das ist ziemlich beeindruckend!
Auf jedem Gerät im Cluster wird ein Webdienst ausgeführt. Der Server sendet eine UDP-Nachricht mit seiner IP-Adresse und seinem Port, damit jedes Gerät darauf hören kann, und kommuniziert mit dem Server zur automatischen Erkennung. Dies ist neu aus früheren Jahren, wo die IP-Adresse des Servers in eine Umgebungsvariable gesetzt wurde. Die IP-Adresse ändert sich nicht, also konnten wir sie fest codieren, aber es gab zwei Probleme: Jeder, der daran arbeitet, muss ein Testsystem mit seinem Desktop und einer Simulation eines Pi oder ein paar Pis auf seinem Schreibtisch ausführen, und das Umgebungsvariablen gehen verloren, sobald Sie sudo. Das löst tatsächlich viele Probleme! Sobald ein Pi hochfährt, führt er seinen Webserver aus, wartet auf die UDP-Nachricht, registriert seine IP-Adresse und MAC-Adresse beim Server und wartet auf Arbeit. In Intervallen,
Alle fünf Sekunden sendet jeder Pi alle seine Daten (CPU, Speicher, Temperatur usw.) über die native ORDS-Unterstützung an einen REST-Endpunkt in einer autonomen Datenbank. Die Dokumentation finden Sie hier . Ich habe einen Code eingefügt, in dem der Pi beim nächsten Mal etwas länger wartet, wenn er seine Daten nicht senden kann, und auf 60 Sekunden hochskaliert. Es stellt sich heraus, dass es sich um einen Datenberg handelt, den Autonomous Database mühelos handhabt. Ich habe ein paar andere Datenbanken ausprobiert, die nicht genannt werden sollen, und sagen wir einfach, sie konnten damit nicht umgehen, was manchmal zu Verzögerungen von mehr als fünf Sekunden führte.
Digitaler Zwilling mit AR/VR – Visualisieren Sie Ihre Daten
Ich habe ein ziemlich detailliertes 3D-Modell des Pi-Clusters erstellt, das Sie hier finden und in Ihrem bevorzugten 3D-Programm öffnen können. Unsere AR/VR- und Cloud-Experten Wojciech Pluta , Victor Martin , Bogdan Farca und Stuart Coggins machten sich an die Arbeit, um einige erstaunliche AR- und VR-Erlebnisse zu entwickeln. Sie optimierten Datenbanken, schrieben APEX-Apps und führten socket.io für das Streaming aus. Sie nutzten einen Kubernettes-Cluster namens OCI OKESo können die 3D-Erlebnisse skalieren, ohne umzufallen, was bedeutet, dass jeder einen digitalen Zwilling des Pi-Clusters in sein Wohnzimmer stellen kann. Wir haben iPads für AR und gedruckte QR-Codes, damit das iPad den Cluster millimetergenau verfolgen kann, sodass die Teilnehmer das Geschehen auf dem Cluster interaktiv verfolgen können. Das Team baute auch eine Meta VR-Version, deren Details in Kürze bekannt gegeben werden. Es gab nicht genug Strom, um den gesamten Cluster in meiner Garage zu betreiben, also werden wir dies integrieren und testen, bevor sich die Türen bei CloudWorld öffnen. Es kann funktionieren, es kann umfallen. Was auch immer passiert, es wird eine gute Geschichte! Ich werde hier einen Link hinzufügen, wenn wir etwas über AR/VR Digital Twin geschrieben haben.
OCI Services – Im Zentrum jedes Projekts steht die Cloud-Infrastruktur
In meiner Garage ist der Pi-Cluster als „On-Prem“-Server eingerichtet. Ich habe ein isoliertes Subnetz auf meiner Ubiquity Dream Machine Pro erstellt, ein Site-to-Site-VPN für OCI mit einem Bastion konfiguriert und eine lokale Jumpbox mit zwei Netzwerkschnittstellen verwendet (eine für das Pi-Cluster-Subnetz und eine für den Pi-Cluster ) . Somit erscheint der Pi-Cluster nach außen als eine IP-Adresse. Auftauchen, Netzstrom anschließen und gut ist. Ich wünschte, die Einrichtung wäre so einfach und ich müsste nicht alles testen – um sicherzustellen, dass die Kabel nicht aus der Position springen – aber sagen wir einfach, es ist so einfach, weil es mehr Spaß macht.
Wir haben bei CloudWorld keine Kontrolle über das Netzwerk, daher ist der Pi-Cluster ein „Edge-Gerät“. Es verwendet Cloud-Dienste wie Services Gateway , Load Balancer und Domain Management . Ja, wir haben eine Domain. Dazu komme ich im nächsten Abschnitt.
Das Netzwerk sieht so aus:
Wenn Sie Fragen dazu haben, besuchen Sie den öffentlichen Slack-Kanal von Oracle für Entwickler. Stellen Sie jede Frage, die Sie wollen. Wie man es einrichtet, welche Dienste man nutzt. Dort finden Sie Ihre Antworten!
IoT – Spezifische leichte Aufgaben mit kleinen kostengünstigen Mikrocontrollern
Wir haben auch ein Paar Arduinos, die auf dem Cluster laufen. Der erste Arduino ist ein Arduino Mega mit einem Ethernet HAT. Den Originalcode finden Sie hier . Es führt einen Webdienst aus und schaltet zwei Solenoide für den Fernzugriff auf die physischen Reset- und Power-Tasten auf dem Server ein. Ich habe die Software gegenüber dem Repository etwas verändert und noch nicht veröffentlicht, also habe ich diese ältere Version stehen gelassen. Die Version, die ich nicht veröffentlicht habe, registriert sich selbst und wartet auf einen einfachen Startbefehl, wenn sich ein Entwickler per SSH in die Bastion einloggt.
Das zweite Arduino ist die gleiche Hardware, führt aber einen REST-Server aus, der auf eine JSON-Nutzlast wartet, und ist mit einem Dutzend NeoPixels im Licht oben auf der Polizeibox verbunden.
Warble – Eine benutzerdefinierte Programmiersprache, die für den Pi-Cluster entwickelt wurde
Wir hosten die Domainhttps://warble.withoracle.cloudauf OCI, unterstützt durch Domain Management , einen Load Balancer und eine Compute Instance . Die Compute-Instanz führt die gleiche Software aus, die auf dem Pi-Cluster läuft: Ein Docker-Container mit GraalPython und einem Webdienst. Dies ist noch nicht ganz bereit für die Hauptsendezeit, aber schauen Sie vom 18. bis 20. Oktober hier oder auf Twitter vorbei, weil es während der CloudWorld live sein wird, und ich denke, es wird eine Menge Spaß machen.
Wir haben eine Programmiersprache namens Warble entwickelt, die für Twitter entwickelt wurde, um auf dem Pi-Cluster ausgeführt zu werden . Warble ist keine voll funktionsfähige Programmiersprache und ich habe viele Abkürzungen genommen. Es ist darauf ausgelegt, so wenig Zeichen wie möglich zu verwenden, damit Sie einen Warble auf Twitter posten und auf dem Pi-Cluster ausführen können. Ich habe ein Python-Skript, das auf einer Computerinstanz ausgeführt wird und die Twitter-API verwendet, um nach dem Hashtag #pi zu suchen . Wenn das nächste Zeichen eine offene geschweifte Klammer und das letzte Zeichen eine schließende geschweifte Klammer ist, dann haben wir ein Warble und es wird in einer Datenbank gespeichert. Zum Beispiel:
> #pi{PRINT(“hello cluster”)}
< hello cluster
Wäre es nicht cool zu sehen, wer Pi auf einem der größten Raspberry Pi-Cluster der Welt auf die meisten Stellen berechnen kann?
> #pi{PRINT(2*ROUND(ACOS(0.0),3))}
< 3.142
Twitter wird viel Spaß machen, obwohl es die API drosselt und deshalb haben wir die gehostete Domain. Ich werde einen REST-Endpunkt bereitstellen, um Warbles zu posten. Vielleicht findet jemand heraus, wie man Pi mit Bailey-Borwein-Plouffe_formula mit Warble oder auf andere Weise berechnet.
Ich werde keine Syntaxgrammatik schreiben, aber ich werde einige Beispiele geben.
Warble unterstützt Variablen:
> #pi{x=0PRINT(x)}
< 0
> #pi{x=1/16.0²*(4.0/(8*k+1)-2.0/(8*k+4)-1.0/(8*k+5)-1.0/(8*k+6)}
<
> #pi{i=0;WHILE(i<10){PRINT(i);i++}}
< 0
< 1
< 2
< 3
< 4
< 5
< 6
< 7
< 8
< 9
> #pi{FOR(i=0;i<10;i++){PRINT(i)}}
< 0
< 1
< 2
< 3
< 4
< 5
< 6
< 7
< 8
< 9
Außerdem können Sie Werte speichern und wieder laden. Sie sind benutzerspezifisch:
> #pi{SAVE(“pi”,1)}
<
> #pi{x=LOAD(“pi”);x++;SAVE(“pi”,x);PRINT(x)}
< 2
> #pi{PLAYSOUND(”http://downloads.bbc.co.uk/doctorwho/sounds/tardis.mp3");}
<
> #pi{LIGHTS(0,255,0,0)}
<
> #pi{LIGHTS(23,0,255,0)}
<
> #pi{LIGHTS(0,0,255,0);SLEEP(20);LIGHTS(0,0,255,0)}
<
> #pi{FOR(i=0;i<24;i++){LIGHTS(i,0,255,0)}SLEEP(20);FOR(i=0;i<24;i++){LIGHTS(i,0,0,255)}}
<
Auf der Ubiquity Dream Machine Pro habe ich mit Hilfe von Tim Clegg ein neues Subnetz erstellt. Hier ist ein Überblick über die Schritte, denen wir gefolgt sind. Ich werde keine spezifischen Screenshots oder Videos bereitstellen, da sich die Optionen auf Ubiquity und Oracle Cloud ändern werden. Stattdessen sind hier einige Highlights dessen, was Sie brauchen und was zu tun ist:
Unter Netzwerke erstelle ein neues Netzwerk mit einem Namen, ich wähle „pi“.
VLAN-ID: 3
Netzwerktyp: Standard
Erstellen Sie ein Site-to-Site-VPN
Netzwerkname: pivpn
Vorinstallierter Schlüssel: ********************* Serveradresse
: <IP-Adresse des Routers> ( Standard sollte in Ordnung sein)
Remote Gateway/Subnets: 10.0.0.0/24
Remote IP Address: <IP Address of remote VPN>
Advanced: Manual
IPsec Profile: Customized
Route Distance: 30
Key Exchange Version: IKEv1
Encryption: AES-256
Hash: SHA1
IKE DH-Gruppe: 5
ESP DH-Gruppe: 5
Perfect Forward Secrecy: aktiviert
Dynamisches Routing: aktiviert
Ich habe drei Firewall-Regeln erstellt:
1. Pi-Block 192.168.3.1 (Gateway)
Typ: LAN Lokale
Aktion: Drop
-Quelle, Quelltyp: Netzwerkquelle
, Netzwerk: pi
-Ziel, Quelltyp: Netzwerkziel
, Netzwerk: pi -
Ziel, Netzwerktyp: Gateway-IP-Adresse
2. Standard akzeptieren zu pi
Typ: LAN In
Aktion:
Quelle akzeptieren, Quelltyp: Netzwerkquelle
, Netzwerk: Standardziel , Quelltyp:
Netzwerkziel
, Netzwerk: pi
3. Pi-Block auf Standard
Typ: LAN Out
Action: Drop
Source, Source Type: Network
Destination, Network: pi
Destination, Source Type: Network
Source, Network: Default
Advanced: Manual
Check Match State New
Check Match State Invalid
4. Gehen Sie in OCI zu Networking und Site-to-Site VPN
Create IPSec Connection.
Gib ihm einen Namen.
Sie möchten, dass dies Ihre öffentliche IP-Adresse erhält.
dig -4 TXT +short o-o.myaddr.l.google.com @ns1.google.com
Sie müssen zwei Tunnel erstellen, also richte ich beide so ein, dass sie auf dasselbe VPN verweisen, da OCI zwei erfordert und ich nur einen in meinem Netzwerk offengelegt habe. Sie fügen dies dem VPN hinzu.
5. Richten Sie ein dynamisches Routing-Gateway
ein. 6. Richten Sie ein VCN ein, fügen Sie eine Ingress-Regel mit dem CIDR hinzu, das Ihr lokales Subnetz ist, z. B. meins ist 192.168.3.0/24.
Die Zukunft
Nachdem der Pi-Cluster für DevNucleus bei Oracle CloudWorld auf Herz und Nieren geprüft wurde, geht es zu Oracle Labs, wo … nun, der nächste Teil ist vorerst ein bisschen geheim. Mögliche Verwendungen umfassen:
1. Ausführen zusätzlicher Tests für GraalVM und Java
2. Edge-Computing-Projekte
3. Roboter und parallele Verarbeitung (dh neuronale Netze)
5. Aktivitäten, die uns von Ihnen, dem Entwickler, vorgeschlagen werden
Da der Pi Day 2023 gleich um die Ecke ist, werden Sie auf jeden Fall auf die nächste Evolutionsstufe für dieses unglaubliche Stück Technik gespannt bleiben wollen. Wer weiß? Einige der Pi können sogar aus dem Cluster heraus und in Ihre Hände gelangen.
Ich möchte allen danken, die an dem Projekt mitgewirkt haben. Lesen Sie A Temporal History of the World's Largest Raspberry Pi Cluster , um zu erfahren, wie dieses verrückte, erstaunliche Projekt zustande kam.

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































