diff --git a/asset-manifest.json b/asset-manifest.json index 0773d5b..efe941f 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,8 +1,8 @@ { "files": { "main.css": "./static/css/main.94b474a9.chunk.css", - "main.js": "./static/js/main.70be27a1.chunk.js", - "main.js.map": "./static/js/main.70be27a1.chunk.js.map", + "main.js": "./static/js/main.9e687484.chunk.js", + "main.js.map": "./static/js/main.9e687484.chunk.js.map", "runtime-main.js": "./static/js/runtime-main.1856da43.js", "runtime-main.js.map": "./static/js/runtime-main.1856da43.js.map", "static/css/2.bfcb563f.chunk.css": "./static/css/2.bfcb563f.chunk.css", @@ -33,6 +33,6 @@ "static/css/2.bfcb563f.chunk.css", "static/js/2.12c347e7.chunk.js", "static/css/main.94b474a9.chunk.css", - "static/js/main.70be27a1.chunk.js" + "static/js/main.9e687484.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index 1b6579a..cdb2694 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Topola Genealogy Viewer
\ No newline at end of file +Topola Genealogy Viewer
\ No newline at end of file diff --git a/static/js/main.70be27a1.chunk.js b/static/js/main.9e687484.chunk.js similarity index 99% rename from static/js/main.70be27a1.chunk.js rename to static/js/main.9e687484.chunk.js index fcee6b0..800d4be 100644 --- a/static/js/main.70be27a1.chunk.js +++ b/static/js/main.9e687484.chunk.js @@ -1,2 +1,2 @@ -(this["webpackJsonptopola-viewer"]=this["webpackJsonptopola-viewer"]||[]).push([[0],{265:function(e){e.exports=JSON.parse('{"menu.open":"Otev\u0159\xedt","menu.open_file":"Otev\u0159\xedt soubor","menu.load_from_url":"Otev\u0159\xedt z URL","menu.select_wikitree_id":"Vybrat WikiTree ID","menu.print":"Tiskni","menu.download":"St\xe1hnout","menu.pdf_file":"Soubor PDF","menu.png_file":"Soubor PNG","menu.svg_file":"Soubor SVG","menu.download_pdf":"St\xe1hnout PDF","menu.download_png":"St\xe1hnout PNG","menu.download_svg":"St\xe1hnout SVG","menu.view":"Zobrazen\xed","menu.hourglass":"P\u0159es\xfdpac\xed hodiny","menu.relatives":"V\u0161ichni p\u0159\xedbuzn\xed","menu.fancy":"Rodinn\xfd strom (experiment\xe1ln\xed)","menu.wikitree_login":"P\u0159ihl\xe1\u0161en\xed na WikiTree","menu.wikitree_logged_in":"P\u0159ihl\xe1\u0161eno","menu.wikitree_popup_username":"P\u0159ihl\xe1\u0161eno do WikiTree jako {username}","menu.wikitree_popup":"P\u0159ihl\xe1\u0161eno do WikiTree","menu.github":"GitHub projekt","menu.search.placeholder":"Hledej osobu","menu.search.no_results":"\u017d\xe1dn\xe9 v\xfdsledky","intro.title":"Topola Genealogy","intro.description":"Topola Genealogy v\xe1m umo\u017e\u0148uje interaktivn\xed prohl\xed\u017een\xed rodokmenu.","intro.instructions":"Kliknut\xedm na OTEV\u0158\xcdT SOUBOR nebo OTEV\u0158\xcdT Z URL na\u010dt\u011bte soubor GEDCOM. V\u011bt\u0161ina genealogick\xfdch program\u016f m\xe1 funkci exportu do form\xe1tu GEDCOM.","intro.examples":"N\xed\u017ee je uvedeno n\u011bkolik p\u0159\xedklad\u016f pou\u017eit\xed z internetu:","intro.from":"zdroj:","intro.privacy":"Soukrom\xed","intro.privacy_note":"Pomoc\xed funkce \\"Otev\u0159\xedt soubor\\" nejsou va\u0161e data nikam odes\xedl\xe1na a z\u016fst\xe1vaj\xed ve va\u0161em po\u010d\xedta\u010di. P\u0159i pou\u017eit\xed funkce \\"Otev\u0159\xedt z URL\\" jsou data z dan\xe9 adresy odesl\xe1na slu\u017ebou {link}, aby bylo mo\u017en\xe9 data na\u010d\xedst (CORS).","load_from_url.title":"Otev\u0159\xedt z adresy URL","load_from_url.comment":"Data z dan\xe9 adresy URL budou na\u010dteny prost\u0159ednictv\xedm slu\u017eby {link}, aby nedoch\xe1zelo k probl\xe9m\u016fm s CORS.","load_from_url.cancel":"Zru\u0161it","load_from_url.load":"Otev\u0159\xedt","select_wikitree_id.title":"Zadejte WikiTree ID","select_wikitree_id.comment":"Zadejte ID profilu {wikiTreeLink}. P\u0159\xedklad: {example1}, {example2}","select_wikitree_id.cancel":"Zru\u0161it","select_wikitree_id.load":"Otev\u0159\xedt","gedcom.BAPM":"K\u0159est","gedcom.BIRT":"Narozen\xed","gedcom.BURI":"Poh\u0159eb","gedcom.CENS":"S\u010d\xedt\xe1n\xed lidu","gedcom.CHR":"K\u0159est","gedcom.DEAT":"\xdamrt\xed","gedcom.DSCR":"Opis","gedcom.EDUC":"Vzd\u011bl\xe1n\xed","gedcom.EMAIL":"E-mail","gedcom.EVEN":"Ud\xe1lost","gedcom.FACT":"Skute\u010dnost","gedcom.MILT":"Vojensk\xe1 slu\u017eba","gedcom.OCCU":"Povol\xe1n\xed","gedcom.RIN":"ID","gedcom.TITL":"Titul","gedcom.WWW":"Str\xe1nka WWW","gedcom.RELI":"Vyzn\xe1n\xed","gedcom._UPD":"Posledn\xed aktualizace","gedcom.birth":"Rodinn\xe9 jm\xe9no","gedcom.married":"Man\u017eelsk\xe9 jm\xe9no","gedcom.maiden":"Jm\xe9no za svobodna","gedcom.aka":"Tak\xe9 zn\xe1m(a) jako","date.abt":"kolem","date.cal":"spo\u010dteno","date.est":"asi","date.between":"mezi {from} a {to}","date.after":"po {from}","date.before":"p\u0159ed {to}","error.error":"Chyba","error.failed_pdf":"Soubor PDF nelze vytvo\u0159it. Zkuste to znovu s men\u0161\xedm diagramem nebo st\xe1hn\u011bte soubor SVG.","error.failed_png":"Soubor PNG nelze vytvo\u0159it. Zkuste to znovu s men\u0161\xedm diagramem nebo st\xe1hn\u011bte soubor SVG.","error.failed_to_load_file":"Chyba p\u0159i na\u010d\xedt\xe1n\xed souboru","error.failed_wikitree_load_more":"Chyba p\u0159i na\u010d\xedt\xe1n\xed dat z WikiTree. {chyba}","error.GEDCOM_READ_FAILED":"Chyba p\u0159i na\u010d\xedt\xe1n\xed souboru GEDCOM","error.ERROR_LOADING_UPLOADED_FILE":"Chyba p\u0159i na\u010d\xedt\xe1n\xed dat. Znovu otev\u0159ete soubor.","error.WIKITREE_ID_NOT_PROVIDED":"WikiTree ID nebylo z\xedsk\xe1no","error.WIKITREE_PROFILE_NOT_ACCESSIBLE":"Profil WikiTree {id} nen\xed k dispozici","error.WIKITREE_PROFILE_NOT_FOUND":"Profil WikiTree {id} neexistuje","wikitree.private":"Soukrom\xe9"}')},266:function(e){e.exports=JSON.parse('{"menu.open":"\xd6ffnen","menu.open_file":"Datei \xf6ffnen","menu.load_from_url":"URL \xf6ffnen","menu.select_wikitree_id":"WikiTree ID ausw\xe4hlen","menu.print":"Print","menu.download":"Download","menu.pdf_file":"PDF-Datei","menu.png_file":"PNG-Datei","menu.svg_file":"SVG-Datei","menu.download_pdf":"PDF herunterladen","menu.download_png":"PNG herunterladen","menu.download_svg":"SVG herunterladen","menu.view":"View","menu.hourglass":"Sanduhrkarte","menu.relatives":"Alle Verwandten","menu.fancy":"Zierbaum (experimentell)","menu.wikitree_login":"Bei WikiTree anmelden","menu.wikitree_logged_in":"Eingeloggt","menu.wikitree_popup_username":"Bei WikiTree als {username} angemeldet","menu.wikitree_popup":"Bei WikiTree angemeldet","menu.github":"Projekt auf der GitHub-Website","menu.search.placeholder":"Person suchen","menu.search.no_results":"Keine Ergebnisse","intro.title":"Topola Genealogie","intro.description":"Mit der Topola Genealogie k\xf6nnen Sie den Stammbaum auf interaktive Weise durchsuchen.","intro.instructions":"Klicken Sie auf Datei \xf6ffnen oder URL \xf6ffnen, um eine GEDCOM-Datei zu laden. Die meisten Genealogie-Programme verf\xfcgen \xfcber eine GEDCOM-Exportfunktion.","intro.examples":"Nachfolgend einige Beispiele aus dem Internet:","intro.from":"source:","intro.privacy":"Datenschutz","intro.privacy_note":"Bei Verwendung der Funktion \\"Datei \xf6ffnen\\" werden Ihre Daten nirgendwo gesendet und verbleiben auf Ihrem Computer. Bei Verwendung der Funktion \\"URL \xf6ffnen\\" werden Daten von der angegebenen Adresse vom Dienst {link} an gesendet Erm\xf6glichen des Ladens von Daten aus einer anderen Dom\xe4ne (CORS).","load_from_url.title":"Von URL \xf6ffnen","load_from_url.comment":"Die Daten der angegebenen URL werden \xfcber den {link} -Dienst geladen, um CORS-Probleme zu vermeiden.","load_from_url.cancel":"Cancel","load_from_url.load":"\xd6ffnen","select_wikitree_id.title":"WikiTree ID eingeben","select_wikitree_id.comment":"Geben Sie die Profil-ID {wikiTreeLink} ein. Beispiele: {example1}, {example2}","select_wikitree_id.cancel":"Cancel","select_wikitree_id.load":"Open","gedcom.BAPM":"Taufe","gedcom.BIRT":"Geburt","gedcom.BURI":"Beerdigung","gedcom.CENS":"Volksz\xe4hlung","gedcom.CHR":"Taufe","gedcom.DEAT":"Tod","gedcom.DSCR":"Beschreibung","gedcom.EMAIL":"E-Mail","gedcom.EVEN":"Ereignis","gedcom.OCCU":"Beruf","gedcom.RIN":"ID","gedcom.TITL":"Titel","gedcom.WWW":"Website","gedcom._UPD":"Zuletzt aktualisiert","gedcom.birth":"Geburtsname","gedcom.married":"Ehenamen","gedcom.maiden":"M\xe4dchenname","gedcom.aka":"Auch bekannt als","date.abt":"about","date.cal":"berechnet","date.est":"gesch\xe4tzt","date.between":"zwischen {from} und {to}","date.after":"after {from}","date.before":"before {to}","error.error":"Error","error.failed_pdf":"PDF konnte nicht erstellt werden. Versuchen Sie es erneut mit einem kleineren Diagramm oder laden Sie die SVG-Datei herunter.","error.failed_png":"Fehler beim Erstellen der PNG-Datei. Versuchen Sie es erneut mit einem kleineren Diagramm oder laden Sie die SVG-Datei herunter.","error.failed_to_load_file":"Fehler beim Laden der Datei","error.failed_wikitree_load_more":"Fehler beim Abrufen der Daten aus WikiTree. {error}","wikitree.private":"Privat"}')},267:function(e){e.exports=JSON.parse('{"menu.open":"Ouvrir","menu.open_file":"Ouvrir le fichier","menu.load_from_url":"Ouvrir l\'URL","menu.select_wikitree_id":"S\xe9lectionnez l\'ID WikiTree","menu.print":"Imprimer","menu.download":"T\xe9l\xe9charger","menu.pdf_file":"Fichier PDF","menu.png_file":"Fichier PNG","menu.svg_file":"Fichier SVG","menu.download_pdf":"T\xe9l\xe9charger le PDF","menu.download_png":"T\xe9l\xe9charger PNG","menu.download_svg":"T\xe9l\xe9charger SVG","menu.view":"Afficher","menu.hourglass":"Graphique en sablier","menu.relatives":"Tous les parents","menu.fancy":"Arbre ornemental (exp\xe9rimental)","menu.wikitree_login":"Connectez-vous \xe0 WikiTree","menu.wikitree_logged_in":"Connect\xe9","menu.wikitree_popup_username":"Connect\xe9 \xe0 WikiTree en tant que {username}","menu.wikitree_popup":"Connect\xe9 \xe0 WikiTree","menu.github":"Projet sur le site Web GitHub","menu.search.placeholder":"Rechercher une personne","menu.search.no_results":"Aucun r\xe9sultat","intro.title":"Topola G\xe9n\xe9alogie","intro.description":"La Topola G\xe9n\xe9alogie vous permet de parcourir l\'arbre g\xe9n\xe9alogique de mani\xe8re interactive.","intro.instructions":"Cliquez sur OPEN FILE ou OPEN URL pour charger un fichier GEDCOM. La plupart des logiciels de g\xe9n\xe9alogie ont une fonction d\'exportation GEDCOM.","intro.examples":"Voici quelques exemples trouv\xe9s sur Internet:","intro.from":"source:","intro.whats_new":"Quoi de neuf","intro.full_changelog":"Voir toutes les modifications","intro.privacy":"Confidentialit\xe9","intro.privacy_note":"Lorsque vous utilisez la fonction \\"Ouvrir un fichier\\", vos donn\xe9es ne sont envoy\xe9es nulle part et restent sur votre ordinateur. Lorsque vous utilisez la fonction \\"Ouvrir l\'URL\\", les donn\xe9es de l\'adresse indiqu\xe9e sont envoy\xe9es par le service {link} pour permettre le chargement des donn\xe9es depuis un autre domaine (CORS).","load_from_url.title":"Ouvrir depuis l\'URL","load_from_url.comment":"Les donn\xe9es de l\'URL donn\xe9e seront charg\xe9es via le service {link} pour \xe9viter les probl\xe8mes CORS.","load_from_url.cancel":"Annuler","load_from_url.load":"Ouvrir","select_wikitree_id.title":"Entrez l\'ID de WikiTree","select_wikitree_id.comment":"Entrez l\'ID de profil {wikiTreeLink}. Exemples: {example1}, {example2}","select_wikitree_id.cancel":"Annuler","select_wikitree_id.load":"Ouvrir","gedcom.ADOP":"Adoption","gedcom.BAPM":"Bapt\xeame","gedcom.BIRT":"Naissance","gedcom.BURI":"Fun\xe9railles","gedcom.CENS":"Recensement","gedcom.CHR":"Bapt\xeame","gedcom.CREM":"Cr\xe9mation","gedcom.DEAT":"Mort","gedcom.DSCR":"Description","gedcom.EDUC":"\xc9tudes","gedcom.EMAIL":"E-mail","gedcom.EMIG":"\xc9migration","gedcom.EVEN":"\xc9v\xe9nement","gedcom.FACT":"Fait","gedcom.IMMI":"Immigration","gedcom.MILT":"Service militaire","gedcom.NATU":"Naturalisation","gedcom.OCCU":"Profession","gedcom.RIN":"ID","gedcom.TITL":"Titre","gedcom.WWW":"Site Web","gedcom._UPD":"Derni\xe8re mise \xe0 jour","gedcom.MARR":"Mariage","gedcom.DIV":"Divorce","gedcom.birth":"Nom de naissance","gedcom.married":"Nom marital","gedcom.maiden":"Nom de jeune fille","gedcom.immigrant":"Nom d\'immigrant","gedcom.aka":"Alias","date.abt":"environ","date.cal":"calcul\xe9","date.est":"estim\xe9","date.between":"entre {from} et {to}","date.after":"apr\xe8s {from}","date.before":"avant {to}","error.error":"Erreur","age.exact":"{qualifier}{age, plural, =0 {Moins d\'1 an} one {1 an} other {# ans}}","age.less":"Moins de {age, plural, =0 {1 an} one {1 an} other {# ans}}","age.more":"Plus de {age, plural, =0 {0 an} one {1 an} other {# ans}}","age.between":"Entre {ageFrom} et {ageTo, plural, =0 {0 an} one {1 an} other {# ans}}","error.failed_pdf":"\xc9chec de la cr\xe9ation du PDF. R\xe9essayez avec un diagramme plus petit ou t\xe9l\xe9chargez le fichier SVG.","error.failed_png":"Impossible de cr\xe9er le fichier PNG. R\xe9essayez avec un diagramme plus petit ou t\xe9l\xe9chargez le fichier SVG.","error.failed_to_load_file":"Erreur lors du chargement du fichier","error.failed_wikitree_load_more":"Erreur lors de l\'obtention des donn\xe9es de WikiTree. {error}","error.GEDCOM_READ_FAILED":"Erreur de lecture du fichier GEDCOM","error.ERROR_LOADING_UPLOADED_FILE":"Erreur de chargement des donn\xe9es. Renvoyez votre fichier.","error.WIKITREE_ID_NOT_PROVIDED":"L\'ID WikiTree est obligatoire","error.WIKITREE_PROFILE_NOT_ACCESSIBLE":"Le profil WikiTree ${id} n\'est pas accessible. Connectez-vous.","error.WIKITREE_PROFILE_NOT_FOUND":"Le profil WikiTree ${id} n\'a pas \xe9t\xe9 trouv\xe9","error.failed_to_load_image":"Erreur de chargement de l\'image","wikitree.private":"Priv\xe9","tab.info":"Info","tab.settings":"Param\xe8tres","config.colors":"Couleurs","config.colors.NO_COLOR":"aucune","config.colors.COLOR_BY_GENERATION":"par g\xe9n\xe9ration","config.colors.COLOR_BY_SEX":"par sexe","name.unknown_name":"?","whats_new.title":"Quoi de neuf dans cette version?"}')},268:function(e){e.exports=JSON.parse('{"menu.open":"Apri","menu.open_file":"Apri file","menu.load_from_url":"Apri URL","menu.select_wikitree_id":"Seleziona ID WikiTree","menu.print":"Stampa","menu.download":"Download","menu.pdf_file":"File PDF","menu.png_file":"File PNG","menu.svg_file":"File SVG","menu.download_pdf":"Scarica PDF","menu.download_png":"Scarica PNG","menu.download_svg":"Scarica SVG","menu.view":"Visualizza","menu.hourglass":"Grafico a clessidra","menu.relatives":"Tutti i parenti","menu.fancy":"Albero ornamentale (sperimentale)","menu.wikitree_login":"Accedi a WikiTree","menu.wikitree_logged_in":"Accesso effettuato","menu.wikitree_popup_username":"Accesso a WikiTree come {username}","menu.wikitree_popup":"Accesso a WikiTree","menu.github":"Progetto sul sito web GitHub","menu.search.placeholder":"Cerca persona","menu.search.no_results":"Nessun risultato","intro.title":"Topola Genealogy","intro.description":"Topola Genealogy ti consente di esplorare l\'albero genealogico in modo interattivo.","intro.instructions":"Fai clic su OPEN FILE o OPEN URL per caricare un file GEDCOM. La maggior parte dei software di genealogia ha una funzione di esportazione GEDCOM.","intro.examples":"Di seguito sono riportati alcuni esempi trovati su Internet:","intro.from":"source:","intro.privacy":"Privacy","intro.privacy_note":"Quando si utilizza la funzione \\"Apri file\\", i dati non vengono inviati da nessuna parte e rimangono sul computer. Quando si utilizza la funzione \\"Apri URL\\", i dati dall\'indirizzo specificato vengono inviati dal servizio {link} a consentire il caricamento dei dati da un altro dominio (CORS).","load_from_url.title":"Apri da URL","load_from_url.comment":"I dati dall\'URL specificato verranno caricati tramite il servizio {link} per evitare problemi CORS.","load_from_url.cancel":"Annulla","load_from_url.load":"Apri","select_wikitree_id.title":"Inserisci ID WikiTree","select_wikitree_id.comment":"Inserisci l\'ID profilo {wikiTreeLink}. Esempi: {example1}, {example2}","select_wikitree_id.cancel":"Annulla","select_wikitree_id.load":"Apri","gedcom.BAPM":"Battesimo","gedcom.BIRT":"Nascita","gedcom.BURI":"Funerale","gedcom.CENS":"Census","gedcom.CHR":"Battesimo","gedcom.DEAT":"Morte","gedcom.MARR":"Matrimonio","gedcom.DIV":"Divorzio","gedcom.DSCR":"Descrizione","gedcom.EMAIL":"E-mail","gedcom.EVEN":"Evento","gedcom.OCCU":"Professione","gedcom.RIN":"ID","gedcom.TITL":"Titolo","gedcom.WWW":"Sito web","gedcom._UPD":"Ultimo aggiornamento","gedcom.birth":"Nome alla nascita","gedcom.married":"Nome da coniugato/a","gedcom.maiden":"Nome da nubile","gedcom.aka":"Conosciuto anche come","date.abt":"circa","date.cal":"calcolato","date.est":"stimato","date.between":"tra il {from} e il {to}","date.after":"dopo il {from}","date.before":"prima del {to}","error.error":"Errore","error.failed_pdf":"Impossibile creare PDF. Riprova con un diagramma pi\xf9 piccolo o scarica il file SVG.","error.failed_png":"Impossibile creare il file PNG. Riprova con un diagramma pi\xf9 piccolo o scarica il file SVG.","error.failed_to_load_file":"Errore durante il caricamento del file","error.failed_wikitree_load_more":"Errore durante il recupero dei dati da WikiTree. {error}","wikitree.private":"Privato"}')},269:function(e){e.exports=JSON.parse('{"menu.open":"Otw\xf3rz","menu.open_file":"Otw\xf3rz plik","menu.load_from_url":"Otw\xf3rz URL","menu.select_wikitree_id":"Wybierz WikiTree ID","menu.print":"Drukuj","menu.download":"Pobierz","menu.pdf_file":"Plik PDF","menu.png_file":"Plik PNG","menu.svg_file":"Plik SVG","menu.download_pdf":"Pobierz PDF","menu.download_png":"Pobierz PNG","menu.download_svg":"Pobierz SVG","menu.view":"Widok","menu.hourglass":"Wykres klepsydrowy","menu.relatives":"Wszyscy krewni","menu.fancy":"Ozdobne drzewo (eksperymentalne)","menu.wikitree_login":"Zaloguj do WikiTree","menu.wikitree_logged_in":"Zalogowano","menu.wikitree_popup_username":"Zalogowano do WikiTree jako {username}","menu.wikitree_popup":"Zalogowano do WikiTree","menu.github":"Projekt na stronie GitHub","menu.search.placeholder":"Szukaj osoby","menu.search.no_results":"Brak wynik\xf3w","intro.title":"Topola Genealogy","intro.description":"Topola Genealogy pozwala przegl\u0105da\u0107 drzewo genealogiczne w interaktywny spos\xf3b.","intro.instructions":"Kliknij OTW\xd3RZ PLIK lub OTW\xd3RZ URL, aby za\u0142adowa\u0107 plik GEDCOM. Wi\u0119kszo\u015b\u0107 program\xf3w genealogicznych posiada funkcj\u0119 eksportu do pliku GEDCOM.","intro.examples":"Przyk\u0142ady","intro.from":"\u017ar\xf3d\u0142o:","intro.whats_new":"Co nowego?","intro.full_changelog":"Zobacz pe\u0142n\u0105 list\u0119 zmian","intro.privacy":"Prywatno\u015b\u0107","intro.privacy_note":"U\u017cywaj\u0105c funkcji \\"Otw\xf3rz plik\\", Twoje dane nie s\u0105 nigdzie wysy\u0142ane i pozostaj\u0105 na Twoim komputerze. U\u017cywaj\u0105c funkcji \\"Otw\xf3rz URL\\", dane z podanego adresu przesy\u0142ane s\u0105 przez us\u0142ug\u0119 {link} w celu umo\u017cliwienia za\u0142adowania danych z innej domeny (CORS).","load_from_url.title":"Otw\xf3rz z adresu URL","load_from_url.comment":"Dane z podanego adresu URL zostan\u0105 za\u0142adowane poprzez us\u0142ug\u0119 {link} w celu unikni\u0119cia problem\xf3w z CORS.","load_from_url.cancel":"Anuluj","load_from_url.load":"Otw\xf3rz","select_wikitree_id.title":"Podaj WikiTree ID","select_wikitree_id.comment":"Wpisz identyfikator profilu {wikiTreeLink}. Przyk\u0142ady: {example1}, {example2}","select_wikitree_id.cancel":"Anuluj","select_wikitree_id.load":"Otw\xf3rz","gedcom.BAPM":"Chrzest","gedcom.BIRT":"Narodziny","gedcom.BURI":"Pogrzeb","gedcom.CENS":"Spis ludno\u015bci","gedcom.CHR":"Chrzest","gedcom.DEAT":"\u015amier\u0107","gedcom.DSCR":"Opis","gedcom.EDUC":"Wykszta\u0142cenie","gedcom.EMAIL":"E-mail","gedcom.EVEN":"Wydarzenie","gedcom.FACT":"Fakt","gedcom.MILT":"S\u0142u\u017cba wojskowa","gedcom.OCCU":"Zaw\xf3d","gedcom.RIN":"ID","gedcom.TITL":"Tytu\u0142","gedcom.WWW":"Strona WWW","gedcom._UPD":"Ostatnia aktualizacja","gedcom.MARR":"Ma\u0142\u017ce\u0144stwo","gedcom.DIV":"Rozw\xf3d","gedcom.birth":"Nazwisko rodowe","gedcom.married":"Nazwisko po ma\u0142\u017ce\u0144stwie","gedcom.maiden":"Nazwisko panie\u0144skie","gedcom.immigrant":"Nazwisko po imigracji","gedcom.aka":"Alias","date.abt":"oko\u0142o","date.cal":"wyliczone","date.est":"oszacowane","date.between":"mi\u0119dzy {from} a {to}","date.after":"po {from}","date.before":"przed {to}","error.error":"B\u0142\u0105d","age.exact":"{age, plural, =0 {Mniej ni\u017c 1 rok} one {{qualifier} 1 rok} many {{qualifier} # lat} other {{qualifier} # lata}}","age.less":"Mniej ni\u017c {age, plural, =0 {1 rok} one {1 rok} many {# lat} other {# lata}}","age.more":"Wi\u0119cej ni\u017c {age, plural, =0 {0 lat} one {1 rok} many {# lat} other {# lata}}","age.between":"Mi\u0119dzy {ageFrom} a {ageTo, plural, =0 {0 lat} one {1 rok} many {# lat} other {# lata}}","error.failed_pdf":"Nie uda\u0142o si\u0119 utworzy\u0107 pliku PDF. Spr\xf3buj jeszcze raz z mniejszym diagramem lub pobierz plik SVG.","error.failed_png":"Nie uda\u0142o si\u0119 utworzy\u0107 pliku PNG. Spr\xf3buj jeszcze raz z mniejszym diagramem lub pobierz plik SVG.","error.failed_to_load_file":"B\u0142\u0105d wczytywania pliku","error.failed_wikitree_load_more":"B\u0142\u0105d podczas pobierania danych z WikiTree. {error}","error.GEDCOM_READ_FAILED":"B\u0142\u0105d wczytywania pliku GEDCOM","error.ERROR_LOADING_UPLOADED_FILE":"B\u0142\u0105d wczytywania danych. Otw\xf3rz ponownie plik.","error.WIKITREE_ID_NOT_PROVIDED":"Identyfikator WikiTree nie zosta\u0142 podany","error.WIKITREE_PROFILE_NOT_ACCESSIBLE":"Profil WikiTree {id} nie jest dost\u0119pny","error.WIKITREE_PROFILE_NOT_FOUND":"Profil WikiTree {id} nie istnieje","error.failed_to_load_image":"B\u0142\u0105d podczas pobierania pliku ze zdj\u0119ciem","wikitree.private":"Prywatne","tab.info":"Info","tab.settings":"Ustawienia","config.colors":"Kolory","config.colors.NO_COLOR":"brak","config.colors.COLOR_BY_GENERATION":"wed\u0142ug pokolenia","config.colors.COLOR_BY_SEX":"wed\u0142ug p\u0142ci","name.unknown_name":"N.N."}')},270:function(e){e.exports=JSON.parse('{"menu.open":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c","menu.open_file":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b","menu.load_from_url":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c URL","menu.select_wikitree_id":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 WikiTree ID","menu.print":"\u041f\u0435\u0447\u0430\u0442\u044c","menu.download":"\u0421\u043a\u0430\u0447\u0430\u0442\u044c","menu.pdf_file":"\u0424\u0430\u0439\u043b PDF","menu.png_file":"\u0424\u0430\u0439\u043b PNG","menu.svg_file":"\u0424\u0430\u0439\u043b SVG","menu.download_pdf":"\u0421\u043a\u0430\u0447\u0430\u0442\u044c PDF","menu.download_png":"\u0421\u043a\u0430\u0447\u0430\u0442\u044c PNG","menu.download_svg":"\u0421\u043a\u0430\u0447\u0430\u0442\u044c SVG","menu.view":"\u0412\u0438\u0434","menu.hourglass":"\u0413\u0440\u0430\u0444\u0438\u043a \u041f\u0435\u0441\u043e\u0447\u043d\u044b\u0435 \u0447\u0430\u0441\u044b","menu.relatives":"\u0412\u0441\u0435 \u0440\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\u0438","menu.fancy":"\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e (\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435))","menu.wikitree_login":"\u0412\u043e\u0439\u0442\u0438 \u0432 WikiTree","menu.wikitree_logged_in":"\u0412\u0445\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d","menu.wikitree_popup_username":"\u0412\u044b \u0432\u043e\u0448\u043b\u0438 \u0432 WikiTree \u043a\u0430\u043a {username}","menu.wikitree_popup":"\u0412\u044b \u0432\u043e\u0448\u043b\u0438 \u0432 WikiTree","menu.github":"\u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 GitHub","menu.search.placeholder":"\u0418\u0441\u043a\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430","menu.search.no_results":"\u041d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432","intro.title":"Topola Genealogy","intro.description":"Topola Genealogy \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0441\u0435\u043c\u0435\u0439\u043d\u043e\u0435 \u0434\u0440\u0435\u0432\u043e \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.","intro.instructions":"\u0429\u0435\u043b\u043a\u043d\u0438\u0442\u0435 \\"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b\\" \u0438\u043b\u0438 \\"\u041e\u0442\u043a\u0440\u044b\u0442\u044c URL\\", \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b GEDCOM. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0430\u043b\u043e\u0433\u0438\u0438 \u0438\u043c\u0435\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 GEDCOM.","intro.examples":"\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435:","intro.from":"\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a:","intro.privacy":"\u041a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c","intro.privacy_note":"\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \\"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b\\" \u0412\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0412\u0430\u0448\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435. \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \\"\u041e\u0442\u043a\u0440\u044b\u0442\u044c URL\\" \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0443\u0436\u0431\u043e\u0439 {link} \u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 (CORS).","load_from_url.title":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 URL","load_from_url.comment":"\u0414\u0430\u043d\u043d\u044b\u0435 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 URL \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u0441\u043b\u0443\u0436\u0431\u0443 {link}, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c CORS.","load_from_url.cancel":"\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c","load_from_url.load":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c","select_wikitree_id.title":"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 WikiTree","select_wikitree_id.comment":"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u043e\u0444\u0438\u043b\u044f {wikiTreeLink}. \u041f\u0440\u0438\u043c\u0435\u0440\u044b: {example1}, {example2}","select_wikitree_id.cancel":"\u041e\u0442\u043c\u0435\u043d\u0430","select_wikitree_id.load":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c","gedcom.ADOP":"\u0423\u0441\u044b\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435","gedcom.BAPM":"\u041a\u0440\u0435\u0449\u0435\u043d\u0438\u0435","gedcom.BIRT":"\u0420\u043e\u0436\u0434\u0435\u043d\u0438\u0435","gedcom.BURI":"\u041f\u043e\u0445\u043e\u0440\u043e\u043d\u044b","gedcom.CENS":"\u041f\u0435\u0440\u0435\u043f\u0438\u0441\u044c \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f","gedcom.CHR":"\u041a\u0440\u0435\u0449\u0435\u043d\u0438\u0435","gedcom.CREM":"\u041a\u0440\u0435\u043c\u0430\u0446\u0438\u044f","gedcom.DEAT":"\u0421\u043c\u0435\u0440\u0442\u044c","gedcom.DSCR":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","gedcom.EDUC":"\u041e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","gedcom.EMAIL":"E-mail","gedcom.EMIG":"\u042d\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f","gedcom.EVEN":"\u0421\u043e\u0431\u044b\u0442\u0438\u0435","gedcom.FACT":"\u0424\u0430\u043a\u0442","gedcom.IMMI":"\u0418\u043c\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f","gedcom.MILT":"\u0412\u043e\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430","gedcom.NATU":"\u041d\u0430\u0442\u0443\u0440\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f","gedcom.OCCU":"\u0412\u0438\u0434 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438","gedcom.RIN":"ID","gedcom.TITL":"\u0422\u0438\u0442\u0443\u043b","gedcom.WWW":"\u0412\u0435\u0431-\u0441\u0430\u0439\u0442 WWW","gedcom._UPD":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435","gedcom.birth":"\u0418\u043c\u044f \u043f\u0440\u0438 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u0438","gedcom.married":"\u0418\u043c\u044f \u0432 \u0431\u0440\u0430\u043a\u0435","gedcom.maiden":"\u0414\u0435\u0432\u0438\u0447\u044c\u044f \u0444\u0430\u043c\u0438\u043b\u0438\u044f","gedcom.aka":"\u041e\u043d(\u0430) \u0436\u0435","date.abt":"\u043e\u043a\u043e\u043b\u043e","date.cal":"\u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043e","date.est":"\u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e","date.between":"\u043c\u0435\u0436\u0434\u0443 {from} \u0438 {to}","date.after":"\u043f\u043e\u0441\u043b\u0435 {from}","date.before":"\u0434\u043e {to}","error.error":"\u041e\u0448\u0438\u0431\u043a\u0430","error.failed_pdf":"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c PDF-\u0444\u0430\u0439\u043b. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0441 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u0438\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0444\u0430\u0439\u043b SVG.","error.failed_png":"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b PNG. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0441 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0441\u0445\u0435\u043c\u043e\u0439 \u0438\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0444\u0430\u0439\u043b SVG.","error.failed_to_load_file":"\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u0430","error.failed_wikitree_load_more":"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 WikiTree. {error}}","wikitree.private":"\u0427\u0430\u0441\u0442\u043d\u044b\u0439"}')},343:function(e,t){},444:function(e,t,n){},447:function(e,t,n){"use strict";n.r(t);var a=n(0),r=n(91),i=n(265),o=n(266),c=n(267),s=n(268),l=n(269),u=n(270),d=n(10),m=n.n(d),f=n(20),g=n(12),p=n(31);function h(e,t){window.gtag("event",e,t)}var j,b=n(283),O=n(282),v=n(284),w=n(480),x=n(486),_=n(451),k=n(477),E=n(469),R=n(1),D="last_seen_version";function y(e,t){return I.apply(this,arguments)}function I(){return(I=Object(f.a)(m.a.mark((function e(t,n){var a,r,i,o;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=n?Date.parse(n.slice(0,10)):0,i=(null===(a='# Changelog\n\n## 2023-02-01\n\n- Added option to hide sex indicators (by Kent Grigo)\n- Empty family boxes are now not shown (by Kent Grigo)\n\n## 2023-01-08\n\n- Added option to hide profile identifiers by Kent Grigo\n\n## 2022-12-08\n\n- French translation updated by Olivier Berten\n\n## 2022-08-30\n\n- Added displaying name types in details panel\n\n## 2022-05-13\n\n- Added displaying images in the details panel\n\n## 2022-04-06\n\n- Fixed logging in to WikiTree\n\n## 2021-10-31\n\n- Show changelog in intro page and when an upgraded version is loaded\n\n## 2021-10-27\n\n- Show events in details panel for WikiTree profiles\n\n## 2021-10-26\n\n- Added family events to details panel\n- Improved details panel layout\n\n## 2021-10-25\n\n- Added "Settings" tab in side panel\n- Added color settings (none, by generation, by sex)')?void 0:a.split("##").slice(1,t+1).map((function(e){return{date:Date.parse(e.split("\n")[0].trim()),notes:"####"+e}})).filter((function(e){return e.date>r})).map((function(e){return e.notes})).join("\n"))||"",e.next=4,Object(k.a)().use(O.a).use(v.a).use(b.a).process(i);case 4:return o=e.sent,e.abrupt("return",String(o));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function T(){localStorage.setItem(D,"2023-05-01 00:33:33 +0200")}function N(){var e=Object(a.useState)(!1),t=Object(g.a)(e,2),n=t[0],r=t[1],i=Object(a.useState)(""),o=Object(g.a)(i,2),c=o[0],s=o[1];return Object(a.useEffect)((function(){Object(f.a)(m.a.mark((function e(){var t,n;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=localStorage.getItem(D),"2023-05-01 00:33:33 +0200",t&&"2023-05-01 00:33:33 +0200"!==t){e.next=4;break}return e.abrupt("return");case 4:return e.next=6,y(3,t);case 6:n=e.sent,s(n),r(!!n),T();case 10:case"end":return e.stop()}}),e)})))()})),Object(R.jsxs)(w.a,{open:n,centered:!1,children:[Object(R.jsx)(x.a,{children:Object(R.jsx)(E.a,{id:"whats_new.title",defaultMessage:"What's new in this version?"})}),Object(R.jsxs)(w.a.Content,{className:"limit-height",children:[Object(R.jsx)("span",{dangerouslySetInnerHTML:{__html:c}}),Object(R.jsx)("a",{href:"https://github.com/PeWu/topola-viewer/blob/master/CHANGELOG.md",children:Object(R.jsx)(E.a,{id:"intro.full_changelog",defaultMessage:"See full changelog"})})]}),Object(R.jsx)(w.a.Actions,{children:Object(R.jsx)(_.a,{primary:!0,onClick:function(){return r(!1)},children:"Close"})})]})}!function(e){e[e.UPLOADED=0]="UPLOADED",e[e.GEDCOM_URL=1]="GEDCOM_URL",e[e.WIKITREE=2]="WIKITREE",e[e.EMBEDDED=3]="EMBEDDED"}(j||(j={}));var M=n(24),C=n(152),S=n.n(C),L=n(219),A=n(21),P=n(54),z=n(55),W=n(107),G=function(e){Object(P.a)(n,e);var t=Object(z.a)(n);function n(e,a){var r,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return Object(A.a)(this,n),(r=t.call(this,a)).code=e,r.args=i,r}return n}(Object(W.a)(Error)),F=n(28),B=new Map([["abt","about"],["cal","calculated"],["est","estimated"]]);function U(e,t){var n=void 0!==e.day,a=void 0!==e.month,r=void 0!==e.year;if(!n&&!a&&!r)return e.text||"";var i=Z(e),o={day:n?"numeric":void 0,month:a?"long":void 0,year:r?"numeric":void 0};return[H(e.qualifier,t),new Intl.DateTimeFormat(t.locale,o).format(i)].join(" ")}function H(e,t){var n=e&&e.toLowerCase();return n&&t.formatMessage({id:"date.".concat(n),defaultMessage:B.get(n)||n})||""}function V(e,t){return e?e.date?U(e.date,t):e.dateRange?function(e,t){var n=e.from,a=e.to,r=n&&U(n,t),i=a&&U(a,t);return r&&i?t.formatMessage({id:"date.between",defaultMessage:"between {from} and {to}"},{from:r,to:i}):r?t.formatMessage({id:"date.after",defaultMessage:"after {from}"},{from:r}):i?t.formatMessage({id:"date.before",defaultMessage:"before {to}"},{to:i}):""}(e.dateRange,t):"":""}function Y(e,t){return e&&e.year&&t&&t.year?e.year!==t.year?e.year-t.year:e.month&&t.month&&(e.month!==t.month||e.day&&t.day&&e.day!==t.day)?e.month-t.month:0:0}function q(e,t){return Y(e&&(e.date||e.dateRange&&(e.dateRange.from||e.dateRange.to)),t&&(t.date||t.dateRange&&(t.dateRange.from||t.dateRange.to)))}function K(e){var t,n,a,r;return J(null===e||void 0===e?void 0:e.dateRange)?Y(null===e||void 0===e||null===(a=e.dateRange)||void 0===a?void 0:a.from,null===e||void 0===e||null===(r=e.dateRange)||void 0===r?void 0:r.to)<=0:!!((null===e||void 0===e?void 0:e.date)||(null===e||void 0===e||null===(t=e.dateRange)||void 0===t?void 0:t.from)||(null===e||void 0===e||null===(n=e.dateRange)||void 0===n?void 0:n.to))}function J(e){return!(!(null===e||void 0===e?void 0:e.from)||!(null===e||void 0===e?void 0:e.to))}function Z(e){return new Date(void 0!==e.year?e.year:0,void 0!==e.month?e.month-1:0,void 0!==e.day?e.day:1)}function X(e){return e.substring(1,e.length-1)}function Q(e){var t=new Map;return e.indis.forEach((function(e){t.set(e.id,e)})),t}function $(e){var t=new Map;return e.fams.forEach((function(e){t.set(e.id,e)})),t}function ee(e){var t=e.find((function(e){return"HEAD"===e.tag})),n={},a={},r={};return e.forEach((function(e){"INDI"===e.tag?n[X(e.pointer)]=e:"FAM"===e.tag?a[X(e.pointer)]=e:e.pointer&&(r[X(e.pointer)]=e)})),{head:t,indis:n,fams:a,other:r}}function te(e,t){return et?1:0}function ne(e){var t=function(e){var t=Q(e);return function(e,n){var a=t.get(e),r=t.get(n);return q(a&&a.birth,r&&r.birth)||te(e,n)}}(e),n=e.fams.map((function(e){return function(e,t){if(!e.children)return e;var n=e.children.sort(t);return Object.assign({},e,{children:n})}(e,t)}));return Object.assign({},e,{fams:n})}function ae(e){var t=function(e){var t=$(e);return function(e,n){var a=t.get(e),r=t.get(n);return q(a&&a.marriage,r&&r.marriage)||te(e,n)}}(e),n=e.indis.map((function(e){return function(e,t){if(!e.fams)return e;var n=e.fams.sort(t);return Object.assign({},e,{fams:n})}(e,t)}));return Object.assign({},e,{indis:n})}function re(e,t,n){if(e.data){var a=n(t)[X(e.data)];if(a)return a}return e}function ie(e){var t=[e.data];return e.tree.forEach((function(e){if("CONC"===e.tag&&e.data){var n=t.length-1;t[n]+=e.data}else"CONT"===e.tag&&e.data&&t.push(e.data)})),t}function oe(e){return ae(ne(e))}var ce=[".jpg",".jpeg",".png",".gif"];function se(e){var t=e.toLowerCase();return ce.some((function(e){return t.endsWith(e)}))}function le(e,t){var n=e.indis.map((function(e){return function(e,t){if(!e.images||0===e.images.length)return e;var n=[];return e.images.forEach((function(e){var a=e.url.match(/[^/\\]*$/)[0];t.has(a)?n.push({url:t.get(a),title:e.title}):e.url.startsWith("http")&&se(e.url)&&n.push(e)})),Object.assign({},e,{images:n})}(e,t)}));return Object.assign({},e,{indis:n})}function ue(e){var t=e&&e.tree&&e.tree.find((function(e){return"SOUR"===e.tag})),n=t&&t.tree&&t.tree.find((function(e){return"NAME"===e.tag}));return n&&n.data||null}function de(e){var t,n,a=null===e||void 0===e||null===(t=e.tree.find((function(e){return"TITL"===e.tag})))||void 0===t?void 0:t.data,r=null===e||void 0===e||null===(n=e.tree.find((function(e){return"FORM"===e.tag})))||void 0===n?void 0:n.data;return a&&r&&a+"."+r}function me(e,t,n){var a=he(e,t);return n.formatMessage({id:"age.more",defaultMessage:"More than {age, plural, =0 {0 years} one {1 year} other {# years}}"},{age:a})}function fe(e,t,n){var a=he(e,t);return n.formatMessage({id:"age.less",defaultMessage:"Less than {age, plural, =0 {1 year} one {1 year} other {# years}}"},{age:a})}function ge(e,t,n,a,r){var i=he(t,n),o=he(e,a);return r.formatMessage({id:"age.between",defaultMessage:"Between {ageFrom} and {ageTo, plural, =0 {0 years} one {1 year} other {# years}}"},{ageFrom:i,ageTo:o})}function pe(e,t){return!(!e||!t)&&(!(!K(e)||!K(t))&&(!(q(e,t)>0)&&(!(e.dateRange&&t.dateRange&&J(null===e||void 0===e?void 0:e.dateRange)&&J(null===t||void 0===t?void 0:t.dateRange))||(n=e.dateRange,a=t.dateRange,!(Y(n.from,a.to)<=0&&Y(n.to,a.from)>=0)))));var n,a}function he(e,t){var n=Z(e),a=Z(t),r=n.getUTCFullYear(),i=a.getUTCFullYear()-r,o=a.getUTCMonth()-n.getUTCMonth();return o<0&&(i--,o+=12),a.getUTCDate()-n.getUTCDate()<0&&o<=0&&i--,Math.abs(i)}function je(e,t,n){if(e&&t){var a=Object(F.getDate)(e),r=Object(F.getDate)(t);if(pe(a,r)){var i,o,c,s;if(null===a||void 0===a?void 0:a.date){var l,u,d,m,f,g,p,h;if(null===r||void 0===r?void 0:r.date)return function(e,t,n){var a=he(e,t),r=e.qualifier||t.qualifier,i=r&&H(r,n)+" ";return n.formatMessage({id:"age.exact",defaultMessage:"{qualifier}{age, plural, =0 {Less than 1 year} one {1 year} other {# years}}"},{age:a,qualifier:i})}(a.date,r.date,n);if((null===r||void 0===r||null===(l=r.dateRange)||void 0===l?void 0:l.from)&&(null===(u=r.dateRange)||void 0===u?void 0:u.to))return ge(a.date,a.date,null===r||void 0===r||null===(f=r.dateRange)||void 0===f?void 0:f.from,null===r||void 0===r||null===(g=r.dateRange)||void 0===g?void 0:g.to,n);if(null===r||void 0===r||null===(d=r.dateRange)||void 0===d?void 0:d.from)return me(a.date,null===(p=r.dateRange)||void 0===p?void 0:p.from,n);if(null===r||void 0===r||null===(m=r.dateRange)||void 0===m?void 0:m.to)return fe(a.date,null===(h=r.dateRange)||void 0===h?void 0:h.to,n)}if((null===a||void 0===a||null===(i=a.dateRange)||void 0===i?void 0:i.from)&&(null===a||void 0===a||null===(o=a.dateRange)||void 0===o?void 0:o.to)){var j,b,O,v,w,x,_,k,E,R,D,y,I,T;if(null===r||void 0===r?void 0:r.date)return ge(null===a||void 0===a||null===(w=a.dateRange)||void 0===w?void 0:w.from,null===a||void 0===a||null===(x=a.dateRange)||void 0===x?void 0:x.to,null===r||void 0===r?void 0:r.date,null===r||void 0===r?void 0:r.date,n);if((null===r||void 0===r||null===(j=r.dateRange)||void 0===j?void 0:j.from)&&(null===(b=r.dateRange)||void 0===b?void 0:b.to))return ge(null===a||void 0===a||null===(_=a.dateRange)||void 0===_?void 0:_.from,null===a||void 0===a||null===(k=a.dateRange)||void 0===k?void 0:k.to,null===r||void 0===r||null===(E=r.dateRange)||void 0===E?void 0:E.from,null===r||void 0===r||null===(R=r.dateRange)||void 0===R?void 0:R.to,n);if(null===r||void 0===r||null===(O=r.dateRange)||void 0===O?void 0:O.from)return me(null===(D=a.dateRange)||void 0===D?void 0:D.to,null===(y=r.dateRange)||void 0===y?void 0:y.from,n);if(null===r||void 0===r||null===(v=r.dateRange)||void 0===v?void 0:v.to)return fe(null===(I=a.dateRange)||void 0===I?void 0:I.from,null===(T=r.dateRange)||void 0===T?void 0:T.to,n)}if(null===a||void 0===a||null===(c=a.dateRange)||void 0===c?void 0:c.from){var N,M,C,S;if(null===r||void 0===r?void 0:r.date)return fe(null===(M=a.dateRange)||void 0===M?void 0:M.from,r.date,n);if(null===r||void 0===r||null===(N=r.dateRange)||void 0===N?void 0:N.to)return fe(null===(C=a.dateRange)||void 0===C?void 0:C.from,null===(S=r.dateRange)||void 0===S?void 0:S.to,n)}if(null===a||void 0===a||null===(s=a.dateRange)||void 0===s?void 0:s.to){var L,A,P,z;if(null===r||void 0===r?void 0:r.date)return me(null===a||void 0===a||null===(A=a.dateRange)||void 0===A?void 0:A.to,r.date,n);if(null===r||void 0===r||null===(L=r.dateRange)||void 0===L?void 0:L.from)return me(null===a||void 0===a||null===(P=a.dateRange)||void 0===P?void 0:P.to,null===(z=r.dateRange)||void 0===z?void 0:z.from,n)}}}}var be=n(274),Oe=n(19),ve=n(65),we=n(276),xe=n.n(we);function _e(e){return Object(R.jsx)(R.Fragment,{children:e.lines.map((function(e,t){return Object(R.jsxs)("div",{children:[Object(R.jsx)(xe.a,{properties:{target:"_blank"},children:e}),Object(R.jsx)("br",{})]},t)}))})}var ke=new Map([["ADOP","Adoption"],["BAPM","Baptism"],["BIRT","Birth"],["BURI","Burial"],["CENS","Census"],["CHR","Christening"],["CREM","Cremation"],["DEAT","Death"],["EDUC","Education"],["EMAIL","E-mail"],["EMIG","Emigration"],["EVEN","Event"],["FACT","Fact"],["IMMI","Immigration"],["MARR","Marriage"],["DIV","Divorce"],["MILT","Military services"],["NATU","Naturalization"],["OCCU","Occupation"],["TITL","Title"],["WWW","WWW"],["birth","Birth name"],["married","Married name"],["maiden","Maiden name"],["immigrant","Immigrant name"],["aka","Also known as"]]);function Ee(e){var t=e.tag.replace(/_/g,"");return Object(R.jsx)(E.a,{id:"gedcom.".concat(t),defaultMessage:ke.get(t)||t})}var Re=n(479);function De(e){var t=Object(Oe.h)(),n=function(e){var t=e.tree.filter((function(e){return"NAME"===e.tag})),n=t.find((function(e){return 0===e.tree.filter((function(e){return"TYPE"===e.tag&&"married"===e.data})).length}))||t[0];return null===n||void 0===n?void 0:n.data.replace(/\//g,"")}(e.person),a=p.parse(t.search);return a.indi=X(e.person.pointer),Object(R.jsx)(Re.a.Meta,{children:Object(R.jsx)(ve.b,{to:{pathname:"/view",search:p.stringify(a)},children:n||Object(R.jsx)(E.a,{id:"name.unknown_name",defaultMessage:"N.N."})})})}var ye=["BIRT","BAPM","CHR","FAMS","EVEN","CENS","DEAT","BURI"],Ie=["MARR","DIV"];function Te(e){var t=Object(be.a)();return Object(R.jsxs)("div",{className:"event-header",children:[Object(R.jsx)(x.a,{as:"span",size:"small",children:Object(R.jsx)(Ee,{tag:e.event.type})}),e.event.date?Object(R.jsx)(x.a,{as:"span",textAlign:"right",sub:!0,children:V(e.event.date,t)}):null]})}function Ne(e,t,n){var a=t.tree.filter((function(e){return["WIFE","HUSB"].includes(e.tag)})).find((function(t){return!t.data.includes(e)}));if(a)return re(a,n,(function(e){return e.indis}))}function Me(e,t,n,a){if("DEAT"===e.tag){var r=Ae(e),i=n.indis[t].tree.filter((function(e){return"BIRT"===e.tag})).map((function(e){return Ae(e)})).find((function(e){return e}));if(i&&r)return je(null===i||void 0===i?void 0:i.data,null===r||void 0===r?void 0:r.data,a)}}function Ce(e){var t=e.tree.find((function(e){return"PLAC"===e.tag}));return(null===t||void 0===t?void 0:t.data)?ie(t):void 0}function Se(e,t){return e.tree.filter((function(e){return["NOTE","TYPE"].includes(e.tag)})).map((function(e){return re(e,t,(function(e){return e.other}))})).map((function(e){return ie(e)}))}function Le(e,t,n,a){return"FAMS"===e.tag?function(e,t,n){var a=re(e,t,(function(e){return e.fams}));return S()(Ie,(function(e){return a.tree.filter((function(t){return t.tag===e}))})).map((function(e){var r=Ae(e)||null;return{date:r?Object(F.getDate)(r.data):void 0,type:e.tag,personLink:Ne(n,a,t),place:Ce(e),notes:Se(e,t)}}))}(e,t,n):function(e,t,n,a){var r=Ae(e)||null;return[{date:r?Object(F.getDate)(r.data):void 0,type:e.tag,age:Me(e,n,t,a),place:Ce(e),notes:Se(e,t)}]}(e,t,n,a)}function Ae(e){return e.tree.find((function(e){return"DATE"===e.tag}))}function Pe(e){return Object(R.jsx)(Re.a,{children:Object(R.jsxs)(Re.a.Content,{children:[Object(R.jsx)(Te,{event:e.event}),!!e.event.age&&Object(R.jsx)(Re.a.Meta,{children:e.event.age}),!!e.event.personLink&&Object(R.jsx)(De,{person:e.event.personLink}),!!e.event.place&&Object(R.jsx)(Re.a.Description,{children:e.event.place}),!!e.event.notes.length&&Object(R.jsx)(Re.a.Description,{children:e.event.notes.map((function(e,t){return Object(R.jsx)("div",{children:Object(R.jsx)(_e,{lines:e.map((function(e,t){return Object(R.jsx)("i",{children:e},t)}))})},t)}))})]})})}function ze(e){var t=Object(be.a)(),n=S()(ye,(function(n){return e.entries.filter((function(e){return e.tag===n})).map((function(n){return Le(n,e.gedcom,e.indi,t)})).flatMap((function(e){return e})).sort((function(e,t){return q(e.date,t.date)}))}));return n.length?Object(R.jsx)(R.Fragment,{children:n.map((function(e,t){return Object(R.jsx)(Pe,{event:e},t)}))}):null}var We=n(286),Ge=n(482),Fe=n(471),Be=n(483),Ue=n(111),He=n(154);function Ve(e){var t=Object(a.useState)(!1),n=Object(g.a)(t,2),r=n[0],i=n[1],o=Object(a.useState)(!1),c=Object(g.a)(o,2),s=c[0],l=c[1],u=Object(a.useState)(!1),d=Object(g.a)(u,2),m=d[0],f=d[1],p=Object(a.useState)(""),h=Object(g.a)(p,2),j=h[0],b=h[1];return s&&j!==e.url&&l(!1),Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(We.a,{className:s?"loaded-image-thumbnail":"hidden-image",onClick:function(){return i(!0)},onLoad:function(){l(!0),b(e.url),f(!1)},onError:function(t){l(!0),b(e.url),f(!0),t.currentTarget.alt=""},src:e.url,alt:e.title||e.filename,centered:!0}),Object(R.jsx)(Ge.a,{className:s?"hidden-image":"image-placeholder",children:Object(R.jsx)(Ge.a.Image,{square:!0})}),m&&Object(R.jsx)(Fe.a,{fluid:!0,textAlign:"center",children:Object(R.jsx)(Be.a,{negative:!0,compact:!0,children:Object(R.jsx)(Be.a.Header,{children:Object(R.jsx)(E.a,{id:"error.failed_to_load_image",defaultMessage:"Failed to load image file"})})})}),Object(R.jsxs)(w.a,{basic:!0,size:"large",closeIcon:Object(R.jsx)(Ue.a,{name:"close",color:"red"}),open:r,onClose:function(){return i(!1)},onOpen:function(){return i(!0)},centered:!1,children:[Object(R.jsx)(w.a.Header,{children:e.title}),Object(R.jsx)(w.a.Content,{image:!0,children:Object(R.jsx)(We.a,{className:"modal-image",src:e.url,alt:e.title||e.filename,label:Object(R.jsx)(He.a,{attached:"bottom",content:e.filename}),wrapped:!0})})]})]})}var Ye=["BIRT","BAPM","CHR","EVEN","CENS","DEAT","BURI","NAME","SEX","FAMC","FAMS","NOTE","SOUR"];function qe(e){var t=e.tree.find((function(e){return"FILE"===e.tag&&e.data.startsWith("http")&&se(e.data)}));return t?Object(R.jsx)("div",{className:"person-image",children:Object(R.jsx)(Ve,{url:t.data,filename:de(t)||""})}):null}function Ke(e){return Object(R.jsx)(_e,{lines:ie(e).map((function(e,t){return Object(R.jsx)("i",{children:e},t)}))})}function Je(e){var t,n=e.data.replaceAll("/",""),a=null===(t=e.tree.find((function(e){return"TYPE"===e.tag&&"Unknown"!==e.data})))||void 0===t?void 0:t.data;return Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(x.a,{as:"span",size:"large",children:n||Object(R.jsx)(E.a,{id:"name.unknown_name",defaultMessage:"N.N."})}),n&&a&&Object(R.jsx)(Re.a.Meta,{children:Object(R.jsx)(Ee,{tag:a})})]})}function Ze(e,t,n){return S()(t,(function(t){return e.filter((function(e){return e.tag===t})).map((function(e){return n(e)}))})).filter((function(e){return null!==e})).map((function(e,t){return Object(R.jsx)(Re.a,{children:Object(R.jsx)(Re.a.Content,{children:e})},t)}))}function Xe(e){return e.tree.length>0||e.data&&!e.data.startsWith("@")}function Qe(e){return e.filter((function(e){return!Ye.includes(e.tag)})).filter(Xe).map((function(e){return function(e){var t=[];return e.data&&t.push.apply(t,Object(M.a)(ie(e))),e.tree.filter((function(e){return"NOTE"===e.tag})).forEach((function(e){return ie(e).forEach((function(e){return t.push(Object(R.jsx)("i",{children:e}))}))})),t.length?Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(x.a,{sub:!0,children:Object(R.jsx)(Ee,{tag:e.tag})}),Object(R.jsx)("span",{children:Object(R.jsx)(_e,{lines:t})})]}):null}(e)})).filter((function(e){return null!==e})).map((function(e,t){return Object(R.jsx)(Re.a,{children:Object(R.jsx)(Re.a.Content,{children:e})},t)}))}function $e(e){var t=e.gedcom.indis[e.indi].tree,n=t.map((function(t){return re(t,e.gedcom,(function(e){return e.other}))})).filter(Xe);return Object(R.jsx)("div",{className:"details",children:Object(R.jsxs)(Re.a.Group,{divided:!0,children:[Ze(t,["NAME"],Je),Ze(n,["OBJE"],qe),Object(R.jsx)(ze,{gedcom:e.gedcom,entries:t,indi:e.indi}),Qe(n),Ze(n,["NOTE"],Ke)]})})}var et=n(29);function tt(e,t){return{id:t&&e.indis.some((function(e){return e.id===t.id}))?t.id:e.indis[0].id,generation:(null===t||void 0===t?void 0:t.generation)||0}}function nt(e,t,n){var a=function(e,t){var n=Object(L.parse)(e),a=Object(F.gedcomEntriesToJson)(n);if(!a||!a.indis||!a.indis.length||!a.fams||!a.fams.length)throw new G("GEDCOM_READ_FAILED","Failed to read GEDCOM file");return{chartData:le(oe(a),t),gedcom:ee(n)}}(e,n||new Map),r=JSON.stringify(a);try{sessionStorage.setItem(t,r)}catch(i){console.warn("Failed to store data in session storage: "+i)}return a}function at(e,t){return rt.apply(this,arguments)}function rt(){return(rt=Object(f.a)(m.a.mark((function e(t,n){var a,r,i,o,c,s;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,!(a=sessionStorage.getItem(t))){e.next=4;break}return e.abrupt("return",JSON.parse(a));case 4:e.next=9;break;case 6:e.prev=6,e.t0=e.catch(0),console.warn("Failed to load data from session storage: "+e.t0);case 9:return(r=t.match(/https:\/\/drive\.google\.com\/file\/d\/(.*)\/.*/))&&(t="https://drive.google.com/uc?id=".concat(r[1],"&export=download")),(i=t.match(/https:\/\/drive\.google\.com\/open\?id=([^&]*)&?.*/))&&(t="https://drive.google.com/uc?id=".concat(i[1],"&export=download")),o=n?"https://topola-cors-server.up.railway.app/"+t:t,e.next=16,window.fetch(o);case 16:if(200===(c=e.sent).status){e.next=19;break}throw new Error(c.statusText);case 19:return e.next=21,c.text();case 21:return s=e.sent,e.abrupt("return",nt(s,t));case 23:case"end":return e.stop()}}),e,null,[[0,6]])})))).apply(this,arguments)}function it(e,t,n){return ot.apply(this,arguments)}function ot(){return(ot=Object(f.a)(m.a.mark((function e(t,n,a){var r;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,!(r=sessionStorage.getItem(t))){e.next=4;break}return e.abrupt("return",JSON.parse(r));case 4:e.next=9;break;case 6:e.prev=6,e.t0=e.catch(0),console.warn("Failed to load data from session storage: "+e.t0);case 9:if(n){e.next=11;break}throw new G("ERROR_LOADING_UPLOADED_FILE","Error loading data. Please upload your file again.");case 11:return e.abrupt("return",nt(n,t,a));case 12:case"end":return e.stop()}}),e,null,[[0,6]])})))).apply(this,arguments)}var ct,st=function(){function e(){Object(A.a)(this,e)}return Object(et.a)(e,[{key:"isNewData",value:function(e,t,n){return e.spec.hash!==t.spec.hash}},{key:"loadData",value:function(){var e=Object(f.a)(m.a.mark((function e(t){var n;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,it(t.spec.hash,t.spec.gedcom,t.spec.images);case 3:return n=e.sent,h("upload_file_loaded",{event_label:ue(n.gedcom.head),event_value:t.spec.images&&t.spec.images.size||0}),e.abrupt("return",n);case 9:throw e.prev=9,e.t0=e.catch(0),h("upload_file_error"),e.t0;case 13:case"end":return e.stop()}}),e,null,[[0,9]])})));return function(t){return e.apply(this,arguments)}}()}]),e}(),lt=function(){function e(){Object(A.a)(this,e)}return Object(et.a)(e,[{key:"isNewData",value:function(e,t,n){return e.spec.url!==t.spec.url}},{key:"loadData",value:function(){var e=Object(f.a)(m.a.mark((function e(t){var n;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,at(t.spec.url,t.spec.handleCors);case 3:return n=e.sent,h("upload_file_loaded",{event_label:ue(n.gedcom.head)}),e.abrupt("return",n);case 9:throw e.prev=9,e.t0=e.catch(0),h("url_file_error"),e.t0;case 13:case"end":return e.stop()}}),e,null,[[0,9]])})));return function(t){return e.apply(this,arguments)}}()}]),e}();!function(e){e.GEDCOM="gedcom",e.READY="ready",e.PARENT_READY="parent_ready"}(ct||(ct={}));var ut=function(){function e(){Object(A.a)(this,e)}return Object(et.a)(e,[{key:"isNewData",value:function(e,t,n){return!1}},{key:"onMessage",value:function(){var e=Object(f.a)(m.a.mark((function e(t,n,a){var r,i;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t.message!==ct.PARENT_READY){e.next=4;break}window.parent.postMessage({message:ct.READY},"*"),e.next=21;break;case 4:if(t.message!==ct.GEDCOM){e.next=21;break}if(r=t.gedcom){e.next=8;break}return e.abrupt("return");case 8:return e.prev=8,e.next=11,it("",r);case 11:i=e.sent,h("embedded_file_loaded",{event_label:ue(i.gedcom.head)}),n(i),e.next=21;break;case 17:e.prev=17,e.t0=e.catch(8),h("embedded_file_error"),a(e.t0);case 21:case"end":return e.stop()}}),e,null,[[8,17]])})));return function(t,n,a){return e.apply(this,arguments)}}()},{key:"loadData",value:function(){var e=Object(f.a)(m.a.mark((function e(t){var n=this;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e,t){window.parent.postMessage({message:ct.READY},"*"),window.addEventListener("message",(function(a){return n.onMessage(a.data,e,t)}))})));case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()}]),e}();function dt(e,t){return e instanceof G?t.formatMessage({id:"error.".concat(e.code),defaultMessage:e.message},e.args):e.message}var mt=n.p+"static/media/topola.a3ffa9a5.jpg",ft=n(481),gt=n(287),pt=n(277),ht=Object(pt.createMedia)({breakpoints:{small:320,large:768}}),jt=ht.createMediaStyle(),bt=ht.Media,Ot=ht.MediaContextProvider;function vt(e){return Object(R.jsx)(ve.b,{to:{pathname:"/view",search:p.stringify({url:e.url})},children:e.text})}function wt(){var e,t=Object(a.useState)(""),n=Object(g.a)(t,2),r=n[0],i=n[1];return Object(a.useEffect)((function(){Object(f.a)(m.a.mark((function e(){return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=i,e.next=3,y(1);case 3:e.t1=e.sent,(0,e.t0)(e.t1),T();case 6:case"end":return e.stop()}}),e)})))()})),Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)("p",{children:Object(R.jsx)(E.a,{id:"intro.description",defaultMessage:"Topola Genealogy is a genealogy tree viewer that lets you browse the structure of the family."})}),Object(R.jsx)("p",{children:Object(R.jsx)(E.a,{id:"intro.instructions",defaultMessage:"Use the OPEN FILE or LOAD FROM URL buttons above to load a GEDCOM file. You can export a GEDCOM file from most of the existing genealogy programs and web sites."})}),Object(R.jsx)("h3",{children:Object(R.jsx)(E.a,{id:"intro.examples",defaultMessage:"Examples"})}),Object(R.jsx)("ul",{children:Object(R.jsxs)("li",{children:[Object(R.jsx)(vt,{url:"https://webtreeprint.com/tp_downloader.php?path=famous_gedcoms/shakespeare.ged",text:"Shakespeare"})," ","(",Object(R.jsx)(E.a,{id:"intro.from",defaultMessage:"from"})," ",Object(R.jsx)("a",{href:"https://webtreeprint.com/tp_famous_gedcoms.php",children:"webtreeprint.com"}),")"]})}),Object(R.jsx)("h3",{children:Object(R.jsx)(E.a,{id:"intro.whats_new",defaultMessage:"What's new"})}),Object(R.jsx)("span",{dangerouslySetInnerHTML:{__html:r}}),Object(R.jsx)("a",{href:"https://github.com/PeWu/topola-viewer/blob/master/CHANGELOG.md",children:Object(R.jsx)(E.a,{id:"intro.full_changelog",defaultMessage:"See full changelog"})}),Object(R.jsx)("h3",{children:Object(R.jsx)(E.a,{id:"intro.privacy",defaultMessage:"Privacy"})}),Object(R.jsx)(E.a,{id:"intro.privacy_note",defaultMessage:'When using the "load from file" option, this site does not send your data anywhere and files loaded from disk do not leave your computer. When using "load from URL", data is passed through the {link} service to deal with an issue with cross-site file loading in the browser (CORS).',values:{link:Object(R.jsx)("a",{href:"https://topola-cors.herokuapp.com/",children:"cors-anywhere"})}}),Object(R.jsxs)("p",{className:"ui right aligned version",children:["version: ",(e="2023-05-01 00:33:33 +0200",(null===e||void 0===e?void 0:e.slice(0,16))||"")," (",Object(R.jsx)("a",{href:"https://github.com/PeWu/topola-viewer/commit/".concat("cbe0d0f"),children:"cbe0d0f"}),")"]})]})}function xt(){return Object(R.jsxs)("div",{id:"content",children:[Object(R.jsx)("div",{className:"backgroundImage"}),Object(R.jsxs)(ft.a,{className:"intro",children:[Object(R.jsx)(ft.a.Content,{as:bt,greaterThanOrEqual:"large",children:Object(R.jsx)(ft.a.Header,{children:Object(R.jsx)(E.a,{id:"intro.title",defaultMessage:"Topola Genealogy Viewer"})})}),Object(R.jsxs)(ft.a.Content,{children:[Object(R.jsx)(gt.a,{as:bt,greaterThanOrEqual:"large",children:Object(R.jsxs)(gt.a.Row,{children:[Object(R.jsx)(gt.a.Column,{width:5,children:Object(R.jsx)(We.a,{src:mt,alt:"Topola logo"})}),Object(R.jsx)(gt.a.Column,{width:11,children:Object(R.jsx)(wt,{})})]})}),Object(R.jsxs)(bt,{at:"small",children:[Object(R.jsx)(We.a,{src:mt,alt:"Topola logo",centered:!0,size:"tiny",className:"blockImage"}),Object(R.jsx)(wt,{})]})]})]})]})}var _t,kt=n(487),Et=n(473),Rt=n(484),Dt=n(15),yt=n(475),It=n(285);function Tt(e){var t=Object(Dt.a)({},e);return delete t.menuType,Object(R.jsx)(R.Fragment,{children:e.menuType===_t.Menu?Object(R.jsx)(It.a.Item,Object(Dt.a)(Object(Dt.a)({},t),{},{children:e.children})):Object(R.jsx)(yt.a.Item,Object(Dt.a)(Object(Dt.a)({},t),{},{children:e.children}))})}!function(e){e[e.Menu=0]="Menu",e[e.Dropdown=1]="Dropdown"}(_t||(_t={}));var Nt=n(278),Mt=n.n(Nt),Ct=n(75),St=n.n(Ct),Lt=n(279),At=n.n(Lt);n(411)(St.a),n(412)(St.a),n(413)(St.a),n(414)(St.a),n(415)(St.a),n(416)(St.a);function Pt(e){return e.toLocaleLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/\u0142/g,"l")}function zt(e,t){return e.score!==t.score?t.score-e.score:At()(e.ref,t.ref)}var Wt=function(){function e(t){Object(A.a)(this,e),this.index=void 0,this.indiMap=void 0,this.famMap=void 0,this.indiMap=Q(t),this.famMap=$(t)}return Object(et.a)(e,[{key:"initialize",value:function(){var e=this;this.index=St()((function(){var t=this;this.use(St.a.multiLanguage("de","en","fr","it","ru")),this.ref("id"),this.field("id"),this.field("name",{boost:10}),this.field("normalizedName",{boost:8}),this.field("spouseLastName",{boost:2}),this.field("normalizedSpouseLastName",{boost:2}),e.indiMap.forEach((function(n){var a=[n.firstName,n.lastName].join(" "),r=function(e,t,n){return(e.fams||[]).map((function(e){return n.get(e)})).map((function(e){return e&&e.husb})).map((function(e){return e&&t.get(e)})).map((function(e){return e&&e.lastName})).join(" ")}(n,e.indiMap,e.famMap);t.add({id:n.id,name:a,normalizedName:Pt(a),spouseLastName:r,normalizedSpouseLastName:Pt(r)})}))}))}},{key:"search",value:function(e){var t=this,n=e.split(" ").filter((function(e){return!!e})).map((function(e){return"".concat(e," ").concat(e,"*")})).join(" ");return this.index.search(n).sort(zt).slice(0,8).map((function(e){return{id:e.ref,indi:t.indiMap.get(e.ref)}}))}}]),e}();var Gt=n(474);function Ft(e){var t=[e.indi.firstName,e.indi.lastName].join(" ").trim();return e.id.length>8?t:Object(R.jsxs)(R.Fragment,{children:[t," ",Object(R.jsxs)("i",{children:["(",e.id,")"]})]})}function Bt(e){var t=Object(a.useState)([]),n=Object(g.a)(t,2),r=n[0],i=n[1],o=Object(a.useState)(""),c=Object(g.a)(o,2),s=c[0],l=c[1],u=Object(a.useRef)(),d=Object(be.a)();function m(e){var t=V(e.birth,d),n=V(e.death,d);return n?"".concat(t," \u2013 ").concat(n):t}var f=Object(a.useRef)(Mt()((function(e){if(e){var t=u.current.search(e).map((function(e){return function(e){return{id:e.id,key:e.id,title:Ft(e),description:m(e.indi)}}(e)}));i(t)}}),200));return Object(a.useEffect)((function(){u.current=function(e){var t=new Wt(e);return t.initialize(),t}(e.data)}),[e.data]),Object(R.jsx)(Gt.a,{onSearchChange:function(e,t){return n=t.value,f.current(n),void l(n);var n},onResultSelect:function(t,n){return a=n.result.id,h("search_result_selected"),e.onSelection({id:a,generation:0}),void l("");var a},results:r,noResultsMessage:d.formatMessage({id:"menu.search.no_results",defaultMessage:"No results found"}),placeholder:d.formatMessage({id:"menu.search.placeholder",defaultMessage:"Search for people"}),selectFirstResult:!0,value:s,id:"search"})}var Ut=n(225),Ht=n.n(Ut);function Vt(e){return new Promise((function(t){var n=new FileReader;n.onload=function(e){t(e.target.result)},n.readAsText(e)}))}function Yt(e){var t=e.toLowerCase();return t.endsWith(".jpg")||t.endsWith(".png")}function qt(e){var t=Object(Oe.g)(),n=Object(Oe.h)();function a(){return(a=Object(f.a)(m.a.mark((function e(a){var r,i,o,c,s,l,u,d,f;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if((r=a.target.files)&&r.length){e.next=3;break}return e.abrupt("return");case 3:return i=Array.from(r),a.target.value="",h("upload_files_selected",{event_value:r.length}),o=1===i.length?i[0]:i.find((function(e){return e.name.toLowerCase().endsWith(".ged")}))||i[0],c=i.filter((function(e){return e.name!==o.name&&Yt(e.name)})).map((function(e){return{name:e.name,url:URL.createObjectURL(e)}})),s=new Map(c.map((function(e){return[e.name,e.url]}))),e.next=11,Vt(o);case 11:l=e.sent,u=c.map((function(e){return e.name})).sort().join("|"),d=Ht()(Ht()(l)+u),f=p.parse(n.search),(f.file===d?t.replace:t.push)({pathname:"/view",search:p.stringify({file:d}),state:{data:l,images:s}});case 17:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var r=Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(Ue.a,{name:"folder open"}),Object(R.jsx)(E.a,{id:"menu.open_file",defaultMessage:"Open file"})]});return Object(R.jsxs)(R.Fragment,{children:[e.menuType===_t.Menu?Object(R.jsx)("label",{htmlFor:"fileInput",children:Object(R.jsx)(It.a.Item,{as:"a",children:r})}):Object(R.jsx)(yt.a.Item,{as:"label",htmlFor:"fileInput",children:r}),Object(R.jsx)("input",{className:"hidden",type:"file",accept:".ged,image/*",id:"fileInput",multiple:!0,onChange:function(e){return a.apply(this,arguments)}})]})}var Kt=n(476),Jt=n(472);function Zt(e){var t=Object(a.useState)(!1),n=Object(g.a)(t,2),r=n[0],i=n[1],o=Object(a.useState)(""),c=Object(g.a)(o,2),s=c[0],l=c[1],u=Object(a.useRef)(null),d=Object(Oe.g)();function m(){i(!1),s&&(h("url_selected"),d.push({pathname:"/view",search:p.stringify({url:s})}))}return Object(a.useEffect)((function(){r&&(l(""),u.current.focus())}),[r]),Object(R.jsxs)(R.Fragment,{children:[Object(R.jsxs)(Tt,{onClick:function(){return i(!0)},menuType:e.menuType,children:[Object(R.jsx)(Ue.a,{name:"cloud download"}),Object(R.jsx)(E.a,{id:"menu.load_from_url",defaultMessage:"Load from URL"})]}),Object(R.jsxs)(w.a,{open:r,onClose:function(){return i(!1)},centered:!1,children:[Object(R.jsxs)(x.a,{children:[Object(R.jsx)(Ue.a,{name:"cloud download"}),Object(R.jsx)(E.a,{id:"load_from_url.title",defaultMessage:"Load from URL"})]}),Object(R.jsx)(w.a.Content,{children:Object(R.jsxs)(Kt.a,{onSubmit:m,children:[Object(R.jsx)(Jt.a,{placeholder:"https://",fluid:!0,value:s,onChange:function(e,t){return l(t.value)},ref:u}),Object(R.jsx)("p",{children:Object(R.jsx)(E.a,{id:"load_from_url.comment",defaultMessage:"Data from the URL will be loaded through {link} to avoid CORS issues.",values:{link:Object(R.jsx)("a",{href:"https://topola-cors-server.up.railway.app/",children:"topola-cors-server.up.railway.app"})}})})]})}),Object(R.jsxs)(w.a.Actions,{children:[Object(R.jsx)(_.a,{secondary:!0,onClick:function(){return i(!1)},children:Object(R.jsx)(E.a,{id:"load_from_url.cancel",defaultMessage:"Cancel"})}),Object(R.jsx)(_.a,{primary:!0,onClick:m,children:Object(R.jsx)(E.a,{id:"load_from_url.load",defaultMessage:"Load"})})]})]})]})}var Xt,Qt=n.p+"static/media/wikitree.7bffea31.png",$t=n(95);function en(e){var t=Object(a.useState)(!1),n=Object(g.a)(t,2),r=n[0],i=n[1],o=Object(a.useState)(""),c=Object(g.a)(o,2),s=c[0],l=c[1],u=Object(a.useRef)(null),d=Object(Oe.g)(),m=Object(Oe.h)();function f(){if(i(!1),s){h("wikitree_id_selected");var e=p.parse(m.search),t=void 0===e.standalone||e.standalone;d.push({pathname:"/view",search:p.stringify({indi:s,source:"wikitree",standalone:t})})}}function j(e,t){e.preventDefault(),l(t),u.current.focus()}return Object(a.useEffect)((function(){r&&(l(""),u.current.focus())}),[r]),Object(R.jsxs)(R.Fragment,{children:[Object(R.jsxs)(Tt,{menuType:e.menuType,onClick:function(){return i(!0)},children:[Object(R.jsx)("img",{src:Qt,alt:"WikiTree logo",className:"menu-icon"}),Object(R.jsx)(E.a,{id:"menu.select_wikitree_id",defaultMessage:"Select WikiTree ID"})]}),Object(R.jsxs)(w.a,{open:r,onClose:function(){return i(!1)},centered:!1,children:[Object(R.jsxs)(x.a,{children:[Object(R.jsx)("img",{src:Qt,alt:"WikiTree logo",style:{width:"32px",height:"32px"}}),Object(R.jsx)(E.a,{id:"select_wikitree_id.title",defaultMessage:"Select WikiTree ID"})]}),Object(R.jsx)(w.a.Content,{children:Object(R.jsxs)(Kt.a,{onSubmit:f,children:[Object(R.jsx)("p",{children:Object(R.jsx)(E.a,{id:"select_wikitree_id.comment",defaultMessage:"Enter a {wikiTreeLink} profile ID. Examples: {example1}, {example2}.",values:{wikiTreeLink:Object(R.jsx)("a",{href:"https://wikitree.com/",target:"_blank",rel:"noopener noreferrer",children:"WikiTree"}),example1:Object(R.jsx)("span",{onClick:function(e){return j(e,"Wojtyla-13")},className:"link-span",children:"Wojtyla-13"}),example2:Object(R.jsx)("span",{onClick:function(e){return j(e,"Sk\u0142odowska-2")},className:"link-span",children:"Sk\u0142odowska-2"})}})}),Object(R.jsx)(Jt.a,{fluid:!0,value:s,onChange:function(e,t){return l(t.value)},ref:u})]})}),Object(R.jsxs)(w.a.Actions,{children:[Object(R.jsx)(_.a,{secondary:!0,onClick:function(){return i(!1)},children:Object(R.jsx)(E.a,{id:"select_wikitree_id.cancel",defaultMessage:"Cancel"})}),Object(R.jsx)(_.a,{primary:!0,onClick:f,children:Object(R.jsx)(E.a,{id:"select_wikitree_id.load",defaultMessage:"Load"})})]})]})]})}function tn(e){var t=Object(be.a)();var n=Object($t.getLoggedInUserName)();if(!n)return Object(R.jsx)(R.Fragment,{children:Object(R.jsxs)(Tt,{menuType:e.menuType,onClick:function(){var e="".concat("https://apps.wikitree.com/apps/wiech13/topola-viewer").concat(window.location.hash);Object($t.navigateToLoginPage)(e)},children:[Object(R.jsx)("img",{src:Qt,alt:"WikiTree logo",className:"menu-icon"}),Object(R.jsx)(E.a,{id:"menu.wikitree_login",defaultMessage:"Log in to WikiTree"})]})});var a=t.formatMessage({id:"menu.wikitree_popup_username",defaultMessage:"Logged in to WikiTree as {username}"},{username:n});return Object(R.jsxs)(Tt,{menuType:e.menuType,title:a,children:[Object(R.jsx)("img",{src:Qt,alt:"WikiTree logo",className:"menu-icon"}),Object(R.jsx)(E.a,{id:"menu.wikitree_logged_in",defaultMessage:"Logged in"})]})}function nn(e){var t=Object(Oe.g)(),n=Object(Oe.h)();function a(e){var a=p.parse(n.search);a.view!==e&&(a.view=e,n.search=p.stringify(a),t.push(n))}function r(t){if(!e.showingChart)return null;var n=Object(R.jsxs)(R.Fragment,{children:[Object(R.jsxs)(yt.a.Item,{onClick:function(){return a("hourglass")},children:[Object(R.jsx)(Ue.a,{name:"hourglass"}),Object(R.jsx)(E.a,{id:"menu.hourglass",defaultMessage:"Hourglass chart"})]}),e.allowAllRelativesChart?Object(R.jsxs)(yt.a.Item,{onClick:function(){return a("relatives")},children:[Object(R.jsx)(Ue.a,{name:"users"}),Object(R.jsx)(E.a,{id:"menu.relatives",defaultMessage:"All relatives"})]}):null,Object(R.jsxs)(yt.a.Item,{onClick:function(){return a("fancy")},children:[Object(R.jsx)(Ue.a,{name:"users"}),Object(R.jsx)(E.a,{id:"menu.fancy",defaultMessage:"Fancy tree (experimental)"})]})]});switch(t){case Xt.LARGE:return Object(R.jsxs)(R.Fragment,{children:[Object(R.jsxs)(It.a.Item,{onClick:e.eventHandlers.onPrint,children:[Object(R.jsx)(Ue.a,{name:"print"}),Object(R.jsx)(E.a,{id:"menu.print",defaultMessage:"Print"})]}),Object(R.jsx)(yt.a,{trigger:Object(R.jsxs)("div",{children:[Object(R.jsx)(Ue.a,{name:"download"}),Object(R.jsx)(E.a,{id:"menu.download",defaultMessage:"Download"})]}),className:"item",children:Object(R.jsxs)(yt.a.Menu,{children:[Object(R.jsx)(yt.a.Item,{onClick:e.eventHandlers.onDownloadPdf,children:Object(R.jsx)(E.a,{id:"menu.pdf_file",defaultMessage:"PDF file"})}),Object(R.jsx)(yt.a.Item,{onClick:e.eventHandlers.onDownloadPng,children:Object(R.jsx)(E.a,{id:"menu.png_file",defaultMessage:"PNG file"})}),Object(R.jsx)(yt.a.Item,{onClick:e.eventHandlers.onDownloadSvg,children:Object(R.jsx)(E.a,{id:"menu.svg_file",defaultMessage:"SVG file"})})]})}),Object(R.jsx)(yt.a,{trigger:Object(R.jsxs)("div",{children:[Object(R.jsx)(Ue.a,{name:"eye"}),Object(R.jsx)(E.a,{id:"menu.view",defaultMessage:"View"})]}),className:"item",children:Object(R.jsx)(yt.a.Menu,{children:n})}),Object(R.jsx)(Bt,Object(Dt.a)({data:e.data,onSelection:e.eventHandlers.onSelection},e))]});case Xt.SMALL:return Object(R.jsxs)(R.Fragment,{children:[Object(R.jsxs)(yt.a.Item,{onClick:e.eventHandlers.onPrint,children:[Object(R.jsx)(Ue.a,{name:"print"}),Object(R.jsx)(E.a,{id:"menu.print",defaultMessage:"Print"})]}),Object(R.jsx)(yt.a.Divider,{}),Object(R.jsxs)(yt.a.Item,{onClick:e.eventHandlers.onDownloadPdf,children:[Object(R.jsx)(Ue.a,{name:"download"}),Object(R.jsx)(E.a,{id:"menu.download_pdf",defaultMessage:"Download PDF"})]}),Object(R.jsxs)(yt.a.Item,{onClick:e.eventHandlers.onDownloadPng,children:[Object(R.jsx)(Ue.a,{name:"download"}),Object(R.jsx)(E.a,{id:"menu.download_png",defaultMessage:"Download PNG"})]}),Object(R.jsxs)(yt.a.Item,{onClick:e.eventHandlers.onDownloadSvg,children:[Object(R.jsx)(Ue.a,{name:"download"}),Object(R.jsx)(E.a,{id:"menu.download_svg",defaultMessage:"Download SVG"})]}),Object(R.jsx)(yt.a.Divider,{}),n,Object(R.jsx)(yt.a.Divider,{})]})}}function i(){return Object(R.jsx)(It.a.Item,{children:Object(R.jsx)("b",{children:"Topola Genealogy"})})}function o(t){if(!e.standalone&&e.showWikiTreeMenus)switch(t){case Xt.LARGE:return Object(R.jsx)(en,Object(Dt.a)({menuType:_t.Menu},e));case Xt.SMALL:return Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(en,Object(Dt.a)({menuType:_t.Dropdown},e)),Object(R.jsx)(yt.a.Divider,{})]})}if(!e.standalone)return null;switch(t){case Xt.LARGE:return e.showingChart?Object(R.jsx)(yt.a,{trigger:Object(R.jsxs)("div",{children:[Object(R.jsx)(Ue.a,{name:"folder open"}),Object(R.jsx)(E.a,{id:"menu.open",defaultMessage:"Open"})]}),className:"item",children:Object(R.jsxs)(yt.a.Menu,{children:[Object(R.jsx)(qt,Object(Dt.a)({menuType:_t.Dropdown},e)),Object(R.jsx)(Zt,Object(Dt.a)({menuType:_t.Dropdown},e)),Object(R.jsx)(en,Object(Dt.a)({menuType:_t.Dropdown},e))]})}):Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(qt,Object(Dt.a)({menuType:_t.Menu},e)),Object(R.jsx)(Zt,Object(Dt.a)({menuType:_t.Menu},e)),Object(R.jsx)(en,Object(Dt.a)({menuType:_t.Menu},e))]});case Xt.SMALL:return Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(qt,Object(Dt.a)({menuType:_t.Dropdown},e)),Object(R.jsx)(Zt,Object(Dt.a)({menuType:_t.Dropdown},e)),Object(R.jsx)(en,Object(Dt.a)({menuType:_t.Dropdown},e)),Object(R.jsx)(yt.a.Divider,{})]})}}function c(t){return e.showWikiTreeMenus?Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(tn,Object(Dt.a)({menuType:t===Xt.SMALL?_t.Dropdown:_t.Menu},e)),t===Xt.SMALL?Object(R.jsx)(yt.a.Divider,{}):null]}):null}return Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(It.a,{as:bt,greaterThanOrEqual:"large",attached:"top",inverted:!0,color:"blue",size:"large",children:Object(R.jsxs)(R.Fragment,{children:[e.standalone?Object(R.jsx)(ve.b,{to:"/",children:i()}):null,o(Xt.LARGE),r(Xt.LARGE),Object(R.jsxs)(It.a.Menu,{position:"right",children:[c(Xt.LARGE),Object(R.jsx)(It.a.Item,{href:"https://github.com/PeWu/topola-viewer",target:"_blank",rel:"noopener noreferrer",children:Object(R.jsx)(E.a,{id:"menu.github",defaultMessage:"GitHub project"})})]})]})}),Object(R.jsx)(It.a,{as:bt,at:"small",attached:"top",inverted:!0,color:"blue",size:"large",children:Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(yt.a,{trigger:Object(R.jsx)("div",{children:Object(R.jsx)(Ue.a,{name:"sidebar"})}),className:"item",icon:null,children:Object(R.jsxs)(yt.a.Menu,{children:[o(Xt.SMALL),r(Xt.SMALL),c(Xt.SMALL),Object(R.jsx)(yt.a.Item,{href:"https://github.com/PeWu/topola-viewer",target:"_blank",rel:"noopener noreferrer",children:Object(R.jsx)(E.a,{id:"menu.github",defaultMessage:"GitHub project"})})]})}),e.standalone?Object(R.jsx)(ve.b,{to:"/",children:i()}):i()]})})]})}!function(e){e[e.LARGE=0]="LARGE",e[e.SMALL=1]="SMALL"}(Xt||(Xt={}));var an,rn,on,cn=n(488);!function(e){e[e.NO_COLOR=0]="NO_COLOR",e[e.COLOR_BY_SEX=1]="COLOR_BY_SEX",e[e.COLOR_BY_GENERATION=2]="COLOR_BY_GENERATION"}(an||(an={})),function(e){e[e.HIDE=0]="HIDE",e[e.SHOW=1]="SHOW"}(rn||(rn={})),function(e){e[e.HIDE=0]="HIDE",e[e.SHOW=1]="SHOW"}(on||(on={}));var sn={color:an.COLOR_BY_GENERATION,id:rn.SHOW,sex:on.SHOW},ln=new Map([["n",an.NO_COLOR],["g",an.COLOR_BY_GENERATION],["s",an.COLOR_BY_SEX]]),un=new Map;ln.forEach((function(e,t){return un.set(e,t)}));var dn=new Map([["h",rn.HIDE],["s",rn.SHOW]]),mn=new Map;dn.forEach((function(e,t){return mn.set(e,t)}));var fn=new Map([["h",on.HIDE],["s",on.SHOW]]),gn=new Map;function pn(e){var t,n,a,r,i,o,c=function(t){var n=e[t];return"string"===typeof n?n:void 0};return{color:null!==(t=ln.get(null!==(n=c("c"))&&void 0!==n?n:""))&&void 0!==t?t:sn.color,id:null!==(a=dn.get(null!==(r=c("i"))&&void 0!==r?r:""))&&void 0!==a?a:sn.id,sex:null!==(i=fn.get(null!==(o=c("s"))&&void 0!==o?o:""))&&void 0!==i?i:sn.sex}}function hn(e){return Object(R.jsx)(Kt.a,{className:"details",children:Object(R.jsxs)(Re.a.Group,{children:[Object(R.jsx)(Re.a,{children:Object(R.jsxs)(Re.a.Content,{children:[Object(R.jsx)(x.a,{sub:!0,children:Object(R.jsx)(E.a,{id:"config.colors",defaultMessage:"Colors"})}),Object(R.jsx)(Kt.a.Field,{className:"no-margin",children:Object(R.jsx)(cn.a,{radio:!0,label:Object(R.jsx)(E.a,{tagName:"label",id:"config.colors.NO_COLOR",defaultMessage:"none"}),name:"checkboxRadioGroup",value:"none",checked:e.config.color===an.NO_COLOR,onClick:function(){return e.onChange(Object(Dt.a)(Object(Dt.a)({},e.config),{},{color:an.NO_COLOR}))}})}),Object(R.jsx)(Kt.a.Field,{className:"no-margin",children:Object(R.jsx)(cn.a,{radio:!0,label:Object(R.jsx)(E.a,{tagName:"label",id:"config.colors.COLOR_BY_GENERATION",defaultMessage:"by generation"}),name:"checkboxRadioGroup",value:"generation",checked:e.config.color===an.COLOR_BY_GENERATION,onClick:function(){return e.onChange(Object(Dt.a)(Object(Dt.a)({},e.config),{},{color:an.COLOR_BY_GENERATION}))}})}),Object(R.jsx)(Kt.a.Field,{className:"no-margin",children:Object(R.jsx)(cn.a,{radio:!0,label:Object(R.jsx)(E.a,{tagName:"label",id:"config.colors.COLOR_BY_SEX",defaultMessage:"by sex"}),name:"checkboxRadioGroup",value:"gender",checked:e.config.color===an.COLOR_BY_SEX,onClick:function(){return e.onChange(Object(Dt.a)(Object(Dt.a)({},e.config),{},{color:an.COLOR_BY_SEX}))}})})]})}),Object(R.jsx)(Re.a,{children:Object(R.jsxs)(Re.a.Content,{children:[Object(R.jsx)(x.a,{sub:!0,children:Object(R.jsx)(E.a,{id:"config.ids",defaultMessage:"IDs"})}),Object(R.jsx)(Kt.a.Field,{className:"no-margin",children:Object(R.jsx)(cn.a,{radio:!0,label:Object(R.jsx)(E.a,{tagName:"label",id:"config.ids.HIDE",defaultMessage:"hide"}),name:"checkboxRadioGroup",value:"hide",checked:e.config.id===rn.HIDE,onClick:function(){return e.onChange(Object(Dt.a)(Object(Dt.a)({},e.config),{},{id:rn.HIDE}))}})}),Object(R.jsx)(Kt.a.Field,{className:"no-margin",children:Object(R.jsx)(cn.a,{radio:!0,label:Object(R.jsx)(E.a,{tagName:"label",id:"config.ids.SHOW",defaultMessage:"show"}),name:"checkboxRadioGroup",value:"show",checked:e.config.id===rn.SHOW,onClick:function(){return e.onChange(Object(Dt.a)(Object(Dt.a)({},e.config),{},{id:rn.SHOW}))}})})]})}),Object(R.jsx)(Re.a,{children:Object(R.jsxs)(Re.a.Content,{children:[Object(R.jsx)(x.a,{sub:!0,children:Object(R.jsx)(E.a,{id:"config.sex",defaultMessage:"Sex"})}),Object(R.jsx)(Kt.a.Field,{className:"no-margin",children:Object(R.jsx)(cn.a,{radio:!0,label:Object(R.jsx)(E.a,{tagName:"label",id:"config.sex.HIDE",defaultMessage:"hide"}),name:"checkboxRadioGroup",value:"hide",checked:e.config.sex===on.HIDE,onClick:function(){return e.onChange(Object(Dt.a)(Object(Dt.a)({},e.config),{},{sex:on.HIDE}))}})}),Object(R.jsx)(Kt.a.Field,{className:"no-margin",children:Object(R.jsx)(cn.a,{radio:!0,label:Object(R.jsx)(E.a,{tagName:"label",id:"config.sex.SHOW",defaultMessage:"show"}),name:"checkboxRadioGroup",value:"show",checked:e.config.sex===on.SHOW,onClick:function(){return e.onChange(Object(Dt.a)(Object(Dt.a)({},e.config),{},{sex:on.SHOW}))}})})]})})]})})}fn.forEach((function(e,t){return gn.set(e,t)}));var jn,bn=n(74),On=n(147),vn=n(102),wn=n(226),xn=n(169),_n=(n(103),n(146));function kn(e,t){var n=Object(xn.a)("#svgContainer").node(),a=t.transform.k,r=Object(On.a)([0,(n.clientWidth-e[0]*a)/2]),i=Object(On.a)([0,(n.clientHeight-e[1]*a)/2]);Object(xn.a)("#chartSvg").attr("width",e[0]*a).attr("height",e[1]*a).attr("transform","translate(".concat(r,", ").concat(i,")")),Object(xn.a)("#chart").attr("transform","scale(".concat(a,")")),n.scrollLeft=-t.transform.x,n.scrollTop=-t.transform.y}function En(){var e=Object(xn.a)("#svgContainer").node(),t=e.scrollLeft+e.clientWidth/2,n=e.scrollTop+e.clientHeight/2,a=Object(_n.b)(e).k;Object(xn.a)(e).call(Object(_n.a)().translateTo,t/a,n/a)}function Rn(e){var t=new FileReader;return t.readAsDataURL(e),new Promise((function(e,n){t.onload=function(t){return e(t.target.result)}}))}function Dn(e){return yn.apply(this,arguments)}function yn(){return(yn=Object(f.a)(m.a.mark((function e(t){var n,a,r,i;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.href.baseVal){e.next=3;break}return e.abrupt("return");case 3:return e.prev=3,e.next=6,fetch(n);case 6:return a=e.sent,e.next=9,a.blob();case 9:return r=e.sent,e.next=12,Rn(r);case 12:i=e.sent,t.href.baseVal=i,e.next=19;break;case 16:e.prev=16,e.t0=e.catch(3),console.warn("Failed to load image:",e.t0);case 19:case"end":return e.stop()}}),e,null,[[3,16]])})))).apply(this,arguments)}function In(e){return Tn.apply(this,arguments)}function Tn(){return(Tn=Object(f.a)(m.a.mark((function e(t){var n;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=Array.from(t.getElementsByTagName("image")),e.next=3,Promise.all(n.map(Dn));case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Nn(e){var t=new Image;return t.src=URL.createObjectURL(e),new Promise((function(e,n){t.addEventListener("load",(function(){return e(t)}))}))}function Mn(e){var t=document.createElement("canvas");t.width=2*e.width,t.height=2*e.height;var n=t.getContext("2d"),a=n.fillStyle;return n.fillStyle="white",n.fillRect(0,0,t.width,t.height),n.fillStyle=a,n.drawImage(e,0,0,t.width,t.height),t}function Cn(e,t){return new Promise((function(n,a){e.toBlob((function(e){e?n(e):a()}),t)}))}function Sn(){var e=document.getElementById("chartSvg").cloneNode(!0);e.removeAttribute("transform");var t=Object(xn.a)("#svgContainer").node(),n=Object(_n.b)(t).k;return e.setAttribute("width",String(Number(e.getAttribute("width"))/n)),e.setAttribute("height",String(Number(e.getAttribute("height"))/n)),e.querySelector("#chart").removeAttribute("transform"),e}function Ln(){return An.apply(this,arguments)}function An(){return(An=Object(f.a)(m.a.mark((function e(){var t;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=Sn(),e.next=3,In(t);case 3:return e.abrupt("return",(new XMLSerializer).serializeToString(t));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Pn(){var e=document.createElement("iframe");e.style.position="absolute",e.style.top="-1000px",e.style.left="-1000px",e.onload=function(){e.contentDocument.open(),e.contentDocument.write((new XMLSerializer).serializeToString(Sn())),e.contentDocument.close(),setTimeout((function(){e.contentWindow.focus(),e.contentWindow.print(),e.parentNode.removeChild(e)}),500)},document.body.appendChild(e)}function zn(){return(zn=Object(f.a)(m.a.mark((function e(){var t,n;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ln();case 2:t=e.sent,n=new Blob([t],{type:"image/svg+xml"}),Object(wn.saveAs)(n,"topola.svg");case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Wn(){return Gn.apply(this,arguments)}function Gn(){return(Gn=Object(f.a)(m.a.mark((function e(){var t,n;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ln();case 2:return t=e.sent,n=new Blob([t],{type:"image/svg+xml"}),e.t0=Mn,e.next=7,Nn(n);case 7:return e.t1=e.sent,e.abrupt("return",(0,e.t0)(e.t1));case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Fn(){return Bn.apply(this,arguments)}function Bn(){return(Bn=Object(f.a)(m.a.mark((function e(){var t,n;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Wn();case 2:return t=e.sent,e.next=5,Cn(t,"image/png");case 5:n=e.sent,Object(wn.saveAs)(n,"topola.png");case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Un(){return Hn.apply(this,arguments)}function Hn(){return(Hn=Object(f.a)(m.a.mark((function e(){var t,a,r,i;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n.e(4).then(n.bind(null,864));case 2:return t=e.sent,a=t.default,e.next=6,Wn();case 6:r=e.sent,(i=new a({orientation:r.width>r.height?"l":"p",unit:"pt",format:[r.width,r.height]})).addImage(r,"PNG",0,0,r.width,r.height,"NONE"),i.save("topola.pdf");case 10:case"end":return e.stop()}}),e)})))).apply(this,arguments)}!function(e){e[e.Hourglass=0]="Hourglass",e[e.Relatives=1]="Relatives",e[e.Fancy=2]="Fancy"}(jn||(jn={}));var Vn=new Map([[an.NO_COLOR,F.ChartColors.NO_COLOR],[an.COLOR_BY_GENERATION,F.ChartColors.COLOR_BY_GENERATION],[an.COLOR_BY_SEX,F.ChartColors.COLOR_BY_SEX]]);function Yn(e){switch(e){case jn.Hourglass:return F.HourglassChart;case jn.Relatives:return F.RelativesChart;case jn.Fancy:return F.FancyChart;default:return F.HourglassChart}}function qn(e){switch(e){case jn.Fancy:return F.CircleRenderer;default:return F.DetailedRenderer}}var Kn=function(){function e(){Object(A.a)(this,e),this.chart=void 0,this.animating=!1,this.rerenderRequired=!1,this.zoomBehavior=void 0,this.rerenderProps=void 0,this.rerenderResetPosition=void 0}return Object(et.a)(e,[{key:"zoom",value:function(e){var t=Object(xn.a)("#svgContainer");this.zoomBehavior.scaleBy(t,e)}},{key:"renderChart",value:function(e,t){var n=this,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{initialRender:!1,resetPosition:!1};if(!a.initialRender&&this.animating)return this.rerenderRequired=!0,this.rerenderProps=e,void(this.rerenderResetPosition=a.resetPosition);if(a.initialRender||!e.freezeAnimation){a.initialRender?(Object(xn.a)("#chart").node().innerHTML="",this.chart=Object(F.createChart)({json:e.data,chartType:Yn(e.chartType),renderer:qn(e.chartType),svgSelector:"#chart",indiCallback:function(t){return e.onSelection(t)},colors:Vn.get(e.colors),animate:!0,updateSvgSize:!1,locale:t.locale})):this.chart.setData(e.data);var r=this.chart.render({startIndi:e.selection.id,baseGeneration:e.selection.generation}),i=Object(xn.a)("#chartSvg"),o=Object(xn.a)("#svgContainer").node(),c=Object(_n.b)(o).k,s=Object(vn.a)([1,c,o.clientWidth/r.size[0],o.clientHeight/r.size[1]]),l=[Object(On.a)([.1,s]),2];this.zoomBehavior=Object(_n.a)().scaleExtent(l).translateExtent([[0,0],r.size]).on("zoom",(function(e){return kn(r.size,e)})),Object(xn.a)(o).on("scroll",En).call(this.zoomBehavior);var u=function(e){return function(){var t=Object(bn.a)(o.scrollTop,e);return function(e){o.scrollTop=t(e)}}},d=function(e){return function(){var t=Object(bn.a)(o.scrollLeft,e);return function(e){o.scrollLeft=t(e)}}},m=o.clientWidth/2-r.origin[0]*c,f=o.clientHeight/2-r.origin[1]*c,g=Object(On.a)([0,(o.clientWidth-r.size[0]*c)/2]),p=Object(On.a)([0,(o.clientHeight-r.size[1]*c)/2]),h=i.transition().delay(200).duration(500),j=a.initialRender?i:h;j.attr("transform","translate(".concat(g,", ").concat(p,")")).attr("width",r.size[0]*c).attr("height",r.size[1]*c),a.resetPosition&&(a.initialRender?(o.scrollLeft=-m,o.scrollTop=-f):h.tween("scrollLeft",d(-m)).tween("scrollTop",u(-f))),this.animating=!0,r.animationPromise.then((function(){n.animating=!1,n.rerenderRequired&&(n.rerenderRequired=!1,n.renderChart(n.rerenderProps,t,{initialRender:!1,resetPosition:!!n.rerenderResetPosition}))}))}}}]),e}();function Jn(e){var t=Object(a.useRef)(new Kn),n=function(e){var t=Object(a.useRef)();return Object(a.useEffect)((function(){t.current=e})),t.current}(e),r=Object(be.a)();return Object(a.useEffect)((function(){if(n){var a=e.chartType!==(null===n||void 0===n?void 0:n.chartType)||e.colors!==(null===n||void 0===n?void 0:n.colors)||e.hideIds!==(null===n||void 0===n?void 0:n.hideIds)||e.hideSex!==(null===n||void 0===n?void 0:n.hideSex),i=e.chartType!==(null===n||void 0===n?void 0:n.chartType)||e.data!==n.data||e.selection!==n.selection;t.current.renderChart(e,r,{initialRender:a,resetPosition:i})}else t.current.renderChart(e,r,{initialRender:!0,resetPosition:!0})})),Object(R.jsxs)("div",{id:"svgContainer",children:[Object(R.jsxs)(bt,{greaterThanOrEqual:"large",className:"zoom",children:[Object(R.jsx)("button",{className:"zoom-in",onClick:function(){return t.current.zoom(1.3)},children:"+"}),Object(R.jsx)("button",{className:"zoom-out",onClick:function(){return t.current.zoom(1/1.3)},children:"\u2212"})]}),Object(R.jsx)("svg",{id:"chartSvg",children:Object(R.jsx)("g",{id:"chart"})})]})}var Zn=n(280),Xn="topola-viewer",Qn="~Private";function $n(e){try{return sessionStorage.getItem(e)}catch(t){console.warn("Failed to load data from session storage: "+t)}return null}function ea(e,t){try{sessionStorage.setItem(e,t)}catch(n){console.warn("Failed to store data in session storage: "+n)}}function ta(e){return Object.assign({appId:Xn},e?{apiUrl:"https://topola-cors-server.up.railway.app/https://api.wikitree.com/api.php"}:{})}function na(e,t){return aa.apply(this,arguments)}function aa(){return(aa=Object(f.a)(m.a.mark((function e(t,n){var a,r,i;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a="wikitree:ancestors:".concat(t),!(r=$n(a))){e.next=4;break}return e.abrupt("return",JSON.parse(r));case 4:return e.next=6,Object($t.getAncestors)(t,{},ta(n));case 6:return i=e.sent,ea(a,JSON.stringify(i)),e.abrupt("return",i);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ra(e,t){return ia.apply(this,arguments)}function ia(){return(ia=Object(f.a)(m.a.mark((function e(t,n){var a,r,i,o;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=[],r=[],t.forEach((function(e){var t=$n("wikitree:relatives:".concat(e));t?a.push(JSON.parse(t)):r.push(e)})),0!==r.length){e.next=5;break}return e.abrupt("return",a);case 5:return e.next=7,Object($t.getRelatives)(r,{getChildren:!0,getSpouses:!0},ta(n));case 7:if(i=e.sent){e.next=11;break}throw o=r[0],new G("WIKITREE_PROFILE_NOT_FOUND","WikiTree profile ".concat(o," not found"),{id:o});case 11:return i.forEach((function(e){ea("wikitree:relatives:".concat(e.Name),JSON.stringify(e))})),e.abrupt("return",a.concat(i));case 13:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function oa(e,t,n){return ca.apply(this,arguments)}function ca(){return(ca=Object(f.a)(m.a.mark((function e(t,n,a){var r,i,o,c,s,l,u,d,f,p,h,j,b,O,v,w,x,_,k,E,R,D,y,I,T,N,C,S;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if((i="apps.wikitree.com"!==window.location.hostname)||Object($t.getLoggedInUserName)()||!a){e.next=6;break}return e.next=4,Object($t.clientLogin)(a,{appId:Xn});case 4:"Success"===e.sent.result&&sessionStorage.clear();case 6:return o=[],e.next=9,ra([t],i);case 9:if(c=e.sent,null===(r=c[0])||void 0===r?void 0:r.Name){e.next=13;break}throw new G("WIKITREE_PROFILE_NOT_ACCESSIBLE","WikiTree profile ".concat(s=t," is not accessible. Try logging in."),{id:s});case 13:return l=Object.values(c[0].Spouses||{}).map((function(e){return e.Name})),e.next=16,Promise.all([t].concat(l).map((function(e){return na(e,i)})));case 16:return u=e.sent,d=u.flat().map((function(e){return e.Name})).filter((function(e){return!!e})),e.next=20,ra(d,i);case 20:f=e.sent,p=new Map,h=new Map,u.forEach((function(e,t){var n=1e3*t;e.forEach((function(e){e.Id<0&&(e.Id-=n,e.Name="".concat(Qn).concat(e.Id)),e.Father<0&&(e.Father-=n,p.set(e.Id,e.Father)),e.Mother<0&&(e.Mother-=n,h.set(e.Id,e.Mother))}))})),f.forEach((function(e){var t=p.get(e.Id);t&&(e.Father=t);var n=h.get(e.Id);n&&(e.Mother=n)})),o.push.apply(o,Object(M.a)(f)),j=u.flat().filter((function(e){return e.Id<0})),o.push.apply(o,Object(M.a)(j)),b=5,O=[t],v=0;case 31:if(!(O.length>0&&v<=b)){e.next=42;break}return e.next=34,ra(O,i);case 34:w=e.sent,o.push.apply(o,Object(M.a)(w)),x=w.flatMap((function(e){return Object.values(e.Spouses||{})})),o.push.apply(o,Object(M.a)(x)),O=w.flatMap((function(e){return Object.values(e.Children||{}).map((function(e){return e.Name}))})),v++,e.next=31;break;case 42:return _=new Map,k=new Map,E=new Map,R=new Map,D=new Map,y=new Map,o.forEach((function(e){if(D.set(e.Id,e.Name),e.Mother||e.Father){var t=sa(e.Mother,e.Father);va(k,e.Mother).add(t),va(k,e.Father).add(t),va(E,t).add(e.Id),R.set(t,{wife:e.Mother||void 0,husband:e.Father||void 0})}})),I=[],T=new Set,o.forEach((function(e){var t;if(!T.has(e.Id)){T.add(e.Id);var a=la(e,n);(null===(t=e.PhotoData)||void 0===t?void 0:t.path)&&y.set(e.Name,"https://www.wikitree.com".concat(e.PhotoData.path)),_.set(e.Name,da(e)),e.Spouses&&Object.values(e.Spouses).forEach((function(t){var n=sa(e.Id,t.Id);va(k,e.Id).add(n),va(k,t.Id).add(n);var a="Male"===e.Gender?{wife:t.Id,husband:e.Id,spouse:t}:{wife:e.Id,husband:t.Id,spouse:t};R.set(n,a)})),a.fams=Array.from(va(k,e.Id)),I.push(a)}})),N=Array.from(R.entries()).map((function(e){var t=Object(g.a)(e,2),n=t[0],a=t[1],r={id:n},i=a.wife&&D.get(a.wife);i&&(r.wife=i);var o=a.husband&&D.get(a.husband);if(o&&(r.husb=o),r.children=Array.from(va(E,n)).map((function(e){return D.get(e)})),a.spouse&&(a.spouse.marriage_date&&"0000-00-00"!==a.spouse.marriage_date||a.spouse.marriage_location)){var c=ma(a.spouse.marriage_date);r.marriage=Object.assign({},c,{place:a.spouse.marriage_location})}return r})),C=oe({indis:I,fams:N}),S=Oa(C,y,_),e.abrupt("return",{chartData:C,gedcom:S});case 56:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function sa(e,t){return t>e?"".concat(e,"_").concat(t):"".concat(t,"_").concat(e)}function la(e,t){var n={id:e.Name};if(e.Name.startsWith(Qn)&&(n.hideId=!0,n.firstName=t.formatMessage({id:"wikitree.private",defaultMessage:"Private"})),e.FirstName&&"Unknown"!==e.FirstName?n.firstName=e.FirstName:e.RealName&&"Unknown"!==e.RealName&&(n.firstName=e.RealName),"Unknown"!==e.LastNameAtBirth&&(n.lastName=e.LastNameAtBirth),(e.Mother||e.Father)&&(n.famc=sa(e.Mother,e.Father)),"Male"===e.Gender?n.sex="M":"Female"===e.Gender&&(n.sex="F"),e.BirthDate&&"0000-00-00"!==e.BirthDate||e.BirthLocation||"unknown"!==e.BirthDateDecade){var a=ma(e.BirthDate,e.DataStatus&&e.DataStatus.BirthDate||void 0)||fa(e.BirthDateDecade);n.birth=Object.assign({},a,{place:e.BirthLocation})}if(e.DeathDate&&"0000-00-00"!==e.DeathDate||e.DeathLocation||"unknown"!==e.DeathDateDecade){var r=ma(e.DeathDate,e.DataStatus&&e.DataStatus.DeathDate||void 0)||fa(e.DeathDateDecade);n.death=Object.assign({},r,{place:e.DeathLocation})}return e.PhotoData&&(n.images=[{url:"https://www.wikitree.com".concat(e.PhotoData.url),title:e.Photo}]),n}function ua(e){if(e.Spouses&&"Unknown"!==e.LastNameCurrent&&e.LastNameCurrent!==e.LastNameAtBirth){var t=e.LastNameCurrent.split(/[- ,]/);return Object.entries(e.Spouses).flatMap((function(e){return Object(g.a)(e,2)[1].LastNameAtBirth.split(/[- ,]/)})).some((function(e){return t.some((function(t){return n=e,a=t,Zn.StringUtils.compareSimilarityPercent(n,a)>=75;var n,a}))}))?e.LastNameCurrent:void 0}}function da(e){return{birth:"Unknown"!==e.LastNameAtBirth?e.LastNameAtBirth:void 0,married:ua(e),aka:"Unknown"!==e.LastNameOther&&e.LastNameAtBirth!==e.LastNameOther&&e.LastNameCurrent!==e.LastNameOther?e.LastNameOther:void 0}}function ma(e,t){if(e){var n=e.match(/(\d\d\d\d)-(\d\d)-(\d\d)/);if(!n)return{date:{text:e}};var a={};return"0000"!==n[1]&&(a.year=~~n[1]),"00"!==n[2]&&(a.month=~~n[2]),"00"!==n[3]&&(a.day=~~n[3]),"after"===t?{dateRange:{from:a}}:"before"===t?{dateRange:{to:a}}:("guess"===t&&(a.qualifier="abt"),{date:a})}}function fa(e){return"unknown"!==e?{date:{text:e}}:void 0}var ga=new Map([[1,"JAN"],[2,"FEB"],[3,"MAR"],[4,"APR"],[5,"MAY"],[6,"JUN"],[7,"JUL"],[8,"AUG"],[9,"SEP"],[10,"OCT"],[11,"NOV"],[12,"DEC"]]);function pa(e){return[e.qualifier,e.day,ga.get(e.month),e.year].filter((function(e){return void 0!==e})).join(" ")}function ha(e,t,n){return{level:1,pointer:"",tag:"NAME",data:"".concat(t||""," /").concat(n||"","/"),tree:[{level:2,pointer:"",tag:"TYPE",data:e,tree:[]}]}}function ja(e){var t,n=[];return K(e)&&n.push({level:2,pointer:"",tag:"DATE",data:(t=e,t.date?pa(t.date):t.dateRange?t.dateRange.from&&t.dateRange.to?"BET ".concat(pa(t.dateRange.from)," AND ").concat(t.dateRange.to):t.dateRange.from?"AFT ".concat(pa(t.dateRange.from)):t.dateRange.to?"BEF ".concat(pa(t.dateRange.to)):"":""),tree:[]}),e.place&&n.push({level:2,pointer:"",tag:"PLAC",data:e.place,tree:[]}),n}function ba(e,t){var n,a;return[{level:2,pointer:"",tag:"FILE",data:t||e.url,tree:[{level:3,pointer:"",tag:"FORM",data:(null===(n=e.title)||void 0===n?void 0:n.split(".").pop())||"",tree:[]},{level:3,pointer:"",tag:"TITL",data:(null===(a=e.title)||void 0===a?void 0:a.split(".")[0])||"",tree:[]}]}]}function Oa(e,t,n){var a={},r={};return e.indis.forEach((function(e){a[e.id]=function(e,t,n){var a=e.id.replace(/ /g,"_"),r={level:0,pointer:"@".concat(e.id,"@"),tag:"INDI",data:"",tree:[]};return n.birth&&r.tree.push(ha("birth",e.firstName,n.birth)),n.married&&r.tree.push(ha("married",e.firstName,n.married)),n.aka&&r.tree.push(ha("aka",e.firstName,n.aka)),e.birth&&r.tree.push({level:1,pointer:"",tag:"BIRT",data:"",tree:ja(e.birth)}),e.death&&r.tree.push({level:1,pointer:"",tag:"DEAT",data:"",tree:ja(e.death)}),e.famc&&r.tree.push({level:1,pointer:"",tag:"FAMC",data:"@".concat(e.famc,"@"),tree:[]}),(e.fams||[]).forEach((function(e){return r.tree.push({level:1,pointer:"",tag:"FAMS",data:"@".concat(e,"@"),tree:[]})})),e.id.startsWith("~")||r.tree.push({level:1,pointer:"",tag:"WWW",data:"https://www.wikitree.com/wiki/".concat(a),tree:[]}),(e.images||[]).forEach((function(n){r.tree.push({level:1,pointer:"",tag:"OBJE",data:"",tree:ba(n,t.get(e.id))})})),r}(e,t,n.get(e.id)||{})})),e.fams.forEach((function(e){r[e.id]=function(e){var t={level:0,pointer:"@".concat(e.id,"@"),tag:"FAM",data:"",tree:[]};return e.wife&&t.tree.push({level:1,pointer:"",tag:"WIFE",data:"@".concat(e.wife,"@"),tree:[]}),e.husb&&t.tree.push({level:1,pointer:"",tag:"HUSB",data:"@".concat(e.husb,"@"),tree:[]}),(e.children||[]).forEach((function(e){return t.tree.push({level:1,pointer:e,tag:"CHILD",data:"",tree:[]})})),e.marriage&&t.tree.push({level:1,pointer:"",tag:"MARR",data:"",tree:ja(e.marriage)}),t}(e)})),{head:{level:0,pointer:"",tag:"HEAD",data:"",tree:[]},indis:a,fams:r,other:{}}}function va(e,t){var n=e.get(t);if(n)return n;var a=new Set;return e.set(t,a),a}var wa,xa=function(){function e(t){Object(A.a)(this,e),this.intl=t}return Object(et.a)(e,[{key:"isNewData",value:function(e,t,n){var a;return!!e.selection&&((null===(a=t.selection)||void 0===a?void 0:a.id)!==e.selection.id&&(!n||!n.chartData.indis.some((function(t){var n;return t.id===(null===(n=e.selection)||void 0===n?void 0:n.id)}))))}},{key:"loadData",value:function(){var e=Object(f.a)(m.a.mark((function e(t){var n;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t.selection){e.next=2;break}throw new G("WIKITREE_ID_NOT_PROVIDED","WikiTree id needs to be provided");case 2:return e.prev=2,e.next=5,oa(t.selection.id,this.intl,t.spec.authcode);case 5:return n=e.sent,h("wikitree_loaded"),e.abrupt("return",n);case 10:throw e.prev=10,e.t0=e.catch(2),h("wikitree_error"),e.t0;case 14:case"end":return e.stop()}}),e,this,[[2,10]])})));return function(t){return e.apply(this,arguments)}}()}]),e}();function _a(e){return Object(R.jsxs)(Be.a,{negative:!0,className:"error",children:[Object(R.jsx)(Be.a.Header,{children:Object(R.jsx)(E.a,{id:"error.failed_to_load_file",defaultMessage:"Failed to load file"})}),Object(R.jsx)("p",{children:e.message})]})}function ka(e){return Object(R.jsx)(kt.a,{open:e.open,onClose:e.onDismiss,children:Object(R.jsxs)(Be.a,{negative:!0,className:"errorPopup",onDismiss:e.onDismiss,children:[Object(R.jsx)(Be.a.Header,{children:Object(R.jsx)(E.a,{id:"error.error",defaultMessage:"Error"})}),Object(R.jsx)("p",{children:e.message})]})})}function Ea(e){var t=p.parse(e.search),n=function(e){var n=t[e];return"string"===typeof n?n:void 0},a=n("view"),r=new Map([["relatives",jn.Relatives],["fancy",jn.Fancy]]),i=n("file"),o=n("url"),c="true"===n("embedded"),s=void 0;"wikitree"===n("source")?s={source:j.WIKITREE,authcode:n("authcode")}:i?s={source:j.UPLOADED,hash:i,gedcom:e.state&&e.state.data,images:e.state&&e.state.images}:o?s={source:j.GEDCOM_URL,url:o,handleCors:"false"!==n("handleCors")}:c&&(s={source:j.EMBEDDED});var l=n("indi"),u=Number(n("gen"));return{sourceSpec:s,selection:l?{id:l,generation:isNaN(u)?0:u}:void 0,chartType:r.get(a)||jn.Hourglass,showSidePanel:"false"!==n("sidePanel"),standalone:"false"!==n("standalone")&&!c,showWikiTreeMenus:"false"!==n("showWikiTreeMenus"),freezeAnimation:"true"===n("freeze"),config:pn(t)}}!function(e){e[e.INITIAL=0]="INITIAL",e[e.LOADING=1]="LOADING",e[e.ERROR=2]="ERROR",e[e.SHOWING_CHART=3]="SHOWING_CHART",e[e.LOADING_MORE=4]="LOADING_MORE"}(wa||(wa={}));var Ra=n(281),Da=n(478),ya=(n(444),n(445),n(446),{cs:i,de:o,fr:c,it:s,pl:l,ru:u}),Ia=navigator.language&&navigator.language.split(/[-_]/)[0],Ta=Object(Ra.a)();Ta&&"ie"===Ta.name?r.render(Object(R.jsx)("p",{children:"Topola Genealogy Viewer does not support Internet Explorer. Please try a different (modern) browser."}),document.querySelector("#root")):r.render(Object(R.jsx)(Da.a,{locale:Ia,messages:ya[Ia],children:Object(R.jsxs)(Ot,{children:[Object(R.jsx)("style",{children:jt}),Object(R.jsx)(ve.a,{children:Object(R.jsx)(Oe.b,{component:function(){var e=Object(a.useState)(wa.INITIAL),t=Object(g.a)(e,2),n=t[0],r=t[1],i=Object(a.useState)(),o=Object(g.a)(i,2),c=o[0],s=o[1],l=Object(a.useState)(),u=Object(g.a)(l,2),d=u[0],b=u[1],O=Object(a.useState)(),v=Object(g.a)(O,2),w=v[0],x=v[1],_=Object(a.useState)(!1),k=Object(g.a)(_,2),E=k[0],D=k[1],y=Object(a.useState)(!0),I=Object(g.a)(y,2),T=I[0],M=I[1],C=Object(a.useState)(!0),S=Object(g.a)(C,2),L=S[0],A=S[1],P=Object(a.useState)(jn.Hourglass),z=Object(g.a)(P,2),W=z[0],G=z[1],F=Object(a.useState)(!1),B=Object(g.a)(F,2),U=B[0],H=B[1],V=Object(a.useState)(),Y=Object(g.a)(V,2),q=Y[0],K=Y[1],J=Object(a.useState)(!1),Z=Object(g.a)(J,2),X=Z[0],$=Z[1],ee=Object(a.useState)(sn),te=Object(g.a)(ee,2),ne=te[0],ae=te[1],re=Object(be.a)(),ie=Object(Oe.g)(),oe=Object(Oe.h)();function ce(e){d&&d.id===e.id&&d.generation===e.generation||b(e)}function se(e,t){if(void 0!==t){var n=e.id===rn.HIDE,a=e.sex===on.HIDE;Q(t.chartData).forEach((function(e){e.hideId=n,e.hideSex=a}))}}var le=new st,ue=new lt,de=new xa(re),me=new ut;function fe(e,t){if(!q||q.source!==e.source)return!0;var n={spec:e,selection:t},a={spec:q,selection:d};switch(n.spec.source){case j.UPLOADED:return le.isNewData(n,a,c);case j.GEDCOM_URL:return ue.isNewData(n,a,c);case j.WIKITREE:return de.isNewData(n,a,c);case j.EMBEDDED:return me.isNewData(n,a,c)}}function ge(e,t){switch(e.source){case j.UPLOADED:return le.loadData({spec:e,selection:t});case j.GEDCOM_URL:return ue.loadData({spec:e,selection:t});case j.WIKITREE:return de.loadData({spec:e,selection:t});case j.EMBEDDED:return me.loadData({spec:e,selection:t})}}function pe(e){var t=p.parse(oe.search);for(var n in e)t[n]=e[n];oe.search=p.stringify(t),ie.push(oe)}function he(e){e.id.startsWith(Qn)||(h("selection_changed"),pe({indi:e.id,gen:e.generation}))}function je(){h("print"),Pn()}function ve(e){H(!0),x(e)}function we(){return xe.apply(this,arguments)}function xe(){return(xe=Object(f.a)(m.a.mark((function e(){return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return h("download_pdf"),e.prev=1,e.next=4,Un();case 4:e.next=9;break;case 6:e.prev=6,e.t0=e.catch(1),ve(re.formatMessage({id:"error.failed_pdf",defaultMessage:"Failed to generate PDF file. Please try with a smaller diagram or download an SVG file."}));case 9:case"end":return e.stop()}}),e,null,[[1,6]])})))).apply(this,arguments)}function _e(){return ke.apply(this,arguments)}function ke(){return(ke=Object(f.a)(m.a.mark((function e(){return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return h("download_png"),e.prev=1,e.next=4,Fn();case 4:e.next=9;break;case 6:e.prev=6,e.t0=e.catch(1),ve(re.formatMessage({id:"error.failed_png",defaultMessage:"Failed to generate PNG file. Please try with a smaller diagram or download an SVG file."}));case 9:case"end":return e.stop()}}),e,null,[[1,6]])})))).apply(this,arguments)}function Ee(){h("download_svg"),function(){zn.apply(this,arguments)}()}function Re(){H(!1)}return Object(a.useEffect)((function(){Object(f.a)(m.a.mark((function e(){var t,a,i,o,c,l;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("/view"===oe.pathname){e.next=3;break}return n!==wa.INITIAL&&r(wa.INITIAL),e.abrupt("return");case 3:if((t=Ea(oe)).sourceSpec){e.next=7;break}return ie.replace({pathname:"/"}),e.abrupt("return");case 7:if(n!==wa.INITIAL&&!fe(t.sourceSpec,t.selection)){e.next=31;break}return r(wa.LOADING),K(t.sourceSpec),b(t.selection),M(t.standalone),A(t.showWikiTreeMenus),G(t.chartType),$(t.freezeAnimation),ae(t.config),e.prev=16,e.next=19,ge(t.sourceSpec,t.selection);case 19:a=e.sent,s(a),se(t.config,a),D(t.showSidePanel),r(wa.SHOWING_CHART),e.next=29;break;case 26:e.prev=26,e.t0=e.catch(16),u=dt(e.t0,re),x(u),r(wa.ERROR);case 29:e.next=51;break;case 31:if(n!==wa.SHOWING_CHART&&n!==wa.LOADING_MORE){e.next=51;break}if(o=t.sourceSpec.source===j.WIKITREE&&(!d||d.id!==(null===(i=t.selection)||void 0===i?void 0:i.id)),G(t.chartType),r(o?wa.LOADING_MORE:wa.SHOWING_CHART),ce(t.selection),!o){e.next=51;break}return e.prev=37,e.next=40,oa(t.selection.id,re);case 40:c=e.sent,l=tt(c.chartData,t.selection),s(c),b(l),r(wa.SHOWING_CHART),e.next=51;break;case 47:e.prev=47,e.t1=e.catch(37),r(wa.SHOWING_CHART),ve(re.formatMessage({id:"error.failed_wikitree_load_more",defaultMessage:"Failed to load data from WikiTree. {error}"},{error:e.t1}));case 51:case"end":return e.stop()}var u}),e,null,[[16,26],[37,47]])})))()})),Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(Oe.b,{render:function(){return Object(R.jsx)(nn,{data:null===c||void 0===c?void 0:c.chartData,allowAllRelativesChart:(null===q||void 0===q?void 0:q.source)!==j.WIKITREE,showingChart:"/view"===ie.location.pathname&&(n===wa.SHOWING_CHART||n===wa.LOADING_MORE),standalone:T,eventHandlers:{onSelection:he,onPrint:je,onDownloadPdf:we,onDownloadPng:_e,onDownloadSvg:Ee},showWikiTreeMenus:(null===q||void 0===q?void 0:q.source)===j.WIKITREE&&L})}}),Object(R.jsxs)(Oe.d,{children:[Object(R.jsx)(Oe.b,{exact:!0,path:"/",component:xt}),Object(R.jsx)(Oe.b,{exact:!0,path:"/view",render:function(){switch(n){case wa.SHOWING_CHART:case wa.LOADING_MORE:var e=tt(c.chartData,d),t=[{menuItem:re.formatMessage({id:"tab.info",defaultMessage:"Info"}),render:function(){return Object(R.jsx)($e,{gedcom:c.gedcom,indi:e.id})}},{menuItem:re.formatMessage({id:"tab.settings",defaultMessage:"Settings"}),render:function(){return Object(R.jsx)(hn,{config:ne,onChange:function(e){ae(e),se(e,c),pe(function(e){return{c:un.get(e.color),i:mn.get(e.id),s:gn.get(e.sex)}}(e))}})}}];return Object(R.jsxs)("div",{id:"content",children:[Object(R.jsx)(ka,{open:U,message:w,onDismiss:Re}),n===wa.LOADING_MORE?Object(R.jsx)(Et.a,{active:!0,size:"small",className:"loading-more"}):null,Object(R.jsx)(Jn,{data:c.chartData,selection:e,chartType:W,onSelection:he,freezeAnimation:X,colors:ne.color,hideIds:ne.id,hideSex:ne.sex}),E?Object(R.jsx)(bt,{greaterThanOrEqual:"large",className:"sidePanel",children:Object(R.jsx)(Rt.a,{panes:t})}):null,Object(R.jsx)(N,{})]});case wa.ERROR:return Object(R.jsx)(_a,{message:w});case wa.INITIAL:case wa.LOADING:return Object(R.jsx)(Et.a,{active:!0,size:"large"})}}}),Object(R.jsx)(Oe.a,{to:"/"})]})]})}})})]})}),document.querySelector("#root"))}},[[447,1,2]]]); -//# sourceMappingURL=main.70be27a1.chunk.js.map \ No newline at end of file +(this["webpackJsonptopola-viewer"]=this["webpackJsonptopola-viewer"]||[]).push([[0],{265:function(e){e.exports=JSON.parse('{"menu.open":"Otev\u0159\xedt","menu.open_file":"Otev\u0159\xedt soubor","menu.load_from_url":"Otev\u0159\xedt z URL","menu.select_wikitree_id":"Vybrat WikiTree ID","menu.print":"Tiskni","menu.download":"St\xe1hnout","menu.pdf_file":"Soubor PDF","menu.png_file":"Soubor PNG","menu.svg_file":"Soubor SVG","menu.download_pdf":"St\xe1hnout PDF","menu.download_png":"St\xe1hnout PNG","menu.download_svg":"St\xe1hnout SVG","menu.view":"Zobrazen\xed","menu.hourglass":"P\u0159es\xfdpac\xed hodiny","menu.relatives":"V\u0161ichni p\u0159\xedbuzn\xed","menu.fancy":"Rodinn\xfd strom (experiment\xe1ln\xed)","menu.wikitree_login":"P\u0159ihl\xe1\u0161en\xed na WikiTree","menu.wikitree_logged_in":"P\u0159ihl\xe1\u0161eno","menu.wikitree_popup_username":"P\u0159ihl\xe1\u0161eno do WikiTree jako {username}","menu.wikitree_popup":"P\u0159ihl\xe1\u0161eno do WikiTree","menu.github":"GitHub projekt","menu.search.placeholder":"Hledej osobu","menu.search.no_results":"\u017d\xe1dn\xe9 v\xfdsledky","intro.title":"Topola Genealogy","intro.description":"Topola Genealogy v\xe1m umo\u017e\u0148uje interaktivn\xed prohl\xed\u017een\xed rodokmenu.","intro.instructions":"Kliknut\xedm na OTEV\u0158\xcdT SOUBOR nebo OTEV\u0158\xcdT Z URL na\u010dt\u011bte soubor GEDCOM. V\u011bt\u0161ina genealogick\xfdch program\u016f m\xe1 funkci exportu do form\xe1tu GEDCOM.","intro.examples":"N\xed\u017ee je uvedeno n\u011bkolik p\u0159\xedklad\u016f pou\u017eit\xed z internetu:","intro.from":"zdroj:","intro.privacy":"Soukrom\xed","intro.privacy_note":"Pomoc\xed funkce \\"Otev\u0159\xedt soubor\\" nejsou va\u0161e data nikam odes\xedl\xe1na a z\u016fst\xe1vaj\xed ve va\u0161em po\u010d\xedta\u010di. P\u0159i pou\u017eit\xed funkce \\"Otev\u0159\xedt z URL\\" jsou data z dan\xe9 adresy odesl\xe1na slu\u017ebou {link}, aby bylo mo\u017en\xe9 data na\u010d\xedst (CORS).","load_from_url.title":"Otev\u0159\xedt z adresy URL","load_from_url.comment":"Data z dan\xe9 adresy URL budou na\u010dteny prost\u0159ednictv\xedm slu\u017eby {link}, aby nedoch\xe1zelo k probl\xe9m\u016fm s CORS.","load_from_url.cancel":"Zru\u0161it","load_from_url.load":"Otev\u0159\xedt","select_wikitree_id.title":"Zadejte WikiTree ID","select_wikitree_id.comment":"Zadejte ID profilu {wikiTreeLink}. P\u0159\xedklad: {example1}, {example2}","select_wikitree_id.cancel":"Zru\u0161it","select_wikitree_id.load":"Otev\u0159\xedt","gedcom.BAPM":"K\u0159est","gedcom.BIRT":"Narozen\xed","gedcom.BURI":"Poh\u0159eb","gedcom.CENS":"S\u010d\xedt\xe1n\xed lidu","gedcom.CHR":"K\u0159est","gedcom.DEAT":"\xdamrt\xed","gedcom.DSCR":"Opis","gedcom.EDUC":"Vzd\u011bl\xe1n\xed","gedcom.EMAIL":"E-mail","gedcom.EVEN":"Ud\xe1lost","gedcom.FACT":"Skute\u010dnost","gedcom.MILT":"Vojensk\xe1 slu\u017eba","gedcom.OCCU":"Povol\xe1n\xed","gedcom.RIN":"ID","gedcom.TITL":"Titul","gedcom.WWW":"Str\xe1nka WWW","gedcom.RELI":"Vyzn\xe1n\xed","gedcom._UPD":"Posledn\xed aktualizace","gedcom.birth":"Rodinn\xe9 jm\xe9no","gedcom.married":"Man\u017eelsk\xe9 jm\xe9no","gedcom.maiden":"Jm\xe9no za svobodna","gedcom.aka":"Tak\xe9 zn\xe1m(a) jako","date.abt":"kolem","date.cal":"spo\u010dteno","date.est":"asi","date.between":"mezi {from} a {to}","date.after":"po {from}","date.before":"p\u0159ed {to}","error.error":"Chyba","error.failed_pdf":"Soubor PDF nelze vytvo\u0159it. Zkuste to znovu s men\u0161\xedm diagramem nebo st\xe1hn\u011bte soubor SVG.","error.failed_png":"Soubor PNG nelze vytvo\u0159it. Zkuste to znovu s men\u0161\xedm diagramem nebo st\xe1hn\u011bte soubor SVG.","error.failed_to_load_file":"Chyba p\u0159i na\u010d\xedt\xe1n\xed souboru","error.failed_wikitree_load_more":"Chyba p\u0159i na\u010d\xedt\xe1n\xed dat z WikiTree. {chyba}","error.GEDCOM_READ_FAILED":"Chyba p\u0159i na\u010d\xedt\xe1n\xed souboru GEDCOM","error.ERROR_LOADING_UPLOADED_FILE":"Chyba p\u0159i na\u010d\xedt\xe1n\xed dat. Znovu otev\u0159ete soubor.","error.WIKITREE_ID_NOT_PROVIDED":"WikiTree ID nebylo z\xedsk\xe1no","error.WIKITREE_PROFILE_NOT_ACCESSIBLE":"Profil WikiTree {id} nen\xed k dispozici","error.WIKITREE_PROFILE_NOT_FOUND":"Profil WikiTree {id} neexistuje","wikitree.private":"Soukrom\xe9"}')},266:function(e){e.exports=JSON.parse('{"menu.open":"\xd6ffnen","menu.open_file":"Datei \xf6ffnen","menu.load_from_url":"URL \xf6ffnen","menu.select_wikitree_id":"WikiTree ID ausw\xe4hlen","menu.print":"Print","menu.download":"Download","menu.pdf_file":"PDF-Datei","menu.png_file":"PNG-Datei","menu.svg_file":"SVG-Datei","menu.download_pdf":"PDF herunterladen","menu.download_png":"PNG herunterladen","menu.download_svg":"SVG herunterladen","menu.view":"View","menu.hourglass":"Sanduhrkarte","menu.relatives":"Alle Verwandten","menu.fancy":"Zierbaum (experimentell)","menu.wikitree_login":"Bei WikiTree anmelden","menu.wikitree_logged_in":"Eingeloggt","menu.wikitree_popup_username":"Bei WikiTree als {username} angemeldet","menu.wikitree_popup":"Bei WikiTree angemeldet","menu.github":"Projekt auf der GitHub-Website","menu.search.placeholder":"Person suchen","menu.search.no_results":"Keine Ergebnisse","intro.title":"Topola Genealogie","intro.description":"Mit der Topola Genealogie k\xf6nnen Sie den Stammbaum auf interaktive Weise durchsuchen.","intro.instructions":"Klicken Sie auf Datei \xf6ffnen oder URL \xf6ffnen, um eine GEDCOM-Datei zu laden. Die meisten Genealogie-Programme verf\xfcgen \xfcber eine GEDCOM-Exportfunktion.","intro.examples":"Nachfolgend einige Beispiele aus dem Internet:","intro.from":"source:","intro.privacy":"Datenschutz","intro.privacy_note":"Bei Verwendung der Funktion \\"Datei \xf6ffnen\\" werden Ihre Daten nirgendwo gesendet und verbleiben auf Ihrem Computer. Bei Verwendung der Funktion \\"URL \xf6ffnen\\" werden Daten von der angegebenen Adresse vom Dienst {link} an gesendet Erm\xf6glichen des Ladens von Daten aus einer anderen Dom\xe4ne (CORS).","load_from_url.title":"Von URL \xf6ffnen","load_from_url.comment":"Die Daten der angegebenen URL werden \xfcber den {link} -Dienst geladen, um CORS-Probleme zu vermeiden.","load_from_url.cancel":"Cancel","load_from_url.load":"\xd6ffnen","select_wikitree_id.title":"WikiTree ID eingeben","select_wikitree_id.comment":"Geben Sie die Profil-ID {wikiTreeLink} ein. Beispiele: {example1}, {example2}","select_wikitree_id.cancel":"Cancel","select_wikitree_id.load":"Open","gedcom.BAPM":"Taufe","gedcom.BIRT":"Geburt","gedcom.BURI":"Beerdigung","gedcom.CENS":"Volksz\xe4hlung","gedcom.CHR":"Taufe","gedcom.DEAT":"Tod","gedcom.DSCR":"Beschreibung","gedcom.EMAIL":"E-Mail","gedcom.EVEN":"Ereignis","gedcom.OCCU":"Beruf","gedcom.RIN":"ID","gedcom.TITL":"Titel","gedcom.WWW":"Website","gedcom._UPD":"Zuletzt aktualisiert","gedcom.birth":"Geburtsname","gedcom.married":"Ehenamen","gedcom.maiden":"M\xe4dchenname","gedcom.aka":"Auch bekannt als","date.abt":"about","date.cal":"berechnet","date.est":"gesch\xe4tzt","date.between":"zwischen {from} und {to}","date.after":"after {from}","date.before":"before {to}","error.error":"Error","error.failed_pdf":"PDF konnte nicht erstellt werden. Versuchen Sie es erneut mit einem kleineren Diagramm oder laden Sie die SVG-Datei herunter.","error.failed_png":"Fehler beim Erstellen der PNG-Datei. Versuchen Sie es erneut mit einem kleineren Diagramm oder laden Sie die SVG-Datei herunter.","error.failed_to_load_file":"Fehler beim Laden der Datei","error.failed_wikitree_load_more":"Fehler beim Abrufen der Daten aus WikiTree. {error}","wikitree.private":"Privat"}')},267:function(e){e.exports=JSON.parse('{"menu.open":"Ouvrir","menu.open_file":"Ouvrir le fichier","menu.load_from_url":"Ouvrir l\'URL","menu.select_wikitree_id":"S\xe9lectionnez l\'ID WikiTree","menu.print":"Imprimer","menu.download":"T\xe9l\xe9charger","menu.pdf_file":"Fichier PDF","menu.png_file":"Fichier PNG","menu.svg_file":"Fichier SVG","menu.download_pdf":"T\xe9l\xe9charger le PDF","menu.download_png":"T\xe9l\xe9charger PNG","menu.download_svg":"T\xe9l\xe9charger SVG","menu.view":"Afficher","menu.hourglass":"Graphique en sablier","menu.relatives":"Tous les parents","menu.fancy":"Arbre ornemental (exp\xe9rimental)","menu.wikitree_login":"Connectez-vous \xe0 WikiTree","menu.wikitree_logged_in":"Connect\xe9","menu.wikitree_popup_username":"Connect\xe9 \xe0 WikiTree en tant que {username}","menu.wikitree_popup":"Connect\xe9 \xe0 WikiTree","menu.github":"Projet sur le site Web GitHub","menu.search.placeholder":"Rechercher une personne","menu.search.no_results":"Aucun r\xe9sultat","intro.title":"Topola G\xe9n\xe9alogie","intro.description":"La Topola G\xe9n\xe9alogie vous permet de parcourir l\'arbre g\xe9n\xe9alogique de mani\xe8re interactive.","intro.instructions":"Cliquez sur OPEN FILE ou OPEN URL pour charger un fichier GEDCOM. La plupart des logiciels de g\xe9n\xe9alogie ont une fonction d\'exportation GEDCOM.","intro.examples":"Voici quelques exemples trouv\xe9s sur Internet:","intro.from":"source:","intro.whats_new":"Quoi de neuf","intro.full_changelog":"Voir toutes les modifications","intro.privacy":"Confidentialit\xe9","intro.privacy_note":"Lorsque vous utilisez la fonction \\"Ouvrir un fichier\\", vos donn\xe9es ne sont envoy\xe9es nulle part et restent sur votre ordinateur. Lorsque vous utilisez la fonction \\"Ouvrir l\'URL\\", les donn\xe9es de l\'adresse indiqu\xe9e sont envoy\xe9es par le service {link} pour permettre le chargement des donn\xe9es depuis un autre domaine (CORS).","load_from_url.title":"Ouvrir depuis l\'URL","load_from_url.comment":"Les donn\xe9es de l\'URL donn\xe9e seront charg\xe9es via le service {link} pour \xe9viter les probl\xe8mes CORS.","load_from_url.cancel":"Annuler","load_from_url.load":"Ouvrir","select_wikitree_id.title":"Entrez l\'ID de WikiTree","select_wikitree_id.comment":"Entrez l\'ID de profil {wikiTreeLink}. Exemples: {example1}, {example2}","select_wikitree_id.cancel":"Annuler","select_wikitree_id.load":"Ouvrir","gedcom.ADOP":"Adoption","gedcom.BAPM":"Bapt\xeame","gedcom.BIRT":"Naissance","gedcom.BURI":"Fun\xe9railles","gedcom.CENS":"Recensement","gedcom.CHR":"Bapt\xeame","gedcom.CREM":"Cr\xe9mation","gedcom.DEAT":"Mort","gedcom.DSCR":"Description","gedcom.EDUC":"\xc9tudes","gedcom.EMAIL":"E-mail","gedcom.EMIG":"\xc9migration","gedcom.EVEN":"\xc9v\xe9nement","gedcom.FACT":"Fait","gedcom.IMMI":"Immigration","gedcom.MILT":"Service militaire","gedcom.NATU":"Naturalisation","gedcom.OCCU":"Profession","gedcom.RIN":"ID","gedcom.TITL":"Titre","gedcom.WWW":"Site Web","gedcom._UPD":"Derni\xe8re mise \xe0 jour","gedcom.MARR":"Mariage","gedcom.DIV":"Divorce","gedcom.birth":"Nom de naissance","gedcom.married":"Nom marital","gedcom.maiden":"Nom de jeune fille","gedcom.immigrant":"Nom d\'immigrant","gedcom.aka":"Alias","date.abt":"environ","date.cal":"calcul\xe9","date.est":"estim\xe9","date.between":"entre {from} et {to}","date.after":"apr\xe8s {from}","date.before":"avant {to}","error.error":"Erreur","age.exact":"{qualifier}{age, plural, =0 {Moins d\'1 an} one {1 an} other {# ans}}","age.less":"Moins de {age, plural, =0 {1 an} one {1 an} other {# ans}}","age.more":"Plus de {age, plural, =0 {0 an} one {1 an} other {# ans}}","age.between":"Entre {ageFrom} et {ageTo, plural, =0 {0 an} one {1 an} other {# ans}}","error.failed_pdf":"\xc9chec de la cr\xe9ation du PDF. R\xe9essayez avec un diagramme plus petit ou t\xe9l\xe9chargez le fichier SVG.","error.failed_png":"Impossible de cr\xe9er le fichier PNG. R\xe9essayez avec un diagramme plus petit ou t\xe9l\xe9chargez le fichier SVG.","error.failed_to_load_file":"Erreur lors du chargement du fichier","error.failed_wikitree_load_more":"Erreur lors de l\'obtention des donn\xe9es de WikiTree. {error}","error.GEDCOM_READ_FAILED":"Erreur de lecture du fichier GEDCOM","error.ERROR_LOADING_UPLOADED_FILE":"Erreur de chargement des donn\xe9es. Renvoyez votre fichier.","error.WIKITREE_ID_NOT_PROVIDED":"L\'ID WikiTree est obligatoire","error.WIKITREE_PROFILE_NOT_ACCESSIBLE":"Le profil WikiTree ${id} n\'est pas accessible. Connectez-vous.","error.WIKITREE_PROFILE_NOT_FOUND":"Le profil WikiTree ${id} n\'a pas \xe9t\xe9 trouv\xe9","error.failed_to_load_image":"Erreur de chargement de l\'image","wikitree.private":"Priv\xe9","tab.info":"Info","tab.settings":"Param\xe8tres","config.colors":"Couleurs","config.colors.NO_COLOR":"aucune","config.colors.COLOR_BY_GENERATION":"par g\xe9n\xe9ration","config.colors.COLOR_BY_SEX":"par sexe","name.unknown_name":"?","whats_new.title":"Quoi de neuf dans cette version?"}')},268:function(e){e.exports=JSON.parse('{"menu.open":"Apri","menu.open_file":"Apri file","menu.load_from_url":"Apri URL","menu.select_wikitree_id":"Seleziona ID WikiTree","menu.print":"Stampa","menu.download":"Download","menu.pdf_file":"File PDF","menu.png_file":"File PNG","menu.svg_file":"File SVG","menu.download_pdf":"Scarica PDF","menu.download_png":"Scarica PNG","menu.download_svg":"Scarica SVG","menu.view":"Visualizza","menu.hourglass":"Grafico a clessidra","menu.relatives":"Tutti i parenti","menu.fancy":"Albero ornamentale (sperimentale)","menu.wikitree_login":"Accedi a WikiTree","menu.wikitree_logged_in":"Accesso effettuato","menu.wikitree_popup_username":"Accesso a WikiTree come {username}","menu.wikitree_popup":"Accesso a WikiTree","menu.github":"Progetto sul sito web GitHub","menu.search.placeholder":"Cerca persona","menu.search.no_results":"Nessun risultato","intro.title":"Topola Genealogy","intro.description":"Topola Genealogy ti consente di esplorare l\'albero genealogico in modo interattivo.","intro.instructions":"Fai clic su OPEN FILE o OPEN URL per caricare un file GEDCOM. La maggior parte dei software di genealogia ha una funzione di esportazione GEDCOM.","intro.examples":"Di seguito sono riportati alcuni esempi trovati su Internet:","intro.from":"source:","intro.privacy":"Privacy","intro.privacy_note":"Quando si utilizza la funzione \\"Apri file\\", i dati non vengono inviati da nessuna parte e rimangono sul computer. Quando si utilizza la funzione \\"Apri URL\\", i dati dall\'indirizzo specificato vengono inviati dal servizio {link} a consentire il caricamento dei dati da un altro dominio (CORS).","load_from_url.title":"Apri da URL","load_from_url.comment":"I dati dall\'URL specificato verranno caricati tramite il servizio {link} per evitare problemi CORS.","load_from_url.cancel":"Annulla","load_from_url.load":"Apri","select_wikitree_id.title":"Inserisci ID WikiTree","select_wikitree_id.comment":"Inserisci l\'ID profilo {wikiTreeLink}. Esempi: {example1}, {example2}","select_wikitree_id.cancel":"Annulla","select_wikitree_id.load":"Apri","gedcom.BAPM":"Battesimo","gedcom.BIRT":"Nascita","gedcom.BURI":"Funerale","gedcom.CENS":"Census","gedcom.CHR":"Battesimo","gedcom.DEAT":"Morte","gedcom.MARR":"Matrimonio","gedcom.DIV":"Divorzio","gedcom.DSCR":"Descrizione","gedcom.EMAIL":"E-mail","gedcom.EVEN":"Evento","gedcom.OCCU":"Professione","gedcom.RIN":"ID","gedcom.TITL":"Titolo","gedcom.WWW":"Sito web","gedcom._UPD":"Ultimo aggiornamento","gedcom.birth":"Nome alla nascita","gedcom.married":"Nome da coniugato/a","gedcom.maiden":"Nome da nubile","gedcom.aka":"Conosciuto anche come","date.abt":"circa","date.cal":"calcolato","date.est":"stimato","date.between":"tra il {from} e il {to}","date.after":"dopo il {from}","date.before":"prima del {to}","error.error":"Errore","error.failed_pdf":"Impossibile creare PDF. Riprova con un diagramma pi\xf9 piccolo o scarica il file SVG.","error.failed_png":"Impossibile creare il file PNG. Riprova con un diagramma pi\xf9 piccolo o scarica il file SVG.","error.failed_to_load_file":"Errore durante il caricamento del file","error.failed_wikitree_load_more":"Errore durante il recupero dei dati da WikiTree. {error}","wikitree.private":"Privato"}')},269:function(e){e.exports=JSON.parse('{"menu.open":"Otw\xf3rz","menu.open_file":"Otw\xf3rz plik","menu.load_from_url":"Otw\xf3rz URL","menu.select_wikitree_id":"Wybierz WikiTree ID","menu.print":"Drukuj","menu.download":"Pobierz","menu.pdf_file":"Plik PDF","menu.png_file":"Plik PNG","menu.svg_file":"Plik SVG","menu.download_pdf":"Pobierz PDF","menu.download_png":"Pobierz PNG","menu.download_svg":"Pobierz SVG","menu.view":"Widok","menu.hourglass":"Wykres klepsydrowy","menu.relatives":"Wszyscy krewni","menu.fancy":"Ozdobne drzewo (eksperymentalne)","menu.wikitree_login":"Zaloguj do WikiTree","menu.wikitree_logged_in":"Zalogowano","menu.wikitree_popup_username":"Zalogowano do WikiTree jako {username}","menu.wikitree_popup":"Zalogowano do WikiTree","menu.github":"Projekt na stronie GitHub","menu.search.placeholder":"Szukaj osoby","menu.search.no_results":"Brak wynik\xf3w","intro.title":"Topola Genealogy","intro.description":"Topola Genealogy pozwala przegl\u0105da\u0107 drzewo genealogiczne w interaktywny spos\xf3b.","intro.instructions":"Kliknij OTW\xd3RZ PLIK lub OTW\xd3RZ URL, aby za\u0142adowa\u0107 plik GEDCOM. Wi\u0119kszo\u015b\u0107 program\xf3w genealogicznych posiada funkcj\u0119 eksportu do pliku GEDCOM.","intro.examples":"Przyk\u0142ady","intro.from":"\u017ar\xf3d\u0142o:","intro.whats_new":"Co nowego?","intro.full_changelog":"Zobacz pe\u0142n\u0105 list\u0119 zmian","intro.privacy":"Prywatno\u015b\u0107","intro.privacy_note":"U\u017cywaj\u0105c funkcji \\"Otw\xf3rz plik\\", Twoje dane nie s\u0105 nigdzie wysy\u0142ane i pozostaj\u0105 na Twoim komputerze. U\u017cywaj\u0105c funkcji \\"Otw\xf3rz URL\\", dane z podanego adresu przesy\u0142ane s\u0105 przez us\u0142ug\u0119 {link} w celu umo\u017cliwienia za\u0142adowania danych z innej domeny (CORS).","load_from_url.title":"Otw\xf3rz z adresu URL","load_from_url.comment":"Dane z podanego adresu URL zostan\u0105 za\u0142adowane poprzez us\u0142ug\u0119 {link} w celu unikni\u0119cia problem\xf3w z CORS.","load_from_url.cancel":"Anuluj","load_from_url.load":"Otw\xf3rz","select_wikitree_id.title":"Podaj WikiTree ID","select_wikitree_id.comment":"Wpisz identyfikator profilu {wikiTreeLink}. Przyk\u0142ady: {example1}, {example2}","select_wikitree_id.cancel":"Anuluj","select_wikitree_id.load":"Otw\xf3rz","gedcom.BAPM":"Chrzest","gedcom.BIRT":"Narodziny","gedcom.BURI":"Pogrzeb","gedcom.CENS":"Spis ludno\u015bci","gedcom.CHR":"Chrzest","gedcom.DEAT":"\u015amier\u0107","gedcom.DSCR":"Opis","gedcom.EDUC":"Wykszta\u0142cenie","gedcom.EMAIL":"E-mail","gedcom.EVEN":"Wydarzenie","gedcom.FACT":"Fakt","gedcom.MILT":"S\u0142u\u017cba wojskowa","gedcom.OCCU":"Zaw\xf3d","gedcom.RIN":"ID","gedcom.TITL":"Tytu\u0142","gedcom.WWW":"Strona WWW","gedcom._UPD":"Ostatnia aktualizacja","gedcom.MARR":"Ma\u0142\u017ce\u0144stwo","gedcom.DIV":"Rozw\xf3d","gedcom.birth":"Nazwisko rodowe","gedcom.married":"Nazwisko po ma\u0142\u017ce\u0144stwie","gedcom.maiden":"Nazwisko panie\u0144skie","gedcom.immigrant":"Nazwisko po imigracji","gedcom.aka":"Alias","date.abt":"oko\u0142o","date.cal":"wyliczone","date.est":"oszacowane","date.between":"mi\u0119dzy {from} a {to}","date.after":"po {from}","date.before":"przed {to}","error.error":"B\u0142\u0105d","age.exact":"{age, plural, =0 {Mniej ni\u017c 1 rok} one {{qualifier} 1 rok} many {{qualifier} # lat} other {{qualifier} # lata}}","age.less":"Mniej ni\u017c {age, plural, =0 {1 rok} one {1 rok} many {# lat} other {# lata}}","age.more":"Wi\u0119cej ni\u017c {age, plural, =0 {0 lat} one {1 rok} many {# lat} other {# lata}}","age.between":"Mi\u0119dzy {ageFrom} a {ageTo, plural, =0 {0 lat} one {1 rok} many {# lat} other {# lata}}","error.failed_pdf":"Nie uda\u0142o si\u0119 utworzy\u0107 pliku PDF. Spr\xf3buj jeszcze raz z mniejszym diagramem lub pobierz plik SVG.","error.failed_png":"Nie uda\u0142o si\u0119 utworzy\u0107 pliku PNG. Spr\xf3buj jeszcze raz z mniejszym diagramem lub pobierz plik SVG.","error.failed_to_load_file":"B\u0142\u0105d wczytywania pliku","error.failed_wikitree_load_more":"B\u0142\u0105d podczas pobierania danych z WikiTree. {error}","error.GEDCOM_READ_FAILED":"B\u0142\u0105d wczytywania pliku GEDCOM","error.ERROR_LOADING_UPLOADED_FILE":"B\u0142\u0105d wczytywania danych. Otw\xf3rz ponownie plik.","error.WIKITREE_ID_NOT_PROVIDED":"Identyfikator WikiTree nie zosta\u0142 podany","error.WIKITREE_PROFILE_NOT_ACCESSIBLE":"Profil WikiTree {id} nie jest dost\u0119pny","error.WIKITREE_PROFILE_NOT_FOUND":"Profil WikiTree {id} nie istnieje","error.failed_to_load_image":"B\u0142\u0105d podczas pobierania pliku ze zdj\u0119ciem","wikitree.private":"Prywatne","tab.info":"Info","tab.settings":"Ustawienia","config.colors":"Kolory","config.colors.NO_COLOR":"brak","config.colors.COLOR_BY_GENERATION":"wed\u0142ug pokolenia","config.colors.COLOR_BY_SEX":"wed\u0142ug p\u0142ci","name.unknown_name":"N.N."}')},270:function(e){e.exports=JSON.parse('{"menu.open":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c","menu.open_file":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b","menu.load_from_url":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c URL","menu.select_wikitree_id":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 WikiTree ID","menu.print":"\u041f\u0435\u0447\u0430\u0442\u044c","menu.download":"\u0421\u043a\u0430\u0447\u0430\u0442\u044c","menu.pdf_file":"\u0424\u0430\u0439\u043b PDF","menu.png_file":"\u0424\u0430\u0439\u043b PNG","menu.svg_file":"\u0424\u0430\u0439\u043b SVG","menu.download_pdf":"\u0421\u043a\u0430\u0447\u0430\u0442\u044c PDF","menu.download_png":"\u0421\u043a\u0430\u0447\u0430\u0442\u044c PNG","menu.download_svg":"\u0421\u043a\u0430\u0447\u0430\u0442\u044c SVG","menu.view":"\u0412\u0438\u0434","menu.hourglass":"\u0413\u0440\u0430\u0444\u0438\u043a \u041f\u0435\u0441\u043e\u0447\u043d\u044b\u0435 \u0447\u0430\u0441\u044b","menu.relatives":"\u0412\u0441\u0435 \u0440\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\u0438","menu.fancy":"\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e (\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435))","menu.wikitree_login":"\u0412\u043e\u0439\u0442\u0438 \u0432 WikiTree","menu.wikitree_logged_in":"\u0412\u0445\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d","menu.wikitree_popup_username":"\u0412\u044b \u0432\u043e\u0448\u043b\u0438 \u0432 WikiTree \u043a\u0430\u043a {username}","menu.wikitree_popup":"\u0412\u044b \u0432\u043e\u0448\u043b\u0438 \u0432 WikiTree","menu.github":"\u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 GitHub","menu.search.placeholder":"\u0418\u0441\u043a\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430","menu.search.no_results":"\u041d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432","intro.title":"Topola Genealogy","intro.description":"Topola Genealogy \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0441\u0435\u043c\u0435\u0439\u043d\u043e\u0435 \u0434\u0440\u0435\u0432\u043e \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.","intro.instructions":"\u0429\u0435\u043b\u043a\u043d\u0438\u0442\u0435 \\"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b\\" \u0438\u043b\u0438 \\"\u041e\u0442\u043a\u0440\u044b\u0442\u044c URL\\", \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b GEDCOM. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0430\u043b\u043e\u0433\u0438\u0438 \u0438\u043c\u0435\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 GEDCOM.","intro.examples":"\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435:","intro.from":"\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a:","intro.privacy":"\u041a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c","intro.privacy_note":"\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \\"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b\\" \u0412\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0412\u0430\u0448\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435. \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \\"\u041e\u0442\u043a\u0440\u044b\u0442\u044c URL\\" \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0443\u0436\u0431\u043e\u0439 {link} \u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 (CORS).","load_from_url.title":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 URL","load_from_url.comment":"\u0414\u0430\u043d\u043d\u044b\u0435 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 URL \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u0441\u043b\u0443\u0436\u0431\u0443 {link}, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c CORS.","load_from_url.cancel":"\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c","load_from_url.load":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c","select_wikitree_id.title":"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 WikiTree","select_wikitree_id.comment":"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u043e\u0444\u0438\u043b\u044f {wikiTreeLink}. \u041f\u0440\u0438\u043c\u0435\u0440\u044b: {example1}, {example2}","select_wikitree_id.cancel":"\u041e\u0442\u043c\u0435\u043d\u0430","select_wikitree_id.load":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c","gedcom.ADOP":"\u0423\u0441\u044b\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435","gedcom.BAPM":"\u041a\u0440\u0435\u0449\u0435\u043d\u0438\u0435","gedcom.BIRT":"\u0420\u043e\u0436\u0434\u0435\u043d\u0438\u0435","gedcom.BURI":"\u041f\u043e\u0445\u043e\u0440\u043e\u043d\u044b","gedcom.CENS":"\u041f\u0435\u0440\u0435\u043f\u0438\u0441\u044c \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f","gedcom.CHR":"\u041a\u0440\u0435\u0449\u0435\u043d\u0438\u0435","gedcom.CREM":"\u041a\u0440\u0435\u043c\u0430\u0446\u0438\u044f","gedcom.DEAT":"\u0421\u043c\u0435\u0440\u0442\u044c","gedcom.DSCR":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","gedcom.EDUC":"\u041e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","gedcom.EMAIL":"E-mail","gedcom.EMIG":"\u042d\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f","gedcom.EVEN":"\u0421\u043e\u0431\u044b\u0442\u0438\u0435","gedcom.FACT":"\u0424\u0430\u043a\u0442","gedcom.IMMI":"\u0418\u043c\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f","gedcom.MILT":"\u0412\u043e\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430","gedcom.NATU":"\u041d\u0430\u0442\u0443\u0440\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f","gedcom.OCCU":"\u0412\u0438\u0434 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438","gedcom.RIN":"ID","gedcom.TITL":"\u0422\u0438\u0442\u0443\u043b","gedcom.WWW":"\u0412\u0435\u0431-\u0441\u0430\u0439\u0442 WWW","gedcom._UPD":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435","gedcom.birth":"\u0418\u043c\u044f \u043f\u0440\u0438 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u0438","gedcom.married":"\u0418\u043c\u044f \u0432 \u0431\u0440\u0430\u043a\u0435","gedcom.maiden":"\u0414\u0435\u0432\u0438\u0447\u044c\u044f \u0444\u0430\u043c\u0438\u043b\u0438\u044f","gedcom.aka":"\u041e\u043d(\u0430) \u0436\u0435","date.abt":"\u043e\u043a\u043e\u043b\u043e","date.cal":"\u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043e","date.est":"\u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e","date.between":"\u043c\u0435\u0436\u0434\u0443 {from} \u0438 {to}","date.after":"\u043f\u043e\u0441\u043b\u0435 {from}","date.before":"\u0434\u043e {to}","error.error":"\u041e\u0448\u0438\u0431\u043a\u0430","error.failed_pdf":"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c PDF-\u0444\u0430\u0439\u043b. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0441 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u0438\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0444\u0430\u0439\u043b SVG.","error.failed_png":"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b PNG. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0441 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0441\u0445\u0435\u043c\u043e\u0439 \u0438\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0444\u0430\u0439\u043b SVG.","error.failed_to_load_file":"\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u0430","error.failed_wikitree_load_more":"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 WikiTree. {error}}","wikitree.private":"\u0427\u0430\u0441\u0442\u043d\u044b\u0439"}')},343:function(e,t){},444:function(e,t,n){},447:function(e,t,n){"use strict";n.r(t);var a=n(0),r=n(91),i=n(265),o=n(266),c=n(267),s=n(268),l=n(269),u=n(270),d=n(10),m=n.n(d),f=n(20),g=n(12),p=n(31);function h(e,t){window.gtag("event",e,t)}var j,b=n(283),O=n(282),v=n(284),w=n(480),x=n(486),_=n(451),k=n(477),E=n(469),R=n(1),D="last_seen_version";function y(e,t){return I.apply(this,arguments)}function I(){return(I=Object(f.a)(m.a.mark((function e(t,n){var a,r,i,o;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=n?Date.parse(n.slice(0,10)):0,i=(null===(a='# Changelog\n\n## 2023-02-01\n\n- Added option to hide sex indicators (by Kent Grigo)\n- Empty family boxes are now not shown (by Kent Grigo)\n\n## 2023-01-08\n\n- Added option to hide profile identifiers by Kent Grigo\n\n## 2022-12-08\n\n- French translation updated by Olivier Berten\n\n## 2022-08-30\n\n- Added displaying name types in details panel\n\n## 2022-05-13\n\n- Added displaying images in the details panel\n\n## 2022-04-06\n\n- Fixed logging in to WikiTree\n\n## 2021-10-31\n\n- Show changelog in intro page and when an upgraded version is loaded\n\n## 2021-10-27\n\n- Show events in details panel for WikiTree profiles\n\n## 2021-10-26\n\n- Added family events to details panel\n- Improved details panel layout\n\n## 2021-10-25\n\n- Added "Settings" tab in side panel\n- Added color settings (none, by generation, by sex)')?void 0:a.split("##").slice(1,t+1).map((function(e){return{date:Date.parse(e.split("\n")[0].trim()),notes:"####"+e}})).filter((function(e){return e.date>r})).map((function(e){return e.notes})).join("\n"))||"",e.next=4,Object(k.a)().use(O.a).use(v.a).use(b.a).process(i);case 4:return o=e.sent,e.abrupt("return",String(o));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function T(){localStorage.setItem(D,"2023-06-22 17:06:55 +0200")}function N(){var e=Object(a.useState)(!1),t=Object(g.a)(e,2),n=t[0],r=t[1],i=Object(a.useState)(""),o=Object(g.a)(i,2),c=o[0],s=o[1];return Object(a.useEffect)((function(){Object(f.a)(m.a.mark((function e(){var t,n;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=localStorage.getItem(D),"2023-06-22 17:06:55 +0200",t&&"2023-06-22 17:06:55 +0200"!==t){e.next=4;break}return e.abrupt("return");case 4:return e.next=6,y(3,t);case 6:n=e.sent,s(n),r(!!n),T();case 10:case"end":return e.stop()}}),e)})))()})),Object(R.jsxs)(w.a,{open:n,centered:!1,children:[Object(R.jsx)(x.a,{children:Object(R.jsx)(E.a,{id:"whats_new.title",defaultMessage:"What's new in this version?"})}),Object(R.jsxs)(w.a.Content,{className:"limit-height",children:[Object(R.jsx)("span",{dangerouslySetInnerHTML:{__html:c}}),Object(R.jsx)("a",{href:"https://github.com/PeWu/topola-viewer/blob/master/CHANGELOG.md",children:Object(R.jsx)(E.a,{id:"intro.full_changelog",defaultMessage:"See full changelog"})})]}),Object(R.jsx)(w.a.Actions,{children:Object(R.jsx)(_.a,{primary:!0,onClick:function(){return r(!1)},children:"Close"})})]})}!function(e){e[e.UPLOADED=0]="UPLOADED",e[e.GEDCOM_URL=1]="GEDCOM_URL",e[e.WIKITREE=2]="WIKITREE",e[e.EMBEDDED=3]="EMBEDDED"}(j||(j={}));var M=n(24),C=n(152),S=n.n(C),L=n(219),A=n(21),P=n(54),z=n(55),W=n(107),G=function(e){Object(P.a)(n,e);var t=Object(z.a)(n);function n(e,a){var r,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return Object(A.a)(this,n),(r=t.call(this,a)).code=e,r.args=i,r}return n}(Object(W.a)(Error)),F=n(28),B=new Map([["abt","about"],["cal","calculated"],["est","estimated"]]);function U(e,t){var n=void 0!==e.day,a=void 0!==e.month,r=void 0!==e.year;if(!n&&!a&&!r)return e.text||"";var i=Z(e),o={day:n?"numeric":void 0,month:a?"long":void 0,year:r?"numeric":void 0};return[H(e.qualifier,t),new Intl.DateTimeFormat(t.locale,o).format(i)].join(" ")}function H(e,t){var n=e&&e.toLowerCase();return n&&t.formatMessage({id:"date.".concat(n),defaultMessage:B.get(n)||n})||""}function V(e,t){return e?e.date?U(e.date,t):e.dateRange?function(e,t){var n=e.from,a=e.to,r=n&&U(n,t),i=a&&U(a,t);return r&&i?t.formatMessage({id:"date.between",defaultMessage:"between {from} and {to}"},{from:r,to:i}):r?t.formatMessage({id:"date.after",defaultMessage:"after {from}"},{from:r}):i?t.formatMessage({id:"date.before",defaultMessage:"before {to}"},{to:i}):""}(e.dateRange,t):"":""}function Y(e,t){return e&&e.year&&t&&t.year?e.year!==t.year?e.year-t.year:e.month&&t.month&&(e.month!==t.month||e.day&&t.day&&e.day!==t.day)?e.month-t.month:0:0}function q(e,t){return Y(e&&(e.date||e.dateRange&&(e.dateRange.from||e.dateRange.to)),t&&(t.date||t.dateRange&&(t.dateRange.from||t.dateRange.to)))}function K(e){var t,n,a,r;return J(null===e||void 0===e?void 0:e.dateRange)?Y(null===e||void 0===e||null===(a=e.dateRange)||void 0===a?void 0:a.from,null===e||void 0===e||null===(r=e.dateRange)||void 0===r?void 0:r.to)<=0:!!((null===e||void 0===e?void 0:e.date)||(null===e||void 0===e||null===(t=e.dateRange)||void 0===t?void 0:t.from)||(null===e||void 0===e||null===(n=e.dateRange)||void 0===n?void 0:n.to))}function J(e){return!(!(null===e||void 0===e?void 0:e.from)||!(null===e||void 0===e?void 0:e.to))}function Z(e){return new Date(void 0!==e.year?e.year:0,void 0!==e.month?e.month-1:0,void 0!==e.day?e.day:1)}function X(e){return e.substring(1,e.length-1)}function Q(e){var t=new Map;return e.indis.forEach((function(e){t.set(e.id,e)})),t}function $(e){var t=new Map;return e.fams.forEach((function(e){t.set(e.id,e)})),t}function ee(e){var t=e.find((function(e){return"HEAD"===e.tag})),n={},a={},r={};return e.forEach((function(e){"INDI"===e.tag?n[X(e.pointer)]=e:"FAM"===e.tag?a[X(e.pointer)]=e:e.pointer&&(r[X(e.pointer)]=e)})),{head:t,indis:n,fams:a,other:r}}function te(e,t){return et?1:0}function ne(e){var t=function(e){var t=Q(e);return function(e,n){var a=t.get(e),r=t.get(n);return q(a&&a.birth,r&&r.birth)||te(e,n)}}(e),n=e.fams.map((function(e){return function(e,t){if(!e.children)return e;var n=e.children.sort(t);return Object.assign({},e,{children:n})}(e,t)}));return Object.assign({},e,{fams:n})}function ae(e){var t=function(e){var t=$(e);return function(e,n){var a=t.get(e),r=t.get(n);return q(a&&a.marriage,r&&r.marriage)||te(e,n)}}(e),n=e.indis.map((function(e){return function(e,t){if(!e.fams)return e;var n=e.fams.sort(t);return Object.assign({},e,{fams:n})}(e,t)}));return Object.assign({},e,{indis:n})}function re(e,t,n){if(e.data){var a=n(t)[X(e.data)];if(a)return a}return e}function ie(e){var t=[e.data];return e.tree.forEach((function(e){if("CONC"===e.tag&&e.data){var n=t.length-1;t[n]+=e.data}else"CONT"===e.tag&&e.data&&t.push(e.data)})),t}function oe(e){return ae(ne(e))}var ce=[".jpg",".jpeg",".png",".gif"];function se(e){var t=e.toLowerCase();return ce.some((function(e){return t.endsWith(e)}))}function le(e,t){var n=e.indis.map((function(e){return function(e,t){if(!e.images||0===e.images.length)return e;var n=[];return e.images.forEach((function(e){var a=e.url.match(/[^/\\]*$/)[0];t.has(a)?n.push({url:t.get(a),title:e.title}):e.url.startsWith("http")&&se(e.url)&&n.push(e)})),Object.assign({},e,{images:n})}(e,t)}));return Object.assign({},e,{indis:n})}function ue(e){var t=e&&e.tree&&e.tree.find((function(e){return"SOUR"===e.tag})),n=t&&t.tree&&t.tree.find((function(e){return"NAME"===e.tag}));return n&&n.data||null}function de(e){var t,n,a=null===e||void 0===e||null===(t=e.tree.find((function(e){return"TITL"===e.tag})))||void 0===t?void 0:t.data,r=null===e||void 0===e||null===(n=e.tree.find((function(e){return"FORM"===e.tag})))||void 0===n?void 0:n.data;return a&&r&&a+"."+r}function me(e,t,n){var a=he(e,t);return n.formatMessage({id:"age.more",defaultMessage:"More than {age, plural, =0 {0 years} one {1 year} other {# years}}"},{age:a})}function fe(e,t,n){var a=he(e,t);return n.formatMessage({id:"age.less",defaultMessage:"Less than {age, plural, =0 {1 year} one {1 year} other {# years}}"},{age:a})}function ge(e,t,n,a,r){var i=he(t,n),o=he(e,a);return r.formatMessage({id:"age.between",defaultMessage:"Between {ageFrom} and {ageTo, plural, =0 {0 years} one {1 year} other {# years}}"},{ageFrom:i,ageTo:o})}function pe(e,t){return!(!e||!t)&&(!(!K(e)||!K(t))&&(!(q(e,t)>0)&&(!(e.dateRange&&t.dateRange&&J(null===e||void 0===e?void 0:e.dateRange)&&J(null===t||void 0===t?void 0:t.dateRange))||(n=e.dateRange,a=t.dateRange,!(Y(n.from,a.to)<=0&&Y(n.to,a.from)>=0)))));var n,a}function he(e,t){var n=Z(e),a=Z(t),r=n.getUTCFullYear(),i=a.getUTCFullYear()-r,o=a.getUTCMonth()-n.getUTCMonth();return o<0&&(i--,o+=12),a.getUTCDate()-n.getUTCDate()<0&&o<=0&&i--,Math.abs(i)}function je(e,t,n){if(e&&t){var a=Object(F.getDate)(e),r=Object(F.getDate)(t);if(pe(a,r)){var i,o,c,s;if(null===a||void 0===a?void 0:a.date){var l,u,d,m,f,g,p,h;if(null===r||void 0===r?void 0:r.date)return function(e,t,n){var a=he(e,t),r=e.qualifier||t.qualifier,i=r&&H(r,n)+" ";return n.formatMessage({id:"age.exact",defaultMessage:"{qualifier}{age, plural, =0 {Less than 1 year} one {1 year} other {# years}}"},{age:a,qualifier:i})}(a.date,r.date,n);if((null===r||void 0===r||null===(l=r.dateRange)||void 0===l?void 0:l.from)&&(null===(u=r.dateRange)||void 0===u?void 0:u.to))return ge(a.date,a.date,null===r||void 0===r||null===(f=r.dateRange)||void 0===f?void 0:f.from,null===r||void 0===r||null===(g=r.dateRange)||void 0===g?void 0:g.to,n);if(null===r||void 0===r||null===(d=r.dateRange)||void 0===d?void 0:d.from)return me(a.date,null===(p=r.dateRange)||void 0===p?void 0:p.from,n);if(null===r||void 0===r||null===(m=r.dateRange)||void 0===m?void 0:m.to)return fe(a.date,null===(h=r.dateRange)||void 0===h?void 0:h.to,n)}if((null===a||void 0===a||null===(i=a.dateRange)||void 0===i?void 0:i.from)&&(null===a||void 0===a||null===(o=a.dateRange)||void 0===o?void 0:o.to)){var j,b,O,v,w,x,_,k,E,R,D,y,I,T;if(null===r||void 0===r?void 0:r.date)return ge(null===a||void 0===a||null===(w=a.dateRange)||void 0===w?void 0:w.from,null===a||void 0===a||null===(x=a.dateRange)||void 0===x?void 0:x.to,null===r||void 0===r?void 0:r.date,null===r||void 0===r?void 0:r.date,n);if((null===r||void 0===r||null===(j=r.dateRange)||void 0===j?void 0:j.from)&&(null===(b=r.dateRange)||void 0===b?void 0:b.to))return ge(null===a||void 0===a||null===(_=a.dateRange)||void 0===_?void 0:_.from,null===a||void 0===a||null===(k=a.dateRange)||void 0===k?void 0:k.to,null===r||void 0===r||null===(E=r.dateRange)||void 0===E?void 0:E.from,null===r||void 0===r||null===(R=r.dateRange)||void 0===R?void 0:R.to,n);if(null===r||void 0===r||null===(O=r.dateRange)||void 0===O?void 0:O.from)return me(null===(D=a.dateRange)||void 0===D?void 0:D.to,null===(y=r.dateRange)||void 0===y?void 0:y.from,n);if(null===r||void 0===r||null===(v=r.dateRange)||void 0===v?void 0:v.to)return fe(null===(I=a.dateRange)||void 0===I?void 0:I.from,null===(T=r.dateRange)||void 0===T?void 0:T.to,n)}if(null===a||void 0===a||null===(c=a.dateRange)||void 0===c?void 0:c.from){var N,M,C,S;if(null===r||void 0===r?void 0:r.date)return fe(null===(M=a.dateRange)||void 0===M?void 0:M.from,r.date,n);if(null===r||void 0===r||null===(N=r.dateRange)||void 0===N?void 0:N.to)return fe(null===(C=a.dateRange)||void 0===C?void 0:C.from,null===(S=r.dateRange)||void 0===S?void 0:S.to,n)}if(null===a||void 0===a||null===(s=a.dateRange)||void 0===s?void 0:s.to){var L,A,P,z;if(null===r||void 0===r?void 0:r.date)return me(null===a||void 0===a||null===(A=a.dateRange)||void 0===A?void 0:A.to,r.date,n);if(null===r||void 0===r||null===(L=r.dateRange)||void 0===L?void 0:L.from)return me(null===a||void 0===a||null===(P=a.dateRange)||void 0===P?void 0:P.to,null===(z=r.dateRange)||void 0===z?void 0:z.from,n)}}}}var be=n(274),Oe=n(19),ve=n(65),we=n(276),xe=n.n(we);function _e(e){return Object(R.jsx)(R.Fragment,{children:e.lines.map((function(e,t){return Object(R.jsxs)("div",{children:[Object(R.jsx)(xe.a,{properties:{target:"_blank"},children:e}),Object(R.jsx)("br",{})]},t)}))})}var ke=new Map([["ADOP","Adoption"],["BAPM","Baptism"],["BIRT","Birth"],["BURI","Burial"],["CENS","Census"],["CHR","Christening"],["CREM","Cremation"],["DEAT","Death"],["EDUC","Education"],["EMAIL","E-mail"],["EMIG","Emigration"],["EVEN","Event"],["FACT","Fact"],["IMMI","Immigration"],["MARR","Marriage"],["DIV","Divorce"],["MILT","Military services"],["NATU","Naturalization"],["OCCU","Occupation"],["TITL","Title"],["WWW","WWW"],["birth","Birth name"],["married","Married name"],["maiden","Maiden name"],["immigrant","Immigrant name"],["aka","Also known as"]]);function Ee(e){var t=e.tag.replace(/_/g,"");return Object(R.jsx)(E.a,{id:"gedcom.".concat(t),defaultMessage:ke.get(t)||t})}var Re=n(479);function De(e){var t=Object(Oe.h)(),n=function(e){var t=e.tree.filter((function(e){return"NAME"===e.tag})),n=t.find((function(e){return 0===e.tree.filter((function(e){return"TYPE"===e.tag&&"married"===e.data})).length}))||t[0];return null===n||void 0===n?void 0:n.data.replace(/\//g,"")}(e.person),a=p.parse(t.search);return a.indi=X(e.person.pointer),Object(R.jsx)(Re.a.Meta,{children:Object(R.jsx)(ve.b,{to:{pathname:"/view",search:p.stringify(a)},children:n||Object(R.jsx)(E.a,{id:"name.unknown_name",defaultMessage:"N.N."})})})}var ye=["BIRT","BAPM","CHR","FAMS","EVEN","CENS","DEAT","BURI"],Ie=["MARR","DIV"];function Te(e){var t=Object(be.a)();return Object(R.jsxs)("div",{className:"event-header",children:[Object(R.jsx)(x.a,{as:"span",size:"small",children:Object(R.jsx)(Ee,{tag:e.event.type})}),e.event.date?Object(R.jsx)(x.a,{as:"span",textAlign:"right",sub:!0,children:V(e.event.date,t)}):null]})}function Ne(e,t,n){var a=t.tree.filter((function(e){return["WIFE","HUSB"].includes(e.tag)})).find((function(t){return!t.data.includes(e)}));if(a)return re(a,n,(function(e){return e.indis}))}function Me(e,t,n,a){if("DEAT"===e.tag){var r=Ae(e),i=n.indis[t].tree.filter((function(e){return"BIRT"===e.tag})).map((function(e){return Ae(e)})).find((function(e){return e}));if(i&&r)return je(null===i||void 0===i?void 0:i.data,null===r||void 0===r?void 0:r.data,a)}}function Ce(e){var t=e.tree.find((function(e){return"PLAC"===e.tag}));return(null===t||void 0===t?void 0:t.data)?ie(t):void 0}function Se(e,t){return e.tree.filter((function(e){return["NOTE","TYPE"].includes(e.tag)})).map((function(e){return re(e,t,(function(e){return e.other}))})).map((function(e){return ie(e)}))}function Le(e,t,n,a){return"FAMS"===e.tag?function(e,t,n){var a=re(e,t,(function(e){return e.fams}));return S()(Ie,(function(e){return a.tree.filter((function(t){return t.tag===e}))})).map((function(e){var r=Ae(e)||null;return{date:r?Object(F.getDate)(r.data):void 0,type:e.tag,personLink:Ne(n,a,t),place:Ce(e),notes:Se(e,t)}}))}(e,t,n):function(e,t,n,a){var r=Ae(e)||null;return[{date:r?Object(F.getDate)(r.data):void 0,type:e.tag,age:Me(e,n,t,a),place:Ce(e),notes:Se(e,t)}]}(e,t,n,a)}function Ae(e){return e.tree.find((function(e){return"DATE"===e.tag}))}function Pe(e){return Object(R.jsx)(Re.a,{children:Object(R.jsxs)(Re.a.Content,{children:[Object(R.jsx)(Te,{event:e.event}),!!e.event.age&&Object(R.jsx)(Re.a.Meta,{children:e.event.age}),!!e.event.personLink&&Object(R.jsx)(De,{person:e.event.personLink}),!!e.event.place&&Object(R.jsx)(Re.a.Description,{children:e.event.place}),!!e.event.notes.length&&Object(R.jsx)(Re.a.Description,{children:e.event.notes.map((function(e,t){return Object(R.jsx)("div",{children:Object(R.jsx)(_e,{lines:e.map((function(e,t){return Object(R.jsx)("i",{children:e},t)}))})},t)}))})]})})}function ze(e){var t=Object(be.a)(),n=S()(ye,(function(n){return e.entries.filter((function(e){return e.tag===n})).map((function(n){return Le(n,e.gedcom,e.indi,t)})).flatMap((function(e){return e})).sort((function(e,t){return q(e.date,t.date)}))}));return n.length?Object(R.jsx)(R.Fragment,{children:n.map((function(e,t){return Object(R.jsx)(Pe,{event:e},t)}))}):null}var We=n(286),Ge=n(482),Fe=n(471),Be=n(483),Ue=n(111),He=n(154);function Ve(e){var t=Object(a.useState)(!1),n=Object(g.a)(t,2),r=n[0],i=n[1],o=Object(a.useState)(!1),c=Object(g.a)(o,2),s=c[0],l=c[1],u=Object(a.useState)(!1),d=Object(g.a)(u,2),m=d[0],f=d[1],p=Object(a.useState)(""),h=Object(g.a)(p,2),j=h[0],b=h[1];return s&&j!==e.url&&l(!1),Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(We.a,{className:s?"loaded-image-thumbnail":"hidden-image",onClick:function(){return i(!0)},onLoad:function(){l(!0),b(e.url),f(!1)},onError:function(t){l(!0),b(e.url),f(!0),t.currentTarget.alt=""},src:e.url,alt:e.title||e.filename,centered:!0}),Object(R.jsx)(Ge.a,{className:s?"hidden-image":"image-placeholder",children:Object(R.jsx)(Ge.a.Image,{square:!0})}),m&&Object(R.jsx)(Fe.a,{fluid:!0,textAlign:"center",children:Object(R.jsx)(Be.a,{negative:!0,compact:!0,children:Object(R.jsx)(Be.a.Header,{children:Object(R.jsx)(E.a,{id:"error.failed_to_load_image",defaultMessage:"Failed to load image file"})})})}),Object(R.jsxs)(w.a,{basic:!0,size:"large",closeIcon:Object(R.jsx)(Ue.a,{name:"close",color:"red"}),open:r,onClose:function(){return i(!1)},onOpen:function(){return i(!0)},centered:!1,children:[Object(R.jsx)(w.a.Header,{children:e.title}),Object(R.jsx)(w.a.Content,{image:!0,children:Object(R.jsx)(We.a,{className:"modal-image",src:e.url,alt:e.title||e.filename,label:Object(R.jsx)(He.a,{attached:"bottom",content:e.filename}),wrapped:!0})})]})]})}var Ye=["BIRT","BAPM","CHR","EVEN","CENS","DEAT","BURI","NAME","SEX","FAMC","FAMS","NOTE","SOUR"];function qe(e){var t=e.tree.find((function(e){return"FILE"===e.tag&&e.data.startsWith("http")&&se(e.data)}));return t?Object(R.jsx)("div",{className:"person-image",children:Object(R.jsx)(Ve,{url:t.data,filename:de(t)||""})}):null}function Ke(e){return Object(R.jsx)(_e,{lines:ie(e).map((function(e,t){return Object(R.jsx)("i",{children:e},t)}))})}function Je(e){var t,n=e.data.replaceAll("/",""),a=null===(t=e.tree.find((function(e){return"TYPE"===e.tag&&"Unknown"!==e.data})))||void 0===t?void 0:t.data;return Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(x.a,{as:"span",size:"large",children:n||Object(R.jsx)(E.a,{id:"name.unknown_name",defaultMessage:"N.N."})}),n&&a&&Object(R.jsx)(Re.a.Meta,{children:Object(R.jsx)(Ee,{tag:a})})]})}function Ze(e,t,n){return S()(t,(function(t){return e.filter((function(e){return e.tag===t})).map((function(e){return n(e)}))})).filter((function(e){return null!==e})).map((function(e,t){return Object(R.jsx)(Re.a,{children:Object(R.jsx)(Re.a.Content,{children:e})},t)}))}function Xe(e){return e.tree.length>0||e.data&&!e.data.startsWith("@")}function Qe(e){return e.filter((function(e){return!Ye.includes(e.tag)})).filter(Xe).map((function(e){return function(e){var t=[];return e.data&&t.push.apply(t,Object(M.a)(ie(e))),e.tree.filter((function(e){return"NOTE"===e.tag})).forEach((function(e){return ie(e).forEach((function(e){return t.push(Object(R.jsx)("i",{children:e}))}))})),t.length?Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(x.a,{sub:!0,children:Object(R.jsx)(Ee,{tag:e.tag})}),Object(R.jsx)("span",{children:Object(R.jsx)(_e,{lines:t})})]}):null}(e)})).filter((function(e){return null!==e})).map((function(e,t){return Object(R.jsx)(Re.a,{children:Object(R.jsx)(Re.a.Content,{children:e})},t)}))}function $e(e){var t=e.gedcom.indis[e.indi].tree,n=t.map((function(t){return re(t,e.gedcom,(function(e){return e.other}))})).filter(Xe);return Object(R.jsx)("div",{className:"details",children:Object(R.jsxs)(Re.a.Group,{divided:!0,children:[Ze(t,["NAME"],Je),Ze(n,["OBJE"],qe),Object(R.jsx)(ze,{gedcom:e.gedcom,entries:t,indi:e.indi}),Qe(n),Ze(n,["NOTE"],Ke)]})})}var et=n(29);function tt(e,t){return{id:t&&e.indis.some((function(e){return e.id===t.id}))?t.id:e.indis[0].id,generation:(null===t||void 0===t?void 0:t.generation)||0}}function nt(e,t,n){var a=function(e,t){var n=Object(L.parse)(e),a=Object(F.gedcomEntriesToJson)(n);if(!a||!a.indis||!a.indis.length||!a.fams||!a.fams.length)throw new G("GEDCOM_READ_FAILED","Failed to read GEDCOM file");return{chartData:le(oe(a),t),gedcom:ee(n)}}(e,n||new Map),r=JSON.stringify(a);try{sessionStorage.setItem(t,r)}catch(i){console.warn("Failed to store data in session storage: "+i)}return a}function at(e,t){return rt.apply(this,arguments)}function rt(){return(rt=Object(f.a)(m.a.mark((function e(t,n){var a,r,i,o,c,s;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,!(a=sessionStorage.getItem(t))){e.next=4;break}return e.abrupt("return",JSON.parse(a));case 4:e.next=9;break;case 6:e.prev=6,e.t0=e.catch(0),console.warn("Failed to load data from session storage: "+e.t0);case 9:return(r=t.match(/https:\/\/drive\.google\.com\/file\/d\/(.*)\/.*/))&&(t="https://drive.google.com/uc?id=".concat(r[1],"&export=download")),(i=t.match(/https:\/\/drive\.google\.com\/open\?id=([^&]*)&?.*/))&&(t="https://drive.google.com/uc?id=".concat(i[1],"&export=download")),o=n?"https://topola-cors-server.up.railway.app/"+t:t,e.next=16,window.fetch(o);case 16:if(200===(c=e.sent).status){e.next=19;break}throw new Error(c.statusText);case 19:return e.next=21,c.text();case 21:return s=e.sent,e.abrupt("return",nt(s,t));case 23:case"end":return e.stop()}}),e,null,[[0,6]])})))).apply(this,arguments)}function it(e,t,n){return ot.apply(this,arguments)}function ot(){return(ot=Object(f.a)(m.a.mark((function e(t,n,a){var r;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,!(r=sessionStorage.getItem(t))){e.next=4;break}return e.abrupt("return",JSON.parse(r));case 4:e.next=9;break;case 6:e.prev=6,e.t0=e.catch(0),console.warn("Failed to load data from session storage: "+e.t0);case 9:if(n){e.next=11;break}throw new G("ERROR_LOADING_UPLOADED_FILE","Error loading data. Please upload your file again.");case 11:return e.abrupt("return",nt(n,t,a));case 12:case"end":return e.stop()}}),e,null,[[0,6]])})))).apply(this,arguments)}var ct,st=function(){function e(){Object(A.a)(this,e)}return Object(et.a)(e,[{key:"isNewData",value:function(e,t,n){return e.spec.hash!==t.spec.hash}},{key:"loadData",value:function(){var e=Object(f.a)(m.a.mark((function e(t){var n;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,it(t.spec.hash,t.spec.gedcom,t.spec.images);case 3:return n=e.sent,h("upload_file_loaded",{event_label:ue(n.gedcom.head),event_value:t.spec.images&&t.spec.images.size||0}),e.abrupt("return",n);case 9:throw e.prev=9,e.t0=e.catch(0),h("upload_file_error"),e.t0;case 13:case"end":return e.stop()}}),e,null,[[0,9]])})));return function(t){return e.apply(this,arguments)}}()}]),e}(),lt=function(){function e(){Object(A.a)(this,e)}return Object(et.a)(e,[{key:"isNewData",value:function(e,t,n){return e.spec.url!==t.spec.url}},{key:"loadData",value:function(){var e=Object(f.a)(m.a.mark((function e(t){var n;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,at(t.spec.url,t.spec.handleCors);case 3:return n=e.sent,h("upload_file_loaded",{event_label:ue(n.gedcom.head)}),e.abrupt("return",n);case 9:throw e.prev=9,e.t0=e.catch(0),h("url_file_error"),e.t0;case 13:case"end":return e.stop()}}),e,null,[[0,9]])})));return function(t){return e.apply(this,arguments)}}()}]),e}();!function(e){e.GEDCOM="gedcom",e.READY="ready",e.PARENT_READY="parent_ready"}(ct||(ct={}));var ut=function(){function e(){Object(A.a)(this,e)}return Object(et.a)(e,[{key:"isNewData",value:function(e,t,n){return!1}},{key:"onMessage",value:function(){var e=Object(f.a)(m.a.mark((function e(t,n,a){var r,i;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t.message!==ct.PARENT_READY){e.next=4;break}window.parent.postMessage({message:ct.READY},"*"),e.next=21;break;case 4:if(t.message!==ct.GEDCOM){e.next=21;break}if(r=t.gedcom){e.next=8;break}return e.abrupt("return");case 8:return e.prev=8,e.next=11,it("",r);case 11:i=e.sent,h("embedded_file_loaded",{event_label:ue(i.gedcom.head)}),n(i),e.next=21;break;case 17:e.prev=17,e.t0=e.catch(8),h("embedded_file_error"),a(e.t0);case 21:case"end":return e.stop()}}),e,null,[[8,17]])})));return function(t,n,a){return e.apply(this,arguments)}}()},{key:"loadData",value:function(){var e=Object(f.a)(m.a.mark((function e(t){var n=this;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e,t){window.parent.postMessage({message:ct.READY},"*"),window.addEventListener("message",(function(a){return n.onMessage(a.data,e,t)}))})));case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()}]),e}();function dt(e,t){return e instanceof G?t.formatMessage({id:"error.".concat(e.code),defaultMessage:e.message},e.args):e.message}var mt=n.p+"static/media/topola.a3ffa9a5.jpg",ft=n(481),gt=n(287),pt=n(277),ht=Object(pt.createMedia)({breakpoints:{small:320,large:768}}),jt=ht.createMediaStyle(),bt=ht.Media,Ot=ht.MediaContextProvider;function vt(e){return Object(R.jsx)(ve.b,{to:{pathname:"/view",search:p.stringify({url:e.url})},children:e.text})}function wt(){var e,t=Object(a.useState)(""),n=Object(g.a)(t,2),r=n[0],i=n[1];return Object(a.useEffect)((function(){Object(f.a)(m.a.mark((function e(){return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=i,e.next=3,y(1);case 3:e.t1=e.sent,(0,e.t0)(e.t1),T();case 6:case"end":return e.stop()}}),e)})))()})),Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)("p",{children:Object(R.jsx)(E.a,{id:"intro.description",defaultMessage:"Topola Genealogy is a genealogy tree viewer that lets you browse the structure of the family."})}),Object(R.jsx)("p",{children:Object(R.jsx)(E.a,{id:"intro.instructions",defaultMessage:"Use the OPEN FILE or LOAD FROM URL buttons above to load a GEDCOM file. You can export a GEDCOM file from most of the existing genealogy programs and web sites."})}),Object(R.jsx)("h3",{children:Object(R.jsx)(E.a,{id:"intro.examples",defaultMessage:"Examples"})}),Object(R.jsx)("ul",{children:Object(R.jsxs)("li",{children:[Object(R.jsx)(vt,{url:"https://webtreeprint.com/tp_downloader.php?path=famous_gedcoms/shakespeare.ged",text:"Shakespeare"})," ","(",Object(R.jsx)(E.a,{id:"intro.from",defaultMessage:"from"})," ",Object(R.jsx)("a",{href:"https://webtreeprint.com/tp_famous_gedcoms.php",children:"webtreeprint.com"}),")"]})}),Object(R.jsx)("h3",{children:Object(R.jsx)(E.a,{id:"intro.whats_new",defaultMessage:"What's new"})}),Object(R.jsx)("span",{dangerouslySetInnerHTML:{__html:r}}),Object(R.jsx)("a",{href:"https://github.com/PeWu/topola-viewer/blob/master/CHANGELOG.md",children:Object(R.jsx)(E.a,{id:"intro.full_changelog",defaultMessage:"See full changelog"})}),Object(R.jsx)("h3",{children:Object(R.jsx)(E.a,{id:"intro.privacy",defaultMessage:"Privacy"})}),Object(R.jsx)(E.a,{id:"intro.privacy_note",defaultMessage:'When using the "load from file" option, this site does not send your data anywhere and files loaded from disk do not leave your computer. When using "load from URL", data is passed through the {link} service to deal with an issue with cross-site file loading in the browser (CORS).',values:{link:Object(R.jsx)("a",{href:"https://topola-cors.herokuapp.com/",children:"cors-anywhere"})}}),Object(R.jsxs)("p",{className:"ui right aligned version",children:["version: ",(e="2023-06-22 17:06:55 +0200",(null===e||void 0===e?void 0:e.slice(0,16))||"")," (",Object(R.jsx)("a",{href:"https://github.com/PeWu/topola-viewer/commit/".concat("ceee39d"),children:"ceee39d"}),")"]})]})}function xt(){return Object(R.jsxs)("div",{id:"content",children:[Object(R.jsx)("div",{className:"backgroundImage"}),Object(R.jsxs)(ft.a,{className:"intro",children:[Object(R.jsx)(ft.a.Content,{as:bt,greaterThanOrEqual:"large",children:Object(R.jsx)(ft.a.Header,{children:Object(R.jsx)(E.a,{id:"intro.title",defaultMessage:"Topola Genealogy Viewer"})})}),Object(R.jsxs)(ft.a.Content,{children:[Object(R.jsx)(gt.a,{as:bt,greaterThanOrEqual:"large",children:Object(R.jsxs)(gt.a.Row,{children:[Object(R.jsx)(gt.a.Column,{width:5,children:Object(R.jsx)(We.a,{src:mt,alt:"Topola logo"})}),Object(R.jsx)(gt.a.Column,{width:11,children:Object(R.jsx)(wt,{})})]})}),Object(R.jsxs)(bt,{at:"small",children:[Object(R.jsx)(We.a,{src:mt,alt:"Topola logo",centered:!0,size:"tiny",className:"blockImage"}),Object(R.jsx)(wt,{})]})]})]})]})}var _t,kt=n(487),Et=n(473),Rt=n(484),Dt=n(15),yt=n(475),It=n(285);function Tt(e){var t=Object(Dt.a)({},e);return delete t.menuType,Object(R.jsx)(R.Fragment,{children:e.menuType===_t.Menu?Object(R.jsx)(It.a.Item,Object(Dt.a)(Object(Dt.a)({},t),{},{children:e.children})):Object(R.jsx)(yt.a.Item,Object(Dt.a)(Object(Dt.a)({},t),{},{children:e.children}))})}!function(e){e[e.Menu=0]="Menu",e[e.Dropdown=1]="Dropdown"}(_t||(_t={}));var Nt=n(278),Mt=n.n(Nt),Ct=n(75),St=n.n(Ct),Lt=n(279),At=n.n(Lt);n(411)(St.a),n(412)(St.a),n(413)(St.a),n(414)(St.a),n(415)(St.a),n(416)(St.a);function Pt(e){return e.toLocaleLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/\u0142/g,"l")}function zt(e,t){return e.score!==t.score?t.score-e.score:At()(e.ref,t.ref)}var Wt=function(){function e(t){Object(A.a)(this,e),this.index=void 0,this.indiMap=void 0,this.famMap=void 0,this.indiMap=Q(t),this.famMap=$(t)}return Object(et.a)(e,[{key:"initialize",value:function(){var e=this;this.index=St()((function(){var t=this;this.use(St.a.multiLanguage("de","en","fr","it","ru")),this.ref("id"),this.field("id"),this.field("name",{boost:10}),this.field("normalizedName",{boost:8}),this.field("spouseLastName",{boost:2}),this.field("normalizedSpouseLastName",{boost:2}),e.indiMap.forEach((function(n){var a=[n.firstName,n.lastName].join(" "),r=function(e,t,n){return(e.fams||[]).map((function(e){return n.get(e)})).map((function(e){return e&&e.husb})).map((function(e){return e&&t.get(e)})).map((function(e){return e&&e.lastName})).join(" ")}(n,e.indiMap,e.famMap);t.add({id:n.id,name:a,normalizedName:Pt(a),spouseLastName:r,normalizedSpouseLastName:Pt(r)})}))}))}},{key:"search",value:function(e){var t=this,n=e.split(" ").filter((function(e){return!!e})).map((function(e){return"".concat(e," ").concat(e,"*")})).join(" ");return this.index.search(n).sort(zt).slice(0,8).map((function(e){return{id:e.ref,indi:t.indiMap.get(e.ref)}}))}}]),e}();var Gt=n(474);function Ft(e){var t=[e.indi.firstName,e.indi.lastName].join(" ").trim();return e.id.length>8?t:Object(R.jsxs)(R.Fragment,{children:[t," ",Object(R.jsxs)("i",{children:["(",e.id,")"]})]})}function Bt(e){var t=Object(a.useState)([]),n=Object(g.a)(t,2),r=n[0],i=n[1],o=Object(a.useState)(""),c=Object(g.a)(o,2),s=c[0],l=c[1],u=Object(a.useRef)(),d=Object(be.a)();function m(e){var t=V(e.birth,d),n=V(e.death,d);return n?"".concat(t," \u2013 ").concat(n):t}var f=Object(a.useRef)(Mt()((function(e){if(e){var t=u.current.search(e).map((function(e){return function(e){return{id:e.id,key:e.id,title:Ft(e),description:m(e.indi)}}(e)}));i(t)}}),200));return Object(a.useEffect)((function(){u.current=function(e){var t=new Wt(e);return t.initialize(),t}(e.data)}),[e.data]),Object(R.jsx)(Gt.a,{onSearchChange:function(e,t){return n=t.value,f.current(n),void l(n);var n},onResultSelect:function(t,n){return a=n.result.id,h("search_result_selected"),e.onSelection({id:a,generation:0}),void l("");var a},results:r,noResultsMessage:d.formatMessage({id:"menu.search.no_results",defaultMessage:"No results found"}),placeholder:d.formatMessage({id:"menu.search.placeholder",defaultMessage:"Search for people"}),selectFirstResult:!0,value:s,id:"search"})}var Ut=n(225),Ht=n.n(Ut);function Vt(e){return new Promise((function(t){var n=new FileReader;n.onload=function(e){t(e.target.result)},n.readAsText(e)}))}function Yt(e){var t=e.toLowerCase();return t.endsWith(".jpg")||t.endsWith(".png")}function qt(e){var t=Object(Oe.g)(),n=Object(Oe.h)();function a(){return(a=Object(f.a)(m.a.mark((function e(a){var r,i,o,c,s,l,u,d,f;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if((r=a.target.files)&&r.length){e.next=3;break}return e.abrupt("return");case 3:return i=Array.from(r),a.target.value="",h("upload_files_selected",{event_value:r.length}),o=1===i.length?i[0]:i.find((function(e){return e.name.toLowerCase().endsWith(".ged")}))||i[0],c=i.filter((function(e){return e.name!==o.name&&Yt(e.name)})).map((function(e){return{name:e.name,url:URL.createObjectURL(e)}})),s=new Map(c.map((function(e){return[e.name,e.url]}))),e.next=11,Vt(o);case 11:l=e.sent,u=c.map((function(e){return e.name})).sort().join("|"),d=Ht()(Ht()(l)+u),f=p.parse(n.search),(f.file===d?t.replace:t.push)({pathname:"/view",search:p.stringify({file:d}),state:{data:l,images:s}});case 17:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var r=Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(Ue.a,{name:"folder open"}),Object(R.jsx)(E.a,{id:"menu.open_file",defaultMessage:"Open file"})]});return Object(R.jsxs)(R.Fragment,{children:[e.menuType===_t.Menu?Object(R.jsx)("label",{htmlFor:"fileInput",children:Object(R.jsx)(It.a.Item,{as:"a",children:r})}):Object(R.jsx)(yt.a.Item,{as:"label",htmlFor:"fileInput",children:r}),Object(R.jsx)("input",{className:"hidden",type:"file",accept:".ged,image/*",id:"fileInput",multiple:!0,onChange:function(e){return a.apply(this,arguments)}})]})}var Kt=n(476),Jt=n(472);function Zt(e){var t=Object(a.useState)(!1),n=Object(g.a)(t,2),r=n[0],i=n[1],o=Object(a.useState)(""),c=Object(g.a)(o,2),s=c[0],l=c[1],u=Object(a.useRef)(null),d=Object(Oe.g)();function m(){i(!1),s&&(h("url_selected"),d.push({pathname:"/view",search:p.stringify({url:s})}))}return Object(a.useEffect)((function(){r&&(l(""),u.current.focus())}),[r]),Object(R.jsxs)(R.Fragment,{children:[Object(R.jsxs)(Tt,{onClick:function(){return i(!0)},menuType:e.menuType,children:[Object(R.jsx)(Ue.a,{name:"cloud download"}),Object(R.jsx)(E.a,{id:"menu.load_from_url",defaultMessage:"Load from URL"})]}),Object(R.jsxs)(w.a,{open:r,onClose:function(){return i(!1)},centered:!1,children:[Object(R.jsxs)(x.a,{children:[Object(R.jsx)(Ue.a,{name:"cloud download"}),Object(R.jsx)(E.a,{id:"load_from_url.title",defaultMessage:"Load from URL"})]}),Object(R.jsx)(w.a.Content,{children:Object(R.jsxs)(Kt.a,{onSubmit:m,children:[Object(R.jsx)(Jt.a,{placeholder:"https://",fluid:!0,value:s,onChange:function(e,t){return l(t.value)},ref:u}),Object(R.jsx)("p",{children:Object(R.jsx)(E.a,{id:"load_from_url.comment",defaultMessage:"Data from the URL will be loaded through {link} to avoid CORS issues.",values:{link:Object(R.jsx)("a",{href:"https://topola-cors-server.up.railway.app/",children:"topola-cors-server.up.railway.app"})}})})]})}),Object(R.jsxs)(w.a.Actions,{children:[Object(R.jsx)(_.a,{secondary:!0,onClick:function(){return i(!1)},children:Object(R.jsx)(E.a,{id:"load_from_url.cancel",defaultMessage:"Cancel"})}),Object(R.jsx)(_.a,{primary:!0,onClick:m,children:Object(R.jsx)(E.a,{id:"load_from_url.load",defaultMessage:"Load"})})]})]})]})}var Xt,Qt=n.p+"static/media/wikitree.7bffea31.png",$t=n(95);function en(e){var t=Object(a.useState)(!1),n=Object(g.a)(t,2),r=n[0],i=n[1],o=Object(a.useState)(""),c=Object(g.a)(o,2),s=c[0],l=c[1],u=Object(a.useRef)(null),d=Object(Oe.g)(),m=Object(Oe.h)();function f(){if(i(!1),s){h("wikitree_id_selected");var e=p.parse(m.search),t=void 0===e.standalone||e.standalone;d.push({pathname:"/view",search:p.stringify({indi:s,source:"wikitree",standalone:t})})}}function j(e,t){e.preventDefault(),l(t),u.current.focus()}return Object(a.useEffect)((function(){r&&(l(""),u.current.focus())}),[r]),Object(R.jsxs)(R.Fragment,{children:[Object(R.jsxs)(Tt,{menuType:e.menuType,onClick:function(){return i(!0)},children:[Object(R.jsx)("img",{src:Qt,alt:"WikiTree logo",className:"menu-icon"}),Object(R.jsx)(E.a,{id:"menu.select_wikitree_id",defaultMessage:"Select WikiTree ID"})]}),Object(R.jsxs)(w.a,{open:r,onClose:function(){return i(!1)},centered:!1,children:[Object(R.jsxs)(x.a,{children:[Object(R.jsx)("img",{src:Qt,alt:"WikiTree logo",style:{width:"32px",height:"32px"}}),Object(R.jsx)(E.a,{id:"select_wikitree_id.title",defaultMessage:"Select WikiTree ID"})]}),Object(R.jsx)(w.a.Content,{children:Object(R.jsxs)(Kt.a,{onSubmit:f,children:[Object(R.jsx)("p",{children:Object(R.jsx)(E.a,{id:"select_wikitree_id.comment",defaultMessage:"Enter a {wikiTreeLink} profile ID. Examples: {example1}, {example2}.",values:{wikiTreeLink:Object(R.jsx)("a",{href:"https://wikitree.com/",target:"_blank",rel:"noopener noreferrer",children:"WikiTree"}),example1:Object(R.jsx)("span",{onClick:function(e){return j(e,"Wojtyla-13")},className:"link-span",children:"Wojtyla-13"}),example2:Object(R.jsx)("span",{onClick:function(e){return j(e,"Sk\u0142odowska-2")},className:"link-span",children:"Sk\u0142odowska-2"})}})}),Object(R.jsx)(Jt.a,{fluid:!0,value:s,onChange:function(e,t){return l(t.value)},ref:u})]})}),Object(R.jsxs)(w.a.Actions,{children:[Object(R.jsx)(_.a,{secondary:!0,onClick:function(){return i(!1)},children:Object(R.jsx)(E.a,{id:"select_wikitree_id.cancel",defaultMessage:"Cancel"})}),Object(R.jsx)(_.a,{primary:!0,onClick:f,children:Object(R.jsx)(E.a,{id:"select_wikitree_id.load",defaultMessage:"Load"})})]})]})]})}function tn(e){var t=Object(be.a)();var n=Object($t.getLoggedInUserName)();if(!n)return Object(R.jsx)(R.Fragment,{children:Object(R.jsxs)(Tt,{menuType:e.menuType,onClick:function(){var e="".concat("https://apps.wikitree.com/apps/wiech13/topola-viewer").concat(window.location.hash);Object($t.navigateToLoginPage)(e)},children:[Object(R.jsx)("img",{src:Qt,alt:"WikiTree logo",className:"menu-icon"}),Object(R.jsx)(E.a,{id:"menu.wikitree_login",defaultMessage:"Log in to WikiTree"})]})});var a=t.formatMessage({id:"menu.wikitree_popup_username",defaultMessage:"Logged in to WikiTree as {username}"},{username:n});return Object(R.jsxs)(Tt,{menuType:e.menuType,title:a,children:[Object(R.jsx)("img",{src:Qt,alt:"WikiTree logo",className:"menu-icon"}),Object(R.jsx)(E.a,{id:"menu.wikitree_logged_in",defaultMessage:"Logged in"})]})}function nn(e){var t=Object(Oe.g)(),n=Object(Oe.h)();function a(e){var a=p.parse(n.search);a.view!==e&&(a.view=e,n.search=p.stringify(a),t.push(n))}function r(t){if(!e.showingChart)return null;var n=Object(R.jsxs)(R.Fragment,{children:[Object(R.jsxs)(yt.a.Item,{onClick:function(){return a("hourglass")},children:[Object(R.jsx)(Ue.a,{name:"hourglass"}),Object(R.jsx)(E.a,{id:"menu.hourglass",defaultMessage:"Hourglass chart"})]}),e.allowAllRelativesChart?Object(R.jsxs)(yt.a.Item,{onClick:function(){return a("relatives")},children:[Object(R.jsx)(Ue.a,{name:"users"}),Object(R.jsx)(E.a,{id:"menu.relatives",defaultMessage:"All relatives"})]}):null,Object(R.jsxs)(yt.a.Item,{onClick:function(){return a("fancy")},children:[Object(R.jsx)(Ue.a,{name:"users"}),Object(R.jsx)(E.a,{id:"menu.fancy",defaultMessage:"Fancy tree (experimental)"})]})]});switch(t){case Xt.LARGE:return Object(R.jsxs)(R.Fragment,{children:[Object(R.jsxs)(It.a.Item,{onClick:e.eventHandlers.onPrint,children:[Object(R.jsx)(Ue.a,{name:"print"}),Object(R.jsx)(E.a,{id:"menu.print",defaultMessage:"Print"})]}),Object(R.jsx)(yt.a,{trigger:Object(R.jsxs)("div",{children:[Object(R.jsx)(Ue.a,{name:"download"}),Object(R.jsx)(E.a,{id:"menu.download",defaultMessage:"Download"})]}),className:"item",children:Object(R.jsxs)(yt.a.Menu,{children:[Object(R.jsx)(yt.a.Item,{onClick:e.eventHandlers.onDownloadPdf,children:Object(R.jsx)(E.a,{id:"menu.pdf_file",defaultMessage:"PDF file"})}),Object(R.jsx)(yt.a.Item,{onClick:e.eventHandlers.onDownloadPng,children:Object(R.jsx)(E.a,{id:"menu.png_file",defaultMessage:"PNG file"})}),Object(R.jsx)(yt.a.Item,{onClick:e.eventHandlers.onDownloadSvg,children:Object(R.jsx)(E.a,{id:"menu.svg_file",defaultMessage:"SVG file"})})]})}),Object(R.jsx)(yt.a,{trigger:Object(R.jsxs)("div",{children:[Object(R.jsx)(Ue.a,{name:"eye"}),Object(R.jsx)(E.a,{id:"menu.view",defaultMessage:"View"})]}),className:"item",children:Object(R.jsx)(yt.a.Menu,{children:n})}),Object(R.jsx)(Bt,Object(Dt.a)({data:e.data,onSelection:e.eventHandlers.onSelection},e))]});case Xt.SMALL:return Object(R.jsxs)(R.Fragment,{children:[Object(R.jsxs)(yt.a.Item,{onClick:e.eventHandlers.onPrint,children:[Object(R.jsx)(Ue.a,{name:"print"}),Object(R.jsx)(E.a,{id:"menu.print",defaultMessage:"Print"})]}),Object(R.jsx)(yt.a.Divider,{}),Object(R.jsxs)(yt.a.Item,{onClick:e.eventHandlers.onDownloadPdf,children:[Object(R.jsx)(Ue.a,{name:"download"}),Object(R.jsx)(E.a,{id:"menu.download_pdf",defaultMessage:"Download PDF"})]}),Object(R.jsxs)(yt.a.Item,{onClick:e.eventHandlers.onDownloadPng,children:[Object(R.jsx)(Ue.a,{name:"download"}),Object(R.jsx)(E.a,{id:"menu.download_png",defaultMessage:"Download PNG"})]}),Object(R.jsxs)(yt.a.Item,{onClick:e.eventHandlers.onDownloadSvg,children:[Object(R.jsx)(Ue.a,{name:"download"}),Object(R.jsx)(E.a,{id:"menu.download_svg",defaultMessage:"Download SVG"})]}),Object(R.jsx)(yt.a.Divider,{}),n,Object(R.jsx)(yt.a.Divider,{})]})}}function i(){return Object(R.jsx)(It.a.Item,{children:Object(R.jsx)("b",{children:"Topola Genealogy"})})}function o(t){if(!e.standalone&&e.showWikiTreeMenus)switch(t){case Xt.LARGE:return Object(R.jsx)(en,Object(Dt.a)({menuType:_t.Menu},e));case Xt.SMALL:return Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(en,Object(Dt.a)({menuType:_t.Dropdown},e)),Object(R.jsx)(yt.a.Divider,{})]})}if(!e.standalone)return null;switch(t){case Xt.LARGE:return e.showingChart?Object(R.jsx)(yt.a,{trigger:Object(R.jsxs)("div",{children:[Object(R.jsx)(Ue.a,{name:"folder open"}),Object(R.jsx)(E.a,{id:"menu.open",defaultMessage:"Open"})]}),className:"item",children:Object(R.jsxs)(yt.a.Menu,{children:[Object(R.jsx)(qt,Object(Dt.a)({menuType:_t.Dropdown},e)),Object(R.jsx)(Zt,Object(Dt.a)({menuType:_t.Dropdown},e)),Object(R.jsx)(en,Object(Dt.a)({menuType:_t.Dropdown},e))]})}):Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(qt,Object(Dt.a)({menuType:_t.Menu},e)),Object(R.jsx)(Zt,Object(Dt.a)({menuType:_t.Menu},e)),Object(R.jsx)(en,Object(Dt.a)({menuType:_t.Menu},e))]});case Xt.SMALL:return Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(qt,Object(Dt.a)({menuType:_t.Dropdown},e)),Object(R.jsx)(Zt,Object(Dt.a)({menuType:_t.Dropdown},e)),Object(R.jsx)(en,Object(Dt.a)({menuType:_t.Dropdown},e)),Object(R.jsx)(yt.a.Divider,{})]})}}function c(t){return e.showWikiTreeMenus?Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(tn,Object(Dt.a)({menuType:t===Xt.SMALL?_t.Dropdown:_t.Menu},e)),t===Xt.SMALL?Object(R.jsx)(yt.a.Divider,{}):null]}):null}return Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(It.a,{as:bt,greaterThanOrEqual:"large",attached:"top",inverted:!0,color:"blue",size:"large",children:Object(R.jsxs)(R.Fragment,{children:[e.standalone?Object(R.jsx)(ve.b,{to:"/",children:i()}):null,o(Xt.LARGE),r(Xt.LARGE),Object(R.jsxs)(It.a.Menu,{position:"right",children:[c(Xt.LARGE),Object(R.jsx)(It.a.Item,{href:"https://github.com/PeWu/topola-viewer",target:"_blank",rel:"noopener noreferrer",children:Object(R.jsx)(E.a,{id:"menu.github",defaultMessage:"GitHub project"})})]})]})}),Object(R.jsx)(It.a,{as:bt,at:"small",attached:"top",inverted:!0,color:"blue",size:"large",children:Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(yt.a,{trigger:Object(R.jsx)("div",{children:Object(R.jsx)(Ue.a,{name:"sidebar"})}),className:"item",icon:null,children:Object(R.jsxs)(yt.a.Menu,{children:[o(Xt.SMALL),r(Xt.SMALL),c(Xt.SMALL),Object(R.jsx)(yt.a.Item,{href:"https://github.com/PeWu/topola-viewer",target:"_blank",rel:"noopener noreferrer",children:Object(R.jsx)(E.a,{id:"menu.github",defaultMessage:"GitHub project"})})]})}),e.standalone?Object(R.jsx)(ve.b,{to:"/",children:i()}):i()]})})]})}!function(e){e[e.LARGE=0]="LARGE",e[e.SMALL=1]="SMALL"}(Xt||(Xt={}));var an,rn,on,cn=n(488);!function(e){e[e.NO_COLOR=0]="NO_COLOR",e[e.COLOR_BY_SEX=1]="COLOR_BY_SEX",e[e.COLOR_BY_GENERATION=2]="COLOR_BY_GENERATION"}(an||(an={})),function(e){e[e.HIDE=0]="HIDE",e[e.SHOW=1]="SHOW"}(rn||(rn={})),function(e){e[e.HIDE=0]="HIDE",e[e.SHOW=1]="SHOW"}(on||(on={}));var sn={color:an.COLOR_BY_GENERATION,id:rn.SHOW,sex:on.SHOW},ln=new Map([["n",an.NO_COLOR],["g",an.COLOR_BY_GENERATION],["s",an.COLOR_BY_SEX]]),un=new Map;ln.forEach((function(e,t){return un.set(e,t)}));var dn=new Map([["h",rn.HIDE],["s",rn.SHOW]]),mn=new Map;dn.forEach((function(e,t){return mn.set(e,t)}));var fn=new Map([["h",on.HIDE],["s",on.SHOW]]),gn=new Map;function pn(e){var t,n,a,r,i,o,c=function(t){var n=e[t];return"string"===typeof n?n:void 0};return{color:null!==(t=ln.get(null!==(n=c("c"))&&void 0!==n?n:""))&&void 0!==t?t:sn.color,id:null!==(a=dn.get(null!==(r=c("i"))&&void 0!==r?r:""))&&void 0!==a?a:sn.id,sex:null!==(i=fn.get(null!==(o=c("s"))&&void 0!==o?o:""))&&void 0!==i?i:sn.sex}}function hn(e){return Object(R.jsx)(Kt.a,{className:"details",children:Object(R.jsxs)(Re.a.Group,{children:[Object(R.jsx)(Re.a,{children:Object(R.jsxs)(Re.a.Content,{children:[Object(R.jsx)(x.a,{sub:!0,children:Object(R.jsx)(E.a,{id:"config.colors",defaultMessage:"Colors"})}),Object(R.jsx)(Kt.a.Field,{className:"no-margin",children:Object(R.jsx)(cn.a,{radio:!0,label:Object(R.jsx)(E.a,{tagName:"label",id:"config.colors.NO_COLOR",defaultMessage:"none"}),name:"checkboxRadioGroup",value:"none",checked:e.config.color===an.NO_COLOR,onClick:function(){return e.onChange(Object(Dt.a)(Object(Dt.a)({},e.config),{},{color:an.NO_COLOR}))}})}),Object(R.jsx)(Kt.a.Field,{className:"no-margin",children:Object(R.jsx)(cn.a,{radio:!0,label:Object(R.jsx)(E.a,{tagName:"label",id:"config.colors.COLOR_BY_GENERATION",defaultMessage:"by generation"}),name:"checkboxRadioGroup",value:"generation",checked:e.config.color===an.COLOR_BY_GENERATION,onClick:function(){return e.onChange(Object(Dt.a)(Object(Dt.a)({},e.config),{},{color:an.COLOR_BY_GENERATION}))}})}),Object(R.jsx)(Kt.a.Field,{className:"no-margin",children:Object(R.jsx)(cn.a,{radio:!0,label:Object(R.jsx)(E.a,{tagName:"label",id:"config.colors.COLOR_BY_SEX",defaultMessage:"by sex"}),name:"checkboxRadioGroup",value:"gender",checked:e.config.color===an.COLOR_BY_SEX,onClick:function(){return e.onChange(Object(Dt.a)(Object(Dt.a)({},e.config),{},{color:an.COLOR_BY_SEX}))}})})]})}),Object(R.jsx)(Re.a,{children:Object(R.jsxs)(Re.a.Content,{children:[Object(R.jsx)(x.a,{sub:!0,children:Object(R.jsx)(E.a,{id:"config.ids",defaultMessage:"IDs"})}),Object(R.jsx)(Kt.a.Field,{className:"no-margin",children:Object(R.jsx)(cn.a,{radio:!0,label:Object(R.jsx)(E.a,{tagName:"label",id:"config.ids.HIDE",defaultMessage:"hide"}),name:"checkboxRadioGroup",value:"hide",checked:e.config.id===rn.HIDE,onClick:function(){return e.onChange(Object(Dt.a)(Object(Dt.a)({},e.config),{},{id:rn.HIDE}))}})}),Object(R.jsx)(Kt.a.Field,{className:"no-margin",children:Object(R.jsx)(cn.a,{radio:!0,label:Object(R.jsx)(E.a,{tagName:"label",id:"config.ids.SHOW",defaultMessage:"show"}),name:"checkboxRadioGroup",value:"show",checked:e.config.id===rn.SHOW,onClick:function(){return e.onChange(Object(Dt.a)(Object(Dt.a)({},e.config),{},{id:rn.SHOW}))}})})]})}),Object(R.jsx)(Re.a,{children:Object(R.jsxs)(Re.a.Content,{children:[Object(R.jsx)(x.a,{sub:!0,children:Object(R.jsx)(E.a,{id:"config.sex",defaultMessage:"Sex"})}),Object(R.jsx)(Kt.a.Field,{className:"no-margin",children:Object(R.jsx)(cn.a,{radio:!0,label:Object(R.jsx)(E.a,{tagName:"label",id:"config.sex.HIDE",defaultMessage:"hide"}),name:"checkboxRadioGroup",value:"hide",checked:e.config.sex===on.HIDE,onClick:function(){return e.onChange(Object(Dt.a)(Object(Dt.a)({},e.config),{},{sex:on.HIDE}))}})}),Object(R.jsx)(Kt.a.Field,{className:"no-margin",children:Object(R.jsx)(cn.a,{radio:!0,label:Object(R.jsx)(E.a,{tagName:"label",id:"config.sex.SHOW",defaultMessage:"show"}),name:"checkboxRadioGroup",value:"show",checked:e.config.sex===on.SHOW,onClick:function(){return e.onChange(Object(Dt.a)(Object(Dt.a)({},e.config),{},{sex:on.SHOW}))}})})]})})]})})}fn.forEach((function(e,t){return gn.set(e,t)}));var jn,bn=n(74),On=n(147),vn=n(102),wn=n(226),xn=n(169),_n=(n(103),n(146));function kn(e,t){var n=Object(xn.a)("#svgContainer").node(),a=t.transform.k,r=Object(On.a)([0,(n.clientWidth-e[0]*a)/2]),i=Object(On.a)([0,(n.clientHeight-e[1]*a)/2]);Object(xn.a)("#chartSvg").attr("width",e[0]*a).attr("height",e[1]*a).attr("transform","translate(".concat(r,", ").concat(i,")")),Object(xn.a)("#chart").attr("transform","scale(".concat(a,")")),n.scrollLeft=-t.transform.x,n.scrollTop=-t.transform.y}function En(){var e=Object(xn.a)("#svgContainer").node(),t=e.scrollLeft+e.clientWidth/2,n=e.scrollTop+e.clientHeight/2,a=Object(_n.b)(e).k;Object(xn.a)(e).call(Object(_n.a)().translateTo,t/a,n/a)}function Rn(e){var t=new FileReader;return t.readAsDataURL(e),new Promise((function(e,n){t.onload=function(t){return e(t.target.result)}}))}function Dn(e){return yn.apply(this,arguments)}function yn(){return(yn=Object(f.a)(m.a.mark((function e(t){var n,a,r,i;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.href.baseVal){e.next=3;break}return e.abrupt("return");case 3:return e.prev=3,e.next=6,fetch(n);case 6:return a=e.sent,e.next=9,a.blob();case 9:return r=e.sent,e.next=12,Rn(r);case 12:i=e.sent,t.href.baseVal=i,e.next=19;break;case 16:e.prev=16,e.t0=e.catch(3),console.warn("Failed to load image:",e.t0);case 19:case"end":return e.stop()}}),e,null,[[3,16]])})))).apply(this,arguments)}function In(e){return Tn.apply(this,arguments)}function Tn(){return(Tn=Object(f.a)(m.a.mark((function e(t){var n;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=Array.from(t.getElementsByTagName("image")),e.next=3,Promise.all(n.map(Dn));case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Nn(e){var t=new Image;return t.src=URL.createObjectURL(e),new Promise((function(e,n){t.addEventListener("load",(function(){return e(t)}))}))}function Mn(e){var t=document.createElement("canvas");t.width=2*e.width,t.height=2*e.height;var n=t.getContext("2d"),a=n.fillStyle;return n.fillStyle="white",n.fillRect(0,0,t.width,t.height),n.fillStyle=a,n.drawImage(e,0,0,t.width,t.height),t}function Cn(e,t){return new Promise((function(n,a){e.toBlob((function(e){e?n(e):a()}),t)}))}function Sn(){var e=document.getElementById("chartSvg").cloneNode(!0);e.removeAttribute("transform");var t=Object(xn.a)("#svgContainer").node(),n=Object(_n.b)(t).k;return e.setAttribute("width",String(Number(e.getAttribute("width"))/n)),e.setAttribute("height",String(Number(e.getAttribute("height"))/n)),e.querySelector("#chart").removeAttribute("transform"),e}function Ln(){return An.apply(this,arguments)}function An(){return(An=Object(f.a)(m.a.mark((function e(){var t;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=Sn(),e.next=3,In(t);case 3:return e.abrupt("return",(new XMLSerializer).serializeToString(t));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Pn(){var e=document.createElement("iframe");e.style.position="absolute",e.style.top="-1000px",e.style.left="-1000px",e.onload=function(){e.contentDocument.open(),e.contentDocument.write((new XMLSerializer).serializeToString(Sn())),e.contentDocument.close(),setTimeout((function(){e.contentWindow.focus(),e.contentWindow.print(),e.parentNode.removeChild(e)}),500)},document.body.appendChild(e)}function zn(){return(zn=Object(f.a)(m.a.mark((function e(){var t,n;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ln();case 2:t=e.sent,n=new Blob([t],{type:"image/svg+xml"}),Object(wn.saveAs)(n,"topola.svg");case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Wn(){return Gn.apply(this,arguments)}function Gn(){return(Gn=Object(f.a)(m.a.mark((function e(){var t,n;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ln();case 2:return t=e.sent,n=new Blob([t],{type:"image/svg+xml"}),e.t0=Mn,e.next=7,Nn(n);case 7:return e.t1=e.sent,e.abrupt("return",(0,e.t0)(e.t1));case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Fn(){return Bn.apply(this,arguments)}function Bn(){return(Bn=Object(f.a)(m.a.mark((function e(){var t,n;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Wn();case 2:return t=e.sent,e.next=5,Cn(t,"image/png");case 5:n=e.sent,Object(wn.saveAs)(n,"topola.png");case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Un(){return Hn.apply(this,arguments)}function Hn(){return(Hn=Object(f.a)(m.a.mark((function e(){var t,a,r,i;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n.e(4).then(n.bind(null,864));case 2:return t=e.sent,a=t.default,e.next=6,Wn();case 6:r=e.sent,(i=new a({orientation:r.width>r.height?"l":"p",unit:"pt",format:[r.width,r.height]})).addImage(r,"PNG",0,0,r.width,r.height,"NONE"),i.save("topola.pdf");case 10:case"end":return e.stop()}}),e)})))).apply(this,arguments)}!function(e){e[e.Hourglass=0]="Hourglass",e[e.Relatives=1]="Relatives",e[e.Fancy=2]="Fancy"}(jn||(jn={}));var Vn=new Map([[an.NO_COLOR,F.ChartColors.NO_COLOR],[an.COLOR_BY_GENERATION,F.ChartColors.COLOR_BY_GENERATION],[an.COLOR_BY_SEX,F.ChartColors.COLOR_BY_SEX]]);function Yn(e){switch(e){case jn.Hourglass:return F.HourglassChart;case jn.Relatives:return F.RelativesChart;case jn.Fancy:return F.FancyChart;default:return F.HourglassChart}}function qn(e){switch(e){case jn.Fancy:return F.CircleRenderer;default:return F.DetailedRenderer}}var Kn=function(){function e(){Object(A.a)(this,e),this.chart=void 0,this.animating=!1,this.rerenderRequired=!1,this.zoomBehavior=void 0,this.rerenderProps=void 0,this.rerenderResetPosition=void 0}return Object(et.a)(e,[{key:"zoom",value:function(e){var t=Object(xn.a)("#svgContainer");this.zoomBehavior.scaleBy(t,e)}},{key:"renderChart",value:function(e,t){var n=this,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{initialRender:!1,resetPosition:!1};if(!a.initialRender&&this.animating)return this.rerenderRequired=!0,this.rerenderProps=e,void(this.rerenderResetPosition=a.resetPosition);if(a.initialRender||!e.freezeAnimation){a.initialRender?(Object(xn.a)("#chart").node().innerHTML="",this.chart=Object(F.createChart)({json:e.data,chartType:Yn(e.chartType),renderer:qn(e.chartType),svgSelector:"#chart",indiCallback:function(t){return e.onSelection(t)},colors:Vn.get(e.colors),animate:!0,updateSvgSize:!1,locale:t.locale})):this.chart.setData(e.data);var r=this.chart.render({startIndi:e.selection.id,baseGeneration:e.selection.generation}),i=Object(xn.a)("#chartSvg"),o=Object(xn.a)("#svgContainer").node(),c=Object(_n.b)(o).k,s=Object(vn.a)([1,c,o.clientWidth/r.size[0],o.clientHeight/r.size[1]]),l=[Object(On.a)([.1,s]),2];this.zoomBehavior=Object(_n.a)().scaleExtent(l).translateExtent([[0,0],r.size]).on("zoom",(function(e){return kn(r.size,e)})),Object(xn.a)(o).on("scroll",En).call(this.zoomBehavior);var u=function(e){return function(){var t=Object(bn.a)(o.scrollTop,e);return function(e){o.scrollTop=t(e)}}},d=function(e){return function(){var t=Object(bn.a)(o.scrollLeft,e);return function(e){o.scrollLeft=t(e)}}},m=o.clientWidth/2-r.origin[0]*c,f=o.clientHeight/2-r.origin[1]*c,g=Object(On.a)([0,(o.clientWidth-r.size[0]*c)/2]),p=Object(On.a)([0,(o.clientHeight-r.size[1]*c)/2]),h=i.transition().delay(200).duration(500),j=a.initialRender?i:h;j.attr("transform","translate(".concat(g,", ").concat(p,")")).attr("width",r.size[0]*c).attr("height",r.size[1]*c),a.resetPosition&&(a.initialRender?(o.scrollLeft=-m,o.scrollTop=-f):h.tween("scrollLeft",d(-m)).tween("scrollTop",u(-f))),this.animating=!0,r.animationPromise.then((function(){n.animating=!1,n.rerenderRequired&&(n.rerenderRequired=!1,n.renderChart(n.rerenderProps,t,{initialRender:!1,resetPosition:!!n.rerenderResetPosition}))}))}}}]),e}();function Jn(e){var t=Object(a.useRef)(new Kn),n=function(e){var t=Object(a.useRef)();return Object(a.useEffect)((function(){t.current=e})),t.current}(e),r=Object(be.a)();return Object(a.useEffect)((function(){if(n){var a=e.chartType!==(null===n||void 0===n?void 0:n.chartType)||e.colors!==(null===n||void 0===n?void 0:n.colors)||e.hideIds!==(null===n||void 0===n?void 0:n.hideIds)||e.hideSex!==(null===n||void 0===n?void 0:n.hideSex),i=e.chartType!==(null===n||void 0===n?void 0:n.chartType)||e.data!==n.data||e.selection!==n.selection;t.current.renderChart(e,r,{initialRender:a,resetPosition:i})}else t.current.renderChart(e,r,{initialRender:!0,resetPosition:!0})})),Object(R.jsxs)("div",{id:"svgContainer",children:[Object(R.jsxs)(bt,{greaterThanOrEqual:"large",className:"zoom",children:[Object(R.jsx)("button",{className:"zoom-in",onClick:function(){return t.current.zoom(1.3)},children:"+"}),Object(R.jsx)("button",{className:"zoom-out",onClick:function(){return t.current.zoom(1/1.3)},children:"\u2212"})]}),Object(R.jsx)("svg",{id:"chartSvg",children:Object(R.jsx)("g",{id:"chart"})})]})}var Zn=n(280),Xn="topola-viewer",Qn="~Private";function $n(e){try{return sessionStorage.getItem(e)}catch(t){console.warn("Failed to load data from session storage: "+t)}return null}function ea(e,t){try{sessionStorage.setItem(e,t)}catch(n){console.warn("Failed to store data in session storage: "+n)}}function ta(e){return Object.assign({appId:Xn},e?{apiUrl:"https://topola-cors-server.up.railway.app/https://api.wikitree.com/api.php"}:{})}function na(e,t){return aa.apply(this,arguments)}function aa(){return(aa=Object(f.a)(m.a.mark((function e(t,n){var a,r,i;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a="wikitree:ancestors:".concat(t),!(r=$n(a))){e.next=4;break}return e.abrupt("return",JSON.parse(r));case 4:return e.next=6,Object($t.getAncestors)(t,{},ta(n));case 6:return i=e.sent,ea(a,JSON.stringify(i)),e.abrupt("return",i);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ra(e,t){return ia.apply(this,arguments)}function ia(){return(ia=Object(f.a)(m.a.mark((function e(t,n){var a,r,i,o;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=[],r=[],t.forEach((function(e){var t=$n("wikitree:relatives:".concat(e));t?a.push(JSON.parse(t)):r.push(e)})),0!==r.length){e.next=5;break}return e.abrupt("return",a);case 5:return e.next=7,Object($t.getRelatives)(r,{getChildren:!0,getSpouses:!0},ta(n));case 7:if(i=e.sent){e.next=11;break}throw o=r[0],new G("WIKITREE_PROFILE_NOT_FOUND","WikiTree profile ".concat(o," not found"),{id:o});case 11:return i.forEach((function(e){ea("wikitree:relatives:".concat(e.Name),JSON.stringify(e))})),e.abrupt("return",a.concat(i));case 13:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function oa(e,t,n){return ca.apply(this,arguments)}function ca(){return(ca=Object(f.a)(m.a.mark((function e(t,n,a){var r,i,o,c,s,l,u,d,f,p,h,j,b,O,v,w,x,_,k,E,R,D,y,I,T,N,C,S;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if((i="apps.wikitree.com"!==window.location.hostname)||Object($t.getLoggedInUserName)()||!a){e.next=6;break}return e.next=4,Object($t.clientLogin)(a,{appId:Xn});case 4:"Success"===e.sent.result&&sessionStorage.clear();case 6:return o=[],e.next=9,ra([t],i);case 9:if(c=e.sent,null===(r=c[0])||void 0===r?void 0:r.Name){e.next=13;break}throw new G("WIKITREE_PROFILE_NOT_ACCESSIBLE","WikiTree profile ".concat(s=t," is not accessible. Try logging in."),{id:s});case 13:return l=Object.values(c[0].Spouses||{}).map((function(e){return e.Name})),e.next=16,Promise.all([t].concat(l).map((function(e){return na(e,i)})));case 16:return u=e.sent,d=u.flat().map((function(e){return e.Name})).filter((function(e){return!!e})),e.next=20,ra(d,i);case 20:f=e.sent,p=new Map,h=new Map,u.forEach((function(e,t){var n=1e3*t;e.forEach((function(e){e.Id<0&&(e.Id-=n,e.Name="".concat(Qn).concat(e.Id)),e.Father<0&&(e.Father-=n,p.set(e.Id,e.Father)),e.Mother<0&&(e.Mother-=n,h.set(e.Id,e.Mother))}))})),f.forEach((function(e){var t=p.get(e.Id);t&&(e.Father=t);var n=h.get(e.Id);n&&(e.Mother=n)})),o.push.apply(o,Object(M.a)(f)),j=u.flat().filter((function(e){return e.Id<0})),o.push.apply(o,Object(M.a)(j)),b=5,O=[t],v=0;case 31:if(!(O.length>0&&v<=b)){e.next=42;break}return e.next=34,ra(O,i);case 34:w=e.sent,o.push.apply(o,Object(M.a)(w)),x=w.flatMap((function(e){return Object.values(e.Spouses||{})})),o.push.apply(o,Object(M.a)(x)),O=w.flatMap((function(e){return Object.values(e.Children||{}).map((function(e){return e.Name}))})),v++,e.next=31;break;case 42:return _=new Map,k=new Map,E=new Map,R=new Map,D=new Map,y=new Map,o.forEach((function(e){if(D.set(e.Id,e.Name),e.Mother||e.Father){var t=sa(e.Mother,e.Father);va(k,e.Mother).add(t),va(k,e.Father).add(t),va(E,t).add(e.Id),R.set(t,{wife:e.Mother||void 0,husband:e.Father||void 0})}})),I=[],T=new Set,o.forEach((function(e){var t;if(!T.has(e.Id)){T.add(e.Id);var a=la(e,n);(null===(t=e.PhotoData)||void 0===t?void 0:t.path)&&y.set(e.Name,"https://www.wikitree.com".concat(e.PhotoData.path)),_.set(e.Name,da(e)),e.Spouses&&Object.values(e.Spouses).forEach((function(t){var n=sa(e.Id,t.Id);va(k,e.Id).add(n),va(k,t.Id).add(n);var a="Male"===e.Gender?{wife:t.Id,husband:e.Id,spouse:t}:{wife:e.Id,husband:t.Id,spouse:t};R.set(n,a)})),a.fams=Array.from(va(k,e.Id)),I.push(a)}})),N=Array.from(R.entries()).map((function(e){var t=Object(g.a)(e,2),n=t[0],a=t[1],r={id:n},i=a.wife&&D.get(a.wife);i&&(r.wife=i);var o=a.husband&&D.get(a.husband);if(o&&(r.husb=o),r.children=Array.from(va(E,n)).map((function(e){return D.get(e)})),a.spouse&&(a.spouse.marriage_date&&"0000-00-00"!==a.spouse.marriage_date||a.spouse.marriage_location)){var c=ma(a.spouse.marriage_date);r.marriage=Object.assign({},c,{place:a.spouse.marriage_location})}return r})),C=oe({indis:I,fams:N}),S=Oa(C,y,_),e.abrupt("return",{chartData:C,gedcom:S});case 56:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function sa(e,t){return t>e?"".concat(e,"_").concat(t):"".concat(t,"_").concat(e)}function la(e,t){var n={id:e.Name};if(e.Name.startsWith(Qn)&&(n.hideId=!0,n.firstName=t.formatMessage({id:"wikitree.private",defaultMessage:"Private"})),e.FirstName&&"Unknown"!==e.FirstName?n.firstName=e.FirstName:e.RealName&&"Unknown"!==e.RealName&&(n.firstName=e.RealName),"Unknown"!==e.LastNameAtBirth&&(n.lastName=e.LastNameAtBirth),(e.Mother||e.Father)&&(n.famc=sa(e.Mother,e.Father)),"Male"===e.Gender?n.sex="M":"Female"===e.Gender&&(n.sex="F"),e.BirthDate&&"0000-00-00"!==e.BirthDate||e.BirthLocation||"unknown"!==e.BirthDateDecade){var a=ma(e.BirthDate,e.DataStatus&&e.DataStatus.BirthDate||void 0)||fa(e.BirthDateDecade);n.birth=Object.assign({},a,{place:e.BirthLocation})}if(e.DeathDate&&"0000-00-00"!==e.DeathDate||e.DeathLocation||"unknown"!==e.DeathDateDecade){var r=ma(e.DeathDate,e.DataStatus&&e.DataStatus.DeathDate||void 0)||fa(e.DeathDateDecade);n.death=Object.assign({},r,{place:e.DeathLocation})}return e.PhotoData&&(n.images=[{url:"https://www.wikitree.com".concat(e.PhotoData.url),title:e.Photo}]),n}function ua(e){if(e.Spouses&&"Unknown"!==e.LastNameCurrent&&e.LastNameCurrent!==e.LastNameAtBirth){var t=e.LastNameCurrent.split(/[- ,]/);return Object.entries(e.Spouses).flatMap((function(e){return Object(g.a)(e,2)[1].LastNameAtBirth.split(/[- ,]/)})).some((function(e){return t.some((function(t){return n=e,a=t,Zn.StringUtils.compareSimilarityPercent(n,a)>=75;var n,a}))}))?e.LastNameCurrent:void 0}}function da(e){return{birth:"Unknown"!==e.LastNameAtBirth?e.LastNameAtBirth:void 0,married:ua(e),aka:"Unknown"!==e.LastNameOther&&e.LastNameAtBirth!==e.LastNameOther&&e.LastNameCurrent!==e.LastNameOther?e.LastNameOther:void 0}}function ma(e,t){if(e){var n=e.match(/(\d\d\d\d)-(\d\d)-(\d\d)/);if(!n)return{date:{text:e}};var a={};return"0000"!==n[1]&&(a.year=~~n[1]),"00"!==n[2]&&(a.month=~~n[2]),"00"!==n[3]&&(a.day=~~n[3]),"after"===t?{dateRange:{from:a}}:"before"===t?{dateRange:{to:a}}:("guess"===t&&(a.qualifier="abt"),{date:a})}}function fa(e){return"unknown"!==e?{date:{text:e}}:void 0}var ga=new Map([[1,"JAN"],[2,"FEB"],[3,"MAR"],[4,"APR"],[5,"MAY"],[6,"JUN"],[7,"JUL"],[8,"AUG"],[9,"SEP"],[10,"OCT"],[11,"NOV"],[12,"DEC"]]);function pa(e){return[e.qualifier,e.day,ga.get(e.month),e.year].filter((function(e){return void 0!==e})).join(" ")}function ha(e,t,n){return{level:1,pointer:"",tag:"NAME",data:"".concat(t||""," /").concat(n||"","/"),tree:[{level:2,pointer:"",tag:"TYPE",data:e,tree:[]}]}}function ja(e){var t,n=[];return K(e)&&n.push({level:2,pointer:"",tag:"DATE",data:(t=e,t.date?pa(t.date):t.dateRange?t.dateRange.from&&t.dateRange.to?"BET ".concat(pa(t.dateRange.from)," AND ").concat(t.dateRange.to):t.dateRange.from?"AFT ".concat(pa(t.dateRange.from)):t.dateRange.to?"BEF ".concat(pa(t.dateRange.to)):"":""),tree:[]}),e.place&&n.push({level:2,pointer:"",tag:"PLAC",data:e.place,tree:[]}),n}function ba(e,t){var n,a;return[{level:2,pointer:"",tag:"FILE",data:t||e.url,tree:[{level:3,pointer:"",tag:"FORM",data:(null===(n=e.title)||void 0===n?void 0:n.split(".").pop())||"",tree:[]},{level:3,pointer:"",tag:"TITL",data:(null===(a=e.title)||void 0===a?void 0:a.split(".")[0])||"",tree:[]}]}]}function Oa(e,t,n){var a={},r={};return e.indis.forEach((function(e){a[e.id]=function(e,t,n){var a=e.id.replace(/ /g,"_"),r={level:0,pointer:"@".concat(e.id,"@"),tag:"INDI",data:"",tree:[]};return n.birth&&r.tree.push(ha("birth",e.firstName,n.birth)),n.married&&r.tree.push(ha("married",e.firstName,n.married)),n.aka&&r.tree.push(ha("aka",e.firstName,n.aka)),e.birth&&r.tree.push({level:1,pointer:"",tag:"BIRT",data:"",tree:ja(e.birth)}),e.death&&r.tree.push({level:1,pointer:"",tag:"DEAT",data:"",tree:ja(e.death)}),e.famc&&r.tree.push({level:1,pointer:"",tag:"FAMC",data:"@".concat(e.famc,"@"),tree:[]}),(e.fams||[]).forEach((function(e){return r.tree.push({level:1,pointer:"",tag:"FAMS",data:"@".concat(e,"@"),tree:[]})})),e.id.startsWith("~")||r.tree.push({level:1,pointer:"",tag:"WWW",data:"https://www.wikitree.com/wiki/".concat(a),tree:[]}),(e.images||[]).forEach((function(n){r.tree.push({level:1,pointer:"",tag:"OBJE",data:"",tree:ba(n,t.get(e.id))})})),r}(e,t,n.get(e.id)||{})})),e.fams.forEach((function(e){r[e.id]=function(e){var t={level:0,pointer:"@".concat(e.id,"@"),tag:"FAM",data:"",tree:[]};return e.wife&&t.tree.push({level:1,pointer:"",tag:"WIFE",data:"@".concat(e.wife,"@"),tree:[]}),e.husb&&t.tree.push({level:1,pointer:"",tag:"HUSB",data:"@".concat(e.husb,"@"),tree:[]}),(e.children||[]).forEach((function(e){return t.tree.push({level:1,pointer:e,tag:"CHILD",data:"",tree:[]})})),e.marriage&&t.tree.push({level:1,pointer:"",tag:"MARR",data:"",tree:ja(e.marriage)}),t}(e)})),{head:{level:0,pointer:"",tag:"HEAD",data:"",tree:[]},indis:a,fams:r,other:{}}}function va(e,t){var n=e.get(t);if(n)return n;var a=new Set;return e.set(t,a),a}var wa,xa=function(){function e(t){Object(A.a)(this,e),this.intl=t}return Object(et.a)(e,[{key:"isNewData",value:function(e,t,n){var a;return!!e.selection&&((null===(a=t.selection)||void 0===a?void 0:a.id)!==e.selection.id&&(!n||!n.chartData.indis.some((function(t){var n;return t.id===(null===(n=e.selection)||void 0===n?void 0:n.id)}))))}},{key:"loadData",value:function(){var e=Object(f.a)(m.a.mark((function e(t){var n;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t.selection){e.next=2;break}throw new G("WIKITREE_ID_NOT_PROVIDED","WikiTree id needs to be provided");case 2:return e.prev=2,e.next=5,oa(t.selection.id,this.intl,t.spec.authcode);case 5:return n=e.sent,h("wikitree_loaded"),e.abrupt("return",n);case 10:throw e.prev=10,e.t0=e.catch(2),h("wikitree_error"),e.t0;case 14:case"end":return e.stop()}}),e,this,[[2,10]])})));return function(t){return e.apply(this,arguments)}}()}]),e}();function _a(e){return Object(R.jsxs)(Be.a,{negative:!0,className:"error",children:[Object(R.jsx)(Be.a.Header,{children:Object(R.jsx)(E.a,{id:"error.failed_to_load_file",defaultMessage:"Failed to load file"})}),Object(R.jsx)("p",{children:e.message})]})}function ka(e){return Object(R.jsx)(kt.a,{open:e.open,onClose:e.onDismiss,children:Object(R.jsxs)(Be.a,{negative:!0,className:"errorPopup",onDismiss:e.onDismiss,children:[Object(R.jsx)(Be.a.Header,{children:Object(R.jsx)(E.a,{id:"error.error",defaultMessage:"Error"})}),Object(R.jsx)("p",{children:e.message})]})})}function Ea(e){var t=p.parse(e.search),n=function(e){var n=t[e];return"string"===typeof n?n:void 0},a=n("view"),r=new Map([["relatives",jn.Relatives],["fancy",jn.Fancy]]),i=n("file"),o=n("url"),c="true"===n("embedded"),s=void 0;"wikitree"===n("source")?s={source:j.WIKITREE,authcode:n("authcode")}:i?s={source:j.UPLOADED,hash:i,gedcom:e.state&&e.state.data,images:e.state&&e.state.images}:o?s={source:j.GEDCOM_URL,url:o,handleCors:"false"!==n("handleCors")}:c&&(s={source:j.EMBEDDED});var l=n("indi"),u=Number(n("gen"));return{sourceSpec:s,selection:l?{id:l,generation:isNaN(u)?0:u}:void 0,chartType:r.get(a)||jn.Hourglass,showSidePanel:"false"!==n("sidePanel"),standalone:"false"!==n("standalone")&&!c,showWikiTreeMenus:"false"!==n("showWikiTreeMenus"),freezeAnimation:"true"===n("freeze"),config:pn(t)}}!function(e){e[e.INITIAL=0]="INITIAL",e[e.LOADING=1]="LOADING",e[e.ERROR=2]="ERROR",e[e.SHOWING_CHART=3]="SHOWING_CHART",e[e.LOADING_MORE=4]="LOADING_MORE"}(wa||(wa={}));var Ra=n(281),Da=n(478),ya=(n(444),n(445),n(446),{cs:i,de:o,fr:c,it:s,pl:l,ru:u}),Ia=navigator.language&&navigator.language.split(/[-_]/)[0],Ta=Object(Ra.a)();Ta&&"ie"===Ta.name?r.render(Object(R.jsx)("p",{children:"Topola Genealogy Viewer does not support Internet Explorer. Please try a different (modern) browser."}),document.querySelector("#root")):r.render(Object(R.jsx)(Da.a,{locale:Ia,messages:ya[Ia],children:Object(R.jsxs)(Ot,{children:[Object(R.jsx)("style",{children:jt}),Object(R.jsx)(ve.a,{children:Object(R.jsx)(Oe.b,{component:function(){var e=Object(a.useState)(wa.INITIAL),t=Object(g.a)(e,2),n=t[0],r=t[1],i=Object(a.useState)(),o=Object(g.a)(i,2),c=o[0],s=o[1],l=Object(a.useState)(),u=Object(g.a)(l,2),d=u[0],b=u[1],O=Object(a.useState)(),v=Object(g.a)(O,2),w=v[0],x=v[1],_=Object(a.useState)(!1),k=Object(g.a)(_,2),E=k[0],D=k[1],y=Object(a.useState)(!0),I=Object(g.a)(y,2),T=I[0],M=I[1],C=Object(a.useState)(!0),S=Object(g.a)(C,2),L=S[0],A=S[1],P=Object(a.useState)(jn.Hourglass),z=Object(g.a)(P,2),W=z[0],G=z[1],F=Object(a.useState)(!1),B=Object(g.a)(F,2),U=B[0],H=B[1],V=Object(a.useState)(),Y=Object(g.a)(V,2),q=Y[0],K=Y[1],J=Object(a.useState)(!1),Z=Object(g.a)(J,2),X=Z[0],$=Z[1],ee=Object(a.useState)(sn),te=Object(g.a)(ee,2),ne=te[0],ae=te[1],re=Object(be.a)(),ie=Object(Oe.g)(),oe=Object(Oe.h)();function ce(e){d&&d.id===e.id&&d.generation===e.generation||b(e)}function se(e,t){if(void 0!==t){var n=e.id===rn.HIDE,a=e.sex===on.HIDE;Q(t.chartData).forEach((function(e){e.hideId=n,e.hideSex=a}))}}var le=new st,ue=new lt,de=new xa(re),me=new ut;function fe(e,t){if(!q||q.source!==e.source)return!0;var n={spec:e,selection:t},a={spec:q,selection:d};switch(n.spec.source){case j.UPLOADED:return le.isNewData(n,a,c);case j.GEDCOM_URL:return ue.isNewData(n,a,c);case j.WIKITREE:return de.isNewData(n,a,c);case j.EMBEDDED:return me.isNewData(n,a,c)}}function ge(e,t){switch(e.source){case j.UPLOADED:return le.loadData({spec:e,selection:t});case j.GEDCOM_URL:return ue.loadData({spec:e,selection:t});case j.WIKITREE:return de.loadData({spec:e,selection:t});case j.EMBEDDED:return me.loadData({spec:e,selection:t})}}function pe(e){var t=p.parse(oe.search);for(var n in e)t[n]=e[n];oe.search=p.stringify(t),ie.push(oe)}function he(e){e.id.startsWith(Qn)||(h("selection_changed"),pe({indi:e.id,gen:e.generation}))}function je(){h("print"),Pn()}function ve(e){H(!0),x(e)}function we(){return xe.apply(this,arguments)}function xe(){return(xe=Object(f.a)(m.a.mark((function e(){return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return h("download_pdf"),e.prev=1,e.next=4,Un();case 4:e.next=9;break;case 6:e.prev=6,e.t0=e.catch(1),ve(re.formatMessage({id:"error.failed_pdf",defaultMessage:"Failed to generate PDF file. Please try with a smaller diagram or download an SVG file."}));case 9:case"end":return e.stop()}}),e,null,[[1,6]])})))).apply(this,arguments)}function _e(){return ke.apply(this,arguments)}function ke(){return(ke=Object(f.a)(m.a.mark((function e(){return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return h("download_png"),e.prev=1,e.next=4,Fn();case 4:e.next=9;break;case 6:e.prev=6,e.t0=e.catch(1),ve(re.formatMessage({id:"error.failed_png",defaultMessage:"Failed to generate PNG file. Please try with a smaller diagram or download an SVG file."}));case 9:case"end":return e.stop()}}),e,null,[[1,6]])})))).apply(this,arguments)}function Ee(){h("download_svg"),function(){zn.apply(this,arguments)}()}function Re(){H(!1)}return Object(a.useEffect)((function(){Object(f.a)(m.a.mark((function e(){var t,a,i,o,c,l;return m.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("/view"===oe.pathname){e.next=3;break}return n!==wa.INITIAL&&r(wa.INITIAL),e.abrupt("return");case 3:if((t=Ea(oe)).sourceSpec){e.next=7;break}return ie.replace({pathname:"/"}),e.abrupt("return");case 7:if(n!==wa.INITIAL&&!fe(t.sourceSpec,t.selection)){e.next=31;break}return r(wa.LOADING),K(t.sourceSpec),b(t.selection),M(t.standalone),A(t.showWikiTreeMenus),G(t.chartType),$(t.freezeAnimation),ae(t.config),e.prev=16,e.next=19,ge(t.sourceSpec,t.selection);case 19:a=e.sent,s(a),se(t.config,a),D(t.showSidePanel),r(wa.SHOWING_CHART),e.next=29;break;case 26:e.prev=26,e.t0=e.catch(16),u=dt(e.t0,re),x(u),r(wa.ERROR);case 29:e.next=51;break;case 31:if(n!==wa.SHOWING_CHART&&n!==wa.LOADING_MORE){e.next=51;break}if(o=t.sourceSpec.source===j.WIKITREE&&(!d||d.id!==(null===(i=t.selection)||void 0===i?void 0:i.id)),G(t.chartType),r(o?wa.LOADING_MORE:wa.SHOWING_CHART),ce(t.selection),!o){e.next=51;break}return e.prev=37,e.next=40,oa(t.selection.id,re);case 40:c=e.sent,l=tt(c.chartData,t.selection),s(c),b(l),r(wa.SHOWING_CHART),e.next=51;break;case 47:e.prev=47,e.t1=e.catch(37),r(wa.SHOWING_CHART),ve(re.formatMessage({id:"error.failed_wikitree_load_more",defaultMessage:"Failed to load data from WikiTree. {error}"},{error:e.t1}));case 51:case"end":return e.stop()}var u}),e,null,[[16,26],[37,47]])})))()})),Object(R.jsxs)(R.Fragment,{children:[Object(R.jsx)(Oe.b,{render:function(){return Object(R.jsx)(nn,{data:null===c||void 0===c?void 0:c.chartData,allowAllRelativesChart:(null===q||void 0===q?void 0:q.source)!==j.WIKITREE,showingChart:"/view"===ie.location.pathname&&(n===wa.SHOWING_CHART||n===wa.LOADING_MORE),standalone:T,eventHandlers:{onSelection:he,onPrint:je,onDownloadPdf:we,onDownloadPng:_e,onDownloadSvg:Ee},showWikiTreeMenus:(null===q||void 0===q?void 0:q.source)===j.WIKITREE&&L})}}),Object(R.jsxs)(Oe.d,{children:[Object(R.jsx)(Oe.b,{exact:!0,path:"/",component:xt}),Object(R.jsx)(Oe.b,{exact:!0,path:"/view",render:function(){switch(n){case wa.SHOWING_CHART:case wa.LOADING_MORE:var e=tt(c.chartData,d),t=[{menuItem:re.formatMessage({id:"tab.info",defaultMessage:"Info"}),render:function(){return Object(R.jsx)($e,{gedcom:c.gedcom,indi:e.id})}},{menuItem:re.formatMessage({id:"tab.settings",defaultMessage:"Settings"}),render:function(){return Object(R.jsx)(hn,{config:ne,onChange:function(e){ae(e),se(e,c),pe(function(e){return{c:un.get(e.color),i:mn.get(e.id),s:gn.get(e.sex)}}(e))}})}}];return Object(R.jsxs)("div",{id:"content",children:[Object(R.jsx)(ka,{open:U,message:w,onDismiss:Re}),n===wa.LOADING_MORE?Object(R.jsx)(Et.a,{active:!0,size:"small",className:"loading-more"}):null,Object(R.jsx)(Jn,{data:c.chartData,selection:e,chartType:W,onSelection:he,freezeAnimation:X,colors:ne.color,hideIds:ne.id,hideSex:ne.sex}),E?Object(R.jsx)(bt,{greaterThanOrEqual:"large",className:"sidePanel",children:Object(R.jsx)(Rt.a,{panes:t})}):null,Object(R.jsx)(N,{})]});case wa.ERROR:return Object(R.jsx)(_a,{message:w});case wa.INITIAL:case wa.LOADING:return Object(R.jsx)(Et.a,{active:!0,size:"large"})}}}),Object(R.jsx)(Oe.a,{to:"/"})]})]})}})})]})}),document.querySelector("#root"))}},[[447,1,2]]]); +//# sourceMappingURL=main.9e687484.chunk.js.map \ No newline at end of file diff --git a/static/js/main.70be27a1.chunk.js.map b/static/js/main.9e687484.chunk.js.map similarity index 99% rename from static/js/main.70be27a1.chunk.js.map rename to static/js/main.9e687484.chunk.js.map index 9f69a9b..527c984 100644 --- a/static/js/main.70be27a1.chunk.js.map +++ b/static/js/main.9e687484.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["util/analytics.ts","datasource/data_source.ts","changelog.tsx","util/error.ts","util/date_util.ts","util/gedcom_util.ts","util/age_util.ts","details/multiline-text.tsx","details/translated-tag.tsx","details/events.tsx","details/wrapped-image.tsx","details/details.tsx","datasource/load_data.ts","datasource/embedded.ts","util/error_i18n.ts","topola.jpg","util/media.ts","intro.tsx","menu/menu_item.tsx","menu/search_index.ts","menu/search.tsx","menu/upload_menu.tsx","menu/url_menu.tsx","menu/wikitree.png","menu/top_bar.tsx","menu/wikitree_menu.tsx","config.tsx","chart.tsx","datasource/wikitree.ts","app.tsx","index.tsx"],"names":["analyticsEvent","action","data","window","gtag","DataSourceEnum","LAST_SEEN_VERSION_KEY","getChangelog","maxVersions","seenVersion","a","seenVersionDate","Date","parse","slice","changes","process","split","map","notes","date","trim","filter","release","join","unified","use","remarkParse","remarkRehype","rehypeStringify","parsedChanges","String","updateSeenVersion","localStorage","setItem","Changelog","useState","open","setOpen","changelog","setChangelog","useEffect","getItem","Modal","centered","Header","id","defaultMessage","Content","className","dangerouslySetInnerHTML","__html","href","Actions","Button","primary","onClick","TopolaError","code","message","args","Error","DATE_QUALIFIERS","Map","formatDate","intl","hasDay","undefined","day","hasMonth","month","hasYear","year","text","dateObject","toDateObject","formatOptions","formatDateQualifier","qualifier","Intl","DateTimeFormat","locale","format","lowerCaseQualifier","toLowerCase","formatMessage","get","formatDateOrRange","dateOrRange","dateRange","fromDate","from","toDate","to","translatedFromDate","translatedToDate","formatDateRage","compareTopolaDates","date1","date2","compareDates","firstDateOrRange","secondDateOrRange","isValidDateOrRange","isDateRangeClosed","range","pointerToId","pointer","substring","length","idToIndiMap","indis","forEach","indi","set","idToFamMap","fams","fam","prepareGedcom","entries","head","find","entry","tag","other","strcmp","b","sortChildren","gedcom","comparator","indiMap","indiId1","indiId2","indi1","indi2","birth","birthDatesComparator","newFams","children","newChildren","sort","Object","assign","sortFamilyChildren","sortSpouses","famMap","famId1","famId2","fam1","fam2","marriage","marriageDatesComparator","newIndis","sortIndiSpouses","dereference","getterFunction","dereferenced","getData","result","tree","subentry","last","push","normalizeGedcom","IMAGE_EXTENSIONS","isImageFile","fileName","lowerName","some","ext","endsWith","filterImages","images","newImages","image","url","match","has","title","startsWith","filterImage","getSoftware","sour","name","getFileName","fileEntry","fileTitle","fileExtension","formatAgeMoreThan","birthDate","deathDate","ageInYears","calcDateDifferenceInYears","age","formatAgeLessThan","formatAgeBetween","birthDateFrom","birthDateTo","deathDateFrom","deathDateTo","ageInYearsFrom","ageInYearsTo","ageFrom","ageTo","canCalculateAge","range1","range2","firstDate","secondDate","firstDateObject","secondDateObject","startYear","getUTCFullYear","yearDiff","monthDiff","getUTCMonth","getUTCDate","Math","abs","calcAge","birthGedcomDate","deathGedcomDate","birthDateOrRange","getDate","deathDateOrRange","translatedQualifier","formatExactAge","MultilineText","props","lines","line","index","properties","target","TAG_DESCRIPTIONS","TranslatedTag","normalizedTag","replace","PersonLink","location","useLocation","person","names","subEntry","nameEntry","getName","search","queryString","Item","Meta","pathname","EVENT_TAGS","FAMILY_EVENT_TAGS","EventHeader","useIntl","as","size","event","type","textAlign","sub","getSpouse","familyEntry","spouseReference","familySubEntry","includes","getAge","eventEntry","resolveDate","indiSubEntry","birthEvent","topolaDate","eventPlace","place","eventNotes","note","toEvent","family","flatMap","familyMarriageEvent","personLink","toFamilyEvents","toIndiEvent","Event","Description","Events","events","event1","event2","WrappedImage","imageOpen","setImageOpen","imageLoaded","setImageLoaded","imageFailed","setImageFailed","imageSrc","setImageSrc","onLoad","onError","e","currentTarget","alt","src","filename","Placeholder","Image","square","Container","fluid","Message","negative","compact","basic","closeIcon","Icon","color","onClose","onOpen","label","Label","attached","content","wrapped","EXCLUDED_TAGS","fileDetails","objectEntry","imageFileEntry","noteDetails","nameDetails","fullName","replaceAll","nameType","getDetails","tags","detailsFunction","element","hasData","getOtherDetails","dataDetails","Details","entriesWithData","Group","divided","getSelection","selection","i","generation","prepareData","cacheId","parseGedcom","json","gedcomEntriesToJson","chartData","convertGedcom","serializedData","JSON","stringify","sessionStorage","console","warn","loadFromUrl","handleCors","cachedData","driveUrlMatch1","driveUrlMatch2","urlToFetch","fetch","response","status","statusText","loadGedcom","hash","EmbeddedMessageType","UploadedDataSource","newSource","oldSource","spec","source","event_label","event_value","GedcomUrlDataSource","EmbeddedDataSource","resolve","reject","PARENT_READY","parent","postMessage","READY","GEDCOM","Promise","addEventListener","onMessage","getI18nMessage","error","AppMedia","createMedia","breakpoints","small","large","mediaStyles","createMediaStyle","Media","MediaContextProvider","GedcomLink","Contents","dateString","values","link","Intro","Card","greaterThanOrEqual","Grid","Row","Column","width","logo","at","MenuType","MenuItem","newProps","menuType","Menu","Dropdown","require","lunr","normalize","input","toLocaleLowerCase","compare","score","naturalSort","ref","LunrSearchIndex","this","self","multiLanguage","field","boost","firstName","lastName","spouseLastName","famId","husb","husbId","husband","getHusbandLastName","add","normalizedName","normalizedSpouseLastName","query","s","getNameLine","SearchBar","searchResults","setSearchResults","searchString","setSearchString","searchIndex","useRef","getDescriptionLine","death","debouncedHandleSearch","debounce","results","current","key","description","displaySearchResult","initialize","buildSearchIndex","Search","onSearchChange","_","value","onResultSelect","onSelection","noResultsMessage","placeholder","selectFirstResult","loadFileAsText","file","reader","FileReader","onload","evt","readAsText","isImageFileName","lower","UploadMenu","history","useHistory","files","filesArray","Array","gedcomFile","URL","createObjectURL","imageMap","imageFileNames","md5","state","htmlFor","accept","multiple","onChange","UrlMenu","dialogOpen","setDialogOpen","setUrl","inputRef","handleLoad","focus","Form","onSubmit","Input","secondary","ScreenSize","WikiTreeMenu","wikiTreeId","setWikiTreeId","handleSelectId","standalone","enterId","preventDefault","wikitreeLogo","style","height","wikiTreeLink","rel","example1","example2","WikiTreeLoginMenu","username","getLoggedInUserName","returnUrl","navigateToLoginPage","tooltip","TopBar","changeView","view","chartMenus","screenSize","showingChart","chartTypeItems","allowAllRelativesChart","LARGE","eventHandlers","onPrint","trigger","onDownloadPdf","onDownloadPng","onDownloadSvg","SMALL","Divider","fileMenus","showWikiTreeMenus","wikiTreeLoginMenu","inverted","position","icon","ChartColors","Ids","Sex","DEFALUT_CONFIG","COLOR_BY_GENERATION","SHOW","sex","COLOR_ARG","NO_COLOR","COLOR_BY_SEX","COLOR_ARG_INVERSE","v","k","ID_ARG","HIDE","ID_ARG_INVERSE","SEX_ARG","SEX_ARG_INVERSE","argsToConfig","getParam","ConfigPanel","Field","Checkbox","radio","tagName","checked","config","ChartType","zoomed","select","node","scale","transform","offsetX","max","clientWidth","offsetY","clientHeight","attr","scrollLeft","x","scrollTop","y","scrolled","zoomTransform","call","zoom","translateTo","loadAsDataUrl","blob","readAsDataURL","inlineImage","baseVal","dataUrl","inlineImages","svg","getElementsByTagName","all","loadImage","drawImageOnCanvas","canvas","document","createElement","ctx","getContext","oldFill","fillStyle","fillRect","drawImage","canvasToBlob","toBlob","getStrippedSvg","getElementById","cloneNode","removeAttribute","setAttribute","Number","getAttribute","querySelector","getSvgContentsWithInlinedImages","XMLSerializer","serializeToString","printChart","printWindow","top","left","contentDocument","write","close","setTimeout","contentWindow","print","parentNode","removeChild","body","appendChild","contents","Blob","saveAs","drawOnCanvas","downloadPng","downloadPdf","jspdf","default","doc","orientation","unit","addImage","save","chartColors","TopolaChartColors","getChartType","chartType","Hourglass","HourglassChart","Relatives","RelativesChart","Fancy","FancyChart","getRendererType","CircleRenderer","DetailedRenderer","ChartWrapper","chart","animating","rerenderRequired","zoomBehavior","rerenderProps","rerenderResetPosition","factor","scaleBy","initialRender","resetPosition","freezeAnimation","innerHTML","createChart","renderer","svgSelector","indiCallback","info","colors","animate","updateSvgSize","setData","chartInfo","render","startIndi","baseGeneration","zoomOutFactor","min","extent","scaleExtent","translateExtent","on","scrollTopTween","interpolateNumber","t","scrollLeftTween","dx","origin","dy","svgTransition","transition","delay","duration","tween","animationPromise","then","renderChart","Chart","chartWrapper","prevProps","usePrevious","hideIds","hideSex","WIKITREE_APP_ID","PRIVATE_ID_PREFIX","getSessionStorageItem","setSessionStorageItem","getApiOptions","appId","apiUrl","getAncestors","cacheKey","getAncestorsApi","getRelatives","keys","keysToFetch","getRelativesApi","getChildren","getSpouses","Name","concat","loadWikiTree","authcode","hostname","clientLogin","clear","everyone","firstPerson","spouseKeys","Spouses","personId","ancestors","ancestorKeys","flat","ancestorDetails","privateFathers","privateMothers","ancestorList","offset","Id","Father","Mother","privateFather","privateMother","privateAncestors","descendantGenerationLimit","toFetch","people","allSpouses","Children","c","personNames","families","spouses","idToName","fullSizePhotoUrls","getFamilyId","getSet","wife","converted","Set","convertPerson","PhotoData","path","convertPersonNames","spouse","familySpouses","Gender","child","marriage_date","marriage_location","parsedDate","parseDate","buildGedcom","spouse1","spouse2","hideId","FirstName","RealName","LastNameAtBirth","famc","BirthDate","BirthLocation","BirthDateDecade","DataStatus","parseDecade","DeathDate","DeathLocation","DeathDateDecade","Photo","getMarriedName","LastNameCurrent","nameParts","spousePersonNamePart","personNamePart","name1","name2","StringUtils","compareSimilarityPercent","married","aka","LastNameOther","dataStatus","matchedDate","decade","MONTHS","dateToGedcom","nameToGedcom","level","eventToGedcom","imageToGedcom","fullSizePhotoUrl","pop","gedcomIndis","gedcomFams","escapedId","record","indiToGedcom","famToGedcom","newSet","AppState","WikiTreeDataSource","ErrorMessage","ErrorPopup","Portal","onDismiss","getArguments","chartTypes","embedded","sourceSpec","WIKITREE","UPLOADED","GEDCOM_URL","EMBEDDED","parsedGen","isNaN","showSidePanel","messages","cs","messages_cs","de","messages_de","fr","messages_fr","it","messages_it","pl","messages_pl","ru","messages_ru","language","navigator","browser","detect","ReactDOM","component","INITIAL","setState","setSelection","setError","setShowSidePanel","setStandalone","setShowWikiTreeMenus","setChartType","showErrorPopup","setShowErrorPopup","setSourceSpec","setFreezeAnimation","setConfig","updateDisplay","newSelection","toggleDetails","shouldHideIds","shouldHideSex","uploadedDataSource","gedcomUrlDataSource","wikiTreeDataSource","embeddedDataSource","isNewData","newSourceSpec","oldSouce","loadData","updateUrl","gen","displayErrorPopup","downloadSvg","onDismissErrorPopup","LOADING","SHOWING_CHART","ERROR","LOADING_MORE","loadMoreFromWikitree","exact","updatedSelection","sidePanelTabs","menuItem","configToArgs","Loader","active","Tab","panes"],"mappings":"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","file":"static/js/main.70be27a1.chunk.js","sourcesContent":["/** Sends an event to Google Analytics. */\nexport function analyticsEvent(action: string, data?: any) {\n (window as any).gtag('event', action, data);\n}\n","import {IndiInfo} from 'topola';\nimport {TopolaData} from '../util/gedcom_util';\n\n/** Supported data sources. */\nexport enum DataSourceEnum {\n UPLOADED,\n GEDCOM_URL,\n WIKITREE,\n EMBEDDED,\n}\n\n/** Source specification together with individual selection. */\nexport interface SourceSelection {\n spec: SourceSpecT;\n selection?: IndiInfo;\n}\n\n/** Interface encapsulating functions specific for a data source. */\nexport interface DataSource {\n /**\n * Returns true if the application is now loading a completely new data set\n * and the existing one should be wiped.\n */\n isNewData(\n newSource: SourceSelection,\n oldSource: SourceSelection,\n data?: TopolaData,\n ): boolean;\n /** Loads data from the data source. */\n loadData(spec: SourceSelection): Promise;\n}\n","import rehypeStringify from 'rehype-stringify';\nimport remarkParse from 'remark-parse';\nimport remarkRehype from 'remark-rehype';\nimport {Button, Header, Modal} from 'semantic-ui-react';\nimport {unified} from 'unified';\nimport {useEffect, useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nconst LAST_SEEN_VERSION_KEY = 'last_seen_version';\n\n/**\n * Returns changelog as raw HTML.\n *\n * @param maxVersions Max number of versions to include in changelog\n * @param seenVersion Last seen app version\n */\nexport async function getChangelog(maxVersions: number, seenVersion?: string) {\n const seenVersionDate = seenVersion\n ? Date.parse(seenVersion.slice(0, 10))\n : 0;\n\n const changes =\n process.env.REACT_APP_CHANGELOG?.split('##')\n .slice(1, maxVersions + 1)\n .map((notes) => {\n const date = Date.parse(notes.split('\\n')[0].trim());\n return {date, notes: '####' + notes};\n })\n .filter((release) => release.date > seenVersionDate)\n .map((release) => release.notes)\n .join('\\n') || '';\n\n const parsedChanges = await unified()\n .use(remarkParse)\n .use(remarkRehype)\n .use(rehypeStringify)\n .process(changes);\n return String(parsedChanges);\n}\n\n/** Stores in local storage the current app version as the last seen version. */\nexport function updateSeenVersion() {\n localStorage.setItem(LAST_SEEN_VERSION_KEY, process.env.REACT_APP_GIT_TIME!);\n}\n\n/**\n * Shows changelog entries if the user has seen an older version of\n * Topola Viewer and is now seeing a newer one.\n */\nexport function Changelog() {\n const [open, setOpen] = useState(false);\n const [changelog, setChangelog] = useState('');\n\n useEffect(() => {\n (async () => {\n const seenVersion = localStorage.getItem(LAST_SEEN_VERSION_KEY);\n const currentVersion = process.env.REACT_APP_GIT_TIME!;\n if (!seenVersion || seenVersion === currentVersion) {\n return;\n }\n\n const changes = await getChangelog(3, seenVersion);\n setChangelog(changes);\n setOpen(!!changes);\n updateSeenVersion();\n })();\n });\n\n return (\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n );\n}\n","/** Error class adding an error code used for i18n. */\nexport class TopolaError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly args: {[key: string]: string} = {},\n ) {\n super(message);\n }\n}\n","import {Date as TopolaDate, DateOrRange, DateRange, getDate} from 'topola';\nimport {IntlShape} from 'react-intl';\n\nconst DATE_QUALIFIERS = new Map([\n ['abt', 'about'],\n ['cal', 'calculated'],\n ['est', 'estimated'],\n]);\n\nfunction formatDate(date: TopolaDate, intl: IntlShape) {\n const hasDay = date.day !== undefined;\n const hasMonth = date.month !== undefined;\n const hasYear = date.year !== undefined;\n if (!hasDay && !hasMonth && !hasYear) {\n return date.text || '';\n }\n const dateObject = toDateObject(date);\n const translatedQualifier = formatDateQualifier(date.qualifier, intl);\n\n const formatOptions: Intl.DateTimeFormatOptions = {\n day: hasDay ? 'numeric' : undefined,\n month: hasMonth ? 'long' : undefined,\n year: hasYear ? 'numeric' : undefined,\n };\n const translatedDate = new Intl.DateTimeFormat(\n intl.locale,\n formatOptions,\n ).format(dateObject);\n\n return [translatedQualifier, translatedDate].join(' ');\n}\n\nfunction formatDateRage(dateRange: DateRange, intl: IntlShape) {\n const fromDate = dateRange.from;\n const toDate = dateRange.to;\n const translatedFromDate = fromDate && formatDate(fromDate, intl);\n const translatedToDate = toDate && formatDate(toDate, intl);\n if (translatedFromDate && translatedToDate) {\n return intl.formatMessage(\n {\n id: 'date.between',\n defaultMessage: 'between {from} and {to}',\n },\n {from: translatedFromDate, to: translatedToDate},\n );\n }\n if (translatedFromDate) {\n return intl.formatMessage(\n {\n id: 'date.after',\n defaultMessage: 'after {from}',\n },\n {from: translatedFromDate},\n );\n }\n if (translatedToDate) {\n return intl.formatMessage(\n {\n id: 'date.before',\n defaultMessage: 'before {to}',\n },\n {to: translatedToDate},\n );\n }\n return '';\n}\n\nexport function formatDateQualifier(\n qualifier: string | undefined,\n intl: IntlShape,\n): string {\n const lowerCaseQualifier = qualifier && qualifier.toLowerCase();\n return (\n (lowerCaseQualifier &&\n intl.formatMessage({\n id: `date.${lowerCaseQualifier}`,\n defaultMessage:\n DATE_QUALIFIERS.get(lowerCaseQualifier) || lowerCaseQualifier,\n })) ||\n ''\n );\n}\n\n/** Formats a DateOrRange object. */\nexport function formatDateOrRange(\n dateOrRange: DateOrRange | undefined,\n intl: IntlShape,\n): string {\n if (!dateOrRange) {\n return '';\n }\n if (dateOrRange.date) {\n return formatDate(dateOrRange.date, intl);\n }\n if (dateOrRange.dateRange) {\n return formatDateRage(dateOrRange.dateRange, intl);\n }\n return '';\n}\n\n/** Formats a date given in GEDCOM format. */\nexport function translateDate(gedcomDate: string, intl: IntlShape): string {\n return formatDateOrRange(getDate(gedcomDate), intl);\n}\n\nexport function compareTopolaDates(\n date1: TopolaDate | undefined,\n date2: TopolaDate | undefined,\n): number {\n if (!date1 || !date1.year || !date2 || !date2.year) {\n return 0;\n }\n if (date1.year !== date2.year) {\n return date1.year - date2.year;\n }\n if (!date1.month || !date2.month) {\n return 0;\n }\n if (date1.month !== date2.month) {\n return date1.month - date2.month;\n }\n if (date1.day && date2.day && date1.day !== date2.day) {\n return date1.month - date2.month;\n }\n return 0;\n}\n\n/** Compares a dates given in GEDCOM format. */\nexport function compareDates(\n firstDateOrRange: DateOrRange | undefined,\n secondDateOrRange: DateOrRange | undefined,\n): number {\n const date1 =\n firstDateOrRange &&\n (firstDateOrRange.date ||\n (firstDateOrRange.dateRange &&\n (firstDateOrRange.dateRange.from || firstDateOrRange.dateRange.to)));\n const date2 =\n secondDateOrRange &&\n (secondDateOrRange.date ||\n (secondDateOrRange.dateRange &&\n (secondDateOrRange.dateRange.from || secondDateOrRange.dateRange.to)));\n return compareTopolaDates(date1, date2);\n}\n\nexport function areDateRangesOverlapped(\n range1: DateRange,\n range2: DateRange,\n): boolean {\n return (\n compareTopolaDates(range1.from, range2.to) <= 0 &&\n compareTopolaDates(range1.to, range2.from) >= 0\n );\n}\n\nexport function isValidDateOrRange(\n dateOrRange: DateOrRange | undefined,\n): boolean {\n // invalid when range is closed and start is before end\n if (isDateRangeClosed(dateOrRange?.dateRange)) {\n return (\n compareTopolaDates(\n dateOrRange?.dateRange?.from,\n dateOrRange?.dateRange?.to,\n ) <= 0\n );\n }\n //valid when there is exact date or date range has start or end defined\n return !!(\n dateOrRange?.date ||\n dateOrRange?.dateRange?.from ||\n dateOrRange?.dateRange?.to\n );\n}\n\nexport function isDateRangeClosed(range: DateRange | undefined): boolean {\n return !!(range?.from && range?.to);\n}\n\nexport function toDateObject(date: TopolaDate): Date {\n return new Date(\n date.year !== undefined ? date.year! : 0,\n date.month !== undefined ? date.month! - 1 : 0,\n date.day !== undefined ? date.day! : 1,\n );\n}\n","import {GedcomEntry, parse as parseGedcom} from 'parse-gedcom';\nimport {TopolaError} from './error';\nimport {\n gedcomEntriesToJson,\n JsonFam,\n JsonGedcomData,\n JsonImage,\n JsonIndi,\n} from 'topola';\nimport {compareDates} from './date_util';\n\nexport interface GedcomData {\n /** The HEAD entry. */\n head: GedcomEntry;\n /** INDI entries mapped by id. */\n indis: {[key: string]: GedcomEntry};\n /** FAM entries mapped by id. */\n fams: {[key: string]: GedcomEntry};\n /** Other entries mapped by id, e.g. NOTE, SOUR. */\n other: {[key: string]: GedcomEntry};\n}\n\nexport interface TopolaData {\n chartData: JsonGedcomData;\n gedcom: GedcomData;\n}\n\n/**\n * Returns the identifier extracted from a pointer string.\n * E.g. '@I123@' -> 'I123'\n */\nexport function pointerToId(pointer: string): string {\n return pointer.substring(1, pointer.length - 1);\n}\n\nexport function idToIndiMap(data: JsonGedcomData): Map {\n const map = new Map();\n data.indis.forEach((indi) => {\n map.set(indi.id, indi);\n });\n return map;\n}\n\nexport function idToFamMap(data: JsonGedcomData): Map {\n const map = new Map();\n data.fams.forEach((fam) => {\n map.set(fam.id, fam);\n });\n return map;\n}\n\nfunction prepareGedcom(entries: GedcomEntry[]): GedcomData {\n const head = entries.find((entry) => entry.tag === 'HEAD')!;\n const indis: {[key: string]: GedcomEntry} = {};\n const fams: {[key: string]: GedcomEntry} = {};\n const other: {[key: string]: GedcomEntry} = {};\n entries.forEach((entry) => {\n if (entry.tag === 'INDI') {\n indis[pointerToId(entry.pointer)] = entry;\n } else if (entry.tag === 'FAM') {\n fams[pointerToId(entry.pointer)] = entry;\n } else if (entry.pointer) {\n other[pointerToId(entry.pointer)] = entry;\n }\n });\n return {head, indis, fams, other};\n}\n\nfunction strcmp(a: string, b: string) {\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n return 0;\n}\n\n/** Birth date comparator for individuals. */\nfunction birthDatesComparator(gedcom: JsonGedcomData) {\n const indiMap = idToIndiMap(gedcom);\n\n return (indiId1: string, indiId2: string) => {\n const indi1: JsonIndi | undefined = indiMap.get(indiId1);\n const indi2: JsonIndi | undefined = indiMap.get(indiId2);\n return (\n compareDates(indi1 && indi1.birth, indi2 && indi2.birth) ||\n strcmp(indiId1, indiId2)\n );\n };\n}\n\n/** Marriage date comparator for families. */\nfunction marriageDatesComparator(gedcom: JsonGedcomData) {\n const famMap = idToFamMap(gedcom);\n\n return (famId1: string, famId2: string) => {\n const fam1: JsonFam | undefined = famMap.get(famId1);\n const fam2: JsonFam | undefined = famMap.get(famId2);\n return (\n compareDates(fam1 && fam1.marriage, fam2 && fam2.marriage) ||\n strcmp(famId1, famId2)\n );\n };\n}\n\n/**\n * Sorts children by birth date in the given family.\n * Does not modify the input objects.\n */\nfunction sortFamilyChildren(\n fam: JsonFam,\n comparator: (id1: string, id2: string) => number,\n): JsonFam {\n if (!fam.children) {\n return fam;\n }\n const newChildren = fam.children.sort(comparator);\n return Object.assign({}, fam, {children: newChildren});\n}\n\n/**\n * Sorts children by birth date.\n * Does not modify the input object.\n */\nfunction sortChildren(gedcom: JsonGedcomData): JsonGedcomData {\n const comparator = birthDatesComparator(gedcom);\n const newFams = gedcom.fams.map((fam) => sortFamilyChildren(fam, comparator));\n return Object.assign({}, gedcom, {fams: newFams});\n}\n\n/**\n * Sorts spouses by marriage date.\n * Does not modify the input objects.\n */\nfunction sortIndiSpouses(\n indi: JsonIndi,\n comparator: (id1: string, id2: string) => number,\n): JsonFam {\n if (!indi.fams) {\n return indi;\n }\n const newFams = indi.fams.sort(comparator);\n return Object.assign({}, indi, {fams: newFams});\n}\n\nfunction sortSpouses(gedcom: JsonGedcomData): JsonGedcomData {\n const comparator = marriageDatesComparator(gedcom);\n const newIndis = gedcom.indis.map((indi) =>\n sortIndiSpouses(indi, comparator),\n );\n return Object.assign({}, gedcom, {indis: newIndis});\n}\n\n/**\n * If the entry is a reference to a top-level entry, the referenced entry is\n * returned. Otherwise, returns the given entry unmodified.\n */\nexport function dereference(\n entry: GedcomEntry,\n gedcom: GedcomData,\n getterFunction: (gedcom: GedcomData) => {[key: string]: GedcomEntry},\n) {\n if (entry.data) {\n const dereferenced = getterFunction(gedcom)[pointerToId(entry.data)];\n if (dereferenced) {\n return dereferenced;\n }\n }\n return entry;\n}\n\n/**\n * Returns the data for the given GEDCOM entry as an array of lines. Supports\n * continuations with CONT and CONC.\n */\nexport function getData(entry: GedcomEntry) {\n const result = [entry.data];\n entry.tree.forEach((subentry) => {\n if (subentry.tag === 'CONC' && subentry.data) {\n const last = result.length - 1;\n result[last] += subentry.data;\n } else if (subentry.tag === 'CONT' && subentry.data) {\n result.push(subentry.data);\n }\n });\n return result;\n}\n\n/** Sorts children and spouses. */\nexport function normalizeGedcom(gedcom: JsonGedcomData): JsonGedcomData {\n return sortSpouses(sortChildren(gedcom));\n}\n\nconst IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif'];\n\n/** Returns true if the given file name has a known image extension. */\nexport function isImageFile(fileName: string): boolean {\n const lowerName = fileName.toLowerCase();\n return IMAGE_EXTENSIONS.some((ext) => lowerName.endsWith(ext));\n}\n\n/**\n * Removes images that are not HTTP links or do not have known image extensions.\n * Does not modify the input object.\n */\nfunction filterImage(indi: JsonIndi, images: Map): JsonIndi {\n if (!indi.images || indi.images.length === 0) {\n return indi;\n }\n const newImages: JsonImage[] = [];\n indi.images.forEach((image) => {\n const fileName = image.url.match(/[^/\\\\]*$/)![0];\n // If the image file has been loaded into memory, use it.\n if (images.has(fileName)) {\n newImages.push({url: images.get(fileName)!, title: image.title});\n } else if (image.url.startsWith('http') && isImageFile(image.url)) {\n newImages.push(image);\n }\n });\n return Object.assign({}, indi, {images: newImages});\n}\n\n/**\n * Removes images that are not HTTP links.\n * Does not modify the input object.\n */\nfunction filterImages(\n gedcom: JsonGedcomData,\n images: Map,\n): JsonGedcomData {\n const newIndis = gedcom.indis.map((indi) => filterImage(indi, images));\n return Object.assign({}, gedcom, {indis: newIndis});\n}\n\n/**\n * Converts GEDCOM file into JSON data performing additional transformations:\n * - sort children by birth date\n * - remove images that are not HTTP links and aren't mapped in `images`.\n *\n * @param images Map from file name to image URL. This is used to pass in\n * uploaded images.\n */\nexport function convertGedcom(\n gedcom: string,\n images: Map,\n): TopolaData {\n const entries = parseGedcom(gedcom);\n const json = gedcomEntriesToJson(entries);\n if (\n !json ||\n !json.indis ||\n !json.indis.length ||\n !json.fams ||\n !json.fams.length\n ) {\n throw new TopolaError('GEDCOM_READ_FAILED', 'Failed to read GEDCOM file');\n }\n\n return {\n chartData: filterImages(normalizeGedcom(json), images),\n gedcom: prepareGedcom(entries),\n };\n}\n\nexport function getSoftware(head: GedcomEntry): string | null {\n const sour =\n head && head.tree && head.tree.find((entry) => entry.tag === 'SOUR');\n const name =\n sour && sour.tree && sour.tree.find((entry) => entry.tag === 'NAME');\n return (name && name.data) || null;\n}\n\nexport function getName(person: GedcomEntry): string | undefined {\n const names = person.tree.filter((subEntry) => subEntry.tag === 'NAME');\n const notMarriedName = names.find(\n (subEntry) =>\n subEntry.tree.filter(\n (nameEntry) => nameEntry.tag === 'TYPE' && nameEntry.data === 'married',\n ).length === 0,\n );\n const name = notMarriedName || names[0];\n return name?.data.replace(/\\//g, '');\n}\n\nexport function getFileName(fileEntry: GedcomEntry): string | undefined {\n const fileTitle = fileEntry?.tree.find((entry) => entry.tag === 'TITL')?.data;\n\n const fileExtension = fileEntry?.tree.find((entry) => entry.tag === 'FORM')\n ?.data;\n\n return fileTitle && fileExtension && fileTitle + '.' + fileExtension;\n}\n","import {Date as TopolaDate} from 'topola/dist/data';\nimport {IntlShape} from 'react-intl';\nimport {DateOrRange, getDate} from 'topola';\nimport {\n areDateRangesOverlapped,\n compareDates,\n formatDateQualifier,\n isDateRangeClosed,\n isValidDateOrRange,\n toDateObject,\n} from './date_util';\n\nfunction formatExactAge(\n birthDate: TopolaDate,\n deathDate: TopolaDate,\n intl: IntlShape,\n): string {\n const ageInYears = calcDateDifferenceInYears(birthDate, deathDate);\n const qualifier = birthDate.qualifier || deathDate.qualifier;\n const translatedQualifier =\n qualifier && formatDateQualifier(qualifier, intl) + ' ';\n\n return intl.formatMessage(\n {\n id: 'age.exact',\n defaultMessage:\n '{qualifier}{age, plural, =0 {Less than 1 year} one {1 year} other {# years}}',\n },\n {age: ageInYears, qualifier: translatedQualifier},\n );\n}\n\nfunction formatAgeMoreThan(\n birthDate: TopolaDate,\n deathDate: TopolaDate,\n intl: IntlShape,\n): string {\n const ageInYears = calcDateDifferenceInYears(birthDate, deathDate);\n return intl.formatMessage(\n {\n id: 'age.more',\n defaultMessage:\n 'More than {age, plural, =0 {0 years} one {1 year} other {# years}}',\n },\n {age: ageInYears},\n );\n}\n\nfunction formatAgeLessThan(\n birthDate: TopolaDate,\n deathDate: TopolaDate,\n intl: IntlShape,\n): string {\n const ageInYears = calcDateDifferenceInYears(birthDate, deathDate);\n return intl.formatMessage(\n {\n id: 'age.less',\n defaultMessage:\n 'Less than {age, plural, =0 {1 year} one {1 year} other {# years}}',\n },\n {age: ageInYears},\n );\n}\n\nfunction formatAgeBetween(\n birthDateFrom: TopolaDate,\n birthDateTo: TopolaDate,\n deathDateFrom: TopolaDate,\n deathDateTo: TopolaDate,\n intl: IntlShape,\n): string {\n const ageInYearsFrom = calcDateDifferenceInYears(birthDateTo, deathDateFrom);\n const ageInYearsTo = calcDateDifferenceInYears(birthDateFrom, deathDateTo);\n return intl.formatMessage(\n {\n id: 'age.between',\n defaultMessage:\n 'Between {ageFrom} and {ageTo, plural, =0 {0 years} one {1 year} other {# years}}',\n },\n {ageFrom: ageInYearsFrom, ageTo: ageInYearsTo},\n );\n}\n\nfunction canCalculateAge(\n birthDate: DateOrRange | undefined,\n deathDate: DateOrRange | undefined,\n): boolean {\n if (birthDate && deathDate) {\n // cannot calculate if there is no valid birth or death date\n if (!isValidDateOrRange(birthDate) || !isValidDateOrRange(deathDate)) {\n return false;\n }\n //cannot calculate if death date is before birth date\n if (compareDates(birthDate, deathDate) > 0) {\n return false;\n }\n // cannot calculate if closed date range for birth or death are overlapping\n if (\n birthDate.dateRange &&\n deathDate.dateRange &&\n isDateRangeClosed(birthDate?.dateRange) &&\n isDateRangeClosed(deathDate?.dateRange)\n ) {\n return !areDateRangesOverlapped(birthDate.dateRange, deathDate.dateRange);\n }\n return true;\n }\n return false;\n}\n\nfunction calcDateDifferenceInYears(\n firstDate: TopolaDate,\n secondDate: TopolaDate,\n): number {\n const firstDateObject = toDateObject(firstDate);\n const secondDateObject = toDateObject(secondDate);\n\n const startYear = firstDateObject.getUTCFullYear();\n\n let yearDiff = secondDateObject.getUTCFullYear() - startYear;\n let monthDiff =\n secondDateObject.getUTCMonth() - firstDateObject.getUTCMonth();\n if (monthDiff < 0) {\n yearDiff--;\n monthDiff += 12;\n }\n const dayDiff = secondDateObject.getUTCDate() - firstDateObject.getUTCDate();\n if (dayDiff < 0) {\n if (monthDiff <= 0) {\n yearDiff--;\n }\n }\n return Math.abs(yearDiff);\n}\n\nexport function calcAge(\n birthGedcomDate: string | undefined,\n deathGedcomDate: string | undefined,\n intl: IntlShape,\n): string | undefined {\n if (birthGedcomDate && deathGedcomDate) {\n const birthDateOrRange = getDate(birthGedcomDate);\n const deathDateOrRange = getDate(deathGedcomDate);\n if (canCalculateAge(birthDateOrRange, deathDateOrRange)) {\n if (birthDateOrRange?.date) {\n if (deathDateOrRange?.date) {\n return formatExactAge(\n birthDateOrRange.date,\n deathDateOrRange.date,\n intl,\n );\n }\n if (\n deathDateOrRange?.dateRange?.from &&\n deathDateOrRange.dateRange?.to\n ) {\n return formatAgeBetween(\n birthDateOrRange.date,\n birthDateOrRange.date,\n deathDateOrRange?.dateRange?.from,\n deathDateOrRange?.dateRange?.to,\n intl,\n );\n }\n if (deathDateOrRange?.dateRange?.from) {\n return formatAgeMoreThan(\n birthDateOrRange.date,\n deathDateOrRange.dateRange?.from,\n intl,\n );\n }\n if (deathDateOrRange?.dateRange?.to) {\n return formatAgeLessThan(\n birthDateOrRange.date,\n deathDateOrRange.dateRange?.to,\n intl,\n );\n }\n }\n if (\n birthDateOrRange?.dateRange?.from &&\n birthDateOrRange?.dateRange?.to\n ) {\n if (deathDateOrRange?.date) {\n return formatAgeBetween(\n birthDateOrRange?.dateRange?.from,\n birthDateOrRange?.dateRange?.to,\n deathDateOrRange?.date,\n deathDateOrRange?.date,\n intl,\n );\n }\n if (\n deathDateOrRange?.dateRange?.from &&\n deathDateOrRange.dateRange?.to\n ) {\n return formatAgeBetween(\n birthDateOrRange?.dateRange?.from,\n birthDateOrRange?.dateRange?.to,\n deathDateOrRange?.dateRange?.from,\n deathDateOrRange?.dateRange?.to,\n intl,\n );\n }\n if (deathDateOrRange?.dateRange?.from) {\n return formatAgeMoreThan(\n birthDateOrRange.dateRange?.to,\n deathDateOrRange.dateRange?.from,\n intl,\n );\n }\n if (deathDateOrRange?.dateRange?.to) {\n return formatAgeLessThan(\n birthDateOrRange.dateRange?.from,\n deathDateOrRange.dateRange?.to,\n intl,\n );\n }\n }\n if (birthDateOrRange?.dateRange?.from) {\n if (deathDateOrRange?.date) {\n return formatAgeLessThan(\n birthDateOrRange.dateRange?.from,\n deathDateOrRange.date,\n intl,\n );\n }\n if (deathDateOrRange?.dateRange?.to) {\n return formatAgeLessThan(\n birthDateOrRange.dateRange?.from,\n deathDateOrRange.dateRange?.to,\n intl,\n );\n }\n }\n if (birthDateOrRange?.dateRange?.to) {\n if (deathDateOrRange?.date) {\n return formatAgeMoreThan(\n birthDateOrRange?.dateRange?.to,\n deathDateOrRange.date,\n intl,\n );\n }\n if (deathDateOrRange?.dateRange?.from) {\n return formatAgeMoreThan(\n birthDateOrRange?.dateRange?.to,\n deathDateOrRange.dateRange?.from,\n intl,\n );\n }\n }\n }\n }\n}\n","import Linkify from 'react-linkify';\n\ninterface Props {\n lines: (JSX.Element | string)[];\n}\n\nexport function MultilineText(props: Props) {\n return (\n <>\n {props.lines.map((line, index) => (\n
\n {line}\n
\n
\n ))}\n \n );\n}\n","import {FormattedMessage} from 'react-intl';\n\nconst TAG_DESCRIPTIONS = new Map([\n ['ADOP', 'Adoption'],\n ['BAPM', 'Baptism'],\n ['BIRT', 'Birth'],\n ['BURI', 'Burial'],\n ['CENS', 'Census'],\n ['CHR', 'Christening'],\n ['CREM', 'Cremation'],\n ['DEAT', 'Death'],\n ['EDUC', 'Education'],\n ['EMAIL', 'E-mail'],\n ['EMIG', 'Emigration'],\n ['EVEN', 'Event'],\n ['FACT', 'Fact'],\n ['IMMI', 'Immigration'],\n ['MARR', 'Marriage'],\n ['DIV', 'Divorce'],\n ['MILT', 'Military services'],\n ['NATU', 'Naturalization'],\n ['OCCU', 'Occupation'],\n ['TITL', 'Title'],\n ['WWW', 'WWW'],\n ['birth', 'Birth name'],\n ['married', 'Married name'],\n ['maiden', 'Maiden name'],\n ['immigrant', 'Immigrant name'],\n ['aka', 'Also known as'],\n]);\n\ninterface Props {\n tag: string;\n}\n\nexport function TranslatedTag(props: Props) {\n const normalizedTag = props.tag.replace(/_/g, '');\n return (\n \n );\n}\n","import * as queryString from 'query-string';\nimport flatMap from 'array.prototype.flatmap';\nimport {calcAge} from '../util/age_util';\nimport {compareDates, formatDateOrRange} from '../util/date_util';\nimport {DateOrRange, getDate} from 'topola';\nimport {dereference, GedcomData, getData, getName} from '../util/gedcom_util';\nimport {GedcomEntry} from 'parse-gedcom';\nimport {FormattedMessage, IntlShape, useIntl} from 'react-intl';\nimport {Link, useLocation} from 'react-router-dom';\nimport {MultilineText} from './multiline-text';\nimport {pointerToId} from '../util/gedcom_util';\nimport {TranslatedTag} from './translated-tag';\nimport {Header, Item} from 'semantic-ui-react';\n\nfunction PersonLink(props: {person: GedcomEntry}) {\n const location = useLocation();\n\n const name = getName(props.person);\n\n const search = queryString.parse(location.search);\n search['indi'] = pointerToId(props.person.pointer);\n\n return (\n \n \n {name ? (\n name\n ) : (\n \n )}\n \n \n );\n}\n\ninterface Props {\n gedcom: GedcomData;\n indi: string;\n entries: GedcomEntry[];\n}\n\ninterface EventData {\n type: string;\n date?: DateOrRange;\n age?: string;\n personLink?: GedcomEntry;\n place?: string[];\n notes: string[][];\n}\n\nconst EVENT_TAGS = [\n 'BIRT',\n 'BAPM',\n 'CHR',\n 'FAMS',\n 'EVEN',\n 'CENS',\n 'DEAT',\n 'BURI',\n];\n\nconst FAMILY_EVENT_TAGS = ['MARR', 'DIV'];\n\nfunction EventHeader(props: {event: EventData}) {\n const intl = useIntl();\n return (\n
\n
\n \n
\n {props.event.date ? (\n
\n {formatDateOrRange(props.event.date, intl)}\n
\n ) : null}\n
\n );\n}\n\nfunction getSpouse(indi: string, familyEntry: GedcomEntry, gedcom: GedcomData) {\n const spouseReference = familyEntry.tree\n .filter((familySubEntry) => ['WIFE', 'HUSB'].includes(familySubEntry.tag))\n .find((familySubEntry) => !familySubEntry.data.includes(indi));\n\n if (!spouseReference) {\n return undefined;\n }\n return dereference(spouseReference, gedcom, (gedcom) => gedcom.indis);\n}\n\nfunction getAge(\n eventEntry: GedcomEntry,\n indi: string,\n gedcom: GedcomData,\n intl: IntlShape,\n): string | undefined {\n if (eventEntry.tag !== 'DEAT') {\n return undefined;\n }\n const deathDate = resolveDate(eventEntry);\n\n const birthDate = gedcom.indis[indi].tree\n .filter((indiSubEntry) => indiSubEntry.tag === 'BIRT')\n .map((birthEvent) => resolveDate(birthEvent))\n .find((topolaDate) => topolaDate);\n\n if (!birthDate || !deathDate) {\n return undefined;\n }\n return calcAge(birthDate?.data, deathDate?.data, intl);\n}\n\nfunction eventPlace(entry: GedcomEntry) {\n const place = entry.tree.find((subEntry) => subEntry.tag === 'PLAC');\n return place?.data ? getData(place) : undefined;\n}\n\nfunction eventNotes(entry: GedcomEntry, gedcom: GedcomData): string[][] {\n return entry.tree\n .filter((subentry) => ['NOTE', 'TYPE'].includes(subentry.tag))\n .map((note) => dereference(note, gedcom, (gedcom) => gedcom.other))\n .map((note) => getData(note));\n}\n\nfunction toEvent(\n entry: GedcomEntry,\n gedcom: GedcomData,\n indi: string,\n intl: IntlShape,\n): EventData[] {\n if (entry.tag === 'FAMS') {\n return toFamilyEvents(entry, gedcom, indi);\n }\n return toIndiEvent(entry, gedcom, indi, intl);\n}\n\nfunction toIndiEvent(\n entry: GedcomEntry,\n gedcom: GedcomData,\n indi: string,\n intl: IntlShape,\n): EventData[] {\n const date = resolveDate(entry) || null;\n return [\n {\n date: date ? getDate(date.data) : undefined,\n type: entry.tag,\n age: getAge(entry, indi, gedcom, intl),\n place: eventPlace(entry),\n notes: eventNotes(entry, gedcom),\n },\n ];\n}\n\nfunction resolveDate(entry: GedcomEntry) {\n return entry.tree.find((subEntry) => subEntry.tag === 'DATE');\n}\n\nfunction toFamilyEvents(\n entry: GedcomEntry,\n gedcom: GedcomData,\n indi: string,\n): EventData[] {\n const family = dereference(entry, gedcom, (gedcom) => gedcom.fams);\n return flatMap(FAMILY_EVENT_TAGS, (tag) =>\n family.tree.filter((entry) => entry.tag === tag),\n ).map((familyMarriageEvent) => {\n const date = resolveDate(familyMarriageEvent) || null;\n return {\n date: date ? getDate(date.data) : undefined,\n type: familyMarriageEvent.tag,\n personLink: getSpouse(indi, family, gedcom),\n place: eventPlace(familyMarriageEvent),\n notes: eventNotes(familyMarriageEvent, gedcom),\n };\n });\n}\n\nfunction Event(props: {event: EventData}) {\n return (\n \n \n \n {!!props.event.age && {props.event.age}}\n {!!props.event.personLink && (\n \n )}\n {!!props.event.place && (\n {props.event.place}\n )}\n {!!props.event.notes.length && (\n \n {props.event.notes.map((note, index) => (\n
\n (\n {line}\n ))}\n />\n
\n ))}\n
\n )}\n
\n
\n );\n}\n\nexport function Events(props: Props) {\n const intl = useIntl();\n\n const events = flatMap(EVENT_TAGS, (tag) =>\n props.entries\n .filter((entry) => entry.tag === tag)\n .map((eventEntry) => toEvent(eventEntry, props.gedcom, props.indi, intl))\n .flatMap((events) => events)\n .sort((event1, event2) => compareDates(event1.date, event2.date)),\n );\n if (events.length) {\n return (\n <>\n {events.map((event, index) => (\n \n ))}\n \n );\n }\n return null;\n}\n","import {\n Container,\n Icon,\n Image,\n Label,\n Message,\n Modal,\n Placeholder,\n} from 'semantic-ui-react';\nimport {SyntheticEvent, useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\ninterface Props {\n url: string;\n filename: string;\n title?: string;\n}\n\nexport function WrappedImage(props: Props) {\n const [imageOpen, setImageOpen] = useState(false);\n const [imageLoaded, setImageLoaded] = useState(false);\n const [imageFailed, setImageFailed] = useState(false);\n const [imageSrc, setImageSrc] = useState('');\n\n if (imageLoaded && imageSrc !== props.url) {\n setImageLoaded(false);\n }\n return (\n <>\n setImageOpen(true)}\n onLoad={() => {\n setImageLoaded(true);\n setImageSrc(props.url);\n setImageFailed(false);\n }}\n onError={(e: SyntheticEvent) => {\n setImageLoaded(true);\n setImageSrc(props.url);\n setImageFailed(true);\n e.currentTarget.alt = '';\n }}\n src={props.url}\n alt={props.title || props.filename}\n centered={true}\n />\n \n \n \n {imageFailed && (\n \n \n \n \n \n \n \n )}\n }\n open={imageOpen}\n onClose={() => setImageOpen(false)}\n onOpen={() => setImageOpen(true)}\n centered={false}\n >\n {props.title}\n \n }\n wrapped\n />\n \n \n \n );\n}\n","import flatMap from 'array.prototype.flatmap';\nimport {\n dereference,\n GedcomData,\n getData,\n getFileName,\n isImageFile,\n} from '../util/gedcom_util';\nimport {Events} from './events';\nimport {GedcomEntry} from 'parse-gedcom';\nimport {MultilineText} from './multiline-text';\nimport {TranslatedTag} from './translated-tag';\nimport {Header, Item} from 'semantic-ui-react';\nimport {FormattedMessage} from 'react-intl';\nimport {WrappedImage} from './wrapped-image';\n\nconst EXCLUDED_TAGS = [\n 'BIRT',\n 'BAPM',\n 'CHR',\n 'EVEN',\n 'CENS',\n 'DEAT',\n 'BURI',\n 'NAME',\n 'SEX',\n 'FAMC',\n 'FAMS',\n 'NOTE',\n 'SOUR',\n];\n\nfunction dataDetails(entry: GedcomEntry) {\n const lines = [];\n if (entry.data) {\n lines.push(...getData(entry));\n }\n entry.tree\n .filter((subentry) => subentry.tag === 'NOTE')\n .forEach((note) =>\n getData(note).forEach((line) => lines.push({line})),\n );\n if (!lines.length) {\n return null;\n }\n return (\n <>\n
\n \n
\n \n \n \n \n );\n}\n\nfunction fileDetails(objectEntry: GedcomEntry) {\n const imageFileEntry = objectEntry.tree.find(\n (entry) =>\n entry.tag === 'FILE' &&\n entry.data.startsWith('http') &&\n isImageFile(entry.data),\n );\n\n return imageFileEntry ? (\n
\n \n
\n ) : null;\n}\n\nfunction noteDetails(entry: GedcomEntry) {\n return (\n (\n {line}\n ))}\n />\n );\n}\n\nfunction nameDetails(entry: GedcomEntry) {\n const fullName = entry.data.replaceAll('/', '');\n\n const nameType = entry.tree.find(\n (entry) => entry.tag === 'TYPE' && entry.data !== 'Unknown',\n )?.data;\n\n return (\n <>\n
\n {fullName ? (\n fullName\n ) : (\n \n )}\n
\n {fullName && nameType && (\n \n \n \n )}\n \n );\n}\n\nfunction getDetails(\n entries: GedcomEntry[],\n tags: string[],\n detailsFunction: (entry: GedcomEntry) => JSX.Element | null,\n): JSX.Element[] {\n return flatMap(tags, (tag) =>\n entries\n .filter((entry) => entry.tag === tag)\n .map((entry) => detailsFunction(entry)),\n )\n .filter((element) => element !== null)\n .map((element, index) => (\n \n {element}\n \n ));\n}\n\n/**\n * Returns true if there is displayable information in this entry.\n * Returns false if there is no data in this entry or this is only a reference\n * to another entry.\n */\nfunction hasData(entry: GedcomEntry) {\n return entry.tree.length > 0 || (entry.data && !entry.data.startsWith('@'));\n}\n\nfunction getOtherDetails(entries: GedcomEntry[]) {\n return entries\n .filter((entry) => !EXCLUDED_TAGS.includes(entry.tag))\n .filter(hasData)\n .map((entry) => dataDetails(entry))\n .filter((element) => element !== null)\n .map((element, index) => (\n \n {element}\n \n ));\n}\n\ninterface Props {\n gedcom: GedcomData;\n indi: string;\n}\n\nexport function Details(props: Props) {\n const entries = props.gedcom.indis[props.indi].tree;\n const entriesWithData = entries\n .map((entry) => dereference(entry, props.gedcom, (gedcom) => gedcom.other))\n .filter(hasData);\n\n return (\n
\n \n {getDetails(entries, ['NAME'], nameDetails)}\n {getDetails(entriesWithData, ['OBJE'], fileDetails)}\n \n {getOtherDetails(entriesWithData)}\n {getDetails(entriesWithData, ['NOTE'], noteDetails)}\n \n
\n );\n}\n","import {analyticsEvent} from '../util/analytics';\nimport {convertGedcom, getSoftware, TopolaData} from '../util/gedcom_util';\nimport {DataSource, DataSourceEnum, SourceSelection} from './data_source';\nimport {IndiInfo, JsonGedcomData} from 'topola';\nimport {TopolaError} from '../util/error';\n\n/**\n * Returns a valid IndiInfo object, either with the given indi and generation\n * or with an individual taken from the data and generation 0.\n */\nexport function getSelection(\n data: JsonGedcomData,\n selection?: IndiInfo,\n): IndiInfo {\n // If ID is not given or it doesn't exist in the data, use the first ID in\n // the data.\n const id =\n selection && data.indis.some((i) => i.id === selection.id)\n ? selection.id\n : data.indis[0].id;\n return {id, generation: selection?.generation || 0};\n}\n\nfunction prepareData(\n gedcom: string,\n cacheId: string,\n images?: Map,\n): TopolaData {\n const data = convertGedcom(gedcom, images || new Map());\n const serializedData = JSON.stringify(data);\n try {\n sessionStorage.setItem(cacheId, serializedData);\n } catch (e) {\n console.warn('Failed to store data in session storage: ' + e);\n }\n return data;\n}\n\n/** Fetches data from the given URL. Uses cors-anywhere if handleCors is true. */\nexport async function loadFromUrl(\n url: string,\n handleCors: boolean,\n): Promise {\n try {\n const cachedData = sessionStorage.getItem(url);\n if (cachedData) {\n return JSON.parse(cachedData);\n }\n } catch (e) {\n console.warn('Failed to load data from session storage: ' + e);\n }\n\n const driveUrlMatch1 = url.match(\n /https:\\/\\/drive\\.google\\.com\\/file\\/d\\/(.*)\\/.*/,\n );\n if (driveUrlMatch1) {\n url = `https://drive.google.com/uc?id=${driveUrlMatch1[1]}&export=download`;\n }\n const driveUrlMatch2 = url.match(\n /https:\\/\\/drive\\.google\\.com\\/open\\?id=([^&]*)&?.*/,\n );\n if (driveUrlMatch2) {\n url = `https://drive.google.com/uc?id=${driveUrlMatch2[1]}&export=download`;\n }\n\n const urlToFetch = handleCors\n ? 'https://topola-cors-server.up.railway.app/' + url\n : url;\n\n const response = await window.fetch(urlToFetch);\n if (response.status !== 200) {\n throw new Error(response.statusText);\n }\n const gedcom = await response.text();\n return prepareData(gedcom, url);\n}\n\n/** Loads data from the given GEDCOM file contents. */\nexport async function loadGedcom(\n hash: string,\n gedcom?: string,\n images?: Map,\n): Promise {\n try {\n const cachedData = sessionStorage.getItem(hash);\n if (cachedData) {\n return JSON.parse(cachedData);\n }\n } catch (e) {\n console.warn('Failed to load data from session storage: ' + e);\n }\n if (!gedcom) {\n throw new TopolaError(\n 'ERROR_LOADING_UPLOADED_FILE',\n 'Error loading data. Please upload your file again.',\n );\n }\n return prepareData(gedcom, hash, images);\n}\n\nexport interface UploadSourceSpec {\n source: DataSourceEnum.UPLOADED;\n gedcom?: string;\n /** Hash of the GEDCOM contents. */\n hash: string;\n images?: Map;\n}\n\n/** Files opened from the local computer. */\nexport class UploadedDataSource implements DataSource {\n // isNewData(args: Arguments, state: State): boolean {\n isNewData(\n newSource: SourceSelection,\n oldSource: SourceSelection,\n data?: TopolaData,\n ): boolean {\n return newSource.spec.hash !== oldSource.spec.hash;\n }\n\n async loadData(\n source: SourceSelection,\n ): Promise {\n try {\n const data = await loadGedcom(\n source.spec.hash,\n source.spec.gedcom,\n source.spec.images,\n );\n const software = getSoftware(data.gedcom.head);\n analyticsEvent('upload_file_loaded', {\n event_label: software,\n event_value: (source.spec.images && source.spec.images.size) || 0,\n });\n return data;\n } catch (error) {\n analyticsEvent('upload_file_error');\n throw error;\n }\n }\n}\n\nexport interface UrlSourceSpec {\n source: DataSourceEnum.GEDCOM_URL;\n /** URL of the data that is loaded or is being loaded. */\n url: string;\n handleCors: boolean;\n}\n\n/** GEDCOM file loaded by pointing to a URL. */\nexport class GedcomUrlDataSource implements DataSource {\n isNewData(\n newSource: SourceSelection,\n oldSource: SourceSelection,\n data?: TopolaData,\n ): boolean {\n return newSource.spec.url !== oldSource.spec.url;\n }\n\n async loadData(source: SourceSelection): Promise {\n try {\n const data = await loadFromUrl(source.spec.url, source.spec.handleCors);\n const software = getSoftware(data.gedcom.head);\n analyticsEvent('upload_file_loaded', {event_label: software});\n return data;\n } catch (error) {\n analyticsEvent('url_file_error');\n throw error;\n }\n }\n}\n","import {analyticsEvent} from '../util/analytics';\nimport {DataSource, DataSourceEnum, SourceSelection} from './data_source';\nimport {getSoftware, TopolaData} from '../util/gedcom_util';\nimport {loadGedcom} from './load_data';\n\n/**\n * Message types used in embedded mode.\n * When the parent is ready to receive messages, it sends PARENT_READY.\n * When the child (this app) is ready to receive messages, it sends READY.\n * When the child receives PARENT_READY, it sends READY.\n * When the parent receives READY, it sends data in a GEDCOM message.\n */\nenum EmbeddedMessageType {\n GEDCOM = 'gedcom',\n READY = 'ready',\n PARENT_READY = 'parent_ready',\n}\n\n/** Message sent to parent or received from parent in embedded mode. */\ninterface EmbeddedMessage {\n message: EmbeddedMessageType;\n}\n\ninterface GedcomMessage extends EmbeddedMessage {\n message: EmbeddedMessageType.GEDCOM;\n gedcom?: string;\n}\n\nexport interface EmbeddedSourceSpec {\n source: DataSourceEnum.EMBEDDED;\n}\n\n/** GEDCOM file received from outside of the iframe. */\nexport class EmbeddedDataSource implements DataSource {\n isNewData(\n newSource: SourceSelection,\n oldSource: SourceSelection,\n data?: TopolaData,\n ): boolean {\n // Never reload data.\n return false;\n }\n\n private async onMessage(\n message: EmbeddedMessage,\n resolve: (value: TopolaData) => void,\n reject: (reason: any) => void,\n ) {\n if (message.message === EmbeddedMessageType.PARENT_READY) {\n // Parent didn't receive the first 'ready' message, so we need to send it again.\n window.parent.postMessage({message: EmbeddedMessageType.READY}, '*');\n } else if (message.message === EmbeddedMessageType.GEDCOM) {\n const gedcom = (message as GedcomMessage).gedcom;\n if (!gedcom) {\n return;\n }\n try {\n const data = await loadGedcom('', gedcom);\n const software = getSoftware(data.gedcom.head);\n analyticsEvent('embedded_file_loaded', {\n event_label: software,\n });\n resolve(data);\n } catch (error) {\n analyticsEvent('embedded_file_error');\n reject(error);\n }\n }\n }\n\n async loadData(\n source: SourceSelection,\n ): Promise {\n // Notify the parent window that we are ready.\n return new Promise((resolve, reject) => {\n window.parent.postMessage({message: EmbeddedMessageType.READY}, '*');\n window.addEventListener('message', (data) =>\n this.onMessage(data.data, resolve, reject),\n );\n });\n }\n}\n","import {IntlShape} from 'react-intl';\nimport {TopolaError} from './error';\n\n/**\n * Returns a translated message for the given error. If the message can't be\n * translated, the original error.message is returned.\n */\nexport function getI18nMessage(error: Error, intl: IntlShape): string {\n if (!(error instanceof TopolaError)) {\n return error.message;\n }\n return intl.formatMessage(\n {\n id: `error.${error.code}`,\n defaultMessage: error.message,\n },\n error.args,\n );\n}\n","export default __webpack_public_path__ + \"static/media/topola.a3ffa9a5.jpg\";","import {createMedia} from '@artsy/fresnel';\n\n/** Defines the breakpoints at which to show different UI variants.*/\nconst AppMedia = createMedia({\n breakpoints: {\n small: 320,\n large: 768,\n },\n});\nexport const mediaStyles = AppMedia.createMediaStyle();\nexport const {Media, MediaContextProvider} = AppMedia;\n","import * as queryString from 'query-string';\nimport {useEffect, useState} from 'react';\nimport logo from './topola.jpg';\nimport {Card, Grid, Image} from 'semantic-ui-react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\nimport {Media} from './util/media';\nimport {getChangelog, updateSeenVersion} from './changelog';\n\n/** Link that loads a GEDCOM file from URL. */\nfunction GedcomLink(props: {url: string; text: string}) {\n return (\n \n {props.text}\n \n );\n}\n\nfunction formatBuildDate(dateString: string) {\n return dateString?.slice(0, 16) || '';\n}\n\nfunction Contents() {\n const [changelog, setChangelog] = useState('');\n useEffect(() => {\n (async () => {\n setChangelog(await getChangelog(1));\n updateSeenVersion();\n })();\n });\n\n return (\n <>\n

\n \n

\n

\n \n

\n\n

\n \n

\n \n\n

\n \n

\n \n \n \n \n\n

\n \n

\n cors-anywhere,\n }}\n />\n\n

\n version: {formatBuildDate(process.env.REACT_APP_GIT_TIME!)} (\n \n {process.env.REACT_APP_GIT_SHA}\n \n )\n

\n \n );\n}\n\n/** The intro page. */\nexport function Intro() {\n return (\n
\n
\n \n \n \n \n \n \n \n \n \n \n \"Topola\n \n \n \n \n \n \n \n \n \n \n \n \n
\n );\n}\n","import {\n Menu,\n Dropdown,\n MenuItemProps,\n DropdownItemProps,\n} from 'semantic-ui-react';\n\nexport enum MenuType {\n Menu,\n Dropdown,\n}\n\ninterface Props {\n menuType?: MenuType;\n}\n\nexport function MenuItem(props: Props & MenuItemProps & DropdownItemProps) {\n const newProps = {...props};\n // Remove menuType from props to avoid error message in the console.\n delete newProps.menuType;\n return (\n <>\n {props.menuType === MenuType.Menu ? (\n {props.children}\n ) : (\n {props.children}\n )}\n \n );\n}\n","import lunr from 'lunr';\nimport naturalSort from 'javascript-natural-sort';\nimport {idToFamMap, idToIndiMap} from '../util/gedcom_util';\nimport {JsonFam, JsonGedcomData, JsonIndi} from 'topola';\n\n// TODO: Add type declarations and use import instead of require.\nrequire('lunr-languages/lunr.stemmer.support')(lunr);\nrequire('lunr-languages/lunr.multi')(lunr);\nrequire('lunr-languages/lunr.de')(lunr);\nrequire('lunr-languages/lunr.fr')(lunr);\nrequire('lunr-languages/lunr.it')(lunr);\nrequire('lunr-languages/lunr.ru')(lunr);\n\nconst MAX_RESULTS = 8;\n\nexport interface SearchResult {\n id: string;\n indi: JsonIndi;\n}\n\nexport interface SearchIndex {\n search(input: string): SearchResult[];\n}\n\n/** Removes accents from letters, e.g. ó->o, ę->e. */\nfunction normalize(input: string) {\n return input\n .toLocaleLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\u0142/g, 'l'); // Special case: ł is not affected by NFD.\n}\n\n/** Comparator to sort by score first, then by id. */\nfunction compare(a: lunr.Index.Result, b: lunr.Index.Result) {\n if (a.score !== b.score) {\n return b.score - a.score;\n }\n return naturalSort(a.ref, b.ref);\n}\n\n/** Returns all last names of all husbands as a space-separated string. */\nfunction getHusbandLastName(\n indi: JsonIndi,\n indiMap: Map,\n famMap: Map,\n): string {\n return (indi.fams || [])\n .map((famId) => famMap.get(famId))\n .map((fam) => fam && fam.husb)\n .map((husbId) => husbId && indiMap.get(husbId))\n .map((husband) => husband && husband.lastName)\n .join(' ');\n}\n\nclass LunrSearchIndex implements SearchIndex {\n private index: lunr.Index | undefined;\n private indiMap: Map;\n private famMap: Map;\n\n constructor(data: JsonGedcomData) {\n this.indiMap = idToIndiMap(data);\n this.famMap = idToFamMap(data);\n }\n\n initialize() {\n const self = this;\n this.index = lunr(function () {\n this.use((lunr as any).multiLanguage('de', 'en', 'fr', 'it', 'ru'));\n this.ref('id');\n this.field('id');\n this.field('name', {boost: 10});\n this.field('normalizedName', {boost: 8});\n this.field('spouseLastName', {boost: 2});\n this.field('normalizedSpouseLastName', {boost: 2});\n\n self.indiMap.forEach((indi) => {\n const name = [indi.firstName, indi.lastName].join(' ');\n const spouseLastName = getHusbandLastName(\n indi,\n self.indiMap,\n self.famMap,\n );\n this.add({\n id: indi.id,\n name,\n normalizedName: normalize(name),\n spouseLastName,\n normalizedSpouseLastName: normalize(spouseLastName),\n });\n });\n });\n }\n\n public search(input: string): SearchResult[] {\n const query = input\n .split(' ')\n .filter((s) => !!s)\n .map((s) => `${s} ${s}*`)\n .join(' ');\n const results = this.index!.search(query);\n return results\n .sort(compare)\n .slice(0, MAX_RESULTS)\n .map((result) => ({id: result.ref, indi: this.indiMap.get(result.ref)!}));\n }\n}\n\n/** Builds a search index from data. */\nexport function buildSearchIndex(data: JsonGedcomData): SearchIndex {\n const index = new LunrSearchIndex(data);\n index.initialize();\n return index;\n}\n","import debounce from 'debounce';\nimport {analyticsEvent} from '../util/analytics';\nimport {buildSearchIndex, SearchIndex, SearchResult} from './search_index';\nimport {formatDateOrRange} from '../util/date_util';\nimport {IndiInfo, JsonGedcomData} from 'topola';\nimport {JsonIndi} from 'topola';\nimport {Search, SearchResultProps} from 'semantic-ui-react';\nimport {useEffect, useRef, useState} from 'react';\nimport {useIntl} from 'react-intl';\n\nfunction getNameLine(result: SearchResult) {\n const name = [result.indi.firstName, result.indi.lastName].join(' ').trim();\n if (result.id.length > 8) {\n return name;\n }\n return (\n <>\n {name} ({result.id})\n \n );\n}\n\ninterface Props {\n /** Data used for the search index. */\n data: JsonGedcomData;\n onSelection: (indiInfo: IndiInfo) => void;\n}\n\n/** Displays and handles the search box in the top bar. */\nexport function SearchBar(props: Props) {\n const [searchResults, setSearchResults] = useState([]);\n const [searchString, setSearchString] = useState('');\n const searchIndex = useRef();\n const intl = useIntl();\n\n function getDescriptionLine(indi: JsonIndi) {\n const birthDate = formatDateOrRange(indi.birth, intl);\n const deathDate = formatDateOrRange(indi.death, intl);\n if (!deathDate) {\n return birthDate;\n }\n return `${birthDate} – ${deathDate}`;\n }\n\n /** Produces an object that is displayed in the Semantic UI Search results. */\n function displaySearchResult(result: SearchResult): SearchResultProps {\n return {\n id: result.id,\n key: result.id,\n title: getNameLine(result),\n description: getDescriptionLine(result.indi),\n } as SearchResultProps;\n }\n\n /** On search input change. */\n function handleSearch(input: string | undefined) {\n if (!input) {\n return;\n }\n const results = searchIndex\n .current!.search(input)\n .map((result) => displaySearchResult(result));\n setSearchResults(results);\n }\n const debouncedHandleSearch = useRef(debounce(handleSearch, 200));\n\n /** On search result selected. */\n function handleResultSelect(id: string) {\n analyticsEvent('search_result_selected');\n props.onSelection({id, generation: 0});\n setSearchString('');\n }\n\n /** On search string changed. */\n function onChange(value: string) {\n debouncedHandleSearch.current(value);\n setSearchString(value);\n }\n\n // Initialize the search index.\n useEffect(() => {\n searchIndex.current = buildSearchIndex(props.data);\n }, [props.data]);\n\n return (\n onChange(data.value!)}\n onResultSelect={(_, data) => handleResultSelect(data.result.id)}\n results={searchResults}\n noResultsMessage={intl.formatMessage({\n id: 'menu.search.no_results',\n defaultMessage: 'No results found',\n })}\n placeholder={intl.formatMessage({\n id: 'menu.search.placeholder',\n defaultMessage: 'Search for people',\n })}\n selectFirstResult={true}\n value={searchString}\n id=\"search\"\n />\n );\n}\n","import * as queryString from 'query-string';\nimport md5 from 'md5';\nimport {analyticsEvent} from '../util/analytics';\nimport {Dropdown, Icon, Menu} from 'semantic-ui-react';\nimport {FormattedMessage} from 'react-intl';\nimport {MenuType} from './menu_item';\nimport {SyntheticEvent} from 'react';\nimport {useHistory, useLocation} from 'react-router';\n\nfunction loadFileAsText(file: File): Promise {\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = (evt: ProgressEvent) => {\n resolve((evt.target as FileReader).result as string);\n };\n reader.readAsText(file);\n });\n}\n\nfunction isImageFileName(fileName: string) {\n const lower = fileName.toLowerCase();\n return lower.endsWith('.jpg') || lower.endsWith('.png');\n}\n\ninterface Props {\n menuType: MenuType;\n}\n\n/** Displays and handles the \"Open file\" menu. */\nexport function UploadMenu(props: Props) {\n const history = useHistory();\n const location = useLocation();\n\n async function handleUpload(event: SyntheticEvent) {\n const files = (event.target as HTMLInputElement).files;\n if (!files || !files.length) {\n return;\n }\n const filesArray = Array.from(files);\n (event.target as HTMLInputElement).value = ''; // Reset the file input.\n analyticsEvent('upload_files_selected', {\n event_value: files.length,\n });\n\n const gedcomFile =\n filesArray.length === 1\n ? filesArray[0]\n : filesArray.find((file) => file.name.toLowerCase().endsWith('.ged')) ||\n filesArray[0];\n\n // Convert uploaded images to object URLs.\n const images = filesArray\n .filter(\n (file) => file.name !== gedcomFile.name && isImageFileName(file.name),\n )\n .map((file) => ({\n name: file.name,\n url: URL.createObjectURL(file),\n }));\n const imageMap = new Map(\n images.map((entry) => [entry.name, entry.url] as [string, string]),\n );\n\n const data = await loadFileAsText(gedcomFile);\n const imageFileNames = images\n .map((image) => image.name)\n .sort()\n .join('|');\n // Hash GEDCOM contents with uploaded image file names.\n const hash = md5(md5(data) + imageFileNames);\n\n // Use history.replace() when reuploading the same file and history.push() when loading\n // a new file.\n const search = queryString.parse(location.search);\n const historyPush = search.file === hash ? history.replace : history.push;\n\n historyPush({\n pathname: '/view',\n search: queryString.stringify({file: hash}),\n state: {data, images: imageMap},\n });\n }\n\n const content = (\n <>\n \n \n \n );\n return (\n <>\n {props.menuType === MenuType.Menu ? (\n \n ) : (\n \n {content}\n \n )}\n \n \n );\n}\n","import * as queryString from 'query-string';\nimport {analyticsEvent} from '../util/analytics';\nimport {Button, Form, Header, Icon, Input, Modal} from 'semantic-ui-react';\nimport {FormattedMessage} from 'react-intl';\nimport {MenuItem, MenuType} from './menu_item';\nimport {useEffect, useRef, useState} from 'react';\nimport {useHistory} from 'react-router';\n\ninterface Props {\n menuType: MenuType;\n}\n\n/** Displays and handles the \"Open URL\" menu. */\nexport function UrlMenu(props: Props) {\n const [dialogOpen, setDialogOpen] = useState(false);\n const [url, setUrl] = useState('');\n const inputRef = useRef(null);\n const history = useHistory();\n\n useEffect(() => {\n if (dialogOpen) {\n setUrl('');\n inputRef.current!.focus();\n }\n }, [dialogOpen]);\n\n /** Load button clicked in the \"Load from URL\" dialog. */\n function handleLoad() {\n setDialogOpen(false);\n if (url) {\n analyticsEvent('url_selected');\n history.push({\n pathname: '/view',\n search: queryString.stringify({url}),\n });\n }\n }\n\n function loadFromUrlModal() {\n return (\n setDialogOpen(false)}\n centered={false}\n >\n
\n \n \n
\n \n
\n setUrl(data.value)}\n ref={inputRef}\n />\n

\n \n topola-cors-server.up.railway.app\n \n ),\n }}\n />\n

\n \n
\n \n \n \n \n \n );\n }\n\n return (\n <>\n setDialogOpen(true)} menuType={props.menuType}>\n \n \n \n {loadFromUrlModal()}\n \n );\n}\n","export default __webpack_public_path__ + \"static/media/wikitree.7bffea31.png\";","import * as queryString from 'query-string';\nimport {Dropdown, Icon, Menu} from 'semantic-ui-react';\nimport {FormattedMessage} from 'react-intl';\nimport {IndiInfo, JsonGedcomData} from 'topola';\nimport {Link} from 'react-router-dom';\nimport {Media} from '../util/media';\nimport {MenuType} from './menu_item';\nimport {SearchBar} from './search';\nimport {UploadMenu} from './upload_menu';\nimport {UrlMenu} from './url_menu';\nimport {useHistory, useLocation} from 'react-router';\nimport {WikiTreeLoginMenu, WikiTreeMenu} from './wikitree_menu';\n\nenum ScreenSize {\n LARGE,\n SMALL,\n}\n\ninterface EventHandlers {\n onSelection: (indiInfo: IndiInfo) => void;\n onPrint: () => void;\n onDownloadPdf: () => void;\n onDownloadPng: () => void;\n onDownloadSvg: () => void;\n}\n\ninterface Props {\n /** True if the application is currently showing a chart. */\n showingChart: boolean;\n /** Data used for the search index. */\n data?: JsonGedcomData;\n standalone: boolean;\n /** Whether to show the \"All relatives\" chart type in the menu. */\n allowAllRelativesChart: boolean;\n eventHandlers: EventHandlers;\n /** Whether to show additional WikiTree menus. */\n showWikiTreeMenus: boolean;\n}\n\nexport function TopBar(props: Props) {\n const history = useHistory();\n const location = useLocation();\n\n function changeView(view: string) {\n const search = queryString.parse(location.search);\n if (search.view !== view) {\n search.view = view;\n location.search = queryString.stringify(search);\n history.push(location);\n }\n }\n\n function chartMenus(screenSize: ScreenSize) {\n if (!props.showingChart) {\n return null;\n }\n const chartTypeItems = (\n <>\n changeView('hourglass')}>\n \n \n \n {props.allowAllRelativesChart ? (\n changeView('relatives')}>\n \n \n \n ) : null}\n changeView('fancy')}>\n \n \n \n \n );\n switch (screenSize) {\n case ScreenSize.LARGE:\n return (\n <>\n \n \n \n \n\n \n \n \n
\n }\n className=\"item\"\n >\n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n }\n className=\"item\"\n >\n {chartTypeItems}\n \n \n \n );\n\n case ScreenSize.SMALL:\n return (\n <>\n \n \n \n \n\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n\n \n {chartTypeItems}\n \n \n );\n }\n }\n\n function title() {\n return (\n \n Topola Genealogy\n \n );\n }\n\n function fileMenus(screenSize: ScreenSize) {\n // In standalone WikiTree mode, show only the \"Select WikiTree ID\" menu.\n if (!props.standalone && props.showWikiTreeMenus) {\n switch (screenSize) {\n case ScreenSize.LARGE:\n return ;\n case ScreenSize.SMALL:\n return (\n <>\n \n \n \n );\n }\n }\n\n // Don't show \"open\" menus in non-standalone mode.\n if (!props.standalone) {\n return null;\n }\n\n switch (screenSize) {\n case ScreenSize.LARGE:\n // Show dropdown if chart is shown, otherwise show individual menu\n // items.\n const menus = props.showingChart ? (\n \n \n \n \n }\n className=\"item\"\n >\n \n \n \n \n \n \n ) : (\n <>\n \n \n \n \n );\n return menus;\n\n case ScreenSize.SMALL:\n return (\n <>\n \n \n \n \n \n );\n }\n }\n\n function wikiTreeLoginMenu(screenSize: ScreenSize) {\n if (!props.showWikiTreeMenus) {\n return null;\n }\n return (\n <>\n \n {screenSize === ScreenSize.SMALL ? : null}\n \n );\n }\n\n function mobileMenus() {\n return (\n <>\n \n \n \n }\n className=\"item\"\n icon={null}\n >\n \n {fileMenus(ScreenSize.SMALL)}\n {chartMenus(ScreenSize.SMALL)}\n {wikiTreeLoginMenu(ScreenSize.SMALL)}\n\n \n \n \n \n \n {props.standalone ? {title()} : title()}\n \n );\n }\n\n function desktopMenus() {\n return (\n <>\n {props.standalone ? {title()} : null}\n {fileMenus(ScreenSize.LARGE)}\n {chartMenus(ScreenSize.LARGE)}\n \n {wikiTreeLoginMenu(ScreenSize.LARGE)}\n \n \n \n \n \n );\n }\n\n return (\n <>\n \n {desktopMenus()}\n \n \n {mobileMenus()}\n \n \n );\n}\n","import * as queryString from 'query-string';\nimport wikitreeLogo from './wikitree.png';\nimport {analyticsEvent} from '../util/analytics';\nimport {Button, Form, Header, Input, Modal} from 'semantic-ui-react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {MenuItem, MenuType} from './menu_item';\nimport {useEffect, useRef, useState} from 'react';\nimport {useHistory, useLocation} from 'react-router';\nimport {getLoggedInUserName, navigateToLoginPage} from 'wikitree-js';\n\ninterface Props {\n menuType: MenuType;\n}\n\n/** Displays and handles the \"Select WikiTree ID\" menu. */\nexport function WikiTreeMenu(props: Props) {\n const [dialogOpen, setDialogOpen] = useState(false);\n const [wikiTreeId, setWikiTreeId] = useState('');\n const inputRef = useRef(null);\n const history = useHistory();\n const location = useLocation();\n\n useEffect(() => {\n if (dialogOpen) {\n setWikiTreeId('');\n inputRef.current!.focus();\n }\n }, [dialogOpen]);\n\n /** Select button clicked in the \"Select WikiTree ID\" dialog. */\n function handleSelectId() {\n setDialogOpen(false);\n if (!wikiTreeId) {\n return;\n }\n analyticsEvent('wikitree_id_selected');\n const search = queryString.parse(location.search);\n const standalone =\n search.standalone !== undefined ? search.standalone : true;\n history.push({\n pathname: '/view',\n search: queryString.stringify({\n indi: wikiTreeId,\n source: 'wikitree',\n standalone,\n }),\n });\n }\n\n function enterId(event: React.MouseEvent, id: string) {\n event.preventDefault(); // Do not follow link in href.\n setWikiTreeId(id);\n inputRef.current!.focus();\n }\n\n function wikiTreeIdModal() {\n return (\n setDialogOpen(false)}\n centered={false}\n >\n
\n \n \n
\n \n
\n

\n \n WikiTree\n \n ),\n example1: (\n enterId(e, 'Wojtyla-13')}\n className=\"link-span\"\n >\n Wojtyla-13\n \n ),\n example2: (\n enterId(e, 'Skłodowska-2')}\n className=\"link-span\"\n >\n Skłodowska-2\n \n ),\n }}\n />\n

\n setWikiTreeId(data.value)}\n ref={inputRef}\n />\n \n
\n \n \n \n \n \n );\n }\n\n return (\n <>\n setDialogOpen(true)}>\n \"WikiTree\n \n \n {wikiTreeIdModal()}\n \n );\n}\n\n/** Displays and handles the \"Log in to WikiTree\" menu. */\nexport function WikiTreeLoginMenu(props: Props) {\n const intl = useIntl();\n\n /**\n * Redirect to the WikiTree Apps login page with a return URL pointing to\n * Topola Viewer hosted on apps.wikitree.com.\n */\n function login() {\n const wikiTreeTopolaUrl =\n 'https://apps.wikitree.com/apps/wiech13/topola-viewer';\n // TODO: remove authcode if it is in the current URL.\n const returnUrl = `${wikiTreeTopolaUrl}${window.location.hash}`;\n navigateToLoginPage(returnUrl);\n }\n\n const username = getLoggedInUserName();\n if (!username) {\n return (\n <>\n \n \"WikiTree\n \n \n \n );\n }\n const tooltip = intl.formatMessage(\n {\n id: 'menu.wikitree_popup_username',\n defaultMessage: 'Logged in to WikiTree as {username}',\n },\n {username},\n );\n return (\n \n \"WikiTree\n \n \n );\n}\n","import {Item, Checkbox, Form, Header} from 'semantic-ui-react';\nimport {FormattedMessage} from 'react-intl';\nimport {ParsedQuery} from 'query-string';\n\nexport enum ChartColors {\n NO_COLOR,\n COLOR_BY_SEX,\n COLOR_BY_GENERATION,\n}\n\nexport enum Ids {\n HIDE,\n SHOW,\n}\n\nexport enum Sex {\n HIDE,\n SHOW,\n}\n\nexport interface Config {\n color: ChartColors;\n id: Ids;\n sex: Sex;\n}\n\nexport const DEFALUT_CONFIG: Config = {\n color: ChartColors.COLOR_BY_GENERATION,\n id: Ids.SHOW,\n sex: Sex.SHOW,\n};\n\nconst COLOR_ARG = new Map([\n ['n', ChartColors.NO_COLOR],\n ['g', ChartColors.COLOR_BY_GENERATION],\n ['s', ChartColors.COLOR_BY_SEX],\n]);\nconst COLOR_ARG_INVERSE = new Map();\nCOLOR_ARG.forEach((v, k) => COLOR_ARG_INVERSE.set(v, k));\n\nconst ID_ARG = new Map([\n ['h', Ids.HIDE],\n ['s', Ids.SHOW],\n]);\nconst ID_ARG_INVERSE = new Map();\nID_ARG.forEach((v, k) => ID_ARG_INVERSE.set(v, k));\n\nconst SEX_ARG = new Map([\n ['h', Sex.HIDE],\n ['s', Sex.SHOW],\n]);\nconst SEX_ARG_INVERSE = new Map();\nSEX_ARG.forEach((v, k) => SEX_ARG_INVERSE.set(v, k));\n\nexport function argsToConfig(args: ParsedQuery): Config {\n const getParam = (name: string) => {\n const value = args[name];\n return typeof value === 'string' ? value : undefined;\n };\n\n return {\n color: COLOR_ARG.get(getParam('c') ?? '') ?? DEFALUT_CONFIG.color,\n id: ID_ARG.get(getParam('i') ?? '') ?? DEFALUT_CONFIG.id,\n sex: SEX_ARG.get(getParam('s') ?? '') ?? DEFALUT_CONFIG.sex,\n };\n}\n\nexport function configToArgs(config: Config): ParsedQuery {\n return {\n c: COLOR_ARG_INVERSE.get(config.color),\n i: ID_ARG_INVERSE.get(config.id),\n s: SEX_ARG_INVERSE.get(config.sex),\n };\n}\n\nexport function ConfigPanel(props: {\n config: Config;\n onChange: (config: Config) => void;\n}) {\n return (\n
\n \n \n \n
\n \n
\n \n \n }\n name=\"checkboxRadioGroup\"\n value=\"none\"\n checked={props.config.color === ChartColors.NO_COLOR}\n onClick={() =>\n props.onChange({...props.config, color: ChartColors.NO_COLOR})\n }\n />\n \n \n \n }\n name=\"checkboxRadioGroup\"\n value=\"generation\"\n checked={props.config.color === ChartColors.COLOR_BY_GENERATION}\n onClick={() =>\n props.onChange({...props.config, color: ChartColors.COLOR_BY_GENERATION})\n }\n />\n \n \n \n }\n name=\"checkboxRadioGroup\"\n value=\"gender\"\n checked={props.config.color === ChartColors.COLOR_BY_SEX}\n onClick={() =>\n props.onChange({...props.config, color: ChartColors.COLOR_BY_SEX})\n }\n />\n \n
\n
\n \n \n
\n \n
\n \n \n }\n name=\"checkboxRadioGroup\"\n value=\"hide\"\n checked={props.config.id === Ids.HIDE}\n onClick={() =>\n props.onChange({...props.config, id: Ids.HIDE})\n }\n />\n \n \n \n }\n name=\"checkboxRadioGroup\"\n value=\"show\"\n checked={props.config.id === Ids.SHOW}\n onClick={() =>\n props.onChange({...props.config, id: Ids.SHOW})\n }\n />\n \n
\n
\n \n \n
\n \n
\n \n \n }\n name=\"checkboxRadioGroup\"\n value=\"hide\"\n checked={props.config.sex === Sex.HIDE}\n onClick={() =>\n props.onChange({...props.config, sex: Sex.HIDE})\n }\n />\n \n \n \n }\n name=\"checkboxRadioGroup\"\n value=\"show\"\n checked={props.config.sex === Sex.SHOW}\n onClick={() =>\n props.onChange({...props.config, sex: Sex.SHOW})\n }\n />\n \n
\n
\n
\n
\n );\n}\n","import {ChartColors, Ids, Sex} from './config';\nimport {interpolateNumber} from 'd3-interpolate';\nimport {IntlShape, useIntl} from 'react-intl';\nimport {max, min} from 'd3-array';\nimport {Media} from './util/media';\nimport {saveAs} from 'file-saver';\nimport {select, Selection} from 'd3-selection';\nimport {useEffect, useRef} from 'react';\nimport 'd3-transition';\nimport {\n D3ZoomEvent,\n zoom,\n ZoomBehavior,\n ZoomedElementBaseType,\n zoomTransform,\n} from 'd3-zoom';\nimport {\n JsonGedcomData,\n ChartHandle,\n IndiInfo,\n createChart,\n DetailedRenderer,\n HourglassChart,\n RelativesChart,\n FancyChart,\n CircleRenderer,\n ChartColors as TopolaChartColors,\n} from 'topola';\n\n/** How much to zoom when using the +/- buttons. */\nconst ZOOM_FACTOR = 1.3;\n\n/**\n * Called when the view is dragged with the mouse.\n *\n * @param size the size of the chart\n */\nfunction zoomed(\n size: [number, number],\n event: D3ZoomEvent,\n) {\n const parent = select('#svgContainer').node() as Element;\n\n const scale = event.transform.k;\n const offsetX = max([0, (parent.clientWidth - size[0] * scale) / 2]);\n const offsetY = max([0, (parent.clientHeight - size[1] * scale) / 2]);\n select('#chartSvg')\n .attr('width', size[0] * scale)\n .attr('height', size[1] * scale)\n .attr('transform', `translate(${offsetX}, ${offsetY})`);\n select('#chart').attr('transform', `scale(${scale})`);\n\n parent.scrollLeft = -event.transform.x;\n parent.scrollTop = -event.transform.y;\n}\n\n/** Called when the scrollbars are used. */\nfunction scrolled() {\n const parent = select('#svgContainer').node() as Element;\n const x = parent.scrollLeft + parent.clientWidth / 2;\n const y = parent.scrollTop + parent.clientHeight / 2;\n const scale = zoomTransform(parent).k;\n select(parent).call(zoom().translateTo, x / scale, y / scale);\n}\n\n/** Loads blob as data URL. */\nfunction loadAsDataUrl(blob: Blob): Promise {\n const reader = new FileReader();\n reader.readAsDataURL(blob);\n return new Promise((resolve, reject) => {\n reader.onload = (e) => resolve((e.target as FileReader).result as string);\n });\n}\n\nasync function inlineImage(image: SVGImageElement) {\n const href = image.href.baseVal;\n if (!href) {\n return;\n }\n try {\n const response = await fetch(href);\n const blob = await response.blob();\n const dataUrl = await loadAsDataUrl(blob);\n image.href.baseVal = dataUrl;\n } catch (e) {\n console.warn('Failed to load image:', e);\n }\n}\n\n/**\n * Fetches all images in the SVG and replaces them with inlined images as data\n * URLs. Images are replaced in place. The replacement is done, the returned\n * promise is resolved.\n */\nasync function inlineImages(svg: Element): Promise {\n const images = Array.from(svg.getElementsByTagName('image'));\n await Promise.all(images.map(inlineImage));\n}\n\n/** Loads a blob into an image object. */\nfunction loadImage(blob: Blob): Promise {\n const image = new Image();\n image.src = URL.createObjectURL(blob);\n return new Promise((resolve, reject) => {\n image.addEventListener('load', () => resolve(image));\n });\n}\n\n/** Draw image on a new canvas and return the canvas. */\nfunction drawImageOnCanvas(image: HTMLImageElement) {\n const canvas = document.createElement('canvas');\n // Scale image for better quality.\n canvas.width = image.width * 2;\n canvas.height = image.height * 2;\n\n const ctx = canvas.getContext('2d')!;\n const oldFill = ctx.fillStyle;\n ctx.fillStyle = 'white';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.fillStyle = oldFill;\n\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n return canvas;\n}\n\nfunction canvasToBlob(canvas: HTMLCanvasElement, type: string) {\n return new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject();\n }\n }, type);\n });\n}\n\n/** Return a copy of the SVG chart but without scaling and positioning. */\nfunction getStrippedSvg() {\n const svg = document.getElementById('chartSvg')!.cloneNode(true) as Element;\n\n svg.removeAttribute('transform');\n const parent = select('#svgContainer').node() as Element;\n const scale = zoomTransform(parent).k;\n svg.setAttribute('width', String(Number(svg.getAttribute('width')) / scale));\n svg.setAttribute(\n 'height',\n String(Number(svg.getAttribute('height')) / scale),\n );\n svg.querySelector('#chart')!.removeAttribute('transform');\n\n return svg;\n}\n\nfunction getSvgContents() {\n return new XMLSerializer().serializeToString(getStrippedSvg());\n}\n\nasync function getSvgContentsWithInlinedImages() {\n const svg = getStrippedSvg();\n await inlineImages(svg);\n return new XMLSerializer().serializeToString(svg);\n}\n\n/** Shows the print dialog to print the currently displayed chart. */\nexport function printChart() {\n const printWindow = document.createElement('iframe');\n printWindow.style.position = 'absolute';\n printWindow.style.top = '-1000px';\n printWindow.style.left = '-1000px';\n printWindow.onload = () => {\n printWindow.contentDocument!.open();\n printWindow.contentDocument!.write(getSvgContents());\n printWindow.contentDocument!.close();\n // Doesn't work on Firefox without the setTimeout.\n setTimeout(() => {\n printWindow.contentWindow!.focus();\n printWindow.contentWindow!.print();\n printWindow.parentNode!.removeChild(printWindow);\n }, 500);\n };\n document.body.appendChild(printWindow);\n}\n\nexport async function downloadSvg() {\n const contents = await getSvgContentsWithInlinedImages();\n const blob = new Blob([contents], {type: 'image/svg+xml'});\n saveAs(blob, 'topola.svg');\n}\n\nasync function drawOnCanvas(): Promise {\n const contents = await getSvgContentsWithInlinedImages();\n const blob = new Blob([contents], {type: 'image/svg+xml'});\n return drawImageOnCanvas(await loadImage(blob));\n}\n\nexport async function downloadPng() {\n const canvas = await drawOnCanvas();\n const blob = await canvasToBlob(canvas, 'image/png');\n saveAs(blob, 'topola.png');\n}\n\nexport async function downloadPdf() {\n // Lazy load jspdf.\n const {default: jspdf} = await import('jspdf');\n const canvas = await drawOnCanvas();\n const doc = new jspdf({\n orientation: canvas.width > canvas.height ? 'l' : 'p',\n unit: 'pt',\n format: [canvas.width, canvas.height],\n });\n doc.addImage(canvas, 'PNG', 0, 0, canvas.width, canvas.height, 'NONE');\n doc.save('topola.pdf');\n}\n\n/** Supported chart types. */\nexport enum ChartType {\n Hourglass,\n Relatives,\n Fancy,\n}\n\nconst chartColors = new Map([\n [ChartColors.NO_COLOR, TopolaChartColors.NO_COLOR],\n [ChartColors.COLOR_BY_GENERATION, TopolaChartColors.COLOR_BY_GENERATION],\n [ChartColors.COLOR_BY_SEX, TopolaChartColors.COLOR_BY_SEX],\n]);\n\nfunction getChartType(chartType: ChartType) {\n switch (chartType) {\n case ChartType.Hourglass:\n return HourglassChart;\n case ChartType.Relatives:\n return RelativesChart;\n case ChartType.Fancy:\n return FancyChart;\n default:\n // Fall back to hourglass chart.\n return HourglassChart;\n }\n}\n\nfunction getRendererType(chartType: ChartType) {\n switch (chartType) {\n case ChartType.Fancy:\n return CircleRenderer;\n default:\n // Use DetailedRenderer by default.\n return DetailedRenderer;\n }\n}\n\nexport interface ChartProps {\n data: JsonGedcomData;\n selection: IndiInfo;\n chartType: ChartType;\n onSelection: (indiInfo: IndiInfo) => void;\n freezeAnimation?: boolean;\n colors?: ChartColors;\n hideIds?: Ids;\n hideSex?: Sex;\n}\n\nclass ChartWrapper {\n private chart?: ChartHandle;\n /** Animation is in progress. */\n private animating = false;\n /** Rendering is required after the current animation finishes. */\n private rerenderRequired = false;\n /** The d3 zoom behavior object. */\n private zoomBehavior?: ZoomBehavior;\n /** Props that will be used for rerendering. */\n private rerenderProps?: ChartProps;\n private rerenderResetPosition?: boolean;\n\n zoom(factor: number) {\n const parent = select('#svgContainer') as Selection;\n this.zoomBehavior!.scaleBy(parent, factor);\n }\n\n /**\n * Renders the chart or performs a transition animation to a new state.\n * If indiInfo is not given, it means that it is the initial render and no\n * animation is performed.\n */\n renderChart(\n props: ChartProps,\n intl: IntlShape,\n args: {initialRender: boolean; resetPosition: boolean} = {\n initialRender: false,\n resetPosition: false,\n },\n ) {\n // Wait for animation to finish if animation is in progress.\n if (!args.initialRender && this.animating) {\n this.rerenderRequired = true;\n this.rerenderProps = props;\n this.rerenderResetPosition = args.resetPosition;\n return;\n }\n\n // Freeze changing selection after initial rendering.\n if (!args.initialRender && props.freezeAnimation) {\n return;\n }\n\n if (args.initialRender) {\n (select('#chart').node() as HTMLElement).innerHTML = '';\n this.chart = createChart({\n json: props.data,\n chartType: getChartType(props.chartType),\n renderer: getRendererType(props.chartType),\n svgSelector: '#chart',\n indiCallback: (info) => props.onSelection(info),\n colors: chartColors.get(props.colors!),\n animate: true,\n updateSvgSize: false,\n locale: intl.locale,\n });\n } else {\n this.chart!.setData(props.data);\n }\n const chartInfo = this.chart!.render({\n startIndi: props.selection.id,\n baseGeneration: props.selection.generation,\n });\n const svg = select('#chartSvg');\n const parent = select('#svgContainer').node() as Element;\n\n const scale = zoomTransform(parent).k;\n const zoomOutFactor = min([\n 1,\n scale,\n parent.clientWidth / chartInfo.size[0],\n parent.clientHeight / chartInfo.size[1],\n ])!;\n const extent: [number, number] = [max([0.1, zoomOutFactor])!, 2];\n\n this.zoomBehavior = zoom()\n .scaleExtent(extent)\n .translateExtent([[0, 0], chartInfo.size])\n .on('zoom', (event) => zoomed(chartInfo.size, event));\n select(parent).on('scroll', scrolled).call(this.zoomBehavior);\n\n const scrollTopTween = (scrollTop: number) => {\n return () => {\n const i = interpolateNumber(parent.scrollTop, scrollTop);\n return (t: number) => {\n parent.scrollTop = i(t);\n };\n };\n };\n const scrollLeftTween = (scrollLeft: number) => {\n return () => {\n const i = interpolateNumber(parent.scrollLeft, scrollLeft);\n return (t: number) => {\n parent.scrollLeft = i(t);\n };\n };\n };\n\n const dx = parent.clientWidth / 2 - chartInfo.origin[0] * scale;\n const dy = parent.clientHeight / 2 - chartInfo.origin[1] * scale;\n const offsetX = max([\n 0,\n (parent.clientWidth - chartInfo.size[0] * scale) / 2,\n ]);\n const offsetY = max([\n 0,\n (parent.clientHeight - chartInfo.size[1] * scale) / 2,\n ]);\n const svgTransition = svg.transition().delay(200).duration(500);\n const transition = args.initialRender ? svg : svgTransition;\n transition\n .attr('transform', `translate(${offsetX}, ${offsetY})`)\n .attr('width', chartInfo.size[0] * scale)\n .attr('height', chartInfo.size[1] * scale);\n if (args.resetPosition) {\n if (args.initialRender) {\n parent.scrollLeft = -dx;\n parent.scrollTop = -dy;\n } else {\n svgTransition\n .tween('scrollLeft', scrollLeftTween(-dx))\n .tween('scrollTop', scrollTopTween(-dy));\n }\n }\n\n // After the animation is finished, rerender the chart if required.\n this.animating = true;\n chartInfo.animationPromise.then(() => {\n this.animating = false;\n if (this.rerenderRequired) {\n this.rerenderRequired = false;\n // Use `this.rerenderProps` instead of the props in scope because\n // the props may have been updated in the meantime.\n this.renderChart(this.rerenderProps!, intl, {\n initialRender: false,\n resetPosition: !!this.rerenderResetPosition,\n });\n }\n });\n }\n}\n\nfunction usePrevious(value: T): T | undefined {\n const ref = useRef();\n useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n\nexport function Chart(props: ChartProps) {\n const chartWrapper = useRef(new ChartWrapper());\n const prevProps = usePrevious(props);\n const intl = useIntl();\n\n useEffect(() => {\n if (prevProps) {\n const initialRender =\n props.chartType !== prevProps?.chartType ||\n props.colors !== prevProps?.colors ||\n props.hideIds !== prevProps?.hideIds ||\n props.hideSex !== prevProps?.hideSex;\n const resetPosition =\n props.chartType !== prevProps?.chartType ||\n props.data !== prevProps.data ||\n props.selection !== prevProps.selection;\n chartWrapper.current.renderChart(props, intl, {\n initialRender,\n resetPosition,\n });\n } else {\n chartWrapper.current.renderChart(props, intl, {\n initialRender: true,\n resetPosition: true,\n });\n }\n });\n\n return (\n
\n \n chartWrapper.current.zoom(ZOOM_FACTOR)}\n >\n +\n \n chartWrapper.current.zoom(1 / ZOOM_FACTOR)}\n >\n −\n \n \n \n \n \n
\n );\n}\n","import {analyticsEvent} from '../util/analytics';\nimport {DataSource, DataSourceEnum, SourceSelection} from './data_source';\nimport {\n Date,\n DateOrRange,\n JsonEvent,\n JsonFam,\n JsonGedcomData,\n JsonImage,\n JsonIndi,\n} from 'topola';\nimport {GedcomData, normalizeGedcom, TopolaData} from '../util/gedcom_util';\nimport {GedcomEntry} from 'parse-gedcom';\nimport {IntlShape} from 'react-intl';\nimport {TopolaError} from '../util/error';\nimport {isValidDateOrRange} from '../util/date_util';\nimport {StringUtils} from 'turbocommons-ts';\nimport {\n getAncestors as getAncestorsApi,\n getRelatives as getRelativesApi,\n clientLogin,\n getLoggedInUserName,\n Person,\n} from 'wikitree-js';\n\nconst WIKITREE_APP_ID = 'topola-viewer';\n\n/** Prefix for IDs of private individuals. */\nexport const PRIVATE_ID_PREFIX = '~Private';\n\n/** Gets item from session storage. Logs exception if one is thrown. */\nfunction getSessionStorageItem(key: string): string | null {\n try {\n return sessionStorage.getItem(key);\n } catch (e) {\n console.warn('Failed to load data from session storage: ' + e);\n }\n return null;\n}\n\n/** Sets item in session storage. Logs exception if one is thrown. */\nfunction setSessionStorageItem(key: string, value: string) {\n try {\n sessionStorage.setItem(key, value);\n } catch (e) {\n console.warn('Failed to store data in session storage: ' + e);\n }\n}\n\nfunction getApiOptions(handleCors: boolean) {\n return Object.assign(\n {appId: WIKITREE_APP_ID},\n handleCors\n ? {\n apiUrl:\n 'https://topola-cors-server.up.railway.app/https://api.wikitree.com/api.php',\n }\n : {},\n );\n}\n\n/**\n * Retrieves ancestors from WikiTree for the given person ID.\n * Uses sessionStorage for caching responses.\n */\nasync function getAncestors(\n key: string,\n handleCors: boolean,\n): Promise {\n const cacheKey = `wikitree:ancestors:${key}`;\n const cachedData = getSessionStorageItem(cacheKey);\n if (cachedData) {\n return JSON.parse(cachedData);\n }\n const result = await getAncestorsApi(key, {}, getApiOptions(handleCors));\n setSessionStorageItem(cacheKey, JSON.stringify(result));\n return result;\n}\n\n/**\n * Retrieves relatives from WikiTree for the given array of person IDs.\n * Uses sessionStorage for caching responses.\n */\nasync function getRelatives(\n keys: string[],\n handleCors: boolean,\n): Promise {\n const result: Person[] = [];\n const keysToFetch: string[] = [];\n keys.forEach((key) => {\n const cachedData = getSessionStorageItem(`wikitree:relatives:${key}`);\n if (cachedData) {\n result.push(JSON.parse(cachedData));\n } else {\n keysToFetch.push(key);\n }\n });\n if (keysToFetch.length === 0) {\n return result;\n }\n const response = await getRelativesApi(\n keysToFetch,\n {getChildren: true, getSpouses: true},\n getApiOptions(handleCors),\n );\n if (!response) {\n const id = keysToFetch[0];\n throw new TopolaError(\n 'WIKITREE_PROFILE_NOT_FOUND',\n `WikiTree profile ${id} not found`,\n {id},\n );\n }\n response.forEach((person) => {\n setSessionStorageItem(\n `wikitree:relatives:${person.Name}`,\n JSON.stringify(person),\n );\n });\n return result.concat(response);\n}\n\n/**\n * Loads data from WikiTree to populate an hourglass chart starting from the\n * given person ID.\n */\nexport async function loadWikiTree(\n key: string,\n intl: IntlShape,\n authcode?: string,\n): Promise {\n // Work around CORS if not in apps.wikitree.com domain.\n const handleCors = window.location.hostname !== 'apps.wikitree.com';\n\n if (!handleCors && !getLoggedInUserName() && authcode) {\n const loginResult = await clientLogin(authcode, {appId: WIKITREE_APP_ID});\n if (loginResult.result === 'Success') {\n sessionStorage.clear();\n }\n }\n\n const everyone: Person[] = [];\n\n // Fetch the ancestors of the input person and ancestors of his/her spouses.\n const firstPerson = await getRelatives([key], handleCors);\n if (!firstPerson[0]?.Name) {\n const id = key;\n throw new TopolaError(\n 'WIKITREE_PROFILE_NOT_ACCESSIBLE',\n `WikiTree profile ${id} is not accessible. Try logging in.`,\n {id},\n );\n }\n\n const spouseKeys = Object.values(firstPerson[0].Spouses || {}).map(\n (s) => s.Name,\n );\n const ancestors = await Promise.all(\n [key]\n .concat(spouseKeys)\n .map((personId) => getAncestors(personId, handleCors)),\n );\n const ancestorKeys = ancestors\n .flat()\n .map((person) => person.Name)\n .filter((key) => !!key);\n const ancestorDetails = await getRelatives(ancestorKeys, handleCors);\n\n // Map from person id to father id if the father profile is private.\n const privateFathers: Map = new Map();\n // Map from person id to mother id if the mother profile is private.\n const privateMothers: Map = new Map();\n\n // Andujst private individual ids so that there are no collisions in the case\n // that ancestors were collected for more than one person.\n ancestors.forEach((ancestorList, index) => {\n const offset = 1000 * index;\n // Adjust ids by offset.\n ancestorList.forEach((person) => {\n if (person.Id < 0) {\n person.Id -= offset;\n person.Name = `${PRIVATE_ID_PREFIX}${person.Id}`;\n }\n if (person.Father < 0) {\n person.Father -= offset;\n privateFathers.set(person.Id, person.Father);\n }\n if (person.Mother < 0) {\n person.Mother -= offset;\n privateMothers.set(person.Id, person.Mother);\n }\n });\n });\n\n // Set the Father and Mother fields again because getRelatives doesn't return\n // private parents.\n ancestorDetails.forEach((person) => {\n const privateFather = privateFathers.get(person.Id);\n if (privateFather) {\n person.Father = privateFather;\n }\n const privateMother = privateMothers.get(person.Id);\n if (privateMother) {\n person.Mother = privateMother;\n }\n });\n everyone.push(...ancestorDetails);\n\n // Collect private individuals.\n const privateAncestors = ancestors.flat().filter((person) => person.Id < 0);\n everyone.push(...privateAncestors);\n\n // Limit the number of generations of descendants because there may be tens of\n // generations for some profiles.\n const descendantGenerationLimit = 5;\n\n // Fetch descendants recursively.\n let toFetch = [key];\n let generation = 0;\n while (toFetch.length > 0 && generation <= descendantGenerationLimit) {\n const people = await getRelatives(toFetch, handleCors);\n everyone.push(...people);\n const allSpouses = people.flatMap((person) =>\n Object.values(person.Spouses || {}),\n );\n everyone.push(...allSpouses);\n // Fetch all children.\n toFetch = people.flatMap((person) =>\n Object.values(person.Children || {}).map((c) => c.Name),\n );\n generation++;\n }\n\n //Map from human-readable person id to person names\n const personNames = new Map<\n string,\n {birth?: string; married?: string; aka?: string}\n >();\n\n // Map from person id to the set of families where they are a spouse.\n const families = new Map>();\n // Map from family id to the set of children.\n const children = new Map>();\n // Map from famliy id to the spouses.\n const spouses = new Map<\n string,\n {wife?: number; husband?: number; spouse?: Person}\n >();\n // Map from numerical id to human-readable id.\n const idToName = new Map();\n // Map from human-readable person id to fullSizeUrl of person photo.\n const fullSizePhotoUrls: Map = new Map();\n\n everyone.forEach((person) => {\n idToName.set(person.Id, person.Name);\n if (person.Mother || person.Father) {\n const famId = getFamilyId(person.Mother, person.Father);\n getSet(families, person.Mother).add(famId);\n getSet(families, person.Father).add(famId);\n getSet(children, famId).add(person.Id);\n spouses.set(famId, {\n wife: person.Mother || undefined,\n husband: person.Father || undefined,\n });\n }\n });\n\n const indis: JsonIndi[] = [];\n\n const converted = new Set();\n everyone.forEach((person) => {\n if (converted.has(person.Id)) {\n return;\n }\n converted.add(person.Id);\n const indi = convertPerson(person, intl);\n if (person.PhotoData?.path) {\n fullSizePhotoUrls.set(\n person.Name,\n `https://www.wikitree.com${person.PhotoData.path}`,\n );\n }\n\n personNames.set(person.Name, convertPersonNames(person));\n\n if (person.Spouses) {\n Object.values(person.Spouses).forEach((spouse) => {\n const famId = getFamilyId(person.Id, spouse.Id);\n getSet(families, person.Id).add(famId);\n getSet(families, spouse.Id).add(famId);\n const familySpouses =\n person.Gender === 'Male'\n ? {wife: spouse.Id, husband: person.Id, spouse}\n : {wife: person.Id, husband: spouse.Id, spouse};\n spouses.set(famId, familySpouses);\n });\n }\n indi.fams = Array.from(getSet(families, person.Id));\n indis.push(indi);\n });\n\n const fams = Array.from(spouses.entries()).map(([key, value]) => {\n const fam: JsonFam = {\n id: key,\n };\n const wife = value.wife && idToName.get(value.wife);\n if (wife) {\n fam.wife = wife;\n }\n const husband = value.husband && idToName.get(value.husband);\n if (husband) {\n fam.husb = husband;\n }\n fam.children = Array.from(getSet(children, key)).map(\n (child) => idToName.get(child)!,\n );\n if (\n value.spouse &&\n ((value.spouse.marriage_date &&\n value.spouse.marriage_date !== '0000-00-00') ||\n value.spouse.marriage_location)\n ) {\n const parsedDate = parseDate(value.spouse.marriage_date);\n fam.marriage = Object.assign({}, parsedDate, {\n place: value.spouse.marriage_location,\n });\n }\n return fam;\n });\n\n const chartData = normalizeGedcom({indis, fams});\n const gedcom = buildGedcom(chartData, fullSizePhotoUrls, personNames);\n return {chartData, gedcom};\n}\n\n/** Creates a family identifier given 2 spouse identifiers. */\nfunction getFamilyId(spouse1: number, spouse2: number) {\n if (spouse2 > spouse1) {\n return `${spouse1}_${spouse2}`;\n }\n return `${spouse2}_${spouse1}`;\n}\n\nfunction convertPerson(person: Person, intl: IntlShape): JsonIndi {\n const indi: JsonIndi = {\n id: person.Name,\n };\n if (person.Name.startsWith(PRIVATE_ID_PREFIX)) {\n indi.hideId = true;\n indi.firstName = intl.formatMessage({\n id: 'wikitree.private',\n defaultMessage: 'Private',\n });\n }\n if (person.FirstName && person.FirstName !== 'Unknown') {\n indi.firstName = person.FirstName;\n } else if (person.RealName && person.RealName !== 'Unknown') {\n indi.firstName = person.RealName;\n }\n if (person.LastNameAtBirth !== 'Unknown') {\n indi.lastName = person.LastNameAtBirth;\n }\n if (person.Mother || person.Father) {\n indi.famc = getFamilyId(person.Mother, person.Father);\n }\n if (person.Gender === 'Male') {\n indi.sex = 'M';\n } else if (person.Gender === 'Female') {\n indi.sex = 'F';\n }\n if (\n (person.BirthDate && person.BirthDate !== '0000-00-00') ||\n person.BirthLocation ||\n person.BirthDateDecade !== 'unknown'\n ) {\n const parsedDate = parseDate(\n person.BirthDate,\n (person.DataStatus && person.DataStatus.BirthDate) || undefined,\n );\n const date = parsedDate || parseDecade(person.BirthDateDecade);\n indi.birth = Object.assign({}, date, {place: person.BirthLocation});\n }\n if (\n (person.DeathDate && person.DeathDate !== '0000-00-00') ||\n person.DeathLocation ||\n person.DeathDateDecade !== 'unknown'\n ) {\n const parsedDate = parseDate(\n person.DeathDate,\n (person.DataStatus && person.DataStatus.DeathDate) || undefined,\n );\n const date = parsedDate || parseDecade(person.DeathDateDecade);\n indi.death = Object.assign({}, date, {place: person.DeathLocation});\n }\n if (person.PhotoData) {\n indi.images = [\n {\n url: `https://www.wikitree.com${person.PhotoData.url}`,\n title: person.Photo,\n },\n ];\n }\n return indi;\n}\n\nfunction isSimilarName(name1: string, name2: string) {\n return StringUtils.compareSimilarityPercent(name1, name2) >= 75;\n}\n\nfunction getMarriedName(person: Person) {\n if (\n !person.Spouses ||\n person.LastNameCurrent === 'Unknown' ||\n person.LastNameCurrent === person.LastNameAtBirth\n ) {\n return undefined;\n }\n const nameParts = person.LastNameCurrent.split(/[- ,]/);\n // In some languages the same names can differ a bit between genders,\n // so regular equals comparison cannot be used.\n // To verify if spouse has the same name, person name is split to include\n // people with double names, then there is a check if any name part is\n // at least 75% similar to spouse name.\n const matchingNames = Object.entries(person.Spouses)\n .flatMap(([, spousePerson]) => spousePerson.LastNameAtBirth.split(/[- ,]/))\n .some((spousePersonNamePart) =>\n nameParts.some((personNamePart) =>\n isSimilarName(spousePersonNamePart, personNamePart),\n ),\n );\n return matchingNames ? person.LastNameCurrent : undefined;\n}\n\n/**\n * Resolve birth name, married name and aka name with following logic:\n * - birth name is always prioritized and is set if exists and is not unknown\n * - married name is based on LastNameCurrent and is set if it's different than\n * birth name and one of the spouses has it as their birth name\n * - aka name is based on LastNameOther and is set if it's different than others\n */\nfunction convertPersonNames(person: Person) {\n const birth =\n person.LastNameAtBirth !== 'Unknown' ? person.LastNameAtBirth : undefined;\n const married = getMarriedName(person);\n const aka =\n person.LastNameOther !== 'Unknown' &&\n person.LastNameAtBirth !== person.LastNameOther &&\n person.LastNameCurrent !== person.LastNameOther\n ? person.LastNameOther\n : undefined;\n return {birth, married, aka};\n}\n\n/**\n * Parses a date in the format returned by WikiTree and converts in to\n * the format defined by Topola.\n */\nfunction parseDate(date: string, dataStatus?: string): DateOrRange | undefined {\n if (!date) {\n return undefined;\n }\n const matchedDate = date.match(/(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)/);\n if (!matchedDate) {\n return {date: {text: date}};\n }\n const parsedDate: Date = {};\n if (matchedDate[1] !== '0000') {\n parsedDate.year = ~~matchedDate[1];\n }\n if (matchedDate[2] !== '00') {\n parsedDate.month = ~~matchedDate[2];\n }\n if (matchedDate[3] !== '00') {\n parsedDate.day = ~~matchedDate[3];\n }\n if (dataStatus === 'after') {\n return {dateRange: {from: parsedDate}};\n }\n if (dataStatus === 'before') {\n return {dateRange: {to: parsedDate}};\n }\n if (dataStatus === 'guess') {\n parsedDate.qualifier = 'abt';\n }\n return {date: parsedDate};\n}\n\nfunction parseDecade(decade: string): DateOrRange | undefined {\n return decade !== 'unknown' ? {date: {text: decade}} : undefined;\n}\n\nconst MONTHS = new Map([\n [1, 'JAN'],\n [2, 'FEB'],\n [3, 'MAR'],\n [4, 'APR'],\n [5, 'MAY'],\n [6, 'JUN'],\n [7, 'JUL'],\n [8, 'AUG'],\n [9, 'SEP'],\n [10, 'OCT'],\n [11, 'NOV'],\n [12, 'DEC'],\n]);\n\nfunction dateToGedcom(date: Date): string {\n return [date.qualifier, date.day, MONTHS.get(date.month!), date.year]\n .filter((x) => x !== undefined)\n .join(' ');\n}\n\nfunction dateOrRangeToGedcom(dateOrRange: DateOrRange): string {\n if (dateOrRange.date) {\n return dateToGedcom(dateOrRange.date);\n }\n if (!dateOrRange.dateRange) {\n return '';\n }\n if (dateOrRange.dateRange.from && dateOrRange.dateRange.to) {\n return `BET ${dateToGedcom(dateOrRange.dateRange.from)} AND ${\n dateOrRange.dateRange.to\n }`;\n }\n if (dateOrRange.dateRange.from) {\n return `AFT ${dateToGedcom(dateOrRange.dateRange.from)}`;\n }\n if (dateOrRange.dateRange.to) {\n return `BEF ${dateToGedcom(dateOrRange.dateRange.to)}`;\n }\n return '';\n}\n\nfunction nameToGedcom(type: string, firstName?: string, lastName?: string) {\n return {\n level: 1,\n pointer: '',\n tag: 'NAME',\n data: `${firstName || ''} /${lastName || ''}/`,\n tree: [\n {\n level: 2,\n pointer: '',\n tag: 'TYPE',\n data: type,\n tree: [],\n },\n ],\n };\n}\n\nfunction eventToGedcom(event: JsonEvent): GedcomEntry[] {\n const result = [];\n if (isValidDateOrRange(event)) {\n result.push({\n level: 2,\n pointer: '',\n tag: 'DATE',\n data: dateOrRangeToGedcom(event),\n tree: [],\n });\n }\n if (event.place) {\n result.push({\n level: 2,\n pointer: '',\n tag: 'PLAC',\n data: event.place,\n tree: [],\n });\n }\n return result;\n}\n\nfunction imageToGedcom(\n image: JsonImage,\n fullSizePhotoUrl: string | undefined,\n): GedcomEntry[] {\n return [\n {\n level: 2,\n pointer: '',\n tag: 'FILE',\n data: fullSizePhotoUrl || image.url,\n tree: [\n {\n level: 3,\n pointer: '',\n tag: 'FORM',\n data: image.title?.split('.').pop() || '',\n tree: [],\n },\n {\n level: 3,\n pointer: '',\n tag: 'TITL',\n data: image.title?.split('.')[0] || '',\n tree: [],\n },\n ],\n },\n ];\n}\n\nfunction indiToGedcom(\n indi: JsonIndi,\n fullSizePhotoUrl: Map,\n personNames: {birth?: string; married?: string; aka?: string},\n): GedcomEntry {\n // WikiTree URLs replace spaces with underscores.\n const escapedId = indi.id.replace(/ /g, '_');\n const record: GedcomEntry = {\n level: 0,\n pointer: `@${indi.id}@`,\n tag: 'INDI',\n data: '',\n tree: [],\n };\n\n if (personNames.birth) {\n record.tree.push(nameToGedcom('birth', indi.firstName, personNames.birth));\n }\n if (personNames.married) {\n record.tree.push(\n nameToGedcom('married', indi.firstName, personNames.married),\n );\n }\n if (personNames.aka) {\n record.tree.push(nameToGedcom('aka', indi.firstName, personNames.aka));\n }\n\n if (indi.birth) {\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'BIRT',\n data: '',\n tree: eventToGedcom(indi.birth),\n });\n }\n if (indi.death) {\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'DEAT',\n data: '',\n tree: eventToGedcom(indi.death),\n });\n }\n if (indi.famc) {\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'FAMC',\n data: `@${indi.famc}@`,\n tree: [],\n });\n }\n (indi.fams || []).forEach((fams) =>\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'FAMS',\n data: `@${fams}@`,\n tree: [],\n }),\n );\n if (!indi.id.startsWith('~')) {\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'WWW',\n data: `https://www.wikitree.com/wiki/${escapedId}`,\n tree: [],\n });\n }\n (indi.images || []).forEach((image) => {\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'OBJE',\n data: '',\n tree: imageToGedcom(image, fullSizePhotoUrl.get(indi.id)),\n });\n });\n return record;\n}\n\nfunction famToGedcom(fam: JsonFam): GedcomEntry {\n const record: GedcomEntry = {\n level: 0,\n pointer: `@${fam.id}@`,\n tag: 'FAM',\n data: '',\n tree: [],\n };\n if (fam.wife) {\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'WIFE',\n data: `@${fam.wife}@`,\n tree: [],\n });\n }\n if (fam.husb) {\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'HUSB',\n data: `@${fam.husb}@`,\n tree: [],\n });\n }\n (fam.children || []).forEach((child) =>\n record.tree.push({\n level: 1,\n pointer: child,\n tag: 'CHILD',\n data: '',\n tree: [],\n }),\n );\n if (fam.marriage) {\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'MARR',\n data: '',\n tree: eventToGedcom(fam.marriage),\n });\n }\n return record;\n}\n\n/**\n * Creates a GEDCOM structure for the purpose of displaying the details\n * panel.\n */\nfunction buildGedcom(\n data: JsonGedcomData,\n fullSizePhotoUrls: Map,\n personNames: Map,\n): GedcomData {\n const gedcomIndis: {[key: string]: GedcomEntry} = {};\n const gedcomFams: {[key: string]: GedcomEntry} = {};\n data.indis.forEach((indi) => {\n gedcomIndis[indi.id] = indiToGedcom(\n indi,\n fullSizePhotoUrls,\n personNames.get(indi.id) || {},\n );\n });\n data.fams.forEach((fam) => {\n gedcomFams[fam.id] = famToGedcom(fam);\n });\n\n return {\n head: {level: 0, pointer: '', tag: 'HEAD', data: '', tree: []},\n indis: gedcomIndis,\n fams: gedcomFams,\n other: {},\n };\n}\n\n/**\n * Returns a set which is a value from a SetMultimap. If the key doesn't exist,\n * an empty set is added to the map.\n */\nfunction getSet(map: Map>, key: K): Set {\n const set = map.get(key);\n if (set) {\n return set;\n }\n const newSet = new Set();\n map.set(key, newSet);\n return newSet;\n}\n\nexport interface WikiTreeSourceSpec {\n source: DataSourceEnum.WIKITREE;\n authcode?: string;\n}\n\n/** Loading data from the WikiTree API. */\nexport class WikiTreeDataSource implements DataSource {\n constructor(private intl: IntlShape) {}\n\n isNewData(\n newSource: SourceSelection,\n oldSource: SourceSelection,\n data?: TopolaData,\n ): boolean {\n if (!newSource.selection) {\n return false;\n }\n if (oldSource.selection?.id === newSource.selection.id) {\n // Selection unchanged -> don't reload.\n return false;\n }\n if (\n data &&\n data.chartData.indis.some((indi) => indi.id === newSource.selection?.id)\n ) {\n // New selection exists in current view -> animate instead of reloading.\n return false;\n }\n return true;\n }\n\n async loadData(\n source: SourceSelection,\n ): Promise {\n if (!source.selection) {\n throw new TopolaError(\n 'WIKITREE_ID_NOT_PROVIDED',\n 'WikiTree id needs to be provided',\n );\n }\n try {\n const data = await loadWikiTree(\n source.selection.id,\n this.intl,\n source.spec.authcode,\n );\n analyticsEvent('wikitree_loaded');\n return data;\n } catch (error) {\n analyticsEvent('wikitree_error');\n throw error;\n }\n }\n}\n","import * as H from 'history';\nimport * as queryString from 'query-string';\nimport {analyticsEvent} from './util/analytics';\nimport {Changelog} from './changelog';\nimport {DataSourceEnum, SourceSelection} from './datasource/data_source';\nimport {Details} from './details/details';\nimport {EmbeddedDataSource, EmbeddedSourceSpec} from './datasource/embedded';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {getI18nMessage} from './util/error_i18n';\nimport {IndiInfo} from 'topola';\nimport {Intro} from './intro';\nimport {Loader, Message, Portal, Tab} from 'semantic-ui-react';\nimport {Media} from './util/media';\nimport {Redirect, Route, Switch} from 'react-router-dom';\nimport {TopBar} from './menu/top_bar';\nimport {TopolaData} from './util/gedcom_util';\nimport {useEffect, useState} from 'react';\nimport {useHistory, useLocation} from 'react-router';\nimport {idToIndiMap} from './util/gedcom_util';\nimport {\n Chart,\n ChartType,\n downloadPdf,\n downloadPng,\n downloadSvg,\n printChart,\n} from './chart';\nimport {\n argsToConfig,\n Config,\n ConfigPanel,\n configToArgs,\n DEFALUT_CONFIG,\n Ids,\n Sex,\n} from './config';\nimport {\n getSelection,\n UploadSourceSpec,\n UrlSourceSpec,\n GedcomUrlDataSource,\n UploadedDataSource,\n} from './datasource/load_data';\nimport {\n loadWikiTree,\n PRIVATE_ID_PREFIX,\n WikiTreeDataSource,\n WikiTreeSourceSpec,\n} from './datasource/wikitree';\n\n/** Shows an error message in the middle of the screen. */\nfunction ErrorMessage(props: {message?: string}) {\n return (\n \n \n \n \n

{props.message}

\n
\n );\n}\n\ninterface ErrorPopupProps {\n message?: string;\n open: boolean;\n onDismiss: () => void;\n}\n\n/**\n * Shows a dismissable error message in the bottom left corner of the screen.\n */\nfunction ErrorPopup(props: ErrorPopupProps) {\n return (\n \n \n \n \n \n

{props.message}

\n
\n
\n );\n}\n\nenum AppState {\n INITIAL,\n LOADING,\n ERROR,\n SHOWING_CHART,\n LOADING_MORE,\n}\n\ntype DataSourceSpec =\n | UrlSourceSpec\n | UploadSourceSpec\n | WikiTreeSourceSpec\n | EmbeddedSourceSpec;\n\n/**\n * Arguments passed to the application, primarily through URL parameters.\n * Non-optional arguments get populated with default values.\n */\ninterface Arguments {\n sourceSpec?: DataSourceSpec;\n selection?: IndiInfo;\n chartType: ChartType;\n standalone: boolean;\n showWikiTreeMenus: boolean;\n freezeAnimation: boolean;\n showSidePanel: boolean;\n config: Config;\n}\n\n/**\n * Retrieve arguments passed into the application through the URL and uploaded\n * data.\n */\nfunction getArguments(location: H.Location): Arguments {\n const search = queryString.parse(location.search);\n const getParam = (name: string) => {\n const value = search[name];\n return typeof value === 'string' ? value : undefined;\n };\n\n const view = getParam('view');\n const chartTypes = new Map([\n ['relatives', ChartType.Relatives],\n ['fancy', ChartType.Fancy],\n ]);\n\n const hash = getParam('file');\n const url = getParam('url');\n const embedded = getParam('embedded') === 'true'; // False by default.\n var sourceSpec: DataSourceSpec | undefined = undefined;\n if (getParam('source') === 'wikitree') {\n sourceSpec = {\n source: DataSourceEnum.WIKITREE,\n authcode: getParam('authcode'),\n };\n } else if (hash) {\n sourceSpec = {\n source: DataSourceEnum.UPLOADED,\n hash,\n gedcom: location.state && location.state.data,\n images: location.state && location.state.images,\n };\n } else if (url) {\n sourceSpec = {\n source: DataSourceEnum.GEDCOM_URL,\n url,\n handleCors: getParam('handleCors') !== 'false', // True by default.\n };\n } else if (embedded) {\n sourceSpec = {source: DataSourceEnum.EMBEDDED};\n }\n\n const indi = getParam('indi');\n const parsedGen = Number(getParam('gen'));\n const selection = indi\n ? {id: indi, generation: !isNaN(parsedGen) ? parsedGen : 0}\n : undefined;\n\n return {\n sourceSpec,\n selection,\n // Hourglass is the default view.\n chartType: chartTypes.get(view) || ChartType.Hourglass,\n\n showSidePanel: getParam('sidePanel') !== 'false', // True by default.\n standalone: getParam('standalone') !== 'false' && !embedded,\n showWikiTreeMenus: getParam('showWikiTreeMenus') !== 'false', // True by default.\n freezeAnimation: getParam('freeze') === 'true', // False by default\n config: argsToConfig(search),\n };\n}\n\nexport function App() {\n /** State of the application. */\n const [state, setState] = useState(AppState.INITIAL);\n /** Loaded data. */\n const [data, setData] = useState();\n /** Selected individual. */\n const [selection, setSelection] = useState();\n /** Error to display. */\n const [error, setError] = useState();\n /** Whether the side panel is shown. */\n const [showSidePanel, setShowSidePanel] = useState(false);\n /** Whether the app is in standalone mode, i.e. showing 'open file' menus. */\n const [standalone, setStandalone] = useState(true);\n /**\n * Whether the app should display WikiTree-specific menus when showing data\n * from WikiTree.\n */\n const [showWikiTreeMenus, setShowWikiTreeMenus] = useState(true);\n /** Type of displayed chart. */\n const [chartType, setChartType] = useState(ChartType.Hourglass);\n /** Whether to show the error popup. */\n const [showErrorPopup, setShowErrorPopup] = useState(false);\n /** Specification of the source of the data. */\n const [sourceSpec, setSourceSpec] = useState();\n /** Freeze animations after initial chart render. */\n const [freezeAnimation, setFreezeAnimation] = useState(false);\n const [config, setConfig] = useState(DEFALUT_CONFIG);\n\n const intl = useIntl();\n const history = useHistory();\n const location = useLocation();\n\n /** Sets the state with a new individual selection and chart type. */\n function updateDisplay(newSelection: IndiInfo) {\n if (\n !selection ||\n selection.id !== newSelection.id ||\n selection!.generation !== newSelection.generation\n ) {\n setSelection(newSelection);\n }\n }\n\n function toggleDetails(config: Config, data: TopolaData | undefined) {\n if (data === undefined) {\n return;\n }\n let shouldHideIds = config.id === Ids.HIDE;\n let shouldHideSex = config.sex === Sex.HIDE;\n let indiMap = idToIndiMap(data.chartData);\n indiMap.forEach((indi) => {\n indi.hideId = shouldHideIds;\n indi.hideSex = shouldHideSex;\n });\n }\n\n /** Sets error message after data load failure. */\n function setErrorMessage(message: string) {\n setError(message);\n setState(AppState.ERROR);\n }\n\n const uploadedDataSource = new UploadedDataSource();\n const gedcomUrlDataSource = new GedcomUrlDataSource();\n const wikiTreeDataSource = new WikiTreeDataSource(intl);\n const embeddedDataSource = new EmbeddedDataSource();\n\n function isNewData(newSourceSpec: DataSourceSpec, newSelection?: IndiInfo) {\n if (!sourceSpec || sourceSpec.source !== newSourceSpec.source) {\n // New data source means new data.\n return true;\n }\n const newSource = {spec: newSourceSpec, selection: newSelection};\n const oldSouce = {\n spec: sourceSpec,\n selection: selection,\n };\n switch (newSource.spec.source) {\n case DataSourceEnum.UPLOADED:\n return uploadedDataSource.isNewData(\n newSource as SourceSelection,\n oldSouce as SourceSelection,\n data,\n );\n case DataSourceEnum.GEDCOM_URL:\n return gedcomUrlDataSource.isNewData(\n newSource as SourceSelection,\n oldSouce as SourceSelection,\n data,\n );\n case DataSourceEnum.WIKITREE:\n return wikiTreeDataSource.isNewData(\n newSource as SourceSelection,\n oldSouce as SourceSelection,\n data,\n );\n case DataSourceEnum.EMBEDDED:\n return embeddedDataSource.isNewData(\n newSource as SourceSelection,\n oldSouce as SourceSelection,\n data,\n );\n }\n }\n\n function loadData(newSourceSpec: DataSourceSpec, newSelection?: IndiInfo) {\n switch (newSourceSpec.source) {\n case DataSourceEnum.UPLOADED:\n return uploadedDataSource.loadData({\n spec: newSourceSpec,\n selection: newSelection,\n });\n case DataSourceEnum.GEDCOM_URL:\n return gedcomUrlDataSource.loadData({\n spec: newSourceSpec,\n selection: newSelection,\n });\n case DataSourceEnum.WIKITREE:\n return wikiTreeDataSource.loadData({\n spec: newSourceSpec,\n selection: newSelection,\n });\n case DataSourceEnum.EMBEDDED:\n return embeddedDataSource.loadData({\n spec: newSourceSpec,\n selection: newSelection,\n });\n }\n }\n\n useEffect(() => {\n (async () => {\n if (location.pathname !== '/view') {\n if (state !== AppState.INITIAL) {\n setState(AppState.INITIAL);\n }\n return;\n }\n\n const args = getArguments(location);\n\n if (!args.sourceSpec) {\n history.replace({pathname: '/'});\n return;\n }\n\n if (\n state === AppState.INITIAL ||\n isNewData(args.sourceSpec, args.selection)\n ) {\n // Set loading state.\n setState(AppState.LOADING);\n // Set state from URL parameters.\n setSourceSpec(args.sourceSpec);\n setSelection(args.selection);\n setStandalone(args.standalone);\n setShowWikiTreeMenus(args.showWikiTreeMenus);\n setChartType(args.chartType);\n setFreezeAnimation(args.freezeAnimation);\n setConfig(args.config);\n try {\n const data = await loadData(args.sourceSpec, args.selection);\n // Set state with data.\n setData(data);\n toggleDetails(args.config, data);\n setShowSidePanel(args.showSidePanel);\n setState(AppState.SHOWING_CHART);\n } catch (error: any) {\n setErrorMessage(getI18nMessage(error, intl));\n }\n } else if (\n state === AppState.SHOWING_CHART ||\n state === AppState.LOADING_MORE\n ) {\n // Update selection if it has changed in the URL.\n const loadMoreFromWikitree =\n args.sourceSpec.source === DataSourceEnum.WIKITREE &&\n (!selection || selection.id !== args.selection?.id);\n setChartType(args.chartType);\n setState(\n loadMoreFromWikitree ? AppState.LOADING_MORE : AppState.SHOWING_CHART,\n );\n updateDisplay(args.selection!);\n if (loadMoreFromWikitree) {\n try {\n const data = await loadWikiTree(args.selection!.id, intl);\n const newSelection = getSelection(data.chartData, args.selection);\n setData(data);\n setSelection(newSelection);\n setState(AppState.SHOWING_CHART);\n } catch (error: any) {\n setState(AppState.SHOWING_CHART);\n displayErrorPopup(\n intl.formatMessage(\n {\n id: 'error.failed_wikitree_load_more',\n defaultMessage: 'Failed to load data from WikiTree. {error}',\n },\n {error},\n ),\n );\n }\n }\n }\n })();\n });\n\n function updateUrl(args: queryString.ParsedQuery) {\n const search = queryString.parse(location.search);\n for (const key in args) {\n search[key] = args[key];\n }\n location.search = queryString.stringify(search);\n history.push(location);\n }\n\n /**\n * Called when the user clicks an individual box in the chart.\n * Updates the browser URL.\n */\n function onSelection(selection: IndiInfo) {\n // Don't allow selecting WikiTree private profiles.\n if (selection.id.startsWith(PRIVATE_ID_PREFIX)) {\n return;\n }\n analyticsEvent('selection_changed');\n updateUrl({\n indi: selection.id,\n gen: selection.generation,\n });\n }\n\n function onPrint() {\n analyticsEvent('print');\n printChart();\n }\n\n function displayErrorPopup(message: string) {\n setShowErrorPopup(true);\n setError(message);\n }\n\n async function onDownloadPdf() {\n analyticsEvent('download_pdf');\n try {\n await downloadPdf();\n } catch (e) {\n displayErrorPopup(\n intl.formatMessage({\n id: 'error.failed_pdf',\n defaultMessage:\n 'Failed to generate PDF file.' +\n ' Please try with a smaller diagram or download an SVG file.',\n }),\n );\n }\n }\n\n async function onDownloadPng() {\n analyticsEvent('download_png');\n try {\n await downloadPng();\n } catch (e) {\n displayErrorPopup(\n intl.formatMessage({\n id: 'error.failed_png',\n defaultMessage:\n 'Failed to generate PNG file.' +\n ' Please try with a smaller diagram or download an SVG file.',\n }),\n );\n }\n }\n\n function onDownloadSvg() {\n analyticsEvent('download_svg');\n downloadSvg();\n }\n\n function onDismissErrorPopup() {\n setShowErrorPopup(false);\n }\n\n function renderMainArea() {\n switch (state) {\n case AppState.SHOWING_CHART:\n case AppState.LOADING_MORE:\n const updatedSelection = getSelection(data!.chartData, selection);\n const sidePanelTabs = [\n {\n menuItem: intl.formatMessage({\n id: 'tab.info',\n defaultMessage: 'Info',\n }),\n render: () => (\n
\n ),\n },\n {\n menuItem: intl.formatMessage({\n id: 'tab.settings',\n defaultMessage: 'Settings',\n }),\n render: () => (\n {\n setConfig(config);\n toggleDetails(config, data);\n updateUrl(configToArgs(config));\n }}\n />\n ),\n },\n ];\n return (\n
\n \n {state === AppState.LOADING_MORE ? (\n \n ) : null}\n \n {showSidePanel ? (\n \n \n \n ) : null}\n \n
\n );\n\n case AppState.ERROR:\n return ;\n\n case AppState.INITIAL:\n case AppState.LOADING:\n return ;\n }\n }\n\n return (\n <>\n (\n \n )}\n />\n \n \n \n \n \n \n );\n}\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport messages_cs from './translations/cs.json';\nimport messages_de from './translations/de.json';\nimport messages_fr from './translations/fr.json';\nimport messages_it from './translations/it.json';\nimport messages_pl from './translations/pl.json';\nimport messages_ru from './translations/ru.json';\nimport {App} from './app';\nimport {detect} from 'detect-browser';\nimport {HashRouter as Router, Route} from 'react-router-dom';\nimport {IntlProvider} from 'react-intl';\nimport {MediaContextProvider, mediaStyles} from './util/media';\nimport './index.css';\nimport 'semantic-ui-css/semantic.min.css';\nimport 'canvas-toBlob';\n\nconst messages = {\n cs: messages_cs,\n de: messages_de,\n fr: messages_fr,\n it: messages_it,\n pl: messages_pl,\n ru: messages_ru,\n};\nconst language = navigator.language && navigator.language.split(/[-_]/)[0];\n\nconst browser = detect();\n\nif (browser && browser.name === 'ie') {\n ReactDOM.render(\n

\n Topola Genealogy Viewer does not support Internet Explorer. Please try a\n different (modern) browser.\n

,\n document.querySelector('#root'),\n );\n} else {\n ReactDOM.render(\n \n \n \n \n \n \n \n ,\n document.querySelector('#root'),\n );\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["util/analytics.ts","datasource/data_source.ts","changelog.tsx","util/error.ts","util/date_util.ts","util/gedcom_util.ts","util/age_util.ts","details/multiline-text.tsx","details/translated-tag.tsx","details/events.tsx","details/wrapped-image.tsx","details/details.tsx","datasource/load_data.ts","datasource/embedded.ts","util/error_i18n.ts","topola.jpg","util/media.ts","intro.tsx","menu/menu_item.tsx","menu/search_index.ts","menu/search.tsx","menu/upload_menu.tsx","menu/url_menu.tsx","menu/wikitree.png","menu/top_bar.tsx","menu/wikitree_menu.tsx","config.tsx","chart.tsx","datasource/wikitree.ts","app.tsx","index.tsx"],"names":["analyticsEvent","action","data","window","gtag","DataSourceEnum","LAST_SEEN_VERSION_KEY","getChangelog","maxVersions","seenVersion","a","seenVersionDate","Date","parse","slice","changes","process","split","map","notes","date","trim","filter","release","join","unified","use","remarkParse","remarkRehype","rehypeStringify","parsedChanges","String","updateSeenVersion","localStorage","setItem","Changelog","useState","open","setOpen","changelog","setChangelog","useEffect","getItem","Modal","centered","Header","id","defaultMessage","Content","className","dangerouslySetInnerHTML","__html","href","Actions","Button","primary","onClick","TopolaError","code","message","args","Error","DATE_QUALIFIERS","Map","formatDate","intl","hasDay","undefined","day","hasMonth","month","hasYear","year","text","dateObject","toDateObject","formatOptions","formatDateQualifier","qualifier","Intl","DateTimeFormat","locale","format","lowerCaseQualifier","toLowerCase","formatMessage","get","formatDateOrRange","dateOrRange","dateRange","fromDate","from","toDate","to","translatedFromDate","translatedToDate","formatDateRage","compareTopolaDates","date1","date2","compareDates","firstDateOrRange","secondDateOrRange","isValidDateOrRange","isDateRangeClosed","range","pointerToId","pointer","substring","length","idToIndiMap","indis","forEach","indi","set","idToFamMap","fams","fam","prepareGedcom","entries","head","find","entry","tag","other","strcmp","b","sortChildren","gedcom","comparator","indiMap","indiId1","indiId2","indi1","indi2","birth","birthDatesComparator","newFams","children","newChildren","sort","Object","assign","sortFamilyChildren","sortSpouses","famMap","famId1","famId2","fam1","fam2","marriage","marriageDatesComparator","newIndis","sortIndiSpouses","dereference","getterFunction","dereferenced","getData","result","tree","subentry","last","push","normalizeGedcom","IMAGE_EXTENSIONS","isImageFile","fileName","lowerName","some","ext","endsWith","filterImages","images","newImages","image","url","match","has","title","startsWith","filterImage","getSoftware","sour","name","getFileName","fileEntry","fileTitle","fileExtension","formatAgeMoreThan","birthDate","deathDate","ageInYears","calcDateDifferenceInYears","age","formatAgeLessThan","formatAgeBetween","birthDateFrom","birthDateTo","deathDateFrom","deathDateTo","ageInYearsFrom","ageInYearsTo","ageFrom","ageTo","canCalculateAge","range1","range2","firstDate","secondDate","firstDateObject","secondDateObject","startYear","getUTCFullYear","yearDiff","monthDiff","getUTCMonth","getUTCDate","Math","abs","calcAge","birthGedcomDate","deathGedcomDate","birthDateOrRange","getDate","deathDateOrRange","translatedQualifier","formatExactAge","MultilineText","props","lines","line","index","properties","target","TAG_DESCRIPTIONS","TranslatedTag","normalizedTag","replace","PersonLink","location","useLocation","person","names","subEntry","nameEntry","getName","search","queryString","Item","Meta","pathname","EVENT_TAGS","FAMILY_EVENT_TAGS","EventHeader","useIntl","as","size","event","type","textAlign","sub","getSpouse","familyEntry","spouseReference","familySubEntry","includes","getAge","eventEntry","resolveDate","indiSubEntry","birthEvent","topolaDate","eventPlace","place","eventNotes","note","toEvent","family","flatMap","familyMarriageEvent","personLink","toFamilyEvents","toIndiEvent","Event","Description","Events","events","event1","event2","WrappedImage","imageOpen","setImageOpen","imageLoaded","setImageLoaded","imageFailed","setImageFailed","imageSrc","setImageSrc","onLoad","onError","e","currentTarget","alt","src","filename","Placeholder","Image","square","Container","fluid","Message","negative","compact","basic","closeIcon","Icon","color","onClose","onOpen","label","Label","attached","content","wrapped","EXCLUDED_TAGS","fileDetails","objectEntry","imageFileEntry","noteDetails","nameDetails","fullName","replaceAll","nameType","getDetails","tags","detailsFunction","element","hasData","getOtherDetails","dataDetails","Details","entriesWithData","Group","divided","getSelection","selection","i","generation","prepareData","cacheId","parseGedcom","json","gedcomEntriesToJson","chartData","convertGedcom","serializedData","JSON","stringify","sessionStorage","console","warn","loadFromUrl","handleCors","cachedData","driveUrlMatch1","driveUrlMatch2","urlToFetch","fetch","response","status","statusText","loadGedcom","hash","EmbeddedMessageType","UploadedDataSource","newSource","oldSource","spec","source","event_label","event_value","GedcomUrlDataSource","EmbeddedDataSource","resolve","reject","PARENT_READY","parent","postMessage","READY","GEDCOM","Promise","addEventListener","onMessage","getI18nMessage","error","AppMedia","createMedia","breakpoints","small","large","mediaStyles","createMediaStyle","Media","MediaContextProvider","GedcomLink","Contents","dateString","values","link","Intro","Card","greaterThanOrEqual","Grid","Row","Column","width","logo","at","MenuType","MenuItem","newProps","menuType","Menu","Dropdown","require","lunr","normalize","input","toLocaleLowerCase","compare","score","naturalSort","ref","LunrSearchIndex","this","self","multiLanguage","field","boost","firstName","lastName","spouseLastName","famId","husb","husbId","husband","getHusbandLastName","add","normalizedName","normalizedSpouseLastName","query","s","getNameLine","SearchBar","searchResults","setSearchResults","searchString","setSearchString","searchIndex","useRef","getDescriptionLine","death","debouncedHandleSearch","debounce","results","current","key","description","displaySearchResult","initialize","buildSearchIndex","Search","onSearchChange","_","value","onResultSelect","onSelection","noResultsMessage","placeholder","selectFirstResult","loadFileAsText","file","reader","FileReader","onload","evt","readAsText","isImageFileName","lower","UploadMenu","history","useHistory","files","filesArray","Array","gedcomFile","URL","createObjectURL","imageMap","imageFileNames","md5","state","htmlFor","accept","multiple","onChange","UrlMenu","dialogOpen","setDialogOpen","setUrl","inputRef","handleLoad","focus","Form","onSubmit","Input","secondary","ScreenSize","WikiTreeMenu","wikiTreeId","setWikiTreeId","handleSelectId","standalone","enterId","preventDefault","wikitreeLogo","style","height","wikiTreeLink","rel","example1","example2","WikiTreeLoginMenu","username","getLoggedInUserName","returnUrl","navigateToLoginPage","tooltip","TopBar","changeView","view","chartMenus","screenSize","showingChart","chartTypeItems","allowAllRelativesChart","LARGE","eventHandlers","onPrint","trigger","onDownloadPdf","onDownloadPng","onDownloadSvg","SMALL","Divider","fileMenus","showWikiTreeMenus","wikiTreeLoginMenu","inverted","position","icon","ChartColors","Ids","Sex","DEFALUT_CONFIG","COLOR_BY_GENERATION","SHOW","sex","COLOR_ARG","NO_COLOR","COLOR_BY_SEX","COLOR_ARG_INVERSE","v","k","ID_ARG","HIDE","ID_ARG_INVERSE","SEX_ARG","SEX_ARG_INVERSE","argsToConfig","getParam","ConfigPanel","Field","Checkbox","radio","tagName","checked","config","ChartType","zoomed","select","node","scale","transform","offsetX","max","clientWidth","offsetY","clientHeight","attr","scrollLeft","x","scrollTop","y","scrolled","zoomTransform","call","zoom","translateTo","loadAsDataUrl","blob","readAsDataURL","inlineImage","baseVal","dataUrl","inlineImages","svg","getElementsByTagName","all","loadImage","drawImageOnCanvas","canvas","document","createElement","ctx","getContext","oldFill","fillStyle","fillRect","drawImage","canvasToBlob","toBlob","getStrippedSvg","getElementById","cloneNode","removeAttribute","setAttribute","Number","getAttribute","querySelector","getSvgContentsWithInlinedImages","XMLSerializer","serializeToString","printChart","printWindow","top","left","contentDocument","write","close","setTimeout","contentWindow","print","parentNode","removeChild","body","appendChild","contents","Blob","saveAs","drawOnCanvas","downloadPng","downloadPdf","jspdf","default","doc","orientation","unit","addImage","save","chartColors","TopolaChartColors","getChartType","chartType","Hourglass","HourglassChart","Relatives","RelativesChart","Fancy","FancyChart","getRendererType","CircleRenderer","DetailedRenderer","ChartWrapper","chart","animating","rerenderRequired","zoomBehavior","rerenderProps","rerenderResetPosition","factor","scaleBy","initialRender","resetPosition","freezeAnimation","innerHTML","createChart","renderer","svgSelector","indiCallback","info","colors","animate","updateSvgSize","setData","chartInfo","render","startIndi","baseGeneration","zoomOutFactor","min","extent","scaleExtent","translateExtent","on","scrollTopTween","interpolateNumber","t","scrollLeftTween","dx","origin","dy","svgTransition","transition","delay","duration","tween","animationPromise","then","renderChart","Chart","chartWrapper","prevProps","usePrevious","hideIds","hideSex","WIKITREE_APP_ID","PRIVATE_ID_PREFIX","getSessionStorageItem","setSessionStorageItem","getApiOptions","appId","apiUrl","getAncestors","cacheKey","getAncestorsApi","getRelatives","keys","keysToFetch","getRelativesApi","getChildren","getSpouses","Name","concat","loadWikiTree","authcode","hostname","clientLogin","clear","everyone","firstPerson","spouseKeys","Spouses","personId","ancestors","ancestorKeys","flat","ancestorDetails","privateFathers","privateMothers","ancestorList","offset","Id","Father","Mother","privateFather","privateMother","privateAncestors","descendantGenerationLimit","toFetch","people","allSpouses","Children","c","personNames","families","spouses","idToName","fullSizePhotoUrls","getFamilyId","getSet","wife","converted","Set","convertPerson","PhotoData","path","convertPersonNames","spouse","familySpouses","Gender","child","marriage_date","marriage_location","parsedDate","parseDate","buildGedcom","spouse1","spouse2","hideId","FirstName","RealName","LastNameAtBirth","famc","BirthDate","BirthLocation","BirthDateDecade","DataStatus","parseDecade","DeathDate","DeathLocation","DeathDateDecade","Photo","getMarriedName","LastNameCurrent","nameParts","spousePersonNamePart","personNamePart","name1","name2","StringUtils","compareSimilarityPercent","married","aka","LastNameOther","dataStatus","matchedDate","decade","MONTHS","dateToGedcom","nameToGedcom","level","eventToGedcom","imageToGedcom","fullSizePhotoUrl","pop","gedcomIndis","gedcomFams","escapedId","record","indiToGedcom","famToGedcom","newSet","AppState","WikiTreeDataSource","ErrorMessage","ErrorPopup","Portal","onDismiss","getArguments","chartTypes","embedded","sourceSpec","WIKITREE","UPLOADED","GEDCOM_URL","EMBEDDED","parsedGen","isNaN","showSidePanel","messages","cs","messages_cs","de","messages_de","fr","messages_fr","it","messages_it","pl","messages_pl","ru","messages_ru","language","navigator","browser","detect","ReactDOM","component","INITIAL","setState","setSelection","setError","setShowSidePanel","setStandalone","setShowWikiTreeMenus","setChartType","showErrorPopup","setShowErrorPopup","setSourceSpec","setFreezeAnimation","setConfig","updateDisplay","newSelection","toggleDetails","shouldHideIds","shouldHideSex","uploadedDataSource","gedcomUrlDataSource","wikiTreeDataSource","embeddedDataSource","isNewData","newSourceSpec","oldSouce","loadData","updateUrl","gen","displayErrorPopup","downloadSvg","onDismissErrorPopup","LOADING","SHOWING_CHART","ERROR","LOADING_MORE","loadMoreFromWikitree","exact","updatedSelection","sidePanelTabs","menuItem","configToArgs","Loader","active","Tab","panes"],"mappings":"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","file":"static/js/main.9e687484.chunk.js","sourcesContent":["/** Sends an event to Google Analytics. */\nexport function analyticsEvent(action: string, data?: any) {\n (window as any).gtag('event', action, data);\n}\n","import {IndiInfo} from 'topola';\nimport {TopolaData} from '../util/gedcom_util';\n\n/** Supported data sources. */\nexport enum DataSourceEnum {\n UPLOADED,\n GEDCOM_URL,\n WIKITREE,\n EMBEDDED,\n}\n\n/** Source specification together with individual selection. */\nexport interface SourceSelection {\n spec: SourceSpecT;\n selection?: IndiInfo;\n}\n\n/** Interface encapsulating functions specific for a data source. */\nexport interface DataSource {\n /**\n * Returns true if the application is now loading a completely new data set\n * and the existing one should be wiped.\n */\n isNewData(\n newSource: SourceSelection,\n oldSource: SourceSelection,\n data?: TopolaData,\n ): boolean;\n /** Loads data from the data source. */\n loadData(spec: SourceSelection): Promise;\n}\n","import rehypeStringify from 'rehype-stringify';\nimport remarkParse from 'remark-parse';\nimport remarkRehype from 'remark-rehype';\nimport {Button, Header, Modal} from 'semantic-ui-react';\nimport {unified} from 'unified';\nimport {useEffect, useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nconst LAST_SEEN_VERSION_KEY = 'last_seen_version';\n\n/**\n * Returns changelog as raw HTML.\n *\n * @param maxVersions Max number of versions to include in changelog\n * @param seenVersion Last seen app version\n */\nexport async function getChangelog(maxVersions: number, seenVersion?: string) {\n const seenVersionDate = seenVersion\n ? Date.parse(seenVersion.slice(0, 10))\n : 0;\n\n const changes =\n process.env.REACT_APP_CHANGELOG?.split('##')\n .slice(1, maxVersions + 1)\n .map((notes) => {\n const date = Date.parse(notes.split('\\n')[0].trim());\n return {date, notes: '####' + notes};\n })\n .filter((release) => release.date > seenVersionDate)\n .map((release) => release.notes)\n .join('\\n') || '';\n\n const parsedChanges = await unified()\n .use(remarkParse)\n .use(remarkRehype)\n .use(rehypeStringify)\n .process(changes);\n return String(parsedChanges);\n}\n\n/** Stores in local storage the current app version as the last seen version. */\nexport function updateSeenVersion() {\n localStorage.setItem(LAST_SEEN_VERSION_KEY, process.env.REACT_APP_GIT_TIME!);\n}\n\n/**\n * Shows changelog entries if the user has seen an older version of\n * Topola Viewer and is now seeing a newer one.\n */\nexport function Changelog() {\n const [open, setOpen] = useState(false);\n const [changelog, setChangelog] = useState('');\n\n useEffect(() => {\n (async () => {\n const seenVersion = localStorage.getItem(LAST_SEEN_VERSION_KEY);\n const currentVersion = process.env.REACT_APP_GIT_TIME!;\n if (!seenVersion || seenVersion === currentVersion) {\n return;\n }\n\n const changes = await getChangelog(3, seenVersion);\n setChangelog(changes);\n setOpen(!!changes);\n updateSeenVersion();\n })();\n });\n\n return (\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n );\n}\n","/** Error class adding an error code used for i18n. */\nexport class TopolaError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly args: {[key: string]: string} = {},\n ) {\n super(message);\n }\n}\n","import {Date as TopolaDate, DateOrRange, DateRange, getDate} from 'topola';\nimport {IntlShape} from 'react-intl';\n\nconst DATE_QUALIFIERS = new Map([\n ['abt', 'about'],\n ['cal', 'calculated'],\n ['est', 'estimated'],\n]);\n\nfunction formatDate(date: TopolaDate, intl: IntlShape) {\n const hasDay = date.day !== undefined;\n const hasMonth = date.month !== undefined;\n const hasYear = date.year !== undefined;\n if (!hasDay && !hasMonth && !hasYear) {\n return date.text || '';\n }\n const dateObject = toDateObject(date);\n const translatedQualifier = formatDateQualifier(date.qualifier, intl);\n\n const formatOptions: Intl.DateTimeFormatOptions = {\n day: hasDay ? 'numeric' : undefined,\n month: hasMonth ? 'long' : undefined,\n year: hasYear ? 'numeric' : undefined,\n };\n const translatedDate = new Intl.DateTimeFormat(\n intl.locale,\n formatOptions,\n ).format(dateObject);\n\n return [translatedQualifier, translatedDate].join(' ');\n}\n\nfunction formatDateRage(dateRange: DateRange, intl: IntlShape) {\n const fromDate = dateRange.from;\n const toDate = dateRange.to;\n const translatedFromDate = fromDate && formatDate(fromDate, intl);\n const translatedToDate = toDate && formatDate(toDate, intl);\n if (translatedFromDate && translatedToDate) {\n return intl.formatMessage(\n {\n id: 'date.between',\n defaultMessage: 'between {from} and {to}',\n },\n {from: translatedFromDate, to: translatedToDate},\n );\n }\n if (translatedFromDate) {\n return intl.formatMessage(\n {\n id: 'date.after',\n defaultMessage: 'after {from}',\n },\n {from: translatedFromDate},\n );\n }\n if (translatedToDate) {\n return intl.formatMessage(\n {\n id: 'date.before',\n defaultMessage: 'before {to}',\n },\n {to: translatedToDate},\n );\n }\n return '';\n}\n\nexport function formatDateQualifier(\n qualifier: string | undefined,\n intl: IntlShape,\n): string {\n const lowerCaseQualifier = qualifier && qualifier.toLowerCase();\n return (\n (lowerCaseQualifier &&\n intl.formatMessage({\n id: `date.${lowerCaseQualifier}`,\n defaultMessage:\n DATE_QUALIFIERS.get(lowerCaseQualifier) || lowerCaseQualifier,\n })) ||\n ''\n );\n}\n\n/** Formats a DateOrRange object. */\nexport function formatDateOrRange(\n dateOrRange: DateOrRange | undefined,\n intl: IntlShape,\n): string {\n if (!dateOrRange) {\n return '';\n }\n if (dateOrRange.date) {\n return formatDate(dateOrRange.date, intl);\n }\n if (dateOrRange.dateRange) {\n return formatDateRage(dateOrRange.dateRange, intl);\n }\n return '';\n}\n\n/** Formats a date given in GEDCOM format. */\nexport function translateDate(gedcomDate: string, intl: IntlShape): string {\n return formatDateOrRange(getDate(gedcomDate), intl);\n}\n\nexport function compareTopolaDates(\n date1: TopolaDate | undefined,\n date2: TopolaDate | undefined,\n): number {\n if (!date1 || !date1.year || !date2 || !date2.year) {\n return 0;\n }\n if (date1.year !== date2.year) {\n return date1.year - date2.year;\n }\n if (!date1.month || !date2.month) {\n return 0;\n }\n if (date1.month !== date2.month) {\n return date1.month - date2.month;\n }\n if (date1.day && date2.day && date1.day !== date2.day) {\n return date1.month - date2.month;\n }\n return 0;\n}\n\n/** Compares a dates given in GEDCOM format. */\nexport function compareDates(\n firstDateOrRange: DateOrRange | undefined,\n secondDateOrRange: DateOrRange | undefined,\n): number {\n const date1 =\n firstDateOrRange &&\n (firstDateOrRange.date ||\n (firstDateOrRange.dateRange &&\n (firstDateOrRange.dateRange.from || firstDateOrRange.dateRange.to)));\n const date2 =\n secondDateOrRange &&\n (secondDateOrRange.date ||\n (secondDateOrRange.dateRange &&\n (secondDateOrRange.dateRange.from || secondDateOrRange.dateRange.to)));\n return compareTopolaDates(date1, date2);\n}\n\nexport function areDateRangesOverlapped(\n range1: DateRange,\n range2: DateRange,\n): boolean {\n return (\n compareTopolaDates(range1.from, range2.to) <= 0 &&\n compareTopolaDates(range1.to, range2.from) >= 0\n );\n}\n\nexport function isValidDateOrRange(\n dateOrRange: DateOrRange | undefined,\n): boolean {\n // invalid when range is closed and start is before end\n if (isDateRangeClosed(dateOrRange?.dateRange)) {\n return (\n compareTopolaDates(\n dateOrRange?.dateRange?.from,\n dateOrRange?.dateRange?.to,\n ) <= 0\n );\n }\n //valid when there is exact date or date range has start or end defined\n return !!(\n dateOrRange?.date ||\n dateOrRange?.dateRange?.from ||\n dateOrRange?.dateRange?.to\n );\n}\n\nexport function isDateRangeClosed(range: DateRange | undefined): boolean {\n return !!(range?.from && range?.to);\n}\n\nexport function toDateObject(date: TopolaDate): Date {\n return new Date(\n date.year !== undefined ? date.year! : 0,\n date.month !== undefined ? date.month! - 1 : 0,\n date.day !== undefined ? date.day! : 1,\n );\n}\n","import {GedcomEntry, parse as parseGedcom} from 'parse-gedcom';\nimport {TopolaError} from './error';\nimport {\n gedcomEntriesToJson,\n JsonFam,\n JsonGedcomData,\n JsonImage,\n JsonIndi,\n} from 'topola';\nimport {compareDates} from './date_util';\n\nexport interface GedcomData {\n /** The HEAD entry. */\n head: GedcomEntry;\n /** INDI entries mapped by id. */\n indis: {[key: string]: GedcomEntry};\n /** FAM entries mapped by id. */\n fams: {[key: string]: GedcomEntry};\n /** Other entries mapped by id, e.g. NOTE, SOUR. */\n other: {[key: string]: GedcomEntry};\n}\n\nexport interface TopolaData {\n chartData: JsonGedcomData;\n gedcom: GedcomData;\n}\n\n/**\n * Returns the identifier extracted from a pointer string.\n * E.g. '@I123@' -> 'I123'\n */\nexport function pointerToId(pointer: string): string {\n return pointer.substring(1, pointer.length - 1);\n}\n\nexport function idToIndiMap(data: JsonGedcomData): Map {\n const map = new Map();\n data.indis.forEach((indi) => {\n map.set(indi.id, indi);\n });\n return map;\n}\n\nexport function idToFamMap(data: JsonGedcomData): Map {\n const map = new Map();\n data.fams.forEach((fam) => {\n map.set(fam.id, fam);\n });\n return map;\n}\n\nfunction prepareGedcom(entries: GedcomEntry[]): GedcomData {\n const head = entries.find((entry) => entry.tag === 'HEAD')!;\n const indis: {[key: string]: GedcomEntry} = {};\n const fams: {[key: string]: GedcomEntry} = {};\n const other: {[key: string]: GedcomEntry} = {};\n entries.forEach((entry) => {\n if (entry.tag === 'INDI') {\n indis[pointerToId(entry.pointer)] = entry;\n } else if (entry.tag === 'FAM') {\n fams[pointerToId(entry.pointer)] = entry;\n } else if (entry.pointer) {\n other[pointerToId(entry.pointer)] = entry;\n }\n });\n return {head, indis, fams, other};\n}\n\nfunction strcmp(a: string, b: string) {\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n return 0;\n}\n\n/** Birth date comparator for individuals. */\nfunction birthDatesComparator(gedcom: JsonGedcomData) {\n const indiMap = idToIndiMap(gedcom);\n\n return (indiId1: string, indiId2: string) => {\n const indi1: JsonIndi | undefined = indiMap.get(indiId1);\n const indi2: JsonIndi | undefined = indiMap.get(indiId2);\n return (\n compareDates(indi1 && indi1.birth, indi2 && indi2.birth) ||\n strcmp(indiId1, indiId2)\n );\n };\n}\n\n/** Marriage date comparator for families. */\nfunction marriageDatesComparator(gedcom: JsonGedcomData) {\n const famMap = idToFamMap(gedcom);\n\n return (famId1: string, famId2: string) => {\n const fam1: JsonFam | undefined = famMap.get(famId1);\n const fam2: JsonFam | undefined = famMap.get(famId2);\n return (\n compareDates(fam1 && fam1.marriage, fam2 && fam2.marriage) ||\n strcmp(famId1, famId2)\n );\n };\n}\n\n/**\n * Sorts children by birth date in the given family.\n * Does not modify the input objects.\n */\nfunction sortFamilyChildren(\n fam: JsonFam,\n comparator: (id1: string, id2: string) => number,\n): JsonFam {\n if (!fam.children) {\n return fam;\n }\n const newChildren = fam.children.sort(comparator);\n return Object.assign({}, fam, {children: newChildren});\n}\n\n/**\n * Sorts children by birth date.\n * Does not modify the input object.\n */\nfunction sortChildren(gedcom: JsonGedcomData): JsonGedcomData {\n const comparator = birthDatesComparator(gedcom);\n const newFams = gedcom.fams.map((fam) => sortFamilyChildren(fam, comparator));\n return Object.assign({}, gedcom, {fams: newFams});\n}\n\n/**\n * Sorts spouses by marriage date.\n * Does not modify the input objects.\n */\nfunction sortIndiSpouses(\n indi: JsonIndi,\n comparator: (id1: string, id2: string) => number,\n): JsonFam {\n if (!indi.fams) {\n return indi;\n }\n const newFams = indi.fams.sort(comparator);\n return Object.assign({}, indi, {fams: newFams});\n}\n\nfunction sortSpouses(gedcom: JsonGedcomData): JsonGedcomData {\n const comparator = marriageDatesComparator(gedcom);\n const newIndis = gedcom.indis.map((indi) =>\n sortIndiSpouses(indi, comparator),\n );\n return Object.assign({}, gedcom, {indis: newIndis});\n}\n\n/**\n * If the entry is a reference to a top-level entry, the referenced entry is\n * returned. Otherwise, returns the given entry unmodified.\n */\nexport function dereference(\n entry: GedcomEntry,\n gedcom: GedcomData,\n getterFunction: (gedcom: GedcomData) => {[key: string]: GedcomEntry},\n) {\n if (entry.data) {\n const dereferenced = getterFunction(gedcom)[pointerToId(entry.data)];\n if (dereferenced) {\n return dereferenced;\n }\n }\n return entry;\n}\n\n/**\n * Returns the data for the given GEDCOM entry as an array of lines. Supports\n * continuations with CONT and CONC.\n */\nexport function getData(entry: GedcomEntry) {\n const result = [entry.data];\n entry.tree.forEach((subentry) => {\n if (subentry.tag === 'CONC' && subentry.data) {\n const last = result.length - 1;\n result[last] += subentry.data;\n } else if (subentry.tag === 'CONT' && subentry.data) {\n result.push(subentry.data);\n }\n });\n return result;\n}\n\n/** Sorts children and spouses. */\nexport function normalizeGedcom(gedcom: JsonGedcomData): JsonGedcomData {\n return sortSpouses(sortChildren(gedcom));\n}\n\nconst IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif'];\n\n/** Returns true if the given file name has a known image extension. */\nexport function isImageFile(fileName: string): boolean {\n const lowerName = fileName.toLowerCase();\n return IMAGE_EXTENSIONS.some((ext) => lowerName.endsWith(ext));\n}\n\n/**\n * Removes images that are not HTTP links or do not have known image extensions.\n * Does not modify the input object.\n */\nfunction filterImage(indi: JsonIndi, images: Map): JsonIndi {\n if (!indi.images || indi.images.length === 0) {\n return indi;\n }\n const newImages: JsonImage[] = [];\n indi.images.forEach((image) => {\n const fileName = image.url.match(/[^/\\\\]*$/)![0];\n // If the image file has been loaded into memory, use it.\n if (images.has(fileName)) {\n newImages.push({url: images.get(fileName)!, title: image.title});\n } else if (image.url.startsWith('http') && isImageFile(image.url)) {\n newImages.push(image);\n }\n });\n return Object.assign({}, indi, {images: newImages});\n}\n\n/**\n * Removes images that are not HTTP links.\n * Does not modify the input object.\n */\nfunction filterImages(\n gedcom: JsonGedcomData,\n images: Map,\n): JsonGedcomData {\n const newIndis = gedcom.indis.map((indi) => filterImage(indi, images));\n return Object.assign({}, gedcom, {indis: newIndis});\n}\n\n/**\n * Converts GEDCOM file into JSON data performing additional transformations:\n * - sort children by birth date\n * - remove images that are not HTTP links and aren't mapped in `images`.\n *\n * @param images Map from file name to image URL. This is used to pass in\n * uploaded images.\n */\nexport function convertGedcom(\n gedcom: string,\n images: Map,\n): TopolaData {\n const entries = parseGedcom(gedcom);\n const json = gedcomEntriesToJson(entries);\n if (\n !json ||\n !json.indis ||\n !json.indis.length ||\n !json.fams ||\n !json.fams.length\n ) {\n throw new TopolaError('GEDCOM_READ_FAILED', 'Failed to read GEDCOM file');\n }\n\n return {\n chartData: filterImages(normalizeGedcom(json), images),\n gedcom: prepareGedcom(entries),\n };\n}\n\nexport function getSoftware(head: GedcomEntry): string | null {\n const sour =\n head && head.tree && head.tree.find((entry) => entry.tag === 'SOUR');\n const name =\n sour && sour.tree && sour.tree.find((entry) => entry.tag === 'NAME');\n return (name && name.data) || null;\n}\n\nexport function getName(person: GedcomEntry): string | undefined {\n const names = person.tree.filter((subEntry) => subEntry.tag === 'NAME');\n const notMarriedName = names.find(\n (subEntry) =>\n subEntry.tree.filter(\n (nameEntry) => nameEntry.tag === 'TYPE' && nameEntry.data === 'married',\n ).length === 0,\n );\n const name = notMarriedName || names[0];\n return name?.data.replace(/\\//g, '');\n}\n\nexport function getFileName(fileEntry: GedcomEntry): string | undefined {\n const fileTitle = fileEntry?.tree.find((entry) => entry.tag === 'TITL')?.data;\n\n const fileExtension = fileEntry?.tree.find((entry) => entry.tag === 'FORM')\n ?.data;\n\n return fileTitle && fileExtension && fileTitle + '.' + fileExtension;\n}\n","import {Date as TopolaDate} from 'topola/dist/data';\nimport {IntlShape} from 'react-intl';\nimport {DateOrRange, getDate} from 'topola';\nimport {\n areDateRangesOverlapped,\n compareDates,\n formatDateQualifier,\n isDateRangeClosed,\n isValidDateOrRange,\n toDateObject,\n} from './date_util';\n\nfunction formatExactAge(\n birthDate: TopolaDate,\n deathDate: TopolaDate,\n intl: IntlShape,\n): string {\n const ageInYears = calcDateDifferenceInYears(birthDate, deathDate);\n const qualifier = birthDate.qualifier || deathDate.qualifier;\n const translatedQualifier =\n qualifier && formatDateQualifier(qualifier, intl) + ' ';\n\n return intl.formatMessage(\n {\n id: 'age.exact',\n defaultMessage:\n '{qualifier}{age, plural, =0 {Less than 1 year} one {1 year} other {# years}}',\n },\n {age: ageInYears, qualifier: translatedQualifier},\n );\n}\n\nfunction formatAgeMoreThan(\n birthDate: TopolaDate,\n deathDate: TopolaDate,\n intl: IntlShape,\n): string {\n const ageInYears = calcDateDifferenceInYears(birthDate, deathDate);\n return intl.formatMessage(\n {\n id: 'age.more',\n defaultMessage:\n 'More than {age, plural, =0 {0 years} one {1 year} other {# years}}',\n },\n {age: ageInYears},\n );\n}\n\nfunction formatAgeLessThan(\n birthDate: TopolaDate,\n deathDate: TopolaDate,\n intl: IntlShape,\n): string {\n const ageInYears = calcDateDifferenceInYears(birthDate, deathDate);\n return intl.formatMessage(\n {\n id: 'age.less',\n defaultMessage:\n 'Less than {age, plural, =0 {1 year} one {1 year} other {# years}}',\n },\n {age: ageInYears},\n );\n}\n\nfunction formatAgeBetween(\n birthDateFrom: TopolaDate,\n birthDateTo: TopolaDate,\n deathDateFrom: TopolaDate,\n deathDateTo: TopolaDate,\n intl: IntlShape,\n): string {\n const ageInYearsFrom = calcDateDifferenceInYears(birthDateTo, deathDateFrom);\n const ageInYearsTo = calcDateDifferenceInYears(birthDateFrom, deathDateTo);\n return intl.formatMessage(\n {\n id: 'age.between',\n defaultMessage:\n 'Between {ageFrom} and {ageTo, plural, =0 {0 years} one {1 year} other {# years}}',\n },\n {ageFrom: ageInYearsFrom, ageTo: ageInYearsTo},\n );\n}\n\nfunction canCalculateAge(\n birthDate: DateOrRange | undefined,\n deathDate: DateOrRange | undefined,\n): boolean {\n if (birthDate && deathDate) {\n // cannot calculate if there is no valid birth or death date\n if (!isValidDateOrRange(birthDate) || !isValidDateOrRange(deathDate)) {\n return false;\n }\n //cannot calculate if death date is before birth date\n if (compareDates(birthDate, deathDate) > 0) {\n return false;\n }\n // cannot calculate if closed date range for birth or death are overlapping\n if (\n birthDate.dateRange &&\n deathDate.dateRange &&\n isDateRangeClosed(birthDate?.dateRange) &&\n isDateRangeClosed(deathDate?.dateRange)\n ) {\n return !areDateRangesOverlapped(birthDate.dateRange, deathDate.dateRange);\n }\n return true;\n }\n return false;\n}\n\nfunction calcDateDifferenceInYears(\n firstDate: TopolaDate,\n secondDate: TopolaDate,\n): number {\n const firstDateObject = toDateObject(firstDate);\n const secondDateObject = toDateObject(secondDate);\n\n const startYear = firstDateObject.getUTCFullYear();\n\n let yearDiff = secondDateObject.getUTCFullYear() - startYear;\n let monthDiff =\n secondDateObject.getUTCMonth() - firstDateObject.getUTCMonth();\n if (monthDiff < 0) {\n yearDiff--;\n monthDiff += 12;\n }\n const dayDiff = secondDateObject.getUTCDate() - firstDateObject.getUTCDate();\n if (dayDiff < 0) {\n if (monthDiff <= 0) {\n yearDiff--;\n }\n }\n return Math.abs(yearDiff);\n}\n\nexport function calcAge(\n birthGedcomDate: string | undefined,\n deathGedcomDate: string | undefined,\n intl: IntlShape,\n): string | undefined {\n if (birthGedcomDate && deathGedcomDate) {\n const birthDateOrRange = getDate(birthGedcomDate);\n const deathDateOrRange = getDate(deathGedcomDate);\n if (canCalculateAge(birthDateOrRange, deathDateOrRange)) {\n if (birthDateOrRange?.date) {\n if (deathDateOrRange?.date) {\n return formatExactAge(\n birthDateOrRange.date,\n deathDateOrRange.date,\n intl,\n );\n }\n if (\n deathDateOrRange?.dateRange?.from &&\n deathDateOrRange.dateRange?.to\n ) {\n return formatAgeBetween(\n birthDateOrRange.date,\n birthDateOrRange.date,\n deathDateOrRange?.dateRange?.from,\n deathDateOrRange?.dateRange?.to,\n intl,\n );\n }\n if (deathDateOrRange?.dateRange?.from) {\n return formatAgeMoreThan(\n birthDateOrRange.date,\n deathDateOrRange.dateRange?.from,\n intl,\n );\n }\n if (deathDateOrRange?.dateRange?.to) {\n return formatAgeLessThan(\n birthDateOrRange.date,\n deathDateOrRange.dateRange?.to,\n intl,\n );\n }\n }\n if (\n birthDateOrRange?.dateRange?.from &&\n birthDateOrRange?.dateRange?.to\n ) {\n if (deathDateOrRange?.date) {\n return formatAgeBetween(\n birthDateOrRange?.dateRange?.from,\n birthDateOrRange?.dateRange?.to,\n deathDateOrRange?.date,\n deathDateOrRange?.date,\n intl,\n );\n }\n if (\n deathDateOrRange?.dateRange?.from &&\n deathDateOrRange.dateRange?.to\n ) {\n return formatAgeBetween(\n birthDateOrRange?.dateRange?.from,\n birthDateOrRange?.dateRange?.to,\n deathDateOrRange?.dateRange?.from,\n deathDateOrRange?.dateRange?.to,\n intl,\n );\n }\n if (deathDateOrRange?.dateRange?.from) {\n return formatAgeMoreThan(\n birthDateOrRange.dateRange?.to,\n deathDateOrRange.dateRange?.from,\n intl,\n );\n }\n if (deathDateOrRange?.dateRange?.to) {\n return formatAgeLessThan(\n birthDateOrRange.dateRange?.from,\n deathDateOrRange.dateRange?.to,\n intl,\n );\n }\n }\n if (birthDateOrRange?.dateRange?.from) {\n if (deathDateOrRange?.date) {\n return formatAgeLessThan(\n birthDateOrRange.dateRange?.from,\n deathDateOrRange.date,\n intl,\n );\n }\n if (deathDateOrRange?.dateRange?.to) {\n return formatAgeLessThan(\n birthDateOrRange.dateRange?.from,\n deathDateOrRange.dateRange?.to,\n intl,\n );\n }\n }\n if (birthDateOrRange?.dateRange?.to) {\n if (deathDateOrRange?.date) {\n return formatAgeMoreThan(\n birthDateOrRange?.dateRange?.to,\n deathDateOrRange.date,\n intl,\n );\n }\n if (deathDateOrRange?.dateRange?.from) {\n return formatAgeMoreThan(\n birthDateOrRange?.dateRange?.to,\n deathDateOrRange.dateRange?.from,\n intl,\n );\n }\n }\n }\n }\n}\n","import Linkify from 'react-linkify';\n\ninterface Props {\n lines: (JSX.Element | string)[];\n}\n\nexport function MultilineText(props: Props) {\n return (\n <>\n {props.lines.map((line, index) => (\n
\n {line}\n
\n
\n ))}\n \n );\n}\n","import {FormattedMessage} from 'react-intl';\n\nconst TAG_DESCRIPTIONS = new Map([\n ['ADOP', 'Adoption'],\n ['BAPM', 'Baptism'],\n ['BIRT', 'Birth'],\n ['BURI', 'Burial'],\n ['CENS', 'Census'],\n ['CHR', 'Christening'],\n ['CREM', 'Cremation'],\n ['DEAT', 'Death'],\n ['EDUC', 'Education'],\n ['EMAIL', 'E-mail'],\n ['EMIG', 'Emigration'],\n ['EVEN', 'Event'],\n ['FACT', 'Fact'],\n ['IMMI', 'Immigration'],\n ['MARR', 'Marriage'],\n ['DIV', 'Divorce'],\n ['MILT', 'Military services'],\n ['NATU', 'Naturalization'],\n ['OCCU', 'Occupation'],\n ['TITL', 'Title'],\n ['WWW', 'WWW'],\n ['birth', 'Birth name'],\n ['married', 'Married name'],\n ['maiden', 'Maiden name'],\n ['immigrant', 'Immigrant name'],\n ['aka', 'Also known as'],\n]);\n\ninterface Props {\n tag: string;\n}\n\nexport function TranslatedTag(props: Props) {\n const normalizedTag = props.tag.replace(/_/g, '');\n return (\n \n );\n}\n","import * as queryString from 'query-string';\nimport flatMap from 'array.prototype.flatmap';\nimport {calcAge} from '../util/age_util';\nimport {compareDates, formatDateOrRange} from '../util/date_util';\nimport {DateOrRange, getDate} from 'topola';\nimport {dereference, GedcomData, getData, getName} from '../util/gedcom_util';\nimport {GedcomEntry} from 'parse-gedcom';\nimport {FormattedMessage, IntlShape, useIntl} from 'react-intl';\nimport {Link, useLocation} from 'react-router-dom';\nimport {MultilineText} from './multiline-text';\nimport {pointerToId} from '../util/gedcom_util';\nimport {TranslatedTag} from './translated-tag';\nimport {Header, Item} from 'semantic-ui-react';\n\nfunction PersonLink(props: {person: GedcomEntry}) {\n const location = useLocation();\n\n const name = getName(props.person);\n\n const search = queryString.parse(location.search);\n search['indi'] = pointerToId(props.person.pointer);\n\n return (\n \n \n {name ? (\n name\n ) : (\n \n )}\n \n \n );\n}\n\ninterface Props {\n gedcom: GedcomData;\n indi: string;\n entries: GedcomEntry[];\n}\n\ninterface EventData {\n type: string;\n date?: DateOrRange;\n age?: string;\n personLink?: GedcomEntry;\n place?: string[];\n notes: string[][];\n}\n\nconst EVENT_TAGS = [\n 'BIRT',\n 'BAPM',\n 'CHR',\n 'FAMS',\n 'EVEN',\n 'CENS',\n 'DEAT',\n 'BURI',\n];\n\nconst FAMILY_EVENT_TAGS = ['MARR', 'DIV'];\n\nfunction EventHeader(props: {event: EventData}) {\n const intl = useIntl();\n return (\n
\n
\n \n
\n {props.event.date ? (\n
\n {formatDateOrRange(props.event.date, intl)}\n
\n ) : null}\n
\n );\n}\n\nfunction getSpouse(indi: string, familyEntry: GedcomEntry, gedcom: GedcomData) {\n const spouseReference = familyEntry.tree\n .filter((familySubEntry) => ['WIFE', 'HUSB'].includes(familySubEntry.tag))\n .find((familySubEntry) => !familySubEntry.data.includes(indi));\n\n if (!spouseReference) {\n return undefined;\n }\n return dereference(spouseReference, gedcom, (gedcom) => gedcom.indis);\n}\n\nfunction getAge(\n eventEntry: GedcomEntry,\n indi: string,\n gedcom: GedcomData,\n intl: IntlShape,\n): string | undefined {\n if (eventEntry.tag !== 'DEAT') {\n return undefined;\n }\n const deathDate = resolveDate(eventEntry);\n\n const birthDate = gedcom.indis[indi].tree\n .filter((indiSubEntry) => indiSubEntry.tag === 'BIRT')\n .map((birthEvent) => resolveDate(birthEvent))\n .find((topolaDate) => topolaDate);\n\n if (!birthDate || !deathDate) {\n return undefined;\n }\n return calcAge(birthDate?.data, deathDate?.data, intl);\n}\n\nfunction eventPlace(entry: GedcomEntry) {\n const place = entry.tree.find((subEntry) => subEntry.tag === 'PLAC');\n return place?.data ? getData(place) : undefined;\n}\n\nfunction eventNotes(entry: GedcomEntry, gedcom: GedcomData): string[][] {\n return entry.tree\n .filter((subentry) => ['NOTE', 'TYPE'].includes(subentry.tag))\n .map((note) => dereference(note, gedcom, (gedcom) => gedcom.other))\n .map((note) => getData(note));\n}\n\nfunction toEvent(\n entry: GedcomEntry,\n gedcom: GedcomData,\n indi: string,\n intl: IntlShape,\n): EventData[] {\n if (entry.tag === 'FAMS') {\n return toFamilyEvents(entry, gedcom, indi);\n }\n return toIndiEvent(entry, gedcom, indi, intl);\n}\n\nfunction toIndiEvent(\n entry: GedcomEntry,\n gedcom: GedcomData,\n indi: string,\n intl: IntlShape,\n): EventData[] {\n const date = resolveDate(entry) || null;\n return [\n {\n date: date ? getDate(date.data) : undefined,\n type: entry.tag,\n age: getAge(entry, indi, gedcom, intl),\n place: eventPlace(entry),\n notes: eventNotes(entry, gedcom),\n },\n ];\n}\n\nfunction resolveDate(entry: GedcomEntry) {\n return entry.tree.find((subEntry) => subEntry.tag === 'DATE');\n}\n\nfunction toFamilyEvents(\n entry: GedcomEntry,\n gedcom: GedcomData,\n indi: string,\n): EventData[] {\n const family = dereference(entry, gedcom, (gedcom) => gedcom.fams);\n return flatMap(FAMILY_EVENT_TAGS, (tag) =>\n family.tree.filter((entry) => entry.tag === tag),\n ).map((familyMarriageEvent) => {\n const date = resolveDate(familyMarriageEvent) || null;\n return {\n date: date ? getDate(date.data) : undefined,\n type: familyMarriageEvent.tag,\n personLink: getSpouse(indi, family, gedcom),\n place: eventPlace(familyMarriageEvent),\n notes: eventNotes(familyMarriageEvent, gedcom),\n };\n });\n}\n\nfunction Event(props: {event: EventData}) {\n return (\n \n \n \n {!!props.event.age && {props.event.age}}\n {!!props.event.personLink && (\n \n )}\n {!!props.event.place && (\n {props.event.place}\n )}\n {!!props.event.notes.length && (\n \n {props.event.notes.map((note, index) => (\n
\n (\n {line}\n ))}\n />\n
\n ))}\n
\n )}\n
\n
\n );\n}\n\nexport function Events(props: Props) {\n const intl = useIntl();\n\n const events = flatMap(EVENT_TAGS, (tag) =>\n props.entries\n .filter((entry) => entry.tag === tag)\n .map((eventEntry) => toEvent(eventEntry, props.gedcom, props.indi, intl))\n .flatMap((events) => events)\n .sort((event1, event2) => compareDates(event1.date, event2.date)),\n );\n if (events.length) {\n return (\n <>\n {events.map((event, index) => (\n \n ))}\n \n );\n }\n return null;\n}\n","import {\n Container,\n Icon,\n Image,\n Label,\n Message,\n Modal,\n Placeholder,\n} from 'semantic-ui-react';\nimport {SyntheticEvent, useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\ninterface Props {\n url: string;\n filename: string;\n title?: string;\n}\n\nexport function WrappedImage(props: Props) {\n const [imageOpen, setImageOpen] = useState(false);\n const [imageLoaded, setImageLoaded] = useState(false);\n const [imageFailed, setImageFailed] = useState(false);\n const [imageSrc, setImageSrc] = useState('');\n\n if (imageLoaded && imageSrc !== props.url) {\n setImageLoaded(false);\n }\n return (\n <>\n setImageOpen(true)}\n onLoad={() => {\n setImageLoaded(true);\n setImageSrc(props.url);\n setImageFailed(false);\n }}\n onError={(e: SyntheticEvent) => {\n setImageLoaded(true);\n setImageSrc(props.url);\n setImageFailed(true);\n e.currentTarget.alt = '';\n }}\n src={props.url}\n alt={props.title || props.filename}\n centered={true}\n />\n \n \n \n {imageFailed && (\n \n \n \n \n \n \n \n )}\n }\n open={imageOpen}\n onClose={() => setImageOpen(false)}\n onOpen={() => setImageOpen(true)}\n centered={false}\n >\n {props.title}\n \n }\n wrapped\n />\n \n \n \n );\n}\n","import flatMap from 'array.prototype.flatmap';\nimport {\n dereference,\n GedcomData,\n getData,\n getFileName,\n isImageFile,\n} from '../util/gedcom_util';\nimport {Events} from './events';\nimport {GedcomEntry} from 'parse-gedcom';\nimport {MultilineText} from './multiline-text';\nimport {TranslatedTag} from './translated-tag';\nimport {Header, Item} from 'semantic-ui-react';\nimport {FormattedMessage} from 'react-intl';\nimport {WrappedImage} from './wrapped-image';\n\nconst EXCLUDED_TAGS = [\n 'BIRT',\n 'BAPM',\n 'CHR',\n 'EVEN',\n 'CENS',\n 'DEAT',\n 'BURI',\n 'NAME',\n 'SEX',\n 'FAMC',\n 'FAMS',\n 'NOTE',\n 'SOUR',\n];\n\nfunction dataDetails(entry: GedcomEntry) {\n const lines = [];\n if (entry.data) {\n lines.push(...getData(entry));\n }\n entry.tree\n .filter((subentry) => subentry.tag === 'NOTE')\n .forEach((note) =>\n getData(note).forEach((line) => lines.push({line})),\n );\n if (!lines.length) {\n return null;\n }\n return (\n <>\n
\n \n
\n \n \n \n \n );\n}\n\nfunction fileDetails(objectEntry: GedcomEntry) {\n const imageFileEntry = objectEntry.tree.find(\n (entry) =>\n entry.tag === 'FILE' &&\n entry.data.startsWith('http') &&\n isImageFile(entry.data),\n );\n\n return imageFileEntry ? (\n
\n \n
\n ) : null;\n}\n\nfunction noteDetails(entry: GedcomEntry) {\n return (\n (\n {line}\n ))}\n />\n );\n}\n\nfunction nameDetails(entry: GedcomEntry) {\n const fullName = entry.data.replaceAll('/', '');\n\n const nameType = entry.tree.find(\n (entry) => entry.tag === 'TYPE' && entry.data !== 'Unknown',\n )?.data;\n\n return (\n <>\n
\n {fullName ? (\n fullName\n ) : (\n \n )}\n
\n {fullName && nameType && (\n \n \n \n )}\n \n );\n}\n\nfunction getDetails(\n entries: GedcomEntry[],\n tags: string[],\n detailsFunction: (entry: GedcomEntry) => JSX.Element | null,\n): JSX.Element[] {\n return flatMap(tags, (tag) =>\n entries\n .filter((entry) => entry.tag === tag)\n .map((entry) => detailsFunction(entry)),\n )\n .filter((element) => element !== null)\n .map((element, index) => (\n \n {element}\n \n ));\n}\n\n/**\n * Returns true if there is displayable information in this entry.\n * Returns false if there is no data in this entry or this is only a reference\n * to another entry.\n */\nfunction hasData(entry: GedcomEntry) {\n return entry.tree.length > 0 || (entry.data && !entry.data.startsWith('@'));\n}\n\nfunction getOtherDetails(entries: GedcomEntry[]) {\n return entries\n .filter((entry) => !EXCLUDED_TAGS.includes(entry.tag))\n .filter(hasData)\n .map((entry) => dataDetails(entry))\n .filter((element) => element !== null)\n .map((element, index) => (\n \n {element}\n \n ));\n}\n\ninterface Props {\n gedcom: GedcomData;\n indi: string;\n}\n\nexport function Details(props: Props) {\n const entries = props.gedcom.indis[props.indi].tree;\n const entriesWithData = entries\n .map((entry) => dereference(entry, props.gedcom, (gedcom) => gedcom.other))\n .filter(hasData);\n\n return (\n
\n \n {getDetails(entries, ['NAME'], nameDetails)}\n {getDetails(entriesWithData, ['OBJE'], fileDetails)}\n \n {getOtherDetails(entriesWithData)}\n {getDetails(entriesWithData, ['NOTE'], noteDetails)}\n \n
\n );\n}\n","import {analyticsEvent} from '../util/analytics';\nimport {convertGedcom, getSoftware, TopolaData} from '../util/gedcom_util';\nimport {DataSource, DataSourceEnum, SourceSelection} from './data_source';\nimport {IndiInfo, JsonGedcomData} from 'topola';\nimport {TopolaError} from '../util/error';\n\n/**\n * Returns a valid IndiInfo object, either with the given indi and generation\n * or with an individual taken from the data and generation 0.\n */\nexport function getSelection(\n data: JsonGedcomData,\n selection?: IndiInfo,\n): IndiInfo {\n // If ID is not given or it doesn't exist in the data, use the first ID in\n // the data.\n const id =\n selection && data.indis.some((i) => i.id === selection.id)\n ? selection.id\n : data.indis[0].id;\n return {id, generation: selection?.generation || 0};\n}\n\nfunction prepareData(\n gedcom: string,\n cacheId: string,\n images?: Map,\n): TopolaData {\n const data = convertGedcom(gedcom, images || new Map());\n const serializedData = JSON.stringify(data);\n try {\n sessionStorage.setItem(cacheId, serializedData);\n } catch (e) {\n console.warn('Failed to store data in session storage: ' + e);\n }\n return data;\n}\n\n/** Fetches data from the given URL. Uses cors-anywhere if handleCors is true. */\nexport async function loadFromUrl(\n url: string,\n handleCors: boolean,\n): Promise {\n try {\n const cachedData = sessionStorage.getItem(url);\n if (cachedData) {\n return JSON.parse(cachedData);\n }\n } catch (e) {\n console.warn('Failed to load data from session storage: ' + e);\n }\n\n const driveUrlMatch1 = url.match(\n /https:\\/\\/drive\\.google\\.com\\/file\\/d\\/(.*)\\/.*/,\n );\n if (driveUrlMatch1) {\n url = `https://drive.google.com/uc?id=${driveUrlMatch1[1]}&export=download`;\n }\n const driveUrlMatch2 = url.match(\n /https:\\/\\/drive\\.google\\.com\\/open\\?id=([^&]*)&?.*/,\n );\n if (driveUrlMatch2) {\n url = `https://drive.google.com/uc?id=${driveUrlMatch2[1]}&export=download`;\n }\n\n const urlToFetch = handleCors\n ? 'https://topola-cors-server.up.railway.app/' + url\n : url;\n\n const response = await window.fetch(urlToFetch);\n if (response.status !== 200) {\n throw new Error(response.statusText);\n }\n const gedcom = await response.text();\n return prepareData(gedcom, url);\n}\n\n/** Loads data from the given GEDCOM file contents. */\nexport async function loadGedcom(\n hash: string,\n gedcom?: string,\n images?: Map,\n): Promise {\n try {\n const cachedData = sessionStorage.getItem(hash);\n if (cachedData) {\n return JSON.parse(cachedData);\n }\n } catch (e) {\n console.warn('Failed to load data from session storage: ' + e);\n }\n if (!gedcom) {\n throw new TopolaError(\n 'ERROR_LOADING_UPLOADED_FILE',\n 'Error loading data. Please upload your file again.',\n );\n }\n return prepareData(gedcom, hash, images);\n}\n\nexport interface UploadSourceSpec {\n source: DataSourceEnum.UPLOADED;\n gedcom?: string;\n /** Hash of the GEDCOM contents. */\n hash: string;\n images?: Map;\n}\n\n/** Files opened from the local computer. */\nexport class UploadedDataSource implements DataSource {\n // isNewData(args: Arguments, state: State): boolean {\n isNewData(\n newSource: SourceSelection,\n oldSource: SourceSelection,\n data?: TopolaData,\n ): boolean {\n return newSource.spec.hash !== oldSource.spec.hash;\n }\n\n async loadData(\n source: SourceSelection,\n ): Promise {\n try {\n const data = await loadGedcom(\n source.spec.hash,\n source.spec.gedcom,\n source.spec.images,\n );\n const software = getSoftware(data.gedcom.head);\n analyticsEvent('upload_file_loaded', {\n event_label: software,\n event_value: (source.spec.images && source.spec.images.size) || 0,\n });\n return data;\n } catch (error) {\n analyticsEvent('upload_file_error');\n throw error;\n }\n }\n}\n\nexport interface UrlSourceSpec {\n source: DataSourceEnum.GEDCOM_URL;\n /** URL of the data that is loaded or is being loaded. */\n url: string;\n handleCors: boolean;\n}\n\n/** GEDCOM file loaded by pointing to a URL. */\nexport class GedcomUrlDataSource implements DataSource {\n isNewData(\n newSource: SourceSelection,\n oldSource: SourceSelection,\n data?: TopolaData,\n ): boolean {\n return newSource.spec.url !== oldSource.spec.url;\n }\n\n async loadData(source: SourceSelection): Promise {\n try {\n const data = await loadFromUrl(source.spec.url, source.spec.handleCors);\n const software = getSoftware(data.gedcom.head);\n analyticsEvent('upload_file_loaded', {event_label: software});\n return data;\n } catch (error) {\n analyticsEvent('url_file_error');\n throw error;\n }\n }\n}\n","import {analyticsEvent} from '../util/analytics';\nimport {DataSource, DataSourceEnum, SourceSelection} from './data_source';\nimport {getSoftware, TopolaData} from '../util/gedcom_util';\nimport {loadGedcom} from './load_data';\n\n/**\n * Message types used in embedded mode.\n * When the parent is ready to receive messages, it sends PARENT_READY.\n * When the child (this app) is ready to receive messages, it sends READY.\n * When the child receives PARENT_READY, it sends READY.\n * When the parent receives READY, it sends data in a GEDCOM message.\n */\nenum EmbeddedMessageType {\n GEDCOM = 'gedcom',\n READY = 'ready',\n PARENT_READY = 'parent_ready',\n}\n\n/** Message sent to parent or received from parent in embedded mode. */\ninterface EmbeddedMessage {\n message: EmbeddedMessageType;\n}\n\ninterface GedcomMessage extends EmbeddedMessage {\n message: EmbeddedMessageType.GEDCOM;\n gedcom?: string;\n}\n\nexport interface EmbeddedSourceSpec {\n source: DataSourceEnum.EMBEDDED;\n}\n\n/** GEDCOM file received from outside of the iframe. */\nexport class EmbeddedDataSource implements DataSource {\n isNewData(\n newSource: SourceSelection,\n oldSource: SourceSelection,\n data?: TopolaData,\n ): boolean {\n // Never reload data.\n return false;\n }\n\n private async onMessage(\n message: EmbeddedMessage,\n resolve: (value: TopolaData) => void,\n reject: (reason: any) => void,\n ) {\n if (message.message === EmbeddedMessageType.PARENT_READY) {\n // Parent didn't receive the first 'ready' message, so we need to send it again.\n window.parent.postMessage({message: EmbeddedMessageType.READY}, '*');\n } else if (message.message === EmbeddedMessageType.GEDCOM) {\n const gedcom = (message as GedcomMessage).gedcom;\n if (!gedcom) {\n return;\n }\n try {\n const data = await loadGedcom('', gedcom);\n const software = getSoftware(data.gedcom.head);\n analyticsEvent('embedded_file_loaded', {\n event_label: software,\n });\n resolve(data);\n } catch (error) {\n analyticsEvent('embedded_file_error');\n reject(error);\n }\n }\n }\n\n async loadData(\n source: SourceSelection,\n ): Promise {\n // Notify the parent window that we are ready.\n return new Promise((resolve, reject) => {\n window.parent.postMessage({message: EmbeddedMessageType.READY}, '*');\n window.addEventListener('message', (data) =>\n this.onMessage(data.data, resolve, reject),\n );\n });\n }\n}\n","import {IntlShape} from 'react-intl';\nimport {TopolaError} from './error';\n\n/**\n * Returns a translated message for the given error. If the message can't be\n * translated, the original error.message is returned.\n */\nexport function getI18nMessage(error: Error, intl: IntlShape): string {\n if (!(error instanceof TopolaError)) {\n return error.message;\n }\n return intl.formatMessage(\n {\n id: `error.${error.code}`,\n defaultMessage: error.message,\n },\n error.args,\n );\n}\n","export default __webpack_public_path__ + \"static/media/topola.a3ffa9a5.jpg\";","import {createMedia} from '@artsy/fresnel';\n\n/** Defines the breakpoints at which to show different UI variants.*/\nconst AppMedia = createMedia({\n breakpoints: {\n small: 320,\n large: 768,\n },\n});\nexport const mediaStyles = AppMedia.createMediaStyle();\nexport const {Media, MediaContextProvider} = AppMedia;\n","import * as queryString from 'query-string';\nimport {useEffect, useState} from 'react';\nimport logo from './topola.jpg';\nimport {Card, Grid, Image} from 'semantic-ui-react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\nimport {Media} from './util/media';\nimport {getChangelog, updateSeenVersion} from './changelog';\n\n/** Link that loads a GEDCOM file from URL. */\nfunction GedcomLink(props: {url: string; text: string}) {\n return (\n \n {props.text}\n \n );\n}\n\nfunction formatBuildDate(dateString: string) {\n return dateString?.slice(0, 16) || '';\n}\n\nfunction Contents() {\n const [changelog, setChangelog] = useState('');\n useEffect(() => {\n (async () => {\n setChangelog(await getChangelog(1));\n updateSeenVersion();\n })();\n });\n\n return (\n <>\n

\n \n

\n

\n \n

\n\n

\n \n

\n \n\n

\n \n

\n \n \n \n \n\n

\n \n

\n cors-anywhere,\n }}\n />\n\n

\n version: {formatBuildDate(process.env.REACT_APP_GIT_TIME!)} (\n \n {process.env.REACT_APP_GIT_SHA}\n \n )\n

\n \n );\n}\n\n/** The intro page. */\nexport function Intro() {\n return (\n
\n
\n \n \n \n \n \n \n \n \n \n \n \"Topola\n \n \n \n \n \n \n \n \n \n \n \n \n
\n );\n}\n","import {\n Menu,\n Dropdown,\n MenuItemProps,\n DropdownItemProps,\n} from 'semantic-ui-react';\n\nexport enum MenuType {\n Menu,\n Dropdown,\n}\n\ninterface Props {\n menuType?: MenuType;\n}\n\nexport function MenuItem(props: Props & MenuItemProps & DropdownItemProps) {\n const newProps = {...props};\n // Remove menuType from props to avoid error message in the console.\n delete newProps.menuType;\n return (\n <>\n {props.menuType === MenuType.Menu ? (\n {props.children}\n ) : (\n {props.children}\n )}\n \n );\n}\n","import lunr from 'lunr';\nimport naturalSort from 'javascript-natural-sort';\nimport {idToFamMap, idToIndiMap} from '../util/gedcom_util';\nimport {JsonFam, JsonGedcomData, JsonIndi} from 'topola';\n\n// TODO: Add type declarations and use import instead of require.\nrequire('lunr-languages/lunr.stemmer.support')(lunr);\nrequire('lunr-languages/lunr.multi')(lunr);\nrequire('lunr-languages/lunr.de')(lunr);\nrequire('lunr-languages/lunr.fr')(lunr);\nrequire('lunr-languages/lunr.it')(lunr);\nrequire('lunr-languages/lunr.ru')(lunr);\n\nconst MAX_RESULTS = 8;\n\nexport interface SearchResult {\n id: string;\n indi: JsonIndi;\n}\n\nexport interface SearchIndex {\n search(input: string): SearchResult[];\n}\n\n/** Removes accents from letters, e.g. ó->o, ę->e. */\nfunction normalize(input: string) {\n return input\n .toLocaleLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\\u0142/g, 'l'); // Special case: ł is not affected by NFD.\n}\n\n/** Comparator to sort by score first, then by id. */\nfunction compare(a: lunr.Index.Result, b: lunr.Index.Result) {\n if (a.score !== b.score) {\n return b.score - a.score;\n }\n return naturalSort(a.ref, b.ref);\n}\n\n/** Returns all last names of all husbands as a space-separated string. */\nfunction getHusbandLastName(\n indi: JsonIndi,\n indiMap: Map,\n famMap: Map,\n): string {\n return (indi.fams || [])\n .map((famId) => famMap.get(famId))\n .map((fam) => fam && fam.husb)\n .map((husbId) => husbId && indiMap.get(husbId))\n .map((husband) => husband && husband.lastName)\n .join(' ');\n}\n\nclass LunrSearchIndex implements SearchIndex {\n private index: lunr.Index | undefined;\n private indiMap: Map;\n private famMap: Map;\n\n constructor(data: JsonGedcomData) {\n this.indiMap = idToIndiMap(data);\n this.famMap = idToFamMap(data);\n }\n\n initialize() {\n const self = this;\n this.index = lunr(function () {\n this.use((lunr as any).multiLanguage('de', 'en', 'fr', 'it', 'ru'));\n this.ref('id');\n this.field('id');\n this.field('name', {boost: 10});\n this.field('normalizedName', {boost: 8});\n this.field('spouseLastName', {boost: 2});\n this.field('normalizedSpouseLastName', {boost: 2});\n\n self.indiMap.forEach((indi) => {\n const name = [indi.firstName, indi.lastName].join(' ');\n const spouseLastName = getHusbandLastName(\n indi,\n self.indiMap,\n self.famMap,\n );\n this.add({\n id: indi.id,\n name,\n normalizedName: normalize(name),\n spouseLastName,\n normalizedSpouseLastName: normalize(spouseLastName),\n });\n });\n });\n }\n\n public search(input: string): SearchResult[] {\n const query = input\n .split(' ')\n .filter((s) => !!s)\n .map((s) => `${s} ${s}*`)\n .join(' ');\n const results = this.index!.search(query);\n return results\n .sort(compare)\n .slice(0, MAX_RESULTS)\n .map((result) => ({id: result.ref, indi: this.indiMap.get(result.ref)!}));\n }\n}\n\n/** Builds a search index from data. */\nexport function buildSearchIndex(data: JsonGedcomData): SearchIndex {\n const index = new LunrSearchIndex(data);\n index.initialize();\n return index;\n}\n","import debounce from 'debounce';\nimport {analyticsEvent} from '../util/analytics';\nimport {buildSearchIndex, SearchIndex, SearchResult} from './search_index';\nimport {formatDateOrRange} from '../util/date_util';\nimport {IndiInfo, JsonGedcomData} from 'topola';\nimport {JsonIndi} from 'topola';\nimport {Search, SearchResultProps} from 'semantic-ui-react';\nimport {useEffect, useRef, useState} from 'react';\nimport {useIntl} from 'react-intl';\n\nfunction getNameLine(result: SearchResult) {\n const name = [result.indi.firstName, result.indi.lastName].join(' ').trim();\n if (result.id.length > 8) {\n return name;\n }\n return (\n <>\n {name} ({result.id})\n \n );\n}\n\ninterface Props {\n /** Data used for the search index. */\n data: JsonGedcomData;\n onSelection: (indiInfo: IndiInfo) => void;\n}\n\n/** Displays and handles the search box in the top bar. */\nexport function SearchBar(props: Props) {\n const [searchResults, setSearchResults] = useState([]);\n const [searchString, setSearchString] = useState('');\n const searchIndex = useRef();\n const intl = useIntl();\n\n function getDescriptionLine(indi: JsonIndi) {\n const birthDate = formatDateOrRange(indi.birth, intl);\n const deathDate = formatDateOrRange(indi.death, intl);\n if (!deathDate) {\n return birthDate;\n }\n return `${birthDate} – ${deathDate}`;\n }\n\n /** Produces an object that is displayed in the Semantic UI Search results. */\n function displaySearchResult(result: SearchResult): SearchResultProps {\n return {\n id: result.id,\n key: result.id,\n title: getNameLine(result),\n description: getDescriptionLine(result.indi),\n } as SearchResultProps;\n }\n\n /** On search input change. */\n function handleSearch(input: string | undefined) {\n if (!input) {\n return;\n }\n const results = searchIndex\n .current!.search(input)\n .map((result) => displaySearchResult(result));\n setSearchResults(results);\n }\n const debouncedHandleSearch = useRef(debounce(handleSearch, 200));\n\n /** On search result selected. */\n function handleResultSelect(id: string) {\n analyticsEvent('search_result_selected');\n props.onSelection({id, generation: 0});\n setSearchString('');\n }\n\n /** On search string changed. */\n function onChange(value: string) {\n debouncedHandleSearch.current(value);\n setSearchString(value);\n }\n\n // Initialize the search index.\n useEffect(() => {\n searchIndex.current = buildSearchIndex(props.data);\n }, [props.data]);\n\n return (\n onChange(data.value!)}\n onResultSelect={(_, data) => handleResultSelect(data.result.id)}\n results={searchResults}\n noResultsMessage={intl.formatMessage({\n id: 'menu.search.no_results',\n defaultMessage: 'No results found',\n })}\n placeholder={intl.formatMessage({\n id: 'menu.search.placeholder',\n defaultMessage: 'Search for people',\n })}\n selectFirstResult={true}\n value={searchString}\n id=\"search\"\n />\n );\n}\n","import * as queryString from 'query-string';\nimport md5 from 'md5';\nimport {analyticsEvent} from '../util/analytics';\nimport {Dropdown, Icon, Menu} from 'semantic-ui-react';\nimport {FormattedMessage} from 'react-intl';\nimport {MenuType} from './menu_item';\nimport {SyntheticEvent} from 'react';\nimport {useHistory, useLocation} from 'react-router';\n\nfunction loadFileAsText(file: File): Promise {\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = (evt: ProgressEvent) => {\n resolve((evt.target as FileReader).result as string);\n };\n reader.readAsText(file);\n });\n}\n\nfunction isImageFileName(fileName: string) {\n const lower = fileName.toLowerCase();\n return lower.endsWith('.jpg') || lower.endsWith('.png');\n}\n\ninterface Props {\n menuType: MenuType;\n}\n\n/** Displays and handles the \"Open file\" menu. */\nexport function UploadMenu(props: Props) {\n const history = useHistory();\n const location = useLocation();\n\n async function handleUpload(event: SyntheticEvent) {\n const files = (event.target as HTMLInputElement).files;\n if (!files || !files.length) {\n return;\n }\n const filesArray = Array.from(files);\n (event.target as HTMLInputElement).value = ''; // Reset the file input.\n analyticsEvent('upload_files_selected', {\n event_value: files.length,\n });\n\n const gedcomFile =\n filesArray.length === 1\n ? filesArray[0]\n : filesArray.find((file) => file.name.toLowerCase().endsWith('.ged')) ||\n filesArray[0];\n\n // Convert uploaded images to object URLs.\n const images = filesArray\n .filter(\n (file) => file.name !== gedcomFile.name && isImageFileName(file.name),\n )\n .map((file) => ({\n name: file.name,\n url: URL.createObjectURL(file),\n }));\n const imageMap = new Map(\n images.map((entry) => [entry.name, entry.url] as [string, string]),\n );\n\n const data = await loadFileAsText(gedcomFile);\n const imageFileNames = images\n .map((image) => image.name)\n .sort()\n .join('|');\n // Hash GEDCOM contents with uploaded image file names.\n const hash = md5(md5(data) + imageFileNames);\n\n // Use history.replace() when reuploading the same file and history.push() when loading\n // a new file.\n const search = queryString.parse(location.search);\n const historyPush = search.file === hash ? history.replace : history.push;\n\n historyPush({\n pathname: '/view',\n search: queryString.stringify({file: hash}),\n state: {data, images: imageMap},\n });\n }\n\n const content = (\n <>\n \n \n \n );\n return (\n <>\n {props.menuType === MenuType.Menu ? (\n \n ) : (\n \n {content}\n \n )}\n \n \n );\n}\n","import * as queryString from 'query-string';\nimport {analyticsEvent} from '../util/analytics';\nimport {Button, Form, Header, Icon, Input, Modal} from 'semantic-ui-react';\nimport {FormattedMessage} from 'react-intl';\nimport {MenuItem, MenuType} from './menu_item';\nimport {useEffect, useRef, useState} from 'react';\nimport {useHistory} from 'react-router';\n\ninterface Props {\n menuType: MenuType;\n}\n\n/** Displays and handles the \"Open URL\" menu. */\nexport function UrlMenu(props: Props) {\n const [dialogOpen, setDialogOpen] = useState(false);\n const [url, setUrl] = useState('');\n const inputRef = useRef(null);\n const history = useHistory();\n\n useEffect(() => {\n if (dialogOpen) {\n setUrl('');\n inputRef.current!.focus();\n }\n }, [dialogOpen]);\n\n /** Load button clicked in the \"Load from URL\" dialog. */\n function handleLoad() {\n setDialogOpen(false);\n if (url) {\n analyticsEvent('url_selected');\n history.push({\n pathname: '/view',\n search: queryString.stringify({url}),\n });\n }\n }\n\n function loadFromUrlModal() {\n return (\n setDialogOpen(false)}\n centered={false}\n >\n
\n \n \n
\n \n
\n setUrl(data.value)}\n ref={inputRef}\n />\n

\n \n topola-cors-server.up.railway.app\n \n ),\n }}\n />\n

\n \n
\n \n \n \n \n \n );\n }\n\n return (\n <>\n setDialogOpen(true)} menuType={props.menuType}>\n \n \n \n {loadFromUrlModal()}\n \n );\n}\n","export default __webpack_public_path__ + \"static/media/wikitree.7bffea31.png\";","import * as queryString from 'query-string';\nimport {Dropdown, Icon, Menu} from 'semantic-ui-react';\nimport {FormattedMessage} from 'react-intl';\nimport {IndiInfo, JsonGedcomData} from 'topola';\nimport {Link} from 'react-router-dom';\nimport {Media} from '../util/media';\nimport {MenuType} from './menu_item';\nimport {SearchBar} from './search';\nimport {UploadMenu} from './upload_menu';\nimport {UrlMenu} from './url_menu';\nimport {useHistory, useLocation} from 'react-router';\nimport {WikiTreeLoginMenu, WikiTreeMenu} from './wikitree_menu';\n\nenum ScreenSize {\n LARGE,\n SMALL,\n}\n\ninterface EventHandlers {\n onSelection: (indiInfo: IndiInfo) => void;\n onPrint: () => void;\n onDownloadPdf: () => void;\n onDownloadPng: () => void;\n onDownloadSvg: () => void;\n}\n\ninterface Props {\n /** True if the application is currently showing a chart. */\n showingChart: boolean;\n /** Data used for the search index. */\n data?: JsonGedcomData;\n standalone: boolean;\n /** Whether to show the \"All relatives\" chart type in the menu. */\n allowAllRelativesChart: boolean;\n eventHandlers: EventHandlers;\n /** Whether to show additional WikiTree menus. */\n showWikiTreeMenus: boolean;\n}\n\nexport function TopBar(props: Props) {\n const history = useHistory();\n const location = useLocation();\n\n function changeView(view: string) {\n const search = queryString.parse(location.search);\n if (search.view !== view) {\n search.view = view;\n location.search = queryString.stringify(search);\n history.push(location);\n }\n }\n\n function chartMenus(screenSize: ScreenSize) {\n if (!props.showingChart) {\n return null;\n }\n const chartTypeItems = (\n <>\n changeView('hourglass')}>\n \n \n \n {props.allowAllRelativesChart ? (\n changeView('relatives')}>\n \n \n \n ) : null}\n changeView('fancy')}>\n \n \n \n \n );\n switch (screenSize) {\n case ScreenSize.LARGE:\n return (\n <>\n \n \n \n \n\n \n \n \n
\n }\n className=\"item\"\n >\n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n }\n className=\"item\"\n >\n {chartTypeItems}\n \n \n \n );\n\n case ScreenSize.SMALL:\n return (\n <>\n \n \n \n \n\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n\n \n {chartTypeItems}\n \n \n );\n }\n }\n\n function title() {\n return (\n \n Topola Genealogy\n \n );\n }\n\n function fileMenus(screenSize: ScreenSize) {\n // In standalone WikiTree mode, show only the \"Select WikiTree ID\" menu.\n if (!props.standalone && props.showWikiTreeMenus) {\n switch (screenSize) {\n case ScreenSize.LARGE:\n return ;\n case ScreenSize.SMALL:\n return (\n <>\n \n \n \n );\n }\n }\n\n // Don't show \"open\" menus in non-standalone mode.\n if (!props.standalone) {\n return null;\n }\n\n switch (screenSize) {\n case ScreenSize.LARGE:\n // Show dropdown if chart is shown, otherwise show individual menu\n // items.\n const menus = props.showingChart ? (\n \n \n \n \n }\n className=\"item\"\n >\n \n \n \n \n \n \n ) : (\n <>\n \n \n \n \n );\n return menus;\n\n case ScreenSize.SMALL:\n return (\n <>\n \n \n \n \n \n );\n }\n }\n\n function wikiTreeLoginMenu(screenSize: ScreenSize) {\n if (!props.showWikiTreeMenus) {\n return null;\n }\n return (\n <>\n \n {screenSize === ScreenSize.SMALL ? : null}\n \n );\n }\n\n function mobileMenus() {\n return (\n <>\n \n \n \n }\n className=\"item\"\n icon={null}\n >\n \n {fileMenus(ScreenSize.SMALL)}\n {chartMenus(ScreenSize.SMALL)}\n {wikiTreeLoginMenu(ScreenSize.SMALL)}\n\n \n \n \n \n \n {props.standalone ? {title()} : title()}\n \n );\n }\n\n function desktopMenus() {\n return (\n <>\n {props.standalone ? {title()} : null}\n {fileMenus(ScreenSize.LARGE)}\n {chartMenus(ScreenSize.LARGE)}\n \n {wikiTreeLoginMenu(ScreenSize.LARGE)}\n \n \n \n \n \n );\n }\n\n return (\n <>\n \n {desktopMenus()}\n \n \n {mobileMenus()}\n \n \n );\n}\n","import * as queryString from 'query-string';\nimport wikitreeLogo from './wikitree.png';\nimport {analyticsEvent} from '../util/analytics';\nimport {Button, Form, Header, Input, Modal} from 'semantic-ui-react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {MenuItem, MenuType} from './menu_item';\nimport {useEffect, useRef, useState} from 'react';\nimport {useHistory, useLocation} from 'react-router';\nimport {getLoggedInUserName, navigateToLoginPage} from 'wikitree-js';\n\ninterface Props {\n menuType: MenuType;\n}\n\n/** Displays and handles the \"Select WikiTree ID\" menu. */\nexport function WikiTreeMenu(props: Props) {\n const [dialogOpen, setDialogOpen] = useState(false);\n const [wikiTreeId, setWikiTreeId] = useState('');\n const inputRef = useRef(null);\n const history = useHistory();\n const location = useLocation();\n\n useEffect(() => {\n if (dialogOpen) {\n setWikiTreeId('');\n inputRef.current!.focus();\n }\n }, [dialogOpen]);\n\n /** Select button clicked in the \"Select WikiTree ID\" dialog. */\n function handleSelectId() {\n setDialogOpen(false);\n if (!wikiTreeId) {\n return;\n }\n analyticsEvent('wikitree_id_selected');\n const search = queryString.parse(location.search);\n const standalone =\n search.standalone !== undefined ? search.standalone : true;\n history.push({\n pathname: '/view',\n search: queryString.stringify({\n indi: wikiTreeId,\n source: 'wikitree',\n standalone,\n }),\n });\n }\n\n function enterId(event: React.MouseEvent, id: string) {\n event.preventDefault(); // Do not follow link in href.\n setWikiTreeId(id);\n inputRef.current!.focus();\n }\n\n function wikiTreeIdModal() {\n return (\n setDialogOpen(false)}\n centered={false}\n >\n
\n \n \n
\n \n
\n

\n \n WikiTree\n \n ),\n example1: (\n enterId(e, 'Wojtyla-13')}\n className=\"link-span\"\n >\n Wojtyla-13\n \n ),\n example2: (\n enterId(e, 'Skłodowska-2')}\n className=\"link-span\"\n >\n Skłodowska-2\n \n ),\n }}\n />\n

\n setWikiTreeId(data.value)}\n ref={inputRef}\n />\n \n
\n \n \n \n \n \n );\n }\n\n return (\n <>\n setDialogOpen(true)}>\n \"WikiTree\n \n \n {wikiTreeIdModal()}\n \n );\n}\n\n/** Displays and handles the \"Log in to WikiTree\" menu. */\nexport function WikiTreeLoginMenu(props: Props) {\n const intl = useIntl();\n\n /**\n * Redirect to the WikiTree Apps login page with a return URL pointing to\n * Topola Viewer hosted on apps.wikitree.com.\n */\n function login() {\n const wikiTreeTopolaUrl =\n 'https://apps.wikitree.com/apps/wiech13/topola-viewer';\n // TODO: remove authcode if it is in the current URL.\n const returnUrl = `${wikiTreeTopolaUrl}${window.location.hash}`;\n navigateToLoginPage(returnUrl);\n }\n\n const username = getLoggedInUserName();\n if (!username) {\n return (\n <>\n \n \"WikiTree\n \n \n \n );\n }\n const tooltip = intl.formatMessage(\n {\n id: 'menu.wikitree_popup_username',\n defaultMessage: 'Logged in to WikiTree as {username}',\n },\n {username},\n );\n return (\n \n \"WikiTree\n \n \n );\n}\n","import {Item, Checkbox, Form, Header} from 'semantic-ui-react';\nimport {FormattedMessage} from 'react-intl';\nimport {ParsedQuery} from 'query-string';\n\nexport enum ChartColors {\n NO_COLOR,\n COLOR_BY_SEX,\n COLOR_BY_GENERATION,\n}\n\nexport enum Ids {\n HIDE,\n SHOW,\n}\n\nexport enum Sex {\n HIDE,\n SHOW,\n}\n\nexport interface Config {\n color: ChartColors;\n id: Ids;\n sex: Sex;\n}\n\nexport const DEFALUT_CONFIG: Config = {\n color: ChartColors.COLOR_BY_GENERATION,\n id: Ids.SHOW,\n sex: Sex.SHOW,\n};\n\nconst COLOR_ARG = new Map([\n ['n', ChartColors.NO_COLOR],\n ['g', ChartColors.COLOR_BY_GENERATION],\n ['s', ChartColors.COLOR_BY_SEX],\n]);\nconst COLOR_ARG_INVERSE = new Map();\nCOLOR_ARG.forEach((v, k) => COLOR_ARG_INVERSE.set(v, k));\n\nconst ID_ARG = new Map([\n ['h', Ids.HIDE],\n ['s', Ids.SHOW],\n]);\nconst ID_ARG_INVERSE = new Map();\nID_ARG.forEach((v, k) => ID_ARG_INVERSE.set(v, k));\n\nconst SEX_ARG = new Map([\n ['h', Sex.HIDE],\n ['s', Sex.SHOW],\n]);\nconst SEX_ARG_INVERSE = new Map();\nSEX_ARG.forEach((v, k) => SEX_ARG_INVERSE.set(v, k));\n\nexport function argsToConfig(args: ParsedQuery): Config {\n const getParam = (name: string) => {\n const value = args[name];\n return typeof value === 'string' ? value : undefined;\n };\n\n return {\n color: COLOR_ARG.get(getParam('c') ?? '') ?? DEFALUT_CONFIG.color,\n id: ID_ARG.get(getParam('i') ?? '') ?? DEFALUT_CONFIG.id,\n sex: SEX_ARG.get(getParam('s') ?? '') ?? DEFALUT_CONFIG.sex,\n };\n}\n\nexport function configToArgs(config: Config): ParsedQuery {\n return {\n c: COLOR_ARG_INVERSE.get(config.color),\n i: ID_ARG_INVERSE.get(config.id),\n s: SEX_ARG_INVERSE.get(config.sex),\n };\n}\n\nexport function ConfigPanel(props: {\n config: Config;\n onChange: (config: Config) => void;\n}) {\n return (\n
\n \n \n \n
\n \n
\n \n \n }\n name=\"checkboxRadioGroup\"\n value=\"none\"\n checked={props.config.color === ChartColors.NO_COLOR}\n onClick={() =>\n props.onChange({...props.config, color: ChartColors.NO_COLOR})\n }\n />\n \n \n \n }\n name=\"checkboxRadioGroup\"\n value=\"generation\"\n checked={props.config.color === ChartColors.COLOR_BY_GENERATION}\n onClick={() =>\n props.onChange({...props.config, color: ChartColors.COLOR_BY_GENERATION})\n }\n />\n \n \n \n }\n name=\"checkboxRadioGroup\"\n value=\"gender\"\n checked={props.config.color === ChartColors.COLOR_BY_SEX}\n onClick={() =>\n props.onChange({...props.config, color: ChartColors.COLOR_BY_SEX})\n }\n />\n \n
\n
\n \n \n
\n \n
\n \n \n }\n name=\"checkboxRadioGroup\"\n value=\"hide\"\n checked={props.config.id === Ids.HIDE}\n onClick={() =>\n props.onChange({...props.config, id: Ids.HIDE})\n }\n />\n \n \n \n }\n name=\"checkboxRadioGroup\"\n value=\"show\"\n checked={props.config.id === Ids.SHOW}\n onClick={() =>\n props.onChange({...props.config, id: Ids.SHOW})\n }\n />\n \n
\n
\n \n \n
\n \n
\n \n \n }\n name=\"checkboxRadioGroup\"\n value=\"hide\"\n checked={props.config.sex === Sex.HIDE}\n onClick={() =>\n props.onChange({...props.config, sex: Sex.HIDE})\n }\n />\n \n \n \n }\n name=\"checkboxRadioGroup\"\n value=\"show\"\n checked={props.config.sex === Sex.SHOW}\n onClick={() =>\n props.onChange({...props.config, sex: Sex.SHOW})\n }\n />\n \n
\n
\n
\n
\n );\n}\n","import {ChartColors, Ids, Sex} from './config';\nimport {interpolateNumber} from 'd3-interpolate';\nimport {IntlShape, useIntl} from 'react-intl';\nimport {max, min} from 'd3-array';\nimport {Media} from './util/media';\nimport {saveAs} from 'file-saver';\nimport {select, Selection} from 'd3-selection';\nimport {useEffect, useRef} from 'react';\nimport 'd3-transition';\nimport {\n D3ZoomEvent,\n zoom,\n ZoomBehavior,\n ZoomedElementBaseType,\n zoomTransform,\n} from 'd3-zoom';\nimport {\n JsonGedcomData,\n ChartHandle,\n IndiInfo,\n createChart,\n DetailedRenderer,\n HourglassChart,\n RelativesChart,\n FancyChart,\n CircleRenderer,\n ChartColors as TopolaChartColors,\n} from 'topola';\n\n/** How much to zoom when using the +/- buttons. */\nconst ZOOM_FACTOR = 1.3;\n\n/**\n * Called when the view is dragged with the mouse.\n *\n * @param size the size of the chart\n */\nfunction zoomed(\n size: [number, number],\n event: D3ZoomEvent,\n) {\n const parent = select('#svgContainer').node() as Element;\n\n const scale = event.transform.k;\n const offsetX = max([0, (parent.clientWidth - size[0] * scale) / 2]);\n const offsetY = max([0, (parent.clientHeight - size[1] * scale) / 2]);\n select('#chartSvg')\n .attr('width', size[0] * scale)\n .attr('height', size[1] * scale)\n .attr('transform', `translate(${offsetX}, ${offsetY})`);\n select('#chart').attr('transform', `scale(${scale})`);\n\n parent.scrollLeft = -event.transform.x;\n parent.scrollTop = -event.transform.y;\n}\n\n/** Called when the scrollbars are used. */\nfunction scrolled() {\n const parent = select('#svgContainer').node() as Element;\n const x = parent.scrollLeft + parent.clientWidth / 2;\n const y = parent.scrollTop + parent.clientHeight / 2;\n const scale = zoomTransform(parent).k;\n select(parent).call(zoom().translateTo, x / scale, y / scale);\n}\n\n/** Loads blob as data URL. */\nfunction loadAsDataUrl(blob: Blob): Promise {\n const reader = new FileReader();\n reader.readAsDataURL(blob);\n return new Promise((resolve, reject) => {\n reader.onload = (e) => resolve((e.target as FileReader).result as string);\n });\n}\n\nasync function inlineImage(image: SVGImageElement) {\n const href = image.href.baseVal;\n if (!href) {\n return;\n }\n try {\n const response = await fetch(href);\n const blob = await response.blob();\n const dataUrl = await loadAsDataUrl(blob);\n image.href.baseVal = dataUrl;\n } catch (e) {\n console.warn('Failed to load image:', e);\n }\n}\n\n/**\n * Fetches all images in the SVG and replaces them with inlined images as data\n * URLs. Images are replaced in place. The replacement is done, the returned\n * promise is resolved.\n */\nasync function inlineImages(svg: Element): Promise {\n const images = Array.from(svg.getElementsByTagName('image'));\n await Promise.all(images.map(inlineImage));\n}\n\n/** Loads a blob into an image object. */\nfunction loadImage(blob: Blob): Promise {\n const image = new Image();\n image.src = URL.createObjectURL(blob);\n return new Promise((resolve, reject) => {\n image.addEventListener('load', () => resolve(image));\n });\n}\n\n/** Draw image on a new canvas and return the canvas. */\nfunction drawImageOnCanvas(image: HTMLImageElement) {\n const canvas = document.createElement('canvas');\n // Scale image for better quality.\n canvas.width = image.width * 2;\n canvas.height = image.height * 2;\n\n const ctx = canvas.getContext('2d')!;\n const oldFill = ctx.fillStyle;\n ctx.fillStyle = 'white';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.fillStyle = oldFill;\n\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n return canvas;\n}\n\nfunction canvasToBlob(canvas: HTMLCanvasElement, type: string) {\n return new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject();\n }\n }, type);\n });\n}\n\n/** Return a copy of the SVG chart but without scaling and positioning. */\nfunction getStrippedSvg() {\n const svg = document.getElementById('chartSvg')!.cloneNode(true) as Element;\n\n svg.removeAttribute('transform');\n const parent = select('#svgContainer').node() as Element;\n const scale = zoomTransform(parent).k;\n svg.setAttribute('width', String(Number(svg.getAttribute('width')) / scale));\n svg.setAttribute(\n 'height',\n String(Number(svg.getAttribute('height')) / scale),\n );\n svg.querySelector('#chart')!.removeAttribute('transform');\n\n return svg;\n}\n\nfunction getSvgContents() {\n return new XMLSerializer().serializeToString(getStrippedSvg());\n}\n\nasync function getSvgContentsWithInlinedImages() {\n const svg = getStrippedSvg();\n await inlineImages(svg);\n return new XMLSerializer().serializeToString(svg);\n}\n\n/** Shows the print dialog to print the currently displayed chart. */\nexport function printChart() {\n const printWindow = document.createElement('iframe');\n printWindow.style.position = 'absolute';\n printWindow.style.top = '-1000px';\n printWindow.style.left = '-1000px';\n printWindow.onload = () => {\n printWindow.contentDocument!.open();\n printWindow.contentDocument!.write(getSvgContents());\n printWindow.contentDocument!.close();\n // Doesn't work on Firefox without the setTimeout.\n setTimeout(() => {\n printWindow.contentWindow!.focus();\n printWindow.contentWindow!.print();\n printWindow.parentNode!.removeChild(printWindow);\n }, 500);\n };\n document.body.appendChild(printWindow);\n}\n\nexport async function downloadSvg() {\n const contents = await getSvgContentsWithInlinedImages();\n const blob = new Blob([contents], {type: 'image/svg+xml'});\n saveAs(blob, 'topola.svg');\n}\n\nasync function drawOnCanvas(): Promise {\n const contents = await getSvgContentsWithInlinedImages();\n const blob = new Blob([contents], {type: 'image/svg+xml'});\n return drawImageOnCanvas(await loadImage(blob));\n}\n\nexport async function downloadPng() {\n const canvas = await drawOnCanvas();\n const blob = await canvasToBlob(canvas, 'image/png');\n saveAs(blob, 'topola.png');\n}\n\nexport async function downloadPdf() {\n // Lazy load jspdf.\n const {default: jspdf} = await import('jspdf');\n const canvas = await drawOnCanvas();\n const doc = new jspdf({\n orientation: canvas.width > canvas.height ? 'l' : 'p',\n unit: 'pt',\n format: [canvas.width, canvas.height],\n });\n doc.addImage(canvas, 'PNG', 0, 0, canvas.width, canvas.height, 'NONE');\n doc.save('topola.pdf');\n}\n\n/** Supported chart types. */\nexport enum ChartType {\n Hourglass,\n Relatives,\n Fancy,\n}\n\nconst chartColors = new Map([\n [ChartColors.NO_COLOR, TopolaChartColors.NO_COLOR],\n [ChartColors.COLOR_BY_GENERATION, TopolaChartColors.COLOR_BY_GENERATION],\n [ChartColors.COLOR_BY_SEX, TopolaChartColors.COLOR_BY_SEX],\n]);\n\nfunction getChartType(chartType: ChartType) {\n switch (chartType) {\n case ChartType.Hourglass:\n return HourglassChart;\n case ChartType.Relatives:\n return RelativesChart;\n case ChartType.Fancy:\n return FancyChart;\n default:\n // Fall back to hourglass chart.\n return HourglassChart;\n }\n}\n\nfunction getRendererType(chartType: ChartType) {\n switch (chartType) {\n case ChartType.Fancy:\n return CircleRenderer;\n default:\n // Use DetailedRenderer by default.\n return DetailedRenderer;\n }\n}\n\nexport interface ChartProps {\n data: JsonGedcomData;\n selection: IndiInfo;\n chartType: ChartType;\n onSelection: (indiInfo: IndiInfo) => void;\n freezeAnimation?: boolean;\n colors?: ChartColors;\n hideIds?: Ids;\n hideSex?: Sex;\n}\n\nclass ChartWrapper {\n private chart?: ChartHandle;\n /** Animation is in progress. */\n private animating = false;\n /** Rendering is required after the current animation finishes. */\n private rerenderRequired = false;\n /** The d3 zoom behavior object. */\n private zoomBehavior?: ZoomBehavior;\n /** Props that will be used for rerendering. */\n private rerenderProps?: ChartProps;\n private rerenderResetPosition?: boolean;\n\n zoom(factor: number) {\n const parent = select('#svgContainer') as Selection;\n this.zoomBehavior!.scaleBy(parent, factor);\n }\n\n /**\n * Renders the chart or performs a transition animation to a new state.\n * If indiInfo is not given, it means that it is the initial render and no\n * animation is performed.\n */\n renderChart(\n props: ChartProps,\n intl: IntlShape,\n args: {initialRender: boolean; resetPosition: boolean} = {\n initialRender: false,\n resetPosition: false,\n },\n ) {\n // Wait for animation to finish if animation is in progress.\n if (!args.initialRender && this.animating) {\n this.rerenderRequired = true;\n this.rerenderProps = props;\n this.rerenderResetPosition = args.resetPosition;\n return;\n }\n\n // Freeze changing selection after initial rendering.\n if (!args.initialRender && props.freezeAnimation) {\n return;\n }\n\n if (args.initialRender) {\n (select('#chart').node() as HTMLElement).innerHTML = '';\n this.chart = createChart({\n json: props.data,\n chartType: getChartType(props.chartType),\n renderer: getRendererType(props.chartType),\n svgSelector: '#chart',\n indiCallback: (info) => props.onSelection(info),\n colors: chartColors.get(props.colors!),\n animate: true,\n updateSvgSize: false,\n locale: intl.locale,\n });\n } else {\n this.chart!.setData(props.data);\n }\n const chartInfo = this.chart!.render({\n startIndi: props.selection.id,\n baseGeneration: props.selection.generation,\n });\n const svg = select('#chartSvg');\n const parent = select('#svgContainer').node() as Element;\n\n const scale = zoomTransform(parent).k;\n const zoomOutFactor = min([\n 1,\n scale,\n parent.clientWidth / chartInfo.size[0],\n parent.clientHeight / chartInfo.size[1],\n ])!;\n const extent: [number, number] = [max([0.1, zoomOutFactor])!, 2];\n\n this.zoomBehavior = zoom()\n .scaleExtent(extent)\n .translateExtent([[0, 0], chartInfo.size])\n .on('zoom', (event) => zoomed(chartInfo.size, event));\n select(parent).on('scroll', scrolled).call(this.zoomBehavior);\n\n const scrollTopTween = (scrollTop: number) => {\n return () => {\n const i = interpolateNumber(parent.scrollTop, scrollTop);\n return (t: number) => {\n parent.scrollTop = i(t);\n };\n };\n };\n const scrollLeftTween = (scrollLeft: number) => {\n return () => {\n const i = interpolateNumber(parent.scrollLeft, scrollLeft);\n return (t: number) => {\n parent.scrollLeft = i(t);\n };\n };\n };\n\n const dx = parent.clientWidth / 2 - chartInfo.origin[0] * scale;\n const dy = parent.clientHeight / 2 - chartInfo.origin[1] * scale;\n const offsetX = max([\n 0,\n (parent.clientWidth - chartInfo.size[0] * scale) / 2,\n ]);\n const offsetY = max([\n 0,\n (parent.clientHeight - chartInfo.size[1] * scale) / 2,\n ]);\n const svgTransition = svg.transition().delay(200).duration(500);\n const transition = args.initialRender ? svg : svgTransition;\n transition\n .attr('transform', `translate(${offsetX}, ${offsetY})`)\n .attr('width', chartInfo.size[0] * scale)\n .attr('height', chartInfo.size[1] * scale);\n if (args.resetPosition) {\n if (args.initialRender) {\n parent.scrollLeft = -dx;\n parent.scrollTop = -dy;\n } else {\n svgTransition\n .tween('scrollLeft', scrollLeftTween(-dx))\n .tween('scrollTop', scrollTopTween(-dy));\n }\n }\n\n // After the animation is finished, rerender the chart if required.\n this.animating = true;\n chartInfo.animationPromise.then(() => {\n this.animating = false;\n if (this.rerenderRequired) {\n this.rerenderRequired = false;\n // Use `this.rerenderProps` instead of the props in scope because\n // the props may have been updated in the meantime.\n this.renderChart(this.rerenderProps!, intl, {\n initialRender: false,\n resetPosition: !!this.rerenderResetPosition,\n });\n }\n });\n }\n}\n\nfunction usePrevious(value: T): T | undefined {\n const ref = useRef();\n useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n\nexport function Chart(props: ChartProps) {\n const chartWrapper = useRef(new ChartWrapper());\n const prevProps = usePrevious(props);\n const intl = useIntl();\n\n useEffect(() => {\n if (prevProps) {\n const initialRender =\n props.chartType !== prevProps?.chartType ||\n props.colors !== prevProps?.colors ||\n props.hideIds !== prevProps?.hideIds ||\n props.hideSex !== prevProps?.hideSex;\n const resetPosition =\n props.chartType !== prevProps?.chartType ||\n props.data !== prevProps.data ||\n props.selection !== prevProps.selection;\n chartWrapper.current.renderChart(props, intl, {\n initialRender,\n resetPosition,\n });\n } else {\n chartWrapper.current.renderChart(props, intl, {\n initialRender: true,\n resetPosition: true,\n });\n }\n });\n\n return (\n
\n \n chartWrapper.current.zoom(ZOOM_FACTOR)}\n >\n +\n \n chartWrapper.current.zoom(1 / ZOOM_FACTOR)}\n >\n −\n \n \n \n \n \n
\n );\n}\n","import {analyticsEvent} from '../util/analytics';\nimport {DataSource, DataSourceEnum, SourceSelection} from './data_source';\nimport {\n Date,\n DateOrRange,\n JsonEvent,\n JsonFam,\n JsonGedcomData,\n JsonImage,\n JsonIndi,\n} from 'topola';\nimport {GedcomData, normalizeGedcom, TopolaData} from '../util/gedcom_util';\nimport {GedcomEntry} from 'parse-gedcom';\nimport {IntlShape} from 'react-intl';\nimport {TopolaError} from '../util/error';\nimport {isValidDateOrRange} from '../util/date_util';\nimport {StringUtils} from 'turbocommons-ts';\nimport {\n getAncestors as getAncestorsApi,\n getRelatives as getRelativesApi,\n clientLogin,\n getLoggedInUserName,\n Person,\n} from 'wikitree-js';\n\nconst WIKITREE_APP_ID = 'topola-viewer';\n\n/** Prefix for IDs of private individuals. */\nexport const PRIVATE_ID_PREFIX = '~Private';\n\n/** Gets item from session storage. Logs exception if one is thrown. */\nfunction getSessionStorageItem(key: string): string | null {\n try {\n return sessionStorage.getItem(key);\n } catch (e) {\n console.warn('Failed to load data from session storage: ' + e);\n }\n return null;\n}\n\n/** Sets item in session storage. Logs exception if one is thrown. */\nfunction setSessionStorageItem(key: string, value: string) {\n try {\n sessionStorage.setItem(key, value);\n } catch (e) {\n console.warn('Failed to store data in session storage: ' + e);\n }\n}\n\nfunction getApiOptions(handleCors: boolean) {\n return Object.assign(\n {appId: WIKITREE_APP_ID},\n handleCors\n ? {\n apiUrl:\n 'https://topola-cors-server.up.railway.app/https://api.wikitree.com/api.php',\n }\n : {},\n );\n}\n\n/**\n * Retrieves ancestors from WikiTree for the given person ID.\n * Uses sessionStorage for caching responses.\n */\nasync function getAncestors(\n key: string,\n handleCors: boolean,\n): Promise {\n const cacheKey = `wikitree:ancestors:${key}`;\n const cachedData = getSessionStorageItem(cacheKey);\n if (cachedData) {\n return JSON.parse(cachedData);\n }\n const result = await getAncestorsApi(key, {}, getApiOptions(handleCors));\n setSessionStorageItem(cacheKey, JSON.stringify(result));\n return result;\n}\n\n/**\n * Retrieves relatives from WikiTree for the given array of person IDs.\n * Uses sessionStorage for caching responses.\n */\nasync function getRelatives(\n keys: string[],\n handleCors: boolean,\n): Promise {\n const result: Person[] = [];\n const keysToFetch: string[] = [];\n keys.forEach((key) => {\n const cachedData = getSessionStorageItem(`wikitree:relatives:${key}`);\n if (cachedData) {\n result.push(JSON.parse(cachedData));\n } else {\n keysToFetch.push(key);\n }\n });\n if (keysToFetch.length === 0) {\n return result;\n }\n const response = await getRelativesApi(\n keysToFetch,\n {getChildren: true, getSpouses: true},\n getApiOptions(handleCors),\n );\n if (!response) {\n const id = keysToFetch[0];\n throw new TopolaError(\n 'WIKITREE_PROFILE_NOT_FOUND',\n `WikiTree profile ${id} not found`,\n {id},\n );\n }\n response.forEach((person) => {\n setSessionStorageItem(\n `wikitree:relatives:${person.Name}`,\n JSON.stringify(person),\n );\n });\n return result.concat(response);\n}\n\n/**\n * Loads data from WikiTree to populate an hourglass chart starting from the\n * given person ID.\n */\nexport async function loadWikiTree(\n key: string,\n intl: IntlShape,\n authcode?: string,\n): Promise {\n // Work around CORS if not in apps.wikitree.com domain.\n const handleCors = window.location.hostname !== 'apps.wikitree.com';\n\n if (!handleCors && !getLoggedInUserName() && authcode) {\n const loginResult = await clientLogin(authcode, {appId: WIKITREE_APP_ID});\n if (loginResult.result === 'Success') {\n sessionStorage.clear();\n }\n }\n\n const everyone: Person[] = [];\n\n // Fetch the ancestors of the input person and ancestors of his/her spouses.\n const firstPerson = await getRelatives([key], handleCors);\n if (!firstPerson[0]?.Name) {\n const id = key;\n throw new TopolaError(\n 'WIKITREE_PROFILE_NOT_ACCESSIBLE',\n `WikiTree profile ${id} is not accessible. Try logging in.`,\n {id},\n );\n }\n\n const spouseKeys = Object.values(firstPerson[0].Spouses || {}).map(\n (s) => s.Name,\n );\n const ancestors = await Promise.all(\n [key]\n .concat(spouseKeys)\n .map((personId) => getAncestors(personId, handleCors)),\n );\n const ancestorKeys = ancestors\n .flat()\n .map((person) => person.Name)\n .filter((key) => !!key);\n const ancestorDetails = await getRelatives(ancestorKeys, handleCors);\n\n // Map from person id to father id if the father profile is private.\n const privateFathers: Map = new Map();\n // Map from person id to mother id if the mother profile is private.\n const privateMothers: Map = new Map();\n\n // Andujst private individual ids so that there are no collisions in the case\n // that ancestors were collected for more than one person.\n ancestors.forEach((ancestorList, index) => {\n const offset = 1000 * index;\n // Adjust ids by offset.\n ancestorList.forEach((person) => {\n if (person.Id < 0) {\n person.Id -= offset;\n person.Name = `${PRIVATE_ID_PREFIX}${person.Id}`;\n }\n if (person.Father < 0) {\n person.Father -= offset;\n privateFathers.set(person.Id, person.Father);\n }\n if (person.Mother < 0) {\n person.Mother -= offset;\n privateMothers.set(person.Id, person.Mother);\n }\n });\n });\n\n // Set the Father and Mother fields again because getRelatives doesn't return\n // private parents.\n ancestorDetails.forEach((person) => {\n const privateFather = privateFathers.get(person.Id);\n if (privateFather) {\n person.Father = privateFather;\n }\n const privateMother = privateMothers.get(person.Id);\n if (privateMother) {\n person.Mother = privateMother;\n }\n });\n everyone.push(...ancestorDetails);\n\n // Collect private individuals.\n const privateAncestors = ancestors.flat().filter((person) => person.Id < 0);\n everyone.push(...privateAncestors);\n\n // Limit the number of generations of descendants because there may be tens of\n // generations for some profiles.\n const descendantGenerationLimit = 5;\n\n // Fetch descendants recursively.\n let toFetch = [key];\n let generation = 0;\n while (toFetch.length > 0 && generation <= descendantGenerationLimit) {\n const people = await getRelatives(toFetch, handleCors);\n everyone.push(...people);\n const allSpouses = people.flatMap((person) =>\n Object.values(person.Spouses || {}),\n );\n everyone.push(...allSpouses);\n // Fetch all children.\n toFetch = people.flatMap((person) =>\n Object.values(person.Children || {}).map((c) => c.Name),\n );\n generation++;\n }\n\n //Map from human-readable person id to person names\n const personNames = new Map<\n string,\n {birth?: string; married?: string; aka?: string}\n >();\n\n // Map from person id to the set of families where they are a spouse.\n const families = new Map>();\n // Map from family id to the set of children.\n const children = new Map>();\n // Map from famliy id to the spouses.\n const spouses = new Map<\n string,\n {wife?: number; husband?: number; spouse?: Person}\n >();\n // Map from numerical id to human-readable id.\n const idToName = new Map();\n // Map from human-readable person id to fullSizeUrl of person photo.\n const fullSizePhotoUrls: Map = new Map();\n\n everyone.forEach((person) => {\n idToName.set(person.Id, person.Name);\n if (person.Mother || person.Father) {\n const famId = getFamilyId(person.Mother, person.Father);\n getSet(families, person.Mother).add(famId);\n getSet(families, person.Father).add(famId);\n getSet(children, famId).add(person.Id);\n spouses.set(famId, {\n wife: person.Mother || undefined,\n husband: person.Father || undefined,\n });\n }\n });\n\n const indis: JsonIndi[] = [];\n\n const converted = new Set();\n everyone.forEach((person) => {\n if (converted.has(person.Id)) {\n return;\n }\n converted.add(person.Id);\n const indi = convertPerson(person, intl);\n if (person.PhotoData?.path) {\n fullSizePhotoUrls.set(\n person.Name,\n `https://www.wikitree.com${person.PhotoData.path}`,\n );\n }\n\n personNames.set(person.Name, convertPersonNames(person));\n\n if (person.Spouses) {\n Object.values(person.Spouses).forEach((spouse) => {\n const famId = getFamilyId(person.Id, spouse.Id);\n getSet(families, person.Id).add(famId);\n getSet(families, spouse.Id).add(famId);\n const familySpouses =\n person.Gender === 'Male'\n ? {wife: spouse.Id, husband: person.Id, spouse}\n : {wife: person.Id, husband: spouse.Id, spouse};\n spouses.set(famId, familySpouses);\n });\n }\n indi.fams = Array.from(getSet(families, person.Id));\n indis.push(indi);\n });\n\n const fams = Array.from(spouses.entries()).map(([key, value]) => {\n const fam: JsonFam = {\n id: key,\n };\n const wife = value.wife && idToName.get(value.wife);\n if (wife) {\n fam.wife = wife;\n }\n const husband = value.husband && idToName.get(value.husband);\n if (husband) {\n fam.husb = husband;\n }\n fam.children = Array.from(getSet(children, key)).map(\n (child) => idToName.get(child)!,\n );\n if (\n value.spouse &&\n ((value.spouse.marriage_date &&\n value.spouse.marriage_date !== '0000-00-00') ||\n value.spouse.marriage_location)\n ) {\n const parsedDate = parseDate(value.spouse.marriage_date);\n fam.marriage = Object.assign({}, parsedDate, {\n place: value.spouse.marriage_location,\n });\n }\n return fam;\n });\n\n const chartData = normalizeGedcom({indis, fams});\n const gedcom = buildGedcom(chartData, fullSizePhotoUrls, personNames);\n return {chartData, gedcom};\n}\n\n/** Creates a family identifier given 2 spouse identifiers. */\nfunction getFamilyId(spouse1: number, spouse2: number) {\n if (spouse2 > spouse1) {\n return `${spouse1}_${spouse2}`;\n }\n return `${spouse2}_${spouse1}`;\n}\n\nfunction convertPerson(person: Person, intl: IntlShape): JsonIndi {\n const indi: JsonIndi = {\n id: person.Name,\n };\n if (person.Name.startsWith(PRIVATE_ID_PREFIX)) {\n indi.hideId = true;\n indi.firstName = intl.formatMessage({\n id: 'wikitree.private',\n defaultMessage: 'Private',\n });\n }\n if (person.FirstName && person.FirstName !== 'Unknown') {\n indi.firstName = person.FirstName;\n } else if (person.RealName && person.RealName !== 'Unknown') {\n indi.firstName = person.RealName;\n }\n if (person.LastNameAtBirth !== 'Unknown') {\n indi.lastName = person.LastNameAtBirth;\n }\n if (person.Mother || person.Father) {\n indi.famc = getFamilyId(person.Mother, person.Father);\n }\n if (person.Gender === 'Male') {\n indi.sex = 'M';\n } else if (person.Gender === 'Female') {\n indi.sex = 'F';\n }\n if (\n (person.BirthDate && person.BirthDate !== '0000-00-00') ||\n person.BirthLocation ||\n person.BirthDateDecade !== 'unknown'\n ) {\n const parsedDate = parseDate(\n person.BirthDate,\n (person.DataStatus && person.DataStatus.BirthDate) || undefined,\n );\n const date = parsedDate || parseDecade(person.BirthDateDecade);\n indi.birth = Object.assign({}, date, {place: person.BirthLocation});\n }\n if (\n (person.DeathDate && person.DeathDate !== '0000-00-00') ||\n person.DeathLocation ||\n person.DeathDateDecade !== 'unknown'\n ) {\n const parsedDate = parseDate(\n person.DeathDate,\n (person.DataStatus && person.DataStatus.DeathDate) || undefined,\n );\n const date = parsedDate || parseDecade(person.DeathDateDecade);\n indi.death = Object.assign({}, date, {place: person.DeathLocation});\n }\n if (person.PhotoData) {\n indi.images = [\n {\n url: `https://www.wikitree.com${person.PhotoData.url}`,\n title: person.Photo,\n },\n ];\n }\n return indi;\n}\n\nfunction isSimilarName(name1: string, name2: string) {\n return StringUtils.compareSimilarityPercent(name1, name2) >= 75;\n}\n\nfunction getMarriedName(person: Person) {\n if (\n !person.Spouses ||\n person.LastNameCurrent === 'Unknown' ||\n person.LastNameCurrent === person.LastNameAtBirth\n ) {\n return undefined;\n }\n const nameParts = person.LastNameCurrent.split(/[- ,]/);\n // In some languages the same names can differ a bit between genders,\n // so regular equals comparison cannot be used.\n // To verify if spouse has the same name, person name is split to include\n // people with double names, then there is a check if any name part is\n // at least 75% similar to spouse name.\n const matchingNames = Object.entries(person.Spouses)\n .flatMap(([, spousePerson]) => spousePerson.LastNameAtBirth.split(/[- ,]/))\n .some((spousePersonNamePart) =>\n nameParts.some((personNamePart) =>\n isSimilarName(spousePersonNamePart, personNamePart),\n ),\n );\n return matchingNames ? person.LastNameCurrent : undefined;\n}\n\n/**\n * Resolve birth name, married name and aka name with following logic:\n * - birth name is always prioritized and is set if exists and is not unknown\n * - married name is based on LastNameCurrent and is set if it's different than\n * birth name and one of the spouses has it as their birth name\n * - aka name is based on LastNameOther and is set if it's different than others\n */\nfunction convertPersonNames(person: Person) {\n const birth =\n person.LastNameAtBirth !== 'Unknown' ? person.LastNameAtBirth : undefined;\n const married = getMarriedName(person);\n const aka =\n person.LastNameOther !== 'Unknown' &&\n person.LastNameAtBirth !== person.LastNameOther &&\n person.LastNameCurrent !== person.LastNameOther\n ? person.LastNameOther\n : undefined;\n return {birth, married, aka};\n}\n\n/**\n * Parses a date in the format returned by WikiTree and converts in to\n * the format defined by Topola.\n */\nfunction parseDate(date: string, dataStatus?: string): DateOrRange | undefined {\n if (!date) {\n return undefined;\n }\n const matchedDate = date.match(/(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)/);\n if (!matchedDate) {\n return {date: {text: date}};\n }\n const parsedDate: Date = {};\n if (matchedDate[1] !== '0000') {\n parsedDate.year = ~~matchedDate[1];\n }\n if (matchedDate[2] !== '00') {\n parsedDate.month = ~~matchedDate[2];\n }\n if (matchedDate[3] !== '00') {\n parsedDate.day = ~~matchedDate[3];\n }\n if (dataStatus === 'after') {\n return {dateRange: {from: parsedDate}};\n }\n if (dataStatus === 'before') {\n return {dateRange: {to: parsedDate}};\n }\n if (dataStatus === 'guess') {\n parsedDate.qualifier = 'abt';\n }\n return {date: parsedDate};\n}\n\nfunction parseDecade(decade: string): DateOrRange | undefined {\n return decade !== 'unknown' ? {date: {text: decade}} : undefined;\n}\n\nconst MONTHS = new Map([\n [1, 'JAN'],\n [2, 'FEB'],\n [3, 'MAR'],\n [4, 'APR'],\n [5, 'MAY'],\n [6, 'JUN'],\n [7, 'JUL'],\n [8, 'AUG'],\n [9, 'SEP'],\n [10, 'OCT'],\n [11, 'NOV'],\n [12, 'DEC'],\n]);\n\nfunction dateToGedcom(date: Date): string {\n return [date.qualifier, date.day, MONTHS.get(date.month!), date.year]\n .filter((x) => x !== undefined)\n .join(' ');\n}\n\nfunction dateOrRangeToGedcom(dateOrRange: DateOrRange): string {\n if (dateOrRange.date) {\n return dateToGedcom(dateOrRange.date);\n }\n if (!dateOrRange.dateRange) {\n return '';\n }\n if (dateOrRange.dateRange.from && dateOrRange.dateRange.to) {\n return `BET ${dateToGedcom(dateOrRange.dateRange.from)} AND ${\n dateOrRange.dateRange.to\n }`;\n }\n if (dateOrRange.dateRange.from) {\n return `AFT ${dateToGedcom(dateOrRange.dateRange.from)}`;\n }\n if (dateOrRange.dateRange.to) {\n return `BEF ${dateToGedcom(dateOrRange.dateRange.to)}`;\n }\n return '';\n}\n\nfunction nameToGedcom(type: string, firstName?: string, lastName?: string) {\n return {\n level: 1,\n pointer: '',\n tag: 'NAME',\n data: `${firstName || ''} /${lastName || ''}/`,\n tree: [\n {\n level: 2,\n pointer: '',\n tag: 'TYPE',\n data: type,\n tree: [],\n },\n ],\n };\n}\n\nfunction eventToGedcom(event: JsonEvent): GedcomEntry[] {\n const result = [];\n if (isValidDateOrRange(event)) {\n result.push({\n level: 2,\n pointer: '',\n tag: 'DATE',\n data: dateOrRangeToGedcom(event),\n tree: [],\n });\n }\n if (event.place) {\n result.push({\n level: 2,\n pointer: '',\n tag: 'PLAC',\n data: event.place,\n tree: [],\n });\n }\n return result;\n}\n\nfunction imageToGedcom(\n image: JsonImage,\n fullSizePhotoUrl: string | undefined,\n): GedcomEntry[] {\n return [\n {\n level: 2,\n pointer: '',\n tag: 'FILE',\n data: fullSizePhotoUrl || image.url,\n tree: [\n {\n level: 3,\n pointer: '',\n tag: 'FORM',\n data: image.title?.split('.').pop() || '',\n tree: [],\n },\n {\n level: 3,\n pointer: '',\n tag: 'TITL',\n data: image.title?.split('.')[0] || '',\n tree: [],\n },\n ],\n },\n ];\n}\n\nfunction indiToGedcom(\n indi: JsonIndi,\n fullSizePhotoUrl: Map,\n personNames: {birth?: string; married?: string; aka?: string},\n): GedcomEntry {\n // WikiTree URLs replace spaces with underscores.\n const escapedId = indi.id.replace(/ /g, '_');\n const record: GedcomEntry = {\n level: 0,\n pointer: `@${indi.id}@`,\n tag: 'INDI',\n data: '',\n tree: [],\n };\n\n if (personNames.birth) {\n record.tree.push(nameToGedcom('birth', indi.firstName, personNames.birth));\n }\n if (personNames.married) {\n record.tree.push(\n nameToGedcom('married', indi.firstName, personNames.married),\n );\n }\n if (personNames.aka) {\n record.tree.push(nameToGedcom('aka', indi.firstName, personNames.aka));\n }\n\n if (indi.birth) {\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'BIRT',\n data: '',\n tree: eventToGedcom(indi.birth),\n });\n }\n if (indi.death) {\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'DEAT',\n data: '',\n tree: eventToGedcom(indi.death),\n });\n }\n if (indi.famc) {\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'FAMC',\n data: `@${indi.famc}@`,\n tree: [],\n });\n }\n (indi.fams || []).forEach((fams) =>\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'FAMS',\n data: `@${fams}@`,\n tree: [],\n }),\n );\n if (!indi.id.startsWith('~')) {\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'WWW',\n data: `https://www.wikitree.com/wiki/${escapedId}`,\n tree: [],\n });\n }\n (indi.images || []).forEach((image) => {\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'OBJE',\n data: '',\n tree: imageToGedcom(image, fullSizePhotoUrl.get(indi.id)),\n });\n });\n return record;\n}\n\nfunction famToGedcom(fam: JsonFam): GedcomEntry {\n const record: GedcomEntry = {\n level: 0,\n pointer: `@${fam.id}@`,\n tag: 'FAM',\n data: '',\n tree: [],\n };\n if (fam.wife) {\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'WIFE',\n data: `@${fam.wife}@`,\n tree: [],\n });\n }\n if (fam.husb) {\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'HUSB',\n data: `@${fam.husb}@`,\n tree: [],\n });\n }\n (fam.children || []).forEach((child) =>\n record.tree.push({\n level: 1,\n pointer: child,\n tag: 'CHILD',\n data: '',\n tree: [],\n }),\n );\n if (fam.marriage) {\n record.tree.push({\n level: 1,\n pointer: '',\n tag: 'MARR',\n data: '',\n tree: eventToGedcom(fam.marriage),\n });\n }\n return record;\n}\n\n/**\n * Creates a GEDCOM structure for the purpose of displaying the details\n * panel.\n */\nfunction buildGedcom(\n data: JsonGedcomData,\n fullSizePhotoUrls: Map,\n personNames: Map,\n): GedcomData {\n const gedcomIndis: {[key: string]: GedcomEntry} = {};\n const gedcomFams: {[key: string]: GedcomEntry} = {};\n data.indis.forEach((indi) => {\n gedcomIndis[indi.id] = indiToGedcom(\n indi,\n fullSizePhotoUrls,\n personNames.get(indi.id) || {},\n );\n });\n data.fams.forEach((fam) => {\n gedcomFams[fam.id] = famToGedcom(fam);\n });\n\n return {\n head: {level: 0, pointer: '', tag: 'HEAD', data: '', tree: []},\n indis: gedcomIndis,\n fams: gedcomFams,\n other: {},\n };\n}\n\n/**\n * Returns a set which is a value from a SetMultimap. If the key doesn't exist,\n * an empty set is added to the map.\n */\nfunction getSet(map: Map>, key: K): Set {\n const set = map.get(key);\n if (set) {\n return set;\n }\n const newSet = new Set();\n map.set(key, newSet);\n return newSet;\n}\n\nexport interface WikiTreeSourceSpec {\n source: DataSourceEnum.WIKITREE;\n authcode?: string;\n}\n\n/** Loading data from the WikiTree API. */\nexport class WikiTreeDataSource implements DataSource {\n constructor(private intl: IntlShape) {}\n\n isNewData(\n newSource: SourceSelection,\n oldSource: SourceSelection,\n data?: TopolaData,\n ): boolean {\n if (!newSource.selection) {\n return false;\n }\n if (oldSource.selection?.id === newSource.selection.id) {\n // Selection unchanged -> don't reload.\n return false;\n }\n if (\n data &&\n data.chartData.indis.some((indi) => indi.id === newSource.selection?.id)\n ) {\n // New selection exists in current view -> animate instead of reloading.\n return false;\n }\n return true;\n }\n\n async loadData(\n source: SourceSelection,\n ): Promise {\n if (!source.selection) {\n throw new TopolaError(\n 'WIKITREE_ID_NOT_PROVIDED',\n 'WikiTree id needs to be provided',\n );\n }\n try {\n const data = await loadWikiTree(\n source.selection.id,\n this.intl,\n source.spec.authcode,\n );\n analyticsEvent('wikitree_loaded');\n return data;\n } catch (error) {\n analyticsEvent('wikitree_error');\n throw error;\n }\n }\n}\n","import * as H from 'history';\nimport * as queryString from 'query-string';\nimport {analyticsEvent} from './util/analytics';\nimport {Changelog} from './changelog';\nimport {DataSourceEnum, SourceSelection} from './datasource/data_source';\nimport {Details} from './details/details';\nimport {EmbeddedDataSource, EmbeddedSourceSpec} from './datasource/embedded';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {getI18nMessage} from './util/error_i18n';\nimport {IndiInfo} from 'topola';\nimport {Intro} from './intro';\nimport {Loader, Message, Portal, Tab} from 'semantic-ui-react';\nimport {Media} from './util/media';\nimport {Redirect, Route, Switch} from 'react-router-dom';\nimport {TopBar} from './menu/top_bar';\nimport {TopolaData} from './util/gedcom_util';\nimport {useEffect, useState} from 'react';\nimport {useHistory, useLocation} from 'react-router';\nimport {idToIndiMap} from './util/gedcom_util';\nimport {\n Chart,\n ChartType,\n downloadPdf,\n downloadPng,\n downloadSvg,\n printChart,\n} from './chart';\nimport {\n argsToConfig,\n Config,\n ConfigPanel,\n configToArgs,\n DEFALUT_CONFIG,\n Ids,\n Sex,\n} from './config';\nimport {\n getSelection,\n UploadSourceSpec,\n UrlSourceSpec,\n GedcomUrlDataSource,\n UploadedDataSource,\n} from './datasource/load_data';\nimport {\n loadWikiTree,\n PRIVATE_ID_PREFIX,\n WikiTreeDataSource,\n WikiTreeSourceSpec,\n} from './datasource/wikitree';\n\n/** Shows an error message in the middle of the screen. */\nfunction ErrorMessage(props: {message?: string}) {\n return (\n \n \n \n \n

{props.message}

\n
\n );\n}\n\ninterface ErrorPopupProps {\n message?: string;\n open: boolean;\n onDismiss: () => void;\n}\n\n/**\n * Shows a dismissable error message in the bottom left corner of the screen.\n */\nfunction ErrorPopup(props: ErrorPopupProps) {\n return (\n \n \n \n \n \n

{props.message}

\n
\n
\n );\n}\n\nenum AppState {\n INITIAL,\n LOADING,\n ERROR,\n SHOWING_CHART,\n LOADING_MORE,\n}\n\ntype DataSourceSpec =\n | UrlSourceSpec\n | UploadSourceSpec\n | WikiTreeSourceSpec\n | EmbeddedSourceSpec;\n\n/**\n * Arguments passed to the application, primarily through URL parameters.\n * Non-optional arguments get populated with default values.\n */\ninterface Arguments {\n sourceSpec?: DataSourceSpec;\n selection?: IndiInfo;\n chartType: ChartType;\n standalone: boolean;\n showWikiTreeMenus: boolean;\n freezeAnimation: boolean;\n showSidePanel: boolean;\n config: Config;\n}\n\n/**\n * Retrieve arguments passed into the application through the URL and uploaded\n * data.\n */\nfunction getArguments(location: H.Location): Arguments {\n const search = queryString.parse(location.search);\n const getParam = (name: string) => {\n const value = search[name];\n return typeof value === 'string' ? value : undefined;\n };\n\n const view = getParam('view');\n const chartTypes = new Map([\n ['relatives', ChartType.Relatives],\n ['fancy', ChartType.Fancy],\n ]);\n\n const hash = getParam('file');\n const url = getParam('url');\n const embedded = getParam('embedded') === 'true'; // False by default.\n var sourceSpec: DataSourceSpec | undefined = undefined;\n if (getParam('source') === 'wikitree') {\n sourceSpec = {\n source: DataSourceEnum.WIKITREE,\n authcode: getParam('authcode'),\n };\n } else if (hash) {\n sourceSpec = {\n source: DataSourceEnum.UPLOADED,\n hash,\n gedcom: location.state && location.state.data,\n images: location.state && location.state.images,\n };\n } else if (url) {\n sourceSpec = {\n source: DataSourceEnum.GEDCOM_URL,\n url,\n handleCors: getParam('handleCors') !== 'false', // True by default.\n };\n } else if (embedded) {\n sourceSpec = {source: DataSourceEnum.EMBEDDED};\n }\n\n const indi = getParam('indi');\n const parsedGen = Number(getParam('gen'));\n const selection = indi\n ? {id: indi, generation: !isNaN(parsedGen) ? parsedGen : 0}\n : undefined;\n\n return {\n sourceSpec,\n selection,\n // Hourglass is the default view.\n chartType: chartTypes.get(view) || ChartType.Hourglass,\n\n showSidePanel: getParam('sidePanel') !== 'false', // True by default.\n standalone: getParam('standalone') !== 'false' && !embedded,\n showWikiTreeMenus: getParam('showWikiTreeMenus') !== 'false', // True by default.\n freezeAnimation: getParam('freeze') === 'true', // False by default\n config: argsToConfig(search),\n };\n}\n\nexport function App() {\n /** State of the application. */\n const [state, setState] = useState(AppState.INITIAL);\n /** Loaded data. */\n const [data, setData] = useState();\n /** Selected individual. */\n const [selection, setSelection] = useState();\n /** Error to display. */\n const [error, setError] = useState();\n /** Whether the side panel is shown. */\n const [showSidePanel, setShowSidePanel] = useState(false);\n /** Whether the app is in standalone mode, i.e. showing 'open file' menus. */\n const [standalone, setStandalone] = useState(true);\n /**\n * Whether the app should display WikiTree-specific menus when showing data\n * from WikiTree.\n */\n const [showWikiTreeMenus, setShowWikiTreeMenus] = useState(true);\n /** Type of displayed chart. */\n const [chartType, setChartType] = useState(ChartType.Hourglass);\n /** Whether to show the error popup. */\n const [showErrorPopup, setShowErrorPopup] = useState(false);\n /** Specification of the source of the data. */\n const [sourceSpec, setSourceSpec] = useState();\n /** Freeze animations after initial chart render. */\n const [freezeAnimation, setFreezeAnimation] = useState(false);\n const [config, setConfig] = useState(DEFALUT_CONFIG);\n\n const intl = useIntl();\n const history = useHistory();\n const location = useLocation();\n\n /** Sets the state with a new individual selection and chart type. */\n function updateDisplay(newSelection: IndiInfo) {\n if (\n !selection ||\n selection.id !== newSelection.id ||\n selection!.generation !== newSelection.generation\n ) {\n setSelection(newSelection);\n }\n }\n\n function toggleDetails(config: Config, data: TopolaData | undefined) {\n if (data === undefined) {\n return;\n }\n let shouldHideIds = config.id === Ids.HIDE;\n let shouldHideSex = config.sex === Sex.HIDE;\n let indiMap = idToIndiMap(data.chartData);\n indiMap.forEach((indi) => {\n indi.hideId = shouldHideIds;\n indi.hideSex = shouldHideSex;\n });\n }\n\n /** Sets error message after data load failure. */\n function setErrorMessage(message: string) {\n setError(message);\n setState(AppState.ERROR);\n }\n\n const uploadedDataSource = new UploadedDataSource();\n const gedcomUrlDataSource = new GedcomUrlDataSource();\n const wikiTreeDataSource = new WikiTreeDataSource(intl);\n const embeddedDataSource = new EmbeddedDataSource();\n\n function isNewData(newSourceSpec: DataSourceSpec, newSelection?: IndiInfo) {\n if (!sourceSpec || sourceSpec.source !== newSourceSpec.source) {\n // New data source means new data.\n return true;\n }\n const newSource = {spec: newSourceSpec, selection: newSelection};\n const oldSouce = {\n spec: sourceSpec,\n selection: selection,\n };\n switch (newSource.spec.source) {\n case DataSourceEnum.UPLOADED:\n return uploadedDataSource.isNewData(\n newSource as SourceSelection,\n oldSouce as SourceSelection,\n data,\n );\n case DataSourceEnum.GEDCOM_URL:\n return gedcomUrlDataSource.isNewData(\n newSource as SourceSelection,\n oldSouce as SourceSelection,\n data,\n );\n case DataSourceEnum.WIKITREE:\n return wikiTreeDataSource.isNewData(\n newSource as SourceSelection,\n oldSouce as SourceSelection,\n data,\n );\n case DataSourceEnum.EMBEDDED:\n return embeddedDataSource.isNewData(\n newSource as SourceSelection,\n oldSouce as SourceSelection,\n data,\n );\n }\n }\n\n function loadData(newSourceSpec: DataSourceSpec, newSelection?: IndiInfo) {\n switch (newSourceSpec.source) {\n case DataSourceEnum.UPLOADED:\n return uploadedDataSource.loadData({\n spec: newSourceSpec,\n selection: newSelection,\n });\n case DataSourceEnum.GEDCOM_URL:\n return gedcomUrlDataSource.loadData({\n spec: newSourceSpec,\n selection: newSelection,\n });\n case DataSourceEnum.WIKITREE:\n return wikiTreeDataSource.loadData({\n spec: newSourceSpec,\n selection: newSelection,\n });\n case DataSourceEnum.EMBEDDED:\n return embeddedDataSource.loadData({\n spec: newSourceSpec,\n selection: newSelection,\n });\n }\n }\n\n useEffect(() => {\n (async () => {\n if (location.pathname !== '/view') {\n if (state !== AppState.INITIAL) {\n setState(AppState.INITIAL);\n }\n return;\n }\n\n const args = getArguments(location);\n\n if (!args.sourceSpec) {\n history.replace({pathname: '/'});\n return;\n }\n\n if (\n state === AppState.INITIAL ||\n isNewData(args.sourceSpec, args.selection)\n ) {\n // Set loading state.\n setState(AppState.LOADING);\n // Set state from URL parameters.\n setSourceSpec(args.sourceSpec);\n setSelection(args.selection);\n setStandalone(args.standalone);\n setShowWikiTreeMenus(args.showWikiTreeMenus);\n setChartType(args.chartType);\n setFreezeAnimation(args.freezeAnimation);\n setConfig(args.config);\n try {\n const data = await loadData(args.sourceSpec, args.selection);\n // Set state with data.\n setData(data);\n toggleDetails(args.config, data);\n setShowSidePanel(args.showSidePanel);\n setState(AppState.SHOWING_CHART);\n } catch (error: any) {\n setErrorMessage(getI18nMessage(error, intl));\n }\n } else if (\n state === AppState.SHOWING_CHART ||\n state === AppState.LOADING_MORE\n ) {\n // Update selection if it has changed in the URL.\n const loadMoreFromWikitree =\n args.sourceSpec.source === DataSourceEnum.WIKITREE &&\n (!selection || selection.id !== args.selection?.id);\n setChartType(args.chartType);\n setState(\n loadMoreFromWikitree ? AppState.LOADING_MORE : AppState.SHOWING_CHART,\n );\n updateDisplay(args.selection!);\n if (loadMoreFromWikitree) {\n try {\n const data = await loadWikiTree(args.selection!.id, intl);\n const newSelection = getSelection(data.chartData, args.selection);\n setData(data);\n setSelection(newSelection);\n setState(AppState.SHOWING_CHART);\n } catch (error: any) {\n setState(AppState.SHOWING_CHART);\n displayErrorPopup(\n intl.formatMessage(\n {\n id: 'error.failed_wikitree_load_more',\n defaultMessage: 'Failed to load data from WikiTree. {error}',\n },\n {error},\n ),\n );\n }\n }\n }\n })();\n });\n\n function updateUrl(args: queryString.ParsedQuery) {\n const search = queryString.parse(location.search);\n for (const key in args) {\n search[key] = args[key];\n }\n location.search = queryString.stringify(search);\n history.push(location);\n }\n\n /**\n * Called when the user clicks an individual box in the chart.\n * Updates the browser URL.\n */\n function onSelection(selection: IndiInfo) {\n // Don't allow selecting WikiTree private profiles.\n if (selection.id.startsWith(PRIVATE_ID_PREFIX)) {\n return;\n }\n analyticsEvent('selection_changed');\n updateUrl({\n indi: selection.id,\n gen: selection.generation,\n });\n }\n\n function onPrint() {\n analyticsEvent('print');\n printChart();\n }\n\n function displayErrorPopup(message: string) {\n setShowErrorPopup(true);\n setError(message);\n }\n\n async function onDownloadPdf() {\n analyticsEvent('download_pdf');\n try {\n await downloadPdf();\n } catch (e) {\n displayErrorPopup(\n intl.formatMessage({\n id: 'error.failed_pdf',\n defaultMessage:\n 'Failed to generate PDF file.' +\n ' Please try with a smaller diagram or download an SVG file.',\n }),\n );\n }\n }\n\n async function onDownloadPng() {\n analyticsEvent('download_png');\n try {\n await downloadPng();\n } catch (e) {\n displayErrorPopup(\n intl.formatMessage({\n id: 'error.failed_png',\n defaultMessage:\n 'Failed to generate PNG file.' +\n ' Please try with a smaller diagram or download an SVG file.',\n }),\n );\n }\n }\n\n function onDownloadSvg() {\n analyticsEvent('download_svg');\n downloadSvg();\n }\n\n function onDismissErrorPopup() {\n setShowErrorPopup(false);\n }\n\n function renderMainArea() {\n switch (state) {\n case AppState.SHOWING_CHART:\n case AppState.LOADING_MORE:\n const updatedSelection = getSelection(data!.chartData, selection);\n const sidePanelTabs = [\n {\n menuItem: intl.formatMessage({\n id: 'tab.info',\n defaultMessage: 'Info',\n }),\n render: () => (\n
\n ),\n },\n {\n menuItem: intl.formatMessage({\n id: 'tab.settings',\n defaultMessage: 'Settings',\n }),\n render: () => (\n {\n setConfig(config);\n toggleDetails(config, data);\n updateUrl(configToArgs(config));\n }}\n />\n ),\n },\n ];\n return (\n
\n \n {state === AppState.LOADING_MORE ? (\n \n ) : null}\n \n {showSidePanel ? (\n \n \n \n ) : null}\n \n
\n );\n\n case AppState.ERROR:\n return ;\n\n case AppState.INITIAL:\n case AppState.LOADING:\n return ;\n }\n }\n\n return (\n <>\n (\n \n )}\n />\n \n \n \n \n \n \n );\n}\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport messages_cs from './translations/cs.json';\nimport messages_de from './translations/de.json';\nimport messages_fr from './translations/fr.json';\nimport messages_it from './translations/it.json';\nimport messages_pl from './translations/pl.json';\nimport messages_ru from './translations/ru.json';\nimport {App} from './app';\nimport {detect} from 'detect-browser';\nimport {HashRouter as Router, Route} from 'react-router-dom';\nimport {IntlProvider} from 'react-intl';\nimport {MediaContextProvider, mediaStyles} from './util/media';\nimport './index.css';\nimport 'semantic-ui-css/semantic.min.css';\nimport 'canvas-toBlob';\n\nconst messages = {\n cs: messages_cs,\n de: messages_de,\n fr: messages_fr,\n it: messages_it,\n pl: messages_pl,\n ru: messages_ru,\n};\nconst language = navigator.language && navigator.language.split(/[-_]/)[0];\n\nconst browser = detect();\n\nif (browser && browser.name === 'ie') {\n ReactDOM.render(\n

\n Topola Genealogy Viewer does not support Internet Explorer. Please try a\n different (modern) browser.\n

,\n document.querySelector('#root'),\n );\n} else {\n ReactDOM.render(\n \n \n \n \n \n \n \n ,\n document.querySelector('#root'),\n );\n}\n"],"sourceRoot":""} \ No newline at end of file