platypush/platypush/backend/http/webapp/dist/static/js/app.e71ae2ab.js.map

1 line
259 KiB
Plaintext

{"version":3,"file":"static/js/app.e71ae2ab.js","mappings":"mGAEA,MAAMA,GAAMC,EAAAA,EAAAA,KAEZD,EAAIE,cAAiBC,IACnBH,EAAII,KAAK,gBAAiBD,EAAO,EAGnCH,EAAIK,SAAYC,IACdN,EAAIO,GAAG,gBAAiBD,EAAS,EAGnCN,EAAIQ,oBAAuBC,IACzBT,EAAII,KAAK,sBAAuBK,EAAa,EAG/CT,EAAIU,eAAkBJ,IACpBN,EAAIO,GAAG,sBAAuBD,EAAS,C,+UChBZK,EAAAC,eAAY,WAAvCC,EAAAA,EAAAA,IAA2CC,EAAA,C,MAAnCC,IAAI,U,4BACZC,EAAAA,EAAAA,IAAqCC,EAAA,CAAtBF,IAAI,iBAAe,UACUJ,EAAAO,eAAY,WAAxDL,EAAAA,EAAAA,IAA4DM,EAAA,C,MAA5CJ,IAAI,mB,2BACeJ,EAAAS,gBAAa,WAAhDP,EAAAA,EAAAA,IAAoDQ,EAAA,C,MAAxCN,IAAI,c,2BACOJ,EAAAW,UAAO,WAA9BT,EAAAA,EAAAA,IAAkCU,EAAA,C,MAA5BR,IAAI,Q,4BACVC,EAAAA,EAAAA,IAEgBQ,EAAA,CAFDT,IAAI,YAAaU,QAAOd,EAAAe,Y,mBAAY,IAEnD,UAFmD,4D,qBAInDV,EAAAA,EAAAA,IAAqBW,IACrBX,EAAAA,EAAAA,IAAeY,IAAA,G,wBCVVC,MAAM,sB,0CAAXC,EAAAA,EAAAA,IAAkC,MAAlCC,E,eAMF,GACEC,QAAS,CACPC,MAAAA,CAAOC,GACAA,GAAWC,MAGXD,EAAUE,qBACbC,KAAKC,UAEPD,KAAKF,IAAII,YAAYL,EAAUC,KACjC,EAEAG,OAAAA,GACED,KAAKF,IAAIK,UAAY,EACvB,GAGFC,OAAAA,GACEzC,EAAAA,EAAIO,GAAG,gBAAiB8B,KAAKJ,QAC7BjC,EAAAA,EAAIO,GAAG,iBAAkB8B,KAAKC,QAChC,G,UCpBF,MAAMI,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAS,GAAQ,CAAC,YAAY,qBAEzF,Q,SCROb,MAAM,iB,2EAAXC,EAAAA,EAAAA,IAaM,MAbNC,EAaM,gBAZJD,EAAAA,EAAAA,IAWea,EAAAA,GAAA,MAAAC,EAAAA,EAAAA,IAXmCC,EAAAC,eAAa,CAAzCrC,EAAcsC,EAAIC,M,WAAxCnC,EAAAA,EAAAA,IAWeoC,EAAA,CAVAC,IAAKF,EACLD,GAAIA,EACJI,KAAM1C,EAAa0C,KACnBC,KAAM3C,EAAa2C,KACnBC,MAAO5C,EAAa4C,MACpBC,KAAM7C,EAAa6C,KACnBC,MAAO9C,EAAa8C,MACpBC,QAAS/C,EAAa+C,QACtBC,MAAOhD,EAAagD,MACpBC,UAAS/C,EAAAgD,S,sICTnB9B,MAAM,Q,SACJA,MAAM,e,GACJA,MAAM,O,mBAMNA,MAAM,qB,SACNA,MAAM,e,8GAXjBC,EAAAA,EAAAA,IAmBM,OAnBDD,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,uBAAsB,CAAAJ,QAAmBK,EAAAL,QAAOC,MAASI,EAAAJ,SAASK,QAAKC,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAsD,SAAAtD,EAAAsD,WAAAD,K,CACzDH,EAAAR,QAAK,WAA9BvB,EAAAA,EAAAA,IAAqD,O,MAAhDD,MAAM,Q,aAAqBqC,EAAAA,EAAAA,IAAQL,EAAMR,Q,4BAC9Cc,EAAAA,EAAAA,GAgBM,MAhBNC,EAgBM,CAf2BP,EAAAN,OAASM,EAAAL,SAAWK,EAAAJ,QAAK,WAAxD3B,EAAAA,EAAAA,IAUM,MAVNuC,EAUM,EATJF,EAAAA,EAAAA,GAQM,MARNG,EAQM,CAPwBT,EAAAN,OAASM,EAAAN,MAAMgB,MAAG,WAA9CzC,EAAAA,EAAAA,IAAuD,O,MAAjDyC,IAAKV,EAAAN,MAAMgB,IAA+BC,IAAI,I,WAEtCX,EAAAN,OAASM,EAAAN,MAAMkB,OAAI,WADjC3C,EAAAA,EAAAA,IACuC,K,MADnCD,OAAK+B,EAAAA,EAAAA,IAAA,YAAiBC,EAAAN,MAAMkB,OAAQC,OAAKC,EAAAA,EAAAA,IAAEd,EAAAN,MAAMqB,MAAQ,YAAcf,EAAAN,MAAMqB,MAAQ,K,SAG3Ef,EAAAN,OAASM,EAAAN,MAAMsB,YAAS,WADtC/C,EAAAA,EAAAA,IAC4C,K,MADxCD,OAAK+B,EAAAA,EAAAA,IAAEC,EAAAN,MAAMsB,WAAYH,OAAKC,EAAAA,EAAAA,IAAEd,EAAAN,MAAMqB,MAAQ,YAAcf,EAAAN,MAAMqB,MAAQ,K,SAEtCf,EAAAL,UAAO,WAA/C1B,EAAAA,EAAAA,IAAqD,IAArDgD,IACkCjB,EAAAJ,QAAK,WAAvC3B,EAAAA,EAAAA,IAA6C,IAA7CiD,KAA6C,oCAGnBlB,EAAAV,MAAUU,EAAAN,QAAK,WAA7CzB,EAAAA,EAAAA,IAAmE,O,MAA9DD,MAAM,a,aAAoCqC,EAAAA,EAAAA,IAAQL,EAAKV,O,2BAC9BU,EAAAT,MAAUS,EAAAN,QAAK,WAA7CzB,EAAAA,EAAAA,IAAmE,O,MAA9DD,MAAM,aAAoCW,UAAQqB,EAAAT,M,2BACTS,EAAAV,OAASU,EAAAN,QAAK,WAA5DzB,EAAAA,EAAAA,IAAkF,O,MAA7ED,MAAM,6B,aAAmDqC,EAAAA,EAAAA,IAAQL,EAAKV,O,2BAC7BU,EAAAT,OAASS,EAAAN,QAAK,WAA5DzB,EAAAA,EAAAA,IAAkF,O,MAA7ED,MAAM,6BAAmDW,UAAQqB,EAAAT,M,iCAM5E,OACE4B,KAAM,eACNC,MAAO,CAAC,KAAK,OAAO,OAAO,QAAQ,QAAQ,OAAO,QAAQ,WAE1DjD,QAAS,CACPiC,OAAAA,GACM5B,KAAKiB,MACP4B,OAAOC,KAAK9C,KAAKiB,KAAM,UAGzBjB,KAAK+C,MAAM,UAAW/C,KAAKU,GAC7B,IC5BJ,MAAM,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAS,GAAQ,CAAC,YAAY,qBAEzF,QFWA,GACEiC,KAAM,gBACNK,WAAY,CAACC,aAAYA,GACzBL,MAAO,CACLM,SAAU,CAERC,KAAMC,OACNC,QAAS,MAIbC,KAAM,WACJ,MAAO,CACL3C,MAAO,EACPF,cAAe,CAAC,EAChB8C,SAAU,CAAC,EAEf,EAEA5D,QAAS,CACP6D,OAAQ,SAAS7B,GACf,MAAMjB,EAAKV,KAAKW,QAChBX,KAAKS,cAAcC,GAAMiB,EAEJ,MAAjBA,EAAKuB,WACPvB,EAAKuB,SAAWlD,KAAKkD,UAGvB,MAAMA,EAAWvB,EAAKuB,SAAWO,SAAS9B,EAAKuB,UAAY,EACvDA,IACFlD,KAAKuD,SAAS7C,GAAMgD,WAAW1D,KAAKsB,QAAQqC,KAAK,KAAMjD,GAAKwC,GAEhE,EAEA5B,QAAS,SAASZ,UACTV,KAAKS,cAAcC,UACnBV,KAAKuD,SAAS7C,EACvB,IGlDJ,MAAM,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAS,GAAQ,CAAC,YAAY,qBAEzF,Q,oDCREjB,EAAAA,EAAAA,IAAM,M,YAMR,GACEkD,KAAM,SAENW,IAAAA,GACE,MAAO,CACLM,GAAI,KACJC,aAAa,EACbC,SAAS,EACTC,QAAQ,EACRC,QAAS,KACTC,eAAgB,IAChBC,kBAAmB,IACnBC,kBAAmB,IACnBC,SAAU,CAAC,EACXC,wBAAyB,CAAC,EAE9B,EAEA1E,QAAS,CACP2E,kBAAAA,GACEC,QAAQC,IAAI,8CACZxE,KAAKiE,eAAiBQ,KAAKC,IAA0B,EAAtB1E,KAAKiE,eAAoBjE,KAAKmE,mBAC7DnE,KAAK8D,SAAU,EACX9D,KAAK4D,IACP5D,KAAK4D,GAAGe,QAEV3E,KAAKC,SACP,EAEA2E,SAAAA,CAAUC,GACR,MAAMT,EAAW,GAGjB,GAFAS,EAAQA,EAAMvB,KAEO,kBAAVuB,EACT,IACEA,EAAQC,KAAKC,MAAMF,EACrB,CAAE,MAAOG,GACPT,QAAQU,KAAK,mCACbV,QAAQU,KAAKJ,EACf,CAIF,GADAN,QAAQW,MAAML,GACK,UAAfA,EAAM1B,KAAV,CAKI,QAAQnD,KAAKoE,UACfA,EAASe,KAAKnF,KAAKoE,SAAS,OAG1BS,EAAMlD,KAAKwB,QAAQnD,KAAKoE,UAC1BA,EAASe,QAAQC,OAAOC,OAAOrF,KAAKoE,SAASS,EAAMlD,KAAKwB,QAG1D,IAAK,IAAImC,KAAWlB,EACbkB,IAGDA,aAAmBC,MACrBD,EAAUA,EAAQ,GACXA,aAAmBF,UAAYE,aAAmBE,YACzDF,EAAUF,OAAOC,OAAOC,GAAS,IAEnCA,EAAQT,EAAMlD,MAnBhB,CAqBF,EAEA/B,MAAAA,GACMI,KAAK+D,SACPQ,QAAQC,IAAI,gFACRxE,KAAK4D,KACP5D,KAAK4D,GAAG6B,QAAU,OAClBzF,KAAK4D,GAAGe,UAIZJ,QAAQC,IAAI,mCACZxE,KAAK+D,QAAS,EACd/D,KAAKiE,eAAiBjE,KAAKkE,kBAEvBlE,KAAK8D,UACP9D,KAAK8D,SAAU,GAGb9D,KAAKgE,UACP0B,aAAa1F,KAAKgE,SAClBhE,KAAKgE,aAAU2B,EAEnB,EAEAC,OAAAA,CAAQxE,GACNmD,QAAQnD,MAAM,mBACdmD,QAAQnD,MAAMA,EAChB,EAEAnB,OAAAA,CAAQ4E,GACFA,GACFN,QAAQC,IACL,4BAA2BK,EAAMgB,kBAAkBhB,EAAMiB,uBAC3C9F,KAAKiE,eAAiB,QAIzCjE,KAAK+D,QAAS,EAET/D,KAAK8D,UACR9D,KAAK8D,SAAU,EACf9D,KAAK+F,OAET,EAEAA,IAAAA,GACE,IACE,MAAMC,EAAiC,WAAtBC,SAASD,SAAwB,MAAQ,KACpDE,EAAO,GAAEF,OAAcC,SAASE,iBACtCnG,KAAK4D,GAAK,IAAIwC,UAAUF,EAC1B,CAAE,MAAOG,GAGP,OAFA9B,QAAQnD,MAAM,uCACdmD,QAAQnD,MAAMiF,EAEhB,CAEArG,KAAK8D,SAAU,EACf9D,KAAKgE,QAAUN,WAAW1D,KAAKsE,mBAAoBtE,KAAKiE,gBACxDjE,KAAK4D,GAAG0C,UAAYtG,KAAK4E,UACzB5E,KAAK4D,GAAG2C,OAASvG,KAAKJ,OACtBI,KAAK4D,GAAG4C,QAAUxG,KAAK4F,QACvB5F,KAAK4D,GAAG6B,QAAUzF,KAAKC,QACvBD,KAAK6D,aAAc,CACrB,EAEA4C,SAAAA,CAAUC,GACR,MAAMpB,EAAUoB,EAAIpB,QACdqB,EAASD,EAAIC,OAAOC,OAASF,EAAIC,OAAS,CAAC,MAC3CE,EAAcH,EAAIG,YAExB,IAAK,MAAMhC,KAAS8B,EACZ9B,KAAS7E,KAAKoE,WAClBpE,KAAKoE,SAASS,GAAS,CAAC,GAGpBgC,KAAe7G,KAAKqE,0BACxBrE,KAAKqE,wBAAwBwC,GAAeF,GAG9C3G,KAAKoE,SAASS,GAAOgC,GAAevB,EAGtC,MAAO,KACLtF,KAAK8G,YAAYD,EAAY,CAEjC,EAEAC,WAAAA,CAAYD,GACV,MAAMF,EAAS3G,KAAKqE,wBAAwBwC,GAC5C,GAAKF,EAAL,CAGA,IAAK,MAAM9B,KAAS8B,EACb3G,KAAKoE,SAASS,KAASgC,YAGrB7G,KAAKoE,SAASS,GAAOgC,GACvBzB,OAAO2B,KAAK/G,KAAKoE,SAASS,IAAQ+B,eAC9B5G,KAAKoE,SAASS,WAGlB7E,KAAKqE,wBAAwBwC,EAX5B,CAYV,GAGFG,OAAAA,GACErJ,EAAAA,EAAIO,GAAG,YAAa8B,KAAKyG,WACzB9I,EAAAA,EAAIO,GAAG,cAAe8B,KAAK8G,aAE3B9G,KAAKiH,OAAO,UAAWnE,IACrBnF,EAAAA,EAAII,KAAK+E,EAAO,UAAY,aAAa,IAG3C9C,KAAK+F,MACP,GCxLF,MAAM,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAS,KAEpE,Q,SCNOvG,MAAM,mB,GAEFA,MAAM,Q,SACNA,MAAM,c,SACNA,MAAM,mB,SACNA,MAAM,sB,SACNA,MAAM,oB,GAGNA,MAAM,Q,SACJA,MAAM,a,GACTsC,EAAAA,EAAAA,GAAgC,YAA1B,uBAAmB,G,GAAzBoF,G,SAEG1H,MAAM,qB,2BAGNA,MAAM,c,uFAhBjBC,EAAAA,EAAAA,IAqBM,MArBNC,EAqBM,EApBJf,EAAAA,EAAAA,IAmBQwI,EAAA,CAnBDzI,IAAI,kBAAgB,C,kBACzB,IAKM,EALNoD,EAAAA,EAAAA,GAKM,MALNC,EAKM,CAJwBqF,EAAAC,MAAMC,WAAQ,WAA1C7H,EAAAA,EAAAA,IAAgD,IAAhDuC,IACsCoF,EAAAC,MAAME,aAAU,WAAtD9H,EAAAA,EAAAA,IAA4D,IAA5DwC,IACyCmF,EAAAC,MAAMG,mBAAgB,WAA/D/H,EAAAA,EAAAA,IAAqE,IAArEgI,MAAqE,WACrEhI,EAAAA,EAAAA,IAAuC,IAAvCgD,OAGFX,EAAAA,EAAAA,GAUM,MAVNY,EAUM,CATyB0E,EAAAC,MAAMK,YAAS,WAA5CjI,EAAAA,EAAAA,IAEM,MAFNkI,EAEMC,IACoCR,EAAAC,MAAMG,mBAAgB,WAAhE/H,EAAAA,EAAAA,IAEM,MAFNoI,EAEM,EADJ/F,EAAAA,EAAAA,GAA6B,Q,aAAvBD,EAAAA,EAAAA,IAAQuF,EAAOU,S,aAEYV,EAAAC,MAAME,aAAU,WAAnD9H,EAAAA,EAAAA,IAEM,MAFNsI,EAEM,EADJjG,EAAAA,EAAAA,GAAmC,Q,aAA7BD,EAAAA,EAAAA,IAAQuF,EAAaY,e,6DAWrC,IACErF,KAAM,iBACNK,WAAY,CAACiF,MAAKA,GAAAA,GAClBC,OAAQ,CAACC,EAAAA,GAET7E,IAAAA,GACE,MAAO,CACL0E,aAAc,GACdF,OAAQ,GACRM,iBAAazC,EAEb0B,MAAO,CACLK,WAAW,EACXF,kBAAkB,EAClBD,YAAY,EACZD,UAAU,GAGhB,EAEA3H,QAAS,CACP0I,KAAAA,GACErI,KAAKqH,MAAMK,WAAY,EACvB1H,KAAKqH,MAAMG,kBAAmB,EAC9BxH,KAAKqH,MAAME,YAAa,EACxBvH,KAAKqH,MAAMC,UAAW,EACtBtH,KAAK8H,OAAS,GACd9H,KAAKgI,aAAe,EACtB,EAEAM,iBAAAA,GACEtI,KAAKqI,QACLrI,KAAKqH,MAAMK,WAAY,EACvB1H,KAAKuI,MAAMC,eAAeC,OAEtBzI,KAAKoI,cACP1C,aAAa1F,KAAKoI,aAClBpI,KAAKoI,iBAAczC,EAEvB,EAEA+C,eAAAA,GACE,MAAMC,EAAO3I,KAEbA,KAAKoI,YAAc1E,YAAW,KAC5B1D,KAAKqI,QACLM,EAAKJ,MAAMC,eAAe7D,QAC1BgE,EAAKP,iBAAczC,CAAQ,GAC1B,IACL,EAEA6B,gBAAAA,CAAiB3C,GACf7E,KAAKqI,QACLrI,KAAKqH,MAAMG,kBAAmB,EAC9BxH,KAAK8H,OAASjD,EAAMiD,OACpB9H,KAAKuI,MAAMC,eAAeC,MAC5B,EAEAG,QAAAA,CAAS/D,GACP7E,KAAKqI,QACLrI,KAAKqH,MAAME,YAAa,EACxBvH,KAAKgI,aAAenD,EAAMgE,cAC1B7I,KAAKuI,MAAMC,eAAeC,MAC5B,EAEAK,OAAAA,GACE9I,KAAKqI,QACLrI,KAAKqH,MAAMC,UAAW,EACtBtH,KAAKuI,MAAMC,eAAeC,MAC5B,EAEAM,QAAAA,GACE/I,KAAKqI,QACLrI,KAAKqH,MAAMC,UAAW,EACtBtH,KAAKuI,MAAMC,eAAe7D,OAC5B,EAEAqE,gBAAAA,GACEhJ,KAAKyG,UAAUzG,KAAKsI,kBAAmB,KAAM,4DAC7CtI,KAAKyG,UAAUzG,KAAK8I,QAAS,KAAM,uDACnC9I,KAAKyG,UAAUzG,KAAK+I,SAAU,KAAM,mDACpC/I,KAAKyG,UAAUzG,KAAKwH,iBAAkB,KAAM,2DAC5CxH,KAAKyG,UAAUzG,KAAK4I,SAAU,KAAM,mDACpC5I,KAAKyG,UAAUzG,KAAK0I,gBAAiB,KACjC,yDACA,oDACA,6DACN,GAGFtI,OAAAA,GACEJ,KAAKgJ,kBACP,GClHF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,U,2CCREvJ,EAAAA,EAAAA,IAAO,M,CAMT,QACEkD,KAAM,OACNuF,OAAQ,CAACC,EAAAA,GAETxI,QAAS,CACPiF,SAAAA,CAAUC,GACR7E,KAAKiJ,OAAO,CACVjI,MAAO6D,EAAM7D,MACbF,KAAM+D,EAAMqE,QACZhI,MAAO,CACLkB,KAAM,SAGZ,GAGFhC,OAAAA,GACEJ,KAAKyG,UAAUzG,KAAK4E,UAAW,KAAM,iDACvC,GCpBF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,U,2CCNEnF,EAAAA,EAAAA,IAAO,M,CAMT,QACEyI,OAAQ,CAACC,EAAAA,GAETxI,QAAS,CACPiF,SAAAA,CAAUC,GACR7E,KAAKiJ,OAAO,CACVjI,MAAO6D,EAAM7D,MACbF,KAAM+D,EAAMsE,KACZjI,MAAO,CACLgB,IAAK2C,EAAMzC,KAAO,0BAA4ByC,EAAMzC,UAAOuD,EAC3DvD,KAAMyC,EAAMzC,UAAOuD,EAAY,SAGrC,GAGFvF,OAAAA,GACEJ,KAAKyG,UACHzG,KAAK4E,UACL,KACA,iEAEJ,GCxBF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,UdkBA,IACEsD,OAAQ,CAACC,EAAAA,GACTnF,WAAY,CACVoG,cAAa,IACbC,kBAAiB,EACjBC,OAAM,EACNC,cAAa,EACbC,KAAI,GACJC,WAAU,GACVC,eAAcA,IAGhBpG,IAAAA,GACE,MAAO,CACLqG,OAAQ,CAAC,EACTC,mBAAmB,EACnBC,WAAW,EACXC,gBAAiB,KAErB,EAEAC,SAAU,CACRxL,YAAAA,GACE,OAAOyB,KAAK4J,mBACR,iBAAkB5J,KAAK2J,MAC7B,EAEA9K,YAAAA,GACE,OAAOmB,KAAKzB,YACd,EAEAQ,aAAAA,GACE,OAAOiB,KAAKzB,eACR,eAAgByB,KAAK2J,QACrB,uBAAwB3J,KAAK2J,OAEnC,EAEA1K,OAAAA,GACE,OAAOe,KAAKzB,cAAgB,SAAUyB,KAAK2J,MAC7C,GAGFhK,QAAS,CACPtB,cAAAA,CAAeD,GACb4B,KAAKuI,MAAM9H,cAAc+C,OAAOpF,EAClC,EAEA,gBAAM4L,GACJhK,KAAK2J,aAAe3J,KAAKiK,QAAQ,aAAc,CAAC,EAAG,KAAO,GAC1DjK,KAAK4J,mBAAoB,CAC3B,EAEAvK,UAAAA,GACMW,KAAK8J,iBACP9J,KAAK8J,gBAAgBI,SAEvBlK,KAAKuI,MAAM4B,UAAUxF,OACvB,GAGFqC,OAAAA,GACEhH,KAAKgK,YACP,EAEAI,WAAAA,GACMpK,KAAKqK,UAAU,qBAAqBzD,QAGxC/D,OAAOyH,iBAAiB,uBAAwBtF,IAC9CA,EAAEuF,iBACFvK,KAAK8J,gBAAkB9E,EACvBhF,KAAKuI,MAAM4B,UAAU1B,OAErBzI,KAAKwK,UAAU,mBAAoB,IAAK,CACtCC,QAAS,IAAIC,MAAK,IAAIA,MAAOC,UAAY,UACzC,GAEN,EAEAvK,OAAAA,GACEzC,EAAAA,EAAIU,eAAe2B,KAAK3B,gBACxBV,EAAAA,EAAIO,GAAG,WAAW,IAAM8B,KAAK6J,WAAY,IACzClM,EAAAA,EAAIO,GAAG,cAAc,IAAM8B,KAAK6J,WAAY,GAC9C,GetGF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAASe,KAEpE,U,4ICRiBxD,EAAAyD,UAAO,WAAtBrM,EAAAA,EAAAA,IAA0BsM,EAAA,CAAAjK,IAAA,sBAE1BiB,EAAAA,EAAAA,GAQM,OARDpB,GAAG,YAAYlB,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,SAAiBjD,EAAAyM,UAAU1I,OAAKC,EAAAA,EAAAA,IAAE8E,EAAA/E,Q,gBAC1D5C,EAAAA,EAAAA,IAMMa,EAAAA,GAAA,MAAAC,EAAAA,EAAAA,IANkB6G,EAAA4D,MAAI,CAAfC,EAAKC,M,WAAlB1M,EAAAA,EAAAA,IAMM2M,EAAA,CANyBtK,IAAKqK,EAAI1L,OAAK+B,EAAAA,EAAAA,IAAE0J,EAAIzL,OAAQ6C,OAAKC,EAAAA,EAAAA,IAAE2I,EAAI5I,Q,mBACxD,IAAkC,gBAA9C5C,EAAAA,EAAAA,IAIaa,EAAAA,GAAA,MAAAC,EAAAA,EAAAA,IAJqB0K,EAAIG,SAAO,CAAzBC,EAAQC,M,WAA5B9M,EAAAA,EAAAA,IAIa+M,EAAAA,GAAA,CAJmC1K,IAAKyK,GAAC,EACpD3M,EAAAA,EAAAA,IAES6M,EAAA,CAFAnJ,OAAKC,EAAAA,EAAAA,IAAE+I,EAAOhJ,OAAQ7C,OAAK+B,EAAAA,EAAAA,IAAE8J,EAAO7L,Q,mBAC3C,IAAoE,cAApEhB,EAAAA,EAAAA,KAAoEiN,EAAAA,EAAAA,IAApDJ,EAAOxL,YAAS6L,EAAAA,EAAAA,KAAAC,EAAAA,EAAAA,IAAUrN,EAAAsN,eAAeP,KAAM,a,oKCNvE5L,EAAAA,EAAAA,IAEM,OAFDD,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,MAAcjD,EAAAyM,UAAU1I,OAAKC,EAAAA,EAAAA,IAAEd,EAAAa,Q,EACxCwJ,EAAAA,EAAAA,IAAQrL,EAAAsL,OAAA,kBAAAnG,GAAA,M,CAKZ,QACEhD,KAAM,MACNC,MAAO,CAELpD,MAAO,CACL2D,KAAM4I,OACNC,UAAU,EACV3I,QAAS,IAIXhB,MAAO,CACLc,KAAM4I,OACNC,UAAU,EACV3I,QAAS,KAIb0G,SAAU,CACRgB,OAAAA,GACE,OAAO/K,KAAKR,KACd,ICrBJ,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,U,2CCREC,EAAAA,EAAAA,IAEM,OAFA4C,OAAKC,EAAAA,EAAAA,IAAEd,EAAAa,OAAQ7C,OAAK+B,EAAAA,EAAAA,IAAEjD,EAAAyM,U,EAC1Bc,EAAAA,EAAAA,IAAQrL,EAAAsL,OAAA,kBAAAnG,GAAA,M,CAKZ,QACEhD,KAAM,SACNC,MAAO,CAELP,MAAO,CACLc,KAAM4I,OACNC,UAAU,EACV3I,QAAS,IAIX7D,MAAO,CACL2D,KAAM4I,OACNC,UAAU,EACV3I,QAAS,KAIb0G,SAAU,CACRgB,OAAAA,GACE,OAAQ/K,KAAKR,OAAOoH,OAAS5G,KAAKR,MAAMyM,MAAM,KAAO,CAAC,UAAUC,OAAO,CAAC,SAAU,UACpF,ICrBJ,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,UJYA,IACEvJ,KAAM,YACNuF,OAAQ,CAACC,EAAAA,GACTnF,WAAY,CAACmJ,OAAM,GAAEC,QAAO,KAAEC,IAAGA,IACjCzJ,MAAO,CAEL0J,eAAgB,CACdnJ,KAAMC,OACN4I,UAAU,EACV3I,QAAS,IAIbC,IAAAA,GACE,MAAO,CACL0H,KAAM,GACNH,SAAS,EACTxI,WAAOsD,EACPnG,WAAOmG,EAEX,EAEAoE,SAAU,CACRgB,OAAAA,GACE,OAAO/K,KAAKR,KACd,EAEA+M,eAAAA,GACE,OAAOC,WAAWxM,KAAKsM,iBAAmB,CAC5C,GAGF3M,QAAS,CACPiM,cAAAA,CAAeP,GACb,MAAMzI,EAAQ,IAAIyI,EAAOzI,OAIzB,OAHIA,EAAMpD,cACDoD,EAAMpD,MAERoD,CACT,EAEA6J,aAAAA,CAAcC,GACZ,MAAMC,GAAO,IAAIC,WAAYC,gBAAgBH,EAAM,YAAYI,WAAW,GACpEnE,EAAO3I,KACbA,KAAKqC,MAAQsK,EAAKI,WAAW1K,OAAO2K,UACpChN,KAAKR,MAAQmN,EAAKI,WAAWvN,OAAOwN,UAEpChN,KAAKgL,KAAO,IAAI2B,EAAKM,qBAAqB,QAAQC,KAAKjC,IAC9C,CACL5I,MAAO4I,EAAI8B,WAAW1K,OAAO2K,UAC7BxN,MAAOyL,EAAI8B,WAAWvN,OAAOwN,UAC7B5B,QAAS,IAAIH,EAAIkC,UAAUD,KAAKE,IAC9B,MAAMvN,GAAYwN,EAAAA,GAAAA,KAChBC,EAAAA,EAAAA,KACE,IAAM,QAAQ,KAAuBF,EAAGG,qBAItClL,EAAQ+K,EAAGL,WAAW1K,OAAO2K,UAC7BjC,EAAUqC,EAAGL,WAAWvN,OAAOwN,UAC/BQ,EAAQ,IAAIJ,EAAGL,YAAYU,QAAO,CAACC,EAAKf,KACtB,UAAlBA,EAAKY,WACPG,EAAIf,EAAKY,UAAYZ,EAAKK,WAGrBU,IACN,CACDC,QAASP,EAAGjN,YAGRkL,EAAS,CACbxL,UAAWA,EACXwC,MAAOA,EACP7C,MAAOuL,EACPnI,MAAO4K,GAAS,CAAC,GAInB,OADA7E,EAAKrK,SAAS0E,WAAWoK,EAAGG,UAAY1N,EACjCwL,CAAK,QAKlBrL,KAAK6K,SAAU,CACjB,EAEA,sBAAM+C,GACJ5N,KAAK6K,SAAU,EACf7K,KAAKoL,QAAU,GACf,MAAMzI,EAAO3C,KAAK6N,OAAOC,OAAOnL,KAC1BoL,QAAkB/N,KAAKiK,QAAQ,uBAAwB,CAAEtH,KAAMA,IAEhEoL,GACH/N,KAAKgO,YAAa,aAAYrL,eAGhC3C,KAAKyM,cAAcsB,EACrB,GAGF3N,OAAAA,GAEE,GADAJ,KAAK4N,mBACD5N,KAAKuM,gBAAiB,CACxB,MAAM5D,EAAO3I,KACbiO,aAAY,KACVtF,EAAKiF,kBAAkB,GACtBnK,UAA+B,IAArBzD,KAAKuM,iBAAsB2B,QAAQ,IAClD,CACF,GKzHF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,U,2CCTEzO,EAAAA,EAAAA,IAAyB,UAArB,mB,CAIN,QACEkD,KAAM,YCDR,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,U,iECNOnD,MAAM,mB,IACHA,MAAM,QAAQ2O,OAAO,Q,ufAoBpB3O,MAAM,O,YACTsC,EAAAA,EAAAA,GAEQ,eADNA,EAAAA,EAAAA,GAA8E,SAAvEqB,KAAK,WAAWR,KAAK,mBAAmByL,YAAY,uB,SAD7D1L,I,IAKGlD,MAAM,e,yBAIXsC,EAAAA,EAAAA,GAKM,OALDtC,MAAM,kBAAgB,EACzBsC,EAAAA,EAAAA,GAGQ,SAHDtC,MAAM,YAAU,EACrBsC,EAAAA,EAAAA,GAAuC,SAAhCqB,KAAK,WAAWR,KAAK,c,QAAW,6CAEzC,K,2CAnCNlD,EAAAA,EAAAA,IAsCM,MAtCNC,GAsCM,EArCJoC,EAAAA,EAAAA,GAoCO,OApCPC,GAoCO,CAnCLC,GAmBuB1D,EAAA+P,YAAS,WAAhC5O,EAAAA,EAAAA,IAIM,MAJNgD,GAIMkF,MAAA,gBAEN7F,EAAAA,EAAAA,GAEM,MAFNoF,GAEM,EADJpF,EAAAA,EAAAA,GAAuF,SAAhFqB,KAAK,SAAS3D,MAAM,kBAAmB8O,MAAOhQ,EAAA+P,UAAY,WAAa,S,aAGhFxG,M,CAaN,QACElF,KAAM,QACNuF,OAAQ,CAACC,EAAAA,GACTvF,MAAO,CAEL2L,SAAU,CACRpL,KAAMqL,QACNxC,UAAU,EACV3I,SAAS,IAIb0G,SAAU,CACRsE,SAAAA,GACE,OAAOrO,KAAKyO,aAAazO,KAAKuO,SAChC,ICrDJ,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,U,qECRE/P,EAAAA,EAAAA,IAA0BkQ,EAAA,CAAlBH,UAAU,G,CAMpB,QACE5L,KAAM,WACNuF,OAAQ,CAACyG,IACT3L,WAAY,CAAC2L,MAAKA,IAClB/L,MAAO,CACL2L,SAAU,CACRpL,KAAMqL,QACNxC,UAAU,EACV3I,SAAS,KCVf,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,U,gBCKS7D,MAAM,U,IACJA,MAAM,S,UAKRA,MAAM,U,IACJA,MAAM,S,UAKRA,MAAM,U,yIAvBbC,EAAAA,EAAAA,IA4BO,aA3BU2H,EAAAyD,UAAO,WAAtBrM,EAAAA,EAAAA,IAA0BsM,EAAA,CAAAjK,IAAA,kBAC1BrC,EAAAA,EAAAA,IAOEoQ,EAAA,C,MAPIC,OAAQzH,EAAApE,WACR,iBAAgBoE,EAAA0H,cAChB,wBAAuB1H,EAAA2H,oBACvBC,SAAU5H,EAAA4H,SACVC,SAAMvN,EAAA,KAAAA,EAAA,GAAAwN,GAAE9H,EAAA0H,cAAgBI,GACxBC,eAAazN,EAAA,KAAAA,EAAA,GAAAwN,GAAE9H,EAAA2H,oBAAsBG,I,wEAIC,aAAlB9H,EAAA0H,gBAAa,WAAvCrP,EAAAA,EAAAA,IAIM,MAJNC,GAIM,EAHJoC,EAAAA,EAAAA,GAEM,MAFNC,GAEM,EADJpD,EAAAA,EAAAA,IAAkDyQ,EAAA,CAAvC,iBAAgBhI,EAAA2H,qBAAmB,gCAID,eAAlB3H,EAAA0H,gBAAa,WAA5CrP,EAAAA,EAAAA,IAIM,MAJNuC,GAIM,EAHJF,EAAAA,EAAAA,GAEM,MAFNG,GAEM,EADJtD,EAAAA,EAAAA,IAAc0Q,UAAA,WAIlB5P,EAAAA,EAAAA,IAIM,MAJNgI,GAIM,gBAHJhI,EAAAA,EAAAA,IAEMa,EAAAA,GAAA,MAAAC,EAAAA,EAAAA,IAF+E6G,EAAApE,YAAU,CAA1BsM,EAAO3M,M,WAA5ElD,EAAAA,EAAAA,IAEM,OAFDD,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,QAAO,CAAAgO,OAAkB5M,IAASyE,EAAA0H,iBAAqDjO,IAAK8B,G,CACnBA,IAASyE,EAAA0H,gBAAa,WAAxGtQ,EAAAA,EAAAA,KAA4GiN,EAAAA,EAAAA,IAA5F6D,EAAMzP,WAAS,C,MAAG8J,OAAQ2F,EAAM3F,OAAS,cAAahH,G,6ICvBxEb,EAAAA,EAAAA,GAAyB,KAAtBtC,MAAM,eAAa,W,0CAOpBA,MAAM,W,IAEHgQ,KAAK,M,YACN1N,EAAAA,EAAAA,GAAyB,KAAtBtC,MAAM,eAAa,W,UAChBA,MAAM,Q,2BAOXgQ,KAAK,c,IACFhQ,MAAM,Q,qBAGPA,MAAM,uB,6BAOXA,MAAM,W,uCAIAA,MAAM,Q,uBASZA,MAAM,U,IAEHgQ,KAAK,gB,YACN1N,EAAAA,EAAAA,GAEO,QAFDtC,MAAM,QAAM,EAChBsC,EAAAA,EAAAA,GAAgC,KAA7BtC,MAAM,yBAAoB,K,UAEzBA,MAAM,Q,IAKXgQ,KAAK,c,YACN1N,EAAAA,EAAAA,GAEO,QAFDtC,MAAM,QAAM,EAChBsC,EAAAA,EAAAA,GAAuB,KAApBtC,MAAM,gBAAW,K,UAEhBA,MAAM,Q,IAKXgQ,KAAK,W,YACN1N,EAAAA,EAAAA,GAEO,QAFDtC,MAAM,QAAM,EAChBsC,EAAAA,EAAAA,GAAiC,KAA9BtC,MAAM,0BAAqB,K,UAE1BA,MAAM,Q,6EApEpBC,EAAAA,EAAAA,IAwEM,OAxEAD,OAAK+B,EAAAA,EAAAA,IAAA,CAAAkO,UAAcrI,EAAAqI,a,EACvB3N,EAAAA,EAAAA,GAMM,OANDtC,MAAM,UAAWiC,QAAKC,EAAA,KAAAA,EAAA,GAAAwN,GAAE9H,EAAAqI,WAAarI,EAAAqI,Y,CACxC/P,GAC6B8B,EAAAwN,WAAQ,WAArCvP,EAAAA,EAAAA,IAA2D,Q,MAArDD,MAAM,W,aAA2BqC,EAAAA,EAAAA,IAAQL,EAASwN,W,6BACxDlN,EAAAA,EAAAA,GAEuD,KAFpDtC,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,4BAA2B,CAAAmO,GACpBtI,EAAAyC,UAASzI,OAAUgG,EAAAyC,aAC/B7I,MAAOoG,EAAAyC,UAAY,YAAc,gB,cAGK,aAAlBrI,EAAAsN,gBAAa,WAAvCrP,EAAAA,EAAAA,IAoBK,KApBLwC,GAoBK,EAnBHH,EAAAA,EAAAA,GAKK,MALDtC,MAAM,QAAQwB,MAAM,OAAQS,QAAKC,EAAA,KAAAA,EAAA,GAAAwN,GAAE5Q,EAAAqR,YAAY,c,EACjD7N,EAAAA,EAAAA,GAGI,IAHJ2F,GAGI,CAFFhF,GAC0B2E,EAAAqI,WAAe,iBAAN,WAAnChQ,EAAAA,EAAAA,IAAgD,OAAhDiD,GAAqC,eAAI,aAI7CjD,EAAAA,EAAAA,IAWKa,EAAAA,GAAA,MAAAC,EAAAA,EAAAA,IAXsB6G,EAAAwI,gBAAc,CAA9BjG,EAAQhH,M,WAAnBlD,EAAAA,EAAAA,IAWK,MAXuCoB,IAAK8B,EAAMnD,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,QAAO,CAAAsO,SAC7ClN,IAASnB,EAAAuN,uBAC3B/N,MAAO2I,EAAOhH,KAAOlB,QAAKyN,GAAE1O,EAAAuC,MAAM,gBAAiBJ,I,EACtDb,EAAAA,EAAAA,GAOI,IAPJoF,GAOI,EANJpF,EAAAA,EAAAA,GAIO,OAJP8F,GAIO,CAHkC+B,EAAOvH,OAAO,WAAH,WAAlD3C,EAAAA,EAAAA,IAAiE,K,MAA7DD,OAAK+B,EAAAA,EAAAA,IAAEoI,EAAOvH,KAAK,W,SACoBuH,EAAOvH,MAAM0N,SAAM,WAA9DrQ,EAAAA,EAAAA,IAA4E,O,MAAtEyC,IAAKyH,EAAOvH,MAAM0N,OAAwC3N,IAAI,Q,yBACpE1C,EAAAA,EAAAA,IAAwC,IAAxCsQ,OAEwB3I,EAAAqI,W,iBAAS,WAAnChQ,EAAAA,EAAAA,IAA4D,Q,MAAtDD,MAAM,O,aAAyBqC,EAAAA,EAAAA,IAAQ8H,EAAOhH,O,+CAKxDlD,EAAAA,EAAAA,IAWK,KAXLuQ,GAWK,gBAVHvQ,EAAAA,EAAAA,IASKa,EAAAA,GAAA,MAAAC,EAAAA,EAAAA,IATcjC,EAAA2R,YAARtN,K,WAAXlD,EAAAA,EAAAA,IASK,MAT2BoB,IAAK8B,EAAMnD,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,QAAO,CAAAsO,SAAoBlN,IAASnB,EAAAsN,iBAChF9N,MAAO2B,EAAOlB,QAAKyN,GAAE5Q,EAAAqR,YAAYhN,I,EACpCb,EAAAA,EAAAA,GAMI,KANA0N,KAAI,KAAO7M,K,EACfb,EAAAA,EAAAA,GAGO,OAHPoO,GAGO,CAF+B5R,EAAA6R,eAAeC,SAASzN,KAAI,WAAhElD,EAAAA,EAAAA,IAAqE,K,MAAjED,OAAK+B,EAAAA,EAAAA,IAAE6F,EAAAiJ,MAAM1N,GAAMnD,Q,sBACvBhB,EAAAA,EAAAA,IAAkD8R,EAAA,C,MAAlC3N,KAAMA,EAAM4N,KAAK,S,oBAETnJ,EAAAqI,W,iBAAS,WAAnChQ,EAAAA,EAAAA,IAAkE,Q,MAA5DD,MAAM,O,aAAyBqC,EAAAA,EAAAA,IAAQvD,EAAkBkS,YAAN7N,K,wCAK7Db,EAAAA,EAAAA,GA2BK,KA3BL2O,GA2BK,EA1BH3O,EAAAA,EAAAA,GAOK,MAPAtC,OAAK+B,EAAAA,EAAAA,IAAA,CAAAsO,SAA+B,eAAlBrO,EAAAsN,gBAAiC9N,MAAM,aAAcS,QAAKC,EAAA,KAAAA,EAAA,GAAAwN,GAAE5Q,EAAAqR,YAAY,gB,EAC7F7N,EAAAA,EAAAA,GAKI,IALJ4O,GAKI,CAJFC,GAG0BvJ,EAAAqI,WAAqB,iBAAZ,WAAnChQ,EAAAA,EAAAA,IAAsD,OAAtDmR,GAAqC,kBAAU,IAInD9O,EAAAA,EAAAA,GAOK,MAPAtC,OAAK+B,EAAAA,EAAAA,IAAA,CAAAsO,SAA+B,aAAlBrO,EAAAsN,gBAA+B9N,MAAM,WAAYS,QAAKC,EAAA,KAAAA,EAAA,GAAAwN,GAAE5Q,EAAAqR,YAAY,c,EACzF7N,EAAAA,EAAAA,GAKI,IALJ+O,GAKI,CAJFC,GAG0B1J,EAAAqI,WAAmB,iBAAV,WAAnChQ,EAAAA,EAAAA,IAAoD,OAApDsR,GAAqC,gBAAQ,IAIjDjP,EAAAA,EAAAA,GAOK,MAPDd,MAAM,SAAUS,QAAKC,EAAA,KAAAA,EAAA,GAAAwN,GAAE5Q,EAAAqR,YAAY,Y,EACrC7N,EAAAA,EAAAA,GAKI,IALJkP,GAKI,CAJFC,GAG0B7J,EAAAqI,WAAiB,iBAAR,WAAnChQ,EAAAA,EAAAA,IAAkD,OAAlDyR,GAAqC,kBAAM,E,oOAcrD,IACEvO,KAAM,MACNwO,MAAO,CAAC,SAAU,iBAClBjJ,OAAQ,CAACC,EAAAA,GACTnF,WAAY,CACVoO,cAAaA,GAAAA,GAGfxO,MAAO,CACLiM,OAAQ,CACN1L,KAAMiC,OACN4G,UAAU,GAGZ8C,cAAe,CACb3L,KAAM4I,QAGRgD,oBAAqB,CACnB5L,KAAM4I,QAGRiD,SAAU,CACR7L,KAAM4I,SAIVhC,SAAU,CACRoG,cAAAA,GACE,MAAO,CAAC,UAAW,WACrB,EAEAF,UAAAA,GACE,MAAMoB,EAAUA,CAACC,EAAO3O,KACtB,MAAM4O,EAAMtB,EAAWuB,QAAQ7O,GAI/B,OAHI4O,GAAO,IACTD,EAAQ,CAAC3O,GAAMuJ,OAAQoF,EAAMG,MAAM,EAAGF,GAAKrF,OAAOoF,EAAMG,MAAMF,EAAI,MAE7DD,CAAI,EAGb,IAAIrB,EAAa7K,OAAO2B,KAAK/G,KAAK6O,QAAQ6C,OAG1C,OAFAzB,EAAaoB,EAAQpB,EAAY,WACjCA,EAAaoB,EAAQpB,EAAY,YAC1BA,CACT,EAEA0B,gBAAAA,GACE,SAAI3R,KAAK4R,aAAc5R,KAAK6R,WAG9B,GAGFlS,QAAS,CACPgQ,WAAAA,CAAYhN,GACV3C,KAAK+C,MAAM,SAAUJ,GACrB3C,KAAKyP,YAAYzP,KAAK4R,YAAoB5R,KAAK2R,gBACjD,EAEAnB,WAAAA,CAAY7N,GACV,MAAa,aAATA,EACK,OACI,YAATA,EACK,UAEFA,CACT,EAEAmP,YAAAA,CAAajI,GACX7J,KAAK6J,UAAYA,CACnB,GAGFvG,IAAAA,GACE,MAAO,CACLmM,WAAW,EACX5F,WAAW,EACXwG,MAAOA,GACPlK,KAAM,KACNyJ,eAAgBA,GAEpB,EAEAxP,OAAAA,GACEJ,KAAKyP,UAAYzP,KAAK2R,iBACtBhU,EAAAA,EAAIO,GAAG,WAAW,IAAM8B,KAAK8R,cAAa,KAC1CnU,EAAAA,EAAIO,GAAG,cAAc,IAAM8B,KAAK8R,cAAa,KAC7C9R,KAAKiH,QAAO,IAAMjH,KAAK+R,MAAMlI,YAAYyE,GAAUtO,KAAK8R,aAAaxD,KACrEtO,KAAK8R,aAAa9R,KAAK+R,MAAMlI,UAC/B,GCtKF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,U,sBF+BA,IACElH,KAAM,QACNuF,OAAQ,CAACC,EAAAA,GACTnF,WAAY,CAACgP,WAAU,cAAEC,SAAQ,cAAEC,IAAG,GAAE9F,QAAOA,GAAAA,GAE/C9I,IAAAA,GACE,MAAO,CACLuH,SAAS,EACTsH,QAAS,CAAC,EACVC,SAAU,CAAC,EACXC,WAAY,CAAC,EACbrP,WAAY,CAAC,EACbgM,cAAUrJ,EACVmJ,mBAAenJ,EACfoJ,oBAAqB,QAEzB,EAEApP,QAAS,CACP2S,iBAAAA,GACE,MAAMC,EAAQvS,KAAK6N,OAAO2E,KAAKD,MAAM,iCAC/BE,EAASF,EAAQA,EAAM,GAAK,WAC9BE,GAAQ7L,SACV5G,KAAK8O,cAAgB2D,EACzB,EAEAC,UAAAA,GACE,MAAM/J,EAAO3I,KACbA,KAAKgD,WAAa,CAAC,EAEnBoC,OAAOuN,QAAQ3S,KAAKmS,SAASS,SAAQC,OAAQlQ,EAAM8P,MACjD,MAAMK,EAAgBnQ,EAAKsJ,MAAM,KAAKiB,KAAK6F,GAAUA,EAAM,GAAGC,cAAgBD,EAAMtB,MAAM,KAAIwB,KAAK,IACnG,IAAIC,EAAO,KACX,IACEA,QAAa,QAAQ,KAAsBJ,UAC7C,CAAE,MAAO9N,GACP,MACF,CAEA,MAAMnF,GAAYwN,EAAAA,GAAAA,KAAWC,EAAAA,EAAAA,KAAqBuF,SAAqBK,KACvEvK,EAAKrK,SAAS0E,WAAWL,GAAQ9C,EACjC8I,EAAK3F,WAAWL,GAAQ,CACtB9C,UAAWA,EACXsT,WAAYxQ,EACZgH,OAAQ8I,EACT,GAEL,EAEA,iBAAMW,IACHpT,KAAKmS,QAASnS,KAAKoS,SAAUpS,KAAKqS,WAAYrS,KAAKgP,gBAC1CqE,QAAQC,IAAI,CAChBtT,KAAKiK,QAAQ,sBACbjK,KAAKiK,QAAQ,uBACbjK,KAAKiK,QAAQ,yBACbjK,KAAKiK,QAAQ,0BAGnBjK,KAAKuT,wBACP,EAEAA,sBAAAA,GACEvT,KAAKmS,QAAQqB,SAAW,CAAC,EACzBxT,KAAKmS,QAAQsB,QAAU,CAAC,CAC1B,GAGF,aAAMrT,GACJJ,KAAK6K,SAAU,EAEf,UACQ7K,KAAKoT,cACXpT,KAAK0S,aACL1S,KAAKsS,oBACLtS,KAAKiH,OAAO,cAAejH,KAAKsS,kBAClC,CAAE,QACAtS,KAAK6K,SAAU,CACjB,CACF,GG9GF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,U,gBCPSrL,MAAM,U,uEAFbC,EAAAA,EAAAA,IAKO,aAJU2H,EAAAyD,UAAO,WAAtBrM,EAAAA,EAAAA,IAA0BsM,EAAA,CAAAjK,IAAA,kBAC1BpB,EAAAA,EAAAA,IAEM,MAFNC,GAEM,cADJlB,EAAAA,EAAAA,KAAwEiN,EAAAA,EAAAA,IAAxDrE,EAAAvH,WAAS,CAAG8J,OAAQvC,EAAAuC,OAAS,cAAarL,EAAA6U,Y,uCAYhE,QACExQ,KAAM,QACNuF,OAAQ,CAACC,EAAAA,GACTnF,WAAY,CAACiP,SAAQ,cAAEC,IAAG,GAAE9F,QAAOA,GAAAA,GAEnC9I,IAAAA,GACE,MAAO,CACLuH,SAAS,EACTlB,OAAQ,CAAC,EACTwI,QAAS,CAAC,EACVC,SAAU,CAAC,EACXC,WAAY,CAAC,EACbxS,eAAW8F,EACXqJ,cAAUrJ,EACVmJ,mBAAenJ,EAEnB,EAEAoE,SAAU,CACRoJ,UAAAA,GACE,OAAOnT,KAAK6N,OAAOC,OAAO2E,MAC5B,GAGF9S,QAAS,CACP,eAAM+T,GACJ,MAAMZ,EAAgB9S,KAAKmT,WAAWlH,MAAM,KAAKiB,KAAK6F,GAAUA,EAAM,GAAGC,cAAgBD,EAAMtB,MAAM,KAAIwB,KAAK,IAC9G,IAAIC,EAAO,KAEX,IACEA,QAAa,QAAQ,KAAsBJ,UAC7C,CAAE,MAAO9N,GAQP,OAPAT,QAAQnD,MAAM4D,QACdhF,KAAKiJ,OAAO,CACV7H,OAAO,EACPJ,MAAQ,sBAAqBhB,KAAKmT,aAClCrS,KAAMkE,EAAE2O,YAIZ,CAEA3T,KAAKH,WAAYwN,EAAAA,GAAAA,KAAWC,EAAAA,EAAAA,KAAqBuF,SAAqBK,KACtElT,KAAK1B,SAAS0E,WAAW8P,GAAiB9S,KAAKH,SACjD,EAEA,gBAAMmK,GACJ,MAAML,QAAe3J,KAAKiK,QAAQ,cAClCjK,KAAK2J,OAASA,EAAO3J,KAAKmT,aAAe,CAAC,EAC1CnT,KAAKgP,eAAiBhP,KAAKiK,QAAQ,uBACrC,GAGF,aAAM7J,GACJJ,KAAK6K,SAAU,EAEf,UACQ7K,KAAKgK,mBACLhK,KAAK0T,WACb,CAAE,QACA1T,KAAK6K,SAAU,CACjB,CACF,GCtEF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,UCFA,MAAM+I,GAAS,CACb,CACEC,KAAM,IACNlR,KAAM,QACN9C,UAAWiU,IAGb,CACED,KAAM,mBACNlR,KAAM,YACN9C,UAAWkU,IAGb,CACEF,KAAM,kBACNlR,KAAM,SACN9C,UAAWmU,IAGb,CACEH,KAAM,SACNlR,KAAM,QACN9C,UAAW8O,IAGb,CACEkF,KAAM,YACNlR,KAAM,WACN9C,UAAWoU,IAGb,CACEJ,KAAM,iBACNhU,UAAWqU,KAITC,IAASC,EAAAA,GAAAA,IAAa,CAC1BC,SAASC,EAAAA,GAAAA,MACTV,YAGF,U,YC7CErF,EAAAA,GAAAA,GAAU,qBAA2C,CACnDgG,KAAAA,GACEhQ,QAAQC,IACN,qGAGJ,EACAgQ,UAAAA,GACEjQ,QAAQC,IAAI,sCACd,EACAiQ,MAAAA,GACElQ,QAAQC,IAAI,2CACd,EACAkQ,WAAAA,GACEnQ,QAAQC,IAAI,8BACd,EACAmQ,OAAAA,GACEpQ,QAAQC,IAAI,4CACd,EACAoQ,OAAAA,GACErQ,QAAQC,IAAI,gEACd,EACApD,KAAAA,CAAOA,GACLmD,QAAQnD,MAAM,4CAA6CA,EAC7D,ICxBJ,MAAMyT,IAAMC,EAAAA,EAAAA,IAAUC,IACtBF,GAAIlL,OAAOqL,iBAAiBC,QAAUpS,OAAO8G,OAC7CkL,GAAIK,IAAIf,IAAQgB,MAAM,O,kFCJtB,GACExS,KAAM,MACNhD,QAAS,CACP8T,OAAAA,CAAQxJ,EAASjG,EAAQ,IAAOoR,GAAU,GACxC,MAAMC,EAAO,CAAC,EAcd,MAZM,WAAYpL,GAAaA,EAAQ,YACrCA,EAAQ,UAAY,aAGhB,SAAUA,GAAaA,EAAQ,UACnCA,EAAQ,QAAU,WAGhBjG,IACFqR,EAAKrR,QAAUA,GAGV,IAAIqP,SAAQ,CAACiC,EAASC,KAC3BC,EAAAA,EAAMC,KAAK,WAAYxL,EAASoL,GAC3BK,MAAM9M,IAEL,GADAA,EAAWA,EAAStF,KAAKsF,SACpBA,EAAS+M,QAAQ/O,OAEf,CACL,MAAMxF,EAAQwH,EAAS+M,SAAS,IAAM/M,EACtC5I,KAAKiJ,OAAO,CACVnI,KAAMM,EACNA,OAAO,IAGTmU,EAAOnU,EACT,MATEkU,EAAQ1M,EAASgN,OASnB,IAEDC,OAAOzU,IAG4B,MAAhCA,GAAOwH,UAAUtF,MAAMuC,MACvBhD,OAAOoD,SAASuJ,KAAKgC,QAAQ,aAAe,EAE5C3O,OAAOoD,SAASuJ,KAAO,sBAAwB3M,OAAOoD,SAASuJ,KAM/B,MAAhCpO,GAAOwH,UAAUtF,MAAMuC,MACvBhD,OAAOoD,SAASuJ,KAAKgC,QAAQ,UAAY,EAEzC3O,OAAOoD,SAASuJ,KAAO,mBAAqB3M,OAAOoD,SAASuJ,MAI9DjL,QAAQC,IAAIpD,GACRgU,GACFpV,KAAKiJ,OAAO,CACVnI,KAAMM,EACNA,OAAO,IAGXmU,EAAOnU,GAAM,GACb,GAEV,EAEA6I,OAAAA,CAAQ6L,EAAQnU,EAAK,CAAC,EAAGqC,EAAQ,IAAOoR,GAAU,GAChD,OAAOpV,KAAKyT,QAAQ,CAClBtQ,KAAM,UACN2S,OAAQA,EACRnU,KAAMA,GACLqC,EAASoR,EACd,ICvEJ,MAAM/U,EAAc,EAEpB,QCJA,GACEsC,KAAM,YACNhD,QAAS,CACP,qBAAMoW,CAAgBjV,SACdkV,UAAUC,UAAUC,UAAUpV,GACpCd,KAAKiJ,OAAO,CACVnI,KAAM,0BACNI,MAAO,CACLkB,KAAM,cAGZ,ICTJ,MAAM,EAAc,EAEpB,QCJA,GACEO,KAAM,UACNhD,QAAS,CACPwW,UAAAA,GACE,OAAOC,SAASC,OAAOpK,MAAM,QAAQwB,QAAO,CAACC,EAAK4I,KAChD,MAAOC,EAAGC,GAAKF,EAAKrK,MAAM,KAE1B,OADAyB,EAAI6I,GAAKC,EACF9I,CAAE,GACR,CAAC,EACN,EAEArD,SAAAA,CAAU1H,GACR,OAAO3C,KAAKmW,aAAaxT,EAC3B,EAEA6H,SAAAA,CAAU7H,EAAM2L,EAAO+G,GACrBe,SAASC,OACN,GAAE1T,KAAQ2L,WAAe+G,GAAMxB,MAAQ,OACtCwB,GAAM5K,QAAW,aAAY4K,GAAM5K,QAAQgM,gBAAkB,GAGnE,EAEAC,YAAAA,CAAa/T,GACXyT,SAASC,OACN,GAAE1T,kCAEP,ICzBJ,MAAM,EAAc,EAEpB,QCJA,GACEA,KAAM,WACNhD,QAAS,CACPgX,UAAAA,CAAWC,EAAMC,GAAK,GAIpB,MAHoB,kBAATD,IACTA,EAAO,IAAIlM,KAAKA,KAAK3F,MAAM6R,KAEtBA,EAAKE,eAAeC,UAAU,EAAGF,EAAO,GAAK,GACtD,EAEAG,UAAAA,CAAWJ,EAAMK,GAAQ,GAIvB,MAHoB,kBAATL,IACTA,EAAO,IAAIlM,KAAKA,KAAK3F,MAAM6R,KAEtBA,EAAKM,eAAeH,UAAU,EAAGE,EAAU,EAAI,EACxD,EAEAE,cAAAA,CAAeP,EAAMC,GAAK,EAAOI,GAAQ,EAAMG,GAAmB,GAIhE,MAHoB,kBAATR,IACTA,EAAO,IAAIlM,KAAKA,KAAK3F,MAAM6R,KAEzBQ,GAA0C,IAApBR,EAAKS,YAA0C,IAAtBT,EAAKU,cAA4C,IAAtBV,EAAKW,aAC1EvX,KAAK2W,WAAWC,EAAMC,GAEvB,GAAE7W,KAAK2W,WAAWC,EAAMC,OAAU7W,KAAKgX,WAAWJ,EAAMK,IAClE,ICvBJ,MAAM,EAAc,EAEpB,Q,oBCFA,GACEtU,KAAM,SACNoH,SAAU,CACRyN,YAAAA,GACE,OAAOxX,KAAK+R,MAAMxJ,MAAM5B,QAAQ9C,WAClC,GAGFlE,QAAS,CACP8G,SAAAA,CAAUnB,EAASuB,KAAgBF,GACjC,MAAM8Q,EAAUA,KACd9Z,EAAAA,EAAII,KAAK,YAAa,CACpB4I,OAAQA,EACRrB,QAASA,EACTuB,YAAaA,GAAe7G,KAAK0X,cACjC,EAGJ,GAAI1X,KAAKwX,aAEP,YADAC,IAIF,MAAM9O,EAAO3I,KACP2X,EAAU3X,KAAKiH,QAAQ,IAAM0B,EAAK6O,eAAeI,IACjDA,IACFH,IACAE,IACF,IAGF,OAAOA,CACT,EAEA7Q,WAAAA,CAAYD,GACVlJ,EAAAA,EAAII,KAAK,cAAe8I,EAC1B,EAEA6Q,UAAAA,GACE,OAAOG,KAAK,IAAItS,MAAM,IAAIwB,QAAQmG,KAAI,IAAMnB,OAAO+L,aAAarT,KAAKsT,MAAsB,IAAhBtT,KAAKuT,aAClF,ICxCJ,MAAM,EAAc,EAEpB,QCJA,GACErV,KAAM,aACNhD,QAAS,CACPsY,iBAAAA,CAAkBtV,GAChB,MAAMuV,EAAQvV,EAAKsJ,MAAM,KAQzB,OAPAiM,EAAMtF,SAAQ,CAACuF,EAAM5G,KACnB2G,EAAM3G,GAAO4G,EAAKC,OAAO,GAAGpF,cAAgBmF,EAAK1G,MAAM,EAAE,IAGvDyG,EAAMtR,OAAS,IACjBsR,EAAM,GAAM,IAAGA,EAAM,OAEhBA,EAAMjF,KAAK,IACpB,ICXJ,MAAM,EAAc,EAEpB,QCFA,GACEtQ,KAAM,eACNhD,QAAS,CACPsJ,MAAAA,CAAO7K,GACLT,EAAAA,EAAIQ,oBAAoBC,EAC1B,EAEAia,aAAAA,CAAc3R,GACZ1G,KAAKiJ,OAAO,CACVnI,KAAM4F,EACNvF,SAAS,GAEb,EAEA6M,WAAAA,CAAYtH,GAMV,MALA1G,KAAKiJ,OAAO,CACVnI,KAAM4F,EACNtF,OAAO,IAGHsF,CACR,ICrBJ,MAAM,EAAc,EAEpB,QCJA,GACE/D,KAAM,SACNhD,QAAS,CACPiS,QAAAA,GACE,OAAO/O,OAAOyV,WAAW,sCAAsCC,OACjE,EAEA1G,QAAAA,GACE,OACG7R,KAAK4R,YACN/O,OAAOyV,WAAW,uCAAuCC,OAE7D,EAEAC,SAAAA,GACE,OAAO3V,OAAOyV,WAAW,uCAAuCC,OAClE,ICdJ,MAAM,EAAc,EAEpB,QCJA,GACE5V,KAAM,OACNhD,QAAS,CACP8Y,UAAAA,CAAW3X,GACT,OAAKA,GAAM8F,OAGJ9F,EAAKsX,OAAO,GAAGpF,cAAgBlS,EAAK2Q,MAAM,GAFxC3Q,CAGX,EAEA4X,QAAAA,CAAS5X,GACP,OAAOA,EAAKmL,MAAM,KAAKiB,KAAKyL,GAAM3Y,KAAKyY,WAAWE,KAAI1F,KAAK,IAC7D,EAEA2F,MAAAA,CAAO9X,EAAM+X,EAAS,GACpB,OAAO/X,EAAKmL,MAAM,MAAMiB,KAAKyL,GAAO,GAAE,IAAIG,OAAOD,KAAUF,MAAK1F,KAAK,KACvE,ICdJ,MAAM,EAAc,EAEpB,QCJA,G,OAAA,CACEtQ,KAAM,QACNhD,QAAS,CACP8O,YAAAA,CAAaH,GACX,MAAqB,kBAAVA,GACTA,EAAQA,EAAMyK,cACA,SAAVzK,GAEU,UAAVA,KAGK7K,SAAS6K,MAGXA,CACX,EAEA0K,WAAAA,CAAY1K,GACW,kBAAVA,IACTA,EAAQ7K,SAAS6K,IAEnB,IAAI2K,EAAO,KACX,MAAMC,EAAQ,CAAC,IAAK,KAAM,KAAM,KAAM,MActC,OAZAA,EAAMtG,SAAQ,CAACuG,EAAGjO,KACZoD,GAAS,MAAgB,MAAR2K,EACnBA,EAAOE,EACE7K,EAAQ,OACbpD,IAAMgO,EAAMtS,OAAO,EACrBqS,EAAOE,EAEP7K,GAAc,KAElB,IAGM,GAAEA,EAAMJ,QAAQ,MAAM+K,GAChC,EAEAG,WAAAA,CAAYC,GACV,MAAMV,EAAI,CAAC,EACLW,EAAM,GAQZ,GANAD,EAAO7M,WAAW6M,GAClBV,EAAEY,EAAI9U,KAAKsT,MAAMsB,EAAK,OACtBV,EAAEa,EAAI/U,KAAKsT,MAAMsB,EAAK,KAAW,GAAJV,EAAEY,GAC/BZ,EAAEc,EAAIhV,KAAKsT,MAAMsB,EAAK,IAAU,GAAJV,EAAEY,EAAW,GAAJZ,EAAEa,IACvCb,EAAEe,EAAIjV,KAAKsT,MAAMsB,GAAY,GAAJV,EAAEY,EAAW,KAAJZ,EAAEa,EAAa,GAAJb,EAAEc,GAAO,GAElDhW,SAASkV,EAAEY,GAAI,CACjB,IAAIA,EAAIZ,EAAEY,EAAI,OACVZ,EAAEY,EAAI,IACRA,GAAK,KAEPD,EAAInU,KAAKoU,EACX,CAEA,GAAI9V,SAASkV,EAAEa,GAAI,CACjB,IAAIA,EAAIb,EAAEa,EAAI,QACVb,EAAEa,EAAI,IACRA,GAAK,KAEPF,EAAInU,KAAKqU,EACX,CAEA,GAAI/V,SAASkV,EAAEc,GAAI,CACjB,IAAIA,EAAId,EAAEc,EAAI,UACVd,EAAEc,EAAI,IACRA,GAAK,KAEPH,EAAInU,KAAKsU,EACX,CAEA,IAAIC,EAAIf,EAAEe,EAAI,UAMd,OALIf,EAAEe,EAAI,IACRA,GAAK,KAEPJ,EAAInU,KAAKuU,GAEFJ,EAAIrG,KAAK,IAClB,EAEA0G,YAAAA,CAAaC,EAAGC,GACd,GAAkB,kBAAPD,GAAiC,kBAAPC,EACnC,OAAO,EAET,GAAS,MAALD,GAAkB,MAALC,EACf,OAAY,MAALD,GAAkB,MAALC,EAGtB,IAAK,MAAMC,KAAK1U,OAAO2B,KAAK6S,GAAK,CAAC,GAChC,cAAcA,EAAEE,IACd,IAAK,SACH,IAAK9Z,KAAK2Z,aAAaC,EAAEE,GAAID,EAAEC,IAC7B,OAAO,EACT,MAEF,IAAK,WACH,GAAIF,EAAEE,GAAGnG,YAAckG,EAAEC,IAAInG,WAC3B,OAAO,EACT,MAEF,QACE,GAAIiG,EAAEE,IAAMD,EAAEC,GACZ,OAAO,EACT,MAIN,IAAK,MAAMA,KAAK1U,OAAO2B,KAAK8S,GAAK,CAAC,GAChC,GAAY,MAARD,EAAEE,IAAsB,MAARD,EAAEC,GACpB,OAAO,EAEX,OAAO,CACT,KChHJ,MAAM,EAAc,EAEpB,QCJA,GACEnX,KAAM,MACNhD,QAAS,CACPoa,gBAAAA,GACE,OAAOlX,OAAOoD,SAASuM,KAAKwH,QAAQ,KAAM,IAAIA,QAAQ,OAAQ,GAChE,EAEAC,UAAAA,GACE,MAAMC,EAAarX,OAAOoD,SAASuM,KAAKvG,MAAM,KAAKwF,MAAM,GACzD,OAAKyI,EAAWtT,OAGTsT,EAAW,GACfjO,MAAM,QACNwB,QAAO,CAAC0M,EAAKzM,KACZ,MAAM0M,EAAS1M,EAAIzB,MAAM,KAGzB,OAFImO,EAAO,IAAIxT,SACbuT,EAAIC,EAAO,IAAMA,EAAO,IACnBD,CAAE,GACR,CAAC,GATG,CAAC,CAUZ,EAEAE,UAAAA,CAAW1Y,GACT,MAAM2Y,EAAUta,KAAKia,aACrBtY,EAAOyD,OAAOuN,QAAQhR,GACnB8L,QAAO,CAAC0M,GAAMtZ,EAAKyN,MACL,MAATA,EACF6L,EAAItZ,GAAOyN,EACY,MAAhBgM,EAAQzZ,WACRyZ,EAAQzZ,GACVsZ,IACN,CAAC,GAENxY,EAAO,IAAI2Y,KAAY3Y,GACvB,IAAIsE,EAAY,GAAEpD,OAAOoD,SAASsU,YAAYva,KAAK+Z,qBAC/C3U,OAAO2B,KAAKpF,GAAMiF,SACpBX,GAAa,IAAGjG,KAAKwa,iBAAiB7Y,MAExCkB,OAAOoD,SAASuJ,KAAOvJ,CACzB,EAEAuU,gBAAAA,CAAiB7Y,GACf,OAAOyD,OAAOuN,QAAQhR,GACnBuL,KACC,EAAErM,EAAKyN,KAAY,GAAEmM,mBAAmB5Z,MAAQ4Z,mBAAmBnM,OAEpE2E,KAAK,IACV,IC7CJ,MAAM,EAAc,EAEpB,QCQA,GACEtQ,KAAM,QACNuF,OAAQ,CACNwS,EACAC,EACAC,EACAC,EACAvR,EACArG,EACA+O,EACA8I,EACAC,EACAC,EACAC,ICvBJ,MAAM,EAAc,EAEpB,O,2FCJOzb,MAAM,W,GACJA,MAAM,Q,kCADbC,EAAAA,EAAAA,IAIM,MAJNC,EAIM,EAHJoC,EAAAA,EAAAA,GAEM,MAFNC,EAEM,cADJtC,EAAAA,EAAAA,IAA+Ba,EAAAA,GAAA,MAAAC,EAAAA,EAAAA,IAAd,GAAL2a,IAAZpZ,EAAAA,EAAAA,GAA+B,OAAVjB,IAAKqa,M,uBCFhC,MAAMC,EAAS,CAAC,EAKV9a,GAA2B,OAAgB8a,EAAQ,CAAC,CAAC,SAASvQ,GAAQ,CAAC,YAAY,qBAEzF,O,0KCHapL,MAAM,U,4BAGPsC,EAAAA,EAAAA,GAA0B,KAAvBtC,MAAM,gBAAc,W,GAAvByC,G,GAGCzC,MAAM,Q,0CAVjBC,EAAAA,EAAAA,IAeM,OAfDD,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,0BAAyB,CAAAgO,QAA4BnI,EAAAgU,aAA1B1a,GAAIc,EAAAd,GACvC2B,OAAKC,EAAAA,EAAAA,IAAA,aAAgBhE,EAAA+c,SAAU5Z,QAAKC,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAqG,OAAArG,EAAAqG,SAAAhD,K,EACvCG,EAAAA,EAAAA,GAYM,OAZDtC,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,QAAgBf,EAAA8a,OAAO9b,S,EAChCsC,EAAAA,EAAAA,GAUM,OAVDtC,MAAM,UAAW6C,OAAKC,EAAAA,EAAAA,IAAA,WAAcd,EAAA+Z,MAAK,WAAc/Z,EAAAga,SAAU/Z,QAAKC,EAAA,KAAAA,EAAA,GAAAwN,GAAEA,EAAOuM,oB,CACxDja,EAAAR,QAAK,WAA/BvB,EAAAA,EAAAA,IAKM,MALNsC,EAKM,CAJoCP,EAAAR,QAAK,WAA7CvB,EAAAA,EAAAA,IAAiD,O,MAA5CD,MAAM,Q,aAAQqC,EAAAA,EAAAA,IAAQL,EAAMR,Q,4BACjCc,EAAAA,EAAAA,GAES,UAFDd,MAAM,QAAQmB,IAAI,QAASV,QAAKC,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAqG,OAAArG,EAAAqG,SAAAhD,K,uBAI5CG,EAAAA,EAAAA,GAEM,MAFNW,EAEM,EADJoJ,EAAAA,EAAAA,IAA6BrL,EAAAsL,OAAA,WAAtB4P,aAAWha,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAqG,OAAArG,EAAAqG,SAAAhD,U,kCAQ9B,GACEgB,KAAM,QACNwO,MAAO,CAAC,QAAS,QACjBvO,MAAO,CAELlC,GAAI,CACFyC,KAAM4I,QAIR/K,MAAO,CACLmC,KAAM4I,QAIRwP,MAAO,CACLpY,KAAM,CAACC,OAAQ2I,SAIjByP,OAAQ,CACNrY,KAAM,CAACC,OAAQ2I,SAIjB4P,QAAS,CACPxY,KAAMqL,QACNnL,SAAS,GAIXW,QAAS,CACPb,KAAM,CAACC,OAAQ2I,SAIjB6P,MAAO,CACLzY,KAAMC,OACNC,QAAS,IAIbC,IAAAA,GACE,MAAO,CACLuY,eAAWlW,EACXmW,YAAa9b,KAAK2b,QAClBP,UAAWpb,KAAK2b,QAEpB,EAEA5R,SAAU,CACRsR,MAAAA,GACE,OAAO,IAAMrb,KAAK4b,KACpB,GAGFjc,QAAS,CACPgF,KAAAA,GACE3E,KAAK8b,YAAc9b,KAAKob,UACxBpb,KAAKob,WAAY,CACnB,EAEAW,IAAAA,GACE/b,KAAK2E,OACP,EAEA8D,IAAAA,GACEzI,KAAK8b,YAAc9b,KAAKob,UACxBpb,KAAKob,WAAY,CACnB,EAEAY,MAAAA,GACMhc,KAAKob,UACPpb,KAAK2E,QAEL3E,KAAKyI,MACT,EAEAwT,OAAAA,CAAQpX,GACNA,EAAM4W,kBACY,WAAd5W,EAAMhE,KACRb,KAAK2E,OAET,GAGFvE,OAAAA,GACE,MAAMuI,EAAO3I,KACPkc,EAAeP,IACdA,EAGHhT,EAAK5F,MAAM,QAFX4F,EAAK5F,MAAM,SAIb4F,EAAKyS,UAAYO,CAAM,EAGzBvF,SAASjN,KAAKmB,iBAAiB,QAAStK,KAAKic,SAC7Cjc,KAAKiH,QAAO,IAAMjH,KAAK2b,SAASO,GAChClc,KAAKiH,QAAO,IAAMjH,KAAKob,WAAWc,EACpC,EAEAC,SAAAA,GACE/F,SAASjN,KAAKiT,oBAAoB,QAASpc,KAAKic,QAClD,EAEAtH,OAAAA,GAEE,GADA3U,KAAK8b,YAAc9b,KAAKob,UACpBpb,KAAKob,UAAW,CAElB,IAAIiB,EAAY5Y,SAAS6Y,iBAAiBtc,KAAKF,KAAKub,QAChDkB,EAAkB,GAEtB,IAAK,MAAMC,KAASpG,SAASqG,iBAAiB,iCAAkC,CAC9E,MAAMpB,EAAS5X,SAAS6Y,iBAAiBE,GAAOnB,QAE5CA,EAASgB,GACXA,EAAYhB,EACZkB,EAAkB,CAACC,IACVnB,IAAWgB,GACpBE,EAAgBpX,KAAKqX,EAEzB,EAEID,EAAgB/K,QAAQxR,KAAKF,KAAO,GAAKyc,EAAgB3V,OAAS,KACpE5G,KAAKF,IAAIuC,MAAMgZ,OAASgB,EAAU,EAEtC,CAEA,GAAIrc,KAAKob,WAAapb,KAAKgE,UAAYhE,KAAK6b,UAAW,CACrD,MAAMvW,EAAWqD,GACR,KAELA,EAAKhE,QACLgE,EAAKkT,eAAYlW,CAAQ,EAI7B3F,KAAK6b,UAAYnY,WAAW4B,EAAQtF,MAAO,EAAEA,KAAKgE,QACpD,CACF,G,UCzJF,MAAM3D,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASuK,GAAQ,CAAC,YAAY,qBAEzF,O,qKCPSpL,MAAM,kB,UAMPsC,EAAAA,EAAAA,GAA0B,KAAvBtC,MAAM,gBAAc,W,UAGvBsC,EAAAA,EAAAA,GAA0B,KAAvBtC,MAAM,gBAAc,W,oEAV7BhB,EAAAA,EAAAA,IAaQ2I,EAAA,CAbDzI,IAAI,QAASsC,MAAOQ,EAAAR,O,mBACzB,IAEM,EAFNc,EAAAA,EAAAA,GAEM,MAFNpC,EAEM,EADJmM,EAAAA,EAAAA,IAAQrL,EAAAsL,OAAA,kBAAAnG,GAAA,MAGV7D,EAAAA,EAAAA,GAOO,QAPDtC,MAAM,UAAWkd,SAAMhb,EAAA,KAAAA,EAAA,IAAAib,EAAAA,EAAAA,KAAA,IAAAhb,IAAUrD,EAAAse,WAAAte,EAAAse,aAAAjb,IAAS,e,EAC9CG,EAAAA,EAAAA,GAES,UAFDqB,KAAK,SAAS3D,MAAM,SAAUiC,QAAKC,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAse,WAAAte,EAAAse,aAAAjb,IAAYkb,QAAKnb,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAse,WAAAte,EAAAse,aAAAjb,K,CAC9DI,GAA0B,eAAQF,EAAAA,EAAAA,IAAGL,EAAAsb,aAAW,SAElDhb,EAAAA,EAAAA,GAES,UAFDqB,KAAK,SAAS3D,MAAM,aAAciC,QAAKC,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAqG,OAAArG,EAAAqG,SAAAhD,IAAQkb,QAAKnb,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAqG,OAAArG,EAAAqG,SAAAhD,K,CAC9DK,GAA0B,eAAQH,EAAAA,EAAAA,IAAGL,EAAAub,YAAU,gB,gCASvD,GACE5L,MAAO,CAAC,QAAS,QAAS,SAC1BnO,WAAY,CAACiF,MAAKA,EAAAA,GAClBrF,MAAO,CACL5B,MAAO,CACLmC,KAAM4I,QAGR+Q,YAAa,CACX3Z,KAAM4I,OACN1I,QAAS,MAGX0Z,WAAY,CACV5Z,KAAM4I,OACN1I,QAAS,WAIb1D,QAAS,CACPid,SAAAA,GACE5c,KAAK+C,MAAM,SACX/C,KAAK2E,OACP,EAEA8D,IAAAA,GACEzI,KAAKuI,MAAMiU,MAAM/T,MACnB,EAEA9D,KAAAA,GACE3E,KAAKuI,MAAMiU,MAAMT,MACnB,I,UC5CJ,MAAM1b,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASuK,GAAQ,CAAC,YAAY,qBAEzF,O,kKCHI9I,EAAAA,EAAAA,GAA8B,KAA3BtC,MAAM,oBAAkB,W,GAA3BE,G,0CALFD,EAAAA,EAAAA,IAMS,UANDD,MAAM,cACNd,IAAI,aACJsC,MAAM,oBACLS,QAAKC,EAAA,KAAAA,EAAA,IAAAib,EAAAA,EAAAA,KAAA,IAAAhb,IAAUrD,EAAA0e,MAAA1e,EAAA0e,QAAArb,IAAI,cACnBvC,QAAKsC,EAAA,KAAAA,EAAA,IAAAib,EAAAA,EAAAA,KAAA,IAAAhb,IAAUrD,EAAA0e,MAAA1e,EAAA0e,QAAArb,IAAI,e,qBAQ9B,GACEgB,KAAM,aACNwO,MAAO,CAAC,QAAS,SACjBjJ,OAAQ,CAACC,EAAAA,GACTvF,MAAO,CACL9B,KAAM,CACJqC,KAAM4I,SAIVpM,QAAS,CACP,UAAMqd,CAAKnY,GACL7E,KAAKc,MAAM8F,cACP5G,KAAK+V,gBAAgB/V,KAAKc,MAElCd,KAAK+C,MAAM8B,EAAM1B,KAAM0B,EACzB,I,UCtBJ,MAAMxE,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASuK,GAAQ,CAAC,YAAY,qBAEzF,O,+GCROpL,MAAM,sB,iCAMJA,MAAM,wBAAwBd,IAAI,qB,2EANzCe,EAAAA,EAAAA,IAWM,MAXNC,EAWM,EAVJoC,EAAAA,EAAAA,GAGS,UAHAd,MAAOQ,EAAAR,MAAOtC,IAAI,SAAU+C,QAAKC,EAAA,KAAAA,EAAA,IAAAib,EAAAA,EAAAA,KAAAzN,GAAO5Q,EAAA0d,OAAO9M,IAAM,Y,CACnB1N,EAAAgB,YAAS,WAAlD/C,EAAAA,EAAAA,IAAsD,K,MAAnDD,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,OAAeC,EAAAgB,a,yBACehB,EAAAV,OAAI,WAA3CrB,EAAAA,EAAAA,IAA+C,Q,MAAzCD,MAAM,O,aAAOqC,EAAAA,EAAAA,IAAQL,EAAKV,O,kCAGlCgB,EAAAA,EAAAA,GAIM,MAJNG,EAIM,EAHJtD,EAAAA,EAAAA,IAEese,EAAA,CAFAvc,GAAIc,EAAAd,GAAKX,oBAAqByB,EAAAzB,oBAAqBrB,IAAI,WAAY+C,QAAOnD,EAAAmD,S,mBACvF,IAAQ,EAARoK,EAAAA,EAAAA,IAAQrL,EAAAsL,OAAA,kBAAAnG,GAAA,M,gHCRdlG,EAAAA,EAAAA,IAEM,OAFDD,MAAM,WAAYkB,GAAIc,EAAAd,GAAKe,QAAKC,EAAA,KAAAA,EAAA,GAAAwN,GAAE1O,EAAAuC,MAAM,QAASmM,K,EACpDrD,EAAAA,EAAAA,IAAQrL,EAAAsL,OAAA,kBAAAnG,GAAA,Q,CAKZ,OACEwL,MAAO,CAAC,SACRvO,MAAO,CACLlC,GAAI,CACFyC,KAAM4I,QAGRhM,oBAAqB,CACnBoD,KAAMqL,QACNnL,SAAS,K,UCTf,MAAMhD,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAS,GAAQ,CAAC,YAAY,qBAEzF,Q,UFUA,GACE2C,WAAY,CAAEka,aAAYA,GAC1B/L,MAAO,CAAC,SACRvO,MAAO,CACLlC,GAAI,CACFyC,KAAM4I,QAGRvJ,UAAW,CACTa,QAAS,oBAGXvC,KAAM,CACJqC,KAAM4I,QAGR/K,MAAO,CACLmC,KAAM4I,QAGRhM,oBAAqB,CACnBoD,KAAMqL,QACNnL,SAAS,IAIbC,IAAAA,GACE,MAAO,CACLqY,SAAS,EAEb,EAEA5R,SAAU,CACRoT,WAAAA,GACE,OAAKnd,KAAKuI,MAAM6U,OAGTd,iBAAiBtc,KAAKuI,MAAM6U,QAF1B,CAAC,CAGZ,EAEAC,WAAAA,GACE,OAAO7Q,WAAWxM,KAAKmd,YAAY5B,OAAS,EAC9C,EAEA+B,YAAAA,GACE,OAAO9Q,WAAWxM,KAAKmd,YAAY3B,QAAU,EAC/C,GAGF7b,QAAS,CACP4d,iBAAAA,CAAkB1Y,GAChB,IAAK7E,KAAK2b,QACR,OAEF,IAAI6B,EAAU3Y,EAAM4Y,OACpB,MAAOD,EAAS,CACd,GAAIA,EAAQE,UAAUC,SAAS,YAC7B,OAEFH,EAAUA,EAAQI,aACpB,CAEA5d,KAAK2E,OACP,EAEAkZ,gBAAAA,GACE,MAAMC,EAAW9d,KAAKuI,MAAMuV,UAAUhe,IACtC,OAAKge,EAGEtR,WAAW8P,iBAAiBwB,GAAUvC,OAFpC,CAGX,EAEAwC,iBAAAA,GACE,MAAMD,EAAW9d,KAAKuI,MAAMuV,UAAUhe,IACtC,OAAKge,EAGEtR,WAAW8P,iBAAiBwB,GAAUtC,QAFpC,CAGX,EAEA/Z,OAAAA,GACOzB,KAAKD,qBACRC,KAAK2E,OACT,EAEAA,KAAAA,GACE3E,KAAK2b,SAAU,EACfvF,SAASgG,oBAAoB,QAASpc,KAAKud,mBAC3C5f,EAAAA,EAAII,KAAK,iBACX,EAEA+E,IAAAA,GACEsT,SAAS9L,iBAAiB,QAAStK,KAAKud,mBACxC,MAAMC,EAAUxd,KAAKuI,MAAMuV,UAAUhe,IAChC0d,EAAQI,eACX5d,KAAKF,IAAII,YAAYsd,GAEvBxd,KAAK2b,SAAU,EACf3b,KAAKuI,MAAMyV,kBAAkBN,UAAUO,OAAO,UAC9Cje,KAAKke,WAAU,KACb,MAAMC,EAAane,KAAKuI,MAAM6U,OAAOgB,wBAC/BC,EAAY,CAChBC,KAAMH,EAAWG,KAAOzb,OAAO0b,QAC/BC,IAAKL,EAAWK,IAAM3b,OAAO4b,SAGzBC,EAAM,CACVJ,KAAMD,EAAUC,KAChBE,IAAKH,EAAUG,IAAMxe,KAAKsd,cAGtBqB,EAAgB3e,KAAK6d,mBACrBe,EAAiB5e,KAAK+d,oBAEvBW,EAAIJ,KAAOK,GAAkB9b,OAAOgc,WAAahc,OAAO0b,SAAW,IACtEG,EAAIJ,MAASK,EAAgB3e,KAAKqd,aAG/BqB,EAAIF,IAAMI,GAAmB/b,OAAOic,YAAcjc,OAAO4b,SAAW,IACvEC,EAAIF,KAAQI,EAAiB5e,KAAKsd,aAAe,IAGnD,MAAME,EAAUxd,KAAKuI,MAAMuV,SAAShe,IACpC0d,EAAQE,UAAUqB,IAAI,WACtBvB,EAAQnb,MAAMmc,IAAO,GAAEE,EAAIF,QAC3BhB,EAAQnb,MAAMic,KAAQ,GAAEI,EAAIJ,SAC5B3gB,EAAAA,EAAII,KAAK,gBAAiBiC,KAAKuI,MAAMuV,UACrC9d,KAAKuI,MAAMyV,kBAAkBN,UAAUqB,IAAI,SAAS,GAExD,EAEA/C,MAAAA,CAAOnX,GACLA,EAAM4W,kBACNzb,KAAK+C,MAAM,SACX/C,KAAK2b,QAAU3b,KAAK2E,QAAU3E,KAAK8C,MACrC,EAEAmZ,OAAAA,CAAQpX,GACNA,EAAM4W,kBACY,WAAd5W,EAAMhE,KACRb,KAAK2E,OAET,GAGFvE,OAAAA,GACEgW,SAASjN,KAAKmB,iBAAiB,QAAStK,KAAKic,QAC/C,EAEAE,SAAAA,GACE/F,SAASjN,KAAKiT,oBAAoB,QAASpc,KAAKic,QAClD,GGpKF,MAAM,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASrR,GAAQ,CAAC,YAAY,qBAEzF,O,0GCPSpL,MAAM,c,qFADbC,EAAAA,EAAAA,IAKM,OALDD,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,WAAmBC,EAAAwd,YAAYvd,QAAKC,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAsD,SAAAtD,EAAAsD,WAAAD,K,CACjBH,EAAAgB,WAAWoE,QAAUpF,EAAAyd,SAASrY,SAAM,WAAlEnH,EAAAA,EAAAA,IAEM,MAFNC,EAEM,EADJf,EAAAA,EAAAA,IAA0CugB,EAAA,CAAnC1f,OAAK+B,EAAAA,EAAAA,IAAEC,EAAAgB,WAAY0D,IAAK1E,EAAAyd,S,4CAEjCnd,EAAAA,EAAAA,GAAyE,OAApEtC,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,OAAM,UAAiC,MAAbC,EAAAgB,a,aAAoBX,EAAAA,EAAAA,IAAQL,EAAKV,O,sCAQ1E,GACEkC,WAAY,CAACmc,KAAIA,EAAAA,GACjBvc,MAAO,CACLJ,UAAW,CACTW,KAAM4I,QAGRkT,QAAS,CACP9b,KAAM4I,QAGRjL,KAAM,CACJqC,KAAM4I,QAGRqT,SAAU,CACRjc,KAAMqL,QACNnL,SAAS,GAGX2b,UAAW,CAAC,GAGdrf,QAAS,CACPiC,OAAAA,GACE,GAAI5B,KAAKof,SACP,OAAO,EAEJpf,KAAKqf,QAAQtf,qBAChBpC,EAAAA,EAAII,KAAK,iBACb,I,UCpCJ,MAAMsC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASuK,GAAQ,CAAC,YAAY,qBAEzF,O,uMCREnL,EAAAA,EAAAA,IAKM,OALDD,MAAM,iBAAkB6C,OAAKC,EAAAA,EAAAA,IAAA,CAAAiZ,MAAA,GAAc/Z,EAAA+O,OAAIiL,OAAA,GAAeha,EAAA+O,U,CACxB/O,EAAA8d,eAAY,WAArD7f,EAAAA,EAAAA,IAEI,K,MAFA+P,KAAMlR,EAAAihB,QAAS9B,OAAO,U,EACxB3b,EAAAA,EAAAA,GAAkE,OAA5DI,IAAK5D,EAAA2gB,QAAU9c,IAAK7D,EAAAkhB,cAAgBxe,MAAO1C,EAAAkhB,e,8BAEnD/f,EAAAA,EAAAA,IAAyE,O,MAAnEyC,IAAK5D,EAAA2gB,QAAU9c,IAAK7D,EAAAkhB,cAAgBxe,MAAO1C,EAAAkhB,e,eAKrD,OACE5c,MAAO,CACLD,KAAM,CACJQ,KAAM4I,OACNC,UAAU,GAGZuE,KAAM,CACJpN,KAAM4I,OACN1I,QAAS,UAGXic,aAAc,CACZnc,KAAMqL,QACNnL,SAAS,IAIb0G,SAAU,CACRkV,OAAAA,GACE,MAAQ,uCAAsCjf,KAAKwf,sBACrD,EAEAC,aAAAA,GACE,MAAkC,WAA3Bzf,KAAK2C,KAAKsJ,MAAM,KAAK,GAAkB,UAAY,QAC5D,EAEAuT,aAAAA,GACE,MAAMtH,EAAQlY,KAAK2C,KAAKsJ,MAAM,KAC9B,OAAIiM,EAAMtR,OAAS,EACV5G,KAAK2C,MAEE,WAAZuV,EAAM,IACRA,EAAMwH,QAEDxH,EAAMjF,KAAK,KACpB,EAEAsM,OAAAA,GACE,MAAQ,yCAAwCvf,KAAKyf,kBAAkBzf,KAAKwf,oBAC9E,I,UC3CJ,MAAMnf,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASuK,GAAQ,CAAC,YAAY,qBAEzF,O,iLCREnL,EAAAA,EAAAA,IAIM,OAJDD,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,eAAuBjD,EAAAqhB,a,EAChC7d,EAAAA,EAAAA,GAES,UAFDqB,KAAK,SAAS3D,MAAM,kBAAmBwB,MAAOQ,EAAAR,MAAQS,QAAKC,EAAA,KAAAA,EAAA,GAAAwN,GAAE1O,EAAAuC,MAAM,QAASmM,K,EAClFvQ,EAAAA,EAAAA,IAA0CugB,EAAA,CAAnC1f,OAAK+B,EAAAA,EAAAA,IAAEC,EAAAgB,WAAY0D,IAAK1E,EAAAyd,S,+CAQrC,GACEtc,KAAM,iBACNK,WAAY,CAACmc,KAAIA,EAAAA,GACjBhO,MAAO,CAAC,SAERvO,MAAO,CACLJ,UAAW,CACTW,KAAM4I,QAERkT,QAAS,CACP9b,KAAM4I,QAERvM,MAAO,CACL2D,KAAM4I,QAER/K,MAAO,CACLmC,KAAM4I,SAIVhC,SAAU,CACR4V,SAAAA,GACE,OAAO3f,KAAKR,KACd,I,UC3BJ,MAAMa,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASuK,GAAQ,CAAC,YAAY,qBAEzF,O,oGCROpL,MAAM,kB,0DAAXC,EAAAA,EAAAA,IAIM,MAJNC,EAIM,CAH0C8B,EAAA0E,KAAKU,SAAM,WAAzDnH,EAAAA,EAAAA,IAA2D,O,MAAtDD,MAAM,OAAQ0C,IAAKV,EAAA0E,IAAM/D,IAAKX,EAAAW,K,WAEtB7D,EAAAqhB,WAAW/Y,SAAM,WAD9BnH,EAAAA,EAAAA,IACkC,K,MAD/BD,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,OAAejD,EAAAqhB,YAAYtd,OAAKC,EAAAA,EAAAA,IAAA,CAAAC,MAAUf,EAAAe,S,2BAMvD,OACEK,MAAO,CACLpD,MAAO,CACL2D,KAAM4I,QAER7F,IAAK,CACH/C,KAAM4I,QAERxJ,MAAO,CACLY,KAAM4I,OACN1I,QAAS,IAEXlB,IAAK,CACHgB,KAAM4I,OACN1I,QAAS,KAIb0G,SAAU,CACR4V,SAAAA,GACE,OAAO3f,KAAKR,KACd,I,UCvBJ,MAAMa,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASuK,GAAQ,CAAC,YAAY,qBAEzF,O,iJCROpL,MAAM,yB,UAMPsC,EAAAA,EAAAA,GAA6B,KAA1BtC,MAAM,mBAAiB,W,4EAN9BC,EAAAA,EAAAA,IAQM,MARNC,EAQM,EAPJf,EAAAA,EAAAA,IAEgBQ,EAAA,CAFDT,IAAI,QAASU,QAAOd,EAAAshB,S,mBAAS,IAE5C,UAF4C,+D,qBAI5C9d,EAAAA,EAAAA,GAES,UAFDtC,MAAM,8BAA+BiC,QAAKC,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAuhB,YAAAvhB,EAAAuhB,cAAAle,IAAakb,QAAKnb,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAuhB,YAAAvhB,EAAAuhB,cAAAle,K,CACtEI,GAA6B,oCAC/B,K,yBAQJ,GACEY,KAAM,gBACNK,WAAY,CAACoG,cAAaA,EAAAA,GAC1BlB,OAAQ,CAACC,EAAAA,GACTxI,QAAS,CACPkgB,UAAAA,GACE7f,KAAKuI,MAAMiU,MAAM/T,MACnB,EAEA,aAAMmX,SACE5f,KAAKiK,QAAQ,sBACrB,I,UCpBJ,MAAM5J,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASuK,GAAQ,CAAC,YAAY,qBAEzF,O,2GCPUpL,MAAM,Q,mEADdC,EAAAA,EAAAA,IAKM,OALDD,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,MAAcC,EAAAqO,SAAW,WAAa,KAAKpO,QAAKC,EAAA,KAAAA,EAAA,GAAAwN,GAAE1O,EAAAuC,MAAM,W,CACxCvB,EAAAgB,WAAWoE,QAAUpF,EAAAyd,SAASrY,SAAM,WAA7DnH,EAAAA,EAAAA,IAEO,OAFPC,EAEO,EADLf,EAAAA,EAAAA,IAA0CugB,EAAA,CAAnC1f,OAAK+B,EAAAA,EAAAA,IAAEC,EAAAgB,WAAY0D,IAAK1E,EAAAyd,S,oDAC1B,QACPpT,EAAAA,EAAAA,IAAQrL,EAAAsL,OAAA,kBAAAnG,GAAA,M,cAOZ,GACEhD,KAAM,MACNK,WAAY,CAACmc,KAAIA,EAAAA,GACjBhO,MAAO,CAAC,SACRvO,MAAO,CACLiN,SAAU,CACR1M,KAAMqL,QACNnL,SAAS,GAGXb,UAAW,CACTW,KAAM4I,QAGRkT,QAAS,CACP9b,KAAM4I,U,UCpBZ,MAAM1L,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASuK,GAAQ,CAAC,YAAY,qBAEzF,O,2FCROpL,MAAM,Q,0CAAXC,EAAAA,EAAAA,IAEM,MAFNC,EAEM,EADJmM,EAAAA,EAAAA,IAAQrL,EAAAsL,OAAA,kBAAAnG,GAAA,I,CAKZ,OACEhD,KAAM,Q,UCDR,MAAMtC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASuK,GAAQ,CAAC,YAAY,qBAEzF,O,6HCROpL,MAAM,mC,GAIFA,MAAM,oB,kBAUNA,MAAM,S,SAEFA,MAAM,a,6BAMDA,MAAM,Q,SACNA,MAAM,eAAewB,MAAM,W,SAC5BxB,MAAM,oC,SAIRA,MAAM,yC,SAUZA,MAAM,yC,0HAtCfC,EAAAA,EAAAA,IA6CM,MA7CNC,EA6CM,CA5CW0H,EAAAyD,UAAO,WAAtBrM,EAAAA,EAAAA,IAA0BsM,EAAA,CAAAjK,IAAA,sBAE1BiB,EAAAA,EAAAA,GAQS,gBAPPA,EAAAA,EAAAA,GAMM,MANNC,EAMM,WALJD,EAAAA,EAAAA,GAI6B,SAJtBqB,KAAK,OACLzE,IAAI,SACJ0P,YAAY,iB,qCACHhH,EAAA0Y,OAAM5Q,GACdkQ,SAAUhY,EAAAyD,S,iBADFzD,EAAA0Y,eAKpBhe,EAAAA,EAAAA,GA+BO,cA9BLA,EAAAA,EAAAA,GAsBM,MAtBNG,EAsBM,gBArBJxC,EAAAA,EAAAA,IAoBMa,EAAAA,GAAA,MAAAC,EAAAA,EAAAA,IApB0CjC,EAAAyhB,gBAARpd,K,WAAxClD,EAAAA,EAAAA,IAoBM,OApBDD,MAAM,sBAAsDqB,IAAK8B,G,CACvCrE,EAAA0hB,cAAcrd,KAAI,WAA/ClD,EAAAA,EAAAA,IAkBM,MAlBNgI,EAkBM,EAjBJ3F,EAAAA,EAAAA,GASM,OATDtC,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,OAAM,CAAAsO,SACOlN,IAASyE,EAAA6Y,qBAC3B,YAAWtd,EACXlB,QAAKyN,GAAE5Q,EAAAmD,QAAQkB,GAAM,I,EACzBhE,EAAAA,EAAAA,IAA4C2R,EAAA,CAA5B3N,KAAMA,EAAM4N,KAAK,U,kBACjCzO,EAAAA,EAAAA,GAAqD,OAArDY,GAAqDb,EAAAA,EAAAA,IAA/BvD,EAAA4hB,WAAWvd,GAAMA,MAAI,GACMrE,EAAA6hB,kBAAkBxd,KAAI,WAAvElD,EAAAA,EAAAA,IAEO,OAFPkI,EAEO,CAD6CrJ,EAAA6hB,kBAAkBxd,KAAI,WAAxElD,EAAAA,EAAAA,IAA6E,IAA7EyH,KAA6E,yCAKtEE,EAAA6Y,mBAAqBtd,IAASyE,EAAA6Y,oBAAiB,WAD1DxgB,EAAAA,EAAAA,IAKM,MALNmI,EAKM,EAHJjJ,EAAAA,EAAAA,IAEuCyhB,EAAA,CAF3BC,UAAW/hB,EAAA4hB,WAAW9Y,EAAA6Y,mBACtBtW,OAAQrL,EAAA6hB,kBAAkB/Y,EAAA6Y,mBAC1B,cAAa7Y,EAAAkZ,Y,gGAOtBlZ,EAAA6Y,oBAAiB,WAD5BxgB,EAAAA,EAAAA,IAKM,MALNoI,EAKM,EAHJlJ,EAAAA,EAAAA,IAEuCyhB,EAAA,CAF3BC,UAAW/hB,EAAA4hB,WAAW9Y,EAAA6Y,mBACtBtW,OAAQrL,EAAA6hB,kBAAkB/Y,EAAA6Y,mBAC1B,cAAa7Y,EAAAkZ,Y,mIC1C1B9gB,MAAM,a,UAKHsC,EAAAA,EAAAA,GAA8C,QAAxCtC,MAAM,eAAc,iBAAa,K,UAKvCsC,EAAAA,EAAAA,GAAwC,QAAlCtC,MAAM,eAAc,WAAO,K,UAKjCsC,EAAAA,EAAAA,GAA8C,QAAxCtC,MAAM,eAAc,iBAAa,K,GAKxCA,MAAM,kB,kJApBbC,EAAAA,EAAAA,IA4BM,MA5BNC,EA4BM,EA3BJoC,EAAAA,EAAAA,GAiBS,gBAhBPnD,EAAAA,EAAAA,IAeO4hB,EAAA,M,kBAdL,IAGM,EAHN5hB,EAAAA,EAAAA,IAGM6hB,EAAA,CAHA3Q,SAA0B,QAAhBzI,EAAAqZ,YAAuB,aAAW,cAC5CrhB,QAAKsC,EAAA,KAAAA,EAAA,GAAAwN,GAAE9H,EAAAqZ,YAAc,Q,mBACzB,IAA8C,CAA9C1e,K,sBAGFpD,EAAAA,EAAAA,IAGM6hB,EAAA,CAHA3Q,SAA0B,YAAhBzI,EAAAqZ,YAA2B,aAAW,kBAChDrhB,QAAKsC,EAAA,KAAAA,EAAA,GAAAwN,GAAE9H,EAAAqZ,YAAc,Y,mBACzB,IAAwC,CAAxCze,K,sBAGFrD,EAAAA,EAAAA,IAGM6hB,EAAA,CAHA3Q,SAA0B,WAAhBzI,EAAAqZ,YAA0B,aAAW,sBAC/CrhB,QAAKsC,EAAA,KAAAA,EAAA,GAAAwN,GAAE9H,EAAAqZ,YAAc,W,mBACzB,IAA8C,CAA9Cxe,K,iCAKNH,EAAAA,EAAAA,GAOM,MAPN2F,EAOM,CANuB,QAAhBL,EAAAqZ,cAAW,WAAtBjiB,EAAAA,EAAAA,IAA2DkiB,EAAA,C,MAAxBL,UAAW7e,EAAA6e,W,uBACX,WAAhBjZ,EAAAqZ,cAAW,WAA9BjiB,EAAAA,EAAAA,IAGoCmiB,EAAA,C,MAF3BN,UAAW7e,EAAA6e,UACX1W,OAAQnI,EAAAmI,OACR,cAAanI,EAAA8e,Y,8CACc,YAAhBlZ,EAAAqZ,cAAW,WAA/BjiB,EAAAA,EAAAA,IAAwEoiB,EAAA,C,MAAxBP,UAAW7e,EAAA6e,W,kFC1B1D7gB,MAAM,4B,4HACAlB,EAAAuiB,2BAAwB,WADnCphB,EAAAA,EAAAA,IAIM,MAJNC,EAIM,EAFJf,EAAAA,EAAAA,IAAoCmiB,EAAA,CAAvBhgB,KAAMsG,EAAA2Z,eAAa,kBAChCjf,EAAAA,EAAAA,GAA4E,aAAvEA,EAAAA,EAAAA,GAAiE,QAA3DtC,MAAM,iBAAiBW,UAAQ7B,EAAAuiB,0B,gCAG5C/e,EAAAA,EAAAA,GAGM,OAHDtC,OAAK+B,EAAAA,EAAAA,IAAA,CAAC,2BAA0B,aAAyBjD,EAAAuiB,6B,EAC5DliB,EAAAA,EAAAA,IAA+CmiB,EAAA,CAAlChgB,KAAMU,EAAA6e,UAAUW,gB,kBAC7Blf,EAAAA,EAAAA,GAA4E,aAAvEA,EAAAA,EAAAA,GAAiE,QAA3DtC,MAAM,iBAAiBW,UAAQ7B,EAAA2iB,0B,sEAW9C,GACEte,KAAM,YACNuF,OAAQ,CAACC,EAAAA,GACTnF,WAAY,CACVke,WAAUA,EAAAA,GAGZte,MAAO,CACLyd,UAAW,CACTld,KAAMiC,OACN4G,UAAU,GAGZrC,OAAQ,CACNxG,KAAMiC,QAGRkb,WAAY,CACVnd,KAAM4I,SAIVzI,IAAAA,GACE,MAAO,CACLyd,cAAe,KAEnB,EAEAhX,SAAU,CACRkX,wBAAAA,GACE,OAAOE,EAAAA,EAAKC,UACT,+CAA8CphB,KAAKsgB,eACpDtgB,KAAKqgB,UAAUW,eACf,CAACK,SAAU,SACX/S,MAAMgT,MACV,EAEAT,wBAAAA,GACE,OAAK7gB,KAAK+gB,cAIHI,EAAAA,EAAKC,UACV,OACA,qCACAphB,KAAK+gB,eACLzS,MAAMgT,OAPC,IAQX,GAGF3hB,QAAS,CACP,uBAAM4hB,GACCvhB,KAAK2J,OAKV3J,KAAK+gB,oBAAsB/gB,KAAKiK,QAC9B,gBAAiB,CACfyD,IAAK,CACH,CAAC1N,KAAKqgB,UAAU1d,MAAO3C,KAAK2J,UAPhC3J,KAAK+gB,cAAgB,IAWzB,GAGF3gB,OAAAA,GACEJ,KAAKuhB,oBACLvhB,KAAKiH,OAAO,SAAUjH,KAAKuhB,kBAC7B,G,UCnFF,MAAMlhB,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAS,GAAQ,CAAC,YAAY,qBAEzF,Q,+DCRWb,MAAM,O,sDAaNA,MAAM,W,UACTsC,EAAAA,EAAAA,GAGK,YAFHA,EAAAA,EAAAA,GAA8B,KAA3BtC,MAAM,sBAAkB,QAAG,iBAEhC,K,oBAWGA,MAAM,U,UACTsC,EAAAA,EAAAA,GAGK,YAFHA,EAAAA,EAAAA,GAA8B,KAA3BtC,MAAM,sBAAkB,QAAG,gBAEhC,K,uFAhCNC,EAAAA,EAAAA,IA2CU,UA3CVC,EA2CU,EA1CRoC,EAAAA,EAAAA,GAOS,gBANPA,EAAAA,EAAAA,GAKK,YAJHA,EAAAA,EAAAA,GAGI,KAHDtC,MAAM,QAASgQ,KAAMhO,EAAA6e,UAAUmB,QAAS/D,OAAO,U,EAChD9e,EAAAA,EAAAA,IAAkE2R,EAAA,CAAlD3N,KAAMnB,EAAA6e,UAAU1d,KAAM4N,KAAK,MAAM,qB,kBACjDzO,EAAAA,EAAAA,GAA6C,QAAvCtC,MAAM,O,aAAOqC,EAAAA,EAAAA,IAAQL,EAAe6e,UAAL1d,O,oBAK5ByE,EAAAqa,MAAG,WAAlBhiB,EAAAA,EAAAA,IAgCU,W,MAhCWgC,QAAKC,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAojB,YAAApjB,EAAAojB,cAAA/f,K,EAC1BG,EAAAA,EAAAA,GAAwC,OAAnCtC,MAAM,cAAcW,UAAQiH,EAAAqa,K,UAENrc,OAAO2B,KAAKvF,EAAA6e,UAAUsB,SAAW,CAAC,GAAG/a,OAAS,IAAH,WAAtEnH,EAAAA,EAAAA,IAaM,MAbNgI,EAaM,CAZJhF,GAKAX,EAAAA,EAAAA,GAMK,0BALHrC,EAAAA,EAAAA,IAIKa,EAAAA,GAAA,MAAAC,EAAAA,EAAAA,IAJmCjC,EAAAsjB,aAAdC,K,WAA1BpiB,EAAAA,EAAAA,IAIK,MAJDD,MAAM,SAA4CqB,IAAKghB,G,EACzD/f,EAAAA,EAAAA,GAEI,KAFA0N,KAAI,oBAAsBhO,EAAA6e,UAAU1d,QAAQkf,M,QAC3CrgB,EAAA6e,UAAU1d,MAAO,KAACd,EAAAA,EAAAA,IAAGggB,GAAU,EAAAnf,Q,2BAMhB0C,OAAO2B,KAAKvF,EAAA6e,UAAU1Z,QAAU,CAAC,GAAGC,OAAS,IAAH,WAApEnH,EAAAA,EAAAA,IAaM,MAbNkI,EAaM,CAZJT,GAKApF,EAAAA,EAAAA,GAMK,0BALHrC,EAAAA,EAAAA,IAIKa,EAAAA,GAAA,MAAAC,EAAAA,EAAAA,IAJiCjC,EAAAwjB,YAAbC,K,WAAzBtiB,EAAAA,EAAAA,IAIK,MAJDD,MAAM,QAAyCqB,IAAKkhB,G,EACtDjgB,EAAAA,EAAAA,GAEI,KAFA0N,KAAMhO,EAAA6e,UAAU1Z,OAAOob,GAAWP,QAAS/D,OAAO,W,QACjDsE,GAAS,EAAAna,Q,wEAc1B,GACEjF,KAAM,MACNuF,OAAQ,CAACC,EAAAA,GACTnF,WAAY,CACVoO,cAAaA,EAAAA,GAGfxO,MAAO,CACLyd,UAAW,CACTld,KAAMiC,OACN4G,UAAU,IAId1I,IAAAA,GACE,MAAO,CACLme,IAAK,KACLO,eAAgB,IAAIC,OAAO,WAE/B,EAEAlY,SAAU,CACR6X,WAAAA,GACE,OAAOxc,OAAO2B,KAAK/G,KAAKqgB,UAAUsB,SAASjQ,MAC7C,EAEAoQ,UAAAA,GACE,OAAO1c,OAAO2B,KAAK/G,KAAKqgB,UAAU1Z,QAAQ+K,MAC5C,GAGF/R,QAAS,CACP,cAAMuiB,GACJ,OAAKliB,KAAKqgB,UAAUoB,KAAK7a,aAGZ5G,KAAKiK,QAChB,oBACA,CAACnJ,KAAMd,KAAKqgB,UAAUoB,MAJf,IAMX,EAEAU,UAAAA,GACEniB,KAAKkiB,WAAWxM,MAAK+L,GAAOzhB,KAAKyhB,IAAMA,GACzC,EAKAC,UAAAA,CAAW7c,GACT,GAA2C,MAAvCA,EAAM4Y,OAAO2E,QAAQrJ,cACvB,OAAO,EAETlU,EAAM0F,iBACN,MAAMiF,EAAO3K,EAAM4Y,OAAO4E,aAAa,QACvC,IAAK7S,EACH,OAAO,EAET,GAAIA,EAAK+C,MAAMvS,KAAKgiB,gBAElB,OADAnf,OAAOoD,SAASuJ,KAAOA,GAChB,EAGT,MAAM+C,EAAQ/C,EAAK+C,MAAM,uFACzB,IAAKA,EAGH,OAFA1N,EAAM0F,iBACN1H,OAAOC,KAAK0M,EAAM,WACX,EAGT,IAAKrM,EAAMR,GAAQ4P,EAAMd,MAAM,GAClB,YAATtO,IACFR,EAAQ,WAAUA,KAEpBhF,EAAAA,EAAII,KAAK,mBAAoB4E,GAC7BkC,EAAM0F,gBACR,GAGFnK,OAAAA,GACEJ,KAAKmiB,aACLniB,KAAKiH,OAAO,gBAAiBjH,KAAKmiB,WACpC,GC/HF,MAAM,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAS,GAAQ,CAAC,YAAY,qBAEzF,S,iECRO3iB,MAAM,qB,IACAA,MAAM,O,YACbsC,EAAAA,EAAAA,GAES,gBADPA,EAAAA,EAAAA,GAAqB,UAAjB,kBAAY,K,IAGbtC,MAAM,Q,IACJA,MAAM,mC,2BAKNA,MAAM,uB,4BAMPsC,EAAAA,EAAAA,GAA6B,KAA1BtC,MAAM,mBAAiB,W,UAMzBA,MAAM,U,YACbsC,EAAAA,EAAAA,GAES,gBADPA,EAAAA,EAAAA,GAAe,UAAX,YAAM,K,IAGPtC,MAAM,Q,IACJA,MAAM,2BAA2Bd,IAAI,iB,6BAG7Bc,MAAM,qB,4HAjCzBC,EAAAA,EAAAA,IAwCM,MAxCNC,GAwCM,EAvCJoC,EAAAA,EAAAA,GAqBU,UArBVC,GAqBU,CApBRC,IAIAF,EAAAA,EAAAA,GAeM,MAfNG,GAeM,EAdJH,EAAAA,EAAAA,GAGM,MAHN2F,GAGM,CAFiCnJ,EAAAgkB,aAAU,WAA/C9jB,EAAAA,EAAAA,IAAmDsiB,EAAA,C,MAAtChgB,KAAMxC,EAAAgkB,Y,mCACnBxgB,EAAAA,EAAAA,GAAmF,YAA/DsF,EAAAyD,UAAO,WAAtBrM,EAAAA,EAAAA,IAA0BsM,EAAA,CAAAjK,IAAA,kBAAApB,EAAAA,EAAAA,IAA8C,Q,MAAxCU,UAAQ7B,EAAAikB,uB,gBAGRjkB,EAAAgkB,aAAU,WAAjD7iB,EAAAA,EAAAA,IAQM,MARNiD,GAQM,CAPiB0E,EAAAob,cAAW,WAAhChkB,EAAAA,EAAAA,IAAoCikB,EAAA,CAAA5hB,IAAA,sBACpCiB,EAAAA,EAAAA,GAKS,UALDqB,KAAK,SACL3D,MAAM,kBACL4f,SAAUhY,EAAAsb,eACVjhB,QAAKC,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAqkB,kBAAArkB,EAAAqkB,oBAAAhhB,K,CACduF,IAA6B,sBAC/B,6BAKwBE,EAAAsb,gBAAkBtb,EAAAwb,gBAAa,WAA7DnjB,EAAAA,EAAAA,IAeU,UAfVmI,GAeU,CAdRC,IAIA/F,EAAAA,EAAAA,GASM,MATNiO,GASM,EARJjO,EAAAA,EAAAA,GAOM,MAPNiG,GAOM,EANJpJ,EAAAA,EAAAA,IAAoCmiB,EAAA,CAAvBhgB,KAAMsG,EAAAwb,eAAa,kBAChC9gB,EAAAA,EAAAA,GAIY,aAJPA,EAAAA,EAAAA,GAA+B,Q,aAAzBD,EAAAA,EAAAA,IAAQuF,EAAcwb,gB,WAEhBxb,EAAAsb,iBAAc,WAFKjjB,EAAAA,EAAAA,IAI9B,MAJ8BojB,GAI9B,UAF2B,mBAC/BlkB,EAAAA,EAAAA,IAAWmM,IAAA,4BACb,6C,2BAgBV,IACEnI,KAAM,UACNuF,OAAQ,CAACC,EAAAA,GACTpK,KAAM,CAAC,gBAAiB,eACxBiF,WAAY,CACVke,WAAU,IACV9U,QAAO,KACP0W,cAAaA,GAAAA,GAGflgB,MAAO,CACLyd,UAAW,CACTld,KAAMiC,OACN4G,UAAU,IAId1I,IAAAA,GACE,MAAO,CACLof,gBAAgB,EAChBF,aAAa,EACbI,cAAe,KACfG,YAAa,GACbC,gBAAiB,EACjB5hB,MAAO,KACPyJ,SAAS,EAEb,EAEAd,SAAU,CACRuY,UAAAA,GACE,OAAItiB,KAAK+iB,YAAYnc,OACZ5G,KAAK+iB,YAAY9P,KAAK,MAAMqO,OAE9B,IACT,EAEAiB,qBAAAA,GACE,OACEpB,EAAAA,EAAKC,UACHphB,KAAKsiB,WACLtiB,KAAK+iB,YACJ7V,KAAK+V,GAAS,KAAIA,MAClBhQ,KAAK,MACLqO,OACD,yCACA,CAACD,SAAU,SACX/S,KAEN,GAGF3O,QAAS,CACPujB,SAAAA,CAAUrP,GACR,IACE,MAAM7N,EAAwC,WAA7BnD,OAAOoD,SAASD,SAAwB,MAAQ,KAC3DE,EAAO,GAAEF,OAAcC,SAASE,OAAO0N,IACvCjQ,EAAK,IAAIwC,UAAUF,GAEzBtC,EAAG0C,UAAYtG,KAAK4E,UACpBhB,EAAG4C,QAAUxG,KAAK4F,QAClBhC,EAAG6B,QAAUzF,KAAKC,OACpB,CAAE,MAAOoG,GACPrG,KAAKiJ,OAAO,CACV7H,OAAO,EACPJ,MAAQ,iCACRF,KAAMuF,EAAIsN,aAGZpP,QAAQnD,MAAM,kCACdmD,QAAQnD,MAAMiF,GACdrG,KAAKoB,MAAQiF,EACbrG,KAAK0iB,gBAAiB,CACxB,CACF,EAEA9d,SAAAA,CAAU8B,GACH1G,KAAK4iB,gBACR5iB,KAAK4iB,cAAgB,IAEvB5iB,KAAK4iB,eAAiBlc,EAAIpD,IAC5B,EAEArD,OAAAA,GACED,KAAK0iB,gBAAiB,EACtB1iB,KAAK+C,MAAM,cAAe/C,KAAKqgB,WAE1BrgB,KAAKoB,QACRpB,KAAKwiB,aAAc,GACnBxiB,KAAKiJ,OAAO,CACVjI,MAAQ,sBACRD,KAAO,gBAAef,KAAKqgB,UAAU1d,kCACrCzB,MAAO,CACLsB,UAAW,iBAGnB,EAEAoD,OAAAA,CAAQxE,GACJpB,KAAKiJ,OAAO,CACV7H,OAAO,EACPJ,MAAQ,kBACRF,KAAMM,EAAMuS,aAGhBpP,QAAQnD,MAAM,mBACdmD,QAAQnD,MAAMA,GACdpB,KAAKoB,MAAQA,EACbpB,KAAK0iB,gBAAiB,CACxB,EAEAC,gBAAAA,GACE,IAAK3iB,KAAKsiB,WACR,OAEFtiB,KAAKoB,MAAQ,KACbpB,KAAK0iB,gBAAiB,EACtB1iB,KAAK4iB,cAAgB,GACrB5iB,KAAK+C,MAAM,gBAAiB/C,KAAKqgB,WAEjC,MAAM4C,EAAMjjB,KAAK+iB,YAAY9P,KAAK,OAClCjT,KAAKiK,QAAQ,aAAc,CACzBgZ,IAAKA,EACLrf,IAAI,IACH8R,MAAME,IACP5V,KAAKkjB,UAAUtN,EAAOuN,QAAQ,IAC7BtN,OAAOxP,IACRrG,KAAKoB,MAAQiF,EACbrG,KAAK0iB,gBAAiB,EACtB1iB,KAAK+C,MAAM,cAAe/C,KAAKqgB,UAAU,GAE7C,EAEA,wBAAM+C,GACJpjB,KAAK6K,SAAU,EACf,IACE7K,KAAK+iB,kBAAoB/iB,KAAKiK,QAAQ,mCAAoC,CACxEoW,UAAWrgB,KAAKqgB,UAAU1d,MAE9B,CAAE,QACA3C,KAAK6K,SAAU,CACjB,CACF,GAGFzK,OAAAA,GACEJ,KAAKojB,qBACLpjB,KAAKiH,OAAO,kBAAkB,KAC5BjH,KAAKojB,oBAAoB,IAG3BpjB,KAAKiH,OAAO,iBAAiB,KAC3BjH,KAAKke,WAAU,KACble,KAAKuI,MAAMqa,cAAcS,QACzBrjB,KAAKuI,MAAMqa,cAAcU,UAAYtjB,KAAKuI,MAAMqa,cAAcW,YAAW,GACzE,GAEN,GC3MF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,UN8BA,IACE5gB,KAAM,YACNK,WAAY,CACVwgB,OAAM,EACNC,IAAG,GACHC,QAAO,GACPC,IAAG,IACHC,KAAIA,EAAAA,GAGNhhB,MAAO,CACLyd,UAAW,CACTld,KAAMiC,OACN4G,UAAU,GAGZrC,OAAQ,CACNxG,KAAMiC,QAGRkb,WAAY,CACVnd,KAAM4I,SAIVzI,IAAAA,GACE,MAAO,CACLmd,YAAa,MAEjB,GO7DF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,GAAQ,CAAC,YAAY,qBAEzF,UR+CA,IACE9d,KAAM,aACNuF,OAAQ,CAACC,EAAAA,GACTnF,WAAY,CACV6gB,UAAS,GACTzS,cAAa,IACbhF,QAAOA,GAAAA,GAGT9I,IAAAA,GACE,MAAO,CACLuH,SAAS,EACTsH,QAAS,CAAC,EACVC,SAAU,CAAC,EACX0R,eAAgB,CAAC,EACjBC,gBAAiB,CAAC,EAClBjE,OAAQ,GACRG,kBAAmB,KACnBK,WAAY,KACZ3W,OAAQ,CAAC,EAEb,EAEAI,SAAU,CACRmW,UAAAA,GACE,MAAMA,EAAa,CAAC,EAiBpB,OAfA9a,OAAOuN,QAAQ3S,KAAKmS,SAASS,SAAQ,EAAEjQ,EAAM8P,MAC3CyN,EAAWvd,GAAQ,IACd8P,EACH9P,KAAMA,EACP,IAGHyC,OAAOuN,QAAQ3S,KAAKoS,UAAUQ,SAAQ,EAAEjQ,EAAMqhB,MAC5CrhB,EAAQ,WAAUA,IAClBud,EAAWvd,GAAQ,IACdqhB,EACHrhB,KAAMA,EACP,IAGIud,CACT,EAEAC,iBAAAA,GACE,MAAO,CAACngB,KAAK8jB,eAAgB9jB,KAAK+jB,iBAAiBtW,QAAO,CAAC0M,EAAK+F,KAC9D9a,OAAOuN,QAAQuN,GAAYtN,SAAQ,EAAEjQ,EAAMgH,MACzCwQ,EAAIxX,GAAQgH,CAAK,IAGZwQ,IACN,CAAC,EACN,EAEA4F,cAAAA,GACE,OAAO3a,OAAO2B,KAAK/G,KAAKkgB,YAAYxO,MACtC,GAGF/R,QAAS,CACP8B,OAAAA,CAAQwiB,EAAOC,GAAY,EAAM7J,GAAa,GACxCra,KAAKigB,oBAAsBgE,EAC7BjkB,KAAKigB,kBAAoB,KAEzBjgB,KAAKZ,QAAQ6kB,EAAOC,EAAW7J,EAEnC,EAEAjb,OAAAA,CAAQ6kB,EAAOC,GAAY,EAAM7J,GAAa,GACxC6J,IACFlkB,KAAK8f,OAASmE,GAGhB,MAAMthB,EAAOshB,GAAOlL,eAAeuI,OACnC,GAAI3e,GAAMiE,QAAU5G,KAAKkgB,WAAWvd,GAAO,CACzC3C,KAAKigB,kBAAoBtd,EACrB0X,GACFra,KAAKqa,WAAW,CAACgG,UAAW1d,IAE9B,MAAMyK,EAAKpN,KAAKF,IAAIqkB,cAAe,0CAAyCxhB,OACxEyK,GACFA,EAAGgX,eAAe,CAACC,SAAU,UACjC,MACErkB,KAAKigB,kBAAoB,KACrB5F,GACFra,KAAKqa,WAAW,CAAC,EAEvB,EAEA2F,aAAAA,CAAcK,GACZ,OAAKrgB,KAAK8f,QAIHO,EAAUjQ,SAASpQ,KAAK8f,OAAO/G,cACxC,EAEA,oBAAMuL,GACJtkB,KAAK6K,SAAU,EACf,IAAKiZ,EAAgBC,GAAmB,CAAC,GAAI,IAE7C,KAEM/jB,KAAKmS,QACLnS,KAAKoS,SACL0R,EACAC,EACA/jB,KAAK2J,cAEC0J,QAAQC,IAAI,CAChBtT,KAAKiK,QAAQ,2BACbjK,KAAKiK,QAAQ,4BACbjK,KAAKiK,QAAQ,+BACbjK,KAAKiK,QAAQ,gCACbjK,KAAKiK,QAAQ,uBAErB,CAAE,QACAjK,KAAK6K,SAAU,CACjB,CAEA7K,KAAK8jB,eAAiBA,EAAerW,QAAO,CAAC0M,EAAKxX,KAChDwX,EAAIxX,GAAQ3C,KAAK2J,OAAOhH,IAAS,CAAC,EAC3BwX,IACN,CAAC,GAEJna,KAAK+jB,gBAAkBA,EAAgBtW,QAAO,CAAC0M,EAAKxX,KAClDA,EAAQ,WAAUA,IAClBwX,EAAIxX,GAAQ3C,KAAK2J,OAAOhH,IAAS,CAAC,EAC3BwX,IACN,CAAC,GAEJna,KAAKukB,uBACLvkB,KAAKiH,OAAO,eAAe,IAAMjH,KAAKukB,wBACxC,EAEA,oBAAMC,GACJxkB,KAAKsgB,iBAAmBtgB,KAAKiK,QAAQ,yBACvC,EAEAsa,oBAAAA,GACE,MAAMlE,EAAYrgB,KAAKia,aAAaoG,UAChCA,GACFrgB,KAAKke,WAAU,IAAMle,KAAKZ,QAAQihB,GAAW,GAAO,IACxD,GAGFjgB,OAAAA,GACEJ,KAAKwkB,iBACLxkB,KAAKskB,iBACL3mB,EAAAA,EAAIO,GAAG,oBAAqBumB,GAAQzkB,KAAKZ,QAAQqlB,GAAK,KACtDzkB,KAAKke,WAAU,IAAMle,KAAKuI,MAAMuX,OAAOuD,SACzC,GSzMF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAASzY,GAAQ,CAAC,YAAY,qBAEzF,S,yGCROpL,MAAM,sB,kHAAXC,EAAAA,EAAAA,IAQM,MARNC,EAQM,EAPJoC,EAAAA,EAAAA,GAMO,aALgC,gBAAlBN,EAAAsN,gBAAa,WAAhCtQ,EAAAA,EAAAA,IAAsDkmB,EAAA,CAAA7jB,IAAA,qBAEvB,UAAlBW,EAAAsN,eAA6B1H,EAAAud,cAAW,WADrDnmB,EAAAA,EAAAA,IACyDomB,EAAA,C,MADjD,gBAAexd,EAAAyd,aAAe,eAAczd,EAAAud,a,0CAGhB,WAAlBnjB,EAAAsN,eAA8B1H,EAAAud,cAAW,WAD3DnmB,EAAAA,EAAAA,IAC+DsmB,EAAA,C,MADvD,gBAAe1d,EAAAyd,aAAe,eAAczd,EAAAud,a,uECLnDnlB,MAAM,iB,GACJA,MAAM,iB,GAINA,MAAM,iB,qGALbC,EAAAA,EAAAA,IAQM,MARNC,EAQM,EAPJoC,EAAAA,EAAAA,GAEM,MAFNC,EAEM,EADJpD,EAAAA,EAAAA,IAAiB8jB,MAGnB3gB,EAAAA,EAAAA,GAEM,MAFNE,EAEM,EADJrD,EAAAA,EAAAA,IAAcomB,M,8ECNbvlB,MAAM,sB,UAGPsC,EAAAA,EAAAA,GAAM,qB,UAAAA,EAAAA,EAAAA,GAAM,qB,UACZA,EAAAA,EAAAA,GAGO,QAHDtC,MAAM,eAAc,sGAG1B,K,UAIAsC,EAAAA,EAAAA,GAAyB,KAAtBtC,MAAM,eAAa,W,4EAX1BC,EAAAA,EAAAA,IAaM,MAbNC,EAaM,EAZJf,EAAAA,EAAAA,IAOgBQ,EAAA,CAPDT,IAAI,QAASU,QAAOd,EAAA0mB,M,mBAAM,IAEvC,UAFuC,yDAEvCjjB,EAAMC,EACNC,K,qBAMFH,EAAAA,EAAAA,GAES,UAFDtC,MAAM,2BAA4BiC,QAAKC,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAuhB,YAAAvhB,EAAAuhB,cAAAle,IAAakb,QAAKnb,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAuhB,YAAAvhB,EAAAuhB,cAAAle,K,CACnE8F,GAAyB,iCAC3B,K,yBAQJ,GACE9E,KAAM,aACNK,WAAY,CAACoG,cAAaA,EAAAA,GAC1BlB,OAAQ,CAACC,EAAAA,GACTxI,QAAS,CACPkgB,UAAAA,GACE7f,KAAKuI,MAAMiU,MAAM/T,MACnB,EAEA,UAAMuc,SACEhlB,KAAKiK,QAAQ,mBACrB,I,UCzBJ,MAAM5J,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAS,GAAQ,CAAC,YAAY,qBAEzF,QFOA,GACEsC,KAAM,cACNK,WAAY,CAAC8f,cAAa,IAAEmC,WAAUA,IGXxC,MAAM,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAS,GAAQ,CAAC,YAAY,qBAEzF,Q,6BCROzlB,MAAM,mB,GAIFA,MAAM,mB,GACTsC,EAAAA,EAAAA,GAGQ,uBAHD,kGACuFA,EAAAA,EAAAA,GAAK,mFAEnG,G,qBAOGtC,MAAM,mB,GACTsC,EAAAA,EAAAA,GAGQ,aAHD,yGAGP,G,qBAMCtC,MAAM,Q,w3CA6CJA,MAAM,kB,GAGLsC,EAAAA,EAAAA,GAAqB,YAAf,YAAQ,G,eAMhBA,EAAAA,EAAAA,GAKQ,eAJNA,EAAAA,EAAAA,GAA6B,YAAvB,qBACNA,EAAAA,EAAAA,GAEO,cADLA,EAAAA,EAAAA,GAAuC,SAAhCqB,KAAK,WAAWR,KAAK,iB,MAIhCb,EAAAA,EAAAA,GAUQ,eATNA,EAAAA,EAAAA,GAAmC,YAA7B,2BACNA,EAAAA,EAAAA,GAEO,cADLA,EAAAA,EAAAA,GAAuC,SAAhCqB,KAAK,OAAOR,KAAK,oBAE1Bb,EAAAA,EAAAA,GAIO,QAJDtC,MAAM,QAAM,UAAC,+CACwBsC,EAAAA,EAAAA,GAAU,SAAP,QAAG,QAAI,sGAGrD,G,GAGFA,EAAAA,EAAAA,GAEQ,eADNA,EAAAA,EAAAA,GAAwE,SAAjEqB,KAAK,SAAS3D,MAAM,kBAAkB8O,MAAM,yB,6FAnG7D7O,EAAAA,EAAAA,IA6GM,MA7GNC,EA6GM,CA5GW0H,EAAAyD,UAAO,WAAtBrM,EAAAA,EAAAA,IAA0BsM,EAAA,CAAAjK,IAAA,sBAE1BlC,EAAAA,EAAAA,IASQwI,EAAA,CATDzI,IAAI,cAAY,C,kBACrB,IAOM,EAPNoD,EAAAA,EAAAA,GAOM,MAPNC,EAOM,CANJC,GAKAF,EAAAA,EAAAA,GAAgE,YAAtDtC,MAAM,Q,aAAQqC,EAAAA,EAAAA,IAAQuF,EAAM2L,OAAEmS,QAAKxjB,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAA6mB,eAAA7mB,EAAA6mB,iBAAAxjB,K,2BAInDhD,EAAAA,EAAAA,IASQwI,EAAA,CATDzI,IAAI,qBAAmB,C,kBAC5B,IAOM,EAPNoD,EAAAA,EAAAA,GAOM,MAPN2F,EAOM,CANJhF,GAKAX,EAAAA,EAAAA,GAAuE,YAA7DtC,MAAM,Q,aAAQqC,EAAAA,EAAAA,IAAQL,EAAaqjB,cAAEK,QAAKxjB,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAA6mB,eAAA7mB,EAAA6mB,iBAAAxjB,K,2BAI1DG,EAAAA,EAAAA,GAmFM,MAnFN6F,EAmFM,CAlFJT,GA4CApF,EAAAA,EAAAA,GAqCM,MArCN8F,EAqCM,EApCJ9F,EAAAA,EAAAA,GAmCO,QAnCA4a,SAAMhb,EAAA,KAAAA,EAAA,IAAAib,EAAAA,EAAAA,KAAA,IAAAhb,IAAUrD,EAAA8mB,eAAA9mB,EAAA8mB,iBAAAzjB,IAAa,cAAEjD,IAAI,qB,EACxCoD,EAAAA,EAAAA,GAKQ,cAJN+F,GACA/F,EAAAA,EAAAA,GAEO,cADLA,EAAAA,EAAAA,GAA0E,SAAnEqB,KAAK,OAAOR,KAAK,WAAY2L,MAAO9M,EAAAmjB,YAAYU,SAAUjG,SAAA,I,cAIrErX,EAOAiI,EAYA6S,GAIA/gB,EAAAA,EAAAA,GAGQ,eAFNA,EAAAA,EAAAA,GAC+C,SADxCqB,KAAK,SAAS3D,MAAM,kBAAkB8O,MAAM,qBAChD7M,QAAKC,EAAA,KAAAA,EAAA,IAAAib,EAAAA,EAAAA,KAAAzN,GAAO1O,EAAA+H,MAAM+c,kBAAkB7c,QAAI,gB,6CAcvD,GACE9F,KAAM,QACNK,WAAY,CAACiF,MAAK,IAAEmE,QAAOA,EAAAA,GAC3BlE,OAAQ,CAACC,EAAAA,GAETvF,MAAO,CACL+hB,YAAa,CACXxhB,KAAMiC,OACN4G,UAAU,GAGZ6Y,aAAc,CACZ1hB,KAAM4I,OACNC,UAAU,IAId1I,IAAAA,GACE,MAAO,CACLuH,SAAS,EACTkI,MAAO,KAEX,EAEApT,QAAS,CACP,mBAAMylB,CAAcvgB,GAClB,MAAMwgB,EAAWrlB,KAAK2kB,YAAYU,SAC5BE,EAAW1gB,EAAM4Y,OAAO8H,SAASjX,MACvC,IAAIkX,EAAe3gB,EAAM4Y,OAAO+H,cAAc5e,OAASnD,SAASoB,EAAM4Y,OAAO+H,aAAalX,OAAS,EAC9FkX,IACHA,EAAe,MAEjBxlB,KAAK6K,SAAU,EACf,IACE7K,KAAK+S,aAAeyC,EAAAA,EAAMC,KAAK,QAAS,CACtC4P,SAAUA,EACVE,SAAUA,EACVE,YAAaD,KACXliB,KAAKyP,MAEL/S,KAAK+S,OAAOnM,QACd5G,KAAKuI,MAAMmd,WAAWjd,MAC1B,CAAE,MAAOzD,GACPT,QAAQnD,MAAM4D,EAAE2O,YAChB3T,KAAKiJ,OAAO,CACVnI,KAAMkE,EAAE2O,WACRvS,OAAO,GAEX,CAAE,QACApB,KAAK6K,SAAU,CACjB,CACF,EAEAsa,aAAAA,CAActgB,GACZA,EAAM4Y,OAAOkI,SACbvP,SAASwP,YAAY,QAErB5lB,KAAKiJ,OAAO,CACVnI,KAAM,4BACNI,MAAO,CACLsB,UAAW,gBAGjB,IC/KJ,MAAM,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAAS,KAEpE,Q,oJC+BOhD,MAAM,Q,IACLA,MAAM,c,sCAGDA,MAAM,4B,yNA3CF4H,EAAAyD,UAAO,WAAtBrM,EAAAA,EAAAA,IAA0BsM,EAAA,CAAAjK,IAAA,sBAE1BlC,EAAAA,EAAAA,IAeQwI,EAAA,CAfDzI,IAAI,eAAesC,MAAM,Y,mBAC9B,IAaO,EAbPc,EAAAA,EAAAA,GAaO,QAbDgU,OAAO,IAAI3H,OAAO,OAAOzP,IAAI,cAAege,SAAMhb,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAunB,YAAAvnB,EAAAunB,cAAAlkB,K,EACxDG,EAAAA,EAAAA,GAEQ,eADNA,EAAAA,EAAAA,GAAqF,SAA9EqB,KAAK,OAAOR,KAAK,WAAWyL,YAAY,WAAYgR,SAAUhY,EAAA0e,gB,aAEvEhkB,EAAAA,EAAAA,GAEQ,eADNA,EAAAA,EAAAA,GAAyF,SAAlFqB,KAAK,WAAWR,KAAK,WAAWyL,YAAY,WAAYgR,SAAUhY,EAAA0e,gB,aAE3EhkB,EAAAA,EAAAA,GAEQ,eADNA,EAAAA,EAAAA,GAAyG,SAAlGqB,KAAK,WAAWR,KAAK,mBAAmByL,YAAY,mBAAoBgR,SAAUhY,EAAA0e,gB,aAE3FhkB,EAAAA,EAAAA,GAEQ,eADNA,EAAAA,EAAAA,GAA4F,SAArFqB,KAAK,SAAS3D,MAAM,kBAAkB8O,MAAM,cAAe8Q,SAAUhY,EAAA0e,gB,iCAKlFnnB,EAAAA,EAAAA,IAkBQwI,EAAA,CAlBDzI,IAAI,sBAAsBsC,MAAM,mB,mBACrC,IAgBO,EAhBPc,EAAAA,EAAAA,GAgBO,QAhBDgU,OAAO,IAAI3H,OAAO,OAAOzP,IAAI,qBAAsBge,SAAMhb,EAAA,KAAAA,EAAA,OAAAC,IAAErD,EAAAynB,gBAAAznB,EAAAynB,kBAAApkB,K,EAC/DG,EAAAA,EAAAA,GAEQ,eADNA,EAAAA,EAAAA,GAAoG,SAA7FqB,KAAK,OAAOR,KAAK,WAAWyL,YAAY,WAAYE,MAAOlH,EAAA4e,aAAc5G,SAAS,Y,cAE3Ftd,EAAAA,EAAAA,GAEQ,eADNA,EAAAA,EAAAA,GAAiG,SAA1FqB,KAAK,WAAWR,KAAK,WAAWyL,YAAY,mBAAoBgR,SAAUhY,EAAA0e,gB,cAEnFhkB,EAAAA,EAAAA,GAEQ,eADNA,EAAAA,EAAAA,GAAiG,SAA1FqB,KAAK,WAAWR,KAAK,eAAeyL,YAAY,eAAgBgR,SAAUhY,EAAA0e,gB,cAEnFhkB,EAAAA,EAAAA,GAEQ,eADNA,EAAAA,EAAAA,GAAiH,SAA1GqB,KAAK,WAAWR,KAAK,uBAAuByL,YAAY,uBAAwBgR,SAAUhY,EAAA0e,gB,cAEnGhkB,EAAAA,EAAAA,GAEQ,eADNA,EAAAA,EAAAA,GAAgG,SAAzFqB,KAAK,SAAS3D,MAAM,kBAAkB8O,MAAM,kBAAmB8Q,SAAUhY,EAAA0e,gB,iCAKtFhkB,EAAAA,EAAAA,GAoBM,MApBN8F,GAoBM,EAnBJ9F,EAAAA,EAAAA,GAYK,KAZL+F,GAYK,gBAXHpI,EAAAA,EAAAA,IAUKa,EAAAA,GAAA,MAAAC,EAAAA,EAAAA,IAVc6G,EAAA6e,OAARC,K,WAAXzmB,EAAAA,EAAAA,IAUK,MAVsBoB,IAAKqlB,EAAKC,QAAS3mB,MAAM,YAAaiC,QAAKyN,GAAE9H,EAAA4e,aAAeE,EAAKb,U,EAC1FvjB,EAAAA,EAAAA,GAAiD,OAA5CtC,MAAM,a,aAAaqC,EAAAA,EAAAA,IAAQqkB,EAAKb,W,YACrCvjB,EAAAA,EAAAA,GAOM,MAPNkO,GAOM,EANJrR,EAAAA,EAAAA,IAKWynB,EAAA,CALDplB,MAAM,eAAe,aAAW,kB,mBACxC,IACuD,EADvDrC,EAAAA,EAAAA,IACuD0nB,EAAA,CADzCvlB,KAAK,kBAAmBse,SAAUhY,EAAA0e,eAAgB,aAAW,YAC5DrkB,QAAKyN,GAAE5Q,EAAAgoB,wBAAwBJ,I,gCAC9CvnB,EAAAA,EAAAA,IACuD0nB,EAAA,CADzCvlB,KAAK,cAAese,SAAUhY,EAAA0e,eAAgB,aAAW,cACxDrkB,QAAKC,EAAA,KAAAA,EAAA,GAAAwN,GAAE1O,EAAA+H,MAAMge,iBAAiB9d,S,wDAMrD9J,EAAAA,EAAAA,IAAoF6nB,EAAA,CAApE,aAAW,aAAa1lB,KAAK,WAAYW,QAAOnD,EAAAmoB,kB,qBAEhE9nB,EAAAA,EAAAA,IAEgBQ,EAAA,CAFDT,IAAI,mBAAoBU,QAAKsC,EAAA,KAAAA,EAAA,GAAAwN,GAAE5Q,EAAAooB,WAAWtf,EAAA4e,gB,mBAAe,IACxB,UADwB,mDACxBnkB,EAAAA,EAAAA,IAAGuF,EAAA4e,cAAe,KAClE,M,qDAaJ,IACErjB,KAAM,QACNK,WAAY,CAACoG,cAAa,IAAEud,SAAQ,KAAEC,aAAY,KAAEC,eAAc,KAAEza,QAAO,IAAEnE,MAAKA,EAAAA,GAClFC,OAAQ,CAACC,EAAAA,GAETvF,MAAO,CACLiiB,aAAc,CACZ1hB,KAAM4I,OACNC,UAAU,GAGZ2Y,YAAa,CACXxhB,KAAMiC,OACN4G,UAAU,IAId1I,IAAAA,GACE,MAAO,CACL2iB,MAAO,GACPH,gBAAgB,EAChBjb,SAAS,EACTmb,aAAc,KAElB,EAEArmB,QAAS,CACP,aAAMmnB,GACJ9mB,KAAK6K,SAAU,EACf,IACE7K,KAAKimB,YAAcjmB,KAAKiK,QAAQ,iBAClC,CAAE,QACAjK,KAAK6K,SAAU,CACjB,CACF,EAEA,gBAAMgb,CAAWhhB,GACfA,EAAM0F,iBAEN,MAAMwc,EAAO,IAAI/mB,KAAKuI,MAAMye,YAAYvK,iBAAiB,gBAAgBhP,QAAO,CAACP,EAAK+W,KACpF/W,EAAI+W,EAAMthB,MAAQshB,EAAM3V,MACjBpB,IACN,CAAC,GAEJ,GAAI6Z,EAAKxB,WAAawB,EAAKE,iBAA3B,CAaAjnB,KAAK8lB,gBAAiB,EACtB,UACQ9lB,KAAKiK,QAAQ,mBAAoB,CACrCob,SAAU0B,EAAK1B,SACfE,SAAUwB,EAAKxB,SACf2B,cAAelnB,KAAK6kB,cAExB,CAAE,QACA7kB,KAAK8lB,gBAAiB,CACxB,CAEA9lB,KAAKiJ,OAAO,CACVnI,KAAM,QAAUimB,EAAK1B,SAAW,WAChCnkB,MAAO,CACLsB,UAAW,kBAIfxC,KAAKuI,MAAM4e,aAAaxiB,cAClB3E,KAAK8mB,SArBX,MAVE9mB,KAAKiJ,OAAO,CACVjI,MAAO,wBACPF,KAAM,wCACNM,OAAO,EACPF,MAAO,CACLsB,UAAW,iBA2BnB,EAEA,oBAAMujB,CAAelhB,GACnBA,EAAM0F,iBAEN,MAAMwc,EAAO,IAAI/mB,KAAKuI,MAAM6e,mBAAmB3K,iBAAiB,gBAAgBhP,QAAO,CAACP,EAAK+W,KAC3F/W,EAAI+W,EAAMthB,MAAQshB,EAAM3V,MACjBpB,IACN,CAAC,GAEJ,GAAI6Z,EAAKM,eAAiBN,EAAKO,qBAU7B,YATAtnB,KAAKiJ,OAAO,CACVjI,MAAO,4BACPF,KAAM,wCACNM,OAAO,EACPF,MAAO,CACLsB,UAAW,kBAOjBxC,KAAK8lB,gBAAiB,EACtB,IAAIyB,GAAU,EAEd,IACEA,QAAgBvnB,KAAKiK,QAAQ,uBAAwB,CACnDob,SAAU0B,EAAK1B,SACfmC,aAAcT,EAAKxB,SACnB8B,aAAcN,EAAKM,cAEvB,CAAE,QACArnB,KAAK8lB,gBAAiB,CACxB,CAEIyB,GACFvnB,KAAKuI,MAAMkf,oBAAoB9iB,QAC/B3E,KAAKiJ,OAAO,CACVnI,KAAM,gCACNI,MAAO,CACLsB,UAAW,mBAIfxC,KAAKiJ,OAAO,CACVjI,MAAO,4BACPF,KAAM,oCACNM,OAAO,EACPF,MAAO,CACLsB,UAAW,iBAInB,EAEA,gBAAMkkB,CAAWR,GACflmB,KAAK8lB,gBAAiB,EACtB,UACQ9lB,KAAKiK,QAAQ,mBAAoB,CACrCob,SAAUa,EACVgB,cAAelnB,KAAK6kB,cAExB,CAAE,QACA7kB,KAAK8lB,gBAAiB,CACxB,CAEA9lB,KAAKiJ,OAAO,CACVnI,KAAO,QAAOolB,YACdhlB,MAAO,CACLsB,UAAW,kBAIfxC,KAAKgmB,aAAe,WACdhmB,KAAK8mB,SACb,EAEAL,gBAAAA,GACEzmB,KAAKuI,MAAM4e,aAAa1e,OACxBzI,KAAKke,WAAU,KACble,KAAKuI,MAAMye,YAAY3e,QACvBrI,KAAKuI,MAAMye,YAAY3B,SAAShC,OAAO,GAE3C,EAEAiD,uBAAAA,CAAwBJ,GACtBlmB,KAAKuI,MAAMkf,oBAAoBhf,OAC/BzI,KAAKke,WAAU,KACble,KAAKuI,MAAM6e,mBAAmB7B,SAASlC,QACvCrjB,KAAKgmB,aAAeE,EAAKb,QAAO,GAEpC,GAGFjlB,OAAAA,GACEJ,KAAK8mB,SACP,GC/OF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,URSA,IACEnkB,KAAM,WACNK,WAAY,CAAC0kB,YAAW,EAAEC,MAAK,GAAEC,MAAKA,GACtC1f,OAAQ,CAACC,EAAAA,GAETvF,MAAO,CACLkM,cAAe,CACb3L,KAAM4I,SAIVzI,IAAAA,GACE,MAAO,CACLqhB,YAAa,KACbE,aAAc,KAElB,EAEAllB,QAAS,CACP,aAAMmnB,GACJ9mB,KAAK6kB,aAAe7kB,KAAKmW,aAAa,iBACtCnW,KAAK2kB,kBAAoB3kB,KAAKiK,QAAQ,2BAA4B,CAACid,cAAelnB,KAAK6kB,cACzF,GAGFzkB,OAAAA,GACEJ,KAAK8mB,SACP,GStCF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAASlc,KAEpE,S,uBCTA,IAAIsC,EAAM,CACT,gBAAiB,CAChB,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAED,iBAAkB,CACjB,KACA,KACA,MAED,6BAA8B,CAC7B,KACA,MAED,mBAAoB,CACnB,KACA,KACA,MAED,uBAAwB,CACvB,KACA,KACA,MAED,0BAA2B,CAC1B,IACA,KACA,KAED,2BAA4B,CAC3B,KACA,KACA,MAED,mBAAoB,CACnB,KACA,KACA,MAED,yBAA0B,CACzB,KACA,KACA,MAED,mBAAoB,CACnB,KACA,KACA,IACA,KACA,KACA,MAED,kBAAmB,CAClB,KACA,KACA,MAED,qBAAsB,CACrB,MAED,gBAAiB,CAChB,KACA,KACA,KACA,MAED,mBAAoB,CACnB,KACA,KACA,KACA,KACA,MAED,gBAAiB,CAChB,KACA,KACA,IACA,KACA,KACA,KACA,MAED,kCAAmC,CAClC,KACA,MAED,uBAAwB,CACvB,KACA,KACA,IACA,KACA,KACA,KACA,KACA,MAED,mBAAoB,CACnB,KACA,KACA,IACA,KACA,KACA,KACA,KACA,MAED,yBAA0B,CACzB,KACA,KACA,IACA,KACA,KACA,KACA,KACA,MAED,mBAAoB,CACnB,KACA,KACA,IACA,KACA,KACA,KACA,KACA,MAED,gBAAiB,CAChB,KACA,KACA,IACA,KACA,MAED,sBAAuB,CACtB,KACA,KACA,IACA,KACA,KACA,MAED,mBAAoB,CACnB,KACA,KACA,IACA,KACA,KACA,MAED,wBAAyB,CACxB,KACA,KACA,KACA,MAED,uBAAwB,CACvB,KACA,KACA,IACA,KACA,KACA,MAED,mBAAoB,CACnB,KACA,KACA,KACA,MAED,mBAAoB,CACnB,MAED,gBAAiB,CAChB,IACA,KAED,kBAAmB,CAClB,KACA,KACA,KACA,MAED,cAAe,CACd,KACA,KACA,MAED,oBAAqB,CACpB,KACA,KACA,MAED,sBAAuB,CACtB,KACA,MAED,qBAAsB,CACrB,KACA,KACA,KACA,MAED,gBAAiB,CAChB,KACA,KACA,KACA,KACA,MAED,oBAAqB,CACpB,KACA,KACA,KACA,KACA,OAGF,SAAS2a,EAAoBC,GAC5B,IAAIC,EAAoBC,EAAE9a,EAAK4a,GAC9B,OAAOzU,QAAQiC,UAAUI,MAAK,WAC7B,IAAI1Q,EAAI,IAAIijB,MAAM,uBAAyBH,EAAM,KAEjD,MADA9iB,EAAEa,KAAO,mBACHb,CACP,IAGD,IAAIkjB,EAAMhb,EAAI4a,GAAMpnB,EAAKwnB,EAAI,GAC7B,OAAO7U,QAAQC,IAAI4U,EAAIzW,MAAM,GAAGvE,IAAI6a,EAAoB/iB,IAAI0Q,MAAK,WAChE,OAAOqS,EAAoBrnB,EAC5B,GACD,CACAmnB,EAAoB9gB,KAAO,WAAa,OAAO3B,OAAO2B,KAAKmG,EAAM,EACjE2a,EAAoBnnB,GAAK,KACzBynB,EAAOC,QAAUP,C,uBChPjB,IAAI3a,EAAM,CACT,mBAAoB,CACnB,KACA,MAED,iBAAkB,CACjB,IACA,KAED,oBAAqB,CACpB,KACA,KACA,KACA,MAED,mBAAoB,CACnB,KACA,KACA,MAED,0BAA2B,CAC1B,KACA,KACA,KACA,MAED,wBAAyB,CACxB,KACA,KACA,KACA,MAED,gBAAiB,CAChB,KACA,KACA,IACA,MAED,iBAAkB,CACjB,KACA,MAED,kBAAmB,CAClB,KACA,MAED,kBAAmB,CAClB,KACA,OAGF,SAAS2a,EAAoBC,GAC5B,IAAIC,EAAoBC,EAAE9a,EAAK4a,GAC9B,OAAOzU,QAAQiC,UAAUI,MAAK,WAC7B,IAAI1Q,EAAI,IAAIijB,MAAM,uBAAyBH,EAAM,KAEjD,MADA9iB,EAAEa,KAAO,mBACHb,CACP,IAGD,IAAIkjB,EAAMhb,EAAI4a,GAAMpnB,EAAKwnB,EAAI,GAC7B,OAAO7U,QAAQC,IAAI4U,EAAIzW,MAAM,GAAGvE,IAAI6a,EAAoB/iB,IAAI0Q,MAAK,WAChE,OAAOqS,EAAoBrnB,EAC5B,GACD,CACAmnB,EAAoB9gB,KAAO,WAAa,OAAO3B,OAAO2B,KAAKmG,EAAM,EACjE2a,EAAoBnnB,GAAK,KACzBynB,EAAOC,QAAUP,C,gvEClEbQ,EAA2B,CAAC,EAGhC,SAASN,EAAoBO,GAE5B,IAAIC,EAAeF,EAAyBC,GAC5C,QAAqB3iB,IAAjB4iB,EACH,OAAOA,EAAaH,QAGrB,IAAID,EAASE,EAAyBC,GAAY,CAGjDF,QAAS,CAAC,GAOX,OAHAI,EAAoBF,GAAUG,KAAKN,EAAOC,QAASD,EAAQA,EAAOC,QAASL,GAGpEI,EAAOC,OACf,CAGAL,EAAoBtO,EAAI+O,E,WCzBxB,IAAIE,EAAW,GACfX,EAAoBY,EAAI,SAASC,EAAQC,EAAUC,EAAIC,GACtD,IAAGF,EAAH,CAMA,IAAIG,EAAeC,IACnB,IAAS/d,EAAI,EAAGA,EAAIwd,EAAS9hB,OAAQsE,IAAK,CACrC2d,EAAWH,EAASxd,GAAG,GACvB4d,EAAKJ,EAASxd,GAAG,GACjB6d,EAAWL,EAASxd,GAAG,GAE3B,IAJA,IAGIge,GAAY,EACP5d,EAAI,EAAGA,EAAIud,EAASjiB,OAAQ0E,MACpB,EAAXyd,GAAsBC,GAAgBD,IAAa3jB,OAAO2B,KAAKghB,EAAoBY,GAAGQ,OAAM,SAAStoB,GAAO,OAAOknB,EAAoBY,EAAE9nB,GAAKgoB,EAASvd,GAAK,IAChKud,EAASO,OAAO9d,IAAK,IAErB4d,GAAY,EACTH,EAAWC,IAAcA,EAAeD,IAG7C,GAAGG,EAAW,CACbR,EAASU,OAAOle,IAAK,GACrB,IAAIme,EAAIP,SACEnjB,IAAN0jB,IAAiBT,EAASS,EAC/B,CACD,CACA,OAAOT,CArBP,CAJCG,EAAWA,GAAY,EACvB,IAAI,IAAI7d,EAAIwd,EAAS9hB,OAAQsE,EAAI,GAAKwd,EAASxd,EAAI,GAAG,GAAK6d,EAAU7d,IAAKwd,EAASxd,GAAKwd,EAASxd,EAAI,GACrGwd,EAASxd,GAAK,CAAC2d,EAAUC,EAAIC,EAwB/B,C,eC5BAhB,EAAoB7M,EAAI,SAASiN,GAChC,IAAImB,EAASnB,GAAUA,EAAOoB,WAC7B,WAAa,OAAOpB,EAAO,UAAY,EACvC,WAAa,OAAOA,CAAQ,EAE7B,OADAJ,EAAoBxO,EAAE+P,EAAQ,CAAE1P,EAAG0P,IAC5BA,CACR,C,eCPA,IACIE,EADAC,EAAWrkB,OAAOskB,eAAiB,SAAShc,GAAO,OAAOtI,OAAOskB,eAAehc,EAAM,EAAI,SAASA,GAAO,OAAOA,EAAIic,SAAW,EAQpI5B,EAAoBpP,EAAI,SAASrK,EAAOsb,GAEvC,GADU,EAAPA,IAAUtb,EAAQtO,KAAKsO,IAChB,EAAPsb,EAAU,OAAOtb,EACpB,GAAoB,kBAAVA,GAAsBA,EAAO,CACtC,GAAW,EAAPsb,GAAatb,EAAMib,WAAY,OAAOjb,EAC1C,GAAW,GAAPsb,GAAoC,oBAAftb,EAAMoH,KAAqB,OAAOpH,CAC5D,CACA,IAAIub,EAAKzkB,OAAO5B,OAAO,MACvBukB,EAAoBsB,EAAEQ,GACtB,IAAIC,EAAM,CAAC,EACXN,EAAiBA,GAAkB,CAAC,KAAMC,EAAS,CAAC,GAAIA,EAAS,IAAKA,EAASA,IAC/E,IAAI,IAAIM,EAAiB,EAAPH,GAAYtb,EAAyB,iBAAXyb,KAAyBP,EAAehY,QAAQuY,GAAUA,EAAUN,EAASM,GACxH3kB,OAAO4kB,oBAAoBD,GAASnX,SAAQ,SAAS/R,GAAOipB,EAAIjpB,GAAO,WAAa,OAAOyN,EAAMzN,EAAM,CAAG,IAI3G,OAFAipB,EAAI,WAAa,WAAa,OAAOxb,CAAO,EAC5CyZ,EAAoBxO,EAAEsQ,EAAIC,GACnBD,CACR,C,eCxBA9B,EAAoBxO,EAAI,SAAS6O,EAAS6B,GACzC,IAAI,IAAIppB,KAAOopB,EACXlC,EAAoBC,EAAEiC,EAAYppB,KAASknB,EAAoBC,EAAEI,EAASvnB,IAC5EuE,OAAO8kB,eAAe9B,EAASvnB,EAAK,CAAEspB,YAAY,EAAMC,IAAKH,EAAWppB,IAG3E,C,eCPAknB,EAAoBsC,EAAI,CAAC,EAGzBtC,EAAoB/iB,EAAI,SAASslB,GAChC,OAAOjX,QAAQC,IAAIlO,OAAO2B,KAAKghB,EAAoBsC,GAAG5c,QAAO,SAAS8c,EAAU1pB,GAE/E,OADAknB,EAAoBsC,EAAExpB,GAAKypB,EAASC,GAC7BA,CACR,GAAG,IACJ,C,eCPAxC,EAAoB5O,EAAI,SAASmR,GAEhC,MAAO,aAAeA,EAAU,IAAM,CAAC,GAAK,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,YAAYA,GAAW,KACn/D,C,eCHAvC,EAAoByC,SAAW,SAASF,GAEvC,MAAO,cAAgBA,EAAU,IAAM,CAAC,GAAK,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,KAAO,YAAYA,GAAW,MACl4C,C,eCJAvC,EAAoB0C,EAAI,WACvB,GAA0B,kBAAfC,WAAyB,OAAOA,WAC3C,IACC,OAAO1qB,MAAQ,IAAIwF,SAAS,cAAb,EAChB,CAAE,MAAOR,GACR,GAAsB,kBAAXnC,OAAqB,OAAOA,MACxC,CACA,CAPuB,E,eCAxBklB,EAAoBC,EAAI,SAASta,EAAKid,GAAQ,OAAOvlB,OAAOwlB,UAAUC,eAAepC,KAAK/a,EAAKid,EAAO,C,eCAtG,IAAIG,EAAa,CAAC,EACdC,EAAoB,aAExBhD,EAAoBiD,EAAI,SAAS9kB,EAAK+kB,EAAMpqB,EAAKypB,GAChD,GAAGQ,EAAW5kB,GAAQ4kB,EAAW5kB,GAAKf,KAAK8lB,OAA3C,CACA,IAAI9P,EAAQ+P,EACZ,QAAWvlB,IAAR9E,EAEF,IADA,IAAIsqB,EAAU/U,SAASnJ,qBAAqB,UACpC/B,EAAI,EAAGA,EAAIigB,EAAQvkB,OAAQsE,IAAK,CACvC,IAAIwO,EAAIyR,EAAQjgB,GAChB,GAAGwO,EAAE2I,aAAa,QAAUnc,GAAOwT,EAAE2I,aAAa,iBAAmB0I,EAAoBlqB,EAAK,CAAEsa,EAASzB,EAAG,KAAO,CACpH,CAEGyB,IACH+P,GAAa,EACb/P,EAAS/E,SAASgV,cAAc,UAEhCjQ,EAAOkQ,QAAU,QACjBlQ,EAAOnX,QAAU,IACb+jB,EAAoBuD,IACvBnQ,EAAOoQ,aAAa,QAASxD,EAAoBuD,IAElDnQ,EAAOoQ,aAAa,eAAgBR,EAAoBlqB,GAExDsa,EAAOjZ,IAAMgE,GAEd4kB,EAAW5kB,GAAO,CAAC+kB,GACnB,IAAIO,EAAmB,SAASC,EAAM5mB,GAErCsW,EAAO3U,QAAU2U,EAAOuQ,OAAS,KACjChmB,aAAa1B,GACb,IAAI2nB,EAAUb,EAAW5kB,GAIzB,UAHO4kB,EAAW5kB,GAClBiV,EAAOyQ,YAAczQ,EAAOyQ,WAAWC,YAAY1Q,GACnDwQ,GAAWA,EAAQ/Y,SAAQ,SAASkW,GAAM,OAAOA,EAAGjkB,EAAQ,IACzD4mB,EAAM,OAAOA,EAAK5mB,EACtB,EACIb,EAAUN,WAAW8nB,EAAiB7nB,KAAK,UAAMgC,EAAW,CAAExC,KAAM,UAAWsa,OAAQtC,IAAW,MACtGA,EAAO3U,QAAUglB,EAAiB7nB,KAAK,KAAMwX,EAAO3U,SACpD2U,EAAOuQ,OAASF,EAAiB7nB,KAAK,KAAMwX,EAAOuQ,QACnDR,GAAc9U,SAAS0V,KAAK5rB,YAAYib,EApCkB,CAqC3D,C,eCxCA4M,EAAoBsB,EAAI,SAASjB,GACX,qBAAX2D,QAA0BA,OAAOC,aAC1C5mB,OAAO8kB,eAAe9B,EAAS2D,OAAOC,YAAa,CAAE1d,MAAO,WAE7DlJ,OAAO8kB,eAAe9B,EAAS,aAAc,CAAE9Z,OAAO,GACvD,C,eCNAyZ,EAAoBjO,EAAI,G,eCAxB,GAAwB,qBAAb1D,SAAX,CACA,IAAI6V,EAAmB,SAAS3B,EAAS4B,EAAUC,EAAQ7W,EAASC,GACnE,IAAI6W,EAAUhW,SAASgV,cAAc,QAErCgB,EAAQC,IAAM,aACdD,EAAQjpB,KAAO,WACf,IAAImpB,EAAiB,SAASznB,GAG7B,GADAunB,EAAQ5lB,QAAU4lB,EAAQV,OAAS,KAChB,SAAf7mB,EAAM1B,KACTmS,QACM,CACN,IAAIiX,EAAY1nB,IAAyB,SAAfA,EAAM1B,KAAkB,UAAY0B,EAAM1B,MAChEqpB,EAAW3nB,GAASA,EAAM4Y,QAAU5Y,EAAM4Y,OAAOjO,MAAQ0c,EACzD7lB,EAAM,IAAI4hB,MAAM,qBAAuBqC,EAAU,cAAgBkC,EAAW,KAChFnmB,EAAIR,KAAO,wBACXQ,EAAIlD,KAAOopB,EACXlmB,EAAI4D,QAAUuiB,EACVJ,EAAQR,YAAYQ,EAAQR,WAAWC,YAAYO,GACvD7W,EAAOlP,EACR,CACD,EASA,OARA+lB,EAAQ5lB,QAAU4lB,EAAQV,OAASY,EACnCF,EAAQ5c,KAAO0c,EAEXC,EACHA,EAAOP,WAAWa,aAAaL,EAASD,EAAOO,aAE/CtW,SAAS0V,KAAK5rB,YAAYksB,GAEpBA,CACR,EACIO,EAAiB,SAASnd,EAAM0c,GAEnC,IADA,IAAIU,EAAmBxW,SAASnJ,qBAAqB,QAC7C/B,EAAI,EAAGA,EAAI0hB,EAAiBhmB,OAAQsE,IAAK,CAChD,IAAI2hB,EAAMD,EAAiB1hB,GACvB4hB,EAAWD,EAAIxK,aAAa,cAAgBwK,EAAIxK,aAAa,QACjE,GAAe,eAAZwK,EAAIR,MAAyBS,IAAatd,GAAQsd,IAAaZ,GAAW,OAAOW,CACrF,CACA,IAAIE,EAAoB3W,SAASnJ,qBAAqB,SACtD,IAAQ/B,EAAI,EAAGA,EAAI6hB,EAAkBnmB,OAAQsE,IAAK,CAC7C2hB,EAAME,EAAkB7hB,GACxB4hB,EAAWD,EAAIxK,aAAa,aAChC,GAAGyK,IAAatd,GAAQsd,IAAaZ,EAAU,OAAOW,CACvD,CACD,EACIG,EAAiB,SAAS1C,GAC7B,OAAO,IAAIjX,SAAQ,SAASiC,EAASC,GACpC,IAAI/F,EAAOuY,EAAoByC,SAASF,GACpC4B,EAAWnE,EAAoBjO,EAAItK,EACvC,GAAGmd,EAAend,EAAM0c,GAAW,OAAO5W,IAC1C2W,EAAiB3B,EAAS4B,EAAU,KAAM5W,EAASC,EACpD,GACD,EAEI0X,EAAqB,CACxB,KAAM,GAGPlF,EAAoBsC,EAAE6C,QAAU,SAAS5C,EAASC,GACjD,IAAI4C,EAAY,CAAC,GAAK,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,EAAE,KAAO,GAC7qBF,EAAmB3C,GAAUC,EAASplB,KAAK8nB,EAAmB3C,IACzB,IAAhC2C,EAAmB3C,IAAkB6C,EAAU7C,IACtDC,EAASplB,KAAK8nB,EAAmB3C,GAAW0C,EAAe1C,GAAS5U,MAAK,WACxEuX,EAAmB3C,GAAW,CAC/B,IAAG,SAAStlB,GAEX,aADOioB,EAAmB3C,GACpBtlB,CACP,IAEF,CAtE2C,C,eCK3C,IAAIooB,EAAkB,CACrB,KAAM,GAGPrF,EAAoBsC,EAAE/e,EAAI,SAASgf,EAASC,GAE1C,IAAI8C,EAAqBtF,EAAoBC,EAAEoF,EAAiB9C,GAAW8C,EAAgB9C,QAAW3kB,EACtG,GAA0B,IAAvB0nB,EAGF,GAAGA,EACF9C,EAASplB,KAAKkoB,EAAmB,SAEjC,GAAI,6GAA6GC,KAAKhD,GAyB/G8C,EAAgB9C,GAAW,MAzB8F,CAE/H,IAAIiD,EAAU,IAAIla,SAAQ,SAASiC,EAASC,GAAU8X,EAAqBD,EAAgB9C,GAAW,CAAChV,EAASC,EAAS,IACzHgV,EAASplB,KAAKkoB,EAAmB,GAAKE,GAGtC,IAAIrnB,EAAM6hB,EAAoBjO,EAAIiO,EAAoB5O,EAAEmR,GAEpDlpB,EAAQ,IAAI6mB,MACZuF,EAAe,SAAS3oB,GAC3B,GAAGkjB,EAAoBC,EAAEoF,EAAiB9C,KACzC+C,EAAqBD,EAAgB9C,GACX,IAAvB+C,IAA0BD,EAAgB9C,QAAW3kB,GACrD0nB,GAAoB,CACtB,IAAId,EAAY1nB,IAAyB,SAAfA,EAAM1B,KAAkB,UAAY0B,EAAM1B,MAChEsqB,EAAU5oB,GAASA,EAAM4Y,QAAU5Y,EAAM4Y,OAAOvb,IACpDd,EAAM8H,QAAU,iBAAmBohB,EAAU,cAAgBiC,EAAY,KAAOkB,EAAU,IAC1FrsB,EAAMuB,KAAO,iBACbvB,EAAM+B,KAAOopB,EACbnrB,EAAM6I,QAAUwjB,EAChBJ,EAAmB,GAAGjsB,EACvB,CAEF,EACA2mB,EAAoBiD,EAAE9kB,EAAKsnB,EAAc,SAAWlD,EAASA,EAC9D,CAGJ,EAUAvC,EAAoBY,EAAErd,EAAI,SAASgf,GAAW,OAAoC,IAA7B8C,EAAgB9C,EAAgB,EAGrF,IAAIoD,EAAuB,SAASC,EAA4BrqB,GAC/D,IAKIglB,EAAUgC,EALVzB,EAAWvlB,EAAK,GAChBsqB,EAActqB,EAAK,GACnBuqB,EAAUvqB,EAAK,GAGI4H,EAAI,EAC3B,GAAG2d,EAASiF,MAAK,SAASptB,GAAM,OAA+B,IAAxB0sB,EAAgB1sB,EAAW,IAAI,CACrE,IAAI4nB,KAAYsF,EACZ7F,EAAoBC,EAAE4F,EAAatF,KACrCP,EAAoBtO,EAAE6O,GAAYsF,EAAYtF,IAGhD,GAAGuF,EAAS,IAAIjF,EAASiF,EAAQ9F,EAClC,CAEA,IADG4F,GAA4BA,EAA2BrqB,GACrD4H,EAAI2d,EAASjiB,OAAQsE,IACzBof,EAAUzB,EAAS3d,GAChB6c,EAAoBC,EAAEoF,EAAiB9C,IAAY8C,EAAgB9C,IACrE8C,EAAgB9C,GAAS,KAE1B8C,EAAgB9C,GAAW,EAE5B,OAAOvC,EAAoBY,EAAEC,EAC9B,EAEImF,EAAqBplB,KAAK,yBAA2BA,KAAK,0BAA4B,GAC1FolB,EAAmBnb,QAAQ8a,EAAqB/pB,KAAK,KAAM,IAC3DoqB,EAAmB5oB,KAAOuoB,EAAqB/pB,KAAK,KAAMoqB,EAAmB5oB,KAAKxB,KAAKoqB,G,ICpFvF,IAAIC,EAAsBjG,EAAoBY,OAAEhjB,EAAW,CAAC,OAAO,WAAa,OAAOoiB,EAAoB,KAAO,IAClHiG,EAAsBjG,EAAoBY,EAAEqF,E","sources":["webpack://platypush/./src/bus.js","webpack://platypush/./src/App.vue","webpack://platypush/./src/components/elements/DropdownContainer.vue","webpack://platypush/./src/components/elements/DropdownContainer.vue?144d","webpack://platypush/./src/components/Notifications.vue","webpack://platypush/./src/components/Notification.vue","webpack://platypush/./src/components/Notification.vue?deb2","webpack://platypush/./src/components/Notifications.vue?e79f","webpack://platypush/./src/Events.vue","webpack://platypush/./src/Events.vue?0562","webpack://platypush/./src/components/VoiceAssistant.vue","webpack://platypush/./src/components/VoiceAssistant.vue?e102","webpack://platypush/./src/components/Ntfy.vue","webpack://platypush/./src/components/Ntfy.vue?4660","webpack://platypush/./src/components/Pushbullet.vue","webpack://platypush/./src/components/Pushbullet.vue?a5f8","webpack://platypush/./src/App.vue?7ccd","webpack://platypush/./src/views/Dashboard.vue","webpack://platypush/./src/components/widgets/Row.vue","webpack://platypush/./src/components/widgets/Row.vue?bc29","webpack://platypush/./src/components/widgets/Widget.vue","webpack://platypush/./src/components/widgets/Widget.vue?043c","webpack://platypush/./src/views/Dashboard.vue?040e","webpack://platypush/./src/views/NotFound.vue","webpack://platypush/./src/views/NotFound.vue?0aab","webpack://platypush/./src/views/Login.vue","webpack://platypush/./src/views/Login.vue?240b","webpack://platypush/./src/views/Register.vue","webpack://platypush/./src/views/Register.vue?157d","webpack://platypush/./src/views/Panel.vue","webpack://platypush/./src/components/Nav.vue","webpack://platypush/./src/components/Nav.vue?1f44","webpack://platypush/./src/views/Panel.vue?792f","webpack://platypush/./src/views/Plugin.vue","webpack://platypush/./src/views/Plugin.vue?41f6","webpack://platypush/./src/router/index.js","webpack://platypush/./src/registerServiceWorker.js","webpack://platypush/./src/main.js","webpack://platypush/./src/utils/Api.vue","webpack://platypush/./src/utils/Api.vue?331a","webpack://platypush/./src/utils/Clipboard.vue","webpack://platypush/./src/utils/Clipboard.vue?9589","webpack://platypush/./src/utils/Cookies.vue","webpack://platypush/./src/utils/Cookies.vue?0832","webpack://platypush/./src/utils/DateTime.vue","webpack://platypush/./src/utils/DateTime.vue?3df3","webpack://platypush/./src/utils/Events.vue","webpack://platypush/./src/utils/Events.vue?ad6c","webpack://platypush/./src/utils/Extensions.vue","webpack://platypush/./src/utils/Extensions.vue?43c9","webpack://platypush/./src/utils/Notification.vue","webpack://platypush/./src/utils/Notification.vue?b668","webpack://platypush/./src/utils/Screen.vue","webpack://platypush/./src/utils/Screen.vue?714e","webpack://platypush/./src/utils/Text.vue","webpack://platypush/./src/utils/Text.vue?61b3","webpack://platypush/./src/utils/Types.vue","webpack://platypush/./src/utils/Types.vue?2b41","webpack://platypush/./src/utils/Url.vue","webpack://platypush/./src/utils/Url.vue?5bd8","webpack://platypush/./src/Utils.vue","webpack://platypush/./src/Utils.vue?83c2","webpack://platypush/./src/components/Loading.vue","webpack://platypush/./src/components/Loading.vue?1ccf","webpack://platypush/./src/components/Modal.vue","webpack://platypush/./src/components/Modal.vue?db1b","webpack://platypush/./src/components/elements/ConfirmDialog.vue","webpack://platypush/./src/components/elements/ConfirmDialog.vue?f384","webpack://platypush/./src/components/elements/CopyButton.vue","webpack://platypush/./src/components/elements/CopyButton.vue?0778","webpack://platypush/./src/components/elements/Dropdown.vue","webpack://platypush/./src/components/elements/DropdownBody.vue","webpack://platypush/./src/components/elements/DropdownBody.vue?81f6","webpack://platypush/./src/components/elements/Dropdown.vue?e934","webpack://platypush/./src/components/elements/DropdownItem.vue","webpack://platypush/./src/components/elements/DropdownItem.vue?d591","webpack://platypush/./src/components/elements/ExtensionIcon.vue","webpack://platypush/./src/components/elements/ExtensionIcon.vue?84d5","webpack://platypush/./src/components/elements/FloatingButton.vue","webpack://platypush/./src/components/elements/FloatingButton.vue?d72c","webpack://platypush/./src/components/elements/Icon.vue","webpack://platypush/./src/components/elements/Icon.vue?fdba","webpack://platypush/./src/components/elements/RestartButton.vue","webpack://platypush/./src/components/elements/RestartButton.vue?09f3","webpack://platypush/./src/components/elements/Tab.vue","webpack://platypush/./src/components/elements/Tab.vue?4544","webpack://platypush/./src/components/elements/Tabs.vue","webpack://platypush/./src/components/elements/Tabs.vue?2d79","webpack://platypush/./src/components/panels/Extensions/Index.vue","webpack://platypush/./src/components/panels/Extensions/Extension.vue","webpack://platypush/./src/components/panels/Extensions/Config.vue","webpack://platypush/./src/components/panels/Extensions/Config.vue?f0c1","webpack://platypush/./src/components/panels/Extensions/Doc.vue","webpack://platypush/./src/components/panels/Extensions/Doc.vue?b066","webpack://platypush/./src/components/panels/Extensions/Install.vue","webpack://platypush/./src/components/panels/Extensions/Install.vue?ceca","webpack://platypush/./src/components/panels/Extensions/Extension.vue?4949","webpack://platypush/./src/components/panels/Extensions/Index.vue?7d84","webpack://platypush/./src/components/panels/Settings/Index.vue","webpack://platypush/./src/components/panels/Settings/Application.vue","webpack://platypush/./src/components/elements/StopButton.vue","webpack://platypush/./src/components/elements/StopButton.vue?3081","webpack://platypush/./src/components/panels/Settings/Application.vue?ae3e","webpack://platypush/./src/components/panels/Settings/Token.vue","webpack://platypush/./src/components/panels/Settings/Token.vue?4a12","webpack://platypush/./src/components/panels/Settings/Users.vue","webpack://platypush/./src/components/panels/Settings/Users.vue?407b","webpack://platypush/./src/components/panels/Settings/Index.vue?0df9","webpack://platypush/./src/components/panels/ lazy ^\\.\\/.*\\/Index$ namespace object","webpack://platypush/./src/components/widgets/ lazy ^\\.\\/.*\\/Index$ namespace object","webpack://platypush/webpack/bootstrap","webpack://platypush/webpack/runtime/chunk loaded","webpack://platypush/webpack/runtime/compat get default export","webpack://platypush/webpack/runtime/create fake namespace object","webpack://platypush/webpack/runtime/define property getters","webpack://platypush/webpack/runtime/ensure chunk","webpack://platypush/webpack/runtime/get javascript chunk filename","webpack://platypush/webpack/runtime/get mini-css chunk filename","webpack://platypush/webpack/runtime/global","webpack://platypush/webpack/runtime/hasOwnProperty shorthand","webpack://platypush/webpack/runtime/load script","webpack://platypush/webpack/runtime/make namespace object","webpack://platypush/webpack/runtime/publicPath","webpack://platypush/webpack/runtime/css loading","webpack://platypush/webpack/runtime/jsonp chunk loading","webpack://platypush/webpack/startup"],"sourcesContent":["import mitt from 'mitt'\n\nconst bus = mitt()\n\nbus.publishEntity = (entity) => {\n bus.emit('entity-update', entity)\n}\n\nbus.onEntity = (callback) => {\n bus.on('entity-update', callback)\n}\n\nbus.publishNotification = (notification) => {\n bus.emit('notification-create', notification)\n}\n\nbus.onNotification = (callback) => {\n bus.on('notification-create', callback)\n}\n\nexport { bus }\n","<template>\n <Events ref=\"events\" v-if=\"hasWebsocket\" />\n <Notifications ref=\"notifications\" />\n <VoiceAssistant ref=\"voice-assistant\" v-if=\"hasAssistant\" />\n <Pushbullet ref=\"pushbullet\" v-if=\"hasPushbullet\" />\n <Ntfy ref=\"ntfy\" v-if=\"hasNtfy\" />\n <ConfirmDialog ref=\"pwaDialog\" @input=\"installPWA\">\n Would you like to install this application locally?\n </ConfirmDialog>\n\n <DropdownContainer />\n <router-view />\n</template>\n\n<script>\nimport ConfirmDialog from \"@/components/elements/ConfirmDialog\";\nimport DropdownContainer from \"@/components/elements/DropdownContainer\";\nimport Notifications from \"@/components/Notifications\";\nimport Utils from \"@/Utils\";\nimport Events from \"@/Events\";\nimport VoiceAssistant from \"@/components/VoiceAssistant\";\nimport Ntfy from \"@/components/Ntfy\";\nimport Pushbullet from \"@/components/Pushbullet\";\nimport { bus } from \"@/bus\";\n\nexport default {\n mixins: [Utils],\n components: {\n ConfirmDialog,\n DropdownContainer,\n Events,\n Notifications,\n Ntfy,\n Pushbullet,\n VoiceAssistant,\n },\n\n data() {\n return {\n config: {},\n userAuthenticated: false,\n connected: false,\n pwaInstallEvent: null,\n }\n },\n\n computed: {\n hasWebsocket() {\n return this.userAuthenticated &&\n 'backend.http' in this.config\n },\n\n hasAssistant() {\n return this.hasWebsocket\n },\n\n hasPushbullet() {\n return this.hasWebsocket && (\n 'pushbullet' in this.config ||\n 'backend.pushbullet' in this.config\n )\n },\n\n hasNtfy() {\n return this.hasWebsocket && 'ntfy' in this.config\n },\n },\n\n methods: {\n onNotification(notification) {\n this.$refs.notifications.create(notification)\n },\n\n async initConfig() {\n this.config = await this.request('config.get', {}, 60000, false)\n this.userAuthenticated = true\n },\n\n installPWA() {\n if (this.pwaInstallEvent)\n this.pwaInstallEvent.prompt()\n\n this.$refs.pwaDialog.close()\n }\n },\n\n created() {\n this.initConfig()\n },\n\n beforeMount() {\n if (this.getCookie('pwa-dialog-shown')?.length)\n return\n\n window.addEventListener('beforeinstallprompt', (e) => {\n e.preventDefault()\n this.pwaInstallEvent = e\n this.$refs.pwaDialog.show()\n\n this.setCookie('pwa-dialog-shown', '1', {\n expires: new Date(new Date().getTime() + 365 * 24 * 60 * 60 * 1000)\n })\n })\n },\n\n mounted() {\n bus.onNotification(this.onNotification)\n bus.on('connect', () => this.connected = true)\n bus.on('disconnect', () => this.connected = false)\n },\n}\n</script>\n\n<style lang=\"scss\">\n$fa-font-path: \"~@fortawesome/fontawesome-free/webfonts\";\n@import \"~@fortawesome/fontawesome-free/scss/fontawesome\";\n@import \"~@fortawesome/fontawesome-free/scss/solid\"; // fas\n@import \"~@fortawesome/fontawesome-free/scss/regular\"; // far\n@import \"~@fortawesome/fontawesome-free/scss/brands\"; // fab\n\nhtml, body {\n width: 100%;\n height: 100%;\n margin: 0;\n overflow: auto;\n}\n\n#app {\n font-family: BlinkMacSystemFont,-apple-system,Avenir,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Verdana,Arial,sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n width: 100%;\n height: 100%;\n color: #2c3e50;\n}\n</style>\n","<template>\n <div class=\"dropdown-container\" />\n</template>\n\n<script>\nimport { bus } from \"@/bus\";\n\nexport default {\n methods: {\n onOpen(component) {\n if (!component?.$el)\n return\n\n if (!component.keepOpenOnItemClick)\n this.onClose()\n\n this.$el.appendChild(component.$el)\n },\n\n onClose() {\n this.$el.innerHTML = ''\n },\n },\n\n mounted() {\n bus.on('dropdown-open', this.onOpen)\n bus.on('dropdown-close', this.onClose)\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.dropdown-container {\n :deep(.dropdown) {\n border: $default-border-2;\n }\n}\n</style>\n","import { render } from \"./DropdownContainer.vue?vue&type=template&id=c190f656&scoped=true\"\nimport script from \"./DropdownContainer.vue?vue&type=script&lang=js\"\nexport * from \"./DropdownContainer.vue?vue&type=script&lang=js\"\n\nimport \"./DropdownContainer.vue?vue&type=style&index=0&id=c190f656&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-c190f656\"]])\n\nexport default __exports__","<template>\n <div class=\"notifications\">\n <Notification v-for=\"(notification, id, index) in notifications\"\n :key=\"index\"\n :id=\"id\"\n :text=\"notification.text\"\n :html=\"notification.html\"\n :title=\"notification.title\"\n :link=\"notification.link\"\n :image=\"notification.image\"\n :warning=\"notification.warning\"\n :error=\"notification.error\"\n @clicked=\"destroy\">\n </Notification>\n </div>\n</template>\n\n<script>\nimport Notification from \"@/components/Notification\";\n\nexport default {\n name: \"Notifications\",\n components: {Notification},\n props: {\n duration: {\n // Default notification duration in milliseconds\n type: Number,\n default: 10000,\n }\n },\n\n data: function() {\n return {\n index: 0,\n notifications: {},\n timeouts: {},\n };\n },\n\n methods: {\n create: function(args) {\n const id = this.index++;\n this.notifications[id] = args;\n\n if (args.duration == null) {\n args.duration = this.duration;\n }\n\n const duration = args.duration ? parseInt(args.duration) : 0;\n if (duration) {\n this.timeouts[id] = setTimeout(this.destroy.bind(null, id), duration);\n }\n },\n\n destroy: function(id) {\n delete this.notifications[id];\n delete this.timeouts[id];\n },\n },\n}\n</script>\n\n<style scoped>\n.notifications {\n position: fixed;\n bottom: 0;\n right: 0;\n width: 25em;\n z-index: 1000;\n}\n</style>","<template>\n <div class=\"notification fade-in\" :class=\"{warning: warning, error: error}\" @click=\"clicked\">\n <div class=\"title\" v-if=\"title\" v-text=\"title\"></div>\n <div class=\"body\">\n <div class=\"image col-3\" v-if=\"image || warning || error\">\n <div class=\"row\">\n <img :src=\"image.src\" v-if=\"image && image.src\" alt=\"\">\n <i :class=\"['fa', 'fa-' + image.icon]\" :style=\"image.color ? '--color: ' + image.color : ''\"\n v-else-if=\"image && image.icon\"></i>\n <i :class=\"image.iconClass\" :style=\"image.color ? '--color: ' + image.color : ''\"\n v-else-if=\"image && image.iconClass\"></i>\n <i class=\"fa fa-exclamation\" v-else-if=\"warning\"></i>\n <i class=\"fa fa-times\" v-else-if=\"error\"></i>\n </div>\n </div>\n <div class=\"text col-9\" v-if=\"text && !!image\" v-text=\"text\"></div>\n <div class=\"text col-9\" v-if=\"html && !!image\" v-html=\"html\"></div>\n <div class=\"text row horizontal-center\" v-if=\"text && !image\" v-text=\"text\"></div>\n <div class=\"text row horizontal-center\" v-if=\"html && !image\" v-html=\"html\"></div>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n name: \"Notification\",\n props: ['id','text','html','title','image','link','error','warning'],\n\n methods: {\n clicked() {\n if (this.link) {\n window.open(this.link, '_blank');\n }\n\n this.$emit('clicked', this.id);\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.notification {\n background: $notification-bg;\n border: $notification-border;\n border-radius: 1em;\n margin-bottom: 0.25em !important;\n margin-right: 0.1em;\n padding: 0.5em;\n cursor: pointer;\n\n &:hover {\n background: $notification-hover-bg;\n &.warning { background: $notification-warning-hover-bg; }\n &.error { background: $notification-error-hover-bg; }\n }\n\n &.warning {\n background: $notification-warning-bg;\n border: $notification-warning-border;\n .image { --color: $notification-warning-icon-color; }\n }\n\n &.error {\n background: $notification-error-bg;\n border: $notification-error-border;\n .image { --color: $notification-error-icon-color; }\n }\n\n .title {\n color: $notification-title-fg;\n font-size: 1.25em;\n font-weight: normal;\n margin: 0.25em 0;\n padding: 0;\n letter-spacing: 0.07em;\n }\n\n .body {\n @extend .vertical-center;\n height: 6em;\n overflow: hidden;\n padding-bottom: 0.1em;\n letter-spacing: 0.05em;\n }\n\n .image {\n height: 100%;\n text-align: center;\n --color: $notification-icon-color;\n\n .row {\n @extend .vertical-center;\n @extend .horizontal-center;\n width: 100%;\n height: 100%;\n\n .fa {\n font-size: 2.5em;\n color: var(--color);\n }\n\n img {\n width: 80%;\n height: 80%;\n }\n }\n }\n}\n</style>","import { render } from \"./Notification.vue?vue&type=template&id=7646705e&scoped=true\"\nimport script from \"./Notification.vue?vue&type=script&lang=js\"\nexport * from \"./Notification.vue?vue&type=script&lang=js\"\n\nimport \"./Notification.vue?vue&type=style&index=0&id=7646705e&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7646705e\"]])\n\nexport default __exports__","import { render } from \"./Notifications.vue?vue&type=template&id=6dc8bebc&scoped=true\"\nimport script from \"./Notifications.vue?vue&type=script&lang=js\"\nexport * from \"./Notifications.vue?vue&type=script&lang=js\"\n\nimport \"./Notifications.vue?vue&type=style&index=0&id=6dc8bebc&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6dc8bebc\"]])\n\nexport default __exports__","<template>\n <div/>\n</template>\n\n<script>\nimport { bus } from \"@/bus\";\n\nexport default {\n name: \"Events\",\n\n data() {\n return {\n ws: null,\n initialized: false,\n pending: false,\n opened: false,\n timeout: null,\n reconnectMsecs: 1000,\n minReconnectMsecs: 1000,\n maxReconnectMsecs: 30000,\n handlers: {},\n handlerNameToEventTypes: {},\n }\n },\n\n methods: {\n onWebsocketTimeout() {\n console.log('Websocket reconnection timed out, retrying')\n this.reconnectMsecs = Math.min(this.reconnectMsecs * 2, this.maxReconnectMsecs)\n this.pending = false\n if (this.ws)\n this.ws.close()\n\n this.onClose()\n },\n\n onMessage(event) {\n const handlers = []\n event = event.data\n\n if (typeof event === 'string') {\n try {\n event = JSON.parse(event)\n } catch (e) {\n console.warn('Received invalid non-JSON event')\n console.warn(event)\n }\n }\n\n console.debug(event)\n if (event.type !== 'event') {\n // Discard non-event messages\n return\n }\n\n if (null in this.handlers) { // lgtm [js/implicit-operand-conversion]\n handlers.push(this.handlers[null]) // lgtm [js/implicit-operand-conversion]\n }\n\n if (event.args.type in this.handlers) {\n handlers.push(...Object.values(this.handlers[event.args.type]))\n }\n\n for (let handler of handlers) {\n if (!handler)\n continue\n\n if (handler instanceof Array)\n handler = handler[0]\n else if (handler instanceof Object && !(handler instanceof Function))\n handler = Object.values(handler)[0]\n\n handler(event.args)\n }\n },\n\n onOpen() {\n if (this.opened) {\n console.log(\"There's already an opened websocket connection, closing the newly opened one\")\n if (this.ws) {\n this.ws.onclose = () => {}\n this.ws.close()\n }\n }\n\n console.log('Websocket connection successful')\n this.opened = true\n this.reconnectMsecs = this.minReconnectMsecs\n\n if (this.pending) {\n this.pending = false\n }\n\n if (this.timeout) {\n clearTimeout(this.timeout)\n this.timeout = undefined\n }\n },\n\n onError(error) {\n console.error('Websocket error')\n console.error(error)\n },\n\n onClose(event) {\n if (event) {\n console.log(\n `Websocket closed - code: ${event.code} - reason: ${event.reason}. ` +\n `Retrying in ${this.reconnectMsecs / 1000}s`\n )\n }\n\n this.opened = false\n\n if (!this.pending) {\n this.pending = true\n this.init()\n }\n },\n\n init() {\n try {\n const protocol = location.protocol === 'https:' ? 'wss' : 'ws'\n const url = `${protocol}://${location.host}/ws/events`\n this.ws = new WebSocket(url)\n } catch (err) {\n console.error('Websocket initialization error')\n console.error(err)\n return\n }\n\n this.pending = true\n this.timeout = setTimeout(this.onWebsocketTimeout, this.reconnectMsecs)\n this.ws.onmessage = this.onMessage\n this.ws.onopen = this.onOpen\n this.ws.onerror = this.onError\n this.ws.onclose = this.onClose\n this.initialized = true\n },\n\n subscribe(msg) {\n const handler = msg.handler\n const events = msg.events.length ? msg.events : [null]\n const handlerName = msg.handlerName\n\n for (const event of events) {\n if (!(event in this.handlers)) {\n this.handlers[event] = {}\n }\n\n if (!(handlerName in this.handlerNameToEventTypes)) {\n this.handlerNameToEventTypes[handlerName] = events\n }\n\n this.handlers[event][handlerName] = handler\n }\n\n return () => {\n this.unsubscribe(handlerName)\n }\n },\n\n unsubscribe(handlerName) {\n const events = this.handlerNameToEventTypes[handlerName]\n if (!events)\n return\n\n for (const event of events) {\n if (!this.handlers[event]?.[handlerName])\n continue\n\n delete this.handlers[event][handlerName]\n if (!Object.keys(this.handlers[event]).length)\n delete this.handlers[event]\n }\n\n delete this.handlerNameToEventTypes[handlerName]\n },\n },\n\n created() {\n bus.on('subscribe', this.subscribe)\n bus.on('unsubscribe', this.unsubscribe)\n\n this.$watch('opened', (open) => {\n bus.emit(open ? 'connect' : 'disconnect')\n })\n\n this.init()\n },\n}\n</script>\n","import { render } from \"./Events.vue?vue&type=template&id=11b5ca2a\"\nimport script from \"./Events.vue?vue&type=script&lang=js\"\nexport * from \"./Events.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <div class=\"assistant-modal\">\n <Modal ref=\"assistantModal\">\n <div class=\"icon\">\n <i class=\"fa fa-bell\" v-if=\"state.alerting\"></i>\n <i class=\"fa fa-volume-up\" v-else-if=\"state.responding\"></i>\n <i class=\"fa fa-comment-dots\" v-else-if=\"state.speechRecognized\"></i>\n <i class=\"fa fa-microphone\" v-else></i>\n </div>\n\n <div class=\"text\">\n <div class=\"listening\" v-if=\"state.listening\">\n <span>Assistant listening</span>\n </div>\n <div class=\"speech-recognized\" v-else-if=\"state.speechRecognized\">\n <span v-text=\"phrase\"></span>\n </div>\n <div class=\"responding\" v-else-if=\"state.responding\">\n <span v-text=\"responseText\"></span>\n </div>\n </div>\n </Modal>\n </div>\n</template>\n\n<script>\nimport Modal from \"@/components/Modal\";\nimport Utils from \"@/Utils\";\n\nexport default {\n name: \"VoiceAssistant\",\n components: {Modal},\n mixins: [Utils],\n\n data() {\n return {\n responseText: '',\n phrase: '',\n hideTimeout: undefined,\n\n state: {\n listening: false,\n speechRecognized: false,\n responding: false,\n alerting: false,\n },\n };\n },\n\n methods: {\n reset() {\n this.state.listening = false\n this.state.speechRecognized = false\n this.state.responding = false\n this.state.alerting = false\n this.phrase = ''\n this.responseText = ''\n },\n\n conversationStart() {\n this.reset()\n this.state.listening = true\n this.$refs.assistantModal.show()\n\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout)\n this.hideTimeout = undefined\n }\n },\n\n conversationEnd() {\n const self = this\n\n this.hideTimeout = setTimeout(() => {\n this.reset()\n self.$refs.assistantModal.close()\n self.hideTimeout = undefined\n }, 4000)\n },\n\n speechRecognized(event) {\n this.reset()\n this.state.speechRecognized = true\n this.phrase = event.phrase\n this.$refs.assistantModal.show()\n },\n\n response(event) {\n this.reset()\n this.state.responding = true\n this.responseText = event.response_text\n this.$refs.assistantModal.show()\n },\n\n alertOn() {\n this.reset()\n this.state.alerting = true\n this.$refs.assistantModal.show()\n },\n\n alertOff() {\n this.reset()\n this.state.alerting = false\n this.$refs.assistantModal.close()\n },\n\n registerHandlers() {\n this.subscribe(this.conversationStart, null, 'platypush.message.event.assistant.ConversationStartEvent')\n this.subscribe(this.alertOn, null, 'platypush.message.event.assistant.AlertStartedEvent')\n this.subscribe(this.alertOff, null, 'platypush.message.event.assistant.AlertEndEvent')\n this.subscribe(this.speechRecognized, null, 'platypush.message.event.assistant.SpeechRecognizedEvent')\n this.subscribe(this.response, null, 'platypush.message.event.assistant.ResponseEvent')\n this.subscribe(this.conversationEnd, null,\n 'platypush.message.event.assistant.ConversationEndEvent',\n 'platypush.message.event.assistant.NoResponseEvent',\n 'platypush.message.event.assistant.ConversationTimeoutEvent')\n },\n },\n\n mounted() {\n this.registerHandlers()\n },\n}\n</script>\n\n<style lang=\"scss\">\n$icon-color: #7e8;\n$icon-border: 1px solid #ccc;\n$icon-shadow: 2px 2px 2px #ccc;\n\n.assistant-modal {\n .modal {\n .body {\n width: 50vw;\n height: 50vh;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n text-align: center;\n\n .icon {\n font-size: 3em;\n color: $icon-color;\n box-shadow: $icon-shadow;\n border: $icon-border;\n border-radius: 3em;\n padding: 1em;\n }\n\n .text {\n margin-top: 2.5em;\n }\n }\n }\n}\n</style>\n","import { render } from \"./VoiceAssistant.vue?vue&type=template&id=3f009270\"\nimport script from \"./VoiceAssistant.vue?vue&type=script&lang=js\"\nexport * from \"./VoiceAssistant.vue?vue&type=script&lang=js\"\n\nimport \"./VoiceAssistant.vue?vue&type=style&index=0&id=3f009270&lang=scss\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <div />\n</template>\n\n<script>\nimport Utils from \"@/Utils\";\n\nexport default {\n name: \"Ntfy\",\n mixins: [Utils],\n\n methods: {\n onMessage(event) {\n this.notify({\n title: event.title,\n text: event.message,\n image: {\n icon: 'bell',\n },\n })\n },\n },\n\n mounted() {\n this.subscribe(this.onMessage, null, 'platypush.message.event.ntfy.NotificationEvent')\n },\n}\n</script>\n","import { render } from \"./Ntfy.vue?vue&type=template&id=1c4a4708\"\nimport script from \"./Ntfy.vue?vue&type=script&lang=js\"\nexport * from \"./Ntfy.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <div />\n</template>\n\n<script>\nimport Utils from \"@/Utils\";\n\nexport default {\n mixins: [Utils],\n\n methods: {\n onMessage(event) {\n this.notify({\n title: event.title,\n text: event.body,\n image: {\n src: event.icon ? 'data:image/png;base64, ' + event.icon : undefined,\n icon: event.icon ? undefined : 'bell',\n },\n })\n },\n },\n\n mounted() {\n this.subscribe(\n this.onMessage,\n null,\n 'platypush.message.event.pushbullet.PushbulletNotificationEvent'\n )\n },\n}\n</script>\n","import { render } from \"./Pushbullet.vue?vue&type=template&id=75b0ae60\"\nimport script from \"./Pushbullet.vue?vue&type=script&lang=js\"\nexport * from \"./Pushbullet.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./App.vue?vue&type=template&id=eb834402\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport \"./App.vue?vue&type=style&index=0&id=eb834402&lang=scss\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <Loading v-if=\"loading\" />\n\n <div id=\"dashboard\" class=\"col-12\" :class=\"classes\" :style=\"style\">\n <Row v-for=\"(row, i) in rows\" :key=\"i\" :class=\"row.class\" :style=\"row.style\">\n <keep-alive v-for=\"(widget, j) in row.widgets\" :key=\"j\">\n <Widget :style=\"widget.style\" :class=\"widget.class\">\n <component :is=\"widget.component\" v-bind=\"getWidgetProps(widget)\" />\n </Widget>\n </keep-alive>\n </Row>\n </div>\n</template>\n\n<script>\nimport { defineAsyncComponent, shallowRef } from 'vue'\nimport Utils from '@/Utils'\nimport Loading from \"@/components/Loading\";\nimport Row from \"@/components/widgets/Row\";\nimport Widget from \"@/components/widgets/Widget\";\n\nexport default {\n name: 'Dashboard',\n mixins: [Utils],\n components: {Widget, Loading, Row},\n props: {\n // Refresh interval in seconds.\n refreshSeconds: {\n type: Number,\n required: false,\n default: 0,\n },\n },\n\n data() {\n return {\n rows: [],\n loading: false,\n style: undefined,\n class: undefined,\n }\n },\n\n computed: {\n classes() {\n return this.class\n },\n\n _refreshSeconds() {\n return parseFloat(this.refreshSeconds) || 0\n },\n },\n\n methods: {\n getWidgetProps(widget) {\n const props = {...widget.props}\n if (props.class)\n delete props.class\n\n return props\n },\n\n parseTemplate(tmpl) {\n const node = new DOMParser().parseFromString(tmpl, 'text/xml').childNodes[0]\n const self = this\n this.style = node.attributes.style?.nodeValue\n this.class = node.attributes.class?.nodeValue\n\n this.rows = [...node.getElementsByTagName('Row')].map((row) => {\n return {\n style: row.attributes.style?.nodeValue,\n class: row.attributes.class?.nodeValue,\n widgets: [...row.children].map((el) => {\n const component = shallowRef(\n defineAsyncComponent(\n () => import(`@/components/widgets/${el.nodeName}/Index`)\n )\n )\n\n const style = el.attributes.style?.nodeValue\n const classes = el.attributes.class?.nodeValue\n const attrs = [...el.attributes].reduce((obj, node) => {\n if (node.nodeName !== 'style') {\n obj[node.nodeName] = node.nodeValue\n }\n\n return obj\n }, {\n content: el.innerHTML,\n })\n\n const widget = {\n component: component,\n style: style,\n class: classes,\n props: attrs || {},\n }\n\n self.$options.components[el.nodeName] = component\n return widget\n })\n }\n })\n\n this.loading = false\n },\n\n async refreshDashboard() {\n this.loading = true\n this.widgets = []\n const name = this.$route.params.name\n const template = (await this.request('config.get_dashboard', { name: name }))\n\n if (!template) {\n this.notifyError(`Dashboard ${name} not found`)\n }\n\n this.parseTemplate(template)\n },\n },\n\n mounted() {\n this.refreshDashboard()\n if (this._refreshSeconds) {\n const self = this\n setInterval(() => {\n self.refreshDashboard()\n }, parseInt((this._refreshSeconds*1000).toFixed(0)))\n }\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"~lato-font/scss/public-api\";\n$lato-font-path: \"~lato-font/fonts\";\n\n@include lato-include-font('medium');\n\n#dashboard {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 1em 1em 0 1em;\n background: $dashboard-bg;\n background-size: cover;\n font-family: Lato, proxima-nova, Helvetica Neue, Arial, sans-serif;\n\n .blurred {\n filter: blur(0.075em);\n }\n}\n</style>\n\n<style>\nhtml {\n overflow: auto !important;\n}\n</style>\n","<template>\n <div class=\"row\" :class=\"classes\" :style=\"style\">\n <slot />\n </div>\n</template>\n\n<script>\nexport default {\n name: \"Row\",\n props: {\n // Class override\n class: {\n type: String,\n required: false,\n default: '',\n },\n\n // Style override\n style: {\n type: String,\n required: false,\n default: '',\n },\n },\n\n computed: {\n classes() {\n return this.class\n },\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.row {\n width: 100%;\n height: 49%;\n\n &:not(:last-child) {\n margin-bottom: 1%;\n }\n}\n</style>\n","import { render } from \"./Row.vue?vue&type=template&id=1b4663f2&scoped=true\"\nimport script from \"./Row.vue?vue&type=script&lang=js\"\nexport * from \"./Row.vue?vue&type=script&lang=js\"\n\nimport \"./Row.vue?vue&type=style&index=0&id=1b4663f2&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1b4663f2\"]])\n\nexport default __exports__","<template>\n <div :style=\"style\" :class=\"classes\">\n <slot />\n </div>\n</template>\n\n<script>\nexport default {\n name: \"Widget\",\n props: {\n // Widget style override\n style: {\n type: String,\n required: false,\n default: '',\n },\n\n // Widget class override\n class: {\n type: String,\n required: false,\n default: '',\n },\n },\n\n computed: {\n classes() {\n return (this.class?.length ? this.class.split(' ') : ['col-3']).concat(['widget', 'column'])\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.widget {\n height: calc(100% - 1em);\n background: $background-color;\n border-radius: 5px;\n display: flex;\n justify-content: center;\n align-content: center;\n position: relative;\n overflow: hidden;\n box-shadow: 0 3px 3px 0 rgba(0,0,0,0.16), 0 0 0 1px rgba(0,0,0,0.08);\n}\n</style>\n","import { render } from \"./Widget.vue?vue&type=template&id=5df52982&scoped=true\"\nimport script from \"./Widget.vue?vue&type=script&lang=js\"\nexport * from \"./Widget.vue?vue&type=script&lang=js\"\n\nimport \"./Widget.vue?vue&type=style&index=0&id=5df52982&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5df52982\"]])\n\nexport default __exports__","import { render } from \"./Dashboard.vue?vue&type=template&id=462fad8c&scoped=true\"\nimport script from \"./Dashboard.vue?vue&type=script&lang=js\"\nexport * from \"./Dashboard.vue?vue&type=script&lang=js\"\n\nimport \"./Dashboard.vue?vue&type=style&index=0&id=462fad8c&lang=scss&scoped=true\"\nimport \"./Dashboard.vue?vue&type=style&index=1&id=462fad8c&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-462fad8c\"]])\n\nexport default __exports__","<template>\n <h1>Object not found</h1>\n</template>\n\n<script>\nexport default {\n name: \"NotFound\"\n}\n</script>\n\n","import { render } from \"./NotFound.vue?vue&type=template&id=49501f4d\"\nimport script from \"./NotFound.vue?vue&type=script&lang=js\"\nexport * from \"./NotFound.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <div class=\"login-container\">\n <form class=\"login\" method=\"POST\">\n <div class=\"header\">\n <span class=\"logo\">\n <img src=\"/logo.svg\" alt=\"logo\" />\n </span>\n <span class=\"text\">Platypush</span>\n </div>\n\n <div class=\"row\">\n <label>\n <input type=\"text\" name=\"username\" placeholder=\"Username\">\n </label>\n </div>\n\n <div class=\"row\">\n <label>\n <input type=\"password\" name=\"password\" placeholder=\"Password\">\n </label>\n </div>\n\n <div class=\"row\" v-if=\"_register\">\n <label>\n <input type=\"password\" name=\"confirm_password\" placeholder=\"Confirm password\">\n </label>\n </div>\n\n <div class=\"row buttons\">\n <input type=\"submit\" class=\"btn btn-primary\" :value=\"_register ? 'Register' : 'Login'\">\n </div>\n\n <div class=\"row pull-right\">\n <label class=\"checkbox\">\n <input type=\"checkbox\" name=\"remember\">&nbsp;\n Keep me logged in on this device &nbsp;\n </label>\n </div>\n </form>\n </div>\n</template>\n\n<script>\nimport Utils from \"@/Utils\";\n\nexport default {\n name: \"Login\",\n mixins: [Utils],\n props: {\n // Set to true for a registration form, false for a login form\n register: {\n type: Boolean,\n required: false,\n default: false,\n },\n },\n\n computed: {\n _register() {\n return this.parseBoolean(this.register)\n },\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\nbody {\n width: 100vw;\n height: 100vh;\n margin: 0;\n}\n\n.login-container {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: $default-bg-6;\n}\n\n.header {\n font-size: 1.2em;\n margin-bottom: 2em;\n display: flex;\n justify-content: center;\n align-items: center;\n\n .logo {\n width: 3em;\n height: 3em;\n display: inline-flex;\n background-size: cover;\n }\n\n .text {\n font-family: Poppins, sans-serif;\n margin-left: .5em;\n }\n}\n\nform {\n display: flex;\n flex-direction: column;\n padding: 4em;\n border: $default-border-3;\n border-radius: 3em;\n box-shadow: 2px 2px 3px 3px $border-color-2;\n background: $background-color;\n\n .row {\n margin: 0.5em 0;\n }\n\n input[type=text],\n input[type=password] {\n width: 100%;\n }\n\n input[type=submit],\n input[type=password] {\n border-radius: 1em;\n }\n\n input[type=password] {\n padding: .25em .5em;\n }\n\n .checkbox {\n display: flex;\n font-size: 0.8em;\n }\n\n .buttons {\n text-align: center;\n\n input[type=submit] {\n padding: .5em .75em;\n }\n }\n}\n\na {\n color: $default-link-fg;\n}\n</style>\n","import { render } from \"./Login.vue?vue&type=template&id=af0b14d0&scoped=true\"\nimport script from \"./Login.vue?vue&type=script&lang=js\"\nexport * from \"./Login.vue?vue&type=script&lang=js\"\n\nimport \"./Login.vue?vue&type=style&index=0&id=af0b14d0&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-af0b14d0\"]])\n\nexport default __exports__","<template>\n <Login :register=\"true\" />\n</template>\n\n<script>\nimport Login from \"@/views/Login\";\n\nexport default {\n name: \"Register\",\n mixins: [Login],\n components: {Login},\n props: {\n register: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n}\n</script>\n","import { render } from \"./Register.vue?vue&type=template&id=1244b238\"\nimport script from \"./Register.vue?vue&type=script&lang=js\"\nexport * from \"./Register.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <main>\n <Loading v-if=\"loading\" />\n <Nav :panels=\"components\"\n :selected-panel=\"selectedPanel\"\n :selected-config-panel=\"selectedConfigPanel\"\n :hostname=\"hostname\"\n @select=\"selectedPanel = $event\"\n @select-config=\"selectedConfigPanel = $event\"\n v-else\n />\n\n <div class=\"canvas\" v-if=\"selectedPanel === 'settings'\">\n <div class=\"panel\">\n <Settings :selected-panel=\"selectedConfigPanel\" />\n </div>\n </div>\n\n <div class=\"canvas\" v-else-if=\"selectedPanel === 'extensions'\">\n <div class=\"panel\">\n <Extensions />\n </div>\n </div>\n\n <div class=\"canvas\" v-else>\n <div class=\"panel\" :class=\"{hidden: name !== selectedPanel}\" v-for=\"(panel, name) in components\" :key=\"name\">\n <component :is=\"panel.component\" :config=\"panel.config\" :plugin-name=\"name\" v-if=\"name === selectedPanel\" />\n </div>\n </div>\n </main>\n</template>\n\n<script>\nimport { defineAsyncComponent, shallowRef } from \"vue\";\nimport Utils from '@/Utils'\nimport Loading from \"@/components/Loading\";\nimport Nav from \"@/components/Nav\";\nimport Extensions from \"@/components/panels/Extensions/Index\";\nimport Settings from \"@/components/panels/Settings/Index\";\n\nexport default {\n name: 'Panel',\n mixins: [Utils],\n components: {Extensions, Settings, Nav, Loading},\n\n data() {\n return {\n loading: false,\n plugins: {},\n backends: {},\n procedures: {},\n components: {},\n hostname: undefined,\n selectedPanel: undefined,\n selectedConfigPanel: 'users',\n }\n },\n\n methods: {\n initSelectedPanel() {\n const match = this.$route.hash.match(/^#?([a-zA-Z0-9_.]+)(\\?(.+?))?/)\n const plugin = match ? match[1] : 'entities'\n if (plugin?.length)\n this.selectedPanel = plugin\n },\n\n initPanels() {\n const self = this\n this.components = {}\n\n Object.entries(this.plugins).forEach(async ([name, plugin]) => {\n const componentName = name.split('.').map((token) => token[0].toUpperCase() + token.slice(1)).join('')\n let comp = null\n try {\n comp = await import(`@/components/panels/${componentName}/Index`)\n } catch (e) {\n return\n }\n\n const component = shallowRef(defineAsyncComponent(async () => { return comp }))\n self.$options.components[name] = component\n self.components[name] = {\n component: component,\n pluginName: name,\n config: plugin,\n }\n })\n },\n\n async parseConfig() {\n [this.plugins, this.backends, this.procedures, this.hostname] =\n await Promise.all([\n this.request('config.get_plugins'),\n this.request('config.get_backends'),\n this.request('config.get_procedures'),\n this.request('config.get_device_id'),\n ])\n\n this.initializeDefaultViews()\n },\n\n initializeDefaultViews() {\n this.plugins.entities = {}\n this.plugins.execute = {}\n },\n },\n\n async mounted() {\n this.loading = true\n\n try {\n await this.parseConfig()\n this.initPanels()\n this.initSelectedPanel()\n this.$watch('$route.hash', this.initSelectedPanel)\n } finally {\n this.loading = false\n }\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\nmain {\n height: 100%;\n display: flex;\n\n @include until($tablet) {\n flex-direction: column;\n }\n\n .canvas {\n display: flex;\n flex-grow: 100;\n background: $menu-panel-bg;\n overflow: auto;\n z-index: 1;\n\n .panel {\n width: 100%;\n height: 100%;\n display: flex;\n margin: 0 !important;\n box-shadow: none !important;\n overflow: auto;\n }\n }\n}\n</style>\n\n<style>\nhtml {\n overflow: auto !important;\n}\n</style>\n","<template>\n <nav :class=\"{collapsed: collapsed}\">\n <div class=\"toggler\" @click=\"collapsed = !collapsed\">\n <i class=\"fas fa-bars\" />\n <span class=\"hostname\" v-if=\"hostname\" v-text=\"hostname\" />\n <i class=\"icon status fas fa-circle\"\n :class=\"{ok: connected, error: !connected}\"\n :title=\"connected ? 'Connected' : 'Disconnected'\" />\n </div>\n\n <ul class=\"plugins\" v-if=\"selectedPanel === 'settings'\">\n <li class=\"entry\" title=\"Home\" @click=\"onItemClick('entities')\">\n <a href=\"/#\">\n <i class=\"fas fa-home\" />\n <span class=\"name\" v-if=\"!collapsed\">Home</span>\n </a>\n </li>\n\n <li v-for=\"config, name in configSections\" :key=\"name\" class=\"entry\"\n :class=\"{selected: name === selectedConfigPanel}\"\n :title=\"config.name\" @click=\"$emit('select-config', name)\">\n <a href=\"/#settings\">\n <span class=\"icon\">\n <i :class=\"config.icon['class']\" v-if=\"config.icon?.['class']\" />\n <img :src=\"config.icon?.imgUrl\" v-else-if=\"config.icon?.imgUrl\" alt=\"name\"/>\n <i class=\"fas fa-puzzle-piece\" v-else />\n </span>\n <span class=\"name\" v-if=\"!collapsed\" v-text=\"config.name\" />\n </a>\n </li>\n </ul>\n\n <ul class=\"plugins\" v-else>\n <li v-for=\"name in panelNames\" :key=\"name\" class=\"entry\" :class=\"{selected: name === selectedPanel}\"\n :title=\"name\" @click=\"onItemClick(name)\">\n <a :href=\"`/#${name}`\">\n <span class=\"icon\">\n <i :class=\"icons[name].class\" v-if=\"specialPlugins.includes(name)\" />\n <ExtensionIcon :name=\"name\" size=\"1.5em\" v-else />\n </span>\n <span class=\"name\" v-if=\"!collapsed\" v-text=\"displayName(name)\" />\n </a>\n </li>\n </ul>\n\n <ul class=\"footer\">\n <li :class=\"{selected: selectedPanel === 'extensions'}\" title=\"Extensions\" @click=\"onItemClick('extensions')\">\n <a href=\"/#extensions\">\n <span class=\"icon\">\n <i class=\"fa fa-puzzle-piece\" />\n </span>\n <span class=\"name\" v-if=\"!collapsed\">Extensions</span>\n </a>\n </li>\n\n <li :class=\"{selected: selectedPanel === 'settings'}\" title=\"Settings\" @click=\"onItemClick('settings')\">\n <a href=\"/#settings\">\n <span class=\"icon\">\n <i class=\"fa fa-cog\" />\n </span>\n <span class=\"name\" v-if=\"!collapsed\">Settings</span>\n </a>\n </li>\n\n <li title=\"Logout\" @click=\"onItemClick('logout')\">\n <a href=\"/logout\">\n <span class=\"icon\">\n <i class=\"fas fa-sign-out-alt\" />\n </span>\n <span class=\"name\" v-if=\"!collapsed\">Logout</span>\n </a>\n </li>\n </ul>\n </nav>\n</template>\n\n<script>\nimport icons from '@/assets/icons.json'\nimport ExtensionIcon from \"@/components/elements/ExtensionIcon\"\nimport Utils from \"@/Utils\";\nimport configSections from '@/components/panels/Settings/sections.json';\nimport { bus } from \"@/bus\";\n\nexport default {\n name: \"Nav\",\n emits: ['select', 'select-config'],\n mixins: [Utils],\n components: {\n ExtensionIcon,\n },\n\n props: {\n panels: {\n type: Object,\n required: true,\n },\n\n selectedPanel: {\n type: String,\n },\n\n selectedConfigPanel: {\n type: String,\n },\n\n hostname: {\n type: String,\n },\n },\n\n computed: {\n specialPlugins() {\n return ['execute', 'entities']\n },\n\n panelNames() {\n const prepend = (names, name) => {\n const idx = panelNames.indexOf(name)\n if (idx >= 0)\n names = [name].concat((names.slice(0, idx).concat(names.slice(idx+1))))\n\n return names\n }\n\n let panelNames = Object.keys(this.panels).sort()\n panelNames = prepend(panelNames, 'execute')\n panelNames = prepend(panelNames, 'entities')\n return panelNames\n },\n\n collapsedDefault() {\n if (this.isMobile() || this.isTablet())\n return true\n return false\n },\n },\n\n methods: {\n onItemClick(name) {\n this.$emit('select', name)\n this.collapsed = this.isMobile() ? true : this.collapsedDefault\n },\n\n displayName(name) {\n if (name === 'entities')\n return 'Home'\n if (name === 'execute')\n return 'Execute'\n\n return name\n },\n\n setConnected(connected) {\n this.connected = connected\n },\n },\n\n data() {\n return {\n collapsed: true,\n connected: false,\n icons: icons,\n host: null,\n configSections: configSections,\n }\n },\n\n mounted() {\n this.collapsed = this.collapsedDefault\n bus.on('connect', () => this.setConnected(true))\n bus.on('disconnect', () => this.setConnected(false))\n this.$watch(() => this.$root.connected, (value) => this.setConnected(value))\n this.setConnected(this.$root.connected)\n },\n}\n</script>\n\n<!--suppress SassScssResolvedByNameOnly -->\n<style lang=\"scss\" scoped>\n$toggler-height: 2em;\n$footer-collapsed-height: 7.5em;\n$footer-expanded-height: 11em;\n\nnav {\n @media screen and (max-width: #{$tablet - 1px}) {\n width: 100%;\n height: 100vh;\n background: $nav-bg;\n color: $nav-fg;\n box-shadow: $nav-box-shadow-main;\n\n &.collapsed {\n box-shadow: 1px 1px 1px 1px $default-shadow-color;\n margin-bottom: 2px;\n z-index: 1;\n }\n\n &:not(.collapsed) {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 5;\n\n .icon.status {\n top: 0.75em !important;\n left: 2em;\n }\n }\n }\n\n @media screen and (min-width: $tablet) {\n width: calc(16em - 2vw);\n min-width: calc(16em - 2vw);\n height: 100%;\n overflow: auto;\n background: $nav-bg;\n color: $nav-fg;\n box-shadow: $nav-box-shadow-main;\n z-index: 1;\n }\n\n @media screen and (min-width: $desktop) {\n width: 20em;\n min-width: 20em;\n }\n\n li {\n border-bottom: $nav-entry-border;\n cursor: pointer;\n list-style: none;\n\n a {\n display: flex;\n color: $nav-fg;\n padding: 1em 0.5em;\n text-decoration: none;\n align-items: center;\n\n &:hover {\n color: $nav-fg;\n }\n }\n\n &.selected {\n background: $nav-entry-selected-bg;\n border: 1px solid rgba(0, 0, 0, 0);\n }\n\n &:hover {\n background: $nav-entry-hover-bg;\n border: 1px solid rgba(0, 0, 0, 0);\n }\n\n .name {\n margin-left: 0.5em;\n }\n\n .icon {\n margin-right: 0.5em;\n }\n }\n\n .toggler {\n width: 100%;\n height: $toggler-height;\n background: $nav-toggler-bg;\n display: flex;\n font-size: 1.5em;\n position: relative;\n cursor: pointer;\n padding: 0.4em;\n align-items: center;\n box-shadow: $nav-toggler-shadow;\n\n .icon.status {\n position: absolute;\n top: calc($toggler-height / 2 + 0.3em);\n right: 0.5em;\n font-size: 0.5em;\n\n &.ok {\n color: $ok-fg;\n }\n\n &.error {\n color: $error-fg;\n }\n }\n }\n\n .hostname {\n font-size: 0.7em;\n margin-top: -0.2em;\n\n @media screen and (min-width: $tablet) {\n margin-left: 1em;\n }\n\n @media screen and (max-width: #{$tablet - 1px}) {\n text-align: right;\n margin-right: 0.25em;\n flex-grow: 1;\n }\n }\n\n .plugins {\n height: calc(100% - #{$toggler-height} - #{$footer-expanded-height} - 1.5em);\n overflow: auto;\n\n :deep(.icon) {\n display: inline-flex;\n\n .extension-icon {\n margin-left: 0;\n display: inline-flex;\n }\n }\n }\n\n .footer {\n height: calc($footer-expanded-height + 0.4em);\n background: $nav-footer-bg;\n padding: 0;\n margin: 0;\n\n li:last-child {\n border: 0;\n }\n }\n\n ul {\n li {\n .icon {\n margin-right: 0;\n\n & img, i {\n width: 1.5em;\n height: 1em;\n }\n\n i {\n padding-left: 0.25em;\n }\n }\n }\n }\n\n .icon.status {\n width: 1em;\n }\n\n &.collapsed {\n display: flex;\n flex-direction: column;\n margin-right: 1px;\n\n @media screen and (min-width: $tablet) {\n width: 2.5em;\n min-width: 2.5em;\n max-width: 2.5em;\n background: $nav-collapsed-bg;\n color: $nav-collapsed-fg;\n box-shadow: $nav-box-shadow-collapsed;\n\n .hostname {\n display: none;\n }\n }\n\n @media screen and (max-width: #{$tablet - 1px}) {\n height: auto;\n }\n\n li {\n a {\n display: block;\n }\n }\n\n a {\n color: $nav-collapsed-fg;\n padding: 0.25em 0;\n &:hover {\n color: $nav-collapsed-fg;\n }\n }\n\n .toggler {\n height: $toggler-height;\n text-align: center;\n box-shadow: none;\n background: $nav-toggler-collapsed-bg;\n\n .icon.status {\n top: 0.75em;\n left: 2em;\n }\n\n @include until($tablet) {\n background: $nav-toggler-collapsed-mobile-bg;\n color: $nav-toggler-collapsed-mobile-fg;\n\n .icon.status {\n top: 0.75em !important;\n }\n }\n }\n\n .footer {\n height: $footer-collapsed-height;\n background: none;\n padding: 0;\n margin-bottom: .5em;\n box-shadow: none;\n }\n\n @media screen and (max-width: #{$tablet - 1px}) {\n .footer {\n display: none;\n }\n }\n\n ul {\n display: flex;\n flex-direction: column;\n justify-content: center;\n height: calc(100% - #{$toggler-height} - #{$footer-collapsed-height});\n overflow: hidden;\n\n &.plugins {\n @media screen and (min-width: $tablet) and (max-width: #{$desktop - 1px}) {\n margin: 2em 0;\n }\n }\n\n &:hover {\n overflow: auto;\n }\n\n li {\n border: none;\n padding: 0;\n text-align: center;\n\n &.selected,\n &:hover {\n border-radius: 1em;\n margin: 0 0.2em;\n }\n\n &.selected {\n background: $nav-entry-collapsed-selected-bg;\n }\n\n &:hover {\n background: $nav-entry-collapsed-hover-bg;\n }\n\n .icon {\n margin-right: 0;\n }\n\n @media screen and (max-width: #{$tablet - 1px}) {\n display: none;\n }\n }\n }\n }\n}\n</style>\n","import { render } from \"./Nav.vue?vue&type=template&id=bab139d4&scoped=true\"\nimport script from \"./Nav.vue?vue&type=script&lang=js\"\nexport * from \"./Nav.vue?vue&type=script&lang=js\"\n\nimport \"./Nav.vue?vue&type=style&index=0&id=bab139d4&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-bab139d4\"]])\n\nexport default __exports__","import { render } from \"./Panel.vue?vue&type=template&id=871fbba0&scoped=true\"\nimport script from \"./Panel.vue?vue&type=script&lang=js\"\nexport * from \"./Panel.vue?vue&type=script&lang=js\"\n\nimport \"./Panel.vue?vue&type=style&index=0&id=871fbba0&lang=scss&scoped=true\"\nimport \"./Panel.vue?vue&type=style&index=1&id=871fbba0&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-871fbba0\"]])\n\nexport default __exports__","<template>\n <main>\n <Loading v-if=\"loading\" />\n <div class=\"canvas\" v-else>\n <component :is=\"component\" :config=\"config\" :plugin-name=\"pluginName\" />\n </div>\n </main>\n</template>\n\n<script>\nimport { defineAsyncComponent, shallowRef } from \"vue\";\nimport Utils from '@/Utils'\nimport Loading from \"@/components/Loading\";\nimport Nav from \"@/components/Nav\";\nimport Settings from \"@/components/panels/Settings/Index\";\n\nexport default {\n name: 'Panel',\n mixins: [Utils],\n components: {Settings, Nav, Loading},\n\n data() {\n return {\n loading: false,\n config: {},\n plugins: {},\n backends: {},\n procedures: {},\n component: undefined,\n hostname: undefined,\n selectedPanel: undefined,\n }\n },\n\n computed: {\n pluginName() {\n return this.$route.params.plugin\n },\n },\n\n methods: {\n async initPanel() {\n const componentName = this.pluginName.split('.').map((token) => token[0].toUpperCase() + token.slice(1)).join('')\n let comp = null\n\n try {\n comp = await import(`@/components/panels/${componentName}/Index`)\n } catch (e) {\n console.error(e)\n this.notify({\n error: true,\n title: `Cannot load plugin ${this.pluginName}`,\n text: e.toString(),\n })\n\n return\n }\n\n this.component = shallowRef(defineAsyncComponent(async () => { return comp }))\n this.$options.components[componentName] = this.component\n },\n\n async initConfig() {\n const config = await this.request('config.get')\n this.config = config[this.pluginName] || {}\n this.hostname = await this.request('config.get_device_id')\n },\n },\n\n async mounted() {\n this.loading = true\n\n try {\n await this.initConfig()\n await this.initPanel()\n } finally {\n this.loading = false\n }\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\nmain {\n height: 100%;\n display: flex;\n\n @media screen and (max-width: $tablet) {\n flex-direction: column;\n }\n\n .canvas {\n display: flex;\n flex-grow: 100;\n background: $menu-panel-bg;\n overflow: auto;\n\n .panel {\n width: 100%;\n height: 100%;\n display: flex;\n margin: 0 !important;\n box-shadow: none !important;\n overflow: auto;\n }\n }\n}\n</style>\n\n<style>\nhtml {\n overflow: auto !important;\n}\n</style>\n","import { render } from \"./Plugin.vue?vue&type=template&id=e339182c&scoped=true\"\nimport script from \"./Plugin.vue?vue&type=script&lang=js\"\nexport * from \"./Plugin.vue?vue&type=script&lang=js\"\n\nimport \"./Plugin.vue?vue&type=style&index=0&id=e339182c&lang=scss&scoped=true\"\nimport \"./Plugin.vue?vue&type=style&index=1&id=e339182c&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-e339182c\"]])\n\nexport default __exports__","import { createWebHistory, createRouter } from \"vue-router\";\nimport Dashboard from \"@/views/Dashboard.vue\";\nimport NotFound from \"@/views/NotFound\";\nimport Login from \"@/views/Login\";\nimport Register from \"@/views/Register\";\nimport Panel from \"@/views/Panel\";\nimport Plugin from \"@/views/Plugin\";\n\nconst routes = [\n {\n path: \"/\",\n name: \"Panel\",\n component: Panel,\n },\n\n {\n path: \"/dashboard/:name\",\n name: \"Dashboard\",\n component: Dashboard,\n },\n\n {\n path: \"/plugin/:plugin\",\n name: \"Plugin\",\n component: Plugin,\n },\n\n {\n path: \"/login\",\n name: \"Login\",\n component: Login,\n },\n\n {\n path: \"/register\",\n name: \"Register\",\n component: Register,\n },\n\n {\n path: \"/:catchAll(.*)\",\n component: NotFound,\n },\n];\n\nconst router = createRouter({\n history: createWebHistory(),\n routes,\n});\n\nexport default router;\n","/* eslint-disable no-console */\n\nimport { register } from 'register-service-worker'\n\nif (process.env.NODE_ENV === 'production') {\n register(`${process.env.BASE_URL}service-worker.js`, {\n ready () {\n console.log(\n 'App is being served from cache by a service worker.\\n' +\n 'For more details, visit https://goo.gl/AFskqB'\n )\n },\n registered () {\n console.log('Service worker has been registered.')\n },\n cached () {\n console.log('Content has been cached for offline use.')\n },\n updatefound () {\n console.log('New content is downloading.')\n },\n updated () {\n console.log('New content is available; please refresh.')\n },\n offline () {\n console.log('No internet connection found. App is running in offline mode.')\n },\n error (error) {\n console.error('Error during service worker registration:', error)\n }\n })\n}\n","import { createApp } from 'vue'\nimport App from '@/App.vue'\nimport router from '@/router'\nimport './registerServiceWorker'\n\nconst app = createApp(App)\napp.config.globalProperties._config = window.config\napp.use(router).mount('#app')\n","<script>\nimport axios from 'axios'\n\nexport default {\n name: \"Api\",\n methods: {\n execute(request, timeout=60000, showError=true) {\n const opts = {};\n\n if (!('target' in request) || !request['target']) {\n request['target'] = 'localhost'\n }\n\n if (!('type' in request) || !request['type']) {\n request['type'] = 'request'\n }\n\n if (timeout) {\n opts.timeout = timeout\n }\n\n return new Promise((resolve, reject) => {\n axios.post('/execute', request, opts)\n .then((response) => {\n response = response.data.response\n if (!response.errors?.length) {\n resolve(response.output);\n } else {\n const error = response.errors?.[0] || response\n this.notify({\n text: error,\n error: true,\n })\n\n reject(error)\n }\n })\n .catch((error) => {\n // No users present -> redirect to the registration page\n if (\n error?.response?.data?.code === 412 &&\n window.location.href.indexOf('/register') < 0\n ) {\n window.location.href = '/register?redirect=' + window.location.href\n return\n }\n\n // Unauthorized -> redirect to the login page\n if (\n error?.response?.data?.code === 401 &&\n window.location.href.indexOf('/login') < 0\n ) {\n window.location.href = '/login?redirect=' + window.location.href\n return\n }\n\n console.log(error)\n if (showError)\n this.notify({\n text: error,\n error: true,\n })\n\n reject(error)\n })\n })\n },\n\n request(action, args={}, timeout=60000, showError=true) {\n return this.execute({\n type: 'request',\n action: action,\n args: args,\n }, timeout, showError);\n }\n },\n}\n</script>\n\n","import script from \"./Api.vue?vue&type=script&lang=js\"\nexport * from \"./Api.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nexport default {\n name: \"Clipboard\",\n methods: {\n async copyToClipboard(text) {\n await navigator.clipboard.writeText(text)\n this.notify({\n text: 'Copied to the clipboard',\n image: {\n icon: 'clipboard',\n },\n })\n },\n },\n}\n</script>\n\n","import script from \"./Clipboard.vue?vue&type=script&lang=js\"\nexport * from \"./Clipboard.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nexport default {\n name: \"Cookies\",\n methods: {\n getCookies() {\n return document.cookie.split(/;\\s*/).reduce((obj, item) => {\n const [k, v] = item.split('=')\n obj[k] = v\n return obj\n }, {})\n },\n\n getCookie(name) {\n return this.getCookies()[name]\n },\n\n setCookie(name, value, opts) {\n document.cookie = (\n `${name}=${value}; path=${opts?.path || '/'}` + (\n opts?.expires ? `; expires=${opts?.expires.toISOString()}` : ''\n )\n )\n },\n\n deleteCookie(name) {\n document.cookie = (\n `${name}=; expires=1970-01-01T00:00:00Z`\n )\n },\n }\n}\n</script>\n","import script from \"./Cookies.vue?vue&type=script&lang=js\"\nexport * from \"./Cookies.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nexport default {\n name: \"DateTime\",\n methods: {\n formatDate(date, year=false) {\n if (typeof date === 'string')\n date = new Date(Date.parse(date))\n\n return date.toDateString().substring(0, year ? 15 : 10)\n },\n\n formatTime(date, seconds=true) {\n if (typeof date === 'string')\n date = new Date(Date.parse(date))\n\n return date.toTimeString().substring(0, seconds ? 8 : 5)\n },\n\n formatDateTime(date, year=false, seconds=true, skipTimeIfMidnight=false) {\n if (typeof date === 'string')\n date = new Date(Date.parse(date))\n\n if (skipTimeIfMidnight && date.getHours() === 0 && date.getMinutes() === 0 && date.getSeconds() === 0)\n return this.formatDate(date, year)\n\n return `${this.formatDate(date, year)}, ${this.formatTime(date, seconds)}`\n },\n },\n}\n</script>\n","import script from \"./DateTime.vue?vue&type=script&lang=js\"\nexport * from \"./DateTime.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nimport { bus } from \"@/bus\";\n\nexport default {\n name: \"Events\",\n computed: {\n _eventsReady() {\n return this.$root.$refs.events?.initialized\n },\n },\n\n methods: {\n subscribe(handler, handlerName, ...events) {\n const subFunc = () => {\n bus.emit('subscribe', {\n events: events,\n handler: handler,\n handlerName: handlerName || this.generateId(),\n })\n }\n\n if (this._eventsReady) {\n subFunc()\n return\n }\n\n const self = this\n const unwatch = this.$watch( () => self._eventsReady, (newVal) => {\n if (newVal) {\n subFunc()\n unwatch()\n }\n })\n\n return unwatch\n },\n\n unsubscribe(handlerName) {\n bus.emit('unsubscribe', handlerName)\n },\n\n generateId() {\n return btoa([...Array(11).keys()].map(() => String.fromCharCode(Math.round(Math.random() * 255))))\n },\n }\n}\n</script>\n","import script from \"./Events.vue?vue&type=script&lang=js\"\nexport * from \"./Events.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nexport default {\n name: \"Extensions\",\n methods: {\n pluginDisplayName(name) {\n const words = name.split('.')\n words.forEach((word, idx) => {\n words[idx] = word.charAt(0).toUpperCase() + word.slice(1)\n })\n\n if (words.length > 1)\n words[0] = `[${words[0]}]`\n\n return words.join(' ')\n },\n }\n}\n</script>\n","import script from \"./Extensions.vue?vue&type=script&lang=js\"\nexport * from \"./Extensions.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nimport { bus } from \"@/bus\";\n\nexport default {\n name: \"Notification\",\n methods: {\n notify(notification) {\n bus.publishNotification(notification)\n },\n\n notifyWarning(msg) {\n this.notify({\n text: msg,\n warning: true,\n })\n },\n\n notifyError(msg) {\n this.notify({\n text: msg,\n error: true,\n })\n\n throw msg\n },\n }\n}\n</script>\n","import script from \"./Notification.vue?vue&type=script&lang=js\"\nexport * from \"./Notification.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nexport default {\n name: \"Screen\",\n methods: {\n isMobile() {\n return window.matchMedia(\"only screen and (max-width: 768px)\").matches\n },\n\n isTablet() {\n return (\n !this.isMobile() &&\n window.matchMedia(\"only screen and (max-width: 1023px)\").matches\n )\n },\n\n isDesktop() {\n return window.matchMedia(\"only screen and (min-width: 1024px)\").matches\n },\n },\n}\n</script>\n","import script from \"./Screen.vue?vue&type=script&lang=js\"\nexport * from \"./Screen.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nexport default {\n name: \"Text\",\n methods: {\n capitalize(text) {\n if (!text?.length)\n return text\n\n return text.charAt(0).toUpperCase() + text.slice(1)\n },\n\n prettify(text) {\n return text.split('_').map((t) => this.capitalize(t)).join(' ')\n },\n\n indent(text, spaces = 2) {\n return text.split('\\n').map((t) => `${' '.repeat(spaces)}${t}`).join('\\n')\n },\n },\n}\n</script>\n","import script from \"./Text.vue?vue&type=script&lang=js\"\nexport * from \"./Text.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nexport default {\n name: \"Types\",\n methods: {\n parseBoolean(value) {\n if (typeof value === 'string') {\n value = value.toLowerCase()\n if (value === 'true')\n return true\n if (value === 'false')\n return false\n\n return !!parseInt(value)\n }\n\n return !!value\n },\n\n convertSize(value) {\n if (typeof value === 'string')\n value = parseInt(value)\n\n let unit = null\n const units = ['B', 'KB', 'MB', 'GB', 'TB']\n\n units.forEach((u, i) => {\n if (value <= 1024 && unit == null) {\n unit = u\n } else if (value > 1024) {\n if (i === units.length-1) {\n unit = u\n } else {\n value = value/1024\n }\n }\n })\n\n return `${value.toFixed(2)} ${unit}`\n },\n\n convertTime(time) {\n const t = {}\n const ret = []\n\n time = parseFloat(time); // Normalize strings\n t.d = Math.round(time/86400)\n t.h = Math.round(time/3600 - t.d*24)\n t.m = Math.round(time/60 - (t.d*24 + t.h*60))\n t.s = Math.round(time - (t.d*24 + t.h*3600 + t.m*60), 1)\n\n if (parseInt(t.d)) {\n let d = t.d + ' day'\n if (t.d > 1) {\n d += 's'\n }\n ret.push(d)\n }\n\n if (parseInt(t.h)) {\n let h = t.h + ' hour'\n if (t.h > 1) {\n h += 's'\n }\n ret.push(h)\n }\n\n if (parseInt(t.m)) {\n let m = t.m + ' minute'\n if (t.m > 1) {\n m += 's'\n }\n ret.push(m)\n }\n\n let s = t.s + ' second'\n if (t.s > 1) {\n s += 's'\n }\n ret.push(s)\n\n return ret.join(' ')\n },\n\n objectsEqual(a, b) {\n if (typeof(a) !== 'object' || typeof(b) !== 'object')\n return false\n\n if (a == null || b == null) {\n return a == null && b == null\n }\n\n for (const p of Object.keys(a || {})) {\n switch(typeof(a[p])) {\n case 'object':\n if (!this.objectsEqual(a[p], b[p]))\n return false\n break\n\n case 'function':\n if (a[p].toString() != b[p]?.toString())\n return false\n break\n\n default:\n if (a[p] != b[p])\n return false\n break\n }\n }\n\n for (const p of Object.keys(b || {}))\n if (a[p] == null && b[p] != null)\n return false\n\n return true\n },\n },\n}\n</script>\n","import script from \"./Types.vue?vue&type=script&lang=js\"\nexport * from \"./Types.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nexport default {\n name: \"Url\",\n methods: {\n parseUrlFragment() {\n return window.location.hash.replace(/^#/, '').replace(/\\?.*/, '')\n },\n\n getUrlArgs() {\n const argsString = window.location.hash.split('?').slice(1)\n if (!argsString.length)\n return {}\n\n return argsString[0]\n .split(/[&;]/)\n .reduce((acc, obj) => {\n const tokens = obj.split('=')\n if (tokens[0]?.length)\n acc[tokens[0]] = tokens[1]\n return acc\n }, {})\n },\n\n setUrlArgs(args) {\n const curArgs = this.getUrlArgs()\n args = Object.entries(args)\n .reduce((acc, [key, value]) => {\n if (value != null)\n acc[key] = value\n else if (curArgs[key] != null)\n delete curArgs[key]\n return acc\n }, {})\n\n args = {...curArgs, ...args}\n let location = `${window.location.pathname}#${this.parseUrlFragment()}`\n if (Object.keys(args).length)\n location += `?${this.fragmentFromArgs(args)}`\n\n window.location.href = location\n },\n\n fragmentFromArgs(args) {\n return Object.entries(args)\n .map(\n ([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`\n )\n .join('&')\n },\n },\n}\n</script>\n\n","import script from \"./Url.vue?vue&type=script&lang=js\"\nexport * from \"./Url.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\nimport Api from \"@/utils/Api\";\nimport Clipboard from \"@/utils/Clipboard\";\nimport Cookies from \"@/utils/Cookies\";\nimport DateTime from \"@/utils/DateTime\";\nimport Events from \"@/utils/Events\";\nimport Extensions from \"@/utils/Extensions\";\nimport Notification from \"@/utils/Notification\";\nimport Screen from \"@/utils/Screen\";\nimport Text from \"@/utils/Text\";\nimport Types from \"@/utils/Types\";\nimport Url from \"@/utils/Url\";\n\nexport default {\n name: \"Utils\",\n mixins: [\n Api,\n Clipboard,\n Cookies,\n DateTime,\n Events,\n Notification,\n Extensions,\n Screen,\n Text,\n Types,\n Url,\n ],\n}\n</script>\n","import script from \"./Utils.vue?vue&type=script&lang=js\"\nexport * from \"./Utils.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n <div class=\"loading\">\n <div class=\"icon\">\n <div v-for=\"n in 4\" :key=\"n\" />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.loading {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 3em;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: $loading-bg;\n opacity: 0.5;\n}\n\n.icon {\n display: inline-block;\n position: relative;\n width: 80px;\n height: 80px;\n\n div {\n position: absolute;\n top: 33px;\n width: 13px;\n height: 13px;\n border-radius: 50%;\n background: #fff;\n animation-timing-function: cubic-bezier(0, 1, 1, 0);\n\n &:nth-child(1) {\n left: 8px;\n animation: lds-ellipsis1 0.6s infinite;\n }\n\n &:nth-child(2) {\n left: 8px;\n animation: lds-ellipsis2 0.6s infinite;\n }\n\n &:nth-child(3) {\n left: 32px;\n animation: lds-ellipsis2 0.6s infinite;\n }\n\n &:nth-child(4) {\n left: 56px;\n animation: lds-ellipsis3 0.6s infinite;\n }\n }\n}\n\n@keyframes lds-ellipsis1 {\n 0% {\n transform: scale(0);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n@keyframes lds-ellipsis3 {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(0);\n }\n}\n\n@keyframes lds-ellipsis2 {\n 0% {\n transform: translate(0, 0);\n }\n 100% {\n transform: translate(24px, 0);\n }\n}\n</style>","import { render } from \"./Loading.vue?vue&type=template&id=4d9c871b&scoped=true\"\nconst script = {}\n\nimport \"./Loading.vue?vue&type=style&index=0&id=4d9c871b&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4d9c871b\"]])\n\nexport default __exports__","<template>\n <div class=\"modal-container fade-in\" :id=\"id\" :class=\"{hidden: !isVisible}\"\n :style=\"{'--z-index': zIndex}\" @click=\"close\">\n <div class=\"modal\" :class=\"$attrs.class\">\n <div class=\"content\" :style=\"{'--width': width, '--height': height}\" @click=\"$event.stopPropagation()\">\n <div class=\"header\" v-if=\"title\">\n <div class=\"title\" v-text=\"title\" v-if=\"title\" />\n <button title=\"Close\" alt=\"Close\" @click=\"close\">\n <i class=\"fas fa-xmark\" />\n </button>\n </div>\n <div class=\"body\">\n <slot @modal-close=\"close\" />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n name: \"Modal\",\n emits: ['close', 'open'],\n props: {\n // Modal ID\n id: {\n type: String,\n },\n\n // Modal title\n title: {\n type: String,\n },\n\n // Modal width\n width: {\n type: [Number, String],\n },\n\n // Modal height\n height: {\n type: [Number, String],\n },\n\n // Modal initial visibility value\n visible: {\n type: Boolean,\n default: false,\n },\n\n // Modal timeout in seconds\n timeout: {\n type: [Number, String],\n },\n\n // Modal z-index level\n level: {\n type: Number,\n default: 1,\n },\n },\n\n data() {\n return {\n timeoutId: undefined,\n prevVisible: this.visible,\n isVisible: this.visible,\n }\n },\n\n computed: {\n zIndex() {\n return 500 + this.level\n },\n },\n\n methods: {\n close() {\n this.prevVisible = this.isVisible\n this.isVisible = false\n },\n\n hide() {\n this.close()\n },\n\n show() {\n this.prevVisible = this.isVisible\n this.isVisible = true\n },\n\n toggle() {\n if (this.isVisible)\n this.close()\n else\n this.show()\n },\n\n onKeyUp(event) {\n event.stopPropagation()\n if (event.key === 'Escape') {\n this.close()\n }\n },\n },\n\n mounted() {\n const self = this\n const visibleHndl = (visible) => {\n if (!visible)\n self.$emit('close')\n else\n self.$emit('open')\n\n self.isVisible = visible\n }\n\n document.body.addEventListener('keyup', this.onKeyUp)\n this.$watch(() => this.visible, visibleHndl)\n this.$watch(() => this.isVisible, visibleHndl)\n },\n\n unmounted() {\n document.body.removeEventListener('keyup', this.onKeyUp)\n },\n\n updated() {\n this.prevVisible = this.isVisible\n if (this.isVisible) {\n // Make sure that a newly opened or visible+updated modal always comes to the front\n let maxZIndex = parseInt(getComputedStyle(this.$el).zIndex)\n let outermostModals = []\n\n for (const modal of document.querySelectorAll('.modal-container:not(.hidden)')) {\n const zIndex = parseInt(getComputedStyle(modal).zIndex)\n\n if (zIndex > maxZIndex) {\n maxZIndex = zIndex\n outermostModals = [modal]\n } else if (zIndex === maxZIndex) {\n outermostModals.push(modal)\n }\n }\n\n if (outermostModals.indexOf(this.$el) < 0 || outermostModals.length > 1) {\n this.$el.style.zIndex = maxZIndex+1\n }\n }\n\n if (this.isVisible && this.timeout && !this.timeoutId) {\n const handler = (self) => {\n return () => {\n // self.modalClose()\n self.close()\n self.timeoutId = undefined\n }\n }\n\n this.timeoutId = setTimeout(handler(this), 0+this.timeout)\n }\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n$icon-size: 1.5em;\n$icon-margin: 0.5em;\n\n.modal-container {\n position: fixed;\n display: flex;\n align-items: center;\n justify-content: center;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: var(--z-index);\n background: rgba(10,10,10,0.9);\n\n .modal {\n display: flex;\n max-width: 100%;\n justify-content: center;\n\n .content {\n --width: auto;\n --height: auto;\n width: var(--width);\n height: var(--height);\n border-radius: 0.5em;\n background: $modal-body-bg;\n }\n\n .header {\n display: flex;\n position: relative;\n border-bottom: $modal-header-border;\n border-radius: 0.5em 0.5em 0 0;\n padding: 0.5em;\n text-align: center;\n justify-content: center;\n align-items: center;\n background: $modal-header-bg;\n text-transform: uppercase;\n\n button {\n width: $icon-size;\n height: $icon-size;\n position: absolute;\n right: 0;\n margin: auto $icon-margin;\n padding: 0;\n border: 0;\n background: transparent;\n\n &:hover {\n color: $default-hover-fg;\n }\n }\n }\n\n .body {\n max-height: 75vh;\n overflow: auto;\n padding: 2em;\n }\n }\n}\n</style>\n","import { render } from \"./Modal.vue?vue&type=template&id=09bd997a&scoped=true\"\nimport script from \"./Modal.vue?vue&type=script&lang=js\"\nexport * from \"./Modal.vue?vue&type=script&lang=js\"\n\nimport \"./Modal.vue?vue&type=style&index=0&id=09bd997a&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-09bd997a\"]])\n\nexport default __exports__","<template>\n <Modal ref=\"modal\" :title=\"title\">\n <div class=\"dialog-content\">\n <slot />\n </div>\n\n <form class=\"buttons\" @submit.prevent=\"onConfirm\">\n <button type=\"submit\" class=\"ok-btn\" @click=\"onConfirm\" @touch=\"onConfirm\">\n <i class=\"fas fa-check\" /> &nbsp; {{ confirmText }}\n </button>\n <button type=\"button\" class=\"cancel-btn\" @click=\"close\" @touch=\"close\">\n <i class=\"fas fa-xmark\" /> &nbsp; {{ cancelText }}\n </button>\n </form>\n </Modal>\n</template>\n\n<script>\nimport Modal from \"@/components/Modal\";\n\nexport default {\n emits: ['input', 'click', 'touch'],\n components: {Modal},\n props: {\n title: {\n type: String,\n },\n\n confirmText: {\n type: String,\n default: \"OK\",\n },\n\n cancelText: {\n type: String,\n default: \"Cancel\",\n },\n },\n\n methods: {\n onConfirm() {\n this.$emit('input')\n this.close()\n },\n\n show() {\n this.$refs.modal.show()\n },\n\n close() {\n this.$refs.modal.hide()\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n:deep(.modal) {\n .dialog-content {\n padding: 1em;\n }\n\n .body {\n padding: 1.5em;\n }\n\n .buttons {\n display: flex;\n flex-direction: row;\n justify-content: right;\n margin-bottom: 1em;\n border: 0;\n border-radius: 0;\n\n button {\n margin-right: 1em;\n padding: 0.5em 1em;\n border: 1px solid $border-color-2;\n border-radius: 1em;\n\n &:hover {\n background: $hover-bg;\n }\n }\n }\n}\n</style>\n","import { render } from \"./ConfirmDialog.vue?vue&type=template&id=db648f4c&scoped=true\"\nimport script from \"./ConfirmDialog.vue?vue&type=script&lang=js\"\nexport * from \"./ConfirmDialog.vue?vue&type=script&lang=js\"\n\nimport \"./ConfirmDialog.vue?vue&type=style&index=0&id=db648f4c&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-db648f4c\"]])\n\nexport default __exports__","<template>\n <button class=\"copy-button\"\n ref=\"copyButton\"\n title=\"Copy to clipboard\"\n @click.prevent=\"copy\"\n @input.prevent=\"copy\">\n <i class=\"fas fa-clipboard\" />\n </button>\n</template>\n\n<script>\nimport Utils from \"@/Utils\"\n\nexport default {\n name: \"CopyButton\",\n emits: ['input', 'click'],\n mixins: [Utils],\n props: {\n text: {\n type: String,\n },\n },\n\n methods: {\n async copy(event) {\n if (this.text?.length)\n await this.copyToClipboard(this.text)\n\n this.$emit(event.type, event)\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.copy-button {\n position: absolute;\n top: 0;\n right: 0.5em;\n margin: 0;\n padding: 0 !important;\n background: none;\n color: $code-dark-fg;\n border: none;\n padding: 0.5em;\n font-size: 1.5em;\n cursor: pointer;\n z-index: 1;\n}\n</style>\n","import { render } from \"./CopyButton.vue?vue&type=template&id=0bc64e95&scoped=true\"\nimport script from \"./CopyButton.vue?vue&type=script&lang=js\"\nexport * from \"./CopyButton.vue?vue&type=script&lang=js\"\n\nimport \"./CopyButton.vue?vue&type=style&index=0&id=0bc64e95&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-0bc64e95\"]])\n\nexport default __exports__","<template>\n <div class=\"dropdown-container\">\n <button :title=\"title\" ref=\"button\" @click.stop=\"toggle($event)\">\n <i class=\"icon\" :class=\"iconClass\" v-if=\"iconClass\" />\n <span class=\"text\" v-text=\"text\" v-if=\"text\" />\n </button>\n\n <div class=\"body-container hidden\" ref=\"dropdownContainer\">\n <DropdownBody :id=\"id\" :keepOpenOnItemClick=\"keepOpenOnItemClick\" ref=\"dropdown\" @click=\"onClick\">\n <slot />\n </DropdownBody>\n </div>\n </div>\n</template>\n\n<script>\nimport DropdownBody from \"./DropdownBody\";\nimport { bus } from \"@/bus\";\n\nexport default {\n components: { DropdownBody },\n emits: ['click'],\n props: {\n id: {\n type: String,\n },\n\n iconClass: {\n default: 'fa fa-ellipsis-h',\n },\n\n text: {\n type: String,\n },\n\n title: {\n type: String,\n },\n\n keepOpenOnItemClick: {\n type: Boolean,\n default: false,\n },\n },\n\n data() {\n return {\n visible: false,\n }\n },\n\n computed: {\n buttonStyle() {\n if (!this.$refs.button)\n return {}\n\n return getComputedStyle(this.$refs.button)\n },\n\n buttonWidth() {\n return parseFloat(this.buttonStyle.width || 0)\n },\n\n buttonHeight() {\n return parseFloat(this.buttonStyle.height || 0)\n },\n },\n\n methods: {\n documentClickHndl(event) {\n if (!this.visible)\n return\n\n let element = event.target\n while (element) {\n if (element.classList.contains('dropdown'))\n return\n\n element = element.parentElement\n }\n\n this.close()\n },\n\n getDropdownWidth() {\n const dropdown = this.$refs.dropdown?.$el\n if (!dropdown)\n return 0\n\n return parseFloat(getComputedStyle(dropdown).width)\n },\n\n getDropdownHeight() {\n const dropdown = this.$refs.dropdown?.$el\n if (!dropdown)\n return 0\n\n return parseFloat(getComputedStyle(dropdown).height)\n },\n\n onClick() {\n if (!this.keepOpenOnItemClick)\n this.close()\n },\n\n close() {\n this.visible = false\n document.removeEventListener('click', this.documentClickHndl)\n bus.emit('dropdown-close')\n },\n\n open() {\n document.addEventListener('click', this.documentClickHndl)\n const element = this.$refs.dropdown?.$el\n if (!element.parentElement)\n this.$el.appendChild(element)\n\n this.visible = true\n this.$refs.dropdownContainer.classList.remove('hidden')\n this.$nextTick(() => {\n const buttonRect = this.$refs.button.getBoundingClientRect()\n const buttonPos = {\n left: buttonRect.left + window.scrollX,\n top: buttonRect.top + window.scrollY,\n }\n\n const pos = {\n left: buttonPos.left,\n top: buttonPos.top + this.buttonHeight,\n }\n\n const dropdownWidth = this.getDropdownWidth()\n const dropdownHeight = this.getDropdownHeight()\n\n if ((pos.left + dropdownWidth) > (window.innerWidth + window.scrollX) / 2) {\n pos.left -= (dropdownWidth - this.buttonWidth)\n }\n\n if ((pos.top + dropdownHeight) > (window.innerHeight + window.scrollY) / 2) {\n pos.top -= (dropdownHeight + this.buttonHeight - 10)\n }\n\n const element = this.$refs.dropdown.$el\n element.classList.add('fade-in')\n element.style.top = `${pos.top}px`\n element.style.left = `${pos.left}px`\n bus.emit('dropdown-open', this.$refs.dropdown)\n this.$refs.dropdownContainer.classList.add('hidden')\n })\n },\n\n toggle(event) {\n event.stopPropagation()\n this.$emit('click')\n this.visible ? this.close() : this.open()\n },\n\n onKeyUp(event) {\n event.stopPropagation()\n if (event.key === 'Escape') {\n this.close()\n }\n },\n },\n\n mounted() {\n document.body.addEventListener('keyup', this.onKeyUp)\n },\n\n unmounted() {\n document.body.removeEventListener('keyup', this.onKeyUp)\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.dropdown-container {\n position: relative;\n display: inline-flex;\n flex-direction: column;\n\n button {\n background: none;\n border: 0;\n padding: 0.5em;\n\n &:hover {\n color: $default-hover-fg;\n }\n }\n}\n</style>\n","<template>\n <div class=\"dropdown\" :id=\"id\" @click=\"$emit('click', $event)\">\n <slot />\n </div>\n</template>\n\n<script>\nexport default {\n emits: ['click'],\n props: {\n id: {\n type: String,\n },\n\n keepOpenOnItemClick: {\n type: Boolean,\n default: false,\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.dropdown {\n position: absolute;\n width: max-content;\n background: $dropdown-bg;\n border-radius: .25em;\n box-shadow: $dropdown-shadow;\n display: flex;\n flex-direction: column;\n z-index: 2;\n}\n\n:deep(.dropdown-container) {\n button {\n width: 100%;\n height: 100%;\n color: $default-fg-2;\n background: $dropdown-bg;\n border: 0;\n padding: 0.75em 0.5em;\n text-align: left;\n letter-spacing: 0.01em;\n\n &:hover {\n background: $hover-bg;\n color: $default-fg-2;\n }\n\n .text {\n padding-left: 0.25em;\n }\n }\n}\n</style>\n","import { render } from \"./DropdownBody.vue?vue&type=template&id=14579c63&scoped=true\"\nimport script from \"./DropdownBody.vue?vue&type=script&lang=js\"\nexport * from \"./DropdownBody.vue?vue&type=script&lang=js\"\n\nimport \"./DropdownBody.vue?vue&type=style&index=0&id=14579c63&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-14579c63\"]])\n\nexport default __exports__","import { render } from \"./Dropdown.vue?vue&type=template&id=3220f58b&scoped=true\"\nimport script from \"./Dropdown.vue?vue&type=script&lang=js\"\nexport * from \"./Dropdown.vue?vue&type=script&lang=js\"\n\nimport \"./Dropdown.vue?vue&type=style&index=0&id=3220f58b&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3220f58b\"]])\n\nexport default __exports__","<template>\n <div class=\"row item\" :class=\"itemClass\" @click=\"clicked\">\n <div class=\"col-2 icon\" v-if=\"iconClass?.length || iconUrl?.length\">\n <Icon :class=\"iconClass\" :url=\"iconUrl\" />\n </div>\n <div class=\"text\" :class=\"{'col-10': iconClass != null}\" v-text=\"text\" />\n </div>\n</template>\n\n<script>\nimport Icon from \"@/components/elements/Icon\";\nimport { bus } from \"@/bus\";\n\nexport default {\n components: {Icon},\n props: {\n iconClass: {\n type: String,\n },\n\n iconUrl: {\n type: String,\n },\n\n text: {\n type: String,\n },\n\n disabled: {\n type: Boolean,\n default: false,\n },\n\n itemClass: {}\n },\n\n methods: {\n clicked() {\n if (this.disabled)\n return false\n\n if (!this.$parent.keepOpenOnItemClick)\n bus.emit('dropdown-close')\n }\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.item {\n display: flex;\n flex-direction: row !important;\n min-width: 7.5em;\n padding: 0.75em 0.5em;\n cursor: pointer;\n align-items: center;\n color: $default-fg-2;\n border: 0 !important;\n cursor: pointer !important;\n box-shadow: none !important;\n\n &:hover {\n background: $hover-bg !important;\n }\n\n &.selected {\n font-weight: bold !important;\n }\n\n &.disabled {\n color: $dropdown-disabled-color;\n cursor: initial;\n }\n\n .text {\n text-align: left;\n margin-left: 0.5em;\n }\n\n .icon {\n width: 1.5em;\n display: inline-flex;\n align-items: center;\n }\n\n :deep(.icon-container) {\n width: 2em;\n display: inline-flex;\n align-items: center;\n\n .icon {\n margin: 0 1.5em 0 .5em;\n }\n }\n}\n</style>\n","import { render } from \"./DropdownItem.vue?vue&type=template&id=1311e9ab&scoped=true\"\nimport script from \"./DropdownItem.vue?vue&type=script&lang=js\"\nexport * from \"./DropdownItem.vue?vue&type=script&lang=js\"\n\nimport \"./DropdownItem.vue?vue&type=style&index=0&id=1311e9ab&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1311e9ab\"]])\n\nexport default __exports__","<template>\n <div class=\"extension-icon\" :style=\"{ width: `${size}`, height: `${size}` }\">\n <a :href=\"docsUrl\" target=\"_blank\" v-if=\"withDocsLink\">\n <img :src=\"iconUrl\" :alt=\"extensionName\" :title=\"extensionName\" />\n </a>\n <img :src=\"iconUrl\" :alt=\"extensionName\" :title=\"extensionName\" v-else />\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n name: {\n type: String,\n required: true,\n },\n\n size: {\n type: String,\n default: '1.75em',\n },\n\n withDocsLink: {\n type: Boolean,\n default: false,\n },\n },\n\n computed: {\n iconUrl() {\n return `https://static.platypush.tech/icons/${this.extensionName}-64.png`\n },\n\n extensionType() {\n return this.name.split('.')[0] == 'backend' ? 'backend' : 'plugin'\n },\n\n extensionName() {\n const words = this.name.split('.')\n if (words.length < 1)\n return this.name\n\n if (words[0] == 'backend')\n words.shift()\n\n return words.join('.')\n },\n\n docsUrl() {\n return `https://docs.platypush.tech/platypush/${this.extensionType}s/${this.extensionName}.html`\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.extension-icon {\n img {\n width: 100%;\n height: 100%;\n }\n}\n</style>\n","import { render } from \"./ExtensionIcon.vue?vue&type=template&id=0353c248&scoped=true\"\nimport script from \"./ExtensionIcon.vue?vue&type=script&lang=js\"\nexport * from \"./ExtensionIcon.vue?vue&type=script&lang=js\"\n\nimport \"./ExtensionIcon.vue?vue&type=style&index=0&id=0353c248&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-0353c248\"]])\n\nexport default __exports__","<template>\n <div class=\"floating-btn\" :class=\"className\">\n <button type=\"button\" class=\"btn btn-primary\" :title=\"title\" @click=\"$emit('click', $event)\">\n <Icon :class=\"iconClass\" :url=\"iconUrl\" />\n </button>\n </div>\n</template>\n\n<script>\nimport Icon from \"@/components/elements/Icon\";\n\nexport default {\n name: \"FloatingButton\",\n components: {Icon},\n emits: [\"click\"],\n\n props: {\n iconClass: {\n type: String,\n },\n iconUrl: {\n type: String,\n },\n class: {\n type: String,\n },\n title: {\n type: String,\n },\n },\n\n computed: {\n className() {\n return this.class\n }\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.floating-btn {\n position: fixed;\n bottom: 0;\n right: 0;\n margin: auto 1em 1em auto;\n\n button {\n background: $tile-bg !important;\n color: $tile-fg !important;\n width: 4em;\n height: 4em;\n border-radius: 2em;\n border: none !important;\n padding: 0;\n box-shadow: $border-shadow-bottom-right;\n\n &:hover {\n background: $tile-hover-bg !important;\n }\n }\n\n :deep(button) {\n .icon-container {\n width: 4em;\n\n .icon {\n margin: auto;\n }\n }\n }\n}\n</style>\n","import { render } from \"./FloatingButton.vue?vue&type=template&id=681f7492&scoped=true\"\nimport script from \"./FloatingButton.vue?vue&type=script&lang=js\"\nexport * from \"./FloatingButton.vue?vue&type=script&lang=js\"\n\nimport \"./FloatingButton.vue?vue&type=style&index=0&id=681f7492&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-681f7492\"]])\n\nexport default __exports__","<template>\n <div class=\"icon-container\">\n <img class=\"icon\" :src=\"url\" :alt=\"alt\" v-if=\"url?.length\">\n <i class=\"icon\" :class=\"className\" :style=\"{color: color}\"\n v-else-if=\"className?.length\" />\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n class: {\n type: String,\n },\n url: {\n type: String,\n },\n color: {\n type: String,\n default: '',\n },\n alt: {\n type: String,\n default: '',\n },\n },\n\n computed: {\n className() {\n return this.class\n }\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.icon-container {\n display: inline-flex;\n width: $icon-container-size;\n justify-content: center;\n text-align: center;\n\n .icon {\n width: 1em;\n height: 1em;\n }\n}\n</style>\n","import { render } from \"./Icon.vue?vue&type=template&id=706a3bd1&scoped=true\"\nimport script from \"./Icon.vue?vue&type=script&lang=js\"\nexport * from \"./Icon.vue?vue&type=script&lang=js\"\n\nimport \"./Icon.vue?vue&type=style&index=0&id=706a3bd1&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-706a3bd1\"]])\n\nexport default __exports__","<template>\n <div class=\"restart-btn-container\">\n <ConfirmDialog ref=\"modal\" @input=\"restart\">\n Are you sure that you want to restart the application?\n </ConfirmDialog>\n\n <button class=\"btn btn-default restart-btn\" @click=\"showDialog\" @touch=\"showDialog\">\n <i class=\"fas fa-redo-alt\" /> &nbsp; Restart Application\n </button>\n </div>\n</template>\n\n<script>\nimport ConfirmDialog from \"@/components/elements/ConfirmDialog\"\nimport Utils from '@/Utils'\n\nexport default {\n name: \"RestartButton\",\n components: {ConfirmDialog},\n mixins: [Utils],\n methods: {\n showDialog() {\n this.$refs.modal.show()\n },\n\n async restart() {\n await this.request('application.restart')\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"@/style/common.scss\";\n</style>\n","import { render } from \"./RestartButton.vue?vue&type=template&id=2edff8b7&scoped=true\"\nimport script from \"./RestartButton.vue?vue&type=script&lang=js\"\nexport * from \"./RestartButton.vue?vue&type=script&lang=js\"\n\nimport \"./RestartButton.vue?vue&type=style&index=0&id=2edff8b7&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-2edff8b7\"]])\n\nexport default __exports__","<template>\n <div class=\"tab\" :class=\"selected ? 'selected' : ''\" @click=\"$emit('input')\">\n <span class=\"icon\" v-if=\"iconClass?.length || iconUrl?.length\">\n <Icon :class=\"iconClass\" :url=\"iconUrl\" />\n </span> &nbsp;\n <slot />\n </div>\n</template>\n\n<script>\nimport Icon from \"@/components/elements/Icon\";\n\nexport default {\n name: \"Tab\",\n components: {Icon},\n emits: ['input'],\n props: {\n selected: {\n type: Boolean,\n default: false,\n },\n\n iconClass: {\n type: String,\n },\n\n iconUrl: {\n type: String,\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.tab {\n height: $tab-height;\n background: $tab-bg;\n display: flex;\n padding: 1em;\n align-items: center;\n border-right: $default-border-2;\n cursor: pointer;\n\n @include until($tablet) {\n flex-grow: 1;\n justify-content: center;\n }\n\n &.selected {\n background: $selected-bg;\n font-weight: bold;\n }\n\n &:hover {\n background: $hover-bg;\n }\n\n :deep(.icon-container) {\n width: 1.5em;\n }\n}\n</style>\n","import { render } from \"./Tab.vue?vue&type=template&id=f3217d34&scoped=true\"\nimport script from \"./Tab.vue?vue&type=script&lang=js\"\nexport * from \"./Tab.vue?vue&type=script&lang=js\"\n\nimport \"./Tab.vue?vue&type=style&index=0&id=f3217d34&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-f3217d34\"]])\n\nexport default __exports__","<template>\n <div class=\"tabs\">\n <slot />\n </div>\n</template>\n\n<script>\nexport default {\n name: \"Tabs\",\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.tabs {\n background: $tabs-bg;\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n margin-top: 0.2em;\n margin-bottom: 0.2em;\n box-shadow: $border-shadow-bottom;\n}\n</style>\n","import { render } from \"./Tabs.vue?vue&type=template&id=f4300bb0&scoped=true\"\nimport script from \"./Tabs.vue?vue&type=script&lang=js\"\nexport * from \"./Tabs.vue?vue&type=script&lang=js\"\n\nimport \"./Tabs.vue?vue&type=style&index=0&id=f4300bb0&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-f4300bb0\"]])\n\nexport default __exports__","<template>\n <div class=\"row plugin extensions-container\">\n <Loading v-if=\"loading\" />\n\n <header>\n <div class=\"filter-container\">\n <input type=\"text\"\n ref=\"filter\"\n placeholder=\"Extension name\"\n v-model=\"filter\"\n :disabled=\"loading\" />\n </div>\n </header>\n\n <main>\n <div class=\"items\">\n <div class=\"extension-container\" v-for=\"name in extensionNames\" :key=\"name\">\n <div class=\"extension\" v-if=\"matchesFilter(name)\">\n <div class=\"item\"\n :class=\"{selected: name === selectedExtension}\"\n :data-name=\"name\"\n @click=\"onClick(name, false)\">\n <ExtensionIcon :name=\"name\" size=\"1.75em\" />\n <span class=\"name\">{{ extensions[name].name }}</span>\n <span class=\"enabled icon\" title=\"Enabled\" v-if=\"enabledExtensions[name]\">\n <i class=\"enabled icon fas fa-circle-check\" v-if=\"enabledExtensions[name]\" />\n </span>\n </div>\n\n <div class=\"extension-body-container until tablet\"\n v-if=\"selectedExtension && name === selectedExtension\">\n <Extension :extension=\"extensions[selectedExtension]\"\n :config=\"enabledExtensions[selectedExtension]\"\n :config-file=\"configFile\" />\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"extension-body-container from desktop\"\n v-if=\"selectedExtension\">\n <Extension :extension=\"extensions[selectedExtension]\"\n :config=\"enabledExtensions[selectedExtension]\"\n :config-file=\"configFile\" />\n </div>\n </main>\n </div>\n</template>\n\n<script>\nimport Extension from \"./Extension\"\nimport ExtensionIcon from \"@/components/elements/ExtensionIcon\"\nimport Loading from \"@/components/Loading\"\nimport Utils from \"@/Utils\"\nimport { bus } from \"@/bus\"\n\nexport default {\n name: \"Extensions\",\n mixins: [Utils],\n components: {\n Extension,\n ExtensionIcon,\n Loading,\n },\n\n data() {\n return {\n loading: false,\n plugins: {},\n backends: {},\n enabledPlugins: {},\n enabledBackends: {},\n filter: '',\n selectedExtension: null,\n configFile: null,\n config: {},\n }\n },\n\n computed: {\n extensions() {\n const extensions = {}\n\n Object.entries(this.plugins).forEach(([name, plugin]) => {\n extensions[name] = {\n ...plugin,\n name: name,\n }\n })\n\n Object.entries(this.backends).forEach(([name, backend]) => {\n name = `backend.${name}`\n extensions[name] = {\n ...backend,\n name: name,\n }\n })\n\n return extensions\n },\n\n enabledExtensions() {\n return [this.enabledPlugins, this.enabledBackends].reduce((acc, extensions) => {\n Object.entries(extensions).forEach(([name, config]) => {\n acc[name] = config\n })\n\n return acc\n }, {})\n },\n\n extensionNames() {\n return Object.keys(this.extensions).sort()\n },\n },\n\n methods: {\n onClick(input, setFilter = true, setUrlArgs = true) {\n if (this.selectedExtension === input) {\n this.selectedExtension = null\n } else {\n this.onInput(input, setFilter, setUrlArgs)\n }\n },\n\n onInput(input, setFilter = true, setUrlArgs = true) {\n if (setFilter) {\n this.filter = input\n }\n\n const name = input?.toLowerCase()?.trim()\n if (name?.length && this.extensions[name]) {\n this.selectedExtension = name\n if (setUrlArgs)\n this.setUrlArgs({extension: name})\n\n const el = this.$el.querySelector(`.extensions-container .item[data-name=\"${name}\"]`)\n if (el)\n el.scrollIntoView({behavior: 'smooth'})\n } else {\n this.selectedExtension = null\n if (setUrlArgs)\n this.setUrlArgs({})\n }\n },\n\n matchesFilter(extension) {\n if (!this.filter) {\n return true\n }\n\n return extension.includes(this.filter.toLowerCase())\n },\n\n async loadExtensions() {\n this.loading = true\n let [enabledPlugins, enabledBackends] = [[], []]\n\n try {\n [\n this.plugins,\n this.backends,\n enabledPlugins,\n enabledBackends,\n this.config,\n ] =\n await Promise.all([\n this.request('inspect.get_all_plugins'),\n this.request('inspect.get_all_backends'),\n this.request('inspect.get_enabled_plugins'),\n this.request('inspect.get_enabled_backends'),\n this.request('inspect.get_config'),\n ])\n } finally {\n this.loading = false\n }\n\n this.enabledPlugins = enabledPlugins.reduce((acc, name) => {\n acc[name] = this.config[name] || {}\n return acc\n }, {})\n\n this.enabledBackends = enabledBackends.reduce((acc, name) => {\n name = `backend.${name}`\n acc[name] = this.config[name] || {}\n return acc\n }, {})\n\n this.loadExtensionFromUrl()\n this.$watch('$route.hash', () => this.loadExtensionFromUrl())\n },\n\n async loadConfigFile() {\n this.configFile = await this.request('config.get_config_file')\n },\n\n loadExtensionFromUrl() {\n const extension = this.getUrlArgs().extension\n if (extension)\n this.$nextTick(() => this.onInput(extension, false, false))\n },\n },\n\n mounted() {\n this.loadConfigFile()\n this.loadExtensions()\n bus.on('update:extension', (ext) => this.onInput(ext, false))\n this.$nextTick(() => this.$refs.filter.focus())\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"src/style/items\";\n@import \"@/components/Action/common\";\n\n$header-height: 3.25em;\n\n.extensions-container {\n width: 100%;\n display: flex;\n flex-direction: column;\n margin-top: .15em;\n\n header {\n height: $header-height;\n padding: 0.5em;\n margin-bottom: 2px;\n box-shadow: $border-shadow-bottom;\n\n .filter-container {\n width: 100%;\n\n input {\n width: 100%;\n }\n }\n }\n\n main {\n height: calc(100% - #{$header-height} - 0.25em);\n min-height: calc(100% - #{$header-height} - 0.25em);\n background: $background-color;\n display: flex;\n flex-direction: row;\n }\n\n .items {\n height: 100%;\n flex-grow: 1;\n overflow: auto;\n border-bottom: $default-border-2;\n }\n\n .extension-container {\n .extension {\n display: flex;\n flex-direction: column;\n\n :deep(.item) {\n .extension-icon {\n margin-right: 0.5em;\n }\n }\n\n .item {\n width: 100%;\n display: flex;\n padding: 1em;\n position: relative;\n\n .icon {\n width: 2.5em;\n position: absolute;\n right: -1em;\n top: 0.65em;\n }\n\n &.selected {\n font-weight: bold;\n }\n }\n }\n }\n\n .extension-body-container.desktop {\n width: 70%;\n height: 100%;\n min-height: 100%;\n border-left: $default-border-2;\n border-bottom: $default-border-2;\n\n :deep(article) {\n height: 100%;\n overflow: auto;\n }\n }\n}\n</style>\n","<template>\n <div class=\"extension\">\n <header>\n <Tabs>\n <Tab :selected=\"selectedTab === 'doc'\" icon-class=\"fas fa-book\"\n @input=\"selectedTab = 'doc'\">\n <span class=\"from tablet\">Documentation</span>\n </Tab>\n\n <Tab :selected=\"selectedTab === 'install'\" icon-class=\"fas fa-download\"\n @input=\"selectedTab = 'install'\">\n <span class=\"from tablet\">Install</span>\n </Tab>\n\n <Tab :selected=\"selectedTab === 'config'\" icon-class=\"fas fa-square-check\"\n @input=\"selectedTab = 'config'\">\n <span class=\"from tablet\">Configuration</span>\n </Tab>\n </Tabs>\n </header>\n\n <div class=\"extension-body\">\n <Doc v-if=\"selectedTab === 'doc'\" :extension=\"extension\" />\n <Config v-else-if=\"selectedTab === 'config'\"\n :extension=\"extension\"\n :config=\"config\"\n :config-file=\"configFile\" />\n <Install v-else-if=\"selectedTab === 'install'\" :extension=\"extension\" />\n </div>\n </div>\n</template>\n\n<script>\nimport Tab from \"@/components/elements/Tab\"\nimport Tabs from \"@/components/elements/Tabs\"\nimport Config from \"./Config\"\nimport Doc from \"./Doc\"\nimport Install from \"./Install\"\n\nexport default {\n name: \"Extension\",\n components: {\n Config,\n Doc,\n Install,\n Tab,\n Tabs,\n },\n\n props: {\n extension: {\n type: Object,\n required: true,\n },\n\n config: {\n type: Object,\n },\n\n configFile: {\n type: String,\n },\n },\n\n data() {\n return {\n selectedTab: 'doc',\n }\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"src/style/items\";\n\n$header-height: 3.6em;\n\n.extension {\n width: 100%;\n height: 100%;\n background: $background-color;\n display: flex;\n flex-direction: column;\n border-top: 1px solid $border-color-1;\n box-shadow: $border-shadow-bottom;\n\n header {\n height: $header-height;\n\n :deep(.tabs) {\n margin: 0;\n }\n }\n\n .extension-body {\n height: calc(100% - #{$header-height});\n display: flex;\n flex-direction: column;\n overflow: auto;\n\n :deep(section) {\n height: calc(100% - #{$header-height});\n }\n }\n}\n</style>\n","<template>\n <div class=\"config-container current\"\n v-if=\"highlightedCurrentConfig\">\n <CopyButton :text=\"curYamlConfig\" />\n <pre><code class=\"config-snippet\" v-html=\"highlightedCurrentConfig\" /></pre>\n </div>\n\n <div class=\"config-container snippet\" :class=\"{'fullscreen': !highlightedCurrentConfig}\">\n <CopyButton :text=\"extension.config_snippet\" />\n <pre><code class=\"config-snippet\" v-html=\"highlightedConfigSnippet\" /></pre>\n </div>\n</template>\n\n<script>\nimport 'highlight.js/lib/common'\nimport 'highlight.js/styles/stackoverflow-dark.min.css'\nimport hljs from \"highlight.js\"\nimport CopyButton from \"@/components/elements/CopyButton\"\nimport Utils from \"@/Utils\";\n\nexport default {\n name: \"Extension\",\n mixins: [Utils],\n components: {\n CopyButton,\n },\n\n props: {\n extension: {\n type: Object,\n required: true,\n },\n\n config: {\n type: Object,\n },\n\n configFile: {\n type: String,\n },\n },\n\n data() {\n return {\n curYamlConfig: null,\n }\n },\n\n computed: {\n highlightedConfigSnippet() {\n return hljs.highlight(\n `# Configuration template. You can add it to ${this.configFile}\\n` +\n this.extension.config_snippet,\n {language: 'yaml'}\n ).value.trim()\n },\n\n highlightedCurrentConfig() {\n if (!this.curYamlConfig) {\n return null\n }\n\n return hljs.highlight(\n 'yaml',\n '# Currently loaded configuration\\n' +\n this.curYamlConfig\n ).value.trim()\n },\n },\n\n methods: {\n async loadCurrentConfig() {\n if (!this.config) {\n this.curYamlConfig = null\n return\n }\n\n this.curYamlConfig = await this.request(\n 'utils.to_yaml', {\n obj: {\n [this.extension.name]: this.config,\n }\n }\n )\n },\n },\n\n mounted() {\n this.loadCurrentConfig()\n this.$watch('config', this.loadCurrentConfig)\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"common.scss\";\n\n.config-container {\n width: 100%;\n max-height: 100%;\n position: relative;\n display: flex;\n flex-grow: 1;\n overflow: auto;\n\n pre {\n border-radius: 1em;\n }\n\n &.current {\n height: 34%;\n margin-bottom: 1.5em;\n }\n\n &.snippet {\n height: 66%;\n }\n\n &.fullscreen {\n height: 100%;\n\n pre {\n border-radius: 0;\n }\n }\n}\n</style>\n","import { render } from \"./Config.vue?vue&type=template&id=4634d8cb&scoped=true\"\nimport script from \"./Config.vue?vue&type=script&lang=js\"\nexport * from \"./Config.vue?vue&type=script&lang=js\"\n\nimport \"./Config.vue?vue&type=style&index=0&id=4634d8cb&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4634d8cb\"]])\n\nexport default __exports__","<template>\n <section class=\"doc\">\n <header>\n <h2>\n <a class=\"title\" :href=\"extension.doc_url\" target=\"_blank\">\n <ExtensionIcon :name=\"extension.name\" size=\"2em\" with-docs-link />\n <span class=\"name\" v-text=\"extension.name\" />\n </a>\n </h2>\n </header>\n\n <article v-if=\"doc\" @click=\"onDocClick\">\n <div class=\"doc-content\" v-html=\"doc\" />\n\n <div class=\"actions\" v-if=\"Object.keys(extension.actions || {}).length > 0\">\n <h3>\n <i class=\"icon fas fa-play\" /> &nbsp;\n Actions\n </h3>\n\n <ul>\n <li class=\"action\" v-for=\"actionName in actionNames\" :key=\"actionName\">\n <a :href=\"`/#execute?action=${extension.name}.${actionName}`\">\n {{ extension.name }}.{{ actionName }}\n </a>\n </li>\n </ul>\n </div>\n\n <div class=\"events\" v-if=\"Object.keys(extension.events || {}).length > 0\">\n <h3>\n <i class=\"icon fas fa-flag\" /> &nbsp;\n Events\n </h3>\n\n <ul>\n <li class=\"event\" v-for=\"eventName in eventNames\" :key=\"eventName\">\n <a :href=\"extension.events[eventName].doc_url\" target=\"_blank\">\n {{ eventName }}\n </a>\n </li>\n </ul>\n </div>\n </article>\n </section>\n</template>\n\n<script>\nimport ExtensionIcon from \"@/components/elements/ExtensionIcon\"\nimport Utils from \"@/Utils\"\nimport { bus } from \"@/bus\";\n\nexport default {\n name: \"Doc\",\n mixins: [Utils],\n components: {\n ExtensionIcon,\n },\n\n props: {\n extension: {\n type: Object,\n required: true,\n },\n },\n\n data() {\n return {\n doc: null,\n localPageRegex: new RegExp('^/?#.*$'),\n }\n },\n\n computed: {\n actionNames() {\n return Object.keys(this.extension.actions).sort()\n },\n\n eventNames() {\n return Object.keys(this.extension.events).sort()\n },\n },\n\n methods: {\n async parseDoc() {\n if (!this.extension.doc?.length)\n return null\n\n return await this.request(\n 'utils.rst_to_html',\n {text: this.extension.doc}\n )\n },\n\n refreshDoc() {\n this.parseDoc().then(doc => this.doc = doc)\n },\n\n // Intercept links to the documentation and replace them with\n // in-app connections, or opens them in a new tab if they\n // don't point to an internal documentation page.\n onDocClick(event) {\n if (event.target.tagName.toLowerCase() !== 'a')\n return true\n\n event.preventDefault()\n const href = event.target.getAttribute('href')\n if (!href)\n return true\n\n if (href.match(this.localPageRegex)) {\n window.location.href = href\n return true\n }\n\n const match = href.match(/^https:\\/\\/docs\\.platypush\\.tech\\/platypush\\/(plugins|backend)\\/([\\w.]+)\\.html#?.*$/)\n if (!match) {\n event.preventDefault()\n window.open(href, '_blank')\n return true\n }\n\n let [type, name] = match.slice(1)\n if (type === 'backend')\n name = `backend.${name}`\n\n bus.emit('update:extension', name)\n event.preventDefault()\n },\n },\n\n mounted() {\n this.refreshDoc()\n this.$watch('extension.doc', this.refreshDoc)\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n$header-height: 3.5em;\n\nsection {\n height: 100%;\n\n header {\n height: $header-height;\n padding: 0.5em;\n border-bottom: 1px solid $border-color-2;\n\n h2 {\n margin: 0;\n padding: 0;\n font-size: 1.25em;\n }\n\n .title {\n display: flex;\n align-items: center;\n\n .name {\n margin-left: 0.5em;\n }\n }\n }\n\n article {\n height: calc(100% - #{$header-height});\n padding: 0.5em;\n overflow: auto;\n\n :deep(ul) {\n margin-left: 1em;\n\n li {\n list-style: disc;\n }\n }\n }\n\n .actions, .events {\n padding: 0.5em;\n overflow: auto;\n\n h3 {\n width: calc(100% - 1em);\n margin: 0 -0.5em;\n padding: 0 0.5em;\n font-size: 1.25em;\n opacity: 0.85;\n border-bottom: 1px solid $border-color-1;\n }\n\n ul {\n display: flex;\n flex-direction: column;\n margin: 0;\n\n li {\n width: 100%;\n display: block;\n margin: 0.5em 0;\n list-style: none;\n\n a {\n width: 100%;\n display: block;\n }\n }\n }\n\n pre {\n margin: 0;\n }\n }\n}\n</style>\n","import { render } from \"./Doc.vue?vue&type=template&id=49986d05&scoped=true\"\nimport script from \"./Doc.vue?vue&type=script&lang=js\"\nexport * from \"./Doc.vue?vue&type=script&lang=js\"\n\nimport \"./Doc.vue?vue&type=style&index=0&id=49986d05&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-49986d05\"]])\n\nexport default __exports__","<template>\n <div class=\"install-container\">\n <section class=\"top\">\n <header>\n <h2>Dependencies</h2>\n </header>\n\n <div class=\"body\">\n <div class=\"container install-cmd-container\">\n <CopyButton :text=\"installCmd\" v-if=\"installCmd\" />\n <pre><Loading v-if=\"loading\" /><code v-html=\"highlightedInstallCmd\" v-else /></pre>\n </div>\n\n <div class=\"buttons install-btn\" v-if=\"installCmd\">\n <RestartButton v-if=\"installDone\" />\n <button type=\"button\"\n class=\"btn btn-default\"\n :disabled=\"installRunning\"\n @click=\"installExtension\">\n <i class=\"fas fa-download\" /> Install\n </button>\n </div>\n </div>\n </section>\n\n <section class=\"bottom\" v-if=\"installRunning || installOutput\">\n <header>\n <h2>Output</h2>\n </header>\n\n <div class=\"body\">\n <div class=\"container install-output\" ref=\"installOutput\">\n <CopyButton :text=\"installOutput\" />\n <pre><code v-text=\"installOutput\" /><div\n class=\"loading-container\"\n v-if=\"installRunning\">\n <Loading />\n </div></pre>\n </div>\n </div>\n </section>\n </div>\n</template>\n\n<script>\nimport 'highlight.js/lib/common'\nimport 'highlight.js/styles/stackoverflow-dark.min.css'\nimport hljs from \"highlight.js\"\nimport CopyButton from \"@/components/elements/CopyButton\"\nimport Loading from \"@/components/Loading\"\nimport RestartButton from \"@/components/elements/RestartButton\"\nimport Utils from \"@/Utils\"\n\nexport default {\n name: \"Install\",\n mixins: [Utils],\n emit: ['install-start', 'install-end'],\n components: {\n CopyButton,\n Loading,\n RestartButton,\n },\n\n props: {\n extension: {\n type: Object,\n required: true,\n },\n },\n\n data() {\n return {\n installRunning: false,\n installDone: false,\n installOutput: null,\n installCmds: [],\n pendingCommands: 0,\n error: null,\n loading: false,\n }\n },\n\n computed: {\n installCmd() {\n if (this.installCmds.length)\n return this.installCmds.join('\\n').trim()\n\n return null\n },\n\n highlightedInstallCmd() {\n return (\n hljs.highlight(\n this.installCmd ?\n this.installCmds\n .map((cmd) => `$ ${cmd}`)\n .join('\\n')\n .trim() :\n '# No extra installation steps required',\n {language: 'bash'}\n ).value\n )\n },\n },\n\n methods: {\n wsProcess(path) {\n try {\n const protocol = window.location.protocol === 'https:' ? 'wss' : 'ws'\n const url = `${protocol}://${location.host}${path}`\n const ws = new WebSocket(url)\n\n ws.onmessage = this.onMessage\n ws.onerror = this.onError\n ws.onclose = this.onClose\n } catch (err) {\n this.notify({\n error: true,\n title: `Websocket initialization error`,\n text: err.toString(),\n })\n\n console.error('Websocket initialization error')\n console.error(err)\n this.error = err\n this.installRunning = false\n }\n },\n\n onMessage(msg) {\n if (!this.installOutput)\n this.installOutput = ''\n\n this.installOutput += msg.data\n },\n\n onClose() {\n this.installRunning = false\n this.$emit('install-end', this.extension)\n\n if (!this.error)\n this.installDone = true\n this.notify({\n title: `Extension installed`,\n html: `Extension <b>${this.extension.name}</b> installed successfully`,\n image: {\n iconClass: 'fas fa-check',\n },\n })\n },\n\n onError(error) {\n this.notify({\n error: true,\n title: `Websocket error`,\n text: error.toString(),\n })\n\n console.error('Websocket error')\n console.error(error)\n this.error = error\n this.installRunning = false\n },\n\n installExtension() {\n if (!this.installCmd)\n return\n\n this.error = null\n this.installRunning = true\n this.installOutput = ''\n this.$emit('install-start', this.extension)\n\n const cmd = this.installCmds.join(';\\n')\n this.request('shell.exec', {\n cmd: cmd,\n ws: true,\n }).then((output) => {\n this.wsProcess(output.ws_path)\n }).catch((err) => {\n this.error = err\n this.installRunning = false\n this.$emit('install-end', this.extension)\n })\n },\n\n async refreshInstallCmds() {\n this.loading = true\n try {\n this.installCmds = await this.request('application.get_install_commands', {\n extension: this.extension.name,\n })\n } finally {\n this.loading = false\n }\n },\n },\n\n mounted() {\n this.refreshInstallCmds()\n this.$watch('extension.name', () => {\n this.refreshInstallCmds()\n })\n\n this.$watch('installOutput', () => {\n this.$nextTick(() => {\n this.$refs.installOutput.focus()\n this.$refs.installOutput.scrollTop = this.$refs.installOutput.scrollHeight\n })\n })\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"common.scss\";\n\n$header-height: 3.5em;\n\n.install-container {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n\n section {\n &.top {\n height: 33.3333% !important;\n }\n\n &.bottom {\n height: 66.6666% !important;\n }\n\n header {\n height: $header-height;\n padding-left: 0.5em;\n border-top: 1px solid $border-color-1;\n border-bottom: 1px solid $border-color-1;\n }\n\n .body {\n height: calc(100% - #{$header-height});\n display: flex;\n flex-direction: column;\n padding: 1em;\n }\n\n h2 {\n font-size: 1.3em;\n opacity: 0.9;\n }\n }\n\n .container {\n width: 100%;\n height: 100%;\n position: relative;\n display: flex;\n flex-direction: column;\n }\n\n pre {\n height: 100%;\n position: relative;\n border-radius: 1em;\n }\n\n :deep(.install-btn) {\n width: 100%;\n margin-top: 1em;\n display: flex;\n justify-content: right;\n\n button {\n border-radius: 0.5em;\n margin-right: 0.5em;\n }\n }\n\n .loading-container {\n width: 100%;\n position: relative;\n\n :deep(.loading) {\n background: none;\n }\n }\n}\n</style>\n","import { render } from \"./Install.vue?vue&type=template&id=5e00060c&scoped=true\"\nimport script from \"./Install.vue?vue&type=script&lang=js\"\nexport * from \"./Install.vue?vue&type=script&lang=js\"\n\nimport \"./Install.vue?vue&type=style&index=0&id=5e00060c&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5e00060c\"]])\n\nexport default __exports__","import { render } from \"./Extension.vue?vue&type=template&id=3fa6b036&scoped=true\"\nimport script from \"./Extension.vue?vue&type=script&lang=js\"\nexport * from \"./Extension.vue?vue&type=script&lang=js\"\n\nimport \"./Extension.vue?vue&type=style&index=0&id=3fa6b036&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3fa6b036\"]])\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=74d75ec7&scoped=true\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=74d75ec7&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-74d75ec7\"]])\n\nexport default __exports__","<template>\n <div class=\"settings-container\">\n <main>\n <Application v-if=\"selectedPanel === 'application'\" />\n <Users :session-token=\"sessionToken\" :current-user=\"currentUser\"\n v-if=\"selectedPanel === 'users' && currentUser\" />\n <Token :session-token=\"sessionToken\" :current-user=\"currentUser\"\n v-else-if=\"selectedPanel === 'tokens' && currentUser\" />\n </main>\n </div>\n</template>\n\n<script>\nimport Application from \"@/components/panels/Settings/Application\";\nimport Token from \"@/components/panels/Settings/Token\";\nimport Users from \"@/components/panels/Settings/Users\";\nimport Utils from \"@/Utils\";\n\nexport default {\n name: \"Settings\",\n components: {Application, Users, Token},\n mixins: [Utils],\n\n props: {\n selectedPanel: {\n type: String,\n },\n },\n\n data() {\n return {\n currentUser: null,\n sessionToken: null,\n }\n },\n\n methods: {\n async refresh() {\n this.sessionToken = this.getCookies()['session_token']\n this.currentUser = await this.request('user.get_user_by_session', {session_token: this.sessionToken})\n }\n },\n\n mounted() {\n this.refresh()\n }\n}\n</script>\n\n<style lang=\"scss\">\n$header-height: 3em;\n\n.settings-container {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n\n header {\n width: 100%;\n height: $header-height;\n display: flex;\n background: $background-color;\n box-shadow: $border-shadow-bottom;\n padding: .5em;\n\n select {\n width: 100%;\n }\n\n button {\n padding-top: .25em;\n }\n }\n\n main {\n height: calc(100% - #{$header-height});\n overflow: auto;\n }\n\n button {\n background: none;\n border: none;\n\n &:hover {\n border: none;\n color: $default-hover-fg;\n }\n }\n\n form {\n padding: 0;\n border: none;\n border-radius: 0;\n box-shadow: none;\n\n input {\n margin-bottom: 1em;\n }\n }\n\n input[type=password] {\n border-radius: 1em;\n }\n}\n</style>\n","<template>\n <div class=\"app-container\">\n <div class=\"btn-container\">\n <RestartButton />\n </div>\n\n <div class=\"btn-container\">\n <StopButton />\n </div>\n </div>\n</template>\n\n<script>\nimport RestartButton from \"@/components/elements/RestartButton\"\nimport StopButton from \"@/components/elements/StopButton\"\n\nexport default {\n name: \"Application\",\n components: {RestartButton, StopButton},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.app-container {\n width: 100%;\n height: 100%;\n position: relative;\n margin: 0;\n background: $background-color;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n\n :deep(.btn-container) {\n margin-bottom: 1em;\n\n button {\n width: 15em;\n\n &:hover {\n border: 1px solid $default-hover-fg;\n }\n }\n }\n}\n</style>\n","<template>\n <div class=\"stop-btn-container\">\n <ConfirmDialog ref=\"modal\" @input=\"stop\">\n Are you sure that you want to stop the application?\n <br /><br />\n <span class=\"text-danger\">\n This will stop the application and you will not be able to restart it\n through the Web interface!\n </span>\n </ConfirmDialog>\n\n <button class=\"btn btn-default stop-btn\" @click=\"showDialog\" @touch=\"showDialog\">\n <i class=\"fas fa-stop\" /> &nbsp; Stop Application\n </button>\n </div>\n</template>\n\n<script>\nimport ConfirmDialog from \"@/components/elements/ConfirmDialog\"\nimport Utils from '@/Utils'\n\nexport default {\n name: \"StopButton\",\n components: {ConfirmDialog},\n mixins: [Utils],\n methods: {\n showDialog() {\n this.$refs.modal.show()\n },\n\n async stop() {\n await this.request('application.stop')\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"@/style/common.scss\";\n\n.text-danger {\n color: $error-fg;\n}\n</style>\n","import { render } from \"./StopButton.vue?vue&type=template&id=1eab04fa&scoped=true\"\nimport script from \"./StopButton.vue?vue&type=script&lang=js\"\nexport * from \"./StopButton.vue?vue&type=script&lang=js\"\n\nimport \"./StopButton.vue?vue&type=style&index=0&id=1eab04fa&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1eab04fa\"]])\n\nexport default __exports__","import { render } from \"./Application.vue?vue&type=template&id=40365cea&scoped=true\"\nimport script from \"./Application.vue?vue&type=script&lang=js\"\nexport * from \"./Application.vue?vue&type=script&lang=js\"\n\nimport \"./Application.vue?vue&type=style&index=0&id=40365cea&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-40365cea\"]])\n\nexport default __exports__","<template>\n <div class=\"token-container\">\n <Loading v-if=\"loading\" />\n\n <Modal ref=\"tokenModal\">\n <div class=\"token-container\">\n <label>\n This is your generated token. Treat it carefully and do not share it with untrusted parties.<br/>\n Also, make sure to save it - it WILL NOT be displayed again.\n </label>\n\n <textarea class=\"token\" v-text=\"token\" @focus=\"onTokenSelect\" />\n </div>\n </Modal>\n\n <Modal ref=\"sessionTokenModal\">\n <div class=\"token-container\">\n <label>\n This is your current session token.\n It will be invalidated once you log out of the current session.\n </label>\n\n <textarea class=\"token\" v-text=\"sessionToken\" @focus=\"onTokenSelect\" />\n </div>\n </Modal>\n\n <div class=\"body\">\n <div class=\"description\">\n <p>\n Platypush provides two types of tokens:\n\n <ul>\n <li>\n <b>JWT tokens</b> are bearer-only, and they contain encrypted\n authentication information.<br/>\n They can be used as permanent or time-based tokens to\n authenticate with the Platypush API.\n </li>\n\n <li>\n <b>Session tokens</b> are randomly generated tokens stored on the\n application database. A session token generated in this session\n will expire when you log out of it.\n </li>\n </ul>\n </p>\n\n <p>Generate a JWT authentication token that can be used for API calls to the <code>/execute</code> endpoint.</p><br/>\n <p>You can include the token in your requests in any of the following ways:</p>\n\n <ul>\n <li>Specify it on the <code>Authorization: Bearer</code> header;</li>\n <li>Specify it on the <code>X-Token</code> header;</li>\n <li>\n Specify it as a URL parameter: <code>http://site:8008/execute?token=...</code>\n for a JWT token and <code>...?session_token=...</code> for a\n session token;\n </li>\n <li>Specify it on the body of your JSON request:\n <code>{\"type\":\"request\", \"action\", \"...\", \"token\":\"...\"}</code> for\n a JWT token, or <code>\"session_token\"</code> for a session token.\n </li>\n </ul>\n\n <p>Confirm your credentials in order to generate a new JWT token.</p>\n <p>\n <i>Show session token</i> will instead show the token cookie associated\n to the current session.\n </p>\n </div>\n\n <div class=\"form-container\">\n <form @submit.prevent=\"generateToken\" ref=\"generateTokenForm\">\n <label>\n <span>Username</span>\n <span>\n <input type=\"text\" name=\"username\" :value=\"currentUser.username\" disabled>\n </span>\n </label>\n\n <label>\n <span>Confirm password</span>\n <span>\n <input type=\"password\" name=\"password\">\n </span>\n </label>\n\n <label>\n <span>Token validity in days</span>\n <span>\n <input type=\"text\" name=\"validityDays\">\n </span>\n <span class=\"note\">\n Decimal values are also supported - e.g. <i>0.5</i> means half a\n day (12 hours). An empty or zero value means that the token has\n no expiry date.\n </span>\n </label>\n\n <label>\n <input type=\"submit\" class=\"btn btn-primary\" value=\"Generate JWT token\">\n </label>\n\n <label>\n <input type=\"button\" class=\"btn btn-default\" value=\"Show session token\"\n @click.stop=\"$refs.sessionTokenModal.show()\">\n </label>\n </form>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nimport axios from \"axios\";\nimport Loading from \"@/components/Loading\";\nimport Utils from \"@/Utils\";\nimport Modal from \"@/components/Modal\";\n\nexport default {\n name: \"Token\",\n components: {Modal, Loading},\n mixins: [Utils],\n\n props: {\n currentUser: {\n type: Object,\n required: true,\n },\n\n sessionToken: {\n type: String,\n required: true,\n },\n },\n\n data() {\n return {\n loading: false,\n token: null,\n }\n },\n\n methods: {\n async generateToken(event) {\n const username = this.currentUser.username\n const password = event.target.password.value\n let validityDays = event.target.validityDays?.length ? parseInt(event.target.validityDays.value) : 0\n if (!validityDays)\n validityDays = null\n\n this.loading = true\n try {\n this.token = (await axios.post('/auth', {\n username: username,\n password: password,\n expiry_days: validityDays,\n })).data.token\n\n if (this.token?.length)\n this.$refs.tokenModal.show()\n } catch (e) {\n console.error(e.toString())\n this.notify({\n text: e.toString(),\n error: true,\n })\n } finally {\n this.loading = false\n }\n },\n\n onTokenSelect(event) {\n event.target.select()\n document.execCommand('copy')\n\n this.notify({\n text: 'Token copied to clipboard',\n image: {\n iconClass: 'fa fa-check',\n }\n })\n },\n }\n}\n</script>\n\n<style lang=\"scss\">\n.token-container {\n width: 100%;\n display: flex;\n flex-direction: column;\n margin-top: .15em;\n\n label {\n width: 100%;\n }\n\n .body {\n background: $background-color;\n display: flex;\n\n .description {\n text-align: left;\n padding: 1em;\n }\n }\n\n ul {\n margin: 1em .5em;\n\n li {\n list-style: initial;\n }\n }\n\n .form-container {\n display: flex;\n }\n\n form {\n max-width: 250pt;\n\n .note {\n display: block;\n font-size: .75em;\n margin: -.75em 0 2em 0;\n }\n\n span {\n input {\n width: 100%;\n }\n }\n }\n\n input[type=password] {\n border-radius: 1em;\n }\n\n .modal {\n .content {\n width: 90%;\n }\n\n .body {\n margin-top: 0;\n }\n }\n\n .token-container {\n label {\n display: flex;\n flex-direction: column;\n\n span {\n display: block;\n width: 100%;\n }\n }\n\n textarea {\n width: 100%;\n height: 10em;\n margin-top: 1em;\n border-radius: 1em;\n border: none;\n background: $active-glow-bg-1;\n padding: 1em;\n }\n }\n\n .btn {\n border-radius: 1em;\n }\n}\n\n@media screen and (max-width: calc(#{$desktop} - 1px)) {\n .token-container {\n .body {\n flex-direction: column;\n }\n }\n\n .form-container {\n justify-content: center;\n box-shadow: $border-shadow-top;\n margin-top: -1em;\n padding-top: 1em;\n }\n}\n\n@media screen and (min-width: $desktop) {\n .token-container {\n justify-content: center;\n align-items: center;\n\n .description {\n width: 50%;\n }\n\n .form-container {\n width: 50%;\n justify-content: right;\n padding: 1em;\n\n label {\n text-align: left;\n }\n }\n\n .body {\n max-width: 650pt;\n flex-direction: row;\n justify-content: left;\n margin-top: 1.5em;\n border-radius: 1em;\n border: $default-border-2;\n }\n }\n}\n</style>\n","import { render } from \"./Token.vue?vue&type=template&id=2d3c7d78\"\nimport script from \"./Token.vue?vue&type=script&lang=js\"\nexport * from \"./Token.vue?vue&type=script&lang=js\"\n\nimport \"./Token.vue?vue&type=style&index=0&id=2d3c7d78&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <Loading v-if=\"loading\" />\n\n <Modal ref=\"addUserModal\" title=\"Add User\">\n <form action=\"#\" method=\"POST\" ref=\"addUserForm\" @submit=\"createUser\">\n <label>\n <input type=\"text\" name=\"username\" placeholder=\"Username\" :disabled=\"commandRunning\">\n </label>\n <label>\n <input type=\"password\" name=\"password\" placeholder=\"Password\" :disabled=\"commandRunning\">\n </label>\n <label>\n <input type=\"password\" name=\"confirm_password\" placeholder=\"Confirm password\" :disabled=\"commandRunning\">\n </label>\n <label>\n <input type=\"submit\" class=\"btn btn-primary\" value=\"Create User\" :disabled=\"commandRunning\">\n </label>\n </form>\n </Modal>\n\n <Modal ref=\"changePasswordModal\" title=\"Change Password\">\n <form action=\"#\" method=\"POST\" ref=\"changePasswordForm\" @submit=\"changePassword\">\n <label>\n <input type=\"text\" name=\"username\" placeholder=\"Username\" :value=\"selectedUser\" disabled=\"disabled\">\n </label>\n <label>\n <input type=\"password\" name=\"password\" placeholder=\"Current password\" :disabled=\"commandRunning\">\n </label>\n <label>\n <input type=\"password\" name=\"new_password\" placeholder=\"New password\" :disabled=\"commandRunning\">\n </label>\n <label>\n <input type=\"password\" name=\"confirm_new_password\" placeholder=\"Confirm new password\" :disabled=\"commandRunning\">\n </label>\n <label>\n <input type=\"submit\" class=\"btn btn-primary\" value=\"Change Password\" :disabled=\"commandRunning\">\n </label>\n </form>\n </modal>\n\n <div class=\"body\">\n <ul class=\"users-list\">\n <li v-for=\"user in users\" :key=\"user.user_id\" class=\"item user\" @click=\"selectedUser = user.username\">\n <div class=\"name col-8\" v-text=\"user.username\" />\n <div class=\"actions pull-right col-4\">\n <Dropdown title=\"User Actions\" icon-class=\"fa fa-ellipsis\">\n <DropdownItem text=\"Change Password\" :disabled=\"commandRunning\" icon-class=\"fa fa-key\"\n @click=\"showChangePasswordModal(user)\" />\n <DropdownItem text=\"Delete User\" :disabled=\"commandRunning\" icon-class=\"fa fa-trash\"\n @click=\"$refs.deleteUserDialog.show()\" />\n </Dropdown>\n </div>\n </li>\n </ul>\n\n <FloatingButton icon-class=\"fa fa-plus\" text=\"Add User\" @click=\"showAddUserModal\" />\n\n <ConfirmDialog ref=\"deleteUserDialog\" @input=\"deleteUser(selectedUser)\">\n Are you sure that you want to remove the user {{ selectedUser }}?\n </ConfirmDialog>\n </div>\n</template>\n\n<script>\nimport ConfirmDialog from \"@/components/elements/ConfirmDialog\";\nimport Dropdown from \"@/components/elements/Dropdown\";\nimport Modal from \"@/components/Modal\";\nimport Loading from \"@/components/Loading\";\nimport Utils from \"@/Utils\";\nimport DropdownItem from \"@/components/elements/DropdownItem\";\nimport FloatingButton from \"@/components/elements/FloatingButton\";\n\nexport default {\n name: \"Users\",\n components: {ConfirmDialog, Dropdown, DropdownItem, FloatingButton, Loading, Modal},\n mixins: [Utils],\n\n props: {\n sessionToken: {\n type: String,\n required: true,\n },\n\n currentUser: {\n type: Object,\n required: true,\n }\n },\n\n data() {\n return {\n users: [],\n commandRunning: false,\n loading: false,\n selectedUser: null,\n }\n },\n\n methods: {\n async refresh() {\n this.loading = true\n try {\n this.users = await this.request('user.get_users')\n } finally {\n this.loading = false\n }\n },\n\n async createUser(event) {\n event.preventDefault()\n\n const form = [...this.$refs.addUserForm.querySelectorAll('input[name]')].reduce((map, input) => {\n map[input.name] = input.value\n return map\n }, {})\n\n if (form.password !== form.confirm_password) {\n this.notify({\n title: 'Unable to create user',\n text: 'Please check that the passwords match',\n error: true,\n image: {\n iconClass: 'fas fa-times',\n },\n })\n\n return\n }\n\n this.commandRunning = true\n try {\n await this.request('user.create_user', {\n username: form.username,\n password: form.password,\n session_token: this.sessionToken,\n })\n } finally {\n this.commandRunning = false\n }\n\n this.notify({\n text: 'User ' + form.username + ' created',\n image: {\n iconClass: 'fas fa-check',\n },\n })\n\n this.$refs.addUserModal.close()\n await this.refresh()\n },\n\n async changePassword(event) {\n event.preventDefault()\n\n const form = [...this.$refs.changePasswordForm.querySelectorAll('input[name]')].reduce((map, input) => {\n map[input.name] = input.value\n return map\n }, {})\n\n if (form.new_password !== form.confirm_new_password) {\n this.notify({\n title: 'Unable to update password',\n text: 'Please check that the passwords match',\n error: true,\n image: {\n iconClass: 'fas fa-times',\n },\n })\n\n return\n }\n\n this.commandRunning = true\n let success = false\n\n try {\n success = await this.request('user.update_password', {\n username: form.username,\n old_password: form.password,\n new_password: form.new_password,\n })\n } finally {\n this.commandRunning = false\n }\n\n if (success) {\n this.$refs.changePasswordModal.close()\n this.notify({\n text: 'Password successfully updated',\n image: {\n iconClass: 'fas fa-check',\n },\n })\n } else {\n this.notify({\n title: 'Unable to update password',\n text: 'The current password is incorrect',\n error: true,\n image: {\n iconClass: 'fas fa-times',\n },\n })\n }\n },\n\n async deleteUser(user) {\n this.commandRunning = true\n try {\n await this.request('user.delete_user', {\n username: user,\n session_token: this.sessionToken,\n })\n } finally {\n this.commandRunning = false\n }\n\n this.notify({\n text: `User ${user} removed`,\n image: {\n iconClass: 'fas fa-check',\n },\n })\n\n this.selectedUser = null\n await this.refresh()\n },\n\n showAddUserModal() {\n this.$refs.addUserModal.show()\n this.$nextTick(() => {\n this.$refs.addUserForm.reset()\n this.$refs.addUserForm.username.focus()\n })\n },\n\n showChangePasswordModal(user) {\n this.$refs.changePasswordModal.show()\n this.$nextTick(() => {\n this.$refs.changePasswordForm.password.focus()\n this.selectedUser = user.username\n })\n },\n },\n\n mounted() {\n this.refresh()\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.settings-container {\n .body {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n }\n\n .modal {\n .body {\n height: auto;\n }\n }\n\n form {\n label {\n display: block;\n text-align: center;\n }\n }\n\n .users-list {\n background: $background-color;\n margin-top: .15em;\n height: max-content;\n\n .user {\n display: flex;\n align-items: center;\n padding: .75em;\n\n &:not(:last-child) {\n box-shadow: $border-shadow-bottom;\n }\n\n &:hover {\n background: $hover-bg;\n }\n\n .actions {\n display: inline-flex;\n justify-content: right;\n\n button {\n background: none !important;\n width: min-content;\n }\n }\n }\n }\n\n @media screen and (max-width: $desktop) {\n .users-list {\n width: 100%;\n }\n }\n\n @media screen and (min-width: $desktop) {\n .users-list {\n min-width: 400pt;\n max-width: 600pt;\n margin-top: 1em;\n border-radius: 1em;\n box-shadow: $border-shadow-bottom;\n\n .user {\n border-radius: 0;\n\n &:first-child {\n border-top-left-radius: 1em;\n border-top-right-radius: 1em;\n }\n\n &:last-child {\n border-bottom-left-radius: 1em;\n border-bottom-right-radius: 1em;\n }\n }\n }\n }\n}\n\n:deep(.dropdown-container) {\n button {\n background: none !important;\n }\n}\n\n:deep(.modal) {\n .btn {\n border-radius: 1em;\n }\n}\n</style>\n","import { render } from \"./Users.vue?vue&type=template&id=510035f2&scoped=true\"\nimport script from \"./Users.vue?vue&type=script&lang=js\"\nexport * from \"./Users.vue?vue&type=script&lang=js\"\n\nimport \"./Users.vue?vue&type=style&index=0&id=510035f2&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-510035f2\"]])\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=2e111192\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=2e111192&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","var map = {\n\t\"./Alarm/Index\": [\n\t\t1949,\n\t\t7651,\n\t\t2844,\n\t\t2461,\n\t\t2992,\n\t\t1807,\n\t\t9381,\n\t\t6062,\n\t\t1949\n\t],\n\t\"./Camera/Index\": [\n\t\t5324,\n\t\t8039,\n\t\t5324\n\t],\n\t\"./CameraAndroidIpcam/Index\": [\n\t\t5794,\n\t\t5794\n\t],\n\t\"./CameraCv/Index\": [\n\t\t6148,\n\t\t8039,\n\t\t6148\n\t],\n\t\"./CameraFfmpeg/Index\": [\n\t\t9334,\n\t\t8039,\n\t\t9334\n\t],\n\t\"./CameraGstreamer/Index\": [\n\t\t813,\n\t\t8039,\n\t\t813\n\t],\n\t\"./CameraIrMlx90640/Index\": [\n\t\t7381,\n\t\t8039,\n\t\t7381\n\t],\n\t\"./CameraPi/Index\": [\n\t\t5214,\n\t\t8039,\n\t\t8895\n\t],\n\t\"./CameraPiLegacy/Index\": [\n\t\t1512,\n\t\t8039,\n\t\t1512\n\t],\n\t\"./Entities/Index\": [\n\t\t7878,\n\t\t2992,\n\t\t669,\n\t\t2154,\n\t\t6062,\n\t\t7878\n\t],\n\t\"./Execute/Index\": [\n\t\t4221,\n\t\t1807,\n\t\t4221\n\t],\n\t\"./Extensions/Index\": [\n\t\t2018\n\t],\n\t\"./Light/Index\": [\n\t\t9751,\n\t\t7651,\n\t\t2844,\n\t\t9751\n\t],\n\t\"./LightHue/Index\": [\n\t\t2976,\n\t\t7651,\n\t\t2844,\n\t\t9751,\n\t\t2976\n\t],\n\t\"./Media/Index\": [\n\t\t2509,\n\t\t7651,\n\t\t906,\n\t\t1587,\n\t\t2461,\n\t\t6079,\n\t\t2509\n\t],\n\t\"./Media/Providers/YouTube/Index\": [\n\t\t2200,\n\t\t2200\n\t],\n\t\"./MediaMplayer/Index\": [\n\t\t3518,\n\t\t7651,\n\t\t906,\n\t\t1587,\n\t\t2461,\n\t\t6079,\n\t\t2509,\n\t\t3518\n\t],\n\t\"./MediaMpv/Index\": [\n\t\t4765,\n\t\t7651,\n\t\t906,\n\t\t1587,\n\t\t2461,\n\t\t6079,\n\t\t2509,\n\t\t4765\n\t],\n\t\"./MediaOmxplayer/Index\": [\n\t\t7819,\n\t\t7651,\n\t\t906,\n\t\t1587,\n\t\t2461,\n\t\t6079,\n\t\t2509,\n\t\t7819\n\t],\n\t\"./MediaVlc/Index\": [\n\t\t2614,\n\t\t7651,\n\t\t906,\n\t\t1587,\n\t\t2461,\n\t\t6079,\n\t\t2509,\n\t\t2614\n\t],\n\t\"./Music/Index\": [\n\t\t3553,\n\t\t7651,\n\t\t906,\n\t\t1587,\n\t\t3553\n\t],\n\t\"./MusicMopidy/Index\": [\n\t\t3400,\n\t\t7651,\n\t\t906,\n\t\t1587,\n\t\t3553,\n\t\t3400\n\t],\n\t\"./MusicMpd/Index\": [\n\t\t3083,\n\t\t7651,\n\t\t906,\n\t\t1587,\n\t\t3553,\n\t\t3083\n\t],\n\t\"./MusicSnapcast/Index\": [\n\t\t5285,\n\t\t7651,\n\t\t2844,\n\t\t5285\n\t],\n\t\"./MusicSpotify/Index\": [\n\t\t4053,\n\t\t7651,\n\t\t906,\n\t\t1587,\n\t\t3553,\n\t\t4053\n\t],\n\t\"./Rtorrent/Index\": [\n\t\t2183,\n\t\t6079,\n\t\t7968,\n\t\t2183\n\t],\n\t\"./Settings/Index\": [\n\t\t8369\n\t],\n\t\"./Sound/Index\": [\n\t\t746,\n\t\t746\n\t],\n\t\"./Torrent/Index\": [\n\t\t8784,\n\t\t6079,\n\t\t7968,\n\t\t8784\n\t],\n\t\"./Tts/Index\": [\n\t\t3732,\n\t\t8069,\n\t\t3732\n\t],\n\t\"./TtsGoogle/Index\": [\n\t\t7605,\n\t\t8069,\n\t\t2853\n\t],\n\t\"./TvSamsungWs/Index\": [\n\t\t4589,\n\t\t4589\n\t],\n\t\"./ZigbeeMqtt/Index\": [\n\t\t1259,\n\t\t7651,\n\t\t2844,\n\t\t1259\n\t],\n\t\"./Zwave/Index\": [\n\t\t2732,\n\t\t7651,\n\t\t2844,\n\t\t7880,\n\t\t2732\n\t],\n\t\"./ZwaveMqtt/Index\": [\n\t\t1088,\n\t\t7651,\n\t\t2844,\n\t\t7880,\n\t\t1088\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn Promise.all(ids.slice(1).map(__webpack_require__.e)).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function() { return Object.keys(map); };\nwebpackAsyncContext.id = 3379;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./Calendar/Index\": [\n\t\t5638,\n\t\t5638\n\t],\n\t\"./Camera/Index\": [\n\t\t446,\n\t\t446\n\t],\n\t\"./Component/Index\": [\n\t\t1449,\n\t\t7651,\n\t\t2844,\n\t\t1449\n\t],\n\t\"./DateTime/Index\": [\n\t\t4619,\n\t\t1391,\n\t\t4619\n\t],\n\t\"./DateTimeWeather/Index\": [\n\t\t9962,\n\t\t5193,\n\t\t1391,\n\t\t9962\n\t],\n\t\"./ImageCarousel/Index\": [\n\t\t2140,\n\t\t5193,\n\t\t1391,\n\t\t2140\n\t],\n\t\"./Music/Index\": [\n\t\t7841,\n\t\t7651,\n\t\t906,\n\t\t7841\n\t],\n\t\"./Plugin/Index\": [\n\t\t8179,\n\t\t8179\n\t],\n\t\"./RssNews/Index\": [\n\t\t6523,\n\t\t6523\n\t],\n\t\"./Weather/Index\": [\n\t\t5193,\n\t\t5193\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn Promise.all(ids.slice(1).map(__webpack_require__.e)).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function() { return Object.keys(map); };\nwebpackAsyncContext.id = 6725;\nmodule.exports = webpackAsyncContext;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"static/js/\" + chunkId + \".\" + {\"65\":\"ae7df477\",\"169\":\"8bb8df7d\",\"342\":\"d3c0f8f2\",\"446\":\"178d2754\",\"472\":\"05f32d73\",\"667\":\"4d6799b5\",\"669\":\"67b2777b\",\"729\":\"f4de5689\",\"746\":\"4c6b0061\",\"813\":\"1fe7c13a\",\"886\":\"9ff7c1ce\",\"906\":\"38a51fd1\",\"980\":\"e9d022c5\",\"984\":\"bedc7c00\",\"1088\":\"8670f8f4\",\"1259\":\"11016ad1\",\"1391\":\"a76844c2\",\"1449\":\"475ec524\",\"1512\":\"3e4f99fd\",\"1587\":\"e2ebe369\",\"1706\":\"97f9b825\",\"1807\":\"586a24d4\",\"1949\":\"9d6edfd8\",\"2106\":\"6553ebed\",\"2140\":\"1dc2f842\",\"2154\":\"81668bf2\",\"2183\":\"2941880a\",\"2200\":\"9fc9fd95\",\"2217\":\"30568f1a\",\"2460\":\"9845df8e\",\"2461\":\"a2008efc\",\"2509\":\"efc0bf4c\",\"2614\":\"7997d726\",\"2732\":\"28f617e8\",\"2844\":\"288f7727\",\"2853\":\"47a43033\",\"2892\":\"2d33f676\",\"2893\":\"b037e7d2\",\"2976\":\"e8a9eb12\",\"2992\":\"efd583f8\",\"3083\":\"8440bfa8\",\"3322\":\"5ee98346\",\"3368\":\"7ff6fca3\",\"3369\":\"71760407\",\"3390\":\"3545ba6d\",\"3400\":\"1021c9a8\",\"3518\":\"40e74ddb\",\"3553\":\"125dc216\",\"3559\":\"da067b47\",\"3661\":\"ebdb7d5d\",\"3671\":\"8c2bb698\",\"3732\":\"17c9c669\",\"3826\":\"cc264dd1\",\"3835\":\"878348e2\",\"4053\":\"1a106579\",\"4221\":\"292aeb44\",\"4589\":\"c6a12ddf\",\"4619\":\"ea41fd5e\",\"4765\":\"7ad68124\",\"4790\":\"7514123b\",\"5059\":\"9bac2917\",\"5193\":\"3248ceb0\",\"5207\":\"7f241e21\",\"5285\":\"551ed2ce\",\"5324\":\"a449638b\",\"5329\":\"7bf8697f\",\"5578\":\"7c9eef7c\",\"5638\":\"f1abcb64\",\"5762\":\"0d8fb9cb\",\"5794\":\"bdbffa20\",\"5795\":\"8f7061d6\",\"5833\":\"4cca0d3f\",\"5906\":\"5eaf69b5\",\"5931\":\"bcf6cfaf\",\"6062\":\"2509fe58\",\"6079\":\"b020e16c\",\"6123\":\"0a491498\",\"6148\":\"70084131\",\"6324\":\"9d695c83\",\"6362\":\"7e4f1ac1\",\"6523\":\"6faff1f9\",\"6561\":\"fc5ef77b\",\"6579\":\"366354a0\",\"6640\":\"a6538b3b\",\"7381\":\"66ebc1f2\",\"7590\":\"014063f7\",\"7651\":\"e7da8dba\",\"7819\":\"15635e35\",\"7841\":\"8b124a1f\",\"7878\":\"3955ebef\",\"7880\":\"b455063a\",\"7898\":\"0426589e\",\"7968\":\"d677b422\",\"8039\":\"951792f1\",\"8069\":\"51c1e8b1\",\"8179\":\"bd308864\",\"8391\":\"40c294c5\",\"8498\":\"f8eb1c87\",\"8621\":\"a437ee11\",\"8769\":\"ad2a69a1\",\"8784\":\"9c4e51b9\",\"8825\":\"25b100b4\",\"8895\":\"a4a700ec\",\"8930\":\"be445a5e\",\"8989\":\"d29a4bdb\",\"9091\":\"4b4643b0\",\"9334\":\"455b4593\",\"9381\":\"dc2f4776\",\"9461\":\"1fd0b115\",\"9751\":\"5b8fcd4c\",\"9962\":\"fcc64630\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"static/css/\" + chunkId + \".\" + {\"65\":\"cb15a9a6\",\"169\":\"9ec6abc1\",\"446\":\"e0a96773\",\"472\":\"20f2f41f\",\"669\":\"73188f7e\",\"729\":\"16b20067\",\"746\":\"18c59228\",\"906\":\"80f1f8a3\",\"980\":\"b4628099\",\"984\":\"0c88349b\",\"1259\":\"ad51b86e\",\"1391\":\"8fb65128\",\"1449\":\"bf964828\",\"1587\":\"f52aafce\",\"1706\":\"c1e22194\",\"1807\":\"333a022f\",\"1949\":\"d8d63590\",\"2140\":\"08e216c1\",\"2154\":\"20cf0934\",\"2217\":\"da1b8fd6\",\"2460\":\"83acd505\",\"2461\":\"1fc0b5b4\",\"2509\":\"77a756c6\",\"2844\":\"23273db2\",\"2892\":\"3a7569e7\",\"2893\":\"21a9931c\",\"2976\":\"bafd7cea\",\"2992\":\"f8bddaf0\",\"3368\":\"467cedc6\",\"3369\":\"69c504e7\",\"3390\":\"481c441e\",\"3553\":\"6d93b4b8\",\"3559\":\"5665c422\",\"3661\":\"c12867e9\",\"3671\":\"e6547429\",\"3826\":\"53d49948\",\"3835\":\"91d8befb\",\"4221\":\"76c11dc1\",\"4589\":\"d7fd389b\",\"4790\":\"3ef3568e\",\"5059\":\"e5cd6fe3\",\"5193\":\"b8dcc633\",\"5207\":\"e1e8949a\",\"5285\":\"2250c5c9\",\"5329\":\"2f2c6a0e\",\"5638\":\"05ee3a45\",\"5794\":\"a98cd7fb\",\"5795\":\"3b193db6\",\"5833\":\"e1e503a2\",\"5906\":\"52ba6beb\",\"5931\":\"e6c8f94d\",\"6062\":\"b6571ed4\",\"6079\":\"f88a21ae\",\"6324\":\"bb3e2171\",\"6523\":\"d6576265\",\"6561\":\"77bbcd33\",\"6579\":\"04ad63dc\",\"7590\":\"b45a8e92\",\"7651\":\"9b63654f\",\"7841\":\"2a1ced53\",\"7878\":\"e3469993\",\"7880\":\"4f4a202a\",\"7968\":\"29db26b1\",\"8039\":\"e77a760e\",\"8069\":\"111183af\",\"8179\":\"b5fb83f9\",\"8391\":\"b5dd11a9\",\"8498\":\"3676728c\",\"8621\":\"5db86eb0\",\"8769\":\"fda642fb\",\"8825\":\"f608e2c2\",\"8989\":\"63c7ae13\",\"9381\":\"ade341db\",\"9461\":\"79136fbe\",\"9751\":\"0631f530\",\"9962\":\"eb89f1f6\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"platypush:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = function(chunkId, fullhref, oldTag, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t2143: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"65\":1,\"169\":1,\"446\":1,\"472\":1,\"669\":1,\"729\":1,\"746\":1,\"906\":1,\"980\":1,\"984\":1,\"1259\":1,\"1391\":1,\"1449\":1,\"1587\":1,\"1706\":1,\"1807\":1,\"1949\":1,\"2140\":1,\"2154\":1,\"2217\":1,\"2460\":1,\"2461\":1,\"2509\":1,\"2844\":1,\"2892\":1,\"2893\":1,\"2976\":1,\"2992\":1,\"3368\":1,\"3369\":1,\"3390\":1,\"3553\":1,\"3559\":1,\"3661\":1,\"3671\":1,\"3826\":1,\"3835\":1,\"4221\":1,\"4589\":1,\"4790\":1,\"5059\":1,\"5193\":1,\"5207\":1,\"5285\":1,\"5329\":1,\"5638\":1,\"5794\":1,\"5795\":1,\"5833\":1,\"5906\":1,\"5931\":1,\"6062\":1,\"6079\":1,\"6324\":1,\"6523\":1,\"6561\":1,\"6579\":1,\"7590\":1,\"7651\":1,\"7841\":1,\"7878\":1,\"7880\":1,\"7968\":1,\"8039\":1,\"8069\":1,\"8179\":1,\"8391\":1,\"8498\":1,\"8621\":1,\"8769\":1,\"8825\":1,\"8989\":1,\"9381\":1,\"9461\":1,\"9751\":1,\"9962\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t2143: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(2(154|461|844|992)|3(390|661|671|826)|5(059|833|906)|6((07|57|6)9|561)|8(03|06|98)9|1391|4790|7651|906)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkplatypush\"] = self[\"webpackChunkplatypush\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [4998], function() { return __webpack_require__(1761); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["bus","mitt","publishEntity","entity","emit","onEntity","callback","on","publishNotification","notification","onNotification","$options","hasWebsocket","_createBlock","_component_Events","ref","_createVNode","_component_Notifications","hasAssistant","_component_VoiceAssistant","hasPushbullet","_component_Pushbullet","hasNtfy","_component_Ntfy","_component_ConfirmDialog","onInput","installPWA","_component_DropdownContainer","_component_router_view","class","_createElementBlock","_hoisted_1","methods","onOpen","component","$el","keepOpenOnItemClick","this","onClose","appendChild","innerHTML","mounted","__exports__","_Fragment","_renderList","_ctx","notifications","id","index","_component_Notification","key","text","html","title","link","image","warning","error","onClicked","destroy","_normalizeClass","$props","onClick","_cache","args","clicked","_toDisplayString","_createElementVNode","_hoisted_2","_hoisted_3","_hoisted_4","src","alt","icon","style","_normalizeStyle","color","iconClass","_hoisted_6","_hoisted_7","name","props","window","open","$emit","components","Notification","duration","type","Number","default","data","timeouts","create","parseInt","setTimeout","bind","ws","initialized","pending","opened","timeout","reconnectMsecs","minReconnectMsecs","maxReconnectMsecs","handlers","handlerNameToEventTypes","onWebsocketTimeout","console","log","Math","min","close","onMessage","event","JSON","parse","e","warn","debug","push","Object","values","handler","Array","Function","onclose","clearTimeout","undefined","onError","code","reason","init","protocol","location","url","host","WebSocket","err","onmessage","onopen","onerror","subscribe","msg","events","length","handlerName","unsubscribe","keys","created","$watch","_hoisted_9","_component_Modal","$data","state","alerting","responding","speechRecognized","_hoisted_5","listening","_hoisted_8","_hoisted_10","_hoisted_11","phrase","_hoisted_13","responseText","Modal","mixins","Utils","hideTimeout","reset","conversationStart","$refs","assistantModal","show","conversationEnd","self","response","response_text","alertOn","alertOff","registerHandlers","notify","message","body","ConfirmDialog","DropdownContainer","Events","Notifications","Ntfy","Pushbullet","VoiceAssistant","config","userAuthenticated","connected","pwaInstallEvent","computed","initConfig","request","prompt","pwaDialog","beforeMount","getCookie","addEventListener","preventDefault","setCookie","expires","Date","getTime","render","loading","_component_Loading","classes","rows","row","i","_component_Row","widgets","widget","j","_KeepAlive","_component_Widget","_resolveDynamicComponent","_normalizeProps","_guardReactiveProps","getWidgetProps","_renderSlot","$slots","String","required","split","concat","Widget","Loading","Row","refreshSeconds","_refreshSeconds","parseFloat","parseTemplate","tmpl","node","DOMParser","parseFromString","childNodes","attributes","nodeValue","getElementsByTagName","map","children","el","shallowRef","defineAsyncComponent","nodeName","attrs","reduce","obj","content","refreshDashboard","$route","params","template","notifyError","setInterval","toFixed","method","placeholder","_register","value","register","Boolean","parseBoolean","_component_Login","Login","_component_Nav","panels","selectedPanel","selectedConfigPanel","hostname","onSelect","$event","onSelectConfig","_component_Settings","_component_Extensions","panel","hidden","href","collapsed","ok","onItemClick","configSections","selected","imgUrl","_hoisted_12","_hoisted_14","panelNames","_hoisted_17","specialPlugins","includes","icons","_component_ExtensionIcon","size","displayName","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","emits","ExtensionIcon","prepend","names","idx","indexOf","slice","sort","collapsedDefault","isMobile","isTablet","setConnected","$root","Extensions","Settings","Nav","plugins","backends","procedures","initSelectedPanel","match","hash","plugin","initPanels","entries","forEach","async","componentName","token","toUpperCase","join","comp","pluginName","parseConfig","Promise","all","initializeDefaultViews","entities","execute","initPanel","toString","routes","path","Panel","Dashboard","Plugin","Register","NotFound","router","createRouter","history","createWebHistory","ready","registered","cached","updatefound","updated","offline","app","createApp","App","globalProperties","_config","use","mount","showError","opts","resolve","reject","axios","post","then","errors","output","catch","action","copyToClipboard","navigator","clipboard","writeText","getCookies","document","cookie","item","k","v","toISOString","deleteCookie","formatDate","date","year","toDateString","substring","formatTime","seconds","toTimeString","formatDateTime","skipTimeIfMidnight","getHours","getMinutes","getSeconds","_eventsReady","subFunc","generateId","unwatch","newVal","btoa","fromCharCode","round","random","pluginDisplayName","words","word","charAt","notifyWarning","matchMedia","matches","isDesktop","capitalize","prettify","t","indent","spaces","repeat","toLowerCase","convertSize","unit","units","u","convertTime","time","ret","d","h","m","s","objectsEqual","a","b","p","parseUrlFragment","replace","getUrlArgs","argsString","acc","tokens","setUrlArgs","curArgs","pathname","fragmentFromArgs","encodeURIComponent","Api","Clipboard","Cookies","DateTime","Screen","Text","Types","Url","n","script","isVisible","zIndex","$attrs","width","height","stopPropagation","onModalClose","visible","level","timeoutId","prevVisible","hide","toggle","onKeyUp","visibleHndl","unmounted","removeEventListener","maxZIndex","getComputedStyle","outermostModals","modal","querySelectorAll","onSubmit","_withModifiers","onConfirm","onTouch","confirmText","cancelText","copy","_component_DropdownBody","DropdownBody","buttonStyle","button","buttonWidth","buttonHeight","documentClickHndl","element","target","classList","contains","parentElement","getDropdownWidth","dropdown","getDropdownHeight","dropdownContainer","remove","$nextTick","buttonRect","getBoundingClientRect","buttonPos","left","scrollX","top","scrollY","pos","dropdownWidth","dropdownHeight","innerWidth","innerHeight","add","itemClass","iconUrl","_component_Icon","Icon","disabled","$parent","withDocsLink","docsUrl","extensionName","extensionType","shift","className","restart","showDialog","filter","extensionNames","matchesFilter","selectedExtension","extensions","enabledExtensions","_component_Extension","extension","configFile","_component_Tabs","_component_Tab","selectedTab","_component_Doc","_component_Config","_component_Install","highlightedCurrentConfig","_component_CopyButton","curYamlConfig","config_snippet","highlightedConfigSnippet","CopyButton","hljs","highlight","language","trim","loadCurrentConfig","doc_url","doc","onDocClick","actions","actionNames","actionName","eventNames","eventName","localPageRegex","RegExp","parseDoc","refreshDoc","tagName","getAttribute","installCmd","highlightedInstallCmd","installDone","_component_RestartButton","installRunning","installExtension","installOutput","_hoisted_15","RestartButton","installCmds","pendingCommands","cmd","wsProcess","ws_path","refreshInstallCmds","focus","scrollTop","scrollHeight","Config","Doc","Install","Tab","Tabs","Extension","enabledPlugins","enabledBackends","backend","input","setFilter","querySelector","scrollIntoView","behavior","loadExtensions","loadExtensionFromUrl","loadConfigFile","ext","_component_Application","currentUser","_component_Users","sessionToken","_component_Token","_component_StopButton","stop","StopButton","onFocus","onTokenSelect","generateToken","username","sessionTokenModal","password","validityDays","expiry_days","tokenModal","select","execCommand","createUser","commandRunning","changePassword","selectedUser","users","user","user_id","_component_Dropdown","_component_DropdownItem","showChangePasswordModal","deleteUserDialog","_component_FloatingButton","showAddUserModal","deleteUser","Dropdown","DropdownItem","FloatingButton","refresh","form","addUserForm","confirm_password","session_token","addUserModal","changePasswordForm","new_password","confirm_new_password","success","old_password","changePasswordModal","Application","Users","Token","webpackAsyncContext","req","__webpack_require__","o","Error","ids","module","exports","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","call","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","every","splice","r","getter","__esModule","leafPrototypes","getProto","getPrototypeOf","__proto__","mode","ns","def","current","getOwnPropertyNames","definition","defineProperty","enumerable","get","f","chunkId","promises","miniCssF","g","globalThis","prop","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","l","done","needAttach","scripts","createElement","charset","nc","setAttribute","onScriptComplete","prev","onload","doneFns","parentNode","removeChild","head","Symbol","toStringTag","createStylesheet","fullhref","oldTag","linkTag","rel","onLinkComplete","errorType","realHref","insertBefore","nextSibling","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","test","promise","loadingEnded","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}