{"version":3,"file":"webpack.vendors-906efe05.f879e382947aa931eb1a.js","mappings":"o6BAEM,SAAUA,EAAqBC,GAInC,MAAM,MAAEC,EAAK,YAAEC,GAAgBF,EAC/B,IAAI,UAAEG,GAAcD,GAChB,IAAEE,GAAQF,GACV,YAAEG,GAAgBH,EAEtB,MAAO,IACFD,EACHK,MAAOL,EAAMK,MAAMC,KAAKN,GACxBO,iBAAkBP,EAAMO,iBAAiBD,KAAKN,GAC9CQ,kBAAmBR,EAAMQ,kBACzBC,QAAST,EAAMS,QACfC,OAAQV,EAAMU,OACdC,YAAaX,EAAMW,YAAYL,KAAKN,GACpCY,OAAQZ,EAAMY,OAAON,KAAKN,GACtBI,kBACF,OAAOA,C,EAELF,gBACF,OAAOA,C,EAELC,UACF,OAAOA,C,EAELU,SAKF,OAJAX,EAAYD,EAAYC,UACxBC,EAAMF,EAAYE,IAClBC,EAAcH,EAAYG,YAEnBH,C,EAGb,C,MC7Baa,EAOXC,YAAYC,GACVC,KAAKC,OAASF,EAAME,OACpBD,KAAKE,YAAcF,KAAKC,OAAOE,iBAAiBC,SAChDJ,KAAKK,YAAcN,EAAMhB,K,CAGvBuB,qBACF,QAASN,KAAKK,W,CAGZtB,YACF,OAAOiB,KAAKK,aAAeL,KAAKC,OAAOlB,K,CAGrCqB,eACF,MAAM,YAAEF,EAAW,OAAED,EAAM,MAAElB,GAAUiB,MACjC,KAAEO,GAASN,GACX,GAAEL,GAAOb,EACTgB,EAAQC,KAAKQ,WAAWZ,GAE9B,OAAOa,OAAOC,YACZD,OAAOE,QAAQT,GAAaU,KAAI,EAAEC,EAAMC,KAW/B,CAACD,EAVOE,IAAIC,KACjB,MAAMC,EAAWH,KAAWE,EAAXF,CAAiBf,GAMlC,OAJKH,EAAGsB,QAAQ,oBAAuBlB,KAAKM,gBAC1CC,EAAKY,SAASvB,GAGTqB,CAAQ,K,CAQnBG,YACF,MAAO,IAAMpB,KAAKqB,a,CAGhBC,UACF,MAAO,IAAMtB,KAAKuB,W,CAGbF,YAAYG,EAAuBC,GAAiB,GACzD,MAAM,YAAEvB,EAAW,OAAED,EAAM,MAAElB,GAAUiB,MACjC,KAAEO,GAASN,EACXyB,EAAuB,GACvBC,IAAwBH,EACxB5B,EAAK4B,GAAWzC,EAAMa,GAetBwB,EAAQ,IACTX,OAAOC,YACRD,OAAOE,QAAQT,GAAaU,KAAI,EAAEC,EAAMC,KAU/B,CAACD,EATee,IAAIZ,KACzB,MAAMjB,EAAQC,KAAKQ,WAAWZ,EAAI6B,GAC5BR,EAAWH,KAAWE,EAAXF,CAAiBf,GAIlC,OAFA2B,EAAUG,KAAKZ,GAERG,CAAK,MAMlBU,IA5BUA,KAEPH,IACEF,GACC7B,EAAGsB,QAAQ,oBACXlB,KAAKM,gBAETC,EAAKY,SAASvB,GAGT8B,EAAUK,OAAMd,IAAyB,IAAbA,MAqBrC,OAAOG,C,CAGFG,UAAUC,GACf,MAAM,YAAEtB,EAAW,MAAEnB,GAAUiB,KAEzBJ,EAAK4B,GAAWzC,EAAMa,GACtBG,EAAQC,KAAKQ,WAAWZ,GAFb,GASjB,MAAO,IANmBa,OAAOC,YAC/BD,OAAOE,QAAQT,GAAaU,KAAI,EAAEC,EAAMC,KAC/B,CAACD,EAAM,IAAIG,IAAkBF,KAAWE,EAAXF,CAAiB,IAAKf,EAAOoB,cAAUa,QAM7EZ,MAAOA,IAAMpB,KAAKqB,YAAYzB,GAXf,G,CAeZY,WAAWZ,EAAiB6B,GAAiB,GAClD,MAAM,YAAEvB,EAAW,OAAED,EAAM,MAAElB,GAAUiB,MACjC,KAAEO,GAASN,EAEXF,EAAsB,CAC1BH,KACAK,SACAM,OACAxB,MAAOF,EAAqB,CAC1BE,QACAC,YAAaY,IAEfuB,SAAUM,EAAiB,KAAgB,OAAEO,EAC7CZ,MAAOA,IAAMpB,KAAKqB,YAAYzB,EAAI6B,GAClCH,IAAKA,IAAMtB,KAAKuB,UAAU3B,GACtBQ,eACF,OAAOK,OAAOC,YACZD,OAAOE,QAAQT,GAAaU,KAAI,EAAEC,EAAMC,KAC/B,CAACD,EAAM,IAAIG,IAAkBF,KAAWE,EAAXF,CAAiBf,M,GAM7D,OAAOA,C,QCpIEkC,EAAbnC,cAEU,KAAS4B,UAAkC,CAAC,C,CAE7CQ,GAAqCC,EAAkBC,GAO5D,OANKpC,KAAK0B,UAAUS,KAClBnC,KAAK0B,UAAUS,GAAS,IAG1BnC,KAAK0B,UAAUS,GAAON,KAAKO,GAEpBpC,I,CAGCqC,KAAuCF,KAAqBnB,GACpE,MAAMU,EAAY1B,KAAK0B,UAAUS,GAMjC,OAJIT,GACFA,EAAUY,SAAQrB,GAAYA,EAAS7B,MAAMY,KAAMgB,KAG9ChB,I,CAGFuC,IAAsCJ,EAAkBC,GAC7D,MAAMV,EAAY1B,KAAK0B,UAAUS,GAUjC,OARIT,IACEU,EACFpC,KAAK0B,UAAUS,GAAST,EAAUc,QAAOvB,GAAYA,IAAamB,WAE3DpC,KAAK0B,UAAUS,IAInBnC,I,CAGCyC,qBACRzC,KAAK0B,UAAY,CAAC,C,WC/CNgB,EACdC,EACAC,EACAC,GAGA,YAAgCb,IAA5BW,EAAU7D,OAAO8D,IAAwBD,EAAUG,OAC9CJ,EAAkBC,EAAUG,OAAQF,EAAOC,GAGb,mBAA5BF,EAAU7D,OAAO8D,GACZD,EAAU7D,OAAO8D,GAAOvD,KAAK,IACtCwD,EACHC,OAAQH,EAAUG,OACdJ,EAAkBC,EAAUG,OAAQF,EAAOC,GAC3C,OAMDF,EAAU7D,OAAO8D,EAC1B,CCnBM,SAAUG,EAAgBC,GAK9B,MAAO,CACLC,eALqBD,EAAWR,QAAOG,GAAgC,cAAnBA,EAAUO,OAM9DC,eALqBH,EAAWR,QAAOG,GAAgC,SAAnBA,EAAUO,OAM9DE,eALqBJ,EAAWR,QAAOG,GAAgC,SAAnBA,EAAUO,OAOlE,CCCM,SAAUG,EAA4BL,GAC1C,MAAMM,EAA4C,IAC5C,eAAEH,EAAc,eAAEC,GAAmBL,EAAgBC,GACrDO,EAAwB,IAAIJ,KAAmBC,GAC/CI,EAAwC,CAC5CC,QAAS,KACTC,UAAU,EACVC,WAAY,KACZC,UAAW,KACXC,aAAa,EACbC,YAAY,GAqFd,OAlFAd,EAAWV,SAAQK,IACjB,MAMMoB,EAAsBrB,EAC1BC,EACA,sBARc,CACd9B,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,QACnBC,QAAStB,EAAUsB,UAShBF,GAKoBA,IAERzB,SAAQ4B,IACvBA,EAAgBC,MAAM7B,SAAQY,IAC5BzC,OACGE,QAAQuD,EAAgBE,YACxB9B,SAAQ,EAAEzB,EAAMwD,MACff,EAAoBzB,KAAK,CACvBqB,OACArC,OACAwD,UAAW,IACNb,KACAa,IAEL,GACF,GACJ,GACF,IAGJd,EAAsBjB,SAAQK,IAC5B,MAAME,EAAU,CACdhC,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,QACnBC,QAAStB,EAAUsB,SAGfK,EAAgB5B,EACpBC,EACA,gBACAE,GAGF,IAAKyB,EACH,OAIF,MAAMF,EAAaE,IAEnB7D,OACGE,QAAQyD,GACR9B,SAAQ,EAAEzB,EAAMwD,MACf,MAAME,EAAa,IACdf,KACAa,GAG8B,mBAAxBE,aAAU,EAAVA,EAAYd,WACrBc,EAAWd,QAAUc,EAAWd,YAG9Bc,aAAA,EAAAA,EAAYT,kBAAsC9B,KAAxBuC,aAAA,EAAAA,EAAYd,iBACjCc,EAAWd,QAGpBH,EAAoBzB,KAAK,CACvBqB,KAAMP,EAAU9B,KAChBA,OACAwD,UAAWE,GACX,GACF,IAGCjB,CACT,CC9GgB,SAAAkB,EAAYC,EAA+BhF,GACzD,GAA0B,iBAAfgF,EAAyB,CAClC,IAAKhF,EAAOiF,MAAMD,GAChB,MAAME,MACJ,gCAAgCF,8CAIpC,OAAOhF,EAAOiF,MAAMD,EACrB,CAED,OAAOA,CACT,CCdgB,SAAAG,KAAmBC,GACjC,OAAOA,EACJrC,QAAOsC,KAAUA,IACjBC,QAAO,CAACC,EAAOF,KACd,MAAMG,EAAmB,IAAKD,GA2B9B,OAzBAvE,OAAOE,QAAQmE,GAAMxC,SAAQ,EAAE4C,EAAKC,MAGlC,GAFeF,EAAiBC,GAQhC,GAAY,UAARA,EAAiB,CACnB,MAAME,EAAyBD,EAAQA,EAAME,MAAM,KAAO,GACpDC,EAA4BL,EAAiBC,GAAOD,EAAiBC,GAAKG,MAAM,KAAO,GAEvFE,EAAgBH,EAAa5C,QACjCgD,IAAeF,EAAgBG,SAASD,KAG1CP,EAAiBC,GAAO,IAAII,KAAoBC,GAAeG,KAAK,IACrE,MACCT,EAAiBC,GADA,UAARA,EACe,CAACD,EAAiBC,GAAMC,GAAOO,KAAK,MAEpCP,OAjBxBF,EAAiBC,GAAOC,CAkBzB,IAGIF,CAAgB,GACtB,CAAC,EACR,CC5BgB,SAAAU,EACdC,EACAtC,GAEA,OAAOA,EACJd,QAAOsC,GAAQA,EAAKT,UAAUX,WAC9B9C,KAAIkE,GACEA,EAAKT,UAAUV,WAMbmB,EAAKT,UAAUV,WAAWiC,EAAWC,QAAU,CAAC,EAL9C,CACL,CAACf,EAAKjE,MAAO+E,EAAWC,MAAMf,EAAKjE,SAMxCkE,QAAO,CAACX,EAAYC,IAAcO,EAAgBR,EAAYC,IAAY,CAAC,EAChF,CCrBM,SAAUyB,EAAWX,GACzB,MAAwB,mBAAVA,CAChB,CCQM,SAAUY,EAAgBZ,EAAUtC,OAAeb,KAAcjC,GACrE,OAAI+F,EAAWX,GACTtC,EACKsC,EAAM9F,KAAKwD,EAAXsC,IAAuBpF,GAGzBoF,KAASpF,GAGXoF,CACT,CCTgB,SAAAa,EACdC,EACA3C,GAEA,OAAI2C,EAAUC,MACLD,EAGF,IACFA,EACHE,SAAUC,IACR,MAAMC,EAAgBJ,EAAUE,SAAWF,EAAUE,SAASC,GAAQH,EAAUJ,MAEhF,IAAsB,IAAlBQ,EACF,OAAO,EAGT,MAAMC,EAAgBhD,EAAoByB,QAAO,CAACC,EAAOF,KACvD,MAAMK,EAAQL,EAAKT,UAAUT,UACzBkB,EAAKT,UAAUT,UAAUwC,GC9B/B,SAAqBjB,GACzB,MAAqB,iBAAVA,EACFA,EAGLA,EAAMoB,MAAM,wBACPC,OAAOrB,GAGF,SAAVA,GAIU,UAAVA,GAIGA,CACT,CDaYsB,CAAYL,EAAqBM,aAAa5B,EAAKjE,OAEvD,OAAIsE,QACKH,EAGF,IACFA,EACH,CAACF,EAAKjE,MAAOsE,EACd,GACA,CAAC,GAEJ,MAAO,IAAKkB,KAAkBC,EAAe,EAGnD,CElCA,SAASK,EAAqBC,GAC5B,OAAOnG,OAAOC,YAEZD,OAAOE,QAAQiG,GAAMpE,QAAO,EAAE0C,EAAKC,MACrB,UAARD,IChBM,SAAcC,EAAQ,CAAC,GACrC,OAAqC,IAA9B1E,OAAOoG,KAAK1B,GAAO2B,QAAgB3B,EAAMrF,cAAgBW,MAClE,CDc6BsG,CAAc5B,KAI9BA,UAGb,CErBgB,SAAA6B,EAAoBnG,EAAcpB,GAChD,OAAOA,EAAOiF,MAAM7D,IAASpB,EAAOwH,MAAMpG,IAAS,IACrD,CCFgB,SAAAqG,EAAwBvE,EAAyBwE,GAC/D,OAAIC,MAAMC,QAAQF,GACTA,EAAQG,MAAKC,IACuB,iBAArBA,EAChBA,EACAA,EAAiB1G,QAEL8B,EAAU9B,OAIvBsG,CACT,CCZa,MAAAK,EAA0BA,CAACC,EAAoBC,EAAW,OACrE,IAAIC,EAAa,GAEjB,MAAMC,EAAcH,EAAMI,aAmB1B,OAjBAJ,EAAM3E,OAAOgF,aACXC,KAAKC,IAAI,EAAGJ,EAAcF,GAC1BE,GACA,CAACxB,EAAM6B,EAAKnF,EAAQoF,K,QAClB,MAAMC,GAAgC,QAAxBC,GAAAC,EAAAjC,EAAKlD,KAAKoF,MAAKC,cAAS,IAAAH,OAAA,EAAAA,EAAAI,KAAAH,EAAA,CACpCjC,OACA6B,MACAnF,SACAoF,YAEG9B,EAAKqC,aACL,SAELd,GAAcQ,EAAMO,MAAM,EAAGX,KAAKC,IAAI,EAAGJ,EAAcK,GAAK,IAIzDN,CAAU,ECxBb,SAAUgB,EAASxD,GACvB,MAAiD,oBAA1C1E,OAAOmI,UAAUC,SAASL,KAAKrD,EACxC,C,MCuBa2D,EAYXhJ,YAAYhB,GAWVkB,KAAK+I,KAAOjK,EAAOiK,KACnB/I,KAAKgJ,QAAUlK,EAAOkK,O,EAI1B,MAAMC,EAA0BA,CAC9BC,EACAH,KAEA,GAAIJ,EAASI,GACX,OAAOA,EAAKI,KAAKD,GAGnB,MAAME,EAAiBL,EAAKG,GAE5B,IAAKE,EACH,OAAO,KAGT,MAAMC,EAAmC,CAACD,EAAeF,MAgBzD,OAdAG,EAAOnB,MAAQkB,EAAelB,MAC9BmB,EAAOC,MAAQJ,EACfG,EAAOzC,KAAOwC,EAAexC,KAEzBwC,EAAeG,cACZH,EAAeF,KAAKzD,SAAS2D,EAAeG,cAC/CC,QAAQC,KACN,sFAIJJ,EAAOxH,KAAKuH,EAAeG,cAGtBF,CAAM,EAGf,SAASK,EAAI5K,G,MAQX,MAAM,OACJmB,EAAM,KAAE0J,EAAI,GAAEC,EAAE,KAAEV,EAAI,MAAEW,EAAK,OAAEC,GAC7BhL,GACE,KAAEyB,GAASN,EAEjB,GAAIM,EAAKwJ,UACP,OAAO,EAGT,MAAMtC,EAAQlH,EAAKxB,MAAMG,IAAI8K,QAAQL,GAErC,GAEElC,EAAM3E,OAAOI,KAAKoF,KAAK2B,OAEmB,QAArC5B,EAACZ,EAAMyC,YAAczC,EAAM0C,iBAAU,IAAA9B,OAAA,EAAAA,EAAEpB,MAAM8B,MAAKqB,GAAQA,EAAKlH,KAAKoF,KAAK2B,QAE9E,OAAO,EAGT,IAAII,GAAU,EAEd,MAAM1C,EAAaH,EAAwBC,GAASyB,EAuDpD,OArDAW,EAAMvH,SAAQgI,IACZ,GAAID,EACF,OAGF,MAAM9D,EAAQ0C,EAAwBtB,EAAY2C,EAAKvB,MAEvD,IAAKxC,EACH,OAGF,MAAM3G,EAAKW,EAAKxB,MAAMa,GAChBb,EAAQF,EAAqB,CACjCE,MAAOwB,EAAKxB,MACZC,YAAaY,IAET2K,EAAQ,CACZZ,KAAMA,GAAQpD,EAAM,GAAGO,OAASoC,EAAKpC,QACrC8C,OAGI,SAAExJ,EAAQ,MAAEgB,EAAK,IAAEE,GAAQ,IAAIzB,EAAe,CAClDI,SACAlB,UAac,OAVAuL,EAAKtB,QAAQ,CAC3BjK,QACAwL,QACAhE,QACAnG,WACAgB,QACAE,SAIuB1B,EAAG4K,MAAM1D,SAMlClH,EAAG6K,QAAQX,EAAQ,CACjBY,UAAW9K,EACX+J,OACAC,KACAV,SAGF3I,EAAKY,SAASvB,GACdyK,GAAU,EAAI,IAGTA,CACT,CAOM,SAAUM,EAAiB5K,GAC/B,MAAM,OAAEE,EAAM,MAAE4J,GAAU9J,EACpB+J,EAAS,IAAIc,EAAAA,GAAO,CACxB7L,MAAO,CACL8L,KAAIA,IACK,KAETzL,MAAKA,CAACQ,EAAIkL,IACOlL,EAAGsB,QAAQ4I,KAMnBlK,EAAGmL,cAAgBnL,EAAGoL,WAAa,KAAOF,IAIrD/K,MAAO,CACLkL,gBAAeA,CAAC1K,EAAMoJ,EAAMC,EAAIV,IACvBQ,EAAI,CACTzJ,SACA0J,OACAC,KACAV,OACAW,QACAC,WAIJoB,gBAAiB,CACfC,eAAgB5K,IACd6K,YAAW,KACT,MAAM,QAAEC,GAAY9K,EAAKxB,MAAME,UAE3BoM,GACF3B,EAAI,CACFzJ,SACA0J,KAAM0B,EAAQpD,IACd2B,GAAIyB,EAAQpD,IACZiB,KAAM,GACNW,QACAC,UAEH,KAGI,IAMXwB,cAAc/K,EAAM4B,GAClB,GAAkB,UAAdA,EAAM+C,IACR,OAAO,EAGT,MAAM,QAAEmG,GAAY9K,EAAKxB,MAAME,UAE/B,QAAIoM,GACK3B,EAAI,CACTzJ,SACA0J,KAAM0B,EAAQpD,IACd2B,GAAIyB,EAAQpD,IACZiB,KAAM,KACNW,QACAC,U,GASRyB,cAAc,IAGhB,OAAOzB,CACT,C,MC1Oa0B,EAYX1L,YAAYhB,GAWVkB,KAAK+I,KAAOjK,EAAOiK,KACnB/I,KAAKgJ,QAAUlK,EAAOkK,O,EAuGpB,SAAUyC,EAAiB1L,GAC/B,MAAM,OAAEE,EAAM,MAAE4J,GAAU9J,EAC1B,IAAI2L,EAAoC,KACpCC,GAA0B,EAC1BC,GAA2B,EAE/B,MAAMpM,EAAUqK,EAAMjJ,KAAI0J,GACjB,IAAIM,EAAAA,GAAO,CAEhBrK,KAAKA,GACH,MAAMsL,EAAmB1J,I,MACvBuJ,GAA0C,QAAtBrD,EAAA9H,EAAKuL,IAAIC,qBAAa,IAAA1D,OAAA,EAAAA,EAAE2D,SAAS7J,EAAM8J,SACvD1L,EAAKuL,IAAIC,cACT,IAAI,EAKV,OAFAG,OAAOC,iBAAiB,YAAaN,GAE9B,CACLO,UACEF,OAAOG,oBAAoB,YAAaR,E,IAK9C9L,MAAO,CACLmL,gBAAiB,CACfoB,KAAM/L,IACJqL,EAA2BF,IAAsBnL,EAAKuL,IAAIC,eAEnD,GAGTQ,MAAOA,CAAChM,EAAM4B,K,MACZ,MAAMqK,EAA8C,QAAvCnE,EAAClG,EAAyBsK,qBAAa,IAAApE,OAAA,EAAAA,EAAEqE,QAAQ,aAI9D,OAFAf,KAA4Ba,aAAA,EAAAA,EAAM/G,SAAS,mBAEpC,CAAK,IAKlBkH,kBAAmBA,CAACC,EAAcC,EAAU9N,KAC1C,MAAMC,EAAc4N,EAAa,GAC3BE,EAA6C,UAAnC9N,EAAYkC,QAAQ,aAA2ByK,EACzDoB,EAA4C,SAAnC/N,EAAYkC,QAAQ,aAA0B0K,EAE7D,IAAKkB,IAAYC,EACf,OAIF,MAAMpD,EAAOkD,EAAS3N,IAAI8N,QAAQC,cAAclO,EAAMG,IAAI8N,SACpDpD,EAAKiD,EAAS3N,IAAI8N,QAAQE,YAAYnO,EAAMG,IAAI8N,SAEtD,GC/MkB,iBD+MJrD,IAAUC,GAAMD,IAASC,EAAGuD,EACxC,OAKF,MAAMvN,EAAKb,EAAMa,GACXwN,EAAiBvO,EAAqB,CAC1CE,QACAC,YAAaY,IAGToJ,EApId,SAAalK,GAOX,MAAM,OACJmB,EAAM,MAAElB,EAAK,KAAE4K,EAAI,GAAEC,EAAE,KAAEU,GACvBxL,GAEE,SAAEsB,EAAQ,MAAEgB,EAAK,IAAEE,GAAQ,IAAIzB,EAAe,CAClDI,SACAlB,UAGIsO,EAA4B,GAwClC,OAtCAtO,EAAMG,IAAI4I,aAAa6B,EAAMC,GAAI,CAACxD,EAAM6B,KACtC,IAAK7B,EAAKkH,aAAelH,EAAKlD,KAAKoF,KAAK2B,KACtC,OAGF,MAAMsD,EAAexF,KAAKC,IAAI2B,EAAM1B,GAC9BuF,EAAazF,KAAK0F,IAAI7D,EAAI3B,EAAM7B,EAAK4G,QAAQU,MA3DvBC,EAC9BzE,EACAH,KAEA,GAAIJ,EAASI,GACX,MAAO,IAAIG,EAAK0E,SAAS7E,IAG3B,MAAM8E,EAAU9E,EAAKG,GAErB,OAAK2E,EAIEA,EAAQjN,KAAIkN,IACjB,MAAMzE,EAAmC,CAACyE,EAAe5E,MAgBzD,OAdAG,EAAOnB,MAAQ4F,EAAe5F,MAC9BmB,EAAOC,MAAQJ,EACfG,EAAOzC,KAAOkH,EAAelH,KAEzBkH,EAAevE,cACZuE,EAAe5E,KAAKzD,SAASqI,EAAevE,cAC/CC,QAAQC,KACN,sFAIJJ,EAAOxH,KAAKiM,EAAevE,cAGtBF,CAAM,IApBN,EAqBP,EA8BgBsE,CAFIvH,EAAK2H,YAAYR,EAAetF,EAAKuF,EAAavF,OAAKjG,EAAW,KAEjCsI,EAAKvB,MAElDzG,SAAQiE,IACd,QAAoBvE,IAAhBuE,EAAM2B,MACR,OAGF,MAAM8F,EAAQT,EAAehH,EAAM2B,MAAQ,EACrC+F,EAAMD,EAAQzH,EAAM,GAAGO,OACvByD,EAAQ,CACZZ,KAAM5K,EAAMa,GAAGsO,QAAQtN,IAAIoN,GAC3BpE,GAAI7K,EAAMa,GAAGsO,QAAQtN,IAAIqN,IAGrBjF,EAAUsB,EAAKtB,QAAQ,CAC3BjK,QACAwL,QACAhE,QACAnG,WACAgB,QACAE,QAGF+L,EAASxL,KAAKmH,EAAQ,GACtB,IAGYqE,EAAStL,OAAMiH,GAAuB,OAAZA,GAG5C,CA2EwBlH,CAAI,CAClB7B,SACAlB,MAAOqO,EACPzD,KAAM5B,KAAKC,IAAI2B,EAAO,EAAG,GACzBC,GAAIA,EAAGuD,EAAI,EACX7C,SAIF,OAAKtB,GAAYpJ,EAAG4K,MAAM1D,OAInBlH,OAJP,CAIS,MAKf,OAAOJ,CACT,C,ME1Na2O,EASXrO,YAAYkD,EAAwB/C,GAFpC,KAAemO,gBAAa,GAG1BpO,KAAKC,OAASA,EACdD,KAAKgD,WAAamL,EAAiBnE,QAAQhH,GAC3ChD,KAAKP,OTRO,SAA8BuD,EAAwB/C,G,MACpE,MAAMoO,EAAgBhL,EAA4BL,IAC5C,eAAEG,EAAc,eAAEC,GAAmBL,EAAgBC,GACrDsL,EAAmF,QAAzEjG,EAAAlF,EAAe4F,MAAKpG,GAAaD,EAAkBC,EAAW,oBAAW,IAAA0F,OAAA,EAAAA,EAAExH,KAErF6D,EAAQjE,OAAOC,YACnByC,EAAevC,KAAI+B,IACjB,MAAMW,EAAsB+K,EAAc7L,QACxC6B,GAAaA,EAAUnB,OAASP,EAAU9B,OAEtCgC,EAAU,CACdhC,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,QACnBC,QAAStB,EAAUsB,QACnBhE,UAgBIR,EAAmBkH,EAAkB,IAbnB3D,EAAW+B,QAAO,CAACwJ,EAAQC,KACjD,MAAMC,EAAmB/L,EACvB8L,EACA,mBACA3L,GAGF,MAAO,IACF0L,KACCE,EAAmBA,EAAiB9L,GAAa,CAAC,EACvD,GACA,CAAC,GAIFqK,QAASjH,EACPrD,EAAyCC,EAAW,UAAWE,IAEjEoE,MAAOlB,EAAarD,EAAuCC,EAAW,QAASE,IAC/E6L,MAAO3I,EAAarD,EAAuCC,EAAW,QAASE,IAC/E8L,OAAQ5I,EAAarD,EAAwCC,EAAW,SAAUE,IAClF+L,KAAM7I,EAAarD,EAAsCC,EAAW,OAAQE,IAC5EgM,WAAY9I,EACVrD,EAA4CC,EAAW,aAAcE,IAEvEiM,UAAW/I,EACTrD,EAA2CC,EAAW,YAAaE,IAErEoH,KAAMlE,EAAarD,EAAsCC,EAAW,OAAQE,IAC5EkM,SAAUhJ,EACRrD,EAA0CC,EAAW,WAAYE,IAEnEmM,UAAWjJ,EACTrD,EAA2CC,EAAW,YAAaE,IAErEgD,MAAOpF,OAAOC,YACZ4C,EAAoB1C,KAAIqO,I,MACtB,MAAO,CAACA,EAAmBpO,KAAM,CAAE4C,QAAsC,QAA7B4E,EAAA4G,aAAkB,EAAlBA,EAAoB5K,iBAAS,IAAAgE,OAAA,EAAAA,EAAE5E,SAAU,OAKrFG,EAAYmC,EAChBrD,EAA2CC,EAAW,YAAaE,IAGjEe,IACFnE,EAAOyP,SAAWtL,EAAUhD,KAAIqF,GAAaD,EAAqCC,EAAW3C,MAG/F,MAAMK,EAAajB,EACjBC,EACA,aACAE,GAGEc,IACFlE,EAAO0P,MAAQ/I,GAAQzC,EAAW,CAChCyC,OACAgJ,eAAgBzJ,EAAsBS,EAAM9C,MAIhD,MAAM+L,EAAa3M,EACjBC,EACA,aACAE,GAOF,OAJIwM,IACF5P,EAAO8I,OAAS8G,GAGX,CAAC1M,EAAU9B,KAAMpB,EAAO,KAI7BwH,EAAQxG,OAAOC,YACnB0C,EAAexC,KAAI+B,IACjB,MAAMW,EAAsB+K,EAAc7L,QACxC6B,GAAaA,EAAUnB,OAASP,EAAU9B,OAEtCgC,EAAU,CACdhC,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,QACnBC,QAAStB,EAAUsB,QACnBhE,UAgBIR,EAAmBkH,EAAkB,IAbnB3D,EAAW+B,QAAO,CAACwJ,EAAQC,KACjD,MAAMc,EAAmB5M,EACvB8L,EACA,mBACA3L,GAGF,MAAO,IACF0L,KACCe,EAAmBA,EAAiB3M,GAAa,CAAC,EACvD,GACA,CAAC,GAIF4M,UAAWxJ,EACTrD,EAA2CC,EAAW,YAAaE,IAErE2M,SAAUzJ,EACRrD,EAA0CC,EAAW,WAAYE,IAEnE6L,MAAO3I,EAAarD,EAAuCC,EAAW,QAASE,IAC/E4M,SAAU1J,EACRrD,EAA0CC,EAAW,WAAYE,IAEnEoH,KAAMlE,EAAarD,EAAsCC,EAAW,OAAQE,IAC5EgD,MAAOpF,OAAOC,YACZ4C,EAAoB1C,KAAIqO,I,MACtB,MAAO,CAACA,EAAmBpO,KAAM,CAAE4C,QAAsC,QAA7B4E,EAAA4G,aAAkB,EAAlBA,EAAoB5K,iBAAS,IAAAgE,OAAA,EAAAA,EAAE5E,SAAU,OAKrFG,EAAYmC,EAChBrD,EAA2CC,EAAW,YAAaE,IAGjEe,IACFnE,EAAOyP,SAAWtL,EAAUhD,KAAIqF,GAAaD,EAAqCC,EAAW3C,MAG/F,MAAMK,EAAajB,EACjBC,EACA,aACAE,GAUF,OAPIc,IACFlE,EAAO0P,MAAQ/E,GAAQzG,EAAW,CAChCyG,OACAgF,eAAgBzJ,EAAsByE,EAAM9G,MAIzC,CAACX,EAAU9B,KAAMpB,EAAO,KAInC,OAAO,IAAIiQ,EAAAA,GAAO,CAChBpB,UACA5J,QACAuC,SAEJ,CSjKkB0I,CAA8B3P,KAAKgD,WAAY/C,GAE7DD,KAAKgD,WAAWV,SAAQK,I,MAEtB3C,KAAKC,OAAO2P,iBAAiBjN,EAAU9B,MAAQ8B,EAAUsB,QAEzD,MAAMpB,EAAU,CACdhC,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,QACnBC,QAAStB,EAAUsB,QACnBhE,OAAQD,KAAKC,OACbiD,KAAM8D,EAAoBrE,EAAU9B,KAAMb,KAAKP,SAG1B,SAAnBkD,EAAUO,OAC0E,QAAlEmF,EAAAtC,EAAarD,EAAkBC,EAAW,cAAeE,WAAS,IAAAwF,GAAAA,IAGpFrI,KAAKoO,gBAAgBvM,KAAKc,EAAU9B,MAIxC,MAAMgP,EAAiBnN,EACrBC,EACA,iBACAE,GAGEgN,GACF7P,KAAKC,OAAOiC,GAAG,eAAgB2N,GAGjC,MAAMC,EAAWpN,EAAyCC,EAAW,WAAYE,GAE7EiN,GACF9P,KAAKC,OAAOiC,GAAG,SAAU4N,GAG3B,MAAMC,EAAWrN,EAAyCC,EAAW,WAAYE,GAE7EkN,GACF/P,KAAKC,OAAOiC,GAAG,SAAU6N,GAG3B,MAAMC,EAAoBtN,EACxBC,EACA,oBACAE,GAGEmN,GACFhQ,KAAKC,OAAOiC,GAAG,kBAAmB8N,GAGpC,MAAMC,EAAgBvN,EACpBC,EACA,gBACAE,GAGEoN,GACFjQ,KAAKC,OAAOiC,GAAG,cAAe+N,GAGhC,MAAMC,EAAUxN,EAAwCC,EAAW,UAAWE,GAE1EqN,GACFlQ,KAAKC,OAAOiC,GAAG,QAASgO,GAG1B,MAAMC,EAASzN,EAAuCC,EAAW,SAAUE,GAEvEsN,GACFnQ,KAAKC,OAAOiC,GAAG,OAAQiO,GAGzB,MAAMC,EAAY1N,EAA0CC,EAAW,YAAaE,GAEhFuN,GACFpQ,KAAKC,OAAOiC,GAAG,UAAWkO,EAC3B,G,CAILC,eAAerN,GACb,MAAMsN,EAAqBnC,EAAiBoC,KAAKpC,EAAiBqC,QAAQxN,IACpEyN,ECvHJ,SAAyBzL,GAC7B,MAAM0L,EAAW1L,EAAMxC,QAAO,CAACmO,EAAIzI,IAAUlD,EAAM4L,QAAQD,KAAQzI,IAEnE,MAAO,IAAI,IAAI2I,IAAIH,GACrB,CDmH4BI,CAAeR,EAAmB1P,KAAI+B,GAAaA,EAAU9B,QAUrF,OARI4P,EAAgB3J,QAClB0C,QAAQC,KACN,oDAAoDgH,EACjD7P,KAAIkE,GAAY,IAAAA,OAChBY,KAAK,oCAIL4K,C,CAGTD,eAAerN,GACb,OACEA,EACGpC,KAAI+B,IACH,MAMMoO,EAAgBrO,EACpBC,EACA,gBARc,CACd9B,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,QACnBC,QAAStB,EAAUsB,UASrB,OAAI8M,EACK,CAACpO,KAAc3C,KAAKwQ,QAAQO,MAG9BpO,CAAS,IAGjBqO,KAAK,G,CAIZX,YAAYrN,GAGV,OAAOA,EAAWuN,MAAK,CAACU,EAAG9D,KACzB,MAAM+D,EAAYxO,EAAyCuO,EAAG,aAHxC,IAIhBE,EAAYzO,EAAyCyK,EAAG,aAJxC,IAMtB,OAAI+D,EAAYC,GACN,EAGND,EAAYC,EACP,EAGF,CAAC,G,CAIR/Q,eACF,OAAOJ,KAAKgD,WAAW+B,QAAO,CAAC3E,EAAUuC,KACvC,MAQMyO,EAAc1O,EAClBC,EACA,cAVc,CACd9B,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,QACnBC,QAAStB,EAAUsB,QACnBhE,OAAQD,KAAKC,OACbiD,KAAM8D,EAAoBrE,EAAU9B,KAAMb,KAAKP,UASjD,OAAK2R,EAIE,IACFhR,KACAgR,KALIhR,CAMR,GACA,CAAC,E,CAGFZ,cACF,MAAM,OAAES,GAAWD,KAObgD,EAAamL,EAAiBoC,KAAK,IAAIvQ,KAAKgD,YAAYqO,WAExDC,EAAoB,GACpBC,EAAoB,GAEpBC,EAAaxO,EAChBpC,KAAI+B,IACH,MAAME,EAAU,CACdhC,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,QACnBC,QAAStB,EAAUsB,QACnBhE,SACAiD,KAAM8D,EAAoBrE,EAAU9B,KAAMb,KAAKP,SAG3CD,EAAoB,GAEpBiS,EAAuB/O,EAC3BC,EACA,uBACAE,GAGF,IAAI6O,EAAiD,CAAC,EAOtD,GAJuB,SAAnB/O,EAAUO,MAAmBP,EAAU7D,OAAO6S,WAChDD,EAAgBE,WAAa,IAAMC,GAAKC,WAAW,CAAE7R,SAAQmK,KAAMzH,KAGjE8O,EAAsB,CACxB,MAAMM,EAAWtR,OAAOC,YACtBD,OAAOE,QAAQ8Q,KAAwB7Q,KAAI,EAAEoR,EAAUjR,KAC9C,CAACiR,EAAU,IAAMjR,EAAO,CAAEd,eAIrCyR,EAAkB,IAAKA,KAAoBK,EAC5C,CAED,MAAME,GAAeC,EAAAA,EAAAA,GAAOR,GAE5BlS,EAAQqC,KAAKoQ,GAEb,MAAME,EAAgBzP,EACpBC,EACA,gBACAE,GAGEqE,EAAwBvE,EAAW1C,EAAO+D,QAAQoO,mBAAqBD,GACzEb,EAAWzP,QAAQsQ,KAGrB,MAAME,EAAgB3P,EACpBC,EACA,gBACAE,GAGEqE,EAAwBvE,EAAW1C,EAAO+D,QAAQsO,mBAAqBD,GACzEd,EAAW1P,QAAQwQ,KAGrB,MAAME,EAAwB7P,EAC5BC,EACA,wBACAE,GAGF,GAAI0P,EAAuB,CACzB,MAAMC,EAAqBD,IAE3B/S,EAAQqC,QAAQ2Q,EACjB,CAED,OAAOhT,CAAO,IAEfwR,OAEH,MAAO,CACLrG,EAAiB,CACf1K,SACA4J,MAAOyH,OAEN7F,EAAiB,CAClBxL,SACA4J,MAAO0H,OAENC,E,CAIHpN,iBACF,OAAOf,EAA4BrD,KAAKgD,W,CAGtCyP,gBACF,MAAM,OAAExS,GAAWD,MACb,eAAEmD,GAAmBJ,EAAgB/C,KAAKgD,YAEhD,OAAOvC,OAAOC,YACZyC,EACGX,QAAOG,KAAeD,EAAkBC,EAAW,iBACnD/B,KAAI+B,IACH,MAAMW,EAAsBtD,KAAKoE,WAAW5B,QAC1C6B,GAAaA,EAAUnB,OAASP,EAAU9B,OAEtCgC,EAAU,CACdhC,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,QACnBC,QAAStB,EAAUsB,QACnBhE,SACAiD,KAAMsB,EAAY7B,EAAU9B,KAAMb,KAAKP,SAEnCiT,EAAchQ,EAClBC,EACA,cACAE,GAGF,OAAK6P,EAsBE,CAAC/P,EAAU9B,KAlBD8R,CACfvM,EACA7F,EACAqS,EACAC,KAEA,MAAMzD,EAAiBzJ,EAAsBS,EAAM9C,GAEnD,OAAOoP,IAAc,CACnBzS,SACAmG,OACAwM,SACAC,cACAzD,iBACAzM,aACA,GAlBK,EAqBwB,I,EE9VrC,SAAUmQ,EAAc3N,GAC5B,MAAuB,WALzB,SAAiBA,GACf,OAAO1E,OAAOmI,UAAUC,SAASL,KAAKrD,GAAOuD,MAAM,GAAI,EACzD,CAGMqK,CAAQ5N,IAILA,EAAMrF,cAAgBW,QAAUA,OAAOuS,eAAe7N,KAAW1E,OAAOmI,SACjF,CCVgB,SAAAqK,EAAUhH,EAA6BiH,GACrD,MAAMC,EAAS,IAAKlH,GAgBpB,OAdI6G,EAAc7G,IAAW6G,EAAcI,IACzCzS,OAAOoG,KAAKqM,GAAQ5Q,SAAQ4C,IACtB4N,EAAcI,EAAOhO,IACjBA,KAAO+G,EAGXkH,EAAOjO,GAAO+N,EAAUhH,EAAO/G,GAAMgO,EAAOhO,IAF5CzE,OAAO2S,OAAOD,EAAQ,CAAE,CAACjO,GAAMgO,EAAOhO,KAKxCzE,OAAO2S,OAAOD,EAAQ,CAAE,CAACjO,GAAMgO,EAAOhO,IACvC,IAIEiO,CACT,C,MCwQaE,EAkBXvT,YAAYhB,EAAqD,CAAC,GAjBlE,KAAIoE,KAAG,YAEP,KAAIrC,KAAG,YAEP,KAAMiC,OAAqB,KAE3B,KAAKwQ,MAAqB,KAM1B,KAAAxU,OAA0B,CACxB+B,KAAMb,KAAKa,KACX0S,eAAgB,CAAC,GAIjBvT,KAAKlB,OAAS,IACTkB,KAAKlB,UACLA,GAGLkB,KAAKa,KAAOb,KAAKlB,OAAO+B,KAEpB/B,EAAOyU,gBACT/J,QAAQC,KACN,yHAAyHzJ,KAAKa,UAKlIb,KAAKgE,QAAUhE,KAAKlB,OAAOyU,eAEvBvT,KAAKlB,OAAO0U,aACdxT,KAAKgE,QAAU+B,EACbrD,EAA2C1C,KAAM,aAAc,CAC7Da,KAAMb,KAAKa,SAKjBb,KAAKiE,QAAU8B,EACbrD,EAA2C1C,KAAM,aAAc,CAC7Da,KAAMb,KAAKa,KACXmD,QAAShE,KAAKgE,YAEb,CAAC,C,CAGRqM,cAAgCvR,EAAyC,CAAC,GACxE,OAAO,IAAIuU,EAAgBvU,E,CAG7B2U,UAAUzP,EAA4B,CAAC,GAGrC,MAAMrB,EAAY3C,KAAK0T,SAWvB,OATA/Q,EAAUqB,QAAUiP,EAAUjT,KAAKgE,QAAgCA,GAEnErB,EAAUsB,QAAU8B,EAClBrD,EAA2CC,EAAW,aAAc,CAClE9B,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,WAIhBrB,C,CAGT+Q,OACEC,EAA6E,CAAC,GAE9E,MAAMhR,EAAY,IAAI0Q,EAA4CM,GA2BlE,OAzBAhR,EAAUG,OAAS9C,KAEnBA,KAAKsT,MAAQ3Q,EAEbA,EAAU9B,KAAO8S,EAAe9S,KAAO8S,EAAe9S,KAAO8B,EAAUG,OAAOjC,KAE1E8S,EAAeJ,gBACjB/J,QAAQC,KACN,yHAAyH9G,EAAU9B,UAIvI8B,EAAUqB,QAAU+B,EAClBrD,EAA2CC,EAAW,aAAc,CAClE9B,KAAM8B,EAAU9B,QAIpB8B,EAAUsB,QAAU8B,EAClBrD,EAA2CC,EAAW,aAAc,CAClE9B,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,WAIhBrB,C,WC9XKiR,EACdC,EACAtJ,EACAvG,GAKA,MAAM,KAAE2F,EAAI,GAAEC,GAAOW,GACf,eAAEuJ,EAAiB,OAAM,gBAAEC,EAAkB,CAAC,GAAM/P,GAAW,CAAC,EACtE,IAAIkF,EAAO,GACP8K,GAAY,EA6BhB,OA3BAH,EAAU/L,aAAa6B,EAAMC,GAAI,CAACxD,EAAM6B,EAAKnF,EAAQoF,K,MACnD,MAAM+L,EAAiBF,aAAA,EAAAA,EAAkB3N,EAAKlD,KAAKrC,MAE/CoT,GACE7N,EAAK8N,UAAYF,IACnB9K,GAAQ4K,EACRE,GAAY,GAGVlR,IACFoG,GAAQ+K,EAAe,CACrB7N,OACA6B,MACAnF,SACAoF,QACAqC,YAGKnE,EAAK+N,QACdjL,GAAkB,QAAVb,EAAAjC,aAAI,EAAJA,EAAM8C,YAAI,IAAAb,OAAA,EAAAA,EAAEK,MAAMX,KAAKC,IAAI2B,EAAM1B,GAAOA,EAAK2B,EAAK3B,GAC1D+L,GAAY,GACH5N,EAAK8N,UAAYF,IAC1B9K,GAAQ4K,EACRE,GAAY,EACb,IAGI9K,CACT,CCzCM,SAAUkL,EAA6B3U,GAC3C,OAAOgB,OAAOC,YACZD,OAAOE,QAAQlB,EAAOiF,OACnBlC,QAAO,EAAE,CAAE4D,KAAUA,EAAKkC,KAAKC,SAC/B3H,KAAI,EAAEC,EAAMuF,KAAU,CAACvF,EAAMuF,EAAKkC,KAAKC,UAE9C,CCJO,MAAM8L,EAA0BhB,EAAUiB,OAAO,CACtDzT,KAAM,0BAEN0R,wBACE,MAAO,CACL,IAAI3H,EAAAA,GAAO,CACT1F,IAAK,IAAIqP,EAAAA,GAAU,2BACnBxU,MAAO,CACLyU,wBAAyBA,KACvB,MAAM,OAAEvU,GAAWD,MACb,MAAEjB,EAAK,OAAEU,GAAWQ,GACpB,IAAEf,EAAG,UAAED,GAAcF,GACrB,OAAE0V,GAAWxV,EAMnB,OAAO2U,EAAe1U,EAFR,CAAEyK,KAHH5B,KAAK0F,OAAOgH,EAAO7T,KAAI2J,GAASA,EAAM9C,MAAMQ,OAGnC2B,GAFX7B,KAAKC,OAAOyM,EAAO7T,KAAI2J,GAASA,EAAMmK,IAAIzM,QAInB,CAChC8L,gBAJsBK,EAA6B3U,IAKnD,K,ICnBE,SAAAkV,EACdC,EACAC,EACA7Q,EAA+B,CAAE8Q,QAAQ,IAEzC,MAAMjO,EAAOpG,OAAOoG,KAAKgO,GAEzB,OAAKhO,EAAKC,QAIHD,EAAK9E,OAAMmD,GACZlB,EAAQ8Q,OACHD,EAAQ3P,KAAS0P,EAAQ1P,GAG9ByD,EAASkM,EAAQ3P,IACZ2P,EAAQ3P,GAAK6P,KAAKH,EAAQ1P,IAG5B2P,EAAQ3P,KAAS0P,EAAQ1P,IAEpC,CCxBA,SAAS8P,EACP/N,EACA/D,EACAkB,EAAkC,CAAC,GAEnC,OAAO6C,EAAM8B,MAAKjE,GACTA,EAAK5B,OAASA,GAAQyR,EAAe7P,EAAKe,MAAOzB,IAE5D,CAEA,SAAS6Q,EACPhO,EACA/D,EACAkB,EAAkC,CAAC,GAEnC,QAAS4Q,EAAc/N,EAAO/D,EAAMkB,EACtC,CAEM,SAAU8Q,EACdC,EACAjS,EACAkB,EAAkC,CAAC,GAEnC,IAAK+Q,IAASjS,EACZ,OAGF,IAAI8K,EAAQmH,EAAKrS,OAAOsS,WAAWD,EAAKtN,cAMxC,GAJIsN,EAAKtN,eAAiBmG,EAAMqH,QAA2B,IAAjBrH,EAAMqH,SAC9CrH,EAAQmH,EAAKrS,OAAOwS,YAAYH,EAAKtN,gBAGlCmG,EAAM5H,KACT,OAGF,MAAMgE,EAAO4K,EAAc,IAAIhH,EAAM5H,KAAKa,OAAQ/D,EAAMkB,GAExD,IAAKgG,EACH,OAGF,IAAImL,EAAavH,EAAM9F,MACnBsN,EAAWL,EAAKnH,QAAUA,EAAMqH,OAChCI,EAAWF,EAAa,EACxBG,EAASF,EAAWxH,EAAM5H,KAAKuP,SAInC,IAFAX,EAAc,IAAIhH,EAAM5H,KAAKa,OAAQ/D,EAAMkB,GAEpCmR,EAAa,GAAKnL,EAAKwL,QAAQT,EAAKrS,OAAOwQ,MAAMiC,EAAa,GAAGtO,QACtEsO,GAAc,EACdC,GAAYL,EAAKrS,OAAOwQ,MAAMiC,GAAYI,SAG5C,KACEF,EAAWN,EAAKrS,OAAO+S,YACpBZ,EAAY,IAAIE,EAAKrS,OAAOwQ,MAAMmC,GAAUxO,OAAQ/D,EAAMkB,IAE7DsR,GAAUP,EAAKrS,OAAOwQ,MAAMmC,GAAUE,SACtCF,GAAY,EAGd,MAAO,CACL9L,KAAM6L,EACN5L,GAAI8L,EAER,CCtEgB,SAAAI,EAAYrR,EAA+BhF,GACzD,GAA0B,iBAAfgF,EAAyB,CAClC,IAAKhF,EAAOwH,MAAMxC,GAChB,MAAME,MACJ,gCAAgCF,8CAIpC,OAAOhF,EAAOwH,MAAMxC,EACrB,CAED,OAAOA,CACT,CCZM,SAAUsR,EAAgB5Q,GAC9B,OAAOA,aAAiB6Q,EAAAA,EAC1B,CCJgB,SAAAC,EAAO9Q,EAAQ,EAAGsI,EAAM,EAAGzF,EAAM,GAC/C,OAAOD,KAAK0F,IAAI1F,KAAKC,IAAI7C,EAAOsI,GAAMzF,EACxC,C,SCIgBkO,EACdhX,EACAiX,EAA0B,MAE1B,IAAKA,EACH,OAAO,KAGT,MAAMC,EAAmBC,EAAAA,GAAUC,QAAQpX,GACrCqX,EAAiBF,EAAAA,GAAUG,MAAMtX,GAEvC,GAAiB,UAAbiX,IAAqC,IAAbA,EAC1B,OAAOC,EAGT,GAAiB,QAAbD,EACF,OAAOI,EAGT,MAAME,EAASL,EAAiBzM,KAC1B+M,EAASH,EAAe3M,GAE9B,MAAiB,QAAbuM,EACKH,EAAAA,GAAc1B,OACnBpV,EACA+W,EAAO,EAAGQ,EAAQC,GAClBT,EAAO/W,EAAI8N,QAAQU,KAAM+I,EAAQC,IAI9BV,EAAAA,GAAc1B,OACnBpV,EACA+W,EAAOE,EAAUM,EAAQC,GACzBT,EAAOE,EAAUM,EAAQC,GAE7B,C,SCzCgBC,IACd,MAAO,CACL,iBACA,mBACA,iBACA,OACA,SACA,QACAlR,SAASmR,UAAUC,WAEjBD,UAAUE,UAAUrR,SAAS,QAAU,eAAgBsR,QAC7D,CCXM,SAAUC,EAAkB7R,GAEhC,MAAM8R,EAAwB,SAAA9R,WAE9B,OAAO,IAAI+G,OAAOgL,WAAYC,gBAAgBF,EAAc,aAAaG,IAC3E,C,SCWgBC,EACdrK,EACAvN,EACAuE,GAQA,GANAA,EAAU,CACR0E,OAAO,EACP4O,aAAc,CAAC,KACZtT,GAGkB,iBAAZgJ,GAAoC,OAAZA,EACjC,IACE,OAAI5F,MAAMC,QAAQ2F,IAAYA,EAAQlG,OAAS,EACtCyQ,EAAAA,GAASC,UAAUxK,EAAQpM,KAAIkE,GAAQrF,EAAOgY,aAAa3S,MAG7DrF,EAAOgY,aAAazK,EAC5B,CAAC,MAAO0K,GAGP,OAFAlO,QAAQC,KAAK,kCAAmC,gBAAiBuD,EAAS,SAAU0K,GAE7EL,EAAsB,GAAI5X,EAAQuE,EAC1C,CAGH,GAAuB,iBAAZgJ,EAAsB,CAC/B,MAAM2K,EAAST,EAAAA,GAAUU,WAAWnY,GAEpC,OAAOuE,EAAQ0E,MACXiP,EAAOE,WAAWb,EAAkBhK,GAAUhJ,EAAQsT,cAActK,QACpE2K,EAAOG,MAAMd,EAAkBhK,GAAUhJ,EAAQsT,aACtD,CAED,OAAOD,EAAsB,GAAI5X,EAAQuE,EAC3C,C,SClDgB+T,IACd,MAA4B,oBAAdnB,WACV,MAAM7B,KAAK6B,UAAUC,SAE3B,CCGM,SAAUmB,EACdjZ,EACAkZ,EACA7T,EAAkC,CAAC,GAEnC,MAAM,KAAEuF,EAAI,GAAEC,EAAE,MAAEsO,GAAUnZ,EAAME,UAC5BiE,EAAO+U,EAAazT,EAAYyT,EAAYlZ,EAAMU,QAAU,KAE5D0Y,EAA0B,GAEhCpZ,EAAMG,IAAI4I,aAAa6B,EAAMC,GAAI,CAACxD,EAAM6B,KACtC,GAAI7B,EAAK+N,OACP,OAGF,MAAMiE,EAAerQ,KAAKC,IAAI2B,EAAM1B,GAC9BoQ,EAAatQ,KAAK0F,IAAI7D,EAAI3B,EAAM7B,EAAKuP,UAE3CwC,EAAWtW,KAAK,CACduE,OACAuD,KAAMyO,EACNxO,GAAIyO,GACJ,IAGJ,MAAMC,EAAiB1O,EAAKD,EACtB4O,EAAoBJ,EACvB3V,QAAOgW,IACDtV,GAIEA,EAAKrC,OAAS2X,EAAUpS,KAAKlD,KAAKrC,OAE1C2B,QAAOgW,GAAa7D,EAAe6D,EAAUpS,KAAKP,MAAOzB,EAAY,CAAE0Q,QAAQ,MAElF,OAAIoD,IACOK,EAAkBzR,OAGfyR,EAAkBxT,QAAO,CAAC0T,EAAKD,IAAcC,EAAMD,EAAU5O,GAAK4O,EAAU7O,MAAM,IAEhF2O,CAClB,CChDgB,SAAAI,EAAwB7X,EAAcpB,GACpD,OAAIA,EAAOiF,MAAM7D,GACR,OAGLpB,EAAOwH,MAAMpG,GACR,OAGF,IACT,CCPgB,SAAA8X,GAAYC,EAA0BC,GACpD,MAAM9Y,EAA+B,iBAAhB8Y,EACjB,CAACA,GACDA,EAEJ,OAAOpY,OACJoG,KAAK+R,GACL7T,QAAO,CAAC+T,EAA6BC,KAC/BhZ,EAAM0F,SAASsT,KAClBD,EAAOC,GAAQH,EAAIG,IAGdD,IACN,CAAC,EACR,CCdM,SAAUE,GACdhM,EACAvN,EACA6X,EAA6B,CAAC,GAE9B,OAAOD,EAAsBrK,EAASvN,EAAQ,CAAEiJ,OAAO,EAAO4O,gBAChE,CCNgB,SAAA2B,GACdla,EACAkZ,GAEA,MAAM/U,EAAO4S,EAAYmC,EAAYlZ,EAAMU,SACrC,KAAEkK,EAAI,GAAEC,EAAE,MAAEsO,GAAUnZ,EAAME,UAC5BgI,EAAgB,GAElBiR,GACEnZ,EAAMI,aACR8H,EAAMpF,QAAQ9C,EAAMI,aAGtB8H,EAAMpF,QAAQ9C,EAAME,UAAUia,MAAMjS,UAEpClI,EAAMG,IAAI4I,aAAa6B,EAAMC,GAAIxD,IAC/Ba,EAAMpF,QAAQuE,EAAKa,MAAM,IAI7B,MAAMmD,EAAOnD,EAAM8B,MAAKoQ,GAAYA,EAASjW,KAAKrC,OAASqC,EAAKrC,OAEhE,OAAKuJ,EAIE,IAAKA,EAAKvE,OAHR,CAAC,CAIZ,CCzBgB,SAAAuT,GACdC,EACAzM,GAEA,MAAMlC,EAAY,IAAI4O,EAAAA,GAAUD,GAQhC,OANAzM,EAAatK,SAAQtD,IACnBA,EAAYwL,MAAMlI,SAAQiX,IACxB7O,EAAU6O,KAAKA,EAAK,GACpB,IAGG7O,CACT,C,SCbgB8O,GACdpT,EACAmE,EACAkP,GAEA,MAAMC,EAA8B,GAsBpC,OATAtT,EAAK0B,aAAayC,EAAMZ,KAAMY,EAAMX,IAAI,CAAC0J,EAAOrL,KAC1CwR,EAAUnG,IACZoG,EAAa7X,KAAK,CAChBuE,KAAMkN,EACNrL,OAEH,IAGIyR,CACT,CC9BM,SAAUC,GAAeF,GAC7B,OAAQxa,GCFM,SACdkW,EACAsE,GASA,IAAK,IAAIG,EAAIzE,EAAK0E,MAAOD,EAAI,EAAGA,GAAK,EAAG,CACtC,MAAMxT,EAAO+O,EAAK/O,KAAKwT,GAEvB,GAAIH,EAAUrT,GACZ,MAAO,CACL6B,IAAK2R,EAAI,EAAIzE,EAAK2E,OAAOF,GAAK,EAC9B5L,MAAOmH,EAAKnH,MAAM4L,GAClBC,MAAOD,EACPxT,OAGL,CACH,CDrBmC2T,CAA2B9a,EAAUwI,MAAOgS,EAC/E,CEAgB,SAAAO,GACdjb,EACAkZ,GAEA,MAAMgC,EAAavB,EACK,iBAAfT,EAA0BA,EAAaA,EAAWpX,KACzD9B,EAAMU,QAGR,MAAmB,SAAfwa,ECXU,SACdlb,EACAkZ,GAEA,MAAM/U,EAAOsB,EAAYyT,EAAYlZ,EAAMU,SACrC,KAAEkK,EAAI,GAAEC,GAAO7K,EAAME,UACrByF,EAAgB,GAEtB3F,EAAMG,IAAI4I,aAAa6B,EAAMC,GAAIxD,IAC/B1B,EAAM7C,KAAKuE,EAAK,IAGlB,MAAMA,EAAO1B,EAAM2M,UAAUtI,MAAKmR,GAAYA,EAAShX,KAAKrC,OAASqC,EAAKrC,OAE1E,OAAKuF,EAIE,IAAKA,EAAKP,OAHR,CAAC,CAIZ,CDPWsU,CAAkBpb,EAAOkZ,GAGf,SAAfgC,EACKhB,GAAkBla,EAAOkZ,GAG3B,CAAC,CACV,CEUM,SAAUmC,GAAiB1P,GAC/B,MAAM,QAAEwD,EAAO,MAAE1D,GAAUE,EACrB2P,EAA0B,GA4ChC,OA1CAnM,EAAQoM,KAAKhY,SAAQ,CAACiY,EAASrS,KAC7B,MAAMuM,EAAkB,GAKxB,GAAK8F,EAAQ9F,OAAO3N,OAYlByT,EAAQjY,SAAQ,CAACqH,EAAMC,KACrB6K,EAAO5S,KAAK,CAAE8H,OAAMC,MAAK,QAbD,CAC1B,MAAM,KAAED,EAAI,GAAEC,GAAOY,EAAMtC,GAK3B,QAAalG,IAAT2H,QAA6B3H,IAAP4H,EACxB,OAGF6K,EAAO5S,KAAK,CAAE8H,OAAMC,MACrB,CAMD6K,EAAOnS,SAAQ,EAAGqH,OAAMC,SACtB,MAAM4Q,EAAWtM,EAAQxF,MAAMR,GAAOtH,IAAI+I,GAAO,GAC3C8Q,EAASvM,EAAQxF,MAAMR,GAAOtH,IAAIgJ,GAClC8Q,EAAWxM,EAAQyM,SAAS/Z,IAAI4Z,GAAW,GAC3CI,EAAS1M,EAAQyM,SAAS/Z,IAAI6Z,GAEpCJ,EAAQxY,KAAK,CACXgZ,SAAU,CACRlR,KAAM+Q,EACN9Q,GAAIgR,GAENE,SAAU,CACRnR,KAAM6Q,EACN5Q,GAAI6Q,IAEN,GACF,IAhEN,SAA+BJ,GAC7B,MAAMU,ECXF,SAA8BC,EAAYC,EAAKC,KAAKC,WACxD,MAAMC,EAAyB,CAAC,EAEhC,OAAOJ,EAAMxY,QAAOsC,IAClB,MAAMI,EAAM+V,EAAGnW,GAEf,OAAOrE,OAAOmI,UAAUyS,eAAe7S,KAAK4S,EAAMlW,KAE7CkW,EAAKlW,IAAO,EAAK,GAE1B,CDCwBoW,CAAiBjB,GAEvC,OAAgC,IAAzBU,EAAcjU,OACjBiU,EACAA,EAAcvY,QAAO,CAAC+Y,EAAQrT,KACjB6S,EAAcvY,QAAO,CAACgZ,EAAG5B,IAAMA,IAAM1R,IAErCZ,MAAKmU,GACTF,EAAOV,SAASlR,MAAQ8R,EAAYZ,SAASlR,MAC/C4R,EAAOV,SAASjR,IAAM6R,EAAYZ,SAASjR,IAC3C2R,EAAOT,SAASnR,MAAQ8R,EAAYX,SAASnR,MAC7C4R,EAAOT,SAASlR,IAAM6R,EAAYX,SAASlR,MAGxD,CAoDS8R,CAAsBrB,EAC/B,C,SE7EgBsB,GAAgBhS,EAAcC,EAAY1K,GACxD,MAAM+H,EAAqB,GAgC3B,OA7BI0C,IAASC,EACX1K,EACG8K,QAAQL,GACR1C,QACA3E,SAAQ8H,IACP,MACMG,EAAQ2K,EADDhW,EAAI8K,QAAQL,EAAO,GACCS,EAAKlH,MAEjCqH,GAILtD,EAAMpF,KAAK,CACTuI,UACGG,GACH,IAGNrL,EAAI4I,aAAa6B,EAAMC,GAAI,CAACxD,EAAM6B,KAChChB,EAAMpF,QACDuE,EAAKa,MAAMrG,KAAIwJ,IAAQ,CACxBT,KAAM1B,EACN2B,GAAI3B,EAAM7B,EAAKuP,SACfvL,WAEH,IAIEnD,CACT,C,SCrCgB2U,GACdtY,EACAuY,EACAzX,GAEA,OAAO3D,OAAOC,YAAYD,OACvBE,QAAQyD,GACR5B,QAAO,EAAE3B,MACR,MAAMoO,EAAqB3L,EAAoByF,MAAKjE,GAC3CA,EAAK5B,OAAS2Y,GAAY/W,EAAKjE,OAASA,IAGjD,QAAKoO,GAIEA,EAAmB5K,UAAUR,WAAW,IAErD,CCbM,SAAUiY,GACd/c,EACAkZ,EACA7T,EAAkC,CAAC,GAEnC,MAAM,MAAE8T,EAAK,OAAEzD,GAAW1V,EAAME,UAC1BiE,EAAO+U,EAAanC,EAAYmC,EAAYlZ,EAAMU,QAAU,KAElE,GAAIyY,EACF,SAAUnZ,EAAMI,aAAeJ,EAAME,UAAUwI,MAAMR,SAClDzE,QAAO4H,IACDlH,GAIEA,EAAKrC,OAASuJ,EAAKlH,KAAKrC,OAEhCkI,MAAKqB,GAAQuK,EAAevK,EAAKvE,MAAOzB,EAAY,CAAE0Q,QAAQ,MAGnE,IAAIwD,EAAiB,EACrB,MAAMyD,EAA0B,GA2BhC,GAzBAtH,EAAOnS,SAAQ,EAAGmF,QAAOiN,UACvB,MAAM/K,EAAOlC,EAAMQ,IACb2B,EAAK8K,EAAIzM,IAEflJ,EAAMG,IAAI4I,aAAa6B,EAAMC,GAAI,CAACxD,EAAM6B,KACtC,IAAK7B,EAAK+N,SAAW/N,EAAKa,MAAMH,OAC9B,OAGF,MAAMsR,EAAerQ,KAAKC,IAAI2B,EAAM1B,GAC9BoQ,EAAatQ,KAAK0F,IAAI7D,EAAI3B,EAAM7B,EAAKuP,UAG3C2C,GAFcD,EAAaD,EAI3B2D,EAAWla,QACNuE,EAAKa,MAAMrG,KAAIwJ,IAAQ,CACxBA,OACAT,KAAMyO,EACNxO,GAAIyO,MAEP,GACD,IAGmB,IAAnBC,EACF,OAAO,EAIT,MAAM0D,EAAeD,EAClBvZ,QAAOyZ,IACD/Y,GAIEA,EAAKrC,OAASob,EAAU7R,KAAKlH,KAAKrC,OAE1C2B,QAAOyZ,GAAatH,EAAesH,EAAU7R,KAAKvE,MAAOzB,EAAY,CAAE0Q,QAAQ,MAC/E/P,QAAO,CAAC0T,EAAKwD,IAAcxD,EAAMwD,EAAUrS,GAAKqS,EAAUtS,MAAM,GAI7DuS,EAAgBH,EACnBvZ,QAAOyZ,IACD/Y,GAIE+Y,EAAU7R,KAAKlH,OAASA,GAAQ+Y,EAAU7R,KAAKlH,KAAKsM,SAAStM,KAErE6B,QAAO,CAAC0T,EAAKwD,IAAcxD,EAAMwD,EAAUrS,GAAKqS,EAAUtS,MAAM,GAMnE,OAFcqS,EAAe,EAAIA,EAAeE,EAAgBF,IAEhD1D,CAClB,CClFgB,SAAA6D,GAAOtb,EAAcmC,GACnC,MAAM,eAAEG,GAAmBJ,EAAgBC,GACrCL,EAAYQ,EAAe4F,MAAKjE,GAAQA,EAAKjE,OAASA,IAE5D,IAAK8B,EACH,OAAO,EAGT,MAKM+L,EAAQ3I,EAAarD,EAAuCC,EAAW,QAL7D,CACd9B,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,QACnBC,QAAStB,EAAUsB,WAIrB,MAAqB,iBAAVyK,GAIJA,EAAMrJ,MAAM,KAAKI,SAAS,OACnC,CCxBM,SAAU2W,GAAgBjX,GAC9B,OAAOA,aAAiBkX,EAAAA,EAC1B,C,SCAgBC,GAAa/b,EAAkBoJ,EAAcC,GAC3D,MACM8M,EAASnW,EAAKxB,MAAMG,IAAI8N,QAAQU,KAChCH,EAAe0I,EAAOtM,EAFb,EAE2B+M,GACpC6F,EAActG,EAAOrM,EAHZ,EAGwB8M,GACjC1I,EAAQzN,EAAKic,YAAYjP,GACzBU,EAAM1N,EAAKic,YAAYD,GAAc,GACrCE,EAAM1U,KAAK0F,IAAIO,EAAMyO,IAAKxO,EAAIwO,KAC9BC,EAAS3U,KAAKC,IAAIgG,EAAM0O,OAAQzO,EAAIyO,QACpCC,EAAO5U,KAAK0F,IAAIO,EAAM2O,KAAM1O,EAAI0O,MAChCC,EAAQ7U,KAAKC,IAAIgG,EAAM4O,MAAO3O,EAAI2O,OAKlChW,EAAO,CACX6V,MACAC,SACAC,OACAC,QACAC,MATYD,EAAQD,EAUpBG,OATaJ,EAASD,EAUtBM,EATQJ,EAURK,EATQP,GAYV,MAAO,IACF7V,EACHjH,OAAQA,IAAMiH,EAElB,CC3BA,SAASqW,GAAYle,EAAoBqP,GACvC,MAAMnH,EAAQlI,EAAMI,aAAgBJ,EAAME,UAAUyV,IAAI7M,cAAgB9I,EAAME,UAAUwI,MAAMR,QAE9F,GAAIA,EAAO,CACT,MAAMiW,EAAgBjW,EAAMzE,QAAO4H,GAAQgE,aAAA,EAAAA,EAAiB3I,SAAS2E,EAAKlH,KAAKrC,QAE/E9B,EAAMa,GAAGqd,YAAYC,EACtB,CACH,CAaO,MCnBDC,GAAoBA,CAACvd,EAAiBwd,KAC1C,MAAMC,EAAO1D,IAAevT,GAAQA,EAAKlD,OAASka,GAArCzD,CAA+C/Z,EAAGX,WAE/D,IAAKoe,EACH,OAAO,EAGT,MAAMvD,EAASla,EAAGV,IAAI8K,QAAQjC,KAAKC,IAAI,EAAGqV,EAAKpV,IAAM,IAAI6R,OAAOuD,EAAKxD,OAErE,QAAe7X,IAAX8X,EACF,OAAO,EAGT,MAAM5P,EAAatK,EAAGV,IAAIoe,OAAOxD,GAGjC,OAFyBuD,EAAKjX,KAAKlD,QAASgH,aAAA,EAAAA,EAAYhH,SAAQqa,EAAAA,EAAAA,IAAQ3d,EAAGV,IAAKme,EAAKpV,OAMrFrI,EAAG8F,KAAK2X,EAAKpV,MAEN,EAAI,EAGPuV,GAAmBA,CAAC5d,EAAiBwd,KACzC,MAAMC,EAAO1D,IAAevT,GAAQA,EAAKlD,OAASka,GAArCzD,CAA+C/Z,EAAGX,WAE/D,IAAKoe,EACH,OAAO,EAGT,MAAMI,EAAQ7d,EAAGV,IAAI8K,QAAQqT,EAAKrP,OAAOyP,MAAMJ,EAAKxD,OAEpD,QAAc7X,IAAVyb,EACF,OAAO,EAGT,MAAMtT,EAAYvK,EAAGV,IAAIoe,OAAOG,GAGhC,OAFwBJ,EAAKjX,KAAKlD,QAASiH,aAAS,EAATA,EAAWjH,SAAQqa,EAAAA,EAAAA,IAAQ3d,EAAGV,IAAKue,KAM9E7d,EAAG8F,KAAK+X,IAED,EAAI,E,0CC3C4BC,IAAM,EAAGzd,SAAQM,WACxDod,uBAAsB,K,MACf1d,EAAO2d,cACTrd,EAAKuL,IAAoB4R,OAIJ,QAAtBrV,EAAA,OAAA6D,aAAA,IAAAA,YAAA,EAAAA,OAAQ2R,sBAAc,IAAAxV,GAAAA,EAAEyV,kBACzB,KAGI,G,aCXgDC,CAACC,GAAa,IAAU,EAAG5d,cAC3EA,EAAS6d,WAAW,GAAID,G,WCCoBE,IAAM,EAAGnf,QAAOa,KAAIuB,eACvE,MAAM,UAAElC,GAAcW,GAChB,OAAE6U,GAAWxV,EAEnB,OAAKkC,IAILsT,EAAOnS,SAAQ,EAAGmF,QAAOiN,UACvB3V,EAAMG,IAAI4I,aAAaL,EAAMQ,IAAKyM,EAAIzM,KAAK,CAAC7B,EAAM6B,KAChD,GAAI7B,EAAKlD,KAAKiR,OACZ,OAGF,MAAM,IAAEjV,EAAG,QAAEgP,GAAYtO,EACnBue,EAAcjf,EAAI8K,QAAQkE,EAAQtN,IAAIqH,IACtCmW,EAAYlf,EAAI8K,QAAQkE,EAAQtN,IAAIqH,EAAM7B,EAAKuP,WAC/C6C,EAAY2F,EAAYE,WAAWD,GAEzC,IAAK5F,EACH,OAGF,MAAM8F,GAAkBC,EAAAA,EAAAA,IAAW/F,GAEnC,GAAIpS,EAAKlD,KAAKoK,YAAa,CACzB,MAAM,YAAEkR,GAAgBL,EAAYrb,OAAO2b,eAAeN,EAAYjW,SAEtEtI,EAAG8e,cAAclG,EAAUxK,MAAOwQ,EACnC,EAEGF,GAAuC,IAApBA,IACrB1e,EAAG+e,KAAKnG,EAAW8F,EACpB,GACD,KAGG,EAAI,E,QCvCkClc,GAAMrC,GAC5CqC,EAAGrC,G,oBCC2D6e,IAAM,EAAG7f,QAAOoC,eAC9E0d,EAAAA,EAAAA,IAA4B9f,EAAOoC,G,ICDL2d,CAACC,EAAaC,IAAc,EAAG/e,SAAQL,SAC5E,MAAM,MAAEb,GAAUkB,EAEZgf,EAAelgB,EAAMG,IAAIwJ,MAAMqW,EAAYpV,KAAMoV,EAAYnV,IAEnEhK,EAAGsf,YAAYH,EAAYpV,KAAMoV,EAAYnV,IAC7C,MAAMuV,EAASvf,EAAGsO,QAAQtN,IAAIoe,GAM9B,OAJApf,EAAGwf,OAAOD,EAAQF,EAAajS,SAE/BpN,EAAGyf,aAAa,IAAIrJ,EAAAA,GAAcpW,EAAGV,IAAI8K,QAAQmV,EAAS,MAEnD,CAAI,E,kBCdsDG,IAAM,EAAG1f,KAAIuB,eAC9E,MAAM,UAAElC,GAAcW,EAChB2f,EAActgB,EAAUugB,QAAQpZ,OAGtC,GAAImZ,EAAYvS,QAAQU,KAAO,EAC7B,OAAO,EAGT,MAAMyH,EAAOvV,EAAGX,UAAUugB,QAE1B,IAAK,IAAI3F,EAAQ1E,EAAK0E,MAAOA,EAAQ,EAAGA,GAAS,EAG/C,GAFa1E,EAAK/O,KAAKyT,GAEd3W,OAASqc,EAAYrc,KAAM,CAClC,GAAI/B,EAAU,CACZ,MAAMwI,EAAOwL,EAAK2E,OAAOD,GACnBjQ,EAAKuL,EAAKsI,MAAM5D,GAEtBja,EAAG6f,OAAO9V,EAAMC,GAAI8V,gBACrB,CAED,OAAO,CACR,CAGH,OAAO,CAAK,E,WCvBuCzH,GAAc,EAAGrY,KAAIb,QAAOoC,eAC/E,MAAM+B,EAAOsB,EAAYyT,EAAYlZ,EAAMU,QACrC0V,EAAOvV,EAAGX,UAAUugB,QAE1B,IAAK,IAAI3F,EAAQ1E,EAAK0E,MAAOA,EAAQ,EAAGA,GAAS,EAG/C,GAFa1E,EAAK/O,KAAKyT,GAEd3W,OAASA,EAAM,CACtB,GAAI/B,EAAU,CACZ,MAAMwI,EAAOwL,EAAK2E,OAAOD,GACnBjQ,EAAKuL,EAAKsI,MAAM5D,GAEtBja,EAAG6f,OAAO9V,EAAMC,GAAI8V,gBACrB,CAED,OAAO,CACR,CAGH,OAAO,CAAK,E,YCtByCnV,GAAS,EAAG3K,KAAIuB,eACrE,MAAM,KAAEwI,EAAI,GAAEC,GAAOW,EAMrB,OAJIpJ,GACFvB,EAAG6f,OAAO9V,EAAMC,IAGX,CAAI,E,gBCLkD+V,IAAM,EAAG5gB,QAAOoC,eACtEye,EAAAA,EAAAA,IAAwB7gB,EAAOoC,G,MCHG0e,IAAM,EAAGzf,cAC3CA,EAAS0f,iBAAiB,S,SCCcC,IAAM,EAAGhhB,QAAOoC,eACxD6e,EAAAA,EAAAA,IAAiBjhB,EAAOoC,G,gBCK8B8e,CAAChI,EAAY7T,EAAa,CAAC,IAAM,EAAGxE,KAAIb,QAAOoC,eAC5G,MAAM+B,EAAO4S,EAAYmC,EAAYlZ,EAAMU,SACrC,IAAEP,EAAG,UAAED,GAAcW,GACrB,MAAE6H,EAAK,KAAEkC,EAAI,GAAEC,GAAO3K,EAE5B,GAAIkC,EAAU,CACZ,MAAMoJ,EAAQ2K,EAAazN,EAAOvE,EAAMkB,GAExC,GAAImG,GAASA,EAAMZ,MAAQA,GAAQY,EAAMX,IAAMA,EAAI,CACjD,MAAMsW,EAAelK,EAAAA,GAAc1B,OAAOpV,EAAKqL,EAAMZ,KAAMY,EAAMX,IAEjEhK,EAAGyf,aAAaa,EACjB,CACF,CAED,OAAO,CAAI,E,MCvB8B9f,GAAYL,IACrD,MAAMiF,EAA4B,mBAAb5E,EACjBA,EAASL,GACTK,EAEJ,IAAK,IAAIwZ,EAAI,EAAGA,EAAI5U,EAAM8B,OAAQ8S,GAAK,EACrC,GAAI5U,EAAM4U,GAAG7Z,GACX,OAAO,EAIX,OAAO,CAAK,E,MCH6BogB,CAAChK,EAAW,KAAMnS,EAAU,CAAC,IAAM,EAC5E/D,SACAM,OACAX,KACAuB,eAEA6C,EAAU,CACR0b,gBAAgB,KACb1b,GAGL,MAAMoc,EAAeA,KAGfzJ,KACDpW,EAAKuL,IAAoBqU,QAK5BxC,uBAAsB,KACf1d,EAAO2d,cACVrd,EAAK4f,SAEDnc,aAAO,EAAPA,EAAS0b,iBACXzf,EAAOG,SAASsf,iBAEnB,GACD,EAGJ,GAAKnf,EAAK8f,YAA2B,OAAblK,IAAmC,IAAbA,EAC5C,OAAO,EAIT,GAAIhV,GAAyB,OAAbgV,IAAsBJ,EAAgB9V,EAAOlB,MAAME,WAEjE,OADAmhB,KACO,EAKT,MAAMnhB,EAAYiX,EAAqBtW,EAAGV,IAAKiX,IAAalW,EAAOlB,MAAME,UACnEqhB,EAAkBrgB,EAAOlB,MAAME,UAAUshB,GAAGthB,GAgBlD,OAdIkC,IACGmf,GACH1gB,EAAGyf,aAAapgB,GAKdqhB,GAAmB1gB,EAAGT,aACxBS,EAAG4gB,eAAe5gB,EAAGT,aAGvBihB,MAGK,CAAI,E,QC5DkC9d,CAAC0C,EAAO5C,IAAOrC,GACrDiF,EAAMjD,OAAM,CAAC+C,EAAMoD,IAAU9F,EAAG0C,EAAM,IAAK/E,EAAOmI,Y,cCDAuY,CAACtb,EAAOnB,IAAY,EAAGpE,KAAIQ,cAC7EA,EAASsgB,gBACd,CAAE/W,KAAM/J,EAAGX,UAAU0K,KAAMC,GAAIhK,EAAGX,UAAU2K,IAC5CzE,EACAnB,G,gBCG2D0c,CAACvK,EAAUhR,EAAOnB,IAAY,EAAGpE,KAAIuB,WAAUlB,aAC5G,GAAIkB,EAAU,CACZ6C,EAAU,CACRsT,aAAc,CAAC,EACfqJ,iBAAiB,KACd3c,GAGL,MAAMgJ,EAAUqK,EAAsBlS,EAAOlF,EAAOR,OAAQ,CAC1D6X,aAAc,CACZsJ,mBAAoB,UACjB5c,EAAQsT,gBAKf,GAA2B,OAAvBtK,EAAQnE,WACV,OAAO,EAGT,IAAI,KAAEc,EAAI,GAAEC,GAA2B,iBAAbuM,EAAwB,CAAExM,KAAMwM,EAAUvM,GAAIuM,GAAa,CAAExM,KAAMwM,EAASxM,KAAMC,GAAIuM,EAASvM,IAErHiX,GAAoB,EACpBC,GAAqB,EAiBzB,IAhByB9T,EA3BLnE,WAAWkY,WAAW,KA2BN/T,EAAU,CAACA,IAEzC1K,SAAQ8D,IAEZA,EAAK4a,QAELH,IAAoBA,GAAoBza,EAAK+N,QAAgC,IAAtB/N,EAAKa,MAAMH,OAElEga,IAAqBA,GAAqB1a,EAAK8N,OAAe,IAQ5DvK,IAASC,GAAMkX,EAAoB,CACrC,MAAM,OAAEhe,GAAWlD,EAAGV,IAAI8K,QAAQL,GACT7G,EAAOwK,cAAgBxK,EAAOI,KAAKoF,KAAK2B,OAASnH,EAAO+S,aAG/ElM,GAAQ,EACRC,GAAM,EAET,CAIGiX,EAGEzZ,MAAMC,QAAQlC,GAChBvF,EAAGqhB,WAAW9b,EAAMvE,KAAIsgB,GAAKA,EAAEhY,MAAQ,KAAIxD,KAAK,IAAKiE,EAAMC,GACjC,iBAAVzE,GAAwBA,GAAWA,EAAM+D,KACzDtJ,EAAGqhB,WAAW9b,EAAM+D,KAAMS,EAAMC,GAEhChK,EAAGqhB,WAAW9b,EAAiBwE,EAAMC,GAGvChK,EAAG2J,YAAYI,EAAMC,EAAIoD,GAIvBhJ,EAAQ2c,iB,SC3FwB/gB,EAAiBuhB,EAAkBC,GACzE,MAAMC,EAAOzhB,EAAG4K,MAAM1D,OAAS,EAE/B,GAAIua,EAAOF,EACT,OAGF,MAAM5H,EAAO3Z,EAAG4K,MAAM6W,GAEtB,KAAM9H,aAAgB+H,EAAAA,IAAe/H,aAAgBgI,EAAAA,IACnD,OAGF,MAAM3gB,EAAMhB,EAAGsO,QAAQoM,KAAK+G,GAC5B,IAAIpT,EAAM,EAEVrN,EAAI0B,SAAQ,CAACkf,EAAOC,EAAKC,EAAUC,KACrB,IAAR1T,IACFA,EAAM0T,EACP,IAGH/hB,EAAGyf,aAAahJ,EAAAA,GAAUuL,KAAKhiB,EAAGV,IAAI8K,QAAQiE,IDsEQ,GCrExD,CDqEM4T,CAAwBjiB,EAAIA,EAAG4K,MAAM1D,OAAS,EAEjD,CAED,OAAO,CAAI,E,OE9DgCgb,IAAM,EAAG/iB,QAAOoC,eACpD4gB,EAAAA,EAAAA,IAAehjB,EAAOoC,G,SAGkB6gB,IAAM,EAAGjjB,QAAOoC,eACxD8gB,EAAAA,EAAAA,IAAiBljB,EAAOoC,G,aAGwB+gB,IAAM,EAAGnjB,QAAOoC,eAChEghB,EAAAA,EAAAA,IAAqBpjB,EAAOoC,G,YAGkBihB,IAAM,EAAGrjB,QAAOoC,eAC9DkhB,EAAAA,EAAAA,IAAoBtjB,EAAOoC,G,iBCpC6BmhB,IAAM,EACrE1iB,KAAIb,QAAOoC,eAEX,IACE,MAAMohB,GAAQC,EAAAA,EAAAA,IAAUzjB,EAAMG,IAAKH,EAAME,UAAUwI,MAAMQ,KAAM,GAE/D,OAAIsa,UAIJ3iB,EAAG8F,KAAK6c,EAAO,GAEXphB,GACFA,EAASvB,IAGJ,EACR,CAAC,MACA,OAAO,CACR,G,gBCnB4D6iB,IAAM,EACnE1jB,QACAoC,WACAvB,SAEA,IACE,MAAM2iB,GAAQC,EAAAA,EAAAA,IAAUzjB,EAAMG,IAAKH,EAAME,UAAUwI,MAAMQ,IAAK,GAE9D,OAAIsa,UAIJ3iB,EAAG8F,KAAK6c,EAAO,GAEXphB,GACFA,EAASvB,IAGJ,EACR,CAAC,MAAO4O,GACP,OAAO,CACR,G,iBCiC8D3N,GAAQ,EACvEZ,SACAM,OACAX,KACAuB,eAEA,MAAM0F,EAvER,SAA0BhG,GACxB,MAAM6hB,EAAQ7hB,EAAKwE,MAAM,UACzB,IAMIsd,EACAC,EACAC,EACAC,EATAzZ,EAASqZ,EAAMA,EAAM5b,OAAS,GAEnB,UAAXuC,IACFA,EAAS,KAQX,IAAK,IAAIuQ,EAAI,EAAGA,EAAI8I,EAAM5b,OAAS,EAAG8S,GAAK,EAAG,CAC5C,MAAMmJ,EAAML,EAAM9I,GAElB,GAAI,kBAAkB7E,KAAKgO,GACzBD,GAAO,OACF,GAAI,YAAY/N,KAAKgO,GAC1BJ,GAAM,OACD,GAAI,sBAAsB5N,KAAKgO,GACpCH,GAAO,OACF,GAAI,cAAc7N,KAAKgO,GAC5BF,GAAQ,MACH,KAAI,SAAS9N,KAAKgO,GAOvB,MAAM,IAAIpe,MAAM,+BAA+Boe,KAN3CpM,KAAWoB,IACb+K,GAAO,EAEPF,GAAO,CAIV,CACF,CAkBD,OAhBID,IACFtZ,EAAS,OAAOA,KAGduZ,IACFvZ,EAAS,QAAQA,KAGfyZ,IACFzZ,EAAS,QAAQA,KAGfwZ,IACFxZ,EAAS,SAASA,KAGbA,CACT,CAmBe2Z,CAAiBniB,GAAMwE,MAAM,UACpCH,EAAM2B,EAAKkC,MAAKjE,IAAS,CAAC,MAAO,OAAQ,OAAQ,SAASW,SAASX,KACnE3C,EAAQ,IAAI8gB,cAAc,UAAW,CACzC/d,IAAa,UAARA,EACD,IACAA,EACJge,OAAQrc,EAAKpB,SAAS,OACtB0d,QAAStc,EAAKpB,SAAS,QACvB2d,QAASvc,EAAKpB,SAAS,QACvB4d,SAAUxc,EAAKpB,SAAS,SACxB6d,SAAS,EACTC,YAAY,IAGRC,EAAsBvjB,EAAOwjB,oBAAmB,KACpDljB,EAAKmjB,SAAS,iBAAiBC,GAAKA,EAAEpjB,EAAM4B,IAAO,IAWrD,OARAqhB,SAAAA,EAAqBhZ,MAAMlI,SAAQiX,IACjC,MAAMqK,EAAUrK,EAAK3Y,IAAIhB,EAAGsO,SAExB0V,GAAWziB,GACbvB,EAAGikB,UAAUD,EACd,KAGI,CAAI,E,KCnF4BjF,CAAC1G,EAAY7T,EAAa,CAAC,IAAM,EAAGrF,QAAOoC,gBAEjE6W,EAAajZ,EADjByF,EAAYyT,EAAYlZ,EAAMU,QACA2E,KAMpC0f,EAAAA,EAAAA,IAAa/kB,EAAOoC,G,eCXgC4iB,IAAM,EAAGhlB,QAAOoC,eACpE6iB,EAAAA,EAAAA,IAAuBjlB,EAAOoC,G,aCCkB8W,GAAc,EAAGlZ,QAAOoC,eAC/E,MAAM+B,EAAOsB,EAAYyT,EAAYlZ,EAAMU,QAE3C,OAAOwkB,EAAAA,EAAAA,IAAqB/gB,EAArB+gB,CAA2BllB,EAAOoC,EAAS,E,cCLO+iB,IAAM,EAAGnlB,QAAOoC,eAClEgjB,EAAAA,EAAAA,IAAsBplB,EAAOoC,G,gBCMyBijB,CAACnM,EAAY7T,IAAe,EAAGxE,KAAIb,QAAOoC,eACvG,IAAIkjB,EAA4B,KAC5BC,EAA4B,KAEhC,MAAMrK,EAAavB,EACK,iBAAfT,EAA0BA,EAAaA,EAAWpX,KACzD9B,EAAMU,QAGR,QAAKwa,IAIc,SAAfA,IACFoK,EAAW7f,EAAYyT,EAAwBlZ,EAAMU,SAGpC,SAAfwa,IACFqK,EAAWxO,EAAYmC,EAAwBlZ,EAAMU,SAGnD0B,GACFvB,EAAGX,UAAUwV,OAAOnS,SAAQiI,IAC1BxL,EAAMG,IAAI4I,aAAayC,EAAM9C,MAAMQ,IAAKsC,EAAMmK,IAAIzM,KAAK,CAAC7B,EAAM6B,KACxDoc,GAAYA,IAAaje,EAAKlD,MAChCtD,EAAG8e,cAAczW,OAAKjG,EAAW2W,GAAYvS,EAAKP,MAAOzB,IAGvDkgB,GAAYle,EAAKa,MAAMH,QACzBV,EAAKa,MAAM3E,SAAQ8H,IACbka,IAAala,EAAKlH,MACpBtD,EAAG2kB,QACDtc,EACAA,EAAM7B,EAAKuP,SACX2O,EAAShQ,OAAOqE,GAAYvO,EAAKvE,MAAOzB,IAE3C,GAEJ,GACD,KAIC,EAAI,E,eCpDgDsb,IAAM,EAAG9f,KAAIuB,eACpEA,GACFvB,EAAG8f,kBAGE,G,UCL0C8E,IAAM,EAAG5kB,KAAIQ,cACvDA,EAASqkB,iBAAiB,CAC/B9a,KAAM,EACNC,GAAIhK,EAAGV,IAAI8N,QAAQU,O,mBCD8CgX,IAAM,EAAG3lB,QAAOoC,eAC5EwjB,EAAAA,EAAAA,IAA2B5lB,EAAOoC,G,kBCDwByjB,IAAM,EAAG7lB,QAAOoC,eAC1E0jB,EAAAA,EAAAA,GAA0B9lB,EAAOoC,G,iBCDuB2jB,IAAM,EAAG/lB,QAAOoC,eACxE4jB,EAAAA,EAAAA,IAAyBhmB,EAAOoC,G,mBCC4B6jB,IAAM,EAAGjmB,QAAOoC,eAC5E8jB,EAAAA,EAAAA,IAA2BlmB,EAAOoC,G,qBCD8B+jB,IAAM,EAAGnmB,QAAOoC,eAChFgkB,EAAAA,EAAAA,IAA6BpmB,EAAOoC,G,WCEQ8c,CAACjR,EAASgR,GAAa,EAAO1G,EAAe,CAAC,IAAM,EAAG1X,KAAIK,SAAQkB,eACtH,MAAM,IAAEjC,GAAQU,EACVmX,EAAWiC,GAAehM,EAAS/M,EAAOR,OAAQ6X,GAMxD,OAJInW,GACFvB,EAAG2J,YAAY,EAAGrK,EAAI8N,QAAQU,KAAMqJ,GAAUtM,QAAQ,iBAAkBuT,IAGnE,CAAI,E,QCmCkCoH,CAACnN,EAAY7T,EAAa,CAAC,IAAM,EAAGxE,KAAIb,QAAOoC,eAC5F,MAAM,UAAElC,GAAcW,GAChB,MAAEsY,EAAK,OAAEzD,GAAWxV,EACpBiE,EAAO4S,EAAYmC,EAAYlZ,EAAMU,QAE3C,GAAI0B,EACF,GAAI+W,EAAO,CACT,MAAM7R,EAAgB4S,GAAkBla,EAAOmE,GAE/CtD,EAAGylB,cACDniB,EAAKoR,OAAO,IACPjO,KACAjC,IAGR,MACCqQ,EAAOnS,SAAQiI,IACb,MAAMZ,EAAOY,EAAM9C,MAAMQ,IACnB2B,EAAKW,EAAMmK,IAAIzM,IAErBlJ,EAAMG,IAAI4I,aAAa6B,EAAMC,GAAI,CAACxD,EAAM6B,KACtC,MAAMqd,EAAcvd,KAAKC,IAAIC,EAAK0B,GAC5B4b,EAAYxd,KAAK0F,IAAIxF,EAAM7B,EAAKuP,SAAU/L,GAC5BxD,EAAKa,MAAM8B,MAAKqB,GAAQA,EAAKlH,OAASA,IAMxDkD,EAAKa,MAAM3E,SAAQ8H,IACblH,IAASkH,EAAKlH,MAChBtD,EAAG2kB,QACDe,EACAC,EACAriB,EAAKoR,OAAO,IACPlK,EAAKvE,SACLzB,IAGR,IAGHxE,EAAG2kB,QAAQe,EAAaC,EAAWriB,EAAKoR,OAAOlQ,GAChD,GACD,IAKR,OA7FF,SAAoBrF,EAAoBa,EAAiB4lB,G,MACvD,MAAM,UAAEvmB,GAAcW,EACtB,IAAI6lB,EAA6B,KAMjC,GAJI1P,EAAgB9W,KAClBwmB,EAASxmB,EAAUoM,SAGjBoa,EAAQ,CACV,MAAMC,EAAgC,QAAjBrd,EAAAtJ,EAAMI,mBAAW,IAAAkJ,EAAAA,EAAIod,EAAOxe,QAGjD,QACIue,EAAY5P,QAAQ8P,KAClBA,EAAape,MAAK8C,GAAQA,EAAKlH,KAAKsM,SAASgW,IAEpD,CAED,MAAM,OAAE/Q,GAAWxV,EAEnB,OAAOwV,EAAOnN,MAAK,EAAGG,QAAOiN,UAC3B,IAAIiR,EAAuC,IAAhBle,EAAMoS,OAC7B9a,EAAMG,IAAI0mB,eAAiB7mB,EAAMG,IAAIgE,KAAK2iB,eAAeL,GAmB7D,OAhBAzmB,EAAMG,IAAI4I,aAAaL,EAAMQ,IAAKyM,EAAIzM,KAAK,CAAC7B,EAAM0f,EAAMhjB,KAEtD,GAAI6iB,EACF,OAAO,EAGT,GAAIvf,EAAK2f,SAAU,CACjB,MAAMC,GAAwBljB,GAAUA,EAAOI,KAAK2iB,eAAeL,GAC7DS,IAA8BT,EAAY5P,QAAQxP,EAAKa,SACvDb,EAAKa,MAAMK,MAAK4e,GAAaA,EAAUhjB,KAAKsM,SAASgW,KAE3DG,EAAuBK,GAAwBC,CAChD,CACD,OAAQN,CAAoB,IAGvBA,CAAoB,GAE/B,CAkDSQ,CAAWpnB,EAAOa,EAAIsD,EAAK,E,QCnGWuH,CAACvF,EAAKC,IAAU,EAAGvF,SAChEA,EAAG6K,QAAQvF,EAAKC,IAET,G,QCCsCihB,CAACnO,EAAY7T,EAAa,CAAC,IAAM,EAAGrF,QAAOoC,WAAUC,YAClG,MAAM8B,EAAOsB,EAAYyT,EAAYlZ,EAAMU,QAG3C,OAAKyD,EAAKoK,YAORlM,IAEGN,SAAQ,EAAGV,iBACUimB,EAAAA,EAAAA,IAAanjB,EAAMkB,EAAnBiiB,CAA+BtnB,IAM5CqB,EAAS8d,eAEjBpd,SAAQ,EAAG/B,MAAOunB,MACVD,EAAAA,EAAAA,IAAanjB,EAAMkB,EAAnBiiB,CAA+BC,EAAcnlB,KAErDW,OApBH0H,QAAQC,KAAK,yEAEN,EAkBC,E,iBC1BqD0M,GAAY,EAAGvW,KAAIuB,eAClF,GAAIA,EAAU,CACZ,MAAM,IAAEjC,GAAQU,EACV+J,EAAOsM,EAAOE,EAAU,EAAGjX,EAAI8N,QAAQU,MACvCzO,EAAYod,EAAAA,GAAc/H,OAAOpV,EAAKyK,GAE5C/J,EAAGyf,aAAapgB,EACjB,CAED,OAAO,CAAI,E,iBCToDkX,GAAY,EAAGvW,KAAIuB,eAClF,GAAIA,EAAU,CACZ,MAAM,IAAEjC,GAAQU,GACV,KAAE+J,EAAI,GAAEC,GAA2B,iBAAbuM,EAAwB,CAAExM,KAAMwM,EAAUvM,GAAIuM,GAAaA,EACjFM,EAAST,EAAAA,GAAcM,QAAQpX,GAAKyK,KACpC+M,EAASV,EAAAA,GAAcQ,MAAMtX,GAAK0K,GAClC2D,EAAe0I,EAAOtM,EAAM8M,EAAQC,GACpC6F,EAActG,EAAOrM,EAAI6M,EAAQC,GACjCzX,EAAY+W,EAAAA,GAAc1B,OAAOpV,EAAKqO,EAAcgP,GAE1D3c,EAAGyf,aAAapgB,EACjB,CAED,OAAO,CAAI,E,aCZ4CgZ,GAAc,EAAGlZ,QAAOoC,eAC/E,MAAM+B,EAAOsB,EAAYyT,EAAYlZ,EAAMU,QAE3C,OAAO8mB,EAAAA,EAAAA,IAAqBrjB,EAArBqjB,CAA2BxnB,EAAOoC,EAAS,E,W3CQCqlB,EAAGC,aAAY,GAAS,CAAC,IAAM,EAClF7mB,KAAIb,QAAOoC,WAAUlB,aAErB,MAAM,UAAEhB,EAAS,IAAEC,GAAQU,GACrB,MAAE6H,EAAK,IAAEiN,GAAQzV,EAEjBqH,EAAgBsV,GADM3b,EAAOE,iBAAiBiE,WAGlDqD,EAAMrB,OAAOlD,KAAKrC,KAClB4G,EAAMrB,OAAOP,OAGf,GAAI5G,aAAqBod,EAAAA,IAAiBpd,EAAUmH,KAAK8N,QACvD,SAAKzM,EAAMI,gBAAiB6e,EAAAA,EAAAA,IAASxnB,EAAKuI,EAAMQ,OAI5C9G,IACEslB,GACFxJ,GAAYle,EAAOkB,EAAOE,iBAAiBiO,iBAG7CxO,EAAGyF,MAAMoC,EAAMQ,KAAKyX,kBAGf,IAGT,IAAKjY,EAAM3E,OAAOoR,QAChB,OAAO,EAGT,GAAI/S,EAAU,CACZ,MAAMqV,EAAQ9B,EAAI7M,eAAiB6M,EAAI5R,OAAOkK,QAAQU,KAElDzO,aAAqB+W,EAAAA,IACvBpW,EAAG+f,kBAGL,MAAMgH,EAAwB,IAAhBlf,EAAMoS,WAChB7X,E4ClEF,SAAyBuE,GAC7B,IAAK,IAAIqT,EAAI,EAAGA,EAAIrT,EAAMqgB,UAAWhN,GAAK,EAAG,CAC3C,MAAM,KAAE1W,GAASqD,EAAMsgB,KAAKjN,GAE5B,GAAI1W,EAAKoK,cAAgBpK,EAAK4jB,mBAC5B,OAAO5jB,CAEV,CAED,OAAO,IACT,C5CyDQ6jB,CAAetf,EAAMrB,MAAM,GAAGqY,eAAehX,EAAMuf,YAAY,KAEnE,IAAI7iB,EAAQqS,GAASmQ,EACjB,CACA,CACEzjB,KAAMyjB,EACN9gB,MAAOS,SAGTtE,EAEAV,GAAMolB,EAAAA,EAAAA,IAAS9mB,EAAGV,IAAKU,EAAGsO,QAAQtN,IAAI6G,EAAMQ,KAAM,EAAG9D,GAkBzD,GAfGA,GACK7C,KACDolB,EAAAA,EAAAA,IAAS9mB,EAAGV,IAAKU,EAAGsO,QAAQtN,IAAI6G,EAAMQ,KAAM,EAAG0e,EAAQ,CAAC,CAAEzjB,KAAMyjB,SAAW3kB,KAEhFV,GAAM,EACN6C,EAAQwiB,EACJ,CACA,CACEzjB,KAAMyjB,EACN9gB,MAAOS,SAGTtE,GAGFV,IACF1B,EAAGyF,MAAMzF,EAAGsO,QAAQtN,IAAI6G,EAAMQ,KAAM,EAAG9D,GAEnCwiB,IAAUnQ,IAAU/O,EAAMI,cAAgBJ,EAAM3E,OAAOI,OAASyjB,GAAO,CACzE,MAAMM,EAAQrnB,EAAGsO,QAAQtN,IAAI6G,EAAMqS,UAC7BoN,EAAStnB,EAAGV,IAAI8K,QAAQid,GAE1Bxf,EAAMrB,MAAM,GAAG+gB,eAAeD,EAAOhf,QAASgf,EAAOhf,QAAU,EAAGye,IACpE/mB,EAAG8e,cAAc9e,EAAGsO,QAAQtN,IAAI6G,EAAMqS,UAAW6M,EAEpD,CAGCF,GACFxJ,GAAYle,EAAOkB,EAAOE,iBAAiBiO,iBAG7CxO,EAAG8f,gBACJ,CAED,OAAO,CAAI,E,c6CjG8CzH,GAAc,EACvErY,KAAIb,QAAOoC,WAAUlB,a,MAErB,MAAMiD,EAAOsB,EAAYyT,EAAYlZ,EAAMU,SACrC,MAAEgI,EAAK,IAAEiN,GAAQ3V,EAAME,UAIrBmH,EAAwBrH,EAAME,UAAUmH,KAEhD,GAAKA,GAAQA,EAAK8N,SAAYzM,EAAMoS,MAAQ,IAAMpS,EAAM2f,WAAW1S,GACjE,OAAO,EAGT,MAAM2S,EAAc5f,EAAMrB,MAAM,GAEhC,GAAIihB,EAAYnkB,OAASA,EACvB,OAAO,EAGT,MAAMI,EAAsBrD,EAAOE,iBAAiBiE,WAEpD,GAAkC,IAA9BqD,EAAM3E,OAAOkK,QAAQU,MAAcjG,EAAMrB,MAAM,GAAGyP,aAAepO,EAAMuf,YAAY,GAAI,CAIzF,GACkB,IAAhBvf,EAAMoS,OACDpS,EAAMrB,MAAM,GAAGlD,OAASA,GACxBuE,EAAMS,OAAO,KAAOT,EAAMrB,MAAM,GAAGyP,WAAa,EAErD,OAAO,EAGT,GAAI1U,EAAU,CACZ,IAAImmB,EAAO/P,EAAAA,GAASW,MAElB,MAAMqP,EAAc9f,EAAMS,OAAO,GAAK,EAAIT,EAAMS,OAAO,GAAK,EAAI,EAIlE,IAAK,IAAIsf,EAAI/f,EAAMoS,MAAQ0N,EAAaC,GAAK/f,EAAMoS,MAAQ,EAAG2N,GAAK,EACjEF,EAAO/P,EAAAA,GAAS5N,KAAKlC,EAAMrB,KAAKohB,GAAGC,KAAKH,IAIxC,MAAMI,EAAajgB,EAAMuf,YAAY,GAAKvf,EAAMrB,MAAM,GAAGyP,WAAa,EAAIpO,EAAMuf,YAAY,GAAKvf,EAAMrB,MAAM,GAAGyP,WAAa,EAAI,EAG7H8R,EAAwB/L,GAC5BtY,EACAmE,EAAMrB,OAAOlD,KAAKrC,KAClB4G,EAAMrB,OAAOP,OAET+hB,GAAwC,QAA7Bvf,EAAAnF,EAAK2kB,aAAarJ,mBAAW,IAAAnW,OAAA,EAAAA,EAAEyf,cAAcH,UAA0B3lB,EAExFslB,EAAOA,EAAKS,OAAOxQ,EAAAA,GAAS5N,KAAKzG,EAAK4kB,cAAc,KAAMF,SAAa5lB,IAEvE,MAAMgM,EAAQvG,EAAMqS,OAAOrS,EAAMoS,OAAS0N,EAAc,IAExD3nB,EAAGooB,QAAQha,EAAOvG,EAAMgW,OAAOiK,GAAa,IAAIO,EAAAA,GAAMX,EAAM,EAAIC,EAAa,IAE7E,IAAIW,GAAO,EAEXtoB,EAAGV,IAAI4I,aAAakG,EAAOpO,EAAGV,IAAI8N,QAAQU,MAAM,CAACya,EAAGlgB,KAClD,GAAIigB,GAAO,EACT,OAAO,EAGLC,EAAE7a,aAAkC,IAAnB6a,EAAEnb,QAAQU,OAC7Bwa,EAAMjgB,EAAM,EACb,IAGCigB,GAAO,GACTtoB,EAAGyf,aAAarJ,EAAAA,GAAc4L,KAAKhiB,EAAGV,IAAI8K,QAAQke,KAGpDtoB,EAAG8f,gBACJ,CAED,OAAO,CACR,CAED,MAAMkI,EAAWlT,EAAIzM,MAAQR,EAAMwG,MAAQoZ,EAAY5I,eAAe,GAAGD,YAAc,KAEjF4J,EAAoBxM,GACxBtY,EACA+jB,EAAYnkB,KAAKrC,KACjBwmB,EAAYxhB,OAER8hB,EAAwB/L,GAC5BtY,EACAmE,EAAMrB,OAAOlD,KAAKrC,KAClB4G,EAAMrB,OAAOP,OAGfjG,EAAG6f,OAAOhY,EAAMQ,IAAKyM,EAAIzM,KAEzB,MAAM9D,EAAQyjB,EACV,CACA,CAAE1kB,OAAM2C,MAAOuiB,GACf,CAAEllB,KAAM0kB,EAAU/hB,MAAO8hB,IAEzB,CAAC,CAAEzkB,OAAM2C,MAAOuiB,IAEpB,KAAK1B,EAAAA,EAAAA,IAAS9mB,EAAGV,IAAKuI,EAAMQ,IAAK,GAC/B,OAAO,EAGT,GAAI9G,EAAU,CACZ,MAAM,UAAElC,EAAS,YAAEE,GAAgBJ,GAC7B,gBAAEqP,GAAoBnO,EAAOE,iBAC7B8G,EAAQ9H,GAAgBF,EAAUyV,IAAI7M,cAAgB5I,EAAUwI,MAAMR,QAI5E,GAFArH,EAAGyF,MAAMoC,EAAMQ,IAAK,EAAG9D,GAAOub,kBAEzBzY,IAAU9F,EACb,OAAO,EAGT,MAAM+b,EAAgBjW,EAAMzE,QAAO4H,GAAQgE,EAAgB3I,SAAS2E,EAAKlH,KAAKrC,QAE9EjB,EAAGqd,YAAYC,EAChB,CAED,OAAO,CAAI,E,W5C7EwCmL,CAACC,EAAgBC,EAAgB9B,EAAWriB,EAAa,CAAC,IAAM,EACnHnE,SAAQL,KAAIb,QAAOoC,WAAUC,QAAOhB,WAAUkB,UAE9C,MAAM,WAAE0B,EAAU,gBAAEoL,GAAoBnO,EAAOE,iBACzCid,EAAW5Y,EAAY8jB,EAAgBvpB,EAAMU,QAC7C+oB,EAAWhkB,EAAY+jB,EAAgBxpB,EAAMU,SAC7C,UAAER,EAAS,YAAEE,GAAgBJ,GAC7B,MAAE0I,EAAK,IAAEiN,GAAQzV,EACjBsL,EAAQ9C,EAAM4W,WAAW3J,GAEzBzN,EAAQ9H,GAAgBF,EAAUyV,IAAI7M,cAAgB5I,EAAUwI,MAAMR,QAE5E,IAAKsD,EACH,OAAO,EAGT,MAAMke,EAAa9O,IAAevT,GAAQ+V,GAAO/V,EAAKlD,KAAKrC,KAAMmC,IAA9C2W,CAA2D1a,GAE9E,GAAIsL,EAAMsP,OAAS,GAAK4O,GAAcle,EAAMsP,MAAQ4O,EAAW5O,OAAS,EAAG,CAEzE,GAAI4O,EAAWriB,KAAKlD,OAASka,EAC3B,OAAOhd,EAASsoB,aAAaF,GAI/B,GACErM,GAAOsM,EAAWriB,KAAKlD,KAAKrC,KAAMmC,IAC7Boa,EAASuL,aAAaF,EAAWriB,KAAK4G,UACtC7L,EAEL,OAAOC,IACJN,SAAQ,KACPlB,EAAG8e,cAAc+J,EAAWxgB,IAAKmV,IAE1B,KAERtc,SAAQ,IAAMqc,GAAkBvd,EAAIwd,KACpCtc,SAAQ,IAAM0c,GAAiB5d,EAAIwd,KACnCtb,KAEN,CACD,OAAK2kB,GAAcxf,GAAU9F,EAoB3BC,IAEGN,SAAQ,KACP,MAAM8nB,EAAgBtnB,IAAMunB,WAAWzL,EAAUhZ,GAE3C8Y,EAAgBjW,EAAMzE,QAAO4H,GAAQgE,EAAgB3I,SAAS2E,EAAKlH,KAAKrC,QAI9E,OAFAjB,EAAGqd,YAAYC,KAEX0L,GAIGxoB,EAAS8d,YAAY,IAE7B2K,WAAWzL,EAAUhZ,GACrBtD,SAAQ,IAAMqc,GAAkBvd,EAAIwd,KACpCtc,SAAQ,IAAM0c,GAAiB5d,EAAIwd,KACnCtb,MApCIV,IAEJN,SAAQ,MACeQ,IAAMunB,WAAWzL,EAAUhZ,IAM1ChE,EAAS8d,eAEjB2K,WAAWzL,EAAUhZ,GACrBtD,SAAQ,IAAMqc,GAAkBvd,EAAIwd,KACpCtc,SAAQ,IAAM0c,GAAiB5d,EAAIwd,KACnCtb,KAsBK,E,W6C3HyCgnB,CAAC7Q,EAAY7T,EAAa,CAAC,EAAGJ,EAAU,CAAC,IAAM,EAAGjF,QAAOqB,eAC5G,MAAM,qBAAE2oB,GAAuB,GAAU/kB,EACnCd,EAAO4S,EAAYmC,EAAYlZ,EAAMU,QAG3C,OAFiBqc,GAAa/c,EAAOmE,EAAMkB,GAGlChE,EAAS4oB,UAAU9lB,EAAM,CAAE6lB,yBAG7B3oB,EAASglB,QAAQliB,EAAMkB,EAAW,E,WCdU6kB,CAAChR,EAAYiR,EAAkB9kB,EAAa,CAAC,IAAM,EAAGrF,QAAOqB,eAChH,MAAM8C,EAAOsB,EAAYyT,EAAYlZ,EAAMU,QACrC0pB,EAAa3kB,EAAY0kB,EAAkBnqB,EAAMU,QAGvD,OAFiBuY,EAAajZ,EAAOmE,EAAMkB,GAGlChE,EAASgmB,QAAQ+C,GAGnB/oB,EAASgmB,QAAQljB,EAAMkB,EAAW,E,WCbUglB,CAACnR,EAAY7T,EAAa,CAAC,IAAM,EAAGrF,QAAOqB,eAC9F,MAAM8C,EAAOsB,EAAYyT,EAAYlZ,EAAMU,QAG3C,OAFiBuY,EAAajZ,EAAOmE,EAAMkB,GAGlChE,EAASue,KAAKzb,GAGhB9C,EAASipB,OAAOnmB,EAAMkB,EAAW,E,cCZiBklB,IAAM,EAAGvqB,QAAOoC,eACzE,MAAM3B,EAAUT,EAAMS,QAEtB,IAAK,IAAIoa,EAAI,EAAGA,EAAIpa,EAAQsH,OAAQ8S,GAAK,EAAG,CAC1C,MAAM9P,EAAStK,EAAQoa,GACvB,IAAI2P,EAIJ,GAAIzf,EAAOxB,KAAKiD,eAAiBge,EAAWzf,EAAO0f,SAASzqB,IAAS,CACnE,GAAIoC,EAAU,CACZ,MAAMvB,EAAKb,EAAMa,GACX6pB,EAASF,EAAS7e,UAExB,IAAK,IAAIgf,EAAID,EAAOjf,MAAM1D,OAAS,EAAG4iB,GAAK,EAAGA,GAAK,EACjD9pB,EAAG2Z,KAAKkQ,EAAOjf,MAAMkf,GAAG/O,OAAO8O,EAAOE,KAAKD,KAG7C,GAAIH,EAASrgB,KAAM,CACjB,MAAMjC,EAAQrH,EAAGV,IAAI8K,QAAQuf,EAAS5f,MAAM1C,QAE5CrH,EAAG2J,YAAYggB,EAAS5f,KAAM4f,EAAS3f,GAAI7K,EAAMU,OAAOyJ,KAAKqgB,EAASrgB,KAAMjC,GAC7E,MACCrH,EAAG6f,OAAO8J,EAAS5f,KAAM4f,EAAS3f,GAErC,CAED,OAAO,CACR,CACF,CAED,OAAO,CAAK,E,cC/B6CggB,IAAM,EAAGhqB,KAAIuB,eACtE,MAAM,UAAElC,GAAcW,GAChB,MAAEsY,EAAK,OAAEzD,GAAWxV,EAE1B,OAAIiZ,GAIA/W,GACFsT,EAAOnS,SAAQiI,IACb3K,EAAGiqB,WAAWtf,EAAM9C,MAAMQ,IAAKsC,EAAMmK,IAAIzM,IAAI,KALxC,CASE,E,UCFsC+gB,CAAC/Q,EAAYjU,EAAU,CAAC,IAAM,EAAGpE,KAAIb,QAAOoC,e,MAC7F,MAAM,qBAAE4nB,GAAuB,GAAU/kB,GACnC,UAAE/E,GAAcW,EAChBsD,EAAO4S,EAAYmC,EAAYlZ,EAAMU,SACrC,MAAEgI,EAAK,MAAEyQ,EAAK,OAAEzD,GAAWxV,EAEjC,IAAKkC,EACH,OAAO,EAGT,GAAI+W,GAAS6Q,EAAsB,CACjC,IAAI,KAAEpf,EAAI,GAAEC,GAAO3K,EACnB,MAAM4G,EAAwD,QAAhDwC,EAAAZ,EAAMR,QAAQ8B,MAAKqB,GAAQA,EAAKlH,OAASA,WAAO,IAAAmF,OAAA,EAAAA,EAAAxC,MACxD0E,EAAQ2K,EAAazN,EAAOvE,EAAM2C,GAEpC0E,IACFZ,EAAOY,EAAMZ,KACbC,EAAKW,EAAMX,IAGbhK,EAAGiqB,WAAWlgB,EAAMC,EAAI1G,EACzB,MACCuR,EAAOnS,SAAQiI,IACb3K,EAAGiqB,WAAWtf,EAAM9C,MAAMQ,IAAKsC,EAAMmK,IAAIzM,IAAK/E,EAAK,IAMvD,OAFAtD,EAAGkqB,iBAAiB5mB,IAEb,CAAI,E,iBCjCoD6mB,CAAC9R,EAAY7T,EAAa,CAAC,IAAM,EAAGxE,KAAIb,QAAOoC,eAC9G,IAAIkjB,EAA4B,KAC5BC,EAA4B,KAEhC,MAAMrK,EAAavB,EACK,iBAAfT,EAA0BA,EAAaA,EAAWpX,KACzD9B,EAAMU,QAGR,QAAKwa,IAIc,SAAfA,IACFoK,EAAW7f,EAAYyT,EAAwBlZ,EAAMU,SAGpC,SAAfwa,IACFqK,EAAWxO,EAAYmC,EAAwBlZ,EAAMU,SAGnD0B,GACFvB,EAAGX,UAAUwV,OAAOnS,SAAQiI,IAC1B,MAAMZ,EAAOY,EAAM9C,MAAMQ,IACnB2B,EAAKW,EAAMmK,IAAIzM,IAErBlJ,EAAMG,IAAI4I,aAAa6B,EAAMC,GAAI,CAACxD,EAAM6B,KAClCoc,GAAYA,IAAaje,EAAKlD,MAChCtD,EAAG8e,cAAczW,OAAKjG,EAAW,IAC5BoE,EAAKP,SACLzB,IAIHkgB,GAAYle,EAAKa,MAAMH,QACzBV,EAAKa,MAAM3E,SAAQ8H,IACjB,GAAIka,IAAala,EAAKlH,KAAM,CAC1B,MAAMoiB,EAAcvd,KAAKC,IAAIC,EAAK0B,GAC5B4b,EAAYxd,KAAK0F,IAAIxF,EAAM7B,EAAKuP,SAAU/L,GAEhDhK,EAAG2kB,QACDe,EACAC,EACAjB,EAAShQ,OAAO,IACXlK,EAAKvE,SACLzB,IAGR,IAEJ,GACD,KAIC,EAAI,E,OC3DgCilB,CAACpR,EAAY7T,EAAa,CAAC,IAAM,EAAGrF,QAAOoC,eACtF,MAAM+B,EAAOsB,EAAYyT,EAAYlZ,EAAMU,QAE3C,OAAOuqB,EAAAA,EAAAA,IAAe9mB,EAAMkB,EAArB4lB,CAAiCjrB,EAAOoC,EAAS,E,WCHL0nB,CAAC5Q,EAAY7T,EAAa,CAAC,IAAM,EAAGrF,QAAOoC,eAC9F,MAAM+B,EAAOsB,EAAYyT,EAAYlZ,EAAMU,QAE3C,OAAOwqB,EAAAA,EAAAA,IAAmB/mB,EAAMkB,EAAzB6lB,CAAqClrB,EAAOoC,EAAS,ICfvD,MAAM+oB,GAAW7W,EAAUiB,OAAO,CACvCzT,KAAM,WAENuQ,YAAWA,KACF,IACFhR,OCNI+pB,GAAW9W,EAAUiB,OAAO,CACvCzT,KAAM,WAEN0R,wBACE,MAAO,CACL,IAAI3H,EAAAA,GAAO,CACT1F,IAAK,IAAIqP,EAAAA,GAAU,YACnBxU,MAAO,CACLqqB,SAAUA,IAAMpqB,KAAKC,OAAO+D,QAAQomB,Y,ICRjCC,GAAchX,EAAUiB,OAAO,CAC1CzT,KAAM,cAEN0R,wBACE,MAAM,OAAEtS,GAAWD,KAEnB,MAAO,CACL,IAAI4K,EAAAA,GAAO,CACT1F,IAAK,IAAIqP,EAAAA,GAAU,eACnBxU,MAAO,CACLmL,gBAAiB,CACfiV,MAAOA,CAAC5f,EAAM4B,KACZlC,EAAOqqB,WAAY,EAEnB,MAAMtrB,EAAciB,EAAOlB,MAAMa,GAC9B6K,QAAQ,QAAS,CAAEtI,UACnBsI,QAAQ,gBAAgB,GAI3B,OAFAlK,EAAKY,SAASnC,IAEP,CAAK,EAEd0e,KAAMA,CAACnd,EAAM4B,KACXlC,EAAOqqB,WAAY,EAEnB,MAAMtrB,EAAciB,EAAOlB,MAAMa,GAC9B6K,QAAQ,OAAQ,CAAEtI,UAClBsI,QAAQ,gBAAgB,GAI3B,OAFAlK,EAAKY,SAASnC,IAEP,CAAK,M,IC3BburB,GAASlX,EAAUiB,OAAO,CACrCzT,KAAM,SAEN4Q,uBACE,MAAM+Y,EAAkBA,IAAMxqB,KAAKC,OAAOG,SAAS6mB,OAAM,EAAG7mB,cAAe,CACzE,IAAMA,EAASkpB,gBAGf,IAAMlpB,EAASU,SAAQ,EAAGlB,SACxB,MAAM,UAAEX,EAAS,IAAEC,GAAQU,GACrB,MAAEsY,EAAK,QAAEsH,GAAYvgB,GACrB,IAAEgJ,EAAG,OAAEnF,GAAW0c,EAClBiL,EAAajL,EAAQ1c,OAAOwK,YAAc1N,EAAGV,IAAI8K,QAAQ/B,EAAM,GAAKuX,EACpEkL,EAAoBD,EAAW3nB,OAAOI,KAAKoF,KAAK0G,UAEhD2b,EAAYnL,EAAQvX,IAAMuX,EAAQ3X,aAElC+iB,EAAaF,GAAsD,IAAjCD,EAAW3nB,OAAO+S,WACtD8U,IAAcnL,EAAQvX,IACtBoO,EAAAA,GAAUC,QAAQpX,GAAKyK,OAAS1B,EAEpC,UAAKiQ,GAAU0S,GAAc9nB,EAAOI,KAAKoK,cAAexK,EAAO2F,YAAY3B,SAIpE1G,EAAS8d,YAAY,IAG9B,IAAM9d,EAASuf,kBACf,IAAMvf,EAAS8hB,eACf,IAAM9hB,EAASskB,wBAGXmG,EAAeA,IAAM7qB,KAAKC,OAAOG,SAAS6mB,OAAM,EAAG7mB,cAAe,CACtE,IAAMA,EAASuf,kBACf,IAAMvf,EAASkf,oBACf,IAAMlf,EAASgiB,cACf,IAAMhiB,EAASwkB,uBAUXkG,EAAa,CACjBC,MARkBC,IAAMhrB,KAAKC,OAAOG,SAAS6mB,OAAM,EAAG7mB,cAAe,CACrE,IAAMA,EAAS8jB,gBACf,IAAM9jB,EAASwe,sBACf,IAAMxe,EAAS2jB,iBACf,IAAM3jB,EAASomB,gBAKf,YAAayE,IAAMjrB,KAAKC,OAAOG,SAAS2f,WACxCmL,UAAWV,EACX,gBAAiBA,EACjB,kBAAmBA,EACnBW,OAAQN,EACR,aAAcA,EACd,QAASO,IAAMprB,KAAKC,OAAOG,SAASokB,aAGhC6G,EAAW,IACZP,GAGCQ,EAAY,IACbR,EACH,SAAUN,EACV,gBAAiBA,EACjB,SAAUK,EACV,qBAAsBA,EACtB,aAAcA,EACd,QAASA,EACT,SAAUU,IAAMvrB,KAAKC,OAAOG,SAAS8kB,uBACrC,SAAUsG,IAAMxrB,KAAKC,OAAOG,SAAS4kB,sBAGvC,OAAIrO,KAAWoB,IACNuT,EAGFD,C,EAGT9Y,wBACE,MAAO,CAML,IAAI3H,EAAAA,GAAO,CACT1F,IAAK,IAAIqP,EAAAA,GAAU,iBACnB5H,kBAAmBA,CAACC,EAAcC,EAAU4e,KAI1C,IAHmB7e,EAAatF,MAAKtI,GAAeA,EAAYgM,cAC1D6B,EAAS3N,IAAIqhB,GAAGkL,EAASvsB,KAG7B,OAGF,MAAM,MAAEgZ,EAAK,KAAEvO,EAAI,GAAEC,GAAOiD,EAAS5N,UAC/BysB,EAAUrV,EAAAA,GAAUC,QAAQzJ,EAAS3N,KAAKyK,KAC1CgiB,EAAStV,EAAAA,GAAUG,MAAM3J,EAAS3N,KAAK0K,GAG7C,GAAIsO,GAFmBvO,IAAS+hB,GAAW9hB,IAAO+hB,EAGhD,OAKF,GAF4F,IAA5EF,EAASvsB,IAAI6O,YAAY,EAAG0d,EAASvsB,IAAI8N,QAAQU,KAAM,IAAK,KAAK5G,OAG/E,OAGF,MAAMlH,EAAK6rB,EAAS7rB,GACdb,EAAQF,EAAqB,CACjCE,MAAO0sB,EACPzsB,YAAaY,KAET,SAAEQ,GAAa,IAAIP,EAAe,CACtCI,OAAQD,KAAKC,OACblB,UAKF,OAFAqB,EAAS8d,aAEJte,EAAG4K,MAAM1D,OAIPlH,OAJP,CAIS,I,ICrINgsB,GAAWvY,EAAUiB,OAAO,CACvCzT,KAAM,WAEN0R,wBACE,MAAO,CACL,IAAI3H,EAAAA,GAAO,CACT1F,IAAK,IAAIqP,EAAAA,GAAU,YACnBxU,MAAO,CACLqE,WAAYpE,KAAKC,OAAO4rB,WAAa,CAAEC,SAAU,KAAQ,CAAC,K,kICyB9D,MAAOC,WAAe9pB,EAsC1BnC,YAAYkE,EAAkC,CAAC,GAC7CgoB,QA5BK,KAAS1B,WAAG,EAEZ,KAAgB1a,iBAAwB,CAAC,EAEzC,KAAA5L,QAAyB,CAC9BioB,QAASlV,SAASmV,cAAc,OAChClf,QAAS,GACTmf,WAAW,EACXC,iBAAapqB,EACbgB,WAAY,GACZqpB,WAAW,EACXjC,UAAU,EACVkC,YAAa,CAAC,EACdhV,aAAc,CAAC,EACflF,kBAAkB,EAClBE,kBAAkB,EAClBia,sBAAsB,EACtB1c,eAAgBA,IAAM,KACtBC,SAAUA,IAAM,KAChBC,SAAUA,IAAM,KAChBC,kBAAmBA,IAAM,KACzBC,cAAeA,IAAM,KACrBC,QAASA,IAAM,KACfC,OAAQA,IAAM,KACdC,UAAWA,IAAM,MA4OZ,KAAsBoc,wBAAG,EAExB,KAAmBhJ,oBAAuB,KAzOhDxjB,KAAKysB,WAAWzoB,GAChBhE,KAAK0sB,yBACL1sB,KAAK2sB,uBACL3sB,KAAK4sB,eACL5sB,KAAKkC,GAAG,eAAgBlC,KAAKgE,QAAQ6L,gBACrC7P,KAAKqC,KAAK,eAAgB,CAAEpC,OAAQD,OACpCA,KAAK6sB,aACL7sB,KAAKmsB,YACLnsB,KAAKkC,GAAG,SAAUlC,KAAKgE,QAAQ8L,UAC/B9P,KAAKkC,GAAG,SAAUlC,KAAKgE,QAAQ+L,UAC/B/P,KAAKkC,GAAG,kBAAmBlC,KAAKgE,QAAQgM,mBACxChQ,KAAKkC,GAAG,cAAelC,KAAKgE,QAAQiM,eACpCjQ,KAAKkC,GAAG,QAASlC,KAAKgE,QAAQkM,SAC9BlQ,KAAKkC,GAAG,OAAQlC,KAAKgE,QAAQmM,QAC7BnQ,KAAKkC,GAAG,UAAWlC,KAAKgE,QAAQoM,WAEhClE,OAAOd,YAAW,KACZpL,KAAK4d,cAIT5d,KAAKI,SAAS+f,MAAMngB,KAAKgE,QAAQqoB,WACjCrsB,KAAKqC,KAAK,SAAU,CAAEpC,OAAQD,OAAO,GACpC,E,CAMMiE,cACT,OAAOjE,KAAK4P,gB,CAMHxP,eACT,OAAOJ,KAAK8sB,eAAe1sB,Q,CAMtBgB,QACL,OAAOpB,KAAK8sB,eAAe1rB,O,CAMtBE,MACL,OAAOtB,KAAK8sB,eAAexrB,K,CAMrB6qB,YACFnsB,KAAKgE,QAAQmoB,WAAapV,WAC5B/W,KAAK+sB,I,SCxIoB7mB,EAAe8mB,EAAgBC,GAC5D,MAAMC,EAAoCnW,SAASoW,cAAc,4BAEjE,GAAuB,OAAnBD,EACF,OAAOA,EAGT,MAAME,EAAYrW,SAASmV,cAAc,SAUzC,OARIc,GACFI,EAAUC,aAAa,QAASL,GAGlCI,EAAUC,aAAa,oBAAkD,IACzED,EAAUE,UCdS,w8CDenBvW,SAASwW,qBAAqB,QAAQ,GAAGC,YAAYJ,GAE9CA,CACT,CDsHiBK,CExII,EFwIkBztB,KAAKgE,QAAQooB,a,CAS3CK,WAAWzoB,EAAkC,CAAC,GACnDhE,KAAKgE,QAAU,IACVhE,KAAKgE,WACLA,GAGAhE,KAAKO,MAASP,KAAKjB,QAASiB,KAAK4d,cAIlC5d,KAAKgE,QAAQsoB,aACftsB,KAAKO,KAAKmtB,SAAS1tB,KAAKgE,QAAQsoB,aAGlCtsB,KAAKO,KAAKotB,YAAY3tB,KAAKjB,O,CAMtB6uB,YAAYxD,EAAmBpM,GAAa,GACjDhe,KAAKysB,WAAW,CAAErC,aAEdpM,GACFhe,KAAKqC,KAAK,SAAU,CAAEpC,OAAQD,KAAMhB,YAAagB,KAAKjB,MAAMa,I,CAOrDisB,iBAIT,OAAO7rB,KAAKgE,QAAQomB,UAAYpqB,KAAKO,MAAQP,KAAKO,KAAK6pB,Q,CAM9CrrB,YACT,OAAOiB,KAAKO,KAAKxB,K,CASZ8uB,eACL/jB,EACAgkB,GAEA,MAAMtuB,EAAUsG,EAAWgoB,GACvBA,EAAchkB,EAAQ,IAAI9J,KAAKjB,MAAMS,UACrC,IAAIQ,KAAKjB,MAAMS,QAASsK,GAEtB/K,EAAQiB,KAAKjB,MAAMW,YAAY,CAAEF,YAEvCQ,KAAKO,KAAKotB,YAAY5uB,E,CAQjBgvB,iBAAiBC,GACtB,GAAIhuB,KAAK4d,YACP,OAIF,MAAM/c,EAAkC,iBAApBmtB,EAAkC,GAAAA,KAAqBA,EAAgB9oB,IAErFnG,EAAQiB,KAAKjB,MAAMW,YAAY,CAEnCF,QAASQ,KAAKjB,MAAMS,QAAQgD,QAAOsH,IAAWA,EAAO5E,IAAI6b,WAAWlgB,OAGtEb,KAAKO,KAAKotB,YAAY5uB,E,CAMhB2tB,yBACN,MACMuB,EAAgB,IADCjuB,KAAKgE,QAAQuoB,qBAAuB9rB,OAAOytB,OAAOlrB,IAAc,MAC1ChD,KAAKgE,QAAQhB,YAAYR,QAAOG,GACpE,CAAC,YAAa,OAAQ,QAAQ8C,SAAS9C,aAAS,EAATA,EAAWO,QAG3DlD,KAAKG,iBAAmB,IAAIgO,EAAiB8f,EAAejuB,K,CAMtD2sB,uBACN3sB,KAAK8sB,eAAiB,IAAIjtB,EAAe,CACvCI,OAAQD,M,CAOJ4sB,eACN5sB,KAAKP,OAASO,KAAKG,iBAAiBV,M,CAM9BotB,aACN,MAAM3tB,EAAM8Z,GAAehZ,KAAKgE,QAAQgJ,QAAShN,KAAKP,OAAQO,KAAKgE,QAAQsT,cACrErY,EAAYiX,EAAqBhX,EAAKc,KAAKgE,QAAQqoB,WAEzDrsB,KAAKO,KAAO,IAAI4tB,EAAAA,GAAWnuB,KAAKgE,QAAQioB,QAAS,IAC5CjsB,KAAKgE,QAAQsoB,YAChB8B,oBAAqBpuB,KAAKouB,oBAAoB/uB,KAAKW,MACnDjB,MAAOsvB,EAAAA,GAAY/Z,OAAO,CACxBpV,MACAD,UAAWA,QAAa+C,MAM5B,MAAMypB,EAAWzrB,KAAKjB,MAAMW,YAAY,CACtCF,QAASQ,KAAKG,iBAAiBX,UAGjCQ,KAAKO,KAAKotB,YAAYlC,GAEtBzrB,KAAKsuB,kBACLtuB,KAAKuuB,eAIOvuB,KAAKO,KAAKuL,IAElB7L,OAASD,I,CAMRsuB,kBACLtuB,KAAKO,KAAKmtB,SAAS,CACjBjb,UAAWzS,KAAKG,iBAAiBsS,W,CAO9B8b,eACLvuB,KAAKO,KAAKuL,IAAI0iB,UAAY,UAAUxuB,KAAKO,KAAKuL,IAAI0iB,W,CAO7C/K,mBAAmBrhB,GACxBpC,KAAKwsB,wBAAyB,EAC9BpqB,IACApC,KAAKwsB,wBAAyB,EAE9B,MAAM5sB,EAAKI,KAAKwjB,oBAIhB,OAFAxjB,KAAKwjB,oBAAsB,KAEpB5jB,C,CAQDwuB,oBAAoBpvB,GAG1B,GAAIgB,KAAKO,KAAKqd,YACZ,OAGF,GAAI5d,KAAKwsB,uBACP,OAAKxsB,KAAKwjB,yBAMVxkB,EAAYwL,MAAMlI,SAAQiX,IAAO,IAAAlR,EAAC,OAAwB,QAAxBA,EAAArI,KAAKwjB,2BAAmB,IAAAnb,OAAA,EAAAA,EAAEkR,KAAKA,EAAK,SALpEvZ,KAAKwjB,oBAAsBxkB,GAU/B,MAAMD,EAAQiB,KAAKjB,MAAMK,MAAMJ,GACzByvB,GAAuBzuB,KAAKjB,MAAME,UAAUshB,GAAGxhB,EAAME,WAE3De,KAAKO,KAAKotB,YAAY5uB,GACtBiB,KAAKqC,KAAK,cAAe,CACvBpC,OAAQD,KACRhB,gBAGEyvB,GACFzuB,KAAKqC,KAAK,kBAAmB,CAC3BpC,OAAQD,KACRhB,gBAIJ,MAAMmhB,EAAQnhB,EAAYkC,QAAQ,SAC5Bwc,EAAO1e,EAAYkC,QAAQ,QAE7Bif,GACFngB,KAAKqC,KAAK,QAAS,CACjBpC,OAAQD,KACRmC,MAAOge,EAAMhe,MACbnD,gBAIA0e,GACF1d,KAAKqC,KAAK,OAAQ,CAChBpC,OAAQD,KACRmC,MAAOub,EAAKvb,MACZnD,gBAICA,EAAYgM,aAAchM,EAAYkC,QAAQ,kBAInDlB,KAAKqC,KAAK,SAAU,CAClBpC,OAAQD,KACRhB,e,CAOGgb,cAAcvV,GACnB,OAAOuV,GAAcha,KAAKjB,MAAO0F,E,CAW5BiqB,SAASC,EAA0BC,GACxC,MAAM/tB,EAAmC,iBAArB8tB,EAAgCA,EAAmB,KAEjEvqB,EAAyC,iBAArBuqB,EAAgCC,EAAwBD,EAElF,OGvZE,SACJ5vB,EACA8B,EACAuD,EAAkC,CAAC,GAEnC,IAAKvD,EACH,OAAOmX,EAAajZ,EAAO,KAAMqF,IAAe0X,GAAa/c,EAAO,KAAMqF,GAG5E,MAAM6V,EAAavB,EAAwB7X,EAAM9B,EAAMU,QAEvD,MAAmB,SAAfwa,EACKjC,EAAajZ,EAAO8B,EAAMuD,GAGhB,SAAf6V,GACK6B,GAAa/c,EAAO8B,EAAMuD,EAIrC,CHmYWsqB,CAAS1uB,KAAKjB,MAAO8B,EAAMuD,E,CAM7ByqB,UACL,OAAO7uB,KAAKjB,MAAMG,IAAIS,Q,CAMjBmvB,UACL,OIzaY,SAAoBC,EAAoBtvB,GACtD,MAAMuvB,EAAmBC,EAAAA,GAAcrX,WAAWnY,GAAQyvB,kBAAkBH,GAGtEI,EADoBpY,SAASqY,eAAeC,qBACdnD,cAAc,OAIlD,OAFAiD,EAAU3B,YAAYwB,GAEfG,EAAU7B,SACnB,CJgaWgC,CAAoBtvB,KAAKjB,MAAMG,IAAI8N,QAAShN,KAAKP,O,CAMnD8vB,QAAQvrB,GAIb,MAAM,eAAE8P,EAAiB,OAAM,gBAAEC,EAAkB,CAAC,GAAM/P,GAAW,CAAC,EAEtE,OKlbY,SACdoC,EACApC,GAUA,OAAO4P,EAAexN,EALR,CACZuD,KAAM,EACNC,GAAIxD,EAAK4G,QAAQU,MAGgB1J,EACrC,CLqaWurB,CAAQvvB,KAAKjB,MAAMG,IAAK,CAC7B4U,iBACAC,gBAAiB,IACZK,EAA6BpU,KAAKP,WAClCsU,I,CAQEyb,cACT,OMlcE,SAAsBppB,G,MAC1B,MAAMqpB,EAA0C,QAAzBpnB,EAAAjC,EAAKlD,KAAK4kB,uBAAe,IAAAzf,OAAA,EAAAA,EAAE1I,SAC5CqN,EAAU5G,EAAKzG,SAErB,OAAOub,KAAKC,UAAUsU,KAAoBvU,KAAKC,UAAUnO,EAC3D,CN6bW0iB,CAAY1vB,KAAKjB,MAAMG,I,CAQzBywB,oBAKL,OAJAnmB,QAAQC,KACN,+HAGKzJ,KAAKjB,MAAMG,IAAI8N,QAAQU,KAAO,C,CAMhCtB,UACLpM,KAAKqC,KAAK,WAENrC,KAAKO,MACPP,KAAKO,KAAK6L,UAGZpM,KAAKyC,oB,CAMImb,kB,MAET,QAAiB,QAATvV,EAAArI,KAAKO,YAAI,IAAA8H,OAAA,EAAAA,EAAEunB,Q,EO3djB,SAAUC,GAAc/wB,GAS5B,OAAO,IAAIgK,EAAU,CACnBC,KAAMjK,EAAOiK,KACbC,QAASA,EAAGjK,QAAOwL,QAAOhE,YACxB,MAAMnC,EAAa2B,EAAajH,EAAOkb,mBAAehY,EAAWuE,GAEjE,IAAmB,IAAfnC,GAAuC,OAAfA,EAC1B,OAAO,KAGT,MAAM,GAAExE,GAAOb,EACT+wB,EAAevpB,EAAMA,EAAMO,OAAS,GACpCipB,EAAYxpB,EAAM,GAExB,GAAIupB,EAAc,CAChB,MAAME,EAAcD,EAAUE,OAAO,MAC/BC,EAAY3lB,EAAMZ,KAAOomB,EAAUnf,QAAQkf,GAC3CK,EAAUD,EAAYJ,EAAahpB,OAWzC,GATsB6U,GAAgBpR,EAAMZ,KAAMY,EAAMX,GAAI7K,EAAMG,KAC/DsD,QAAOsC,GAEWA,EAAKsF,KAAKlH,KAAKktB,SAEhBrnB,MAAK7F,GAAQA,IAASpE,EAAOoE,MAAQA,IAAS4B,EAAKsF,KAAKlH,SAEzEV,QAAOsC,GAAQA,EAAK8E,GAAKsmB,IAEVppB,OAChB,OAAO,KAGLqpB,EAAU5lB,EAAMX,IAClBhK,EAAG6f,OAAO0Q,EAAS5lB,EAAMX,IAGvBsmB,EAAY3lB,EAAMZ,MACpB/J,EAAG6f,OAAOlV,EAAMZ,KAAOqmB,EAAaE,GAGtC,MAAMG,EAAU9lB,EAAMZ,KAAOqmB,EAAcF,EAAahpB,OAExDlH,EAAG2kB,QAAQha,EAAMZ,KAAOqmB,EAAaK,EAASvxB,EAAOoE,KAAKoR,OAAOlQ,GAAc,CAAC,IAEhFxE,EAAGkqB,iBAAiBhrB,EAAOoE,KAC5B,IAGP,CCzDM,SAAUotB,GAAcxxB,GAqB5B,OAAO,IAAIgK,EAAU,CACnBC,KAAMjK,EAAOiK,KACbC,QAASA,EAAGjK,QAAOwL,QAAOhE,YACxB,MAAMnC,EAAa2B,EAAajH,EAAOkb,mBAAehY,EAAWuE,IAAU,CAAC,GACtE,GAAE3G,GAAOb,EACTiP,EAAQzD,EAAMZ,KACpB,IAAIsE,EAAM1D,EAAMX,GAEhB,MAAM2mB,EAAUzxB,EAAOoE,KAAKoR,OAAOlQ,GAEnC,GAAImC,EAAM,GAAI,CAEZ,IAAIiqB,EAAaxiB,EADFzH,EAAM,GAAGkqB,YAAYlqB,EAAM,IAGtCiqB,EAAaviB,EACfuiB,EAAaviB,EAEbA,EAAMuiB,EAAajqB,EAAM,GAAGO,OAI9B,MAAM4pB,EAAWnqB,EAAM,GAAGA,EAAM,GAAGO,OAAS,GAE5ClH,EAAGqhB,WAAWyP,EAAU1iB,EAAQzH,EAAM,GAAGO,OAAS,GAGlDlH,EAAG2J,YAAYinB,EAAYviB,EAAKsiB,EACjC,MAAUhqB,EAAM,IACf3G,EAAGwf,OAAOpR,EAAQ,EAAGlP,EAAOoE,KAAKoR,OAAOlQ,IAAaqb,OACnD7f,EAAGsO,QAAQtN,IAAIoN,GACfpO,EAAGsO,QAAQtN,IAAIqN,IAInBrO,EAAG8f,gBAAgB,GAGzB,CCxDM,SAAUiR,GAAuB7xB,GASrC,OAAO,IAAIgK,EAAU,CACnBC,KAAMjK,EAAOiK,KACbC,QAASA,EAAGjK,QAAOwL,QAAOhE,YACxB,MAAMqqB,EAAS7xB,EAAMG,IAAI8K,QAAQO,EAAMZ,MACjCvF,EAAa2B,EAAajH,EAAOkb,mBAAehY,EAAWuE,IAAU,CAAC,EAE5E,IAAKqqB,EAAOxqB,MAAM,GAAG+gB,eAAeyJ,EAAO1oB,OAAO,GAAI0oB,EAAO5J,YAAY,GAAIloB,EAAOoE,MAClF,OAAO,KAGTnE,EAAMa,GACH6f,OAAOlV,EAAMZ,KAAMY,EAAMX,IACzByc,aAAa9b,EAAMZ,KAAMY,EAAMZ,KAAM7K,EAAOoE,KAAMkB,EAAW,GAGtE,CCdM,SAAUysB,GAAkB/xB,GAchC,OAAO,IAAIgK,EAAU,CACnBC,KAAMjK,EAAOiK,KACbC,QAASA,EACPjK,QAAOwL,QAAOhE,QAAOnF,YAErB,MAAMgD,EAAa2B,EAAajH,EAAOkb,mBAAehY,EAAWuE,IAAU,CAAC,EACtE3G,EAAKb,EAAMa,GAAG6f,OAAOlV,EAAMZ,KAAMY,EAAMX,IAEvCyU,EADSze,EAAGV,IAAI8K,QAAQO,EAAMZ,MACV0U,aACpByS,EAAWzS,IAAc0S,EAAAA,EAAAA,IAAa1S,EAAYvf,EAAOoE,KAAMkB,GAErE,IAAK0sB,EACH,OAAO,KAKT,GAFAlxB,EAAG0nB,KAAKjJ,EAAYyS,GAEhBhyB,EAAO2nB,WAAa3nB,EAAOmB,OAAQ,CACrC,MAAM,UAAEhB,EAAS,YAAEE,GAAgBJ,GAC7B,gBAAEqP,GAAoBtP,EAAOmB,OAAOE,iBACpC8G,EAAQ9H,GAAgBF,EAAUyV,IAAI7M,cAAgB5I,EAAUwI,MAAMR,QAE5E,GAAIA,EAAO,CACT,MAAMiW,EAAgBjW,EAAMzE,QAAO4H,GAAQgE,EAAgB3I,SAAS2E,EAAKlH,KAAKrC,QAE9EjB,EAAGqd,YAAYC,EAChB,CACF,CACD,GAAIpe,EAAOkyB,eAAgB,CAEzB,MAAM3M,EAAgC,eAArBvlB,EAAOoE,KAAKrC,MAA8C,gBAArB/B,EAAOoE,KAAKrC,KAAyB,WAAa,WAExGO,IAAQ2oB,iBAAiB1F,EAAUjgB,GAAYtC,KAChD,CAED,MAAMgY,EAASla,EAAGV,IAAI8K,QAAQO,EAAMZ,KAAO,GAAGO,WAG5C4P,GACGA,EAAO5W,OAASpE,EAAOoE,OACvBqa,EAAAA,EAAAA,IAAQ3d,EAAGV,IAAKqL,EAAMZ,KAAO,MAC3B7K,EAAOmyB,eAAiBnyB,EAAOmyB,cAAc1qB,EAAOuT,KAEzDla,EAAG8F,KAAK6E,EAAMZ,KAAO,EACtB,GAGP,C,MC6UakI,GAkBX/R,YAAYhB,EAAgD,CAAC,GAjB7D,KAAIoE,KAAG,OAEP,KAAIrC,KAAG,OAEP,KAAMiC,OAAgB,KAEtB,KAAKwQ,MAAgB,KAMrB,KAAAxU,OAAqB,CACnB+B,KAAMb,KAAKa,KACX0S,eAAgB,CAAC,GAIjBvT,KAAKlB,OAAS,IACTkB,KAAKlB,UACLA,GAGLkB,KAAKa,KAAOb,KAAKlB,OAAO+B,KAEpB/B,EAAOyU,gBACT/J,QAAQC,KACN,yHAAyHzJ,KAAKa,UAKlIb,KAAKgE,QAAUhE,KAAKlB,OAAOyU,eAEvBvT,KAAKlB,OAAO0U,aACdxT,KAAKgE,QAAU+B,EACbrD,EAA2C1C,KAAM,aAAc,CAC7Da,KAAMb,KAAKa,SAKjBb,KAAKiE,QAAU8B,EACbrD,EAA2C1C,KAAM,aAAc,CAC7Da,KAAMb,KAAKa,KACXmD,QAAShE,KAAKgE,YAEb,CAAC,C,CAGRqM,cAAgCvR,EAAoC,CAAC,GACnE,OAAO,IAAI+S,GAAW/S,E,CAGxB2U,UAAUzP,EAA4B,CAAC,GAGrC,MAAMrB,EAAY3C,KAAK0T,SAWvB,OATA/Q,EAAUqB,QAAUiP,EAAUjT,KAAKgE,QAAgCA,GAEnErB,EAAUsB,QAAU8B,EAClBrD,EAA2CC,EAAW,aAAc,CAClE9B,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,WAIhBrB,C,CAGT+Q,OACEC,EAAwE,CAAC,GAEzE,MAAMhR,EAAY,IAAIkP,GAAuC8B,GA2B7D,OAzBAhR,EAAUG,OAAS9C,KAEnBA,KAAKsT,MAAQ3Q,EAEbA,EAAU9B,KAAO8S,EAAe9S,KAAO8S,EAAe9S,KAAO8B,EAAUG,OAAOjC,KAE1E8S,EAAeJ,gBACjB/J,QAAQC,KACN,yHAAyH9G,EAAU9B,UAIvI8B,EAAUqB,QAAU+B,EAClBrD,EAA2CC,EAAW,aAAc,CAClE9B,KAAM8B,EAAU9B,QAIpB8B,EAAUsB,QAAU8B,EAClBrD,EAA2CC,EAAW,aAAc,CAClE9B,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,WAIhBrB,C,CAGT0N,mBAAkB,OAAEpQ,EAAM,KAAEmK,IAC1B,MAAM,GAAExK,GAAOK,EAAOlB,MAChBmyB,EAAajxB,EAAOlB,MAAME,UAAUwI,MAG1C,GAFgBypB,EAAWjpB,MAAQipB,EAAWjjB,MAEjC,CACX,MAAMyX,EAAewL,EAAWjqB,QAGhC,IAFmBye,EAAa3c,MAAKooB,IAAKA,aAAC,EAADA,EAAGjuB,KAAKrC,QAASuJ,EAAKvJ,OAG9D,OAAO,EAGT,MAAMgpB,EAAanE,EAAa3c,MAAKooB,IAAKA,aAAC,EAADA,EAAGjuB,KAAKrC,QAASuJ,EAAKvJ,OAShE,OAPIgpB,GACFjqB,EAAGkqB,iBAAiBD,GAEtBjqB,EAAGqhB,WAAW,IAAKiQ,EAAWjpB,KAE9BhI,EAAOM,KAAKY,SAASvB,IAEd,CACR,CAED,OAAO,C,QCrBEwxB,GAkBXtxB,YAAYhB,EAAgD,CAAC,GAjB7D,KAAIoE,KAAG,OAEP,KAAIrC,KAAG,OAEP,KAAMiC,OAAgB,KAEtB,KAAKwQ,MAAgB,KAMrB,KAAAxU,OAAqB,CACnB+B,KAAMb,KAAKa,KACX0S,eAAgB,CAAC,GAIjBvT,KAAKlB,OAAS,IACTkB,KAAKlB,UACLA,GAGLkB,KAAKa,KAAOb,KAAKlB,OAAO+B,KAEpB/B,EAAOyU,gBACT/J,QAAQC,KACN,yHAAyHzJ,KAAKa,UAKlIb,KAAKgE,QAAUhE,KAAKlB,OAAOyU,eAEvBvT,KAAKlB,OAAO0U,aACdxT,KAAKgE,QAAU+B,EACbrD,EAA2C1C,KAAM,aAAc,CAC7Da,KAAMb,KAAKa,SAKjBb,KAAKiE,QAAU8B,EACbrD,EAA2C1C,KAAM,aAAc,CAC7Da,KAAMb,KAAKa,KACXmD,QAAShE,KAAKgE,YAEb,CAAC,C,CAGRqM,cAAgCvR,EAAoC,CAAC,GACnE,OAAO,IAAIsyB,GAAWtyB,E,CAGxB2U,UAAUzP,EAA4B,CAAC,GAGrC,MAAMrB,EAAY3C,KAAK0T,SAWvB,OATA/Q,EAAUqB,QAAUiP,EAAUjT,KAAKgE,QAAgCA,GAEnErB,EAAUsB,QAAU8B,EAClBrD,EAA2CC,EAAW,aAAc,CAClE9B,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,WAIhBrB,C,CAGT+Q,OACEC,EAAwE,CAAC,GAEzE,MAAMhR,EAAY,IAAIyuB,GAAuCzd,GA2B7D,OAzBAhR,EAAUG,OAAS9C,KAEnBA,KAAKsT,MAAQ3Q,EAEbA,EAAU9B,KAAO8S,EAAe9S,KAAO8S,EAAe9S,KAAO8B,EAAUG,OAAOjC,KAE1E8S,EAAeJ,gBACjB/J,QAAQC,KACN,yHAAyH9G,EAAU9B,UAIvI8B,EAAUqB,QAAU+B,EAClBrD,EAA2CC,EAAW,aAAc,CAClE9B,KAAM8B,EAAU9B,QAIpB8B,EAAUsB,QAAU8B,EAClBrD,EAA2CC,EAAW,aAAc,CAClE9B,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,WAIhBrB,C,ECxmBL,SAAU0uB,GAAcvyB,GAS5B,OAAO,IAAI0M,EAAU,CACnBzC,KAAMjK,EAAOiK,KACbC,QAASA,EAAGjK,QAAOwL,QAAOhE,YACxB,MAAMnC,EAAa2B,EAAajH,EAAOkb,mBAAehY,EAAWuE,GAEjE,IAAmB,IAAfnC,GAAuC,OAAfA,EAC1B,OAAO,KAGT,MAAM,GAAExE,GAAOb,EACT+wB,EAAevpB,EAAMA,EAAMO,OAAS,GACpCipB,EAAYxpB,EAAM,GACxB,IAAI8pB,EAAU9lB,EAAMX,GAEpB,GAAIkmB,EAAc,CAChB,MAAME,EAAcD,EAAUE,OAAO,MAC/BC,EAAY3lB,EAAMZ,KAAOomB,EAAUnf,QAAQkf,GAC3CK,EAAUD,EAAYJ,EAAahpB,OAWzC,GATsB6U,GAAgBpR,EAAMZ,KAAMY,EAAMX,GAAI7K,EAAMG,KAC/DsD,QAAOsC,GAEWA,EAAKsF,KAAKlH,KAAKktB,SAEhBrnB,MAAK7F,GAAQA,IAASpE,EAAOoE,MAAQA,IAAS4B,EAAKsF,KAAKlH,SAEzEV,QAAOsC,GAAQA,EAAK8E,GAAKsmB,IAEVppB,OAChB,OAAO,KAGLqpB,EAAU5lB,EAAMX,IAClBhK,EAAG6f,OAAO0Q,EAAS5lB,EAAMX,IAGvBsmB,EAAY3lB,EAAMZ,MACpB/J,EAAG6f,OAAOlV,EAAMZ,KAAOqmB,EAAaE,GAGtCG,EAAU9lB,EAAMZ,KAAOqmB,EAAcF,EAAahpB,OAElDlH,EAAG2kB,QAAQha,EAAMZ,KAAOqmB,EAAaK,EAASvxB,EAAOoE,KAAKoR,OAAOlQ,GAAc,CAAC,IAEhFxE,EAAGkqB,iBAAiBhrB,EAAOoE,KAC5B,IAGP,C,oECPa,MAAAouB,EAAOzf,EAAAA,GAAKyC,OAAoB,CAC3CzT,KAAM,OAEN0wB,SAAU,IAEV1tB,aAAa,EAEbiM,WACE9P,KAAKgE,QAAQwtB,UAAUlvB,SAAQmvB,IACL,iBAAbA,GAIXC,EAAAA,EAAAA,IAAuBD,EAASE,OAAQF,EAASG,kBAH/CF,EAAAA,EAAAA,IAAuBD,EAGwC,G,EAIrErhB,aACEyhB,EAAAA,EAAAA,K,EAGFtiB,YACE,OAAOvP,KAAKgE,QAAQ8tB,Q,EAGtBte,WAAUA,KACD,CACLue,aAAa,EACbC,aAAa,EACbF,UAAU,EACVN,UAAW,GACXpiB,eAAgB,CACdnD,OAAQ,SACRgmB,IAAK,+BACLC,MAAO,MAETC,cAAUnwB,IAIdsC,gBACE,MAAO,CACL8tB,KAAM,CACJ3uB,QAAS,MAEXwI,OAAQ,CACNxI,QAASzD,KAAKgE,QAAQoL,eAAenD,QAEvCgmB,IAAK,CACHxuB,QAASzD,KAAKgE,QAAQoL,eAAe6iB,KAEvCC,MAAO,CACLzuB,QAASzD,KAAKgE,QAAQoL,eAAe8iB,O,EAK3CtuB,UAASA,IACA,CAAC,CAAEyuB,IAAK,2CAGjB1uB,YAAW,eAAEyL,IACX,MAAO,CAAC,KAAKxK,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,GAAiB,E,EAG7EgC,cACE,MAAO,CACLkhB,QACEluB,GAAc,EAAGhD,WACRA,IAAQgkB,QAAQplB,KAAKa,KAAMuD,GAAYqG,QAAQ,mBAAmB,GAAM3I,MAGnFywB,WACEnuB,GAAc,EAAGhD,WACRA,IACJ0nB,WAAW9oB,KAAKa,KAAMuD,EAAY,CAAE2kB,sBAAsB,IAC1Dte,QAAQ,mBAAmB,GAC3B3I,MAGP0wB,UACEA,IAAM,EAAGpxB,WACAA,IACJ4nB,UAAUhpB,KAAKa,KAAM,CAAEkoB,sBAAsB,IAC7Cte,QAAQ,mBAAmB,GAC3B3I,M,EAKXyQ,wBACE,MAAM/S,EAAoB,GCxIxB,IAAmBwE,EDmKrB,OAzBIhE,KAAKgE,QAAQ8tB,UACftyB,EAAQqC,MC3IWmC,ED4IR,CACPd,KAAMlD,KAAKkD,KACXivB,SAAUnyB,KAAKgE,QAAQmuB,UC7IxB,IAAIvnB,EAAAA,GAAO,CAChB1F,IAAK,IAAIqP,EAAAA,GAAU,YACnB5H,kBAAmBA,CAACC,EAAcC,EAAU4e,KAC1C,MAAMgH,EAAa7lB,EAAatF,MAAKtI,GAAeA,EAAYgM,eAAgB6B,EAAS3N,IAAIqhB,GAAGkL,EAASvsB,KACnGwzB,EAAkB9lB,EAAatF,MAAKtI,GAAeA,EAAYkC,QAAQ,qBAE7E,IAAKuxB,GAAcC,EACjB,OAGF,MAAM,GAAE9yB,GAAO6rB,EACT/gB,GAAY0O,EAAAA,EAAAA,IAAwBvM,EAAS3N,IAAK,IAAI0N,IA+F5D,OA9FgBwN,EAAAA,EAAAA,IAAiB1P,GAEzBpI,SAAQ,EAAGwY,eAEjB,MAAM6X,GAAuBnZ,EAAAA,EAAAA,IAC3BiS,EAASvsB,IACT4b,GACA1U,GAAQA,EAAKkH,cAGf,IAAIslB,EACAC,EAyBJ,GAvBIF,EAAqB7rB,OAAS,GAEhC8rB,EAAYD,EAAqB,GACjCE,EAAuBpH,EAASvsB,IAAI6O,YAClC6kB,EAAU3qB,IACV2qB,EAAU3qB,IAAM2qB,EAAUxsB,KAAKuP,cAC/B3T,EACA,MAGF2wB,EAAqB7rB,QAElB2kB,EAASvsB,IAAI6O,YAAY+M,EAASnR,KAAMmR,EAASlR,GAAI,IAAK,KAAKkpB,SAAS,OAE3EF,EAAYD,EAAqB,GACjCE,EAAuBpH,EAASvsB,IAAI6O,YAClC6kB,EAAU3qB,IACV6S,EAASlR,QACT5H,EACA,MAIA4wB,GAAaC,EAAsB,CACrC,MAAME,EAAwBF,EAAqBxtB,MAAM,KAAK7C,QAAOwwB,GAAW,KAANA,IAE1E,GAAID,EAAsBjsB,QAAU,EAClC,OAAO,EAGT,MAAMmsB,EAAsBF,EAAsBA,EAAsBjsB,OAAS,GAC3EosB,EAAyBN,EAAU3qB,IAAM4qB,EAAqBpC,YAAYwC,GAEhF,IAAKA,EACH,OAAO,GAGTlqB,EAAAA,EAAAA,IAAKkqB,GACFzwB,QAAO2wB,GAAQA,EAAKC,SAEpBxyB,KAAIuyB,IAAQ,IACRA,EACHxpB,KAAMupB,EAAyBC,EAAKnlB,MAAQ,EAC5CpE,GAAIspB,EAAyBC,EAAKllB,IAAM,MAGzCzL,QAAO2wB,IACD1H,EAAShsB,OAAOwH,MAAMgD,OAInBwhB,EAASvsB,IAAIm0B,aACnBF,EAAKxpB,KACLwpB,EAAKvpB,GACL6hB,EAAShsB,OAAOwH,MAAMgD,QAIzBzH,QAAO2wB,IACFnvB,EAAQmuB,UACHnuB,EAAQmuB,SAASgB,EAAKhuB,SAKhC7C,SAAQ6wB,KACHxX,EAAAA,EAAAA,IAAgBwX,EAAKxpB,KAAMwpB,EAAKvpB,GAAI6hB,EAASvsB,KAAKoI,MAAKxC,GAAQA,EAAKsF,KAAKlH,OAASc,EAAQd,QAI9FtD,EAAG2kB,QACD4O,EAAKxpB,KACLwpB,EAAKvpB,GACL5F,EAAQd,KAAKoR,OAAO,CAClB8d,KAAMe,EAAKf,OAEd,GAEN,KAGExyB,EAAG4K,MAAM1D,OAIPlH,OAJP,CAIS,MDoCPI,KAAKgE,QAAQ+tB,aACfvyB,EAAQqC,KE5JR,SAAuBmC,GAC3B,OAAO,IAAI4G,EAAAA,GAAO,CAChB1F,IAAK,IAAIqP,EAAAA,GAAU,mBACnBxU,MAAO,CACLuzB,YAAaA,CAAC/yB,EAAM0H,EAAK9F,K,QACvB,GAAqB,IAAjBA,EAAMoxB,OACR,OAAO,EAKT,GAA6B,MAFTpxB,EAAM8J,OAEVunB,SACd,OAAO,EAGT,MAAM3tB,GAAQmU,EAAAA,EAAAA,IAAczZ,EAAKxB,MAAOiF,EAAQd,KAAKrC,MAC/CsyB,EAAQhxB,EAAM8J,OAEdmmB,EAAiB,QAAV/pB,EAAA8qB,aAAI,EAAJA,EAAMf,YAAI,IAAA/pB,EAAAA,EAAIxC,EAAMusB,KAC3BnmB,EAAqB,QAAZ7D,EAAA+qB,aAAI,EAAJA,EAAMlnB,cAAM,IAAA7D,EAAAA,EAAIvC,EAAMoG,OAErC,SAAIknB,IAAQf,IACN7xB,EAAK6pB,UACPle,OAAOunB,KAAKrB,EAAMnmB,GAGb,GAGG,IAIpB,CF4HQynB,CAAa,CACXxwB,KAAMlD,KAAKkD,QAKjB1D,EAAQqC,KGhKN,SAAuBmC,GAC3B,OAAO,IAAI4G,EAAAA,GAAO,CAChB1F,IAAK,IAAIqP,EAAAA,GAAU,mBACnBxU,MAAO,CACL4zB,YAAaA,CAACpzB,EAAM4B,EAAOuG,K,QACzB,MAAM,MAAE3J,GAAUwB,GACZ,UAAEtB,GAAcF,EAGtB,GAAIA,EAAMG,IAAI8K,QAAQ/K,EAAU0K,MAAM7G,OAAOI,KAAKoF,KAAK2B,KACrD,OAAO,EAGT,IAAIxB,EAAc,GAElBC,EAAMsE,QAAQ1K,SAAQ8D,IACpBqC,GAAerC,EAAKqC,WAAW,IAGjC,IAAImrB,GAAgB,EAQpB,GANAlrB,EAAMsE,QAAQ6mB,aAAYztB,IACpBA,EAAKa,MAAMK,MAAK8C,GAAQA,EAAKlH,KAAKrC,OAASmD,EAAQd,KAAKrC,SAC1D+yB,GAAgB,EACjB,IAGCA,EACF,OAGF,MAAMT,GAAOpqB,EAAAA,EAAAA,IAAKN,GAAaM,MAAKjE,GAAQA,EAAKsuB,QAAUtuB,EAAKK,QAAUsD,IAE1E,IAAKxJ,EAAUiZ,OAASlU,EAAQguB,YAAa,CAC3C,MAAM8B,GAAaX,aAAA,EAAAA,EAAMf,OAAQ,KAEjC,GAAI0B,EAGF,OAFA9vB,EAAQ/D,OAAOG,SAASglB,QAAQphB,EAAQd,KAAM,CAAEkvB,KAAM0B,KAE/C,CAEV,CAED,MAAMC,EAA2D,UAAhB,QAAxB1rB,EAAAK,EAAMsE,QAAQgnB,kBAAU,IAAA3rB,OAAA,EAAAA,EAAEnF,KAAKrC,MAClDozB,EAAuD,QAA1B7rB,EAAAM,EAAMsE,QAAQgnB,kBAAY,IAAA5rB,OAAA,EAAAA,EAAAnB,MAAMK,MAAK8C,GAAQA,EAAKlH,KAAKrC,OAASmD,EAAQd,KAAKrC,OAEhH,GAAKkzB,GAAoBE,IAAgCjwB,EAAQguB,YAC/D,OAAO,EAGT,GAAImB,GAAQl0B,EAAUiZ,MAGpB,OAFAlU,EAAQ/D,OAAOG,SAASqgB,cAAc,YAAY0S,EAAKf,SAASe,EAAKf,aAE9D,EAGT,MAAM,GAAExyB,GAAOb,EACf,IAAIm1B,GAAa,EAEZj1B,EAAUiZ,QACbgc,GAAa,EAEbt0B,EAAG6f,OAAOxgB,EAAU0K,KAAM1K,EAAU2K,KAGtC,IAAIsnB,EAAajyB,EAAU0K,KACvBwqB,EAAgB,GAEpBzrB,EAAMsE,QAAQ1K,SAAQ8D,IACpB+tB,GAAgBprB,EAAAA,EAAAA,IAAK3C,EAAKqC,aAE1B7I,EAAGwf,OAAO8R,EAAa,EAAG9qB,GAEtB+tB,EAAcrtB,OAAS,IACzBotB,GAAa,EAEbC,EAAc7xB,SAAQ8xB,IACpB,MAAMC,EAAYnD,EAAakD,EAAapmB,MACtCsmB,EAAUpD,EAAakD,EAAanmB,IAC1BrO,EAAGV,IAAIm0B,aAAagB,EAAWC,EAAStwB,EAAQd,OAG9DtD,EAAG2kB,QAAQ8P,EAAWC,EAAStwB,EAAQd,KAAKoR,OAAO,CAAE8d,KAAMgC,EAAahC,OACzE,KAILlB,GAAc9qB,EAAKuP,QAAQ,IAG7B,MAAM4e,EAAmBJ,EAAcrtB,OAAS,EAEhD,SAAIlH,EAAGoL,YAAekpB,IAAcK,IAClCvwB,EAAQ/D,OAAOM,KAAKY,SAASvB,GAEtB,GAGG,IAIpB,CH2DM40B,CAAa,CACXv0B,OAAQD,KAAKC,OACbiD,KAAMlD,KAAKkD,KACX8uB,YAAahyB,KAAKgE,QAAQguB,eAIvBxyB,C,mDI1JJ,MAAMi1B,EAAa,WAEbC,EAAatD,EAAAA,GAAK9c,OAA0B,CAEvDzT,KAAM,aAEN2S,WAAUA,KACD,CACLpE,eAAgB,CAAC,IAIrBpC,QAAS,SAET0B,MAAO,QAEPK,UAAU,EAEVnL,UAASA,IACA,CACL,CAAEyuB,IAAK,eAIX1uB,YAAW,eAAEyL,IACX,MAAO,CAAC,cAAcxK,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,GAAiB,E,EAGtFgC,cACE,MAAO,CACLujB,cAAeA,IAAM,EAAGv0B,cACfA,EAASipB,OAAOrpB,KAAKa,MAE9B+zB,iBAAkBA,IAAM,EAAGx0B,cAClBA,EAASgpB,WAAWppB,KAAKa,MAElCg0B,gBAAiBA,IAAM,EAAGz0B,cACjBA,EAASue,KAAK3e,KAAKa,M,EAKhC4Q,uBACE,MAAO,CACL,cAAeqjB,IAAM90B,KAAKC,OAAOG,SAASw0B,mB,EAI9CziB,gBACE,MAAO,EACL0e,EAAAA,EAAAA,IAAkB,CAChB9nB,KAAM0rB,EACNvxB,KAAMlD,KAAKkD,O,IC/CN6xB,EAAiB,yCACjBC,EAAiB,yCACjBC,EAAuB,sCACvBC,EAAuB,sCAEvBC,EAAOtjB,EAAAA,GAAKyC,OAAoB,CAC3CzT,KAAM,OAEN2S,WAAUA,KACD,CACLpE,eAAgB,CAAC,IAIrBxL,UAASA,IACA,CACL,CACEyuB,IAAK,UAEP,CACEA,IAAK,IACLlsB,SAAUC,GAAmD,WAA1CA,EAAqBF,MAAMkvB,YAA2B,MAE3E,CACElvB,MAAO,cACPC,SAAUhB,GAAS,4BAA4B4P,KAAK5P,IAAoB,OAK9ExB,YAAW,eAAEyL,IACX,MAAO,CAAC,UAAUxK,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,GAAiB,E,EAGlFgC,cACE,MAAO,CACLikB,QAASA,IAAM,EAAGj1B,cACTA,EAASglB,QAAQplB,KAAKa,MAE/By0B,WAAYA,IAAM,EAAGl1B,cACZA,EAAS0oB,WAAW9oB,KAAKa,MAElC00B,UAAWA,IAAM,EAAGn1B,cACXA,EAAS4oB,UAAUhpB,KAAKa,M,EAKrC4Q,uBACE,MAAO,CACL,QAAS+jB,IAAMx1B,KAAKC,OAAOG,SAASk1B,aACpC,QAASG,IAAMz1B,KAAKC,OAAOG,SAASk1B,a,EAIxCnjB,gBACE,MAAO,EACL0d,EAAAA,EAAAA,IAAc,CACZ9mB,KAAMgsB,EACN7xB,KAAMlD,KAAKkD,QAEb2sB,EAAAA,EAAAA,IAAc,CACZ9mB,KAAMksB,EACN/xB,KAAMlD,KAAKkD,O,EAKjBmP,gBACE,MAAO,EACLgf,EAAAA,EAAAA,IAAc,CACZtoB,KAAMisB,EACN9xB,KAAMlD,KAAKkD,QAEbmuB,EAAAA,EAAAA,IAAc,CACZtoB,KAAMmsB,EACNhyB,KAAMlD,KAAKkD,O,IClGNwyB,EAAWtE,EAAAA,GAAK9c,OAAwB,CACnDzT,KAAM,WAEN2S,WAAUA,KACD,CACLpE,eAAgB,CAAC,EACjBumB,mBAAoB,aACpBC,oBAAqB,gBAIzB5oB,QAAS,mBAET+B,UAAU,EAEVnL,UAASA,IACA,CACL,CACEyuB,IAAK,OAKX1uB,YAAW,eAAEyL,IACX,MAAO,CAAC,MAAMxK,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,GAAiB,E,EAG9EqC,uBACE,MAAO,CACLsZ,MAAOA,IAAM/qB,KAAKC,OAAOG,SAASy1B,cAAc71B,KAAKa,MACrDi1B,IAAKA,IAAM91B,KAAKC,OAAOG,SAAS21B,aAAa/1B,KAAKa,MAClD,YAAam1B,IAAMh2B,KAAKC,OAAOG,SAASsoB,aAAa1oB,KAAKa,M,IClBnDo1B,EAAYpkB,EAAAA,GAAKyC,OAAyB,CACrDzT,KAAM,YAEN2S,WAAUA,KACD,CACLpE,eAAgB,CAAC,IAIrBxL,UAASA,IACA,CACL,CACEyuB,IAAK,OACLlsB,SAAU8lB,KACWA,EAAwBiK,aAAa,UAMjD,CAAC,IAMhBvyB,YAAW,eAAEyL,IACX,MAAO,CAAC,QAAQxK,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,GAAiB,E,EAGhFgC,cACE,MAAO,CACL+kB,qBAAsBA,IAAM,EAAGp3B,QAAOqB,eACpC,MAAMgE,GAAa6U,EAAAA,EAAAA,IAAkBla,EAAOiB,KAAKkD,MAGjD,QAFkBzC,OAAOE,QAAQyD,GAAYkD,MAAK,EAAE,CAAEnC,OAAaA,KAM5D/E,EAAS4oB,UAAUhpB,KAAKa,KAAK,E,ICtC/B4zB,EAAa,iBAEb2B,EAAahF,EAAAA,GAAK9c,OAA0B,CACvDzT,KAAM,aAEN2S,WAAUA,KACD,CACL6iB,aAAc,WACdjnB,eAAgB,CAAC,EACjBqX,WAAW,EACXuK,gBAAgB,IAIpBtiB,MAAO,aAEP1B,UACE,MAAO,GAAGhN,KAAKgE,QAAQqyB,e,EAGzBzyB,UAASA,IACA,CACL,CAAEyuB,IAAK,OAIX1uB,YAAW,eAAEyL,IACX,MAAO,CAAC,MAAMxK,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,GAAiB,E,EAG9EgC,cACE,MAAO,CACLklB,iBAAkBA,IAAM,EAAGl2B,WAAUgB,WAC/BpB,KAAKgE,QAAQgtB,eACR5vB,IAAQinB,WAAWroB,KAAKa,KAAMb,KAAKgE,QAAQqyB,aAAcr2B,KAAKgE,QAAQyiB,WAAWsD,iBAAiB2L,EAAS70B,KAAMb,KAAKC,OAAO+Z,cAAcic,EAAUp1B,OAAOiB,MAE9J1B,EAASioB,WAAWroB,KAAKa,KAAMb,KAAKgE,QAAQqyB,aAAcr2B,KAAKgE,QAAQyiB,W,EAKpFhV,uBACE,MAAO,CACL,cAAe8kB,IAAMv2B,KAAKC,OAAOG,SAASk2B,mB,EAI9CnkB,gBACE,IAAIqkB,GAAY3F,EAAAA,EAAAA,IAAkB,CAChC9nB,KAAM0rB,EACNvxB,KAAMlD,KAAKkD,OAab,OAVIlD,KAAKgE,QAAQyiB,WAAazmB,KAAKgE,QAAQgtB,kBACzCwF,GAAY3F,EAAAA,EAAAA,IAAkB,CAC5B9nB,KAAM0rB,EACNvxB,KAAMlD,KAAKkD,KACXujB,UAAWzmB,KAAKgE,QAAQyiB,UACxBuK,eAAgBhxB,KAAKgE,QAAQgtB,eAC7BhX,cAAeA,IAAeha,KAAKC,OAAO+Z,cAAcic,EAAUp1B,MAClEZ,OAAQD,KAAKC,UAGV,CACLu2B,E,ICzDO/B,EAAa,mCACbgC,EAAa,mCAEbC,EAAO7kB,EAAAA,GAAKyC,OAAoB,CAC3CzT,KAAM,OAEN2S,WAAUA,KACD,CACLpE,eAAgB,CAAC,IAIrBI,SAAU,IAEVvF,MAAM,EAEN0H,UAAU,EAEV/N,UAASA,IACA,CACL,CAAEyuB,IAAK,SAIX1uB,YAAW,eAAEyL,IACX,MAAO,CAAC,QAAQxK,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,GAAiB,E,EAGhFgC,cACE,MAAO,CACLulB,QAASA,IAAM,EAAGv2B,cACTA,EAASglB,QAAQplB,KAAKa,MAE/B+1B,WAAYA,IAAM,EAAGx2B,cACZA,EAAS0oB,WAAW9oB,KAAKa,MAElCg2B,UAAWA,IAAM,EAAGz2B,cACXA,EAAS4oB,UAAUhpB,KAAKa,M,EAKrC4Q,uBACE,MAAO,CACL,QAASqlB,IAAM92B,KAAKC,OAAOG,SAASw2B,a,EAIxCzkB,gBACE,MAAO,EACL0d,EAAAA,EAAAA,IAAc,CACZ9mB,KAAM0rB,EACNvxB,KAAMlD,KAAKkD,O,EAKjBmP,gBACE,MAAO,EACLgf,EAAAA,EAAAA,IAAc,CACZtoB,KAAM0tB,EACNvzB,KAAMlD,KAAKkD,O,kBCnDZ,MAAM6zB,EAAqB,uBACrBC,EAAkB,uBAElBC,EAAY7F,EAAAA,GAAK9c,OAAyB,CACrDzT,KAAM,YAEN2S,WAAUA,KACD,CACL0jB,oBAAqB,YACrBC,mBAAmB,EACnBC,iBAAiB,EACjBhoB,eAAgB,CAAC,IAIrBpC,QAAS,QAET/F,MAAO,GAEPyH,MAAO,QAEPzE,MAAM,EAEN8E,UAAU,EAEVzK,gBACE,MAAO,CACL+yB,SAAU,CACR5zB,QAAS,KACTG,UAAWqoB,I,MACT,MAAM,oBAAEiL,GAAwBl3B,KAAKgE,QAOrC,MANmB,KAA8B,QAAzBqE,EAAA4jB,EAAQqL,yBAAiB,IAAAjvB,OAAA,EAAAA,EAAEkvB,YAAa,IAE7D/0B,QAAOgsB,GAAaA,EAAUzN,WAAWmW,KACzCt2B,KAAI4tB,GAAaA,EAAUxG,QAAQkP,EAAqB,MAChC,IAGlB,IAGM,EAEjBxzB,UAAU,G,EAKhBE,UAASA,IACA,CACL,CACEyuB,IAAK,MACLzR,mBAAoB,SAK1Bjd,YAAW,KAAEyC,EAAI,eAAEgJ,IACjB,MAAO,CACL,OACAxK,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,GAC7C,CACE,OACA,CACE8iB,MAAO9rB,EAAKP,MAAMwxB,SACdr3B,KAAKgE,QAAQkzB,oBAAsB9wB,EAAKP,MAAMwxB,SAC9C,MAEN,G,EAKNjmB,cACE,MAAO,CACLomB,aACEpzB,GAAc,EAAGhE,cACRA,EAASgmB,QAAQpmB,KAAKa,KAAMuD,GAEvCqzB,gBACErzB,GAAc,EAAGhE,cACRA,EAAS6oB,WAAWjpB,KAAKa,KAAM,YAAauD,G,EAK3DqN,uBACE,MAAO,CACL,YAAaimB,IAAM13B,KAAKC,OAAOG,SAASq3B,kBAGxCvM,UAAWA,KACT,MAAM,MAAEhT,EAAK,QAAEsH,GAAYxf,KAAKC,OAAOlB,MAAME,UACvC2rB,EAA4B,IAAhBpL,EAAQvX,IAE1B,SAAKiQ,GAASsH,EAAQ1c,OAAOI,KAAKrC,OAASb,KAAKa,UAI5C+pB,GAAcpL,EAAQ1c,OAAO2F,YAAY3B,SACpC9G,KAAKC,OAAOG,SAAS8d,YAGlB,EAId6M,MAAOA,EAAG9qB,aACR,IAAKD,KAAKgE,QAAQmzB,kBAChB,OAAO,EAGT,MAAM,MAAEp4B,GAAUkB,GACZ,UAAEhB,GAAcF,GAChB,MAAE0I,EAAK,MAAEyQ,GAAUjZ,EAEzB,IAAKiZ,GAASzQ,EAAM3E,OAAOI,OAASlD,KAAKkD,KACvC,OAAO,EAGT,MAAMy0B,EAAUlwB,EAAMI,eAAiBJ,EAAM3E,OAAO6S,SAAW,EACzDiiB,EAAwBnwB,EAAM3E,OAAO2F,YAAYqqB,SAAS,QAEhE,SAAK6E,IAAYC,IAIV33B,EACJmB,QACAN,SAAQ,EAAGlB,SACVA,EAAG6f,OAAOhY,EAAMQ,IAAM,EAAGR,EAAMQ,MAExB,KAER8X,WACAje,KAAK,EAIV+1B,UAAWA,EAAG53B,aACZ,IAAKD,KAAKgE,QAAQozB,gBAChB,OAAO,EAGT,MAAM,MAAEr4B,GAAUkB,GACZ,UAAEhB,EAAS,IAAEC,GAAQH,GACrB,MAAE0I,EAAK,MAAEyQ,GAAUjZ,EAEzB,IAAKiZ,GAASzQ,EAAM3E,OAAOI,OAASlD,KAAKkD,KACvC,OAAO,EAKT,GAFgBuE,EAAMI,eAAiBJ,EAAM3E,OAAO6S,SAAW,EAG7D,OAAO,EAGT,MAAM8H,EAAQhW,EAAMgW,QAEpB,YAAczb,IAAVyb,KAIcve,EAAIoe,OAAOG,IAMtBxd,EAAOG,SAAS2f,WAAU,E,EAKvC5N,gBACE,MAAO,EACLwe,EAAAA,EAAAA,IAAuB,CACrB5nB,KAAMguB,EACN7zB,KAAMlD,KAAKkD,KACX8W,cAAezT,IAAS,CACtB8wB,SAAU9wB,EAAM,QAGpBoqB,EAAAA,EAAAA,IAAuB,CACrB5nB,KAAMiuB,EACN9zB,KAAMlD,KAAKkD,KACX8W,cAAezT,IAAS,CACtB8wB,SAAU9wB,EAAM,O,EAMxBgM,wBACE,MAAO,CAGL,IAAI3H,EAAAA,GAAO,CACT1F,IAAK,IAAIqP,EAAAA,GAAU,0BACnBxU,MAAO,CACL4zB,YAAaA,CAACpzB,EAAM4B,KAClB,IAAKA,EAAMsK,cACT,OAAO,EAIT,GAAIzM,KAAKC,OAAOyuB,SAAS1uB,KAAKkD,KAAKrC,MACjC,OAAO,EAGT,MAAMqI,EAAO/G,EAAMsK,cAAcC,QAAQ,cACnCorB,EAAS31B,EAAMsK,cAAcC,QAAQ,sBACrCqrB,EAAaD,EAAS5c,KAAKpD,MAAMggB,QAAU91B,EAC3Cq1B,EAAWU,aAAA,EAAAA,EAAYC,KAE7B,IAAK9uB,IAASmuB,EACZ,OAAO,EAGT,MAAM,GAAEz3B,GAAOW,EAAKxB,MAoBpB,OAjBAa,EAAGq4B,qBAAqBj4B,KAAKkD,KAAKoR,OAAO,CAAE+iB,cAG3Cz3B,EAAGyf,aAAarJ,EAAAA,GAAc4L,KAAKhiB,EAAGV,IAAI8K,QAAQjC,KAAKC,IAAI,EAAGpI,EAAGX,UAAU0K,KAAO,MAKlF/J,EAAGqhB,WAAW/X,EAAK8e,QAAQ,SAAU,OAKrCpoB,EAAG6K,QAAQ,SAAS,GAEpBlK,EAAKY,SAASvB,IAEP,CAAI,K,ICtRVs4B,EAAW9G,EAAAA,GAAK9c,OAAO,CAClCzT,KAAM,MACNyN,SAAS,EACTtB,QAAS,W,cCIE,MAAAmrB,EAAa9kB,EAAAA,GAAUiB,OAA0B,CAC5DzT,KAAM,aAEN2S,WAAUA,KACD,CACL4kB,MAAO,eACPvb,MAAO,EACPqV,WAAOlwB,IAIXuQ,wBACE,MAAO,EACL8lB,EAAAA,EAAAA,GAAWr4B,KAAKgE,S,kBCGT,MAAAs0B,EAAYjlB,EAAAA,GAAUiB,OAAO,CACxCzT,KAAM,YAEN0R,sBAAqBA,IACZ,EACLgmB,EAAAA,EAAAA,MAIJ9pB,iBAAiB9L,G,MACf,MAAME,EAAU,CACdhC,KAAM8B,EAAU9B,KAChBmD,QAASrB,EAAUqB,QACnBC,QAAStB,EAAUsB,SAGrB,MAAO,CACLu0B,eAAqF,QAArEnwB,GAAAtC,EAAAA,EAAAA,KAAarD,EAAAA,EAAAA,IAAkBC,EAAW,iBAAkBE,WAAS,IAAAwF,EAAAA,EAAI,K,ICxBlFowB,EAAYrH,EAAAA,GAAK9c,OAAyB,CACrDzT,KAAM,YAEN2S,WAAUA,KACD,CACLiT,WAAW,EACXrX,eAAgB,CAAC,IAIrBT,QAAQ,EAERD,MAAO,SAEPG,YAAY,EAEZjL,UAASA,IACA,CACL,CAAEyuB,IAAK,OAIX1uB,YAAW,eAAEyL,IACX,MAAO,CAAC,MAAMxK,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,G,EAG7DC,WAAUA,IACD,KAGT+B,cACE,MAAO,CACLsnB,aAAcA,IAAM,EAClBt4B,WACAgB,QACArC,QACAkB,YAEOG,EAAS6mB,MAAM,CACpB,IAAM7mB,EAAS2f,WACf,IAAM3f,EAASU,SAAQ,KACrB,MAAM,UAAE7B,EAAS,YAAEE,GAAgBJ,EAEnC,GAAIE,EAAUwI,MAAM3E,OAAOI,KAAKoF,KAAK0G,UACnC,OAAO,EAGT,MAAM,UAAEyX,GAAczmB,KAAKgE,SACrB,gBAAEoK,GAAoBnO,EAAOE,iBAC7B8G,EAAQ9H,GACRF,EAAUyV,IAAI7M,cAAgB5I,EAAUwI,MAAMR,QAEpD,OAAO7F,IACJqf,cAAc,CAAEvd,KAAMlD,KAAKa,OAC3BC,SAAQ,EAAGlB,KAAIuB,eACd,GAAIA,GAAY8F,GAASwf,EAAW,CAClC,MAAMvJ,EAAgBjW,EACnBzE,QAAO4H,GAAQgE,EAAgB3I,SAAS2E,EAAKlH,KAAKrC,QAErDjB,EAAGqd,YAAYC,EAChB,CAED,OAAO,CAAI,IAEZpb,KAAK,M,EAOlB2P,uBACE,MAAO,CACL,YAAawZ,IAAMjrB,KAAKC,OAAOG,SAASs4B,eACxC,cAAeC,IAAM34B,KAAKC,OAAOG,SAASs4B,e,ICpEnCE,EAAUxH,EAAAA,GAAK9c,OAAuB,CACjDzT,KAAM,UAEN2S,WAAUA,KACD,CACLqlB,OAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,GACxBzpB,eAAgB,CAAC,IAIrBpC,QAAS,UAET0B,MAAO,QAEPK,UAAU,EAEVzK,cAAaA,KACJ,CACLw0B,MAAO,CACLr1B,QAAS,EACTC,UAAU,KAKhBE,YACE,OAAO5D,KAAKgE,QAAQ60B,OACjBj4B,KAAKk4B,IAAY,CAChBzG,IAAS,IAAAyG,IACTjzB,MAAO,CAAEizB,Y,EAIfn1B,YAAW,KAAEyC,EAAI,eAAEgJ,IAMjB,MAAO,CAAK,IALKpP,KAAKgE,QAAQ60B,OAAOpzB,SAASW,EAAKP,MAAMizB,OAErD1yB,EAAKP,MAAMizB,MACX94B,KAAKgE,QAAQ60B,OAAO,MAEHj0B,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,GAAiB,E,EAGrFgC,cACE,MAAO,CACL2nB,WAAY30B,GAAc,EAAGhE,gBACtBJ,KAAKgE,QAAQ60B,OAAOpzB,SAASrB,EAAW00B,QAItC14B,EAASgmB,QAAQpmB,KAAKa,KAAMuD,GAErC40B,cAAe50B,GAAc,EAAGhE,gBACzBJ,KAAKgE,QAAQ60B,OAAOpzB,SAASrB,EAAW00B,QAItC14B,EAAS6oB,WAAWjpB,KAAKa,KAAM,YAAauD,G,EAKzDqN,uBACE,OAAOzR,KAAKgE,QAAQ60B,OAAO9zB,QAAO,CAACC,EAAO8zB,KAAU,IAC/C9zB,EAED,CAAC,WAAW8zB,KAAU,IAAM94B,KAAKC,OAAOG,SAAS44B,cAAc,CAAEF,aAEjE,CAAC,E,EAGP3mB,gBACE,OAAOnS,KAAKgE,QAAQ60B,OAAOj4B,KAAIk4B,IACtBnI,EAAAA,EAAAA,IAAuB,CAC5B5nB,KAAM,IAAIkwB,OAAgB,SAAAH,WAC1B51B,KAAMlD,KAAKkD,KACX8W,cAAe,CACb8e,Y,kBC7EG,MAAAI,EAAU7lB,EAAAA,GAAUiB,OAAuB,CACtDzT,KAAM,UAEN2S,WAAUA,KACD,CACLqG,MAAO,IACPsf,cAAe,MAInB/nB,YAAWA,KACF,CACLgoB,KAAMA,IAAM,EAAGr6B,QAAOoC,eACbi4B,EAAAA,EAAAA,IAAKr6B,EAAOoC,GAErBk4B,KAAMA,IAAM,EAAGt6B,QAAOoC,eACbk4B,EAAAA,EAAAA,IAAKt6B,EAAOoC,KAKzBoR,wBACE,MAAO,EACL+mB,EAAAA,EAAAA,IAAQt5B,KAAKgE,S,EAIjByN,uBACE,MAAO,CACL,QAAS8nB,IAAMv5B,KAAKC,OAAOG,SAASg5B,OACpC,QAASI,IAAMx5B,KAAKC,OAAOG,SAASg5B,OACpC,QAASK,IAAMz5B,KAAKC,OAAOG,SAASi5B,OACpC,QAASK,IAAM15B,KAAKC,OAAOG,SAASi5B,OACpC,cAAeM,IAAM35B,KAAKC,OAAOG,SAASi5B,OAC1C,cAAeO,IAAM55B,KAAKC,OAAOG,SAASi5B,OAG1C,QAASQ,IAAM75B,KAAKC,OAAOG,SAASg5B,OACpC,cAAeU,IAAM95B,KAAKC,OAAOG,SAASi5B,O,IC3CnCU,EAAiB3I,EAAAA,GAAK9c,OAA8B,CAC/DzT,KAAM,iBAEN2S,WAAUA,KACD,CACLpE,eAAgB,CAAC,IAIrBV,MAAO,QAEP9K,UAASA,IACA,CAAC,CAAEyuB,IAAK,OAGjB1uB,YAAW,eAAEyL,IACX,MAAO,CAAC,MAAMxK,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,G,EAG7DgC,cACE,MAAO,CACL4oB,kBACEA,IAAM,EAAG54B,QAAOrC,YACd,MAAQ2V,IAAKulB,GAAcl7B,EAAME,UAE3Bi7B,EAAe94B,IAQrB,OAN+B,IAA3B64B,EAAUpyB,aACZqyB,EAAaxZ,gBAAgB3Y,KAAKC,IAAIiyB,EAAUhyB,IAAM,EAAG,GAAI,CAAE/E,KAAMlD,KAAKa,OAE1Eq5B,EAAazZ,cAAc,CAAEvd,KAAMlD,KAAKa,OAIxCq5B,EAEGp5B,SAAQ,EAAGlB,KAAIuB,e,MACd,GAAIA,EAAU,CACZ,MAAM,IAAEuT,GAAQ9U,EAAGX,UACbk7B,EAAWzlB,EAAIzG,MAErB,GAAIyG,EAAIvK,UACFuK,EAAIvK,UAAUmD,YAChB1N,EAAGyf,aAAarJ,EAAAA,GAAc1B,OAAO1U,EAAGV,IAAKwV,EAAIzM,IAAM,IAC9CyM,EAAIvK,UAAU+J,QACvBtU,EAAGyf,aAAahD,EAAAA,GAAc/H,OAAO1U,EAAGV,IAAKwV,EAAIzM,MAEjDrI,EAAGyf,aAAarJ,EAAAA,GAAc1B,OAAO1U,EAAGV,IAAKwV,EAAIzM,UAE9C,CAEL,MAAM7B,EAAiD,QAA1CiC,EAAAqM,EAAI5R,OAAOI,KAAK2kB,aAAarJ,mBAAa,IAAAnW,OAAA,EAAAA,EAAAiM,SAEnDlO,IACFxG,EAAGwf,OAAO+a,EAAU/zB,GACpBxG,EAAGyf,aAAarJ,EAAAA,GAAc1B,OAAO1U,EAAGV,IAAKi7B,EAAW,IAE3D,CAEDv6B,EAAG8f,gBACJ,CAED,OAAO,CAAI,IAEZ5d,KAAK,E,EAMlBqQ,gBACE,MAAO,EACLme,EAAAA,EAAAA,IAAc,CACZvnB,KAAM,8BACN7F,KAAMlD,KAAKkD,O,IC9DN6xB,EAAiB,qCACjBC,EAAiB,qCACjBC,EAAuB,mCACvBC,EAAuB,mCAEvBkF,EAASvoB,EAAAA,GAAKyC,OAAsB,CAC/CzT,KAAM,SAEN2S,WAAUA,KACD,CACLpE,eAAgB,CAAC,IAIrBxL,UAASA,IACA,CACL,CACEyuB,IAAK,MAEP,CACEA,IAAK,IACLlsB,SAAUC,GAAkD,WAAzCA,EAAqBF,MAAMm0B,WAA0B,MAE1E,CACEn0B,MAAO,sBAKbvC,YAAW,eAAEyL,IACX,MAAO,CAAC,MAAMxK,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,GAAiB,E,EAG9EgC,cACE,MAAO,CACLkpB,UAAWA,IAAM,EAAGl6B,cACXA,EAASglB,QAAQplB,KAAKa,MAE/B05B,aAAcA,IAAM,EAAGn6B,cACdA,EAAS0oB,WAAW9oB,KAAKa,MAElC25B,YAAaA,IAAM,EAAGp6B,cACbA,EAAS4oB,UAAUhpB,KAAKa,M,EAKrC4Q,uBACE,MAAO,CACL,QAASgpB,IAAMz6B,KAAKC,OAAOG,SAASm6B,eACpC,QAASG,IAAM16B,KAAKC,OAAOG,SAASm6B,e,EAIxCpoB,gBACE,MAAO,EACL0d,EAAAA,EAAAA,IAAc,CACZ9mB,KAAMgsB,EACN7xB,KAAMlD,KAAKkD,QAEb2sB,EAAAA,EAAAA,IAAc,CACZ9mB,KAAMksB,EACN/xB,KAAMlD,KAAKkD,O,EAKjBmP,gBACE,MAAO,EACLgf,EAAAA,EAAAA,IAAc,CACZtoB,KAAMisB,EACN9xB,KAAMlD,KAAKkD,QAEbmuB,EAAAA,EAAAA,IAAc,CACZtoB,KAAMmsB,EACNhyB,KAAMlD,KAAKkD,O,ICjGNwyB,EAAWtE,EAAAA,GAAK9c,OAAwB,CACnDzT,KAAM,WAEN2S,WAAUA,KACD,CACLpE,eAAgB,CAAC,EACjBumB,mBAAoB,aACpBC,oBAAqB,gBAIzB5oB,QAAS,mBAET+B,UAAU,EAEVnL,UAASA,IACA,CACL,CACEyuB,IAAK,OAKX1uB,YAAW,eAAEyL,IACX,MAAO,CAAC,MAAMxK,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,GAAiB,E,EAG9EqC,uBACE,MAAO,CACLsZ,MAAOA,IAAM/qB,KAAKC,OAAOG,SAASy1B,cAAc71B,KAAKa,MACrDi1B,IAAKA,IAAM91B,KAAKC,OAAOG,SAAS21B,aAAa/1B,KAAKa,MAClD,YAAam1B,IAAMh2B,KAAKC,OAAOG,SAASsoB,aAAa1oB,KAAKa,M,Ib/BnD60B,EAAWtE,EAAAA,GAAK9c,OAAwB,CACnDzT,KAAM,WAEN2S,WAAUA,KACD,CACLpE,eAAgB,CAAC,EACjBumB,mBAAoB,aACpBC,oBAAqB,gBAIzB5oB,QAAS,mBAET+B,UAAU,EAEVnL,UAASA,IACA,CACL,CACEyuB,IAAK,OAKX1uB,YAAW,eAAEyL,IACX,MAAO,CAAC,MAAMxK,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,GAAiB,E,EAG9EqC,uBACE,MAAO,CACLsZ,MAAOA,IAAM/qB,KAAKC,OAAOG,SAASy1B,cAAc71B,KAAKa,MACrDi1B,IAAKA,IAAM91B,KAAKC,OAAOG,SAAS21B,aAAa/1B,KAAKa,MAClD,YAAam1B,IAAMh2B,KAAKC,OAAOG,SAASsoB,aAAa1oB,KAAKa,M,IClBnDo1B,EAAYpkB,EAAAA,GAAKyC,OAAyB,CACrDzT,KAAM,YAEN2S,WAAUA,KACD,CACLpE,eAAgB,CAAC,IAIrBxL,UAASA,IACA,CACL,CACEyuB,IAAK,OACLlsB,SAAU8lB,KACWA,EAAwBiK,aAAa,UAMjD,CAAC,IAMhBvyB,YAAW,eAAEyL,IACX,MAAO,CAAC,QAAQxK,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,GAAiB,E,EAGhFgC,cACE,MAAO,CACL+kB,qBAAsBA,IAAM,EAAGp3B,QAAOqB,eACpC,MAAMgE,GAAa6U,EAAAA,EAAAA,IAAkBla,EAAOiB,KAAKkD,MAGjD,QAFkBzC,OAAOE,QAAQyD,GAAYkD,MAAK,EAAE,CAAEnC,OAAaA,KAM5D/E,EAAS4oB,UAAUhpB,KAAKa,KAAK,E,IatC/B4zB,EAAa,cAEbkG,EAAcvJ,EAAAA,GAAK9c,OAA2B,CACzDzT,KAAM,cAEN2S,WAAUA,KACD,CACL6iB,aAAc,WACdjnB,eAAgB,CAAC,EACjBqX,WAAW,EACXuK,gBAAgB,IAIpBtiB,MAAO,aAEP1B,UACE,MAAO,GAAGhN,KAAKgE,QAAQqyB,e,EAGzB/xB,cAAaA,KACJ,CACL0J,MAAO,CACLvK,QAAS,EACTG,UAAWqoB,GACFA,EAAQiK,aAAa,SACxB0E,SAAS3O,EAAQvlB,aAAa,UAAY,GAAI,IAC9C,KAMZ9C,UAASA,IACA,CACL,CACEyuB,IAAK,OAKX1uB,YAAW,eAAEyL,IACX,MAAM,MAAEpB,KAAU6sB,GAA2BzrB,EAE7C,OAAiB,IAAVpB,EACH,CAAC,MAAMpJ,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgByrB,GAAyB,GAC7E,CAAC,MAAMj2B,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,GAAiB,E,EAG3EgC,cACE,MAAO,CACL0pB,kBAAmBA,IAAM,EAAG16B,WAAUgB,WAChCpB,KAAKgE,QAAQgtB,eACR5vB,IAAQinB,WAAWroB,KAAKa,KAAMb,KAAKgE,QAAQqyB,aAAcr2B,KAAKgE,QAAQyiB,WAAWsD,iBAAiB2L,EAAS70B,KAAMb,KAAKC,OAAO+Z,cAAcic,EAAUp1B,OAAOiB,MAE9J1B,EAASioB,WAAWroB,KAAKa,KAAMb,KAAKgE,QAAQqyB,aAAcr2B,KAAKgE,QAAQyiB,W,EAKpFhV,uBACE,MAAO,CACL,cAAespB,IAAM/6B,KAAKC,OAAOG,SAAS06B,oB,EAI9C3oB,gBACE,IAAIqkB,GAAY3F,EAAAA,EAAAA,IAAkB,CAChC9nB,KAAM0rB,EACNvxB,KAAMlD,KAAKkD,KACX8W,cAAezT,IAAS,CAAGyH,OAAQzH,EAAM,KACzC0qB,cAAeA,CAAC1qB,EAAOH,IAASA,EAAKyP,WAAazP,EAAKP,MAAMmI,SAAWzH,EAAM,KAchF,OAXIvG,KAAKgE,QAAQyiB,WAAazmB,KAAKgE,QAAQgtB,kBACzCwF,GAAY3F,EAAAA,EAAAA,IAAkB,CAC5B9nB,KAAM0rB,EACNvxB,KAAMlD,KAAKkD,KACXujB,UAAWzmB,KAAKgE,QAAQyiB,UACxBuK,eAAgBhxB,KAAKgE,QAAQgtB,eAC7BhX,cAAezT,IAAS,CAAGyH,OAAQzH,EAAM,MAAOvG,KAAKC,OAAO+Z,cAAcic,EAAUp1B,QACpFowB,cAAeA,CAAC1qB,EAAOH,IAASA,EAAKyP,WAAazP,EAAKP,MAAMmI,SAAWzH,EAAM,GAC9EtG,OAAQD,KAAKC,UAGV,CACLu2B,E,IC5FOwE,EAAY5J,EAAAA,GAAK9c,OAAyB,CACrDzT,KAAM,YAEN0wB,SAAU,IAEV/d,WAAUA,KACD,CACLpE,eAAgB,CAAC,IAIrBV,MAAO,QAEP1B,QAAS,UAETpJ,UAASA,IACA,CACL,CAAEyuB,IAAK,MAIX1uB,YAAW,eAAEyL,IACX,MAAO,CAAC,KAAKxK,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,GAAiB,E,EAG7EgC,cACE,MAAO,CACL6pB,aAAcA,IAAM,EAAG76B,cACdA,EAASgmB,QAAQpmB,KAAKa,M,EAKnC4Q,uBACE,MAAO,CACL,YAAaypB,IAAMl7B,KAAKC,OAAOG,SAAS66B,e,ICrBjCxG,EAAa,qCACbgC,EAAa,qCAEb0E,EAAStpB,EAAAA,GAAKyC,OAAsB,CAC/CzT,KAAM,SAEN2S,WAAUA,KACD,CACLpE,eAAgB,CAAC,IAIrBxL,UAASA,IACA,CACL,CACEyuB,IAAK,KAEP,CACEA,IAAK,OAEP,CACEA,IAAK,UAEP,CACEnsB,MAAO,kBACPk1B,WAAW,EACXj1B,SAAUD,KAAWA,EAAiBT,SAAS,iBAAkB,CAAC,IAKxE9B,YAAW,eAAEyL,IACX,MAAO,CAAC,KAAKxK,EAAAA,EAAAA,IAAgB5E,KAAKgE,QAAQoL,eAAgBA,GAAiB,E,EAG7EgC,cACE,MAAO,CACLiqB,UAAWA,IAAM,EAAGj7B,cACXA,EAASglB,QAAQplB,KAAKa,MAE/By6B,aAAcA,IAAM,EAAGl7B,cACdA,EAAS0oB,WAAW9oB,KAAKa,MAElC06B,YAAaA,IAAM,EAAGn7B,cACbA,EAAS4oB,UAAUhpB,KAAKa,M,EAKrC4Q,uBACE,MAAM+pB,EAA2C,CAAC,EAQlD,OANIzjB,EAAAA,EAAAA,MACFyjB,EAAU,eAAiB,IAAMx7B,KAAKC,OAAOG,SAASk7B,eAEtDE,EAAU,gBAAkB,IAAMx7B,KAAKC,OAAOG,SAASk7B,eAGlDE,C,EAGTrpB,gBACE,MAAO,EACL0d,EAAAA,EAAAA,IAAc,CACZ9mB,KAAM0rB,EACNvxB,KAAMlD,KAAKkD,O,EAKjBmP,gBACE,MAAO,EACLgf,EAAAA,EAAAA,IAAc,CACZtoB,KAAM0tB,EACNvzB,KAAMlD,KAAKkD,O,ICvGNu4B,EAAOrK,EAAAA,GAAK9c,OAAO,CAC9BzT,KAAM,OACN6N,MAAO,WCqCIgtB,EAAaroB,EAAAA,GAAUiB,OAA0B,CAC5DzT,KAAM,aAENkQ,gB,wCACE,MAAM/N,EAAa,GA0EnB,OAxEgC,IAA5BhD,KAAKgE,QAAQ23B,YACf34B,EAAWnB,KAAK6yB,EAAWjhB,UAAsB,QAAZpL,EAAArI,KAAKgE,eAAO,IAAAqE,OAAA,EAAAA,EAAEszB,cAG3B,IAAtB37B,KAAKgE,QAAQ43B,MACf54B,EAAWnB,KAAKszB,EAAK1hB,UAAsB,QAAZrL,EAAApI,KAAKgE,eAAO,IAAAoE,OAAA,EAAAA,EAAEwzB,QAGf,IAA5B57B,KAAKgE,QAAQ63B,YACf74B,EAAWnB,KAAKu0B,EAAW3iB,UAAsB,QAAZqoB,EAAA97B,KAAKgE,eAAO,IAAA83B,OAAA,EAAAA,EAAED,cAG3B,IAAtB77B,KAAKgE,QAAQiG,MACfjH,EAAWnB,KAAK60B,EAAKjjB,UAAsB,QAAZsoB,EAAA/7B,KAAKgE,eAAO,IAAA+3B,OAAA,EAAAA,EAAE9xB,QAGhB,IAA3BjK,KAAKgE,QAAQg4B,WACfh5B,EAAWnB,KAAKo1B,EAAUxjB,UAAsB,QAAZwoB,EAAAj8B,KAAKgE,eAAO,IAAAi4B,OAAA,EAAAA,EAAED,aAGtB,IAA1Bh8B,KAAKgE,QAAQ+S,UACf/T,EAAWnB,KAAKq2B,EAASzkB,UAAsB,QAAZyoB,EAAAl8B,KAAKgE,eAAO,IAAAk4B,OAAA,EAAAA,EAAEnlB,YAGnB,IAA5B/W,KAAKgE,QAAQm4B,YACfn5B,EAAWnB,KAAKs2B,EAAW1kB,UAAsB,QAAZ2oB,EAAAp8B,KAAKgE,eAAO,IAAAo4B,OAAA,EAAAA,EAAED,cAGtB,IAA3Bn8B,KAAKgE,QAAQq4B,WACfr5B,EAAWnB,KAAKy2B,EAAU7kB,UAAsB,QAAZ6oB,EAAAt8B,KAAKgE,eAAO,IAAAs4B,OAAA,EAAAA,EAAED,aAGrB,IAA3Br8B,KAAKgE,QAAQu4B,WACfv5B,EAAWnB,KAAK42B,EAAUhlB,UAAsB,QAAZ+oB,EAAAx8B,KAAKgE,eAAO,IAAAw4B,OAAA,EAAAA,EAAED,aAGvB,IAAzBv8B,KAAKgE,QAAQy4B,SACfz5B,EAAWnB,KAAK+2B,EAAQnlB,UAAsB,QAAZipB,EAAA18B,KAAKgE,eAAO,IAAA04B,OAAA,EAAAA,EAAED,WAGrB,IAAzBz8B,KAAKgE,QAAQs1B,SACft2B,EAAWnB,KAAKq3B,EAAQzlB,UAAsB,QAAZkpB,EAAA38B,KAAKgE,eAAO,IAAA24B,OAAA,EAAAA,EAAErD,WAGd,IAAhCt5B,KAAKgE,QAAQ44B,gBACf55B,EAAWnB,KAAKk4B,EAAetmB,UAAsB,QAAZopB,EAAA78B,KAAKgE,eAAO,IAAA64B,OAAA,EAAAA,EAAED,kBAG7B,IAAxB58B,KAAKgE,QAAQ84B,QACf95B,EAAWnB,KAAKu4B,EAAO3mB,UAAsB,QAAZspB,EAAA/8B,KAAKgE,eAAO,IAAA+4B,OAAA,EAAAA,EAAED,UAGnB,IAA1B98B,KAAKgE,QAAQg5B,UACfh6B,EAAWnB,KAAK6zB,EAASjiB,UAAsB,QAAZwpB,EAAAj9B,KAAKgE,eAAO,IAAAi5B,OAAA,EAAAA,EAAED,YAGlB,IAA7Bh9B,KAAKgE,QAAQk5B,aACfl6B,EAAWnB,KAAK84B,EAAYlnB,UAAsB,QAAZ0pB,EAAAn9B,KAAKgE,eAAO,IAAAm5B,OAAA,EAAAA,EAAED,eAGvB,IAA3Bl9B,KAAKgE,QAAQo5B,WACfp6B,EAAWnB,KAAKm5B,EAAUvnB,UAAsB,QAAZ4pB,EAAAr9B,KAAKgE,eAAO,IAAAq5B,OAAA,EAAAA,EAAED,aAGxB,IAAxBp9B,KAAKgE,QAAQs5B,QACft6B,EAAWnB,KAAKs5B,EAAO1nB,UAAsB,QAAZ8pB,EAAAv9B,KAAKgE,eAAO,IAAAu5B,OAAA,EAAAA,EAAED,UAGvB,IAAtBt9B,KAAKgE,QAAQkF,MACflG,EAAWnB,KAAK45B,EAAKhoB,UAAsB,QAAZ+pB,EAAAx9B,KAAKgE,eAAO,IAAAw5B,OAAA,EAAAA,EAAEt0B,OAGxClG,C,uFC1FEy6B,EA6CX39B,aAAY,OACVG,EAAM,QACNgsB,EAAO,KACP1rB,EAAI,aACJm9B,EAAe,CAAC,EAAC,YACjBC,EAAc,IAAG,WACjBC,IA5CK,KAAWC,aAAG,EAUd,KAAAD,WAAiE,EACtEr9B,OACAxB,QACA4K,OACAC,SAEA,MAAM,IAAE1K,EAAG,UAAED,GAAcF,GACrB,MAAEmZ,GAAUjZ,EAKZ6+B,GAAoB5+B,EAAI6O,YAAYpE,EAAMC,GAAI9C,SAAUiP,EAAAA,EAAAA,IAAgBhX,EAAME,WAK9E8+B,EAAgB/9B,KAAKisB,QAAQjgB,SAAS+K,SAASinB,eAIrD,SAFuBz9B,EAAK8f,aAAc0d,GAEnB7lB,GAAS4lB,IAAqB99B,KAAKC,OAAO4rB,WAItD,EA8Bb,KAAgBoS,iBAAG,KACjBj+B,KAAK69B,aAAc,CAAI,EAGzB,KAAgBK,iBAAG,KACjBl+B,KAAKm+B,MAAM,EAGb,KAAYC,aAAG,KAEbhzB,YAAW,IAAMpL,KAAKq+B,OAAOr+B,KAAKC,OAAOM,OAAM,EAGjD,KAAA+9B,YAAc,EAAGn8B,Y,MACXnC,KAAK69B,YACP79B,KAAK69B,aAAc,GAKjB17B,aAAK,EAALA,EAAOo8B,iBAAwC,QAAvBl2B,EAAArI,KAAKisB,QAAQuS,kBAAU,IAAAn2B,OAAA,EAAAA,EAAE2D,SAAS7J,EAAMo8B,iBAIpEv+B,KAAKm+B,MAAM,EAGb,KAAAM,iBAAoBt8B,IAClBnC,KAAKs+B,YAAY,CAAEn8B,SAAQ,EA2C7B,KAAAu8B,sBAAwB,CAACn+B,EAAkBsM,KACzC,MAAM8xB,IAAoB9xB,aAAQ,EAARA,EAAU5N,UAAUshB,GAAGhgB,EAAKxB,MAAME,YACtD+L,IAAc6B,aAAQ,EAARA,EAAU3N,IAAIqhB,GAAGhgB,EAAKxB,MAAMG,OAE3Cy/B,GAAqB3zB,KAItBhL,KAAK4+B,qBACPC,aAAa7+B,KAAK4+B,qBAGpB5+B,KAAK4+B,oBAAsB1yB,OAAOd,YAAW,KAC3CpL,KAAK8+B,cAAcv+B,EAAMo+B,EAAkB3zB,EAAY6B,EAAS,GAC/D7M,KAAK29B,aAAY,EAGtB,KAAamB,cAAG,CAACv+B,EAAkBo+B,EAA2B3zB,EAAqB6B,K,UACjF,MAAM,MAAE9N,EAAK,UAAEgL,GAAcxJ,GACvB,UAAEtB,GAAcF,EAItB,GAAIgL,IAFY40B,IAAqB3zB,EAGnC,OAGFhL,KAAK++B,gBAGL,MAAM,OAAEtqB,GAAWxV,EACb0K,EAAO5B,KAAK0F,OAAOgH,EAAO7T,KAAI2J,GAASA,EAAM9C,MAAMQ,OACnD2B,EAAK7B,KAAKC,OAAOyM,EAAO7T,KAAI2J,GAASA,EAAMmK,IAAIzM,QAEhB,QAAlBI,EAAArI,KAAK49B,kBAAa,IAAAv1B,OAAA,EAAAA,EAAAG,KAAA,MACnCvI,OAAQD,KAAKC,OACbM,OACAxB,QACA8N,WACAlD,OACAC,SASQ,QAAVxB,EAAApI,KAAKg/B,aAAK,IAAA52B,GAAAA,EAAEslB,SAAS,CACnBuR,wBACmB,QAAjBnD,EAAA97B,KAAK09B,oBAAY,IAAA5B,OAAA,EAAAA,EAAEmD,yBAAsB,MAEvC,IAAI7iB,EAAAA,EAAAA,IAAgBrd,EAAME,WAAY,CACpC,IAAImH,EAAO7F,EAAK2+B,QAAQv1B,GAExB,MAAMw1B,EAAkB/4B,EAAKg5B,QAAQD,gBAAkB/4B,EAAOA,EAAK+mB,cAAc,4BAMjF,GAJIgS,IACF/4B,EAAO+4B,EAAgBnL,YAGrB5tB,EACF,OAAOA,EAAKi5B,uBAEf,CAED,OAAO/iB,EAAAA,EAAAA,IAAa/b,EAAMoJ,EAAMC,EACjC,KAGL5J,KAAKs/B,QA3BHt/B,KAAKm+B,MA2BI,EAjKXn+B,KAAKC,OAASA,EACdD,KAAKisB,QAAUA,EACfjsB,KAAKO,KAAOA,EACZP,KAAK29B,YAAcA,EAEfC,IACF59B,KAAK49B,WAAaA,GAGpB59B,KAAKisB,QAAQ9f,iBAAiB,YAAanM,KAAKi+B,iBAAkB,CAAEsB,SAAS,IAC7Ev/B,KAAKO,KAAKuL,IAAIK,iBAAiB,YAAanM,KAAKk+B,kBACjDl+B,KAAKC,OAAOiC,GAAG,QAASlC,KAAKo+B,cAC7Bp+B,KAAKC,OAAOiC,GAAG,OAAQlC,KAAKs+B,aAC5Bt+B,KAAK09B,aAAeA,EAEpB19B,KAAKisB,QAAQuT,SACbx/B,KAAKisB,QAAQ/lB,MAAMu5B,WAAa,S,CAkClCV,gBACE,MAAQ9S,QAASyT,GAAkB1/B,KAAKC,OAAO+D,QACzC27B,IAAqBD,EAAc3zB,eAErC/L,KAAKg/B,OAAUW,IAInB3/B,KAAKg/B,OAAQA,EAAAA,EAAAA,IAAMU,EAAe,CAChCE,SAAU,EACVX,uBAAwB,KACxBjyB,QAAShN,KAAKisB,QACd4T,aAAa,EACbC,QAAS,SACTC,UAAW,MACXC,YAAa,YACVhgC,KAAK09B,eAIN19B,KAAKg/B,MAAMiB,OAAOjM,YACnBh0B,KAAKg/B,MAAMiB,OAAOjM,WAA2B7nB,iBAAiB,OAAQnM,KAAKy+B,kB,CAIhFJ,OAAO99B,EAAkBsM,GACvB,MAAM,MAAE9N,GAAUwB,EACZ2/B,EAAoBnhC,EAAME,UAAUwI,MAAMQ,MAAQlJ,EAAME,UAAUyV,IAAIzM,IAE5E,GAAIjI,KAAK29B,YAAc,GAAKuC,EAE1B,YADAlgC,KAAK0+B,sBAAsBn+B,EAAMsM,GAInC,MAAM8xB,IAAoB9xB,aAAQ,EAARA,EAAU5N,UAAUshB,GAAGhgB,EAAKxB,MAAME,YACtD+L,IAAc6B,aAAQ,EAARA,EAAU3N,IAAIqhB,GAAGhgB,EAAKxB,MAAMG,MAEhDc,KAAK8+B,cAAcv+B,EAAMo+B,EAAkB3zB,EAAY6B,E,CA6EzDyyB,O,MACc,QAAZj3B,EAAArI,KAAKg/B,aAAO,IAAA32B,GAAAA,EAAAi3B,M,CAGdnB,O,MACc,QAAZ91B,EAAArI,KAAKg/B,aAAO,IAAA32B,GAAAA,EAAA81B,M,CAGd/xB,U,SACgB,QAAV/D,EAAArI,KAAKg/B,aAAK,IAAA32B,OAAA,EAAAA,EAAE43B,OAAOjM,aACpBh0B,KAAKg/B,MAAMiB,OAAOjM,WAA2B3nB,oBAC5C,OACArM,KAAKy+B,kBAGG,QAAZr2B,EAAApI,KAAKg/B,aAAO,IAAA52B,GAAAA,EAAAgE,UACZpM,KAAKisB,QAAQ5f,oBAAoB,YAAarM,KAAKi+B,iBAAkB,CAAEsB,SAAS,IAChFv/B,KAAKO,KAAKuL,IAAIO,oBAAoB,YAAarM,KAAKk+B,kBACpDl+B,KAAKC,OAAOsC,IAAI,QAASvC,KAAKo+B,cAC9Bp+B,KAAKC,OAAOsC,IAAI,OAAQvC,KAAKs+B,Y,EAIpB,MAAA6B,EAAoBn8B,GACxB,IAAI4G,EAAAA,GAAO,CAChB1F,IAC+B,iBAAtBlB,EAAQo8B,UAAyB,IAAI7rB,EAAAA,GAAUvQ,EAAQo8B,WAAap8B,EAAQo8B,UACrF7/B,KAAMA,GAAQ,IAAIk9B,EAAe,CAAEl9B,UAASyD,MCzQtBqP,EAAAA,GAAUiB,OAA0B,CAC5DzT,KAAM,aAEN2S,WAAUA,KACD,CACLyY,QAAS,KACTyR,aAAc,CAAC,EACf0C,UAAW,aACXzC,iBAAa37B,EACb47B,WAAY,OAIhBrrB,wBACE,OAAKvS,KAAKgE,QAAQioB,QAIX,CACLkU,EAAiB,CACfC,UAAWpgC,KAAKgE,QAAQo8B,UACxBngC,OAAQD,KAAKC,OACbgsB,QAASjsB,KAAKgE,QAAQioB,QACtByR,aAAc19B,KAAKgE,QAAQ05B,aAC3BC,YAAa39B,KAAKgE,QAAQ25B,YAC1BC,WAAY59B,KAAKgE,QAAQ45B,cAVpB,E,kCCCAyC,EAgCXvgC,aAAY,OACVG,EAAM,QAAEgsB,EAAO,KAAE1rB,EAAI,aAAEm9B,EAAe,CAAC,EAAC,WAAEE,IA1BrC,KAAWC,aAAG,EAMd,KAAUD,WAAyD,EAAGr9B,OAAMxB,YACjF,MAAM,UAAEE,GAAcF,GAChB,QAAEygB,EAAO,MAAEtH,GAAUjZ,EACrBqhC,EAAgC,IAAlB9gB,EAAQ3F,MACtBikB,EAAmBte,EAAQ1c,OAAOwK,cAAgBkS,EAAQ1c,OAAOI,KAAKoF,KAAK2B,OAASuV,EAAQ1c,OAAO2F,YAEzG,SACGlI,EAAK8f,YACFnI,GACAooB,GACAxC,GACA99B,KAAKC,OAAO4rB,WAKP,EAuBb,KAAgBoS,iBAAG,KACjBj+B,KAAK69B,aAAc,CAAI,EAGzB,KAAYO,aAAG,KAEbhzB,YAAW,IAAMpL,KAAKq+B,OAAOr+B,KAAKC,OAAOM,OAAM,EAGjD,KAAA+9B,YAAc,EAAGn8B,Y,MACXnC,KAAK69B,YACP79B,KAAK69B,aAAc,GAKjB17B,aAAK,EAALA,EAAOo8B,iBAAwC,QAAvBl2B,EAAArI,KAAKisB,QAAQuS,kBAAU,IAAAn2B,OAAA,EAAAA,EAAE2D,SAAS7J,EAAMo8B,iBAIpEv+B,KAAKm+B,MAAM,EAGb,KAAAM,iBAAoBt8B,IAClBnC,KAAKs+B,YAAY,CAAEn8B,SAAQ,EAzC3BnC,KAAKC,OAASA,EACdD,KAAKisB,QAAUA,EACfjsB,KAAKO,KAAOA,EAERq9B,IACF59B,KAAK49B,WAAaA,GAGpB59B,KAAKisB,QAAQ9f,iBAAiB,YAAanM,KAAKi+B,iBAAkB,CAAEsB,SAAS,IAC7Ev/B,KAAKC,OAAOiC,GAAG,QAASlC,KAAKo+B,cAC7Bp+B,KAAKC,OAAOiC,GAAG,OAAQlC,KAAKs+B,aAC5Bt+B,KAAK09B,aAAeA,EAEpB19B,KAAKisB,QAAQuT,SACbx/B,KAAKisB,QAAQ/lB,MAAMu5B,WAAa,S,CA8BlCV,gBACE,MAAQ9S,QAASyT,GAAkB1/B,KAAKC,OAAO+D,QACzC27B,IAAqBD,EAAc3zB,eAErC/L,KAAKg/B,OAAUW,IAInB3/B,KAAKg/B,OAAQA,EAAAA,EAAAA,IAAMU,EAAe,CAChCE,SAAU,EACVX,uBAAwB,KACxBjyB,QAAShN,KAAKisB,QACd4T,aAAa,EACbC,QAAS,SACTC,UAAW,QACXC,YAAa,YACVhgC,KAAK09B,eAIN19B,KAAKg/B,MAAMiB,OAAOjM,YACnBh0B,KAAKg/B,MAAMiB,OAAOjM,WAA2B7nB,iBAAiB,OAAQnM,KAAKy+B,kB,CAIhFJ,OAAO99B,EAAkBsM,G,UACvB,MAAM,MAAE9N,GAAUwB,GACZ,IAAErB,EAAG,UAAED,GAAcF,GACrB,KAAE4K,EAAI,GAAEC,GAAO3K,EACN4N,GAAYA,EAAS3N,IAAIqhB,GAAGrhB,IAAQ2N,EAAS5N,UAAUshB,GAAGthB,KAMzEe,KAAK++B,iBAEgC,QAAlB12B,EAAArI,KAAK49B,kBAAa,IAAAv1B,OAAA,EAAAA,EAAAG,KAAA,MACnCvI,OAAQD,KAAKC,OACbM,OACAxB,QACA8N,eASQ,QAAVzE,EAAApI,KAAKg/B,aAAK,IAAA52B,GAAAA,EAAEslB,SAAS,CACnBuR,wBACmB,QAAjBnD,EAAA97B,KAAK09B,oBAAY,IAAA5B,OAAA,EAAAA,EAAEmD,yBAAsB,MAAW3iB,EAAAA,EAAAA,IAAa/b,EAAMoJ,EAAMC,MAGjF5J,KAAKs/B,QAVHt/B,KAAKm+B,O,CAaTmB,O,MACc,QAAZj3B,EAAArI,KAAKg/B,aAAO,IAAA32B,GAAAA,EAAAi3B,M,CAGdnB,O,MACc,QAAZ91B,EAAArI,KAAKg/B,aAAO,IAAA32B,GAAAA,EAAA81B,M,CAGd/xB,U,SACgB,QAAV/D,EAAArI,KAAKg/B,aAAK,IAAA32B,OAAA,EAAAA,EAAE43B,OAAOjM,aACpBh0B,KAAKg/B,MAAMiB,OAAOjM,WAA2B3nB,oBAC5C,OACArM,KAAKy+B,kBAGG,QAAZr2B,EAAApI,KAAKg/B,aAAO,IAAA52B,GAAAA,EAAAgE,UACZpM,KAAKisB,QAAQ5f,oBAAoB,YAAarM,KAAKi+B,iBAAkB,CAAEsB,SAAS,IAChFv/B,KAAKC,OAAOsC,IAAI,QAASvC,KAAKo+B,cAC9Bp+B,KAAKC,OAAOsC,IAAI,OAAQvC,KAAKs+B,Y,EAIpB,MAAAiC,EAAsBv8B,GAC1B,IAAI4G,EAAAA,GAAO,CAChB1F,IAC+B,iBAAtBlB,EAAQo8B,UAAyB,IAAI7rB,EAAAA,GAAUvQ,EAAQo8B,WAAap8B,EAAQo8B,UACrF7/B,KAAMA,GAAQ,IAAI8/B,EAAiB,CAAE9/B,UAASyD,MzC9KlD,SAASw8B,EAAmBr7B,GAC1B,OAAOs7B,EAAAA,EAAAA,KAAa,CAACC,EAAOZ,KACnB,CACLa,IAAGA,KACDD,IACOv7B,GAETy7B,IAAIC,GAEF17B,EAAQ07B,EAGRljB,uBAAsB,KACpBA,uBAAsB,KACpBmiB,GAAS,GACT,G,KAKZ,C0CzB4BzsB,EAAAA,GAAUiB,OAA4B,CAChEzT,KAAM,eAEN2S,WAAUA,KACD,CACLyY,QAAS,KACTyR,aAAc,CAAC,EACf0C,UAAW,eACXxC,WAAY,OAIhBrrB,wBACE,OAAKvS,KAAKgE,QAAQioB,QAIX,CACLsU,EAAmB,CACjBH,UAAWpgC,KAAKgE,QAAQo8B,UACxBngC,OAAQD,KAAKC,OACbgsB,QAASjsB,KAAKgE,QAAQioB,QACtByR,aAAc19B,KAAKgE,QAAQ05B,aAC3BE,WAAY59B,KAAKgE,QAAQ45B,cATpB,E,KCZakD,EAAAA,EAAAA,IAAgB,CACxCjgC,KAAM,aAENd,MAAO,CACLqgC,UAAW,CACTl9B,KAAM,CAAC69B,OAAQtgC,QACfgD,QAAS,cAGXxD,OAAQ,CACNiD,KAAMzC,OACNugC,UAAU,GAGZrD,YAAa,CACXz6B,KAAMsD,OACN/C,aAASzB,GAGX07B,aAAc,CACZx6B,KAAMzC,OACNgD,QAASA,KAAA,CAAS,IAGpBm6B,WAAY,CACV16B,KAAM+9B,SACNx9B,QAAS,OAIby9B,MAAMnhC,GAAO,MAAEohC,IACb,MAAMC,GAAOC,EAAAA,EAAAA,IAAwB,MA2BrC,OAzBAC,EAAAA,EAAAA,KAAU,KACR,MAAM,YACJ3D,EAAW,OACX19B,EAAM,UACNmgC,EAAS,WACTxC,EAAU,aACVF,GACE39B,EAEJE,EAAO4tB,eAAesS,EAAiB,CACrCxC,cACA19B,SACAgsB,QAASmV,EAAKj8B,MACdi7B,YACAxC,aACAF,iBACC,KAGL6D,EAAAA,EAAAA,KAAgB,KACd,MAAM,UAAEnB,EAAS,OAAEngC,GAAWF,EAE9BE,EAAO8tB,iBAAiBqS,EAAU,IAG7B,KAAM,IAAA/3B,EAAA,OAAAm5B,EAAAA,EAAAA,GAAE,MAAO,CAAEH,IAAKD,GAAyB,QAAjB/4B,EAAA84B,EAAM19B,eAAW,IAAA4E,OAAA,EAAAA,EAAAG,KAAA24B,GAAC,C,I3C7BrD,MAAOpV,UAAe0V,EAAAA,GAS1B3hC,YAAYkE,EAAkC,IAW5C,OAVA,MAAMA,GALD,KAAA09B,cAAeC,EAAAA,EAAAA,IAAmC,IAAIC,KAEtD,KAAgBC,iBAA4B,KAKjD,KAAKC,cAAgBtB,EAAgB,KAAKjgC,KAAKxB,OAC/C,KAAKgjC,yBAA2BvB,EAAgB,KAAK5wB,kBAErD,KAAK1N,GAAG,eAAe,KACrB,KAAK4/B,cAAc38B,MAAQ,KAAK5E,KAAKxB,MACrC,KAAKgjC,yBAAyB58B,MAAQ,KAAKyK,gBAAgB,KAGtDoyB,EAAAA,EAAAA,IAAQ,K,CAGbjjC,YACF,OAAO,KAAK+iC,cAAgB,KAAKA,cAAc38B,MAAQ,KAAK5E,KAAKxB,K,CAG/DkF,cACF,OAAO,KAAK89B,yBAA2B,KAAKA,yBAAyB58B,MAAQ,MAAMlB,O,CAM9E4pB,eACL/jB,EACAgkB,GAEA,MAAMD,eAAe/jB,EAAQgkB,GAC7B9tB,KAAK8hC,cAAc38B,MAAQ,KAAK5E,KAAKxB,K,CAMhCgvB,iBAAiBC,GACtB,MAAMD,iBAAiBC,GACvBhuB,KAAK8hC,cAAc38B,MAAQ,KAAK5E,KAAKxB,K,E4CrElC,MAAMkjC,GAAgBnB,EAAAA,EAAAA,IAAgB,CAC3CjgC,KAAM,gBAENd,MAAO,CACLE,OAAQ,CACNwD,QAAS,KACTP,KAAMzC,SAIVygC,MAAMnhC,GACJ,MAAMmiC,GAAmCb,EAAAA,EAAAA,MACnCc,GAAWC,EAAAA,EAAAA,MAwDjB,OAtDAC,EAAAA,EAAAA,KAAY,KACV,MAAMpiC,EAASF,EAAME,OAEjBA,GAAUA,EAAO+D,QAAQioB,SAAWiW,EAAO/8B,QAC7Cm9B,EAAAA,EAAAA,KAAS,KACP,IAAKJ,EAAO/8B,QAAUlF,EAAO+D,QAAQioB,QAAQ+H,WAC3C,OAGF,MAAM/H,GAAUsW,EAAAA,EAAAA,IAAML,EAAO/8B,OAE7B+8B,EAAO/8B,MAAM4iB,UAAU9nB,EAAO+D,QAAQioB,QAAQuW,YAG9CviC,EAAO4hC,iBAAmBM,EAASM,IAAIjnB,EAEvCvb,EAAOwsB,WAAW,CAChBR,YAGFhsB,EAAOquB,iBAAiB,GAE3B,KAGHiT,EAAAA,EAAAA,KAAgB,KACd,MAAMthC,EAASF,EAAME,OAErB,IAAKA,EACH,OAYF,GARKA,EAAO2d,aACV3d,EAAOM,KAAKmtB,SAAS,CACnBjb,UAAW,CAAC,IAIhBxS,EAAO4hC,iBAAmB,MAErB5hC,EAAO+D,QAAQioB,QAAQ+H,WAC1B,OAGF,MAAM0O,EAAa3rB,SAASmV,cAAc,OAE1CwW,EAAW3a,UAAU9nB,EAAO+D,QAAQioB,QAAQuW,YAE5CviC,EAAOwsB,WAAW,CAChBR,QAASyW,GACT,IAGG,CAAER,S,EAGXS,SACE,MAAMjB,EAAsB,GAuB5B,OArBI1hC,KAAKC,QACPD,KAAKC,OAAOyhC,aAAap/B,SAAQsgC,IAC/B,MAAMx8B,GAAOo7B,EAAAA,EAAAA,GACXqB,EAAAA,GACA,CACEj5B,GAAIg5B,EAAYE,gBAChB59B,IAAK09B,EAAYG,KAEnBvB,EAAAA,EAAAA,GACEoB,EAAYI,UACZ,CACE3B,IAAKuB,EAAYG,MACdH,EAAY7iC,SAKrB2hC,EAAa7/B,KAAKuE,EAAK,KAIpBo7B,EAAAA,EAAAA,GACL,MACA,CACEH,IAAM1wB,IAAc3Q,KAAKkiC,OAASvxB,CAAE,MAEnC+wB,E,KC3GmBZ,EAAAA,EAAAA,IAAgB,CAC1CjgC,KAAM,eAENd,MAAO,CACLqgC,UAAW,CAGTl9B,KAAM,KACNO,QAAS,gBAGXxD,OAAQ,CACNiD,KAAMzC,OACNugC,UAAU,GAGZtD,aAAc,CACZx6B,KAAMzC,OACNgD,QAASA,KAAA,CAAS,IAGpBm6B,WAAY,CACV16B,KAAM+9B,SACNx9B,QAAS,OAIby9B,MAAMnhC,GAAO,MAAEohC,IACb,MAAMC,GAAOC,EAAAA,EAAAA,IAAwB,MAyBrC,OAvBAC,EAAAA,EAAAA,KAAU,KACR,MAAM,UACJlB,EAAS,OACTngC,EAAM,aACNy9B,EAAY,WACZE,GACE79B,EAEJE,EAAO4tB,eAAe0S,EAAmB,CACvCH,YACAngC,SACAgsB,QAASmV,EAAKj8B,MACdu4B,eACAE,eACC,KAGL2D,EAAAA,EAAAA,KAAgB,KACd,MAAM,UAAEnB,EAAS,OAAEngC,GAAWF,EAE9BE,EAAO8tB,iBAAiBqS,EAAU,IAG7B,KAAM,IAAA/3B,EAAA,OAAAm5B,EAAAA,EAAAA,GAAE,MAAO,CAAEH,IAAKD,GAAyB,QAAjB/4B,EAAA84B,EAAM19B,eAAW,IAAA4E,OAAA,EAAAA,EAAAG,KAAA24B,GAAC,C,KC7D5BL,EAAAA,EAAAA,IAAgB,CAC7CjgC,KAAM,kBAENd,MAAO,CACLkjC,GAAI,CACF//B,KAAM69B,OACNt9B,QAAS,QAIbk/B,SACE,OAAOnB,EAAAA,EAAAA,GAAExhC,KAAKijC,GAAI,CAChB/8B,MAAO,CACLg9B,WAAY,YAEd,yBAA0B,I,KCfDpC,EAAAA,EAAAA,IAAgB,CAC7CjgC,KAAM,kBAENd,MAAO,CACLkjC,GAAI,CACF//B,KAAM69B,OACNt9B,QAAS,QAIb0/B,OAAQ,CAAC,cAAe,qBAExBR,S,QACE,OAAOnB,EAAAA,EAAAA,GACLxhC,KAAKijC,GACL,CAEE/Q,MAAOlyB,KAAKojC,kBACZl9B,MAAO,CACLg9B,WAAY,UAEd,yBAA0B,GAE1BG,YAAarjC,KAAKsjC,aAEG,QAAvBl7B,GAAAC,EAAArI,KAAKujC,QAAO9/B,eAAW,IAAA2E,OAAA,EAAAA,EAAAI,KAAAH,G,ICSnBm7B,O","sources":["webpack://thoughtleaderscentral/../src/helpers/createChainableState.ts","webpack://thoughtleaderscentral/../src/CommandManager.ts","webpack://thoughtleaderscentral/../src/EventEmitter.ts","webpack://thoughtleaderscentral/../src/helpers/getExtensionField.ts","webpack://thoughtleaderscentral/../src/helpers/splitExtensions.ts","webpack://thoughtleaderscentral/../src/helpers/getAttributesFromExtensions.ts","webpack://thoughtleaderscentral/../src/helpers/getNodeType.ts","webpack://thoughtleaderscentral/../src/utilities/mergeAttributes.ts","webpack://thoughtleaderscentral/../src/helpers/getRenderedAttributes.ts","webpack://thoughtleaderscentral/../src/utilities/isFunction.ts","webpack://thoughtleaderscentral/../src/utilities/callOrReturn.ts","webpack://thoughtleaderscentral/../src/helpers/injectExtensionAttributesToParseRule.ts","webpack://thoughtleaderscentral/../src/utilities/fromString.ts","webpack://thoughtleaderscentral/../src/helpers/getSchemaByResolvedExtensions.ts","webpack://thoughtleaderscentral/../src/utilities/isEmptyObject.ts","webpack://thoughtleaderscentral/../src/helpers/getSchemaTypeByName.ts","webpack://thoughtleaderscentral/../src/helpers/isExtensionRulesEnabled.ts","webpack://thoughtleaderscentral/../src/helpers/getTextContentFromNodes.ts","webpack://thoughtleaderscentral/../src/utilities/isRegExp.ts","webpack://thoughtleaderscentral/../src/InputRule.ts","webpack://thoughtleaderscentral/../src/PasteRule.ts","webpack://thoughtleaderscentral/../src/utilities/isNumber.ts","webpack://thoughtleaderscentral/../src/ExtensionManager.ts","webpack://thoughtleaderscentral/../src/utilities/findDuplicates.ts","webpack://thoughtleaderscentral/../src/utilities/isPlainObject.ts","webpack://thoughtleaderscentral/../src/utilities/mergeDeep.ts","webpack://thoughtleaderscentral/../src/Extension.ts","webpack://thoughtleaderscentral/../src/helpers/getTextBetween.ts","webpack://thoughtleaderscentral/../src/helpers/getTextSerializersFromSchema.ts","webpack://thoughtleaderscentral/../src/extensions/clipboardTextSerializer.ts","webpack://thoughtleaderscentral/../src/utilities/objectIncludes.ts","webpack://thoughtleaderscentral/../src/helpers/getMarkRange.ts","webpack://thoughtleaderscentral/../src/helpers/getMarkType.ts","webpack://thoughtleaderscentral/../src/helpers/isTextSelection.ts","webpack://thoughtleaderscentral/../src/utilities/minMax.ts","webpack://thoughtleaderscentral/../src/helpers/resolveFocusPosition.ts","webpack://thoughtleaderscentral/../src/utilities/isiOS.ts","webpack://thoughtleaderscentral/../src/utilities/elementFromString.ts","webpack://thoughtleaderscentral/../src/helpers/createNodeFromContent.ts","webpack://thoughtleaderscentral/../src/utilities/isMacOS.ts","webpack://thoughtleaderscentral/../src/helpers/isNodeActive.ts","webpack://thoughtleaderscentral/../src/helpers/getSchemaTypeNameByName.ts","webpack://thoughtleaderscentral/../src/utilities/deleteProps.ts","webpack://thoughtleaderscentral/../src/helpers/createDocument.ts","webpack://thoughtleaderscentral/../src/helpers/getMarkAttributes.ts","webpack://thoughtleaderscentral/../src/helpers/combineTransactionSteps.ts","webpack://thoughtleaderscentral/../src/helpers/findChildrenInRange.ts","webpack://thoughtleaderscentral/../src/helpers/findParentNode.ts","webpack://thoughtleaderscentral/../src/helpers/findParentNodeClosestToPos.ts","webpack://thoughtleaderscentral/../src/helpers/getAttributes.ts","webpack://thoughtleaderscentral/../src/helpers/getNodeAttributes.ts","webpack://thoughtleaderscentral/../src/helpers/getChangedRanges.ts","webpack://thoughtleaderscentral/../src/utilities/removeDuplicates.ts","webpack://thoughtleaderscentral/../src/helpers/getMarksBetween.ts","webpack://thoughtleaderscentral/../src/helpers/getSplittedAttributes.ts","webpack://thoughtleaderscentral/../src/helpers/isMarkActive.ts","webpack://thoughtleaderscentral/../src/helpers/isList.ts","webpack://thoughtleaderscentral/../src/helpers/isNodeSelection.ts","webpack://thoughtleaderscentral/../src/helpers/posToDOMRect.ts","webpack://thoughtleaderscentral/../src/commands/splitBlock.ts","webpack://thoughtleaderscentral/../src/commands/toggleList.ts","webpack://thoughtleaderscentral/../src/commands/blur.ts","webpack://thoughtleaderscentral/../src/commands/clearContent.ts","webpack://thoughtleaderscentral/../src/commands/clearNodes.ts","webpack://thoughtleaderscentral/../src/commands/command.ts","webpack://thoughtleaderscentral/../src/commands/createParagraphNear.ts","webpack://thoughtleaderscentral/../src/commands/cut.ts","webpack://thoughtleaderscentral/../src/commands/deleteCurrentNode.ts","webpack://thoughtleaderscentral/../src/commands/deleteNode.ts","webpack://thoughtleaderscentral/../src/commands/deleteRange.ts","webpack://thoughtleaderscentral/../src/commands/deleteSelection.ts","webpack://thoughtleaderscentral/../src/commands/enter.ts","webpack://thoughtleaderscentral/../src/commands/exitCode.ts","webpack://thoughtleaderscentral/../src/commands/extendMarkRange.ts","webpack://thoughtleaderscentral/../src/commands/first.ts","webpack://thoughtleaderscentral/../src/commands/focus.ts","webpack://thoughtleaderscentral/../src/commands/forEach.ts","webpack://thoughtleaderscentral/../src/commands/insertContent.ts","webpack://thoughtleaderscentral/../src/commands/insertContentAt.ts","webpack://thoughtleaderscentral/../src/helpers/selectionToInsertionEnd.ts","webpack://thoughtleaderscentral/../src/commands/join.ts","webpack://thoughtleaderscentral/../src/commands/joinItemBackward.ts","webpack://thoughtleaderscentral/../src/commands/joinItemForward.ts","webpack://thoughtleaderscentral/../src/commands/keyboardShortcut.ts","webpack://thoughtleaderscentral/../src/commands/lift.ts","webpack://thoughtleaderscentral/../src/commands/liftEmptyBlock.ts","webpack://thoughtleaderscentral/../src/commands/liftListItem.ts","webpack://thoughtleaderscentral/../src/commands/newlineInCode.ts","webpack://thoughtleaderscentral/../src/commands/resetAttributes.ts","webpack://thoughtleaderscentral/../src/commands/scrollIntoView.ts","webpack://thoughtleaderscentral/../src/commands/selectAll.ts","webpack://thoughtleaderscentral/../src/commands/selectNodeBackward.ts","webpack://thoughtleaderscentral/../src/commands/selectNodeForward.ts","webpack://thoughtleaderscentral/../src/commands/selectParentNode.ts","webpack://thoughtleaderscentral/../src/commands/selectTextblockEnd.ts","webpack://thoughtleaderscentral/../src/commands/selectTextblockStart.ts","webpack://thoughtleaderscentral/../src/commands/setContent.ts","webpack://thoughtleaderscentral/../src/commands/setMark.ts","webpack://thoughtleaderscentral/../src/commands/setMeta.ts","webpack://thoughtleaderscentral/../src/commands/setNode.ts","webpack://thoughtleaderscentral/../src/commands/setNodeSelection.ts","webpack://thoughtleaderscentral/../src/commands/setTextSelection.ts","webpack://thoughtleaderscentral/../src/commands/sinkListItem.ts","webpack://thoughtleaderscentral/../src/helpers/defaultBlockAt.ts","webpack://thoughtleaderscentral/../src/commands/splitListItem.ts","webpack://thoughtleaderscentral/../src/commands/toggleMark.ts","webpack://thoughtleaderscentral/../src/commands/toggleNode.ts","webpack://thoughtleaderscentral/../src/commands/toggleWrap.ts","webpack://thoughtleaderscentral/../src/commands/undoInputRule.ts","webpack://thoughtleaderscentral/../src/commands/unsetAllMarks.ts","webpack://thoughtleaderscentral/../src/commands/unsetMark.ts","webpack://thoughtleaderscentral/../src/commands/updateAttributes.ts","webpack://thoughtleaderscentral/../src/commands/wrapIn.ts","webpack://thoughtleaderscentral/../src/commands/wrapInList.ts","webpack://thoughtleaderscentral/../src/extensions/commands.ts","webpack://thoughtleaderscentral/../src/extensions/editable.ts","webpack://thoughtleaderscentral/../src/extensions/focusEvents.ts","webpack://thoughtleaderscentral/../src/extensions/keymap.ts","webpack://thoughtleaderscentral/../src/extensions/tabindex.ts","webpack://thoughtleaderscentral/../src/Editor.ts","webpack://thoughtleaderscentral/../src/utilities/createStyleTag.ts","webpack://thoughtleaderscentral/../src/style.ts","webpack://thoughtleaderscentral/../src/helpers/isActive.ts","webpack://thoughtleaderscentral/../src/helpers/getHTMLFromFragment.ts","webpack://thoughtleaderscentral/../src/helpers/getText.ts","webpack://thoughtleaderscentral/../src/helpers/isNodeEmpty.ts","webpack://thoughtleaderscentral/../src/inputRules/markInputRule.ts","webpack://thoughtleaderscentral/../src/inputRules/nodeInputRule.ts","webpack://thoughtleaderscentral/../src/inputRules/textblockTypeInputRule.ts","webpack://thoughtleaderscentral/../src/inputRules/wrappingInputRule.ts","webpack://thoughtleaderscentral/../src/Mark.ts","webpack://thoughtleaderscentral/../src/Node.ts","webpack://thoughtleaderscentral/../src/pasteRules/markPasteRule.ts","webpack://thoughtleaderscentral/../src/link.ts","webpack://thoughtleaderscentral/../src/helpers/autolink.ts","webpack://thoughtleaderscentral/../src/helpers/clickHandler.ts","webpack://thoughtleaderscentral/../src/helpers/pasteHandler.ts","webpack://thoughtleaderscentral/../src/blockquote.ts","webpack://thoughtleaderscentral/../src/bold.ts","webpack://thoughtleaderscentral/../../extension-list-item/src/list-item.ts","webpack://thoughtleaderscentral/../../extension-text-style/src/text-style.ts","webpack://thoughtleaderscentral/../src/bullet-list.ts","webpack://thoughtleaderscentral/../src/code.ts","webpack://thoughtleaderscentral/../src/code-block.ts","webpack://thoughtleaderscentral/../src/document.ts","webpack://thoughtleaderscentral/../src/dropcursor.ts","webpack://thoughtleaderscentral/../src/gapcursor.ts","webpack://thoughtleaderscentral/../src/hard-break.ts","webpack://thoughtleaderscentral/../src/heading.ts","webpack://thoughtleaderscentral/../src/history.ts","webpack://thoughtleaderscentral/../src/horizontal-rule.ts","webpack://thoughtleaderscentral/../src/italic.ts","webpack://thoughtleaderscentral/../src/list-item.ts","webpack://thoughtleaderscentral/../src/ordered-list.ts","webpack://thoughtleaderscentral/../src/paragraph.ts","webpack://thoughtleaderscentral/../src/strike.ts","webpack://thoughtleaderscentral/../src/text.ts","webpack://thoughtleaderscentral/../src/starter-kit.ts","webpack://thoughtleaderscentral/../src/bubble-menu-plugin.ts","webpack://thoughtleaderscentral/../src/bubble-menu.ts","webpack://thoughtleaderscentral/../src/floating-menu-plugin.ts","webpack://thoughtleaderscentral/../src/floating-menu.ts","webpack://thoughtleaderscentral/../src/BubbleMenu.ts","webpack://thoughtleaderscentral/../src/EditorContent.ts","webpack://thoughtleaderscentral/../src/FloatingMenu.ts","webpack://thoughtleaderscentral/../src/NodeViewContent.ts","webpack://thoughtleaderscentral/../src/NodeViewWrapper.ts","webpack://thoughtleaderscentral/../src/VueNodeViewRenderer.ts"],"sourcesContent":["import { EditorState, Transaction } from '@tiptap/pm/state'\n\nexport function createChainableState(config: {\n transaction: Transaction\n state: EditorState\n}): EditorState {\n const { state, transaction } = config\n let { selection } = transaction\n let { doc } = transaction\n let { storedMarks } = transaction\n\n return {\n ...state,\n apply: state.apply.bind(state),\n applyTransaction: state.applyTransaction.bind(state),\n filterTransaction: state.filterTransaction,\n plugins: state.plugins,\n schema: state.schema,\n reconfigure: state.reconfigure.bind(state),\n toJSON: state.toJSON.bind(state),\n get storedMarks() {\n return storedMarks\n },\n get selection() {\n return selection\n },\n get doc() {\n return doc\n },\n get tr() {\n selection = transaction.selection\n doc = transaction.doc\n storedMarks = transaction.storedMarks\n\n return transaction\n },\n }\n}\n","import { EditorState, Transaction } from '@tiptap/pm/state'\n\nimport { Editor } from './Editor.js'\nimport { createChainableState } from './helpers/createChainableState.js'\nimport {\n AnyCommands, CanCommands, ChainedCommands, CommandProps, SingleCommands,\n} from './types.js'\n\nexport class CommandManager {\n editor: Editor\n\n rawCommands: AnyCommands\n\n customState?: EditorState\n\n constructor(props: { editor: Editor; state?: EditorState }) {\n this.editor = props.editor\n this.rawCommands = this.editor.extensionManager.commands\n this.customState = props.state\n }\n\n get hasCustomState(): boolean {\n return !!this.customState\n }\n\n get state(): EditorState {\n return this.customState || this.editor.state\n }\n\n get commands(): SingleCommands {\n const { rawCommands, editor, state } = this\n const { view } = editor\n const { tr } = state\n const props = this.buildProps(tr)\n\n return Object.fromEntries(\n Object.entries(rawCommands).map(([name, command]) => {\n const method = (...args: any[]) => {\n const callback = command(...args)(props)\n\n if (!tr.getMeta('preventDispatch') && !this.hasCustomState) {\n view.dispatch(tr)\n }\n\n return callback\n }\n\n return [name, method]\n }),\n ) as unknown as SingleCommands\n }\n\n get chain(): () => ChainedCommands {\n return () => this.createChain()\n }\n\n get can(): () => CanCommands {\n return () => this.createCan()\n }\n\n public createChain(startTr?: Transaction, shouldDispatch = true): ChainedCommands {\n const { rawCommands, editor, state } = this\n const { view } = editor\n const callbacks: boolean[] = []\n const hasStartTransaction = !!startTr\n const tr = startTr || state.tr\n\n const run = () => {\n if (\n !hasStartTransaction\n && shouldDispatch\n && !tr.getMeta('preventDispatch')\n && !this.hasCustomState\n ) {\n view.dispatch(tr)\n }\n\n return callbacks.every(callback => callback === true)\n }\n\n const chain = {\n ...Object.fromEntries(\n Object.entries(rawCommands).map(([name, command]) => {\n const chainedCommand = (...args: never[]) => {\n const props = this.buildProps(tr, shouldDispatch)\n const callback = command(...args)(props)\n\n callbacks.push(callback)\n\n return chain\n }\n\n return [name, chainedCommand]\n }),\n ),\n run,\n } as unknown as ChainedCommands\n\n return chain\n }\n\n public createCan(startTr?: Transaction): CanCommands {\n const { rawCommands, state } = this\n const dispatch = false\n const tr = startTr || state.tr\n const props = this.buildProps(tr, dispatch)\n const formattedCommands = Object.fromEntries(\n Object.entries(rawCommands).map(([name, command]) => {\n return [name, (...args: never[]) => command(...args)({ ...props, dispatch: undefined })]\n }),\n ) as unknown as SingleCommands\n\n return {\n ...formattedCommands,\n chain: () => this.createChain(tr, dispatch),\n } as CanCommands\n }\n\n public buildProps(tr: Transaction, shouldDispatch = true): CommandProps {\n const { rawCommands, editor, state } = this\n const { view } = editor\n\n const props: CommandProps = {\n tr,\n editor,\n view,\n state: createChainableState({\n state,\n transaction: tr,\n }),\n dispatch: shouldDispatch ? () => undefined : undefined,\n chain: () => this.createChain(tr, shouldDispatch),\n can: () => this.createCan(tr),\n get commands() {\n return Object.fromEntries(\n Object.entries(rawCommands).map(([name, command]) => {\n return [name, (...args: never[]) => command(...args)(props)]\n }),\n ) as unknown as SingleCommands\n },\n }\n\n return props\n }\n}\n","type StringKeyOf = Extract\ntype CallbackType<\n T extends Record,\n EventName extends StringKeyOf,\n> = T[EventName] extends any[] ? T[EventName] : [T[EventName]]\ntype CallbackFunction<\n T extends Record,\n EventName extends StringKeyOf,\n> = (...props: CallbackType) => any\n\nexport class EventEmitter> {\n\n private callbacks: { [key: string]: Function[] } = {}\n\n public on>(event: EventName, fn: CallbackFunction): this {\n if (!this.callbacks[event]) {\n this.callbacks[event] = []\n }\n\n this.callbacks[event].push(fn)\n\n return this\n }\n\n protected emit>(event: EventName, ...args: CallbackType): this {\n const callbacks = this.callbacks[event]\n\n if (callbacks) {\n callbacks.forEach(callback => callback.apply(this, args))\n }\n\n return this\n }\n\n public off>(event: EventName, fn?: CallbackFunction): this {\n const callbacks = this.callbacks[event]\n\n if (callbacks) {\n if (fn) {\n this.callbacks[event] = callbacks.filter(callback => callback !== fn)\n } else {\n delete this.callbacks[event]\n }\n }\n\n return this\n }\n\n protected removeAllListeners(): void {\n this.callbacks = {}\n }\n}\n","import { AnyExtension, MaybeThisParameterType, RemoveThis } from '../types.js'\n\nexport function getExtensionField(\n extension: AnyExtension,\n field: string,\n context?: Omit, 'parent'>,\n): RemoveThis {\n\n if (extension.config[field] === undefined && extension.parent) {\n return getExtensionField(extension.parent, field, context)\n }\n\n if (typeof extension.config[field] === 'function') {\n const value = extension.config[field].bind({\n ...context,\n parent: extension.parent\n ? getExtensionField(extension.parent, field, context)\n : null,\n })\n\n return value\n }\n\n return extension.config[field]\n}\n","import { Extension } from '../Extension.js'\nimport { Mark } from '../Mark.js'\nimport { Node } from '../Node.js'\nimport { Extensions } from '../types.js'\n\nexport function splitExtensions(extensions: Extensions) {\n const baseExtensions = extensions.filter(extension => extension.type === 'extension') as Extension[]\n const nodeExtensions = extensions.filter(extension => extension.type === 'node') as Node[]\n const markExtensions = extensions.filter(extension => extension.type === 'mark') as Mark[]\n\n return {\n baseExtensions,\n nodeExtensions,\n markExtensions,\n }\n}\n","import { MarkConfig, NodeConfig } from '../index.js'\nimport {\n AnyConfig,\n Attribute,\n Attributes,\n ExtensionAttribute,\n Extensions,\n GlobalAttributes,\n} from '../types.js'\nimport { getExtensionField } from './getExtensionField.js'\nimport { splitExtensions } from './splitExtensions.js'\n\n/**\n * Get a list of all extension attributes defined in `addAttribute` and `addGlobalAttribute`.\n * @param extensions List of extensions\n */\nexport function getAttributesFromExtensions(extensions: Extensions): ExtensionAttribute[] {\n const extensionAttributes: ExtensionAttribute[] = []\n const { nodeExtensions, markExtensions } = splitExtensions(extensions)\n const nodeAndMarkExtensions = [...nodeExtensions, ...markExtensions]\n const defaultAttribute: Required = {\n default: null,\n rendered: true,\n renderHTML: null,\n parseHTML: null,\n keepOnSplit: true,\n isRequired: false,\n }\n\n extensions.forEach(extension => {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n }\n\n const addGlobalAttributes = getExtensionField(\n extension,\n 'addGlobalAttributes',\n context,\n )\n\n if (!addGlobalAttributes) {\n return\n }\n\n // TODO: remove `as GlobalAttributes`\n const globalAttributes = addGlobalAttributes() as GlobalAttributes\n\n globalAttributes.forEach(globalAttribute => {\n globalAttribute.types.forEach(type => {\n Object\n .entries(globalAttribute.attributes)\n .forEach(([name, attribute]) => {\n extensionAttributes.push({\n type,\n name,\n attribute: {\n ...defaultAttribute,\n ...attribute,\n },\n })\n })\n })\n })\n })\n\n nodeAndMarkExtensions.forEach(extension => {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n }\n\n const addAttributes = getExtensionField(\n extension,\n 'addAttributes',\n context,\n )\n\n if (!addAttributes) {\n return\n }\n\n // TODO: remove `as Attributes`\n const attributes = addAttributes() as Attributes\n\n Object\n .entries(attributes)\n .forEach(([name, attribute]) => {\n const mergedAttr = {\n ...defaultAttribute,\n ...attribute,\n }\n\n if (typeof mergedAttr?.default === 'function') {\n mergedAttr.default = mergedAttr.default()\n }\n\n if (mergedAttr?.isRequired && mergedAttr?.default === undefined) {\n delete mergedAttr.default\n }\n\n extensionAttributes.push({\n type: extension.name,\n name,\n attribute: mergedAttr,\n })\n })\n })\n\n return extensionAttributes\n}\n","import { NodeType, Schema } from '@tiptap/pm/model'\n\nexport function getNodeType(nameOrType: string | NodeType, schema: Schema): NodeType {\n if (typeof nameOrType === 'string') {\n if (!schema.nodes[nameOrType]) {\n throw Error(\n `There is no node type named '${nameOrType}'. Maybe you forgot to add the extension?`,\n )\n }\n\n return schema.nodes[nameOrType]\n }\n\n return nameOrType\n}\n","export function mergeAttributes(...objects: Record[]): Record {\n return objects\n .filter(item => !!item)\n .reduce((items, item) => {\n const mergedAttributes = { ...items }\n\n Object.entries(item).forEach(([key, value]) => {\n const exists = mergedAttributes[key]\n\n if (!exists) {\n mergedAttributes[key] = value\n\n return\n }\n\n if (key === 'class') {\n const valueClasses: string[] = value ? value.split(' ') : []\n const existingClasses: string[] = mergedAttributes[key] ? mergedAttributes[key].split(' ') : []\n\n const insertClasses = valueClasses.filter(\n valueClass => !existingClasses.includes(valueClass),\n )\n\n mergedAttributes[key] = [...existingClasses, ...insertClasses].join(' ')\n } else if (key === 'style') {\n mergedAttributes[key] = [mergedAttributes[key], value].join('; ')\n } else {\n mergedAttributes[key] = value\n }\n })\n\n return mergedAttributes\n }, {})\n}\n","import { Mark, Node } from '@tiptap/pm/model'\n\nimport { ExtensionAttribute } from '../types.js'\nimport { mergeAttributes } from '../utilities/mergeAttributes.js'\n\nexport function getRenderedAttributes(\n nodeOrMark: Node | Mark,\n extensionAttributes: ExtensionAttribute[],\n): Record {\n return extensionAttributes\n .filter(item => item.attribute.rendered)\n .map(item => {\n if (!item.attribute.renderHTML) {\n return {\n [item.name]: nodeOrMark.attrs[item.name],\n }\n }\n\n return item.attribute.renderHTML(nodeOrMark.attrs) || {}\n })\n .reduce((attributes, attribute) => mergeAttributes(attributes, attribute), {})\n}\n","export function isFunction(value: any): value is Function {\n return typeof value === 'function'\n}\n","import { MaybeReturnType } from '../types.js'\nimport { isFunction } from './isFunction.js'\n\n/**\n * Optionally calls `value` as a function.\n * Otherwise it is returned directly.\n * @param value Function or any value.\n * @param context Optional context to bind to function.\n * @param props Optional props to pass to function.\n */\nexport function callOrReturn(value: T, context: any = undefined, ...props: any[]): MaybeReturnType {\n if (isFunction(value)) {\n if (context) {\n return value.bind(context)(...props)\n }\n\n return value(...props)\n }\n\n return value as MaybeReturnType\n}\n","import { ParseRule } from '@tiptap/pm/model'\n\nimport { ExtensionAttribute } from '../types.js'\nimport { fromString } from '../utilities/fromString.js'\n\n/**\n * This function merges extension attributes into parserule attributes (`attrs` or `getAttrs`).\n * Cancels when `getAttrs` returned `false`.\n * @param parseRule ProseMirror ParseRule\n * @param extensionAttributes List of attributes to inject\n */\nexport function injectExtensionAttributesToParseRule(\n parseRule: ParseRule,\n extensionAttributes: ExtensionAttribute[],\n): ParseRule {\n if (parseRule.style) {\n return parseRule\n }\n\n return {\n ...parseRule,\n getAttrs: node => {\n const oldAttributes = parseRule.getAttrs ? parseRule.getAttrs(node) : parseRule.attrs\n\n if (oldAttributes === false) {\n return false\n }\n\n const newAttributes = extensionAttributes.reduce((items, item) => {\n const value = item.attribute.parseHTML\n ? item.attribute.parseHTML(node as HTMLElement)\n : fromString((node as HTMLElement).getAttribute(item.name))\n\n if (value === null || value === undefined) {\n return items\n }\n\n return {\n ...items,\n [item.name]: value,\n }\n }, {})\n\n return { ...oldAttributes, ...newAttributes }\n },\n }\n}\n","export function fromString(value: any): any {\n if (typeof value !== 'string') {\n return value\n }\n\n if (value.match(/^[+-]?(?:\\d*\\.)?\\d+$/)) {\n return Number(value)\n }\n\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n return value\n}\n","import { MarkSpec, NodeSpec, Schema } from '@tiptap/pm/model'\n\nimport { Editor, MarkConfig, NodeConfig } from '../index.js'\nimport { AnyConfig, Extensions } from '../types.js'\nimport { callOrReturn } from '../utilities/callOrReturn.js'\nimport { isEmptyObject } from '../utilities/isEmptyObject.js'\nimport { getAttributesFromExtensions } from './getAttributesFromExtensions.js'\nimport { getExtensionField } from './getExtensionField.js'\nimport { getRenderedAttributes } from './getRenderedAttributes.js'\nimport { injectExtensionAttributesToParseRule } from './injectExtensionAttributesToParseRule.js'\nimport { splitExtensions } from './splitExtensions.js'\n\nfunction cleanUpSchemaItem(data: T) {\n return Object.fromEntries(\n // @ts-ignore\n Object.entries(data).filter(([key, value]) => {\n if (key === 'attrs' && isEmptyObject(value as {} | undefined)) {\n return false\n }\n\n return value !== null && value !== undefined\n }),\n ) as T\n}\n\nexport function getSchemaByResolvedExtensions(extensions: Extensions, editor?: Editor): Schema {\n const allAttributes = getAttributesFromExtensions(extensions)\n const { nodeExtensions, markExtensions } = splitExtensions(extensions)\n const topNode = nodeExtensions.find(extension => getExtensionField(extension, 'topNode'))?.name\n\n const nodes = Object.fromEntries(\n nodeExtensions.map(extension => {\n const extensionAttributes = allAttributes.filter(\n attribute => attribute.type === extension.name,\n )\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n editor,\n }\n\n const extraNodeFields = extensions.reduce((fields, e) => {\n const extendNodeSchema = getExtensionField(\n e,\n 'extendNodeSchema',\n context,\n )\n\n return {\n ...fields,\n ...(extendNodeSchema ? extendNodeSchema(extension) : {}),\n }\n }, {})\n\n const schema: NodeSpec = cleanUpSchemaItem({\n ...extraNodeFields,\n content: callOrReturn(\n getExtensionField(extension, 'content', context),\n ),\n marks: callOrReturn(getExtensionField(extension, 'marks', context)),\n group: callOrReturn(getExtensionField(extension, 'group', context)),\n inline: callOrReturn(getExtensionField(extension, 'inline', context)),\n atom: callOrReturn(getExtensionField(extension, 'atom', context)),\n selectable: callOrReturn(\n getExtensionField(extension, 'selectable', context),\n ),\n draggable: callOrReturn(\n getExtensionField(extension, 'draggable', context),\n ),\n code: callOrReturn(getExtensionField(extension, 'code', context)),\n defining: callOrReturn(\n getExtensionField(extension, 'defining', context),\n ),\n isolating: callOrReturn(\n getExtensionField(extension, 'isolating', context),\n ),\n attrs: Object.fromEntries(\n extensionAttributes.map(extensionAttribute => {\n return [extensionAttribute.name, { default: extensionAttribute?.attribute?.default }]\n }),\n ),\n })\n\n const parseHTML = callOrReturn(\n getExtensionField(extension, 'parseHTML', context),\n )\n\n if (parseHTML) {\n schema.parseDOM = parseHTML.map(parseRule => injectExtensionAttributesToParseRule(parseRule, extensionAttributes))\n }\n\n const renderHTML = getExtensionField(\n extension,\n 'renderHTML',\n context,\n )\n\n if (renderHTML) {\n schema.toDOM = node => renderHTML({\n node,\n HTMLAttributes: getRenderedAttributes(node, extensionAttributes),\n })\n }\n\n const renderText = getExtensionField(\n extension,\n 'renderText',\n context,\n )\n\n if (renderText) {\n schema.toText = renderText\n }\n\n return [extension.name, schema]\n }),\n )\n\n const marks = Object.fromEntries(\n markExtensions.map(extension => {\n const extensionAttributes = allAttributes.filter(\n attribute => attribute.type === extension.name,\n )\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n editor,\n }\n\n const extraMarkFields = extensions.reduce((fields, e) => {\n const extendMarkSchema = getExtensionField(\n e,\n 'extendMarkSchema',\n context,\n )\n\n return {\n ...fields,\n ...(extendMarkSchema ? extendMarkSchema(extension) : {}),\n }\n }, {})\n\n const schema: MarkSpec = cleanUpSchemaItem({\n ...extraMarkFields,\n inclusive: callOrReturn(\n getExtensionField(extension, 'inclusive', context),\n ),\n excludes: callOrReturn(\n getExtensionField(extension, 'excludes', context),\n ),\n group: callOrReturn(getExtensionField(extension, 'group', context)),\n spanning: callOrReturn(\n getExtensionField(extension, 'spanning', context),\n ),\n code: callOrReturn(getExtensionField(extension, 'code', context)),\n attrs: Object.fromEntries(\n extensionAttributes.map(extensionAttribute => {\n return [extensionAttribute.name, { default: extensionAttribute?.attribute?.default }]\n }),\n ),\n })\n\n const parseHTML = callOrReturn(\n getExtensionField(extension, 'parseHTML', context),\n )\n\n if (parseHTML) {\n schema.parseDOM = parseHTML.map(parseRule => injectExtensionAttributesToParseRule(parseRule, extensionAttributes))\n }\n\n const renderHTML = getExtensionField(\n extension,\n 'renderHTML',\n context,\n )\n\n if (renderHTML) {\n schema.toDOM = mark => renderHTML({\n mark,\n HTMLAttributes: getRenderedAttributes(mark, extensionAttributes),\n })\n }\n\n return [extension.name, schema]\n }),\n )\n\n return new Schema({\n topNode,\n nodes,\n marks,\n })\n}\n","export function isEmptyObject(value = {}): boolean {\n return Object.keys(value).length === 0 && value.constructor === Object\n}\n","import { MarkType, NodeType, Schema } from '@tiptap/pm/model'\n\nexport function getSchemaTypeByName(name: string, schema: Schema): NodeType | MarkType | null {\n return schema.nodes[name] || schema.marks[name] || null\n}\n","import { AnyExtension, EnableRules } from '../types.js'\n\nexport function isExtensionRulesEnabled(extension: AnyExtension, enabled: EnableRules): boolean {\n if (Array.isArray(enabled)) {\n return enabled.some(enabledExtension => {\n const name = typeof enabledExtension === 'string'\n ? enabledExtension\n : enabledExtension.name\n\n return name === extension.name\n })\n }\n\n return enabled\n}\n","import { ResolvedPos } from '@tiptap/pm/model'\n\nexport const getTextContentFromNodes = ($from: ResolvedPos, maxMatch = 500) => {\n let textBefore = ''\n\n const sliceEndPos = $from.parentOffset\n\n $from.parent.nodesBetween(\n Math.max(0, sliceEndPos - maxMatch),\n sliceEndPos,\n (node, pos, parent, index) => {\n const chunk = node.type.spec.toText?.({\n node,\n pos,\n parent,\n index,\n })\n || node.textContent\n || '%leaf%'\n\n textBefore += chunk.slice(0, Math.max(0, sliceEndPos - pos))\n },\n )\n\n return textBefore\n}\n","export function isRegExp(value: any): value is RegExp {\n return Object.prototype.toString.call(value) === '[object RegExp]'\n}\n","import { EditorState, Plugin, TextSelection } from '@tiptap/pm/state'\n\nimport { CommandManager } from './CommandManager.js'\nimport { Editor } from './Editor.js'\nimport { createChainableState } from './helpers/createChainableState.js'\nimport { getTextContentFromNodes } from './helpers/getTextContentFromNodes.js'\nimport {\n CanCommands,\n ChainedCommands,\n ExtendedRegExpMatchArray,\n Range,\n SingleCommands,\n} from './types.js'\nimport { isRegExp } from './utilities/isRegExp.js'\n\nexport type InputRuleMatch = {\n index: number\n text: string\n replaceWith?: string\n match?: RegExpMatchArray\n data?: Record\n}\n\nexport type InputRuleFinder = RegExp | ((text: string) => InputRuleMatch | null)\n\nexport class InputRule {\n find: InputRuleFinder\n\n handler: (props: {\n state: EditorState\n range: Range\n match: ExtendedRegExpMatchArray\n commands: SingleCommands\n chain: () => ChainedCommands\n can: () => CanCommands\n }) => void | null\n\n constructor(config: {\n find: InputRuleFinder\n handler: (props: {\n state: EditorState\n range: Range\n match: ExtendedRegExpMatchArray\n commands: SingleCommands\n chain: () => ChainedCommands\n can: () => CanCommands\n }) => void | null\n }) {\n this.find = config.find\n this.handler = config.handler\n }\n}\n\nconst inputRuleMatcherHandler = (\n text: string,\n find: InputRuleFinder,\n): ExtendedRegExpMatchArray | null => {\n if (isRegExp(find)) {\n return find.exec(text)\n }\n\n const inputRuleMatch = find(text)\n\n if (!inputRuleMatch) {\n return null\n }\n\n const result: ExtendedRegExpMatchArray = [inputRuleMatch.text]\n\n result.index = inputRuleMatch.index\n result.input = text\n result.data = inputRuleMatch.data\n\n if (inputRuleMatch.replaceWith) {\n if (!inputRuleMatch.text.includes(inputRuleMatch.replaceWith)) {\n console.warn(\n '[tiptap warn]: \"inputRuleMatch.replaceWith\" must be part of \"inputRuleMatch.text\".',\n )\n }\n\n result.push(inputRuleMatch.replaceWith)\n }\n\n return result\n}\n\nfunction run(config: {\n editor: Editor\n from: number\n to: number\n text: string\n rules: InputRule[]\n plugin: Plugin\n}): boolean {\n const {\n editor, from, to, text, rules, plugin,\n } = config\n const { view } = editor\n\n if (view.composing) {\n return false\n }\n\n const $from = view.state.doc.resolve(from)\n\n if (\n // check for code node\n $from.parent.type.spec.code\n // check for code mark\n || !!($from.nodeBefore || $from.nodeAfter)?.marks.find(mark => mark.type.spec.code)\n ) {\n return false\n }\n\n let matched = false\n\n const textBefore = getTextContentFromNodes($from) + text\n\n rules.forEach(rule => {\n if (matched) {\n return\n }\n\n const match = inputRuleMatcherHandler(textBefore, rule.find)\n\n if (!match) {\n return\n }\n\n const tr = view.state.tr\n const state = createChainableState({\n state: view.state,\n transaction: tr,\n })\n const range = {\n from: from - (match[0].length - text.length),\n to,\n }\n\n const { commands, chain, can } = new CommandManager({\n editor,\n state,\n })\n\n const handler = rule.handler({\n state,\n range,\n match,\n commands,\n chain,\n can,\n })\n\n // stop if there are no changes\n if (handler === null || !tr.steps.length) {\n return\n }\n\n // store transform as meta data\n // so we can undo input rules within the `undoInputRules` command\n tr.setMeta(plugin, {\n transform: tr,\n from,\n to,\n text,\n })\n\n view.dispatch(tr)\n matched = true\n })\n\n return matched\n}\n\n/**\n * Create an input rules plugin. When enabled, it will cause text\n * input that matches any of the given rules to trigger the rule’s\n * action.\n */\nexport function inputRulesPlugin(props: { editor: Editor; rules: InputRule[] }): Plugin {\n const { editor, rules } = props\n const plugin = new Plugin({\n state: {\n init() {\n return null\n },\n apply(tr, prev) {\n const stored = tr.getMeta(plugin)\n\n if (stored) {\n return stored\n }\n\n return tr.selectionSet || tr.docChanged ? null : prev\n },\n },\n\n props: {\n handleTextInput(view, from, to, text) {\n return run({\n editor,\n from,\n to,\n text,\n rules,\n plugin,\n })\n },\n\n handleDOMEvents: {\n compositionend: view => {\n setTimeout(() => {\n const { $cursor } = view.state.selection as TextSelection\n\n if ($cursor) {\n run({\n editor,\n from: $cursor.pos,\n to: $cursor.pos,\n text: '',\n rules,\n plugin,\n })\n }\n })\n\n return false\n },\n },\n\n // add support for input rules to trigger on enter\n // this is useful for example for code blocks\n handleKeyDown(view, event) {\n if (event.key !== 'Enter') {\n return false\n }\n\n const { $cursor } = view.state.selection as TextSelection\n\n if ($cursor) {\n return run({\n editor,\n from: $cursor.pos,\n to: $cursor.pos,\n text: '\\n',\n rules,\n plugin,\n })\n }\n\n return false\n },\n },\n\n // @ts-ignore\n isInputRules: true,\n }) as Plugin\n\n return plugin\n}\n","import { EditorState, Plugin } from '@tiptap/pm/state'\n\nimport { CommandManager } from './CommandManager.js'\nimport { Editor } from './Editor.js'\nimport { createChainableState } from './helpers/createChainableState.js'\nimport {\n CanCommands,\n ChainedCommands,\n ExtendedRegExpMatchArray,\n Range,\n SingleCommands,\n} from './types.js'\nimport { isNumber } from './utilities/isNumber.js'\nimport { isRegExp } from './utilities/isRegExp.js'\n\nexport type PasteRuleMatch = {\n index: number\n text: string\n replaceWith?: string\n match?: RegExpMatchArray\n data?: Record\n}\n\nexport type PasteRuleFinder = RegExp | ((text: string) => PasteRuleMatch[] | null | undefined)\n\nexport class PasteRule {\n find: PasteRuleFinder\n\n handler: (props: {\n state: EditorState\n range: Range\n match: ExtendedRegExpMatchArray\n commands: SingleCommands\n chain: () => ChainedCommands\n can: () => CanCommands\n }) => void | null\n\n constructor(config: {\n find: PasteRuleFinder\n handler: (props: {\n state: EditorState\n range: Range\n match: ExtendedRegExpMatchArray\n commands: SingleCommands\n chain: () => ChainedCommands\n can: () => CanCommands\n }) => void | null\n }) {\n this.find = config.find\n this.handler = config.handler\n }\n}\n\nconst pasteRuleMatcherHandler = (\n text: string,\n find: PasteRuleFinder,\n): ExtendedRegExpMatchArray[] => {\n if (isRegExp(find)) {\n return [...text.matchAll(find)]\n }\n\n const matches = find(text)\n\n if (!matches) {\n return []\n }\n\n return matches.map(pasteRuleMatch => {\n const result: ExtendedRegExpMatchArray = [pasteRuleMatch.text]\n\n result.index = pasteRuleMatch.index\n result.input = text\n result.data = pasteRuleMatch.data\n\n if (pasteRuleMatch.replaceWith) {\n if (!pasteRuleMatch.text.includes(pasteRuleMatch.replaceWith)) {\n console.warn(\n '[tiptap warn]: \"pasteRuleMatch.replaceWith\" must be part of \"pasteRuleMatch.text\".',\n )\n }\n\n result.push(pasteRuleMatch.replaceWith)\n }\n\n return result\n })\n}\n\nfunction run(config: {\n editor: Editor\n state: EditorState\n from: number\n to: number\n rule: PasteRule\n}): boolean {\n const {\n editor, state, from, to, rule,\n } = config\n\n const { commands, chain, can } = new CommandManager({\n editor,\n state,\n })\n\n const handlers: (void | null)[] = []\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isTextblock || node.type.spec.code) {\n return\n }\n\n const resolvedFrom = Math.max(from, pos)\n const resolvedTo = Math.min(to, pos + node.content.size)\n const textToMatch = node.textBetween(resolvedFrom - pos, resolvedTo - pos, undefined, '\\ufffc')\n\n const matches = pasteRuleMatcherHandler(textToMatch, rule.find)\n\n matches.forEach(match => {\n if (match.index === undefined) {\n return\n }\n\n const start = resolvedFrom + match.index + 1\n const end = start + match[0].length\n const range = {\n from: state.tr.mapping.map(start),\n to: state.tr.mapping.map(end),\n }\n\n const handler = rule.handler({\n state,\n range,\n match,\n commands,\n chain,\n can,\n })\n\n handlers.push(handler)\n })\n })\n\n const success = handlers.every(handler => handler !== null)\n\n return success\n}\n\n/**\n * Create an paste rules plugin. When enabled, it will cause pasted\n * text that matches any of the given rules to trigger the rule’s\n * action.\n */\nexport function pasteRulesPlugin(props: { editor: Editor; rules: PasteRule[] }): Plugin[] {\n const { editor, rules } = props\n let dragSourceElement: Element | null = null\n let isPastedFromProseMirror = false\n let isDroppedFromProseMirror = false\n\n const plugins = rules.map(rule => {\n return new Plugin({\n // we register a global drag handler to track the current drag source element\n view(view) {\n const handleDragstart = (event: DragEvent) => {\n dragSourceElement = view.dom.parentElement?.contains(event.target as Element)\n ? view.dom.parentElement\n : null\n }\n\n window.addEventListener('dragstart', handleDragstart)\n\n return {\n destroy() {\n window.removeEventListener('dragstart', handleDragstart)\n },\n }\n },\n\n props: {\n handleDOMEvents: {\n drop: view => {\n isDroppedFromProseMirror = dragSourceElement === view.dom.parentElement\n\n return false\n },\n\n paste: (view, event: Event) => {\n const html = (event as ClipboardEvent).clipboardData?.getData('text/html')\n\n isPastedFromProseMirror = !!html?.includes('data-pm-slice')\n\n return false\n },\n },\n },\n\n appendTransaction: (transactions, oldState, state) => {\n const transaction = transactions[0]\n const isPaste = transaction.getMeta('uiEvent') === 'paste' && !isPastedFromProseMirror\n const isDrop = transaction.getMeta('uiEvent') === 'drop' && !isDroppedFromProseMirror\n\n if (!isPaste && !isDrop) {\n return\n }\n\n // stop if there is no changed range\n const from = oldState.doc.content.findDiffStart(state.doc.content)\n const to = oldState.doc.content.findDiffEnd(state.doc.content)\n\n if (!isNumber(from) || !to || from === to.b) {\n return\n }\n\n // build a chainable state\n // so we can use a single transaction for all paste rules\n const tr = state.tr\n const chainableState = createChainableState({\n state,\n transaction: tr,\n })\n\n const handler = run({\n editor,\n state: chainableState,\n from: Math.max(from - 1, 0),\n to: to.b - 1,\n rule,\n })\n\n // stop if there are no changes\n if (!handler || !tr.steps.length) {\n return\n }\n\n return tr\n },\n })\n })\n\n return plugins\n}\n","export function isNumber(value: any): value is number {\n return typeof value === 'number'\n}\n","import { keymap } from '@tiptap/pm/keymap'\nimport { Node as ProsemirrorNode, Schema } from '@tiptap/pm/model'\nimport { Plugin } from '@tiptap/pm/state'\nimport { Decoration, EditorView } from '@tiptap/pm/view'\n\nimport { Editor } from './Editor.js'\nimport { getAttributesFromExtensions } from './helpers/getAttributesFromExtensions.js'\nimport { getExtensionField } from './helpers/getExtensionField.js'\nimport { getNodeType } from './helpers/getNodeType.js'\nimport { getRenderedAttributes } from './helpers/getRenderedAttributes.js'\nimport { getSchemaByResolvedExtensions } from './helpers/getSchemaByResolvedExtensions.js'\nimport { getSchemaTypeByName } from './helpers/getSchemaTypeByName.js'\nimport { isExtensionRulesEnabled } from './helpers/isExtensionRulesEnabled.js'\nimport { splitExtensions } from './helpers/splitExtensions.js'\nimport { Mark, NodeConfig } from './index.js'\nimport { inputRulesPlugin } from './InputRule.js'\nimport { pasteRulesPlugin } from './PasteRule.js'\nimport { AnyConfig, Extensions, RawCommands } from './types.js'\nimport { callOrReturn } from './utilities/callOrReturn.js'\nimport { findDuplicates } from './utilities/findDuplicates.js'\n\nexport class ExtensionManager {\n editor: Editor\n\n schema: Schema\n\n extensions: Extensions\n\n splittableMarks: string[] = []\n\n constructor(extensions: Extensions, editor: Editor) {\n this.editor = editor\n this.extensions = ExtensionManager.resolve(extensions)\n this.schema = getSchemaByResolvedExtensions(this.extensions, editor)\n\n this.extensions.forEach(extension => {\n // store extension storage in editor\n this.editor.extensionStorage[extension.name] = extension.storage\n\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n editor: this.editor,\n type: getSchemaTypeByName(extension.name, this.schema),\n }\n\n if (extension.type === 'mark') {\n const keepOnSplit = callOrReturn(getExtensionField(extension, 'keepOnSplit', context)) ?? true\n\n if (keepOnSplit) {\n this.splittableMarks.push(extension.name)\n }\n }\n\n const onBeforeCreate = getExtensionField(\n extension,\n 'onBeforeCreate',\n context,\n )\n\n if (onBeforeCreate) {\n this.editor.on('beforeCreate', onBeforeCreate)\n }\n\n const onCreate = getExtensionField(extension, 'onCreate', context)\n\n if (onCreate) {\n this.editor.on('create', onCreate)\n }\n\n const onUpdate = getExtensionField(extension, 'onUpdate', context)\n\n if (onUpdate) {\n this.editor.on('update', onUpdate)\n }\n\n const onSelectionUpdate = getExtensionField(\n extension,\n 'onSelectionUpdate',\n context,\n )\n\n if (onSelectionUpdate) {\n this.editor.on('selectionUpdate', onSelectionUpdate)\n }\n\n const onTransaction = getExtensionField(\n extension,\n 'onTransaction',\n context,\n )\n\n if (onTransaction) {\n this.editor.on('transaction', onTransaction)\n }\n\n const onFocus = getExtensionField(extension, 'onFocus', context)\n\n if (onFocus) {\n this.editor.on('focus', onFocus)\n }\n\n const onBlur = getExtensionField(extension, 'onBlur', context)\n\n if (onBlur) {\n this.editor.on('blur', onBlur)\n }\n\n const onDestroy = getExtensionField(extension, 'onDestroy', context)\n\n if (onDestroy) {\n this.editor.on('destroy', onDestroy)\n }\n })\n }\n\n static resolve(extensions: Extensions): Extensions {\n const resolvedExtensions = ExtensionManager.sort(ExtensionManager.flatten(extensions))\n const duplicatedNames = findDuplicates(resolvedExtensions.map(extension => extension.name))\n\n if (duplicatedNames.length) {\n console.warn(\n `[tiptap warn]: Duplicate extension names found: [${duplicatedNames\n .map(item => `'${item}'`)\n .join(', ')}]. This can lead to issues.`,\n )\n }\n\n return resolvedExtensions\n }\n\n static flatten(extensions: Extensions): Extensions {\n return (\n extensions\n .map(extension => {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n }\n\n const addExtensions = getExtensionField(\n extension,\n 'addExtensions',\n context,\n )\n\n if (addExtensions) {\n return [extension, ...this.flatten(addExtensions())]\n }\n\n return extension\n })\n // `Infinity` will break TypeScript so we set a number that is probably high enough\n .flat(10)\n )\n }\n\n static sort(extensions: Extensions): Extensions {\n const defaultPriority = 100\n\n return extensions.sort((a, b) => {\n const priorityA = getExtensionField(a, 'priority') || defaultPriority\n const priorityB = getExtensionField(b, 'priority') || defaultPriority\n\n if (priorityA > priorityB) {\n return -1\n }\n\n if (priorityA < priorityB) {\n return 1\n }\n\n return 0\n })\n }\n\n get commands(): RawCommands {\n return this.extensions.reduce((commands, extension) => {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n editor: this.editor,\n type: getSchemaTypeByName(extension.name, this.schema),\n }\n\n const addCommands = getExtensionField(\n extension,\n 'addCommands',\n context,\n )\n\n if (!addCommands) {\n return commands\n }\n\n return {\n ...commands,\n ...addCommands(),\n }\n }, {} as RawCommands)\n }\n\n get plugins(): Plugin[] {\n const { editor } = this\n\n // With ProseMirror, first plugins within an array are executed first.\n // In Tiptap, we provide the ability to override plugins,\n // so it feels more natural to run plugins at the end of an array first.\n // That’s why we have to reverse the `extensions` array and sort again\n // based on the `priority` option.\n const extensions = ExtensionManager.sort([...this.extensions].reverse())\n\n const inputRules: any[] = []\n const pasteRules: any[] = []\n\n const allPlugins = extensions\n .map(extension => {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n editor,\n type: getSchemaTypeByName(extension.name, this.schema),\n }\n\n const plugins: Plugin[] = []\n\n const addKeyboardShortcuts = getExtensionField(\n extension,\n 'addKeyboardShortcuts',\n context,\n )\n\n let defaultBindings: Record boolean> = {}\n\n // bind exit handling\n if (extension.type === 'mark' && extension.config.exitable) {\n defaultBindings.ArrowRight = () => Mark.handleExit({ editor, mark: extension as Mark })\n }\n\n if (addKeyboardShortcuts) {\n const bindings = Object.fromEntries(\n Object.entries(addKeyboardShortcuts()).map(([shortcut, method]) => {\n return [shortcut, () => method({ editor })]\n }),\n )\n\n defaultBindings = { ...defaultBindings, ...bindings }\n }\n\n const keyMapPlugin = keymap(defaultBindings)\n\n plugins.push(keyMapPlugin)\n\n const addInputRules = getExtensionField(\n extension,\n 'addInputRules',\n context,\n )\n\n if (isExtensionRulesEnabled(extension, editor.options.enableInputRules) && addInputRules) {\n inputRules.push(...addInputRules())\n }\n\n const addPasteRules = getExtensionField(\n extension,\n 'addPasteRules',\n context,\n )\n\n if (isExtensionRulesEnabled(extension, editor.options.enablePasteRules) && addPasteRules) {\n pasteRules.push(...addPasteRules())\n }\n\n const addProseMirrorPlugins = getExtensionField(\n extension,\n 'addProseMirrorPlugins',\n context,\n )\n\n if (addProseMirrorPlugins) {\n const proseMirrorPlugins = addProseMirrorPlugins()\n\n plugins.push(...proseMirrorPlugins)\n }\n\n return plugins\n })\n .flat()\n\n return [\n inputRulesPlugin({\n editor,\n rules: inputRules,\n }),\n ...pasteRulesPlugin({\n editor,\n rules: pasteRules,\n }),\n ...allPlugins,\n ]\n }\n\n get attributes() {\n return getAttributesFromExtensions(this.extensions)\n }\n\n get nodeViews() {\n const { editor } = this\n const { nodeExtensions } = splitExtensions(this.extensions)\n\n return Object.fromEntries(\n nodeExtensions\n .filter(extension => !!getExtensionField(extension, 'addNodeView'))\n .map(extension => {\n const extensionAttributes = this.attributes.filter(\n attribute => attribute.type === extension.name,\n )\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n editor,\n type: getNodeType(extension.name, this.schema),\n }\n const addNodeView = getExtensionField(\n extension,\n 'addNodeView',\n context,\n )\n\n if (!addNodeView) {\n return []\n }\n\n const nodeview = (\n node: ProsemirrorNode,\n view: EditorView,\n getPos: (() => number) | boolean,\n decorations: Decoration[],\n ) => {\n const HTMLAttributes = getRenderedAttributes(node, extensionAttributes)\n\n return addNodeView()({\n editor,\n node,\n getPos,\n decorations,\n HTMLAttributes,\n extension,\n })\n }\n\n return [extension.name, nodeview]\n }),\n )\n }\n}\n","export function findDuplicates(items: any[]): any[] {\n const filtered = items.filter((el, index) => items.indexOf(el) !== index)\n\n return [...new Set(filtered)]\n}\n","// see: https://github.com/mesqueeb/is-what/blob/88d6e4ca92fb2baab6003c54e02eedf4e729e5ab/src/index.ts\n\nfunction getType(value: any): string {\n return Object.prototype.toString.call(value).slice(8, -1)\n}\n\nexport function isPlainObject(value: any): value is Record {\n if (getType(value) !== 'Object') {\n return false\n }\n\n return value.constructor === Object && Object.getPrototypeOf(value) === Object.prototype\n}\n","import { isPlainObject } from './isPlainObject.js'\n\nexport function mergeDeep(target: Record, source: Record): Record {\n const output = { ...target }\n\n if (isPlainObject(target) && isPlainObject(source)) {\n Object.keys(source).forEach(key => {\n if (isPlainObject(source[key])) {\n if (!(key in target)) {\n Object.assign(output, { [key]: source[key] })\n } else {\n output[key] = mergeDeep(target[key], source[key])\n }\n } else {\n Object.assign(output, { [key]: source[key] })\n }\n })\n }\n\n return output\n}\n","import { Plugin, Transaction } from '@tiptap/pm/state'\n\nimport { Editor } from './Editor.js'\nimport { getExtensionField } from './helpers/getExtensionField.js'\nimport { ExtensionConfig } from './index.js'\nimport { InputRule } from './InputRule.js'\nimport { Mark } from './Mark.js'\nimport { Node } from './Node.js'\nimport { PasteRule } from './PasteRule.js'\nimport {\n AnyConfig,\n Extensions,\n GlobalAttributes,\n KeyboardShortcutCommand,\n ParentConfig,\n RawCommands,\n} from './types.js'\nimport { callOrReturn } from './utilities/callOrReturn.js'\nimport { mergeDeep } from './utilities/mergeDeep.js'\n\ndeclare module '@tiptap/core' {\n interface ExtensionConfig {\n [key: string]: any\n\n /**\n * Name\n */\n name: string\n\n /**\n * Priority\n */\n priority?: number\n\n /**\n * Default options\n */\n defaultOptions?: Options\n\n /**\n * Default Options\n */\n addOptions?: (this: {\n name: string\n parent: Exclude>['addOptions'], undefined>\n }) => Options\n\n /**\n * Default Storage\n */\n addStorage?: (this: {\n name: string\n options: Options\n parent: Exclude>['addStorage'], undefined>\n }) => Storage\n\n /**\n * Global attributes\n */\n addGlobalAttributes?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['addGlobalAttributes']\n }) => GlobalAttributes | {}\n\n /**\n * Raw\n */\n addCommands?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n parent: ParentConfig>['addCommands']\n }) => Partial\n\n /**\n * Keyboard shortcuts\n */\n addKeyboardShortcuts?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n parent: ParentConfig>['addKeyboardShortcuts']\n }) => {\n [key: string]: KeyboardShortcutCommand\n }\n\n /**\n * Input rules\n */\n addInputRules?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n parent: ParentConfig>['addInputRules']\n }) => InputRule[]\n\n /**\n * Paste rules\n */\n addPasteRules?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n parent: ParentConfig>['addPasteRules']\n }) => PasteRule[]\n\n /**\n * ProseMirror plugins\n */\n addProseMirrorPlugins?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n parent: ParentConfig>['addProseMirrorPlugins']\n }) => Plugin[]\n\n /**\n * Extensions\n */\n addExtensions?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['addExtensions']\n }) => Extensions\n\n /**\n * Extend Node Schema\n */\n extendNodeSchema?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['extendNodeSchema']\n },\n extension: Node,\n ) => Record)\n | null\n\n /**\n * Extend Mark Schema\n */\n extendMarkSchema?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['extendMarkSchema']\n },\n extension: Mark,\n ) => Record)\n | null\n\n /**\n * The editor is not ready yet.\n */\n onBeforeCreate?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n parent: ParentConfig>['onBeforeCreate']\n }) => void)\n | null\n\n /**\n * The editor is ready.\n */\n onCreate?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n parent: ParentConfig>['onCreate']\n }) => void)\n | null\n\n /**\n * The content has changed.\n */\n onUpdate?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n parent: ParentConfig>['onUpdate']\n }) => void)\n | null\n\n /**\n * The selection has changed.\n */\n onSelectionUpdate?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n parent: ParentConfig>['onSelectionUpdate']\n }) => void)\n | null\n\n /**\n * The editor state has changed.\n */\n onTransaction?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n parent: ParentConfig>['onTransaction']\n },\n props: {\n transaction: Transaction\n },\n ) => void)\n | null\n\n /**\n * The editor is focused.\n */\n onFocus?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n parent: ParentConfig>['onFocus']\n },\n props: {\n event: FocusEvent\n },\n ) => void)\n | null\n\n /**\n * The editor isn’t focused anymore.\n */\n onBlur?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n parent: ParentConfig>['onBlur']\n },\n props: {\n event: FocusEvent\n },\n ) => void)\n | null\n\n /**\n * The editor is destroyed.\n */\n onDestroy?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n parent: ParentConfig>['onDestroy']\n }) => void)\n | null\n }\n}\n\nexport class Extension {\n type = 'extension'\n\n name = 'extension'\n\n parent: Extension | null = null\n\n child: Extension | null = null\n\n options: Options\n\n storage: Storage\n\n config: ExtensionConfig = {\n name: this.name,\n defaultOptions: {},\n }\n\n constructor(config: Partial> = {}) {\n this.config = {\n ...this.config,\n ...config,\n }\n\n this.name = this.config.name\n\n if (config.defaultOptions) {\n console.warn(\n `[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${this.name}\".`,\n )\n }\n\n // TODO: remove `addOptions` fallback\n this.options = this.config.defaultOptions\n\n if (this.config.addOptions) {\n this.options = callOrReturn(\n getExtensionField(this, 'addOptions', {\n name: this.name,\n }),\n )\n }\n\n this.storage = callOrReturn(\n getExtensionField(this, 'addStorage', {\n name: this.name,\n options: this.options,\n }),\n ) || {}\n }\n\n static create(config: Partial> = {}) {\n return new Extension(config)\n }\n\n configure(options: Partial = {}) {\n // return a new instance so we can use the same extension\n // with different calls of `configure`\n const extension = this.extend()\n\n extension.options = mergeDeep(this.options as Record, options) as Options\n\n extension.storage = callOrReturn(\n getExtensionField(extension, 'addStorage', {\n name: extension.name,\n options: extension.options,\n }),\n )\n\n return extension\n }\n\n extend(\n extendedConfig: Partial> = {},\n ) {\n const extension = new Extension(extendedConfig)\n\n extension.parent = this\n\n this.child = extension\n\n extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name\n\n if (extendedConfig.defaultOptions) {\n console.warn(\n `[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${extension.name}\".`,\n )\n }\n\n extension.options = callOrReturn(\n getExtensionField(extension, 'addOptions', {\n name: extension.name,\n }),\n )\n\n extension.storage = callOrReturn(\n getExtensionField(extension, 'addStorage', {\n name: extension.name,\n options: extension.options,\n }),\n )\n\n return extension\n }\n}\n","import { Node as ProseMirrorNode } from '@tiptap/pm/model'\n\nimport { Range, TextSerializer } from '../types.js'\n\nexport function getTextBetween(\n startNode: ProseMirrorNode,\n range: Range,\n options?: {\n blockSeparator?: string\n textSerializers?: Record\n },\n): string {\n const { from, to } = range\n const { blockSeparator = '\\n\\n', textSerializers = {} } = options || {}\n let text = ''\n let separated = true\n\n startNode.nodesBetween(from, to, (node, pos, parent, index) => {\n const textSerializer = textSerializers?.[node.type.name]\n\n if (textSerializer) {\n if (node.isBlock && !separated) {\n text += blockSeparator\n separated = true\n }\n\n if (parent) {\n text += textSerializer({\n node,\n pos,\n parent,\n index,\n range,\n })\n }\n } else if (node.isText) {\n text += node?.text?.slice(Math.max(from, pos) - pos, to - pos) // eslint-disable-line\n separated = false\n } else if (node.isBlock && !separated) {\n text += blockSeparator\n separated = true\n }\n })\n\n return text\n}\n","import { Schema } from '@tiptap/pm/model'\n\nimport { TextSerializer } from '../types.js'\n\nexport function getTextSerializersFromSchema(schema: Schema): Record {\n return Object.fromEntries(\n Object.entries(schema.nodes)\n .filter(([, node]) => node.spec.toText)\n .map(([name, node]) => [name, node.spec.toText]),\n )\n}\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\nimport { getTextBetween } from '../helpers/getTextBetween.js'\nimport { getTextSerializersFromSchema } from '../helpers/getTextSerializersFromSchema.js'\n\nexport const ClipboardTextSerializer = Extension.create({\n name: 'clipboardTextSerializer',\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('clipboardTextSerializer'),\n props: {\n clipboardTextSerializer: () => {\n const { editor } = this\n const { state, schema } = editor\n const { doc, selection } = state\n const { ranges } = selection\n const from = Math.min(...ranges.map(range => range.$from.pos))\n const to = Math.max(...ranges.map(range => range.$to.pos))\n const textSerializers = getTextSerializersFromSchema(schema)\n const range = { from, to }\n\n return getTextBetween(doc, range, {\n textSerializers,\n })\n },\n },\n }),\n ]\n },\n})\n","import { isRegExp } from './isRegExp.js'\n\n/**\n * Check if object1 includes object2\n * @param object1 Object\n * @param object2 Object\n */\nexport function objectIncludes(\n object1: Record,\n object2: Record,\n options: { strict: boolean } = { strict: true },\n): boolean {\n const keys = Object.keys(object2)\n\n if (!keys.length) {\n return true\n }\n\n return keys.every(key => {\n if (options.strict) {\n return object2[key] === object1[key]\n }\n\n if (isRegExp(object2[key])) {\n return object2[key].test(object1[key])\n }\n\n return object2[key] === object1[key]\n })\n}\n","import { Mark as ProseMirrorMark, MarkType, ResolvedPos } from '@tiptap/pm/model'\n\nimport { Range } from '../types.js'\nimport { objectIncludes } from '../utilities/objectIncludes.js'\n\nfunction findMarkInSet(\n marks: ProseMirrorMark[],\n type: MarkType,\n attributes: Record = {},\n): ProseMirrorMark | undefined {\n return marks.find(item => {\n return item.type === type && objectIncludes(item.attrs, attributes)\n })\n}\n\nfunction isMarkInSet(\n marks: ProseMirrorMark[],\n type: MarkType,\n attributes: Record = {},\n): boolean {\n return !!findMarkInSet(marks, type, attributes)\n}\n\nexport function getMarkRange(\n $pos: ResolvedPos,\n type: MarkType,\n attributes: Record = {},\n): Range | void {\n if (!$pos || !type) {\n return\n }\n\n let start = $pos.parent.childAfter($pos.parentOffset)\n\n if ($pos.parentOffset === start.offset && start.offset !== 0) {\n start = $pos.parent.childBefore($pos.parentOffset)\n }\n\n if (!start.node) {\n return\n }\n\n const mark = findMarkInSet([...start.node.marks], type, attributes)\n\n if (!mark) {\n return\n }\n\n let startIndex = start.index\n let startPos = $pos.start() + start.offset\n let endIndex = startIndex + 1\n let endPos = startPos + start.node.nodeSize\n\n findMarkInSet([...start.node.marks], type, attributes)\n\n while (startIndex > 0 && mark.isInSet($pos.parent.child(startIndex - 1).marks)) {\n startIndex -= 1\n startPos -= $pos.parent.child(startIndex).nodeSize\n }\n\n while (\n endIndex < $pos.parent.childCount\n && isMarkInSet([...$pos.parent.child(endIndex).marks], type, attributes)\n ) {\n endPos += $pos.parent.child(endIndex).nodeSize\n endIndex += 1\n }\n\n return {\n from: startPos,\n to: endPos,\n }\n}\n","import { MarkType, Schema } from '@tiptap/pm/model'\n\nexport function getMarkType(nameOrType: string | MarkType, schema: Schema): MarkType {\n if (typeof nameOrType === 'string') {\n if (!schema.marks[nameOrType]) {\n throw Error(\n `There is no mark type named '${nameOrType}'. Maybe you forgot to add the extension?`,\n )\n }\n\n return schema.marks[nameOrType]\n }\n\n return nameOrType\n}\n","import { TextSelection } from '@tiptap/pm/state'\n\nexport function isTextSelection(value: unknown): value is TextSelection {\n return value instanceof TextSelection\n}\n","export function minMax(value = 0, min = 0, max = 0): number {\n return Math.min(Math.max(value, min), max)\n}\n","import { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport { Selection, TextSelection } from '@tiptap/pm/state'\n\nimport { FocusPosition } from '../types.js'\nimport { minMax } from '../utilities/minMax.js'\n\nexport function resolveFocusPosition(\n doc: ProseMirrorNode,\n position: FocusPosition = null,\n): Selection | null {\n if (!position) {\n return null\n }\n\n const selectionAtStart = Selection.atStart(doc)\n const selectionAtEnd = Selection.atEnd(doc)\n\n if (position === 'start' || position === true) {\n return selectionAtStart\n }\n\n if (position === 'end') {\n return selectionAtEnd\n }\n\n const minPos = selectionAtStart.from\n const maxPos = selectionAtEnd.to\n\n if (position === 'all') {\n return TextSelection.create(\n doc,\n minMax(0, minPos, maxPos),\n minMax(doc.content.size, minPos, maxPos),\n )\n }\n\n return TextSelection.create(\n doc,\n minMax(position, minPos, maxPos),\n minMax(position, minPos, maxPos),\n )\n}\n","export function isiOS(): boolean {\n return [\n 'iPad Simulator',\n 'iPhone Simulator',\n 'iPod Simulator',\n 'iPad',\n 'iPhone',\n 'iPod',\n ].includes(navigator.platform)\n // iPad on iOS 13 detection\n || (navigator.userAgent.includes('Mac') && 'ontouchend' in document)\n}\n","export function elementFromString(value: string): HTMLElement {\n // add a wrapper to preserve leading and trailing whitespace\n const wrappedValue = `${value}`\n\n return new window.DOMParser().parseFromString(wrappedValue, 'text/html').body\n}\n","import {\n DOMParser,\n Fragment,\n Node as ProseMirrorNode,\n ParseOptions,\n Schema,\n} from '@tiptap/pm/model'\n\nimport { Content } from '../types.js'\nimport { elementFromString } from '../utilities/elementFromString.js'\n\nexport type CreateNodeFromContentOptions = {\n slice?: boolean\n parseOptions?: ParseOptions\n}\n\nexport function createNodeFromContent(\n content: Content,\n schema: Schema,\n options?: CreateNodeFromContentOptions,\n): ProseMirrorNode | Fragment {\n options = {\n slice: true,\n parseOptions: {},\n ...options,\n }\n\n if (typeof content === 'object' && content !== null) {\n try {\n if (Array.isArray(content) && content.length > 0) {\n return Fragment.fromArray(content.map(item => schema.nodeFromJSON(item)))\n }\n\n return schema.nodeFromJSON(content)\n } catch (error) {\n console.warn('[tiptap warn]: Invalid content.', 'Passed value:', content, 'Error:', error)\n\n return createNodeFromContent('', schema, options)\n }\n }\n\n if (typeof content === 'string') {\n const parser = DOMParser.fromSchema(schema)\n\n return options.slice\n ? parser.parseSlice(elementFromString(content), options.parseOptions).content\n : parser.parse(elementFromString(content), options.parseOptions)\n }\n\n return createNodeFromContent('', schema, options)\n}\n","export function isMacOS(): boolean {\n return typeof navigator !== 'undefined'\n ? /Mac/.test(navigator.platform)\n : false\n}\n","import { NodeType } from '@tiptap/pm/model'\nimport { EditorState } from '@tiptap/pm/state'\n\nimport { NodeRange } from '../types.js'\nimport { objectIncludes } from '../utilities/objectIncludes.js'\nimport { getNodeType } from './getNodeType.js'\n\nexport function isNodeActive(\n state: EditorState,\n typeOrName: NodeType | string | null,\n attributes: Record = {},\n): boolean {\n const { from, to, empty } = state.selection\n const type = typeOrName ? getNodeType(typeOrName, state.schema) : null\n\n const nodeRanges: NodeRange[] = []\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isText) {\n return\n }\n\n const relativeFrom = Math.max(from, pos)\n const relativeTo = Math.min(to, pos + node.nodeSize)\n\n nodeRanges.push({\n node,\n from: relativeFrom,\n to: relativeTo,\n })\n })\n\n const selectionRange = to - from\n const matchedNodeRanges = nodeRanges\n .filter(nodeRange => {\n if (!type) {\n return true\n }\n\n return type.name === nodeRange.node.type.name\n })\n .filter(nodeRange => objectIncludes(nodeRange.node.attrs, attributes, { strict: false }))\n\n if (empty) {\n return !!matchedNodeRanges.length\n }\n\n const range = matchedNodeRanges.reduce((sum, nodeRange) => sum + nodeRange.to - nodeRange.from, 0)\n\n return range >= selectionRange\n}\n","import { Schema } from '@tiptap/pm/model'\n\nexport function getSchemaTypeNameByName(name: string, schema: Schema): 'node' | 'mark' | null {\n if (schema.nodes[name]) {\n return 'node'\n }\n\n if (schema.marks[name]) {\n return 'mark'\n }\n\n return null\n}\n","/**\n * Remove a property or an array of properties from an object\n * @param obj Object\n * @param key Key to remove\n */\nexport function deleteProps(obj: Record, propOrProps: string | string[]): Record {\n const props = typeof propOrProps === 'string'\n ? [propOrProps]\n : propOrProps\n\n return Object\n .keys(obj)\n .reduce((newObj: Record, prop) => {\n if (!props.includes(prop)) {\n newObj[prop] = obj[prop]\n }\n\n return newObj\n }, {})\n}\n","import { Node as ProseMirrorNode, ParseOptions, Schema } from '@tiptap/pm/model'\n\nimport { Content } from '../types.js'\nimport { createNodeFromContent } from './createNodeFromContent.js'\n\nexport function createDocument(\n content: Content,\n schema: Schema,\n parseOptions: ParseOptions = {},\n): ProseMirrorNode {\n return createNodeFromContent(content, schema, { slice: false, parseOptions }) as ProseMirrorNode\n}\n","import { Mark, MarkType } from '@tiptap/pm/model'\nimport { EditorState } from '@tiptap/pm/state'\n\nimport { getMarkType } from './getMarkType.js'\n\nexport function getMarkAttributes(\n state: EditorState,\n typeOrName: string | MarkType,\n): Record {\n const type = getMarkType(typeOrName, state.schema)\n const { from, to, empty } = state.selection\n const marks: Mark[] = []\n\n if (empty) {\n if (state.storedMarks) {\n marks.push(...state.storedMarks)\n }\n\n marks.push(...state.selection.$head.marks())\n } else {\n state.doc.nodesBetween(from, to, node => {\n marks.push(...node.marks)\n })\n }\n\n const mark = marks.find(markItem => markItem.type.name === type.name)\n\n if (!mark) {\n return {}\n }\n\n return { ...mark.attrs }\n}\n","import { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport { Transaction } from '@tiptap/pm/state'\nimport { Transform } from '@tiptap/pm/transform'\n\n/**\n * Returns a new `Transform` based on all steps of the passed transactions.\n */\nexport function combineTransactionSteps(\n oldDoc: ProseMirrorNode,\n transactions: Transaction[],\n): Transform {\n const transform = new Transform(oldDoc)\n\n transactions.forEach(transaction => {\n transaction.steps.forEach(step => {\n transform.step(step)\n })\n })\n\n return transform\n}\n","import { Node as ProseMirrorNode } from '@tiptap/pm/model'\n\nimport { NodeWithPos, Predicate, Range } from '../types.js'\n\n/**\n * Same as `findChildren` but searches only within a `range`.\n */\nexport function findChildrenInRange(\n node: ProseMirrorNode,\n range: Range,\n predicate: Predicate,\n): NodeWithPos[] {\n const nodesWithPos: NodeWithPos[] = []\n\n // if (range.from === range.to) {\n // const nodeAt = node.nodeAt(range.from)\n\n // if (nodeAt) {\n // nodesWithPos.push({\n // node: nodeAt,\n // pos: range.from,\n // })\n // }\n // }\n\n node.nodesBetween(range.from, range.to, (child, pos) => {\n if (predicate(child)) {\n nodesWithPos.push({\n node: child,\n pos,\n })\n }\n })\n\n return nodesWithPos\n}\n","import { Selection } from '@tiptap/pm/state'\n\nimport { Predicate } from '../types.js'\nimport { findParentNodeClosestToPos } from './findParentNodeClosestToPos.js'\n\nexport function findParentNode(predicate: Predicate) {\n return (selection: Selection) => findParentNodeClosestToPos(selection.$from, predicate)\n}\n","import { Node as ProseMirrorNode, ResolvedPos } from '@tiptap/pm/model'\n\nimport { Predicate } from '../types.js'\n\nexport function findParentNodeClosestToPos(\n $pos: ResolvedPos,\n predicate: Predicate,\n):\n | {\n pos: number\n start: number\n depth: number\n node: ProseMirrorNode\n }\n | undefined {\n for (let i = $pos.depth; i > 0; i -= 1) {\n const node = $pos.node(i)\n\n if (predicate(node)) {\n return {\n pos: i > 0 ? $pos.before(i) : 0,\n start: $pos.start(i),\n depth: i,\n node,\n }\n }\n }\n}\n","import { MarkType, NodeType } from '@tiptap/pm/model'\nimport { EditorState } from '@tiptap/pm/state'\n\nimport { getMarkAttributes } from './getMarkAttributes.js'\nimport { getNodeAttributes } from './getNodeAttributes.js'\nimport { getSchemaTypeNameByName } from './getSchemaTypeNameByName.js'\n\nexport function getAttributes(\n state: EditorState,\n typeOrName: string | NodeType | MarkType,\n): Record {\n const schemaType = getSchemaTypeNameByName(\n typeof typeOrName === 'string' ? typeOrName : typeOrName.name,\n state.schema,\n )\n\n if (schemaType === 'node') {\n return getNodeAttributes(state, typeOrName as NodeType)\n }\n\n if (schemaType === 'mark') {\n return getMarkAttributes(state, typeOrName as MarkType)\n }\n\n return {}\n}\n","import { Node, NodeType } from '@tiptap/pm/model'\nimport { EditorState } from '@tiptap/pm/state'\n\nimport { getNodeType } from './getNodeType.js'\n\nexport function getNodeAttributes(\n state: EditorState,\n typeOrName: string | NodeType,\n): Record {\n const type = getNodeType(typeOrName, state.schema)\n const { from, to } = state.selection\n const nodes: Node[] = []\n\n state.doc.nodesBetween(from, to, node => {\n nodes.push(node)\n })\n\n const node = nodes.reverse().find(nodeItem => nodeItem.type.name === type.name)\n\n if (!node) {\n return {}\n }\n\n return { ...node.attrs }\n}\n","import { Step, Transform } from '@tiptap/pm/transform'\n\nimport { Range } from '../types.js'\nimport { removeDuplicates } from '../utilities/removeDuplicates.js'\n\nexport type ChangedRange = {\n oldRange: Range,\n newRange: Range,\n}\n\n/**\n * Removes duplicated ranges and ranges that are\n * fully captured by other ranges.\n */\nfunction simplifyChangedRanges(changes: ChangedRange[]): ChangedRange[] {\n const uniqueChanges = removeDuplicates(changes)\n\n return uniqueChanges.length === 1\n ? uniqueChanges\n : uniqueChanges.filter((change, index) => {\n const rest = uniqueChanges.filter((_, i) => i !== index)\n\n return !rest.some(otherChange => {\n return change.oldRange.from >= otherChange.oldRange.from\n && change.oldRange.to <= otherChange.oldRange.to\n && change.newRange.from >= otherChange.newRange.from\n && change.newRange.to <= otherChange.newRange.to\n })\n })\n}\n\n/**\n * Returns a list of changed ranges\n * based on the first and last state of all steps.\n */\nexport function getChangedRanges(transform: Transform): ChangedRange[] {\n const { mapping, steps } = transform\n const changes: ChangedRange[] = []\n\n mapping.maps.forEach((stepMap, index) => {\n const ranges: Range[] = []\n\n // This accounts for step changes where no range was actually altered\n // e.g. when setting a mark, node attribute, etc.\n // @ts-ignore\n if (!stepMap.ranges.length) {\n const { from, to } = steps[index] as Step & {\n from?: number,\n to?: number,\n }\n\n if (from === undefined || to === undefined) {\n return\n }\n\n ranges.push({ from, to })\n } else {\n stepMap.forEach((from, to) => {\n ranges.push({ from, to })\n })\n }\n\n ranges.forEach(({ from, to }) => {\n const newStart = mapping.slice(index).map(from, -1)\n const newEnd = mapping.slice(index).map(to)\n const oldStart = mapping.invert().map(newStart, -1)\n const oldEnd = mapping.invert().map(newEnd)\n\n changes.push({\n oldRange: {\n from: oldStart,\n to: oldEnd,\n },\n newRange: {\n from: newStart,\n to: newEnd,\n },\n })\n })\n })\n\n return simplifyChangedRanges(changes)\n}\n","/**\n * Removes duplicated values within an array.\n * Supports numbers, strings and objects.\n */\nexport function removeDuplicates(array: T[], by = JSON.stringify): T[] {\n const seen: Record = {}\n\n return array.filter(item => {\n const key = by(item)\n\n return Object.prototype.hasOwnProperty.call(seen, key)\n ? false\n : (seen[key] = true)\n })\n}\n","import { Node as ProseMirrorNode } from '@tiptap/pm/model'\n\nimport { MarkRange } from '../types.js'\nimport { getMarkRange } from './getMarkRange.js'\n\nexport function getMarksBetween(from: number, to: number, doc: ProseMirrorNode): MarkRange[] {\n const marks: MarkRange[] = []\n\n // get all inclusive marks on empty selection\n if (from === to) {\n doc\n .resolve(from)\n .marks()\n .forEach(mark => {\n const $pos = doc.resolve(from - 1)\n const range = getMarkRange($pos, mark.type)\n\n if (!range) {\n return\n }\n\n marks.push({\n mark,\n ...range,\n })\n })\n } else {\n doc.nodesBetween(from, to, (node, pos) => {\n marks.push(\n ...node.marks.map(mark => ({\n from: pos,\n to: pos + node.nodeSize,\n mark,\n })),\n )\n })\n }\n\n return marks\n}\n","import { ExtensionAttribute } from '../types.js'\n\nexport function getSplittedAttributes(\n extensionAttributes: ExtensionAttribute[],\n typeName: string,\n attributes: Record,\n): Record {\n return Object.fromEntries(Object\n .entries(attributes)\n .filter(([name]) => {\n const extensionAttribute = extensionAttributes.find(item => {\n return item.type === typeName && item.name === name\n })\n\n if (!extensionAttribute) {\n return false\n }\n\n return extensionAttribute.attribute.keepOnSplit\n }))\n}\n","import { MarkType } from '@tiptap/pm/model'\nimport { EditorState } from '@tiptap/pm/state'\n\nimport { MarkRange } from '../types.js'\nimport { objectIncludes } from '../utilities/objectIncludes.js'\nimport { getMarkType } from './getMarkType.js'\n\nexport function isMarkActive(\n state: EditorState,\n typeOrName: MarkType | string | null,\n attributes: Record = {},\n): boolean {\n const { empty, ranges } = state.selection\n const type = typeOrName ? getMarkType(typeOrName, state.schema) : null\n\n if (empty) {\n return !!(state.storedMarks || state.selection.$from.marks())\n .filter(mark => {\n if (!type) {\n return true\n }\n\n return type.name === mark.type.name\n })\n .find(mark => objectIncludes(mark.attrs, attributes, { strict: false }))\n }\n\n let selectionRange = 0\n const markRanges: MarkRange[] = []\n\n ranges.forEach(({ $from, $to }) => {\n const from = $from.pos\n const to = $to.pos\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isText && !node.marks.length) {\n return\n }\n\n const relativeFrom = Math.max(from, pos)\n const relativeTo = Math.min(to, pos + node.nodeSize)\n const range = relativeTo - relativeFrom\n\n selectionRange += range\n\n markRanges.push(\n ...node.marks.map(mark => ({\n mark,\n from: relativeFrom,\n to: relativeTo,\n })),\n )\n })\n })\n\n if (selectionRange === 0) {\n return false\n }\n\n // calculate range of matched mark\n const matchedRange = markRanges\n .filter(markRange => {\n if (!type) {\n return true\n }\n\n return type.name === markRange.mark.type.name\n })\n .filter(markRange => objectIncludes(markRange.mark.attrs, attributes, { strict: false }))\n .reduce((sum, markRange) => sum + markRange.to - markRange.from, 0)\n\n // calculate range of marks that excludes the searched mark\n // for example `code` doesn’t allow any other marks\n const excludedRange = markRanges\n .filter(markRange => {\n if (!type) {\n return true\n }\n\n return markRange.mark.type !== type && markRange.mark.type.excludes(type)\n })\n .reduce((sum, markRange) => sum + markRange.to - markRange.from, 0)\n\n // we only include the result of `excludedRange`\n // if there is a match at all\n const range = matchedRange > 0 ? matchedRange + excludedRange : matchedRange\n\n return range >= selectionRange\n}\n","import { getExtensionField } from '../helpers/getExtensionField.js'\nimport { NodeConfig } from '../index.js'\nimport { Extensions } from '../types.js'\nimport { callOrReturn } from '../utilities/callOrReturn.js'\nimport { splitExtensions } from './splitExtensions.js'\n\nexport function isList(name: string, extensions: Extensions): boolean {\n const { nodeExtensions } = splitExtensions(extensions)\n const extension = nodeExtensions.find(item => item.name === name)\n\n if (!extension) {\n return false\n }\n\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n }\n const group = callOrReturn(getExtensionField(extension, 'group', context))\n\n if (typeof group !== 'string') {\n return false\n }\n\n return group.split(' ').includes('list')\n}\n","import { NodeSelection } from '@tiptap/pm/state'\n\nexport function isNodeSelection(value: unknown): value is NodeSelection {\n return value instanceof NodeSelection\n}\n","import { EditorView } from '@tiptap/pm/view'\n\nimport { minMax } from '../utilities/minMax.js'\n\nexport function posToDOMRect(view: EditorView, from: number, to: number): DOMRect {\n const minPos = 0\n const maxPos = view.state.doc.content.size\n const resolvedFrom = minMax(from, minPos, maxPos)\n const resolvedEnd = minMax(to, minPos, maxPos)\n const start = view.coordsAtPos(resolvedFrom)\n const end = view.coordsAtPos(resolvedEnd, -1)\n const top = Math.min(start.top, end.top)\n const bottom = Math.max(start.bottom, end.bottom)\n const left = Math.min(start.left, end.left)\n const right = Math.max(start.right, end.right)\n const width = right - left\n const height = bottom - top\n const x = left\n const y = top\n const data = {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x,\n y,\n }\n\n return {\n ...data,\n toJSON: () => data,\n }\n}\n","import { EditorState, NodeSelection, TextSelection } from '@tiptap/pm/state'\nimport { canSplit } from '@tiptap/pm/transform'\n\nimport { defaultBlockAt } from '../helpers/defaultBlockAt.js'\nimport { getSplittedAttributes } from '../helpers/getSplittedAttributes.js'\nimport { RawCommands } from '../types.js'\n\nfunction ensureMarks(state: EditorState, splittableMarks?: string[]) {\n const marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks())\n\n if (marks) {\n const filteredMarks = marks.filter(mark => splittableMarks?.includes(mark.type.name))\n\n state.tr.ensureMarks(filteredMarks)\n }\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n splitBlock: {\n /**\n * Forks a new node from an existing node.\n */\n splitBlock: (options?: { keepMarks?: boolean }) => ReturnType\n }\n }\n}\n\nexport const splitBlock: RawCommands['splitBlock'] = ({ keepMarks = true } = {}) => ({\n tr, state, dispatch, editor,\n}) => {\n const { selection, doc } = tr\n const { $from, $to } = selection\n const extensionAttributes = editor.extensionManager.attributes\n const newAttributes = getSplittedAttributes(\n extensionAttributes,\n $from.node().type.name,\n $from.node().attrs,\n )\n\n if (selection instanceof NodeSelection && selection.node.isBlock) {\n if (!$from.parentOffset || !canSplit(doc, $from.pos)) {\n return false\n }\n\n if (dispatch) {\n if (keepMarks) {\n ensureMarks(state, editor.extensionManager.splittableMarks)\n }\n\n tr.split($from.pos).scrollIntoView()\n }\n\n return true\n }\n\n if (!$from.parent.isBlock) {\n return false\n }\n\n if (dispatch) {\n const atEnd = $to.parentOffset === $to.parent.content.size\n\n if (selection instanceof TextSelection) {\n tr.deleteSelection()\n }\n\n const deflt = $from.depth === 0\n ? undefined\n : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1)))\n\n let types = atEnd && deflt\n ? [\n {\n type: deflt,\n attrs: newAttributes,\n },\n ]\n : undefined\n\n let can = canSplit(tr.doc, tr.mapping.map($from.pos), 1, types)\n\n if (\n !types\n && !can\n && canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : undefined)\n ) {\n can = true\n types = deflt\n ? [\n {\n type: deflt,\n attrs: newAttributes,\n },\n ]\n : undefined\n }\n\n if (can) {\n tr.split(tr.mapping.map($from.pos), 1, types)\n\n if (deflt && !atEnd && !$from.parentOffset && $from.parent.type !== deflt) {\n const first = tr.mapping.map($from.before())\n const $first = tr.doc.resolve(first)\n\n if ($from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt)) {\n tr.setNodeMarkup(tr.mapping.map($from.before()), deflt)\n }\n }\n }\n\n if (keepMarks) {\n ensureMarks(state, editor.extensionManager.splittableMarks)\n }\n\n tr.scrollIntoView()\n }\n\n return true\n}\n","import { NodeType } from '@tiptap/pm/model'\nimport { Transaction } from '@tiptap/pm/state'\nimport { canJoin } from '@tiptap/pm/transform'\n\nimport { findParentNode } from '../helpers/findParentNode.js'\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { isList } from '../helpers/isList.js'\nimport { RawCommands } from '../types.js'\n\nconst joinListBackwards = (tr: Transaction, listType: NodeType): boolean => {\n const list = findParentNode(node => node.type === listType)(tr.selection)\n\n if (!list) {\n return true\n }\n\n const before = tr.doc.resolve(Math.max(0, list.pos - 1)).before(list.depth)\n\n if (before === undefined) {\n return true\n }\n\n const nodeBefore = tr.doc.nodeAt(before)\n const canJoinBackwards = list.node.type === nodeBefore?.type && canJoin(tr.doc, list.pos)\n\n if (!canJoinBackwards) {\n return true\n }\n\n tr.join(list.pos)\n\n return true\n}\n\nconst joinListForwards = (tr: Transaction, listType: NodeType): boolean => {\n const list = findParentNode(node => node.type === listType)(tr.selection)\n\n if (!list) {\n return true\n }\n\n const after = tr.doc.resolve(list.start).after(list.depth)\n\n if (after === undefined) {\n return true\n }\n\n const nodeAfter = tr.doc.nodeAt(after)\n const canJoinForwards = list.node.type === nodeAfter?.type && canJoin(tr.doc, after)\n\n if (!canJoinForwards) {\n return true\n }\n\n tr.join(after)\n\n return true\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n toggleList: {\n /**\n * Toggle between different list types.\n */\n toggleList: (listTypeOrName: string | NodeType, itemTypeOrName: string | NodeType, keepMarks?: boolean, attributes?: Record) => ReturnType;\n }\n }\n}\n\nexport const toggleList: RawCommands['toggleList'] = (listTypeOrName, itemTypeOrName, keepMarks, attributes = {}) => ({\n editor, tr, state, dispatch, chain, commands, can,\n}) => {\n const { extensions, splittableMarks } = editor.extensionManager\n const listType = getNodeType(listTypeOrName, state.schema)\n const itemType = getNodeType(itemTypeOrName, state.schema)\n const { selection, storedMarks } = state\n const { $from, $to } = selection\n const range = $from.blockRange($to)\n\n const marks = storedMarks || (selection.$to.parentOffset && selection.$from.marks())\n\n if (!range) {\n return false\n }\n\n const parentList = findParentNode(node => isList(node.type.name, extensions))(selection)\n\n if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) {\n // remove list\n if (parentList.node.type === listType) {\n return commands.liftListItem(itemType)\n }\n\n // change list type\n if (\n isList(parentList.node.type.name, extensions)\n && listType.validContent(parentList.node.content)\n && dispatch\n ) {\n return chain()\n .command(() => {\n tr.setNodeMarkup(parentList.pos, listType)\n\n return true\n })\n .command(() => joinListBackwards(tr, listType))\n .command(() => joinListForwards(tr, listType))\n .run()\n }\n }\n if (!keepMarks || !marks || !dispatch) {\n\n return chain()\n // try to convert node to default node if needed\n .command(() => {\n const canWrapInList = can().wrapInList(listType, attributes)\n\n if (canWrapInList) {\n return true\n }\n\n return commands.clearNodes()\n })\n .wrapInList(listType, attributes)\n .command(() => joinListBackwards(tr, listType))\n .command(() => joinListForwards(tr, listType))\n .run()\n }\n\n return (\n chain()\n // try to convert node to default node if needed\n .command(() => {\n const canWrapInList = can().wrapInList(listType, attributes)\n\n const filteredMarks = marks.filter(mark => splittableMarks.includes(mark.type.name))\n\n tr.ensureMarks(filteredMarks)\n\n if (canWrapInList) {\n return true\n }\n\n return commands.clearNodes()\n })\n .wrapInList(listType, attributes)\n .command(() => joinListBackwards(tr, listType))\n .command(() => joinListForwards(tr, listType))\n .run()\n )\n}\n","import { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n blur: {\n /**\n * Removes focus from the editor.\n */\n blur: () => ReturnType,\n }\n }\n}\n\nexport const blur: RawCommands['blur'] = () => ({ editor, view }) => {\n requestAnimationFrame(() => {\n if (!editor.isDestroyed) {\n (view.dom as HTMLElement).blur()\n\n // Browsers should remove the caret on blur but safari does not.\n // See: https://github.com/ueberdosis/tiptap/issues/2405\n window?.getSelection()?.removeAllRanges()\n }\n })\n\n return true\n}\n","import { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n clearContent: {\n /**\n * Clear the whole document.\n */\n clearContent: (emitUpdate?: boolean) => ReturnType,\n }\n }\n}\n\nexport const clearContent: RawCommands['clearContent'] = (emitUpdate = false) => ({ commands }) => {\n return commands.setContent('', emitUpdate)\n}\n","import { liftTarget } from '@tiptap/pm/transform'\n\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n clearNodes: {\n /**\n * Normalize nodes to a simple paragraph.\n */\n clearNodes: () => ReturnType,\n }\n }\n}\n\nexport const clearNodes: RawCommands['clearNodes'] = () => ({ state, tr, dispatch }) => {\n const { selection } = tr\n const { ranges } = selection\n\n if (!dispatch) {\n return true\n }\n\n ranges.forEach(({ $from, $to }) => {\n state.doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n if (node.type.isText) {\n return\n }\n\n const { doc, mapping } = tr\n const $mappedFrom = doc.resolve(mapping.map(pos))\n const $mappedTo = doc.resolve(mapping.map(pos + node.nodeSize))\n const nodeRange = $mappedFrom.blockRange($mappedTo)\n\n if (!nodeRange) {\n return\n }\n\n const targetLiftDepth = liftTarget(nodeRange)\n\n if (node.type.isTextblock) {\n const { defaultType } = $mappedFrom.parent.contentMatchAt($mappedFrom.index())\n\n tr.setNodeMarkup(nodeRange.start, defaultType)\n }\n\n if (targetLiftDepth || targetLiftDepth === 0) {\n tr.lift(nodeRange, targetLiftDepth)\n }\n })\n })\n\n return true\n}\n","import { Command, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n command: {\n /**\n * Define a command inline.\n */\n command: (fn: (props: Parameters[0]) => boolean) => ReturnType,\n }\n }\n}\n\nexport const command: RawCommands['command'] = fn => props => {\n return fn(props)\n}\n","import { createParagraphNear as originalCreateParagraphNear } from '@tiptap/pm/commands'\n\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n createParagraphNear: {\n /**\n * Create a paragraph nearby.\n */\n createParagraphNear: () => ReturnType\n }\n }\n}\n\nexport const createParagraphNear: RawCommands['createParagraphNear'] = () => ({ state, dispatch }) => {\n return originalCreateParagraphNear(state, dispatch)\n}\n","import { TextSelection } from '@tiptap/pm/state'\n\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n cut: {\n /**\n * Cuts content from a range and inserts it at a given position.\n */\n cut: ({ from, to }: { from: number, to: number }, targetPos: number) => ReturnType,\n }\n }\n}\n\nexport const cut: RawCommands['cut'] = (originRange, targetPos) => ({ editor, tr }) => {\n const { state } = editor\n\n const contentSlice = state.doc.slice(originRange.from, originRange.to)\n\n tr.deleteRange(originRange.from, originRange.to)\n const newPos = tr.mapping.map(targetPos)\n\n tr.insert(newPos, contentSlice.content)\n\n tr.setSelection(new TextSelection(tr.doc.resolve(newPos - 1)))\n\n return true\n}\n","import { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n deleteCurrentNode: {\n /**\n * Delete the node that currently has the selection anchor.\n */\n deleteCurrentNode: () => ReturnType,\n }\n }\n}\n\nexport const deleteCurrentNode: RawCommands['deleteCurrentNode'] = () => ({ tr, dispatch }) => {\n const { selection } = tr\n const currentNode = selection.$anchor.node()\n\n // if there is content inside the current node, break out of this command\n if (currentNode.content.size > 0) {\n return false\n }\n\n const $pos = tr.selection.$anchor\n\n for (let depth = $pos.depth; depth > 0; depth -= 1) {\n const node = $pos.node(depth)\n\n if (node.type === currentNode.type) {\n if (dispatch) {\n const from = $pos.before(depth)\n const to = $pos.after(depth)\n\n tr.delete(from, to).scrollIntoView()\n }\n\n return true\n }\n }\n\n return false\n}\n","import { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n deleteNode: {\n /**\n * Delete a node.\n */\n deleteNode: (typeOrName: string | NodeType) => ReturnType,\n }\n }\n}\n\nexport const deleteNode: RawCommands['deleteNode'] = typeOrName => ({ tr, state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n const $pos = tr.selection.$anchor\n\n for (let depth = $pos.depth; depth > 0; depth -= 1) {\n const node = $pos.node(depth)\n\n if (node.type === type) {\n if (dispatch) {\n const from = $pos.before(depth)\n const to = $pos.after(depth)\n\n tr.delete(from, to).scrollIntoView()\n }\n\n return true\n }\n }\n\n return false\n}\n","import { Range, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n deleteRange: {\n /**\n * Delete a given range.\n */\n deleteRange: (range: Range) => ReturnType,\n }\n }\n}\n\nexport const deleteRange: RawCommands['deleteRange'] = range => ({ tr, dispatch }) => {\n const { from, to } = range\n\n if (dispatch) {\n tr.delete(from, to)\n }\n\n return true\n}\n","import { deleteSelection as originalDeleteSelection } from '@tiptap/pm/commands'\n\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n deleteSelection: {\n /**\n * Delete the selection, if there is one.\n */\n deleteSelection: () => ReturnType\n }\n }\n}\n\nexport const deleteSelection: RawCommands['deleteSelection'] = () => ({ state, dispatch }) => {\n return originalDeleteSelection(state, dispatch)\n}\n","import { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n enter: {\n /**\n * Trigger enter.\n */\n enter: () => ReturnType,\n }\n }\n}\n\nexport const enter: RawCommands['enter'] = () => ({ commands }) => {\n return commands.keyboardShortcut('Enter')\n}\n","import { exitCode as originalExitCode } from '@tiptap/pm/commands'\n\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n exitCode: {\n /**\n * Exit from a code block.\n */\n exitCode: () => ReturnType\n }\n }\n}\n\nexport const exitCode: RawCommands['exitCode'] = () => ({ state, dispatch }) => {\n return originalExitCode(state, dispatch)\n}\n","import { MarkType } from '@tiptap/pm/model'\nimport { TextSelection } from '@tiptap/pm/state'\n\nimport { getMarkRange } from '../helpers/getMarkRange.js'\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n extendMarkRange: {\n /**\n * Extends the text selection to the current mark.\n */\n extendMarkRange: (\n typeOrName: string | MarkType,\n attributes?: Record,\n ) => ReturnType\n }\n }\n}\n\nexport const extendMarkRange: RawCommands['extendMarkRange'] = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {\n const type = getMarkType(typeOrName, state.schema)\n const { doc, selection } = tr\n const { $from, from, to } = selection\n\n if (dispatch) {\n const range = getMarkRange($from, type, attributes)\n\n if (range && range.from <= from && range.to >= to) {\n const newSelection = TextSelection.create(doc, range.from, range.to)\n\n tr.setSelection(newSelection)\n }\n }\n\n return true\n}\n","import { Command, CommandProps, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n first: {\n /**\n * Runs one command after the other and stops at the first which returns true.\n */\n first: (commands: Command[] | ((props: CommandProps) => Command[])) => ReturnType,\n }\n }\n}\n\nexport const first: RawCommands['first'] = commands => props => {\n const items = typeof commands === 'function'\n ? commands(props)\n : commands\n\n for (let i = 0; i < items.length; i += 1) {\n if (items[i](props)) {\n return true\n }\n }\n\n return false\n}\n","import { isTextSelection } from '../helpers/isTextSelection.js'\nimport { resolveFocusPosition } from '../helpers/resolveFocusPosition.js'\nimport { FocusPosition, RawCommands } from '../types.js'\nimport { isiOS } from '../utilities/isiOS.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n focus: {\n /**\n * Focus the editor at the given position.\n */\n focus: (\n position?: FocusPosition,\n options?: {\n scrollIntoView?: boolean,\n },\n ) => ReturnType,\n }\n }\n}\n\nexport const focus: RawCommands['focus'] = (position = null, options = {}) => ({\n editor,\n view,\n tr,\n dispatch,\n}) => {\n options = {\n scrollIntoView: true,\n ...options,\n }\n\n const delayedFocus = () => {\n // focus within `requestAnimationFrame` breaks focus on iOS\n // so we have to call this\n if (isiOS()) {\n (view.dom as HTMLElement).focus()\n }\n\n // For React we have to focus asynchronously. Otherwise wild things happen.\n // see: https://github.com/ueberdosis/tiptap/issues/1520\n requestAnimationFrame(() => {\n if (!editor.isDestroyed) {\n view.focus()\n\n if (options?.scrollIntoView) {\n editor.commands.scrollIntoView()\n }\n }\n })\n }\n\n if ((view.hasFocus() && position === null) || position === false) {\n return true\n }\n\n // we don’t try to resolve a NodeSelection or CellSelection\n if (dispatch && position === null && !isTextSelection(editor.state.selection)) {\n delayedFocus()\n return true\n }\n\n // pass through tr.doc instead of editor.state.doc\n // since transactions could change the editors state before this command has been run\n const selection = resolveFocusPosition(tr.doc, position) || editor.state.selection\n const isSameSelection = editor.state.selection.eq(selection)\n\n if (dispatch) {\n if (!isSameSelection) {\n tr.setSelection(selection)\n }\n\n // `tr.setSelection` resets the stored marks\n // so we’ll restore them if the selection is the same as before\n if (isSameSelection && tr.storedMarks) {\n tr.setStoredMarks(tr.storedMarks)\n }\n\n delayedFocus()\n }\n\n return true\n}\n","import { CommandProps, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n forEach: {\n /**\n * Loop through an array of items.\n */\n forEach: (\n items: T[],\n fn: (\n item: T,\n props: CommandProps & {\n index: number,\n },\n ) => boolean,\n ) => ReturnType,\n }\n }\n}\n\nexport const forEach: RawCommands['forEach'] = (items, fn) => props => {\n return items.every((item, index) => fn(item, { ...props, index }))\n}\n","import { ParseOptions } from '@tiptap/pm/model'\n\nimport { Content, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n insertContent: {\n /**\n * Insert a node or string of HTML at the current position.\n */\n insertContent: (\n value: Content,\n options?: {\n parseOptions?: ParseOptions\n updateSelection?: boolean\n },\n ) => ReturnType\n }\n }\n}\n\nexport const insertContent: RawCommands['insertContent'] = (value, options) => ({ tr, commands }) => {\n return commands.insertContentAt(\n { from: tr.selection.from, to: tr.selection.to },\n value,\n options,\n )\n}\n","import { Fragment, Node as ProseMirrorNode, ParseOptions } from '@tiptap/pm/model'\n\nimport { createNodeFromContent } from '../helpers/createNodeFromContent.js'\nimport { selectionToInsertionEnd } from '../helpers/selectionToInsertionEnd.js'\nimport { Content, Range, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n insertContentAt: {\n /**\n * Insert a node or string of HTML at a specific position.\n */\n insertContentAt: (\n position: number | Range,\n value: Content,\n options?: {\n parseOptions?: ParseOptions\n updateSelection?: boolean\n },\n ) => ReturnType\n }\n }\n}\n\nconst isFragment = (nodeOrFragment: ProseMirrorNode | Fragment): nodeOrFragment is Fragment => {\n return nodeOrFragment.toString().startsWith('<')\n}\n\nexport const insertContentAt: RawCommands['insertContentAt'] = (position, value, options) => ({ tr, dispatch, editor }) => {\n if (dispatch) {\n options = {\n parseOptions: {},\n updateSelection: true,\n ...options,\n }\n\n const content = createNodeFromContent(value, editor.schema, {\n parseOptions: {\n preserveWhitespace: 'full',\n ...options.parseOptions,\n },\n })\n\n // don’t dispatch an empty fragment because this can lead to strange errors\n if (content.toString() === '<>') {\n return true\n }\n\n let { from, to } = typeof position === 'number' ? { from: position, to: position } : { from: position.from, to: position.to }\n\n let isOnlyTextContent = true\n let isOnlyBlockContent = true\n const nodes = isFragment(content) ? content : [content]\n\n nodes.forEach(node => {\n // check if added node is valid\n node.check()\n\n isOnlyTextContent = isOnlyTextContent ? node.isText && node.marks.length === 0 : false\n\n isOnlyBlockContent = isOnlyBlockContent ? node.isBlock : false\n })\n\n // check if we can replace the wrapping node by\n // the newly inserted content\n // example:\n // replace an empty paragraph by an inserted image\n // instead of inserting the image below the paragraph\n if (from === to && isOnlyBlockContent) {\n const { parent } = tr.doc.resolve(from)\n const isEmptyTextBlock = parent.isTextblock && !parent.type.spec.code && !parent.childCount\n\n if (isEmptyTextBlock) {\n from -= 1\n to += 1\n }\n }\n\n // if there is only plain text we have to use `insertText`\n // because this will keep the current marks\n if (isOnlyTextContent) {\n // if value is string, we can use it directly\n // otherwise if it is an array, we have to join it\n if (Array.isArray(value)) {\n tr.insertText(value.map(v => v.text || '').join(''), from, to)\n } else if (typeof value === 'object' && !!value && !!value.text) {\n tr.insertText(value.text, from, to)\n } else {\n tr.insertText(value as string, from, to)\n }\n } else {\n tr.replaceWith(from, to, content)\n }\n\n // set cursor at end of inserted content\n if (options.updateSelection) {\n selectionToInsertionEnd(tr, tr.steps.length - 1, -1)\n }\n }\n\n return true\n}\n","import { Selection, Transaction } from '@tiptap/pm/state'\nimport { ReplaceAroundStep, ReplaceStep } from '@tiptap/pm/transform'\n\n// source: https://github.com/ProseMirror/prosemirror-state/blob/master/src/selection.js#L466\nexport function selectionToInsertionEnd(tr: Transaction, startLen: number, bias: number) {\n const last = tr.steps.length - 1\n\n if (last < startLen) {\n return\n }\n\n const step = tr.steps[last]\n\n if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) {\n return\n }\n\n const map = tr.mapping.maps[last]\n let end = 0\n\n map.forEach((_from, _to, _newFrom, newTo) => {\n if (end === 0) {\n end = newTo\n }\n })\n\n tr.setSelection(Selection.near(tr.doc.resolve(end), bias))\n}\n","import {\n joinBackward as originalJoinBackward,\n joinDown as originalJoinDown,\n joinForward as originalJoinForward,\n joinUp as originalJoinUp,\n} from '@tiptap/pm/commands'\n\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n joinUp: {\n /**\n * Join two nodes Up.\n */\n joinUp: () => ReturnType\n }\n joinDown: {\n /**\n * Join two nodes Down.\n */\n joinDown: () => ReturnType\n }\n joinBackward: {\n /**\n * Join two nodes Backwards.\n */\n joinBackward: () => ReturnType\n }\n joinForward: {\n /**\n * Join two nodes Forwards.\n */\n joinForward: () => ReturnType\n }\n }\n}\n\nexport const joinUp: RawCommands['joinUp'] = () => ({ state, dispatch }) => {\n return originalJoinUp(state, dispatch)\n}\n\nexport const joinDown: RawCommands['joinDown'] = () => ({ state, dispatch }) => {\n return originalJoinDown(state, dispatch)\n}\n\nexport const joinBackward: RawCommands['joinBackward'] = () => ({ state, dispatch }) => {\n return originalJoinBackward(state, dispatch)\n}\n\nexport const joinForward: RawCommands['joinForward'] = () => ({ state, dispatch }) => {\n return originalJoinForward(state, dispatch)\n}\n","import { joinPoint } from '@tiptap/pm/transform'\n\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n joinItemBackward: {\n /**\n * Join two nodes Forwards.\n */\n joinItemBackward: () => ReturnType\n }\n }\n}\n\nexport const joinItemBackward: RawCommands['joinItemBackward'] = () => ({\n tr, state, dispatch,\n}) => {\n try {\n const point = joinPoint(state.doc, state.selection.$from.pos, -1)\n\n if (point === null || point === undefined) {\n return false\n }\n\n tr.join(point, 2)\n\n if (dispatch) {\n dispatch(tr)\n }\n\n return true\n } catch {\n return false\n }\n}\n","import { joinPoint } from '@tiptap/pm/transform'\n\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n joinItemForward: {\n /**\n * Join two nodes Forwards.\n */\n joinItemForward: () => ReturnType\n }\n }\n}\n\nexport const joinItemForward: RawCommands['joinItemForward'] = () => ({\n state,\n dispatch,\n tr,\n}) => {\n try {\n const point = joinPoint(state.doc, state.selection.$from.pos, +1)\n\n if (point === null || point === undefined) {\n return false\n }\n\n tr.join(point, 2)\n\n if (dispatch) {\n dispatch(tr)\n }\n\n return true\n } catch (e) {\n return false\n }\n}\n","import { RawCommands } from '../types.js'\nimport { isiOS } from '../utilities/isiOS.js'\nimport { isMacOS } from '../utilities/isMacOS.js'\n\nfunction normalizeKeyName(name: string) {\n const parts = name.split(/-(?!$)/)\n let result = parts[parts.length - 1]\n\n if (result === 'Space') {\n result = ' '\n }\n\n let alt\n let ctrl\n let shift\n let meta\n\n for (let i = 0; i < parts.length - 1; i += 1) {\n const mod = parts[i]\n\n if (/^(cmd|meta|m)$/i.test(mod)) {\n meta = true\n } else if (/^a(lt)?$/i.test(mod)) {\n alt = true\n } else if (/^(c|ctrl|control)$/i.test(mod)) {\n ctrl = true\n } else if (/^s(hift)?$/i.test(mod)) {\n shift = true\n } else if (/^mod$/i.test(mod)) {\n if (isiOS() || isMacOS()) {\n meta = true\n } else {\n ctrl = true\n }\n } else {\n throw new Error(`Unrecognized modifier name: ${mod}`)\n }\n }\n\n if (alt) {\n result = `Alt-${result}`\n }\n\n if (ctrl) {\n result = `Ctrl-${result}`\n }\n\n if (meta) {\n result = `Meta-${result}`\n }\n\n if (shift) {\n result = `Shift-${result}`\n }\n\n return result\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n keyboardShortcut: {\n /**\n * Trigger a keyboard shortcut.\n */\n keyboardShortcut: (name: string) => ReturnType,\n }\n }\n}\n\nexport const keyboardShortcut: RawCommands['keyboardShortcut'] = name => ({\n editor,\n view,\n tr,\n dispatch,\n}) => {\n const keys = normalizeKeyName(name).split(/-(?!$)/)\n const key = keys.find(item => !['Alt', 'Ctrl', 'Meta', 'Shift'].includes(item))\n const event = new KeyboardEvent('keydown', {\n key: key === 'Space'\n ? ' '\n : key,\n altKey: keys.includes('Alt'),\n ctrlKey: keys.includes('Ctrl'),\n metaKey: keys.includes('Meta'),\n shiftKey: keys.includes('Shift'),\n bubbles: true,\n cancelable: true,\n })\n\n const capturedTransaction = editor.captureTransaction(() => {\n view.someProp('handleKeyDown', f => f(view, event))\n })\n\n capturedTransaction?.steps.forEach(step => {\n const newStep = step.map(tr.mapping)\n\n if (newStep && dispatch) {\n tr.maybeStep(newStep)\n }\n })\n\n return true\n}\n","import { lift as originalLift } from '@tiptap/pm/commands'\nimport { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { isNodeActive } from '../helpers/isNodeActive.js'\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n lift: {\n /**\n * Removes an existing wrap.\n */\n lift: (typeOrName: string | NodeType, attributes?: Record) => ReturnType\n }\n }\n}\n\nexport const lift: RawCommands['lift'] = (typeOrName, attributes = {}) => ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n const isActive = isNodeActive(state, type, attributes)\n\n if (!isActive) {\n return false\n }\n\n return originalLift(state, dispatch)\n}\n","import { liftEmptyBlock as originalLiftEmptyBlock } from '@tiptap/pm/commands'\n\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n liftEmptyBlock: {\n /**\n * Lift block if empty.\n */\n liftEmptyBlock: () => ReturnType,\n }\n }\n}\n\nexport const liftEmptyBlock: RawCommands['liftEmptyBlock'] = () => ({ state, dispatch }) => {\n return originalLiftEmptyBlock(state, dispatch)\n}\n","import { NodeType } from '@tiptap/pm/model'\nimport { liftListItem as originalLiftListItem } from '@tiptap/pm/schema-list'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n liftListItem: {\n /**\n * Lift the list item into a wrapping list.\n */\n liftListItem: (typeOrName: string | NodeType) => ReturnType\n }\n }\n}\n\nexport const liftListItem: RawCommands['liftListItem'] = typeOrName => ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n\n return originalLiftListItem(type)(state, dispatch)\n}\n","import { newlineInCode as originalNewlineInCode } from '@tiptap/pm/commands'\n\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n newlineInCode: {\n /**\n * Add a newline character in code.\n */\n newlineInCode: () => ReturnType\n }\n }\n}\n\nexport const newlineInCode: RawCommands['newlineInCode'] = () => ({ state, dispatch }) => {\n return originalNewlineInCode(state, dispatch)\n}\n","import { MarkType, NodeType } from '@tiptap/pm/model'\n\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { getSchemaTypeNameByName } from '../helpers/getSchemaTypeNameByName.js'\nimport { RawCommands } from '../types.js'\nimport { deleteProps } from '../utilities/deleteProps.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n resetAttributes: {\n /**\n * Resets some node attributes to the default value.\n */\n resetAttributes: (\n typeOrName: string | NodeType | MarkType,\n attributes: string | string[],\n ) => ReturnType\n }\n }\n}\n\nexport const resetAttributes: RawCommands['resetAttributes'] = (typeOrName, attributes) => ({ tr, state, dispatch }) => {\n let nodeType: NodeType | null = null\n let markType: MarkType | null = null\n\n const schemaType = getSchemaTypeNameByName(\n typeof typeOrName === 'string' ? typeOrName : typeOrName.name,\n state.schema,\n )\n\n if (!schemaType) {\n return false\n }\n\n if (schemaType === 'node') {\n nodeType = getNodeType(typeOrName as NodeType, state.schema)\n }\n\n if (schemaType === 'mark') {\n markType = getMarkType(typeOrName as MarkType, state.schema)\n }\n\n if (dispatch) {\n tr.selection.ranges.forEach(range => {\n state.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => {\n if (nodeType && nodeType === node.type) {\n tr.setNodeMarkup(pos, undefined, deleteProps(node.attrs, attributes))\n }\n\n if (markType && node.marks.length) {\n node.marks.forEach(mark => {\n if (markType === mark.type) {\n tr.addMark(\n pos,\n pos + node.nodeSize,\n markType.create(deleteProps(mark.attrs, attributes)),\n )\n }\n })\n }\n })\n })\n }\n\n return true\n}\n","import { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n scrollIntoView: {\n /**\n * Scroll the selection into view.\n */\n scrollIntoView: () => ReturnType,\n }\n }\n}\n\nexport const scrollIntoView: RawCommands['scrollIntoView'] = () => ({ tr, dispatch }) => {\n if (dispatch) {\n tr.scrollIntoView()\n }\n\n return true\n}\n","import { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n selectAll: {\n /**\n * Select the whole document.\n */\n selectAll: () => ReturnType,\n }\n }\n}\n\nexport const selectAll: RawCommands['selectAll'] = () => ({ tr, commands }) => {\n return commands.setTextSelection({\n from: 0,\n to: tr.doc.content.size,\n })\n}\n","import { selectNodeBackward as originalSelectNodeBackward } from '@tiptap/pm/commands'\n\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n selectNodeBackward: {\n /**\n * Select a node backward.\n */\n selectNodeBackward: () => ReturnType\n }\n }\n}\n\nexport const selectNodeBackward: RawCommands['selectNodeBackward'] = () => ({ state, dispatch }) => {\n return originalSelectNodeBackward(state, dispatch)\n}\n","import { selectNodeForward as originalSelectNodeForward } from '@tiptap/pm/commands'\n\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n selectNodeForward: {\n /**\n * Select a node forward.\n */\n selectNodeForward: () => ReturnType\n }\n }\n}\n\nexport const selectNodeForward: RawCommands['selectNodeForward'] = () => ({ state, dispatch }) => {\n return originalSelectNodeForward(state, dispatch)\n}\n","import { selectParentNode as originalSelectParentNode } from '@tiptap/pm/commands'\n\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n selectParentNode: {\n /**\n * Select the parent node.\n */\n selectParentNode: () => ReturnType\n }\n }\n}\n\nexport const selectParentNode: RawCommands['selectParentNode'] = () => ({ state, dispatch }) => {\n return originalSelectParentNode(state, dispatch)\n}\n","// @ts-ignore\n// TODO: add types to @types/prosemirror-commands\nimport { selectTextblockEnd as originalSelectTextblockEnd } from '@tiptap/pm/commands'\n\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n selectTextblockEnd: {\n /**\n * Moves the cursor to the end of current text block.\n */\n selectTextblockEnd: () => ReturnType\n }\n }\n}\n\nexport const selectTextblockEnd: RawCommands['selectTextblockEnd'] = () => ({ state, dispatch }) => {\n return originalSelectTextblockEnd(state, dispatch)\n}\n","// @ts-ignore\n// TODO: add types to @types/prosemirror-commands\nimport { selectTextblockStart as originalSelectTextblockStart } from '@tiptap/pm/commands'\n\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n selectTextblockStart: {\n /**\n * Moves the cursor to the start of current text block.\n */\n selectTextblockStart: () => ReturnType\n }\n }\n}\n\nexport const selectTextblockStart: RawCommands['selectTextblockStart'] = () => ({ state, dispatch }) => {\n return originalSelectTextblockStart(state, dispatch)\n}\n","import { ParseOptions } from '@tiptap/pm/model'\n\nimport { createDocument } from '../helpers/createDocument.js'\nimport { Content, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n setContent: {\n /**\n * Replace the whole document with new content.\n */\n setContent: (\n content: Content,\n emitUpdate?: boolean,\n parseOptions?: ParseOptions,\n ) => ReturnType\n }\n }\n}\n\nexport const setContent: RawCommands['setContent'] = (content, emitUpdate = false, parseOptions = {}) => ({ tr, editor, dispatch }) => {\n const { doc } = tr\n const document = createDocument(content, editor.schema, parseOptions)\n\n if (dispatch) {\n tr.replaceWith(0, doc.content.size, document).setMeta('preventUpdate', !emitUpdate)\n }\n\n return true\n}\n","import { MarkType, ResolvedPos } from '@tiptap/pm/model'\nimport { EditorState, Transaction } from '@tiptap/pm/state'\n\nimport { getMarkAttributes } from '../helpers/getMarkAttributes.js'\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport { isTextSelection } from '../helpers/index.js'\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n setMark: {\n /**\n * Add a mark with new attributes.\n */\n setMark: (typeOrName: string | MarkType, attributes?: Record) => ReturnType\n }\n }\n}\n\nfunction canSetMark(state: EditorState, tr: Transaction, newMarkType: MarkType) {\n const { selection } = tr\n let cursor: ResolvedPos | null = null\n\n if (isTextSelection(selection)) {\n cursor = selection.$cursor\n }\n\n if (cursor) {\n const currentMarks = state.storedMarks ?? cursor.marks()\n\n // There can be no current marks that exclude the new mark\n return (\n !!newMarkType.isInSet(currentMarks)\n || !currentMarks.some(mark => mark.type.excludes(newMarkType))\n )\n }\n\n const { ranges } = selection\n\n return ranges.some(({ $from, $to }) => {\n let someNodeSupportsMark = $from.depth === 0\n ? state.doc.inlineContent && state.doc.type.allowsMarkType(newMarkType)\n : false\n\n state.doc.nodesBetween($from.pos, $to.pos, (node, _pos, parent) => {\n // If we already found a mark that we can enable, return false to bypass the remaining search\n if (someNodeSupportsMark) {\n return false\n }\n\n if (node.isInline) {\n const parentAllowsMarkType = !parent || parent.type.allowsMarkType(newMarkType)\n const currentMarksAllowMarkType = !!newMarkType.isInSet(node.marks)\n || !node.marks.some(otherMark => otherMark.type.excludes(newMarkType))\n\n someNodeSupportsMark = parentAllowsMarkType && currentMarksAllowMarkType\n }\n return !someNodeSupportsMark\n })\n\n return someNodeSupportsMark\n })\n}\nexport const setMark: RawCommands['setMark'] = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {\n const { selection } = tr\n const { empty, ranges } = selection\n const type = getMarkType(typeOrName, state.schema)\n\n if (dispatch) {\n if (empty) {\n const oldAttributes = getMarkAttributes(state, type)\n\n tr.addStoredMark(\n type.create({\n ...oldAttributes,\n ...attributes,\n }),\n )\n } else {\n ranges.forEach(range => {\n const from = range.$from.pos\n const to = range.$to.pos\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n const trimmedFrom = Math.max(pos, from)\n const trimmedTo = Math.min(pos + node.nodeSize, to)\n const someHasMark = node.marks.find(mark => mark.type === type)\n\n // if there is already a mark of this type\n // we know that we have to merge its attributes\n // otherwise we add a fresh new mark\n if (someHasMark) {\n node.marks.forEach(mark => {\n if (type === mark.type) {\n tr.addMark(\n trimmedFrom,\n trimmedTo,\n type.create({\n ...mark.attrs,\n ...attributes,\n }),\n )\n }\n })\n } else {\n tr.addMark(trimmedFrom, trimmedTo, type.create(attributes))\n }\n })\n })\n }\n }\n\n return canSetMark(state, tr, type)\n}\n","import { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n setMeta: {\n /**\n * Store a metadata property in the current transaction.\n */\n setMeta: (key: string, value: any) => ReturnType,\n }\n }\n}\n\nexport const setMeta: RawCommands['setMeta'] = (key, value) => ({ tr }) => {\n tr.setMeta(key, value)\n\n return true\n}\n","import { setBlockType } from '@tiptap/pm/commands'\nimport { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n setNode: {\n /**\n * Replace a given range with a node.\n */\n setNode: (typeOrName: string | NodeType, attributes?: Record) => ReturnType\n }\n }\n}\n\nexport const setNode: RawCommands['setNode'] = (typeOrName, attributes = {}) => ({ state, dispatch, chain }) => {\n const type = getNodeType(typeOrName, state.schema)\n\n // TODO: use a fallback like insertContent?\n if (!type.isTextblock) {\n console.warn('[tiptap warn]: Currently \"setNode()\" only supports text block nodes.')\n\n return false\n }\n\n return (\n chain()\n // try to convert node to default node if needed\n .command(({ commands }) => {\n const canSetBlock = setBlockType(type, attributes)(state)\n\n if (canSetBlock) {\n return true\n }\n\n return commands.clearNodes()\n })\n .command(({ state: updatedState }) => {\n return setBlockType(type, attributes)(updatedState, dispatch)\n })\n .run()\n )\n}\n","import { NodeSelection } from '@tiptap/pm/state'\n\nimport { RawCommands } from '../types.js'\nimport { minMax } from '../utilities/minMax.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n setNodeSelection: {\n /**\n * Creates a NodeSelection.\n */\n setNodeSelection: (position: number) => ReturnType\n }\n }\n}\n\nexport const setNodeSelection: RawCommands['setNodeSelection'] = position => ({ tr, dispatch }) => {\n if (dispatch) {\n const { doc } = tr\n const from = minMax(position, 0, doc.content.size)\n const selection = NodeSelection.create(doc, from)\n\n tr.setSelection(selection)\n }\n\n return true\n}\n","import { TextSelection } from '@tiptap/pm/state'\n\nimport { Range, RawCommands } from '../types.js'\nimport { minMax } from '../utilities/minMax.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n setTextSelection: {\n /**\n * Creates a TextSelection.\n */\n setTextSelection: (position: number | Range) => ReturnType\n }\n }\n}\n\nexport const setTextSelection: RawCommands['setTextSelection'] = position => ({ tr, dispatch }) => {\n if (dispatch) {\n const { doc } = tr\n const { from, to } = typeof position === 'number' ? { from: position, to: position } : position\n const minPos = TextSelection.atStart(doc).from\n const maxPos = TextSelection.atEnd(doc).to\n const resolvedFrom = minMax(from, minPos, maxPos)\n const resolvedEnd = minMax(to, minPos, maxPos)\n const selection = TextSelection.create(doc, resolvedFrom, resolvedEnd)\n\n tr.setSelection(selection)\n }\n\n return true\n}\n","import { NodeType } from '@tiptap/pm/model'\nimport { sinkListItem as originalSinkListItem } from '@tiptap/pm/schema-list'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n sinkListItem: {\n /**\n * Sink the list item down into an inner list.\n */\n sinkListItem: (typeOrName: string | NodeType) => ReturnType\n }\n }\n}\n\nexport const sinkListItem: RawCommands['sinkListItem'] = typeOrName => ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n\n return originalSinkListItem(type)(state, dispatch)\n}\n","import { ContentMatch, NodeType } from '@tiptap/pm/model'\n\nexport function defaultBlockAt(match: ContentMatch): NodeType | null {\n for (let i = 0; i < match.edgeCount; i += 1) {\n const { type } = match.edge(i)\n\n if (type.isTextblock && !type.hasRequiredAttrs()) {\n return type\n }\n }\n\n return null\n}\n","import {\n Fragment, Node as ProseMirrorNode, NodeType, Slice,\n} from '@tiptap/pm/model'\nimport { TextSelection } from '@tiptap/pm/state'\nimport { canSplit } from '@tiptap/pm/transform'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { getSplittedAttributes } from '../helpers/getSplittedAttributes.js'\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n splitListItem: {\n /**\n * Splits one list item into two list items.\n */\n splitListItem: (typeOrName: string | NodeType) => ReturnType\n }\n }\n}\n\nexport const splitListItem: RawCommands['splitListItem'] = typeOrName => ({\n tr, state, dispatch, editor,\n}) => {\n const type = getNodeType(typeOrName, state.schema)\n const { $from, $to } = state.selection\n\n // @ts-ignore\n // eslint-disable-next-line\n const node: ProseMirrorNode = state.selection.node\n\n if ((node && node.isBlock) || $from.depth < 2 || !$from.sameParent($to)) {\n return false\n }\n\n const grandParent = $from.node(-1)\n\n if (grandParent.type !== type) {\n return false\n }\n\n const extensionAttributes = editor.extensionManager.attributes\n\n if ($from.parent.content.size === 0 && $from.node(-1).childCount === $from.indexAfter(-1)) {\n // In an empty block. If this is a nested list, the wrapping\n // list item should be split. Otherwise, bail out and let next\n // command handle lifting.\n if (\n $from.depth === 2\n || $from.node(-3).type !== type\n || $from.index(-2) !== $from.node(-2).childCount - 1\n ) {\n return false\n }\n\n if (dispatch) {\n let wrap = Fragment.empty\n // eslint-disable-next-line\n const depthBefore = $from.index(-1) ? 1 : $from.index(-2) ? 2 : 3\n\n // Build a fragment containing empty versions of the structure\n // from the outer list item to the parent node of the cursor\n for (let d = $from.depth - depthBefore; d >= $from.depth - 3; d -= 1) {\n wrap = Fragment.from($from.node(d).copy(wrap))\n }\n\n // eslint-disable-next-line\n const depthAfter = $from.indexAfter(-1) < $from.node(-2).childCount ? 1 : $from.indexAfter(-2) < $from.node(-3).childCount ? 2 : 3\n\n // Add a second list item with an empty default start node\n const newNextTypeAttributes = getSplittedAttributes(\n extensionAttributes,\n $from.node().type.name,\n $from.node().attrs,\n )\n const nextType = type.contentMatch.defaultType?.createAndFill(newNextTypeAttributes) || undefined\n\n wrap = wrap.append(Fragment.from(type.createAndFill(null, nextType) || undefined))\n\n const start = $from.before($from.depth - (depthBefore - 1))\n\n tr.replace(start, $from.after(-depthAfter), new Slice(wrap, 4 - depthBefore, 0))\n\n let sel = -1\n\n tr.doc.nodesBetween(start, tr.doc.content.size, (n, pos) => {\n if (sel > -1) {\n return false\n }\n\n if (n.isTextblock && n.content.size === 0) {\n sel = pos + 1\n }\n })\n\n if (sel > -1) {\n tr.setSelection(TextSelection.near(tr.doc.resolve(sel)))\n }\n\n tr.scrollIntoView()\n }\n\n return true\n }\n\n const nextType = $to.pos === $from.end() ? grandParent.contentMatchAt(0).defaultType : null\n\n const newTypeAttributes = getSplittedAttributes(\n extensionAttributes,\n grandParent.type.name,\n grandParent.attrs,\n )\n const newNextTypeAttributes = getSplittedAttributes(\n extensionAttributes,\n $from.node().type.name,\n $from.node().attrs,\n )\n\n tr.delete($from.pos, $to.pos)\n\n const types = nextType\n ? [\n { type, attrs: newTypeAttributes },\n { type: nextType, attrs: newNextTypeAttributes },\n ]\n : [{ type, attrs: newTypeAttributes }]\n\n if (!canSplit(tr.doc, $from.pos, 2)) {\n return false\n }\n\n if (dispatch) {\n const { selection, storedMarks } = state\n const { splittableMarks } = editor.extensionManager\n const marks = storedMarks || (selection.$to.parentOffset && selection.$from.marks())\n\n tr.split($from.pos, 2, types).scrollIntoView()\n\n if (!marks || !dispatch) {\n return true\n }\n\n const filteredMarks = marks.filter(mark => splittableMarks.includes(mark.type.name))\n\n tr.ensureMarks(filteredMarks)\n }\n\n return true\n}\n","import { MarkType } from '@tiptap/pm/model'\n\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport { isMarkActive } from '../helpers/isMarkActive.js'\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n toggleMark: {\n /**\n * Toggle a mark on and off.\n */\n toggleMark: (\n typeOrName: string | MarkType,\n attributes?: Record,\n options?: {\n /**\n * Removes the mark even across the current selection. Defaults to `false`.\n */\n extendEmptyMarkRange?: boolean\n },\n ) => ReturnType\n }\n }\n}\n\nexport const toggleMark: RawCommands['toggleMark'] = (typeOrName, attributes = {}, options = {}) => ({ state, commands }) => {\n const { extendEmptyMarkRange = false } = options\n const type = getMarkType(typeOrName, state.schema)\n const isActive = isMarkActive(state, type, attributes)\n\n if (isActive) {\n return commands.unsetMark(type, { extendEmptyMarkRange })\n }\n\n return commands.setMark(type, attributes)\n}\n","import { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { isNodeActive } from '../helpers/isNodeActive.js'\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n toggleNode: {\n /**\n * Toggle a node with another node.\n */\n toggleNode: (\n typeOrName: string | NodeType,\n toggleTypeOrName: string | NodeType,\n attributes?: Record,\n ) => ReturnType\n }\n }\n}\n\nexport const toggleNode: RawCommands['toggleNode'] = (typeOrName, toggleTypeOrName, attributes = {}) => ({ state, commands }) => {\n const type = getNodeType(typeOrName, state.schema)\n const toggleType = getNodeType(toggleTypeOrName, state.schema)\n const isActive = isNodeActive(state, type, attributes)\n\n if (isActive) {\n return commands.setNode(toggleType)\n }\n\n return commands.setNode(type, attributes)\n}\n","import { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { isNodeActive } from '../helpers/isNodeActive.js'\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n toggleWrap: {\n /**\n * Wraps nodes in another node, or removes an existing wrap.\n */\n toggleWrap: (typeOrName: string | NodeType, attributes?: Record) => ReturnType\n }\n }\n}\n\nexport const toggleWrap: RawCommands['toggleWrap'] = (typeOrName, attributes = {}) => ({ state, commands }) => {\n const type = getNodeType(typeOrName, state.schema)\n const isActive = isNodeActive(state, type, attributes)\n\n if (isActive) {\n return commands.lift(type)\n }\n\n return commands.wrapIn(type, attributes)\n}\n","import { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n undoInputRule: {\n /**\n * Undo an input rule.\n */\n undoInputRule: () => ReturnType,\n }\n }\n}\n\nexport const undoInputRule: RawCommands['undoInputRule'] = () => ({ state, dispatch }) => {\n const plugins = state.plugins\n\n for (let i = 0; i < plugins.length; i += 1) {\n const plugin = plugins[i]\n let undoable\n\n // @ts-ignore\n // eslint-disable-next-line\n if (plugin.spec.isInputRules && (undoable = plugin.getState(state))) {\n if (dispatch) {\n const tr = state.tr\n const toUndo = undoable.transform\n\n for (let j = toUndo.steps.length - 1; j >= 0; j -= 1) {\n tr.step(toUndo.steps[j].invert(toUndo.docs[j]))\n }\n\n if (undoable.text) {\n const marks = tr.doc.resolve(undoable.from).marks()\n\n tr.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks))\n } else {\n tr.delete(undoable.from, undoable.to)\n }\n }\n\n return true\n }\n }\n\n return false\n}\n","import { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n unsetAllMarks: {\n /**\n * Remove all marks in the current selection.\n */\n unsetAllMarks: () => ReturnType,\n }\n }\n}\n\nexport const unsetAllMarks: RawCommands['unsetAllMarks'] = () => ({ tr, dispatch }) => {\n const { selection } = tr\n const { empty, ranges } = selection\n\n if (empty) {\n return true\n }\n\n if (dispatch) {\n ranges.forEach(range => {\n tr.removeMark(range.$from.pos, range.$to.pos)\n })\n }\n\n return true\n}\n","import { MarkType } from '@tiptap/pm/model'\n\nimport { getMarkRange } from '../helpers/getMarkRange.js'\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n unsetMark: {\n /**\n * Remove all marks in the current selection.\n */\n unsetMark: (\n typeOrName: string | MarkType,\n options?: {\n /**\n * Removes the mark even across the current selection. Defaults to `false`.\n */\n extendEmptyMarkRange?: boolean\n },\n ) => ReturnType\n }\n }\n}\n\nexport const unsetMark: RawCommands['unsetMark'] = (typeOrName, options = {}) => ({ tr, state, dispatch }) => {\n const { extendEmptyMarkRange = false } = options\n const { selection } = tr\n const type = getMarkType(typeOrName, state.schema)\n const { $from, empty, ranges } = selection\n\n if (!dispatch) {\n return true\n }\n\n if (empty && extendEmptyMarkRange) {\n let { from, to } = selection\n const attrs = $from.marks().find(mark => mark.type === type)?.attrs\n const range = getMarkRange($from, type, attrs)\n\n if (range) {\n from = range.from\n to = range.to\n }\n\n tr.removeMark(from, to, type)\n } else {\n ranges.forEach(range => {\n tr.removeMark(range.$from.pos, range.$to.pos, type)\n })\n }\n\n tr.removeStoredMark(type)\n\n return true\n}\n","import { MarkType, NodeType } from '@tiptap/pm/model'\n\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { getSchemaTypeNameByName } from '../helpers/getSchemaTypeNameByName.js'\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n updateAttributes: {\n /**\n * Update attributes of a node or mark.\n */\n updateAttributes: (\n typeOrName: string | NodeType | MarkType,\n attributes: Record,\n ) => ReturnType\n }\n }\n}\n\nexport const updateAttributes: RawCommands['updateAttributes'] = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {\n let nodeType: NodeType | null = null\n let markType: MarkType | null = null\n\n const schemaType = getSchemaTypeNameByName(\n typeof typeOrName === 'string' ? typeOrName : typeOrName.name,\n state.schema,\n )\n\n if (!schemaType) {\n return false\n }\n\n if (schemaType === 'node') {\n nodeType = getNodeType(typeOrName as NodeType, state.schema)\n }\n\n if (schemaType === 'mark') {\n markType = getMarkType(typeOrName as MarkType, state.schema)\n }\n\n if (dispatch) {\n tr.selection.ranges.forEach(range => {\n const from = range.$from.pos\n const to = range.$to.pos\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (nodeType && nodeType === node.type) {\n tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n ...attributes,\n })\n }\n\n if (markType && node.marks.length) {\n node.marks.forEach(mark => {\n if (markType === mark.type) {\n const trimmedFrom = Math.max(pos, from)\n const trimmedTo = Math.min(pos + node.nodeSize, to)\n\n tr.addMark(\n trimmedFrom,\n trimmedTo,\n markType.create({\n ...mark.attrs,\n ...attributes,\n }),\n )\n }\n })\n }\n })\n })\n }\n\n return true\n}\n","import { wrapIn as originalWrapIn } from '@tiptap/pm/commands'\nimport { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n wrapIn: {\n /**\n * Wraps nodes in another node.\n */\n wrapIn: (typeOrName: string | NodeType, attributes?: Record) => ReturnType\n }\n }\n}\n\nexport const wrapIn: RawCommands['wrapIn'] = (typeOrName, attributes = {}) => ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n\n return originalWrapIn(type, attributes)(state, dispatch)\n}\n","import { NodeType } from '@tiptap/pm/model'\nimport { wrapInList as originalWrapInList } from '@tiptap/pm/schema-list'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands {\n wrapInList: {\n /**\n * Wrap a node in a list.\n */\n wrapInList: (typeOrName: string | NodeType, attributes?: Record) => ReturnType\n }\n }\n}\n\nexport const wrapInList: RawCommands['wrapInList'] = (typeOrName, attributes = {}) => ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n\n return originalWrapInList(type, attributes)(state, dispatch)\n}\n","import * as commands from '../commands/index.js'\nimport { Extension } from '../Extension.js'\n\nexport * from '../commands/index.js'\n\nexport const Commands = Extension.create({\n name: 'commands',\n\n addCommands() {\n return {\n ...commands,\n }\n },\n})\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\n\nexport const Editable = Extension.create({\n name: 'editable',\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('editable'),\n props: {\n editable: () => this.editor.options.editable,\n },\n }),\n ]\n },\n})\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\n\nexport const FocusEvents = Extension.create({\n name: 'focusEvents',\n\n addProseMirrorPlugins() {\n const { editor } = this\n\n return [\n new Plugin({\n key: new PluginKey('focusEvents'),\n props: {\n handleDOMEvents: {\n focus: (view, event: Event) => {\n editor.isFocused = true\n\n const transaction = editor.state.tr\n .setMeta('focus', { event })\n .setMeta('addToHistory', false)\n\n view.dispatch(transaction)\n\n return false\n },\n blur: (view, event: Event) => {\n editor.isFocused = false\n\n const transaction = editor.state.tr\n .setMeta('blur', { event })\n .setMeta('addToHistory', false)\n\n view.dispatch(transaction)\n\n return false\n },\n },\n },\n }),\n ]\n },\n})\n","import { Plugin, PluginKey, Selection } from '@tiptap/pm/state'\n\nimport { CommandManager } from '../CommandManager.js'\nimport { Extension } from '../Extension.js'\nimport { createChainableState } from '../helpers/createChainableState.js'\nimport { isiOS } from '../utilities/isiOS.js'\nimport { isMacOS } from '../utilities/isMacOS.js'\n\nexport const Keymap = Extension.create({\n name: 'keymap',\n\n addKeyboardShortcuts() {\n const handleBackspace = () => this.editor.commands.first(({ commands }) => [\n () => commands.undoInputRule(),\n\n // maybe convert first text block node to default node\n () => commands.command(({ tr }) => {\n const { selection, doc } = tr\n const { empty, $anchor } = selection\n const { pos, parent } = $anchor\n const $parentPos = $anchor.parent.isTextblock ? tr.doc.resolve(pos - 1) : $anchor\n const parentIsIsolating = $parentPos.parent.type.spec.isolating\n\n const parentPos = $anchor.pos - $anchor.parentOffset\n\n const isAtStart = (parentIsIsolating && $parentPos.parent.childCount === 1)\n ? parentPos === $anchor.pos\n : Selection.atStart(doc).from === pos\n\n if (!empty || !isAtStart || !parent.type.isTextblock || parent.textContent.length) {\n return false\n }\n\n return commands.clearNodes()\n }),\n\n () => commands.deleteSelection(),\n () => commands.joinBackward(),\n () => commands.selectNodeBackward(),\n ])\n\n const handleDelete = () => this.editor.commands.first(({ commands }) => [\n () => commands.deleteSelection(),\n () => commands.deleteCurrentNode(),\n () => commands.joinForward(),\n () => commands.selectNodeForward(),\n ])\n\n const handleEnter = () => this.editor.commands.first(({ commands }) => [\n () => commands.newlineInCode(),\n () => commands.createParagraphNear(),\n () => commands.liftEmptyBlock(),\n () => commands.splitBlock(),\n ])\n\n const baseKeymap = {\n Enter: handleEnter,\n 'Mod-Enter': () => this.editor.commands.exitCode(),\n Backspace: handleBackspace,\n 'Mod-Backspace': handleBackspace,\n 'Shift-Backspace': handleBackspace,\n Delete: handleDelete,\n 'Mod-Delete': handleDelete,\n 'Mod-a': () => this.editor.commands.selectAll(),\n }\n\n const pcKeymap = {\n ...baseKeymap,\n }\n\n const macKeymap = {\n ...baseKeymap,\n 'Ctrl-h': handleBackspace,\n 'Alt-Backspace': handleBackspace,\n 'Ctrl-d': handleDelete,\n 'Ctrl-Alt-Backspace': handleDelete,\n 'Alt-Delete': handleDelete,\n 'Alt-d': handleDelete,\n 'Ctrl-a': () => this.editor.commands.selectTextblockStart(),\n 'Ctrl-e': () => this.editor.commands.selectTextblockEnd(),\n }\n\n if (isiOS() || isMacOS()) {\n return macKeymap\n }\n\n return pcKeymap\n },\n\n addProseMirrorPlugins() {\n return [\n // With this plugin we check if the whole document was selected and deleted.\n // In this case we will additionally call `clearNodes()` to convert e.g. a heading\n // to a paragraph if necessary.\n // This is an alternative to ProseMirror's `AllSelection`, which doesn’t work well\n // with many other commands.\n new Plugin({\n key: new PluginKey('clearDocument'),\n appendTransaction: (transactions, oldState, newState) => {\n const docChanges = transactions.some(transaction => transaction.docChanged)\n && !oldState.doc.eq(newState.doc)\n\n if (!docChanges) {\n return\n }\n\n const { empty, from, to } = oldState.selection\n const allFrom = Selection.atStart(oldState.doc).from\n const allEnd = Selection.atEnd(oldState.doc).to\n const allWasSelected = from === allFrom && to === allEnd\n\n if (empty || !allWasSelected) {\n return\n }\n\n const isEmpty = newState.doc.textBetween(0, newState.doc.content.size, ' ', ' ').length === 0\n\n if (!isEmpty) {\n return\n }\n\n const tr = newState.tr\n const state = createChainableState({\n state: newState,\n transaction: tr,\n })\n const { commands } = new CommandManager({\n editor: this.editor,\n state,\n })\n\n commands.clearNodes()\n\n if (!tr.steps.length) {\n return\n }\n\n return tr\n },\n }),\n ]\n },\n})\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\n\nexport const Tabindex = Extension.create({\n name: 'tabindex',\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('tabindex'),\n props: {\n attributes: this.editor.isEditable ? { tabindex: '0' } : {},\n },\n }),\n ]\n },\n})\n","import { MarkType, NodeType, Schema } from '@tiptap/pm/model'\nimport {\n EditorState, Plugin, PluginKey, Transaction,\n} from '@tiptap/pm/state'\nimport { EditorView } from '@tiptap/pm/view'\n\nimport { CommandManager } from './CommandManager.js'\nimport { EventEmitter } from './EventEmitter.js'\nimport { ExtensionManager } from './ExtensionManager.js'\nimport * as extensions from './extensions/index.js'\nimport { createDocument } from './helpers/createDocument.js'\nimport { getAttributes } from './helpers/getAttributes.js'\nimport { getHTMLFromFragment } from './helpers/getHTMLFromFragment.js'\nimport { getText } from './helpers/getText.js'\nimport { getTextSerializersFromSchema } from './helpers/getTextSerializersFromSchema.js'\nimport { isActive } from './helpers/isActive.js'\nimport { isNodeEmpty } from './helpers/isNodeEmpty.js'\nimport { resolveFocusPosition } from './helpers/resolveFocusPosition.js'\nimport { style } from './style.js'\nimport {\n CanCommands,\n ChainedCommands,\n EditorEvents,\n EditorOptions,\n JSONContent,\n SingleCommands,\n TextSerializer,\n} from './types.js'\nimport { createStyleTag } from './utilities/createStyleTag.js'\nimport { isFunction } from './utilities/isFunction.js'\n\nexport { extensions }\n\nexport interface HTMLElement {\n editor?: Editor\n}\n\nexport class Editor extends EventEmitter {\n private commandManager!: CommandManager\n\n public extensionManager!: ExtensionManager\n\n private css!: HTMLStyleElement\n\n public schema!: Schema\n\n public view!: EditorView\n\n public isFocused = false\n\n public extensionStorage: Record = {}\n\n public options: EditorOptions = {\n element: document.createElement('div'),\n content: '',\n injectCSS: true,\n injectNonce: undefined,\n extensions: [],\n autofocus: false,\n editable: true,\n editorProps: {},\n parseOptions: {},\n enableInputRules: true,\n enablePasteRules: true,\n enableCoreExtensions: true,\n onBeforeCreate: () => null,\n onCreate: () => null,\n onUpdate: () => null,\n onSelectionUpdate: () => null,\n onTransaction: () => null,\n onFocus: () => null,\n onBlur: () => null,\n onDestroy: () => null,\n }\n\n constructor(options: Partial = {}) {\n super()\n this.setOptions(options)\n this.createExtensionManager()\n this.createCommandManager()\n this.createSchema()\n this.on('beforeCreate', this.options.onBeforeCreate)\n this.emit('beforeCreate', { editor: this })\n this.createView()\n this.injectCSS()\n this.on('create', this.options.onCreate)\n this.on('update', this.options.onUpdate)\n this.on('selectionUpdate', this.options.onSelectionUpdate)\n this.on('transaction', this.options.onTransaction)\n this.on('focus', this.options.onFocus)\n this.on('blur', this.options.onBlur)\n this.on('destroy', this.options.onDestroy)\n\n window.setTimeout(() => {\n if (this.isDestroyed) {\n return\n }\n\n this.commands.focus(this.options.autofocus)\n this.emit('create', { editor: this })\n }, 0)\n }\n\n /**\n * Returns the editor storage.\n */\n public get storage(): Record {\n return this.extensionStorage\n }\n\n /**\n * An object of all registered commands.\n */\n public get commands(): SingleCommands {\n return this.commandManager.commands\n }\n\n /**\n * Create a command chain to call multiple commands at once.\n */\n public chain(): ChainedCommands {\n return this.commandManager.chain()\n }\n\n /**\n * Check if a command or a command chain can be executed. Without executing it.\n */\n public can(): CanCommands {\n return this.commandManager.can()\n }\n\n /**\n * Inject CSS styles.\n */\n private injectCSS(): void {\n if (this.options.injectCSS && document) {\n this.css = createStyleTag(style, this.options.injectNonce)\n }\n }\n\n /**\n * Update editor options.\n *\n * @param options A list of options\n */\n public setOptions(options: Partial = {}): void {\n this.options = {\n ...this.options,\n ...options,\n }\n\n if (!this.view || !this.state || this.isDestroyed) {\n return\n }\n\n if (this.options.editorProps) {\n this.view.setProps(this.options.editorProps)\n }\n\n this.view.updateState(this.state)\n }\n\n /**\n * Update editable state of the editor.\n */\n public setEditable(editable: boolean, emitUpdate = true): void {\n this.setOptions({ editable })\n\n if (emitUpdate) {\n this.emit('update', { editor: this, transaction: this.state.tr })\n }\n }\n\n /**\n * Returns whether the editor is editable.\n */\n public get isEditable(): boolean {\n // since plugins are applied after creating the view\n // `editable` is always `true` for one tick.\n // that’s why we also have to check for `options.editable`\n return this.options.editable && this.view && this.view.editable\n }\n\n /**\n * Returns the editor state.\n */\n public get state(): EditorState {\n return this.view.state\n }\n\n /**\n * Register a ProseMirror plugin.\n *\n * @param plugin A ProseMirror plugin\n * @param handlePlugins Control how to merge the plugin into the existing plugins.\n */\n public registerPlugin(\n plugin: Plugin,\n handlePlugins?: (newPlugin: Plugin, plugins: Plugin[]) => Plugin[],\n ): void {\n const plugins = isFunction(handlePlugins)\n ? handlePlugins(plugin, [...this.state.plugins])\n : [...this.state.plugins, plugin]\n\n const state = this.state.reconfigure({ plugins })\n\n this.view.updateState(state)\n }\n\n /**\n * Unregister a ProseMirror plugin.\n *\n * @param nameOrPluginKey The plugins name\n */\n public unregisterPlugin(nameOrPluginKey: string | PluginKey): void {\n if (this.isDestroyed) {\n return\n }\n\n // @ts-ignore\n const name = typeof nameOrPluginKey === 'string' ? `${nameOrPluginKey}$` : nameOrPluginKey.key\n\n const state = this.state.reconfigure({\n // @ts-ignore\n plugins: this.state.plugins.filter(plugin => !plugin.key.startsWith(name)),\n })\n\n this.view.updateState(state)\n }\n\n /**\n * Creates an extension manager.\n */\n private createExtensionManager(): void {\n const coreExtensions = this.options.enableCoreExtensions ? Object.values(extensions) : []\n const allExtensions = [...coreExtensions, ...this.options.extensions].filter(extension => {\n return ['extension', 'node', 'mark'].includes(extension?.type)\n })\n\n this.extensionManager = new ExtensionManager(allExtensions, this)\n }\n\n /**\n * Creates an command manager.\n */\n private createCommandManager(): void {\n this.commandManager = new CommandManager({\n editor: this,\n })\n }\n\n /**\n * Creates a ProseMirror schema.\n */\n private createSchema(): void {\n this.schema = this.extensionManager.schema\n }\n\n /**\n * Creates a ProseMirror view.\n */\n private createView(): void {\n const doc = createDocument(this.options.content, this.schema, this.options.parseOptions)\n const selection = resolveFocusPosition(doc, this.options.autofocus)\n\n this.view = new EditorView(this.options.element, {\n ...this.options.editorProps,\n dispatchTransaction: this.dispatchTransaction.bind(this),\n state: EditorState.create({\n doc,\n selection: selection || undefined,\n }),\n })\n\n // `editor.view` is not yet available at this time.\n // Therefore we will add all plugins and node views directly afterwards.\n const newState = this.state.reconfigure({\n plugins: this.extensionManager.plugins,\n })\n\n this.view.updateState(newState)\n\n this.createNodeViews()\n this.prependClass()\n\n // Let’s store the editor instance in the DOM element.\n // So we’ll have access to it for tests.\n const dom = this.view.dom as HTMLElement\n\n dom.editor = this\n }\n\n /**\n * Creates all node views.\n */\n public createNodeViews(): void {\n this.view.setProps({\n nodeViews: this.extensionManager.nodeViews,\n })\n }\n\n /**\n * Prepend class name to element.\n */\n public prependClass(): void {\n this.view.dom.className = `tiptap ${this.view.dom.className}`\n }\n\n public isCapturingTransaction = false\n\n private capturedTransaction: Transaction | null = null\n\n public captureTransaction(fn: Function) {\n this.isCapturingTransaction = true\n fn()\n this.isCapturingTransaction = false\n\n const tr = this.capturedTransaction\n\n this.capturedTransaction = null\n\n return tr\n }\n\n /**\n * The callback over which to send transactions (state updates) produced by the view.\n *\n * @param transaction An editor state transaction\n */\n private dispatchTransaction(transaction: Transaction): void {\n // if the editor / the view of the editor was destroyed\n // the transaction should not be dispatched as there is no view anymore.\n if (this.view.isDestroyed) {\n return\n }\n\n if (this.isCapturingTransaction) {\n if (!this.capturedTransaction) {\n this.capturedTransaction = transaction\n\n return\n }\n\n transaction.steps.forEach(step => this.capturedTransaction?.step(step))\n\n return\n }\n\n const state = this.state.apply(transaction)\n const selectionHasChanged = !this.state.selection.eq(state.selection)\n\n this.view.updateState(state)\n this.emit('transaction', {\n editor: this,\n transaction,\n })\n\n if (selectionHasChanged) {\n this.emit('selectionUpdate', {\n editor: this,\n transaction,\n })\n }\n\n const focus = transaction.getMeta('focus')\n const blur = transaction.getMeta('blur')\n\n if (focus) {\n this.emit('focus', {\n editor: this,\n event: focus.event,\n transaction,\n })\n }\n\n if (blur) {\n this.emit('blur', {\n editor: this,\n event: blur.event,\n transaction,\n })\n }\n\n if (!transaction.docChanged || transaction.getMeta('preventUpdate')) {\n return\n }\n\n this.emit('update', {\n editor: this,\n transaction,\n })\n }\n\n /**\n * Get attributes of the currently selected node or mark.\n */\n public getAttributes(nameOrType: string | NodeType | MarkType): Record {\n return getAttributes(this.state, nameOrType)\n }\n\n /**\n * Returns if the currently selected node or mark is active.\n *\n * @param name Name of the node or mark\n * @param attributes Attributes of the node or mark\n */\n public isActive(name: string, attributes?: {}): boolean\n public isActive(attributes: {}): boolean\n public isActive(nameOrAttributes: string, attributesOrUndefined?: {}): boolean {\n const name = typeof nameOrAttributes === 'string' ? nameOrAttributes : null\n\n const attributes = typeof nameOrAttributes === 'string' ? attributesOrUndefined : nameOrAttributes\n\n return isActive(this.state, name, attributes)\n }\n\n /**\n * Get the document as JSON.\n */\n public getJSON(): JSONContent {\n return this.state.doc.toJSON()\n }\n\n /**\n * Get the document as HTML.\n */\n public getHTML(): string {\n return getHTMLFromFragment(this.state.doc.content, this.schema)\n }\n\n /**\n * Get the document as text.\n */\n public getText(options?: {\n blockSeparator?: string\n textSerializers?: Record\n }): string {\n const { blockSeparator = '\\n\\n', textSerializers = {} } = options || {}\n\n return getText(this.state.doc, {\n blockSeparator,\n textSerializers: {\n ...getTextSerializersFromSchema(this.schema),\n ...textSerializers,\n },\n })\n }\n\n /**\n * Check if there is no content.\n */\n public get isEmpty(): boolean {\n return isNodeEmpty(this.state.doc)\n }\n\n /**\n * Get the number of characters for the current document.\n *\n * @deprecated\n */\n public getCharacterCount(): number {\n console.warn(\n '[tiptap warn]: \"editor.getCharacterCount()\" is deprecated. Please use \"editor.storage.characterCount.characters()\" instead.',\n )\n\n return this.state.doc.content.size - 2\n }\n\n /**\n * Destroy the editor.\n */\n public destroy(): void {\n this.emit('destroy')\n\n if (this.view) {\n this.view.destroy()\n }\n\n this.removeAllListeners()\n }\n\n /**\n * Check if the editor is already destroyed.\n */\n public get isDestroyed(): boolean {\n // @ts-ignore\n return !this.view?.docView\n }\n}\n","export function createStyleTag(style: string, nonce?: string, suffix?: string): HTMLStyleElement {\n const tiptapStyleTag = (document.querySelector(`style[data-tiptap-style${suffix ? `-${suffix}` : ''}]`))\n\n if (tiptapStyleTag !== null) {\n return tiptapStyleTag\n }\n\n const styleNode = document.createElement('style')\n\n if (nonce) {\n styleNode.setAttribute('nonce', nonce)\n }\n\n styleNode.setAttribute(`data-tiptap-style${suffix ? `-${suffix}` : ''}`, '')\n styleNode.innerHTML = style\n document.getElementsByTagName('head')[0].appendChild(styleNode)\n\n return styleNode\n}\n","export const style = `.ProseMirror {\n position: relative;\n}\n\n.ProseMirror {\n word-wrap: break-word;\n white-space: pre-wrap;\n white-space: break-spaces;\n -webkit-font-variant-ligatures: none;\n font-variant-ligatures: none;\n font-feature-settings: \"liga\" 0; /* the above doesn't seem to work in Edge */\n}\n\n.ProseMirror [contenteditable=\"false\"] {\n white-space: normal;\n}\n\n.ProseMirror [contenteditable=\"false\"] [contenteditable=\"true\"] {\n white-space: pre-wrap;\n}\n\n.ProseMirror pre {\n white-space: pre-wrap;\n}\n\nimg.ProseMirror-separator {\n display: inline !important;\n border: none !important;\n margin: 0 !important;\n width: 1px !important;\n height: 1px !important;\n}\n\n.ProseMirror-gapcursor {\n display: none;\n pointer-events: none;\n position: absolute;\n margin: 0;\n}\n\n.ProseMirror-gapcursor:after {\n content: \"\";\n display: block;\n position: absolute;\n top: -2px;\n width: 20px;\n border-top: 1px solid black;\n animation: ProseMirror-cursor-blink 1.1s steps(2, start) infinite;\n}\n\n@keyframes ProseMirror-cursor-blink {\n to {\n visibility: hidden;\n }\n}\n\n.ProseMirror-hideselection *::selection {\n background: transparent;\n}\n\n.ProseMirror-hideselection *::-moz-selection {\n background: transparent;\n}\n\n.ProseMirror-hideselection * {\n caret-color: transparent;\n}\n\n.ProseMirror-focused .ProseMirror-gapcursor {\n display: block;\n}\n\n.tippy-box[data-animation=fade][data-state=hidden] {\n opacity: 0\n}`\n","import { EditorState } from '@tiptap/pm/state'\n\nimport { getSchemaTypeNameByName } from './getSchemaTypeNameByName.js'\nimport { isMarkActive } from './isMarkActive.js'\nimport { isNodeActive } from './isNodeActive.js'\n\nexport function isActive(\n state: EditorState,\n name: string | null,\n attributes: Record = {},\n): boolean {\n if (!name) {\n return isNodeActive(state, null, attributes) || isMarkActive(state, null, attributes)\n }\n\n const schemaType = getSchemaTypeNameByName(name, state.schema)\n\n if (schemaType === 'node') {\n return isNodeActive(state, name, attributes)\n }\n\n if (schemaType === 'mark') {\n return isMarkActive(state, name, attributes)\n }\n\n return false\n}\n","import { DOMSerializer, Fragment, Schema } from '@tiptap/pm/model'\n\nexport function getHTMLFromFragment(fragment: Fragment, schema: Schema): string {\n const documentFragment = DOMSerializer.fromSchema(schema).serializeFragment(fragment)\n\n const temporaryDocument = document.implementation.createHTMLDocument()\n const container = temporaryDocument.createElement('div')\n\n container.appendChild(documentFragment)\n\n return container.innerHTML\n}\n","import { Node as ProseMirrorNode } from '@tiptap/pm/model'\n\nimport { TextSerializer } from '../types.js'\nimport { getTextBetween } from './getTextBetween.js'\n\nexport function getText(\n node: ProseMirrorNode,\n options?: {\n blockSeparator?: string\n textSerializers?: Record\n },\n) {\n const range = {\n from: 0,\n to: node.content.size,\n }\n\n return getTextBetween(node, range, options)\n}\n","import { Node as ProseMirrorNode } from '@tiptap/pm/model'\n\nexport function isNodeEmpty(node: ProseMirrorNode): boolean {\n const defaultContent = node.type.createAndFill()?.toJSON()\n const content = node.toJSON()\n\n return JSON.stringify(defaultContent) === JSON.stringify(content)\n}\n","import { MarkType } from '@tiptap/pm/model'\n\nimport { getMarksBetween } from '../helpers/getMarksBetween.js'\nimport { InputRule, InputRuleFinder } from '../InputRule.js'\nimport { ExtendedRegExpMatchArray } from '../types.js'\nimport { callOrReturn } from '../utilities/callOrReturn.js'\n\n/**\n * Build an input rule that adds a mark when the\n * matched text is typed into it.\n */\nexport function markInputRule(config: {\n find: InputRuleFinder\n type: MarkType\n getAttributes?:\n | Record\n | ((match: ExtendedRegExpMatchArray) => Record)\n | false\n | null\n}) {\n return new InputRule({\n find: config.find,\n handler: ({ state, range, match }) => {\n const attributes = callOrReturn(config.getAttributes, undefined, match)\n\n if (attributes === false || attributes === null) {\n return null\n }\n\n const { tr } = state\n const captureGroup = match[match.length - 1]\n const fullMatch = match[0]\n\n if (captureGroup) {\n const startSpaces = fullMatch.search(/\\S/)\n const textStart = range.from + fullMatch.indexOf(captureGroup)\n const textEnd = textStart + captureGroup.length\n\n const excludedMarks = getMarksBetween(range.from, range.to, state.doc)\n .filter(item => {\n // @ts-ignore\n const excluded = item.mark.type.excluded as MarkType[]\n\n return excluded.find(type => type === config.type && type !== item.mark.type)\n })\n .filter(item => item.to > textStart)\n\n if (excludedMarks.length) {\n return null\n }\n\n if (textEnd < range.to) {\n tr.delete(textEnd, range.to)\n }\n\n if (textStart > range.from) {\n tr.delete(range.from + startSpaces, textStart)\n }\n\n const markEnd = range.from + startSpaces + captureGroup.length\n\n tr.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {}))\n\n tr.removeStoredMark(config.type)\n }\n },\n })\n}\n","import { NodeType } from '@tiptap/pm/model'\n\nimport { InputRule, InputRuleFinder } from '../InputRule.js'\nimport { ExtendedRegExpMatchArray } from '../types.js'\nimport { callOrReturn } from '../utilities/callOrReturn.js'\n\n/**\n * Build an input rule that adds a node when the\n * matched text is typed into it.\n */\nexport function nodeInputRule(config: {\n /**\n * The regex to match.\n */\n find: InputRuleFinder\n\n /**\n * The node type to add.\n */\n type: NodeType\n\n /**\n * A function that returns the attributes for the node\n * can also be an object of attributes\n */\n getAttributes?:\n | Record\n | ((match: ExtendedRegExpMatchArray) => Record)\n | false\n | null\n}) {\n return new InputRule({\n find: config.find,\n handler: ({ state, range, match }) => {\n const attributes = callOrReturn(config.getAttributes, undefined, match) || {}\n const { tr } = state\n const start = range.from\n let end = range.to\n\n const newNode = config.type.create(attributes)\n\n if (match[1]) {\n const offset = match[0].lastIndexOf(match[1])\n let matchStart = start + offset\n\n if (matchStart > end) {\n matchStart = end\n } else {\n end = matchStart + match[1].length\n }\n\n // insert last typed character\n const lastChar = match[0][match[0].length - 1]\n\n tr.insertText(lastChar, start + match[0].length - 1)\n\n // insert node from input rule\n tr.replaceWith(matchStart, end, newNode)\n } else if (match[0]) {\n tr.insert(start - 1, config.type.create(attributes)).delete(\n tr.mapping.map(start),\n tr.mapping.map(end),\n )\n }\n\n tr.scrollIntoView()\n },\n })\n}\n","import { NodeType } from '@tiptap/pm/model'\n\nimport { InputRule, InputRuleFinder } from '../InputRule.js'\nimport { ExtendedRegExpMatchArray } from '../types.js'\nimport { callOrReturn } from '../utilities/callOrReturn.js'\n\n/**\n * Build an input rule that changes the type of a textblock when the\n * matched text is typed into it. When using a regular expresion you’ll\n * probably want the regexp to start with `^`, so that the pattern can\n * only occur at the start of a textblock.\n */\nexport function textblockTypeInputRule(config: {\n find: InputRuleFinder\n type: NodeType\n getAttributes?:\n | Record\n | ((match: ExtendedRegExpMatchArray) => Record)\n | false\n | null\n}) {\n return new InputRule({\n find: config.find,\n handler: ({ state, range, match }) => {\n const $start = state.doc.resolve(range.from)\n const attributes = callOrReturn(config.getAttributes, undefined, match) || {}\n\n if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), config.type)) {\n return null\n }\n\n state.tr\n .delete(range.from, range.to)\n .setBlockType(range.from, range.from, config.type, attributes)\n },\n })\n}\n","import { Node as ProseMirrorNode, NodeType } from '@tiptap/pm/model'\nimport { canJoin, findWrapping } from '@tiptap/pm/transform'\n\nimport { Editor } from '../Editor.js'\nimport { InputRule, InputRuleFinder } from '../InputRule.js'\nimport { ExtendedRegExpMatchArray } from '../types.js'\nimport { callOrReturn } from '../utilities/callOrReturn.js'\n\n/**\n * Build an input rule for automatically wrapping a textblock when a\n * given string is typed. When using a regular expresion you’ll\n * probably want the regexp to start with `^`, so that the pattern can\n * only occur at the start of a textblock.\n *\n * `type` is the type of node to wrap in.\n *\n * By default, if there’s a node with the same type above the newly\n * wrapped node, the rule will try to join those\n * two nodes. You can pass a join predicate, which takes a regular\n * expression match and the node before the wrapped node, and can\n * return a boolean to indicate whether a join should happen.\n */\nexport function wrappingInputRule(config: {\n find: InputRuleFinder,\n type: NodeType,\n keepMarks?: boolean,\n keepAttributes?: boolean,\n editor?: Editor\n getAttributes?:\n | Record\n | ((match: ExtendedRegExpMatchArray) => Record)\n | false\n | null\n ,\n joinPredicate?: (match: ExtendedRegExpMatchArray, node: ProseMirrorNode) => boolean,\n}) {\n return new InputRule({\n find: config.find,\n handler: ({\n state, range, match, chain,\n }) => {\n const attributes = callOrReturn(config.getAttributes, undefined, match) || {}\n const tr = state.tr.delete(range.from, range.to)\n const $start = tr.doc.resolve(range.from)\n const blockRange = $start.blockRange()\n const wrapping = blockRange && findWrapping(blockRange, config.type, attributes)\n\n if (!wrapping) {\n return null\n }\n\n tr.wrap(blockRange, wrapping)\n\n if (config.keepMarks && config.editor) {\n const { selection, storedMarks } = state\n const { splittableMarks } = config.editor.extensionManager\n const marks = storedMarks || (selection.$to.parentOffset && selection.$from.marks())\n\n if (marks) {\n const filteredMarks = marks.filter(mark => splittableMarks.includes(mark.type.name))\n\n tr.ensureMarks(filteredMarks)\n }\n }\n if (config.keepAttributes) {\n /** If the nodeType is `bulletList` or `orderedList` set the `nodeType` as `listItem` */\n const nodeType = config.type.name === 'bulletList' || config.type.name === 'orderedList' ? 'listItem' : 'taskList'\n\n chain().updateAttributes(nodeType, attributes).run()\n }\n\n const before = tr.doc.resolve(range.from - 1).nodeBefore\n\n if (\n before\n && before.type === config.type\n && canJoin(tr.doc, range.from - 1)\n && (!config.joinPredicate || config.joinPredicate(match, before))\n ) {\n tr.join(range.from - 1)\n }\n },\n })\n}\n","import {\n DOMOutputSpec, Mark as ProseMirrorMark, MarkSpec, MarkType,\n} from '@tiptap/pm/model'\nimport { Plugin, Transaction } from '@tiptap/pm/state'\n\nimport { Editor } from './Editor.js'\nimport { getExtensionField } from './helpers/getExtensionField.js'\nimport { MarkConfig } from './index.js'\nimport { InputRule } from './InputRule.js'\nimport { Node } from './Node.js'\nimport { PasteRule } from './PasteRule.js'\nimport {\n AnyConfig,\n Attributes,\n Extensions,\n GlobalAttributes,\n KeyboardShortcutCommand,\n ParentConfig,\n RawCommands,\n} from './types.js'\nimport { callOrReturn } from './utilities/callOrReturn.js'\nimport { mergeDeep } from './utilities/mergeDeep.js'\n\ndeclare module '@tiptap/core' {\n export interface MarkConfig {\n [key: string]: any\n\n /**\n * Name\n */\n name: string\n\n /**\n * Priority\n */\n priority?: number\n\n /**\n * Default options\n */\n defaultOptions?: Options\n\n /**\n * Default Options\n */\n addOptions?: (this: {\n name: string\n parent: Exclude>['addOptions'], undefined>\n }) => Options\n\n /**\n * Default Storage\n */\n addStorage?: (this: {\n name: string\n options: Options\n parent: Exclude>['addStorage'], undefined>\n }) => Storage\n\n /**\n * Global attributes\n */\n addGlobalAttributes?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['addGlobalAttributes']\n }) => GlobalAttributes | {}\n\n /**\n * Raw\n */\n addCommands?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: MarkType\n parent: ParentConfig>['addCommands']\n }) => Partial\n\n /**\n * Keyboard shortcuts\n */\n addKeyboardShortcuts?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: MarkType\n parent: ParentConfig>['addKeyboardShortcuts']\n }) => {\n [key: string]: KeyboardShortcutCommand\n }\n\n /**\n * Input rules\n */\n addInputRules?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: MarkType\n parent: ParentConfig>['addInputRules']\n }) => InputRule[]\n\n /**\n * Paste rules\n */\n addPasteRules?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: MarkType\n parent: ParentConfig>['addPasteRules']\n }) => PasteRule[]\n\n /**\n * ProseMirror plugins\n */\n addProseMirrorPlugins?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: MarkType\n parent: ParentConfig>['addProseMirrorPlugins']\n }) => Plugin[]\n\n /**\n * Extensions\n */\n addExtensions?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['addExtensions']\n }) => Extensions\n\n /**\n * Extend Node Schema\n */\n extendNodeSchema?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['extendNodeSchema']\n },\n extension: Node,\n ) => Record)\n | null\n\n /**\n * Extend Mark Schema\n */\n extendMarkSchema?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['extendMarkSchema']\n },\n extension: Mark,\n ) => Record)\n | null\n\n /**\n * The editor is not ready yet.\n */\n onBeforeCreate?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: MarkType\n parent: ParentConfig>['onBeforeCreate']\n }) => void)\n | null\n\n /**\n * The editor is ready.\n */\n onCreate?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: MarkType\n parent: ParentConfig>['onCreate']\n }) => void)\n | null\n\n /**\n * The content has changed.\n */\n onUpdate?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: MarkType\n parent: ParentConfig>['onUpdate']\n }) => void)\n | null\n\n /**\n * The selection has changed.\n */\n onSelectionUpdate?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: MarkType\n parent: ParentConfig>['onSelectionUpdate']\n }) => void)\n | null\n\n /**\n * The editor state has changed.\n */\n onTransaction?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: MarkType\n parent: ParentConfig>['onTransaction']\n },\n props: {\n transaction: Transaction\n },\n ) => void)\n | null\n\n /**\n * The editor is focused.\n */\n onFocus?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: MarkType\n parent: ParentConfig>['onFocus']\n },\n props: {\n event: FocusEvent\n },\n ) => void)\n | null\n\n /**\n * The editor isn’t focused anymore.\n */\n onBlur?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: MarkType\n parent: ParentConfig>['onBlur']\n },\n props: {\n event: FocusEvent\n },\n ) => void)\n | null\n\n /**\n * The editor is destroyed.\n */\n onDestroy?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: MarkType\n parent: ParentConfig>['onDestroy']\n }) => void)\n | null\n\n /**\n * Keep mark after split node\n */\n keepOnSplit?: boolean | (() => boolean)\n\n /**\n * Inclusive\n */\n inclusive?:\n | MarkSpec['inclusive']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['inclusive']\n editor?: Editor\n }) => MarkSpec['inclusive'])\n\n /**\n * Excludes\n */\n excludes?:\n | MarkSpec['excludes']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['excludes']\n editor?: Editor\n }) => MarkSpec['excludes'])\n\n /**\n * Marks this Mark as exitable\n */\n exitable?: boolean | (() => boolean)\n\n /**\n * Group\n */\n group?:\n | MarkSpec['group']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['group']\n editor?: Editor\n }) => MarkSpec['group'])\n\n /**\n * Spanning\n */\n spanning?:\n | MarkSpec['spanning']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['spanning']\n editor?: Editor\n }) => MarkSpec['spanning'])\n\n /**\n * Code\n */\n code?:\n | boolean\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['code']\n editor?: Editor\n }) => boolean)\n\n /**\n * Parse HTML\n */\n parseHTML?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['parseHTML']\n editor?: Editor\n }) => MarkSpec['parseDOM']\n\n /**\n * Render HTML\n */\n renderHTML?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['renderHTML']\n editor?: Editor\n },\n props: {\n mark: ProseMirrorMark\n HTMLAttributes: Record\n },\n ) => DOMOutputSpec)\n | null\n\n /**\n * Attributes\n */\n addAttributes?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['addAttributes']\n editor?: Editor\n }) => Attributes | {}\n }\n}\n\nexport class Mark {\n type = 'mark'\n\n name = 'mark'\n\n parent: Mark | null = null\n\n child: Mark | null = null\n\n options: Options\n\n storage: Storage\n\n config: MarkConfig = {\n name: this.name,\n defaultOptions: {},\n }\n\n constructor(config: Partial> = {}) {\n this.config = {\n ...this.config,\n ...config,\n }\n\n this.name = this.config.name\n\n if (config.defaultOptions) {\n console.warn(\n `[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${this.name}\".`,\n )\n }\n\n // TODO: remove `addOptions` fallback\n this.options = this.config.defaultOptions\n\n if (this.config.addOptions) {\n this.options = callOrReturn(\n getExtensionField(this, 'addOptions', {\n name: this.name,\n }),\n )\n }\n\n this.storage = callOrReturn(\n getExtensionField(this, 'addStorage', {\n name: this.name,\n options: this.options,\n }),\n ) || {}\n }\n\n static create(config: Partial> = {}) {\n return new Mark(config)\n }\n\n configure(options: Partial = {}) {\n // return a new instance so we can use the same extension\n // with different calls of `configure`\n const extension = this.extend()\n\n extension.options = mergeDeep(this.options as Record, options) as Options\n\n extension.storage = callOrReturn(\n getExtensionField(extension, 'addStorage', {\n name: extension.name,\n options: extension.options,\n }),\n )\n\n return extension\n }\n\n extend(\n extendedConfig: Partial> = {},\n ) {\n const extension = new Mark(extendedConfig)\n\n extension.parent = this\n\n this.child = extension\n\n extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name\n\n if (extendedConfig.defaultOptions) {\n console.warn(\n `[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${extension.name}\".`,\n )\n }\n\n extension.options = callOrReturn(\n getExtensionField(extension, 'addOptions', {\n name: extension.name,\n }),\n )\n\n extension.storage = callOrReturn(\n getExtensionField(extension, 'addStorage', {\n name: extension.name,\n options: extension.options,\n }),\n )\n\n return extension\n }\n\n static handleExit({ editor, mark }: { editor: Editor; mark: Mark }) {\n const { tr } = editor.state\n const currentPos = editor.state.selection.$from\n const isAtEnd = currentPos.pos === currentPos.end()\n\n if (isAtEnd) {\n const currentMarks = currentPos.marks()\n const isInMark = !!currentMarks.find(m => m?.type.name === mark.name)\n\n if (!isInMark) {\n return false\n }\n\n const removeMark = currentMarks.find(m => m?.type.name === mark.name)\n\n if (removeMark) {\n tr.removeStoredMark(removeMark)\n }\n tr.insertText(' ', currentPos.pos)\n\n editor.view.dispatch(tr)\n\n return true\n }\n\n return false\n }\n}\n","import {\n DOMOutputSpec, Node as ProseMirrorNode, NodeSpec, NodeType,\n} from '@tiptap/pm/model'\nimport { Plugin, Transaction } from '@tiptap/pm/state'\n\nimport { Editor } from './Editor.js'\nimport { getExtensionField } from './helpers/getExtensionField.js'\nimport { NodeConfig } from './index.js'\nimport { InputRule } from './InputRule.js'\nimport { PasteRule } from './PasteRule.js'\nimport {\n AnyConfig,\n Attributes,\n Extensions,\n GlobalAttributes,\n KeyboardShortcutCommand,\n NodeViewRenderer,\n ParentConfig,\n RawCommands,\n} from './types.js'\nimport { callOrReturn } from './utilities/callOrReturn.js'\nimport { mergeDeep } from './utilities/mergeDeep.js'\n\ndeclare module '@tiptap/core' {\n interface NodeConfig {\n [key: string]: any\n\n /**\n * Name\n */\n name: string\n\n /**\n * Priority\n */\n priority?: number\n\n /**\n * Default options\n */\n defaultOptions?: Options\n\n /**\n * Default Options\n */\n addOptions?: (this: {\n name: string\n parent: Exclude>['addOptions'], undefined>\n }) => Options\n\n /**\n * Default Storage\n */\n addStorage?: (this: {\n name: string\n options: Options\n parent: Exclude>['addStorage'], undefined>\n }) => Storage\n\n /**\n * Global attributes\n */\n addGlobalAttributes?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['addGlobalAttributes']\n }) => GlobalAttributes | {}\n\n /**\n * Raw\n */\n addCommands?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: NodeType\n parent: ParentConfig>['addCommands']\n }) => Partial\n\n /**\n * Keyboard shortcuts\n */\n addKeyboardShortcuts?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: NodeType\n parent: ParentConfig>['addKeyboardShortcuts']\n }) => {\n [key: string]: KeyboardShortcutCommand\n }\n\n /**\n * Input rules\n */\n addInputRules?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: NodeType\n parent: ParentConfig>['addInputRules']\n }) => InputRule[]\n\n /**\n * Paste rules\n */\n addPasteRules?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: NodeType\n parent: ParentConfig>['addPasteRules']\n }) => PasteRule[]\n\n /**\n * ProseMirror plugins\n */\n addProseMirrorPlugins?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: NodeType\n parent: ParentConfig>['addProseMirrorPlugins']\n }) => Plugin[]\n\n /**\n * Extensions\n */\n addExtensions?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['addExtensions']\n }) => Extensions\n\n /**\n * Extend Node Schema\n */\n extendNodeSchema?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['extendNodeSchema']\n },\n extension: Node,\n ) => Record)\n | null\n\n /**\n * Extend Mark Schema\n */\n extendMarkSchema?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['extendMarkSchema']\n editor?: Editor\n },\n extension: Node,\n ) => Record)\n | null\n\n /**\n * The editor is not ready yet.\n */\n onBeforeCreate?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: NodeType\n parent: ParentConfig>['onBeforeCreate']\n }) => void)\n | null\n\n /**\n * The editor is ready.\n */\n onCreate?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: NodeType\n parent: ParentConfig>['onCreate']\n }) => void)\n | null\n\n /**\n * The content has changed.\n */\n onUpdate?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: NodeType\n parent: ParentConfig>['onUpdate']\n }) => void)\n | null\n\n /**\n * The selection has changed.\n */\n onSelectionUpdate?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: NodeType\n parent: ParentConfig>['onSelectionUpdate']\n }) => void)\n | null\n\n /**\n * The editor state has changed.\n */\n onTransaction?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: NodeType\n parent: ParentConfig>['onTransaction']\n },\n props: {\n transaction: Transaction\n },\n ) => void)\n | null\n\n /**\n * The editor is focused.\n */\n onFocus?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: NodeType\n parent: ParentConfig>['onFocus']\n },\n props: {\n event: FocusEvent\n },\n ) => void)\n | null\n\n /**\n * The editor isn’t focused anymore.\n */\n onBlur?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: NodeType\n parent: ParentConfig>['onBlur']\n },\n props: {\n event: FocusEvent\n },\n ) => void)\n | null\n\n /**\n * The editor is destroyed.\n */\n onDestroy?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: NodeType\n parent: ParentConfig>['onDestroy']\n }) => void)\n | null\n\n /**\n * Node View\n */\n addNodeView?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: NodeType\n parent: ParentConfig>['addNodeView']\n }) => NodeViewRenderer)\n | null\n\n /**\n * TopNode\n */\n topNode?: boolean\n\n /**\n * Content\n */\n content?:\n | NodeSpec['content']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['content']\n editor?: Editor\n }) => NodeSpec['content'])\n\n /**\n * Marks\n */\n marks?:\n | NodeSpec['marks']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['marks']\n editor?: Editor\n }) => NodeSpec['marks'])\n\n /**\n * Group\n */\n group?:\n | NodeSpec['group']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['group']\n editor?: Editor\n }) => NodeSpec['group'])\n\n /**\n * Inline\n */\n inline?:\n | NodeSpec['inline']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['inline']\n editor?: Editor\n }) => NodeSpec['inline'])\n\n /**\n * Atom\n */\n atom?:\n | NodeSpec['atom']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['atom']\n editor?: Editor\n }) => NodeSpec['atom'])\n\n /**\n * Selectable\n */\n selectable?:\n | NodeSpec['selectable']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['selectable']\n editor?: Editor\n }) => NodeSpec['selectable'])\n\n /**\n * Draggable\n */\n draggable?:\n | NodeSpec['draggable']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['draggable']\n editor?: Editor\n }) => NodeSpec['draggable'])\n\n /**\n * Code\n */\n code?:\n | NodeSpec['code']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['code']\n editor?: Editor\n }) => NodeSpec['code'])\n\n /**\n * Whitespace\n */\n whitespace?:\n | NodeSpec['whitespace']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['whitespace']\n editor?: Editor\n }) => NodeSpec['whitespace'])\n\n /**\n * Defining\n */\n defining?:\n | NodeSpec['defining']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['defining']\n editor?: Editor\n }) => NodeSpec['defining'])\n\n /**\n * Isolating\n */\n isolating?:\n | NodeSpec['isolating']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['isolating']\n editor?: Editor\n }) => NodeSpec['isolating'])\n\n /**\n * Parse HTML\n */\n parseHTML?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['parseHTML']\n editor?: Editor\n }) => NodeSpec['parseDOM']\n\n /**\n * Render HTML\n */\n renderHTML?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['renderHTML']\n editor?: Editor\n },\n props: {\n node: ProseMirrorNode\n HTMLAttributes: Record\n },\n ) => DOMOutputSpec)\n | null\n\n /**\n * Render Text\n */\n renderText?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['renderText']\n editor?: Editor\n },\n props: {\n node: ProseMirrorNode\n pos: number\n parent: ProseMirrorNode\n index: number\n },\n ) => string)\n | null\n\n /**\n * Add Attributes\n */\n addAttributes?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig>['addAttributes']\n editor?: Editor\n }) => Attributes | {}\n }\n}\n\nexport class Node {\n type = 'node'\n\n name = 'node'\n\n parent: Node | null = null\n\n child: Node | null = null\n\n options: Options\n\n storage: Storage\n\n config: NodeConfig = {\n name: this.name,\n defaultOptions: {},\n }\n\n constructor(config: Partial> = {}) {\n this.config = {\n ...this.config,\n ...config,\n }\n\n this.name = this.config.name\n\n if (config.defaultOptions) {\n console.warn(\n `[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${this.name}\".`,\n )\n }\n\n // TODO: remove `addOptions` fallback\n this.options = this.config.defaultOptions\n\n if (this.config.addOptions) {\n this.options = callOrReturn(\n getExtensionField(this, 'addOptions', {\n name: this.name,\n }),\n )\n }\n\n this.storage = callOrReturn(\n getExtensionField(this, 'addStorage', {\n name: this.name,\n options: this.options,\n }),\n ) || {}\n }\n\n static create(config: Partial> = {}) {\n return new Node(config)\n }\n\n configure(options: Partial = {}) {\n // return a new instance so we can use the same extension\n // with different calls of `configure`\n const extension = this.extend()\n\n extension.options = mergeDeep(this.options as Record, options) as Options\n\n extension.storage = callOrReturn(\n getExtensionField(extension, 'addStorage', {\n name: extension.name,\n options: extension.options,\n }),\n )\n\n return extension\n }\n\n extend(\n extendedConfig: Partial> = {},\n ) {\n const extension = new Node(extendedConfig)\n\n extension.parent = this\n\n this.child = extension\n\n extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name\n\n if (extendedConfig.defaultOptions) {\n console.warn(\n `[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${extension.name}\".`,\n )\n }\n\n extension.options = callOrReturn(\n getExtensionField(extension, 'addOptions', {\n name: extension.name,\n }),\n )\n\n extension.storage = callOrReturn(\n getExtensionField(extension, 'addStorage', {\n name: extension.name,\n options: extension.options,\n }),\n )\n\n return extension\n }\n}\n","import { MarkType } from '@tiptap/pm/model'\n\nimport { getMarksBetween } from '../helpers/getMarksBetween.js'\nimport { PasteRule, PasteRuleFinder } from '../PasteRule.js'\nimport { ExtendedRegExpMatchArray } from '../types.js'\nimport { callOrReturn } from '../utilities/callOrReturn.js'\n\n/**\n * Build an paste rule that adds a mark when the\n * matched text is pasted into it.\n */\nexport function markPasteRule(config: {\n find: PasteRuleFinder\n type: MarkType\n getAttributes?:\n | Record\n | ((match: ExtendedRegExpMatchArray) => Record)\n | false\n | null\n}) {\n return new PasteRule({\n find: config.find,\n handler: ({ state, range, match }) => {\n const attributes = callOrReturn(config.getAttributes, undefined, match)\n\n if (attributes === false || attributes === null) {\n return null\n }\n\n const { tr } = state\n const captureGroup = match[match.length - 1]\n const fullMatch = match[0]\n let markEnd = range.to\n\n if (captureGroup) {\n const startSpaces = fullMatch.search(/\\S/)\n const textStart = range.from + fullMatch.indexOf(captureGroup)\n const textEnd = textStart + captureGroup.length\n\n const excludedMarks = getMarksBetween(range.from, range.to, state.doc)\n .filter(item => {\n // @ts-ignore\n const excluded = item.mark.type.excluded as MarkType[]\n\n return excluded.find(type => type === config.type && type !== item.mark.type)\n })\n .filter(item => item.to > textStart)\n\n if (excludedMarks.length) {\n return null\n }\n\n if (textEnd < range.to) {\n tr.delete(textEnd, range.to)\n }\n\n if (textStart > range.from) {\n tr.delete(range.from + startSpaces, textStart)\n }\n\n markEnd = range.from + startSpaces + captureGroup.length\n\n tr.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {}))\n\n tr.removeStoredMark(config.type)\n }\n },\n })\n}\n","import { Mark, mergeAttributes } from '@tiptap/core'\nimport { Plugin } from '@tiptap/pm/state'\nimport { registerCustomProtocol, reset } from 'linkifyjs'\n\nimport { autolink } from './helpers/autolink.js'\nimport { clickHandler } from './helpers/clickHandler.js'\nimport { pasteHandler } from './helpers/pasteHandler.js'\n\nexport interface LinkProtocolOptions {\n scheme: string;\n optionalSlashes?: boolean;\n}\n\nexport interface LinkOptions {\n /**\n * If enabled, it adds links as you type.\n */\n autolink: boolean\n /**\n * An array of custom protocols to be registered with linkifyjs.\n */\n protocols: Array\n /**\n * If enabled, links will be opened on click.\n */\n openOnClick: boolean\n /**\n * Adds a link to the current selection if the pasted content only contains an url.\n */\n linkOnPaste: boolean\n /**\n * A list of HTML attributes to be rendered.\n */\n HTMLAttributes: Record\n /**\n * A validation function that modifies link verification for the auto linker.\n * @param url - The url to be validated.\n * @returns - True if the url is valid, false otherwise.\n */\n validate?: (url: string) => boolean\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n link: {\n /**\n * Set a link mark\n */\n setLink: (attributes: { href: string; target?: string | null }) => ReturnType\n /**\n * Toggle a link mark\n */\n toggleLink: (attributes: { href: string; target?: string | null }) => ReturnType\n /**\n * Unset a link mark\n */\n unsetLink: () => ReturnType\n }\n }\n}\n\nexport const Link = Mark.create({\n name: 'link',\n\n priority: 1000,\n\n keepOnSplit: false,\n\n onCreate() {\n this.options.protocols.forEach(protocol => {\n if (typeof protocol === 'string') {\n registerCustomProtocol(protocol)\n return\n }\n registerCustomProtocol(protocol.scheme, protocol.optionalSlashes)\n })\n },\n\n onDestroy() {\n reset()\n },\n\n inclusive() {\n return this.options.autolink\n },\n\n addOptions() {\n return {\n openOnClick: true,\n linkOnPaste: true,\n autolink: true,\n protocols: [],\n HTMLAttributes: {\n target: '_blank',\n rel: 'noopener noreferrer nofollow',\n class: null,\n },\n validate: undefined,\n }\n },\n\n addAttributes() {\n return {\n href: {\n default: null,\n },\n target: {\n default: this.options.HTMLAttributes.target,\n },\n rel: {\n default: this.options.HTMLAttributes.rel,\n },\n class: {\n default: this.options.HTMLAttributes.class,\n },\n }\n },\n\n parseHTML() {\n return [{ tag: 'a[href]:not([href *= \"javascript:\" i])' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['a', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addCommands() {\n return {\n setLink:\n attributes => ({ chain }) => {\n return chain().setMark(this.name, attributes).setMeta('preventAutolink', true).run()\n },\n\n toggleLink:\n attributes => ({ chain }) => {\n return chain()\n .toggleMark(this.name, attributes, { extendEmptyMarkRange: true })\n .setMeta('preventAutolink', true)\n .run()\n },\n\n unsetLink:\n () => ({ chain }) => {\n return chain()\n .unsetMark(this.name, { extendEmptyMarkRange: true })\n .setMeta('preventAutolink', true)\n .run()\n },\n }\n },\n\n addProseMirrorPlugins() {\n const plugins: Plugin[] = []\n\n if (this.options.autolink) {\n plugins.push(\n autolink({\n type: this.type,\n validate: this.options.validate,\n }),\n )\n }\n\n if (this.options.openOnClick) {\n plugins.push(\n clickHandler({\n type: this.type,\n }),\n )\n }\n\n plugins.push(\n pasteHandler({\n editor: this.editor,\n type: this.type,\n linkOnPaste: this.options.linkOnPaste,\n }),\n )\n\n return plugins\n },\n})\n","import {\n combineTransactionSteps,\n findChildrenInRange,\n getChangedRanges,\n getMarksBetween,\n NodeWithPos,\n} from '@tiptap/core'\nimport { MarkType } from '@tiptap/pm/model'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\nimport { find } from 'linkifyjs'\n\ntype AutolinkOptions = {\n type: MarkType\n validate?: (url: string) => boolean\n}\n\nexport function autolink(options: AutolinkOptions): Plugin {\n return new Plugin({\n key: new PluginKey('autolink'),\n appendTransaction: (transactions, oldState, newState) => {\n const docChanges = transactions.some(transaction => transaction.docChanged) && !oldState.doc.eq(newState.doc)\n const preventAutolink = transactions.some(transaction => transaction.getMeta('preventAutolink'))\n\n if (!docChanges || preventAutolink) {\n return\n }\n\n const { tr } = newState\n const transform = combineTransactionSteps(oldState.doc, [...transactions])\n const changes = getChangedRanges(transform)\n\n changes.forEach(({ newRange }) => {\n // Now let’s see if we can add new links.\n const nodesInChangedRanges = findChildrenInRange(\n newState.doc,\n newRange,\n node => node.isTextblock,\n )\n\n let textBlock: NodeWithPos | undefined\n let textBeforeWhitespace: string | undefined\n\n if (nodesInChangedRanges.length > 1) {\n // Grab the first node within the changed ranges (ex. the first of two paragraphs when hitting enter).\n textBlock = nodesInChangedRanges[0]\n textBeforeWhitespace = newState.doc.textBetween(\n textBlock.pos,\n textBlock.pos + textBlock.node.nodeSize,\n undefined,\n ' ',\n )\n } else if (\n nodesInChangedRanges.length\n // We want to make sure to include the block seperator argument to treat hard breaks like spaces.\n && newState.doc.textBetween(newRange.from, newRange.to, ' ', ' ').endsWith(' ')\n ) {\n textBlock = nodesInChangedRanges[0]\n textBeforeWhitespace = newState.doc.textBetween(\n textBlock.pos,\n newRange.to,\n undefined,\n ' ',\n )\n }\n\n if (textBlock && textBeforeWhitespace) {\n const wordsBeforeWhitespace = textBeforeWhitespace.split(' ').filter(s => s !== '')\n\n if (wordsBeforeWhitespace.length <= 0) {\n return false\n }\n\n const lastWordBeforeSpace = wordsBeforeWhitespace[wordsBeforeWhitespace.length - 1]\n const lastWordAndBlockOffset = textBlock.pos + textBeforeWhitespace.lastIndexOf(lastWordBeforeSpace)\n\n if (!lastWordBeforeSpace) {\n return false\n }\n\n find(lastWordBeforeSpace)\n .filter(link => link.isLink)\n // Calculate link position.\n .map(link => ({\n ...link,\n from: lastWordAndBlockOffset + link.start + 1,\n to: lastWordAndBlockOffset + link.end + 1,\n }))\n // ignore link inside code mark\n .filter(link => {\n if (!newState.schema.marks.code) {\n return true\n }\n\n return !newState.doc.rangeHasMark(\n link.from,\n link.to,\n newState.schema.marks.code,\n )\n })\n // validate link\n .filter(link => {\n if (options.validate) {\n return options.validate(link.value)\n }\n return true\n })\n // Add link mark.\n .forEach(link => {\n if (getMarksBetween(link.from, link.to, newState.doc).some(item => item.mark.type === options.type)) {\n return\n }\n\n tr.addMark(\n link.from,\n link.to,\n options.type.create({\n href: link.href,\n }),\n )\n })\n }\n })\n\n if (!tr.steps.length) {\n return\n }\n\n return tr\n },\n })\n}\n","import { getAttributes } from '@tiptap/core'\nimport { MarkType } from '@tiptap/pm/model'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\n\ntype ClickHandlerOptions = {\n type: MarkType\n}\n\nexport function clickHandler(options: ClickHandlerOptions): Plugin {\n return new Plugin({\n key: new PluginKey('handleClickLink'),\n props: {\n handleClick: (view, pos, event) => {\n if (event.button !== 0) {\n return false\n }\n\n const eventTarget = event.target as HTMLElement\n\n if (eventTarget.nodeName !== 'A') {\n return false\n }\n\n const attrs = getAttributes(view.state, options.type.name)\n const link = (event.target as HTMLLinkElement)\n\n const href = link?.href ?? attrs.href\n const target = link?.target ?? attrs.target\n\n if (link && href) {\n if (view.editable) {\n window.open(href, target)\n }\n\n return true\n }\n\n return false\n },\n },\n })\n}\n","import { Editor } from '@tiptap/core'\nimport { MarkType } from '@tiptap/pm/model'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\nimport { find } from 'linkifyjs'\n\ntype PasteHandlerOptions = {\n editor: Editor\n type: MarkType\n linkOnPaste?: boolean\n}\n\nexport function pasteHandler(options: PasteHandlerOptions): Plugin {\n return new Plugin({\n key: new PluginKey('handlePasteLink'),\n props: {\n handlePaste: (view, event, slice) => {\n const { state } = view\n const { selection } = state\n\n // Do not proceed if in code block.\n if (state.doc.resolve(selection.from).parent.type.spec.code) {\n return false\n }\n\n let textContent = ''\n\n slice.content.forEach(node => {\n textContent += node.textContent\n })\n\n let isAlreadyLink = false\n\n slice.content.descendants(node => {\n if (node.marks.some(mark => mark.type.name === options.type.name)) {\n isAlreadyLink = true\n }\n })\n\n if (isAlreadyLink) {\n return\n }\n\n const link = find(textContent).find(item => item.isLink && item.value === textContent)\n\n if (!selection.empty && options.linkOnPaste) {\n const pastedLink = link?.href || null\n\n if (pastedLink) {\n options.editor.commands.setMark(options.type, { href: pastedLink })\n\n return true\n }\n }\n\n const firstChildIsText = slice.content.firstChild?.type.name === 'text'\n const firstChildContainsLinkMark = slice.content.firstChild?.marks.some(mark => mark.type.name === options.type.name)\n\n if ((firstChildIsText && firstChildContainsLinkMark) || !options.linkOnPaste) {\n return false\n }\n\n if (link && selection.empty) {\n options.editor.commands.insertContent(`${link.href}`)\n\n return true\n }\n\n const { tr } = state\n let deleteOnly = false\n\n if (!selection.empty) {\n deleteOnly = true\n\n tr.delete(selection.from, selection.to)\n }\n\n let currentPos = selection.from\n let fragmentLinks = []\n\n slice.content.forEach(node => {\n fragmentLinks = find(node.textContent)\n\n tr.insert(currentPos - 1, node)\n\n if (fragmentLinks.length > 0) {\n deleteOnly = false\n\n fragmentLinks.forEach(fragmentLink => {\n const linkStart = currentPos + fragmentLink.start\n const linkEnd = currentPos + fragmentLink.end\n const hasMark = tr.doc.rangeHasMark(linkStart, linkEnd, options.type)\n\n if (!hasMark) {\n tr.addMark(linkStart, linkEnd, options.type.create({ href: fragmentLink.href }))\n }\n })\n\n }\n currentPos += node.nodeSize\n })\n\n const hasFragmentLinks = fragmentLinks.length > 0\n\n if (tr.docChanged && !deleteOnly && hasFragmentLinks) {\n options.editor.view.dispatch(tr)\n\n return true\n }\n\n return false\n },\n },\n })\n}\n","import { mergeAttributes, Node, wrappingInputRule } from '@tiptap/core'\n\nexport interface BlockquoteOptions {\n HTMLAttributes: Record,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n blockQuote: {\n /**\n * Set a blockquote node\n */\n setBlockquote: () => ReturnType,\n /**\n * Toggle a blockquote node\n */\n toggleBlockquote: () => ReturnType,\n /**\n * Unset a blockquote node\n */\n unsetBlockquote: () => ReturnType,\n }\n }\n}\n\nexport const inputRegex = /^\\s*>\\s$/\n\nexport const Blockquote = Node.create({\n\n name: 'blockquote',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n }\n },\n\n content: 'block+',\n\n group: 'block',\n\n defining: true,\n\n parseHTML() {\n return [\n { tag: 'blockquote' },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['blockquote', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addCommands() {\n return {\n setBlockquote: () => ({ commands }) => {\n return commands.wrapIn(this.name)\n },\n toggleBlockquote: () => ({ commands }) => {\n return commands.toggleWrap(this.name)\n },\n unsetBlockquote: () => ({ commands }) => {\n return commands.lift(this.name)\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-b': () => this.editor.commands.toggleBlockquote(),\n }\n },\n\n addInputRules() {\n return [\n wrappingInputRule({\n find: inputRegex,\n type: this.type,\n }),\n ]\n },\n})\n","import {\n Mark,\n markInputRule,\n markPasteRule,\n mergeAttributes,\n} from '@tiptap/core'\n\nexport interface BoldOptions {\n HTMLAttributes: Record,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n bold: {\n /**\n * Set a bold mark\n */\n setBold: () => ReturnType,\n /**\n * Toggle a bold mark\n */\n toggleBold: () => ReturnType,\n /**\n * Unset a bold mark\n */\n unsetBold: () => ReturnType,\n }\n }\n}\n\nexport const starInputRegex = /(?:^|\\s)((?:\\*\\*)((?:[^*]+))(?:\\*\\*))$/\nexport const starPasteRegex = /(?:^|\\s)((?:\\*\\*)((?:[^*]+))(?:\\*\\*))/g\nexport const underscoreInputRegex = /(?:^|\\s)((?:__)((?:[^__]+))(?:__))$/\nexport const underscorePasteRegex = /(?:^|\\s)((?:__)((?:[^__]+))(?:__))/g\n\nexport const Bold = Mark.create({\n name: 'bold',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'strong',\n },\n {\n tag: 'b',\n getAttrs: node => (node as HTMLElement).style.fontWeight !== 'normal' && null,\n },\n {\n style: 'font-weight',\n getAttrs: value => /^(bold(er)?|[5-9]\\d{2,})$/.test(value as string) && null,\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['strong', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addCommands() {\n return {\n setBold: () => ({ commands }) => {\n return commands.setMark(this.name)\n },\n toggleBold: () => ({ commands }) => {\n return commands.toggleMark(this.name)\n },\n unsetBold: () => ({ commands }) => {\n return commands.unsetMark(this.name)\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-b': () => this.editor.commands.toggleBold(),\n 'Mod-B': () => this.editor.commands.toggleBold(),\n }\n },\n\n addInputRules() {\n return [\n markInputRule({\n find: starInputRegex,\n type: this.type,\n }),\n markInputRule({\n find: underscoreInputRegex,\n type: this.type,\n }),\n ]\n },\n\n addPasteRules() {\n return [\n markPasteRule({\n find: starPasteRegex,\n type: this.type,\n }),\n markPasteRule({\n find: underscorePasteRegex,\n type: this.type,\n }),\n ]\n },\n})\n","import { mergeAttributes, Node } from '@tiptap/core'\n\nexport interface ListItemOptions {\n HTMLAttributes: Record,\n bulletListTypeName: string\n orderedListTypeName: string\n}\n\nexport const ListItem = Node.create({\n name: 'listItem',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n bulletListTypeName: 'bulletList',\n orderedListTypeName: 'orderedList',\n }\n },\n\n content: 'paragraph block*',\n\n defining: true,\n\n parseHTML() {\n return [\n {\n tag: 'li',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['li', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: () => this.editor.commands.splitListItem(this.name),\n Tab: () => this.editor.commands.sinkListItem(this.name),\n 'Shift-Tab': () => this.editor.commands.liftListItem(this.name),\n }\n },\n})\n","import {\n getMarkAttributes,\n Mark,\n mergeAttributes,\n} from '@tiptap/core'\n\nexport interface TextStyleOptions {\n HTMLAttributes: Record,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n textStyle: {\n /**\n * Remove spans without inline style attributes.\n */\n removeEmptyTextStyle: () => ReturnType,\n }\n }\n}\n\nexport const TextStyle = Mark.create({\n name: 'textStyle',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'span',\n getAttrs: element => {\n const hasStyles = (element as HTMLElement).hasAttribute('style')\n\n if (!hasStyles) {\n return false\n }\n\n return {}\n },\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['span', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addCommands() {\n return {\n removeEmptyTextStyle: () => ({ state, commands }) => {\n const attributes = getMarkAttributes(state, this.type)\n const hasStyles = Object.entries(attributes).some(([, value]) => !!value)\n\n if (hasStyles) {\n return true\n }\n\n return commands.unsetMark(this.name)\n },\n }\n },\n\n})\n","import { mergeAttributes, Node, wrappingInputRule } from '@tiptap/core'\n\nimport ListItem from '../../extension-list-item/src/index.js'\nimport TextStyle from '../../extension-text-style/src/index.js'\n\nexport interface BulletListOptions {\n itemTypeName: string,\n HTMLAttributes: Record,\n keepMarks: boolean,\n keepAttributes: boolean,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n bulletList: {\n /**\n * Toggle a bullet list\n */\n toggleBulletList: () => ReturnType,\n }\n }\n}\n\nexport const inputRegex = /^\\s*([-+*])\\s$/\n\nexport const BulletList = Node.create({\n name: 'bulletList',\n\n addOptions() {\n return {\n itemTypeName: 'listItem',\n HTMLAttributes: {},\n keepMarks: false,\n keepAttributes: false,\n }\n },\n\n group: 'block list',\n\n content() {\n return `${this.options.itemTypeName}+`\n },\n\n parseHTML() {\n return [\n { tag: 'ul' },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['ul', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addCommands() {\n return {\n toggleBulletList: () => ({ commands, chain }) => {\n if (this.options.keepAttributes) {\n return chain().toggleList(this.name, this.options.itemTypeName, this.options.keepMarks).updateAttributes(ListItem.name, this.editor.getAttributes(TextStyle.name)).run()\n }\n return commands.toggleList(this.name, this.options.itemTypeName, this.options.keepMarks)\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-8': () => this.editor.commands.toggleBulletList(),\n }\n },\n\n addInputRules() {\n let inputRule = wrappingInputRule({\n find: inputRegex,\n type: this.type,\n })\n\n if (this.options.keepMarks || this.options.keepAttributes) {\n inputRule = wrappingInputRule({\n find: inputRegex,\n type: this.type,\n keepMarks: this.options.keepMarks,\n keepAttributes: this.options.keepAttributes,\n getAttributes: () => { return this.editor.getAttributes(TextStyle.name) },\n editor: this.editor,\n })\n }\n return [\n inputRule,\n ]\n },\n})\n","import {\n Mark,\n markInputRule,\n markPasteRule,\n mergeAttributes,\n} from '@tiptap/core'\n\nexport interface CodeOptions {\n HTMLAttributes: Record,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n code: {\n /**\n * Set a code mark\n */\n setCode: () => ReturnType,\n /**\n * Toggle inline code\n */\n toggleCode: () => ReturnType,\n /**\n * Unset a code mark\n */\n unsetCode: () => ReturnType,\n }\n }\n}\n\nexport const inputRegex = /(?:^|\\s)((?:`)((?:[^`]+))(?:`))$/\nexport const pasteRegex = /(?:^|\\s)((?:`)((?:[^`]+))(?:`))/g\n\nexport const Code = Mark.create({\n name: 'code',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n }\n },\n\n excludes: '_',\n\n code: true,\n\n exitable: true,\n\n parseHTML() {\n return [\n { tag: 'code' },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['code', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addCommands() {\n return {\n setCode: () => ({ commands }) => {\n return commands.setMark(this.name)\n },\n toggleCode: () => ({ commands }) => {\n return commands.toggleMark(this.name)\n },\n unsetCode: () => ({ commands }) => {\n return commands.unsetMark(this.name)\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-e': () => this.editor.commands.toggleCode(),\n }\n },\n\n addInputRules() {\n return [\n markInputRule({\n find: inputRegex,\n type: this.type,\n }),\n ]\n },\n\n addPasteRules() {\n return [\n markPasteRule({\n find: pasteRegex,\n type: this.type,\n }),\n ]\n },\n})\n","import { mergeAttributes, Node, textblockTypeInputRule } from '@tiptap/core'\nimport { Plugin, PluginKey, TextSelection } from '@tiptap/pm/state'\n\nexport interface CodeBlockOptions {\n /**\n * Adds a prefix to language classes that are applied to code tags.\n * Defaults to `'language-'`.\n */\n languageClassPrefix: string\n /**\n * Define whether the node should be exited on triple enter.\n * Defaults to `true`.\n */\n exitOnTripleEnter: boolean\n /**\n * Define whether the node should be exited on arrow down if there is no node after it.\n * Defaults to `true`.\n */\n exitOnArrowDown: boolean\n /**\n * Custom HTML attributes that should be added to the rendered HTML tag.\n */\n HTMLAttributes: Record\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n codeBlock: {\n /**\n * Set a code block\n */\n setCodeBlock: (attributes?: { language: string }) => ReturnType\n /**\n * Toggle a code block\n */\n toggleCodeBlock: (attributes?: { language: string }) => ReturnType\n }\n }\n}\n\nexport const backtickInputRegex = /^```([a-z]+)?[\\s\\n]$/\nexport const tildeInputRegex = /^~~~([a-z]+)?[\\s\\n]$/\n\nexport const CodeBlock = Node.create({\n name: 'codeBlock',\n\n addOptions() {\n return {\n languageClassPrefix: 'language-',\n exitOnTripleEnter: true,\n exitOnArrowDown: true,\n HTMLAttributes: {},\n }\n },\n\n content: 'text*',\n\n marks: '',\n\n group: 'block',\n\n code: true,\n\n defining: true,\n\n addAttributes() {\n return {\n language: {\n default: null,\n parseHTML: element => {\n const { languageClassPrefix } = this.options\n const classNames = [...(element.firstElementChild?.classList || [])]\n const languages = classNames\n .filter(className => className.startsWith(languageClassPrefix))\n .map(className => className.replace(languageClassPrefix, ''))\n const language = languages[0]\n\n if (!language) {\n return null\n }\n\n return language\n },\n rendered: false,\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n },\n ]\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'pre',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n [\n 'code',\n {\n class: node.attrs.language\n ? this.options.languageClassPrefix + node.attrs.language\n : null,\n },\n 0,\n ],\n ]\n },\n\n addCommands() {\n return {\n setCodeBlock:\n attributes => ({ commands }) => {\n return commands.setNode(this.name, attributes)\n },\n toggleCodeBlock:\n attributes => ({ commands }) => {\n return commands.toggleNode(this.name, 'paragraph', attributes)\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Alt-c': () => this.editor.commands.toggleCodeBlock(),\n\n // remove code block when at start of document or code block is empty\n Backspace: () => {\n const { empty, $anchor } = this.editor.state.selection\n const isAtStart = $anchor.pos === 1\n\n if (!empty || $anchor.parent.type.name !== this.name) {\n return false\n }\n\n if (isAtStart || !$anchor.parent.textContent.length) {\n return this.editor.commands.clearNodes()\n }\n\n return false\n },\n\n // exit node on triple enter\n Enter: ({ editor }) => {\n if (!this.options.exitOnTripleEnter) {\n return false\n }\n\n const { state } = editor\n const { selection } = state\n const { $from, empty } = selection\n\n if (!empty || $from.parent.type !== this.type) {\n return false\n }\n\n const isAtEnd = $from.parentOffset === $from.parent.nodeSize - 2\n const endsWithDoubleNewline = $from.parent.textContent.endsWith('\\n\\n')\n\n if (!isAtEnd || !endsWithDoubleNewline) {\n return false\n }\n\n return editor\n .chain()\n .command(({ tr }) => {\n tr.delete($from.pos - 2, $from.pos)\n\n return true\n })\n .exitCode()\n .run()\n },\n\n // exit node on arrow down\n ArrowDown: ({ editor }) => {\n if (!this.options.exitOnArrowDown) {\n return false\n }\n\n const { state } = editor\n const { selection, doc } = state\n const { $from, empty } = selection\n\n if (!empty || $from.parent.type !== this.type) {\n return false\n }\n\n const isAtEnd = $from.parentOffset === $from.parent.nodeSize - 2\n\n if (!isAtEnd) {\n return false\n }\n\n const after = $from.after()\n\n if (after === undefined) {\n return false\n }\n\n const nodeAfter = doc.nodeAt(after)\n\n if (nodeAfter) {\n return false\n }\n\n return editor.commands.exitCode()\n },\n }\n },\n\n addInputRules() {\n return [\n textblockTypeInputRule({\n find: backtickInputRegex,\n type: this.type,\n getAttributes: match => ({\n language: match[1],\n }),\n }),\n textblockTypeInputRule({\n find: tildeInputRegex,\n type: this.type,\n getAttributes: match => ({\n language: match[1],\n }),\n }),\n ]\n },\n\n addProseMirrorPlugins() {\n return [\n // this plugin creates a code block for pasted content from VS Code\n // we can also detect the copied code language\n new Plugin({\n key: new PluginKey('codeBlockVSCodeHandler'),\n props: {\n handlePaste: (view, event) => {\n if (!event.clipboardData) {\n return false\n }\n\n // don’t create a new code block within code blocks\n if (this.editor.isActive(this.type.name)) {\n return false\n }\n\n const text = event.clipboardData.getData('text/plain')\n const vscode = event.clipboardData.getData('vscode-editor-data')\n const vscodeData = vscode ? JSON.parse(vscode) : undefined\n const language = vscodeData?.mode\n\n if (!text || !language) {\n return false\n }\n\n const { tr } = view.state\n\n // create an empty code block\n tr.replaceSelectionWith(this.type.create({ language }))\n\n // put cursor inside the newly created code block\n tr.setSelection(TextSelection.near(tr.doc.resolve(Math.max(0, tr.selection.from - 2))))\n\n // add text to code block\n // strip carriage return chars from text pasted as code\n // see: https://github.com/ProseMirror/prosemirror-view/commit/a50a6bcceb4ce52ac8fcc6162488d8875613aacd\n tr.insertText(text.replace(/\\r\\n?/g, '\\n'))\n\n // store meta information\n // this is useful for other plugins that depends on the paste event\n // like the paste rule plugin\n tr.setMeta('paste', true)\n\n view.dispatch(tr)\n\n return true\n },\n },\n }),\n ]\n },\n})\n","import { Node } from '@tiptap/core'\n\nexport const Document = Node.create({\n name: 'doc',\n topNode: true,\n content: 'block+',\n})\n","import { Extension } from '@tiptap/core'\nimport { dropCursor } from '@tiptap/pm/dropcursor'\n\nexport interface DropcursorOptions {\n color: string | undefined,\n width: number | undefined,\n class: string | undefined,\n}\n\nexport const Dropcursor = Extension.create({\n name: 'dropCursor',\n\n addOptions() {\n return {\n color: 'currentColor',\n width: 1,\n class: undefined,\n }\n },\n\n addProseMirrorPlugins() {\n return [\n dropCursor(this.options),\n ]\n },\n})\n","import {\n callOrReturn,\n Extension,\n getExtensionField,\n ParentConfig,\n} from '@tiptap/core'\nimport { gapCursor } from '@tiptap/pm/gapcursor'\n\ndeclare module '@tiptap/core' {\n interface NodeConfig {\n /**\n * Allow gap cursor\n */\n allowGapCursor?:\n | boolean\n | null\n | ((this: {\n name: string,\n options: Options,\n storage: Storage,\n parent: ParentConfig>['allowGapCursor'],\n }) => boolean | null),\n }\n}\n\nexport const Gapcursor = Extension.create({\n name: 'gapCursor',\n\n addProseMirrorPlugins() {\n return [\n gapCursor(),\n ]\n },\n\n extendNodeSchema(extension) {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n }\n\n return {\n allowGapCursor: callOrReturn(getExtensionField(extension, 'allowGapCursor', context)) ?? null,\n }\n },\n})\n","import { mergeAttributes, Node } from '@tiptap/core'\n\nexport interface HardBreakOptions {\n keepMarks: boolean,\n HTMLAttributes: Record,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n hardBreak: {\n /**\n * Add a hard break\n */\n setHardBreak: () => ReturnType,\n }\n }\n}\n\nexport const HardBreak = Node.create({\n name: 'hardBreak',\n\n addOptions() {\n return {\n keepMarks: true,\n HTMLAttributes: {},\n }\n },\n\n inline: true,\n\n group: 'inline',\n\n selectable: false,\n\n parseHTML() {\n return [\n { tag: 'br' },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['br', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)]\n },\n\n renderText() {\n return '\\n'\n },\n\n addCommands() {\n return {\n setHardBreak: () => ({\n commands,\n chain,\n state,\n editor,\n }) => {\n return commands.first([\n () => commands.exitCode(),\n () => commands.command(() => {\n const { selection, storedMarks } = state\n\n if (selection.$from.parent.type.spec.isolating) {\n return false\n }\n\n const { keepMarks } = this.options\n const { splittableMarks } = editor.extensionManager\n const marks = storedMarks\n || (selection.$to.parentOffset && selection.$from.marks())\n\n return chain()\n .insertContent({ type: this.name })\n .command(({ tr, dispatch }) => {\n if (dispatch && marks && keepMarks) {\n const filteredMarks = marks\n .filter(mark => splittableMarks.includes(mark.type.name))\n\n tr.ensureMarks(filteredMarks)\n }\n\n return true\n })\n .run()\n }),\n ])\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Enter': () => this.editor.commands.setHardBreak(),\n 'Shift-Enter': () => this.editor.commands.setHardBreak(),\n }\n },\n})\n","import { mergeAttributes, Node, textblockTypeInputRule } from '@tiptap/core'\n\nexport type Level = 1 | 2 | 3 | 4 | 5 | 6\n\nexport interface HeadingOptions {\n levels: Level[],\n HTMLAttributes: Record,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n heading: {\n /**\n * Set a heading node\n */\n setHeading: (attributes: { level: Level }) => ReturnType,\n /**\n * Toggle a heading node\n */\n toggleHeading: (attributes: { level: Level }) => ReturnType,\n }\n }\n}\n\nexport const Heading = Node.create({\n name: 'heading',\n\n addOptions() {\n return {\n levels: [1, 2, 3, 4, 5, 6],\n HTMLAttributes: {},\n }\n },\n\n content: 'inline*',\n\n group: 'block',\n\n defining: true,\n\n addAttributes() {\n return {\n level: {\n default: 1,\n rendered: false,\n },\n }\n },\n\n parseHTML() {\n return this.options.levels\n .map((level: Level) => ({\n tag: `h${level}`,\n attrs: { level },\n }))\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const hasLevel = this.options.levels.includes(node.attrs.level)\n const level = hasLevel\n ? node.attrs.level\n : this.options.levels[0]\n\n return [`h${level}`, mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addCommands() {\n return {\n setHeading: attributes => ({ commands }) => {\n if (!this.options.levels.includes(attributes.level)) {\n return false\n }\n\n return commands.setNode(this.name, attributes)\n },\n toggleHeading: attributes => ({ commands }) => {\n if (!this.options.levels.includes(attributes.level)) {\n return false\n }\n\n return commands.toggleNode(this.name, 'paragraph', attributes)\n },\n }\n },\n\n addKeyboardShortcuts() {\n return this.options.levels.reduce((items, level) => ({\n ...items,\n ...{\n [`Mod-Alt-${level}`]: () => this.editor.commands.toggleHeading({ level }),\n },\n }), {})\n },\n\n addInputRules() {\n return this.options.levels.map(level => {\n return textblockTypeInputRule({\n find: new RegExp(`^(#{1,${level}})\\\\s$`),\n type: this.type,\n getAttributes: {\n level,\n },\n })\n })\n },\n})\n","import { Extension } from '@tiptap/core'\nimport { history, redo, undo } from '@tiptap/pm/history'\n\nexport interface HistoryOptions {\n depth: number,\n newGroupDelay: number,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n history: {\n /**\n * Undo recent changes\n */\n undo: () => ReturnType,\n /**\n * Reapply reverted changes\n */\n redo: () => ReturnType,\n }\n }\n}\n\nexport const History = Extension.create({\n name: 'history',\n\n addOptions() {\n return {\n depth: 100,\n newGroupDelay: 500,\n }\n },\n\n addCommands() {\n return {\n undo: () => ({ state, dispatch }) => {\n return undo(state, dispatch)\n },\n redo: () => ({ state, dispatch }) => {\n return redo(state, dispatch)\n },\n }\n },\n\n addProseMirrorPlugins() {\n return [\n history(this.options),\n ]\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-z': () => this.editor.commands.undo(),\n 'Mod-Z': () => this.editor.commands.undo(),\n 'Mod-y': () => this.editor.commands.redo(),\n 'Mod-Y': () => this.editor.commands.redo(),\n 'Shift-Mod-z': () => this.editor.commands.redo(),\n 'Shift-Mod-Z': () => this.editor.commands.redo(),\n\n // Russian keyboard layouts\n 'Mod-я': () => this.editor.commands.undo(),\n 'Shift-Mod-я': () => this.editor.commands.redo(),\n }\n },\n})\n","import { mergeAttributes, Node, nodeInputRule } from '@tiptap/core'\nimport { NodeSelection, TextSelection } from '@tiptap/pm/state'\n\nexport interface HorizontalRuleOptions {\n HTMLAttributes: Record\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n horizontalRule: {\n /**\n * Add a horizontal rule\n */\n setHorizontalRule: () => ReturnType\n }\n }\n}\n\nexport const HorizontalRule = Node.create({\n name: 'horizontalRule',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n }\n },\n\n group: 'block',\n\n parseHTML() {\n return [{ tag: 'hr' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['hr', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)]\n },\n\n addCommands() {\n return {\n setHorizontalRule:\n () => ({ chain, state }) => {\n const { $to: $originTo } = state.selection\n\n const currentChain = chain()\n\n if ($originTo.parentOffset === 0) {\n currentChain.insertContentAt(Math.max($originTo.pos - 2, 0), { type: this.name })\n } else {\n currentChain.insertContent({ type: this.name })\n }\n\n return (\n currentChain\n // set cursor after horizontal rule\n .command(({ tr, dispatch }) => {\n if (dispatch) {\n const { $to } = tr.selection\n const posAfter = $to.end()\n\n if ($to.nodeAfter) {\n if ($to.nodeAfter.isTextblock) {\n tr.setSelection(TextSelection.create(tr.doc, $to.pos + 1))\n } else if ($to.nodeAfter.isBlock) {\n tr.setSelection(NodeSelection.create(tr.doc, $to.pos))\n } else {\n tr.setSelection(TextSelection.create(tr.doc, $to.pos))\n }\n } else {\n // add node after horizontal rule if it’s the end of the document\n const node = $to.parent.type.contentMatch.defaultType?.create()\n\n if (node) {\n tr.insert(posAfter, node)\n tr.setSelection(TextSelection.create(tr.doc, posAfter + 1))\n }\n }\n\n tr.scrollIntoView()\n }\n\n return true\n })\n .run()\n )\n },\n }\n },\n\n addInputRules() {\n return [\n nodeInputRule({\n find: /^(?:---|—-|___\\s|\\*\\*\\*\\s)$/,\n type: this.type,\n }),\n ]\n },\n})\n","import {\n Mark,\n markInputRule,\n markPasteRule,\n mergeAttributes,\n} from '@tiptap/core'\n\nexport interface ItalicOptions {\n HTMLAttributes: Record,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n italic: {\n /**\n * Set an italic mark\n */\n setItalic: () => ReturnType,\n /**\n * Toggle an italic mark\n */\n toggleItalic: () => ReturnType,\n /**\n * Unset an italic mark\n */\n unsetItalic: () => ReturnType,\n }\n }\n}\n\nexport const starInputRegex = /(?:^|\\s)((?:\\*)((?:[^*]+))(?:\\*))$/\nexport const starPasteRegex = /(?:^|\\s)((?:\\*)((?:[^*]+))(?:\\*))/g\nexport const underscoreInputRegex = /(?:^|\\s)((?:_)((?:[^_]+))(?:_))$/\nexport const underscorePasteRegex = /(?:^|\\s)((?:_)((?:[^_]+))(?:_))/g\n\nexport const Italic = Mark.create({\n name: 'italic',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'em',\n },\n {\n tag: 'i',\n getAttrs: node => (node as HTMLElement).style.fontStyle !== 'normal' && null,\n },\n {\n style: 'font-style=italic',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['em', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addCommands() {\n return {\n setItalic: () => ({ commands }) => {\n return commands.setMark(this.name)\n },\n toggleItalic: () => ({ commands }) => {\n return commands.toggleMark(this.name)\n },\n unsetItalic: () => ({ commands }) => {\n return commands.unsetMark(this.name)\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-i': () => this.editor.commands.toggleItalic(),\n 'Mod-I': () => this.editor.commands.toggleItalic(),\n }\n },\n\n addInputRules() {\n return [\n markInputRule({\n find: starInputRegex,\n type: this.type,\n }),\n markInputRule({\n find: underscoreInputRegex,\n type: this.type,\n }),\n ]\n },\n\n addPasteRules() {\n return [\n markPasteRule({\n find: starPasteRegex,\n type: this.type,\n }),\n markPasteRule({\n find: underscorePasteRegex,\n type: this.type,\n }),\n ]\n },\n})\n","import { mergeAttributes, Node } from '@tiptap/core'\n\nexport interface ListItemOptions {\n HTMLAttributes: Record,\n bulletListTypeName: string\n orderedListTypeName: string\n}\n\nexport const ListItem = Node.create({\n name: 'listItem',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n bulletListTypeName: 'bulletList',\n orderedListTypeName: 'orderedList',\n }\n },\n\n content: 'paragraph block*',\n\n defining: true,\n\n parseHTML() {\n return [\n {\n tag: 'li',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['li', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: () => this.editor.commands.splitListItem(this.name),\n Tab: () => this.editor.commands.sinkListItem(this.name),\n 'Shift-Tab': () => this.editor.commands.liftListItem(this.name),\n }\n },\n})\n","import { mergeAttributes, Node, wrappingInputRule } from '@tiptap/core'\n\nimport ListItem from '../../extension-list-item/src/index.js'\nimport TextStyle from '../../extension-text-style/src/index.js'\n\nexport interface OrderedListOptions {\n itemTypeName: string,\n HTMLAttributes: Record,\n keepMarks: boolean,\n keepAttributes: boolean,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n orderedList: {\n /**\n * Toggle an ordered list\n */\n toggleOrderedList: () => ReturnType,\n }\n }\n}\n\nexport const inputRegex = /^(\\d+)\\.\\s$/\n\nexport const OrderedList = Node.create({\n name: 'orderedList',\n\n addOptions() {\n return {\n itemTypeName: 'listItem',\n HTMLAttributes: {},\n keepMarks: false,\n keepAttributes: false,\n }\n },\n\n group: 'block list',\n\n content() {\n return `${this.options.itemTypeName}+`\n },\n\n addAttributes() {\n return {\n start: {\n default: 1,\n parseHTML: element => {\n return element.hasAttribute('start')\n ? parseInt(element.getAttribute('start') || '', 10)\n : 1\n },\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'ol',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n const { start, ...attributesWithoutStart } = HTMLAttributes\n\n return start === 1\n ? ['ol', mergeAttributes(this.options.HTMLAttributes, attributesWithoutStart), 0]\n : ['ol', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addCommands() {\n return {\n toggleOrderedList: () => ({ commands, chain }) => {\n if (this.options.keepAttributes) {\n return chain().toggleList(this.name, this.options.itemTypeName, this.options.keepMarks).updateAttributes(ListItem.name, this.editor.getAttributes(TextStyle.name)).run()\n }\n return commands.toggleList(this.name, this.options.itemTypeName, this.options.keepMarks)\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-7': () => this.editor.commands.toggleOrderedList(),\n }\n },\n\n addInputRules() {\n let inputRule = wrappingInputRule({\n find: inputRegex,\n type: this.type,\n getAttributes: match => ({ start: +match[1] }),\n joinPredicate: (match, node) => node.childCount + node.attrs.start === +match[1],\n })\n\n if (this.options.keepMarks || this.options.keepAttributes) {\n inputRule = wrappingInputRule({\n find: inputRegex,\n type: this.type,\n keepMarks: this.options.keepMarks,\n keepAttributes: this.options.keepAttributes,\n getAttributes: match => ({ start: +match[1], ...this.editor.getAttributes(TextStyle.name) }),\n joinPredicate: (match, node) => node.childCount + node.attrs.start === +match[1],\n editor: this.editor,\n })\n }\n return [\n inputRule,\n ]\n },\n})\n","import { mergeAttributes, Node } from '@tiptap/core'\n\nexport interface ParagraphOptions {\n HTMLAttributes: Record,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n paragraph: {\n /**\n * Toggle a paragraph\n */\n setParagraph: () => ReturnType,\n }\n }\n}\n\nexport const Paragraph = Node.create({\n name: 'paragraph',\n\n priority: 1000,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n }\n },\n\n group: 'block',\n\n content: 'inline*',\n\n parseHTML() {\n return [\n { tag: 'p' },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['p', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addCommands() {\n return {\n setParagraph: () => ({ commands }) => {\n return commands.setNode(this.name)\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Alt-0': () => this.editor.commands.setParagraph(),\n }\n },\n})\n","import {\n isMacOS,\n Mark,\n markInputRule,\n markPasteRule,\n mergeAttributes,\n} from '@tiptap/core'\n\nexport interface StrikeOptions {\n HTMLAttributes: Record,\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\n strike: {\n /**\n * Set a strike mark\n */\n setStrike: () => ReturnType,\n /**\n * Toggle a strike mark\n */\n toggleStrike: () => ReturnType,\n /**\n * Unset a strike mark\n */\n unsetStrike: () => ReturnType,\n }\n }\n}\n\nexport const inputRegex = /(?:^|\\s)((?:~~)((?:[^~]+))(?:~~))$/\nexport const pasteRegex = /(?:^|\\s)((?:~~)((?:[^~]+))(?:~~))/g\n\nexport const Strike = Mark.create({\n name: 'strike',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 's',\n },\n {\n tag: 'del',\n },\n {\n tag: 'strike',\n },\n {\n style: 'text-decoration',\n consuming: false,\n getAttrs: style => ((style as string).includes('line-through') ? {} : false),\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['s', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addCommands() {\n return {\n setStrike: () => ({ commands }) => {\n return commands.setMark(this.name)\n },\n toggleStrike: () => ({ commands }) => {\n return commands.toggleMark(this.name)\n },\n unsetStrike: () => ({ commands }) => {\n return commands.unsetMark(this.name)\n },\n }\n },\n\n addKeyboardShortcuts() {\n const shortcuts: Record boolean> = {}\n\n if (isMacOS()) {\n shortcuts['Mod-Shift-s'] = () => this.editor.commands.toggleStrike()\n } else {\n shortcuts['Ctrl-Shift-s'] = () => this.editor.commands.toggleStrike()\n }\n\n return shortcuts\n },\n\n addInputRules() {\n return [\n markInputRule({\n find: inputRegex,\n type: this.type,\n }),\n ]\n },\n\n addPasteRules() {\n return [\n markPasteRule({\n find: pasteRegex,\n type: this.type,\n }),\n ]\n },\n})\n","import { Node } from '@tiptap/core'\n\nexport const Text = Node.create({\n name: 'text',\n group: 'inline',\n})\n","import { Extension } from '@tiptap/core'\nimport { Blockquote, BlockquoteOptions } from '@tiptap/extension-blockquote'\nimport { Bold, BoldOptions } from '@tiptap/extension-bold'\nimport { BulletList, BulletListOptions } from '@tiptap/extension-bullet-list'\nimport { Code, CodeOptions } from '@tiptap/extension-code'\nimport { CodeBlock, CodeBlockOptions } from '@tiptap/extension-code-block'\nimport { Document } from '@tiptap/extension-document'\nimport { Dropcursor, DropcursorOptions } from '@tiptap/extension-dropcursor'\nimport { Gapcursor } from '@tiptap/extension-gapcursor'\nimport { HardBreak, HardBreakOptions } from '@tiptap/extension-hard-break'\nimport { Heading, HeadingOptions } from '@tiptap/extension-heading'\nimport { History, HistoryOptions } from '@tiptap/extension-history'\nimport { HorizontalRule, HorizontalRuleOptions } from '@tiptap/extension-horizontal-rule'\nimport { Italic, ItalicOptions } from '@tiptap/extension-italic'\nimport { ListItem, ListItemOptions } from '@tiptap/extension-list-item'\nimport { OrderedList, OrderedListOptions } from '@tiptap/extension-ordered-list'\nimport { Paragraph, ParagraphOptions } from '@tiptap/extension-paragraph'\nimport { Strike, StrikeOptions } from '@tiptap/extension-strike'\nimport { Text } from '@tiptap/extension-text'\n\nexport interface StarterKitOptions {\n blockquote: Partial | false,\n bold: Partial | false,\n bulletList: Partial | false,\n code: Partial | false,\n codeBlock: Partial | false,\n document: false,\n dropcursor: Partial | false,\n gapcursor: false,\n hardBreak: Partial | false,\n heading: Partial | false,\n history: Partial | false,\n horizontalRule: Partial | false,\n italic: Partial | false,\n listItem: Partial | false,\n orderedList: Partial | false,\n paragraph: Partial | false,\n strike: Partial | false,\n text: false,\n}\n\nexport const StarterKit = Extension.create({\n name: 'starterKit',\n\n addExtensions() {\n const extensions = []\n\n if (this.options.blockquote !== false) {\n extensions.push(Blockquote.configure(this.options?.blockquote))\n }\n\n if (this.options.bold !== false) {\n extensions.push(Bold.configure(this.options?.bold))\n }\n\n if (this.options.bulletList !== false) {\n extensions.push(BulletList.configure(this.options?.bulletList))\n }\n\n if (this.options.code !== false) {\n extensions.push(Code.configure(this.options?.code))\n }\n\n if (this.options.codeBlock !== false) {\n extensions.push(CodeBlock.configure(this.options?.codeBlock))\n }\n\n if (this.options.document !== false) {\n extensions.push(Document.configure(this.options?.document))\n }\n\n if (this.options.dropcursor !== false) {\n extensions.push(Dropcursor.configure(this.options?.dropcursor))\n }\n\n if (this.options.gapcursor !== false) {\n extensions.push(Gapcursor.configure(this.options?.gapcursor))\n }\n\n if (this.options.hardBreak !== false) {\n extensions.push(HardBreak.configure(this.options?.hardBreak))\n }\n\n if (this.options.heading !== false) {\n extensions.push(Heading.configure(this.options?.heading))\n }\n\n if (this.options.history !== false) {\n extensions.push(History.configure(this.options?.history))\n }\n\n if (this.options.horizontalRule !== false) {\n extensions.push(HorizontalRule.configure(this.options?.horizontalRule))\n }\n\n if (this.options.italic !== false) {\n extensions.push(Italic.configure(this.options?.italic))\n }\n\n if (this.options.listItem !== false) {\n extensions.push(ListItem.configure(this.options?.listItem))\n }\n\n if (this.options.orderedList !== false) {\n extensions.push(OrderedList.configure(this.options?.orderedList))\n }\n\n if (this.options.paragraph !== false) {\n extensions.push(Paragraph.configure(this.options?.paragraph))\n }\n\n if (this.options.strike !== false) {\n extensions.push(Strike.configure(this.options?.strike))\n }\n\n if (this.options.text !== false) {\n extensions.push(Text.configure(this.options?.text))\n }\n\n return extensions\n },\n})\n","import {\n Editor, isNodeSelection, isTextSelection, posToDOMRect,\n} from '@tiptap/core'\nimport { EditorState, Plugin, PluginKey } from '@tiptap/pm/state'\nimport { EditorView } from '@tiptap/pm/view'\nimport tippy, { Instance, Props } from 'tippy.js'\n\nexport interface BubbleMenuPluginProps {\n pluginKey: PluginKey | string\n editor: Editor\n element: HTMLElement\n tippyOptions?: Partial\n updateDelay?: number\n shouldShow?:\n | ((props: {\n editor: Editor\n view: EditorView\n state: EditorState\n oldState?: EditorState\n from: number\n to: number\n }) => boolean)\n | null\n}\n\nexport type BubbleMenuViewProps = BubbleMenuPluginProps & {\n view: EditorView\n}\n\nexport class BubbleMenuView {\n public editor: Editor\n\n public element: HTMLElement\n\n public view: EditorView\n\n public preventHide = false\n\n public tippy: Instance | undefined\n\n public tippyOptions?: Partial\n\n public updateDelay: number\n\n private updateDebounceTimer: number | undefined\n\n public shouldShow: Exclude = ({\n view,\n state,\n from,\n to,\n }) => {\n const { doc, selection } = state\n const { empty } = selection\n\n // Sometime check for `empty` is not enough.\n // Doubleclick an empty paragraph returns a node size of 2.\n // So we check also for an empty text size.\n const isEmptyTextBlock = !doc.textBetween(from, to).length && isTextSelection(state.selection)\n\n // When clicking on a element inside the bubble menu the editor \"blur\" event\n // is called and the bubble menu item is focussed. In this case we should\n // consider the menu as part of the editor and keep showing the menu\n const isChildOfMenu = this.element.contains(document.activeElement)\n\n const hasEditorFocus = view.hasFocus() || isChildOfMenu\n\n if (!hasEditorFocus || empty || isEmptyTextBlock || !this.editor.isEditable) {\n return false\n }\n\n return true\n }\n\n constructor({\n editor,\n element,\n view,\n tippyOptions = {},\n updateDelay = 250,\n shouldShow,\n }: BubbleMenuViewProps) {\n this.editor = editor\n this.element = element\n this.view = view\n this.updateDelay = updateDelay\n\n if (shouldShow) {\n this.shouldShow = shouldShow\n }\n\n this.element.addEventListener('mousedown', this.mousedownHandler, { capture: true })\n this.view.dom.addEventListener('dragstart', this.dragstartHandler)\n this.editor.on('focus', this.focusHandler)\n this.editor.on('blur', this.blurHandler)\n this.tippyOptions = tippyOptions\n // Detaches menu content from its current parent\n this.element.remove()\n this.element.style.visibility = 'visible'\n }\n\n mousedownHandler = () => {\n this.preventHide = true\n }\n\n dragstartHandler = () => {\n this.hide()\n }\n\n focusHandler = () => {\n // we use `setTimeout` to make sure `selection` is already updated\n setTimeout(() => this.update(this.editor.view))\n }\n\n blurHandler = ({ event }: { event: FocusEvent }) => {\n if (this.preventHide) {\n this.preventHide = false\n\n return\n }\n\n if (event?.relatedTarget && this.element.parentNode?.contains(event.relatedTarget as Node)) {\n return\n }\n\n this.hide()\n }\n\n tippyBlurHandler = (event: FocusEvent) => {\n this.blurHandler({ event })\n }\n\n createTooltip() {\n const { element: editorElement } = this.editor.options\n const editorIsAttached = !!editorElement.parentElement\n\n if (this.tippy || !editorIsAttached) {\n return\n }\n\n this.tippy = tippy(editorElement, {\n duration: 0,\n getReferenceClientRect: null,\n content: this.element,\n interactive: true,\n trigger: 'manual',\n placement: 'top',\n hideOnClick: 'toggle',\n ...this.tippyOptions,\n })\n\n // maybe we have to hide tippy on its own blur event as well\n if (this.tippy.popper.firstChild) {\n (this.tippy.popper.firstChild as HTMLElement).addEventListener('blur', this.tippyBlurHandler)\n }\n }\n\n update(view: EditorView, oldState?: EditorState) {\n const { state } = view\n const hasValidSelection = state.selection.$from.pos !== state.selection.$to.pos\n\n if (this.updateDelay > 0 && hasValidSelection) {\n this.handleDebouncedUpdate(view, oldState)\n return\n }\n\n const selectionChanged = !oldState?.selection.eq(view.state.selection)\n const docChanged = !oldState?.doc.eq(view.state.doc)\n\n this.updateHandler(view, selectionChanged, docChanged, oldState)\n }\n\n handleDebouncedUpdate = (view: EditorView, oldState?: EditorState) => {\n const selectionChanged = !oldState?.selection.eq(view.state.selection)\n const docChanged = !oldState?.doc.eq(view.state.doc)\n\n if (!selectionChanged && !docChanged) {\n return\n }\n\n if (this.updateDebounceTimer) {\n clearTimeout(this.updateDebounceTimer)\n }\n\n this.updateDebounceTimer = window.setTimeout(() => {\n this.updateHandler(view, selectionChanged, docChanged, oldState)\n }, this.updateDelay)\n }\n\n updateHandler = (view: EditorView, selectionChanged: boolean, docChanged: boolean, oldState?: EditorState) => {\n const { state, composing } = view\n const { selection } = state\n\n const isSame = !selectionChanged && !docChanged\n\n if (composing || isSame) {\n return\n }\n\n this.createTooltip()\n\n // support for CellSelections\n const { ranges } = selection\n const from = Math.min(...ranges.map(range => range.$from.pos))\n const to = Math.max(...ranges.map(range => range.$to.pos))\n\n const shouldShow = this.shouldShow?.({\n editor: this.editor,\n view,\n state,\n oldState,\n from,\n to,\n })\n\n if (!shouldShow) {\n this.hide()\n\n return\n }\n\n this.tippy?.setProps({\n getReferenceClientRect:\n this.tippyOptions?.getReferenceClientRect\n || (() => {\n if (isNodeSelection(state.selection)) {\n let node = view.nodeDOM(from) as HTMLElement\n\n const nodeViewWrapper = node.dataset.nodeViewWrapper ? node : node.querySelector('[data-node-view-wrapper]')\n\n if (nodeViewWrapper) {\n node = nodeViewWrapper.firstChild as HTMLElement\n }\n\n if (node) {\n return node.getBoundingClientRect()\n }\n }\n\n return posToDOMRect(view, from, to)\n }),\n })\n\n this.show()\n }\n\n show() {\n this.tippy?.show()\n }\n\n hide() {\n this.tippy?.hide()\n }\n\n destroy() {\n if (this.tippy?.popper.firstChild) {\n (this.tippy.popper.firstChild as HTMLElement).removeEventListener(\n 'blur',\n this.tippyBlurHandler,\n )\n }\n this.tippy?.destroy()\n this.element.removeEventListener('mousedown', this.mousedownHandler, { capture: true })\n this.view.dom.removeEventListener('dragstart', this.dragstartHandler)\n this.editor.off('focus', this.focusHandler)\n this.editor.off('blur', this.blurHandler)\n }\n}\n\nexport const BubbleMenuPlugin = (options: BubbleMenuPluginProps) => {\n return new Plugin({\n key:\n typeof options.pluginKey === 'string' ? new PluginKey(options.pluginKey) : options.pluginKey,\n view: view => new BubbleMenuView({ view, ...options }),\n })\n}\n","import { Extension } from '@tiptap/core'\n\nimport { BubbleMenuPlugin, BubbleMenuPluginProps } from './bubble-menu-plugin.js'\n\nexport type BubbleMenuOptions = Omit & {\n element: HTMLElement | null,\n}\n\nexport const BubbleMenu = Extension.create({\n name: 'bubbleMenu',\n\n addOptions() {\n return {\n element: null,\n tippyOptions: {},\n pluginKey: 'bubbleMenu',\n updateDelay: undefined,\n shouldShow: null,\n }\n },\n\n addProseMirrorPlugins() {\n if (!this.options.element) {\n return []\n }\n\n return [\n BubbleMenuPlugin({\n pluginKey: this.options.pluginKey,\n editor: this.editor,\n element: this.options.element,\n tippyOptions: this.options.tippyOptions,\n updateDelay: this.options.updateDelay,\n shouldShow: this.options.shouldShow,\n }),\n ]\n },\n})\n","import { Editor, posToDOMRect } from '@tiptap/core'\nimport { EditorState, Plugin, PluginKey } from '@tiptap/pm/state'\nimport { EditorView } from '@tiptap/pm/view'\nimport tippy, { Instance, Props } from 'tippy.js'\n\nexport interface FloatingMenuPluginProps {\n pluginKey: PluginKey | string\n editor: Editor\n element: HTMLElement\n tippyOptions?: Partial\n shouldShow?:\n | ((props: {\n editor: Editor\n view: EditorView\n state: EditorState\n oldState?: EditorState\n }) => boolean)\n | null\n}\n\nexport type FloatingMenuViewProps = FloatingMenuPluginProps & {\n view: EditorView\n}\n\nexport class FloatingMenuView {\n public editor: Editor\n\n public element: HTMLElement\n\n public view: EditorView\n\n public preventHide = false\n\n public tippy: Instance | undefined\n\n public tippyOptions?: Partial\n\n public shouldShow: Exclude = ({ view, state }) => {\n const { selection } = state\n const { $anchor, empty } = selection\n const isRootDepth = $anchor.depth === 1\n const isEmptyTextBlock = $anchor.parent.isTextblock && !$anchor.parent.type.spec.code && !$anchor.parent.textContent\n\n if (\n !view.hasFocus()\n || !empty\n || !isRootDepth\n || !isEmptyTextBlock\n || !this.editor.isEditable\n ) {\n return false\n }\n\n return true\n }\n\n constructor({\n editor, element, view, tippyOptions = {}, shouldShow,\n }: FloatingMenuViewProps) {\n this.editor = editor\n this.element = element\n this.view = view\n\n if (shouldShow) {\n this.shouldShow = shouldShow\n }\n\n this.element.addEventListener('mousedown', this.mousedownHandler, { capture: true })\n this.editor.on('focus', this.focusHandler)\n this.editor.on('blur', this.blurHandler)\n this.tippyOptions = tippyOptions\n // Detaches menu content from its current parent\n this.element.remove()\n this.element.style.visibility = 'visible'\n }\n\n mousedownHandler = () => {\n this.preventHide = true\n }\n\n focusHandler = () => {\n // we use `setTimeout` to make sure `selection` is already updated\n setTimeout(() => this.update(this.editor.view))\n }\n\n blurHandler = ({ event }: { event: FocusEvent }) => {\n if (this.preventHide) {\n this.preventHide = false\n\n return\n }\n\n if (event?.relatedTarget && this.element.parentNode?.contains(event.relatedTarget as Node)) {\n return\n }\n\n this.hide()\n }\n\n tippyBlurHandler = (event: FocusEvent) => {\n this.blurHandler({ event })\n }\n\n createTooltip() {\n const { element: editorElement } = this.editor.options\n const editorIsAttached = !!editorElement.parentElement\n\n if (this.tippy || !editorIsAttached) {\n return\n }\n\n this.tippy = tippy(editorElement, {\n duration: 0,\n getReferenceClientRect: null,\n content: this.element,\n interactive: true,\n trigger: 'manual',\n placement: 'right',\n hideOnClick: 'toggle',\n ...this.tippyOptions,\n })\n\n // maybe we have to hide tippy on its own blur event as well\n if (this.tippy.popper.firstChild) {\n (this.tippy.popper.firstChild as HTMLElement).addEventListener('blur', this.tippyBlurHandler)\n }\n }\n\n update(view: EditorView, oldState?: EditorState) {\n const { state } = view\n const { doc, selection } = state\n const { from, to } = selection\n const isSame = oldState && oldState.doc.eq(doc) && oldState.selection.eq(selection)\n\n if (isSame) {\n return\n }\n\n this.createTooltip()\n\n const shouldShow = this.shouldShow?.({\n editor: this.editor,\n view,\n state,\n oldState,\n })\n\n if (!shouldShow) {\n this.hide()\n\n return\n }\n\n this.tippy?.setProps({\n getReferenceClientRect:\n this.tippyOptions?.getReferenceClientRect || (() => posToDOMRect(view, from, to)),\n })\n\n this.show()\n }\n\n show() {\n this.tippy?.show()\n }\n\n hide() {\n this.tippy?.hide()\n }\n\n destroy() {\n if (this.tippy?.popper.firstChild) {\n (this.tippy.popper.firstChild as HTMLElement).removeEventListener(\n 'blur',\n this.tippyBlurHandler,\n )\n }\n this.tippy?.destroy()\n this.element.removeEventListener('mousedown', this.mousedownHandler, { capture: true })\n this.editor.off('focus', this.focusHandler)\n this.editor.off('blur', this.blurHandler)\n }\n}\n\nexport const FloatingMenuPlugin = (options: FloatingMenuPluginProps) => {\n return new Plugin({\n key:\n typeof options.pluginKey === 'string' ? new PluginKey(options.pluginKey) : options.pluginKey,\n view: view => new FloatingMenuView({ view, ...options }),\n })\n}\n","import { Extension } from '@tiptap/core'\n\nimport { FloatingMenuPlugin, FloatingMenuPluginProps } from './floating-menu-plugin.js'\n\nexport type FloatingMenuOptions = Omit & {\n element: HTMLElement | null,\n}\n\nexport const FloatingMenu = Extension.create({\n name: 'floatingMenu',\n\n addOptions() {\n return {\n element: null,\n tippyOptions: {},\n pluginKey: 'floatingMenu',\n shouldShow: null,\n }\n },\n\n addProseMirrorPlugins() {\n if (!this.options.element) {\n return []\n }\n\n return [\n FloatingMenuPlugin({\n pluginKey: this.options.pluginKey,\n editor: this.editor,\n element: this.options.element,\n tippyOptions: this.options.tippyOptions,\n shouldShow: this.options.shouldShow,\n }),\n ]\n },\n})\n","import { BubbleMenuPlugin, BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu'\nimport {\n defineComponent,\n h,\n onBeforeUnmount,\n onMounted,\n PropType,\n ref,\n} from 'vue'\n\nexport const BubbleMenu = defineComponent({\n name: 'BubbleMenu',\n\n props: {\n pluginKey: {\n type: [String, Object] as PropType,\n default: 'bubbleMenu',\n },\n\n editor: {\n type: Object as PropType,\n required: true,\n },\n\n updateDelay: {\n type: Number as PropType,\n default: undefined,\n },\n\n tippyOptions: {\n type: Object as PropType,\n default: () => ({}),\n },\n\n shouldShow: {\n type: Function as PropType['shouldShow'], null>>,\n default: null,\n },\n },\n\n setup(props, { slots }) {\n const root = ref(null)\n\n onMounted(() => {\n const {\n updateDelay,\n editor,\n pluginKey,\n shouldShow,\n tippyOptions,\n } = props\n\n editor.registerPlugin(BubbleMenuPlugin({\n updateDelay,\n editor,\n element: root.value as HTMLElement,\n pluginKey,\n shouldShow,\n tippyOptions,\n }))\n })\n\n onBeforeUnmount(() => {\n const { pluginKey, editor } = props\n\n editor.unregisterPlugin(pluginKey)\n })\n\n return () => h('div', { ref: root }, slots.default?.())\n },\n})\n","import {\n DefineComponent,\n defineComponent,\n getCurrentInstance,\n h,\n nextTick,\n onBeforeUnmount,\n PropType,\n Ref,\n ref,\n Teleport,\n unref,\n watchEffect,\n} from 'vue'\n\nimport { Editor } from './Editor.js'\n\nexport const EditorContent = defineComponent({\n name: 'EditorContent',\n\n props: {\n editor: {\n default: null,\n type: Object as PropType,\n },\n },\n\n setup(props) {\n const rootEl: Ref = ref()\n const instance = getCurrentInstance()\n\n watchEffect(() => {\n const editor = props.editor\n\n if (editor && editor.options.element && rootEl.value) {\n nextTick(() => {\n if (!rootEl.value || !editor.options.element.firstChild) {\n return\n }\n\n const element = unref(rootEl.value)\n\n rootEl.value.append(...editor.options.element.childNodes)\n\n // @ts-ignore\n editor.contentComponent = instance.ctx._\n\n editor.setOptions({\n element,\n })\n\n editor.createNodeViews()\n })\n }\n })\n\n onBeforeUnmount(() => {\n const editor = props.editor\n\n if (!editor) {\n return\n }\n\n // destroy nodeviews before vue removes dom element\n if (!editor.isDestroyed) {\n editor.view.setProps({\n nodeViews: {},\n })\n }\n\n editor.contentComponent = null\n\n if (!editor.options.element.firstChild) {\n return\n }\n\n const newElement = document.createElement('div')\n\n newElement.append(...editor.options.element.childNodes)\n\n editor.setOptions({\n element: newElement,\n })\n })\n\n return { rootEl }\n },\n\n render() {\n const vueRenderers: any[] = []\n\n if (this.editor) {\n this.editor.vueRenderers.forEach(vueRenderer => {\n const node = h(\n Teleport,\n {\n to: vueRenderer.teleportElement,\n key: vueRenderer.id,\n },\n h(\n vueRenderer.component as DefineComponent,\n {\n ref: vueRenderer.id,\n ...vueRenderer.props,\n },\n ),\n )\n\n vueRenderers.push(node)\n })\n }\n\n return h(\n 'div',\n {\n ref: (el: any) => { this.rootEl = el },\n },\n ...vueRenderers,\n )\n },\n})\n","import { FloatingMenuPlugin, FloatingMenuPluginProps } from '@tiptap/extension-floating-menu'\nimport {\n defineComponent,\n h,\n onBeforeUnmount,\n onMounted,\n PropType,\n ref,\n} from 'vue'\n\nexport const FloatingMenu = defineComponent({\n name: 'FloatingMenu',\n\n props: {\n pluginKey: {\n // TODO: TypeScript breaks :(\n // type: [String, Object as PropType>],\n type: null,\n default: 'floatingMenu',\n },\n\n editor: {\n type: Object as PropType,\n required: true,\n },\n\n tippyOptions: {\n type: Object as PropType,\n default: () => ({}),\n },\n\n shouldShow: {\n type: Function as PropType['shouldShow'], null>>,\n default: null,\n },\n },\n\n setup(props, { slots }) {\n const root = ref(null)\n\n onMounted(() => {\n const {\n pluginKey,\n editor,\n tippyOptions,\n shouldShow,\n } = props\n\n editor.registerPlugin(FloatingMenuPlugin({\n pluginKey,\n editor,\n element: root.value as HTMLElement,\n tippyOptions,\n shouldShow,\n }))\n })\n\n onBeforeUnmount(() => {\n const { pluginKey, editor } = props\n\n editor.unregisterPlugin(pluginKey)\n })\n\n return () => h('div', { ref: root }, slots.default?.())\n },\n})\n","import { defineComponent, h } from 'vue'\n\nexport const NodeViewContent = defineComponent({\n name: 'NodeViewContent',\n\n props: {\n as: {\n type: String,\n default: 'div',\n },\n },\n\n render() {\n return h(this.as, {\n style: {\n whiteSpace: 'pre-wrap',\n },\n 'data-node-view-content': '',\n })\n },\n})\n","import { defineComponent, h } from 'vue'\n\nexport const NodeViewWrapper = defineComponent({\n name: 'NodeViewWrapper',\n\n props: {\n as: {\n type: String,\n default: 'div',\n },\n },\n\n inject: ['onDragStart', 'decorationClasses'],\n\n render() {\n return h(\n this.as,\n {\n // @ts-ignore\n class: this.decorationClasses,\n style: {\n whiteSpace: 'normal',\n },\n 'data-node-view-wrapper': '',\n // @ts-ignore (https://github.com/vuejs/vue-next/issues/3031)\n onDragstart: this.onDragStart,\n },\n this.$slots.default?.(),\n )\n },\n})\n","import {\n DecorationWithType,\n NodeView,\n NodeViewProps,\n NodeViewRenderer,\n NodeViewRendererOptions,\n NodeViewRendererProps,\n} from '@tiptap/core'\nimport { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport { Decoration, NodeView as ProseMirrorNodeView } from '@tiptap/pm/view'\nimport {\n Component,\n defineComponent,\n PropType,\n provide,\n Ref,\n ref,\n} from 'vue'\n\nimport { Editor } from './Editor.js'\nimport { VueRenderer } from './VueRenderer.js'\n\nexport const nodeViewProps = {\n editor: {\n type: Object as PropType,\n required: true as const,\n },\n node: {\n type: Object as PropType,\n required: true as const,\n },\n decorations: {\n type: Object as PropType,\n required: true as const,\n },\n selected: {\n type: Boolean as PropType,\n required: true as const,\n },\n extension: {\n type: Object as PropType,\n required: true as const,\n },\n getPos: {\n type: Function as PropType,\n required: true as const,\n },\n updateAttributes: {\n type: Function as PropType,\n required: true as const,\n },\n deleteNode: {\n type: Function as PropType,\n required: true as const,\n },\n}\n\nexport interface VueNodeViewRendererOptions extends NodeViewRendererOptions {\n update:\n | ((props: {\n oldNode: ProseMirrorNode\n oldDecorations: Decoration[]\n newNode: ProseMirrorNode\n newDecorations: Decoration[]\n updateProps: () => void\n }) => boolean)\n | null\n}\n\nclass VueNodeView extends NodeView {\n renderer!: VueRenderer\n\n decorationClasses!: Ref\n\n mount() {\n const props: NodeViewProps = {\n editor: this.editor,\n node: this.node,\n decorations: this.decorations,\n selected: false,\n extension: this.extension,\n getPos: () => this.getPos(),\n updateAttributes: (attributes = {}) => this.updateAttributes(attributes),\n deleteNode: () => this.deleteNode(),\n }\n\n const onDragStart = this.onDragStart.bind(this)\n\n this.decorationClasses = ref(this.getDecorationClasses())\n\n const extendedComponent = defineComponent({\n extends: { ...this.component },\n props: Object.keys(props),\n template: (this.component as any).template,\n setup: reactiveProps => {\n provide('onDragStart', onDragStart)\n provide('decorationClasses', this.decorationClasses)\n\n return (this.component as any).setup?.(reactiveProps, {\n expose: () => undefined,\n })\n },\n // add support for scoped styles\n // @ts-ignore\n // eslint-disable-next-line\n __scopeId: this.component.__scopeId,\n // add support for CSS Modules\n // @ts-ignore\n // eslint-disable-next-line\n __cssModules: this.component.__cssModules,\n // add support for vue devtools\n // @ts-ignore\n // eslint-disable-next-line\n __name: this.component.__name,\n // @ts-ignore\n // eslint-disable-next-line\n __file: this.component.__file,\n })\n\n this.renderer = new VueRenderer(extendedComponent, {\n editor: this.editor,\n props,\n })\n }\n\n get dom() {\n if (!this.renderer.element.hasAttribute('data-node-view-wrapper')) {\n throw Error('Please use the NodeViewWrapper component for your node view.')\n }\n\n return this.renderer.element as HTMLElement\n }\n\n get contentDOM() {\n if (this.node.isLeaf) {\n return null\n }\n\n const contentElement = this.dom.querySelector('[data-node-view-content]')\n\n return (contentElement || this.dom) as HTMLElement | null\n }\n\n update(node: ProseMirrorNode, decorations: DecorationWithType[]) {\n const updateProps = (props?: Record) => {\n this.decorationClasses.value = this.getDecorationClasses()\n this.renderer.updateProps(props)\n }\n\n if (typeof this.options.update === 'function') {\n const oldNode = this.node\n const oldDecorations = this.decorations\n\n this.node = node\n this.decorations = decorations\n\n return this.options.update({\n oldNode,\n oldDecorations,\n newNode: node,\n newDecorations: decorations,\n updateProps: () => updateProps({ node, decorations }),\n })\n }\n\n if (node.type !== this.node.type) {\n return false\n }\n\n if (node === this.node && this.decorations === decorations) {\n return true\n }\n\n this.node = node\n this.decorations = decorations\n\n updateProps({ node, decorations })\n\n return true\n }\n\n selectNode() {\n this.renderer.updateProps({\n selected: true,\n })\n }\n\n deselectNode() {\n this.renderer.updateProps({\n selected: false,\n })\n }\n\n getDecorationClasses() {\n return (\n this.decorations\n // @ts-ignore\n .map(item => item.type.attrs.class)\n .flat()\n .join(' ')\n )\n }\n\n destroy() {\n this.renderer.destroy()\n }\n}\n\nexport function VueNodeViewRenderer(\n component: Component,\n options?: Partial,\n): NodeViewRenderer {\n return (props: NodeViewRendererProps) => {\n // try to get the parent component\n // this is important for vue devtools to show the component hierarchy correctly\n // maybe it’s `undefined` because isn’t rendered yet\n if (!(props.editor as Editor).contentComponent) {\n return {}\n }\n\n return new VueNodeView(component, props, options) as unknown as ProseMirrorNodeView\n }\n}\n"],"names":["createChainableState","config","state","transaction","selection","doc","storedMarks","apply","bind","applyTransaction","filterTransaction","plugins","schema","reconfigure","toJSON","tr","CommandManager","constructor","props","this","editor","rawCommands","extensionManager","commands","customState","hasCustomState","view","buildProps","Object","fromEntries","entries","map","name","command","method","args","callback","getMeta","dispatch","chain","createChain","can","createCan","startTr","shouldDispatch","callbacks","hasStartTransaction","chainedCommand","push","run","every","undefined","EventEmitter","on","event","fn","emit","forEach","off","filter","removeAllListeners","getExtensionField","extension","field","context","parent","splitExtensions","extensions","baseExtensions","type","nodeExtensions","markExtensions","getAttributesFromExtensions","extensionAttributes","nodeAndMarkExtensions","defaultAttribute","default","rendered","renderHTML","parseHTML","keepOnSplit","isRequired","addGlobalAttributes","options","storage","globalAttribute","types","attributes","attribute","addAttributes","mergedAttr","getNodeType","nameOrType","nodes","Error","mergeAttributes","objects","item","reduce","items","mergedAttributes","key","value","valueClasses","split","existingClasses","insertClasses","valueClass","includes","join","getRenderedAttributes","nodeOrMark","attrs","isFunction","callOrReturn","injectExtensionAttributesToParseRule","parseRule","style","getAttrs","node","oldAttributes","newAttributes","match","Number","fromString","getAttribute","cleanUpSchemaItem","data","keys","length","isEmptyObject","getSchemaTypeByName","marks","isExtensionRulesEnabled","enabled","Array","isArray","some","enabledExtension","getTextContentFromNodes","$from","maxMatch","textBefore","sliceEndPos","parentOffset","nodesBetween","Math","max","pos","index","chunk","_b","_a","spec","toText","call","textContent","slice","isRegExp","prototype","toString","InputRule","find","handler","inputRuleMatcherHandler","text","exec","inputRuleMatch","result","input","replaceWith","console","warn","run$1","from","to","rules","plugin","composing","resolve","code","nodeBefore","nodeAfter","mark","matched","rule","range","steps","setMeta","transform","inputRulesPlugin","Plugin","init","prev","selectionSet","docChanged","handleTextInput","handleDOMEvents","compositionend","setTimeout","$cursor","handleKeyDown","isInputRules","PasteRule","pasteRulesPlugin","dragSourceElement","isPastedFromProseMirror","isDroppedFromProseMirror","handleDragstart","dom","parentElement","contains","target","window","addEventListener","destroy","removeEventListener","drop","paste","html","clipboardData","getData","appendTransaction","transactions","oldState","isPaste","isDrop","content","findDiffStart","findDiffEnd","b","chainableState","handlers","isTextblock","resolvedFrom","resolvedTo","min","size","pasteRuleMatcherHandler","matchAll","matches","pasteRuleMatch","textBetween","start","end","mapping","ExtensionManager","splittableMarks","allAttributes","topNode","fields","e","extendNodeSchema","group","inline","atom","selectable","draggable","defining","isolating","extensionAttribute","parseDOM","toDOM","HTMLAttributes","renderText","extendMarkSchema","inclusive","excludes","spanning","Schema","getSchemaByResolvedExtensions","extensionStorage","onBeforeCreate","onCreate","onUpdate","onSelectionUpdate","onTransaction","onFocus","onBlur","onDestroy","static","resolvedExtensions","sort","flatten","duplicatedNames","filtered","el","indexOf","Set","findDuplicates","addExtensions","flat","a","priorityA","priorityB","addCommands","reverse","inputRules","pasteRules","allPlugins","addKeyboardShortcuts","defaultBindings","exitable","ArrowRight","Mark","handleExit","bindings","shortcut","keyMapPlugin","keymap","addInputRules","enableInputRules","addPasteRules","enablePasteRules","addProseMirrorPlugins","proseMirrorPlugins","nodeViews","addNodeView","nodeview","getPos","decorations","isPlainObject","getType","getPrototypeOf","mergeDeep","source","output","assign","Extension","child","defaultOptions","addOptions","configure","extend","extendedConfig","getTextBetween","startNode","blockSeparator","textSerializers","separated","textSerializer","isBlock","isText","getTextSerializersFromSchema","ClipboardTextSerializer","create","PluginKey","clipboardTextSerializer","ranges","$to","objectIncludes","object1","object2","strict","test","findMarkInSet","isMarkInSet","getMarkRange","$pos","childAfter","offset","childBefore","startIndex","startPos","endIndex","endPos","nodeSize","isInSet","childCount","getMarkType","isTextSelection","TextSelection","minMax","resolveFocusPosition","position","selectionAtStart","Selection","atStart","selectionAtEnd","atEnd","minPos","maxPos","isiOS","navigator","platform","userAgent","document","elementFromString","wrappedValue","DOMParser","parseFromString","body","createNodeFromContent","parseOptions","Fragment","fromArray","nodeFromJSON","error","parser","fromSchema","parseSlice","parse","isMacOS","isNodeActive","typeOrName","empty","nodeRanges","relativeFrom","relativeTo","selectionRange","matchedNodeRanges","nodeRange","sum","getSchemaTypeNameByName","deleteProps","obj","propOrProps","newObj","prop","createDocument","getMarkAttributes","$head","markItem","combineTransactionSteps","oldDoc","Transform","step","findChildrenInRange","predicate","nodesWithPos","findParentNode","i","depth","before","findParentNodeClosestToPos","getAttributes","schemaType","nodeItem","getNodeAttributes","getChangedRanges","changes","maps","stepMap","newStart","newEnd","oldStart","invert","oldEnd","oldRange","newRange","uniqueChanges","array","by","JSON","stringify","seen","hasOwnProperty","removeDuplicates","change","_","otherChange","simplifyChangedRanges","getMarksBetween","getSplittedAttributes","typeName","isMarkActive","markRanges","matchedRange","markRange","excludedRange","isList","isNodeSelection","NodeSelection","posToDOMRect","resolvedEnd","coordsAtPos","top","bottom","left","right","width","height","x","y","ensureMarks","filteredMarks","joinListBackwards","listType","list","nodeAt","canJoin","joinListForwards","after","blur","requestAnimationFrame","isDestroyed","getSelection","removeAllRanges","clearContent","emitUpdate","setContent","clearNodes","$mappedFrom","$mappedTo","blockRange","targetLiftDepth","liftTarget","defaultType","contentMatchAt","setNodeMarkup","lift","createParagraphNear","createParagraphNear$1","cut","originRange","targetPos","contentSlice","deleteRange","newPos","insert","setSelection","deleteCurrentNode","currentNode","$anchor","delete","scrollIntoView","deleteSelection","deleteSelection$1","enter","keyboardShortcut","exitCode","exitCode$1","extendMarkRange","newSelection","focus","delayedFocus","hasFocus","isSameSelection","eq","setStoredMarks","insertContent","insertContentAt","updateSelection","preserveWhitespace","isOnlyTextContent","isOnlyBlockContent","startsWith","check","insertText","v","startLen","bias","last","ReplaceStep","ReplaceAroundStep","_from","_to","_newFrom","newTo","near","selectionToInsertionEnd","joinUp","joinUp$1","joinDown","joinDown$1","joinBackward","joinBackward$1","joinForward","joinForward$1","joinItemBackward","point","joinPoint","joinItemForward","parts","alt","ctrl","shift","meta","mod","normalizeKeyName","KeyboardEvent","altKey","ctrlKey","metaKey","shiftKey","bubbles","cancelable","capturedTransaction","captureTransaction","someProp","f","newStep","maybeStep","lift$1","liftEmptyBlock","liftEmptyBlock$1","liftListItem$1","newlineInCode","newlineInCode$1","resetAttributes","nodeType","markType","addMark","selectAll","setTextSelection","selectNodeBackward","selectNodeBackward$1","selectNodeForward","selectNodeForward$1","selectParentNode","selectParentNode$1","selectTextblockEnd","selectTextblockEnd$1","selectTextblockStart","selectTextblockStart$1","setMark","addStoredMark","trimmedFrom","trimmedTo","newMarkType","cursor","currentMarks","someNodeSupportsMark","inlineContent","allowsMarkType","_pos","isInline","parentAllowsMarkType","currentMarksAllowMarkType","otherMark","canSetMark","setNode","setBlockType","updatedState","sinkListItem$1","splitBlock","keepMarks","canSplit","deflt","edgeCount","edge","hasRequiredAttrs","defaultBlockAt","indexAfter","first","$first","canReplaceWith","sameParent","grandParent","wrap","depthBefore","d","copy","depthAfter","newNextTypeAttributes","nextType","contentMatch","createAndFill","append","replace","Slice","sel","n","newTypeAttributes","toggleList","listTypeOrName","itemTypeOrName","itemType","parentList","liftListItem","validContent","canWrapInList","wrapInList","toggleMark","extendEmptyMarkRange","unsetMark","toggleNode","toggleTypeOrName","toggleType","toggleWrap","wrapIn","undoInputRule","undoable","getState","toUndo","j","docs","unsetAllMarks","removeMark","removeStoredMark","updateAttributes","wrapIn$1","wrapInList$1","Commands","Editable","editable","FocusEvents","isFocused","Keymap","handleBackspace","$parentPos","parentIsIsolating","parentPos","isAtStart","handleDelete","baseKeymap","Enter","handleEnter","Mod-Enter","Backspace","Delete","Mod-a","pcKeymap","macKeymap","Ctrl-a","Ctrl-e","newState","allFrom","allEnd","Tabindex","isEditable","tabindex","Editor","super","element","createElement","injectCSS","injectNonce","autofocus","editorProps","enableCoreExtensions","isCapturingTransaction","setOptions","createExtensionManager","createCommandManager","createSchema","createView","commandManager","css","nonce","suffix","tiptapStyleTag","querySelector","styleNode","setAttribute","innerHTML","getElementsByTagName","appendChild","createStyleTag","setProps","updateState","setEditable","registerPlugin","handlePlugins","unregisterPlugin","nameOrPluginKey","allExtensions","values","EditorView","dispatchTransaction","EditorState","createNodeViews","prependClass","className","selectionHasChanged","isActive","nameOrAttributes","attributesOrUndefined","getJSON","getHTML","fragment","documentFragment","DOMSerializer","serializeFragment","container","implementation","createHTMLDocument","getHTMLFromFragment","getText","isEmpty","defaultContent","isNodeEmpty","getCharacterCount","docView","markInputRule","captureGroup","fullMatch","startSpaces","search","textStart","textEnd","excluded","markEnd","nodeInputRule","newNode","matchStart","lastIndexOf","lastChar","textblockTypeInputRule","$start","wrappingInputRule","wrapping","findWrapping","keepAttributes","joinPredicate","currentPos","m","Node","markPasteRule","Link","priority","protocols","protocol","registerCustomProtocol","scheme","optionalSlashes","reset","autolink","openOnClick","linkOnPaste","rel","class","validate","href","tag","setLink","toggleLink","unsetLink","docChanges","preventAutolink","nodesInChangedRanges","textBlock","textBeforeWhitespace","endsWith","wordsBeforeWhitespace","s","lastWordBeforeSpace","lastWordAndBlockOffset","link","isLink","rangeHasMark","handleClick","button","nodeName","open","clickHandler","handlePaste","isAlreadyLink","descendants","pastedLink","firstChildIsText","firstChild","firstChildContainsLinkMark","deleteOnly","fragmentLinks","fragmentLink","linkStart","linkEnd","hasFragmentLinks","pasteHandler","inputRegex","Blockquote","setBlockquote","toggleBlockquote","unsetBlockquote","Mod-Shift-b","starInputRegex","starPasteRegex","underscoreInputRegex","underscorePasteRegex","Bold","fontWeight","setBold","toggleBold","unsetBold","Mod-b","Mod-B","ListItem","bulletListTypeName","orderedListTypeName","splitListItem","Tab","sinkListItem","Shift-Tab","TextStyle","hasAttribute","removeEmptyTextStyle","BulletList","itemTypeName","toggleBulletList","Mod-Shift-8","inputRule","pasteRegex","Code","setCode","toggleCode","unsetCode","Mod-e","backtickInputRegex","tildeInputRegex","CodeBlock","languageClassPrefix","exitOnTripleEnter","exitOnArrowDown","language","firstElementChild","classList","setCodeBlock","toggleCodeBlock","Mod-Alt-c","isAtEnd","endsWithDoubleNewline","ArrowDown","vscode","vscodeData","mode","replaceSelectionWith","Document","Dropcursor","color","dropCursor","Gapcursor","gapCursor","allowGapCursor","HardBreak","setHardBreak","Shift-Enter","Heading","levels","level","setHeading","toggleHeading","RegExp","History","newGroupDelay","undo","redo","history","Mod-z","Mod-Z","Mod-y","Mod-Y","Shift-Mod-z","Shift-Mod-Z","Mod-я","Shift-Mod-я","HorizontalRule","setHorizontalRule","$originTo","currentChain","posAfter","Italic","fontStyle","setItalic","toggleItalic","unsetItalic","Mod-i","Mod-I","OrderedList","parseInt","attributesWithoutStart","toggleOrderedList","Mod-Shift-7","Paragraph","setParagraph","Mod-Alt-0","Strike","consuming","setStrike","toggleStrike","unsetStrike","shortcuts","Text","StarterKit","blockquote","bold","bulletList","_c","_d","codeBlock","_e","_f","dropcursor","_g","gapcursor","_h","hardBreak","_j","heading","_k","_l","horizontalRule","_m","italic","_o","listItem","_p","orderedList","_q","paragraph","_r","strike","_s","_t","BubbleMenuView","tippyOptions","updateDelay","shouldShow","preventHide","isEmptyTextBlock","isChildOfMenu","activeElement","mousedownHandler","dragstartHandler","hide","focusHandler","update","blurHandler","relatedTarget","parentNode","tippyBlurHandler","handleDebouncedUpdate","selectionChanged","updateDebounceTimer","clearTimeout","updateHandler","createTooltip","tippy","getReferenceClientRect","nodeDOM","nodeViewWrapper","dataset","getBoundingClientRect","show","capture","remove","visibility","editorElement","editorIsAttached","duration","interactive","trigger","placement","hideOnClick","popper","hasValidSelection","BubbleMenuPlugin","pluginKey","FloatingMenuView","isRootDepth","FloatingMenuPlugin","useDebouncedRef","customRef","track","get","set","newValue","defineComponent","String","required","Function","setup","slots","root","ref","onMounted","onBeforeUnmount","h","Editor$1","vueRenderers","reactive","Map","contentComponent","reactiveState","reactiveExtensionStorage","markRaw","EditorContent","rootEl","instance","getCurrentInstance","watchEffect","nextTick","unref","childNodes","ctx","newElement","render","vueRenderer","Teleport","teleportElement","id","component","as","whiteSpace","inject","decorationClasses","onDragstart","onDragStart","$slots","Boolean"],"sourceRoot":""}