MOBIS-COVID19/02

Ergebnisse ab 13/04/2020

Ein Projekt des IVT, ETH Zürich und WWZ, Universität Basel

Kontakt: Joseph Molloy ()

Frühere und zukünftige Berichte finden Sie unter: https://ivtmobis.ethz.ch/mobis/covid19


Neuigkeiten

  1. April:
  • Frühere Wochen wurden gruppiert und in bestimmten Diagrammen grau eingefärbt.
  • Analyse des Reisezwecks nach Flächennutzung.

Einführung

Am 16. März 2020 wurden 3700 Teilnehmer, die die MOBIS-Studie zwischen September 2019 und Januar 2020 abgeschlossen hatten, eingeladen, die von MotionTag entwickelte GPS-Logger- und Reisetagebuch-App ‘Catch-My-Day’ erneut zu installieren, um ihr Mobilitätsverhalten während der Zeit der Massnahmen zur Kontrolle der Ausbreitung des Coronavirus aufzuzeichnen. Die ersten 4 Wochen der Mobilitätsdaten aus der originalen MOBIS-Studie werden für jeden Teilnehmer als Vergleichsgrundlage für die aktuellen Mobilitätsverhalten herangezogen. Diese 4 Wochen beginnen je nach Teilnehmer irgendwo zwischen dem 1. September und dem 15. November. Derzeit werden nur Fahrten in der Schweiz berücksichtigt, obwohl Daten über grenzüberquerende Fahrten verfügbar sind.

Die folgende Abbildung zeigt die Anzahl der registrierten und verfolgten Teilnehmer pro Tag. Ein laufendes Panel von etwa 250 Teilnehmern war bereits im Tracking, bevor die Stichprobe erneut eingeladen wurde. Dies ermöglicht Ergebnisse für die Wochen vor dem offiziellen Start der MOBIS:COVID-19-Studie, obwohl die Stichprobengrösse und damit die Ergebnisse wesentlich kleiner sind.

Die Tageswerte werden gegebenenfalls um die Anzahl der Tracking-Teilnehmer pro Tag normalisiert. Die Analyse wird in den kommenden Wochen erweitert, um auch Teilnehmer aufzunehmen, die keine GPS-Aktivität aufzeichnen, aber an der Studie teilnehmen - dies wird notwendig sein, wenn eine totale Sperrung durchgeführt wird.

Das verwendete GPS-Reisetagebuch, Catch-My-Day (für iOS und Android) kann eine Verzögerung von 2-3 Tagen haben, bevor die Tracks für die Analyse zur Verfügung stehen. Die Skalierung durch aktive Teilnehmer kommt dem entgegen, aber die Ergebnisse früherer Berichte können sich bei der Aktualisierung des Berichts ändern.

Beteiligung


Abweichungen in den Verteilungen

Die folgenden Abbildungen zeigen die Kennwerte der Stichprobe MOBIS:COVID-19 im Vergleich zur originalen MOBIS-Stichprobe. Es gibt einige kleine Unterschiede, aber im Allgemeinen sind die Stichproben konsistent. Dieses Abbildung wird zum Vergleich mit den relevanten Zensusdaten erweitert.


Durchschnittliche Tagesdistanz


Veränderung der gefahrenen Kilometer nach Verkehrsmittel

Veränderung der gefahrenen Kilometer nach:


Reduktion der gefahrenen Kilometer nach Kanton

Veränderung der gefahrenen Kilometer nach Heimatkanton (%)
Kanton N Mär-02 Mär-09 Mär-16 Mär-23 Mär-30 Apr-06
Aargau 64 -25 -41 -71 -58 -51 -51
Basel-Landschaft 148 -13 -8 -60 -60 -58 -55
Basel-Stadt 28 -14 -36 -71 -74 -66 -54
Bern 157 -30 -33 -66 -59 -56 -51
Genf 104 7 -45 -69 -60 -56 -61
Schwyz 13 -6 12 -42 -67 -45 -49
Solothurn 16 -13 -41 -62 -65 -53 -44
Waadt 239 -7 -22 -64 -70 -67 -63
Zürich 552 -16 -25 -60 -58 -56 -49

Aktivitätsraum und Tägesradius

Eine häufig verwendete Definition des Aktivitätsraums ist die 95%-Vertrauensellipse der Aktivitätsorte, in diesem Fall gewichtet nach Dauer. In der folgenden Analyse werden die Aktivitäten am Heimatort einbezogen, für diejenigen, bei denen die App an diesem Tag aktiviert war. Dies ist eine wichtige Metrik, die eine Vorstellung von dem Gebiet vermittelt, in dem die Reise durchgeführt wird. Der tägliche Reiseradius wird ebenfalls dargestellt.

Veränderung der Aktivitätsfläche (%)
Woche Wochentag # Activitäten/Tag Veränderung Fläche (km2) Veränderung Tagesradius (km) Veränderung
Baseline-2019 week 7.00 0% 194.02 0% 12.79 0%
weekend 6.18 0% 262.94 0% 13.83 0%
Feb-24 weekend 1.00 -84%
NaN% 0.00 -100%
Mär-02 week 6.12 -13% 174.48 -10% 10.92 -15%
weekend 5.65 -9% 181.93 -31% 11.30 -18%
Mär-09 week 6.37 -9% 120.27 -38% 10.25 -20%
weekend 5.47 -12% 91.58 -65% 8.80 -36%
Mär-16 week 4.81 -31% 35.86 -82% 5.69 -56%
weekend 3.56 -42% 27.79 -89% 3.71 -73%
Mär-23 week 4.38 -37% 37.86 -80% 4.92 -62%
weekend 3.94 -36% 57.94 -78% 4.99 -64%
Mär-30 week 4.77 -32% 47.12 -76% 5.37 -58%
weekend 4.34 -30% 31.16 -88% 5.19 -62%
Apr-06 week 4.83 -31% 50.43 -74% 5.75 -55%
weekend 4.08 -34% 72.26 -73% 4.88 -65%

Stundenzahlen

Die Anzahl der begonnenen Fahrten pro Stunde. Die y-Achse wird durch den maximalen Stundenwert in der Grafik normalisiert.

