1 Aufgaben

Für die Übungsaufgaben gehen wir zu dem diamonds Datensatz über. Der Datensatz befasst sich mit Preis, Qualität und weiteren Eigenschaften von knapp 54.000 Diamanten.

Zuerst geben wir wieder die folgenden Befehle ein, um die Bibliothek tidyverse zu laden und den Datensatz einzusehen:

library(tidyverse)
diamonds

Um mehr über den Datensatz zu erfahren, geben Sie wieder den Hilfsbefehl ?diamonds ein.

1.1 Übungsaufgaben

  1. Erstellen Sie eine Grafik von den Variablen carat und price des diamonds Datensatzes, wobei Sie die Datenpunkte nach der Kategorie clarity färben.

  2. Erstellen Sie eine weitere Grafik von den Variablen carat und price des diamonds Datensatzes, wobei Sie ein facet für die Kategorie clarity hinzufügen. Worin liegen die Vor- und Nachteile der Farb-Aesthetics und der Nutzung von facets?

  3. Verwenden Sie nun als facet eine kontinuierliche Variable wie z. B. table. Was passiert hier?

  4. Verwenden Sie nun ein facet mit zwei Variablen cut und clarity, um die Variablen carat und price zu vergleichen. Was können Sie dieser Grafik entnehmen?

  5. Erstellen Sie eine passende Grafik, um die Verteilungen von cut und price darzustellen. Denken Sie auch an passende Gruppierungen, Farben und Positionen!

  6. Erstellen Sie die folgenden Grafiken:

Verschiedene Grafiken

  1. Erstellen Sie ein Balkendiagramm von der Variable cut und fügen Sie ein facet mit der Variable clarity ein.
    Ändern Sie zusätzlich den Titel und die Achsenbeschriftungen mit labs() und verschieben Sie die Legende nach unten mit theme().

1.2 Lösungen

1.2.1 Erstellen Sie eine Grafik von den Variablen carat und price des diamonds Datensatzes, wobei Sie die Datenpunkte nach der Kategorie clarity färben.

ggplot(data = diamonds) +
  geom_point(mapping = aes(x = carat, y = price, color = clarity))

1.2.2 Erstellen Sie eine weitere Grafik von den Variablen carat und price des diamonds Datensatzes, wobei Sie ein facet für die Kategorie clarity hinzufügen. Worin liegen die Vor- und Nachteile der Farb-Aesthetics und der Nutzung von facets?

ggplot(data = diamonds) +
  geom_point(mapping = aes(x = carat, y = price, color = clarity)) +
  facet_wrap(facets = ~ clarity)

Durch die Gitter werden die Zusammenhänge und Trends der einzelnen Kategorien (hier clarity) deutlicher und können auch direkt zwischen den Kategorien verglichen werden.

Die gemeinsame Grafik, wo lediglich die Datenpunkte nach der clarity eingefärbt werden, wirkt wesentlich unübersichtlicher, um die Kategorien unter sich zu vergleichen, obgleich der gemeinsame Trend sichtbar ist.

Insbesondere für größere Datensätze mit mehreren Kategorien bieten sich die Gitter an.

1.2.3 Verwenden Sie nun als facet eine kontinuierliche Variable wie z. B. table. Was passiert hier?

ggplot(data = diamonds) +
  geom_point(mapping = aes(x = carat, y = price, color = clarity)) +
  facet_wrap(facets = ~ table)

Sie sehen, dass ein Gitter für jeden Wert von table erstellt wird. Das ist möglich und zeigt beispielsweise, dass es für eine Werte von table sehr viele Diamanten gibt (z. B. bei 56) und bei anderen sehr wenige (z. B. 43). Interessanterweise liegen viele hochwertige Diamanten (mit hohem clarity Wert) meist bei den Werten 54, 55, 56, 57, 58, 59, 60, 61 und 63 für table.

Die Variable table bezieht sich hierbei auf das Verhältnis der Breite der obersten Stelle und der weitesten Stelle eines Diamanten.

