<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Dr Daniel Kapitan | Data-centric AI | Applied AI | Coaching &amp; Mentoring | Masterclasses &amp; Public Speaking</title>
<link>https://kapitan.net/blog/</link>
<atom:link href="https://kapitan.net/blog/index.xml" rel="self" type="application/rss+xml"/>
<description></description>
<generator>quarto-1.8.27</generator>
<lastBuildDate>Thu, 01 Jan 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>Het dilemma van datasolidariteit</title>
  <dc:creator>Daniel Kapitan</dc:creator>
  <link>https://kapitan.net/blog/datasolidariteit-medisch-dossier.html</link>
  <description><![CDATA[ 




  <p><a href="../resources/2026-01-column-medisch-dossier-dilemma-datasolidariteit.pdf" target="_blank">Download PDF File</a></p>
   <object data="/resources/2026-01-column-medisch-dossier-dilemma-datasolidariteit.pdf" type="application/pdf" width="100%" height="800px">
    <p>Unable to display PDF file. <a href="../resources/2026-01-column-medisch-dossier-dilemma-datasolidariteit.pdf">Download</a> instead.</p>
  </object>
  



 ]]></description>
  <category>nederlands</category>
  <category>data commons</category>
  <category>data solidarity</category>
  <guid>https://kapitan.net/blog/datasolidariteit-medisch-dossier.html</guid>
  <pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/blog/images/henri-rousseau.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Datasolidariteit</title>
  <dc:creator>Daniel Kapitan</dc:creator>
  <link>https://kapitan.net/blog/podcast-optimist-datasolidarieit.html</link>
  <description><![CDATA[ 




<iframe data-testid="embed-iframe" style="border-radius:12px" src="https://open.spotify.com/embed/episode/0XhoxeNnh7CrfgD2CtrrDj?utm_source=generator&amp;t=345" width="100%" height="352" frameborder="0" allowfullscreen="" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy"></iframe>



 ]]></description>
  <category>nederlands</category>
  <category>podcast</category>
  <category>data commons</category>
  <category>data solidarity</category>
  <guid>https://kapitan.net/blog/podcast-optimist-datasolidarieit.html</guid>
  <pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/blog/images/the-optimist.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Bij het streven naar data- en AI-geletterdheid moeten we wiskunde-angst niet uit de weg gaan.</title>
  <dc:creator>Daniel Kapitan</dc:creator>
  <link>https://kapitan.net/blog/geletterdheid.html</link>
  <description><![CDATA[ 




<p><br></p>
<p>Met de komst van de AI Verordening moeten alle organisaties die AI gebruiken of ontwikkelen vanaf deze maand ervoor zorgen dat hun <a href="https://www.autoriteitpersoonsgegevens.nl/themas/algoritmes-ai/ai-verordening/ai-geletterdheid">medewerkers ‘AI-geletterd’ zijn</a>. Los van de vraag of het zinnig is om dit als verplichting op te nemen in een nieuwe wet - daarover later meer - lijkt mij dit op zich een goede zaak. Het is logisch om binnen de toenemende digitalisering van onze samenleving aandacht te vragen voor digitale vaardigheden (“bekwaamheid en begrip van internet-, computer- en softwaregebruik”), datageletterdheid (“vermogen om zinvolle informatie af te leiden uit gegevens (data) en gegevensverzamelingen”) en nu dus ook AI-geletterdheid (“vaardigheden, kennis en begrip hebben over de technische werking van AI-systemen, maar ook over de sociale, ethische en praktische aspecten”). Het is misschien behulpzaam om deze vaardigheden als concentrische cirkels te zien, waarbij ik denk dat AI-geletterdheid niet kan zonder datageletterdheid en digitale vaardigheden daar weer een onderliggende basis voor is.</p>
<p><img src="https://kapitan.net/blog/images/geletterdheid.png" class="img-fluid"></p>
<p>Weinig mensen zullen aanstoot nemen om brede maatschappelijke aandacht te vragen voor het ontwikkelen van deze vaardigheden. Vrij beschikbare online cursussen zoals het <a href="https://thedataliteracyproject.org/">Data Literacy Project</a> en <a href="https://www.elementsofai.com/">Elements of AI</a> kan ik hiervoor van harte aanbevelen.<sup>1</sup> Beide zijn zeer toegangkelijk en als je ze hebt afgerond zal de mystiek van data science en AI voor een groot deel verdwenen zijn. Mooi. Is dan hiermee alles gezegd?</p>
<p>Ik denk het niet. Ik kan mij namelijk niet aan de indruk ontrekken dat goed bedoelde initatieven die streven om kennis over data science en AI bij een breed publiek over te dragen nogal de neiging hebben om de basis van dit alles, namelijk wiskunde, uit de weg te gaan.<sup>2</sup> Wellicht heeft het ermee te maken dat veel mensen last hebben van wiskunde-angst.</p>
<p>Wat zeg je, bestaat dat? <a href="https://www.nporadio1.nl/nieuws/wetenschap-techniek/9b911cad-8230-4714-b19b-954ddbc4a9f2/kun-je-echt-last-hebben-van-wiskundeangst">Jazeker</a>. Als ik voor de klas sta voor een nieuwe groep bij het Mastering Data Science &amp; AI programma bij <a href="https://eaisi.nl/academy">EAISI Academy</a>, begin ik vaak met deelnemers te vragen hun hand op te steken als ze een lichte spanning voelen wanneer ze terugdenken het maken van wiskunde sommen tijdens hun middelbare schooltijd. Steevast gaat ongeveer een derde van de handen omhoog. Bij de verdediging van Daphne Miedema’s promotieonderzoek <a href="https://research.tue.nl/nl/publications/on-learning-sql-disentangling-concepts-in-data-systems-education">On Learning SQL</a> leerde ik dat <em>math anxiety</em> inderdaad bij circa 30% van studenten in technische studies een beperkende rol speelt om optimaal analytische vaardigheden aan te leren. Mijn vraag die als grap bedoelt was, is een echt fenomeen waar we rekening mee moeten houden wanneer we zoveel mogelijk mensen voldoende vaardig willen maken op het gebied van data science en AI.</p>
<p>Als mensen een goed beeld willen hebben van wat data science en AI wel - en vooral niet - is, dan ontkomen we er niet aan om basisprincipes uit de wiskunde over te brengen. Niet iedereen hoeft wiskundige formules te kunnen herleiden, maar beginselen zoals bijvoorbeeld kansberekening en het leren lezen van een histogram zijn denk ik concepten die iedereen op haar of zijn niveau een bepaald begrip voor moet ontwikkelen om data- en AI-geletterd te zijn. Daarbij is denk ik vanwege de hype rondom large language models inmiddels zo’n verwrongen beeld ontstaan van wat AI nu is, dat iedereeen die een cursus heeft gedaan ‘hoe leer je prompts schrijven’ denkt dat ze daarmee voldoende voorbereid zijn. Niks is minder waar. Zolang je geen idee hebt hoe LLMs worden getraind (het voorspellen van het volgende woord) is het lastig te begrijpen waarom ze soms onzin uitkramen.<sup>3</sup></p>
<p>Het verplicht stellen van AI-geletterdheid deed mij denken aan een discussie die ik had met een goede collega destijds bij T-Mobile. Hij was hoofd van juridische zaken, zeer belezen en we hadden altijd interessante discussies over maatschappelijke vraagstukken. Het was rond die tijd, in 2007/2008, dat wiskunde verplicht werd gesteld voor het VWO. Hij vond het onnodig en hield een vurig pleidooi over het belang van algemene vorming via verplicht taal- en geschiedenisonderwijs. Ik vond dat wiskunde net zo goed in die categorie valt, wat we dus nu data- en AI-geletterheid noemen. Maar het verplicht stellen heeft helaas weinig effect gehad: <a href="https://www.pisa-nederland.nl/resultaten2022/">de wiskundeprestaties van Nederlandse scholieren zijn sinds 2006 nog niet eerder zo sterk gedaald</a>.</p>
<p>Het verplicht stellen van AI-geletterdheid zal denk ik niet tot het gewenste effect leiden als we ons niet inzetten om ‘wiskundegeletterdheid’ voor een groot publiek te verbeteren. En net zo is datageletterdheid een holle frase als we ons alleen richten op de organisatorische aspecten van data management of data-gedreven werken, zonder dieper te gaan op de principes van informatie modelering en kennisrepresentatie. De hamvraag is natuurlijk, hoe dan? Misschien heeft <a href="https://www.mathwithmenno.nl/">Menno</a> een idee.</p>




<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Voetnoten</h2>

<ol>
<li id="fn1"><p>Diegenen die voorkeur geven aan een boek kunnen misschien bij de Slegte nog een exemplaar van <a href="https://www.mauritskaptein.com/books/new-book-hallo-wereld-hallo-computer/">Hallo wereld, hallo computer</a> op de kop tikken. Alhoewel dat in 2018 is geschreven, is het een goed en nog steeds actueel boek om basiskennis op te doen.↩︎</p></li>
<li id="fn2"><p>De eerder genoemde cursussen zijn hier een positieve uitzondering op.↩︎</p></li>
<li id="fn3"><p>Onder de niet aflatende trend om digitale systemen te antropomorfiseren noemen we dit hallucineren, alsof het een tijdelijke geestestoestand van de LLM is, een tijdelijke <em>slip of the mind</em>. Maar ik dwaal af.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>nederlands</category>
  <category>geletterdheid</category>
  <guid>https://kapitan.net/blog/geletterdheid.html</guid>
  <pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/blog/images/geletterdheid.png" medium="image" type="image/png" height="105" width="144"/>
</item>
<item>
  <title>Fairness bij gebruik van algoritmes in het verzekeringswezen</title>
  <dc:creator>Daniel Kapitan (presentatie)</dc:creator>
  <dc:creator>Ellen Jonges (artikel)</dc:creator>
  <link>https://kapitan.net/blog/vvv-fairness.html</link>
  <description><![CDATA[ 




<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vTtPCVysN4Jpn7ikQMAGFwHg_ljyxRptacZ1vbMPZuPZOnohhArnqHxjmsqrZRQWzhMj0ou1tpYcDW3/embed?start=false&amp;loop=false&amp;delayms=5000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
<section id="optimaliseren" class="level3">
<h3 class="anchored" data-anchor-id="optimaliseren">Optimaliseren</h3>
<p>Als je algoritmes gebruikt om risicoprofielen te maken waarop vervolgens besluiten worden genomen, zal je volgens Kapitan moeten kiezen waarop het algoritme geoptimaliseerd moet worden. Denk bijvoorbeeld aan de afweging tussen zo min mogelijk fout positieven of fout negatieven. Deze keuze is direct gerelateerd aan een maatstaf voor eerlijkheid (fairness). Onderzoek wijst uit dat hier een keuze in gemaakt moet worden, omdat verschillende definities van fairness wiskundig onverenigbaar zijn.</p>
</section>
<section id="actuarial-fairness-onmogelijk" class="level3">
<h3 class="anchored" data-anchor-id="actuarial-fairness-onmogelijk">Actuarial fairness onmogelijk</h3>
<p>Kapitan: “eerlijkheid is wiskundig gezien een onoplosbaar probleem dat zelfs de beste wiskundigen niet voor de verzekeringsbranche kunnen oplossen.” Voor zijn uitspraak refereert hij onder andere aan een <a href="https://link.springer.com/article/10.1007/s13347-023-00624-9">artikel</a> van Joachim Baumann. Om dat te duiden begint hij bij actuarial fairness. Dat houdt in dat iemand die een hoger risico loopt meer premie betaalt. “Over het algemeen vinden we dat eerlijk, toch?” vraagt hij zich hardop af.</p>
<p>“Maar in zijn artikel stelt Baumann dat actuarial fairness wiskundig gezien helemaal niet mogelijk is. Want het échte risico op individueel niveau is niet meetbaar. Je zult het risico hooguit kunnen benaderen. Daarom kunnen we alléén fairness tussen groepen met elkaar vergelijken. Maar wat is dan eerlijk? Geef je bijvoorbeeld iedereen een gelijk uitgangspunt? Of een gelijke kans?”</p>
<p>Hij vervolgt: “Ervan uitgaande dat Baumann gelijk heeft, zijn er tools en wiskundige formules beschikbaar om group fairness in te zetten. En ja, je wilt als verzekeraar uiteindelijk toewerken naar individuele premies, maar deze kun je in de praktijk alleen bij benadering uitrekenen met gebruik van technieken gebaseerd op group fairness.” Kapitan benadrukt daarbij dat hij geen verzekeringsdeskundige is, maar dat hij zich in zijn analyse heeft laten leiden door Baumann, doch ook door het advies van het College voor de Rechten van de Mens over de Dazure overlijdensrisicoverzekering.</p>
</section>
<section id="soorten-group-fairness" class="level3">
<h3 class="anchored" data-anchor-id="soorten-group-fairness">Soorten group fairness</h3>
<p>Op basis van literatuur zijn er volgens Kapitan grosso modo drie group fairness-definities te onderscheiden:</p>
<section id="definitie-1-onafhankelijkheid-independence" class="level4">
<h4 class="anchored" data-anchor-id="definitie-1-onafhankelijkheid-independence">Definitie 1: Onafhankelijkheid (Independence)</h4>
<p>Deze definitie houdt in dat iedereen gelijk wordt behandeld. Een voorbeeld hiervan is de casus ‘<a href="https://nl.wikipedia.org/wiki/Arrest_Belgische_Verbruikersunie_Test-Aankoop">Arrest Test-Aankoop</a>’. De uitkomst van dit arrest is dat het vanaf december 2012 niet meer is toegestaan om bij verzekeringsproducten verschil te maken tussen mannen en vrouwen wat betreft premies of uitkeringen. Zelfs niet als vrouwen een lager risico hebben op ongelukken, en langer leven. De uitkomsten voor de groepen mannen en vrouwen moet dus onafhankelijk zijn van de variabele ‘sekse’.</p>
</section>
<section id="definitie-2-gelijkheid-separation" class="level4">
<h4 class="anchored" data-anchor-id="definitie-2-gelijkheid-separation">Definitie 2: Gelijkheid (Separation)</h4>
<p>Dit betekent dat de kans op fouten hetzelfde is tussen groepen, gezien vanuit het perspectief vanuit de verzekerde. Een voorbeeld hiervan is de eerdergenoemde casus ‘<a href="https://www.fiscaalleven.eu/KamerbriefPremiedifferentiatieObvPostcodeBijORVFM14-204MAdviesDazure.pdf">Dazure levensverzekeringen</a>’.</p>
<p>Dus stel; je woont in een postcodegebied en je hebt een hoog inkomen. Maar in dat postcodegebied ben je een uitzondering. Jij krijgt dan een lagere premie dan past bij jouw risico. De Engelse term voor de vorm van group fairness wordt ook wel ‘equal odds’ genoemd, dat wil zeggen dat fairness in deze definitie betekent dat iedereen dezelfde kans heeft op een ‘foute’ risico-indeling, ongeacht tot welke groep je ook behoort,</p>
</section>
<section id="definitie-3-calibratie-sufficiency" class="level4">
<h4 class="anchored" data-anchor-id="definitie-3-calibratie-sufficiency">Definitie 3: Calibratie (Sufficiency)</h4>
<p>De derde definitie houdt in dat de kans op fouten hetzelfde is tussen groepen, gezien vanuit het perspectief vanuit de verzekeraar. Een voorbeeld hiervan is de casus ‘<a href="https://fairmlbook.org/classification.html#case-study-credit-scoring">Voorspellen van kredietwaardigheid</a>’.</p>
<p>Het calibreren van een model wil zeggen dat je een vergelijking maakt tussen voorspelde waarden en echte waarden. De calibratie van het model, dus hoe goed het model voorspelt, moet volgens deze opvatting van fairness hetzelfde zijn voor alle groepen. Dit is volgens Baumann de meest eerlijke werkvorm, omdat je eist dat de voorspellingen die een algoritme maakt en waarom een premie wordt gebaseerd, een-op-een evenredig moet zijn met de werkelijke schadelast van de groep. Let wel: calibratie is niet genoeg om actuarial fairness te garanderen. Maar Baumann heeft wiskundig bewezen dat als er sprake is van actuarial fairness, er in elk geval sprake moet zijn van calibratie.</p>
</section>
</section>
<section id="pleidooi" class="level3">
<h3 class="anchored" data-anchor-id="pleidooi">Pleidooi</h3>
<p>“Wat hij in het stuk ook zo mooi beschrijft,” vult Kapitan aan, “is dat verzekeraars uiteindelijk zoveel mogelijk klantgericht willen werken op basis van gepersonaliseerde premies. En omdat je dan uitsluitend met group fairness kunt werken, is Baumanns pleidooi: de enige manier om perfecte individuele premies te benaderen, is gebruikmaken van calibratie.” Kapitan is het met hem eens: “Ik vind zijn argumenten het meest overtuigend, omdat die het dichtst liggen bij wat ik denk dat de meest robuuste algoritmes zijn. Wel is er echt nog meer causistiek nodig of dit in de praktijk te doen is. Deze verschillende noties van group fairness zijn slechts een startpunt.”</p>
</section>
<section id="kiezen" class="level3">
<h3 class="anchored" data-anchor-id="kiezen">Kiezen</h3>
<p>Volgens Kapitan is het aan verzekeraars om uit te zoeken en intern afspraken te maken over wat ‘eerlijkheid’ in verzekeringstermen precies is. Het is nodig om daarbij steeds een bewuste afweging te maken, omdat drie principes niet verenigbaar zijn. “Je moet kiezen. En op basis van wat bijvoorbeeld de directie of pricing board kiest, weten data scientists hoe zij algoritmes moeten trainen en optimaliseren om producten op een eerlijke manier te personaliseren.”</p>
<div class="callout callout-style-default callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Tip</span>Meer weten over group fairness?
</div>
</div>
<div class="callout-body-container callout-body">
<p>Het open access boek <a href="https://anthology-of-data.science/books/fairml.html">Fairness and Machine Learning</a> geeft een uitgebreide introductie en uitleg over dit onderwerp.</p>
</div>
</div>


</section>

 ]]></description>
  <category>nederlands</category>
  <category>fairness</category>
  <guid>https://kapitan.net/blog/vvv-fairness.html</guid>
  <pubDate>Mon, 07 Oct 2024 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/blog/images/vvv-dkapitan.png" medium="image" type="image/png" height="43" width="144"/>
</item>
<item>
  <title>Een vals dilemma: privacy versus datasolidariteit</title>
  <dc:creator>Daniel Kapitan</dc:creator>
  <dc:creator>Egge van der Poel</dc:creator>
  <dc:creator>Antoinette Vlieger</dc:creator>
  <link>https://kapitan.net/blog/datasolidariteit-ibestuur.html</link>
  <description><![CDATA[ 




<section id="data-zijn-een-gemeengoed" class="level2">
<h2 class="anchored" data-anchor-id="data-zijn-een-gemeengoed">Data zijn een gemeengoed</h2>
<p>Wie een pleidooi schrijft voor datasolidariteit, kan rekenen op forse kritiek. Recentelijk hebben twee van ons een bijdrage geleverd aan een stuk in het <a href="https://fd.nl/samenleving/1499700/gezondheidsdata-zijn-een-goudmijn-zijn-we-al-klaar-om-die-te-ontginnen">FD met de titel “gezondheidsdata zijn een goudmijn”</a>. Op diverse plekken werd geïnsinueerd dat een financiële goudmijn bedoeld werd, terwijl het stuk overduidelijk doelde op de kennis goudmijn. Professor Barbara Prainsack pleitte onlangs op <a href="https://ibestuur.nl/artikel/een-nieuw-perspectief-op-datasolidariteit/">iBestuur voor datasolidariteit</a>. Een positieve ontwikkeling, want privacy domineert als zogenaamde tegenpool nog altijd het publieke debat. Maar ten aanzien van privacy zijn veel belangrijke aspecten onbekend: de huidige en aankomende Europese wetgeving, de stand van zaken qua beschermende technologieën, en de nuances in het ethische debat ten aanzien van maatschappelijke waarde versus commerciële waarde.</p>
<p>Vrijwel niemand weet hoe radicaal het Europees data-recht inmiddels is. Data moeten vaak verplicht beschikbaar gesteld worden voor hergebruik, winsten hierop zijn veelal niet toegestaan, en als het om persoonsgegeven gaat, blijft de privacy geborgd. Data zijn namelijk geen eigendom, maar een gemeengoed. Gezondheidsdata gaan over de patiënt, maar zijn niet van de patiënt. Ook andere partijen hebben vrijwel nooit een vermogensrecht op data. Binnen de Europese wetgeving bestaat hooguit het databankrecht: als iemand risicodragend investeert in een bepaalde set data, met het doel om met die set de investering terug te verdienen, uitsluitend dan ontstaat er een databankrecht. Bij gezondheidsdata is hier vrijwel nooit sprake van: de meeste data ontstaan als bijproduct in het zorgproces. Er is dus niet risicodragend geïnvesteerd in die dataset. Europa heeft zo – expres – de mogelijkheid tot vermogensrechten op gezondheidsgegevens vrijwel uitgesloten. Die data worden namelijk -terecht- beschouwd als een goed dat toekomt aan de gemeenschap; een bien commun. Vanuit die gedachte werkt de EU aan het verplicht maken van het delen van zorgdata (onder strikte voorwaarden uiteraard). Al sinds 2003 zijn allerlei wetten en instrumenten gemaakt om (bredere) datarechten aan burgers te geven, wat onder andere heeft geleid tot de Wet Hergebruik Overheidsinformatie (vergelijkbaar met de Wet Open Overheid). Als binnenkort de European Health Data Space (EHDS) een feit is, dan zal iedere wat grotere zorgverlener verplicht zijn om data beschikbaar te maken voor wetenschap, beleidsonderzoek en onderwijs, maar ook voor het ontwikkelen van nuttige gezondheidsproducten.</p>
</section>
<section id="privacy-en-het-mozaïek-effect" class="level2">
<h2 class="anchored" data-anchor-id="privacy-en-het-mozaïek-effect">Privacy en het mozaïek-effect</h2>
<p>Een veelgehoord argument tegen (verdere) ontsluiting van gezondheidsdata, is dat de privacy van de betreffende patiënten ‘in de toekomst’ in het geding kan komen. Door nu nog onvoorziene combinaties van databronnen kunnen pseudonieme data opeens niet meer veilig blijken. Dit is een variant op het mozaïek effect: het risico dat persoonlijke of gevoelige informatie over iemand wordt onthuld, door het combineren van verschillende gegevensbronnen.</p>
<blockquote class="blockquote">
<p>Technologie is niet zaligmakend, maar het privacyvraagstuk is nu juist iets waar technologie ons verder kan helpen.</p>
</blockquote>
<p>Deze hypothetische privacy-schendingen duiken in allerlei vormen op tijdens discussies over de (on)wenselijkheid van verdergaand datagebruik, vaak nadat alle zwaarwegende bezwaren zijn besproken. Gaan we de gegevens versleutelen, hanteren we een centrale of een gedistribueerde aanpak voor de analyse, is het mogelijk om met geanonimiseerde of gepseudonimiseerde data te werken: dergelijke afwegingen worden veelal in een vroege fase van het project besproken. Wanneer er eindelijk ruimte is voor de volgende stap, dan is er altijd wel een verstokte ‘voorvechter van privacy’ die betoogt dat het nu dan wel goed geregeld kan zijn, maar “wat als deze dataset in de toekomst wordt gekoppeld aan een andere dataset?” Het mozaïek-effect als laatste retorische redmiddel.</p>
</section>
<section id="privacy-en-technologie" class="level2">
<h2 class="anchored" data-anchor-id="privacy-en-technologie">Privacy en technologie</h2>
<p>Technologie is niet zaligmakend, maar het privacyvraagstuk is nu juist iets waar technologie ons verder kan helpen. Met de komst van privacy-enhancing technologieën (PETs) kan men op een decentrale, federatieve manier data met elkaar delen terwijl het risico op herleidbaarheid tot een minimum is teruggebracht. Een <a href="https://coe-dsc.nl/whitepaper-on-the-benefits-of-privacy-enhancing-technologies-pets/">recente studie van de Data Sharing Coalition</a> geeft aan wat deze technieken zijn en hoe deze gebruikt kunnen worden. Simpel gezegd komt het erop neer dat we encryptietechnieken, zoals we gewend zijn om te gebruiken voor bijvoorbeeld websites, ook kunnen inzetten om berekeningen te maken op encrypted data. Een alledaagse analogie: u bent met 30 man op een verjaardag en benieuwd wat het hoogst genoten salaris is. Met behulp van PETs kan een dergelijke berekening worden uitgevoerd, waarbij geen van uw feestgenoten publiekelijk hoeft vrij te geven hoeveel hij of zij verdient. Door data niet te kopiëren en onder encryptie berekeningen uit te voeren, is de kans op herleidbaarheid minimaal.</p>
</section>
<section id="avg-en-pseudonimisering-nederlandse-strengheid" class="level2">
<h2 class="anchored" data-anchor-id="avg-en-pseudonimisering-nederlandse-strengheid">AVG en pseudonimisering: Nederlandse strengheid</h2>
<p>De AVG krijgt vaak de schuld van het feit dat data niet kunnen worden gedeeld, maar deze wet is uitsluitend van toepassing als de ontvanger kan achterhalen over wie de data gaan, en de privacy dus in het geding is. Om te bepalen of een natuurlijke persoon identificeerbaar is, moet rekening worden gehouden met alle middelen “waarvan redelijkerwijs valt te verwachten dat zij worden gebruikt.” Als een ontvanger van gepseudonimiseerde data de sleutel niet heeft, zal hier veelal niet aan zijn voldaan, en is de AVG dus niet van toepassing, omdat niemands privacy in het geding is.</p>
<blockquote class="blockquote">
<p>Datasolidariteit als concept beoogt om betere, bewuste afwegingen te maken tussen collectieve en individuele belangen, tussen de huidige privacy en de gezondheidszorg van generaties na ons.</p>
</blockquote>
<p>De Nederlandse AP neemt ten aanzien hiervan een strenger standpunt in; juist omdat bestanden eventueel ooit gekoppeld kunnen worden, zijn pseudonieme gegevens wat de AP betreft eigenlijk altijd toch gewoon persoonsgegevens. Elke theoretische mogelijkheid wordt dus meegewogen, niet elke mogelijkheid waarvan redelijkerwijs te verwachten is dat deze zal worden gebruikt. Deze interpretatie heeft eraan bijgedragen, dat een groot deel van de bevolking een zeer strenge positie inneemt: als data over mij gaan, dan zijn het automatisch persoonsgegevens die beschermd moeten worden, denkt men, terwijl het dan uitsluitend een toekomstige, theoretische mogelijkheid betreft. Wellicht ooit… denkt men. Punt is, als wellicht ooit de privacy inderdaad in het geding komt omdat door het mozaïek-effect bestanden herleidbaar worden, dan moet men gaan voldoen aan de zeer strenge eisen van de AVG, maar niet eerder dan dat.</p>
</section>
<section id="datasolidariteit-als-leidend-ethisch-principe" class="level2">
<h2 class="anchored" data-anchor-id="datasolidariteit-als-leidend-ethisch-principe">Datasolidariteit als leidend ethisch principe</h2>
<p>Het maatschappelijke debat over het delen van gezondheidsdata roept veel emoties en tegenstellingen op. Datasolidariteit als concept beoogt om betere, bewuste afwegingen te maken tussen collectieve en individuele belangen, tussen de huidige privacy en de gezondheidszorg van generaties na ons. De potentiële waarde creatie staat centraal; het doel dat men ermee beoogt te bereiken, en dus niet of de data-vrager bijvoorbeeld een (semi)publieke organisatie is. Er zijn massa’s private organisaties die maatschappelijk nut beogen, dus hen op deze grond passeren zonder ons te verdiepen in de vraag wat in een concreet geval met data wordt beoogd, zou discriminatie zijn. Bovendien wordt geld verdienen aan data steeds moeilijker gemaakt; ook in de (concept) EHDS staat dat bij het aanvragen van data veelal ten hoogste de marginale kosten in rekening mogen worden gebracht. Gezondheidsgegevens zijn immers een publiek goed, dat aan de gemeenschap ten goede moet komen. De datastromen moeten daarom net als fietspaden gefinancierd worden uit de grote pot. Het ongemak en onbehagen waarmee het debat over data delen in de zorg wordt gevoerd, terwijl de relevante wetgeving eigenlijk heel degelijk in elkaar steekt, geeft aan dat we ons samen moeten verdiepen in de juistheid van onze afwegingskaders. Het is niet a of b, de zaken liggen subtieler. Datasolidariteit als ethisch principe is wellicht een tegenhanger van de op het mozaïek-effect hamerende privacy-dogmatici, maar juist een partner van privacy-realisten. Want ook data-solidairen menen dat state of the art ICT moet worden ingezet om het vereiste vertrouwen te creëren, zodat gezondheidsdata kunnen worden ingezet voor publieke meerwaarde zonder iemand te schaden.</p>
<blockquote class="blockquote">
<p>Datasolidariteit gaat erom dat het verschil wordt gezien tussen een reëel privacy risico en een wat ongemakkelijk gevoel over een theoretische mogelijkheid.</p>
</blockquote>
</section>
<section id="geen-onderzoek-doen-met-data-is-nu-juist-onethisch" class="level2">
<h2 class="anchored" data-anchor-id="geen-onderzoek-doen-met-data-is-nu-juist-onethisch">Geen onderzoek doen met data is nu juist onethisch</h2>
<p>Want is het alternatief? Dat we geen onderzoek doen met de schat aan medische gegevens die dagelijks in het zorgverleningsproces ontstaan? Dan gaat er allerlei kennis verloren. Zonder data kunnen er geen kwaliteitscontroles verricht worden, kunnen farmaceuten niet voldoen aan hun wettelijke plicht om te controleren of er op langere termijn niet toch bijwerkingen optreden. En als toestemming altijd de eis is, wordt big data onderzoek onmogelijk. Is het gebruik van medische data onethisch? Wij denken dat het andersom is. Artsen beloven niet te schaden en deze belofte beperkt zich niet tot de huidige patiënten. Wat wij bedoelen met datasolidariteit is dus dit: een subtielere blik op privacy vraagstukken, in het belang van toekomstige patiënten. Datasolidariteit gaat erom dat het verschil wordt gezien tussen een reëel privacy risico en een wat ongemakkelijk gevoel over een theoretische mogelijkheid. Het voelt inderdaad niet zo prettig, als data die zijn verzameld terwijl je op een kwetsbaar moment bij een dokter zat, worden gebruikt voor onderzoek. Maar we moeten leren dat dit gevoel over het algemeen geen reële privacy risico’s oplevert. Dit, terwijl het nalaten van onderzoek de volgende generatie wel degelijk reële risico’s oplevert; het risico dat we bepaalde toekomstige patiënten niet kunnen helpen, wat met (solidair) dataonderzoek wel had gekund.</p>


</section>

 ]]></description>
  <category>nederlands</category>
  <category>data solidarity</category>
  <guid>https://kapitan.net/blog/datasolidariteit-ibestuur.html</guid>
  <pubDate>Wed, 31 Jan 2024 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/blog/images/data-in-de-zorg-shutterstock_2419651697.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Amazing Altair with an even better theme</title>
  <dc:creator>Daniel Kapitan</dc:creator>
  <link>https://kapitan.net/blog/better-altair-theme.html</link>
  <description><![CDATA[ 




<p>I have been in love with Altair ever since I first ran into it. The logic, the structure, the syntax: it’s all just there and it helps me to get my work done. Paired with <a href="https://quarto.org">Quarto</a> or <a href="https://streamlit.io">Streamlit</a>, I can create stunning pdf reports, interactive documents and single-page apps for my clients, all from one codebase. After attending a workshop by my fellow data viz afficianado <a href="https://www.thedatavisionlab.com/">Sara Sprinkhuizen</a>, I wanted to implement her tried-and-tested best practices for charts into an Altair.</p>
<p>In this post, we will illustate how these improvements work for a handful of visualizations that are often used for exploratory data analysis. We will implement her design principles in an Altair theme, such that we can consistently generate better charts in our workflow. Let’s start and see how Altair’s default theme renders a scatterplot, bar chart and line chart.</p>
<div id="cell-2" class="cell" data-execution_count="1">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> altair <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> alt</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> ibis</span>
<span id="cb1-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> vega_datasets <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> data</span>
<span id="cb1-4"></span>
<span id="cb1-5"></span>
<span id="cb1-6">ibis.options.interactive <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span></span>
<span id="cb1-7"></span>
<span id="cb1-8">penguins <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ibis.examples.penguins.fetch()</span>
<span id="cb1-9">stocks <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> data.stocks()</span>
<span id="cb1-10">wheat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> data.wheat()</span></code></pre></div></div>
</details>
</div>
<section id="scatterplot" class="level2">
<h2 class="anchored" data-anchor-id="scatterplot">Scatterplot</h2>
<p>A scatterplot is one of the most commonly used visualizations. In this case we encode three values for the <a href="https://allisonhorst.github.io/palmerpenguins/">Palmer penguins data</a>: bill length vs.&nbsp;bill depth, per species. The only optimization we apply is to have the axis not go all the way to zero, so the charts is focused on the actual datapoints.</p>
<div id="cell-4" class="cell" data-execution_count="2">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1">scatterplot <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (</span>
<span id="cb2-2">    alt.Chart(penguins)</span>
<span id="cb2-3">    .mark_circle(size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>)</span>
<span id="cb2-4">    .encode(</span>
<span id="cb2-5">        x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.X(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bill_length_mm:Q"</span>, scale<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Scale(zero<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)),</span>
<span id="cb2-6">        y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Y(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bill_depth_mm:Q"</span>, scale<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Scale(zero<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)),</span>
<span id="cb2-7">        color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Color(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"species"</span>),</span>
<span id="cb2-8">        tooltip<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"species"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sex"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"island"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bill_length_mm:Q"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bill_depth_mm:Q"</span>],</span>
<span id="cb2-9">    )</span>
<span id="cb2-10">)</span>
<span id="cb2-11">scatterplot</span></code></pre></div></div>
</details>
<div class="cell-output cell-output-display" data-execution_count="2">

<style>
  #altair-viz-fd6e726be3cc4a27af43ed2a6032b259.vega-embed {
    width: 100%;
    display: flex;
  }

  #altair-viz-fd6e726be3cc4a27af43ed2a6032b259.vega-embed details,
  #altair-viz-fd6e726be3cc4a27af43ed2a6032b259.vega-embed details summary {
    position: relative;
  }
</style>
<div id="altair-viz-fd6e726be3cc4a27af43ed2a6032b259"></div>
<script type="text/javascript">
  var VEGA_DEBUG = (typeof VEGA_DEBUG == "undefined") ? {} : VEGA_DEBUG;
  (function(spec, embedOpt){
    let outputDiv = document.currentScript.previousElementSibling;
    if (outputDiv.id !== "altair-viz-fd6e726be3cc4a27af43ed2a6032b259") {
      outputDiv = document.getElementById("altair-viz-fd6e726be3cc4a27af43ed2a6032b259");
    }
    const paths = {
      "vega": "https://cdn.jsdelivr.net/npm/vega@5?noext",
      "vega-lib": "https://cdn.jsdelivr.net/npm/vega-lib?noext",
      "vega-lite": "https://cdn.jsdelivr.net/npm/vega-lite@5.16.3?noext",
      "vega-embed": "https://cdn.jsdelivr.net/npm/vega-embed@6?noext",
    };

    function maybeLoadScript(lib, version) {
      var key = `${lib.replace("-", "")}_version`;
      return (VEGA_DEBUG[key] == version) ?
        Promise.resolve(paths[lib]) :
        new Promise(function(resolve, reject) {
          var s = document.createElement('script');
          document.getElementsByTagName("head")[0].appendChild(s);
          s.async = true;
          s.onload = () => {
            VEGA_DEBUG[key] = version;
            return resolve(paths[lib]);
          };
          s.onerror = () => reject(`Error loading script: ${paths[lib]}`);
          s.src = paths[lib];
        });
    }

    function showError(err) {
      outputDiv.innerHTML = `<div class="error" style="color:red;">${err}</div>`;
      throw err;
    }

    function displayChart(vegaEmbed) {
      vegaEmbed(outputDiv, spec, embedOpt)
        .catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));
    }

    if(typeof define === "function" && define.amd) {
      requirejs.config({paths});
      require(["vega-embed"], displayChart, err => showError(`Error loading script: ${err.message}`));
    } else {
      maybeLoadScript("vega", "5")
        .then(() => maybeLoadScript("vega-lite", "5.16.3"))
        .then(() => maybeLoadScript("vega-embed", "6"))
        .catch(showError)
        .then(() => displayChart(vegaEmbed));
    }
  })({"config": {"view": {"continuousWidth": 300, "continuousHeight": 300}}, "data": {"name": "data-b414165be0aeea8c687bc9462659f7b8"}, "mark": {"type": "circle", "size": 60}, "encoding": {"color": {"field": "species", "type": "nominal"}, "tooltip": [{"field": "species", "type": "nominal"}, {"field": "sex", "type": "nominal"}, {"field": "island", "type": "nominal"}, {"field": "bill_length_mm", "type": "quantitative"}, {"field": "bill_depth_mm", "type": "quantitative"}], "x": {"field": "bill_length_mm", "scale": {"zero": false}, "type": "quantitative"}, "y": {"field": "bill_depth_mm", "scale": {"zero": false}, "type": "quantitative"}}, "$schema": "https://vega.github.io/schema/vega-lite/v5.16.3.json", "datasets": {"data-b414165be0aeea8c687bc9462659f7b8": [{"species": "Adelie", "island": "Torgersen", "bill_length_mm": 39.1, "bill_depth_mm": 18.7, "flipper_length_mm": 181, "body_mass_g": 3750, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 39.5, "bill_depth_mm": 17.4, "flipper_length_mm": 186, "body_mass_g": 3800, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 40.3, "bill_depth_mm": 18.0, "flipper_length_mm": 195, "body_mass_g": 3250, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": null, "bill_depth_mm": null, "flipper_length_mm": null, "body_mass_g": null, "sex": null, "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 36.7, "bill_depth_mm": 19.3, "flipper_length_mm": 193, "body_mass_g": 3450, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 39.3, "bill_depth_mm": 20.6, "flipper_length_mm": 190, "body_mass_g": 3650, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 38.9, "bill_depth_mm": 17.8, "flipper_length_mm": 181, "body_mass_g": 3625, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 39.2, "bill_depth_mm": 19.6, "flipper_length_mm": 195, "body_mass_g": 4675, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 34.1, "bill_depth_mm": 18.1, "flipper_length_mm": 193, "body_mass_g": 3475, "sex": null, "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 42.0, "bill_depth_mm": 20.2, "flipper_length_mm": 190, "body_mass_g": 4250, "sex": null, "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 37.8, "bill_depth_mm": 17.1, "flipper_length_mm": 186, "body_mass_g": 3300, "sex": null, "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 37.8, "bill_depth_mm": 17.3, "flipper_length_mm": 180, "body_mass_g": 3700, "sex": null, "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 41.1, "bill_depth_mm": 17.6, "flipper_length_mm": 182, "body_mass_g": 3200, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 38.6, "bill_depth_mm": 21.2, "flipper_length_mm": 191, "body_mass_g": 3800, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 34.6, "bill_depth_mm": 21.1, "flipper_length_mm": 198, "body_mass_g": 4400, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 36.6, "bill_depth_mm": 17.8, "flipper_length_mm": 185, "body_mass_g": 3700, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 38.7, "bill_depth_mm": 19.0, "flipper_length_mm": 195, "body_mass_g": 3450, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 42.5, "bill_depth_mm": 20.7, "flipper_length_mm": 197, "body_mass_g": 4500, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 34.4, "bill_depth_mm": 18.4, "flipper_length_mm": 184, "body_mass_g": 3325, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 46.0, "bill_depth_mm": 21.5, "flipper_length_mm": 194, "body_mass_g": 4200, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 37.8, "bill_depth_mm": 18.3, "flipper_length_mm": 174, "body_mass_g": 3400, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 37.7, "bill_depth_mm": 18.7, "flipper_length_mm": 180, "body_mass_g": 3600, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 35.9, "bill_depth_mm": 19.2, "flipper_length_mm": 189, "body_mass_g": 3800, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 38.2, "bill_depth_mm": 18.1, "flipper_length_mm": 185, "body_mass_g": 3950, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 38.8, "bill_depth_mm": 17.2, "flipper_length_mm": 180, "body_mass_g": 3800, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 35.3, "bill_depth_mm": 18.9, "flipper_length_mm": 187, "body_mass_g": 3800, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 40.6, "bill_depth_mm": 18.6, "flipper_length_mm": 183, "body_mass_g": 3550, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 40.5, "bill_depth_mm": 17.9, "flipper_length_mm": 187, "body_mass_g": 3200, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 37.9, "bill_depth_mm": 18.6, "flipper_length_mm": 172, "body_mass_g": 3150, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 40.5, "bill_depth_mm": 18.9, "flipper_length_mm": 180, "body_mass_g": 3950, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.5, "bill_depth_mm": 16.7, "flipper_length_mm": 178, "body_mass_g": 3250, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.2, "bill_depth_mm": 18.1, "flipper_length_mm": 178, "body_mass_g": 3900, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.5, "bill_depth_mm": 17.8, "flipper_length_mm": 188, "body_mass_g": 3300, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 40.9, "bill_depth_mm": 18.9, "flipper_length_mm": 184, "body_mass_g": 3900, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.4, "bill_depth_mm": 17.0, "flipper_length_mm": 195, "body_mass_g": 3325, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.2, "bill_depth_mm": 21.1, "flipper_length_mm": 196, "body_mass_g": 4150, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 38.8, "bill_depth_mm": 20.0, "flipper_length_mm": 190, "body_mass_g": 3950, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 42.2, "bill_depth_mm": 18.5, "flipper_length_mm": 180, "body_mass_g": 3550, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.6, "bill_depth_mm": 19.3, "flipper_length_mm": 181, "body_mass_g": 3300, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.8, "bill_depth_mm": 19.1, "flipper_length_mm": 184, "body_mass_g": 4650, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.5, "bill_depth_mm": 18.0, "flipper_length_mm": 182, "body_mass_g": 3150, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 40.8, "bill_depth_mm": 18.4, "flipper_length_mm": 195, "body_mass_g": 3900, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.0, "bill_depth_mm": 18.5, "flipper_length_mm": 186, "body_mass_g": 3100, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 44.1, "bill_depth_mm": 19.7, "flipper_length_mm": 196, "body_mass_g": 4400, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.0, "bill_depth_mm": 16.9, "flipper_length_mm": 185, "body_mass_g": 3000, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.6, "bill_depth_mm": 18.8, "flipper_length_mm": 190, "body_mass_g": 4600, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 41.1, "bill_depth_mm": 19.0, "flipper_length_mm": 182, "body_mass_g": 3425, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.5, "bill_depth_mm": 18.9, "flipper_length_mm": 179, "body_mass_g": 2975, "sex": null, "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.0, "bill_depth_mm": 17.9, "flipper_length_mm": 190, "body_mass_g": 3450, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 42.3, "bill_depth_mm": 21.2, "flipper_length_mm": 191, "body_mass_g": 4150, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 39.6, "bill_depth_mm": 17.7, "flipper_length_mm": 186, "body_mass_g": 3500, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 40.1, "bill_depth_mm": 18.9, "flipper_length_mm": 188, "body_mass_g": 4300, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 35.0, "bill_depth_mm": 17.9, "flipper_length_mm": 190, "body_mass_g": 3450, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 42.0, "bill_depth_mm": 19.5, "flipper_length_mm": 200, "body_mass_g": 4050, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 34.5, "bill_depth_mm": 18.1, "flipper_length_mm": 187, "body_mass_g": 2900, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 41.4, "bill_depth_mm": 18.6, "flipper_length_mm": 191, "body_mass_g": 3700, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 39.0, "bill_depth_mm": 17.5, "flipper_length_mm": 186, "body_mass_g": 3550, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 40.6, "bill_depth_mm": 18.8, "flipper_length_mm": 193, "body_mass_g": 3800, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 36.5, "bill_depth_mm": 16.6, "flipper_length_mm": 181, "body_mass_g": 2850, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 37.6, "bill_depth_mm": 19.1, "flipper_length_mm": 194, "body_mass_g": 3750, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 35.7, "bill_depth_mm": 16.9, "flipper_length_mm": 185, "body_mass_g": 3150, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 41.3, "bill_depth_mm": 21.1, "flipper_length_mm": 195, "body_mass_g": 4400, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 37.6, "bill_depth_mm": 17.0, "flipper_length_mm": 185, "body_mass_g": 3600, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 41.1, "bill_depth_mm": 18.2, "flipper_length_mm": 192, "body_mass_g": 4050, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 36.4, "bill_depth_mm": 17.1, "flipper_length_mm": 184, "body_mass_g": 2850, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 41.6, "bill_depth_mm": 18.0, "flipper_length_mm": 192, "body_mass_g": 3950, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 35.5, "bill_depth_mm": 16.2, "flipper_length_mm": 195, "body_mass_g": 3350, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 41.1, "bill_depth_mm": 19.1, "flipper_length_mm": 188, "body_mass_g": 4100, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 35.9, "bill_depth_mm": 16.6, "flipper_length_mm": 190, "body_mass_g": 3050, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 41.8, "bill_depth_mm": 19.4, "flipper_length_mm": 198, "body_mass_g": 4450, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 33.5, "bill_depth_mm": 19.0, "flipper_length_mm": 190, "body_mass_g": 3600, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 39.7, "bill_depth_mm": 18.4, "flipper_length_mm": 190, "body_mass_g": 3900, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 39.6, "bill_depth_mm": 17.2, "flipper_length_mm": 196, "body_mass_g": 3550, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 45.8, "bill_depth_mm": 18.9, "flipper_length_mm": 197, "body_mass_g": 4150, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 35.5, "bill_depth_mm": 17.5, "flipper_length_mm": 190, "body_mass_g": 3700, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 42.8, "bill_depth_mm": 18.5, "flipper_length_mm": 195, "body_mass_g": 4250, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 40.9, "bill_depth_mm": 16.8, "flipper_length_mm": 191, "body_mass_g": 3700, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 37.2, "bill_depth_mm": 19.4, "flipper_length_mm": 184, "body_mass_g": 3900, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 36.2, "bill_depth_mm": 16.1, "flipper_length_mm": 187, "body_mass_g": 3550, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 42.1, "bill_depth_mm": 19.1, "flipper_length_mm": 195, "body_mass_g": 4000, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 34.6, "bill_depth_mm": 17.2, "flipper_length_mm": 189, "body_mass_g": 3200, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 42.9, "bill_depth_mm": 17.6, "flipper_length_mm": 196, "body_mass_g": 4700, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 36.7, "bill_depth_mm": 18.8, "flipper_length_mm": 187, "body_mass_g": 3800, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 35.1, "bill_depth_mm": 19.4, "flipper_length_mm": 193, "body_mass_g": 4200, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.3, "bill_depth_mm": 17.8, "flipper_length_mm": 191, "body_mass_g": 3350, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 41.3, "bill_depth_mm": 20.3, "flipper_length_mm": 194, "body_mass_g": 3550, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.3, "bill_depth_mm": 19.5, "flipper_length_mm": 190, "body_mass_g": 3800, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.9, "bill_depth_mm": 18.6, "flipper_length_mm": 189, "body_mass_g": 3500, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 38.3, "bill_depth_mm": 19.2, "flipper_length_mm": 189, "body_mass_g": 3950, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 38.9, "bill_depth_mm": 18.8, "flipper_length_mm": 190, "body_mass_g": 3600, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 35.7, "bill_depth_mm": 18.0, "flipper_length_mm": 202, "body_mass_g": 3550, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 41.1, "bill_depth_mm": 18.1, "flipper_length_mm": 205, "body_mass_g": 4300, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 34.0, "bill_depth_mm": 17.1, "flipper_length_mm": 185, "body_mass_g": 3400, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.6, "bill_depth_mm": 18.1, "flipper_length_mm": 186, "body_mass_g": 4450, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.2, "bill_depth_mm": 17.3, "flipper_length_mm": 187, "body_mass_g": 3300, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 40.8, "bill_depth_mm": 18.9, "flipper_length_mm": 208, "body_mass_g": 4300, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 38.1, "bill_depth_mm": 18.6, "flipper_length_mm": 190, "body_mass_g": 3700, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 40.3, "bill_depth_mm": 18.5, "flipper_length_mm": 196, "body_mass_g": 4350, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 33.1, "bill_depth_mm": 16.1, "flipper_length_mm": 178, "body_mass_g": 2900, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 43.2, "bill_depth_mm": 18.5, "flipper_length_mm": 192, "body_mass_g": 4100, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 35.0, "bill_depth_mm": 17.9, "flipper_length_mm": 192, "body_mass_g": 3725, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 41.0, "bill_depth_mm": 20.0, "flipper_length_mm": 203, "body_mass_g": 4725, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 37.7, "bill_depth_mm": 16.0, "flipper_length_mm": 183, "body_mass_g": 3075, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 37.8, "bill_depth_mm": 20.0, "flipper_length_mm": 190, "body_mass_g": 4250, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 37.9, "bill_depth_mm": 18.6, "flipper_length_mm": 193, "body_mass_g": 2925, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 39.7, "bill_depth_mm": 18.9, "flipper_length_mm": 184, "body_mass_g": 3550, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 38.6, "bill_depth_mm": 17.2, "flipper_length_mm": 199, "body_mass_g": 3750, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 38.2, "bill_depth_mm": 20.0, "flipper_length_mm": 190, "body_mass_g": 3900, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 38.1, "bill_depth_mm": 17.0, "flipper_length_mm": 181, "body_mass_g": 3175, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 43.2, "bill_depth_mm": 19.0, "flipper_length_mm": 197, "body_mass_g": 4775, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 38.1, "bill_depth_mm": 16.5, "flipper_length_mm": 198, "body_mass_g": 3825, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 45.6, "bill_depth_mm": 20.3, "flipper_length_mm": 191, "body_mass_g": 4600, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 39.7, "bill_depth_mm": 17.7, "flipper_length_mm": 193, "body_mass_g": 3200, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 42.2, "bill_depth_mm": 19.5, "flipper_length_mm": 197, "body_mass_g": 4275, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 39.6, "bill_depth_mm": 20.7, "flipper_length_mm": 191, "body_mass_g": 3900, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 42.7, "bill_depth_mm": 18.3, "flipper_length_mm": 196, "body_mass_g": 4075, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 38.6, "bill_depth_mm": 17.0, "flipper_length_mm": 188, "body_mass_g": 2900, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 37.3, "bill_depth_mm": 20.5, "flipper_length_mm": 199, "body_mass_g": 3775, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 35.7, "bill_depth_mm": 17.0, "flipper_length_mm": 189, "body_mass_g": 3350, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 41.1, "bill_depth_mm": 18.6, "flipper_length_mm": 189, "body_mass_g": 3325, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 36.2, "bill_depth_mm": 17.2, "flipper_length_mm": 187, "body_mass_g": 3150, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 37.7, "bill_depth_mm": 19.8, "flipper_length_mm": 198, "body_mass_g": 3500, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 40.2, "bill_depth_mm": 17.0, "flipper_length_mm": 176, "body_mass_g": 3450, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 41.4, "bill_depth_mm": 18.5, "flipper_length_mm": 202, "body_mass_g": 3875, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 35.2, "bill_depth_mm": 15.9, "flipper_length_mm": 186, "body_mass_g": 3050, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 40.6, "bill_depth_mm": 19.0, "flipper_length_mm": 199, "body_mass_g": 4000, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 38.8, "bill_depth_mm": 17.6, "flipper_length_mm": 191, "body_mass_g": 3275, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 41.5, "bill_depth_mm": 18.3, "flipper_length_mm": 195, "body_mass_g": 4300, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 39.0, "bill_depth_mm": 17.1, "flipper_length_mm": 191, "body_mass_g": 3050, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 44.1, "bill_depth_mm": 18.0, "flipper_length_mm": 210, "body_mass_g": 4000, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 38.5, "bill_depth_mm": 17.9, "flipper_length_mm": 190, "body_mass_g": 3325, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 43.1, "bill_depth_mm": 19.2, "flipper_length_mm": 197, "body_mass_g": 3500, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.8, "bill_depth_mm": 18.5, "flipper_length_mm": 193, "body_mass_g": 3500, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.5, "bill_depth_mm": 18.5, "flipper_length_mm": 199, "body_mass_g": 4475, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 38.1, "bill_depth_mm": 17.6, "flipper_length_mm": 187, "body_mass_g": 3425, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 41.1, "bill_depth_mm": 17.5, "flipper_length_mm": 190, "body_mass_g": 3900, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 35.6, "bill_depth_mm": 17.5, "flipper_length_mm": 191, "body_mass_g": 3175, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 40.2, "bill_depth_mm": 20.1, "flipper_length_mm": 200, "body_mass_g": 3975, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.0, "bill_depth_mm": 16.5, "flipper_length_mm": 185, "body_mass_g": 3400, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.7, "bill_depth_mm": 17.9, "flipper_length_mm": 193, "body_mass_g": 4250, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 40.2, "bill_depth_mm": 17.1, "flipper_length_mm": 193, "body_mass_g": 3400, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 40.6, "bill_depth_mm": 17.2, "flipper_length_mm": 187, "body_mass_g": 3475, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 32.1, "bill_depth_mm": 15.5, "flipper_length_mm": 188, "body_mass_g": 3050, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 40.7, "bill_depth_mm": 17.0, "flipper_length_mm": 190, "body_mass_g": 3725, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.3, "bill_depth_mm": 16.8, "flipper_length_mm": 192, "body_mass_g": 3000, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.0, "bill_depth_mm": 18.7, "flipper_length_mm": 185, "body_mass_g": 3650, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.2, "bill_depth_mm": 18.6, "flipper_length_mm": 190, "body_mass_g": 4250, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.6, "bill_depth_mm": 18.4, "flipper_length_mm": 184, "body_mass_g": 3475, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.0, "bill_depth_mm": 17.8, "flipper_length_mm": 195, "body_mass_g": 3450, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.8, "bill_depth_mm": 18.1, "flipper_length_mm": 193, "body_mass_g": 3750, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.0, "bill_depth_mm": 17.1, "flipper_length_mm": 187, "body_mass_g": 3700, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 41.5, "bill_depth_mm": 18.5, "flipper_length_mm": 201, "body_mass_g": 4000, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.1, "bill_depth_mm": 13.2, "flipper_length_mm": 211, "body_mass_g": 4500, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.0, "bill_depth_mm": 16.3, "flipper_length_mm": 230, "body_mass_g": 5700, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.7, "bill_depth_mm": 14.1, "flipper_length_mm": 210, "body_mass_g": 4450, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.0, "bill_depth_mm": 15.2, "flipper_length_mm": 218, "body_mass_g": 5700, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.6, "bill_depth_mm": 14.5, "flipper_length_mm": 215, "body_mass_g": 5400, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.5, "bill_depth_mm": 13.5, "flipper_length_mm": 210, "body_mass_g": 4550, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.4, "bill_depth_mm": 14.6, "flipper_length_mm": 211, "body_mass_g": 4800, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.7, "bill_depth_mm": 15.3, "flipper_length_mm": 219, "body_mass_g": 5200, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 43.3, "bill_depth_mm": 13.4, "flipper_length_mm": 209, "body_mass_g": 4400, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.8, "bill_depth_mm": 15.4, "flipper_length_mm": 215, "body_mass_g": 5150, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 40.9, "bill_depth_mm": 13.7, "flipper_length_mm": 214, "body_mass_g": 4650, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.0, "bill_depth_mm": 16.1, "flipper_length_mm": 216, "body_mass_g": 5550, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.5, "bill_depth_mm": 13.7, "flipper_length_mm": 214, "body_mass_g": 4650, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.4, "bill_depth_mm": 14.6, "flipper_length_mm": 213, "body_mass_g": 5850, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.8, "bill_depth_mm": 14.6, "flipper_length_mm": 210, "body_mass_g": 4200, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.3, "bill_depth_mm": 15.7, "flipper_length_mm": 217, "body_mass_g": 5850, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 42.0, "bill_depth_mm": 13.5, "flipper_length_mm": 210, "body_mass_g": 4150, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.2, "bill_depth_mm": 15.2, "flipper_length_mm": 221, "body_mass_g": 6300, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.2, "bill_depth_mm": 14.5, "flipper_length_mm": 209, "body_mass_g": 4800, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.7, "bill_depth_mm": 15.1, "flipper_length_mm": 222, "body_mass_g": 5350, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.2, "bill_depth_mm": 14.3, "flipper_length_mm": 218, "body_mass_g": 5700, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.1, "bill_depth_mm": 14.5, "flipper_length_mm": 215, "body_mass_g": 5000, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.5, "bill_depth_mm": 14.5, "flipper_length_mm": 213, "body_mass_g": 4400, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.3, "bill_depth_mm": 15.8, "flipper_length_mm": 215, "body_mass_g": 5050, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 42.9, "bill_depth_mm": 13.1, "flipper_length_mm": 215, "body_mass_g": 5000, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.1, "bill_depth_mm": 15.1, "flipper_length_mm": 215, "body_mass_g": 5100, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 44.5, "bill_depth_mm": 14.3, "flipper_length_mm": 216, "body_mass_g": 4100, "sex": null, "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.8, "bill_depth_mm": 15.0, "flipper_length_mm": 215, "body_mass_g": 5650, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.2, "bill_depth_mm": 14.3, "flipper_length_mm": 210, "body_mass_g": 4600, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.0, "bill_depth_mm": 15.3, "flipper_length_mm": 220, "body_mass_g": 5550, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.3, "bill_depth_mm": 15.3, "flipper_length_mm": 222, "body_mass_g": 5250, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 42.8, "bill_depth_mm": 14.2, "flipper_length_mm": 209, "body_mass_g": 4700, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.1, "bill_depth_mm": 14.5, "flipper_length_mm": 207, "body_mass_g": 5050, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 59.6, "bill_depth_mm": 17.0, "flipper_length_mm": 230, "body_mass_g": 6050, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.1, "bill_depth_mm": 14.8, "flipper_length_mm": 220, "body_mass_g": 5150, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.4, "bill_depth_mm": 16.3, "flipper_length_mm": 220, "body_mass_g": 5400, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 42.6, "bill_depth_mm": 13.7, "flipper_length_mm": 213, "body_mass_g": 4950, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 44.4, "bill_depth_mm": 17.3, "flipper_length_mm": 219, "body_mass_g": 5250, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 44.0, "bill_depth_mm": 13.6, "flipper_length_mm": 208, "body_mass_g": 4350, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.7, "bill_depth_mm": 15.7, "flipper_length_mm": 208, "body_mass_g": 5350, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 42.7, "bill_depth_mm": 13.7, "flipper_length_mm": 208, "body_mass_g": 3950, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.6, "bill_depth_mm": 16.0, "flipper_length_mm": 225, "body_mass_g": 5700, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.3, "bill_depth_mm": 13.7, "flipper_length_mm": 210, "body_mass_g": 4300, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.6, "bill_depth_mm": 15.0, "flipper_length_mm": 216, "body_mass_g": 4750, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.5, "bill_depth_mm": 15.9, "flipper_length_mm": 222, "body_mass_g": 5550, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 43.6, "bill_depth_mm": 13.9, "flipper_length_mm": 217, "body_mass_g": 4900, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.5, "bill_depth_mm": 13.9, "flipper_length_mm": 210, "body_mass_g": 4200, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.5, "bill_depth_mm": 15.9, "flipper_length_mm": 225, "body_mass_g": 5400, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 44.9, "bill_depth_mm": 13.3, "flipper_length_mm": 213, "body_mass_g": 5100, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.2, "bill_depth_mm": 15.8, "flipper_length_mm": 215, "body_mass_g": 5300, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.6, "bill_depth_mm": 14.2, "flipper_length_mm": 210, "body_mass_g": 4850, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.5, "bill_depth_mm": 14.1, "flipper_length_mm": 220, "body_mass_g": 5300, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.1, "bill_depth_mm": 14.4, "flipper_length_mm": 210, "body_mass_g": 4400, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.1, "bill_depth_mm": 15.0, "flipper_length_mm": 225, "body_mass_g": 5000, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.5, "bill_depth_mm": 14.4, "flipper_length_mm": 217, "body_mass_g": 4900, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.0, "bill_depth_mm": 15.4, "flipper_length_mm": 220, "body_mass_g": 5050, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 43.8, "bill_depth_mm": 13.9, "flipper_length_mm": 208, "body_mass_g": 4300, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.5, "bill_depth_mm": 15.0, "flipper_length_mm": 220, "body_mass_g": 5000, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 43.2, "bill_depth_mm": 14.5, "flipper_length_mm": 208, "body_mass_g": 4450, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.4, "bill_depth_mm": 15.3, "flipper_length_mm": 224, "body_mass_g": 5550, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.3, "bill_depth_mm": 13.8, "flipper_length_mm": 208, "body_mass_g": 4200, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.2, "bill_depth_mm": 14.9, "flipper_length_mm": 221, "body_mass_g": 5300, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.7, "bill_depth_mm": 13.9, "flipper_length_mm": 214, "body_mass_g": 4400, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 54.3, "bill_depth_mm": 15.7, "flipper_length_mm": 231, "body_mass_g": 5650, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.8, "bill_depth_mm": 14.2, "flipper_length_mm": 219, "body_mass_g": 4700, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.8, "bill_depth_mm": 16.8, "flipper_length_mm": 230, "body_mass_g": 5700, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.2, "bill_depth_mm": 14.4, "flipper_length_mm": 214, "body_mass_g": 4650, "sex": null, "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.5, "bill_depth_mm": 16.2, "flipper_length_mm": 229, "body_mass_g": 5800, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 43.5, "bill_depth_mm": 14.2, "flipper_length_mm": 220, "body_mass_g": 4700, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.7, "bill_depth_mm": 15.0, "flipper_length_mm": 223, "body_mass_g": 5550, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.7, "bill_depth_mm": 15.0, "flipper_length_mm": 216, "body_mass_g": 4750, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.4, "bill_depth_mm": 15.6, "flipper_length_mm": 221, "body_mass_g": 5000, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.2, "bill_depth_mm": 15.6, "flipper_length_mm": 221, "body_mass_g": 5100, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.5, "bill_depth_mm": 14.8, "flipper_length_mm": 217, "body_mass_g": 5200, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.4, "bill_depth_mm": 15.0, "flipper_length_mm": 216, "body_mass_g": 4700, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.6, "bill_depth_mm": 16.0, "flipper_length_mm": 230, "body_mass_g": 5800, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.5, "bill_depth_mm": 14.2, "flipper_length_mm": 209, "body_mass_g": 4600, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 51.1, "bill_depth_mm": 16.3, "flipper_length_mm": 220, "body_mass_g": 6000, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.2, "bill_depth_mm": 13.8, "flipper_length_mm": 215, "body_mass_g": 4750, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.2, "bill_depth_mm": 16.4, "flipper_length_mm": 223, "body_mass_g": 5950, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.1, "bill_depth_mm": 14.5, "flipper_length_mm": 212, "body_mass_g": 4625, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 52.5, "bill_depth_mm": 15.6, "flipper_length_mm": 221, "body_mass_g": 5450, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.4, "bill_depth_mm": 14.6, "flipper_length_mm": 212, "body_mass_g": 4725, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.0, "bill_depth_mm": 15.9, "flipper_length_mm": 224, "body_mass_g": 5350, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 44.9, "bill_depth_mm": 13.8, "flipper_length_mm": 212, "body_mass_g": 4750, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.8, "bill_depth_mm": 17.3, "flipper_length_mm": 228, "body_mass_g": 5600, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 43.4, "bill_depth_mm": 14.4, "flipper_length_mm": 218, "body_mass_g": 4600, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 51.3, "bill_depth_mm": 14.2, "flipper_length_mm": 218, "body_mass_g": 5300, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.5, "bill_depth_mm": 14.0, "flipper_length_mm": 212, "body_mass_g": 4875, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 52.1, "bill_depth_mm": 17.0, "flipper_length_mm": 230, "body_mass_g": 5550, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.5, "bill_depth_mm": 15.0, "flipper_length_mm": 218, "body_mass_g": 4950, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 52.2, "bill_depth_mm": 17.1, "flipper_length_mm": 228, "body_mass_g": 5400, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.5, "bill_depth_mm": 14.5, "flipper_length_mm": 212, "body_mass_g": 4750, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.5, "bill_depth_mm": 16.1, "flipper_length_mm": 224, "body_mass_g": 5650, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 44.5, "bill_depth_mm": 14.7, "flipper_length_mm": 214, "body_mass_g": 4850, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.8, "bill_depth_mm": 15.7, "flipper_length_mm": 226, "body_mass_g": 5200, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.4, "bill_depth_mm": 15.8, "flipper_length_mm": 216, "body_mass_g": 4925, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.9, "bill_depth_mm": 14.6, "flipper_length_mm": 222, "body_mass_g": 4875, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.4, "bill_depth_mm": 14.4, "flipper_length_mm": 203, "body_mass_g": 4625, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 51.1, "bill_depth_mm": 16.5, "flipper_length_mm": 225, "body_mass_g": 5250, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.5, "bill_depth_mm": 15.0, "flipper_length_mm": 219, "body_mass_g": 4850, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 55.9, "bill_depth_mm": 17.0, "flipper_length_mm": 228, "body_mass_g": 5600, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.2, "bill_depth_mm": 15.5, "flipper_length_mm": 215, "body_mass_g": 4975, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.1, "bill_depth_mm": 15.0, "flipper_length_mm": 228, "body_mass_g": 5500, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.3, "bill_depth_mm": 13.8, "flipper_length_mm": 216, "body_mass_g": 4725, "sex": null, "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.8, "bill_depth_mm": 16.1, "flipper_length_mm": 215, "body_mass_g": 5500, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 41.7, "bill_depth_mm": 14.7, "flipper_length_mm": 210, "body_mass_g": 4700, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 53.4, "bill_depth_mm": 15.8, "flipper_length_mm": 219, "body_mass_g": 5500, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 43.3, "bill_depth_mm": 14.0, "flipper_length_mm": 208, "body_mass_g": 4575, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.1, "bill_depth_mm": 15.1, "flipper_length_mm": 209, "body_mass_g": 5500, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.5, "bill_depth_mm": 15.2, "flipper_length_mm": 216, "body_mass_g": 5000, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.8, "bill_depth_mm": 15.9, "flipper_length_mm": 229, "body_mass_g": 5950, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 43.5, "bill_depth_mm": 15.2, "flipper_length_mm": 213, "body_mass_g": 4650, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 51.5, "bill_depth_mm": 16.3, "flipper_length_mm": 230, "body_mass_g": 5500, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.2, "bill_depth_mm": 14.1, "flipper_length_mm": 217, "body_mass_g": 4375, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 55.1, "bill_depth_mm": 16.0, "flipper_length_mm": 230, "body_mass_g": 5850, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 44.5, "bill_depth_mm": 15.7, "flipper_length_mm": 217, "body_mass_g": 4875, "sex": null, "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.8, "bill_depth_mm": 16.2, "flipper_length_mm": 222, "body_mass_g": 6000, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.2, "bill_depth_mm": 13.7, "flipper_length_mm": 214, "body_mass_g": 4925, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": null, "bill_depth_mm": null, "flipper_length_mm": null, "body_mass_g": null, "sex": null, "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.8, "bill_depth_mm": 14.3, "flipper_length_mm": 215, "body_mass_g": 4850, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.4, "bill_depth_mm": 15.7, "flipper_length_mm": 222, "body_mass_g": 5750, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.2, "bill_depth_mm": 14.8, "flipper_length_mm": 212, "body_mass_g": 5200, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.9, "bill_depth_mm": 16.1, "flipper_length_mm": 213, "body_mass_g": 5400, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.5, "bill_depth_mm": 17.9, "flipper_length_mm": 192, "body_mass_g": 3500, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.0, "bill_depth_mm": 19.5, "flipper_length_mm": 196, "body_mass_g": 3900, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 51.3, "bill_depth_mm": 19.2, "flipper_length_mm": 193, "body_mass_g": 3650, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 45.4, "bill_depth_mm": 18.7, "flipper_length_mm": 188, "body_mass_g": 3525, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 52.7, "bill_depth_mm": 19.8, "flipper_length_mm": 197, "body_mass_g": 3725, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 45.2, "bill_depth_mm": 17.8, "flipper_length_mm": 198, "body_mass_g": 3950, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.1, "bill_depth_mm": 18.2, "flipper_length_mm": 178, "body_mass_g": 3250, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 51.3, "bill_depth_mm": 18.2, "flipper_length_mm": 197, "body_mass_g": 3750, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.0, "bill_depth_mm": 18.9, "flipper_length_mm": 195, "body_mass_g": 4150, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 51.3, "bill_depth_mm": 19.9, "flipper_length_mm": 198, "body_mass_g": 3700, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.6, "bill_depth_mm": 17.8, "flipper_length_mm": 193, "body_mass_g": 3800, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 51.7, "bill_depth_mm": 20.3, "flipper_length_mm": 194, "body_mass_g": 3775, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 47.0, "bill_depth_mm": 17.3, "flipper_length_mm": 185, "body_mass_g": 3700, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 52.0, "bill_depth_mm": 18.1, "flipper_length_mm": 201, "body_mass_g": 4050, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 45.9, "bill_depth_mm": 17.1, "flipper_length_mm": 190, "body_mass_g": 3575, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.5, "bill_depth_mm": 19.6, "flipper_length_mm": 201, "body_mass_g": 4050, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.3, "bill_depth_mm": 20.0, "flipper_length_mm": 197, "body_mass_g": 3300, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 58.0, "bill_depth_mm": 17.8, "flipper_length_mm": 181, "body_mass_g": 3700, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.4, "bill_depth_mm": 18.6, "flipper_length_mm": 190, "body_mass_g": 3450, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 49.2, "bill_depth_mm": 18.2, "flipper_length_mm": 195, "body_mass_g": 4400, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 42.4, "bill_depth_mm": 17.3, "flipper_length_mm": 181, "body_mass_g": 3600, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 48.5, "bill_depth_mm": 17.5, "flipper_length_mm": 191, "body_mass_g": 3400, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 43.2, "bill_depth_mm": 16.6, "flipper_length_mm": 187, "body_mass_g": 2900, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.6, "bill_depth_mm": 19.4, "flipper_length_mm": 193, "body_mass_g": 3800, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.7, "bill_depth_mm": 17.9, "flipper_length_mm": 195, "body_mass_g": 3300, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 52.0, "bill_depth_mm": 19.0, "flipper_length_mm": 197, "body_mass_g": 4150, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.5, "bill_depth_mm": 18.4, "flipper_length_mm": 200, "body_mass_g": 3400, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 49.5, "bill_depth_mm": 19.0, "flipper_length_mm": 200, "body_mass_g": 3800, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.4, "bill_depth_mm": 17.8, "flipper_length_mm": 191, "body_mass_g": 3700, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 52.8, "bill_depth_mm": 20.0, "flipper_length_mm": 205, "body_mass_g": 4550, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 40.9, "bill_depth_mm": 16.6, "flipper_length_mm": 187, "body_mass_g": 3200, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 54.2, "bill_depth_mm": 20.8, "flipper_length_mm": 201, "body_mass_g": 4300, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 42.5, "bill_depth_mm": 16.7, "flipper_length_mm": 187, "body_mass_g": 3350, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 51.0, "bill_depth_mm": 18.8, "flipper_length_mm": 203, "body_mass_g": 4100, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 49.7, "bill_depth_mm": 18.6, "flipper_length_mm": 195, "body_mass_g": 3600, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 47.5, "bill_depth_mm": 16.8, "flipper_length_mm": 199, "body_mass_g": 3900, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 47.6, "bill_depth_mm": 18.3, "flipper_length_mm": 195, "body_mass_g": 3850, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 52.0, "bill_depth_mm": 20.7, "flipper_length_mm": 210, "body_mass_g": 4800, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.9, "bill_depth_mm": 16.6, "flipper_length_mm": 192, "body_mass_g": 2700, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 53.5, "bill_depth_mm": 19.9, "flipper_length_mm": 205, "body_mass_g": 4500, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 49.0, "bill_depth_mm": 19.5, "flipper_length_mm": 210, "body_mass_g": 3950, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.2, "bill_depth_mm": 17.5, "flipper_length_mm": 187, "body_mass_g": 3650, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.9, "bill_depth_mm": 19.1, "flipper_length_mm": 196, "body_mass_g": 3550, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 45.5, "bill_depth_mm": 17.0, "flipper_length_mm": 196, "body_mass_g": 3500, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.9, "bill_depth_mm": 17.9, "flipper_length_mm": 196, "body_mass_g": 3675, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.8, "bill_depth_mm": 18.5, "flipper_length_mm": 201, "body_mass_g": 4450, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.1, "bill_depth_mm": 17.9, "flipper_length_mm": 190, "body_mass_g": 3400, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 49.0, "bill_depth_mm": 19.6, "flipper_length_mm": 212, "body_mass_g": 4300, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 51.5, "bill_depth_mm": 18.7, "flipper_length_mm": 187, "body_mass_g": 3250, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 49.8, "bill_depth_mm": 17.3, "flipper_length_mm": 198, "body_mass_g": 3675, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 48.1, "bill_depth_mm": 16.4, "flipper_length_mm": 199, "body_mass_g": 3325, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 51.4, "bill_depth_mm": 19.0, "flipper_length_mm": 201, "body_mass_g": 3950, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 45.7, "bill_depth_mm": 17.3, "flipper_length_mm": 193, "body_mass_g": 3600, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.7, "bill_depth_mm": 19.7, "flipper_length_mm": 203, "body_mass_g": 4050, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 42.5, "bill_depth_mm": 17.3, "flipper_length_mm": 187, "body_mass_g": 3350, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 52.2, "bill_depth_mm": 18.8, "flipper_length_mm": 197, "body_mass_g": 3450, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 45.2, "bill_depth_mm": 16.6, "flipper_length_mm": 191, "body_mass_g": 3250, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 49.3, "bill_depth_mm": 19.9, "flipper_length_mm": 203, "body_mass_g": 4050, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.2, "bill_depth_mm": 18.8, "flipper_length_mm": 202, "body_mass_g": 3800, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 45.6, "bill_depth_mm": 19.4, "flipper_length_mm": 194, "body_mass_g": 3525, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 51.9, "bill_depth_mm": 19.5, "flipper_length_mm": 206, "body_mass_g": 3950, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.8, "bill_depth_mm": 16.5, "flipper_length_mm": 189, "body_mass_g": 3650, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 45.7, "bill_depth_mm": 17.0, "flipper_length_mm": 195, "body_mass_g": 3650, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 55.8, "bill_depth_mm": 19.8, "flipper_length_mm": 207, "body_mass_g": 4000, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 43.5, "bill_depth_mm": 18.1, "flipper_length_mm": 202, "body_mass_g": 3400, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 49.6, "bill_depth_mm": 18.2, "flipper_length_mm": 193, "body_mass_g": 3775, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.8, "bill_depth_mm": 19.0, "flipper_length_mm": 210, "body_mass_g": 4100, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.2, "bill_depth_mm": 18.7, "flipper_length_mm": 198, "body_mass_g": 3775, "sex": "female", "year": 2009}]}}, {"mode": "vega-lite"});
</script>
</div>
</div>
</section>
<section id="bar-chart" class="level2">
<h2 class="anchored" data-anchor-id="bar-chart">Bar chart</h2>
<p>Next up is the trusty ol’ bar chart, which we demonstrate using the wheat dataset. This chart is challenging because it spans two and a half centuries of yearly data, leading to a wide chart with the default settings. Did you turn your head to read the year labels on the x-axis? Or to figure out that the y-axis title reads <code>wheat</code>? Surely there must be a better way.</p>
<div id="cell-6" class="cell" data-execution_count="3">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1">barchart <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (</span>
<span id="cb3-2">    alt.Chart(wheat)</span>
<span id="cb3-3">    .mark_bar()</span>
<span id="cb3-4">    .encode(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"year:O"</span>, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"wheat:Q"</span>, tooltip<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"year:O"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"wheat:Q"</span>])</span>
<span id="cb3-5">)</span>
<span id="cb3-6">barchart</span></code></pre></div></div>
</details>
<div class="cell-output cell-output-display" data-execution_count="3">

<style>
  #altair-viz-01f31f052bae451ba5be95ad96342eaf.vega-embed {
    width: 100%;
    display: flex;
  }

  #altair-viz-01f31f052bae451ba5be95ad96342eaf.vega-embed details,
  #altair-viz-01f31f052bae451ba5be95ad96342eaf.vega-embed details summary {
    position: relative;
  }
</style>
<div id="altair-viz-01f31f052bae451ba5be95ad96342eaf"></div>
<script type="text/javascript">
  var VEGA_DEBUG = (typeof VEGA_DEBUG == "undefined") ? {} : VEGA_DEBUG;
  (function(spec, embedOpt){
    let outputDiv = document.currentScript.previousElementSibling;
    if (outputDiv.id !== "altair-viz-01f31f052bae451ba5be95ad96342eaf") {
      outputDiv = document.getElementById("altair-viz-01f31f052bae451ba5be95ad96342eaf");
    }
    const paths = {
      "vega": "https://cdn.jsdelivr.net/npm/vega@5?noext",
      "vega-lib": "https://cdn.jsdelivr.net/npm/vega-lib?noext",
      "vega-lite": "https://cdn.jsdelivr.net/npm/vega-lite@5.16.3?noext",
      "vega-embed": "https://cdn.jsdelivr.net/npm/vega-embed@6?noext",
    };

    function maybeLoadScript(lib, version) {
      var key = `${lib.replace("-", "")}_version`;
      return (VEGA_DEBUG[key] == version) ?
        Promise.resolve(paths[lib]) :
        new Promise(function(resolve, reject) {
          var s = document.createElement('script');
          document.getElementsByTagName("head")[0].appendChild(s);
          s.async = true;
          s.onload = () => {
            VEGA_DEBUG[key] = version;
            return resolve(paths[lib]);
          };
          s.onerror = () => reject(`Error loading script: ${paths[lib]}`);
          s.src = paths[lib];
        });
    }

    function showError(err) {
      outputDiv.innerHTML = `<div class="error" style="color:red;">${err}</div>`;
      throw err;
    }

    function displayChart(vegaEmbed) {
      vegaEmbed(outputDiv, spec, embedOpt)
        .catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));
    }

    if(typeof define === "function" && define.amd) {
      requirejs.config({paths});
      require(["vega-embed"], displayChart, err => showError(`Error loading script: ${err.message}`));
    } else {
      maybeLoadScript("vega", "5")
        .then(() => maybeLoadScript("vega-lite", "5.16.3"))
        .then(() => maybeLoadScript("vega-embed", "6"))
        .catch(showError)
        .then(() => displayChart(vegaEmbed));
    }
  })({"config": {"view": {"continuousWidth": 300, "continuousHeight": 300}}, "data": {"name": "data-76d1ce26ea5761007c35827e1564d86c"}, "mark": {"type": "bar"}, "encoding": {"tooltip": [{"field": "year", "type": "ordinal"}, {"field": "wheat", "type": "quantitative"}], "x": {"field": "year", "type": "ordinal"}, "y": {"field": "wheat", "type": "quantitative"}}, "$schema": "https://vega.github.io/schema/vega-lite/v5.16.3.json", "datasets": {"data-76d1ce26ea5761007c35827e1564d86c": [{"year": 1565, "wheat": 41.0, "wages": 5.0}, {"year": 1570, "wheat": 45.0, "wages": 5.05}, {"year": 1575, "wheat": 42.0, "wages": 5.08}, {"year": 1580, "wheat": 49.0, "wages": 5.12}, {"year": 1585, "wheat": 41.5, "wages": 5.15}, {"year": 1590, "wheat": 47.0, "wages": 5.25}, {"year": 1595, "wheat": 64.0, "wages": 5.54}, {"year": 1600, "wheat": 27.0, "wages": 5.61}, {"year": 1605, "wheat": 33.0, "wages": 5.69}, {"year": 1610, "wheat": 32.0, "wages": 5.78}, {"year": 1615, "wheat": 33.0, "wages": 5.94}, {"year": 1620, "wheat": 35.0, "wages": 6.01}, {"year": 1625, "wheat": 33.0, "wages": 6.12}, {"year": 1630, "wheat": 45.0, "wages": 6.22}, {"year": 1635, "wheat": 33.0, "wages": 6.3}, {"year": 1640, "wheat": 39.0, "wages": 6.37}, {"year": 1645, "wheat": 53.0, "wages": 6.45}, {"year": 1650, "wheat": 42.0, "wages": 6.5}, {"year": 1655, "wheat": 40.5, "wages": 6.6}, {"year": 1660, "wheat": 46.5, "wages": 6.75}, {"year": 1665, "wheat": 32.0, "wages": 6.8}, {"year": 1670, "wheat": 37.0, "wages": 6.9}, {"year": 1675, "wheat": 43.0, "wages": 7.0}, {"year": 1680, "wheat": 35.0, "wages": 7.3}, {"year": 1685, "wheat": 27.0, "wages": 7.6}, {"year": 1690, "wheat": 40.0, "wages": 8.0}, {"year": 1695, "wheat": 50.0, "wages": 8.5}, {"year": 1700, "wheat": 30.0, "wages": 9.0}, {"year": 1705, "wheat": 32.0, "wages": 10.0}, {"year": 1710, "wheat": 44.0, "wages": 11.0}, {"year": 1715, "wheat": 33.0, "wages": 11.75}, {"year": 1720, "wheat": 29.0, "wages": 12.5}, {"year": 1725, "wheat": 39.0, "wages": 13.0}, {"year": 1730, "wheat": 26.0, "wages": 13.3}, {"year": 1735, "wheat": 32.0, "wages": 13.6}, {"year": 1740, "wheat": 27.0, "wages": 14.0}, {"year": 1745, "wheat": 27.5, "wages": 14.5}, {"year": 1750, "wheat": 31.0, "wages": 15.0}, {"year": 1755, "wheat": 35.5, "wages": 15.7}, {"year": 1760, "wheat": 31.0, "wages": 16.5}, {"year": 1765, "wheat": 43.0, "wages": 17.6}, {"year": 1770, "wheat": 47.0, "wages": 18.5}, {"year": 1775, "wheat": 44.0, "wages": 19.5}, {"year": 1780, "wheat": 46.0, "wages": 21.0}, {"year": 1785, "wheat": 42.0, "wages": 23.0}, {"year": 1790, "wheat": 47.5, "wages": 25.5}, {"year": 1795, "wheat": 76.0, "wages": 27.5}, {"year": 1800, "wheat": 79.0, "wages": 28.5}, {"year": 1805, "wheat": 81.0, "wages": 29.5}, {"year": 1810, "wheat": 99.0, "wages": 30.0}, {"year": 1815, "wheat": 78.0, "wages": null}, {"year": 1820, "wheat": 54.0, "wages": null}]}}, {"mode": "vega-lite"});
</script>
</div>
</div>
</section>
<section id="line-chart" class="level2">
<h2 class="anchored" data-anchor-id="line-chart">Line chart</h2>
<p>A line chart with a legend, in this case showing stock prices of a handful of tech companies, is also something we use on a regular basis. Did you even notice the effort you have to put in to lookup the color of the line in the legend? I actually had a hard time distinguishing Amazon and Google, as the red and orange are very alike to my eyes.</p>
<div id="cell-8" class="cell" data-execution_count="4">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1">chart <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> alt.Chart(stocks).encode(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Color(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"symbol"</span>))</span>
<span id="cb4-2">line <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> chart.mark_line().encode(</span>
<span id="cb4-3">    x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.X(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"date:T"</span>, axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Axis(title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"date"</span>)),</span>
<span id="cb4-4">    y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Y(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"price:Q"</span>, axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Axis(title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"price"</span>)),</span>
<span id="cb4-5">    tooltip<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"date"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"price"</span>],</span>
<span id="cb4-6">)</span>
<span id="cb4-7">line</span></code></pre></div></div>
</details>
<div class="cell-output cell-output-display" data-execution_count="4">

<style>
  #altair-viz-28b5ddbb9d0d4f64bca6aa775c2ad92d.vega-embed {
    width: 100%;
    display: flex;
  }

  #altair-viz-28b5ddbb9d0d4f64bca6aa775c2ad92d.vega-embed details,
  #altair-viz-28b5ddbb9d0d4f64bca6aa775c2ad92d.vega-embed details summary {
    position: relative;
  }
</style>
<div id="altair-viz-28b5ddbb9d0d4f64bca6aa775c2ad92d"></div>
<script type="text/javascript">
  var VEGA_DEBUG = (typeof VEGA_DEBUG == "undefined") ? {} : VEGA_DEBUG;
  (function(spec, embedOpt){
    let outputDiv = document.currentScript.previousElementSibling;
    if (outputDiv.id !== "altair-viz-28b5ddbb9d0d4f64bca6aa775c2ad92d") {
      outputDiv = document.getElementById("altair-viz-28b5ddbb9d0d4f64bca6aa775c2ad92d");
    }
    const paths = {
      "vega": "https://cdn.jsdelivr.net/npm/vega@5?noext",
      "vega-lib": "https://cdn.jsdelivr.net/npm/vega-lib?noext",
      "vega-lite": "https://cdn.jsdelivr.net/npm/vega-lite@5.16.3?noext",
      "vega-embed": "https://cdn.jsdelivr.net/npm/vega-embed@6?noext",
    };

    function maybeLoadScript(lib, version) {
      var key = `${lib.replace("-", "")}_version`;
      return (VEGA_DEBUG[key] == version) ?
        Promise.resolve(paths[lib]) :
        new Promise(function(resolve, reject) {
          var s = document.createElement('script');
          document.getElementsByTagName("head")[0].appendChild(s);
          s.async = true;
          s.onload = () => {
            VEGA_DEBUG[key] = version;
            return resolve(paths[lib]);
          };
          s.onerror = () => reject(`Error loading script: ${paths[lib]}`);
          s.src = paths[lib];
        });
    }

    function showError(err) {
      outputDiv.innerHTML = `<div class="error" style="color:red;">${err}</div>`;
      throw err;
    }

    function displayChart(vegaEmbed) {
      vegaEmbed(outputDiv, spec, embedOpt)
        .catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));
    }

    if(typeof define === "function" && define.amd) {
      requirejs.config({paths});
      require(["vega-embed"], displayChart, err => showError(`Error loading script: ${err.message}`));
    } else {
      maybeLoadScript("vega", "5")
        .then(() => maybeLoadScript("vega-lite", "5.16.3"))
        .then(() => maybeLoadScript("vega-embed", "6"))
        .catch(showError)
        .then(() => displayChart(vegaEmbed));
    }
  })({"config": {"view": {"continuousWidth": 300, "continuousHeight": 300}}, "data": {"name": "data-96e857a61c6b623bafe23440d582a500"}, "mark": {"type": "line"}, "encoding": {"color": {"field": "symbol", "type": "nominal"}, "tooltip": [{"field": "date", "type": "temporal"}, {"field": "price", "type": "quantitative"}], "x": {"axis": {"title": "date"}, "field": "date", "type": "temporal"}, "y": {"axis": {"title": "price"}, "field": "price", "type": "quantitative"}}, "$schema": "https://vega.github.io/schema/vega-lite/v5.16.3.json", "datasets": {"data-96e857a61c6b623bafe23440d582a500": [{"symbol": "MSFT", "date": "2000-01-01T00:00:00", "price": 39.81}, {"symbol": "MSFT", "date": "2000-02-01T00:00:00", "price": 36.35}, {"symbol": "MSFT", "date": "2000-03-01T00:00:00", "price": 43.22}, {"symbol": "MSFT", "date": "2000-04-01T00:00:00", "price": 28.37}, {"symbol": "MSFT", "date": "2000-05-01T00:00:00", "price": 25.45}, {"symbol": "MSFT", "date": "2000-06-01T00:00:00", "price": 32.54}, {"symbol": "MSFT", "date": "2000-07-01T00:00:00", "price": 28.4}, {"symbol": "MSFT", "date": "2000-08-01T00:00:00", "price": 28.4}, {"symbol": "MSFT", "date": "2000-09-01T00:00:00", "price": 24.53}, {"symbol": "MSFT", "date": "2000-10-01T00:00:00", "price": 28.02}, {"symbol": "MSFT", "date": "2000-11-01T00:00:00", "price": 23.34}, {"symbol": "MSFT", "date": "2000-12-01T00:00:00", "price": 17.65}, {"symbol": "MSFT", "date": "2001-01-01T00:00:00", "price": 24.84}, {"symbol": "MSFT", "date": "2001-02-01T00:00:00", "price": 24.0}, {"symbol": "MSFT", "date": "2001-03-01T00:00:00", "price": 22.25}, {"symbol": "MSFT", "date": "2001-04-01T00:00:00", "price": 27.56}, {"symbol": "MSFT", "date": "2001-05-01T00:00:00", "price": 28.14}, {"symbol": "MSFT", "date": "2001-06-01T00:00:00", "price": 29.7}, {"symbol": "MSFT", "date": "2001-07-01T00:00:00", "price": 26.93}, {"symbol": "MSFT", "date": "2001-08-01T00:00:00", "price": 23.21}, {"symbol": "MSFT", "date": "2001-09-01T00:00:00", "price": 20.82}, {"symbol": "MSFT", "date": "2001-10-01T00:00:00", "price": 23.65}, {"symbol": "MSFT", "date": "2001-11-01T00:00:00", "price": 26.12}, {"symbol": "MSFT", "date": "2001-12-01T00:00:00", "price": 26.95}, {"symbol": "MSFT", "date": "2002-01-01T00:00:00", "price": 25.92}, {"symbol": "MSFT", "date": "2002-02-01T00:00:00", "price": 23.73}, {"symbol": "MSFT", "date": "2002-03-01T00:00:00", "price": 24.53}, {"symbol": "MSFT", "date": "2002-04-01T00:00:00", "price": 21.26}, {"symbol": "MSFT", "date": "2002-05-01T00:00:00", "price": 20.71}, {"symbol": "MSFT", "date": "2002-06-01T00:00:00", "price": 22.25}, {"symbol": "MSFT", "date": "2002-07-01T00:00:00", "price": 19.52}, {"symbol": "MSFT", "date": "2002-08-01T00:00:00", "price": 19.97}, {"symbol": "MSFT", "date": "2002-09-01T00:00:00", "price": 17.79}, {"symbol": "MSFT", "date": "2002-10-01T00:00:00", "price": 21.75}, {"symbol": "MSFT", "date": "2002-11-01T00:00:00", "price": 23.46}, {"symbol": "MSFT", "date": "2002-12-01T00:00:00", "price": 21.03}, {"symbol": "MSFT", "date": "2003-01-01T00:00:00", "price": 19.31}, {"symbol": "MSFT", "date": "2003-02-01T00:00:00", "price": 19.34}, {"symbol": "MSFT", "date": "2003-03-01T00:00:00", "price": 19.76}, {"symbol": "MSFT", "date": "2003-04-01T00:00:00", "price": 20.87}, {"symbol": "MSFT", "date": "2003-05-01T00:00:00", "price": 20.09}, {"symbol": "MSFT", "date": "2003-06-01T00:00:00", "price": 20.93}, {"symbol": "MSFT", "date": "2003-07-01T00:00:00", "price": 21.56}, {"symbol": "MSFT", "date": "2003-08-01T00:00:00", "price": 21.65}, {"symbol": "MSFT", "date": "2003-09-01T00:00:00", "price": 22.69}, {"symbol": "MSFT", "date": "2003-10-01T00:00:00", "price": 21.45}, {"symbol": "MSFT", "date": "2003-11-01T00:00:00", "price": 21.1}, {"symbol": "MSFT", "date": "2003-12-01T00:00:00", "price": 22.46}, {"symbol": "MSFT", "date": "2004-01-01T00:00:00", "price": 22.69}, {"symbol": "MSFT", "date": "2004-02-01T00:00:00", "price": 21.77}, {"symbol": "MSFT", "date": "2004-03-01T00:00:00", "price": 20.46}, {"symbol": "MSFT", "date": "2004-04-01T00:00:00", "price": 21.45}, {"symbol": "MSFT", "date": "2004-05-01T00:00:00", "price": 21.53}, {"symbol": "MSFT", "date": "2004-06-01T00:00:00", "price": 23.44}, {"symbol": "MSFT", "date": "2004-07-01T00:00:00", "price": 23.38}, {"symbol": "MSFT", "date": "2004-08-01T00:00:00", "price": 22.47}, {"symbol": "MSFT", "date": "2004-09-01T00:00:00", "price": 22.76}, {"symbol": "MSFT", "date": "2004-10-01T00:00:00", "price": 23.02}, {"symbol": "MSFT", "date": "2004-11-01T00:00:00", "price": 24.6}, {"symbol": "MSFT", "date": "2004-12-01T00:00:00", "price": 24.52}, {"symbol": "MSFT", "date": "2005-01-01T00:00:00", "price": 24.11}, {"symbol": "MSFT", "date": "2005-02-01T00:00:00", "price": 23.15}, {"symbol": "MSFT", "date": "2005-03-01T00:00:00", "price": 22.24}, {"symbol": "MSFT", "date": "2005-04-01T00:00:00", "price": 23.28}, {"symbol": "MSFT", "date": "2005-05-01T00:00:00", "price": 23.82}, {"symbol": "MSFT", "date": "2005-06-01T00:00:00", "price": 22.93}, {"symbol": "MSFT", "date": "2005-07-01T00:00:00", "price": 23.64}, {"symbol": "MSFT", "date": "2005-08-01T00:00:00", "price": 25.35}, {"symbol": "MSFT", "date": "2005-09-01T00:00:00", "price": 23.83}, {"symbol": "MSFT", "date": "2005-10-01T00:00:00", "price": 23.8}, {"symbol": "MSFT", "date": "2005-11-01T00:00:00", "price": 25.71}, {"symbol": "MSFT", "date": "2005-12-01T00:00:00", "price": 24.29}, {"symbol": "MSFT", "date": "2006-01-01T00:00:00", "price": 26.14}, {"symbol": "MSFT", "date": "2006-02-01T00:00:00", "price": 25.04}, {"symbol": "MSFT", "date": "2006-03-01T00:00:00", "price": 25.36}, {"symbol": "MSFT", "date": "2006-04-01T00:00:00", "price": 22.5}, {"symbol": "MSFT", "date": "2006-05-01T00:00:00", "price": 21.19}, {"symbol": "MSFT", "date": "2006-06-01T00:00:00", "price": 21.8}, {"symbol": "MSFT", "date": "2006-07-01T00:00:00", "price": 22.51}, {"symbol": "MSFT", "date": "2006-08-01T00:00:00", "price": 24.13}, {"symbol": "MSFT", "date": "2006-09-01T00:00:00", "price": 25.68}, {"symbol": "MSFT", "date": "2006-10-01T00:00:00", "price": 26.96}, {"symbol": "MSFT", "date": "2006-11-01T00:00:00", "price": 27.66}, {"symbol": "MSFT", "date": "2006-12-01T00:00:00", "price": 28.13}, {"symbol": "MSFT", "date": "2007-01-01T00:00:00", "price": 29.07}, {"symbol": "MSFT", "date": "2007-02-01T00:00:00", "price": 26.63}, {"symbol": "MSFT", "date": "2007-03-01T00:00:00", "price": 26.35}, {"symbol": "MSFT", "date": "2007-04-01T00:00:00", "price": 28.3}, {"symbol": "MSFT", "date": "2007-05-01T00:00:00", "price": 29.11}, {"symbol": "MSFT", "date": "2007-06-01T00:00:00", "price": 27.95}, {"symbol": "MSFT", "date": "2007-07-01T00:00:00", "price": 27.5}, {"symbol": "MSFT", "date": "2007-08-01T00:00:00", "price": 27.34}, {"symbol": "MSFT", "date": "2007-09-01T00:00:00", "price": 28.04}, {"symbol": "MSFT", "date": "2007-10-01T00:00:00", "price": 35.03}, {"symbol": "MSFT", "date": "2007-11-01T00:00:00", "price": 32.09}, {"symbol": "MSFT", "date": "2007-12-01T00:00:00", "price": 34.0}, {"symbol": "MSFT", "date": "2008-01-01T00:00:00", "price": 31.13}, {"symbol": "MSFT", "date": "2008-02-01T00:00:00", "price": 26.07}, {"symbol": "MSFT", "date": "2008-03-01T00:00:00", "price": 27.21}, {"symbol": "MSFT", "date": "2008-04-01T00:00:00", "price": 27.34}, {"symbol": "MSFT", "date": "2008-05-01T00:00:00", "price": 27.25}, {"symbol": "MSFT", "date": "2008-06-01T00:00:00", "price": 26.47}, {"symbol": "MSFT", "date": "2008-07-01T00:00:00", "price": 24.75}, {"symbol": "MSFT", "date": "2008-08-01T00:00:00", "price": 26.36}, {"symbol": "MSFT", "date": "2008-09-01T00:00:00", "price": 25.78}, {"symbol": "MSFT", "date": "2008-10-01T00:00:00", "price": 21.57}, {"symbol": "MSFT", "date": "2008-11-01T00:00:00", "price": 19.66}, {"symbol": "MSFT", "date": "2008-12-01T00:00:00", "price": 18.91}, {"symbol": "MSFT", "date": "2009-01-01T00:00:00", "price": 16.63}, {"symbol": "MSFT", "date": "2009-02-01T00:00:00", "price": 15.81}, {"symbol": "MSFT", "date": "2009-03-01T00:00:00", "price": 17.99}, {"symbol": "MSFT", "date": "2009-04-01T00:00:00", "price": 19.84}, {"symbol": "MSFT", "date": "2009-05-01T00:00:00", "price": 20.59}, {"symbol": "MSFT", "date": "2009-06-01T00:00:00", "price": 23.42}, {"symbol": "MSFT", "date": "2009-07-01T00:00:00", "price": 23.18}, {"symbol": "MSFT", "date": "2009-08-01T00:00:00", "price": 24.43}, {"symbol": "MSFT", "date": "2009-09-01T00:00:00", "price": 25.49}, {"symbol": "MSFT", "date": "2009-10-01T00:00:00", "price": 27.48}, {"symbol": "MSFT", "date": "2009-11-01T00:00:00", "price": 29.27}, {"symbol": "MSFT", "date": "2009-12-01T00:00:00", "price": 30.34}, {"symbol": "MSFT", "date": "2010-01-01T00:00:00", "price": 28.05}, {"symbol": "MSFT", "date": "2010-02-01T00:00:00", "price": 28.67}, {"symbol": "MSFT", "date": "2010-03-01T00:00:00", "price": 28.8}, {"symbol": "AMZN", "date": "2000-01-01T00:00:00", "price": 64.56}, {"symbol": "AMZN", "date": "2000-02-01T00:00:00", "price": 68.87}, {"symbol": "AMZN", "date": "2000-03-01T00:00:00", "price": 67.0}, {"symbol": "AMZN", "date": "2000-04-01T00:00:00", "price": 55.19}, {"symbol": "AMZN", "date": "2000-05-01T00:00:00", "price": 48.31}, {"symbol": "AMZN", "date": "2000-06-01T00:00:00", "price": 36.31}, {"symbol": "AMZN", "date": "2000-07-01T00:00:00", "price": 30.12}, {"symbol": "AMZN", "date": "2000-08-01T00:00:00", "price": 41.5}, {"symbol": "AMZN", "date": "2000-09-01T00:00:00", "price": 38.44}, {"symbol": "AMZN", "date": "2000-10-01T00:00:00", "price": 36.62}, {"symbol": "AMZN", "date": "2000-11-01T00:00:00", "price": 24.69}, {"symbol": "AMZN", "date": "2000-12-01T00:00:00", "price": 15.56}, {"symbol": "AMZN", "date": "2001-01-01T00:00:00", "price": 17.31}, {"symbol": "AMZN", "date": "2001-02-01T00:00:00", "price": 10.19}, {"symbol": "AMZN", "date": "2001-03-01T00:00:00", "price": 10.23}, {"symbol": "AMZN", "date": "2001-04-01T00:00:00", "price": 15.78}, {"symbol": "AMZN", "date": "2001-05-01T00:00:00", "price": 16.69}, {"symbol": "AMZN", "date": "2001-06-01T00:00:00", "price": 14.15}, {"symbol": "AMZN", "date": "2001-07-01T00:00:00", "price": 12.49}, {"symbol": "AMZN", "date": "2001-08-01T00:00:00", "price": 8.94}, {"symbol": "AMZN", "date": "2001-09-01T00:00:00", "price": 5.97}, {"symbol": "AMZN", "date": "2001-10-01T00:00:00", "price": 6.98}, {"symbol": "AMZN", "date": "2001-11-01T00:00:00", "price": 11.32}, {"symbol": "AMZN", "date": "2001-12-01T00:00:00", "price": 10.82}, {"symbol": "AMZN", "date": "2002-01-01T00:00:00", "price": 14.19}, {"symbol": "AMZN", "date": "2002-02-01T00:00:00", "price": 14.1}, {"symbol": "AMZN", "date": "2002-03-01T00:00:00", "price": 14.3}, {"symbol": "AMZN", "date": "2002-04-01T00:00:00", "price": 16.69}, {"symbol": "AMZN", "date": "2002-05-01T00:00:00", "price": 18.23}, {"symbol": "AMZN", "date": "2002-06-01T00:00:00", "price": 16.25}, {"symbol": "AMZN", "date": "2002-07-01T00:00:00", "price": 14.45}, {"symbol": "AMZN", "date": "2002-08-01T00:00:00", "price": 14.94}, {"symbol": "AMZN", "date": "2002-09-01T00:00:00", "price": 15.93}, {"symbol": "AMZN", "date": "2002-10-01T00:00:00", "price": 19.36}, {"symbol": "AMZN", "date": "2002-11-01T00:00:00", "price": 23.35}, {"symbol": "AMZN", "date": "2002-12-01T00:00:00", "price": 18.89}, {"symbol": "AMZN", "date": "2003-01-01T00:00:00", "price": 21.85}, {"symbol": "AMZN", "date": "2003-02-01T00:00:00", "price": 22.01}, {"symbol": "AMZN", "date": "2003-03-01T00:00:00", "price": 26.03}, {"symbol": "AMZN", "date": "2003-04-01T00:00:00", "price": 28.69}, {"symbol": "AMZN", "date": "2003-05-01T00:00:00", "price": 35.89}, {"symbol": "AMZN", "date": "2003-06-01T00:00:00", "price": 36.32}, {"symbol": "AMZN", "date": "2003-07-01T00:00:00", "price": 41.64}, {"symbol": "AMZN", "date": "2003-08-01T00:00:00", "price": 46.32}, {"symbol": "AMZN", "date": "2003-09-01T00:00:00", "price": 48.43}, {"symbol": "AMZN", "date": "2003-10-01T00:00:00", "price": 54.43}, {"symbol": "AMZN", "date": "2003-11-01T00:00:00", "price": 53.97}, {"symbol": "AMZN", "date": "2003-12-01T00:00:00", "price": 52.62}, {"symbol": "AMZN", "date": "2004-01-01T00:00:00", "price": 50.4}, {"symbol": "AMZN", "date": "2004-02-01T00:00:00", "price": 43.01}, {"symbol": "AMZN", "date": "2004-03-01T00:00:00", "price": 43.28}, {"symbol": "AMZN", "date": "2004-04-01T00:00:00", "price": 43.6}, {"symbol": "AMZN", "date": "2004-05-01T00:00:00", "price": 48.5}, {"symbol": "AMZN", "date": "2004-06-01T00:00:00", "price": 54.4}, {"symbol": "AMZN", "date": "2004-07-01T00:00:00", "price": 38.92}, {"symbol": "AMZN", "date": "2004-08-01T00:00:00", "price": 38.14}, {"symbol": "AMZN", "date": "2004-09-01T00:00:00", "price": 40.86}, {"symbol": "AMZN", "date": "2004-10-01T00:00:00", "price": 34.13}, {"symbol": "AMZN", "date": "2004-11-01T00:00:00", "price": 39.68}, {"symbol": "AMZN", "date": "2004-12-01T00:00:00", "price": 44.29}, {"symbol": "AMZN", "date": "2005-01-01T00:00:00", "price": 43.22}, {"symbol": "AMZN", "date": "2005-02-01T00:00:00", "price": 35.18}, {"symbol": "AMZN", "date": "2005-03-01T00:00:00", "price": 34.27}, {"symbol": "AMZN", "date": "2005-04-01T00:00:00", "price": 32.36}, {"symbol": "AMZN", "date": "2005-05-01T00:00:00", "price": 35.51}, {"symbol": "AMZN", "date": "2005-06-01T00:00:00", "price": 33.09}, {"symbol": "AMZN", "date": "2005-07-01T00:00:00", "price": 45.15}, {"symbol": "AMZN", "date": "2005-08-01T00:00:00", "price": 42.7}, {"symbol": "AMZN", "date": "2005-09-01T00:00:00", "price": 45.3}, {"symbol": "AMZN", "date": "2005-10-01T00:00:00", "price": 39.86}, {"symbol": "AMZN", "date": "2005-11-01T00:00:00", "price": 48.46}, {"symbol": "AMZN", "date": "2005-12-01T00:00:00", "price": 47.15}, {"symbol": "AMZN", "date": "2006-01-01T00:00:00", "price": 44.82}, {"symbol": "AMZN", "date": "2006-02-01T00:00:00", "price": 37.44}, {"symbol": "AMZN", "date": "2006-03-01T00:00:00", "price": 36.53}, {"symbol": "AMZN", "date": "2006-04-01T00:00:00", "price": 35.21}, {"symbol": "AMZN", "date": "2006-05-01T00:00:00", "price": 34.61}, {"symbol": "AMZN", "date": "2006-06-01T00:00:00", "price": 38.68}, {"symbol": "AMZN", "date": "2006-07-01T00:00:00", "price": 26.89}, {"symbol": "AMZN", "date": "2006-08-01T00:00:00", "price": 30.83}, {"symbol": "AMZN", "date": "2006-09-01T00:00:00", "price": 32.12}, {"symbol": "AMZN", "date": "2006-10-01T00:00:00", "price": 38.09}, {"symbol": "AMZN", "date": "2006-11-01T00:00:00", "price": 40.34}, {"symbol": "AMZN", "date": "2006-12-01T00:00:00", "price": 39.46}, {"symbol": "AMZN", "date": "2007-01-01T00:00:00", "price": 37.67}, {"symbol": "AMZN", "date": "2007-02-01T00:00:00", "price": 39.14}, {"symbol": "AMZN", "date": "2007-03-01T00:00:00", "price": 39.79}, {"symbol": "AMZN", "date": "2007-04-01T00:00:00", "price": 61.33}, {"symbol": "AMZN", "date": "2007-05-01T00:00:00", "price": 69.14}, {"symbol": "AMZN", "date": "2007-06-01T00:00:00", "price": 68.41}, {"symbol": "AMZN", "date": "2007-07-01T00:00:00", "price": 78.54}, {"symbol": "AMZN", "date": "2007-08-01T00:00:00", "price": 79.91}, {"symbol": "AMZN", "date": "2007-09-01T00:00:00", "price": 93.15}, {"symbol": "AMZN", "date": "2007-10-01T00:00:00", "price": 89.15}, {"symbol": "AMZN", "date": "2007-11-01T00:00:00", "price": 90.56}, {"symbol": "AMZN", "date": "2007-12-01T00:00:00", "price": 92.64}, {"symbol": "AMZN", "date": "2008-01-01T00:00:00", "price": 77.7}, {"symbol": "AMZN", "date": "2008-02-01T00:00:00", "price": 64.47}, {"symbol": "AMZN", "date": "2008-03-01T00:00:00", "price": 71.3}, {"symbol": "AMZN", "date": "2008-04-01T00:00:00", "price": 78.63}, {"symbol": "AMZN", "date": "2008-05-01T00:00:00", "price": 81.62}, {"symbol": "AMZN", "date": "2008-06-01T00:00:00", "price": 73.33}, {"symbol": "AMZN", "date": "2008-07-01T00:00:00", "price": 76.34}, {"symbol": "AMZN", "date": "2008-08-01T00:00:00", "price": 80.81}, {"symbol": "AMZN", "date": "2008-09-01T00:00:00", "price": 72.76}, {"symbol": "AMZN", "date": "2008-10-01T00:00:00", "price": 57.24}, {"symbol": "AMZN", "date": "2008-11-01T00:00:00", "price": 42.7}, {"symbol": "AMZN", "date": "2008-12-01T00:00:00", "price": 51.28}, {"symbol": "AMZN", "date": "2009-01-01T00:00:00", "price": 58.82}, {"symbol": "AMZN", "date": "2009-02-01T00:00:00", "price": 64.79}, {"symbol": "AMZN", "date": "2009-03-01T00:00:00", "price": 73.44}, {"symbol": "AMZN", "date": "2009-04-01T00:00:00", "price": 80.52}, {"symbol": "AMZN", "date": "2009-05-01T00:00:00", "price": 77.99}, {"symbol": "AMZN", "date": "2009-06-01T00:00:00", "price": 83.66}, {"symbol": "AMZN", "date": "2009-07-01T00:00:00", "price": 85.76}, {"symbol": "AMZN", "date": "2009-08-01T00:00:00", "price": 81.19}, {"symbol": "AMZN", "date": "2009-09-01T00:00:00", "price": 93.36}, {"symbol": "AMZN", "date": "2009-10-01T00:00:00", "price": 118.81}, {"symbol": "AMZN", "date": "2009-11-01T00:00:00", "price": 135.91}, {"symbol": "AMZN", "date": "2009-12-01T00:00:00", "price": 134.52}, {"symbol": "AMZN", "date": "2010-01-01T00:00:00", "price": 125.41}, {"symbol": "AMZN", "date": "2010-02-01T00:00:00", "price": 118.4}, {"symbol": "AMZN", "date": "2010-03-01T00:00:00", "price": 128.82}, {"symbol": "IBM", "date": "2000-01-01T00:00:00", "price": 100.52}, {"symbol": "IBM", "date": "2000-02-01T00:00:00", "price": 92.11}, {"symbol": "IBM", "date": "2000-03-01T00:00:00", "price": 106.11}, {"symbol": "IBM", "date": "2000-04-01T00:00:00", "price": 99.95}, {"symbol": "IBM", "date": "2000-05-01T00:00:00", "price": 96.31}, {"symbol": "IBM", "date": "2000-06-01T00:00:00", "price": 98.33}, {"symbol": "IBM", "date": "2000-07-01T00:00:00", "price": 100.74}, {"symbol": "IBM", "date": "2000-08-01T00:00:00", "price": 118.62}, {"symbol": "IBM", "date": "2000-09-01T00:00:00", "price": 101.19}, {"symbol": "IBM", "date": "2000-10-01T00:00:00", "price": 88.5}, {"symbol": "IBM", "date": "2000-11-01T00:00:00", "price": 84.12}, {"symbol": "IBM", "date": "2000-12-01T00:00:00", "price": 76.47}, {"symbol": "IBM", "date": "2001-01-01T00:00:00", "price": 100.76}, {"symbol": "IBM", "date": "2001-02-01T00:00:00", "price": 89.98}, {"symbol": "IBM", "date": "2001-03-01T00:00:00", "price": 86.63}, {"symbol": "IBM", "date": "2001-04-01T00:00:00", "price": 103.7}, {"symbol": "IBM", "date": "2001-05-01T00:00:00", "price": 100.82}, {"symbol": "IBM", "date": "2001-06-01T00:00:00", "price": 102.35}, {"symbol": "IBM", "date": "2001-07-01T00:00:00", "price": 94.87}, {"symbol": "IBM", "date": "2001-08-01T00:00:00", "price": 90.25}, {"symbol": "IBM", "date": "2001-09-01T00:00:00", "price": 82.82}, {"symbol": "IBM", "date": "2001-10-01T00:00:00", "price": 97.58}, {"symbol": "IBM", "date": "2001-11-01T00:00:00", "price": 104.5}, {"symbol": "IBM", "date": "2001-12-01T00:00:00", "price": 109.36}, {"symbol": "IBM", "date": "2002-01-01T00:00:00", "price": 97.54}, {"symbol": "IBM", "date": "2002-02-01T00:00:00", "price": 88.82}, {"symbol": "IBM", "date": "2002-03-01T00:00:00", "price": 94.15}, {"symbol": "IBM", "date": "2002-04-01T00:00:00", "price": 75.82}, {"symbol": "IBM", "date": "2002-05-01T00:00:00", "price": 72.97}, {"symbol": "IBM", "date": "2002-06-01T00:00:00", "price": 65.31}, {"symbol": "IBM", "date": "2002-07-01T00:00:00", "price": 63.86}, {"symbol": "IBM", "date": "2002-08-01T00:00:00", "price": 68.52}, {"symbol": "IBM", "date": "2002-09-01T00:00:00", "price": 53.01}, {"symbol": "IBM", "date": "2002-10-01T00:00:00", "price": 71.76}, {"symbol": "IBM", "date": "2002-11-01T00:00:00", "price": 79.16}, {"symbol": "IBM", "date": "2002-12-01T00:00:00", "price": 70.58}, {"symbol": "IBM", "date": "2003-01-01T00:00:00", "price": 71.22}, {"symbol": "IBM", "date": "2003-02-01T00:00:00", "price": 71.13}, {"symbol": "IBM", "date": "2003-03-01T00:00:00", "price": 71.57}, {"symbol": "IBM", "date": "2003-04-01T00:00:00", "price": 77.47}, {"symbol": "IBM", "date": "2003-05-01T00:00:00", "price": 80.48}, {"symbol": "IBM", "date": "2003-06-01T00:00:00", "price": 75.42}, {"symbol": "IBM", "date": "2003-07-01T00:00:00", "price": 74.28}, {"symbol": "IBM", "date": "2003-08-01T00:00:00", "price": 75.12}, {"symbol": "IBM", "date": "2003-09-01T00:00:00", "price": 80.91}, {"symbol": "IBM", "date": "2003-10-01T00:00:00", "price": 81.96}, {"symbol": "IBM", "date": "2003-11-01T00:00:00", "price": 83.08}, {"symbol": "IBM", "date": "2003-12-01T00:00:00", "price": 85.05}, {"symbol": "IBM", "date": "2004-01-01T00:00:00", "price": 91.06}, {"symbol": "IBM", "date": "2004-02-01T00:00:00", "price": 88.7}, {"symbol": "IBM", "date": "2004-03-01T00:00:00", "price": 84.41}, {"symbol": "IBM", "date": "2004-04-01T00:00:00", "price": 81.04}, {"symbol": "IBM", "date": "2004-05-01T00:00:00", "price": 81.59}, {"symbol": "IBM", "date": "2004-06-01T00:00:00", "price": 81.19}, {"symbol": "IBM", "date": "2004-07-01T00:00:00", "price": 80.19}, {"symbol": "IBM", "date": "2004-08-01T00:00:00", "price": 78.17}, {"symbol": "IBM", "date": "2004-09-01T00:00:00", "price": 79.13}, {"symbol": "IBM", "date": "2004-10-01T00:00:00", "price": 82.84}, {"symbol": "IBM", "date": "2004-11-01T00:00:00", "price": 87.15}, {"symbol": "IBM", "date": "2004-12-01T00:00:00", "price": 91.16}, {"symbol": "IBM", "date": "2005-01-01T00:00:00", "price": 86.39}, {"symbol": "IBM", "date": "2005-02-01T00:00:00", "price": 85.78}, {"symbol": "IBM", "date": "2005-03-01T00:00:00", "price": 84.66}, {"symbol": "IBM", "date": "2005-04-01T00:00:00", "price": 70.77}, {"symbol": "IBM", "date": "2005-05-01T00:00:00", "price": 70.18}, {"symbol": "IBM", "date": "2005-06-01T00:00:00", "price": 68.93}, {"symbol": "IBM", "date": "2005-07-01T00:00:00", "price": 77.53}, {"symbol": "IBM", "date": "2005-08-01T00:00:00", "price": 75.07}, {"symbol": "IBM", "date": "2005-09-01T00:00:00", "price": 74.7}, {"symbol": "IBM", "date": "2005-10-01T00:00:00", "price": 76.25}, {"symbol": "IBM", "date": "2005-11-01T00:00:00", "price": 82.98}, {"symbol": "IBM", "date": "2005-12-01T00:00:00", "price": 76.73}, {"symbol": "IBM", "date": "2006-01-01T00:00:00", "price": 75.89}, {"symbol": "IBM", "date": "2006-02-01T00:00:00", "price": 75.09}, {"symbol": "IBM", "date": "2006-03-01T00:00:00", "price": 77.17}, {"symbol": "IBM", "date": "2006-04-01T00:00:00", "price": 77.05}, {"symbol": "IBM", "date": "2006-05-01T00:00:00", "price": 75.04}, {"symbol": "IBM", "date": "2006-06-01T00:00:00", "price": 72.15}, {"symbol": "IBM", "date": "2006-07-01T00:00:00", "price": 72.7}, {"symbol": "IBM", "date": "2006-08-01T00:00:00", "price": 76.35}, {"symbol": "IBM", "date": "2006-09-01T00:00:00", "price": 77.26}, {"symbol": "IBM", "date": "2006-10-01T00:00:00", "price": 87.06}, {"symbol": "IBM", "date": "2006-11-01T00:00:00", "price": 86.95}, {"symbol": "IBM", "date": "2006-12-01T00:00:00", "price": 91.9}, {"symbol": "IBM", "date": "2007-01-01T00:00:00", "price": 93.79}, {"symbol": "IBM", "date": "2007-02-01T00:00:00", "price": 88.18}, {"symbol": "IBM", "date": "2007-03-01T00:00:00", "price": 89.44}, {"symbol": "IBM", "date": "2007-04-01T00:00:00", "price": 96.98}, {"symbol": "IBM", "date": "2007-05-01T00:00:00", "price": 101.54}, {"symbol": "IBM", "date": "2007-06-01T00:00:00", "price": 100.25}, {"symbol": "IBM", "date": "2007-07-01T00:00:00", "price": 105.4}, {"symbol": "IBM", "date": "2007-08-01T00:00:00", "price": 111.54}, {"symbol": "IBM", "date": "2007-09-01T00:00:00", "price": 112.6}, {"symbol": "IBM", "date": "2007-10-01T00:00:00", "price": 111.0}, {"symbol": "IBM", "date": "2007-11-01T00:00:00", "price": 100.9}, {"symbol": "IBM", "date": "2007-12-01T00:00:00", "price": 103.7}, {"symbol": "IBM", "date": "2008-01-01T00:00:00", "price": 102.75}, {"symbol": "IBM", "date": "2008-02-01T00:00:00", "price": 109.64}, {"symbol": "IBM", "date": "2008-03-01T00:00:00", "price": 110.87}, {"symbol": "IBM", "date": "2008-04-01T00:00:00", "price": 116.23}, {"symbol": "IBM", "date": "2008-05-01T00:00:00", "price": 125.14}, {"symbol": "IBM", "date": "2008-06-01T00:00:00", "price": 114.6}, {"symbol": "IBM", "date": "2008-07-01T00:00:00", "price": 123.74}, {"symbol": "IBM", "date": "2008-08-01T00:00:00", "price": 118.16}, {"symbol": "IBM", "date": "2008-09-01T00:00:00", "price": 113.53}, {"symbol": "IBM", "date": "2008-10-01T00:00:00", "price": 90.24}, {"symbol": "IBM", "date": "2008-11-01T00:00:00", "price": 79.65}, {"symbol": "IBM", "date": "2008-12-01T00:00:00", "price": 82.15}, {"symbol": "IBM", "date": "2009-01-01T00:00:00", "price": 89.46}, {"symbol": "IBM", "date": "2009-02-01T00:00:00", "price": 90.32}, {"symbol": "IBM", "date": "2009-03-01T00:00:00", "price": 95.09}, {"symbol": "IBM", "date": "2009-04-01T00:00:00", "price": 101.29}, {"symbol": "IBM", "date": "2009-05-01T00:00:00", "price": 104.85}, {"symbol": "IBM", "date": "2009-06-01T00:00:00", "price": 103.01}, {"symbol": "IBM", "date": "2009-07-01T00:00:00", "price": 116.34}, {"symbol": "IBM", "date": "2009-08-01T00:00:00", "price": 117.0}, {"symbol": "IBM", "date": "2009-09-01T00:00:00", "price": 118.55}, {"symbol": "IBM", "date": "2009-10-01T00:00:00", "price": 119.54}, {"symbol": "IBM", "date": "2009-11-01T00:00:00", "price": 125.79}, {"symbol": "IBM", "date": "2009-12-01T00:00:00", "price": 130.32}, {"symbol": "IBM", "date": "2010-01-01T00:00:00", "price": 121.85}, {"symbol": "IBM", "date": "2010-02-01T00:00:00", "price": 127.16}, {"symbol": "IBM", "date": "2010-03-01T00:00:00", "price": 125.55}, {"symbol": "GOOG", "date": "2004-08-01T00:00:00", "price": 102.37}, {"symbol": "GOOG", "date": "2004-09-01T00:00:00", "price": 129.6}, {"symbol": "GOOG", "date": "2004-10-01T00:00:00", "price": 190.64}, {"symbol": "GOOG", "date": "2004-11-01T00:00:00", "price": 181.98}, {"symbol": "GOOG", "date": "2004-12-01T00:00:00", "price": 192.79}, {"symbol": "GOOG", "date": "2005-01-01T00:00:00", "price": 195.62}, {"symbol": "GOOG", "date": "2005-02-01T00:00:00", "price": 187.99}, {"symbol": "GOOG", "date": "2005-03-01T00:00:00", "price": 180.51}, {"symbol": "GOOG", "date": "2005-04-01T00:00:00", "price": 220.0}, {"symbol": "GOOG", "date": "2005-05-01T00:00:00", "price": 277.27}, {"symbol": "GOOG", "date": "2005-06-01T00:00:00", "price": 294.15}, {"symbol": "GOOG", "date": "2005-07-01T00:00:00", "price": 287.76}, {"symbol": "GOOG", "date": "2005-08-01T00:00:00", "price": 286.0}, {"symbol": "GOOG", "date": "2005-09-01T00:00:00", "price": 316.46}, {"symbol": "GOOG", "date": "2005-10-01T00:00:00", "price": 372.14}, {"symbol": "GOOG", "date": "2005-11-01T00:00:00", "price": 404.91}, {"symbol": "GOOG", "date": "2005-12-01T00:00:00", "price": 414.86}, {"symbol": "GOOG", "date": "2006-01-01T00:00:00", "price": 432.66}, {"symbol": "GOOG", "date": "2006-02-01T00:00:00", "price": 362.62}, {"symbol": "GOOG", "date": "2006-03-01T00:00:00", "price": 390.0}, {"symbol": "GOOG", "date": "2006-04-01T00:00:00", "price": 417.94}, {"symbol": "GOOG", "date": "2006-05-01T00:00:00", "price": 371.82}, {"symbol": "GOOG", "date": "2006-06-01T00:00:00", "price": 419.33}, {"symbol": "GOOG", "date": "2006-07-01T00:00:00", "price": 386.6}, {"symbol": "GOOG", "date": "2006-08-01T00:00:00", "price": 378.53}, {"symbol": "GOOG", "date": "2006-09-01T00:00:00", "price": 401.9}, {"symbol": "GOOG", "date": "2006-10-01T00:00:00", "price": 476.39}, {"symbol": "GOOG", "date": "2006-11-01T00:00:00", "price": 484.81}, {"symbol": "GOOG", "date": "2006-12-01T00:00:00", "price": 460.48}, {"symbol": "GOOG", "date": "2007-01-01T00:00:00", "price": 501.5}, {"symbol": "GOOG", "date": "2007-02-01T00:00:00", "price": 449.45}, {"symbol": "GOOG", "date": "2007-03-01T00:00:00", "price": 458.16}, {"symbol": "GOOG", "date": "2007-04-01T00:00:00", "price": 471.38}, {"symbol": "GOOG", "date": "2007-05-01T00:00:00", "price": 497.91}, {"symbol": "GOOG", "date": "2007-06-01T00:00:00", "price": 522.7}, {"symbol": "GOOG", "date": "2007-07-01T00:00:00", "price": 510.0}, {"symbol": "GOOG", "date": "2007-08-01T00:00:00", "price": 515.25}, {"symbol": "GOOG", "date": "2007-09-01T00:00:00", "price": 567.27}, {"symbol": "GOOG", "date": "2007-10-01T00:00:00", "price": 707.0}, {"symbol": "GOOG", "date": "2007-11-01T00:00:00", "price": 693.0}, {"symbol": "GOOG", "date": "2007-12-01T00:00:00", "price": 691.48}, {"symbol": "GOOG", "date": "2008-01-01T00:00:00", "price": 564.3}, {"symbol": "GOOG", "date": "2008-02-01T00:00:00", "price": 471.18}, {"symbol": "GOOG", "date": "2008-03-01T00:00:00", "price": 440.47}, {"symbol": "GOOG", "date": "2008-04-01T00:00:00", "price": 574.29}, {"symbol": "GOOG", "date": "2008-05-01T00:00:00", "price": 585.8}, {"symbol": "GOOG", "date": "2008-06-01T00:00:00", "price": 526.42}, {"symbol": "GOOG", "date": "2008-07-01T00:00:00", "price": 473.75}, {"symbol": "GOOG", "date": "2008-08-01T00:00:00", "price": 463.29}, {"symbol": "GOOG", "date": "2008-09-01T00:00:00", "price": 400.52}, {"symbol": "GOOG", "date": "2008-10-01T00:00:00", "price": 359.36}, {"symbol": "GOOG", "date": "2008-11-01T00:00:00", "price": 292.96}, {"symbol": "GOOG", "date": "2008-12-01T00:00:00", "price": 307.65}, {"symbol": "GOOG", "date": "2009-01-01T00:00:00", "price": 338.53}, {"symbol": "GOOG", "date": "2009-02-01T00:00:00", "price": 337.99}, {"symbol": "GOOG", "date": "2009-03-01T00:00:00", "price": 348.06}, {"symbol": "GOOG", "date": "2009-04-01T00:00:00", "price": 395.97}, {"symbol": "GOOG", "date": "2009-05-01T00:00:00", "price": 417.23}, {"symbol": "GOOG", "date": "2009-06-01T00:00:00", "price": 421.59}, {"symbol": "GOOG", "date": "2009-07-01T00:00:00", "price": 443.05}, {"symbol": "GOOG", "date": "2009-08-01T00:00:00", "price": 461.67}, {"symbol": "GOOG", "date": "2009-09-01T00:00:00", "price": 495.85}, {"symbol": "GOOG", "date": "2009-10-01T00:00:00", "price": 536.12}, {"symbol": "GOOG", "date": "2009-11-01T00:00:00", "price": 583.0}, {"symbol": "GOOG", "date": "2009-12-01T00:00:00", "price": 619.98}, {"symbol": "GOOG", "date": "2010-01-01T00:00:00", "price": 529.94}, {"symbol": "GOOG", "date": "2010-02-01T00:00:00", "price": 526.8}, {"symbol": "GOOG", "date": "2010-03-01T00:00:00", "price": 560.19}, {"symbol": "AAPL", "date": "2000-01-01T00:00:00", "price": 25.94}, {"symbol": "AAPL", "date": "2000-02-01T00:00:00", "price": 28.66}, {"symbol": "AAPL", "date": "2000-03-01T00:00:00", "price": 33.95}, {"symbol": "AAPL", "date": "2000-04-01T00:00:00", "price": 31.01}, {"symbol": "AAPL", "date": "2000-05-01T00:00:00", "price": 21.0}, {"symbol": "AAPL", "date": "2000-06-01T00:00:00", "price": 26.19}, {"symbol": "AAPL", "date": "2000-07-01T00:00:00", "price": 25.41}, {"symbol": "AAPL", "date": "2000-08-01T00:00:00", "price": 30.47}, {"symbol": "AAPL", "date": "2000-09-01T00:00:00", "price": 12.88}, {"symbol": "AAPL", "date": "2000-10-01T00:00:00", "price": 9.78}, {"symbol": "AAPL", "date": "2000-11-01T00:00:00", "price": 8.25}, {"symbol": "AAPL", "date": "2000-12-01T00:00:00", "price": 7.44}, {"symbol": "AAPL", "date": "2001-01-01T00:00:00", "price": 10.81}, {"symbol": "AAPL", "date": "2001-02-01T00:00:00", "price": 9.12}, {"symbol": "AAPL", "date": "2001-03-01T00:00:00", "price": 11.03}, {"symbol": "AAPL", "date": "2001-04-01T00:00:00", "price": 12.74}, {"symbol": "AAPL", "date": "2001-05-01T00:00:00", "price": 9.98}, {"symbol": "AAPL", "date": "2001-06-01T00:00:00", "price": 11.62}, {"symbol": "AAPL", "date": "2001-07-01T00:00:00", "price": 9.4}, {"symbol": "AAPL", "date": "2001-08-01T00:00:00", "price": 9.27}, {"symbol": "AAPL", "date": "2001-09-01T00:00:00", "price": 7.76}, {"symbol": "AAPL", "date": "2001-10-01T00:00:00", "price": 8.78}, {"symbol": "AAPL", "date": "2001-11-01T00:00:00", "price": 10.65}, {"symbol": "AAPL", "date": "2001-12-01T00:00:00", "price": 10.95}, {"symbol": "AAPL", "date": "2002-01-01T00:00:00", "price": 12.36}, {"symbol": "AAPL", "date": "2002-02-01T00:00:00", "price": 10.85}, {"symbol": "AAPL", "date": "2002-03-01T00:00:00", "price": 11.84}, {"symbol": "AAPL", "date": "2002-04-01T00:00:00", "price": 12.14}, {"symbol": "AAPL", "date": "2002-05-01T00:00:00", "price": 11.65}, {"symbol": "AAPL", "date": "2002-06-01T00:00:00", "price": 8.86}, {"symbol": "AAPL", "date": "2002-07-01T00:00:00", "price": 7.63}, {"symbol": "AAPL", "date": "2002-08-01T00:00:00", "price": 7.38}, {"symbol": "AAPL", "date": "2002-09-01T00:00:00", "price": 7.25}, {"symbol": "AAPL", "date": "2002-10-01T00:00:00", "price": 8.03}, {"symbol": "AAPL", "date": "2002-11-01T00:00:00", "price": 7.75}, {"symbol": "AAPL", "date": "2002-12-01T00:00:00", "price": 7.16}, {"symbol": "AAPL", "date": "2003-01-01T00:00:00", "price": 7.18}, {"symbol": "AAPL", "date": "2003-02-01T00:00:00", "price": 7.51}, {"symbol": "AAPL", "date": "2003-03-01T00:00:00", "price": 7.07}, {"symbol": "AAPL", "date": "2003-04-01T00:00:00", "price": 7.11}, {"symbol": "AAPL", "date": "2003-05-01T00:00:00", "price": 8.98}, {"symbol": "AAPL", "date": "2003-06-01T00:00:00", "price": 9.53}, {"symbol": "AAPL", "date": "2003-07-01T00:00:00", "price": 10.54}, {"symbol": "AAPL", "date": "2003-08-01T00:00:00", "price": 11.31}, {"symbol": "AAPL", "date": "2003-09-01T00:00:00", "price": 10.36}, {"symbol": "AAPL", "date": "2003-10-01T00:00:00", "price": 11.44}, {"symbol": "AAPL", "date": "2003-11-01T00:00:00", "price": 10.45}, {"symbol": "AAPL", "date": "2003-12-01T00:00:00", "price": 10.69}, {"symbol": "AAPL", "date": "2004-01-01T00:00:00", "price": 11.28}, {"symbol": "AAPL", "date": "2004-02-01T00:00:00", "price": 11.96}, {"symbol": "AAPL", "date": "2004-03-01T00:00:00", "price": 13.52}, {"symbol": "AAPL", "date": "2004-04-01T00:00:00", "price": 12.89}, {"symbol": "AAPL", "date": "2004-05-01T00:00:00", "price": 14.03}, {"symbol": "AAPL", "date": "2004-06-01T00:00:00", "price": 16.27}, {"symbol": "AAPL", "date": "2004-07-01T00:00:00", "price": 16.17}, {"symbol": "AAPL", "date": "2004-08-01T00:00:00", "price": 17.25}, {"symbol": "AAPL", "date": "2004-09-01T00:00:00", "price": 19.38}, {"symbol": "AAPL", "date": "2004-10-01T00:00:00", "price": 26.2}, {"symbol": "AAPL", "date": "2004-11-01T00:00:00", "price": 33.53}, {"symbol": "AAPL", "date": "2004-12-01T00:00:00", "price": 32.2}, {"symbol": "AAPL", "date": "2005-01-01T00:00:00", "price": 38.45}, {"symbol": "AAPL", "date": "2005-02-01T00:00:00", "price": 44.86}, {"symbol": "AAPL", "date": "2005-03-01T00:00:00", "price": 41.67}, {"symbol": "AAPL", "date": "2005-04-01T00:00:00", "price": 36.06}, {"symbol": "AAPL", "date": "2005-05-01T00:00:00", "price": 39.76}, {"symbol": "AAPL", "date": "2005-06-01T00:00:00", "price": 36.81}, {"symbol": "AAPL", "date": "2005-07-01T00:00:00", "price": 42.65}, {"symbol": "AAPL", "date": "2005-08-01T00:00:00", "price": 46.89}, {"symbol": "AAPL", "date": "2005-09-01T00:00:00", "price": 53.61}, {"symbol": "AAPL", "date": "2005-10-01T00:00:00", "price": 57.59}, {"symbol": "AAPL", "date": "2005-11-01T00:00:00", "price": 67.82}, {"symbol": "AAPL", "date": "2005-12-01T00:00:00", "price": 71.89}, {"symbol": "AAPL", "date": "2006-01-01T00:00:00", "price": 75.51}, {"symbol": "AAPL", "date": "2006-02-01T00:00:00", "price": 68.49}, {"symbol": "AAPL", "date": "2006-03-01T00:00:00", "price": 62.72}, {"symbol": "AAPL", "date": "2006-04-01T00:00:00", "price": 70.39}, {"symbol": "AAPL", "date": "2006-05-01T00:00:00", "price": 59.77}, {"symbol": "AAPL", "date": "2006-06-01T00:00:00", "price": 57.27}, {"symbol": "AAPL", "date": "2006-07-01T00:00:00", "price": 67.96}, {"symbol": "AAPL", "date": "2006-08-01T00:00:00", "price": 67.85}, {"symbol": "AAPL", "date": "2006-09-01T00:00:00", "price": 76.98}, {"symbol": "AAPL", "date": "2006-10-01T00:00:00", "price": 81.08}, {"symbol": "AAPL", "date": "2006-11-01T00:00:00", "price": 91.66}, {"symbol": "AAPL", "date": "2006-12-01T00:00:00", "price": 84.84}, {"symbol": "AAPL", "date": "2007-01-01T00:00:00", "price": 85.73}, {"symbol": "AAPL", "date": "2007-02-01T00:00:00", "price": 84.61}, {"symbol": "AAPL", "date": "2007-03-01T00:00:00", "price": 92.91}, {"symbol": "AAPL", "date": "2007-04-01T00:00:00", "price": 99.8}, {"symbol": "AAPL", "date": "2007-05-01T00:00:00", "price": 121.19}, {"symbol": "AAPL", "date": "2007-06-01T00:00:00", "price": 122.04}, {"symbol": "AAPL", "date": "2007-07-01T00:00:00", "price": 131.76}, {"symbol": "AAPL", "date": "2007-08-01T00:00:00", "price": 138.48}, {"symbol": "AAPL", "date": "2007-09-01T00:00:00", "price": 153.47}, {"symbol": "AAPL", "date": "2007-10-01T00:00:00", "price": 189.95}, {"symbol": "AAPL", "date": "2007-11-01T00:00:00", "price": 182.22}, {"symbol": "AAPL", "date": "2007-12-01T00:00:00", "price": 198.08}, {"symbol": "AAPL", "date": "2008-01-01T00:00:00", "price": 135.36}, {"symbol": "AAPL", "date": "2008-02-01T00:00:00", "price": 125.02}, {"symbol": "AAPL", "date": "2008-03-01T00:00:00", "price": 143.5}, {"symbol": "AAPL", "date": "2008-04-01T00:00:00", "price": 173.95}, {"symbol": "AAPL", "date": "2008-05-01T00:00:00", "price": 188.75}, {"symbol": "AAPL", "date": "2008-06-01T00:00:00", "price": 167.44}, {"symbol": "AAPL", "date": "2008-07-01T00:00:00", "price": 158.95}, {"symbol": "AAPL", "date": "2008-08-01T00:00:00", "price": 169.53}, {"symbol": "AAPL", "date": "2008-09-01T00:00:00", "price": 113.66}, {"symbol": "AAPL", "date": "2008-10-01T00:00:00", "price": 107.59}, {"symbol": "AAPL", "date": "2008-11-01T00:00:00", "price": 92.67}, {"symbol": "AAPL", "date": "2008-12-01T00:00:00", "price": 85.35}, {"symbol": "AAPL", "date": "2009-01-01T00:00:00", "price": 90.13}, {"symbol": "AAPL", "date": "2009-02-01T00:00:00", "price": 89.31}, {"symbol": "AAPL", "date": "2009-03-01T00:00:00", "price": 105.12}, {"symbol": "AAPL", "date": "2009-04-01T00:00:00", "price": 125.83}, {"symbol": "AAPL", "date": "2009-05-01T00:00:00", "price": 135.81}, {"symbol": "AAPL", "date": "2009-06-01T00:00:00", "price": 142.43}, {"symbol": "AAPL", "date": "2009-07-01T00:00:00", "price": 163.39}, {"symbol": "AAPL", "date": "2009-08-01T00:00:00", "price": 168.21}, {"symbol": "AAPL", "date": "2009-09-01T00:00:00", "price": 185.35}, {"symbol": "AAPL", "date": "2009-10-01T00:00:00", "price": 188.5}, {"symbol": "AAPL", "date": "2009-11-01T00:00:00", "price": 199.91}, {"symbol": "AAPL", "date": "2009-12-01T00:00:00", "price": 210.73}, {"symbol": "AAPL", "date": "2010-01-01T00:00:00", "price": 192.06}, {"symbol": "AAPL", "date": "2010-02-01T00:00:00", "price": 204.62}, {"symbol": "AAPL", "date": "2010-03-01T00:00:00", "price": 223.02}]}}, {"mode": "vega-lite"});
</script>
</div>
</div>
</section>
<section id="some-simple-but-sensible-design-principles" class="level2">
<h2 class="anchored" data-anchor-id="some-simple-but-sensible-design-principles">Some simple but sensible design principles</h2>
<p>Sara’s main points for improving the standard layout of charts basically boil down to the following princples:</p>
<ul>
<li><strong>use informative action titles and subtitles</strong>: much like effective presentations, using so-called <a href="https://slideworks.io/resources/how-to-write-action-titles-like-mckinsey">action titles</a> will greatly increase the impact of your data visualization. Formulated as a short, simple sentence, action titles should ideally be the main takeaway or ‘so what’ of the chart, and – if done right – allows the audience to only read the title to understand the primary message of the visual.</li>
<li><strong>less is more</strong>: before minimalism became all the rage in design, Edward Tufte coined the principle of <a href="https://infovis-wiki.net/wiki/Data-Ink_Ratio">maximizing the data-to-ink ratio</a>. Charts are easier to read by removing unnecessary clutter. So get rid of gridlines, background colors and the like.</li>
<li><strong>keep it horizontal</strong>: text is easier to read when it is horizontally aligned. So straighten up those rotated x-axis labels and y-axis titles</li>
<li><strong>lose the legends</strong>: having to lookup colors increases the cognitive load of reading a chart. Use annotations instead.</li>
</ul>
<p>All these principles can be readily implemented in Altair. Sergio Sánchez in fact captured the first three principles when implementing the Urban Institute styleguide (shown below) as <a href="https://towardsdatascience.com/consistently-beautiful-visualizations-with-altair-themes-c7f9f889602">an Altair theme</a>.</p>
<p><img src="https://kapitan.net/blog/images/urban-institute-styleguide.webp" class="img-fluid"></p>
<p>Building on his work, we created our on theme called <strong>Okabe Ito</strong>, in honour of their work in defining <a href="https://thenode.biologists.com/data-visualization-with-flying-colors/research/">colorblind-safe color palettes</a>. Not only is it functional, but I really like the muted colors, too. Below is a visual from their <a href="https://jfly.uni-koeln.de/color/">original paper</a> that also shows how different types of colorblindness (protan, deutan, tritan) results in different perception of the colors.</p>
<p><img src="https://kapitan.net/blog/images/otabe-ito-pallete.jpg" class="img-fluid"></p>
<p>To use this template, download <a href="../resources/okabe-ito-theme.py">okabe-ito-theme.py</a>, put it in the same folder as your notebook and at the following two cells.</p>
<p>To register the template as an Altair theme:</p>
<div id="cell-11" class="cell" data-execution_count="5">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb5-1"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%</span>run ..<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>resources<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span>okabe<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>ito<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>theme.py</span></code></pre></div></div>
</details>
</div>
<p>To download the fonts used in the template:</p>
<div id="cell-13" class="cell" data-execution_count="6">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb6-1"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%%</span>html</span>
<span id="cb6-2"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;</span>style<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span></span>
<span id="cb6-3"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">@import</span> url(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'https://fonts.googleapis.com/css?family=Lato'</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb6-4"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;/</span>style<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span></span></code></pre></div></div>
</details>
<div class="cell-output cell-output-display">
<style>
@import url('https://fonts.googleapis.com/css?family=Lato');
</style>
</div>
</div>
<p>Let’s see how this changes the charts.</p>
<section id="adding-titles" class="level3">
<h3 class="anchored" data-anchor-id="adding-titles">Adding titles</h3>
<p>The theme automatically has been configured to improve the data-to-ink ratio and align all texts horizontally. Adding action titles can be done using <a href="https://altair-viz.github.io/user_guide/customization.html#adjusting-the-title"><code>alt.TitleParams</code></a>, with which you can not only add a title, but also add multiple subtitles lines which you pass as a list.</p>
<div id="cell-15" class="cell" data-execution_count="7">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb7-1">(</span>
<span id="cb7-2">    scatterplot.properties(</span>
<span id="cb7-3">        title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.TitleParams(</span>
<span id="cb7-4">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Bill length vs. bill depth"</span>, subtitle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Did you spot Simpson's Paradox?"</span>]</span>
<span id="cb7-5">        )</span>
<span id="cb7-6">    )</span>
<span id="cb7-7">)</span></code></pre></div></div>
</details>
<div class="cell-output cell-output-display" data-execution_count="7">

<style>
  #altair-viz-0502798926cc46dfa849d27592dc85ae.vega-embed {
    width: 100%;
    display: flex;
  }

  #altair-viz-0502798926cc46dfa849d27592dc85ae.vega-embed details,
  #altair-viz-0502798926cc46dfa849d27592dc85ae.vega-embed details summary {
    position: relative;
  }
</style>
<div id="altair-viz-0502798926cc46dfa849d27592dc85ae"></div>
<script type="text/javascript">
  var VEGA_DEBUG = (typeof VEGA_DEBUG == "undefined") ? {} : VEGA_DEBUG;
  (function(spec, embedOpt){
    let outputDiv = document.currentScript.previousElementSibling;
    if (outputDiv.id !== "altair-viz-0502798926cc46dfa849d27592dc85ae") {
      outputDiv = document.getElementById("altair-viz-0502798926cc46dfa849d27592dc85ae");
    }
    const paths = {
      "vega": "https://cdn.jsdelivr.net/npm/vega@5?noext",
      "vega-lib": "https://cdn.jsdelivr.net/npm/vega-lib?noext",
      "vega-lite": "https://cdn.jsdelivr.net/npm/vega-lite@5.16.3?noext",
      "vega-embed": "https://cdn.jsdelivr.net/npm/vega-embed@6?noext",
    };

    function maybeLoadScript(lib, version) {
      var key = `${lib.replace("-", "")}_version`;
      return (VEGA_DEBUG[key] == version) ?
        Promise.resolve(paths[lib]) :
        new Promise(function(resolve, reject) {
          var s = document.createElement('script');
          document.getElementsByTagName("head")[0].appendChild(s);
          s.async = true;
          s.onload = () => {
            VEGA_DEBUG[key] = version;
            return resolve(paths[lib]);
          };
          s.onerror = () => reject(`Error loading script: ${paths[lib]}`);
          s.src = paths[lib];
        });
    }

    function showError(err) {
      outputDiv.innerHTML = `<div class="error" style="color:red;">${err}</div>`;
      throw err;
    }

    function displayChart(vegaEmbed) {
      vegaEmbed(outputDiv, spec, embedOpt)
        .catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));
    }

    if(typeof define === "function" && define.amd) {
      requirejs.config({paths});
      require(["vega-embed"], displayChart, err => showError(`Error loading script: ${err.message}`));
    } else {
      maybeLoadScript("vega", "5")
        .then(() => maybeLoadScript("vega-lite", "5.16.3"))
        .then(() => maybeLoadScript("vega-embed", "6"))
        .catch(showError)
        .then(() => displayChart(vegaEmbed));
    }
  })({"width": 685, "height": 380, "config": {"title": {"anchor": "start", "dy": -15, "fontSize": 18, "font": "Lato", "fontColor": "#000000"}, "axisX": {"domain": true, "domainColor": "#000000", "domainWidth": 1, "grid": false, "labelFontSize": 12, "labelFont": "Lato", "labelAngle": 0, "labelOverlap": "parity", "tickColor": "#000000", "tickSize": 5, "titleFontSize": 12, "titlePadding": 10, "titleFont": "Lato"}, "axisY": {"domain": false, "grid": true, "gridColor": "#DEDDDD", "gridWidth": 1, "labelFontSize": 12, "labelFont": "Lato", "labelPadding": 8, "ticks": false, "titleAlign": "left", "titleAnchor": "start", "titleFontSize": 12, "titlePadding": 10, "titleFont": "Lato", "titleAngle": 0, "titleY": -15}, "background": "#FFFFFF", "legend": {"labelFontSize": 12, "labelFont": "Lato", "symbolSize": 100, "symbolType": "square", "titleFontSize": 12, "titlePadding": 10, "titleFont": "Lato", "title": "", "orient": "top-left", "offset": 0}, "view": {"stroke": "transparent"}, "range": {"category": ["#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7", "#000000"], "diverging": ["#cfe8f3", "#a2d4ec", "#73bfe2", "#46abdb", "#1696d2", "#12719e"]}, "area": {"fill": "#0072B2"}, "line": {"color": "#0072B2", "stroke": "#0072B2", "strokewidth": 5}, "trail": {"color": "#0072B2", "stroke": "#0072B2", "strokeWidth": 0, "size": 1}, "path": {"stroke": "#0072B2", "strokeWidth": 0.5}, "point": {"filled": true}, "text": {"font": "Lato", "color": "#0072B2", "fontSize": 11, "align": "right", "fontWeight": 400, "size": 11}, "bar": {"fill": "#0072B2", "stroke": false}}, "data": {"name": "data-b414165be0aeea8c687bc9462659f7b8"}, "mark": {"type": "circle", "size": 60}, "encoding": {"color": {"field": "species", "type": "nominal"}, "tooltip": [{"field": "species", "type": "nominal"}, {"field": "sex", "type": "nominal"}, {"field": "island", "type": "nominal"}, {"field": "bill_length_mm", "type": "quantitative"}, {"field": "bill_depth_mm", "type": "quantitative"}], "x": {"field": "bill_length_mm", "scale": {"zero": false}, "type": "quantitative"}, "y": {"field": "bill_depth_mm", "scale": {"zero": false}, "type": "quantitative"}}, "title": {"text": "Bill length vs. bill depth", "subtitle": ["Did you spot Simpson's Paradox?"]}, "$schema": "https://vega.github.io/schema/vega-lite/v5.16.3.json", "datasets": {"data-b414165be0aeea8c687bc9462659f7b8": [{"species": "Adelie", "island": "Torgersen", "bill_length_mm": 39.1, "bill_depth_mm": 18.7, "flipper_length_mm": 181, "body_mass_g": 3750, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 39.5, "bill_depth_mm": 17.4, "flipper_length_mm": 186, "body_mass_g": 3800, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 40.3, "bill_depth_mm": 18.0, "flipper_length_mm": 195, "body_mass_g": 3250, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": null, "bill_depth_mm": null, "flipper_length_mm": null, "body_mass_g": null, "sex": null, "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 36.7, "bill_depth_mm": 19.3, "flipper_length_mm": 193, "body_mass_g": 3450, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 39.3, "bill_depth_mm": 20.6, "flipper_length_mm": 190, "body_mass_g": 3650, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 38.9, "bill_depth_mm": 17.8, "flipper_length_mm": 181, "body_mass_g": 3625, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 39.2, "bill_depth_mm": 19.6, "flipper_length_mm": 195, "body_mass_g": 4675, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 34.1, "bill_depth_mm": 18.1, "flipper_length_mm": 193, "body_mass_g": 3475, "sex": null, "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 42.0, "bill_depth_mm": 20.2, "flipper_length_mm": 190, "body_mass_g": 4250, "sex": null, "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 37.8, "bill_depth_mm": 17.1, "flipper_length_mm": 186, "body_mass_g": 3300, "sex": null, "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 37.8, "bill_depth_mm": 17.3, "flipper_length_mm": 180, "body_mass_g": 3700, "sex": null, "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 41.1, "bill_depth_mm": 17.6, "flipper_length_mm": 182, "body_mass_g": 3200, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 38.6, "bill_depth_mm": 21.2, "flipper_length_mm": 191, "body_mass_g": 3800, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 34.6, "bill_depth_mm": 21.1, "flipper_length_mm": 198, "body_mass_g": 4400, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 36.6, "bill_depth_mm": 17.8, "flipper_length_mm": 185, "body_mass_g": 3700, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 38.7, "bill_depth_mm": 19.0, "flipper_length_mm": 195, "body_mass_g": 3450, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 42.5, "bill_depth_mm": 20.7, "flipper_length_mm": 197, "body_mass_g": 4500, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 34.4, "bill_depth_mm": 18.4, "flipper_length_mm": 184, "body_mass_g": 3325, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 46.0, "bill_depth_mm": 21.5, "flipper_length_mm": 194, "body_mass_g": 4200, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 37.8, "bill_depth_mm": 18.3, "flipper_length_mm": 174, "body_mass_g": 3400, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 37.7, "bill_depth_mm": 18.7, "flipper_length_mm": 180, "body_mass_g": 3600, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 35.9, "bill_depth_mm": 19.2, "flipper_length_mm": 189, "body_mass_g": 3800, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 38.2, "bill_depth_mm": 18.1, "flipper_length_mm": 185, "body_mass_g": 3950, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 38.8, "bill_depth_mm": 17.2, "flipper_length_mm": 180, "body_mass_g": 3800, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 35.3, "bill_depth_mm": 18.9, "flipper_length_mm": 187, "body_mass_g": 3800, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 40.6, "bill_depth_mm": 18.6, "flipper_length_mm": 183, "body_mass_g": 3550, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 40.5, "bill_depth_mm": 17.9, "flipper_length_mm": 187, "body_mass_g": 3200, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 37.9, "bill_depth_mm": 18.6, "flipper_length_mm": 172, "body_mass_g": 3150, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 40.5, "bill_depth_mm": 18.9, "flipper_length_mm": 180, "body_mass_g": 3950, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.5, "bill_depth_mm": 16.7, "flipper_length_mm": 178, "body_mass_g": 3250, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.2, "bill_depth_mm": 18.1, "flipper_length_mm": 178, "body_mass_g": 3900, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.5, "bill_depth_mm": 17.8, "flipper_length_mm": 188, "body_mass_g": 3300, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 40.9, "bill_depth_mm": 18.9, "flipper_length_mm": 184, "body_mass_g": 3900, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.4, "bill_depth_mm": 17.0, "flipper_length_mm": 195, "body_mass_g": 3325, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.2, "bill_depth_mm": 21.1, "flipper_length_mm": 196, "body_mass_g": 4150, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 38.8, "bill_depth_mm": 20.0, "flipper_length_mm": 190, "body_mass_g": 3950, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 42.2, "bill_depth_mm": 18.5, "flipper_length_mm": 180, "body_mass_g": 3550, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.6, "bill_depth_mm": 19.3, "flipper_length_mm": 181, "body_mass_g": 3300, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.8, "bill_depth_mm": 19.1, "flipper_length_mm": 184, "body_mass_g": 4650, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.5, "bill_depth_mm": 18.0, "flipper_length_mm": 182, "body_mass_g": 3150, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 40.8, "bill_depth_mm": 18.4, "flipper_length_mm": 195, "body_mass_g": 3900, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.0, "bill_depth_mm": 18.5, "flipper_length_mm": 186, "body_mass_g": 3100, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 44.1, "bill_depth_mm": 19.7, "flipper_length_mm": 196, "body_mass_g": 4400, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.0, "bill_depth_mm": 16.9, "flipper_length_mm": 185, "body_mass_g": 3000, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.6, "bill_depth_mm": 18.8, "flipper_length_mm": 190, "body_mass_g": 4600, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 41.1, "bill_depth_mm": 19.0, "flipper_length_mm": 182, "body_mass_g": 3425, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.5, "bill_depth_mm": 18.9, "flipper_length_mm": 179, "body_mass_g": 2975, "sex": null, "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.0, "bill_depth_mm": 17.9, "flipper_length_mm": 190, "body_mass_g": 3450, "sex": "female", "year": 2007}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 42.3, "bill_depth_mm": 21.2, "flipper_length_mm": 191, "body_mass_g": 4150, "sex": "male", "year": 2007}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 39.6, "bill_depth_mm": 17.7, "flipper_length_mm": 186, "body_mass_g": 3500, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 40.1, "bill_depth_mm": 18.9, "flipper_length_mm": 188, "body_mass_g": 4300, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 35.0, "bill_depth_mm": 17.9, "flipper_length_mm": 190, "body_mass_g": 3450, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 42.0, "bill_depth_mm": 19.5, "flipper_length_mm": 200, "body_mass_g": 4050, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 34.5, "bill_depth_mm": 18.1, "flipper_length_mm": 187, "body_mass_g": 2900, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 41.4, "bill_depth_mm": 18.6, "flipper_length_mm": 191, "body_mass_g": 3700, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 39.0, "bill_depth_mm": 17.5, "flipper_length_mm": 186, "body_mass_g": 3550, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 40.6, "bill_depth_mm": 18.8, "flipper_length_mm": 193, "body_mass_g": 3800, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 36.5, "bill_depth_mm": 16.6, "flipper_length_mm": 181, "body_mass_g": 2850, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 37.6, "bill_depth_mm": 19.1, "flipper_length_mm": 194, "body_mass_g": 3750, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 35.7, "bill_depth_mm": 16.9, "flipper_length_mm": 185, "body_mass_g": 3150, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 41.3, "bill_depth_mm": 21.1, "flipper_length_mm": 195, "body_mass_g": 4400, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 37.6, "bill_depth_mm": 17.0, "flipper_length_mm": 185, "body_mass_g": 3600, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 41.1, "bill_depth_mm": 18.2, "flipper_length_mm": 192, "body_mass_g": 4050, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 36.4, "bill_depth_mm": 17.1, "flipper_length_mm": 184, "body_mass_g": 2850, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 41.6, "bill_depth_mm": 18.0, "flipper_length_mm": 192, "body_mass_g": 3950, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 35.5, "bill_depth_mm": 16.2, "flipper_length_mm": 195, "body_mass_g": 3350, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 41.1, "bill_depth_mm": 19.1, "flipper_length_mm": 188, "body_mass_g": 4100, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 35.9, "bill_depth_mm": 16.6, "flipper_length_mm": 190, "body_mass_g": 3050, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 41.8, "bill_depth_mm": 19.4, "flipper_length_mm": 198, "body_mass_g": 4450, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 33.5, "bill_depth_mm": 19.0, "flipper_length_mm": 190, "body_mass_g": 3600, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 39.7, "bill_depth_mm": 18.4, "flipper_length_mm": 190, "body_mass_g": 3900, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 39.6, "bill_depth_mm": 17.2, "flipper_length_mm": 196, "body_mass_g": 3550, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 45.8, "bill_depth_mm": 18.9, "flipper_length_mm": 197, "body_mass_g": 4150, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 35.5, "bill_depth_mm": 17.5, "flipper_length_mm": 190, "body_mass_g": 3700, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 42.8, "bill_depth_mm": 18.5, "flipper_length_mm": 195, "body_mass_g": 4250, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 40.9, "bill_depth_mm": 16.8, "flipper_length_mm": 191, "body_mass_g": 3700, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 37.2, "bill_depth_mm": 19.4, "flipper_length_mm": 184, "body_mass_g": 3900, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 36.2, "bill_depth_mm": 16.1, "flipper_length_mm": 187, "body_mass_g": 3550, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 42.1, "bill_depth_mm": 19.1, "flipper_length_mm": 195, "body_mass_g": 4000, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 34.6, "bill_depth_mm": 17.2, "flipper_length_mm": 189, "body_mass_g": 3200, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 42.9, "bill_depth_mm": 17.6, "flipper_length_mm": 196, "body_mass_g": 4700, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 36.7, "bill_depth_mm": 18.8, "flipper_length_mm": 187, "body_mass_g": 3800, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 35.1, "bill_depth_mm": 19.4, "flipper_length_mm": 193, "body_mass_g": 4200, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.3, "bill_depth_mm": 17.8, "flipper_length_mm": 191, "body_mass_g": 3350, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 41.3, "bill_depth_mm": 20.3, "flipper_length_mm": 194, "body_mass_g": 3550, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.3, "bill_depth_mm": 19.5, "flipper_length_mm": 190, "body_mass_g": 3800, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.9, "bill_depth_mm": 18.6, "flipper_length_mm": 189, "body_mass_g": 3500, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 38.3, "bill_depth_mm": 19.2, "flipper_length_mm": 189, "body_mass_g": 3950, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 38.9, "bill_depth_mm": 18.8, "flipper_length_mm": 190, "body_mass_g": 3600, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 35.7, "bill_depth_mm": 18.0, "flipper_length_mm": 202, "body_mass_g": 3550, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 41.1, "bill_depth_mm": 18.1, "flipper_length_mm": 205, "body_mass_g": 4300, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 34.0, "bill_depth_mm": 17.1, "flipper_length_mm": 185, "body_mass_g": 3400, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.6, "bill_depth_mm": 18.1, "flipper_length_mm": 186, "body_mass_g": 4450, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.2, "bill_depth_mm": 17.3, "flipper_length_mm": 187, "body_mass_g": 3300, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 40.8, "bill_depth_mm": 18.9, "flipper_length_mm": 208, "body_mass_g": 4300, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 38.1, "bill_depth_mm": 18.6, "flipper_length_mm": 190, "body_mass_g": 3700, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 40.3, "bill_depth_mm": 18.5, "flipper_length_mm": 196, "body_mass_g": 4350, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 33.1, "bill_depth_mm": 16.1, "flipper_length_mm": 178, "body_mass_g": 2900, "sex": "female", "year": 2008}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 43.2, "bill_depth_mm": 18.5, "flipper_length_mm": 192, "body_mass_g": 4100, "sex": "male", "year": 2008}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 35.0, "bill_depth_mm": 17.9, "flipper_length_mm": 192, "body_mass_g": 3725, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 41.0, "bill_depth_mm": 20.0, "flipper_length_mm": 203, "body_mass_g": 4725, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 37.7, "bill_depth_mm": 16.0, "flipper_length_mm": 183, "body_mass_g": 3075, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 37.8, "bill_depth_mm": 20.0, "flipper_length_mm": 190, "body_mass_g": 4250, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 37.9, "bill_depth_mm": 18.6, "flipper_length_mm": 193, "body_mass_g": 2925, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 39.7, "bill_depth_mm": 18.9, "flipper_length_mm": 184, "body_mass_g": 3550, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 38.6, "bill_depth_mm": 17.2, "flipper_length_mm": 199, "body_mass_g": 3750, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 38.2, "bill_depth_mm": 20.0, "flipper_length_mm": 190, "body_mass_g": 3900, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 38.1, "bill_depth_mm": 17.0, "flipper_length_mm": 181, "body_mass_g": 3175, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 43.2, "bill_depth_mm": 19.0, "flipper_length_mm": 197, "body_mass_g": 4775, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 38.1, "bill_depth_mm": 16.5, "flipper_length_mm": 198, "body_mass_g": 3825, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 45.6, "bill_depth_mm": 20.3, "flipper_length_mm": 191, "body_mass_g": 4600, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 39.7, "bill_depth_mm": 17.7, "flipper_length_mm": 193, "body_mass_g": 3200, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 42.2, "bill_depth_mm": 19.5, "flipper_length_mm": 197, "body_mass_g": 4275, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 39.6, "bill_depth_mm": 20.7, "flipper_length_mm": 191, "body_mass_g": 3900, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Biscoe", "bill_length_mm": 42.7, "bill_depth_mm": 18.3, "flipper_length_mm": 196, "body_mass_g": 4075, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 38.6, "bill_depth_mm": 17.0, "flipper_length_mm": 188, "body_mass_g": 2900, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 37.3, "bill_depth_mm": 20.5, "flipper_length_mm": 199, "body_mass_g": 3775, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 35.7, "bill_depth_mm": 17.0, "flipper_length_mm": 189, "body_mass_g": 3350, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 41.1, "bill_depth_mm": 18.6, "flipper_length_mm": 189, "body_mass_g": 3325, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 36.2, "bill_depth_mm": 17.2, "flipper_length_mm": 187, "body_mass_g": 3150, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 37.7, "bill_depth_mm": 19.8, "flipper_length_mm": 198, "body_mass_g": 3500, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 40.2, "bill_depth_mm": 17.0, "flipper_length_mm": 176, "body_mass_g": 3450, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 41.4, "bill_depth_mm": 18.5, "flipper_length_mm": 202, "body_mass_g": 3875, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 35.2, "bill_depth_mm": 15.9, "flipper_length_mm": 186, "body_mass_g": 3050, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 40.6, "bill_depth_mm": 19.0, "flipper_length_mm": 199, "body_mass_g": 4000, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 38.8, "bill_depth_mm": 17.6, "flipper_length_mm": 191, "body_mass_g": 3275, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 41.5, "bill_depth_mm": 18.3, "flipper_length_mm": 195, "body_mass_g": 4300, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 39.0, "bill_depth_mm": 17.1, "flipper_length_mm": 191, "body_mass_g": 3050, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 44.1, "bill_depth_mm": 18.0, "flipper_length_mm": 210, "body_mass_g": 4000, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 38.5, "bill_depth_mm": 17.9, "flipper_length_mm": 190, "body_mass_g": 3325, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Torgersen", "bill_length_mm": 43.1, "bill_depth_mm": 19.2, "flipper_length_mm": 197, "body_mass_g": 3500, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.8, "bill_depth_mm": 18.5, "flipper_length_mm": 193, "body_mass_g": 3500, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.5, "bill_depth_mm": 18.5, "flipper_length_mm": 199, "body_mass_g": 4475, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 38.1, "bill_depth_mm": 17.6, "flipper_length_mm": 187, "body_mass_g": 3425, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 41.1, "bill_depth_mm": 17.5, "flipper_length_mm": 190, "body_mass_g": 3900, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 35.6, "bill_depth_mm": 17.5, "flipper_length_mm": 191, "body_mass_g": 3175, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 40.2, "bill_depth_mm": 20.1, "flipper_length_mm": 200, "body_mass_g": 3975, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.0, "bill_depth_mm": 16.5, "flipper_length_mm": 185, "body_mass_g": 3400, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.7, "bill_depth_mm": 17.9, "flipper_length_mm": 193, "body_mass_g": 4250, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 40.2, "bill_depth_mm": 17.1, "flipper_length_mm": 193, "body_mass_g": 3400, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 40.6, "bill_depth_mm": 17.2, "flipper_length_mm": 187, "body_mass_g": 3475, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 32.1, "bill_depth_mm": 15.5, "flipper_length_mm": 188, "body_mass_g": 3050, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 40.7, "bill_depth_mm": 17.0, "flipper_length_mm": 190, "body_mass_g": 3725, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.3, "bill_depth_mm": 16.8, "flipper_length_mm": 192, "body_mass_g": 3000, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.0, "bill_depth_mm": 18.7, "flipper_length_mm": 185, "body_mass_g": 3650, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 39.2, "bill_depth_mm": 18.6, "flipper_length_mm": 190, "body_mass_g": 4250, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.6, "bill_depth_mm": 18.4, "flipper_length_mm": 184, "body_mass_g": 3475, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.0, "bill_depth_mm": 17.8, "flipper_length_mm": 195, "body_mass_g": 3450, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 37.8, "bill_depth_mm": 18.1, "flipper_length_mm": 193, "body_mass_g": 3750, "sex": "male", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 36.0, "bill_depth_mm": 17.1, "flipper_length_mm": 187, "body_mass_g": 3700, "sex": "female", "year": 2009}, {"species": "Adelie", "island": "Dream", "bill_length_mm": 41.5, "bill_depth_mm": 18.5, "flipper_length_mm": 201, "body_mass_g": 4000, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.1, "bill_depth_mm": 13.2, "flipper_length_mm": 211, "body_mass_g": 4500, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.0, "bill_depth_mm": 16.3, "flipper_length_mm": 230, "body_mass_g": 5700, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.7, "bill_depth_mm": 14.1, "flipper_length_mm": 210, "body_mass_g": 4450, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.0, "bill_depth_mm": 15.2, "flipper_length_mm": 218, "body_mass_g": 5700, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.6, "bill_depth_mm": 14.5, "flipper_length_mm": 215, "body_mass_g": 5400, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.5, "bill_depth_mm": 13.5, "flipper_length_mm": 210, "body_mass_g": 4550, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.4, "bill_depth_mm": 14.6, "flipper_length_mm": 211, "body_mass_g": 4800, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.7, "bill_depth_mm": 15.3, "flipper_length_mm": 219, "body_mass_g": 5200, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 43.3, "bill_depth_mm": 13.4, "flipper_length_mm": 209, "body_mass_g": 4400, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.8, "bill_depth_mm": 15.4, "flipper_length_mm": 215, "body_mass_g": 5150, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 40.9, "bill_depth_mm": 13.7, "flipper_length_mm": 214, "body_mass_g": 4650, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.0, "bill_depth_mm": 16.1, "flipper_length_mm": 216, "body_mass_g": 5550, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.5, "bill_depth_mm": 13.7, "flipper_length_mm": 214, "body_mass_g": 4650, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.4, "bill_depth_mm": 14.6, "flipper_length_mm": 213, "body_mass_g": 5850, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.8, "bill_depth_mm": 14.6, "flipper_length_mm": 210, "body_mass_g": 4200, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.3, "bill_depth_mm": 15.7, "flipper_length_mm": 217, "body_mass_g": 5850, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 42.0, "bill_depth_mm": 13.5, "flipper_length_mm": 210, "body_mass_g": 4150, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.2, "bill_depth_mm": 15.2, "flipper_length_mm": 221, "body_mass_g": 6300, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.2, "bill_depth_mm": 14.5, "flipper_length_mm": 209, "body_mass_g": 4800, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.7, "bill_depth_mm": 15.1, "flipper_length_mm": 222, "body_mass_g": 5350, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.2, "bill_depth_mm": 14.3, "flipper_length_mm": 218, "body_mass_g": 5700, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.1, "bill_depth_mm": 14.5, "flipper_length_mm": 215, "body_mass_g": 5000, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.5, "bill_depth_mm": 14.5, "flipper_length_mm": 213, "body_mass_g": 4400, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.3, "bill_depth_mm": 15.8, "flipper_length_mm": 215, "body_mass_g": 5050, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 42.9, "bill_depth_mm": 13.1, "flipper_length_mm": 215, "body_mass_g": 5000, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.1, "bill_depth_mm": 15.1, "flipper_length_mm": 215, "body_mass_g": 5100, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 44.5, "bill_depth_mm": 14.3, "flipper_length_mm": 216, "body_mass_g": 4100, "sex": null, "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.8, "bill_depth_mm": 15.0, "flipper_length_mm": 215, "body_mass_g": 5650, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.2, "bill_depth_mm": 14.3, "flipper_length_mm": 210, "body_mass_g": 4600, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.0, "bill_depth_mm": 15.3, "flipper_length_mm": 220, "body_mass_g": 5550, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.3, "bill_depth_mm": 15.3, "flipper_length_mm": 222, "body_mass_g": 5250, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 42.8, "bill_depth_mm": 14.2, "flipper_length_mm": 209, "body_mass_g": 4700, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.1, "bill_depth_mm": 14.5, "flipper_length_mm": 207, "body_mass_g": 5050, "sex": "female", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 59.6, "bill_depth_mm": 17.0, "flipper_length_mm": 230, "body_mass_g": 6050, "sex": "male", "year": 2007}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.1, "bill_depth_mm": 14.8, "flipper_length_mm": 220, "body_mass_g": 5150, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.4, "bill_depth_mm": 16.3, "flipper_length_mm": 220, "body_mass_g": 5400, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 42.6, "bill_depth_mm": 13.7, "flipper_length_mm": 213, "body_mass_g": 4950, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 44.4, "bill_depth_mm": 17.3, "flipper_length_mm": 219, "body_mass_g": 5250, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 44.0, "bill_depth_mm": 13.6, "flipper_length_mm": 208, "body_mass_g": 4350, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.7, "bill_depth_mm": 15.7, "flipper_length_mm": 208, "body_mass_g": 5350, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 42.7, "bill_depth_mm": 13.7, "flipper_length_mm": 208, "body_mass_g": 3950, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.6, "bill_depth_mm": 16.0, "flipper_length_mm": 225, "body_mass_g": 5700, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.3, "bill_depth_mm": 13.7, "flipper_length_mm": 210, "body_mass_g": 4300, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.6, "bill_depth_mm": 15.0, "flipper_length_mm": 216, "body_mass_g": 4750, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.5, "bill_depth_mm": 15.9, "flipper_length_mm": 222, "body_mass_g": 5550, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 43.6, "bill_depth_mm": 13.9, "flipper_length_mm": 217, "body_mass_g": 4900, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.5, "bill_depth_mm": 13.9, "flipper_length_mm": 210, "body_mass_g": 4200, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.5, "bill_depth_mm": 15.9, "flipper_length_mm": 225, "body_mass_g": 5400, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 44.9, "bill_depth_mm": 13.3, "flipper_length_mm": 213, "body_mass_g": 5100, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.2, "bill_depth_mm": 15.8, "flipper_length_mm": 215, "body_mass_g": 5300, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.6, "bill_depth_mm": 14.2, "flipper_length_mm": 210, "body_mass_g": 4850, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.5, "bill_depth_mm": 14.1, "flipper_length_mm": 220, "body_mass_g": 5300, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.1, "bill_depth_mm": 14.4, "flipper_length_mm": 210, "body_mass_g": 4400, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.1, "bill_depth_mm": 15.0, "flipper_length_mm": 225, "body_mass_g": 5000, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.5, "bill_depth_mm": 14.4, "flipper_length_mm": 217, "body_mass_g": 4900, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.0, "bill_depth_mm": 15.4, "flipper_length_mm": 220, "body_mass_g": 5050, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 43.8, "bill_depth_mm": 13.9, "flipper_length_mm": 208, "body_mass_g": 4300, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.5, "bill_depth_mm": 15.0, "flipper_length_mm": 220, "body_mass_g": 5000, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 43.2, "bill_depth_mm": 14.5, "flipper_length_mm": 208, "body_mass_g": 4450, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.4, "bill_depth_mm": 15.3, "flipper_length_mm": 224, "body_mass_g": 5550, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.3, "bill_depth_mm": 13.8, "flipper_length_mm": 208, "body_mass_g": 4200, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.2, "bill_depth_mm": 14.9, "flipper_length_mm": 221, "body_mass_g": 5300, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.7, "bill_depth_mm": 13.9, "flipper_length_mm": 214, "body_mass_g": 4400, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 54.3, "bill_depth_mm": 15.7, "flipper_length_mm": 231, "body_mass_g": 5650, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.8, "bill_depth_mm": 14.2, "flipper_length_mm": 219, "body_mass_g": 4700, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.8, "bill_depth_mm": 16.8, "flipper_length_mm": 230, "body_mass_g": 5700, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.2, "bill_depth_mm": 14.4, "flipper_length_mm": 214, "body_mass_g": 4650, "sex": null, "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.5, "bill_depth_mm": 16.2, "flipper_length_mm": 229, "body_mass_g": 5800, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 43.5, "bill_depth_mm": 14.2, "flipper_length_mm": 220, "body_mass_g": 4700, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.7, "bill_depth_mm": 15.0, "flipper_length_mm": 223, "body_mass_g": 5550, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.7, "bill_depth_mm": 15.0, "flipper_length_mm": 216, "body_mass_g": 4750, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.4, "bill_depth_mm": 15.6, "flipper_length_mm": 221, "body_mass_g": 5000, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.2, "bill_depth_mm": 15.6, "flipper_length_mm": 221, "body_mass_g": 5100, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.5, "bill_depth_mm": 14.8, "flipper_length_mm": 217, "body_mass_g": 5200, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.4, "bill_depth_mm": 15.0, "flipper_length_mm": 216, "body_mass_g": 4700, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.6, "bill_depth_mm": 16.0, "flipper_length_mm": 230, "body_mass_g": 5800, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.5, "bill_depth_mm": 14.2, "flipper_length_mm": 209, "body_mass_g": 4600, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 51.1, "bill_depth_mm": 16.3, "flipper_length_mm": 220, "body_mass_g": 6000, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.2, "bill_depth_mm": 13.8, "flipper_length_mm": 215, "body_mass_g": 4750, "sex": "female", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.2, "bill_depth_mm": 16.4, "flipper_length_mm": 223, "body_mass_g": 5950, "sex": "male", "year": 2008}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.1, "bill_depth_mm": 14.5, "flipper_length_mm": 212, "body_mass_g": 4625, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 52.5, "bill_depth_mm": 15.6, "flipper_length_mm": 221, "body_mass_g": 5450, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.4, "bill_depth_mm": 14.6, "flipper_length_mm": 212, "body_mass_g": 4725, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.0, "bill_depth_mm": 15.9, "flipper_length_mm": 224, "body_mass_g": 5350, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 44.9, "bill_depth_mm": 13.8, "flipper_length_mm": 212, "body_mass_g": 4750, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.8, "bill_depth_mm": 17.3, "flipper_length_mm": 228, "body_mass_g": 5600, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 43.4, "bill_depth_mm": 14.4, "flipper_length_mm": 218, "body_mass_g": 4600, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 51.3, "bill_depth_mm": 14.2, "flipper_length_mm": 218, "body_mass_g": 5300, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.5, "bill_depth_mm": 14.0, "flipper_length_mm": 212, "body_mass_g": 4875, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 52.1, "bill_depth_mm": 17.0, "flipper_length_mm": 230, "body_mass_g": 5550, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.5, "bill_depth_mm": 15.0, "flipper_length_mm": 218, "body_mass_g": 4950, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 52.2, "bill_depth_mm": 17.1, "flipper_length_mm": 228, "body_mass_g": 5400, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.5, "bill_depth_mm": 14.5, "flipper_length_mm": 212, "body_mass_g": 4750, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.5, "bill_depth_mm": 16.1, "flipper_length_mm": 224, "body_mass_g": 5650, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 44.5, "bill_depth_mm": 14.7, "flipper_length_mm": 214, "body_mass_g": 4850, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.8, "bill_depth_mm": 15.7, "flipper_length_mm": 226, "body_mass_g": 5200, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.4, "bill_depth_mm": 15.8, "flipper_length_mm": 216, "body_mass_g": 4925, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.9, "bill_depth_mm": 14.6, "flipper_length_mm": 222, "body_mass_g": 4875, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.4, "bill_depth_mm": 14.4, "flipper_length_mm": 203, "body_mass_g": 4625, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 51.1, "bill_depth_mm": 16.5, "flipper_length_mm": 225, "body_mass_g": 5250, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.5, "bill_depth_mm": 15.0, "flipper_length_mm": 219, "body_mass_g": 4850, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 55.9, "bill_depth_mm": 17.0, "flipper_length_mm": 228, "body_mass_g": 5600, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.2, "bill_depth_mm": 15.5, "flipper_length_mm": 215, "body_mass_g": 4975, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.1, "bill_depth_mm": 15.0, "flipper_length_mm": 228, "body_mass_g": 5500, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.3, "bill_depth_mm": 13.8, "flipper_length_mm": 216, "body_mass_g": 4725, "sex": null, "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.8, "bill_depth_mm": 16.1, "flipper_length_mm": 215, "body_mass_g": 5500, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 41.7, "bill_depth_mm": 14.7, "flipper_length_mm": 210, "body_mass_g": 4700, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 53.4, "bill_depth_mm": 15.8, "flipper_length_mm": 219, "body_mass_g": 5500, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 43.3, "bill_depth_mm": 14.0, "flipper_length_mm": 208, "body_mass_g": 4575, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.1, "bill_depth_mm": 15.1, "flipper_length_mm": 209, "body_mass_g": 5500, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.5, "bill_depth_mm": 15.2, "flipper_length_mm": 216, "body_mass_g": 5000, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.8, "bill_depth_mm": 15.9, "flipper_length_mm": 229, "body_mass_g": 5950, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 43.5, "bill_depth_mm": 15.2, "flipper_length_mm": 213, "body_mass_g": 4650, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 51.5, "bill_depth_mm": 16.3, "flipper_length_mm": 230, "body_mass_g": 5500, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.2, "bill_depth_mm": 14.1, "flipper_length_mm": 217, "body_mass_g": 4375, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 55.1, "bill_depth_mm": 16.0, "flipper_length_mm": 230, "body_mass_g": 5850, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 44.5, "bill_depth_mm": 15.7, "flipper_length_mm": 217, "body_mass_g": 4875, "sex": null, "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 48.8, "bill_depth_mm": 16.2, "flipper_length_mm": 222, "body_mass_g": 6000, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 47.2, "bill_depth_mm": 13.7, "flipper_length_mm": 214, "body_mass_g": 4925, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": null, "bill_depth_mm": null, "flipper_length_mm": null, "body_mass_g": null, "sex": null, "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 46.8, "bill_depth_mm": 14.3, "flipper_length_mm": 215, "body_mass_g": 4850, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 50.4, "bill_depth_mm": 15.7, "flipper_length_mm": 222, "body_mass_g": 5750, "sex": "male", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 45.2, "bill_depth_mm": 14.8, "flipper_length_mm": 212, "body_mass_g": 5200, "sex": "female", "year": 2009}, {"species": "Gentoo", "island": "Biscoe", "bill_length_mm": 49.9, "bill_depth_mm": 16.1, "flipper_length_mm": 213, "body_mass_g": 5400, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.5, "bill_depth_mm": 17.9, "flipper_length_mm": 192, "body_mass_g": 3500, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.0, "bill_depth_mm": 19.5, "flipper_length_mm": 196, "body_mass_g": 3900, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 51.3, "bill_depth_mm": 19.2, "flipper_length_mm": 193, "body_mass_g": 3650, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 45.4, "bill_depth_mm": 18.7, "flipper_length_mm": 188, "body_mass_g": 3525, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 52.7, "bill_depth_mm": 19.8, "flipper_length_mm": 197, "body_mass_g": 3725, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 45.2, "bill_depth_mm": 17.8, "flipper_length_mm": 198, "body_mass_g": 3950, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.1, "bill_depth_mm": 18.2, "flipper_length_mm": 178, "body_mass_g": 3250, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 51.3, "bill_depth_mm": 18.2, "flipper_length_mm": 197, "body_mass_g": 3750, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.0, "bill_depth_mm": 18.9, "flipper_length_mm": 195, "body_mass_g": 4150, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 51.3, "bill_depth_mm": 19.9, "flipper_length_mm": 198, "body_mass_g": 3700, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.6, "bill_depth_mm": 17.8, "flipper_length_mm": 193, "body_mass_g": 3800, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 51.7, "bill_depth_mm": 20.3, "flipper_length_mm": 194, "body_mass_g": 3775, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 47.0, "bill_depth_mm": 17.3, "flipper_length_mm": 185, "body_mass_g": 3700, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 52.0, "bill_depth_mm": 18.1, "flipper_length_mm": 201, "body_mass_g": 4050, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 45.9, "bill_depth_mm": 17.1, "flipper_length_mm": 190, "body_mass_g": 3575, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.5, "bill_depth_mm": 19.6, "flipper_length_mm": 201, "body_mass_g": 4050, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.3, "bill_depth_mm": 20.0, "flipper_length_mm": 197, "body_mass_g": 3300, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 58.0, "bill_depth_mm": 17.8, "flipper_length_mm": 181, "body_mass_g": 3700, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.4, "bill_depth_mm": 18.6, "flipper_length_mm": 190, "body_mass_g": 3450, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 49.2, "bill_depth_mm": 18.2, "flipper_length_mm": 195, "body_mass_g": 4400, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 42.4, "bill_depth_mm": 17.3, "flipper_length_mm": 181, "body_mass_g": 3600, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 48.5, "bill_depth_mm": 17.5, "flipper_length_mm": 191, "body_mass_g": 3400, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 43.2, "bill_depth_mm": 16.6, "flipper_length_mm": 187, "body_mass_g": 2900, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.6, "bill_depth_mm": 19.4, "flipper_length_mm": 193, "body_mass_g": 3800, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.7, "bill_depth_mm": 17.9, "flipper_length_mm": 195, "body_mass_g": 3300, "sex": "female", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 52.0, "bill_depth_mm": 19.0, "flipper_length_mm": 197, "body_mass_g": 4150, "sex": "male", "year": 2007}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.5, "bill_depth_mm": 18.4, "flipper_length_mm": 200, "body_mass_g": 3400, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 49.5, "bill_depth_mm": 19.0, "flipper_length_mm": 200, "body_mass_g": 3800, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.4, "bill_depth_mm": 17.8, "flipper_length_mm": 191, "body_mass_g": 3700, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 52.8, "bill_depth_mm": 20.0, "flipper_length_mm": 205, "body_mass_g": 4550, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 40.9, "bill_depth_mm": 16.6, "flipper_length_mm": 187, "body_mass_g": 3200, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 54.2, "bill_depth_mm": 20.8, "flipper_length_mm": 201, "body_mass_g": 4300, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 42.5, "bill_depth_mm": 16.7, "flipper_length_mm": 187, "body_mass_g": 3350, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 51.0, "bill_depth_mm": 18.8, "flipper_length_mm": 203, "body_mass_g": 4100, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 49.7, "bill_depth_mm": 18.6, "flipper_length_mm": 195, "body_mass_g": 3600, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 47.5, "bill_depth_mm": 16.8, "flipper_length_mm": 199, "body_mass_g": 3900, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 47.6, "bill_depth_mm": 18.3, "flipper_length_mm": 195, "body_mass_g": 3850, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 52.0, "bill_depth_mm": 20.7, "flipper_length_mm": 210, "body_mass_g": 4800, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.9, "bill_depth_mm": 16.6, "flipper_length_mm": 192, "body_mass_g": 2700, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 53.5, "bill_depth_mm": 19.9, "flipper_length_mm": 205, "body_mass_g": 4500, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 49.0, "bill_depth_mm": 19.5, "flipper_length_mm": 210, "body_mass_g": 3950, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.2, "bill_depth_mm": 17.5, "flipper_length_mm": 187, "body_mass_g": 3650, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.9, "bill_depth_mm": 19.1, "flipper_length_mm": 196, "body_mass_g": 3550, "sex": "male", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 45.5, "bill_depth_mm": 17.0, "flipper_length_mm": 196, "body_mass_g": 3500, "sex": "female", "year": 2008}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.9, "bill_depth_mm": 17.9, "flipper_length_mm": 196, "body_mass_g": 3675, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.8, "bill_depth_mm": 18.5, "flipper_length_mm": 201, "body_mass_g": 4450, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.1, "bill_depth_mm": 17.9, "flipper_length_mm": 190, "body_mass_g": 3400, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 49.0, "bill_depth_mm": 19.6, "flipper_length_mm": 212, "body_mass_g": 4300, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 51.5, "bill_depth_mm": 18.7, "flipper_length_mm": 187, "body_mass_g": 3250, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 49.8, "bill_depth_mm": 17.3, "flipper_length_mm": 198, "body_mass_g": 3675, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 48.1, "bill_depth_mm": 16.4, "flipper_length_mm": 199, "body_mass_g": 3325, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 51.4, "bill_depth_mm": 19.0, "flipper_length_mm": 201, "body_mass_g": 3950, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 45.7, "bill_depth_mm": 17.3, "flipper_length_mm": 193, "body_mass_g": 3600, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.7, "bill_depth_mm": 19.7, "flipper_length_mm": 203, "body_mass_g": 4050, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 42.5, "bill_depth_mm": 17.3, "flipper_length_mm": 187, "body_mass_g": 3350, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 52.2, "bill_depth_mm": 18.8, "flipper_length_mm": 197, "body_mass_g": 3450, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 45.2, "bill_depth_mm": 16.6, "flipper_length_mm": 191, "body_mass_g": 3250, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 49.3, "bill_depth_mm": 19.9, "flipper_length_mm": 203, "body_mass_g": 4050, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.2, "bill_depth_mm": 18.8, "flipper_length_mm": 202, "body_mass_g": 3800, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 45.6, "bill_depth_mm": 19.4, "flipper_length_mm": 194, "body_mass_g": 3525, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 51.9, "bill_depth_mm": 19.5, "flipper_length_mm": 206, "body_mass_g": 3950, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 46.8, "bill_depth_mm": 16.5, "flipper_length_mm": 189, "body_mass_g": 3650, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 45.7, "bill_depth_mm": 17.0, "flipper_length_mm": 195, "body_mass_g": 3650, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 55.8, "bill_depth_mm": 19.8, "flipper_length_mm": 207, "body_mass_g": 4000, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 43.5, "bill_depth_mm": 18.1, "flipper_length_mm": 202, "body_mass_g": 3400, "sex": "female", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 49.6, "bill_depth_mm": 18.2, "flipper_length_mm": 193, "body_mass_g": 3775, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.8, "bill_depth_mm": 19.0, "flipper_length_mm": 210, "body_mass_g": 4100, "sex": "male", "year": 2009}, {"species": "Chinstrap", "island": "Dream", "bill_length_mm": 50.2, "bill_depth_mm": 18.7, "flipper_length_mm": 198, "body_mass_g": 3775, "sex": "female", "year": 2009}]}}, {"mode": "vega-lite"});
</script>
</div>
</div>
</section>
<section id="everything-horizontal" class="level3">
<h3 class="anchored" data-anchor-id="everything-horizontal">Everything horizontal</h3>
<p>The effect of aligning all text horizontally is a significant improvement on the bar chart, which is now much easier to read. Adding a two-line subtitle make the action title even more compelling. Using <code>alt.mark_text()</code> we can easily add footnotes as well, in this case to provide references to the claim.</p>
<div id="cell-17" class="cell" data-execution_count="8">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb8-1">footnote <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> alt.Chart(wheat).mark_text(</span>
<span id="cb8-2">    text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"*Source: https://en.wikipedia.org/wiki/British_Agricultural_Revolution"</span>,</span>
<span id="cb8-3">    color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#000000"</span>,</span>
<span id="cb8-4">    x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>,</span>
<span id="cb8-5">    y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"height"</span>,</span>
<span id="cb8-6">    dy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>,</span>
<span id="cb8-7">    align<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"left"</span>,</span>
<span id="cb8-8">)</span>
<span id="cb8-9"></span>
<span id="cb8-10">alt.layer(barchart, footnote).properties(</span>
<span id="cb8-11">    title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.TitleParams(</span>
<span id="cb8-12">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"What's Up With Wheat"</span>,</span>
<span id="cb8-13">        subtitle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[</span>
<span id="cb8-14">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"An example of the impact of the agricultural revolution"</span>,</span>
<span id="cb8-15">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Productivity increased through mechanization*"</span>,</span>
<span id="cb8-16">        ],</span>
<span id="cb8-17">    ),</span>
<span id="cb8-18">)</span></code></pre></div></div>
</details>
<div class="cell-output cell-output-display" data-execution_count="8">

<style>
  #altair-viz-9930d27af9d344439297ed30d8f25b75.vega-embed {
    width: 100%;
    display: flex;
  }

  #altair-viz-9930d27af9d344439297ed30d8f25b75.vega-embed details,
  #altair-viz-9930d27af9d344439297ed30d8f25b75.vega-embed details summary {
    position: relative;
  }
</style>
<div id="altair-viz-9930d27af9d344439297ed30d8f25b75"></div>
<script type="text/javascript">
  var VEGA_DEBUG = (typeof VEGA_DEBUG == "undefined") ? {} : VEGA_DEBUG;
  (function(spec, embedOpt){
    let outputDiv = document.currentScript.previousElementSibling;
    if (outputDiv.id !== "altair-viz-9930d27af9d344439297ed30d8f25b75") {
      outputDiv = document.getElementById("altair-viz-9930d27af9d344439297ed30d8f25b75");
    }
    const paths = {
      "vega": "https://cdn.jsdelivr.net/npm/vega@5?noext",
      "vega-lib": "https://cdn.jsdelivr.net/npm/vega-lib?noext",
      "vega-lite": "https://cdn.jsdelivr.net/npm/vega-lite@5.16.3?noext",
      "vega-embed": "https://cdn.jsdelivr.net/npm/vega-embed@6?noext",
    };

    function maybeLoadScript(lib, version) {
      var key = `${lib.replace("-", "")}_version`;
      return (VEGA_DEBUG[key] == version) ?
        Promise.resolve(paths[lib]) :
        new Promise(function(resolve, reject) {
          var s = document.createElement('script');
          document.getElementsByTagName("head")[0].appendChild(s);
          s.async = true;
          s.onload = () => {
            VEGA_DEBUG[key] = version;
            return resolve(paths[lib]);
          };
          s.onerror = () => reject(`Error loading script: ${paths[lib]}`);
          s.src = paths[lib];
        });
    }

    function showError(err) {
      outputDiv.innerHTML = `<div class="error" style="color:red;">${err}</div>`;
      throw err;
    }

    function displayChart(vegaEmbed) {
      vegaEmbed(outputDiv, spec, embedOpt)
        .catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));
    }

    if(typeof define === "function" && define.amd) {
      requirejs.config({paths});
      require(["vega-embed"], displayChart, err => showError(`Error loading script: ${err.message}`));
    } else {
      maybeLoadScript("vega", "5")
        .then(() => maybeLoadScript("vega-lite", "5.16.3"))
        .then(() => maybeLoadScript("vega-embed", "6"))
        .catch(showError)
        .then(() => displayChart(vegaEmbed));
    }
  })({"width": 685, "height": 380, "config": {"title": {"anchor": "start", "dy": -15, "fontSize": 18, "font": "Lato", "fontColor": "#000000"}, "axisX": {"domain": true, "domainColor": "#000000", "domainWidth": 1, "grid": false, "labelFontSize": 12, "labelFont": "Lato", "labelAngle": 0, "labelOverlap": "parity", "tickColor": "#000000", "tickSize": 5, "titleFontSize": 12, "titlePadding": 10, "titleFont": "Lato"}, "axisY": {"domain": false, "grid": true, "gridColor": "#DEDDDD", "gridWidth": 1, "labelFontSize": 12, "labelFont": "Lato", "labelPadding": 8, "ticks": false, "titleAlign": "left", "titleAnchor": "start", "titleFontSize": 12, "titlePadding": 10, "titleFont": "Lato", "titleAngle": 0, "titleY": -15}, "background": "#FFFFFF", "legend": {"labelFontSize": 12, "labelFont": "Lato", "symbolSize": 100, "symbolType": "square", "titleFontSize": 12, "titlePadding": 10, "titleFont": "Lato", "title": "", "orient": "top-left", "offset": 0}, "view": {"stroke": "transparent"}, "range": {"category": ["#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7", "#000000"], "diverging": ["#cfe8f3", "#a2d4ec", "#73bfe2", "#46abdb", "#1696d2", "#12719e"]}, "area": {"fill": "#0072B2"}, "line": {"color": "#0072B2", "stroke": "#0072B2", "strokewidth": 5}, "trail": {"color": "#0072B2", "stroke": "#0072B2", "strokeWidth": 0, "size": 1}, "path": {"stroke": "#0072B2", "strokeWidth": 0.5}, "point": {"filled": true}, "text": {"font": "Lato", "color": "#0072B2", "fontSize": 11, "align": "right", "fontWeight": 400, "size": 11}, "bar": {"fill": "#0072B2", "stroke": false}}, "layer": [{"mark": {"type": "bar"}, "encoding": {"tooltip": [{"field": "year", "type": "ordinal"}, {"field": "wheat", "type": "quantitative"}], "x": {"field": "year", "type": "ordinal"}, "y": {"field": "wheat", "type": "quantitative"}}}, {"mark": {"type": "text", "align": "left", "color": "#000000", "dy": 60, "text": "*Source: https://en.wikipedia.org/wiki/British_Agricultural_Revolution", "x": 0, "y": "height"}}], "data": {"name": "data-76d1ce26ea5761007c35827e1564d86c"}, "title": {"text": "What's Up With Wheat", "subtitle": ["An example of the impact of the agricultural revolution", "Productivity increased through mechanization*"]}, "$schema": "https://vega.github.io/schema/vega-lite/v5.16.3.json", "datasets": {"data-76d1ce26ea5761007c35827e1564d86c": [{"year": 1565, "wheat": 41.0, "wages": 5.0}, {"year": 1570, "wheat": 45.0, "wages": 5.05}, {"year": 1575, "wheat": 42.0, "wages": 5.08}, {"year": 1580, "wheat": 49.0, "wages": 5.12}, {"year": 1585, "wheat": 41.5, "wages": 5.15}, {"year": 1590, "wheat": 47.0, "wages": 5.25}, {"year": 1595, "wheat": 64.0, "wages": 5.54}, {"year": 1600, "wheat": 27.0, "wages": 5.61}, {"year": 1605, "wheat": 33.0, "wages": 5.69}, {"year": 1610, "wheat": 32.0, "wages": 5.78}, {"year": 1615, "wheat": 33.0, "wages": 5.94}, {"year": 1620, "wheat": 35.0, "wages": 6.01}, {"year": 1625, "wheat": 33.0, "wages": 6.12}, {"year": 1630, "wheat": 45.0, "wages": 6.22}, {"year": 1635, "wheat": 33.0, "wages": 6.3}, {"year": 1640, "wheat": 39.0, "wages": 6.37}, {"year": 1645, "wheat": 53.0, "wages": 6.45}, {"year": 1650, "wheat": 42.0, "wages": 6.5}, {"year": 1655, "wheat": 40.5, "wages": 6.6}, {"year": 1660, "wheat": 46.5, "wages": 6.75}, {"year": 1665, "wheat": 32.0, "wages": 6.8}, {"year": 1670, "wheat": 37.0, "wages": 6.9}, {"year": 1675, "wheat": 43.0, "wages": 7.0}, {"year": 1680, "wheat": 35.0, "wages": 7.3}, {"year": 1685, "wheat": 27.0, "wages": 7.6}, {"year": 1690, "wheat": 40.0, "wages": 8.0}, {"year": 1695, "wheat": 50.0, "wages": 8.5}, {"year": 1700, "wheat": 30.0, "wages": 9.0}, {"year": 1705, "wheat": 32.0, "wages": 10.0}, {"year": 1710, "wheat": 44.0, "wages": 11.0}, {"year": 1715, "wheat": 33.0, "wages": 11.75}, {"year": 1720, "wheat": 29.0, "wages": 12.5}, {"year": 1725, "wheat": 39.0, "wages": 13.0}, {"year": 1730, "wheat": 26.0, "wages": 13.3}, {"year": 1735, "wheat": 32.0, "wages": 13.6}, {"year": 1740, "wheat": 27.0, "wages": 14.0}, {"year": 1745, "wheat": 27.5, "wages": 14.5}, {"year": 1750, "wheat": 31.0, "wages": 15.0}, {"year": 1755, "wheat": 35.5, "wages": 15.7}, {"year": 1760, "wheat": 31.0, "wages": 16.5}, {"year": 1765, "wheat": 43.0, "wages": 17.6}, {"year": 1770, "wheat": 47.0, "wages": 18.5}, {"year": 1775, "wheat": 44.0, "wages": 19.5}, {"year": 1780, "wheat": 46.0, "wages": 21.0}, {"year": 1785, "wheat": 42.0, "wages": 23.0}, {"year": 1790, "wheat": 47.5, "wages": 25.5}, {"year": 1795, "wheat": 76.0, "wages": 27.5}, {"year": 1800, "wheat": 79.0, "wages": 28.5}, {"year": 1805, "wheat": 81.0, "wages": 29.5}, {"year": 1810, "wheat": 99.0, "wages": 30.0}, {"year": 1815, "wheat": 78.0, "wages": null}, {"year": 1820, "wheat": 54.0, "wages": null}]}}, {"mode": "vega-lite"});
</script>
</div>
</div>
</section>
<section id="lose-the-legends" class="level3">
<h3 class="anchored" data-anchor-id="lose-the-legends">Lose the legends</h3>
<p>Although legends are fine for exploratory data analysis, where you don’t want to spend too much time tweaking your charts, for explanatory data analysis we want to make it as easy on the reader as possible. Unforunately, I couldn’t find a way to add annotations (instead of a legend) using Altair’s theming engine. Here’s a first shot by implementing it manually.</p>
<div id="cell-19" class="cell" data-execution_count="9">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb9-1">chart <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> alt.Chart(stocks).encode(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Color(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"symbol"</span>, legend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>))</span>
<span id="cb9-2">line <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> chart.mark_line().encode(</span>
<span id="cb9-3">    x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.X(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"date:T"</span>, axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Axis(title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"date"</span>)),</span>
<span id="cb9-4">    y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Y(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"price:Q"</span>, axis<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Axis(title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"price"</span>)),</span>
<span id="cb9-5">    tooltip<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"date"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"price"</span>],</span>
<span id="cb9-6">)</span>
<span id="cb9-7">label <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> chart.encode(</span>
<span id="cb9-8">    x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.X(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"date:T"</span>, aggregate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"max"</span>),</span>
<span id="cb9-9">    y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Y(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"price:Q"</span>, aggregate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"argmax"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"date"</span>}),</span>
<span id="cb9-10">    text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"symbol"</span>,</span>
<span id="cb9-11">)</span>
<span id="cb9-12">text <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> label.mark_text(align<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"left"</span>, dx<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>)</span>
<span id="cb9-13">circle <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> label.mark_circle()</span>
<span id="cb9-14">(</span>
<span id="cb9-15">    (line <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> circle <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> text).configure_axisX(labelAngle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, ticks<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb9-16">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># .configure_axisY(titleAngle=0, titleAlign="center", titleX=-10, titleY=-10)</span></span>
<span id="cb9-17">).properties(</span>
<span id="cb9-18">    width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">600</span>,</span>
<span id="cb9-19">    title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.TitleParams(</span>
<span id="cb9-20">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"The Rise of Google"</span>,</span>
<span id="cb9-21">        subtitle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[</span>
<span id="cb9-22">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Google went public in 2004"</span>,</span>
<span id="cb9-23">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"and outperformed other tech stocks until 2010"</span>,</span>
<span id="cb9-24">        ],</span>
<span id="cb9-25">    ),</span>
<span id="cb9-26">)</span></code></pre></div></div>
<div class="cell-output cell-output-display" data-execution_count="9">

<style>
  #altair-viz-b28b96ea177a4feba0cba7beb310b2ec.vega-embed {
    width: 100%;
    display: flex;
  }

  #altair-viz-b28b96ea177a4feba0cba7beb310b2ec.vega-embed details,
  #altair-viz-b28b96ea177a4feba0cba7beb310b2ec.vega-embed details summary {
    position: relative;
  }
</style>
<div id="altair-viz-b28b96ea177a4feba0cba7beb310b2ec"></div>
<script type="text/javascript">
  var VEGA_DEBUG = (typeof VEGA_DEBUG == "undefined") ? {} : VEGA_DEBUG;
  (function(spec, embedOpt){
    let outputDiv = document.currentScript.previousElementSibling;
    if (outputDiv.id !== "altair-viz-b28b96ea177a4feba0cba7beb310b2ec") {
      outputDiv = document.getElementById("altair-viz-b28b96ea177a4feba0cba7beb310b2ec");
    }
    const paths = {
      "vega": "https://cdn.jsdelivr.net/npm/vega@5?noext",
      "vega-lib": "https://cdn.jsdelivr.net/npm/vega-lib?noext",
      "vega-lite": "https://cdn.jsdelivr.net/npm/vega-lite@5.16.3?noext",
      "vega-embed": "https://cdn.jsdelivr.net/npm/vega-embed@6?noext",
    };

    function maybeLoadScript(lib, version) {
      var key = `${lib.replace("-", "")}_version`;
      return (VEGA_DEBUG[key] == version) ?
        Promise.resolve(paths[lib]) :
        new Promise(function(resolve, reject) {
          var s = document.createElement('script');
          document.getElementsByTagName("head")[0].appendChild(s);
          s.async = true;
          s.onload = () => {
            VEGA_DEBUG[key] = version;
            return resolve(paths[lib]);
          };
          s.onerror = () => reject(`Error loading script: ${paths[lib]}`);
          s.src = paths[lib];
        });
    }

    function showError(err) {
      outputDiv.innerHTML = `<div class="error" style="color:red;">${err}</div>`;
      throw err;
    }

    function displayChart(vegaEmbed) {
      vegaEmbed(outputDiv, spec, embedOpt)
        .catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));
    }

    if(typeof define === "function" && define.amd) {
      requirejs.config({paths});
      require(["vega-embed"], displayChart, err => showError(`Error loading script: ${err.message}`));
    } else {
      maybeLoadScript("vega", "5")
        .then(() => maybeLoadScript("vega-lite", "5.16.3"))
        .then(() => maybeLoadScript("vega-embed", "6"))
        .catch(showError)
        .then(() => displayChart(vegaEmbed));
    }
  })({"width": 600, "height": 380, "config": {"title": {"anchor": "start", "dy": -15, "fontSize": 18, "font": "Lato", "fontColor": "#000000"}, "axisX": {"domain": true, "domainColor": "#000000", "domainWidth": 1, "grid": false, "labelFontSize": 12, "labelFont": "Lato", "labelAngle": 0, "labelOverlap": "parity", "tickColor": "#000000", "tickSize": 5, "titleFontSize": 12, "titlePadding": 10, "titleFont": "Lato", "ticks": false}, "axisY": {"domain": false, "grid": true, "gridColor": "#DEDDDD", "gridWidth": 1, "labelFontSize": 12, "labelFont": "Lato", "labelPadding": 8, "ticks": false, "titleAlign": "left", "titleAnchor": "start", "titleFontSize": 12, "titlePadding": 10, "titleFont": "Lato", "titleAngle": 0, "titleY": -15}, "background": "#FFFFFF", "legend": {"labelFontSize": 12, "labelFont": "Lato", "symbolSize": 100, "symbolType": "square", "titleFontSize": 12, "titlePadding": 10, "titleFont": "Lato", "title": "", "orient": "top-left", "offset": 0}, "view": {"stroke": "transparent"}, "range": {"category": ["#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7", "#000000"], "diverging": ["#cfe8f3", "#a2d4ec", "#73bfe2", "#46abdb", "#1696d2", "#12719e"]}, "area": {"fill": "#0072B2"}, "line": {"color": "#0072B2", "stroke": "#0072B2", "strokewidth": 5}, "trail": {"color": "#0072B2", "stroke": "#0072B2", "strokeWidth": 0, "size": 1}, "path": {"stroke": "#0072B2", "strokeWidth": 0.5}, "point": {"filled": true}, "text": {"font": "Lato", "color": "#0072B2", "fontSize": 11, "align": "right", "fontWeight": 400, "size": 11}, "bar": {"fill": "#0072B2", "stroke": false}}, "layer": [{"mark": {"type": "line"}, "encoding": {"color": {"field": "symbol", "legend": null, "type": "nominal"}, "tooltip": [{"field": "date", "type": "temporal"}, {"field": "price", "type": "quantitative"}], "x": {"axis": {"title": "date"}, "field": "date", "type": "temporal"}, "y": {"axis": {"title": "price"}, "field": "price", "type": "quantitative"}}}, {"mark": {"type": "circle"}, "encoding": {"color": {"field": "symbol", "legend": null, "type": "nominal"}, "text": {"field": "symbol", "type": "nominal"}, "x": {"aggregate": "max", "field": "date", "type": "temporal"}, "y": {"aggregate": {"argmax": "date"}, "field": "price", "type": "quantitative"}}}, {"mark": {"type": "text", "align": "left", "dx": 4}, "encoding": {"color": {"field": "symbol", "legend": null, "type": "nominal"}, "text": {"field": "symbol", "type": "nominal"}, "x": {"aggregate": "max", "field": "date", "type": "temporal"}, "y": {"aggregate": {"argmax": "date"}, "field": "price", "type": "quantitative"}}}], "data": {"name": "data-96e857a61c6b623bafe23440d582a500"}, "title": {"text": "The Rise of Google", "subtitle": ["Google went public in 2004", "and outperformed other tech stocks until 2010"]}, "$schema": "https://vega.github.io/schema/vega-lite/v5.16.3.json", "datasets": {"data-96e857a61c6b623bafe23440d582a500": [{"symbol": "MSFT", "date": "2000-01-01T00:00:00", "price": 39.81}, {"symbol": "MSFT", "date": "2000-02-01T00:00:00", "price": 36.35}, {"symbol": "MSFT", "date": "2000-03-01T00:00:00", "price": 43.22}, {"symbol": "MSFT", "date": "2000-04-01T00:00:00", "price": 28.37}, {"symbol": "MSFT", "date": "2000-05-01T00:00:00", "price": 25.45}, {"symbol": "MSFT", "date": "2000-06-01T00:00:00", "price": 32.54}, {"symbol": "MSFT", "date": "2000-07-01T00:00:00", "price": 28.4}, {"symbol": "MSFT", "date": "2000-08-01T00:00:00", "price": 28.4}, {"symbol": "MSFT", "date": "2000-09-01T00:00:00", "price": 24.53}, {"symbol": "MSFT", "date": "2000-10-01T00:00:00", "price": 28.02}, {"symbol": "MSFT", "date": "2000-11-01T00:00:00", "price": 23.34}, {"symbol": "MSFT", "date": "2000-12-01T00:00:00", "price": 17.65}, {"symbol": "MSFT", "date": "2001-01-01T00:00:00", "price": 24.84}, {"symbol": "MSFT", "date": "2001-02-01T00:00:00", "price": 24.0}, {"symbol": "MSFT", "date": "2001-03-01T00:00:00", "price": 22.25}, {"symbol": "MSFT", "date": "2001-04-01T00:00:00", "price": 27.56}, {"symbol": "MSFT", "date": "2001-05-01T00:00:00", "price": 28.14}, {"symbol": "MSFT", "date": "2001-06-01T00:00:00", "price": 29.7}, {"symbol": "MSFT", "date": "2001-07-01T00:00:00", "price": 26.93}, {"symbol": "MSFT", "date": "2001-08-01T00:00:00", "price": 23.21}, {"symbol": "MSFT", "date": "2001-09-01T00:00:00", "price": 20.82}, {"symbol": "MSFT", "date": "2001-10-01T00:00:00", "price": 23.65}, {"symbol": "MSFT", "date": "2001-11-01T00:00:00", "price": 26.12}, {"symbol": "MSFT", "date": "2001-12-01T00:00:00", "price": 26.95}, {"symbol": "MSFT", "date": "2002-01-01T00:00:00", "price": 25.92}, {"symbol": "MSFT", "date": "2002-02-01T00:00:00", "price": 23.73}, {"symbol": "MSFT", "date": "2002-03-01T00:00:00", "price": 24.53}, {"symbol": "MSFT", "date": "2002-04-01T00:00:00", "price": 21.26}, {"symbol": "MSFT", "date": "2002-05-01T00:00:00", "price": 20.71}, {"symbol": "MSFT", "date": "2002-06-01T00:00:00", "price": 22.25}, {"symbol": "MSFT", "date": "2002-07-01T00:00:00", "price": 19.52}, {"symbol": "MSFT", "date": "2002-08-01T00:00:00", "price": 19.97}, {"symbol": "MSFT", "date": "2002-09-01T00:00:00", "price": 17.79}, {"symbol": "MSFT", "date": "2002-10-01T00:00:00", "price": 21.75}, {"symbol": "MSFT", "date": "2002-11-01T00:00:00", "price": 23.46}, {"symbol": "MSFT", "date": "2002-12-01T00:00:00", "price": 21.03}, {"symbol": "MSFT", "date": "2003-01-01T00:00:00", "price": 19.31}, {"symbol": "MSFT", "date": "2003-02-01T00:00:00", "price": 19.34}, {"symbol": "MSFT", "date": "2003-03-01T00:00:00", "price": 19.76}, {"symbol": "MSFT", "date": "2003-04-01T00:00:00", "price": 20.87}, {"symbol": "MSFT", "date": "2003-05-01T00:00:00", "price": 20.09}, {"symbol": "MSFT", "date": "2003-06-01T00:00:00", "price": 20.93}, {"symbol": "MSFT", "date": "2003-07-01T00:00:00", "price": 21.56}, {"symbol": "MSFT", "date": "2003-08-01T00:00:00", "price": 21.65}, {"symbol": "MSFT", "date": "2003-09-01T00:00:00", "price": 22.69}, {"symbol": "MSFT", "date": "2003-10-01T00:00:00", "price": 21.45}, {"symbol": "MSFT", "date": "2003-11-01T00:00:00", "price": 21.1}, {"symbol": "MSFT", "date": "2003-12-01T00:00:00", "price": 22.46}, {"symbol": "MSFT", "date": "2004-01-01T00:00:00", "price": 22.69}, {"symbol": "MSFT", "date": "2004-02-01T00:00:00", "price": 21.77}, {"symbol": "MSFT", "date": "2004-03-01T00:00:00", "price": 20.46}, {"symbol": "MSFT", "date": "2004-04-01T00:00:00", "price": 21.45}, {"symbol": "MSFT", "date": "2004-05-01T00:00:00", "price": 21.53}, {"symbol": "MSFT", "date": "2004-06-01T00:00:00", "price": 23.44}, {"symbol": "MSFT", "date": "2004-07-01T00:00:00", "price": 23.38}, {"symbol": "MSFT", "date": "2004-08-01T00:00:00", "price": 22.47}, {"symbol": "MSFT", "date": "2004-09-01T00:00:00", "price": 22.76}, {"symbol": "MSFT", "date": "2004-10-01T00:00:00", "price": 23.02}, {"symbol": "MSFT", "date": "2004-11-01T00:00:00", "price": 24.6}, {"symbol": "MSFT", "date": "2004-12-01T00:00:00", "price": 24.52}, {"symbol": "MSFT", "date": "2005-01-01T00:00:00", "price": 24.11}, {"symbol": "MSFT", "date": "2005-02-01T00:00:00", "price": 23.15}, {"symbol": "MSFT", "date": "2005-03-01T00:00:00", "price": 22.24}, {"symbol": "MSFT", "date": "2005-04-01T00:00:00", "price": 23.28}, {"symbol": "MSFT", "date": "2005-05-01T00:00:00", "price": 23.82}, {"symbol": "MSFT", "date": "2005-06-01T00:00:00", "price": 22.93}, {"symbol": "MSFT", "date": "2005-07-01T00:00:00", "price": 23.64}, {"symbol": "MSFT", "date": "2005-08-01T00:00:00", "price": 25.35}, {"symbol": "MSFT", "date": "2005-09-01T00:00:00", "price": 23.83}, {"symbol": "MSFT", "date": "2005-10-01T00:00:00", "price": 23.8}, {"symbol": "MSFT", "date": "2005-11-01T00:00:00", "price": 25.71}, {"symbol": "MSFT", "date": "2005-12-01T00:00:00", "price": 24.29}, {"symbol": "MSFT", "date": "2006-01-01T00:00:00", "price": 26.14}, {"symbol": "MSFT", "date": "2006-02-01T00:00:00", "price": 25.04}, {"symbol": "MSFT", "date": "2006-03-01T00:00:00", "price": 25.36}, {"symbol": "MSFT", "date": "2006-04-01T00:00:00", "price": 22.5}, {"symbol": "MSFT", "date": "2006-05-01T00:00:00", "price": 21.19}, {"symbol": "MSFT", "date": "2006-06-01T00:00:00", "price": 21.8}, {"symbol": "MSFT", "date": "2006-07-01T00:00:00", "price": 22.51}, {"symbol": "MSFT", "date": "2006-08-01T00:00:00", "price": 24.13}, {"symbol": "MSFT", "date": "2006-09-01T00:00:00", "price": 25.68}, {"symbol": "MSFT", "date": "2006-10-01T00:00:00", "price": 26.96}, {"symbol": "MSFT", "date": "2006-11-01T00:00:00", "price": 27.66}, {"symbol": "MSFT", "date": "2006-12-01T00:00:00", "price": 28.13}, {"symbol": "MSFT", "date": "2007-01-01T00:00:00", "price": 29.07}, {"symbol": "MSFT", "date": "2007-02-01T00:00:00", "price": 26.63}, {"symbol": "MSFT", "date": "2007-03-01T00:00:00", "price": 26.35}, {"symbol": "MSFT", "date": "2007-04-01T00:00:00", "price": 28.3}, {"symbol": "MSFT", "date": "2007-05-01T00:00:00", "price": 29.11}, {"symbol": "MSFT", "date": "2007-06-01T00:00:00", "price": 27.95}, {"symbol": "MSFT", "date": "2007-07-01T00:00:00", "price": 27.5}, {"symbol": "MSFT", "date": "2007-08-01T00:00:00", "price": 27.34}, {"symbol": "MSFT", "date": "2007-09-01T00:00:00", "price": 28.04}, {"symbol": "MSFT", "date": "2007-10-01T00:00:00", "price": 35.03}, {"symbol": "MSFT", "date": "2007-11-01T00:00:00", "price": 32.09}, {"symbol": "MSFT", "date": "2007-12-01T00:00:00", "price": 34.0}, {"symbol": "MSFT", "date": "2008-01-01T00:00:00", "price": 31.13}, {"symbol": "MSFT", "date": "2008-02-01T00:00:00", "price": 26.07}, {"symbol": "MSFT", "date": "2008-03-01T00:00:00", "price": 27.21}, {"symbol": "MSFT", "date": "2008-04-01T00:00:00", "price": 27.34}, {"symbol": "MSFT", "date": "2008-05-01T00:00:00", "price": 27.25}, {"symbol": "MSFT", "date": "2008-06-01T00:00:00", "price": 26.47}, {"symbol": "MSFT", "date": "2008-07-01T00:00:00", "price": 24.75}, {"symbol": "MSFT", "date": "2008-08-01T00:00:00", "price": 26.36}, {"symbol": "MSFT", "date": "2008-09-01T00:00:00", "price": 25.78}, {"symbol": "MSFT", "date": "2008-10-01T00:00:00", "price": 21.57}, {"symbol": "MSFT", "date": "2008-11-01T00:00:00", "price": 19.66}, {"symbol": "MSFT", "date": "2008-12-01T00:00:00", "price": 18.91}, {"symbol": "MSFT", "date": "2009-01-01T00:00:00", "price": 16.63}, {"symbol": "MSFT", "date": "2009-02-01T00:00:00", "price": 15.81}, {"symbol": "MSFT", "date": "2009-03-01T00:00:00", "price": 17.99}, {"symbol": "MSFT", "date": "2009-04-01T00:00:00", "price": 19.84}, {"symbol": "MSFT", "date": "2009-05-01T00:00:00", "price": 20.59}, {"symbol": "MSFT", "date": "2009-06-01T00:00:00", "price": 23.42}, {"symbol": "MSFT", "date": "2009-07-01T00:00:00", "price": 23.18}, {"symbol": "MSFT", "date": "2009-08-01T00:00:00", "price": 24.43}, {"symbol": "MSFT", "date": "2009-09-01T00:00:00", "price": 25.49}, {"symbol": "MSFT", "date": "2009-10-01T00:00:00", "price": 27.48}, {"symbol": "MSFT", "date": "2009-11-01T00:00:00", "price": 29.27}, {"symbol": "MSFT", "date": "2009-12-01T00:00:00", "price": 30.34}, {"symbol": "MSFT", "date": "2010-01-01T00:00:00", "price": 28.05}, {"symbol": "MSFT", "date": "2010-02-01T00:00:00", "price": 28.67}, {"symbol": "MSFT", "date": "2010-03-01T00:00:00", "price": 28.8}, {"symbol": "AMZN", "date": "2000-01-01T00:00:00", "price": 64.56}, {"symbol": "AMZN", "date": "2000-02-01T00:00:00", "price": 68.87}, {"symbol": "AMZN", "date": "2000-03-01T00:00:00", "price": 67.0}, {"symbol": "AMZN", "date": "2000-04-01T00:00:00", "price": 55.19}, {"symbol": "AMZN", "date": "2000-05-01T00:00:00", "price": 48.31}, {"symbol": "AMZN", "date": "2000-06-01T00:00:00", "price": 36.31}, {"symbol": "AMZN", "date": "2000-07-01T00:00:00", "price": 30.12}, {"symbol": "AMZN", "date": "2000-08-01T00:00:00", "price": 41.5}, {"symbol": "AMZN", "date": "2000-09-01T00:00:00", "price": 38.44}, {"symbol": "AMZN", "date": "2000-10-01T00:00:00", "price": 36.62}, {"symbol": "AMZN", "date": "2000-11-01T00:00:00", "price": 24.69}, {"symbol": "AMZN", "date": "2000-12-01T00:00:00", "price": 15.56}, {"symbol": "AMZN", "date": "2001-01-01T00:00:00", "price": 17.31}, {"symbol": "AMZN", "date": "2001-02-01T00:00:00", "price": 10.19}, {"symbol": "AMZN", "date": "2001-03-01T00:00:00", "price": 10.23}, {"symbol": "AMZN", "date": "2001-04-01T00:00:00", "price": 15.78}, {"symbol": "AMZN", "date": "2001-05-01T00:00:00", "price": 16.69}, {"symbol": "AMZN", "date": "2001-06-01T00:00:00", "price": 14.15}, {"symbol": "AMZN", "date": "2001-07-01T00:00:00", "price": 12.49}, {"symbol": "AMZN", "date": "2001-08-01T00:00:00", "price": 8.94}, {"symbol": "AMZN", "date": "2001-09-01T00:00:00", "price": 5.97}, {"symbol": "AMZN", "date": "2001-10-01T00:00:00", "price": 6.98}, {"symbol": "AMZN", "date": "2001-11-01T00:00:00", "price": 11.32}, {"symbol": "AMZN", "date": "2001-12-01T00:00:00", "price": 10.82}, {"symbol": "AMZN", "date": "2002-01-01T00:00:00", "price": 14.19}, {"symbol": "AMZN", "date": "2002-02-01T00:00:00", "price": 14.1}, {"symbol": "AMZN", "date": "2002-03-01T00:00:00", "price": 14.3}, {"symbol": "AMZN", "date": "2002-04-01T00:00:00", "price": 16.69}, {"symbol": "AMZN", "date": "2002-05-01T00:00:00", "price": 18.23}, {"symbol": "AMZN", "date": "2002-06-01T00:00:00", "price": 16.25}, {"symbol": "AMZN", "date": "2002-07-01T00:00:00", "price": 14.45}, {"symbol": "AMZN", "date": "2002-08-01T00:00:00", "price": 14.94}, {"symbol": "AMZN", "date": "2002-09-01T00:00:00", "price": 15.93}, {"symbol": "AMZN", "date": "2002-10-01T00:00:00", "price": 19.36}, {"symbol": "AMZN", "date": "2002-11-01T00:00:00", "price": 23.35}, {"symbol": "AMZN", "date": "2002-12-01T00:00:00", "price": 18.89}, {"symbol": "AMZN", "date": "2003-01-01T00:00:00", "price": 21.85}, {"symbol": "AMZN", "date": "2003-02-01T00:00:00", "price": 22.01}, {"symbol": "AMZN", "date": "2003-03-01T00:00:00", "price": 26.03}, {"symbol": "AMZN", "date": "2003-04-01T00:00:00", "price": 28.69}, {"symbol": "AMZN", "date": "2003-05-01T00:00:00", "price": 35.89}, {"symbol": "AMZN", "date": "2003-06-01T00:00:00", "price": 36.32}, {"symbol": "AMZN", "date": "2003-07-01T00:00:00", "price": 41.64}, {"symbol": "AMZN", "date": "2003-08-01T00:00:00", "price": 46.32}, {"symbol": "AMZN", "date": "2003-09-01T00:00:00", "price": 48.43}, {"symbol": "AMZN", "date": "2003-10-01T00:00:00", "price": 54.43}, {"symbol": "AMZN", "date": "2003-11-01T00:00:00", "price": 53.97}, {"symbol": "AMZN", "date": "2003-12-01T00:00:00", "price": 52.62}, {"symbol": "AMZN", "date": "2004-01-01T00:00:00", "price": 50.4}, {"symbol": "AMZN", "date": "2004-02-01T00:00:00", "price": 43.01}, {"symbol": "AMZN", "date": "2004-03-01T00:00:00", "price": 43.28}, {"symbol": "AMZN", "date": "2004-04-01T00:00:00", "price": 43.6}, {"symbol": "AMZN", "date": "2004-05-01T00:00:00", "price": 48.5}, {"symbol": "AMZN", "date": "2004-06-01T00:00:00", "price": 54.4}, {"symbol": "AMZN", "date": "2004-07-01T00:00:00", "price": 38.92}, {"symbol": "AMZN", "date": "2004-08-01T00:00:00", "price": 38.14}, {"symbol": "AMZN", "date": "2004-09-01T00:00:00", "price": 40.86}, {"symbol": "AMZN", "date": "2004-10-01T00:00:00", "price": 34.13}, {"symbol": "AMZN", "date": "2004-11-01T00:00:00", "price": 39.68}, {"symbol": "AMZN", "date": "2004-12-01T00:00:00", "price": 44.29}, {"symbol": "AMZN", "date": "2005-01-01T00:00:00", "price": 43.22}, {"symbol": "AMZN", "date": "2005-02-01T00:00:00", "price": 35.18}, {"symbol": "AMZN", "date": "2005-03-01T00:00:00", "price": 34.27}, {"symbol": "AMZN", "date": "2005-04-01T00:00:00", "price": 32.36}, {"symbol": "AMZN", "date": "2005-05-01T00:00:00", "price": 35.51}, {"symbol": "AMZN", "date": "2005-06-01T00:00:00", "price": 33.09}, {"symbol": "AMZN", "date": "2005-07-01T00:00:00", "price": 45.15}, {"symbol": "AMZN", "date": "2005-08-01T00:00:00", "price": 42.7}, {"symbol": "AMZN", "date": "2005-09-01T00:00:00", "price": 45.3}, {"symbol": "AMZN", "date": "2005-10-01T00:00:00", "price": 39.86}, {"symbol": "AMZN", "date": "2005-11-01T00:00:00", "price": 48.46}, {"symbol": "AMZN", "date": "2005-12-01T00:00:00", "price": 47.15}, {"symbol": "AMZN", "date": "2006-01-01T00:00:00", "price": 44.82}, {"symbol": "AMZN", "date": "2006-02-01T00:00:00", "price": 37.44}, {"symbol": "AMZN", "date": "2006-03-01T00:00:00", "price": 36.53}, {"symbol": "AMZN", "date": "2006-04-01T00:00:00", "price": 35.21}, {"symbol": "AMZN", "date": "2006-05-01T00:00:00", "price": 34.61}, {"symbol": "AMZN", "date": "2006-06-01T00:00:00", "price": 38.68}, {"symbol": "AMZN", "date": "2006-07-01T00:00:00", "price": 26.89}, {"symbol": "AMZN", "date": "2006-08-01T00:00:00", "price": 30.83}, {"symbol": "AMZN", "date": "2006-09-01T00:00:00", "price": 32.12}, {"symbol": "AMZN", "date": "2006-10-01T00:00:00", "price": 38.09}, {"symbol": "AMZN", "date": "2006-11-01T00:00:00", "price": 40.34}, {"symbol": "AMZN", "date": "2006-12-01T00:00:00", "price": 39.46}, {"symbol": "AMZN", "date": "2007-01-01T00:00:00", "price": 37.67}, {"symbol": "AMZN", "date": "2007-02-01T00:00:00", "price": 39.14}, {"symbol": "AMZN", "date": "2007-03-01T00:00:00", "price": 39.79}, {"symbol": "AMZN", "date": "2007-04-01T00:00:00", "price": 61.33}, {"symbol": "AMZN", "date": "2007-05-01T00:00:00", "price": 69.14}, {"symbol": "AMZN", "date": "2007-06-01T00:00:00", "price": 68.41}, {"symbol": "AMZN", "date": "2007-07-01T00:00:00", "price": 78.54}, {"symbol": "AMZN", "date": "2007-08-01T00:00:00", "price": 79.91}, {"symbol": "AMZN", "date": "2007-09-01T00:00:00", "price": 93.15}, {"symbol": "AMZN", "date": "2007-10-01T00:00:00", "price": 89.15}, {"symbol": "AMZN", "date": "2007-11-01T00:00:00", "price": 90.56}, {"symbol": "AMZN", "date": "2007-12-01T00:00:00", "price": 92.64}, {"symbol": "AMZN", "date": "2008-01-01T00:00:00", "price": 77.7}, {"symbol": "AMZN", "date": "2008-02-01T00:00:00", "price": 64.47}, {"symbol": "AMZN", "date": "2008-03-01T00:00:00", "price": 71.3}, {"symbol": "AMZN", "date": "2008-04-01T00:00:00", "price": 78.63}, {"symbol": "AMZN", "date": "2008-05-01T00:00:00", "price": 81.62}, {"symbol": "AMZN", "date": "2008-06-01T00:00:00", "price": 73.33}, {"symbol": "AMZN", "date": "2008-07-01T00:00:00", "price": 76.34}, {"symbol": "AMZN", "date": "2008-08-01T00:00:00", "price": 80.81}, {"symbol": "AMZN", "date": "2008-09-01T00:00:00", "price": 72.76}, {"symbol": "AMZN", "date": "2008-10-01T00:00:00", "price": 57.24}, {"symbol": "AMZN", "date": "2008-11-01T00:00:00", "price": 42.7}, {"symbol": "AMZN", "date": "2008-12-01T00:00:00", "price": 51.28}, {"symbol": "AMZN", "date": "2009-01-01T00:00:00", "price": 58.82}, {"symbol": "AMZN", "date": "2009-02-01T00:00:00", "price": 64.79}, {"symbol": "AMZN", "date": "2009-03-01T00:00:00", "price": 73.44}, {"symbol": "AMZN", "date": "2009-04-01T00:00:00", "price": 80.52}, {"symbol": "AMZN", "date": "2009-05-01T00:00:00", "price": 77.99}, {"symbol": "AMZN", "date": "2009-06-01T00:00:00", "price": 83.66}, {"symbol": "AMZN", "date": "2009-07-01T00:00:00", "price": 85.76}, {"symbol": "AMZN", "date": "2009-08-01T00:00:00", "price": 81.19}, {"symbol": "AMZN", "date": "2009-09-01T00:00:00", "price": 93.36}, {"symbol": "AMZN", "date": "2009-10-01T00:00:00", "price": 118.81}, {"symbol": "AMZN", "date": "2009-11-01T00:00:00", "price": 135.91}, {"symbol": "AMZN", "date": "2009-12-01T00:00:00", "price": 134.52}, {"symbol": "AMZN", "date": "2010-01-01T00:00:00", "price": 125.41}, {"symbol": "AMZN", "date": "2010-02-01T00:00:00", "price": 118.4}, {"symbol": "AMZN", "date": "2010-03-01T00:00:00", "price": 128.82}, {"symbol": "IBM", "date": "2000-01-01T00:00:00", "price": 100.52}, {"symbol": "IBM", "date": "2000-02-01T00:00:00", "price": 92.11}, {"symbol": "IBM", "date": "2000-03-01T00:00:00", "price": 106.11}, {"symbol": "IBM", "date": "2000-04-01T00:00:00", "price": 99.95}, {"symbol": "IBM", "date": "2000-05-01T00:00:00", "price": 96.31}, {"symbol": "IBM", "date": "2000-06-01T00:00:00", "price": 98.33}, {"symbol": "IBM", "date": "2000-07-01T00:00:00", "price": 100.74}, {"symbol": "IBM", "date": "2000-08-01T00:00:00", "price": 118.62}, {"symbol": "IBM", "date": "2000-09-01T00:00:00", "price": 101.19}, {"symbol": "IBM", "date": "2000-10-01T00:00:00", "price": 88.5}, {"symbol": "IBM", "date": "2000-11-01T00:00:00", "price": 84.12}, {"symbol": "IBM", "date": "2000-12-01T00:00:00", "price": 76.47}, {"symbol": "IBM", "date": "2001-01-01T00:00:00", "price": 100.76}, {"symbol": "IBM", "date": "2001-02-01T00:00:00", "price": 89.98}, {"symbol": "IBM", "date": "2001-03-01T00:00:00", "price": 86.63}, {"symbol": "IBM", "date": "2001-04-01T00:00:00", "price": 103.7}, {"symbol": "IBM", "date": "2001-05-01T00:00:00", "price": 100.82}, {"symbol": "IBM", "date": "2001-06-01T00:00:00", "price": 102.35}, {"symbol": "IBM", "date": "2001-07-01T00:00:00", "price": 94.87}, {"symbol": "IBM", "date": "2001-08-01T00:00:00", "price": 90.25}, {"symbol": "IBM", "date": "2001-09-01T00:00:00", "price": 82.82}, {"symbol": "IBM", "date": "2001-10-01T00:00:00", "price": 97.58}, {"symbol": "IBM", "date": "2001-11-01T00:00:00", "price": 104.5}, {"symbol": "IBM", "date": "2001-12-01T00:00:00", "price": 109.36}, {"symbol": "IBM", "date": "2002-01-01T00:00:00", "price": 97.54}, {"symbol": "IBM", "date": "2002-02-01T00:00:00", "price": 88.82}, {"symbol": "IBM", "date": "2002-03-01T00:00:00", "price": 94.15}, {"symbol": "IBM", "date": "2002-04-01T00:00:00", "price": 75.82}, {"symbol": "IBM", "date": "2002-05-01T00:00:00", "price": 72.97}, {"symbol": "IBM", "date": "2002-06-01T00:00:00", "price": 65.31}, {"symbol": "IBM", "date": "2002-07-01T00:00:00", "price": 63.86}, {"symbol": "IBM", "date": "2002-08-01T00:00:00", "price": 68.52}, {"symbol": "IBM", "date": "2002-09-01T00:00:00", "price": 53.01}, {"symbol": "IBM", "date": "2002-10-01T00:00:00", "price": 71.76}, {"symbol": "IBM", "date": "2002-11-01T00:00:00", "price": 79.16}, {"symbol": "IBM", "date": "2002-12-01T00:00:00", "price": 70.58}, {"symbol": "IBM", "date": "2003-01-01T00:00:00", "price": 71.22}, {"symbol": "IBM", "date": "2003-02-01T00:00:00", "price": 71.13}, {"symbol": "IBM", "date": "2003-03-01T00:00:00", "price": 71.57}, {"symbol": "IBM", "date": "2003-04-01T00:00:00", "price": 77.47}, {"symbol": "IBM", "date": "2003-05-01T00:00:00", "price": 80.48}, {"symbol": "IBM", "date": "2003-06-01T00:00:00", "price": 75.42}, {"symbol": "IBM", "date": "2003-07-01T00:00:00", "price": 74.28}, {"symbol": "IBM", "date": "2003-08-01T00:00:00", "price": 75.12}, {"symbol": "IBM", "date": "2003-09-01T00:00:00", "price": 80.91}, {"symbol": "IBM", "date": "2003-10-01T00:00:00", "price": 81.96}, {"symbol": "IBM", "date": "2003-11-01T00:00:00", "price": 83.08}, {"symbol": "IBM", "date": "2003-12-01T00:00:00", "price": 85.05}, {"symbol": "IBM", "date": "2004-01-01T00:00:00", "price": 91.06}, {"symbol": "IBM", "date": "2004-02-01T00:00:00", "price": 88.7}, {"symbol": "IBM", "date": "2004-03-01T00:00:00", "price": 84.41}, {"symbol": "IBM", "date": "2004-04-01T00:00:00", "price": 81.04}, {"symbol": "IBM", "date": "2004-05-01T00:00:00", "price": 81.59}, {"symbol": "IBM", "date": "2004-06-01T00:00:00", "price": 81.19}, {"symbol": "IBM", "date": "2004-07-01T00:00:00", "price": 80.19}, {"symbol": "IBM", "date": "2004-08-01T00:00:00", "price": 78.17}, {"symbol": "IBM", "date": "2004-09-01T00:00:00", "price": 79.13}, {"symbol": "IBM", "date": "2004-10-01T00:00:00", "price": 82.84}, {"symbol": "IBM", "date": "2004-11-01T00:00:00", "price": 87.15}, {"symbol": "IBM", "date": "2004-12-01T00:00:00", "price": 91.16}, {"symbol": "IBM", "date": "2005-01-01T00:00:00", "price": 86.39}, {"symbol": "IBM", "date": "2005-02-01T00:00:00", "price": 85.78}, {"symbol": "IBM", "date": "2005-03-01T00:00:00", "price": 84.66}, {"symbol": "IBM", "date": "2005-04-01T00:00:00", "price": 70.77}, {"symbol": "IBM", "date": "2005-05-01T00:00:00", "price": 70.18}, {"symbol": "IBM", "date": "2005-06-01T00:00:00", "price": 68.93}, {"symbol": "IBM", "date": "2005-07-01T00:00:00", "price": 77.53}, {"symbol": "IBM", "date": "2005-08-01T00:00:00", "price": 75.07}, {"symbol": "IBM", "date": "2005-09-01T00:00:00", "price": 74.7}, {"symbol": "IBM", "date": "2005-10-01T00:00:00", "price": 76.25}, {"symbol": "IBM", "date": "2005-11-01T00:00:00", "price": 82.98}, {"symbol": "IBM", "date": "2005-12-01T00:00:00", "price": 76.73}, {"symbol": "IBM", "date": "2006-01-01T00:00:00", "price": 75.89}, {"symbol": "IBM", "date": "2006-02-01T00:00:00", "price": 75.09}, {"symbol": "IBM", "date": "2006-03-01T00:00:00", "price": 77.17}, {"symbol": "IBM", "date": "2006-04-01T00:00:00", "price": 77.05}, {"symbol": "IBM", "date": "2006-05-01T00:00:00", "price": 75.04}, {"symbol": "IBM", "date": "2006-06-01T00:00:00", "price": 72.15}, {"symbol": "IBM", "date": "2006-07-01T00:00:00", "price": 72.7}, {"symbol": "IBM", "date": "2006-08-01T00:00:00", "price": 76.35}, {"symbol": "IBM", "date": "2006-09-01T00:00:00", "price": 77.26}, {"symbol": "IBM", "date": "2006-10-01T00:00:00", "price": 87.06}, {"symbol": "IBM", "date": "2006-11-01T00:00:00", "price": 86.95}, {"symbol": "IBM", "date": "2006-12-01T00:00:00", "price": 91.9}, {"symbol": "IBM", "date": "2007-01-01T00:00:00", "price": 93.79}, {"symbol": "IBM", "date": "2007-02-01T00:00:00", "price": 88.18}, {"symbol": "IBM", "date": "2007-03-01T00:00:00", "price": 89.44}, {"symbol": "IBM", "date": "2007-04-01T00:00:00", "price": 96.98}, {"symbol": "IBM", "date": "2007-05-01T00:00:00", "price": 101.54}, {"symbol": "IBM", "date": "2007-06-01T00:00:00", "price": 100.25}, {"symbol": "IBM", "date": "2007-07-01T00:00:00", "price": 105.4}, {"symbol": "IBM", "date": "2007-08-01T00:00:00", "price": 111.54}, {"symbol": "IBM", "date": "2007-09-01T00:00:00", "price": 112.6}, {"symbol": "IBM", "date": "2007-10-01T00:00:00", "price": 111.0}, {"symbol": "IBM", "date": "2007-11-01T00:00:00", "price": 100.9}, {"symbol": "IBM", "date": "2007-12-01T00:00:00", "price": 103.7}, {"symbol": "IBM", "date": "2008-01-01T00:00:00", "price": 102.75}, {"symbol": "IBM", "date": "2008-02-01T00:00:00", "price": 109.64}, {"symbol": "IBM", "date": "2008-03-01T00:00:00", "price": 110.87}, {"symbol": "IBM", "date": "2008-04-01T00:00:00", "price": 116.23}, {"symbol": "IBM", "date": "2008-05-01T00:00:00", "price": 125.14}, {"symbol": "IBM", "date": "2008-06-01T00:00:00", "price": 114.6}, {"symbol": "IBM", "date": "2008-07-01T00:00:00", "price": 123.74}, {"symbol": "IBM", "date": "2008-08-01T00:00:00", "price": 118.16}, {"symbol": "IBM", "date": "2008-09-01T00:00:00", "price": 113.53}, {"symbol": "IBM", "date": "2008-10-01T00:00:00", "price": 90.24}, {"symbol": "IBM", "date": "2008-11-01T00:00:00", "price": 79.65}, {"symbol": "IBM", "date": "2008-12-01T00:00:00", "price": 82.15}, {"symbol": "IBM", "date": "2009-01-01T00:00:00", "price": 89.46}, {"symbol": "IBM", "date": "2009-02-01T00:00:00", "price": 90.32}, {"symbol": "IBM", "date": "2009-03-01T00:00:00", "price": 95.09}, {"symbol": "IBM", "date": "2009-04-01T00:00:00", "price": 101.29}, {"symbol": "IBM", "date": "2009-05-01T00:00:00", "price": 104.85}, {"symbol": "IBM", "date": "2009-06-01T00:00:00", "price": 103.01}, {"symbol": "IBM", "date": "2009-07-01T00:00:00", "price": 116.34}, {"symbol": "IBM", "date": "2009-08-01T00:00:00", "price": 117.0}, {"symbol": "IBM", "date": "2009-09-01T00:00:00", "price": 118.55}, {"symbol": "IBM", "date": "2009-10-01T00:00:00", "price": 119.54}, {"symbol": "IBM", "date": "2009-11-01T00:00:00", "price": 125.79}, {"symbol": "IBM", "date": "2009-12-01T00:00:00", "price": 130.32}, {"symbol": "IBM", "date": "2010-01-01T00:00:00", "price": 121.85}, {"symbol": "IBM", "date": "2010-02-01T00:00:00", "price": 127.16}, {"symbol": "IBM", "date": "2010-03-01T00:00:00", "price": 125.55}, {"symbol": "GOOG", "date": "2004-08-01T00:00:00", "price": 102.37}, {"symbol": "GOOG", "date": "2004-09-01T00:00:00", "price": 129.6}, {"symbol": "GOOG", "date": "2004-10-01T00:00:00", "price": 190.64}, {"symbol": "GOOG", "date": "2004-11-01T00:00:00", "price": 181.98}, {"symbol": "GOOG", "date": "2004-12-01T00:00:00", "price": 192.79}, {"symbol": "GOOG", "date": "2005-01-01T00:00:00", "price": 195.62}, {"symbol": "GOOG", "date": "2005-02-01T00:00:00", "price": 187.99}, {"symbol": "GOOG", "date": "2005-03-01T00:00:00", "price": 180.51}, {"symbol": "GOOG", "date": "2005-04-01T00:00:00", "price": 220.0}, {"symbol": "GOOG", "date": "2005-05-01T00:00:00", "price": 277.27}, {"symbol": "GOOG", "date": "2005-06-01T00:00:00", "price": 294.15}, {"symbol": "GOOG", "date": "2005-07-01T00:00:00", "price": 287.76}, {"symbol": "GOOG", "date": "2005-08-01T00:00:00", "price": 286.0}, {"symbol": "GOOG", "date": "2005-09-01T00:00:00", "price": 316.46}, {"symbol": "GOOG", "date": "2005-10-01T00:00:00", "price": 372.14}, {"symbol": "GOOG", "date": "2005-11-01T00:00:00", "price": 404.91}, {"symbol": "GOOG", "date": "2005-12-01T00:00:00", "price": 414.86}, {"symbol": "GOOG", "date": "2006-01-01T00:00:00", "price": 432.66}, {"symbol": "GOOG", "date": "2006-02-01T00:00:00", "price": 362.62}, {"symbol": "GOOG", "date": "2006-03-01T00:00:00", "price": 390.0}, {"symbol": "GOOG", "date": "2006-04-01T00:00:00", "price": 417.94}, {"symbol": "GOOG", "date": "2006-05-01T00:00:00", "price": 371.82}, {"symbol": "GOOG", "date": "2006-06-01T00:00:00", "price": 419.33}, {"symbol": "GOOG", "date": "2006-07-01T00:00:00", "price": 386.6}, {"symbol": "GOOG", "date": "2006-08-01T00:00:00", "price": 378.53}, {"symbol": "GOOG", "date": "2006-09-01T00:00:00", "price": 401.9}, {"symbol": "GOOG", "date": "2006-10-01T00:00:00", "price": 476.39}, {"symbol": "GOOG", "date": "2006-11-01T00:00:00", "price": 484.81}, {"symbol": "GOOG", "date": "2006-12-01T00:00:00", "price": 460.48}, {"symbol": "GOOG", "date": "2007-01-01T00:00:00", "price": 501.5}, {"symbol": "GOOG", "date": "2007-02-01T00:00:00", "price": 449.45}, {"symbol": "GOOG", "date": "2007-03-01T00:00:00", "price": 458.16}, {"symbol": "GOOG", "date": "2007-04-01T00:00:00", "price": 471.38}, {"symbol": "GOOG", "date": "2007-05-01T00:00:00", "price": 497.91}, {"symbol": "GOOG", "date": "2007-06-01T00:00:00", "price": 522.7}, {"symbol": "GOOG", "date": "2007-07-01T00:00:00", "price": 510.0}, {"symbol": "GOOG", "date": "2007-08-01T00:00:00", "price": 515.25}, {"symbol": "GOOG", "date": "2007-09-01T00:00:00", "price": 567.27}, {"symbol": "GOOG", "date": "2007-10-01T00:00:00", "price": 707.0}, {"symbol": "GOOG", "date": "2007-11-01T00:00:00", "price": 693.0}, {"symbol": "GOOG", "date": "2007-12-01T00:00:00", "price": 691.48}, {"symbol": "GOOG", "date": "2008-01-01T00:00:00", "price": 564.3}, {"symbol": "GOOG", "date": "2008-02-01T00:00:00", "price": 471.18}, {"symbol": "GOOG", "date": "2008-03-01T00:00:00", "price": 440.47}, {"symbol": "GOOG", "date": "2008-04-01T00:00:00", "price": 574.29}, {"symbol": "GOOG", "date": "2008-05-01T00:00:00", "price": 585.8}, {"symbol": "GOOG", "date": "2008-06-01T00:00:00", "price": 526.42}, {"symbol": "GOOG", "date": "2008-07-01T00:00:00", "price": 473.75}, {"symbol": "GOOG", "date": "2008-08-01T00:00:00", "price": 463.29}, {"symbol": "GOOG", "date": "2008-09-01T00:00:00", "price": 400.52}, {"symbol": "GOOG", "date": "2008-10-01T00:00:00", "price": 359.36}, {"symbol": "GOOG", "date": "2008-11-01T00:00:00", "price": 292.96}, {"symbol": "GOOG", "date": "2008-12-01T00:00:00", "price": 307.65}, {"symbol": "GOOG", "date": "2009-01-01T00:00:00", "price": 338.53}, {"symbol": "GOOG", "date": "2009-02-01T00:00:00", "price": 337.99}, {"symbol": "GOOG", "date": "2009-03-01T00:00:00", "price": 348.06}, {"symbol": "GOOG", "date": "2009-04-01T00:00:00", "price": 395.97}, {"symbol": "GOOG", "date": "2009-05-01T00:00:00", "price": 417.23}, {"symbol": "GOOG", "date": "2009-06-01T00:00:00", "price": 421.59}, {"symbol": "GOOG", "date": "2009-07-01T00:00:00", "price": 443.05}, {"symbol": "GOOG", "date": "2009-08-01T00:00:00", "price": 461.67}, {"symbol": "GOOG", "date": "2009-09-01T00:00:00", "price": 495.85}, {"symbol": "GOOG", "date": "2009-10-01T00:00:00", "price": 536.12}, {"symbol": "GOOG", "date": "2009-11-01T00:00:00", "price": 583.0}, {"symbol": "GOOG", "date": "2009-12-01T00:00:00", "price": 619.98}, {"symbol": "GOOG", "date": "2010-01-01T00:00:00", "price": 529.94}, {"symbol": "GOOG", "date": "2010-02-01T00:00:00", "price": 526.8}, {"symbol": "GOOG", "date": "2010-03-01T00:00:00", "price": 560.19}, {"symbol": "AAPL", "date": "2000-01-01T00:00:00", "price": 25.94}, {"symbol": "AAPL", "date": "2000-02-01T00:00:00", "price": 28.66}, {"symbol": "AAPL", "date": "2000-03-01T00:00:00", "price": 33.95}, {"symbol": "AAPL", "date": "2000-04-01T00:00:00", "price": 31.01}, {"symbol": "AAPL", "date": "2000-05-01T00:00:00", "price": 21.0}, {"symbol": "AAPL", "date": "2000-06-01T00:00:00", "price": 26.19}, {"symbol": "AAPL", "date": "2000-07-01T00:00:00", "price": 25.41}, {"symbol": "AAPL", "date": "2000-08-01T00:00:00", "price": 30.47}, {"symbol": "AAPL", "date": "2000-09-01T00:00:00", "price": 12.88}, {"symbol": "AAPL", "date": "2000-10-01T00:00:00", "price": 9.78}, {"symbol": "AAPL", "date": "2000-11-01T00:00:00", "price": 8.25}, {"symbol": "AAPL", "date": "2000-12-01T00:00:00", "price": 7.44}, {"symbol": "AAPL", "date": "2001-01-01T00:00:00", "price": 10.81}, {"symbol": "AAPL", "date": "2001-02-01T00:00:00", "price": 9.12}, {"symbol": "AAPL", "date": "2001-03-01T00:00:00", "price": 11.03}, {"symbol": "AAPL", "date": "2001-04-01T00:00:00", "price": 12.74}, {"symbol": "AAPL", "date": "2001-05-01T00:00:00", "price": 9.98}, {"symbol": "AAPL", "date": "2001-06-01T00:00:00", "price": 11.62}, {"symbol": "AAPL", "date": "2001-07-01T00:00:00", "price": 9.4}, {"symbol": "AAPL", "date": "2001-08-01T00:00:00", "price": 9.27}, {"symbol": "AAPL", "date": "2001-09-01T00:00:00", "price": 7.76}, {"symbol": "AAPL", "date": "2001-10-01T00:00:00", "price": 8.78}, {"symbol": "AAPL", "date": "2001-11-01T00:00:00", "price": 10.65}, {"symbol": "AAPL", "date": "2001-12-01T00:00:00", "price": 10.95}, {"symbol": "AAPL", "date": "2002-01-01T00:00:00", "price": 12.36}, {"symbol": "AAPL", "date": "2002-02-01T00:00:00", "price": 10.85}, {"symbol": "AAPL", "date": "2002-03-01T00:00:00", "price": 11.84}, {"symbol": "AAPL", "date": "2002-04-01T00:00:00", "price": 12.14}, {"symbol": "AAPL", "date": "2002-05-01T00:00:00", "price": 11.65}, {"symbol": "AAPL", "date": "2002-06-01T00:00:00", "price": 8.86}, {"symbol": "AAPL", "date": "2002-07-01T00:00:00", "price": 7.63}, {"symbol": "AAPL", "date": "2002-08-01T00:00:00", "price": 7.38}, {"symbol": "AAPL", "date": "2002-09-01T00:00:00", "price": 7.25}, {"symbol": "AAPL", "date": "2002-10-01T00:00:00", "price": 8.03}, {"symbol": "AAPL", "date": "2002-11-01T00:00:00", "price": 7.75}, {"symbol": "AAPL", "date": "2002-12-01T00:00:00", "price": 7.16}, {"symbol": "AAPL", "date": "2003-01-01T00:00:00", "price": 7.18}, {"symbol": "AAPL", "date": "2003-02-01T00:00:00", "price": 7.51}, {"symbol": "AAPL", "date": "2003-03-01T00:00:00", "price": 7.07}, {"symbol": "AAPL", "date": "2003-04-01T00:00:00", "price": 7.11}, {"symbol": "AAPL", "date": "2003-05-01T00:00:00", "price": 8.98}, {"symbol": "AAPL", "date": "2003-06-01T00:00:00", "price": 9.53}, {"symbol": "AAPL", "date": "2003-07-01T00:00:00", "price": 10.54}, {"symbol": "AAPL", "date": "2003-08-01T00:00:00", "price": 11.31}, {"symbol": "AAPL", "date": "2003-09-01T00:00:00", "price": 10.36}, {"symbol": "AAPL", "date": "2003-10-01T00:00:00", "price": 11.44}, {"symbol": "AAPL", "date": "2003-11-01T00:00:00", "price": 10.45}, {"symbol": "AAPL", "date": "2003-12-01T00:00:00", "price": 10.69}, {"symbol": "AAPL", "date": "2004-01-01T00:00:00", "price": 11.28}, {"symbol": "AAPL", "date": "2004-02-01T00:00:00", "price": 11.96}, {"symbol": "AAPL", "date": "2004-03-01T00:00:00", "price": 13.52}, {"symbol": "AAPL", "date": "2004-04-01T00:00:00", "price": 12.89}, {"symbol": "AAPL", "date": "2004-05-01T00:00:00", "price": 14.03}, {"symbol": "AAPL", "date": "2004-06-01T00:00:00", "price": 16.27}, {"symbol": "AAPL", "date": "2004-07-01T00:00:00", "price": 16.17}, {"symbol": "AAPL", "date": "2004-08-01T00:00:00", "price": 17.25}, {"symbol": "AAPL", "date": "2004-09-01T00:00:00", "price": 19.38}, {"symbol": "AAPL", "date": "2004-10-01T00:00:00", "price": 26.2}, {"symbol": "AAPL", "date": "2004-11-01T00:00:00", "price": 33.53}, {"symbol": "AAPL", "date": "2004-12-01T00:00:00", "price": 32.2}, {"symbol": "AAPL", "date": "2005-01-01T00:00:00", "price": 38.45}, {"symbol": "AAPL", "date": "2005-02-01T00:00:00", "price": 44.86}, {"symbol": "AAPL", "date": "2005-03-01T00:00:00", "price": 41.67}, {"symbol": "AAPL", "date": "2005-04-01T00:00:00", "price": 36.06}, {"symbol": "AAPL", "date": "2005-05-01T00:00:00", "price": 39.76}, {"symbol": "AAPL", "date": "2005-06-01T00:00:00", "price": 36.81}, {"symbol": "AAPL", "date": "2005-07-01T00:00:00", "price": 42.65}, {"symbol": "AAPL", "date": "2005-08-01T00:00:00", "price": 46.89}, {"symbol": "AAPL", "date": "2005-09-01T00:00:00", "price": 53.61}, {"symbol": "AAPL", "date": "2005-10-01T00:00:00", "price": 57.59}, {"symbol": "AAPL", "date": "2005-11-01T00:00:00", "price": 67.82}, {"symbol": "AAPL", "date": "2005-12-01T00:00:00", "price": 71.89}, {"symbol": "AAPL", "date": "2006-01-01T00:00:00", "price": 75.51}, {"symbol": "AAPL", "date": "2006-02-01T00:00:00", "price": 68.49}, {"symbol": "AAPL", "date": "2006-03-01T00:00:00", "price": 62.72}, {"symbol": "AAPL", "date": "2006-04-01T00:00:00", "price": 70.39}, {"symbol": "AAPL", "date": "2006-05-01T00:00:00", "price": 59.77}, {"symbol": "AAPL", "date": "2006-06-01T00:00:00", "price": 57.27}, {"symbol": "AAPL", "date": "2006-07-01T00:00:00", "price": 67.96}, {"symbol": "AAPL", "date": "2006-08-01T00:00:00", "price": 67.85}, {"symbol": "AAPL", "date": "2006-09-01T00:00:00", "price": 76.98}, {"symbol": "AAPL", "date": "2006-10-01T00:00:00", "price": 81.08}, {"symbol": "AAPL", "date": "2006-11-01T00:00:00", "price": 91.66}, {"symbol": "AAPL", "date": "2006-12-01T00:00:00", "price": 84.84}, {"symbol": "AAPL", "date": "2007-01-01T00:00:00", "price": 85.73}, {"symbol": "AAPL", "date": "2007-02-01T00:00:00", "price": 84.61}, {"symbol": "AAPL", "date": "2007-03-01T00:00:00", "price": 92.91}, {"symbol": "AAPL", "date": "2007-04-01T00:00:00", "price": 99.8}, {"symbol": "AAPL", "date": "2007-05-01T00:00:00", "price": 121.19}, {"symbol": "AAPL", "date": "2007-06-01T00:00:00", "price": 122.04}, {"symbol": "AAPL", "date": "2007-07-01T00:00:00", "price": 131.76}, {"symbol": "AAPL", "date": "2007-08-01T00:00:00", "price": 138.48}, {"symbol": "AAPL", "date": "2007-09-01T00:00:00", "price": 153.47}, {"symbol": "AAPL", "date": "2007-10-01T00:00:00", "price": 189.95}, {"symbol": "AAPL", "date": "2007-11-01T00:00:00", "price": 182.22}, {"symbol": "AAPL", "date": "2007-12-01T00:00:00", "price": 198.08}, {"symbol": "AAPL", "date": "2008-01-01T00:00:00", "price": 135.36}, {"symbol": "AAPL", "date": "2008-02-01T00:00:00", "price": 125.02}, {"symbol": "AAPL", "date": "2008-03-01T00:00:00", "price": 143.5}, {"symbol": "AAPL", "date": "2008-04-01T00:00:00", "price": 173.95}, {"symbol": "AAPL", "date": "2008-05-01T00:00:00", "price": 188.75}, {"symbol": "AAPL", "date": "2008-06-01T00:00:00", "price": 167.44}, {"symbol": "AAPL", "date": "2008-07-01T00:00:00", "price": 158.95}, {"symbol": "AAPL", "date": "2008-08-01T00:00:00", "price": 169.53}, {"symbol": "AAPL", "date": "2008-09-01T00:00:00", "price": 113.66}, {"symbol": "AAPL", "date": "2008-10-01T00:00:00", "price": 107.59}, {"symbol": "AAPL", "date": "2008-11-01T00:00:00", "price": 92.67}, {"symbol": "AAPL", "date": "2008-12-01T00:00:00", "price": 85.35}, {"symbol": "AAPL", "date": "2009-01-01T00:00:00", "price": 90.13}, {"symbol": "AAPL", "date": "2009-02-01T00:00:00", "price": 89.31}, {"symbol": "AAPL", "date": "2009-03-01T00:00:00", "price": 105.12}, {"symbol": "AAPL", "date": "2009-04-01T00:00:00", "price": 125.83}, {"symbol": "AAPL", "date": "2009-05-01T00:00:00", "price": 135.81}, {"symbol": "AAPL", "date": "2009-06-01T00:00:00", "price": 142.43}, {"symbol": "AAPL", "date": "2009-07-01T00:00:00", "price": 163.39}, {"symbol": "AAPL", "date": "2009-08-01T00:00:00", "price": 168.21}, {"symbol": "AAPL", "date": "2009-09-01T00:00:00", "price": 185.35}, {"symbol": "AAPL", "date": "2009-10-01T00:00:00", "price": 188.5}, {"symbol": "AAPL", "date": "2009-11-01T00:00:00", "price": 199.91}, {"symbol": "AAPL", "date": "2009-12-01T00:00:00", "price": 210.73}, {"symbol": "AAPL", "date": "2010-01-01T00:00:00", "price": 192.06}, {"symbol": "AAPL", "date": "2010-02-01T00:00:00", "price": 204.62}, {"symbol": "AAPL", "date": "2010-03-01T00:00:00", "price": 223.02}]}}, {"mode": "vega-lite"});
</script>
</div>
</div>
<p>I could go on for hours, tweaking this and that. For example, the labels in the last chart overlap. Vega has the <a href="https://vega.github.io/vega/docs/transforms/label/">label transform</a> method to deal with that, but that implementation still needs to cascade down to Vega-Lite and Altair. Someday, I will package all this as a proper theme, re-using <a href="https://github.com/feedzai/feedzai-altair-theme">feedzai’s</a> code.</p>


</section>
</section>

 ]]></description>
  <category>english</category>
  <category>visualization</category>
  <category>coding</category>
  <guid>https://kapitan.net/blog/better-altair-theme.html</guid>
  <pubDate>Sun, 21 Jan 2024 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/blog/images/urban-institute-styleguide.webp" medium="image" type="image/webp"/>
</item>
<item>
  <title>Another year, another lifehack</title>
  <dc:creator>Daniel Kapitan</dc:creator>
  <link>https://kapitan.net/blog/obsidian-setup.html</link>
  <description><![CDATA[ 




<div class="callout callout-style-default callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Tip</span>TL;DR
</div>
</div>
<div class="callout-body-container callout-body">
<p>How to integrate <a href="https://calibre-ebook.com/">Calibre</a>, <a href="https://quarto.org">Quarto</a>, <a href="https://obsidian.md">Obsidian</a>, <a href="https://syncthing.net">Syncthing</a>, <a href="https://remarkable.com">reMarkable</a> to make the most of a fully integrated markdown-based workflow for reading, thinking and writing.</p>
</div>
</div>
<blockquote class="blockquote">
<p><strong>Habit 7: Sharpen the Saw</strong>:</p>
<p>Increase motivation, energy, and work/life balance by making time for renewing activities. ~ <em>Stephen Covey</em></p>
</blockquote>
<p>Keeping things organised and efficient is one of my basic needs. It helps me keep a clear mind and be productive. I have been using the <a href="https://gettingthingsdone.com/what-is-gtd/">getting things done method</a> for over a decade now, and was one of the early adopters of <a href="https://todoist.com/home">Todoist</a>. In fact, at my current rate of 80 points per week, I expect to become Enlightened somewhere at the beginning of the upcoming <a href="https://en.wikipedia.org/wiki/Dragon_(zodiac)">Year of the Dragon</a>.</p>
<div class="quarto-figure quarto-figure-left">
<figure class="figure">
<p><img src="https://kapitan.net/blog/images/todoist-karma.png" class="img-fluid figure-img"></p>
<figcaption>My Karma points in Todoist at the end of 2023.</figcaption>
</figure>
</div>
<p>Beyond organising the things I need to do, I have been looking to sharpen my saw for reading and writing, both of which I do a lot. Also here, I switched to a fully digital workflow some years ago: my books now all live in <a href="https://calibre-ebook.com/">calibre</a>, I take notes on the <a href="https://remarkable.com/">reMarkable 2</a> and do all of my writing in markdown. Over the years, I have tried many different apps: <a href="https://dayoneapp.com/">Day One</a>, <a href="ia writer">iA Writer</a> and even a bare-bones code editor with a GitHub repository hosting a <a href="https://www.mkdocs.org/">MkDocs</a> site.</p>
<p>But I was never quite satisfied with any of these setups. To address my note-taking needs whilst reading, I tried different tablets with digital pens, but found none of these worked for me because I could not easily get my highlights and notes into my workflow. I also prefer to read on a passive, e-ink screen which is why I tried the reMarkable mark I when it first came out. Alas, I quickly returned that one because it lacked the integrations I needed, too. So here I am, still spending lots of time looking up quotes and references that I had read somewhere when writing content for my lectures. And on top of that there is the additional friction of getting my markdown notes into my publishing workflow.</p>
<p>In this day and age, surely there must be a better way in which we can use digital tools to support our reading, thinking and writing? Surely I should be able to render a website, a pdf - even a Word document if a clients asks for it - using the same markdown content? And indeed, it seems that as of 2022 a number of tools have delivered on the promise of supporting a smooth, fully digital workflow for reading, thinking and writing. In my case, I chose <a href="https://obsidian.md/">Obsidian</a> and <a href="https://posit.co/blog/announcing-quarto-a-new-scientific-and-technical-publishing-system/">Quarto</a> as the core components.<sup>1</sup></p>
<section id="obsidian-arguably-the-most-flexible-note-taking-app" class="level2">
<h2 class="anchored" data-anchor-id="obsidian-arguably-the-most-flexible-note-taking-app">Obsidian, arguably the most flexible note-taking app</h2>
<p>Obsidian arguably is the most flexible&nbsp;note-taking app&nbsp;out there. The key differentiating feature for me is its ability to create graphs of interlinked notes, thereby natively supporting <a href="https://notes.andymatuschak.org/Evergreen_notes">Andy Matuschak’s Evergreen note-taking concept</a>. Its vibrant community is also a boon: with over 1,370 contributed plugins at the time of writing , I could find everything I need to integrate it with the other tools in my workflow.</p>
<p>The diagram below shows how I have integrated calibre and Obsidian for use on my MacBook, Pixel 5 Android phone and reMarkable 2. <a href="https://syncthing.net">Syncthing</a> does the heavy lifting of keeping my markdown notes and ebooks in sync across multiple devices. That way, I have maximal control with the least amount of lock-in. Incidentally, my calibre library is also synced to my NAS, with an additional backup to Google Drive which serves as my primary storage platform. Note that this setup work for any combination of {Linux | OSX | Windows} desktops and {iOS | Android} smartphones, as all the apps are cross-platform.<sup>2</sup></p>
<p><img src="https://kapitan.net/blog/images/obsidian-setup.png" class="img-fluid"></p>
<section id="easier-to-read-think-and-take-notes" class="level3">
<h3 class="anchored" data-anchor-id="easier-to-read-think-and-take-notes">Easier to read, think and take notes</h3>
<p>With this setup, taking notes while reading books on my smartphone already is a lot easier. Using Moon+ Reader, I can just highlight texts, copy and paste it directly into Obsidian. For longer reads on my reMarkable, I have setup <a href="https://scrybble.ink/">scrybble</a> to sync notes to Obsidian. This Amsterdam-based startup (yay!) is quite young, and the functionality is still basic so am eagerly awaiting future releases.</p>
<p>When I am at the desk, I can now do all of my reading and note-taking in Obsidian thanks to the <a href="https://github.com/caronchen/obsidian-calibre-plugin">calibre plugin</a>. After tinkering with the configuration, I found it so blissful being able to read, think and write from a single application. No distractions! Also, now I can gradually ease into the Evergreen way of note-taking to structure my thinking. Opening a linked note using <code>Cmd+T</code>, with the <strong>stack notes</strong> option turned on, just adds to the joy of working like this:</p>
<p><img src="https://user-images.githubusercontent.com/693981/188205363-0f24b2a5-3706-4a8c-b38b-7a66baa68ce6.gif" class="img-fluid"></p>
</section>
<section id="easier-to-write-and-publish" class="level3">
<h3 class="anchored" data-anchor-id="easier-to-write-and-publish">Easier to write and publish</h3>
<p>Further down into the workflow, I can now write and publish from Obsidian, too. This paper in fact served as a challenge-based learning project of sorts to do exactly that. Drawing diagrams with <a href="https://d2lang.org">d2</a> is supported thanks to the <a href="https://github.com/terrastruct/d2-obsidian">official plugin</a>. I could also publish a static site directly on, say, GitHub pages from Obsidian as well using the <a href="https://github.com/denolehov/obsidian-git">Obsidian Git plugin</a>. I find, however, that the Quarto engine is the better tool for my publishing needs.</p>
</section>
</section>
<section id="quarto-for-a-streamlined-publication-workflow" class="level2">
<h2 class="anchored" data-anchor-id="quarto-for-a-streamlined-publication-workflow">Quarto for a streamlined publication workflow</h2>
<p>My work as a data scientist and architect relies extensively on code and data analysis. Python-based notebooks have long provided the capability of merging the paper narrative, the computational code powering the analysis, and the summary plots into a reproducible report. Quarto supports all of this into a streamlined publication workflow that lowers the adoption barrier of the <a href="https://www.writethedocs.org/guide/docs-as-code/">“docs-as-code”</a> paradigm. With a single command, the notebook text sources (narrative and code) are transformed into a polished publication-ready article in a variety of formats, be it a PDF or dynamic HTML page enabling the reader to interact with the data tables and plots. Even without its discerning feature of publishing executable notebooks, I found the output crisp and professional. Earlier this year, I decided to go all out on Quarto, and redesigned my <a href="https://github.com/dkapitan/dkapitan.github.io">company website</a> with it.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://kapitan.net/blog/images/quarto-workflow.png" class="img-fluid figure-img"></p>
<figcaption>source: <a href="https://gael-close.github.io/posts/2209-tech-writing/2209-tech-writing.html">Gaël Close</a>.</figcaption>
</figure>
</div>
<p>In the new setup, I can easily copy a markdown file from my Obsidian journal into my Quarto website project and include it in the pipeline with minor changes to the YAML front-matter. Some friction remains, though, having to switch between the different markdown flavours of the two tools. For example, compare the syntax for callouts in Quarto vs.&nbsp;Obsidian:</p>
<div class="quarto-layout-panel" data-layout-ncol="2">
<div class="quarto-layout-row">
<section id="callouts-in-quarto" class="level3 quarto-layout-cell" style="flex-basis: 50.0%;justify-content: flex-start;">
<h3 class="anchored" data-anchor-id="callouts-in-quarto">Callouts in Quarto</h3>
<pre><code>::: {.callout-tip}
## Tip-callout with a custom titles

Main text goes here.
:::</code></pre>
</section>
<section id="callouts-in-obsidian" class="level3 quarto-layout-cell" style="flex-basis: 50.0%;justify-content: flex-start;">
<h3 class="anchored" data-anchor-id="callouts-in-obsidian">Callouts in Obsidian</h3>
<pre><code>&gt; [!tip] Tip-callout with a custom titles
&gt; Main text goes here.</code></pre>
</section>
</div>
</div>
<p>Despite these inconveniences, I will conclude with this advice for the coming year: give an end-to-end markdown-based workflow a try. And if you like the setup described hear, make sure to donate and support <a href="https://calibre-ebook.com/donate">calibre</a>, <a href="https://help.obsidian.md/Licenses+and+payment/Catalyst+license">Obsidian</a> and <a href="https://syncthing.net/donations/">Syncthing</a> - besides getting yourself a classy e-ink note-taking device 😉.<sup>3</sup></p>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>There are alternative <a href="https://github.com/tehtbl/awesome-note-taking">markdown note-taking apps</a>, and in theory you can use any <a href="https://jamstack.org/generators/">static site generator that support markdown templates</a> instead of Quarto.↩︎</p></li>
<li id="fn2"><p>Depending on your operating system and personal preference, you can choose any e-reader app you like, as long as it is capable of importing a file-based Calibre library.↩︎</p></li>
<li id="fn3"><p>A colleague of mine pointed me to the idea of a <a href="https://www.buildingasecondbrain.com/">Second Brain</a> after reading a draft of this blog post. It seems more people are trying to scratch the same itch.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>english</category>
  <category>coding</category>
  <category>workflow</category>
  <guid>https://kapitan.net/blog/obsidian-setup.html</guid>
  <pubDate>Sat, 30 Dec 2023 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/blog/images/obsidian-setup.png" medium="image" type="image/png" height="119" width="144"/>
</item>
<item>
  <title>De veranderende rol van de arts door AI</title>
  <dc:creator>Daniel Kapitan</dc:creator>
  <link>https://kapitan.net/blog/webinar-knmg.html</link>
  <description><![CDATA[ 




<section id="section" class="level1">

<div class="quarto-video ratio ratio-16x9"><iframe data-external="1" src="https://player.vimeo.com/video/883743887?h=740b7646bb" frameborder="0" title="" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe></div>


</section>

 ]]></description>
  <category>nederlands</category>
  <category>webinar</category>
  <category>responsible ai</category>
  <category>healthcare</category>
  <guid>https://kapitan.net/blog/webinar-knmg.html</guid>
  <pubDate>Thu, 09 Nov 2023 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/images/still-knmg.png" medium="image" type="image/png" height="98" width="144"/>
</item>
<item>
  <title>Eindelijk is data delen geen gunst, maar een recht</title>
  <dc:creator>Antoinette Vlieger, Daniel Kapitan, Egge van der Poel</dc:creator>
  <link>https://kapitan.net/blog/data-is-een-recht.html</link>
  <description><![CDATA[ 




<p>De nieuwe Europese Data Governance Verordening is vanaf maandag 24 september van toepassing in alle Europese lidstaten. Het is belangrijke wetgeving, die is ontworpen om de nu nog te beperkte uitwisseling van data binnen de EU te stimuleren. Op Europees niveau wordt hard gewerkt aan een vrij verkeer van data, vergelijkbaar met het vrije verkeer van goederen of personen. Met de Data Governance Verordening wil de EU onder meer het vertrouwen in het delen van gegevens vergroten en het hergebruik van bepaalde gegevens in handen van de overheid makkelijker maken. In beginsel allemaal goed nieuws. Toch lijkt Nederland, en dan met name de Nederlandse zorgsector, in het geheel niet klaar voor de datarevolutie die met deze nieuwe wet door de Europese wetgever is ingezet. Want zowel onze overheid als de bestuurders in de (semi-)publieke sector stellen zich zeer terughoudend op ten aanzien van oplossingen die het vrije verkeer van data bevorderen. Zo startte de Europese Commissie in februari al een procedure tegen de Nederlandse staat, omdat die de Open Data Richtlijn al twee jaar onrechtmatig negeert.</p>
<section id="op-je-data-blijven-zitten" class="level2">
<h2 class="anchored" data-anchor-id="op-je-data-blijven-zitten">Op je data blijven zitten</h2>
<p>Het inmiddels demissionaire Kabinet toonde zich sowieso geen liefhebber van vrije data. Dat paste bij de Rutte-doctrine om openbaarheid van bestuur in te perken, maar het is een zorgelijke houding. De behoefte aan het uitwisselen van data is groter dan ooit, zeker in de zorg. Toch blijft een meerderheid van de instellingen nu nog ‘op haar data zitten’ vanuit een foutieve veronderstelling dat zorgdata hun eigendom zijn. De terughoudendheid om data met collega-wetenschappers en artsen te delen heeft grote negatieve gevolgen, zo zagen we ook bij het bestrijden van het coronavirus. De Data Governance Verordening — vooral relevant voor organisaties met een publieke taak — kan voor een omslag gaan zorgen. Een fundamenteel uitgangspunt is dat data over personen beschermd blijft door privacywetgeving. Maar als die data eenmaal rechtmatig is gedeeld, bijvoorbeeld voor wetenschappelijk onderzoek, dan moet deze ook met anderen gedeeld worden.</p>
</section>
<section id="game-changer" class="level2">
<h2 class="anchored" data-anchor-id="game-changer">Game changer</h2>
<p>De nieuwe verordening zet daarmee in op ‘data delen by default’ — als standaard dus en niet als uitzondering. En dat is een game changer. Voor het versnellen en verbeteren van wetenschappelijk onderzoek kan het immers veel betekenen als onderzoekers standaard gemakkelijker over meer relevante data kunnen beschikken. Maar ook voor dit nieuwe datarecht geldt dat het pas echt effect krijgt als betrokken partijen er een beroep op gaan doen en de exacte reikwijdte van hun rechten gaan testen. En dat is precies wat zorgbestuurders en wetenschappers mogen en moeten gaan doen. Wetenschappers kunnen datasets in rechte opeisen, om korte metten te maken met het idee dat data krijgen een gunst is. En wie geconfronteerd wordt met een te hoge factuur voor die data, kan een bestuursrechter laten toetsen of dit niet meer is dan de marginale kosten die maximaal in rekening mogen worden gebracht. Terughoudendheid en vrijblijvendheid moeten plaatsmaken voor assertiviteit en interactie. Een goede zaak, want het bevorderen van het delen van data is van grote waarde voor zorg en wetenschap.</p>
<p><em>Antoinette Vlieger is advocaat bij Boomberg Advocaten. Daniel Kapitan is onafhankelijk adviseur, datawetenschapper en AI Fellow aan de TU Eindhoven. Egge van der Poel is onafhankelijk adviseur, onderzoeker en schrijver.</em></p>
<p>Yasmin Dwiputri &amp; Data Hazards Project / Better Images of AI / AI across industries / CC-BY 4.0</p>
<p><small class="text-muted">Opinie verschenen in <a href="https://edata.nl/2022/02/01/column-dromen-over-open-data-en-algoritmes/">het Financieele Dagblad</a>.</small></p>


</section>

 ]]></description>
  <category>nederlands</category>
  <category>data solidarity</category>
  <guid>https://kapitan.net/blog/data-is-een-recht.html</guid>
  <pubDate>Wed, 20 Sep 2023 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/images/YasminDwiputri-DataHazards.png" medium="image" type="image/png" height="81" width="144"/>
</item>
<item>
  <title>Whitepaper on privacy-enhancing technologies</title>
  <dc:creator>Daniel Kapitan</dc:creator>
  <link>https://kapitan.net/blog/dsc-whitepaper-pets.html</link>
  <description><![CDATA[ 




<section id="section" class="level1">
<h1></h1>
  <p><a href="../resources/dsc2023whitepaper-pets.pdf" target="_blank">Download PDF File</a></p>
   <object data="/resources/dsc2023whitepaper-pets.pdf" type="application/pdf" width="100%" height="800px">
    <p>Unable to display PDF file. <a href="../resources/dsc2023whitepaper-pets.pdf">Download</a> instead.</p>
  </object>
  


</section>

 ]]></description>
  <category>english</category>
  <category>data commons</category>
  <category>privacy-enhancing technologies</category>
  <guid>https://kapitan.net/blog/dsc-whitepaper-pets.html</guid>
  <pubDate>Sat, 01 Jul 2023 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/images/dsc-pets-overview.png" medium="image" type="image/png" height="66" width="144"/>
</item>
<item>
  <title>Podcast bij de Dataloog</title>
  <dc:creator>Daniel Kapitan</dc:creator>
  <link>https://kapitan.net/blog/podcast-dataloog-datasolidariteit.html</link>
  <description><![CDATA[ 




<iframe style="border-radius:12px" src="https://open.spotify.com/embed/episode/5tUgUIgcV3K0rQVD331C1w?utm_source=generator" width="100%" height="352" frameborder="0" allowfullscreen="" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy"></iframe>



 ]]></description>
  <category>nederlands</category>
  <category>podcast</category>
  <category>data commons</category>
  <category>data solidarity</category>
  <guid>https://kapitan.net/blog/podcast-dataloog-datasolidariteit.html</guid>
  <pubDate>Thu, 18 May 2023 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/images/podcast-de-dataloog.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>We moeten het meer hebben over datasolidariteit</title>
  <dc:creator>Daniel Kapitan</dc:creator>
  <link>https://kapitan.net/blog/datasolidariteit.html</link>
  <description><![CDATA[ 




<p>Privacy domineert nog steeds het debat rondom het delen en hergebruik van persoonsgegevens, zoals blijkt uit de discussie rondom het verstrekken van vaccinatiegegevens door het RIVM aan het CBS. Maar privacy is het probleem niet.</p>
<p>Maxim Februari schreef tijdens de eerste lockdown al dat het een ‘gruwelijk misverstand’<sup>1</sup> is om te denken dat databescherming om privacy van een individu gaat. Het gaat niet om een afweging tussen het private belang van privacy en het maatschappelijke belang van – in het geval van COVID – een draaiende economie en een gezonde bevolking.</p>
<section id="betrouwbaar-data-hergebruiken" class="level2">
<h2 class="anchored" data-anchor-id="betrouwbaar-data-hergebruiken">Betrouwbaar data (her)gebruiken</h2>
<p>Het echte vraagstuk is dat wij als maatschappij zoeken naar een betrouwbare en eerlijke manier om data te gebruiken en hergebruiken als collectief goed. Op Europees niveau wordt gewerkt aan wetgeving die zulk hergebruik van data mogelijk moet maken. Het feit dat de lopende consultatie duizenden pagina’s aan reacties heeft opgeleverd, geeft de complexiteit van het vraagstuk weer. Wel lijkt er consensus te zijn dat geen enkele organisatie, publiek noch privaat, een te grote vinger in de pap zou moeten hebben. Er moet steeds <em>balance of power</em> blijven om misstanden te voorkomen.</p>
<p>Inmiddels zijn er veel initiatieven die dit principe omarmen en experimenteren om tot goede spelregels te komen, zoals bijvoorbeeld MFFBAS<sup>2</sup> voor het delen van energiedata voor het vormgeven en uitvoeren van de energietransitie en de coöperatie DataFryslân<sup>3</sup> voor delen van data in de provincie voor beter beleid en effectievere dienstverlening door Friese maatschappelijke organisaties.</p>
</section>
<section id="solidair-zijn-met-delen-van-data" class="level2">
<h2 class="anchored" data-anchor-id="solidair-zijn-met-delen-van-data">Solidair zijn met delen van data</h2>
<p>Het succes van dergelijke samenwerkingsverbanden staat of valt met de vraag hoe solidair we willen zijn met het delen van data. Zijn we echt bereid om onze persoonlijke data te delen, zodat deze gebruikt kunnen worden voor het oplossen van complexe maatschappelijke vraagstukken?</p>
<p>Data worden bruikbaarder door ze te delen en te koppelen aan andere data. Door de gegevens van slimme meterkasten te delen kunnen we ons beter voorbereiden op de energietransitie. Door financiële gegevens te delen kunnen we beter zicht krijgen op frauduleuze en witwaspraktijken. En door vaccinatiegegevens te delen kunnen we beter inzicht krijgen in de groepen die het meest kwetsbaar zijn bij een pandemie.</p>
</section>
<section id="blauwdruk-voor-datasolidariteit" class="level2">
<h2 class="anchored" data-anchor-id="blauwdruk-voor-datasolidariteit">Blauwdruk voor datasolidariteit</h2>
<p>Er is dringend behoefte aan een helder en praktisch uitvoerbaar kader voor datasolidariteit. In een commentaar in <em>The Lancet</em><sup>4</sup> stellen Prainsack en collega-auteurs een blauwdruk voor die is gebaseerd op drie pilaren 1) faciliteren van goed hergebruik van data; 2) voorkomen en mitigeren van misbruik; en 3) terugvloeien van winsten naar de publieke sector.</p>
<p>De bereidheid om data te delen, de eerste pilaar, wisselt sterk. Bij het gebruiken van diensten van bedrijven als Google, Meta of Microsoft lijken veel mensen het niet zo nauw te nemen met privacy, waarschijnlijk omdat je er meteen iets voor terug krijgt, namelijk gratis toegang tot social media of een e-maildienst.</p>
<p>Als het gaat om initiatieven als hiervoor genoemd verschijnen er ineens meer beren op de weg (misschien omdat je bij het beschikbaar stellen van jouw data voor maatschappelijke problemen er niet meteen iets voor terugkrijgt). Privacy wordt dan meestal (en helaas) als eerste argument opgevoerd om data niet te delen, terwijl dit niet een echte belemmering is.</p>
<p>Er zijn voldoende juridische mogelijkheden om persoonsgegevens te delen en te hergebruiken – via CBS data delen is legaal, wettelijk geregeld. In het geval van de vaccinatiegegevens stelt de Landsadvocaat in een advies dat er zelfs twee juridische redeneringen zijn waarmee het RIVM de data aan het CBS ter beschikking kan stellen, namelijk binnen de wet op het CBS en op basis van de AVG. Na veel vertraging komen de data uiteindelijk dan toch beschikbaar.<sup>5</sup></p>
<p>Wel is er een gebrek aan bestuurlijke instrumenten om hergebruik van data in goede banen te leiden. De wet- en regelgeving is dusdanig complex dat vaak tegenstrijdige uitspraken worden gedaan door juristen. Om dit probleem te adresseren is recentelijk door de overheid een adviesfunctie verantwoord datagebruik ingericht.<sup>6</sup></p>
</section>
<section id="datamisbruik-voorkomen-of-afzwakken" class="level2">
<h2 class="anchored" data-anchor-id="datamisbruik-voorkomen-of-afzwakken">Datamisbruik voorkomen of afzwakken</h2>
<p>Voor de tweede pilaar – het voorkomen en matigen van misbruik van data – kunnen en moeten we veel beter gebruik maken van de technologische mogelijkheden om <em>privacy by design</em><sup>7</sup> te realiseren. We zijn gewend dat data tijdens opslag zijn versleuteld; denk bijvoorbeeld aan encryptie van de harde schijf van de computer. Ook staan wij er niet meer bij stil dat data tijdens transport altijd zijn versleuteld; we werken steeds meer thuis en loggen via een beveiligde verbinding (VPN) in op de online werkomgeving. Een logische vervolgstap is om berekeningen op versleutelde data te doen.</p>
<p>In de praktijk gebeurt dit al met nieuwe privacy enhancing technieken zoals <em>secure multiparty computation</em> (MPC)<sup>8</sup>. Hiermee is het mogelijk om berekeningen op data uit te voeren zonder dat je de data kunt inzien. Binnen Europa zijn inmiddels voorbeelden waar MPC wordt toegepast voor het delen van persoonsgegevens en andere gevoelige data, zoals bij het bestrijden van mensenhandel.</p>
</section>
<section id="hoe-gaan-we-datasolidariteit-vormgeven" class="level2">
<h2 class="anchored" data-anchor-id="hoe-gaan-we-datasolidariteit-vormgeven">Hoe gaan we datasolidariteit vormgeven?</h2>
<p>De juridische grondslagen en technologische mogelijkheden vormen dus geen grote uitdagingen. De echte uitdaging is hoe we als samenleving datasolidariteit gaan vormgeven, met name ook hoe we een balans tussen commerciële activiteiten en publiek gefinancierde activiteiten kunnen vinden (de derde pilaar) en hoe we waarborgen kunnen creëren om onbedoelde effecten zoals discriminatie tegen te gaan.</p>
<p>Neem bijvoorbeeld de duizenden MRI-foto’s die ziekenhuizen maken. Als een bedrijf deze data wil gebruiken voor het ontwikkelen van algoritmes, dan zouden winsten daarvan terug moeten vloeien naar het zorgstelsel. Dit gebeurt nu niet of nauwelijks. De kosten voor het aanleggen van hoogwaardige datasets worden collectief gedragen, terwijl de winsten voor commerciële bedrijven zijn. Dat het ook anders kan laat Barcelona zien.<sup>9</sup></p>
<p>De drie pilaren van datasolidariteit vereisen dat we het debat over het delen van persoonsgegevens niet meer laten kapen door discussies over privacy. In plaats daarvan moeten we de dialoog aangaan over de waarde van het delen van data voor het oplossen van maatschappelijke vraagstukken en de randvoorwaarden die daarvoor vervuld moeten worden.</p>
</section>
<section id="afweging-tussen-risico-en-maatschappelijke-waarde" class="level2">
<h2 class="anchored" data-anchor-id="afweging-tussen-risico-en-maatschappelijke-waarde">Afweging tussen risico en maatschappelijke waarde</h2>
<p>Hier is een helder en verbindend verhaal nodig, waar in begrijpelijke taal technische mogelijkheden en gezamenlijke belangen worden verenigd. Waar een afweging tussen risico en maatschappelijke waarde wordt gemaakt. Extra toezicht, zoals het voorstel om de rol van algoritmewaakhond bij de Autoriteit Persoonsgegevens (AP) te beleggen, gaat daarbij niet helpen. De AP is vooral gericht op bescherming van persoonsgegevens (de eerste pilaar), waarmee het belang en inhoud van de andere twee pilaren onder druk komt te staan.</p>
<p>Wat wel werkt is dat organisaties in het maatschappelijk middenveld, zoals bijvoorbeeld Dutch Hospital Data<sup>10</sup> en Health-RI<sup>11</sup>, die in de zorg data verzamelen en beheren voor zoveel mogelijk hergebruik, hun rol pakken om op een organische en decentrale manier invulling te geven aan datasolidariteit. Wij roepen hen op om een coalitie te vormen met partijen die investeren in privacy enhancing technieken om de patstellingen te doorbreken die nu vaak ontstaan rond data delen voor maatschappelijke vraagstukken.</p>
<p>Photo by Tim Mossholder on Unsplash.</p>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Voetnoten</h2>

<ol>
<li id="fn1"><p><a href="https://www.nrc.nl/nieuws/2020/04/12/gruwelijk-misverstand-privacy-is-het-punt-niet-a3996597">https://www.nrc.nl/nieuws/2020/04/12/gruwelijk-misverstand-privacy-is-het-punt-niet-a3996597</a>↩︎</p></li>
<li id="fn2"><p><a href="https://www.mffbas.nl/">https://www.mffbas.nl/</a>↩︎</p></li>
<li id="fn3"><p><a href="https://www.datafriesland.nl/">https://www.datafriesland.nl/</a>↩︎</p></li>
<li id="fn4"><p><a href="https://www.thelancet.com/journals/landig/article/PIIS2589-7500(22)00189-3/fulltext">https://www.thelancet.com/journals/landig/article/PIIS2589-7500(22)00189-3/fulltext</a>↩︎</p></li>
<li id="fn5"><p><a href="https://nos.nl/artikel/2452901-toch-persoonsgegevens-beschikbaar-voor-vervolgonderzoek-oversterfte-coronapandemie">https://nos.nl/artikel/2452901-toch-persoonsgegevens-beschikbaar-voor-vervolgonderzoek-oversterfte-coronapandemie</a>↩︎</p></li>
<li id="fn6"><p><a href="https://nos.nl/artikel/2452901-toch-persoonsgegevens-beschikbaar-voor-vervolgonderzoek-oversterfte-coronapandemie">https://nos.nl/artikel/2452901-toch-persoonsgegevens-beschikbaar-voor-vervolgonderzoek-oversterfte-coronapandemie</a>↩︎</p></li>
<li id="fn7"><p><a href="https://blog.xot.nl/2021/10/31/is-gegevensbescherming-nou-echt-z-moeilijk/index.html">https://blog.xot.nl/2021/10/31/is-gegevensbescherming-nou-echt-z-moeilijk/index.html</a>↩︎</p></li>
<li id="fn8"><p><a href="https://www.bnr.nl/podcast/eyeopeners/10493216/dit-is-de-oplossing-voor-het-delen-van-gevoelige-data">https://www.bnr.nl/podcast/eyeopeners/10493216/dit-is-de-oplossing-voor-het-delen-van-gevoelige-data</a>↩︎</p></li>
<li id="fn9"><p><a href="https://smartcityhub.com/technology-innnovation/barcelona-showcase-smart-city-dynamics/">https://smartcityhub.com/technology-innnovation/barcelona-showcase-smart-city-dynamics/</a>↩︎</p></li>
<li id="fn10"><p><a href="https://dhd.nl/">https://dhd.nl/</a>↩︎</p></li>
<li id="fn11"><p><a href="https://www.health-ri.nl/">https://www.health-ri.nl/</a>↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>nederlands</category>
  <category>data commons</category>
  <category>data solidarity</category>
  <guid>https://kapitan.net/blog/datasolidariteit.html</guid>
  <pubDate>Tue, 27 Dec 2022 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/images/tim-mossholder-bo3SHP58C3g-unsplash.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Podcast bij AIToday</title>
  <dc:creator>Daniel Kapitan</dc:creator>
  <link>https://kapitan.net/blog/podcast-aitoday.html</link>
  <description><![CDATA[ 




<iframe allow="autoplay *; encrypted-media *; fullscreen *; clipboard-write" frameborder="0" height="175" style="width:100%;max-width:660px;overflow:hidden;border-radius:10px;" sandbox="allow-forms allow-popups allow-same-origin allow-scripts allow-storage-access-by-user-activation allow-top-navigation-by-user-activation" src="https://embed.podcasts.apple.com/nl/podcast/s03e11-eerlijke-algoritmes-met-daniel-kapitan/id1510558415?i=1000568874206"></iframe>



 ]]></description>
  <category>nederlands</category>
  <category>podcast</category>
  <category>responsible ai</category>
  <guid>https://kapitan.net/blog/podcast-aitoday.html</guid>
  <pubDate>Tue, 05 Jul 2022 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/images/podcast-aitoday.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Hoe krijgen we eerlijke algoritmen voor overheidstoezicht?</title>
  <dc:creator>Daniel Kapitan</dc:creator>
  <link>https://kapitan.net/blog/eerlijke-algoritmen.html</link>
  <description><![CDATA[ 




<p>Het gebruik van algoritmen voor toezicht door de overheid blijft een heikel punt. Bij het verschijnen van het vierde en vijfde rapport over de Fraudesignaleringsvoorziening (FSV) bij de Belastingdienst.<sup>1</sup> liet de politiek geen kans onbenut om in krachtige termen haar ongenoegen te uiten: ‘schandalig’, ‘racistisch’, ‘woest makend’ en ‘oneerlijk’. In de Tweede Kamer werd met ruime meerderheid een motie aangenomen<sup>2</sup> om impact assessments verplicht te stellen ter voorkoming van misbruik van algoritmen. Maar om tot eerlijke algoritmen te komen, is meer nodig.</p>
<section id="algoritmen-gebruiken-voor-risicoprofilering" class="level2">
<h2 class="anchored" data-anchor-id="algoritmen-gebruiken-voor-risicoprofilering">Algoritmen gebruiken voor risicoprofilering</h2>
<p>Overheden zetten fors in op digitale transformatie, ook voor haar toezichthoudende taken. Uit de I-strategie Rijk 2021-2025<sup>3</sup> en het onderzoek naar gebruik van algoritmen bij gemeenten<sup>4</sup> blijkt dat het niet een kwestie is of data en algoritmen gebruikt gaan worden voor risicoprofilering in de uitvoeringspraktijk, maar vooral een vraag hoe en onder welke randvoorwaarden de overheid dit kan inzetten.</p>
<p>Tegelijkertijd zijn er veel kritische geluiden, zoals deze uitspraak van de Haagse rechtbank over SyRI<sup>5</sup>, het rapport van de Rotterdamse Rekenkamer over ethisch gebruik van algoritmen door de gemeente<sup>6</sup> en het pleidooi van Amnesty International voor een algeheel verbod op gebruik van gevoelige persoonskenmerken en algoritmen door de overheid.<sup>7</sup> Met een boete van 3,7 miljoen euro maakt de Autoriteit Persoonsgegevens recentelijk onmiskenbaar duidelijk<sup>8</sup> dat de fraudesignaleringsvoorziening (FSV) van de Belastingdienst een illegale verwerking is.</p>
</section>
<section id="voor-een-algoritme-dat-recht-doet-aan-onze-democratie-is-meer-nodig" class="level2">
<h2 class="anchored" data-anchor-id="voor-een-algoritme-dat-recht-doet-aan-onze-democratie-is-meer-nodig">Voor een algoritme dat recht doet aan onze democratie is meer nodig</h2>
<p>Maar de geest is uit de fles, zoals blijkt uit het WRR rapport ‘Opgave AI’,<sup>9</sup> en er lijkt er geen weg terug. De opgave waar wij als samenleving voor staan is om AI maatschappelijk in te bedden. De overeenstemming in de kamer over verplicht gebruik van de Impact Assessment Mensenrechten en Algoritmes (IAMA)<sup>10</sup> is daarvoor niet genoeg. Deze procesbenadering biedt onvoldoende houvast om bestuurlijke richtlijnen te laten matchen met de uitvoeringspraktijk voor een goed resultaat – namelijk een praktisch werkend algoritme dat recht doet aan onze wensen en eisen van een democratische rechtsstaat.</p>
<p>In de afgelopen paar jaar zijn verschillende procesmethodieken ontwikkeld om ethiek een plaats te geven in de ontwikkeling van algoritmen. Een voorbeeld is de IAMA-methodiek. Deze wordt echter slechts ‘als ethisch begeleider en niet als beoordelaar’ ingezet.</p>
</section>
<section id="de-mystiek-van-en-onbekenheid-met-algoritmen-wreekt-zich-hier" class="level2">
<h2 class="anchored" data-anchor-id="de-mystiek-van-en-onbekenheid-met-algoritmen-wreekt-zich-hier">De mystiek van en onbekenheid met algoritmen wreekt zich hier</h2>
<p>Naast begeleidingsethiek zijn duidelijke regels nodig die inhoudelijk richting geven aan hoe algoritmen ontwikkeld en gebruikt moeten worden. Zo moet, net als bij COVID-testen, altijd een afweging gemaakt worden tussen sensitiviteit (correct voorspellen van een risico) en specificiteit (zo min mogelijk fout positieve voorspellingen). Deze afweging wordt nu nog te vaak door technische ontwikkelaars gedaan, terwijl hier juist een rol is weggelegd voor bestuurders.</p>
<p>De mystiek van en onbekendheid met algoritmen wreekt zich hier. Bestuurders, toezichthouders, juristen, ethici en datascientists hebben onvoldoende begrip van elkaars vakgebied, waardoor het lastig is om concepten uit de statistiek (de kern van machine learning) te vertalen naar een inhoudelijk, bestuurlijk toetsingskader. Het probleem ligt met name ook in de emotionele en politieke beladenheid van het gebruik van bijzondere persoonsgegevens, zoals leeftijd, geslacht of nationaliteit.</p>
</section>
<section id="kind-met-het-badwater-weggooien" class="level2">
<h2 class="anchored" data-anchor-id="kind-met-het-badwater-weggooien">Kind met het badwater weggooien</h2>
<p>In Rotterdam bijvoorbeeld is naar aanleiding van het eerdergenoemde rapport politieke consensus ontstaan over het niet meer gebruiken van ‘gevoelige variabelen’.<sup>11</sup> Bijvoorbeeld bij het controleren van bijstandsontvangers.</p>
<p>Elk jaar worden onder de 35.000 Rotterdamse bijstandsontvangers circa 6.000 heronderzoeken uitgevoerd om vast te stellen of zij wel rechtmatig een uitkering ontvangen. Om de beschikbare handhavingscapaciteit zo effectief mogelijk in te zetten, wil de gemeente deze heronderzoeken uitvoeren bij uitkeringsontvangers met de grootste kans op het onterecht ontvangen van een uitkering. Daarvoor is een risicomodel ontwikkeld dat onrechtmatigheden voorspelt.</p>
<p>Voor de voorspelling worden persoonsgegevens, zoals leeftijd en geslacht, gebruikt die een correlatie hebben met een verhoogd risico op onrechtmatig gebruik van een bijstandsuitkering. De Rotterdamse Rekenkamer stelt dat dit kan resulteren in ongewenste discriminatie en de gemeente wil daarom deze gevoelige variabelen niet meer gebruiken.</p>
<p>Als deze lijn wordt doorgezet zijn we hard op weg om het kind met het badwater weg te gooien. We kunnen dan net zo goed meteen stoppen met het investeren van tijd en geld in de ontwikkeling van algoritmen voor risicoprofilering door de toezichthoudende overheid. De essentie van algoritmen is dat zij alleen goede voorspellingen kunnen geven door maximaal gebruik te maken van correlaties in de data.</p>
</section>
<section id="statistisch-en-ethisch-verantwoord-gebruik" class="level2">
<h2 class="anchored" data-anchor-id="statistisch-en-ethisch-verantwoord-gebruik">Statistisch en ethisch verantwoord gebruik</h2>
<p>Om discriminatie door een algoritme tegen te gaan, is het juist zaak om alle gevoelige variabelen mee te nemen voor het ontwikkelen van het algoritme en pas achteraf te bepalen welke variabelen uiteindelijk wel of niet gebruikt mogen worden.</p>
<p>Al in 1988 beschreven Schmidt en Witte<sup>12</sup> een methode voor statistisch én ethisch verantwoord gebruik van algoritmen, in dit geval binnen de context van de rechtspraak. Zij laten zien hoe een technisch team tijdens de ontwikkelfase alle mogelijke variabelen gebruikt om het algoritme te ‘trainen’ om recidiverisico te bepalen. In de gebruiksfase bepalen beleidsmakers dan welke variabelen gebruikt mogen worden om dit risico te voorspellen en daadwerkelijk mee te wegen in de uitspraak.</p>
<p>Stel, er is een hoge correlatie tussen recidiverisico en nationaliteit. Omdat we het onwenselijk vinden dat nationaliteit een overweging is voor de rechtspraak, wordt deze variabele wel gebruikt in de ontwikkelfase van het algoritme, maar wordt hij achterwege gelaten (geblindeerd) in het berekenen van het recidiverisico. Hiermee wordt discriminatie effectief tegengegaan.</p>
</section>
<section id="meer-concrete-inhoudelijke-richtlijnen-zijn-nodig" class="level2">
<h2 class="anchored" data-anchor-id="meer-concrete-inhoudelijke-richtlijnen-zijn-nodig">Meer concrete, inhoudelijke richtlijnen zijn nodig</h2>
<p>Om algoritmen maatschappelijk in te bedden, zullen alle geledingen van de overheid (wetgevend, uitvoerend en controlerend) en maatschappelijke organisaties tot meer concrete, inhoudelijke richtlijnen moeten komen over hoe data en algoritmen ingezet kunnen worden voor de toezichthoudende overheid.</p>
<p>Dat begint met het inzicht dat persoonsgegevens zoals geslacht of nationaliteit an sich niet discriminerend zijn. Bovendien is een beter begrip van de werking van algoritmen noodzakelijk om een vruchtbaar debat te voeren over het gebruik ervan. Meer multidisciplinair onderzoek is gewenst, bijvoorbeeld via initiatieven zoals de ELSA Labs<sup>13</sup> of het Civic AI Lab<sup>14</sup>, opdat verschillende vakgebieden meer van elkaar gaan begrijpen.</p>
<p>Totdat hier meer helderheid over is, zou de overheid haar aandacht beter kunnen richten op andere thema’s binnen de digitaliseringsagenda, zoals het toepassen van AI voor ontwikkeling en beheer van de bebouwde omgeving, waar risico op discriminatie aanmerkelijk lager is.</p>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Voetnoten</h2>

<ol>
<li id="fn1"><p><a href="https://www.rijksoverheid.nl/documenten/kamerstukken/2022/03/29/kamerbrief-bij-pwc-rapporten-fsv-mkb-en-querys-aan-de-poort">https://www.rijksoverheid.nl/documenten/kamerstukken/2022/03/29/kamerbrief-bij-pwc-rapporten-fsv-mkb-en-querys-aan-de-poort</a>↩︎</p></li>
<li id="fn2"><p><a href="https://www.tweedekamer.nl/kamerstukken/moties/detail?id=2022Z06024&amp;did=2022D12329">https://www.tweedekamer.nl/kamerstukken/moties/detail?id=2022Z06024&amp;did=2022D12329</a>↩︎</p></li>
<li id="fn3"><p><a href="https://www.digitaleoverheid.nl/wp-content/uploads/sites/8/2021/09/I-Strategie-Rijk.pdf">https://www.digitaleoverheid.nl/wp-content/uploads/sites/8/2021/09/I-Strategie-Rijk.pdf</a>↩︎</p></li>
<li id="fn4"><p><a href="https://hooghiemstra-en-partners.nl/onderzoek-hoe-gemeenten-besluiten-over-algoritmen-en-mensenrechten">https://hooghiemstra-en-partners.nl/onderzoek-hoe-gemeenten-besluiten-over-algoritmen-en-mensenrechten</a>↩︎</p></li>
<li id="fn5"><p><a href="https://www.rechtspraak.nl/Organisatie-en-contact/Organisatie/Rechtbanken/Rechtbank-Den-Haag/Nieuws/Paginas/SyRI-wetgeving-in-strijd-met-het-Europees-Verdrag-voor-de-Rechten-voor-de-Mens.aspx">https://www.rechtspraak.nl/Organisatie-en-contact/Organisatie/Rechtbanken/Rechtbank-Den-Haag/Nieuws/Paginas/SyRI-wetgeving-in-strijd-met-het-Europees-Verdrag-voor-de-Rechten-voor-de-Mens.aspx</a>↩︎</p></li>
<li id="fn6"><p><a href="https://rekenkamer.rotterdam.nl/onderzoeken/algoritmes/">https://rekenkamer.rotterdam.nl/onderzoeken/algoritmes/</a>↩︎</p></li>
<li id="fn7"><p><a href="https://www.amnesty.nl/wat-we-doen/tech-en-mensenrechten/algoritmes-big-data-overheid">https://www.amnesty.nl/wat-we-doen/tech-en-mensenrechten/algoritmes-big-data-overheid</a>↩︎</p></li>
<li id="fn8"><p><a href="https://autoriteitpersoonsgegevens.nl/nl/nieuws/boete-belastingdienst-voor-zwarte-lijst-fsv">https://autoriteitpersoonsgegevens.nl/nl/nieuws/boete-belastingdienst-voor-zwarte-lijst-fsv</a>↩︎</p></li>
<li id="fn9"><p><a href="https://www.wrr.nl/publicaties/rapporten/2021/11/11/opgave-ai-de-nieuwe-systeemtechnologie">https://www.wrr.nl/publicaties/rapporten/2021/11/11/opgave-ai-de-nieuwe-systeemtechnologie</a>↩︎</p></li>
<li id="fn10"><p><a href="https://www.rijksoverheid.nl/documenten/rapporten/2021/02/25/impact-assessment-mensenrechten-en-algoritmes">https://www.rijksoverheid.nl/documenten/rapporten/2021/02/25/impact-assessment-mensenrechten-en-algoritmes</a>↩︎</p></li>
<li id="fn11"><p><a href="https://rekenkamer.rotterdam.nl/onderzoeken/algoritmes/">https://rekenkamer.rotterdam.nl/onderzoeken/algoritmes/</a>↩︎</p></li>
<li id="fn12"><p><a href="https://link.springer.com/book/10.1007/978-1-4612-3772-3?noAccess=true">https://link.springer.com/book/10.1007/978-1-4612-3772-3?noAccess=true</a>↩︎</p></li>
<li id="fn13"><p><a href="https://nlaic.com/en/building-blocks/human-centric-ai/elsa-concept-for-human-centric-ai/">https://nlaic.com/en/building-blocks/human-centric-ai/elsa-concept-for-human-centric-ai/</a>↩︎</p></li>
<li id="fn14"><p><a href="https://icai.ai/civic-ai-lab/">https://icai.ai/civic-ai-lab/</a>↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>nederlands</category>
  <category>responsible ai</category>
  <guid>https://kapitan.net/blog/eerlijke-algoritmen.html</guid>
  <pubDate>Mon, 25 Apr 2022 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/images/alexander-grey-TZZwC_xsClY-unsplash.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Analytical problem solving</title>
  <dc:creator>Daniel Kapitan</dc:creator>
  <link>https://kapitan.net/blog/analytical-problem-solving.html</link>
  <description><![CDATA[ 




<section id="section" class="level1">
<h1></h1>
  <p><a href="../resources/demast2023analytical.pdf" target="_blank">Download PDF File</a></p>
   <object data="/resources/demast2023analytical.pdf" type="application/pdf" width="100%" height="800px">
    <p>Unable to display PDF file. <a href="../resources/demast2023analytical.pdf">Download</a> instead.</p>
  </object>
  


</section>

 ]]></description>
  <category>english</category>
  <category>modeling</category>
  <guid>https://kapitan.net/blog/analytical-problem-solving.html</guid>
  <pubDate>Thu, 10 Mar 2022 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/images/logo-american-statistician.png" medium="image" type="image/png" height="79" width="144"/>
</item>
<item>
  <title>Dromen over open data en algoritmen</title>
  <dc:creator>Daniel Kapitan</dc:creator>
  <link>https://kapitan.net/blog/hippo-ai.html</link>
  <description><![CDATA[ 




<p>Toen ik in 1991 begon aan mijn studie in Leiden, begon iemand in Finland met het schrijven van een nieuw operating systeem. Gewoon voor de lol. De broncode was vanaf het begin openbaar. Anderen waren van harte welkom om mee te doen. Vandaag de dag draait 96% van de grootste servers wereldwijd op Linux. In 1999 ging Red Hat naar de beurs. Zij bewezen daarmee dat het onmogelijke mogelijk is: een bedrijf bouwen op open source software en toch geld verdienen.</p>
<p>Net zoals mijn voorganger in deze column, droom ik van een wereld waarin data niet wordt gezien als een commodity maar als een common pool resource. Een wereld waarin de broncode van algoritmes openbaar is en daarmee toetsbaar voor peer review. Kortom, een wereld waarin de hacking cultuur samenkomt met die van Elinor Ostrom. Helaas staan tussen droom en daad wetten in de weg, en praktische bezwaren.</p>
<p>Of kan het toch? Droom eens met mij mee: we leggen voor de hele wereld een openbare database aan van beelden van borstkankercellen van zogenaamde HER2-positieve borstkanker. Deze vorm van kanker komt bij 19 op de 100.000 vrouwen voor en is met relatief goedkope beeldvormende diagnostiek vast te stellen. Omdat de database enkel foto’s van cellen bevat met een label kwaadaardig/goedaardig zijn er ook weinig belemmeringen wat betreft privacy. Deze database wordt vervolgens publiek beschikbaar gesteld zodat iedereen zelf een algoritme kan ontwikkelen. De enige verplichting is dat je het resultaat – het getrainde model, de broncode, de methodische verantwoording – ook weer deelt.</p>
<p>Ik stel mij voor dat een dergelijke aanpak binnen afzienbare termijn goede en robuuste algoritmes zal opleveren. Vanwege de volledige openheid van het ontwikkelproces, kan ook meteen worden voldaan aan een aantal belangrijke eisen van transparantie, uitlegbaarheid en reproduceerbaarheid voor hoog-risico toepassingen van algoritmes. Commerciële partijen kunnen zich via een open source business model richten op dienstverlening op het gebied van certificering, integratie met bestaande software systemen en het beheren van de levenscyclus van de modellen.</p>
<p>De werkelijkheid: op 30 september 2021 ontving de Hippo Foundation de Duitse AI startup prijs 2021. Bovenstaand voorbeeld is letterlijk de eerste aandoening die zij via <a href="http://viktoriaonezero.org/">viktoriaonezero.org</a> aan het bouwen zijn. Gelukkig ben ik niet de enige die durft te dromen.</p>
<p><small class="text-muted">Column verschenen in <a href="https://edata.nl/2022/02/01/column-dromen-over-open-data-en-algoritmes/">E-data &amp; Research</a>.</small></p>



 ]]></description>
  <category>nederlands</category>
  <category>responsible ai</category>
  <guid>https://kapitan.net/blog/hippo-ai.html</guid>
  <pubDate>Tue, 01 Feb 2022 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/images/my-boobs-are-not-for-sale.png" medium="image" type="image/png" height="81" width="144"/>
</item>
<item>
  <title>Creating generative art with L-systems in Python</title>
  <link>https://kapitan.net/blog/lartpy.html</link>
  <description><![CDATA[ 




<p><img src="https://kapitan.net/images/lartpy.jpg" class="img-fluid"></p>
<p><a href="https://en.wikipedia.org/wiki/Creative_coding">Creative coding</a> is fun if you know a thing or two about programming. And if, like me, you are an utter noob when it comes to brushes and pencils, then it is even more enticing as a means to express yourself and create something just for the sake of it. It doesn’t have to be functional, but you do get to hone your hacking skills and set challenges for yourself along the way.</p>
<p>A fellow data scientist who is into <a href="https://www.basbloemberg.nl/">“Art &amp; AI”</a> recently pointed me to the field of <a href="https://aiartists.org/generative-art-design">generative art</a>. I have always been facinated by <a href="https://en.wikipedia.org/wiki/Emergence">emergence</a> and even more so when I came across the picture above. It is featured in <a href="https://g-e-n-a-r-t.com/en/post.php?p=10">this blog</a> on how to draw a pencil-sketch-like forest with Processing. One thing led to another: I had a go at <a href="https://py.processing.org/tutorials/command-line/">Processing in Python mode</a>, dabbled with <a href="http://louistiao.me/posts/notebooks/embedding-matplotlib-animations-in-jupyter-as-interactive-javascript-widgets/">matplotlib for animations</a> and read Schiffman’s <a href="https://natureofcode.com/book/">the Nature of Code</a>.</p>
<p><em>“Would it be possible to create a Python project that can generate those pencil-like drawings with random forests, with different types of trees?”</em>, I thought (pun intended). Of course, someone already thought of that and it even has a name: <strong>algorithmic botany</strong>. Przemyslaw Prusinkiewicz and Aristid Lindenmayer wrote the seminal book on the subject in 1990, <a href="http://algorithmicbotany.org/papers/#abop">The Algorithmic Beauty of Plants</a>. Lindenmayer invented <a href="https://en.wikipedia.org/wiki/L-system">L-systems</a> already back in 1968. Today, household computers have enough resources to handle large-ish parallel writing systems and you could start modelling the growth of any plant using a framework like <a href="https://lpy.readthedocs.io/en/latest/">L-Py</a>.</p>
<p>Although a lot has been written on the subject and there are quite a few open source libraries, they weren’t quite what I have in mind. Instead, the idea of creating generative art in Python emerged using the following components:</p>
<ol type="1">
<li>A lightweight implementation of L-systems that also supports stochastic and parametric production rules;</li>
<li>Integration with <a href="https://p5js.org">p5js</a> via <a href="https://berinhard.github.io/pyp5js/">pyp5js</a> as a web-native graphing engine.</li>
</ol>
<p>The possibilities are endless and I can foresee spending way too much time on this. In this blog post, I will lay out the ideas behind this approach.</p>
<section id="playing-with-l-systems-in-python" class="level1">
<h1>Playing with L-systems in Python</h1>
<p>There are different kinds of L-systems, with increasing complexity. We will start with the simplest: Lindenmayer’s original L-system for modelling the growth of algae (We will jump right in, please read the <a href="https://en.wikipedia.org/wiki/L-system">article on Wikipedia</a> if you need more context).</p>
<section id="d0l-deterministic-context-free-l-system" class="level2">
<h2 class="anchored" data-anchor-id="d0l-deterministic-context-free-l-system">D0L: deterministic context-free L-system</h2>
<div id="cell-3" class="cell" data-cell_id="4f89aef0f75d4aa3808305b92a4925d3" data-deepnote_cell_type="code" data-deepnote_to_be_reexecuted="false" data-execution_millis="21" data-execution_start="1619612317163" data-source_hash="8b352d4c" data-tags="[]">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># define L-system</span></span>
<span id="cb1-2">AXIOM <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'A'</span></span>
<span id="cb1-3">RULES <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'A'</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'AB'</span>,</span>
<span id="cb1-4">         <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'B'</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'A'</span>}</span>
<span id="cb1-5"></span>
<span id="cb1-6"></span>
<span id="cb1-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># initialize </span></span>
<span id="cb1-8">productions <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [AXIOM]</span>
<span id="cb1-9">iterations <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span></span>
<span id="cb1-10"></span>
<span id="cb1-11"></span>
<span id="cb1-12"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> generate_d0l(axiom, productions, iterations):</span>
<span id="cb1-13">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> rewrite_l(word):</span>
<span id="cb1-14">        productions.append(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span>.join([RULES.get(c) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">or</span> c <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> c <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> word]))</span>
<span id="cb1-15">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> productions[<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]</span>
<span id="cb1-16"></span>
<span id="cb1-17"></span>
<span id="cb1-18">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> iterations <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>:</span>
<span id="cb1-19">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> axiom</span>
<span id="cb1-20">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span>:</span>
<span id="cb1-21">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> rewrite_l(generate_d0l(axiom, productions, iterations <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>))</span>
<span id="cb1-22"></span>
<span id="cb1-23"></span>
<span id="cb1-24"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># main</span></span>
<span id="cb1-25">generate_d0l(AXIOM, productions, iterations)</span>
<span id="cb1-26"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span>.join([<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>i<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>p<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i,p <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">enumerate</span>(productions)]))</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>0: A
1: AB
2: ABA
3: ABAAB
4: ABAABABA
5: ABAABABAABAAB
6: ABAABABAABAABABAABABA
7: ABAABABAABAABABAABABAABAABABAABAAB
</code></pre>
</div>
</div>
<p>I actually found the recursive Python implementation on this <a href="https://understanding-recursion.readthedocs.io/en/latest/16%20L-System%20Solution.html">introductory website on recursion</a>. While I still struggle to apply recursion, I find it satisfying to solve coding problems this way. And even with just these twenty lines of code, we have already stumbled on the <a href="https://en.wikipedia.org/wiki/Fibonacci_number">Fibonacci numbers</a>! Have a look at the length of each successive sequence:</p>
<div id="cell-5" class="cell" data-cell_id="7c9e0ab688d543ddb427e0706d09d8c1" data-deepnote_cell_type="code" data-deepnote_to_be_reexecuted="false" data-execution_millis="135" data-execution_start="1619612317215" data-is_code_hidden="true" data-source_hash="8264db4e" data-tags="[]">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>([<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(word) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> word <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> productions])</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>[1, 2, 3, 5, 8, 13, 21, 34]</code></pre>
</div>
</div>
<p>Awesome as the nature of code may be, we are still a long way off from actually generating a tree. For that, we need branching rules. To do so, basic L-systems also allow constants, which are left untouched by the production rules. It is common to add constants <code>+</code> and <code>-</code> to denote rotations when branching, and <code>[</code>,<code>]</code> for handling the locations of the branching points. For a fractal plant, the code is as follows:</p>
<div id="cell-7" class="cell" data-cell_id="0edc13f7a3a94a8f8c6d39e03e99b6dd" data-deepnote_cell_type="code" data-deepnote_to_be_reexecuted="false" data-execution_millis="134" data-execution_start="1619612317216" data-source_hash="b4945e20" data-tags="[]">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb5-1">AXIOM <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"X"</span></span>
<span id="cb5-2">RULES <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"X"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"F+[[X]-X]-F[-FX]+X"</span>,</span>
<span id="cb5-3">         <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"F"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"FF"</span>}</span>
<span id="cb5-4">productions <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [AXIOM]</span>
<span id="cb5-5">generate_d0l(AXIOM, productions, iterations)</span>
<span id="cb5-6"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span>.join([<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>i<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>p<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i,p <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">enumerate</span>(productions)]))</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>0: X
1: F+[[X]-X]-F[-FX]+X
2: FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X
3: FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X
4: FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X
5: FFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X
6: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+[[FFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X
7: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+[[FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+[[FFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+[[FFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+[[FFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+[[FFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFFFFFFFFFF+[[FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFFFFFFFFFF[-FFFFFFFFFFFFFFFFFFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFFFFFF+[[FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFFFFFF[-FFFFFFFFFFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FFFF+[[FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]-FFFF[-FFFFFF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X]+FF+[[F+[[X]-X]-F[-FX]+X]-F+[[X]-X]-F[-FX]+X]-FF[-FFF+[[X]-X]-F[-FX]+X]+F+[[X]-X]-F[-FX]+X
</code></pre>
</div>
</div>
<p>It is amazing to see how complexity increases by adding slightly longer rules. To actually draw something, we translate the letters as follows: * “F” means “draw forward” * “-” means “turn right”, using a predefined value e.g.&nbsp;30° * “+” means “turn left 30°” * “X” does not correspond to any drawing action and is used to control the evolution of the curve.</p>
<p>The square bracket “[” corresponds to saving the current values for position and angle, which are restored when the corresponding “]” is executed, which effectively is a <a href="https://en.wikipedia.org/wiki/Stack_(abstract_data_type)">LIFO stack</a>. We will go into the details of how to draw later.</p>
</section>
<section id="adding-stochastic-rules" class="level2">
<h2 class="anchored" data-anchor-id="adding-stochastic-rules">Adding stochastic rules</h2>
<p>D0L systems are completely deterministic, that is, each starting axiom yields the same result. Using this to draw a forest would result in a boring scene: all trees would be identical. To mimic mutations in nature, stochastic L-systems allow the same letter to have for different production rules with a given probability. For example, if we want three different production rules for F with equal probability</p>
<pre><code>p1: F(0.33) → F[+F]F[−F]F
p2: F(0.33) → F[+F]F
p3: F(0.34) → F[−F]F</code></pre>
<p>the Python implementation could look something like this:</p>
<div id="cell-10" class="cell" data-cell_id="4e3895f0f15b431a9489742b3f7cd84f" data-deepnote_cell_type="code" data-deepnote_to_be_reexecuted="false" data-execution_millis="10" data-execution_start="1619612508337" data-source_hash="77e3defc" data-tags="[]">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb8-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> numpy.random <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> default_rng</span>
<span id="cb8-2"></span>
<span id="cb8-3">AXIOM <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"F"</span></span>
<span id="cb8-4">RULES <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"F"</span>: [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"F[+F]F[−F]F"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"F[+F]F"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"F[−F]F"</span>]}</span>
<span id="cb8-5">productions <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [AXIOM]</span>
<span id="cb8-6">iterations <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span></span>
<span id="cb8-7"></span>
<span id="cb8-8"></span>
<span id="cb8-9">rng <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> default_rng()</span>
<span id="cb8-10"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> generate_stochastic(axiom, productions, iterations):</span>
<span id="cb8-11">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> get_stochastic_rule(letter):</span>
<span id="cb8-12">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> letter <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">not</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> RULES.keys():</span>
<span id="cb8-13">            <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> letter</span>
<span id="cb8-14">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span>:</span>
<span id="cb8-15">            <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> RULES.get(letter)[rng.choice(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]]</span>
<span id="cb8-16"></span>
<span id="cb8-17"></span>
<span id="cb8-18">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> rewrite_l(word):</span>
<span id="cb8-19">        productions.append(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span>.join([get_stochastic_rule(c) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> c <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> word]))</span>
<span id="cb8-20">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> productions[<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]</span>
<span id="cb8-21"></span>
<span id="cb8-22"></span>
<span id="cb8-23">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> iterations <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>:</span>
<span id="cb8-24">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> axiom</span>
<span id="cb8-25">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span>:</span>
<span id="cb8-26">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> rewrite_l(generate_stochastic(axiom, productions, iterations <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>))</span>
<span id="cb8-27"></span>
<span id="cb8-28"></span>
<span id="cb8-29">generate_stochastic(AXIOM, productions, iterations)</span>
<span id="cb8-30"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span>.join([<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>i<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>p<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i,p <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">enumerate</span>(productions)]))</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>0: F
1: F[−F]F
2: F[−F]F[−F[−F]F]F[−F]F
3: F[−F]F[−F[−F]F]F[−F]F[−F[−F]F[−F[+F]F]F[+F]F[−F]F]F[+F]F[−F[+F]F[−F]F]F[+F]F[−F]F
</code></pre>
</div>
</div>
<p>Here’s another run with a different result:</p>
<div id="cell-12" class="cell" data-cell_id="ec7650359b644649a843d7a30e0ce467" data-deepnote_cell_type="code" data-deepnote_to_be_reexecuted="false" data-execution_millis="0" data-execution_start="1619612520082" data-is_code_hidden="true" data-source_hash="32960fdd" data-tags="[]">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb10-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># show that a new run generates different result</span></span>
<span id="cb10-2">productions <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [AXIOM]</span>
<span id="cb10-3">generate_stochastic(AXIOM, productions, iterations)</span>
<span id="cb10-4"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span>.join([<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>i<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>p<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i,p <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">enumerate</span>(productions)]))</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>0: F
1: F[+F]F[−F]F
2: F[+F]F[−F]F[+F[+F]F]F[−F]F[−F[+F]F[−F]F]F[+F]F[−F]F
3: F[−F]F[+F[+F]F]F[+F]F[−F[+F]F]F[+F]F[−F]F[+F[−F]F[+F[+F]F]F[−F]F]F[+F]F[−F[+F]F[−F]F]F[+F]F[−F]F[−F[−F]F[+F[−F]F]F[−F]F[−F[+F]F]F[+F]F[−F]F]F[+F]F[−F]F[+F[+F]F[−F]F]F[−F]F[−F[+F]F[−F]F]F[+F]F[−F]F
</code></pre>
</div>
</div>
</section>
<section id="adding-parameters" class="level2">
<h2 class="anchored" data-anchor-id="adding-parameters">Adding parameters</h2>
<p>In a parametric L-system, letters are allowed to have parameters, which correspond with formal parameters used in the specification of L-system productions. This can be used to model <em>Anabaena catenula</em> (taken from <a href="http://algorithmicbotany.org/papers/hanan.dis1992.html">Hanan’s dissertation</a>):</p>
<div id="cell-14" class="cell" data-cell_id="ffbb155396f541bea91cdddafa44a742" data-deepnote_cell_type="code" data-deepnote_to_be_reexecuted="false" data-execution_millis="71" data-execution_start="1619612317279" data-source_hash="ddba2700" data-tags="[]">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb12-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> collections <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> namedtuple</span>
<span id="cb12-2"></span>
<span id="cb12-3"></span>
<span id="cb12-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># parameters</span></span>
<span id="cb12-5">F <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> namedtuple(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'F'</span>, [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'s'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'t'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'o'</span>])  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># parameterized cell</span></span>
<span id="cb12-6">s <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"AS"</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"BS"</span>}  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># cell size</span></span>
<span id="cb12-7">t <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"A"</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"B"</span>}  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># cell type</span></span>
<span id="cb12-8">o <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"right"</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"left"</span>}  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># cell orientation</span></span>
<span id="cb12-9"></span>
<span id="cb12-10">AXIOM <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [F(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)]</span>
<span id="cb12-11">RULES <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {F(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>):  [F(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>), F(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)],</span>
<span id="cb12-12">         F(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>): [F(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>), F(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)],</span>
<span id="cb12-13">         F(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>):  [F(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)],</span>
<span id="cb12-14">         F(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>): [F(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)],</span>
<span id="cb12-15">        }</span>
<span id="cb12-16">productions <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [AXIOM]</span>
<span id="cb12-17">iterations <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span></span>
<span id="cb12-18"></span>
<span id="cb12-19"></span>
<span id="cb12-20"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> unnest(list_, unnested_<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>):</span>
<span id="cb12-21">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Utility function to unnest arbitrarily deep list of lists</span></span>
<span id="cb12-22"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    """</span></span>
<span id="cb12-23">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> unnested_ <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">is</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>:</span>
<span id="cb12-24">        unnested_ <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb12-25">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> x <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> list_:</span>
<span id="cb12-26">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">not</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">isinstance</span>(x, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">list</span>):</span>
<span id="cb12-27">            unnested_.append(x)</span>
<span id="cb12-28">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">isinstance</span>(x, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">list</span>):</span>
<span id="cb12-29">            unnest(x, unnested_)</span>
<span id="cb12-30">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> unnested_</span>
<span id="cb12-31"></span>
<span id="cb12-32"></span>
<span id="cb12-33"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> generate_parametric(axiom, productions, iterations):</span>
<span id="cb12-34">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> rewrite_l(word):</span>
<span id="cb12-35">        productions.append(unnest([RULES.get(c) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">or</span> c <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> c <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> unnest(word)]))</span>
<span id="cb12-36">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> productions[<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]</span>
<span id="cb12-37"></span>
<span id="cb12-38"></span>
<span id="cb12-39">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> iterations <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>:</span>
<span id="cb12-40">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> [axiom]</span>
<span id="cb12-41">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span>:</span>
<span id="cb12-42">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> rewrite_l(generate_parametric(axiom, productions, iterations <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>))</span>
<span id="cb12-43"></span>
<span id="cb12-44"></span>
<span id="cb12-45">generate_parametric(AXIOM, productions, iterations)</span>
<span id="cb12-46"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span>.join([<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>i<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>p<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i,p <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">enumerate</span>(productions)]))</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>0: [F(s=1, t=2, o=1)]
1: [F(s=2, t=1, o=1)]
2: [F(s=2, t=1, o=-1), F(s=1, t=2, o=1)]
3: [F(s=1, t=2, o=-1), F(s=2, t=1, o=1), F(s=2, t=1, o=1)]
4: [F(s=2, t=1, o=-1), F(s=2, t=1, o=-1), F(s=1, t=2, o=1), F(s=2, t=1, o=-1), F(s=1, t=2, o=1)]
5: [F(s=1, t=2, o=-1), F(s=2, t=1, o=1), F(s=1, t=2, o=-1), F(s=2, t=1, o=1), F(s=2, t=1, o=1), F(s=1, t=2, o=-1), F(s=2, t=1, o=1), F(s=2, t=1, o=1)]
</code></pre>
</div>
</div>
<p>While the <em>Anabaena</em> example above only makes simple comparisons, parametric L-systems can use any expression using the parameters in combination with the arithmetic operators +, −, ∗, /; the exponentiation operator ∧, the relational operators &lt;, &gt;, =; the logical operators !, &amp;, | (not, and, or) etc. For example, we could define a parameter <code>time</code> which increases with every iteration. This could be used to thicken the width of a branch of a tree.</p>
</section>
</section>
<section id="using-pyp5js-for-pythonic-drawing-on-the-web" class="level1">
<h1>Using pyp5js for Pythonic drawing on the web</h1>
<p>When Lindenmayer devised the L-system, <a href="https://en.wikipedia.org/wiki/Logo_(programming_language)">Logo</a> was one of the few programming langauges available. It included <a href="https://en.wikipedia.org/wiki/Turtle_graphics">turtle graphics</a> and thus the basis of algorithmic art was born by translating the alphabet of an L-system to turtle commands. The examples from the Nature of Code have in fact <a href="https://github.com/nature-of-code/noc-examples-processing/blob/master/chp08_fractals/NOC_8_09_LSystem/Turtle.pde">implemented this in Processing</a>. But rather than constrain yourself to the desktop, more mileage can be had by using <a href="https://p5js.org">p5js</a> which is “… an interpretation of Processing for today’s web”. To demonstrate, take the following example:</p>
<div id="cell-17" class="cell" data-cell_id="339bc90f77ba4f03ae639db0ba417ad8" data-deepnote_cell_type="code" data-deepnote_to_be_reexecuted="false" data-execution_millis="73" data-execution_start="1619612317283" data-source_hash="cbe4ac7d" data-tags="[]">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb14" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb14-1">AXIOM <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'G'</span></span>
<span id="cb14-2">RULES <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {</span>
<span id="cb14-3">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'F'</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'FF'</span>,</span>
<span id="cb14-4">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'G'</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'F-[[G]+G]+F[+FG]-G'</span></span>
<span id="cb14-5">}</span>
<span id="cb14-6">productions <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [AXIOM]</span>
<span id="cb14-7">generate_d0l(AXIOM, productions, iterations<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>)</span>
<span id="cb14-8"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span>.join([<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>i<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>p<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i,p <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">enumerate</span>(productions)]))</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>0: G
1: F-[[G]+G]+F[+FG]-G
2: FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G
3: FFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G
4: FFFFFFFF-[[FFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFFFFFF[+FFFFFFFFFFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G
5: FFFFFFFFFFFFFFFF-[[FFFFFFFF-[[FFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFFFFFF[+FFFFFFFFFFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFFFFFF-[[FFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFFFFFF[+FFFFFFFFFFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFFFFFFFFFFFFFF[+FFFFFFFFFFFFFFFFFFFFFFFF-[[FFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFFFFFF[+FFFFFFFFFFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FFFFFFFF-[[FFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFFFFFF[+FFFFFFFFFFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FFFF-[[FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]+FFFF[+FFFFFF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G]-FF-[[F-[[G]+G]+F[+FG]-G]+F-[[G]+G]+F[+FG]-G]+FF[+FFF-[[G]+G]+F[+FG]-G]-F-[[G]+G]+F[+FG]-G
</code></pre>
</div>
</div>
<p>Summer Rizo has already implemented L-systems in p5js, available on <a href="https://thefractal.zone/">thefractal.zone</a>. Copying the axiom and rules, and setting the branching angle <img src="https://latex.codecogs.com/png.latex?%5Ctheta"> to 30°, yields the drawing below. Note that the code only shows 5 iterations, while the drawing is based on more iterations (I have put the slider on maximum). When using recursion in Python you may quickly hit a limit: as I tried to execute <code>iterations=10</code> on a standard VM, Deepnote threw an error <code>IOPub data rate exceeded</code>. Yet another challenge to read-up and use <a href="https://sagnibak.github.io/blog/python-is-haskell-tail-recursion/">tail-call optimization in Python</a>.</p>
<p><img src="https://kapitan.net/images/fractal.png" class="img-fluid"></p>
<p>Having covered the algorithmic and technical components, we can now start bringing it all together. There are still quite a few things to experiment with in order to produce realistic sketches, such as adding noise to draw ‘sketchy’ lines, adding thickness to branches, adding shadows with brightness off-sets and composing a scene with overlaying trees. As a Pythonista I was happy to find <a href="https://berinhard.github.io/pyp5js/">pyp5js</a>, which allows you to re-use the ideas of Processing in Python, and transcoding it to p5.js using Transcrypt. It covers all the methods from p5.js and gives us enough drawing tools to play with. But that’s for another post. For now, I will leave you with a <a href="https://inconvergent.net/generative/">generative creation from Anders Hoff</a> which may inspire you to start creating generative art in Python, too.</p>
<p><img src="https://kapitan.net/images/tree2.gif" class="img-fluid"></p>


</section>

 ]]></description>
  <category>english</category>
  <category>visualization</category>
  <category>generative art</category>
  <category>coding</category>
  <guid>https://kapitan.net/blog/lartpy.html</guid>
  <pubDate>Mon, 26 Apr 2021 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/images/lartpy.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Stichting Corona in Kaart is briljant mislukt</title>
  <dc:creator>Daniel Kapitan</dc:creator>
  <link>https://kapitan.net/blog/scik.html</link>
  <description><![CDATA[ 




<div class="grid">
<div class="g-col-6">
<p>Als lead infrastructuur en data was ik vanaf het begin betrokken bij dit schitterende initatief. Ondanks dat het niet is gelukt, heeft o.a. de erkenning met de publieksprijs door het Instituut van Briljante Mislukking de deuren geopend en energie gegeven om te blijven strijden voor democratisering van data in de zorg.</p>
<p>Lees meer over dit project in <a href="https://www.briljantemislukkingen.nl/2021/03/09/coronainkaart/">dit artikel</a> of luister naar de podcast met Egge van der Poel, Josine van der Brug en Marcel Kerkhoven, met wie ik destijds op de barricades heb gestaan.</p>
</div>
<div class="g-col-6">
<p><img src="https://kapitan.net/images/instituut-voor-briljante-mislukkingen.png" class="img-fluid"></p>
<iframe style="border-radius:12px" src="https://open.spotify.com/embed/episode/3PCRGRIeeC8s9JbbsKC8YN?utm_source=generator" width="100%" height="152" frameborder="0" allowfullscreen="" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy"></iframe>
</div>
</div>



 ]]></description>
  <category>nederlands</category>
  <category>data commons</category>
  <category>data solidarity</category>
  <guid>https://kapitan.net/blog/scik.html</guid>
  <pubDate>Mon, 01 Mar 2021 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/images/instituut-voor-briljante-mislukkingen.png" medium="image" type="image/png" height="45" width="144"/>
</item>
<item>
  <title>Comet charts in Python</title>
  <link>https://kapitan.net/blog/comet-chart.html</link>
  <description><![CDATA[ 




<p><a href="https://www.zanarmstrong.com/#/infovisresearch/">Zan Armstrong’s comet chart</a> has been on my list of hobby projects for a while now. I think it is an elegant solution to visualize statistical mix effects and address Simpson’s paradox, and particularly useful when working with longitudinal data involving different sub-populations. Recently I found a good excuse to spend some time to actually use it as part of a exploratory data analysis on a project.</p>
<p>Since I mostly work in Python and have recently fallen in love with <a href="https://altair-viz.github.io/index.html">Altair</a> — for the same reasons as <a href="http://fernandoi.cl/blog/posts/altair/">Fernando explains here</a> — I wondered how the comet chart could be implemented using the <a href="https://idl.cs.washington.edu/papers/vega-lite/">grammar of interactive graphics</a>. It took me a while to figure out how to actually plot the comets. In a previous version, I had <a href="https://github.com/dkapitan/comet-chart/blob/master/comet-chart.ipynb">drawn glyphs using Bokeh</a>. While Altair allows you to plot any SVG path in a graph, this felt a bit hacky and not quite in line with the philosophy of using a grammar of graphics.</p>
<p>Thankfully <a href="https://github.com/altair-viz/altair/issues/2395#issuecomment-766454328">Mattijn was quick to suggest using trail-marks</a>, after which it was almost as easy as pie. So here’s an example using a dataset of 20,000 flights for 59 destination airports.</p>
<div id="b4f5c36c" class="cell" data-execution_count="1">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> altair <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> alt</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb1-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> vega_datasets</span>
<span id="cb1-4"></span>
<span id="cb1-5"></span>
<span id="cb1-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Use airline data to assess statistical mix effects of delays</span></span>
<span id="cb1-7">flights <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> vega_datasets.data.flights_20k()</span>
<span id="cb1-8">aggregation <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(</span>
<span id="cb1-9">    number_of_flights<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"destination"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"count"</span>),</span>
<span id="cb1-10">    mean_delay<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"delay"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mean"</span>),</span>
<span id="cb1-11">    mean_distance<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"distance"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mean"</span>),</span>
<span id="cb1-12">)</span>
<span id="cb1-13"></span>
<span id="cb1-14"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Compare delays by destination between month 1 and 3</span></span>
<span id="cb1-15">grouped <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> flights.groupby(by<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[flights.destination, flights.date.dt.month])</span>
<span id="cb1-16">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (</span>
<span id="cb1-17">    grouped.agg(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>aggregation)</span>
<span id="cb1-18">    .loc[(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">slice</span>(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>), [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>]), :]</span>
<span id="cb1-19">    .assign(</span>
<span id="cb1-20">        change_mean_delay<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> df:</span>
<span id="cb1-21">            df.groupby(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"destination"</span>)[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mean_delay"</span>].diff(),</span>
<span id="cb1-22">    )</span>
<span id="cb1-23">    .fillna(method<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bfill"</span>)</span>
<span id="cb1-24">    .reset_index()</span>
<span id="cb1-25">    .<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)</span>
<span id="cb1-26">)</span>
<span id="cb1-27"></span>
<span id="cb1-28"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Calculate weigthed average of delays for month 1 and 3</span></span>
<span id="cb1-29">total <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (</span>
<span id="cb1-30">    flights.groupby(flights.date.dt.month)</span>
<span id="cb1-31">    .agg(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>aggregation)</span>
<span id="cb1-32">    .loc[[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>], :]</span>
<span id="cb1-33">    .assign(</span>
<span id="cb1-34">        change_mean_delay<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> df: df.mean_delay.diff(),</span>
<span id="cb1-35">        destination<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'TOTAL'</span></span>
<span id="cb1-36">    )</span>
<span id="cb1-37">    .fillna(method<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bfill"</span>)</span>
<span id="cb1-38">    .<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">round</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)</span>
<span id="cb1-39">    .reset_index()</span>
<span id="cb1-40">    .loc[:, df.columns]</span>
<span id="cb1-41">)</span>
<span id="cb1-42"></span>
<span id="cb1-43"></span>
<span id="cb1-44"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> comet_chart(df, stroke<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"white"</span>):</span>
<span id="cb1-45">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> (</span>
<span id="cb1-46">    alt.Chart(df, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">600</span>, height<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">450</span>)</span>
<span id="cb1-47">    .mark_trail(stroke<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>stroke)</span>
<span id="cb1-48">    .encode(</span>
<span id="cb1-49">        x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.X(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"number_of_flights"</span>, scale<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Scale(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">type</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"log"</span>)),</span>
<span id="cb1-50">        y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Y(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mean_delay"</span>),</span>
<span id="cb1-51">        detail<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"destination"</span>,</span>
<span id="cb1-52">        size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Size(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"date"</span>, scale<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Scale(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>]), legend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>),</span>
<span id="cb1-53">        tooltip<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[</span>
<span id="cb1-54">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"destination"</span>,</span>
<span id="cb1-55">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"number_of_flights"</span>,</span>
<span id="cb1-56">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mean_delay"</span>,</span>
<span id="cb1-57">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"change_mean_delay"</span>,</span>
<span id="cb1-58">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mean_distance"</span>,</span>
<span id="cb1-59">        ],</span>
<span id="cb1-60">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># trails don't support continuous color</span></span>
<span id="cb1-61">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># see https://github.com/vega/vega/issues/1187</span></span>
<span id="cb1-62">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># hence use bins</span></span>
<span id="cb1-63">        color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Color(</span>
<span id="cb1-64">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"change_mean_delay:Q"</span>,</span>
<span id="cb1-65">            <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">bin</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Bin(step<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>),</span>
<span id="cb1-66">            scale<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Scale(scheme<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"blueorange"</span>),</span>
<span id="cb1-67">            legend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Legend(orient<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"top"</span>),</span>
<span id="cb1-68">        ),</span>
<span id="cb1-69">    )</span>
<span id="cb1-70">)</span>
<span id="cb1-71"></span>
<span id="cb1-72"></span>
<span id="cb1-73">comet_chart(df) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> comet_chart(total, stroke<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"black"</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>/tmp/ipykernel_2950/2480947234.py:23: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  .fillna(method="bfill")
/tmp/ipykernel_2950/2480947234.py:37: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  .fillna(method="bfill")</code></pre>
</div>
<div class="cell-output cell-output-display" data-execution_count="1">

<style>
  #altair-viz-05049652f3cd46f29434af5d73520178.vega-embed {
    width: 100%;
    display: flex;
  }

  #altair-viz-05049652f3cd46f29434af5d73520178.vega-embed details,
  #altair-viz-05049652f3cd46f29434af5d73520178.vega-embed details summary {
    position: relative;
  }
</style>
<div id="altair-viz-05049652f3cd46f29434af5d73520178"></div>
<script type="text/javascript">
  var VEGA_DEBUG = (typeof VEGA_DEBUG == "undefined") ? {} : VEGA_DEBUG;
  (function(spec, embedOpt){
    let outputDiv = document.currentScript.previousElementSibling;
    if (outputDiv.id !== "altair-viz-05049652f3cd46f29434af5d73520178") {
      outputDiv = document.getElementById("altair-viz-05049652f3cd46f29434af5d73520178");
    }

    const paths = {
      "vega": "https://cdn.jsdelivr.net/npm/vega@5?noext",
      "vega-lib": "https://cdn.jsdelivr.net/npm/vega-lib?noext",
      "vega-lite": "https://cdn.jsdelivr.net/npm/vega-lite@5.20.1?noext",
      "vega-embed": "https://cdn.jsdelivr.net/npm/vega-embed@6?noext",
    };

    function maybeLoadScript(lib, version) {
      var key = `${lib.replace("-", "")}_version`;
      return (VEGA_DEBUG[key] == version) ?
        Promise.resolve(paths[lib]) :
        new Promise(function(resolve, reject) {
          var s = document.createElement('script');
          document.getElementsByTagName("head")[0].appendChild(s);
          s.async = true;
          s.onload = () => {
            VEGA_DEBUG[key] = version;
            return resolve(paths[lib]);
          };
          s.onerror = () => reject(`Error loading script: ${paths[lib]}`);
          s.src = paths[lib];
        });
    }

    function showError(err) {
      outputDiv.innerHTML = `<div class="error" style="color:red;">${err}</div>`;
      throw err;
    }

    function displayChart(vegaEmbed) {
      vegaEmbed(outputDiv, spec, embedOpt)
        .catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));
    }

    if(typeof define === "function" && define.amd) {
      requirejs.config({paths});
      let deps = ["vega-embed"];
      require(deps, displayChart, err => showError(`Error loading script: ${err.message}`));
    } else {
      maybeLoadScript("vega", "5")
        .then(() => maybeLoadScript("vega-lite", "5.20.1"))
        .then(() => maybeLoadScript("vega-embed", "6"))
        .catch(showError)
        .then(() => displayChart(vegaEmbed));
    }
  })({"config": {"view": {"continuousWidth": 300, "continuousHeight": 300}}, "layer": [{"data": {"name": "data-577b80a24cc767f3ed67cc46d53cdea1"}, "mark": {"type": "trail", "stroke": "white"}, "encoding": {"color": {"bin": {"step": 2}, "field": "change_mean_delay", "legend": {"orient": "top"}, "scale": {"scheme": "blueorange"}, "type": "quantitative"}, "detail": {"field": "destination", "type": "nominal"}, "size": {"field": "date", "legend": null, "scale": {"range": [0, 10]}, "type": "quantitative"}, "tooltip": [{"field": "destination", "type": "nominal"}, {"field": "number_of_flights", "type": "quantitative"}, {"field": "mean_delay", "type": "quantitative"}, {"field": "change_mean_delay", "type": "quantitative"}, {"field": "mean_distance", "type": "quantitative"}], "x": {"field": "number_of_flights", "scale": {"type": "log"}, "type": "quantitative"}, "y": {"field": "mean_delay", "type": "quantitative"}}}, {"data": {"name": "data-7a6321518d52277115683f06846bda0e"}, "mark": {"type": "trail", "stroke": "black"}, "encoding": {"color": {"bin": {"step": 2}, "field": "change_mean_delay", "legend": {"orient": "top"}, "scale": {"scheme": "blueorange"}, "type": "quantitative"}, "detail": {"field": "destination", "type": "nominal"}, "size": {"field": "date", "legend": null, "scale": {"range": [0, 10]}, "type": "quantitative"}, "tooltip": [{"field": "destination", "type": "nominal"}, {"field": "number_of_flights", "type": "quantitative"}, {"field": "mean_delay", "type": "quantitative"}, {"field": "change_mean_delay", "type": "quantitative"}, {"field": "mean_distance", "type": "quantitative"}], "x": {"field": "number_of_flights", "scale": {"type": "log"}, "type": "quantitative"}, "y": {"field": "mean_delay", "type": "quantitative"}}}], "height": 450, "width": 600, "$schema": "https://vega.github.io/schema/vega-lite/v5.20.1.json", "datasets": {"data-577b80a24cc767f3ed67cc46d53cdea1": [{"destination": "ABQ", "date": 1, "number_of_flights": 129, "mean_delay": 7.98, "mean_distance": 552.15, "change_mean_delay": -0.45}, {"destination": "ABQ", "date": 3, "number_of_flights": 164, "mean_delay": 7.53, "mean_distance": 568.41, "change_mean_delay": -0.45}, {"destination": "ALB", "date": 1, "number_of_flights": 36, "mean_delay": 7.03, "mean_distance": 570.72, "change_mean_delay": 4.2}, {"destination": "ALB", "date": 3, "number_of_flights": 22, "mean_delay": 11.23, "mean_distance": 536.55, "change_mean_delay": 4.2}, {"destination": "AMA", "date": 1, "number_of_flights": 18, "mean_delay": 12.0, "mean_distance": 313.56, "change_mean_delay": -1.41}, {"destination": "AMA", "date": 3, "number_of_flights": 22, "mean_delay": 10.59, "mean_distance": 383.18, "change_mean_delay": -1.41}, {"destination": "AUS", "date": 1, "number_of_flights": 124, "mean_delay": 5.31, "mean_distance": 450.31, "change_mean_delay": 4.71}, {"destination": "AUS", "date": 3, "number_of_flights": 124, "mean_delay": 10.02, "mean_distance": 467.61, "change_mean_delay": 4.71}, {"destination": "BDL", "date": 1, "number_of_flights": 32, "mean_delay": 17.62, "mean_distance": 509.41, "change_mean_delay": -4.91}, {"destination": "BDL", "date": 3, "number_of_flights": 49, "mean_delay": 12.71, "mean_distance": 555.51, "change_mean_delay": -4.91}, {"destination": "BHM", "date": 1, "number_of_flights": 77, "mean_delay": 6.47, "mean_distance": 516.97, "change_mean_delay": -0.04}, {"destination": "BHM", "date": 3, "number_of_flights": 77, "mean_delay": 6.43, "mean_distance": 504.38, "change_mean_delay": -0.04}, {"destination": "BNA", "date": 1, "number_of_flights": 216, "mean_delay": 8.24, "mean_distance": 776.31, "change_mean_delay": -1.75}, {"destination": "BNA", "date": 3, "number_of_flights": 227, "mean_delay": 6.48, "mean_distance": 714.56, "change_mean_delay": -1.75}, {"destination": "BOI", "date": 1, "number_of_flights": 44, "mean_delay": 11.11, "mean_distance": 352.68, "change_mean_delay": -10.29}, {"destination": "BOI", "date": 3, "number_of_flights": 35, "mean_delay": 0.83, "mean_distance": 349.97, "change_mean_delay": -10.29}, {"destination": "BUF", "date": 1, "number_of_flights": 19, "mean_delay": -3.53, "mean_distance": 734.58, "change_mean_delay": -4.3}, {"destination": "BUF", "date": 3, "number_of_flights": 28, "mean_delay": -7.82, "mean_distance": 809.11, "change_mean_delay": -4.3}, {"destination": "BUR", "date": 1, "number_of_flights": 121, "mean_delay": 10.31, "mean_distance": 302.52, "change_mean_delay": -1.1}, {"destination": "BUR", "date": 3, "number_of_flights": 127, "mean_delay": 9.21, "mean_distance": 307.75, "change_mean_delay": -1.1}, {"destination": "BWI", "date": 1, "number_of_flights": 301, "mean_delay": 5.23, "mean_distance": 602.16, "change_mean_delay": -0.03}, {"destination": "BWI", "date": 3, "number_of_flights": 302, "mean_delay": 5.2, "mean_distance": 624.67, "change_mean_delay": -0.03}, {"destination": "CLE", "date": 1, "number_of_flights": 53, "mean_delay": 14.4, "mean_distance": 369.08, "change_mean_delay": -8.11}, {"destination": "CLE", "date": 3, "number_of_flights": 60, "mean_delay": 6.28, "mean_distance": 360.93, "change_mean_delay": -8.11}, {"destination": "CMH", "date": 1, "number_of_flights": 32, "mean_delay": 8.88, "mean_distance": 505.91, "change_mean_delay": -3.51}, {"destination": "CMH", "date": 3, "number_of_flights": 30, "mean_delay": 5.37, "mean_distance": 481.0, "change_mean_delay": -3.51}, {"destination": "CRP", "date": 1, "number_of_flights": 20, "mean_delay": 10.85, "mean_distance": 187.0, "change_mean_delay": 3.77}, {"destination": "CRP", "date": 3, "number_of_flights": 21, "mean_delay": 14.62, "mean_distance": 187.0, "change_mean_delay": 3.77}, {"destination": "DAL", "date": 1, "number_of_flights": 304, "mean_delay": 3.37, "mean_distance": 299.76, "change_mean_delay": 3.46}, {"destination": "DAL", "date": 3, "number_of_flights": 372, "mean_delay": 6.83, "mean_distance": 293.83, "change_mean_delay": 3.46}, {"destination": "DTW", "date": 1, "number_of_flights": 45, "mean_delay": 8.02, "mean_distance": 334.04, "change_mean_delay": 0.79}, {"destination": "DTW", "date": 3, "number_of_flights": 37, "mean_delay": 8.81, "mean_distance": 347.19, "change_mean_delay": 0.79}, {"destination": "ELP", "date": 1, "number_of_flights": 106, "mean_delay": 10.84, "mean_distance": 494.27, "change_mean_delay": -6.49}, {"destination": "ELP", "date": 3, "number_of_flights": 94, "mean_delay": 4.35, "mean_distance": 490.43, "change_mean_delay": -6.49}, {"destination": "FLL", "date": 1, "number_of_flights": 83, "mean_delay": 5.78, "mean_distance": 435.34, "change_mean_delay": 4.5}, {"destination": "FLL", "date": 3, "number_of_flights": 60, "mean_delay": 10.28, "mean_distance": 405.17, "change_mean_delay": 4.5}, {"destination": "GEG", "date": 1, "number_of_flights": 42, "mean_delay": 13.29, "mean_distance": 303.36, "change_mean_delay": -6.47}, {"destination": "GEG", "date": 3, "number_of_flights": 43, "mean_delay": 6.81, "mean_distance": 277.93, "change_mean_delay": -6.47}, {"destination": "HOU", "date": 1, "number_of_flights": 336, "mean_delay": 6.22, "mean_distance": 422.08, "change_mean_delay": 1.77}, {"destination": "HOU", "date": 3, "number_of_flights": 344, "mean_delay": 7.99, "mean_distance": 437.76, "change_mean_delay": 1.77}, {"destination": "HRL", "date": 1, "number_of_flights": 35, "mean_delay": 14.2, "mean_distance": 268.37, "change_mean_delay": -2.56}, {"destination": "HRL", "date": 3, "number_of_flights": 42, "mean_delay": 11.64, "mean_distance": 270.98, "change_mean_delay": -2.56}, {"destination": "IAH", "date": 1, "number_of_flights": 17, "mean_delay": 4.71, "mean_distance": 217.0, "change_mean_delay": -8.59}, {"destination": "IAH", "date": 3, "number_of_flights": 9, "mean_delay": -3.89, "mean_distance": 217.0, "change_mean_delay": -8.59}, {"destination": "IND", "date": 1, "number_of_flights": 58, "mean_delay": 4.69, "mean_distance": 574.14, "change_mean_delay": -0.05}, {"destination": "IND", "date": 3, "number_of_flights": 58, "mean_delay": 4.64, "mean_distance": 702.16, "change_mean_delay": -0.05}, {"destination": "ISP", "date": 1, "number_of_flights": 55, "mean_delay": 3.11, "mean_distance": 472.58, "change_mean_delay": 5.34}, {"destination": "ISP", "date": 3, "number_of_flights": 58, "mean_delay": 8.45, "mean_distance": 528.83, "change_mean_delay": 5.34}, {"destination": "JAN", "date": 1, "number_of_flights": 23, "mean_delay": 3.96, "mean_distance": 613.04, "change_mean_delay": -3.44}, {"destination": "JAN", "date": 3, "number_of_flights": 25, "mean_delay": 0.52, "mean_distance": 562.68, "change_mean_delay": -3.44}, {"destination": "JAX", "date": 1, "number_of_flights": 65, "mean_delay": 7.12, "mean_distance": 407.82, "change_mean_delay": 8.83}, {"destination": "JAX", "date": 3, "number_of_flights": 66, "mean_delay": 15.95, "mean_distance": 424.85, "change_mean_delay": 8.83}, {"destination": "LAS", "date": 1, "number_of_flights": 428, "mean_delay": 14.16, "mean_distance": 553.36, "change_mean_delay": -6.12}, {"destination": "LAS", "date": 3, "number_of_flights": 405, "mean_delay": 8.04, "mean_distance": 567.54, "change_mean_delay": -6.12}, {"destination": "LAX", "date": 1, "number_of_flights": 300, "mean_delay": 8.46, "mean_distance": 529.91, "change_mean_delay": -0.22}, {"destination": "LAX", "date": 3, "number_of_flights": 325, "mean_delay": 8.24, "mean_distance": 489.88, "change_mean_delay": -0.22}, {"destination": "LBB", "date": 1, "number_of_flights": 36, "mean_delay": 3.39, "mean_distance": 351.61, "change_mean_delay": 2.55}, {"destination": "LBB", "date": 3, "number_of_flights": 49, "mean_delay": 5.94, "mean_distance": 338.22, "change_mean_delay": 2.55}, {"destination": "LIT", "date": 1, "number_of_flights": 30, "mean_delay": 2.07, "mean_distance": 375.0, "change_mean_delay": -0.95}, {"destination": "LIT", "date": 3, "number_of_flights": 51, "mean_delay": 1.12, "mean_distance": 408.65, "change_mean_delay": -0.95}, {"destination": "MAF", "date": 1, "number_of_flights": 37, "mean_delay": 8.89, "mean_distance": 369.3, "change_mean_delay": -3.7}, {"destination": "MAF", "date": 3, "number_of_flights": 31, "mean_delay": 5.19, "mean_distance": 398.26, "change_mean_delay": -3.7}, {"destination": "MCI", "date": 1, "number_of_flights": 176, "mean_delay": 6.41, "mean_distance": 707.56, "change_mean_delay": -1.04}, {"destination": "MCI", "date": 3, "number_of_flights": 207, "mean_delay": 5.37, "mean_distance": 745.93, "change_mean_delay": -1.04}, {"destination": "MCO", "date": 1, "number_of_flights": 132, "mean_delay": 2.74, "mean_distance": 728.77, "change_mean_delay": 5.57}, {"destination": "MCO", "date": 3, "number_of_flights": 130, "mean_delay": 8.31, "mean_distance": 743.67, "change_mean_delay": 5.57}, {"destination": "MDW", "date": 1, "number_of_flights": 312, "mean_delay": 5.24, "mean_distance": 461.4, "change_mean_delay": 0.61}, {"destination": "MDW", "date": 3, "number_of_flights": 302, "mean_delay": 5.85, "mean_distance": 440.93, "change_mean_delay": 0.61}, {"destination": "MHT", "date": 1, "number_of_flights": 43, "mean_delay": 5.12, "mean_distance": 692.26, "change_mean_delay": 1.93}, {"destination": "MHT", "date": 3, "number_of_flights": 48, "mean_delay": 7.04, "mean_distance": 747.04, "change_mean_delay": 1.93}, {"destination": "MSY", "date": 1, "number_of_flights": 171, "mean_delay": 4.77, "mean_distance": 487.86, "change_mean_delay": 0.41}, {"destination": "MSY", "date": 3, "number_of_flights": 151, "mean_delay": 5.17, "mean_distance": 517.47, "change_mean_delay": 0.41}, {"destination": "OAK", "date": 1, "number_of_flights": 278, "mean_delay": 7.93, "mean_distance": 430.95, "change_mean_delay": -4.1}, {"destination": "OAK", "date": 3, "number_of_flights": 324, "mean_delay": 3.83, "mean_distance": 444.32, "change_mean_delay": -4.1}, {"destination": "OKC", "date": 1, "number_of_flights": 54, "mean_delay": 7.24, "mean_distance": 369.04, "change_mean_delay": -6.21}, {"destination": "OKC", "date": 3, "number_of_flights": 69, "mean_delay": 1.03, "mean_distance": 393.9, "change_mean_delay": -6.21}, {"destination": "OMA", "date": 1, "number_of_flights": 49, "mean_delay": 3.29, "mean_distance": 625.84, "change_mean_delay": 1.98}, {"destination": "OMA", "date": 3, "number_of_flights": 42, "mean_delay": 5.26, "mean_distance": 690.24, "change_mean_delay": 1.98}, {"destination": "ONT", "date": 1, "number_of_flights": 165, "mean_delay": 13.24, "mean_distance": 349.81, "change_mean_delay": -9.24}, {"destination": "ONT", "date": 3, "number_of_flights": 145, "mean_delay": 4.0, "mean_distance": 331.07, "change_mean_delay": -9.24}, {"destination": "PBI", "date": 1, "number_of_flights": 13, "mean_delay": 6.77, "mean_distance": 325.54, "change_mean_delay": -2.56}, {"destination": "PBI", "date": 3, "number_of_flights": 34, "mean_delay": 4.21, "mean_distance": 329.26, "change_mean_delay": -2.56}, {"destination": "PDX", "date": 1, "number_of_flights": 89, "mean_delay": 9.4, "mean_distance": 532.08, "change_mean_delay": -2.3}, {"destination": "PDX", "date": 3, "number_of_flights": 70, "mean_delay": 7.1, "mean_distance": 567.11, "change_mean_delay": -2.3}, {"destination": "PHX", "date": 1, "number_of_flights": 411, "mean_delay": 12.57, "mean_distance": 675.43, "change_mean_delay": -2.88}, {"destination": "PHX", "date": 3, "number_of_flights": 486, "mean_delay": 9.69, "mean_distance": 637.73, "change_mean_delay": -2.88}, {"destination": "PVD", "date": 1, "number_of_flights": 57, "mean_delay": 3.19, "mean_distance": 650.26, "change_mean_delay": -3.33}, {"destination": "PVD", "date": 3, "number_of_flights": 59, "mean_delay": -0.14, "mean_distance": 709.05, "change_mean_delay": -3.33}, {"destination": "RDU", "date": 1, "number_of_flights": 41, "mean_delay": 3.49, "mean_distance": 437.05, "change_mean_delay": 0.33}, {"destination": "RDU", "date": 3, "number_of_flights": 44, "mean_delay": 3.82, "mean_distance": 484.86, "change_mean_delay": 0.33}, {"destination": "RNO", "date": 1, "number_of_flights": 123, "mean_delay": 8.98, "mean_distance": 362.15, "change_mean_delay": -2.9}, {"destination": "RNO", "date": 3, "number_of_flights": 92, "mean_delay": 6.08, "mean_distance": 382.78, "change_mean_delay": -2.9}, {"destination": "SAN", "date": 1, "number_of_flights": 212, "mean_delay": 12.45, "mean_distance": 488.73, "change_mean_delay": -8.2}, {"destination": "SAN", "date": 3, "number_of_flights": 174, "mean_delay": 4.25, "mean_distance": 455.28, "change_mean_delay": -8.2}, {"destination": "SAT", "date": 1, "number_of_flights": 120, "mean_delay": 7.34, "mean_distance": 446.72, "change_mean_delay": 0.3}, {"destination": "SAT", "date": 3, "number_of_flights": 110, "mean_delay": 7.65, "mean_distance": 473.84, "change_mean_delay": 0.3}, {"destination": "SDF", "date": 1, "number_of_flights": 68, "mean_delay": 7.57, "mean_distance": 491.19, "change_mean_delay": -5.8}, {"destination": "SDF", "date": 3, "number_of_flights": 49, "mean_delay": 1.78, "mean_distance": 467.67, "change_mean_delay": -5.8}, {"destination": "SEA", "date": 1, "number_of_flights": 96, "mean_delay": 10.68, "mean_distance": 638.96, "change_mean_delay": 3.6}, {"destination": "SEA", "date": 3, "number_of_flights": 94, "mean_delay": 14.28, "mean_distance": 652.84, "change_mean_delay": 3.6}, {"destination": "SFO", "date": 1, "number_of_flights": 33, "mean_delay": 14.52, "mean_distance": 558.27, "change_mean_delay": 5.23}, {"destination": "SFO", "date": 3, "number_of_flights": 4, "mean_delay": 19.75, "mean_distance": 498.0, "change_mean_delay": 5.23}, {"destination": "SJC", "date": 1, "number_of_flights": 197, "mean_delay": 10.92, "mean_distance": 384.56, "change_mean_delay": -6.35}, {"destination": "SJC", "date": 3, "number_of_flights": 191, "mean_delay": 4.57, "mean_distance": 404.65, "change_mean_delay": -6.35}, {"destination": "SLC", "date": 1, "number_of_flights": 102, "mean_delay": 10.95, "mean_distance": 605.62, "change_mean_delay": -0.82}, {"destination": "SLC", "date": 3, "number_of_flights": 110, "mean_delay": 10.13, "mean_distance": 520.6, "change_mean_delay": -0.82}, {"destination": "SMF", "date": 1, "number_of_flights": 162, "mean_delay": 9.86, "mean_distance": 469.78, "change_mean_delay": -7.17}, {"destination": "SMF", "date": 3, "number_of_flights": 188, "mean_delay": 2.69, "mean_distance": 446.46, "change_mean_delay": -7.17}, {"destination": "SNA", "date": 1, "number_of_flights": 31, "mean_delay": 10.0, "mean_distance": 351.35, "change_mean_delay": -4.75}, {"destination": "SNA", "date": 3, "number_of_flights": 32, "mean_delay": 5.25, "mean_distance": 355.59, "change_mean_delay": -4.75}, {"destination": "STL", "date": 1, "number_of_flights": 199, "mean_delay": 5.77, "mean_distance": 478.18, "change_mean_delay": -1.5}, {"destination": "STL", "date": 3, "number_of_flights": 202, "mean_delay": 4.27, "mean_distance": 516.59, "change_mean_delay": -1.5}, {"destination": "TPA", "date": 1, "number_of_flights": 114, "mean_delay": 3.75, "mean_distance": 577.17, "change_mean_delay": 11.05}, {"destination": "TPA", "date": 3, "number_of_flights": 150, "mean_delay": 14.79, "mean_distance": 631.63, "change_mean_delay": 11.05}, {"destination": "TUL", "date": 1, "number_of_flights": 70, "mean_delay": 10.69, "mean_distance": 391.53, "change_mean_delay": -3.22}, {"destination": "TUL", "date": 3, "number_of_flights": 65, "mean_delay": 7.46, "mean_distance": 384.25, "change_mean_delay": -3.22}, {"destination": "TUS", "date": 1, "number_of_flights": 44, "mean_delay": 9.18, "mean_distance": 390.95, "change_mean_delay": -3.15}, {"destination": "TUS", "date": 3, "number_of_flights": 31, "mean_delay": 6.03, "mean_distance": 404.42, "change_mean_delay": -3.15}], "data-7a6321518d52277115683f06846bda0e": [{"destination": "TOTAL", "date": 1, "number_of_flights": 6784, "mean_delay": 8.24, "mean_distance": 500.39, "change_mean_delay": -1.44}, {"destination": "TOTAL", "date": 3, "number_of_flights": 6960, "mean_delay": 6.8, "mean_distance": 504.71, "change_mean_delay": -1.44}]}}, {"mode": "vega-lite"});
</script>
</div>
</div>
<p>In the example shown here, each comet represents one destination airport. The head of the comet corresponds to the most recent observation of the number of flight arrivals (x-axis, shown as logarithmic scale to accommodate the wide range of observations) against the mean delay of those flights (y-axis). The tail of the comet represents a similar (x,y) datum, but from an earlier point in time. Finally, the colour of the comet is encoded to show the change in the mean delay for each airport. A tooltip with a summary of the data is shown when hovering over the head of the comet.</p>
<p>So-called mix effects can often lead to misinterpretation of aggregate numbers. In the example of flight delays, the fact that only a small change is observed in the mean delay across all airports — visualized with the right-most comet outlined in black — hides the underlying variance between airports. Note that in this example the size of each sub-population (number of flights per airport) remains relatively constant, hence the comets here only go up and down. As explained in <a href="https://storage.googleapis.com/pub-tools-public-publication-data/pdf/42901.pdf">the original article</a>, mix effects become harder to interpret when the relative size of the sub-populations change as well as their relative values. In the most extreme case this may lead to <a href="https://en.wikipedia.org/wiki/Simpson%27s_paradox">Simpson’s paradox</a>.</p>
<p>With this base implementation of comet charts in Altair, you can really go to town and combine it with other interactive graphs. Using the <a href="https://altair-viz.github.io/gallery/scatter_with_layered_histogram.html">overview-detail</a> pattern, you could plot an accompanying density plot of all the flights for a given airport. That way you can quickly zoom in to the lowest level of detail and get a better understanding of the underlying mix effects.</p>



 ]]></description>
  <category>english</category>
  <category>visualization</category>
  <category>coding</category>
  <guid>https://kapitan.net/blog/comet-chart.html</guid>
  <pubDate>Fri, 29 Jan 2021 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/images/comet-chart.png" medium="image" type="image/png" height="117" width="144"/>
</item>
<item>
  <title>Een donorcodicil voor je data?</title>
  <dc:creator>Daniel Kapitan</dc:creator>
  <link>https://kapitan.net/blog/dutch-design-week.html</link>
  <description><![CDATA[ 




<p>Nieuwe handelingsperspectieven voor het gebruik, het beheer en de opslag van medische data: in de Waag Talk over datacommons tijdens Dutch Design Week gingen we in gesprek over het eigenaarschap van medische gegevens. Want die gegevens kunnen veel betekenen voor onderzoek en het stellen van diagnoses, maar ze zijn ook zeer persoonlijk. Hoe kun je het systeem zo inrichten dat mensen altijd zelf de eigenaar zijn van hun medisch dossier en hun medische gegevens, en dat ze zelf kunnen besluiten wanneer ze wat vrijgeven?</p>
<p>Paulien Melis spreekt in deze talk met Egge van der Poel, datawetenschapper bij Erasmus MC, Daniël Kapitan, datawetenschapper bij JADS, Manon Hillegers, psychiater bij Erasmus MC, en Socrates Schouten, hoofd van het Commons Lab bij Waag. Kijk de video terug of lees het verslag dat Hannah Grijns van de talk maakte hieronder.</p>
<div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/469720354?h=befc855b87&amp;autoplay=1&amp;title=0" style="position:absolute;top:0;left:0;width:100%;height:100%;" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe></div><script src="https://player.vimeo.com/api/player.js"></script>
<p><a href="https://vimeo.com/469720354">Waag Talks at DDW: Een donorcodicil voor je data?</a> from <a href="https://vimeo.com/waag">Waag Futurelab</a> on <a href="https://vimeo.com">Vimeo</a>.</p>
<section id="reflectie-een-donorcodicil-voor-je-data" class="level2">
<h2 class="anchored" data-anchor-id="reflectie-een-donorcodicil-voor-je-data">Reflectie: een donorcodicil voor je data?</h2>
<p>Op dinsdag 20 oktober vond de DDW-talk met het thema ‘Een donorcodicil voor je data?’ plaats. Het panel ging in gesprek over het gebruik van medische gegevens: hoe benutten we de kansen op dit gebied, terwijl we tegelijkertijd de privacy volgens de AVG-richtlijnen waarborgen?</p>
<p>De panelleden waren het erover eens: het is noodzakelijk om data binnen de zorg makkelijker te kunnen delen, zowel voor onderzoek als voor de praktijk. Het proces van triage aan het begin van een zorgtraject zou bijvoorbeeld versneld kunnen worden als er tussen verschillende partijen data kan worden gedeeld over de achtergrond van een patiënt. Op Europees niveau zijn binnen de Algemene verordening gegevensbescherming (AVG, oftewel GDPR) afspraken gemaakt over het verantwoord delen van data, wat dus ook invloed heeft op vrije data-uitwisseling in de zorg.</p>
<p>Tegelijkertijd zijn er problematische prikkels in het huidige onderzoekssysteem, waardoor (zorg-)instellingen elkaar beconcurreren op het gebied van kennisontwikkeling, in plaats van daarin samen te werken. De huidige COVID-pandemie maakt de urgentie van deelbare zorgdata alleen maar nog zichtbaarder: medische data waarop gestuurd zou moeten worden blijkt in de praktijk heel moeilijk vindbaar. Er moet dus een schaalbare manier gevonden worden voor in de toekomst: hoe kan zorgdata, en metadata over deze zorgdata, met het oog op de patiënt – dus vanuit publieke waarden – structureel en verantwoord worden ontsloten?</p>
<section id="eigenaarschap-over-data" class="level3">
<h3 class="anchored" data-anchor-id="eigenaarschap-over-data">Eigenaarschap over data</h3>
<p>Data en dataeigenaarschap zijn binnen Nederlandse wetgeving slechts in beperkte zin gedefinieerd. In de Uitvoeringswet AVG (UAVG) is het zelfbeschikkingsrecht van de burger ten opzichte van zijn data wél duidelijk opgenomen. Hier zit potentie: jouw persoonlijke gegevens mogen dus gebruikt worden door een partij, indien jij daar expliciet toestemming voor geeft. Momenteel gaat dat in de zorg via informed consent: van tevoren geeft de patiënt toestemming voor het gebruik van zijn data voor specifieke doeleinden. De AVG verplicht hierbij doelbinding, dus de data mag enkel voor het specifieke doel gebruikt worden waar vooraf toestemming voor is gegeven. Het is in die zin beperkend, en een zorginstelling moet telkens weer terug naar de patiënt om opnieuw toestemming te vragen mocht er iets veranderen binnen het onderzoek. We zouden eigenlijk toe willen naar een meer iteratief proces. Dit zou kunnen in de vorm van dynamisch informed consent: de patiënt stemt in met een groter aantal user cases (ook voor een veranderende context), krijgt daarbij feedback en kan zo constant inzien waarvoor zijn data gebruikt is.</p>
<p>Een stap verder hierin is het werken richting een datacodicil: een constructie vergelijkbaar met het donorcodicil, waarbij de patiënt standaard zijn zorgdata deelt tenzij hij expliciet aangeeft voor welke doeleinden hij dat niet wil – waarbij als randvoorwaarde geldt dat de data niet wordt verkocht aan commerciële partijen. Dit gebeurt al in Engeland: iedereen doneert volgens de wet data aan de National Health Service (NHS) voor zowel onderzoek als het verbeteren van zorg, waarbij altijd kan worden gekozen voor een ‘opt-out’. (In de praktijk kiest minder dan tien procent van de patiënten hiervoor.) De overheid zou in het geval van een datacodicil een cruciale rol spelen in het scheppen van de juiste kaders als voorwaarden aan een dergelijke datasamenleving, met dus als basis dat de data niet voor commerciële doeleinden mag worden gebruikt (zoals ook in het geval van het donorcodicil). Ook het juiste taalgebruik en voorlichting zijn hierbij van cruciaal belang: het moet precies helder zijn waarvoor de persoonlijke gegevens gebruikt gaan worden.</p>
<p>Datacommons kunnen hierbij een mogelijke rol spelen: data uit de zorg wordt publiek bezit en wordt voor collectief belang gebruikt. Het is essentieel om vanuit het belang van de patiënt te denken. Het delen van zorggegevens van een individu kan cruciaal zijn in onderzoek naar bepaalde aandoeningen en zo andere patiënten helpen, maar kan uiteindelijk ook de eigen toestand verbeteren. Het gaat dus om solidariteit voor anderen, maar ook om een intrinsieke waarde-motivatie om je data te delen.</p>
</section>
<section id="vertrouwensnetwerken" class="level3">
<h3 class="anchored" data-anchor-id="vertrouwensnetwerken">Vertrouwensnetwerken</h3>
<p>Het is echter als individu moeilijk in te schatten wat hierin handige keuzes zijn. Hoe kun je als burger vaststellen of je data wel voor legitieme en niet-commerciële belangen wordt gebruikt? Met een algemene ‘opt-in’ kun je wel weer heel weinig controle uitvoeren op de inzet van je data. Het is belangrijk dat je als gebruiker grip krijgt op de kringen waarin je data rondgaat. De sprekers waren het erover eens dat vertrouwen het centrale issue is op dit punt: met welke partijen kun je een zodanige relatie opbouwen dat je hen je data toevertrouwt? Een praktische denkrichting is om voort te bouwen op bestaande relaties binnen de zorg, zoals de vertrouwensrelatie die een patiënt met zijn huisarts heeft. De patiënt zou dan met de huisarts kunnen afspreken welke data aan welke partijen mag worden verstrekt voor welke doeleinden, waarbij de patiënt dan bijvoorbeeld een keer per jaar feedback krijgt en eventueel wordt gevraagd om aan weer nieuw onderzoek bij te dragen (dus in de vorm van dynamisch informed consent). Voor de technische uitvoering zouden universitaire ziekenhuizen in aanmerking kunnen komen als betrouwbare, en op (publiek) onderzoek gerichte instituten.</p>
<p>Commerciële marktpartijen zullen desalniettemin een rol blijven spelen in de zorg; ze zijn essentieel voor investeringen. We moeten dus naar een systeem toe waar overal recht aan wordt gedaan: zowel de privacy van gebruikers, als het belang van deelbare data én de noodzaak van investeringen door marktpartijen. Dit speelt bijvoorbeeld bij medische applicaties: er is sprake van een ‘mismatch’ tussen (gevalideerd) medisch onderzoek en het aanbod aan commerciële (non-gevalideerde) apps. Hierbij zou een mogelijkheid zijn het splitsen van de ontwikkelfase (van het algoritme) en de toepassing ervan in apps. Eerst wordt dus onderzoek gedaan met gevoelige data van patiënten, en als het algoritme eenmaal is ontwikkeld worden commerciële partijen betrokken om het in een applicatie vorm te geven. Voor deze eerste fase zien de panelleden potentie in het werken met het Centraal Bureau voor de Statistiek (CBS), immers de enige grootschalige databeheerder waar momenteel wél duidelijke regelgeving over is.</p>
<p>Ook is het relevant om te denken in verschillende schaalniveaus. Op landelijk niveau is de overheid dus van belang voor het scheppen van duidelijke kaders. Daarnaast kan het nuttig zijn om in netwerken te gaan denken: zowel op basis van regionale structuren als op basis van expertise-netwerken rondom één aandoening. Het eerste gebeurt bijvoorbeeld in Rotterdam: het Erasmus MC werkt daar samen met onder andere de gemeente en de GGZ om triage voor kinderen met een psychiatrische aandoening te versnellen. Bij het tweede zouden koepelorganisaties van specifieke aandoeningen een rol kunnen spelen, bijvoorbeeld door het datacodicil van haar patiëntenleden te beheren en op basis daarvan toestemming te geven voor gebruik. Vervolgens zouden daar hybride businessmodellen bij kunnen worden gebouwd.</p>
<p>Er is kortom enorm veel potentie om zorgdata op een nuttige, publiek wenselijke manier delen, maar het blijkt nog een uitdaging om in de praktijk in te richten. Het begint met een verandering van mindset: júist door data – vanuit een publiek, en niet commercieel oogpunt – te delen met andere organisaties kunnen grote stappen worden gezet, zowel in onderzoek als in verbetering van de zorg zelf. Dynamisch informed consent en een datacodicil bieden hierbij veelbelovende denkrichtingen. Het werken in (regionale en expertise-) netwerken, met een overheid die duidelijke kaders schept en marktpartijen die later in het proces pas aansluiten, kan zorgen voor het waarborgen van publieke waarden met de juiste vertrouwensbasis. Datacommons staan in de zorg nog in de kinderschoenen. Maar hopelijk kunnen we door de juiste samenwerking op korte termijn grote stappen zetten binnen een ongetwijfeld lang traject.</p>


</section>
</section>

 ]]></description>
  <category>nederlands</category>
  <category>data commons</category>
  <guid>https://kapitan.net/blog/dutch-design-week.html</guid>
  <pubDate>Sun, 18 Oct 2020 00:00:00 GMT</pubDate>
  <media:content url="https://kapitan.net/images/ddw19-health-embassy.jpg" medium="image" type="image/jpeg"/>
</item>
</channel>
</rss>