LS0tCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDoKICAgIGNzczogc3R5bGUuY3NzCiAgICBkZl9wcmludDogcGFnZWQKICAgIGxpYl9kaXI6IHJlcG9ydHMvbGlicwogICAgc2VsZl9jb250YWluZWQ6IG5vCiAgcGRmX2RvY3VtZW50OgogICAga2VlcF90ZXg6IHllcwogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKcGFnZXRpdGxlOiBNT0JJUyBDb3ZpZDE5IE1vYmlsaXR5IFJlcG9ydApwYXJhbXM6CiAgbGFuZ3VhZ2U6IEVOCi0tLQoKYGBge3IsIHNldHVwLCBpbmNsdWRlPUZ9CiAga25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGU9RikKYGBgCgoKYGBge3IsIGxvYWRfcGFja2FnZXMsIGVjaG89Riwgd2FybmluZz1GfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkob3NtZGF0YSkKI2xpYnJhcnkoZ2dtYXApCiNsaWJyYXJ5KHNmKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKcmVxdWlyZShzY2FsZXMpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoem9vKQpsaWJyYXJ5KGZvcmNhdHMpCgpgYGAKCgpgYGB7ciwgZWNobz1GQUxTRSwgY2FjaGU9Rn0KaHRtbHRvb2xzOjppbmNsdWRlSFRNTCgiY292aWRfaGVhZGVyLmh0bWwiKQpgYGAKCgpgYGB7ciwgbG9hZF9kYXRhLCBlY2hvPUYsIHJlc3VsdHM9J2hpZGUnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsb2FkKCdvdXRwdXRfdmFyaWFibGVzLlJEYXRhJykKCiNsb2FkIHRyYW5zbGF0aW9ucwpsaWJyYXJ5KHNoaW55LmkxOG4pCmkxOG4gPC0gVHJhbnNsYXRvciRuZXcodHJhbnNsYXRpb25fanNvbl9wYXRoID0gInRyYW5zbGF0aW9ucy5qc29uIikKCmxhbmdfbG93ZXIgPC0gc3RyaW5ncjo6c3RyX3RvX2xvd2VyKHBhcmFtcyRsYW5ndWFnZSkKbG9jYWxlMSA9IGlmZWxzZShsYW5nX2xvd2VyID09ICdlbicsICdlbl9BVS5VVEYtOCcsIHBhc3RlMChsYW5nX2xvd2VyLCAnX0NILlVURi04JykpCgppMThuJHNldF90cmFuc2xhdGlvbl9sYW5ndWFnZShsYW5nX2xvd2VyKQpTeXMuc2V0bG9jYWxlKCdMQ19USU1FJywgbG9jYWxlMSkKI2RlZmF1bHQgbG9jYWw6IGVuX0FVLlVURi04CgpgYGAKCiMgTU9CSVMtQ09WSUQxOS8wMgojIyBgciBwYXN0ZShpMThuJHQoJ3Jlc3VsdHNfYXNfb2YnKSwgZm9ybWF0KHRvZGF5KCksIGZvcm1hdD0iJWQvJW0vJVkiKSlgCgpgciBpMThuJHQoInByb2plY3RfcGFydG5lcnMiKWAKCmByIGkxOG4kdCgiY29udGFjdF9wZXJzb24iKWAKCmByIGkxOG4kdCgibGlua190b19ob21lcGFnZSIpYAoKCioqKioqKgoKYHIgaTE4biR0KCduZXdzJylgCgpgciBpMThuJHQoJ2ludHJvX2hlYWRlcicpYAoKYHIgaTE4biR0KCdpbnRyb190ZXh0JylgIAoKYHIgaTE4biR0KCdwYXJ0aWNpcGF0aW9uJylgCgoKYGBge3IgcmVnaXN0cmF0aW9ucywgZWNobz1GfQoKZ2dwbG90KHBhcnRpY2lwYW50c19wZXJfZGF5ICU+JSBmaWx0ZXIoZGF5ID49IHltZCgnMjAyMC0wMy0wMScpICYgZGF5IDw9IHRvZGF5KCktMSksIGFlcyh4PWRheSkpICsgCiAgZ2VvbV9saW5lKGFlcyh5PW51bV9wYXJ0aWNpcGFudHMsIGNvbG9yPWkxOG4kdCgnVHJhY2tpbmcnKSkpICsKICBnZW9tX2xpbmUoYWVzKHk9bnVtX3JlZ2lzdGVyZWQsIGNvbG9yPWkxOG4kdCgnUmVnaXN0ZXJlZCcpKSkgKwogIHhsYWIoaTE4biR0KCdEYXRlJykpICsgCiAgeWxhYihpMThuJHQoJ1BhcnRpY2lwYW50IENvdW50JykpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iRGFyazIiLCBuYW1lPU5VTEwsIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcz0nMiBkYXlzJywgZGF0ZV9sYWJlbHM9ICclYi0lZCcpICsKICBsYWJzKHRpdGxlPSBpMThuJHQoIk1PQklTOkNvdmlkIHJlZ2lzdHJhdGlvbnMiKSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQoKCgpgYGAKCmBgYHtyLCBsb2FkX3NjYWxlX2Z1bmN0aW9uc30KIyMjIyMjIyBGdW5jdGlvbnMgZm9yIGxhYmVsbGluZyBmYWNldCBncmFwaHMKcmVvcmRlcl93aXRoaW4gPC0gZnVuY3Rpb24oeCwgYnksIHdpdGhpbiwgZnVuID0gbWVhbiwgc2VwID0gIl9fXyIsIC4uLikgewogIG5ld194IDwtIHBhc3RlKHgsIHdpdGhpbiwgc2VwID0gc2VwKQogIHN0YXRzOjpyZW9yZGVyKG5ld194LCBieSwgRlVOID0gZnVuKQp9CgpzY2FsZV94X3Jlb3JkZXJlZCA8LSBmdW5jdGlvbiguLi4sIHNlcCA9ICJfX18iKSB7CiAgcmVnIDwtIHBhc3RlMChzZXAsICIuKyQiKQogIGdncGxvdDI6OnNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgZ3N1YihyZWcsICIiLCB4KSwgLi4uKQp9CgpzY2FsZV95X3Jlb3JkZXJlZCA8LSBmdW5jdGlvbiguLi4sIHNlcCA9ICJfX18iKSB7CiAgcmVnIDwtIHBhc3RlMChzZXAsICIuKyQiKQogIGdncGxvdDI6OnNjYWxlX3lfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgZ3N1YihyZWcsICIiLCB4KSwgLi4uKQp9CgpsYWJlbF93ZWVrIDwtIGZ1bmN0aW9uKHYpIHsKICBpZl9lbHNlKHllYXIodikgPCAyMDIwLCBpMThuJHQoJ0Jhc2VsaW5lLTIwMTknKSwgZm9ybWF0KHYsICclYi0lZCcpKSAlPiUgc3RyaW5ncjo6c3RyX3RvX3RpdGxlKCkKfQoKYWRkX3dlZWtfbGFiZWwgPC0gZnVuY3Rpb24gKHgpIHsKICB3ZWVrX2xhYmVsIDwtIGxhYmVsX3dlZWsoeCR3ZWVrX3N0YXJ0KQogIHdlZWtfbGFiZWwgPC0gZmN0X3Jlb3JkZXIod2Vla19sYWJlbCwgeCR3ZWVrX3N0YXJ0KQogIHgkd2Vla19sYWJlbCA8LSB3ZWVrX2xhYmVsCiAgeAp9CgpgYGAKCi0tLS0tLQoKIyBgciBpMThuJHQoJ3RpdGxlX2Rpc3RyaWJ1dGlvbnNfc2VjdGlvbicpYAoKYHIgaTE4biR0KCdkaXN0cmlidXRpb25zX3RleHQnKWAKCmBgYCB7ciwgc2VfcGxvdHMsIGZpZy5ob2xkPSdob2xkJywgb3V0LndpZHRoPSIzMCUiIH0KCiN0cmFuc2xhdGUKc2VfaGlzdG9ncmFtX3ZhbHVlc190IDwtIHNlX2hpc3RvZ3JhbV92YWx1ZXMgJT4lIG11dGF0ZSh2YXJpYWJsZSA9IGkxOG4kdCh2YXJpYWJsZSksIHZhbHVlMiA9IHVubGlzdChsYXBwbHkodmFsdWUyLCBpMThuJHQpKSkKCmZvciAodiBpbiB1bmlxdWUoc2VfaGlzdG9ncmFtX3ZhbHVlc190JHZhcmlhYmxlKSkgewogICBwcmludCgKICAgICBnZ3Bsb3Qoc2VfaGlzdG9ncmFtX3ZhbHVlc190ICU+JSBmaWx0ZXIodmFyaWFibGU9PXYpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSByZW9yZGVyX3dpdGhpbih2YWx1ZTIsIHZhbHVlLCB2YXJpYWJsZSwgbWF4KSwgZmlsbCA9IHN0dWR5KSkgKyAKICAgICAgZ2VvbV9iYXIoYWVzKHkgPSBwYyksIHBvc2l0aW9uID0gJ2RvZGdlJywgc3RhdCA9ICJpZGVudGl0eSIgKSArIAogICAgICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICAgICAgbmFtZT1pMThuJHQoJ1BlcmNlbnQnKSwgCiAgICAgICAgbGFiZWxzPWZ1bmN0aW9uKHgpIHNwcmludGYoJyUuMGYlJScsIHgqMTAwKSAsIAogICAgICAgIGJyZWFrcz1zZXEoMCwgMSwgMC4xKQogICAgICApICsKICAgICAgc2NhbGVfeF9yZW9yZGVyZWQoKSArIAogICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKwogICAgICBsYWJzKHRpdGxlPXYsIHg9TlVMTCkgKwogICAgICBjb29yZF9mbGlwKCkgKyAKICAgICAgc2NhbGVfY29sb3JfYnJld2VyKAogICAgICAgIHBhbGV0dGU9IlNldDEiLCBuYW1lPWkxOG4kdCgnU3R1ZHknKSwgYWVzdGhldGljcyA9IGMoImNvbG91ciIsICJmaWxsIiksIGd1aWRlPWd1aWRlX2xlZ2VuZChyZXZlcnNlPVQpKSArCiAgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MjApKQogICkKIH0KYGBgCgotLS0tLS0KCgojIGByIGkxOG4kdCgnQXZlcmFnZSBEYWlseSBEaXN0YW5jZScpYAoKYGBge3J9Cmdyb3VwaW5nX3Zhcj0nZ2VuZGVyJwoKZGFpbHlfYXZnX2Rpc3QgPC0gcGFydGljaXBhbnRfZGFpbHlfbW9kZV9zaGFyZXMgJT4lIAojICBmaWx0ZXIoYWN0aXZlPT0xKSAlPiUKICBmaWx0ZXIoZGF5ICE9IHRvZGF5KCkpICU+JQogIHJlbmFtZSAoZ3JvdXBpbmdfdmFyaWFibGU9Z3JvdXBpbmdfdmFyKSAlPiUKICBtdXRhdGUoZ3JvdXBpbmdfdmFyaWFibGUgPSBpMThuJHQoZ3JvdXBpbmdfdmFyaWFibGUpKSAlPiUKICBncm91cF9ieShkYXksIGdyb3VwaW5nX3ZhcmlhYmxlKSAlPiUKICBzdW1tYXJpemUoCiAgICBhdmdfZGFpbHlfZGlzdF9jYXIgPSBtZWFuKENhciksIAogICAgYXZnX2RhaWx5X2Rpc3RfdG90YWwgPSBtZWFuKFRvdGFsKQogICAgKSAlPiUKICBmaWx0ZXIoZGF5ID4gJzIwMjAtMDMtMDEnKSAlPiUKICByZW1vdmVfbWlzc2luZygpCgpwcmludCgKZ2dwbG90KGRhaWx5X2F2Z19kaXN0LCBhZXMoeD1kYXksIGNvbG9yPWdyb3VwaW5nX3ZhcmlhYmxlKSkgKwogIGdlb21fbGluZShhZXMoeT1hdmdfZGFpbHlfZGlzdF9jYXIvMTAwMCksIHNpemU9MC41KSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9aTE4biR0KCdBdmVyYWdlIGRhaWx5IGRpc3RhbmNlIChrbSknKSkgKwogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcz0nMiBkYXlzJywgZGF0ZV9sYWJlbHM9ICclYi0lZCcpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0nRGFyazInLCBuYW1lPXN0cmluZ3I6OnN0cl90b190aXRsZShncm91cGluZ192YXIpKSArCiAgbGFicyh4PWkxOG4kdCgnRGF0ZScpLCB0aXRsZT1pMThuJHQoJ0RhaWx5IGF2ZXJhZ2UgS20gdHJhdmVsbGVkIGJ5IGdlbmRlcicpKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCikKCmBgYAoKLS0tLS0tCgoKIyBgciBpMThuJHQoJ092ZXJhbGwgY2hhbmdlIGluIGtpbG9tZXRlcnMgdHJhdmVsbGVkIGJ5IHRyYW5zcG9ydCBtb2RlJylgCgpgYGB7ciBtb2RlX2NvdW50c193ZWVrbHl9CgpkYWlseV9tb2RlX3NoYXJlcyA8LSBkYWlseV9tb2RlX3NoYXJlcyAlPiUKICBmaWx0ZXIoZGF5ICE9IHRvZGF5KCkpICU+JSAKICBhZGRfd2Vla19sYWJlbCgpIAoKCndlZWtseV9tb2RhbF9jb3VudHNfbG9uZyA8LSBkYWlseV9tb2RlX3NoYXJlcyAlPiUgCiAgZ3JvdXBfYnkod2Vla19sYWJlbCkgJT4lCiAgc2VsZWN0KC11c2VyX2lkLCAtd2Vla2RheSwgLWRheSwgLWFjdGl2ZSwgLXdlZWtfc3RhcnQpICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbikpICU+JQogIG1lbHQodmFyaWFibGUubmFtZT0nTW9kZScsIHZhbHVlLm5hbWU9J0Rpc3QnKSAlPiUKICByZW5hbWUoV2Vlaz13ZWVrX2xhYmVsKSAlPiUKICBtdXRhdGUoTW9kZSA9IHVubGlzdChNYXAoZnVuY3Rpb24gKHgpIHhbMV0sIHN0cmluZ3I6OnN0cl9zcGxpdChNb2RlLCAnXycpKSkpICU+JQogIG11dGF0ZShNb2RlID0gaTE4biR0KE1vZGUpKQoKY29udHJvbF92YWx1ZXMgPC0gd2Vla2x5X21vZGFsX2NvdW50c19sb25nICU+JSBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChXZWVrLCAnMjAxOScpKSAlPiUgcmVuYW1lKGN0cmxfZGlzdCA9IERpc3QpICU+JSBzZWxlY3QoLVdlZWspCgp3ZWVrbHlfbW9kYWxfY291bnRzX2xvbmcgPC0gd2Vla2x5X21vZGFsX2NvdW50c19sb25nICU+JQogIGxlZnRfam9pbihjb250cm9sX3ZhbHVlcywgYnk9J01vZGUnKSAlPiUKICBtdXRhdGUocGNfY2hhbmdlPURpc3QvY3RybF9kaXN0LTEpCgpwcmludCgKICBnZ3Bsb3Qod2Vla2x5X21vZGFsX2NvdW50c19sb25nLCBhZXMoeD1XZWVrLCB5PXBjX2NoYW5nZSwgY29sb3I9TW9kZSwgZ3JvdXA9TW9kZSwgc2hhcGU9TW9kZSkpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTApLCBjb2xvcj0nIzU1NTU1NScpICsgCiAgZ2VvbV9saW5lKHNpemU9MC41KSArCiAgZ2VvbV9wb2ludChzaXplPTMpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT1pMThuJHQoJyUgQ2hhbmdlIGluIGF2ZXJhZ2UgZGFpbHkgZGlzdGFuY2UnKSwgYnJlYWtzID1zZXEoLTEsNCwwLjIpLCBsYWJlbHMgPSBwZXJjZW50KSArCiAgc2NhbGVfeF9kaXNjcmV0ZShuYW1lPWkxOG4kdCgnV2VlaycpKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobmFtZT1pMThuJHQoJ01vZGUnKSkKKQogIApgYGAKCgoKIyMgYHIgaTE4biR0KCdOb3JtYWxpemVkIGFnYWluc3QgdGhlIGJhc2VsaW5lIHBlcmlvZCcpYAoKYGBge3IsIG1vZGVfc2hhcmVzX3NvY2lvX2Vjb25vbWljLCBlY2hvPUYsIHdhcm5pbmc9RiwgZmlnLmhvbGQ9J2hvbGQnLCBvdXQud2lkdGg9IjUwJSJ9CgpwcmV0dHlfdmFyaWFibGVfbmFtZXM9IGMoCiAgYWdlX2dyb3Vwcz0iQWdlIiwKICBlZHVjYXRpb249J0VkdWNhdGlvbicsCiAgZW1wbG95bWVudF8xPSdNYWluIGVtcGxveW1lbnQnLAogIGdlbmRlcj0nR2VuZGVyJywKICBob3VzZWhvbGRfc2l6ZSA9ICdISCBzaXplJywKICBpbmNvbWUgPSdJbmNvbWUnLAogIGlzX3N3aXNzPSdOYXRpb25hbGl0eScsCiAgbGFuZ3VhZ2U9J0xhbmd1YWdlJywKICBvd25fY2FyPSdBY2Nlc3MgdG8gY2FyJywKICBrYW50b25fbmFtZT0nS2FudG9uJwopCgpzZV92YXJpYWJsZXMgPSBjb3ZpZF9wYXJ0aWNpcGFudHNfbG9uZyAlPiUgCiAgcmVtb3ZlX21pc3NpbmcoKSAlPiUKICBtdXRhdGUodmFyaWFibGUxPXByZXR0eV92YXJpYWJsZV9uYW1lc1t2YXJpYWJsZV0pICU+JQogIG11dGF0ZSh2YXJpYWJsZTEgPSBpMThuJHQodmFyaWFibGUxKSwgdmFsdWUyID0gYXMuZmFjdG9yKHVubGlzdChsYXBwbHkodmFsdWUyLCBpMThuJHQpKSkpCgpzdGF0c19oaXN0b2dyYW1fdmFsdWVzIDwtIGRhaWx5X21vZGVfc2hhcmVzICU+JSAgIAogIHNlbGVjdCh1c2VyX2lkLCBXZWVrPXdlZWtfbGFiZWwsIFRvdGFsKSAlPiUKICBsZWZ0X2pvaW4oc2VfdmFyaWFibGVzLCBieT1jKCd1c2VyX2lkJz0ncGFydGljaXBhbnRfSUQnKSkgJT4lCiAgZ3JvdXBfYnkoV2VlaywgdmFyaWFibGUxLCB2YWx1ZSwgdmFsdWUyKSAgJT4lIAogIHN1bW1hcml6ZShhdmdfZGFpbHlfZGlzdCA9IG1lYW4oVG90YWwpLCBuX3BhcnRpY2lwYW50cz1uX2Rpc3RpbmN0KHVzZXJfaWQpKSAlPiUgCiAgcmVtb3ZlX21pc3NpbmcoKSAlPiUKICBhcnJhbmdlKHZhcmlhYmxlMSwgdmFsdWUpCgpjb250cm9sX3N0YXRzX2hpc3RvZ3JhbV92YWx1ZXMgPC0gc3RhdHNfaGlzdG9ncmFtX3ZhbHVlcyAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChXZWVrLCAnMjAxOScpKSAlPiUgCiAgcmVuYW1lKGN0cmxfZGlzdCA9IGF2Z19kYWlseV9kaXN0KSAlPiUgCiAgc2VsZWN0KC1XZWVrLCAtbl9wYXJ0aWNpcGFudHMpIAoKCgpyZWxhdGl2ZV9zdGF0c19oaXN0b2dyYW1fdmFsdWVzIDwtIHN0YXRzX2hpc3RvZ3JhbV92YWx1ZXMgJT4lIAogIGxlZnRfam9pbihjb250cm9sX3N0YXRzX2hpc3RvZ3JhbV92YWx1ZXMpICU+JSAKICBtdXRhdGUocGNfY2hhbmdlX2Rpc3Q9YXZnX2RhaWx5X2Rpc3QvY3RybF9kaXN0LTEpICU+JSAKICBzZWxlY3QoLWN0cmxfZGlzdCkKCnZhcmlhYmxlc190b19wbG90ID0gdW5pcXVlKChyZWxhdGl2ZV9zdGF0c19oaXN0b2dyYW1fdmFsdWVzICU+JSBmaWx0ZXIodmFyaWFibGUxICE9ICdLYW50b24nICYgdmFyaWFibGUxICE9ICdDYW50b24nKSkkdmFyaWFibGUxKQoKZm9yKHYgaW4gdmFyaWFibGVzX3RvX3Bsb3QpIHsKICB2YXJpYWJsZV9kZiA8LSByZWxhdGl2ZV9zdGF0c19oaXN0b2dyYW1fdmFsdWVzICU+JSAKICAgIGZpbHRlcih2YXJpYWJsZTEgPT12ICYgIXN0cmluZ3I6OnN0cl9kZXRlY3QoV2VlaywgJzIwMTknKSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBtdXRhdGUodmFsdWUyID0gYXMuZmFjdG9yKGFzLmNoYXJhY3Rlcih2YWx1ZTIpKSkgJT4lCiAgICBhcnJhbmdlKHZhbHVlKSAlPiUKICAgIG11dGF0ZSh2YWx1ZV9mID0gZmN0X3Jlb3JkZXIodmFsdWUyLCBhcy5udW1lcmljKHZhbHVlKSkpCiAgCiAgcHJpbnQoZ2dwbG90KHZhcmlhYmxlX2RmLCBhZXMoeCA9IFdlZWssIHkgPSBwY19jaGFuZ2VfZGlzdCwgZmlsbCA9IHJlb3JkZXIodmFsdWVfZiwgdmFsdWUpKQogICAgICAgICApICsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScsIHN0YXQgPSAiaWRlbnRpdHkiICkgKyAKICAgICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iRGFyazIiLCBuYW1lPXYsIGFlc3RoZXRpY3MgPSBjKCJjb2xvdXIiLCAiZmlsbCIpLCAKICAgICAgICAgICAgICAgICAgICAgZ3VpZGU9Z3VpZGVfbGVnZW5kKHJldmVyc2U9RikpICsKCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT1pMThuJHQoJyUgQ2hhbmdlIEttIFRyYXZlbGxlZCcpLCBsYWJlbHMgPSBzY2FsZXM6OmxhYmVsX3BlcmNlbnQoYWNjdXJhY3k9MSksIGJyZWFrcz1zZXEoLTEsIDAsIDAuMikpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArCiAgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTgpKSArCiAgICBsYWJzKHRpdGxlPXYsIHk9aTE4biR0KCclIENoYW5nZScpLCB4PWkxOG4kdCgnV2VlaycpKQogICAgCiAgKQp9CmBgYAoKLS0tLS0tCgojIGByIGkxOG4kdCgnUmVkdWN0aW9uIGluIGtpbG9tZXRlcnMgdHJhdmVsbGVkIGJ5IENhbnRvbicpYAoKYGBge3IsIGthbnRvbmFsX2Rpc3RhbmNlX3RhYmxlIH0KI0thbnRvbmFsIERpc3RhbmNlCgpsaWJyYXJ5KGthYmxlRXh0cmEpCgoKcGNfY2hhbmdlX2thbnRvbmFsX2Rpc3RhbmNlIDwtIHJlbGF0aXZlX3N0YXRzX2hpc3RvZ3JhbV92YWx1ZXMgJT4lIAogIGZpbHRlcih2YXJpYWJsZTEgPT0gJ0thbnRvbicgfCB2YXJpYWJsZTEgPT0gJ0NhbnRvbicpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHNlbGVjdChLYW50b249dmFsdWUyLCBXZWVrLCBwY19jaGFuZ2VfZGlzdCwgbl9wYXJ0aWNpcGFudHMpICU+JSAKICBncm91cF9ieShLYW50b24pICU+JSBtdXRhdGUoTj1sYXN0KG5fcGFydGljaXBhbnRzKSkgJT4lCiAgZGNhc3QoS2FudG9uICsgTiB+IFdlZWssIHZhbHVlLnZhcj1jKCdwY19jaGFuZ2VfZGlzdCcpKSAlPiUKICBzZWxlY3QoLWMoMykpICU+JQogIGZpbHRlcihOPjUpICU+JQogIG11dGF0ZV9hdCh2YXJzKGNvbnRhaW5zKCctJykpLCB+IGFzLmludGVnZXIoLioxMDApKQoKY29sbmFtZXMocGNfY2hhbmdlX2thbnRvbmFsX2Rpc3RhbmNlKSA8LSBNYXAoZnVuY3Rpb24oeCkgc3RyaW5ncjo6c3RyX3NwbGl0KHgsICdfJylbWzFdXVsxXSwgY29sbmFtZXMocGNfY2hhbmdlX2thbnRvbmFsX2Rpc3RhbmNlKSkKY29sbmFtZXMocGNfY2hhbmdlX2thbnRvbmFsX2Rpc3RhbmNlKVsxXSA8LSBpMThuJHQoY29sbmFtZXMocGNfY2hhbmdlX2thbnRvbmFsX2Rpc3RhbmNlKVsxXSkKb3B0aW9ucyhrbml0ci5rYWJsZS5OQSA9ICctJykKCmNyZWF0ZV9rYW50b25hbF90YWJsZSA8LSBmdW5jdGlvbiAoZGYsIGZtdCkgewogIHJldHVybiAoa25pdHI6OmthYmxlKGRmLCBmbXQsIAogICAgICAgICAgICAgICBkaWdpdHM9MCwgY2FwdGlvbiA9IGkxOG4kdCgnJSBDaGFuZ2UgaW4ga2lsb21ldGVycyB0cmF2ZWxsZWQgYnkgaG9tZSBjYW50b24nKSwKICAgICAgICAgICAgICAgYWxpZ24gPSBjKCdsJywgcmVwKCdyJywgbmNvbChwY19jaGFuZ2Vfa2FudG9uYWxfZGlzdGFuY2UpKSkKICAgICAgICAgICAgICAgKSAlPiUKICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYpICU+JQogICAgY29sdW1uX3NwZWMoYygxLDIpLCBib2xkPVQpICU+JQogICAgY29sbGFwc2Vfcm93cyhjb2x1bW5zID0gMToyLCBsYXRleF9obGluZT0nbWFqb3InKQogICkKfQoKdGFibGUwX3RleCA8LSBjcmVhdGVfa2FudG9uYWxfdGFibGUocGNfY2hhbmdlX2thbnRvbmFsX2Rpc3RhbmNlLCAnbGF0ZXgnKQpjYXQodGFibGUwX3RleCxmaWxlPXBhc3RlMCgicmVwb3J0cy90YWJsZXMvIiwgZm9ybWF0KHRvZGF5KCksIGZvcm1hdD0iJVlfJW1fJWQiKSwgIl9rYW50b25hbF9kaXN0YW5jZS50ZXgiKSxzZXA9IlxuIikKCnRhYmxlMF9odG1sIDwtIGNyZWF0ZV9rYW50b25hbF90YWJsZShwY19jaGFuZ2Vfa2FudG9uYWxfZGlzdGFuY2UsICdodG1sJykKdGFibGUwX2h0bWwKCmBgYAogCi0tLS0tLQoKIyBgciBpMThuJHQoJ0FjdGl2aXR5IHNwYWNlIGFuZCBkYWlseSB0cmF2ZWwgcmFkaXVzJylgCgpgciBpMThuJHQoJ2FjdGl2aXR5X3NwYWNlX3RleHQnKWAKCiAKYGBge3IsIGFjdGl2aXR5X3NwYWNlX3NldHVwLCBlY2hvPUYsIHdhcm5pbmc9Rn0KCgpwYWxldHRlMSA8LSBicmV3ZXJfcGFsKHBhbGV0dGU9J0RhcmsyJykoNykKd2Vla19jb2xvcnMgPC0gYyhwYWxldHRlMVsxXSwgJ2RhcmtncmV5JywgcGFsZXR0ZTFbM10sIHBhbGV0dGUxWzddLCBwYWxldHRlMVs2XSkKICAKCmRhaWx5X2FjdGl2aXR5X3NwYWNlcyRkYXRlX2ZpbHRlciA8LSBkYWlseV9hY3Rpdml0eV9zcGFjZXMkd2Vla19zdGFydCA8ICB5bWQoJzIwMjAtMDEtMDEnKSB8IGRhaWx5X2FjdGl2aXR5X3NwYWNlcyR3ZWVrX3N0YXJ0ID49ICB5bWQoJzIwMjAtMDMtMDInKQoKZGFpbHlfYWN0aXZpdHlfc3BhY2VzMSA8LSBkYWlseV9hY3Rpdml0eV9zcGFjZXMgJT4lIAogIGZpbHRlcihkYXRlX2ZpbHRlcikgJT4lCiAgYWRkX3dlZWtfbGFiZWwoKSAlPiUKICBhcnJhbmdlKHdlZWtfc3RhcnQpICU+JQogIGdyb3VwX2J5KHVzZXJfaWQsIHdlZWtfc3RhcnQsIHdlZWtfbGFiZWwsIHdlZWtkYXkpICU+JSAKICBzdW1tYXJpemUoZWxsaXBzZV9hcmVhMT1tZWFuKHRpZHlyOjpyZXBsYWNlX25hKGVsbGlwc2VfYXJlYSwgMCksIG5hLnJtPTApKSAlPiUgCiAgbXV0YXRlKHdlZWtkYXkgPSBzdHJpbmdyOjpzdHJfdG9fdGl0bGUod2Vla2RheSkpICU+JSAKICAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZSh3ZWVrX3JhbmsgPSB3ZWVrX3N0YXJ0ICU+JSBkZXNjKCkgJT4lIGRlbnNlX3JhbmsoKSkgJT4lIAogIG11dGF0ZSh3ZWVrX2dyb3VwID0gZmN0X3Jlb3JkZXIoY2FzZV93aGVuKAogICAgeWVhcih3ZWVrX3N0YXJ0KSA9PSAnMjAxOScgfiBhcy5jaGFyYWN0ZXIod2Vla19sYWJlbCksCiAgICB3ZWVrX3JhbmsgPD0gMyB+IGFzLmNoYXJhY3Rlcih3ZWVrX2xhYmVsKSwgCiAgICBUIH4gaTE4biR0KCdJbnRlcm1lZGlhdGUgd2Vla3MnKQogICksIHdlZWtfc3RhcnQpKQogIAoKd2Vla2x5X2Rpc3RfcGxvdCA8LSBnZ3Bsb3QoZGFpbHlfYWN0aXZpdHlfc3BhY2VzMSkgKwogIGdlb21fZGVuc2l0eShhZXMoeD1lbGxpcHNlX2FyZWExLCBjb2xvcj13ZWVrX2dyb3VwLCBmaWxsPXdlZWtfZ3JvdXAsIGdyb3VwPXdlZWtfbGFiZWwpLCBhbHBoYT0wLjA1KSArIAogIHNjYWxlX3hfY29udGludW91cyh0cmFucz1sb2cxMF90cmFucygpLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzPWMoMS8oMTAwMF40KSwgMS8oMTAwMF4yKSwgMS8oMTBeMiksIDEsIDEwMCwgMTAwMDApLCAKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnMCcsICcxIG1eMicsICcxMDAgbV4yJywgJzEga21eMicsICcxMDAga21eMicsICcxMCwwMDAga21eMicpCiAgKSArCiAgbGFicyh0aXRsZT1pMThuJHQoJ0Rpc3RyaWJ1dGlvbiBvZiBhdmVyYWdlIGRhaWx5IGFjdGl2aXR5IHNwYWNlcycpLAogICAgICAgeD1pMThuJHQoJ0FyZWEgKGxvZyB0cmFuc2Zvcm1lZCknKSwKICAgICAgIHk9aTE4biR0KCdEZW5zaXR5JyksCiAgICAgICBjYXB0aW9uPWkxOG4kdCgnQXZlcmFnZSBvZiB0aGUgZGFpbHkgOTUlIGNvbmRpZmRlbmNlIGVsbGlwc2VcbndlaWdodGVkIGJ5IHRoZSBhY3Rpdml0eV9kdXJhdGlvbicpCiAgKSArIAogIGZhY2V0X3dyYXAoLn53ZWVrZGF5KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSBpMThuJHQoIldlZWsiKSwgdmFsdWVzID0gd2Vla19jb2xvcnMsYWVzdGhldGljcyA9IGMoImNvbG91ciIsICJmaWxsIikgKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCgp3ZWVrbHlfZGlzdF9wbG90CgpgYGAKCgpgYGB7ciwgYWN0aXZpdHlfc3BhY2VzX3RhYmxlfQpkYWlseV9hY3Rpdml0eV9zcGFjZXNfdGFibGUgPC0gZGFpbHlfYWN0aXZpdHlfc3BhY2VzICU+JSBhc190aWJibGUoKSAlPiUKICBhZGRfd2Vla19sYWJlbCgpICU+JSAKICBncm91cF9ieSh3ZWVrX2xhYmVsLCB3ZWVrZGF5KSAlPiUKICBzZWxlY3QoLXVzZXJfaWQsIC13ZWVrX3N0YXJ0KSAlPiUKICBzdW1tYXJpemUoCiAgICBtZWFuX2FzcGFjZT1tZWFuKGVsbGlwc2VfYXJlYSwgbmEucm09VCksIAogICAgbWVhbl9tYXhfcmFkaXVzPW1lYW4obWF4X3JhZGl1cywgbmEucm09VCkvMTAwMCwgCiAgICBtZWFuX25fYWN0aXZpdGllcz1tZWFuKG5fYWN0aXZpdGllcyksIAogICAgbl9wYXJ0aWNpcGFudHM9bigpKSAlPiUKICBncm91cF9ieSh3ZWVrZGF5KSAlPiUKICBtdXRhdGUoCiAgICBwY19jaGFuZ2Vfc3BhY2UgPSBtZWFuX2FzcGFjZSAvIGZpcnN0KG1lYW5fYXNwYWNlKSAtIDEsICNub3JtYWxpemUgYnkgdGhlIGZpcnN0IHZhbHVlIGluIHRoYXQgZ3JvdXAgLSBzaG91bGQgd29yayBpZiB3ZWVrX3N0YXJ0IGlzIG9yZGVyZWQKICAgIHBjX2NoYW5nZV9yYWRpdXMgPSBtZWFuX21heF9yYWRpdXMgLyBmaXJzdChtZWFuX21heF9yYWRpdXMpIC0gMSwgI25vcm1hbGl6ZSBieSB0aGUgZmlyc3QgdmFsdWUgaW4gdGhhdCBncm91cCAtIHNob3VsZCB3b3JrIGlmIHdlZWtfc3RhcnQgaXMgb3JkZXJlZAogICAgcGNfY2hhbmdlX24gPSBtZWFuX25fYWN0aXZpdGllcyAvIGZpcnN0KG1lYW5fbl9hY3Rpdml0aWVzKSAtIDEKICApICU+JQogIG11dGF0ZSgKICAgIHBjX2NoYW5nZV9zcGFjZSA9IHNwcmludGYoJyUuMGYlJScsIHBjX2NoYW5nZV9zcGFjZSAqIDEwMCksCiAgICBwY19jaGFuZ2VfcmFkaXVzID0gc3ByaW50ZignJS4wZiUlJywgcGNfY2hhbmdlX3JhZGl1cyAqIDEwMCksCiAgICBwY19jaGFuZ2VfbiA9IHNwcmludGYoJyUuMGYlJScsIHBjX2NoYW5nZV9uICogMTAwKQogICklPiUgCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdCh3ZWVrX2xhYmVsLCB3ZWVrZGF5LCBtZWFuX25fYWN0aXZpdGllcywgcGNfY2hhbmdlX24sIG1lYW5fYXNwYWNlLCBwY19jaGFuZ2Vfc3BhY2UsIG1lYW5fbWF4X3JhZGl1cywgcGNfY2hhbmdlX3JhZGl1cykKCmRhaWx5X2FjdGl2aXR5X3NwYWNlc190YWJsZSRwY19jaGFuZ2VfbltkYWlseV9hY3Rpdml0eV9zcGFjZXNfdGFibGUkd2Vla19zdGFydCA9PSAnQ29udHJvbCddID0gJy0nCmRhaWx5X2FjdGl2aXR5X3NwYWNlc190YWJsZSRwY19jaGFuZ2Vfc3BhY2VbZGFpbHlfYWN0aXZpdHlfc3BhY2VzX3RhYmxlJHdlZWtfc3RhcnQgPT0gJ0NvbnRyb2wnXSA9ICctJwpkYWlseV9hY3Rpdml0eV9zcGFjZXNfdGFibGUkcGNfY2hhbmdlX3JhZGl1c1tkYWlseV9hY3Rpdml0eV9zcGFjZXNfdGFibGUkd2Vla19zdGFydCA9PSAnQ29udHJvbCddID0gJy0nCgpvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gJy0nKQoKY3JlYXRlX2Ffc3BhY2VzX3RhYmxlIDwtIGZ1bmN0aW9uIChkZiwgZm10KSB7CiAgcmV0dXJuIChrbml0cjo6a2FibGUoZGYsICBmbXQsIGJvb2t0YWJzID0gVCwKICAgICAgICAgICAgICAgZGlnaXRzPWMoMCwwLDIsMCwyLDAsMiwwKSwgY2FwdGlvbiA9IGkxOG4kdCgnJSBDaGFuZ2UgaW4gYWN0aXZpdHkgc3BhY2UgYXJlYScpLAogICAgICAgICAgICAgICBjb2wubmFtZXMgPSBsYXBwbHkoYygnV2VlaycsICdXZWVrZGF5JywgJyMgQWN0aXZpdGllcy9kYXknLCAnQ2hhbmdlJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdBcmVhIChrbV4yXiknLCAnQ2hhbmdlJywgJ0RhaWx5IFJhZGl1cyAoa20pJywgJ0NoYW5nZScpLCBpMThuJHQpLAogICAgICAgICAgICAgICBhbGlnbiA9IGMoJ2wnLCAnbCcsIHJlcCgncicsIG5jb2woZGFpbHlfYWN0aXZpdHlfc3BhY2VzX3RhYmxlKSkpCiAgICApICU+JQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRikgJT4lCiAgICBjb2x1bW5fc3BlYygxLCBib2xkPVQpICU+JQogICAgY29sbGFwc2Vfcm93cyhjb2x1bW5zID0gMToxLCBsYXRleF9obGluZT0nbWFqb3InKQogICkKfQoKdGFibGUxX3RleCA8LSBjcmVhdGVfYV9zcGFjZXNfdGFibGUoZGFpbHlfYWN0aXZpdHlfc3BhY2VzX3RhYmxlLCAnbGF0ZXgnKQpjYXQodGFibGUxX3RleCxmaWxlPXBhc3RlMCgicmVwb3J0cy90YWJsZXMvIiwgZm9ybWF0KHRvZGF5KCksIGZvcm1hdD0iJVlfJW1fJWQiKSwgIl9hY3Rpdml0eV9zcGFjZXMudGV4Iiksc2VwPSJcbiIpCgp0YWJsZTFfaHRtbCA8LSBjcmVhdGVfYV9zcGFjZXNfdGFibGUoZGFpbHlfYWN0aXZpdHlfc3BhY2VzX3RhYmxlLCAnaHRtbCcpCgoKCnRhYmxlMV9odG1sCgpgYGAKCgpgYGB7ciwgaG91cmx5X2NvdW50c30KCnNjYWxlZF9ob3VybHlfY291bnRzIDwtIGRhaWx5X2hvdXJseV9jb3VudHMgJT4lIAogIGZpbHRlcih3ZWVrX3N0YXJ0IDwgeW1kKCcyMDIwLTAxLTAxJykgfCB3ZWVrX3N0YXJ0ID49IHltZCgnMjAyMC0wMy0wMicpKSAlPiUKICBhZGRfd2Vla19sYWJlbCgpICU+JSAKICBtdXRhdGUod2Vla19yYW5rID0gd2Vla19zdGFydCAlPiUgZGVzYygpICU+JSBkZW5zZV9yYW5rKCkpICU+JSAKICBtdXRhdGUod2Vla19ncm91cCA9IGZjdF9yZW9yZGVyKGNhc2Vfd2hlbigKICAgIHllYXIod2Vla19zdGFydCkgPT0gJzIwMTknIH4gYXMuY2hhcmFjdGVyKHdlZWtfbGFiZWwpLAogICAgd2Vla19yYW5rIDw9IDMgfiBhcy5jaGFyYWN0ZXIod2Vla19sYWJlbCksIAogICAgVCB+IGkxOG4kdCgnSW50ZXJtZWRpYXRlIHdlZWtzJykKICApLCB3ZWVrX3N0YXJ0KSkgJT4lCiAgbGVmdF9qb2luKHBhcnRpY2lwYW50c19wZXJfZGF5LCBieT1jKCdkYXkxJz0nZGF5JykpICU+JQogIG11dGF0ZShzY2FsZWRfbl90cmlwcyA9IG5fdHJpcHMvbnVtX3BhcnRpY2lwYW50cyAqIDEwMDApICU+JSAgI211bHRpcGx5IGJ5IHRoZSBwb3B1bGF0aW9uIG9mIHN3aXR6ZXJsYW5kCiAgbXV0YXRlKHJvbGxpbmdfc2NhbGVkX25fdHJpcHM9em9vOjpyb2xsbWVhbihzY2FsZWRfbl90cmlwcywzLGZpbGw9TkEsIGFsaWduID0gImNlbnRlciIpKSAlPiUKICBmaWx0ZXIoaG91cjEgPiA0KSAlPiUKICBncm91cF9ieSh3ZWVrX2xhYmVsLCB3ZWVrX3N0YXJ0LCB3ZWVrX2dyb3VwLCB3ZWVrZGF5LCBtb2RlLCBob3VyMSkgJT4lCiAgc3VtbWFyaXplKAogICAgc2NhbGVkX25fdHJpcHM9bWVhbihzY2FsZWRfbl90cmlwcywgbmEucm09VCksIAogICAgcm9sbGluZ19zY2FsZWRfbl90cmlwcz1tZWFuKHJvbGxpbmdfc2NhbGVkX25fdHJpcHMsIG5hLnJtPVQpKSAlPiUgCiAgdW5ncm91cCgpICU+JQogIGdyb3VwX2J5KG1vZGUpICU+JQogIG11dGF0ZSgKICAgIG5fbWF4PW1heChzY2FsZWRfbl90cmlwcywgbmEucm09VCksCiAgICByb2xsaW5nX21heD1tYXgocm9sbGluZ19zY2FsZWRfbl90cmlwcywgbmEucm09VCkKICApIAoKdG90YWxfc2NhbGVkX2hvdXJseV9jb3VudHMgPC0gc2NhbGVkX2hvdXJseV9jb3VudHMgJT4lCiAgZ3JvdXBfYnkod2Vla19sYWJlbCwgd2Vla19zdGFydCwgd2Vla19ncm91cCwgd2Vla2RheSwgaG91cjEpICU+JQogIHN1bW1hcml6ZSgKICAgIHNjYWxlZF9uX3RyaXBzPXN1bShzY2FsZWRfbl90cmlwcyksCiAgICByb2xsaW5nX3NjYWxlZF9uX3RyaXBzPXN1bShyb2xsaW5nX3NjYWxlZF9uX3RyaXBzLCBuYS5ybT1UKQogICklPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKAogICAgbl9tYXg9bWF4KHNjYWxlZF9uX3RyaXBzLCBuYS5ybT1UKSwKICAgIHJvbGxpbmdfbWF4PW1heChyb2xsaW5nX3NjYWxlZF9uX3RyaXBzLCBuYS5ybT1UKQogICkgCgpgYGAKCi0tLS0tLQoKIyAgYHIgaTE4biR0KCdIb3VybHkgQ291bnRzJylgCmByIGkxOG4kdCgnaG91cmx5X2NvdW50c190ZXh0JylgCgpgYGB7ciwgaG91cmx5X2NvdW50c19wbG90fQoKcHJpbnQoZ2dwbG90KHRvdGFsX3NjYWxlZF9ob3VybHlfY291bnRzKSArCiAgZ2VvbV9saW5lKGFlcyh4PWhvdXIxLCB5PXNjYWxlZF9uX3RyaXBzL25fbWF4LCBjb2xvcj13ZWVrX2dyb3VwLCBncm91cD13ZWVrX2xhYmVsKSkgKwogIHNjYWxlX3hfY29udGludW91cyhuYW1lPWkxOG4kdCgnSG91cicpLCBicmVha3M9c2VxKDAsMjMsMiksIGxpbWl0cyA9IGMoNCwyNCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT1pMThuJHQoJ051bWJlciBvZiBzdGFydGVkIHRyaXBzIChyZWxhdGl2ZSB0byBtYXggdmFsdWUpJyksIGJyZWFrcz1zZXEoMCwxLDAuMikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9IGkxOG4kdCgiV2VlayIpLCB2YWx1ZXMgPSB3ZWVrX2NvbG9ycyApICsgCiAgZmFjZXRfd3JhcCgufndlZWtkYXkpICsKICBsYWJzKHRpdGxlPWkxOG4kdCgnSG91cmx5IHRyaXAgY291bnQgKFRvdGFsKScpLAogICAgICAgY2FwdGlvbj1pMThuJHQoJ05vcm1hbGl6ZWQgYnkgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyB0cmF2ZWxsaW5nIHBlciBkYXlcbkNvdW50cyBiZXR3ZWVuIG1pZG5pZ2h0IGFuZCA0YW0gZXhsY3VkZWQnKQogICkgCikKCmBgYAoKYGBge3IsIG1vZGVfaG91cmx5X2NvdW50c30KCmZvciAodF9tb2RlIGluIGMoJ0NhcicsICdXYWxrJywgJ1RyYWluJywgJ0JpY3ljbGUnLCAnTG9jYWwgUFQnKSkgewogIHByaW50KAogICAgZ2dwbG90KHNjYWxlZF9ob3VybHlfY291bnRzICU+JSBmaWx0ZXIobW9kZT09dF9tb2RlKSkgKwogICAgICBnZW9tX2xpbmUoYWVzKHg9aG91cjEsIHk9c2NhbGVkX25fdHJpcHMvbl9tYXgsIGNvbG9yPXdlZWtfZ3JvdXAsIGdyb3VwPXdlZWtfbGFiZWwpKSArCiAgICAgIHNjYWxlX3hfY29udGludW91cyhuYW1lPWkxOG4kdCgnSG91cicpLCBicmVha3M9c2VxKDAsMjQsMiksIGxpbWl0cyA9IGMoNCwyNCkpICsKICAgICAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9aTE4biR0KCdOdW1iZXIgb2Ygc3RhcnRlZCB0cmlwcyAocmVsYXRpdmUgdG8gbWF4IHZhbHVlKScpKSArCiAgICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gaTE4biR0KCJXZWVrIiksIHZhbHVlcyA9IHdlZWtfY29sb3JzICkgKyAKICAgICAgZmFjZXRfd3JhcCgufndlZWtkYXkpICsKICAgICAgbGFicyh0aXRsZT1zcHJpbnRmKCclcyAoJXMpJywgaTE4biR0KCdIb3VybHkgdHJpcCBjb3VudCcpLCBpMThuJHQodF9tb2RlKSksCiAgICAgICAgICAgY2FwdGlvbj1pMThuJHQoJ05vcm1hbGl6ZWQgYnkgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyB0cmF2ZWxsaW5nIHBlciBkYXlcbkNvdW50cyBiZXR3ZWVuIG1pZG5pZ2h0IGFuZCA0YW0gZXhsY3VkZWQnKSkgCiAgKQp9CiAgCmBgYAoK