Bei Kontinuierlichen Werten entstehen jedoch meistens eine große Anzahl an Gitter, was für die Übersichtlichkeit nicht unbedingt von Vorteil ist.

1.2.4 Verwenden Sie nun ein facet mit zwei Variablen cut und clarity, um die Variablen carat und price zu vergleichen. Was können Sie dieser Grafik entnehmen?

Bei der Nutzung von facet_grid() muss darauf geachtet werden, dass eine Variable vor der Tilde ~ und eine danach steht (in diesem Zusammenhang die y-und x-Achse). Testen Sie, was passiert, wenn Sie die Variable tauschen!

ggplot(data = diamonds) +
  geom_point(mapping = aes(x = carat, y = price, color = clarity), shape = 11) +
  facet_grid(facets = cut ~ clarity)

Wenn eine der Variablen in facet_grid() ausgelassen oder durch einen Punkt . ersetzt werden würde, würde ebenfalls ein Gitter für nur eine Variable gezeichnet werden. Hierbei würde sich der Einfachheit facet_wrap anbieten.

Allgemein ist in der Grafik der Zusammenhang von Preis und Karat von Diamanten dargestellt.

Die Grafik sieht zwar zunächst etwas überwältigend aus, zeigt jedoch lediglich die Aufteilung von Preis price und Karat karat anhand der Kategorien für Klarheit clarity (y-Achse) und Qualität cut (x-Achse).

Wir sehen beispielsweise (von oben nach unten), dass die Verteilung für die verschiedenen Qualitätsstufen relativ ähnlich aussehen.

Eine Ausnahme fällt auf: Die Diamanten mit einer hohen Klarheit (VVS1 und IF) und einer geringen Qualität (fair) scheinen weniger häufig und weniger weit verteilt zu sein, d. h. sie weisen scheinbar wenig Karat und einen geringen Preis auf.

Ebenfalls scheinen häufiger höhere Preise durch eine höhere Qualität erzielt zu werden.

Bei dem Vergleich der Klarheit sehen wir, dass die einzelnen Stufen sich ähnlich verteilen (von links nach rechts), jedoch die Diamenten mit geringer Klarheit I1 häufiger einen höheren Karatwert aufweisen.

1.2.5 Erstellen Sie eine passende Grafik, um die Verteilungen von cut und price darzustellen. Denken Sie auch an passende Gruppierungen, Farben und Positionen!

Zuerst müssen wir uns überlegen, um was für Daten es sich handelt. Bei cut handelt es sich um qualtitative Daten und bei price um quanitative Daten, sodass sich für cut beispielsweise ein Balkendiagramm anbieten würde und für price ein Boxplot oder ein Histogramm.

ggplot(data = diamonds, aes(x = cut, fill = clarity)) +
  geom_bar(position = "dodge")

ggplot(data = diamonds, aes(x = cut, fill = clarity)) +
  geom_bar() +
  coord_flip()

ggplot(data = diamonds, aes(x = cut, fill = clarity)) +
  geom_bar() +
  coord_polar()

ggplot(data = diamonds, aes(x = price, fill = cut)) +
  geom_histogram(bins = 30)

ggplot(data = diamonds, aes(x = cut, y = price, fill = cut)) +
  geom_boxplot()

1.2.6 Erstellen Sie die folgenden Grafiken.

ggplot(diamonds, mapping = aes(x = carat, y = price)) + 
  geom_point() +
  geom_smooth()

ggplot(diamonds, mapping = aes(x = carat, y = price)) + 
  geom_point() +
  geom_smooth(mapping = aes(group = cut), se = FALSE)

ggplot(diamonds, mapping = aes(x = carat, y = price, color = cut)) + 
  geom_point() +
  geom_smooth(se = FALSE)

ggplot(diamonds, mapping = aes(x = carat, y = price)) + 
  geom_point(mapping = aes(color = cut)) +
  geom_smooth(se = FALSE)

ggplot(diamonds, mapping = aes(x = carat, y = price)) + 
  geom_point(mapping = aes(color = cut)) +
  geom_smooth(se = FALSE)

