{"version":3,"sources":["../../src/utils/gedcom-converter.ts"],"names":["parentId"],"mappings":";;;AAmBA,SAAS,yBAAyB,GAAA,EAAqB;AAEtD,EAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,yBAAyB,CAAA,EAAG;AAC7C,IAAA,OAAO,GAAA;AAAA,EACR;AAGA,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,mBAAmB,IAAI,CAAC,CAAA;AACnD,EAAA,IAAI,CAAC,QAAA,EAAU;AACd,IAAA,OAAO,GAAA;AAAA,EACR;AAGA,EAAA,IAAI,OAAA,GAAU,8BAAA;AAEd,EAAA,IACC,IAAI,QAAA,CAAS,8BAA8B,KAC3C,GAAA,CAAI,QAAA,CAAS,4BAA4B,CAAA,EACxC;AACD,IAAA,OAAA,GAAU,sCAAA;AAAA,EACX,CAAA,MAAA,IACC,IAAI,QAAA,CAAS,uBAAuB,KACpC,GAAA,CAAI,QAAA,CAAS,0BAA0B,CAAA,EACtC;AACD,IAAA,OAAA,GAAU,+BAAA;AAAA,EACX;AAEA,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA;AAC1C;AAsBA,SAAS,mBAAmB,GAAA,EAAqB;AAChD,EAAA,IAAI,CAAC,KAAK,OAAO,GAAA;AAGjB,EAAA,IAAI,CAAC,IAAI,QAAA,CAAS,YAAY,KAAK,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,EAAG;AACxD,IAAA,OAAO,GAAA;AAAA,EACR;AAGA,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,sBAAsB,CAAA;AACjD,EAAA,IAAI,CAAC,QAAA,EAAU;AACd,IAAA,OAAO,GAAA;AAAA,EACR;AAEA,EAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AAGxB,EAAA,IAAI,OAAA,GAAU,8BAAA;AAEd,EAAA,IACC,IAAI,QAAA,CAAS,8BAA8B,KAC3C,GAAA,CAAI,QAAA,CAAS,4BAA4B,CAAA,EACxC;AACD,IAAA,OAAA,GAAU,sCAAA;AAAA,EACX,CAAA,MAAA,IACC,IAAI,QAAA,CAAS,uBAAuB,KACpC,GAAA,CAAI,QAAA,CAAS,0BAA0B,CAAA,EACtC;AACD,IAAA,OAAA,GAAU,+BAAA;AAAA,EACX;AAEA,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAC3B;AAKA,SAAS,YAAY,MAAA,EAAoC;AACxD,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAGpB,EAAA,IAAI,OAAO,KAAA,GAAQ,CAAC,CAAA,EAAG,SAAA,GAAY,CAAC,CAAA,EAAG;AACtC,IAAA,MAAM,WAAW,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,CAAE,UAAU,CAAC,CAAA;AAG5C,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,IAAS,EAAC;AACjC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,QAAA,CAAS,OAAO,CAAC,CAAA,EAAG,KAAA,IAAS,EAAA;AACrE,IAAA,MAAM,OAAA,GACL,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,QAAA,CAAS,SAAS,CAAC,CAAA,EAAG,KAAA,IAAS,EAAA;AAE1D,IAAA,IAAI,SAAS,OAAA,EAAS;AACrB,MAAA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,OAAO,IAAI,IAAA,EAAK;AAAA,IACrC;AAEA,IAAA,IAAI,SAAS,QAAA,EAAU;AACtB,MAAA,OAAO,QAAA,CAAS,QAAA;AAAA,IACjB;AAAA,EACD;AAGA,EAAA,IAAI,MAAA,CAAO,SAAS,IAAA,EAAM;AACzB,IAAA,OAAO,OAAO,OAAA,CAAQ,IAAA;AAAA,EACvB;AAEA,EAAA,OAAO,IAAA;AACR;AAKA,SAAS,cAAc,MAAA,EAAoC;AAC1D,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1C,IAAA,OAAO,GAAA;AAAA,EACR,WAAW,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,QAAA,CAAS,QAAQ,CAAA,EAAG;AACnD,IAAA,OAAO,GAAA;AAAA,EACR,CAAA,MAAA,IAAW,MAAA,CAAO,OAAA,EAAS,MAAA,KAAW,MAAA,EAAQ;AAC7C,IAAA,OAAO,GAAA;AAAA,EACR,CAAA,MAAA,IAAW,MAAA,CAAO,OAAA,EAAS,MAAA,KAAW,QAAA,EAAU;AAC/C,IAAA,OAAO,GAAA;AAAA,EACR;AAEA,EAAA,OAAO,IAAA;AACR;AAKA,SAAS,WAAA,CACR,QACA,QAAA,EAC2C;AAC3C,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,SAA4C,EAAC;AAGnD,EAAA,MAAM,WAAA,GAAc,CAAA,mBAAA,EAAsB,QAAA,KAAa,OAAA,GAAU,UAAU,OAAO,CAAA,CAAA;AAClF,EAAA,MAAM,IAAA,GAAO,OAAO,KAAA,EAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,WAAW,CAAA;AAE7D,EAAA,IAAI,IAAA,EAAM;AACT,IAAA,IAAI,IAAA,CAAK,IAAA,EAAM,MAAA,IAAU,IAAA,CAAK,MAAM,QAAA,EAAU;AAC7C,MAAA,MAAA,CAAO,QAAQ,IAAA,CAAK,IAAA,EAAM,MAAA,IAAU,IAAA,CAAK,MAAM,QAAA,GAAW,OAAA;AAAA,QACzD,SAAA;AAAA,QACA;AAAA,OACD;AAAA,IACD;AACA,IAAA,IAAI,IAAA,CAAK,OAAO,QAAA,EAAU;AACzB,MAAA,MAAA,CAAO,KAAA,GAAQ,KAAK,KAAA,CAAM,QAAA;AAAA,IAC3B;AAAA,EACD;AAGA,EAAA,IAAI,aAAa,OAAA,EAAS;AACzB,IAAA,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,OAAA,EAAS,SAAA;AAC7C,IAAA,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,OAAA,EAAS,UAAA;AAAA,EAChD,CAAA,MAAA,IAAW,aAAa,OAAA,EAAS;AAChC,IAAA,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,OAAA,EAAS,SAAA;AAC7C,IAAA,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,OAAA,EAAS,UAAA;AAAA,EAChD;AAEA,EAAA,OAAO,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,KAAA,GAAQ,MAAA,GAAS,IAAA;AAC/C;AAKA,SAAS,oBAAoB,IAAA,EAAoB;AAChD,EAAA,MAAM,MAAA,GAAS;AAAA,IACd,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACD;AAEA,EAAA,MAAM,GAAA,GAAM,KAAK,OAAA,EAAQ;AACzB,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,QAAA,EAAU,CAAA;AACpC,EAAA,MAAM,IAAA,GAAO,KAAK,WAAA,EAAY;AAE9B,EAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,IAAI,IAAI,CAAA,CAAA;AAC/B;AAKA,SAAS,oBAAoB,IAAA,EAA4B;AACxD,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAM,OAAO,KAAA;AAGvB,EAAA,MAAM,OAAA,GAAkC;AAAA,IACvC,2BAAA,EAA6B,MAAA;AAAA,IAC7B,gCAAA,EAAkC,KAAA;AAAA,IAClC,4BAAA,EAA8B,MAAA;AAAA,IAC9B,6BAAA,EAA+B,MAAA;AAAA,IAC/B,4BAAA,EAA8B,KAAA;AAAA,IAC9B,8BAAA,EAAgC,MAAA;AAAA,IAChC,+BAAA,EAAiC,MAAA;AAAA,IACjC,gCAAA,EAAkC,MAAA;AAAA,IAClC,+BAAA,EAAiC,MAAA;AAAA,IACjC,mCAAA,EAAqC,MAAA;AAAA,IACrC,2BAAA,EAA6B;AAAA,GAC9B;AAEA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,IAAK,MAAA;AAGxC,EAAA,IAAI,SAAA,KAAc,MAAA,IAAU,IAAA,CAAK,KAAA,EAAO;AACvC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA,EAClC,CAAA,MAAO;AACN,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,IAAA,CAAK,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM;AACjC,IAAA,MAAM,MAAA,GAAS,wBAAA,CAAyB,IAAA,CAAK,KAAA,CAAM,WAAW,IAAI,CAAA;AAClE,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,CAAA;AAAA,EAClC;AAGA,EAAA,IAAI,IAAA,CAAK,IAAA,EAAM,MAAA,IAAU,IAAA,CAAK,MAAM,QAAA,EAAU;AAC7C,IAAA,KAAA,CAAM,IAAA;AAAA,MACL,CAAA,OAAA,EAAA,CAAW,IAAA,CAAK,IAAA,EAAM,MAAA,IAAU,IAAA,CAAK,MAAM,QAAA,GAAW,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAC,CAAA;AAAA,KAC7E;AAAA,EACD;AAGA,EAAA,IAAI,IAAA,CAAK,OAAO,QAAA,EAAU;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC3C;AAGA,EAAA,IAAI,IAAA,CAAK,KAAA,IAAS,SAAA,KAAc,MAAA,EAAQ;AACvC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,KAAA;AACR;AAwCO,SAAS,eAAA,CACf,YAAA,EACA,OAAA,GAAmC,EAAC,EAC3B;AACT,EAAA,MAAM;AAAA,IACL,QAAA,GAAW,qBAAA;AAAA,IACX,YAAA,GAAe,IAAA;AAAA,IACf,YAAA,GAAe,IAAA;AAAA,IACf,WAAA,GAAc;AAAA,GACf,GAAI,OAAA;AAEJ,EAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,YAAA,CAAa,OAAA,EAAS;AAC3C,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,EAAA,KAAA,CAAM,KAAK,qBAAqB,CAAA;AAChC,EAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,EAAA,KAAA,CAAM,KAAK,yBAAyB,CAAA;AACpC,EAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,EAAA,KAAA,CAAM,KAAK,SAAA,GAAY,mBAAA,iBAAoB,IAAI,IAAA,EAAM,CAAC,CAAA;AACtD,EAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAC3B,EAAA,KAAA,CAAM,IAAA,CAAK,YAAY,QAAQ,CAAA;AAC/B,EAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,EAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,EAAA,KAAA,CAAM,KAAK,uBAAuB,CAAA;AAClC,EAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AAGzB,EAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAK3B,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA+B;AACrD,EAAA,IAAI,aAAA,GAAgB,CAAA;AAGpB,EAAA,YAAA,CAAa,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AACxC,IAAA,MAAM,kBAAA,GAAqB,OAAO,WAAA,EAAa,kBAAA;AAE/C,IAAA,IAAI,kBAAA,IAAsB,KAAA,CAAM,OAAA,CAAQ,kBAAkB,CAAA,EAAG;AAC5D,MAAA,kBAAA,CAAmB,OAAA,CAAQ,CAAC,MAAA,KAAW;AACtC,QAAA,IAAI,OAAO,EAAA,IAAM,CAAC,UAAU,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAG;AAC3C,UAAA,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,MAAM,CAAA;AAAA,QAChC;AAAA,MACD,CAAC,CAAA;AAAA,IACF;AAAA,EACD,CAAC,CAAA;AAGD,EAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC7B,IAAA,MAAM,QAAA,GAAW,KAAK,aAAA,EAAe,CAAA,CAAA,CAAA;AAErC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,QAAQ,CAAA,KAAA,CAAO,CAAA;AAG/B,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,GAAS,CAAC,GAAG,KAAA,IAAS,qBAAA;AAC3C,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAA;AAG5B,IAAA,IAAI,MAAA,CAAO,SAAA,GAAY,CAAC,CAAA,EAAG,KAAA,EAAO;AACjC,MAAA,KAAA,CAAM,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,UAAU,CAAC,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IACjD;AAGA,IAAA,IAAI,OAAO,KAAA,EAAO;AACjB,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAA;AAC9C,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,OAAO,YAAA,EAAc;AACxB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,sBAAA,EAAyB,MAAA,CAAO,YAAY,CAAA,CAAE,CAAA;AAAA,IAC1D;AAAA,EACD,CAAC,CAAA;AAOD,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,EAAA,YAAA,CAAa,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,KAAA,KAAU;AAC/C,IAAA,MAAM,QAAA,GAAW,CAAA,EAAA,EAAK,KAAA,GAAQ,CAAC,CAAA,CAAA,CAAA;AAC/B,IAAA,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,QAAQ,CAAA;AAAA,EACpC,CAAC,CAAA;AAGD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAGnB;AACF,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAsB;AAKjD,EAAA,MAAM,gBAAA,GAAmC;AAAA,IACxC,GAAI,YAAA,CAAa,aAAA,IAAiB;AAAC,GACpC;AAGA,EAAA,YAAA,CAAa,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AACxC,IAAA,MAAM,mBAAA,GAAsB,OAAO,WAAA,EAChC,aAAA;AAEH,IAAA,IAAI,mBAAA,IAAuB,KAAA,CAAM,OAAA,CAAQ,mBAAmB,CAAA,EAAG;AAC9D,MAAA,mBAAA,CAAoB,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACpC,QAAA,MAAM,MAAA,GAAS,iBAAiB,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,IAAI,EAAE,CAAA;AAC3D,QAAA,IAAI,CAAC,MAAA,EAAQ;AACZ,UAAA,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAAA,QAC1B;AAAA,MACD,CAAC,CAAA;AAAA,IACF;AAGA,IAAA,MAAM,mBAAA,GAAsB,OAAO,WAAA,EAChC,4BAAA;AAOH,IAAA,IAAI,mBAAA,IAAuB,KAAA,CAAM,OAAA,CAAQ,mBAAmB,CAAA,EAAG;AAC9D,MAAA,mBAAA,CAAoB,OAAA,CAAQ,CAAC,MAAA,KAAW;AAEvC,QAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,KAAA,EAAO;AACnC,UAAA,MAAM,GAAA,GAAoB;AAAA,YACzB,EAAA,EAAI,CAAA,EAAG,MAAA,CAAO,EAAE,CAAA,GAAA,CAAA;AAAA,YAChB,IAAA,EAAM,gCAAA;AAAA,YACN,OAAA,EAAS,EAAE,UAAA,EAAY,MAAA,CAAO,QAAQ,UAAA,EAAW;AAAA,YACjD,OAAA,EAAS,EAAE,UAAA,EAAY,MAAA,CAAO,MAAM,UAAA,EAAW;AAAA,YAC/C,OAAA,EAAS,OAAO,OAAA,GACb,EAAE,YAAY,MAAA,CAAO,OAAA,CAAQ,YAAW,GACxC;AAAA,WACJ;AAEA,UAAA,MAAM,SAAS,gBAAA,CAAiB,IAAA;AAAA,YAC/B,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,GAAA,CAAI;AAAA,WACrB;AACA,UAAA,IAAI,CAAC,MAAA,EAAQ;AACZ,YAAA,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAAA,UAC1B;AAAA,QACD;AAGA,QAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,KAAA,EAAO;AACnC,UAAA,MAAM,GAAA,GAAoB;AAAA,YACzB,EAAA,EAAI,CAAA,EAAG,MAAA,CAAO,EAAE,CAAA,GAAA,CAAA;AAAA,YAChB,IAAA,EAAM,gCAAA;AAAA,YACN,OAAA,EAAS,EAAE,UAAA,EAAY,MAAA,CAAO,QAAQ,UAAA,EAAW;AAAA,YACjD,OAAA,EAAS,EAAE,UAAA,EAAY,MAAA,CAAO,MAAM,UAAA,EAAW;AAAA,YAC/C,OAAA,EAAS,OAAO,OAAA,GACb,EAAE,YAAY,MAAA,CAAO,OAAA,CAAQ,YAAW,GACxC;AAAA,WACJ;AAEA,UAAA,MAAM,SAAS,gBAAA,CAAiB,IAAA;AAAA,YAC/B,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,GAAA,CAAI;AAAA,WACrB;AACA,UAAA,IAAI,CAAC,MAAA,EAAQ;AACZ,YAAA,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAAA,UAC1B;AAAA,QACD;AAAA,MACD,CAAC,CAAA;AAAA,IACF;AAAA,EACD,CAAC,CAAA;AAGD,EAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,YAAA,CAAa,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAGpE,EAAA,gBAAA,CAAiB,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACjC,IAAA,IAAI,GAAA,CAAI,IAAA,EAAM,QAAA,CAAS,aAAa,CAAA,EAAG;AACtC,MAAA,MAAM,QAAA,GAAW,IAAI,OAAA,EAAS,UAAA;AAC9B,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAS,UAAA;AAC7B,MAAA,MAAM,SAAA,GAAY,IAAI,OAAA,EAAS,UAAA;AAG/B,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,OAAA,EAAS;AAC1B,QAAA;AAAA,MACD;AAGA,MAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG;AACjC,QAAA;AAAA,MACD;AAGA,MAAA,MAAM,eAAyB,EAAC;AAChC,MAAA,IAAI,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,EAAG;AACjC,QAAA,YAAA,CAAa,KAAK,QAAQ,CAAA;AAAA,MAC3B;AACA,MAAA,IAAI,SAAA,IAAa,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA,EAAG;AAC/C,QAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAAA,MAC5B;AAGA,MAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC5B,QAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG;AACjC,UAAA,cAAA,CAAe,GAAA,CAAI,OAAA,EAAS,EAAE,CAAA;AAAA,QAC/B;AACA,QAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAC1C,QAAA,YAAA,CAAa,OAAA,CAAQ,CAACA,SAAAA,KAAa;AAClC,UAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAASA,SAAQ,CAAA,EAAG;AAChC,YAAA,OAAA,CAAQ,KAAKA,SAAQ,CAAA;AAAA,UACtB;AAAA,QACD,CAAC,CAAA;AAAA,MACF;AAAA,IACD,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,EAAM,QAAA,CAAS,QAAQ,CAAA,EAAG;AACxC,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAS,UAAA;AAC7B,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAS,UAAA;AAE7B,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,EAAS;AACzB,QAAA;AAAA,MACD;AAGA,MAAA,IAAI,eAAe,GAAA,CAAI,OAAO,KAAK,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG;AAC/D,QAAA,MAAM,MAAA,GAAS,CAAC,OAAA,EAAS,OAAO,EAAE,IAAA,EAAK,CAAE,KAAK,GAAG,CAAA;AACjD,QAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG;AAC1B,UAAA,QAAA,CAAS,IAAI,MAAA,EAAQ;AAAA,YACpB,yBAAS,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,YACnC,UAAU;AAAC,WACX,CAAA;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAAA,EACD,CAAC,CAAA;AAGD,EAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,OAAA,EAAS,OAAA,KAAY;AAC5C,IAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG;AACxB,MAAA,MAAM,MAAA,GAAS,QAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,EAAK,CAAE,IAAA,CAAK,GAAG,CAAA;AAClD,MAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG;AAC1B,QAAA,QAAA,CAAS,IAAI,MAAA,EAAQ;AAAA,UACpB,SAAS,IAAI,GAAA,CAAI,QAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,UACpC,UAAU;AAAC,SACX,CAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,CAAG,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IAC5C,CAAA,MAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,MAAM,MAAA,GAAS,CAAA,OAAA,EAAU,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AACnC,MAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG;AAC1B,QAAA,QAAA,CAAS,IAAI,MAAA,EAAQ;AAAA,UACpB,yBAAS,IAAI,GAAA,CAAI,CAAC,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA;AAAA,UAC7B,UAAU;AAAC,SACX,CAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,CAAG,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IAC5C;AAAA,EACD,CAAC,CAAA;AAQD,EAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAY;AAI3C,EAAA,IAAI,OAAA,CAAQ,iBAAA,IAAqB,OAAA,CAAQ,iBAAA,CAAkB,OAAO,CAAA,EAAG;AAEpE,IAAA,OAAA,CAAQ,iBAAA,CAAkB,OAAA,CAAQ,CAAC,QAAA,KAAa;AAC/C,MAAA,kBAAA,CAAmB,IAAI,QAAQ,CAAA;AAAA,IAChC,CAAC,CAAA;AAGD,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC5B,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AAEzC,MAAA,IAAI,OAAA,CAAQ,KAAK,CAAC,QAAA,KAAa,mBAAmB,GAAA,CAAI,QAAQ,CAAC,CAAA,EAAG;AACjE,QAAA,OAAA,CAAQ,QAAQ,CAAC,QAAA,KAAa,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,MAC/D;AAAA,IACD,CAAC,CAAA;AAKD,IAAA,IAAI,eAAA,GAAkB,IAAA;AACtB,IAAA,OAAO,eAAA,EAAiB;AACvB,MAAA,eAAA,GAAkB,KAAA;AAClB,MAAA,MAAM,aAAa,kBAAA,CAAmB,IAAA;AAGtC,MAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,OAAA,EAAS,OAAA,KAAY;AAE5C,QAAA,IACC,OAAA,CAAQ,KAAK,CAAC,QAAA,KAAa,mBAAmB,GAAA,CAAI,QAAQ,CAAC,CAAA,EAC1D;AACD,UAAA,IAAI,CAAC,kBAAA,CAAmB,GAAA,CAAI,OAAO,CAAA,EAAG;AACrC,YAAA,kBAAA,CAAmB,IAAI,OAAO,CAAA;AAC9B,YAAA,eAAA,GAAkB,IAAA;AAAA,UACnB;AAAA,QACD;AAAA,MACD,CAAC,CAAA;AAGD,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC5B,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACzC,QAAA,MAAM,uBAAuB,OAAA,CAAQ,IAAA;AAAA,UAAK,CAAC,QAAA,KAC1C,kBAAA,CAAmB,GAAA,CAAI,QAAQ;AAAA,SAChC;AACA,QAAA,MAAM,mBAAA,GAAsB,OAAO,QAAA,CAAS,IAAA;AAAA,UAAK,CAAC,OAAA,KACjD,kBAAA,CAAmB,GAAA,CAAI,OAAO;AAAA,SAC/B;AAGA,QAAA,IAAI,wBAAwB,mBAAA,EAAqB;AAChD,UAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,QAAA,KAAa;AAC7B,YAAA,IAAI,CAAC,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAA,EAAG;AACtC,cAAA,kBAAA,CAAmB,IAAI,QAAQ,CAAA;AAC/B,cAAA,eAAA,GAAkB,IAAA;AAAA,YACnB;AAAA,UACD,CAAC,CAAA;AAAA,QACF;AAAA,MACD,CAAC,CAAA;AAED,MAAA,MAAM,YAAY,kBAAA,CAAmB,IAAA;AACrC,MAAA,IAAI,YAAY,UAAA,EAAY;AAC3B,QAAA,eAAA,GAAkB,SAAA,KAAc,UAAA;AAAA,MACjC;AAAA,IACD;AAAA,EACD,CAAA,MAAO;AAEN,IAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,OAAA,EAAS,OAAA,KAAY;AAC5C,MAAA,kBAAA,CAAmB,IAAI,OAAO,CAAA;AAC9B,MAAA,OAAA,CAAQ,QAAQ,CAAC,QAAA,KAAa,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,IAC/D,CAAC,CAAA;AAAA,EACF;AAMA,EAAA,MAAM,mBAAA,GAAsB,QAAQ,mBAAA,KAAwB,IAAA;AAC5D,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AAGtC,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAyB;AACrD,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,MAAA,EAAQ,GAAA,KAAQ;AACjC,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AAG7C,IAAA,MAAM,uBACL,WAAA,CAAY,IAAA,CAAK,CAAC,QAAA,KAAa,kBAAA,CAAmB,IAAI,QAAQ,CAAC,CAAA,IAC/D,MAAA,CAAO,SAAS,IAAA,CAAK,CAAC,YAAY,kBAAA,CAAmB,GAAA,CAAI,OAAO,CAAC,CAAA;AAElE,IAAA,MAAM,iBAAiB,CAAC,oBAAA;AAGxB,IAAA,IAAI,cAAA,EAAgB;AACnB,MAAA,aAAA,CAAc,IAAI,GAAG,CAAA;AAAA,IACtB;AAGA,IAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,QAAA,KAAa;AACjC,MAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA;AAChC,QAAA,eAAA,CAAgB,GAAA,CAAI,QAAA,kBAAU,IAAI,GAAA,EAAK,CAAA;AACxC,MAAA,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA,CAAG,GAAA,CAAI,GAAG,CAAA;AAAA,IACvC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AACpC,MAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAA;AAC/B,QAAA,eAAA,CAAgB,GAAA,CAAI,OAAA,kBAAS,IAAI,GAAA,EAAK,CAAA;AACvC,MAAA,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAA,CAAG,GAAA,CAAI,GAAG,CAAA;AAAA,IACtC,CAAC,CAAA;AAAA,EACF,CAAC,CAAA;AAMD,EAAA,YAAA,CAAa,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AACxC,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AAC1C,IAAA,IAAI,CAAC,QAAA,EAAU;AAEd,MAAA,OAAA,CAAQ,IAAA;AAAA,QACP,CAAA,gBAAA,EAAmB,OAAO,EAAE,CAAA,yBAAA;AAAA,OAC7B;AACA,MAAA;AAAA,IACD;AAMA,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACzB,MAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AAE7C,MAAA,IACC,OAAA,IACA,OAAA,CAAQ,IAAA,GAAO,CAAA,IACf,MAAM,IAAA,CAAK,OAAO,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ,aAAA,CAAc,GAAA,CAAI,GAAG,CAAC,CAAA,EACxD;AACD,QAAA;AAAA,MACD;AAAA,IACD;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,QAAQ,CAAA,KAAA,CAAO,CAAA;AAG/B,IAAA,IAAI,OAAO,EAAA,EAAI;AACd,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,MAAA,CAAO,EAAE,CAAA,CAAE,CAAA;AAAA,IACnC;AAGA,IAAA,IAAI,YAAA,EAAc;AACjB,MAAA,MAAM,UAAA,GACL,OAAO,KAAA,EAAO,MAAA,EAAQ,QACtB,MAAA,CAAO,WAAA,GAAc,+BAA+B,CAAA,GAAI,CAAC,CAAA;AAE1D,MAAA,IAAI,UAAA,EAAY;AACf,QAAA,MAAM,MAAA,GAAS,yBAAyB,UAAU,CAAA;AAClD,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,CAAA;AAAA,MAClC,CAAA,MAAA,IAAW,OAAO,EAAA,EAAI;AAErB,QAAA,IAAI,OAAA,GAAU,8BAAA;AACd,QAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC3B,UAAA,OAAA,GAAU,+BAAA;AAAA,QACX,CAAA,MAAA,IAAW,gBAAgB,aAAA,EAAe;AACzC,UAAA,OAAA,GAAU,sCAAA;AAAA,QACX;AACA,QAAA,MAAM,MAAA,GAAS,CAAA,EAAG,OAAO,CAAA,aAAA,EAAgB,OAAO,EAAE,CAAA,CAAA;AAClD,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,CAAA;AAAA,MAClC;AAAA,IACD;AAGA,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,WAAA,EAAa,OAAA,GAAU,CAAC,CAAA,IAAK,MAAA;AAGvD,IAAA,MAAM,IAAA,GAAO,YAAY,UAAU,CAAA;AACnC,IAAA,IAAI,IAAA,EAAM;AACT,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,CAAE,CAAA;AAAA,IAC5B;AAGA,IAAA,MAAM,MAAA,GAAS,cAAc,UAAU,CAAA;AACvC,IAAA,IAAI,MAAA,EAAQ;AACX,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAC7B;AAGA,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,UAAA,EAAY,OAAO,CAAA;AAC7C,IAAA,IAAI,KAAA,EAAO;AACV,MAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,MAAA,IAAI,MAAM,IAAA,EAAM;AACf,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAAA,MAClC;AACA,MAAA,IAAI,MAAM,KAAA,EAAO;AAChB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,MACnC;AAAA,IACD;AAGA,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,UAAA,EAAY,OAAO,CAAA;AAC7C,IAAA,IAAI,KAAA,EAAO;AACV,MAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,MAAA,IAAI,MAAM,IAAA,EAAM;AACf,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAAA,MAClC;AACA,MAAA,IAAI,MAAM,KAAA,EAAO;AAChB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,MACnC;AAAA,IACD;AAGA,IAAA,UAAA,CAAW,KAAA,EAAO,OAAA,CAAQ,CAAC,IAAA,KAAS;AACnC,MAAA,IACC,KAAK,IAAA,IACL,IAAA,CAAK,SAAS,0BAAA,IACd,IAAA,CAAK,SAAS,0BAAA,EACb;AACD,QAAA,MAAM,SAAA,GAAY,oBAAoB,IAAI,CAAA;AAC1C,QAAA,SAAA,CAAU,QAAQ,CAAC,IAAA,KAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MAC7C;AAAA,IACD,CAAC,CAAA;AAGD,IAAA,IAAI,gBAAgB,MAAA,CAAO,KAAA,EAAO,OAAA,GAAU,CAAC,GAAG,KAAA,EAAO;AACtD,MAAA,MAAA,CAAO,MAAM,OAAA,CAAQ,CAAC,EAAE,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC/C,QAAA,IAAI,KAAK,IAAA,EAAM;AACd,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC7C,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAE,CAAA;AAAA,QAChC;AAAA,MACD,CAAC,CAAA;AAAA,IACF;AAKA,IAAA,MAAM,gBACL,UAAA,EACE,OAAA;AAEH,IAAA,IAAI,aAAA,IAAiB,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,EAAG;AAClD,MAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,SAAA,KAAc;AACpC,QAAA,MAAM,WAAW,SAAA,CAAU,aAAA;AAC3B,QAAA,IAAI,CAAC,QAAA,EAAU;AAGf,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAC7C,QAAA,MAAM,WAAA,GAAc,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA;AAC9C,QAAA,IAAI,gBAAgB,EAAA,EAAI;AAExB,QAAA,MAAM,cAAA,GAAiB,CAAA,EAAA,EAAK,WAAA,GAAc,CAAC,CAAA,CAAA,CAAA;AAC3C,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,cAAc,CAAA,CAAE,CAAA;AAGrC,QAAA,IACC,UAAU,UAAA,IACV,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,UAAU,CAAA,EACjC;AACD,UAAA,SAAA,CAAU,UAAA,CAAW,OAAA,CAAQ,CAAC,SAAA,KAAc;AAC3C,YAAA,IAAI,SAAA,CAAU,IAAA,IAAQ,SAAA,CAAU,KAAA,EAAO;AACtC,cAAA,KAAA,CAAM,IAAA;AAAA,gBACL,CAAA,OAAA,EAAU,SAAA,CAAU,IAAI,CAAA,EAAA,EAAK,UAAU,KAAK,CAAA;AAAA,eAC7C;AAAA,YACD;AAAA,UACD,CAAC,CAAA;AAAA,QACF;AAAA,MACD,CAAC,CAAA;AAAA,IACF;AAAA,EACD,CAAC,CAAA;AAOD,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAE5C,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,MAAA,EAAQ,GAAA,KAAQ;AAMjC,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AAC7C,IAAA,MAAM,YAAA,GAAe,YAAY,MAAA,CAAO,CAAC,OAAO,WAAA,CAAY,GAAA,CAAI,EAAE,CAAC,CAAA;AAEnE,IAAA,MAAM,YAAA,GAAe,aAAa,MAAA,KAAW,CAAA;AAC7C,IAAA,MAAM,4BACL,YAAA,CAAa,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,SAAS,MAAA,KAAW,CAAA;AAGzD,IAAA,IAAI,YAAA,EAAc;AAEjB,MAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAE/B,QAAA,OAAA,CAAQ,IAAA;AAAA,UACP,CAAA,sDAAA,EAAyD,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,0BAAA;AAAA,SAChF;AAAA,MACD;AACA,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,yBAAA,EAA2B;AAG9B,MAAA;AAAA,IACD;AAKA,IAAA,MAAM,uBACL,WAAA,CAAY,IAAA,CAAK,CAAC,QAAA,KAAa,kBAAA,CAAmB,IAAI,QAAQ,CAAC,CAAA,IAC/D,MAAA,CAAO,SAAS,IAAA,CAAK,CAAC,YAAY,kBAAA,CAAmB,GAAA,CAAI,OAAO,CAAC,CAAA;AAElE,IAAA,MAAM,iBAAiB,CAAC,oBAAA;AAGxB,IAAA,IAAI,cAAA,IAAkB,CAAC,mBAAA,EAAqB;AAC3C,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,EAAU,CAAA,CAAA,CAAA;AAC7B,IAAA,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,CAAA;AAE1B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,KAAK,CAAA,IAAA,CAAM,CAAA;AAG3B,IAAA,IAAI,kBAAkB,mBAAA,EAAqB;AAC1C,MAAA,KAAA,CAAM,KAAK,CAAA,qBAAA,CAAuB,CAAA;AAAA,IACnC;AAEA,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC7B,MAAA,MAAM,CAAC,OAAA,EAAS,OAAO,CAAA,GAAI,WAAA;AAC3B,MAAA,MAAM,WAAA,GAAc,aAAa,OAAA,EAAS,IAAA;AAAA,QACzC,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO;AAAA,OACjB;AACA,MAAA,MAAM,WAAA,GAAc,aAAa,OAAA,EAAS,IAAA;AAAA,QACzC,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO;AAAA,OACjB;AAEA,MAAA,MAAM,OAAA,GAAU,aAAA;AAAA,QACf,WAAA,EAAa,WAAA,EAAa,OAAA,GAAU,CAAC,CAAA,IAAK;AAAA,OAC3C;AACA,MAAA,MAAM,OAAA,GAAU,aAAA;AAAA,QACf,WAAA,EAAa,WAAA,EAAa,OAAA,GAAU,CAAC,CAAA,IAAK;AAAA,OAC3C;AAEA,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAClC,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAClC,MAAA,IAAI,OAAA,KAAY,GAAA,IAAO,OAAA,KAAY,GAAA,EAAK;AACvC,QAAA,IAAI,EAAA,EAAI,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,EAAE,CAAA,CAAE,CAAA;AACjC,QAAA,IAAI,EAAA,EAAI,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,EAAE,CAAA,CAAE,CAAA;AAAA,MAClC,CAAA,MAAO;AACN,QAAA,IAAI,EAAA,EAAI,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,EAAE,CAAA,CAAE,CAAA;AACjC,QAAA,IAAI,EAAA,EAAI,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,EAAE,CAAA,CAAE,CAAA;AAAA,MAClC;AAGA,MAAA,gBAAA,CAAiB,KAAA,EAAO,gBAAA,EAAkB,OAAA,EAAS,OAAO,CAAA;AAAA,IAC3D,CAAA,MAAA,IAAW,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AACpC,MAAA,MAAM,UAAA,GAAa,aAAa,OAAA,EAAS,IAAA;AAAA,QACxC,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,YAAY,CAAC;AAAA,OAC9B;AACA,MAAA,MAAM,MAAA,GAAS,aAAA;AAAA,QACd,UAAA,EAAY,WAAA,EAAa,OAAA,GAAU,CAAC,CAAA,IAAK;AAAA,OAC1C;AAEA,MAAA,IAAI,WAAW,GAAA,EAAK;AACnB,QAAA,KAAA,CAAM,IAAA,CAAK,UAAU,WAAA,CAAY,GAAA,CAAI,YAAY,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,MACvD,CAAA,MAAO;AACN,QAAA,KAAA,CAAM,IAAA,CAAK,UAAU,WAAA,CAAY,GAAA,CAAI,YAAY,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,MACvD;AAAA,IACD;AAGA,IAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AACpC,MAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAC7C,MAAA,IAAI,aAAA,EAAe;AAClB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,aAAa,CAAA,CAAE,CAAA;AAAA,MACrC;AAAA,IACD,CAAC,CAAA;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,OAAA,EAAS,OAAA,KAAY;AAC5C,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAC7C,IAAA,IAAI,CAAC,aAAA,EAAe;AAEpB,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG;AACxB,MAAA,MAAM,MAAA,GAAS,QAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,EAAK,CAAE,IAAA,CAAK,GAAG,CAAA;AAClD,MAAA,KAAA,GAAQ,WAAA,CAAY,IAAI,MAAM,CAAA;AAAA,IAC/B,CAAA,MAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,MAAM,MAAA,GAAS,CAAA,OAAA,EAAU,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AACnC,MAAA,KAAA,GAAQ,WAAA,CAAY,IAAI,MAAM,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAI,KAAA,EAAO;AACV,MAAA,MAAM,kBAAkB,KAAA,CAAM,SAAA;AAAA,QAC7B,CAAC,IAAA,KAAS,IAAA,KAAS,CAAA,EAAA,EAAK,aAAa,CAAA,KAAA;AAAA,OACtC;AACA,MAAA,IAAI,oBAAoB,EAAA,EAAI;AAC3B,QAAA,KAAA,CAAM,OAAO,eAAA,GAAkB,CAAA,EAAG,CAAA,EAAG,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAA;AAAA,MACvD;AAAA,IACD;AAAA,EACD,CAAC,CAAA;AAGD,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,MAAA,EAAQ,GAAA,KAAQ;AACjC,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACjC,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,CAAC,QAAA,KAAa;AACpC,MAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC/C,MAAA,IAAI,CAAC,cAAA,EAAgB;AAErB,MAAA,MAAM,kBAAkB,KAAA,CAAM,SAAA;AAAA,QAC7B,CAAC,IAAA,KAAS,IAAA,KAAS,CAAA,EAAA,EAAK,cAAc,CAAA,KAAA;AAAA,OACvC;AACA,MAAA,IAAI,oBAAoB,EAAA,EAAI;AAC3B,QAAA,IAAI,cAAc,eAAA,GAAkB,CAAA;AACpC,QAAA,OACC,WAAA,GAAc,MAAM,MAAA,IACpB,KAAA,CAAM,WAAW,CAAA,CAAE,UAAA,CAAW,QAAQ,CAAA,EACrC;AACD,UAAA,WAAA,EAAA;AAAA,QACD;AACA,QAAA,KAAA,CAAM,MAAA,CAAO,WAAA,EAAa,CAAA,EAAG,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAA;AAAA,MAC/C;AAAA,IACD,CAAC,CAAA;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAY;AAC1C,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC5B,IAAA,MAAA,CAAO,QAAQ,OAAA,CAAQ,CAAC,OAAO,iBAAA,CAAkB,GAAA,CAAI,EAAE,CAAC,CAAA;AACxD,IAAA,MAAA,CAAO,SAAS,OAAA,CAAQ,CAAC,OAAO,iBAAA,CAAkB,GAAA,CAAI,EAAE,CAAC,CAAA;AAAA,EAC1D,CAAC,CAAA;AAGD,EAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAEnB,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACvB;AAKA,SAAS,gBAAA,CACR,KAAA,EACA,aAAA,EACA,OAAA,EACA,OAAA,EACO;AACP,EAAA,MAAM,MAAA,GAAS,CAAC,OAAA,EAAS,OAAO,EAAE,IAAA,EAAK,CAAE,KAAK,GAAG,CAAA;AAEjD,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM;AACrC,IAAA,MAAM,IAAI,CAAA,CAAE,OAAA,EAAS,UAAA,IAAc,CAAA,CAAE,SAAS,QAAA,EAAU,UAAA;AACxD,IAAA,MAAM,IAAI,CAAA,CAAE,OAAA,EAAS,UAAA,IAAc,CAAA,CAAE,SAAS,QAAA,EAAU,UAAA;AACxD,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG,OAAO,KAAA;AACrB,IAAA,OAAO,CAAC,GAAG,CAAC,CAAA,CAAE,MAAK,CAAE,IAAA,CAAK,GAAG,CAAA,KAAM,MAAA;AAAA,EACpC,CAAC,CAAA;AAED,EAAA,IAAI,CAAC,GAAA,EAAK;AAEV,EAAA,MAAM,gBAA8B,EAAC;AAGrC,EAAA,IAAI,IAAI,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AAC1C,IAAA,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,KAAM;AACxB,MAAA,IAAI,CAAA,CAAE,IAAA,EAAM,QAAA,CAAS,UAAU,CAAA,EAAG;AACjC,QAAA,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,MACrB;AAAA,IACD,CAAC,CAAA;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,CAAI,SAAS,KAAA,IAAS,KAAA,CAAM,QAAQ,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC3D,IAAA,aAAA,CAAc,IAAA;AAAA,MACb,GAAG,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,QAAA,CAAS,UAAU,CAAC;AAAA,KAChE;AAAA,EACD;AAGA,EAAA,IAAI,GAAA,CAAI,SAAS,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,CAAI,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC/D,IAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,KAAM;AAClC,MAAA,IAAI,EAAE,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA,EAAG;AACtC,QAAA,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,KAAM;AACtB,UAAA,IAAI,CAAA,CAAE,IAAA,EAAM,QAAA,CAAS,UAAU,CAAA,EAAG;AACjC,YAAA,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,UACrB;AAAA,QACD,CAAC,CAAA;AAAA,MACF;AAAA,IACD,CAAC,CAAA;AAAA,EACF;AAGA,EAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,EAAA,KAAO;AAC7B,IAAA,MAAM,SAAA,GAAY,oBAAoB,EAAE,CAAA;AACxC,IAAA,SAAA,CAAU,QAAQ,CAAC,IAAA,KAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAC7C,CAAC,CAAA;AACF;AAGO,IAAM,2BAAA,GAA8B","file":"index.cjs","sourcesContent":["/**\n * FamilySearch to GEDCOM Converter\n *\n * Converts FamilySearch API responses into GEDCOM 5.5 format\n */\n\nimport type {\n\tEnhancedPedigreeData,\n\tPersonData,\n\tPersonFact,\n\tRelationship,\n\tSourceDescription,\n\tSourceReference,\n} from \"../types\";\n\n/**\n * Transform FamilySearch API URLs to web URLs\n * Supports: apibeta.familysearch.org, beta.familysearch.org, integration.familysearch.org\n */\nfunction transformFamilySearchUrl(url: string): string {\n\t// If it's not an API URL, return as-is\n\tif (!url.includes(\"/platform/tree/persons/\")) {\n\t\treturn url;\n\t}\n\n\t// Extract person ID from API URL\n\tconst personId = url.match(/persons\\/([^/?]+)/)?.[1];\n\tif (!personId) {\n\t\treturn url;\n\t}\n\n\t// Detect environment from the URL\n\tlet baseUrl = \"https://www.familysearch.org\";\n\n\tif (\n\t\turl.includes(\"integration.familysearch.org\") ||\n\t\turl.includes(\"api-integ.familysearch.org\")\n\t) {\n\t\tbaseUrl = \"https://integration.familysearch.org\";\n\t} else if (\n\t\turl.includes(\"beta.familysearch.org\") ||\n\t\turl.includes(\"apibeta.familysearch.org\")\n\t) {\n\t\tbaseUrl = \"https://beta.familysearch.org\";\n\t}\n\n\treturn `${baseUrl}/tree/person/${personId}`;\n}\n\n/**\n * Transform FamilySearch source URLs to web-accessible ARK URLs\n *\n * FamilySearch API returns source URLs in the format:\n * - https://api.familysearch.org/platform/sources/ark:/NAAN/Name\n * - https://apibeta.familysearch.org/platform/sources/ark:/NAAN/Name\n * - https://api-integ.familysearch.org/platform/sources/ark:/NAAN/Name\n *\n * These need to be transformed to web-accessible URLs:\n * - https://www.familysearch.org/ark:/NAAN/Name\n * - https://beta.familysearch.org/ark:/NAAN/Name\n * - https://integration.familysearch.org/ark:/NAAN/Name\n *\n * ARK (Archival Resource Key) format: ark:/NAAN/Name\n * - NAAN: Name Assigning Authority Number\n * - Name: Unique identifier\n *\n * @param url - FamilySearch API source URL\n * @returns Web-accessible ARK URL\n */\nfunction transformSourceUrl(url: string): string {\n\tif (!url) return url;\n\n\t// If it's already a web URL (not API URL with /platform/), return as-is\n\tif (!url.includes(\"/platform/\") && url.includes(\"ark:\")) {\n\t\treturn url;\n\t}\n\n\t// Extract ARK identifier from URL\n\tconst arkMatch = url.match(/ark:\\/[^/?]+\\/[^/?]+/);\n\tif (!arkMatch) {\n\t\treturn url;\n\t}\n\n\tconst arkId = arkMatch[0];\n\n\t// Detect environment from URL\n\tlet baseUrl = \"https://www.familysearch.org\";\n\n\tif (\n\t\turl.includes(\"integration.familysearch.org\") ||\n\t\turl.includes(\"api-integ.familysearch.org\")\n\t) {\n\t\tbaseUrl = \"https://integration.familysearch.org\";\n\t} else if (\n\t\turl.includes(\"beta.familysearch.org\") ||\n\t\turl.includes(\"apibeta.familysearch.org\")\n\t) {\n\t\tbaseUrl = \"https://beta.familysearch.org\";\n\t}\n\n\treturn `${baseUrl}/${arkId}`;\n}\n\n/**\n * Extract name from FamilySearch person\n */\nfunction extractName(person?: PersonData): string | null {\n\tif (!person) return null;\n\n\t// Try structured name\n\tif (person.names?.[0]?.nameForms?.[0]) {\n\t\tconst nameForm = person.names[0].nameForms[0];\n\n\t\t// Build from parts\n\t\tconst parts = nameForm.parts || [];\n\t\tconst given = parts.find((p) => p.type?.includes(\"Given\"))?.value || \"\";\n\t\tconst surname =\n\t\t\tparts.find((p) => p.type?.includes(\"Surname\"))?.value || \"\";\n\n\t\tif (given || surname) {\n\t\t\treturn `${given} /${surname}/`.trim();\n\t\t}\n\n\t\tif (nameForm.fullText) {\n\t\t\treturn nameForm.fullText;\n\t\t}\n\t}\n\n\t// Try display name\n\tif (person.display?.name) {\n\t\treturn person.display.name;\n\t}\n\n\treturn null;\n}\n\n/**\n * Extract gender from FamilySearch person\n */\nfunction extractGender(person?: PersonData): string | null {\n\tif (!person) return null;\n\n\tif (person.gender?.type?.includes(\"Male\")) {\n\t\treturn \"M\";\n\t} else if (person.gender?.type?.includes(\"Female\")) {\n\t\treturn \"F\";\n\t} else if (person.display?.gender === \"Male\") {\n\t\treturn \"M\";\n\t} else if (person.display?.gender === \"Female\") {\n\t\treturn \"F\";\n\t}\n\n\treturn null;\n}\n\n/**\n * Extract a specific fact (like birth or death) from FamilySearch person\n */\nfunction extractFact(\n\tperson: PersonData | undefined,\n\tfactType: \"BIRTH\" | \"DEATH\"\n): { date?: string; place?: string } | null {\n\tif (!person) return null;\n\n\tconst result: { date?: string; place?: string } = {};\n\n\t// Try structured facts\n\tconst factTypeUrl = `http://gedcomx.org/${factType === \"BIRTH\" ? \"Birth\" : \"Death\"}`;\n\tconst fact = person.facts?.find((f) => f.type === factTypeUrl);\n\n\tif (fact) {\n\t\tif (fact.date?.formal || fact.date?.original) {\n\t\t\tresult.date = (fact.date?.formal || fact.date?.original)?.replace(\n\t\t\t\t/^(-|\\+)/,\n\t\t\t\t\"\"\n\t\t\t);\n\t\t}\n\t\tif (fact.place?.original) {\n\t\t\tresult.place = fact.place.original;\n\t\t}\n\t}\n\n\t// Try display data\n\tif (factType === \"BIRTH\") {\n\t\tresult.date = result.date || person.display?.birthDate;\n\t\tresult.place = result.place || person.display?.birthPlace;\n\t} else if (factType === \"DEATH\") {\n\t\tresult.date = result.date || person.display?.deathDate;\n\t\tresult.place = result.place || person.display?.deathPlace;\n\t}\n\n\treturn result.date || result.place ? result : null;\n}\n\n/**\n * Format a date for GEDCOM\n */\nfunction formatDateForGedcom(date: Date): string {\n\tconst months = [\n\t\t\"JAN\",\n\t\t\"FEB\",\n\t\t\"MAR\",\n\t\t\"APR\",\n\t\t\"MAY\",\n\t\t\"JUN\",\n\t\t\"JUL\",\n\t\t\"AUG\",\n\t\t\"SEP\",\n\t\t\"OCT\",\n\t\t\"NOV\",\n\t\t\"DEC\",\n\t];\n\n\tconst day = date.getDate();\n\tconst month = months[date.getMonth()];\n\tconst year = date.getFullYear();\n\n\treturn `${day} ${month} ${year}`;\n}\n\n/**\n * Convert a FamilySearch fact to GEDCOM lines\n */\nfunction convertFactToGedcom(fact: PersonFact): string[] {\n\tconst lines: string[] = [];\n\n\tif (!fact.type) return lines;\n\n\t// Map FamilySearch fact types to GEDCOM tags\n\tconst typeMap: Record<string, string> = {\n\t\t\"http://gedcomx.org/Burial\": \"BURI\",\n\t\t\"http://gedcomx.org/Christening\": \"CHR\",\n\t\t\"http://gedcomx.org/Baptism\": \"BAPM\",\n\t\t\"http://gedcomx.org/Marriage\": \"MARR\",\n\t\t\"http://gedcomx.org/Divorce\": \"DIV\",\n\t\t\"http://gedcomx.org/Residence\": \"RESI\",\n\t\t\"http://gedcomx.org/Occupation\": \"OCCU\",\n\t\t\"http://gedcomx.org/Immigration\": \"IMMI\",\n\t\t\"http://gedcomx.org/Emigration\": \"EMIG\",\n\t\t\"http://gedcomx.org/Naturalization\": \"NATU\",\n\t\t\"http://gedcomx.org/Census\": \"CENS\",\n\t};\n\n\tconst gedcomTag = typeMap[fact.type] || \"EVEN\";\n\n\t// Special handling for occupation with value\n\tif (gedcomTag === \"OCCU\" && fact.value) {\n\t\tlines.push(`1 OCCU ${fact.value}`);\n\t} else {\n\t\tlines.push(`1 ${gedcomTag}`);\n\t}\n\n\t// Add FamilySearch link for this specific fact/event (conclusion link)\n\tif (fact.links?.conclusion?.href) {\n\t\tconst webUrl = transformFamilySearchUrl(fact.links.conclusion.href);\n\t\tlines.push(`2 _FS_LINK ${webUrl}`);\n\t}\n\n\t// Add date\n\tif (fact.date?.formal || fact.date?.original) {\n\t\tlines.push(\n\t\t\t`2 DATE ${(fact.date?.formal || fact.date?.original)?.replace(/^(-|\\+)/, \"\")}`\n\t\t);\n\t}\n\n\t// Add place\n\tif (fact.place?.original) {\n\t\tlines.push(`2 PLAC ${fact.place.original}`);\n\t}\n\n\t// Add value as note for non-occupation facts\n\tif (fact.value && gedcomTag !== \"OCCU\") {\n\t\tlines.push(`2 NOTE ${fact.value}`);\n\t}\n\n\treturn lines;\n}\n\n/**\n * Options for GEDCOM conversion\n */\nexport interface GedcomConversionOptions {\n\t/** Tree name for the GEDCOM file header */\n\ttreeName?: string;\n\t/** Include FamilySearch links in output */\n\tincludeLinks?: boolean;\n\t/** Include notes in output */\n\tincludeNotes?: boolean;\n\n\t/** FamilySearch environment (production, beta, integration) */\n\tenvironment?: \"production\" | \"beta\" | \"integration\";\n\n\t/** Allow orphan families (families not connected to root person) */\n\tallowOrphanFamilies?: boolean;\n\n\t/**\n\t * Set of person IDs who are in the direct ancestry of the root person.\n\t * These are the persons returned by the ancestry API before fullTree expansion.\n\t * Used to determine which persons are \"connectable\" to the root person.\n\t */\n\tancestryPersonIds?: Set<string>;\n}\n\n/**\n * Convert FamilySearch pedigree data to GEDCOM format\n *\n * @param pedigreeData - Enhanced pedigree data from FamilySearch\n * @param options - Conversion options\n * @returns GEDCOM 5.5 formatted string\n *\n * @example\n * ```typescript\n * const pedigree = await fetchPedigree(sdk);\n * const gedcom = convertToGedcom(pedigree, { treeName: \"My Family Tree\" });\n * ```\n */\nexport function convertToGedcom(\n\tpedigreeData: EnhancedPedigreeData,\n\toptions: GedcomConversionOptions = {}\n): string {\n\tconst {\n\t\ttreeName = \"FamilySearch Import\",\n\t\tincludeLinks = true,\n\t\tincludeNotes = true,\n\t\tenvironment = \"production\",\n\t} = options;\n\n\tif (!pedigreeData || !pedigreeData.persons) {\n\t\tthrow new Error(\"Invalid FamilySearch data: no persons found\");\n\t}\n\n\tconst lines: string[] = [];\n\n\t// GEDCOM Header\n\tlines.push(\"0 HEAD\");\n\tlines.push(\"1 SOUR FamilySearch\");\n\tlines.push(\"2 VERS 1.0\");\n\tlines.push(\"2 NAME FamilySearch API\");\n\tlines.push(\"1 DEST ANY\");\n\tlines.push(\"1 DATE \" + formatDateForGedcom(new Date()));\n\tlines.push(\"1 SUBM @SUBM1@\");\n\tlines.push(\"1 FILE \" + treeName);\n\tlines.push(\"1 GEDC\");\n\tlines.push(\"2 VERS 5.5\");\n\tlines.push(\"2 FORM LINEAGE-LINKED\");\n\tlines.push(\"1 CHAR UTF-8\");\n\n\t// Submitter record\n\tlines.push(\"0 @SUBM1@ SUBM\");\n\n\t// ==============================================\n\t// COLLECT AND CREATE SOURCE RECORDS\n\t// ==============================================\n\tconst sourceMap = new Map<string, SourceDescription>();\n\tlet sourceCounter = 1;\n\n\t// Extract source descriptions from all persons\n\tpedigreeData.persons.forEach((person) => {\n\t\tconst sourceDescriptions = person.fullDetails?.sourceDescriptions;\n\n\t\tif (sourceDescriptions && Array.isArray(sourceDescriptions)) {\n\t\t\tsourceDescriptions.forEach((source) => {\n\t\t\t\tif (source.id && !sourceMap.has(source.id)) {\n\t\t\t\t\tsourceMap.set(source.id, source);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\t// Create GEDCOM SOUR records for each source\n\tsourceMap.forEach((source) => {\n\t\tconst sourceId = `@S${sourceCounter++}@`;\n\n\t\tlines.push(`0 ${sourceId} SOUR`);\n\n\t\t// Add title (use titles[0] if available, otherwise default)\n\t\tconst title = source.titles?.[0]?.value || \"FamilySearch Source\";\n\t\tlines.push(`1 TITL ${title}`);\n\n\t\t// Add citation as TEXT\n\t\tif (source.citations?.[0]?.value) {\n\t\t\tlines.push(`1 TEXT ${source.citations[0].value}`);\n\t\t}\n\n\t\t// Add web link if available\n\t\tif (source.about) {\n\t\t\tconst webUrl = transformSourceUrl(source.about);\n\t\t\tlines.push(`1 WWW ${webUrl}`);\n\t\t}\n\n\t\t// Add resource type as NOTE\n\t\tif (source.resourceType) {\n\t\t\tlines.push(`1 NOTE Resource Type: ${source.resourceType}`);\n\t\t}\n\t});\n\n\t// ==============================================\n\t// STEP 1: BUILD PERSON ID MAPPING ONLY\n\t// Create GEDCOM IDs for all persons (for relationship processing)\n\t// INDI records will be created later after filtering\n\t// ==============================================\n\tconst personIdMap = new Map<string, string>();\n\tpedigreeData.persons.forEach((person, index) => {\n\t\tconst gedcomId = `@I${index + 1}@`;\n\t\tpersonIdMap.set(person.id, gedcomId);\n\t});\n\n\t// Build family data structures\n\tconst families = new Map<\n\t\tstring,\n\t\t{ spouses: Set<string>; children: string[] }\n\t>();\n\tconst childToParents = new Map<string, string[]>();\n\n\t// ==============================================\n\t// COLLECT ALL RELATIONSHIPS (from pedigree AND person details)\n\t// ==============================================\n\tconst allRelationships: Relationship[] = [\n\t\t...(pedigreeData.relationships || []),\n\t];\n\n\t// Extract relationships from person.fullDetails.relationships\n\tpedigreeData.persons.forEach((person) => {\n\t\tconst personRelationships = person.fullDetails\n\t\t\t?.relationships as Relationship[];\n\n\t\tif (personRelationships && Array.isArray(personRelationships)) {\n\t\t\tpersonRelationships.forEach((rel) => {\n\t\t\t\tconst exists = allRelationships.some((r) => r.id === rel.id);\n\t\t\t\tif (!exists) {\n\t\t\t\t\tallRelationships.push(rel);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Extract childAndParentsRelationships and convert to standard format\n\t\tconst childAndParentsRels = person.fullDetails\n\t\t\t?.childAndParentsRelationships as Array<{\n\t\t\tid: string;\n\t\t\tparent1?: { resourceId: string };\n\t\t\tparent2?: { resourceId: string };\n\t\t\tchild?: { resourceId: string };\n\t\t}>;\n\n\t\tif (childAndParentsRels && Array.isArray(childAndParentsRels)) {\n\t\t\tchildAndParentsRels.forEach((capRel) => {\n\t\t\t\t// Convert to ParentChild relationship format\n\t\t\t\tif (capRel.parent1 && capRel.child) {\n\t\t\t\t\tconst rel: Relationship = {\n\t\t\t\t\t\tid: `${capRel.id}-p1`,\n\t\t\t\t\t\ttype: \"http://gedcomx.org/ParentChild\",\n\t\t\t\t\t\tperson1: { resourceId: capRel.parent1.resourceId },\n\t\t\t\t\t\tperson2: { resourceId: capRel.child.resourceId },\n\t\t\t\t\t\tparent2: capRel.parent2\n\t\t\t\t\t\t\t? { resourceId: capRel.parent2.resourceId }\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t};\n\n\t\t\t\t\tconst exists = allRelationships.some(\n\t\t\t\t\t\t(r) => r.id === rel.id\n\t\t\t\t\t);\n\t\t\t\t\tif (!exists) {\n\t\t\t\t\t\tallRelationships.push(rel);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If parent2 exists, also add relationship for parent2\n\t\t\t\tif (capRel.parent2 && capRel.child) {\n\t\t\t\t\tconst rel: Relationship = {\n\t\t\t\t\t\tid: `${capRel.id}-p2`,\n\t\t\t\t\t\ttype: \"http://gedcomx.org/ParentChild\",\n\t\t\t\t\t\tperson1: { resourceId: capRel.parent2.resourceId },\n\t\t\t\t\t\tperson2: { resourceId: capRel.child.resourceId },\n\t\t\t\t\t\tparent2: capRel.parent1\n\t\t\t\t\t\t\t? { resourceId: capRel.parent1.resourceId }\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t};\n\n\t\t\t\t\tconst exists = allRelationships.some(\n\t\t\t\t\t\t(r) => r.id === rel.id\n\t\t\t\t\t);\n\t\t\t\t\tif (!exists) {\n\t\t\t\t\t\tallRelationships.push(rel);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\t// Create a Set of valid person IDs for fast lookup\n\tconst validPersonIds = new Set(pedigreeData.persons.map((p) => p.id));\n\n\t// Process all relationships, filtering out invalid person IDs\n\tallRelationships.forEach((rel) => {\n\t\tif (rel.type?.includes(\"ParentChild\")) {\n\t\t\tconst parentId = rel.person1?.resourceId;\n\t\t\tconst childId = rel.person2?.resourceId;\n\t\t\tconst parent2Id = rel.parent2?.resourceId;\n\n\t\t\t// Validate all person IDs exist in dataset\n\t\t\tif (!parentId || !childId) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Skip if child doesn't exist in dataset\n\t\t\tif (!validPersonIds.has(childId)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Filter parent IDs - only include parents who exist in dataset\n\t\t\tconst validParents: string[] = [];\n\t\t\tif (validPersonIds.has(parentId)) {\n\t\t\t\tvalidParents.push(parentId);\n\t\t\t}\n\t\t\tif (parent2Id && validPersonIds.has(parent2Id)) {\n\t\t\t\tvalidParents.push(parent2Id);\n\t\t\t}\n\n\t\t\t// Only add relationship if at least one parent exists\n\t\t\tif (validParents.length > 0) {\n\t\t\t\tif (!childToParents.has(childId)) {\n\t\t\t\t\tchildToParents.set(childId, []);\n\t\t\t\t}\n\t\t\t\tconst parents = childToParents.get(childId)!;\n\t\t\t\tvalidParents.forEach((parentId) => {\n\t\t\t\t\tif (!parents.includes(parentId)) {\n\t\t\t\t\t\tparents.push(parentId);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (rel.type?.includes(\"Couple\")) {\n\t\t\tconst person1 = rel.person1?.resourceId;\n\t\t\tconst person2 = rel.person2?.resourceId;\n\n\t\t\tif (!person1 || !person2) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Only add couple if BOTH persons exist in dataset\n\t\t\tif (validPersonIds.has(person1) && validPersonIds.has(person2)) {\n\t\t\t\tconst famKey = [person1, person2].sort().join(\"-\");\n\t\t\t\tif (!families.has(famKey)) {\n\t\t\t\t\tfamilies.set(famKey, {\n\t\t\t\t\t\tspouses: new Set([person1, person2]),\n\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\t// Add children to their families\n\tchildToParents.forEach((parents, childId) => {\n\t\tif (parents.length >= 2) {\n\t\t\tconst famKey = parents.slice(0, 2).sort().join(\"-\");\n\t\t\tif (!families.has(famKey)) {\n\t\t\t\tfamilies.set(famKey, {\n\t\t\t\t\tspouses: new Set(parents.slice(0, 2)),\n\t\t\t\t\tchildren: [],\n\t\t\t\t});\n\t\t\t}\n\t\t\tfamilies.get(famKey)!.children.push(childId);\n\t\t} else if (parents.length === 1) {\n\t\t\tconst famKey = `single-${parents[0]}`;\n\t\t\tif (!families.has(famKey)) {\n\t\t\t\tfamilies.set(famKey, {\n\t\t\t\t\tspouses: new Set([parents[0]]),\n\t\t\t\t\tchildren: [],\n\t\t\t\t});\n\t\t\t}\n\t\t\tfamilies.get(famKey)!.children.push(childId);\n\t\t}\n\t});\n\n\t// Build set of persons who are \"connectable\" to the root person\n\t// A person is connectable if:\n\t// 1. They are in the direct ancestry (ancestryPersonIds)\n\t// 2. They are a spouse of someone in the ancestry\n\t// 3. They are a descendant of someone in the ancestry (recursive)\n\t// 4. They are a spouse of a descendant (recursive)\n\tconst connectablePersons = new Set<string>();\n\n\t// If ancestryPersonIds is provided, use graph traversal\n\t// Otherwise, fall back to old logic (everyone in childToParents)\n\tif (options.ancestryPersonIds && options.ancestryPersonIds.size > 0) {\n\t\t// Step 1: Add all ancestry persons\n\t\toptions.ancestryPersonIds.forEach((personId) => {\n\t\t\tconnectablePersons.add(personId);\n\t\t});\n\n\t\t// Step 2: Add spouses of ancestry persons\n\t\tfamilies.forEach((family) => {\n\t\t\tconst spouses = Array.from(family.spouses);\n\t\t\t// If any spouse is in ancestry, add all spouses\n\t\t\tif (spouses.some((spouseId) => connectablePersons.has(spouseId))) {\n\t\t\t\tspouses.forEach((spouseId) => connectablePersons.add(spouseId));\n\t\t\t}\n\t\t});\n\n\t\t// Step 3: Recursively expand the graph DOWNWARD and SIDEWAYS only\n\t\t// Add: descendants + their spouses (NO upward traversal to parents)\n\t\t// Keep iterating until no new persons are added\n\t\tlet addedNewPersons = true;\n\t\twhile (addedNewPersons) {\n\t\t\taddedNewPersons = false;\n\t\t\tconst beforeSize = connectablePersons.size;\n\n\t\t\t// 3a. Add children of connectable persons (downward traversal)\n\t\t\tchildToParents.forEach((parents, childId) => {\n\t\t\t\t// If any parent is connectable, the child is connectable\n\t\t\t\tif (\n\t\t\t\t\tparents.some((parentId) => connectablePersons.has(parentId))\n\t\t\t\t) {\n\t\t\t\t\tif (!connectablePersons.has(childId)) {\n\t\t\t\t\t\tconnectablePersons.add(childId);\n\t\t\t\t\t\taddedNewPersons = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// 3b. Add spouses of connectable persons (sideways traversal)\n\t\t\tfamilies.forEach((family) => {\n\t\t\t\tconst spouses = Array.from(family.spouses);\n\t\t\t\tconst hasConnectableSpouse = spouses.some((spouseId) =>\n\t\t\t\t\tconnectablePersons.has(spouseId)\n\t\t\t\t);\n\t\t\t\tconst hasConnectableChild = family.children.some((childId) =>\n\t\t\t\t\tconnectablePersons.has(childId)\n\t\t\t\t);\n\n\t\t\t\t// If any spouse OR child is connectable, add all spouses\n\t\t\t\tif (hasConnectableSpouse || hasConnectableChild) {\n\t\t\t\t\tspouses.forEach((spouseId) => {\n\t\t\t\t\t\tif (!connectablePersons.has(spouseId)) {\n\t\t\t\t\t\t\tconnectablePersons.add(spouseId);\n\t\t\t\t\t\t\taddedNewPersons = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst afterSize = connectablePersons.size;\n\t\t\tif (afterSize > beforeSize) {\n\t\t\t\taddedNewPersons = afterSize !== beforeSize;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Fallback: old logic (everyone in parent-child relationships)\n\t\tchildToParents.forEach((parents, childId) => {\n\t\t\tconnectablePersons.add(childId);\n\t\t\tparents.forEach((parentId) => connectablePersons.add(parentId));\n\t\t});\n\t}\n\n\t// ==============================================\n\t// STEP 4: DETECT ORPHAN FAMILIES AND BUILD PERSON-TO-FAMILY MAPPING\n\t// Identify which families are orphan (disconnected from ancestry)\n\t// ==============================================\n\tconst allowOrphanFamilies = options.allowOrphanFamilies === true; // Default to false\n\tconst orphanFamKeys = new Set<string>(); // Keys of families that are orphan\n\n\t// Build a map from personId to all their FAM keys (as spouse or child)\n\tconst personToFamKeys = new Map<string, Set<string>>();\n\tfamilies.forEach((family, key) => {\n\t\tconst spouseArray = Array.from(family.spouses);\n\n\t\t// Check if this is an orphan family\n\t\tconst anyMemberConnectable =\n\t\t\tspouseArray.some((spouseId) => connectablePersons.has(spouseId)) ||\n\t\t\tfamily.children.some((childId) => connectablePersons.has(childId));\n\n\t\tconst isOrphanFamily = !anyMemberConnectable;\n\n\t\t// Track orphan family keys\n\t\tif (isOrphanFamily) {\n\t\t\torphanFamKeys.add(key);\n\t\t}\n\n\t\t// Map each person to their families\n\t\tspouseArray.forEach((spouseId) => {\n\t\t\tif (!personToFamKeys.has(spouseId))\n\t\t\t\tpersonToFamKeys.set(spouseId, new Set());\n\t\t\tpersonToFamKeys.get(spouseId)!.add(key);\n\t\t});\n\t\tfamily.children.forEach((childId) => {\n\t\t\tif (!personToFamKeys.has(childId))\n\t\t\t\tpersonToFamKeys.set(childId, new Set());\n\t\t\tpersonToFamKeys.get(childId)!.add(key);\n\t\t});\n\t});\n\n\t// ==============================================\n\t// STEP 5: CREATE INDI RECORDS (WITH ORPHAN FILTERING)\n\t// ==============================================\n\n\tpedigreeData.persons.forEach((person) => {\n\t\tconst gedcomId = personIdMap.get(person.id);\n\t\tif (!gedcomId) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn(\n\t\t\t\t`[GEDCOM] Person ${person.id} not found in personIdMap`\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// ==============================================\n\t\t// ORPHAN PERSON FILTERING\n\t\t// If allowOrphanFamilies=false, skip persons who are ONLY in orphan families\n\t\t// ==============================================\n\t\tif (!allowOrphanFamilies) {\n\t\t\tconst famKeys = personToFamKeys.get(person.id);\n\t\t\t// If person belongs to families, check if ALL of them are orphan families\n\t\t\tif (\n\t\t\t\tfamKeys &&\n\t\t\t\tfamKeys.size > 0 &&\n\t\t\t\tArray.from(famKeys).every((key) => orphanFamKeys.has(key))\n\t\t\t) {\n\t\t\t\treturn; // Skip this orphan person\n\t\t\t}\n\t\t}\n\n\t\tlines.push(`0 ${gedcomId} INDI`);\n\n\t\t// Add FamilySearch ID tag\n\t\tif (person.id) {\n\t\t\tlines.push(`1 _FS_ID ${person.id}`);\n\t\t}\n\n\t\t// Add FamilySearch link for this person\n\t\tif (includeLinks) {\n\t\t\tconst personLink =\n\t\t\t\tperson.links?.person?.href ||\n\t\t\t\tperson.identifiers?.[\"http://gedcomx.org/Persistent\"]?.[0];\n\n\t\t\tif (personLink) {\n\t\t\t\tconst webUrl = transformFamilySearchUrl(personLink);\n\t\t\t\tlines.push(`1 _FS_LINK ${webUrl}`);\n\t\t\t} else if (person.id) {\n\t\t\t\t// Fallback: construct web URL from person ID if no link provided\n\t\t\t\tlet baseUrl = \"https://www.familysearch.org\";\n\t\t\t\tif (environment === \"beta\") {\n\t\t\t\t\tbaseUrl = \"https://beta.familysearch.org\";\n\t\t\t\t} else if (environment === \"integration\") {\n\t\t\t\t\tbaseUrl = \"https://integration.familysearch.org\";\n\t\t\t\t}\n\t\t\t\tconst webUrl = `${baseUrl}/tree/person/${person.id}`;\n\t\t\t\tlines.push(`1 _FS_LINK ${webUrl}`);\n\t\t\t}\n\t\t}\n\n\t\t// Extract from fullDetails if available, otherwise use basic person data\n\t\tconst personData = person.fullDetails?.persons?.[0] || person;\n\n\t\t// Name\n\t\tconst name = extractName(personData);\n\t\tif (name) {\n\t\t\tlines.push(`1 NAME ${name}`);\n\t\t}\n\n\t\t// Gender\n\t\tconst gender = extractGender(personData);\n\t\tif (gender) {\n\t\t\tlines.push(`1 SEX ${gender}`);\n\t\t}\n\n\t\t// Birth\n\t\tconst birth = extractFact(personData, \"BIRTH\");\n\t\tif (birth) {\n\t\t\tlines.push(\"1 BIRT\");\n\t\t\tif (birth.date) {\n\t\t\t\tlines.push(`2 DATE ${birth.date}`);\n\t\t\t}\n\t\t\tif (birth.place) {\n\t\t\t\tlines.push(`2 PLAC ${birth.place}`);\n\t\t\t}\n\t\t}\n\n\t\t// Death\n\t\tconst death = extractFact(personData, \"DEATH\");\n\t\tif (death) {\n\t\t\tlines.push(\"1 DEAT\");\n\t\t\tif (death.date) {\n\t\t\t\tlines.push(`2 DATE ${death.date}`);\n\t\t\t}\n\t\t\tif (death.place) {\n\t\t\t\tlines.push(`2 PLAC ${death.place}`);\n\t\t\t}\n\t\t}\n\n\t\t// Add all other facts from fullDetails\n\t\tpersonData.facts?.forEach((fact) => {\n\t\t\tif (\n\t\t\t\tfact.type &&\n\t\t\t\tfact.type !== \"http://gedcomx.org/Birth\" &&\n\t\t\t\tfact.type !== \"http://gedcomx.org/Death\"\n\t\t\t) {\n\t\t\t\tconst factLines = convertFactToGedcom(fact);\n\t\t\t\tfactLines.forEach((line) => lines.push(line));\n\t\t\t}\n\t\t});\n\n\t\t// Add notes\n\t\tif (includeNotes && person.notes?.persons?.[0]?.notes) {\n\t\t\tperson.notes.persons[0].notes.forEach((note) => {\n\t\t\t\tif (note.text) {\n\t\t\t\t\tconst noteText = note.text.replace(/\\n/g, \" \");\n\t\t\t\t\tlines.push(`1 NOTE ${noteText}`);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// ==============================================\n\t\t// ADD SOURCE CITATIONS TO PERSON\n\t\t// ==============================================\n\t\tconst personSources = (\n\t\t\tpersonData as PersonData & { sources?: SourceReference[] }\n\t\t)?.sources;\n\n\t\tif (personSources && Array.isArray(personSources)) {\n\t\t\tpersonSources.forEach((sourceRef) => {\n\t\t\t\tconst sourceId = sourceRef.descriptionId;\n\t\t\t\tif (!sourceId) return;\n\n\t\t\t\t// Find source index\n\t\t\t\tconst sourceIds = Array.from(sourceMap.keys());\n\t\t\t\tconst sourceIndex = sourceIds.indexOf(sourceId);\n\t\t\t\tif (sourceIndex === -1) return;\n\n\t\t\t\tconst gedcomSourceId = `@S${sourceIndex + 1}@`;\n\t\t\t\tlines.push(`1 SOUR ${gedcomSourceId}`);\n\n\t\t\t\t// Add qualifiers as notes\n\t\t\t\tif (\n\t\t\t\t\tsourceRef.qualifiers &&\n\t\t\t\t\tArray.isArray(sourceRef.qualifiers)\n\t\t\t\t) {\n\t\t\t\t\tsourceRef.qualifiers.forEach((qualifier) => {\n\t\t\t\t\t\tif (qualifier.name && qualifier.value) {\n\t\t\t\t\t\t\tlines.push(\n\t\t\t\t\t\t\t\t`2 NOTE ${qualifier.name}: ${qualifier.value}`\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\t// ==============================================\n\t// STEP 6: CREATE FAM RECORDS (WITH ORPHAN FILTERING)\n\t// ==============================================\n\n\t// Create FAM records\n\tlet famIndex = 1;\n\tconst familyIdMap = new Map<string, string>();\n\n\tfamilies.forEach((family, key) => {\n\t\t// ==============================================\n\t\t// INVALID FAM RECORD PREVENTION\n\t\t// ==============================================\n\n\t\t// Check if parents exist in personIdMap\n\t\tconst spouseArray = Array.from(family.spouses);\n\t\tconst parentsInMap = spouseArray.filter((id) => personIdMap.has(id));\n\n\t\tconst hasNoParents = parentsInMap.length === 0;\n\t\tconst hasSingleParentNoChildren =\n\t\t\tparentsInMap.length === 1 && family.children.length === 0;\n\n\t\t// Skip invalid FAM records\n\t\tif (hasNoParents) {\n\t\t\t// Orphaned child - no parents exist in dataset\n\t\t\tif (family.children.length > 0) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[FS SDK GEDCOM] Skipping FAM for orphaned child(ren): ${family.children.length} child(ren) with 0 parents`\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn; // Skip this FAM record\n\t\t}\n\n\t\tif (hasSingleParentNoChildren) {\n\t\t\t// Single spouse with no children and no other spouse\n\t\t\t// This is an orphaned single-spouse family (invalid per GEDCOM 5.5)\n\t\t\treturn; // Skip this FAM record\n\t\t}\n\n\t\t// Check if this is an orphan family\n\t\t// Family is orphan if NO members (neither spouses NOR children) are connectable to root person\n\t\t// This means the family is isolated and doesn't connect to the ancestry tree\n\t\tconst anyMemberConnectable =\n\t\t\tspouseArray.some((spouseId) => connectablePersons.has(spouseId)) ||\n\t\t\tfamily.children.some((childId) => connectablePersons.has(childId));\n\n\t\tconst isOrphanFamily = !anyMemberConnectable;\n\n\t\t// If orphan families are NOT allowed, skip them entirely\n\t\tif (isOrphanFamily && !allowOrphanFamilies) {\n\t\t\treturn; // Skip this family - no FAM record created\n\t\t}\n\n\t\tconst famId = `@F${famIndex++}@`;\n\t\tfamilyIdMap.set(key, famId);\n\n\t\tlines.push(`0 ${famId} FAM`);\n\n\t\t// Add _IS_ORPHAN_FAMILY tag if this is an orphan family (and allowed)\n\t\tif (isOrphanFamily && allowOrphanFamilies) {\n\t\t\tlines.push(`1 _IS_ORPHAN_FAMILY Y`);\n\t\t}\n\n\t\tif (spouseArray.length === 2) {\n\t\t\tconst [person1, person2] = spouseArray;\n\t\t\tconst person1Data = pedigreeData.persons?.find(\n\t\t\t\t(p) => p.id === person1\n\t\t\t);\n\t\t\tconst person2Data = pedigreeData.persons?.find(\n\t\t\t\t(p) => p.id === person2\n\t\t\t);\n\n\t\t\tconst gender1 = extractGender(\n\t\t\t\tperson1Data?.fullDetails?.persons?.[0] || person1Data\n\t\t\t);\n\t\t\tconst gender2 = extractGender(\n\t\t\t\tperson2Data?.fullDetails?.persons?.[0] || person2Data\n\t\t\t);\n\n\t\t\tconst p1 = personIdMap.get(person1);\n\t\t\tconst p2 = personIdMap.get(person2);\n\t\t\tif (gender1 === \"M\" || gender2 === \"F\") {\n\t\t\t\tif (p1) lines.push(`1 HUSB ${p1}`);\n\t\t\t\tif (p2) lines.push(`1 WIFE ${p2}`);\n\t\t\t} else {\n\t\t\t\tif (p2) lines.push(`1 HUSB ${p2}`);\n\t\t\t\tif (p1) lines.push(`1 WIFE ${p1}`);\n\t\t\t}\n\n\t\t\t// Add marriage facts\n\t\t\taddMarriageFacts(lines, allRelationships, person1, person2);\n\t\t} else if (spouseArray.length === 1) {\n\t\t\tconst parentData = pedigreeData.persons?.find(\n\t\t\t\t(p) => p.id === spouseArray[0]\n\t\t\t);\n\t\t\tconst gender = extractGender(\n\t\t\t\tparentData?.fullDetails?.persons?.[0] || parentData\n\t\t\t);\n\n\t\t\tif (gender === \"M\") {\n\t\t\t\tlines.push(`1 HUSB ${personIdMap.get(spouseArray[0])}`);\n\t\t\t} else {\n\t\t\t\tlines.push(`1 WIFE ${personIdMap.get(spouseArray[0])}`);\n\t\t\t}\n\t\t}\n\n\t\t// Add children\n\t\tfamily.children.forEach((childId) => {\n\t\t\tconst childGedcomId = personIdMap.get(childId);\n\t\t\tif (childGedcomId) {\n\t\t\t\tlines.push(`1 CHIL ${childGedcomId}`);\n\t\t\t}\n\t\t});\n\t});\n\n\t// Add FAMC links to individuals\n\tchildToParents.forEach((parents, childId) => {\n\t\tconst childGedcomId = personIdMap.get(childId);\n\t\tif (!childGedcomId) return;\n\n\t\tlet famId: string | undefined;\n\t\tif (parents.length >= 2) {\n\t\t\tconst famKey = parents.slice(0, 2).sort().join(\"-\");\n\t\t\tfamId = familyIdMap.get(famKey);\n\t\t} else if (parents.length === 1) {\n\t\t\tconst famKey = `single-${parents[0]}`;\n\t\t\tfamId = familyIdMap.get(famKey);\n\t\t}\n\n\t\tif (famId) {\n\t\t\tconst indiRecordIndex = lines.findIndex(\n\t\t\t\t(line) => line === `0 ${childGedcomId} INDI`\n\t\t\t);\n\t\t\tif (indiRecordIndex !== -1) {\n\t\t\t\tlines.splice(indiRecordIndex + 1, 0, `1 FAMC ${famId}`);\n\t\t\t}\n\t\t}\n\t});\n\n\t// Add FAMS links to individuals\n\tfamilies.forEach((family, key) => {\n\t\tconst famId = familyIdMap.get(key);\n\t\tif (!famId) return;\n\n\t\tfamily.spouses.forEach((spouseId) => {\n\t\t\tconst spouseGedcomId = personIdMap.get(spouseId);\n\t\t\tif (!spouseGedcomId) return;\n\n\t\t\tconst indiRecordIndex = lines.findIndex(\n\t\t\t\t(line) => line === `0 ${spouseGedcomId} INDI`\n\t\t\t);\n\t\t\tif (indiRecordIndex !== -1) {\n\t\t\t\tlet insertIndex = indiRecordIndex + 1;\n\t\t\t\twhile (\n\t\t\t\t\tinsertIndex < lines.length &&\n\t\t\t\t\tlines[insertIndex].startsWith(\"1 FAMC\")\n\t\t\t\t) {\n\t\t\t\t\tinsertIndex++;\n\t\t\t\t}\n\t\t\t\tlines.splice(insertIndex, 0, `1 FAMS ${famId}`);\n\t\t\t}\n\t\t});\n\t});\n\n\t// Final validation: Check for orphaned persons (not in any family)\n\tconst personsInFamilies = new Set<string>();\n\tfamilies.forEach((family) => {\n\t\tfamily.spouses.forEach((id) => personsInFamilies.add(id));\n\t\tfamily.children.forEach((id) => personsInFamilies.add(id));\n\t});\n\n\t// GEDCOM Trailer\n\tlines.push(\"0 TRLR\");\n\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Helper to add marriage facts to FAM record\n */\nfunction addMarriageFacts(\n\tlines: string[],\n\trelationships: Relationship[],\n\tperson1: string,\n\tperson2: string\n): void {\n\tconst relKey = [person1, person2].sort().join(\"-\");\n\n\tconst rel = relationships.find((r) => {\n\t\tconst a = r.person1?.resourceId || r.person1?.resource?.resourceId;\n\t\tconst b = r.person2?.resourceId || r.person2?.resource?.resourceId;\n\t\tif (!a || !b) return false;\n\t\treturn [a, b].sort().join(\"-\") === relKey;\n\t});\n\n\tif (!rel) return;\n\n\tconst marriageFacts: PersonFact[] = [];\n\n\t// Check facts directly on relationship\n\tif (rel.facts && Array.isArray(rel.facts)) {\n\t\trel.facts.forEach((f) => {\n\t\t\tif (f.type?.includes(\"Marriage\")) {\n\t\t\t\tmarriageFacts.push(f);\n\t\t\t}\n\t\t});\n\t}\n\n\t// Check details.facts\n\tif (rel.details?.facts && Array.isArray(rel.details.facts)) {\n\t\tmarriageFacts.push(\n\t\t\t...rel.details.facts.filter((f) => f.type?.includes(\"Marriage\"))\n\t\t);\n\t}\n\n\t// Check details.persons[].facts\n\tif (rel.details?.persons && Array.isArray(rel.details.persons)) {\n\t\trel.details.persons.forEach((p) => {\n\t\t\tif (p.facts && Array.isArray(p.facts)) {\n\t\t\t\tp.facts.forEach((f) => {\n\t\t\t\t\tif (f.type?.includes(\"Marriage\")) {\n\t\t\t\t\t\tmarriageFacts.push(f);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\t// Add marriage facts to FAM record\n\tmarriageFacts.forEach((mf) => {\n\t\tconst factLines = convertFactToGedcom(mf);\n\t\tfactLines.forEach((line) => lines.push(line));\n\t});\n}\n\n// Alias for backwards compatibility\nexport const convertFamilySearchToGedcom = convertToGedcom;\n"]}