ggplot(diamonds, mapping = aes(x = carat, y = price)) + 
  geom_point(mapping = aes(color = cut))

1.2.7 Erstellen Sie ein Balkendiagramm von der Variable cut und fügen Sie ein facet mit der Variable clarity ein. Ändern Sie zusätzlich den Titel und die Achsenbeschriftungen mit labs() und verschieben Sie die Legende nach unten mit theme().

ggplot(data = diamonds, aes(x = cut, fill = clarity)) +
  geom_bar() +
  facet_wrap(facets = ~ clarity) +
  labs(x = "Qualität", y = "Absolute Häufigkeit",
       title = "Qualität von Diamanten unter Betrachtung der Klarheit") +
  theme(legend.position = "bottom")

LS0tCnRpdGxlOiAiw5xidW5nc3pldHRlbCAyIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKLS0tCgojIEF1ZmdhYmVuCgpGw7xyIGRpZSDDnGJ1bmdzYXVmZ2FiZW4gZ2VoZW4gd2lyIHp1IGRlbSBgZGlhbW9uZHNgIERhdGVuc2F0eiDDvGJlci4gRGVyCkRhdGVuc2F0eiBiZWZhc3N0IHNpY2ggbWl0IFByZWlzLCBRdWFsaXTDpHQgdW5kIHdlaXRlcmVuIEVpZ2Vuc2NoYWZ0ZW4Kdm9uIGtuYXBwIDU0LjAwMCBEaWFtYW50ZW4uCgpadWVyc3QgZ2ViZW4gd2lyIHdpZWRlciBkaWUgZm9sZ2VuZGVuIEJlZmVobGUgZWluLCB1bSBkaWUgQmlibGlvdGhlawpgdGlkeXZlcnNlYCB6dSBsYWRlbiB1bmQgZGVuIERhdGVuc2F0eiBlaW56dXNlaGVuOgoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpkaWFtb25kcwpgYGAKClVtIG1laHIgw7xiZXIgZGVuIERhdGVuc2F0eiB6dSBlcmZhaHJlbiwgZ2ViZW4gU2llIHdpZWRlciBkZW4gSGlsZnNiZWZlaGwKYD9kaWFtb25kc2AgZWluLgoKIyMgw5xidW5nc2F1ZmdhYmVuCgoxLiAgRXJzdGVsbGVuIFNpZSBlaW5lIEdyYWZpayB2b24gZGVuIFZhcmlhYmxlbiBgY2FyYXRgIHVuZCBgcHJpY2VgIGRlcwogICAgYGRpYW1vbmRzYCBEYXRlbnNhdHplcywgd29iZWkgU2llIGRpZSBEYXRlbnB1bmt0ZSBuYWNoIGRlciBLYXRlZ29yaWUKICAgIGBjbGFyaXR5YCBmw6RyYmVuLgoKMi4gIEVyc3RlbGxlbiBTaWUgZWluZSB3ZWl0ZXJlIEdyYWZpayB2b24gZGVuIFZhcmlhYmxlbiBgY2FyYXRgIHVuZAogICAgYHByaWNlYCBkZXMgYGRpYW1vbmRzYCBEYXRlbnNhdHplcywgd29iZWkgU2llIGVpbiBgZmFjZXRgIGbDvHIgZGllCiAgICBLYXRlZ29yaWUgYGNsYXJpdHlgIGhpbnp1ZsO8Z2VuLiBXb3JpbiBsaWVnZW4gZGllIFZvci0gdW5kIE5hY2h0ZWlsZQogICAgZGVyIEZhcmItQWVzdGhldGljcyB1bmQgZGVyIE51dHp1bmcgdm9uIGBmYWNldHNgPwoKMy4gIFZlcndlbmRlbiBTaWUgbnVuIGFscyBgZmFjZXRgIGVpbmUga29udGludWllcmxpY2hlIFZhcmlhYmxlCiAgICB3aWUgei4gQi4gYHRhYmxlYC4gV2FzIHBhc3NpZXJ0IGhpZXI/Cgo0LiAgVmVyd2VuZGVuIFNpZSBudW4gZWluIGBmYWNldGAgbWl0IHp3ZWkgVmFyaWFibGVuIGBjdXRgIHVuZAogICAgYGNsYXJpdHlgLCB1bSBkaWUgVmFyaWFibGVuIGBjYXJhdGAgdW5kIGBwcmljZWAgenUgdmVyZ2xlaWNoZW4uIFdhcwogICAga8O2bm5lbiBTaWUgZGllc2VyIEdyYWZpayBlbnRuZWhtZW4/Cgo1LiAgRXJzdGVsbGVuIFNpZSBlaW5lIHBhc3NlbmRlIEdyYWZpaywgdW0gZGllIFZlcnRlaWx1bmdlbiB2b24gYGN1dGAKICAgIHVuZCBgcHJpY2VgIGRhcnp1c3RlbGxlbi4gRGVua2VuIFNpZSBhdWNoIGFuIHBhc3NlbmRlIEdydXBwaWVydW5nZW4sCiAgICBGYXJiZW4gdW5kIFBvc2l0aW9uZW4hCgo2LiAgRXJzdGVsbGVuIFNpZSBkaWUgZm9sZ2VuZGVuIEdyYWZpa2VuOgoKIVtWZXJzY2hpZWRlbmUgR3JhZmlrZW5dKC4uL3Jlc291cmNlcy9ncmFwaF9ncmlkLnBuZykKCjcuICBFcnN0ZWxsZW4gU2llIGVpbiBCYWxrZW5kaWFncmFtbSB2b24gZGVyIFZhcmlhYmxlIGBjdXRgIHVuZCBmw7xnZW4KICAgIFNpZSBlaW4gYGZhY2V0YCBtaXQgZGVyIFZhcmlhYmxlIGBjbGFyaXR5YCBlaW4uXAogICAgw4RuZGVybiBTaWUgenVzw6R0emxpY2ggZGVuIFRpdGVsIHVuZCBkaWUgQWNoc2VuYmVzY2hyaWZ0dW5nZW4gbWl0CiAgICBgbGFicygpYCB1bmQgdmVyc2NoaWViZW4gU2llIGRpZSBMZWdlbmRlIG5hY2ggdW50ZW4gbWl0IGB0aGVtZSgpYC4KCiMjIEzDtnN1bmdlbgoKIyMjIEVyc3RlbGxlbiBTaWUgZWluZSBHcmFmaWsgdm9uIGRlbiBWYXJpYWJsZW4gYGNhcmF0YCB1bmQgYHByaWNlYCBkZXMgYGRpYW1vbmRzYCBEYXRlbnNhdHplcywgd29iZWkgU2llIGRpZSBEYXRlbnB1bmt0ZSBuYWNoIGRlciBLYXRlZ29yaWUgYGNsYXJpdHlgIGbDpHJiZW4uCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBkaWFtb25kcykgKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gY2FyYXQsIHkgPSBwcmljZSwgY29sb3IgPSBjbGFyaXR5KSkKYGBgCgojIyMgRXJzdGVsbGVuIFNpZSBlaW5lIHdlaXRlcmUgR3JhZmlrIHZvbiBkZW4gVmFyaWFibGVuIGBjYXJhdGAgdW5kIGBwcmljZWAgZGVzIGBkaWFtb25kc2AgRGF0ZW5zYXR6ZXMsIHdvYmVpIFNpZSBlaW4gYGZhY2V0YCBmw7xyIGRpZSBLYXRlZ29yaWUgYGNsYXJpdHlgIGhpbnp1ZsO8Z2VuLiBXb3JpbiBsaWVnZW4gZGllIFZvci0gdW5kIE5hY2h0ZWlsZSBkZXIgRmFyYi1BZXN0aGV0aWNzIHVuZCBkZXIgTnV0enVuZyB2b24gYGZhY2V0c2A/CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBkaWFtb25kcykgKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gY2FyYXQsIHkgPSBwcmljZSwgY29sb3IgPSBjbGFyaXR5KSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBjbGFyaXR5KQpgYGAKCkR1cmNoIGRpZSBHaXR0ZXIgd2VyZGVuIGRpZSBadXNhbW1lbmjDpG5nZSB1bmQgVHJlbmRzIGRlciBlaW56ZWxuZW4KS2F0ZWdvcmllbiAoaGllciBgY2xhcml0eWApIGRldXRsaWNoZXIgdW5kIGvDtm5uZW4gYXVjaCBkaXJla3Qgendpc2NoZW4KZGVuIEthdGVnb3JpZW4gdmVyZ2xpY2hlbiB3ZXJkZW4uCgpEaWUgZ2VtZWluc2FtZSBHcmFmaWssIHdvIGxlZGlnbGljaCBkaWUgRGF0ZW5wdW5rdGUgbmFjaCBkZXIgYGNsYXJpdHlgCmVpbmdlZsOkcmJ0IHdlcmRlbiwgd2lya3Qgd2VzZW50bGljaCB1bsO8YmVyc2ljaHRsaWNoZXIsIHVtIGRpZSBLYXRlZ29yaWVuCnVudGVyIHNpY2ggenUgdmVyZ2xlaWNoZW4sIG9iZ2xlaWNoIGRlciBnZW1laW5zYW1lIFRyZW5kIHNpY2h0YmFyIGlzdC4KCkluc2Jlc29uZGVyZSBmw7xyIGdyw7bDn2VyZSBEYXRlbnPDpHR6ZSBtaXQgbWVocmVyZW4gS2F0ZWdvcmllbiBiaWV0ZW4gc2ljaApkaWUgR2l0dGVyIGFuLgoKIyMjIFZlcndlbmRlbiBTaWUgbnVuIGFscyBgZmFjZXRgIGVpbmUga29udGludWllcmxpY2hlIFZhcmlhYmxlIHdpZSB6LiBCLiBgdGFibGVgLiBXYXMgcGFzc2llcnQgaGllcj8KCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGRpYW1vbmRzKSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBjYXJhdCwgeSA9IHByaWNlLCBjb2xvciA9IGNsYXJpdHkpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IHRhYmxlKQpgYGAKClNpZSBzZWhlbiwgZGFzcyBlaW4gR2l0dGVyIGbDvHIgamVkZW4gV2VydCB2b24gYHRhYmxlYCBlcnN0ZWxsdCB3aXJkLiBEYXMKaXN0IG3DtmdsaWNoIHVuZCB6ZWlndCBiZWlzcGllbHN3ZWlzZSwgZGFzcyBlcyBmw7xyIGVpbmUgV2VydGUgdm9uIGB0YWJsZWAKc2VociB2aWVsZSBEaWFtYW50ZW4gZ2lidCAoei4gQi4gYmVpIDU2KSB1bmQgYmVpIGFuZGVyZW4gc2VociB3ZW5pZ2UgKHouCkIuIDQzKS4gSW50ZXJlc3NhbnRlcndlaXNlIGxpZWdlbiB2aWVsZSBob2Nod2VydGlnZSBEaWFtYW50ZW4gKG1pdCBob2hlbQpgY2xhcml0eWAgV2VydCkgbWVpc3QgYmVpIGRlbiBXZXJ0ZW4gNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxIHVuZAo2MyBmw7xyIGB0YWJsZWAuCgpEaWUgVmFyaWFibGUgYHRhYmxlYCBiZXppZWh0IHNpY2ggaGllcmJlaSBhdWYgZGFzIFZlcmjDpGx0bmlzIGRlciBCcmVpdGUKZGVyIG9iZXJzdGVuIFN0ZWxsZSB1bmQgZGVyIHdlaXRlc3RlbiBTdGVsbGUgZWluZXMgRGlhbWFudGVuLgoKQmVpIEtvbnRpbnVpZXJsaWNoZW4gV2VydGVuIGVudHN0ZWhlbiBqZWRvY2ggbWVpc3RlbnMgZWluZSBncm/Dn2UgQW56YWhsCmFuIEdpdHRlciwgd2FzIGbDvHIgZGllIMOcYmVyc2ljaHRsaWNoa2VpdCBuaWNodCB1bmJlZGluZ3Qgdm9uIFZvcnRlaWwKaXN0LgoKIyMjIFZlcndlbmRlbiBTaWUgbnVuIGVpbiBgZmFjZXRgIG1pdCB6d2VpIFZhcmlhYmxlbiBgY3V0YCB1bmQgYGNsYXJpdHlgLCB1bSBkaWUgVmFyaWFibGVuIGBjYXJhdGAgdW5kIGBwcmljZWAgenUgdmVyZ2xlaWNoZW4uIFdhcyBrw7ZubmVuIFNpZSBkaWVzZXIgR3JhZmlrIGVudG5laG1lbj8KCkJlaSBkZXIgTnV0enVuZyB2b24gYGZhY2V0X2dyaWQoKWAgbXVzcyBkYXJhdWYgZ2VhY2h0ZXQgd2VyZGVuLCBkYXNzCmVpbmUgVmFyaWFibGUgdm9yIGRlciBUaWxkZSBgfmAgdW5kIGVpbmUgZGFuYWNoIHN0ZWh0IChpbiBkaWVzZW0KWnVzYW1tZW5oYW5nIGRpZSB5LXVuZCB4LUFjaHNlKS4gVGVzdGVuIFNpZSwgd2FzIHBhc3NpZXJ0LCB3ZW5uIFNpZSBkaWUKVmFyaWFibGUgdGF1c2NoZW4hCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBkaWFtb25kcykgKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gY2FyYXQsIHkgPSBwcmljZSwgY29sb3IgPSBjbGFyaXR5KSwgc2hhcGUgPSAxMSkgKwogIGZhY2V0X2dyaWQoZmFjZXRzID0gY3V0IH4gY2xhcml0eSkKYGBgCgpXZW5uIGVpbmUgZGVyIFZhcmlhYmxlbiBpbiBgZmFjZXRfZ3JpZCgpYCBhdXNnZWxhc3NlbiBvZGVyIGR1cmNoIGVpbmVuClB1bmt0IGAuYCBlcnNldHp0IHdlcmRlbiB3w7xyZGUsIHfDvHJkZSBlYmVuZmFsbHMgZWluIEdpdHRlciBmw7xyIG51ciBlaW5lClZhcmlhYmxlIGdlemVpY2huZXQgd2VyZGVuLiBIaWVyYmVpIHfDvHJkZSBzaWNoIGRlciBFaW5mYWNoaGVpdApgZmFjZXRfd3JhcGAgYW5iaWV0ZW4uCgpBbGxnZW1laW4gaXN0IGluIGRlciBHcmFmaWsgZGVyIFp1c2FtbWVuaGFuZyB2b24gUHJlaXMgdW5kIEthcmF0IHZvbgpEaWFtYW50ZW4gZGFyZ2VzdGVsbHQuCgpEaWUgR3JhZmlrIHNpZWh0IHp3YXIgenVuw6RjaHN0IGV0d2FzIMO8YmVyd8OkbHRpZ2VuZCBhdXMsIHplaWd0IGplZG9jaApsZWRpZ2xpY2ggZGllIEF1ZnRlaWx1bmcgdm9uIFByZWlzIGBwcmljZWAgdW5kIEthcmF0IGBrYXJhdGAgYW5oYW5kIGRlcgpLYXRlZ29yaWVuIGbDvHIgS2xhcmhlaXQgYGNsYXJpdHlgICh5LUFjaHNlKSB1bmQgUXVhbGl0w6R0IGBjdXRgCih4LUFjaHNlKS4KCldpciBzZWhlbiBiZWlzcGllbHN3ZWlzZSAodm9uIG9iZW4gbmFjaCB1bnRlbiksIGRhc3MgZGllIFZlcnRlaWx1bmcgZsO8cgpkaWUgdmVyc2NoaWVkZW5lbiBRdWFsaXTDpHRzc3R1ZmVuIHJlbGF0aXYgw6RobmxpY2ggYXVzc2VoZW4uCgpFaW5lIEF1c25haG1lIGbDpGxsdCBhdWY6IERpZSBEaWFtYW50ZW4gbWl0IGVpbmVyIGhvaGVuIEtsYXJoZWl0IChgVlZTMWAKdW5kIGBJRmApIHVuZCBlaW5lciBnZXJpbmdlbiBRdWFsaXTDpHQgKGBmYWlyYCkgc2NoZWluZW4gd2VuaWdlciBow6R1ZmlnCnVuZCB3ZW5pZ2VyIHdlaXQgdmVydGVpbHQgenUgc2VpbiwgZC4gaC4gc2llIHdlaXNlbiBzY2hlaW5iYXIgd2VuaWcKS2FyYXQgdW5kIGVpbmVuIGdlcmluZ2VuIFByZWlzIGF1Zi4KCkViZW5mYWxscyBzY2hlaW5lbiBow6R1ZmlnZXIgaMO2aGVyZSBQcmVpc2UgZHVyY2ggZWluZSBow7ZoZXJlIFF1YWxpdMOkdAplcnppZWx0IHp1IHdlcmRlbi4KCkJlaSBkZW0gVmVyZ2xlaWNoIGRlciBLbGFyaGVpdCBzZWhlbiB3aXIsIGRhc3MgZGllIGVpbnplbG5lbiBTdHVmZW4gc2ljaArDpGhubGljaCB2ZXJ0ZWlsZW4gKHZvbiBsaW5rcyBuYWNoIHJlY2h0cyksIGplZG9jaCBkaWUgRGlhbWVudGVuIG1pdApnZXJpbmdlciBLbGFyaGVpdCBgSTFgIGjDpHVmaWdlciBlaW5lbiBow7ZoZXJlbiBLYXJhdHdlcnQgYXVmd2Vpc2VuLgoKIyMjIEVyc3RlbGxlbiBTaWUgZWluZSBwYXNzZW5kZSBHcmFmaWssIHVtIGRpZSBWZXJ0ZWlsdW5nZW4gdm9uIGBjdXRgIHVuZCBgcHJpY2VgIGRhcnp1c3RlbGxlbi4gRGVua2VuIFNpZSBhdWNoIGFuIHBhc3NlbmRlIEdydXBwaWVydW5nZW4sIEZhcmJlbiB1bmQgUG9zaXRpb25lbiEKClp1ZXJzdCBtw7xzc2VuIHdpciB1bnMgw7xiZXJsZWdlbiwgdW0gd2FzIGbDvHIgRGF0ZW4gZXMgc2ljaCBoYW5kZWx0LiBCZWkKYGN1dGAgaGFuZGVsdCBlcyBzaWNoIHVtIHF1YWx0aXRhdGl2ZSBEYXRlbiB1bmQgYmVpIGBwcmljZWAgdW0KcXVhbml0YXRpdmUgRGF0ZW4sIHNvZGFzcyBzaWNoIGbDvHIgYGN1dGAgYmVpc3BpZWxzd2Vpc2UgZWluCkJhbGtlbmRpYWdyYW1tIGFuYmlldGVuIHfDvHJkZSB1bmQgZsO8ciBgcHJpY2VgIGVpbiBCb3hwbG90IG9kZXIgZWluCkhpc3RvZ3JhbW0uCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBkaWFtb25kcywgYWVzKHggPSBjdXQsIGZpbGwgPSBjbGFyaXR5KSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikKZ2dwbG90KGRhdGEgPSBkaWFtb25kcywgYWVzKHggPSBjdXQsIGZpbGwgPSBjbGFyaXR5KSkgKwogIGdlb21fYmFyKCkgKwogIGNvb3JkX2ZsaXAoKQpnZ3Bsb3QoZGF0YSA9IGRpYW1vbmRzLCBhZXMoeCA9IGN1dCwgZmlsbCA9IGNsYXJpdHkpKSArCiAgZ2VvbV9iYXIoKSArCiAgY29vcmRfcG9sYXIoKQpnZ3Bsb3QoZGF0YSA9IGRpYW1vbmRzLCBhZXMoeCA9IHByaWNlLCBmaWxsID0gY3V0KSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkKZ2dwbG90KGRhdGEgPSBkaWFtb25kcywgYWVzKHggPSBjdXQsIHkgPSBwcmljZSwgZmlsbCA9IGN1dCkpICsKICBnZW9tX2JveHBsb3QoKQpgYGAKCiMjIyBFcnN0ZWxsZW4gU2llIGRpZSBmb2xnZW5kZW4gR3JhZmlrZW4uCgpgYGB7cn0KZ2dwbG90KGRpYW1vbmRzLCBtYXBwaW5nID0gYWVzKHggPSBjYXJhdCwgeSA9IHByaWNlKSkgKyAKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKCkKZ2dwbG90KGRpYW1vbmRzLCBtYXBwaW5nID0gYWVzKHggPSBjYXJhdCwgeSA9IHByaWNlKSkgKyAKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBjdXQpLCBzZSA9IEZBTFNFKQpnZ3Bsb3QoZGlhbW9uZHMsIG1hcHBpbmcgPSBhZXMoeCA9IGNhcmF0LCB5ID0gcHJpY2UsIGNvbG9yID0gY3V0KSkgKyAKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKHNlID0gRkFMU0UpCmdncGxvdChkaWFtb25kcywgbWFwcGluZyA9IGFlcyh4ID0gY2FyYXQsIHkgPSBwcmljZSkpICsgCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKGNvbG9yID0gY3V0KSkgKwogIGdlb21fc21vb3RoKHNlID0gRkFMU0UpCmdncGxvdChkaWFtb25kcywgbWFwcGluZyA9IGFlcyh4ID0gY2FyYXQsIHkgPSBwcmljZSkpICsgCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKGNvbG9yID0gY3V0KSkgKwogIGdlb21fc21vb3RoKHNlID0gRkFMU0UpCmdncGxvdChkaWFtb25kcywgbWFwcGluZyA9IGFlcyh4ID0gY2FyYXQsIHkgPSBwcmljZSkpICsgCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKGNvbG9yID0gY3V0KSkKYGBgCgojIyMgRXJzdGVsbGVuIFNpZSBlaW4gQmFsa2VuZGlhZ3JhbW0gdm9uIGRlciBWYXJpYWJsZSBgY3V0YCB1bmQgZsO8Z2VuIFNpZSBlaW4gYGZhY2V0YCBtaXQgZGVyIFZhcmlhYmxlIGBjbGFyaXR5YCBlaW4uIMOEbmRlcm4gU2llIHp1c8OkdHpsaWNoIGRlbiBUaXRlbCB1bmQgZGllIEFjaHNlbmJlc2NocmlmdHVuZ2VuIG1pdCBgbGFicygpYCB1bmQgdmVyc2NoaWViZW4gU2llIGRpZSBMZWdlbmRlIG5hY2ggdW50ZW4gbWl0IGB0aGVtZSgpYC4KCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGRpYW1vbmRzLCBhZXMoeCA9IGN1dCwgZmlsbCA9IGNsYXJpdHkpKSArCiAgZ2VvbV9iYXIoKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGNsYXJpdHkpICsKICBsYWJzKHggPSAiUXVhbGl0w6R0IiwgeSA9ICJBYnNvbHV0ZSBIw6R1Zmlna2VpdCIsCiAgICAgICB0aXRsZSA9ICJRdWFsaXTDpHQgdm9uIERpYW1hbnRlbiB1bnRlciBCZXRyYWNodHVuZyBkZXIgS2xhcmhlaXQiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCmBgYAo=