{"version":3,"file":"main.js","mappings":"0IAKO,MAAMA,EAAuD,CAClEC,oBAAqB,uCACrBC,gBAAiB,GAEjBC,6BAA8B,wBAC9BC,yBAA0B,GAE1BC,6BAA8B,wBAC9BC,yBAA0B,GAE1BC,wBAAyB,mDACzBC,oBAAqB,mDAErBC,uBAAwB,+BACxBC,mBAAoB,GACpBC,uBAAwB,iBACxBC,mBAAoB,iBACpBC,uBAAwB,aACxBC,mBAAoB,aAEpBC,uBAAwB,wBACxBC,mBAAoB,GACpBC,aAAc,2BAEdC,2BAA4B,iBAC5BC,uBAAwB,GACxBC,2BAA4B,2BAC5BC,uBAAwB,2BACxBC,2BAA4B,uBAC5BC,uBAAwB,uBAExBC,2BAA4B,+BAC5BC,uBAAwB,GACxBC,2BAA4B,iBAC5BC,uBAAwB,iBACxBC,2BAA4B,aAC5BC,uBAAwB,aACxBC,mCAAoC,iBACpCC,+BAAgC,GAChCC,mCAAoC,2BACpCC,+BAAgC,2BAChCC,mCAAoC,uBACpCC,+BAAgC,gGCG3B,IAAMC,EAAmB,MAA1B,MAAOA,EACXC,cAAe,CAQfC,sBAAsBC,EAAmBC,GACvC,OAAKA,EAGDA,aAAiBC,cACZC,KAAKC,8BAA8BJ,EAAWC,GAC5CA,aAAiBI,WACnBF,KAAKG,2BAA2BN,EAAWC,GAE7CM,KAPEA,IAQX,CAOAC,iBAAiBP,GACf,OAAKA,EAGDA,aAAiBC,cACZC,KAAKM,yBAAyBR,GAC5BA,aAAiBI,WACnBF,KAAKO,sBAAsBT,GAE7BM,KAPEA,IAQX,CAOQE,yBAAyBR,GAC/B,MAAMU,EAAcV,EAAMW,KAC1B,OAAID,IAAQE,MAAcF,IAAQG,KACzBC,KAEFR,IACT,CAOQG,sBAAsBT,GAE5B,OADyBA,EAAMe,SACdC,KACRF,KAEFR,IACT,CAQQH,8BAA8BJ,EAAmBC,GACvD,MAAMU,EAAcV,EAAMW,KAC1B,OAAID,IAAQE,MAAcF,IAAQG,KACzBd,IAAckB,KAAkBH,KAAOI,KAEzCZ,IACT,CAQQD,2BAA2BN,EAAmBC,GAEpD,OADyBA,EAAMe,SACdC,KACRjB,IAAckB,KAAkBH,KAAOI,KAEzCZ,IACT,CAACa,SAAAjB,KAAA,mBAAAkB,iBA1FUxB,EAAmB,EAAAuB,SAAAjB,KAAA,UAAAmB,EAAAC,IAAA,MAAnB1B,EAAmB2B,UAAA,oBAAAC,MAAA,EAAAC,KAAA,EAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAC,cAAA,EAAAC,gBAAA,WAAnBlC,CAAmB,qGClDhCmC,MAAA,gCAEKA,MAAA,cAAAC,EAAAC,oBAAA,KAAAD,EAAAC,oBAAAvE,iHCmCE,IAAMwE,EAAmB,MAA1B,MAAOA,EAAmBf,SAAAjB,KAAA,mBAAAkB,iBAAnBc,EAAmB,EAAAf,SAAAjB,KAAA,UAAAiC,EAAAb,IAAA,MAAnBY,EAAmBX,UAAA,oBAAAa,OAAA,CAAAC,OAAA,SAAAJ,oBAAA,uBAAAT,MAAA,EAAAC,KAAA,EAAAa,OAAA,uEAAAZ,SAAA,SAAAC,EAAAC,GAAA,EAAAD,GDrChCI,MAAA,EAAAQ,EAAA,kBAAyBR,MAAA,OAAAH,EAAAS,gMCqCZH,CAAmB,+OCpBxBH,MAAA,YAUKA,MADA,iBAAAS,GAAAT,MAAAU,GAAA,MAAAC,EAAAX,MAAA,GAAAY,UAAAC,EAAAb,MAAA,UAAAA,MAASa,EAAAC,aAAAH,EAAAF,EAAAI,EAAAE,aAA0C,EACnDf,CADoD,iBAAAS,GAAAT,MAAAU,GAAA,MAAAC,EAAAX,MAAA,GAAAY,UAAAC,EAAAb,MAAA,UAAAA,MAC3Ca,EAAAC,aAAAH,EAAAF,EAAAI,EAAAG,gBAA6C,GAV3DhB,sDACKA,MAAA,uBAAAa,EAAAI,SAAAN,GAAA,gBAAAE,EAAAK,cAAAC,UAAA,sBAMAnB,MAAA,MAAAa,EAAAO,OAAAT,IACAX,MANA,YAAAW,EAAAU,OAAAV,EAAAU,MAAAC,IAAAX,EAAAU,MAAAC,IAAAX,EAAAY,MAAAD,IAAAtB,MAMAA,CANkE,aAAAA,MAAA,GAAAwB,EAAA,MAAAX,EAAAK,cAAA,KAAAL,EAAAK,cAAAO,MAAA,MAAAZ,EAAAK,cAAA,KAAAL,EAAAK,cAAAQ,WAMlE1B,CAJsD,QAAAa,EAAAc,SAAAhB,GAItDX,CAF2B,8EAPlCA,MAAA,GACEA,MAAA,EAAA4B,EAAA,sDAAM5B,cAAA,aAAAW,GAAA,MAAAA,EAAAY,MAAA,KAAAZ,EAAAY,MAAAD,8CAaNtB,MAAA,YAcKA,MADA,iBAAAS,GAAAT,MAAA6B,GAAA,MAAAlB,EAAAX,MAAA,GAAAY,UAAAC,EAAAb,MAAA,UAAAA,MAASa,EAAAC,aAAAH,EAAAF,EAAAI,EAAAE,aAA0C,EACnDf,CADoD,iBAAAS,GAAAT,MAAA6B,GAAA,MAAAlB,EAAAX,MAAA,GAAAY,UAAAC,EAAAb,MAAA,UAAAA,MAC3Ca,EAAAC,aAAAH,EAAAF,EAAAI,EAAAG,gBAA6C,GAAEhB,sDAbxDA,MAAA,4BAAAa,EAAAI,SAAAN,GAAA,gBAAAE,EAAAK,cAAAC,UAAA,sBAMAnB,MALA,iCAKAA,CALwC,mBAAAa,EAAAiB,mBAAA,MAAAnB,EAAAU,OAAAV,EAAAU,MAAAC,IAAAX,EAAAU,MAAAC,IAAAX,EAAAY,MAAAD,KAKxCtB,CAJyG,sCAIzGA,CAH6C,kBAAAa,EAAAkB,sBAG7C/B,CAF+C,gCAE/CA,CADuC,kCAMvCA,MAJO,aAAAA,MAAA,GAAAwB,EAAA,MAAAX,EAAAK,cAAA,KAAAL,EAAAK,cAAAO,MAAA,MAAAZ,EAAAK,cAAA,KAAAL,EAAAK,cAAAQ,WAIP1B,CAHsD,QAAAa,EAAAc,SAAAhB,GAGtDX,CAD2B,6EAXhCA,MAAA,EAAAgC,EAAA,8CAAMhC,MAAA,aAAAW,GAAA,MAAAA,EAAAY,MAAA,KAAAZ,EAAAY,MAAAD,+BAfVtB,MAAA,GAcEA,MAbA,EAAAiC,EAAA,qBAaAjC,CAbuE,EAAAkC,EAAA,yBAAAlC,iDAAxDA,QAAuCA,MAAvC,eAAAa,EAAAsB,gBAAAtB,EAAAsB,eAAAC,gBAAuCpC,CAAA,WAAAqC,4CAX1DrC,MALF,UAKEA,CAFiE,SAKlBA,MAA5C,iBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAASa,EAAA0B,kBAAkB,OAAM9B,GAAS,EAAET,CAAD,iBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAAUa,EAAA0B,kBAAkB,OAAM9B,GAAS,GACvFT,MAAA,WAGFA,QAEAA,MAAA,WACEA,MAAA,EAAAwC,EAAA,sBAgCFxC,QAEAA,MAAA,SAGgDA,MAA7C,iBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAASa,EAAA0B,kBAAkB,QAAO9B,GAAS,EAAET,CAAD,iBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAAUa,EAAA0B,kBAAkB,QAAO9B,GAAS,GACzFT,MAAA,WAMJA,kCAxDKA,MAAA,cAAAa,EAAAX,oBAAA,KAAAW,EAAAX,oBAAA1C,8IAIAwC,cAAA,WAAAa,EAAAK,cAAAuB,QAAA5B,EAAA6B,MAAA,sHAEI1C,cAAA,UAAAa,EAAAK,cAAAuB,QAAA5B,EAAA6B,MAAA,6DAEA1C,MAAA,cAAAa,EAAAX,oBAAA,KAAAW,EAAAX,oBAAAxC,gCAI6BsC,MAAA,GAAaA,MAAb,UAAAa,EAAA8B,SAAa3C,CAAA,eAAAa,EAAA+B,WAoC9C5C,cAAA,WAAAa,EAAAK,cAAAuB,QAAA5B,EAAAgC,IAAAhC,EAAAiC,OAAAC,OAAA,oHAGC/C,cAAA,UAAAa,EAAAK,cAAAuB,QAAA5B,EAAAgC,IAAAhC,EAAAiC,OAAAC,OAAA,4DAEA/C,MAAA,cAAAa,EAAAX,oBAAA,KAAAW,EAAAX,oBAAAtC,iCCLC,IAAMoF,EAA0B,MAAjC,MAAOA,UAAkCnF,IAqF7CC,YACUmF,EACAC,EAEAC,GAERC,QALQjF,KAAA8E,MACA9E,KAAA+E,qBAEA/E,KAAAgF,YApFVhF,KAAAkF,aAAe,OAMflF,KAAAmF,UAAY,oBAmCZnF,KAAAoF,aAAyC,IAAIC,MAM7CrF,KAAA4C,YAAsB0C,IAAOC,MAK7BvF,KAAA6C,eAAyByC,IAAOE,SAKhCxF,KAAAwE,SAA+B,GAmBvBxE,KAAAyF,iBAAmB,QAazBzF,KAAK0F,uBAAyBX,EAC3BY,QAAQ,CAACC,KAAYC,OAAQD,KAAYE,MAAOF,KAAYG,OAAQH,KAAYI,MAAOJ,KAAYK,SACnGC,UAAWC,IACLnG,KAAK+C,gBAGNoD,EAAOC,YAAYR,KAAYC,QACjC7F,KAAKqG,aAAarG,KAAK+C,cAAcqD,YAAYE,QACxCH,EAAOC,YAAYR,KAAYE,OACxC9F,KAAKqG,aAAarG,KAAK+C,cAAcqD,YAAYG,OACxCJ,EAAOC,YAAYR,KAAYG,QACxC/F,KAAKqG,aAAarG,KAAK+C,cAAcqD,YAAYI,QACxCL,EAAOC,YAAYR,KAAYI,OACxChG,KAAKqG,aAAarG,KAAK+C,cAAcqD,YAAYK,OACxCN,EAAOC,YAAYR,KAAYK,SACxCjG,KAAKqG,aAAarG,KAAK+C,cAAcqD,YAAYM,QAAM,EAG/D,CAMQL,aAAaM,GACnB,MAAMC,EAAmBC,OAAOC,OAAO,GAAI9G,KAAK+C,eAChD,GAAI/C,KAAK+G,eAAiB/G,KAAK+G,cAAcxD,UAAW,CACtD,MAAMyD,GAAqBhH,KAAK+G,cAAcxD,UAAU0D,QAAQ,KAAM,IAAIA,QAAQ,IAAK,IACvFL,EAAiBrD,UAAY2D,KAAKC,IAAIR,EAAwBK,GAAa,IAC7E,KAAO,CACL,MAAMA,GAAqBhH,KAAKyF,iBAAiBwB,QAAQ,KAAM,IAAIA,QAAQ,IAAK,IAChFL,EAAiBrD,UAAY2D,KAAKC,IAAIR,EAAwBK,GAAa,IAC7E,CACAhH,KAAK+C,cAAgB6D,EACrB5G,KAAK8E,IAAIsC,cACX,CAQAC,WACE,MACMC,EAA8C,CAClDC,SAAS,EACTC,OAAQ,EACRlD,QAAQ,EACRtB,WAAW,EACXM,MAAO,MACPC,UAAWvD,KAAKyF,iBAChBW,YAR4C,CAACE,OAAQ,IAAKC,MAAO,IAAKC,OAAQ,IAAKC,MAAO,IAAKC,OAAQ,MAWzG1G,KAAK+C,cAAgB8D,OAAOC,OAAO,GAAIQ,EAAsBtH,KAAK+G,eAG9D/G,KAAK+C,eAAiB/C,KAAK+C,cAAcyE,QAAU,IACrDxH,KAAK+C,cAAcyE,OAASF,EAAqBE,QAMnDxH,KAAK+C,cAAcO,MAAQ,IAAMtD,KAAK+C,cAAcyE,OAAS,IAGzDxH,KAAKgE,gBAAmD,SAAjChE,KAAKgE,eAAeyD,WAC7CzH,KAAKkF,aAAelF,KAAKgE,eAAeyD,UAI1CzH,KAAK0H,aAAa1H,KAAK2H,aAAc3H,KAAK2E,QAK1C,MAAMiD,EAAiB5H,KAAK+E,mBAAmB8C,UAAUjC,KAAYC,QAC/DiC,EAAgB9H,KAAK+E,mBAAmB8C,UAAUjC,KAAYE,OAC9DiC,EAAiB/H,KAAK+E,mBAAmB8C,UAAUjC,KAAYG,QAC/DiC,EAAgBhI,KAAK+E,mBAAmB8C,UAAUjC,KAAYI,OAC9DiC,EAAiBjI,KAAK+E,mBAAmB8C,UAAUjC,KAAYK,QACjE2B,EACF5H,KAAKqG,aAAarG,KAAK+C,cAAcqD,YAAYE,QACxCwB,EACT9H,KAAKqG,aAAarG,KAAK+C,cAAcqD,YAAYG,OACxCwB,EACT/H,KAAKqG,aAAarG,KAAK+C,cAAcqD,YAAYI,QACxCwB,EACThI,KAAKqG,aAAarG,KAAK+C,cAAcqD,YAAYK,OACxCwB,GACTjI,KAAKqG,aAAarG,KAAK+C,cAAcqD,YAAYM,OAErD,CAOA5D,SAASoF,GACP,SAAKA,IAAYlI,KAAK2H,eAGfO,EAAQC,KAAOnI,KAAK2H,aAAaQ,EAC1C,CAQAC,YAAYC,GACV,MAAMC,EAA6BD,EAAQV,aAC3C,IAAKW,EACH,OAGF,MAAMC,EAAyBD,EAAaE,cACtCC,EAA4BH,EAAaI,aAS/C,GAPID,GAAWJ,EAAQ1D,QAAU0D,EAAQ1D,OAAO6D,eAAiBH,EAAQ1D,OAAO+D,cAI9E1I,KAAK0H,aAAae,EAASJ,EAAQ1D,OAAO+D,cAGxCH,GAAQE,GAAWF,EAAKJ,KAAOM,EAAQN,GAAI,CAI7C,IAAIQ,EACAC,EACJ,IACED,KAAYE,KAASN,EAAMvI,KAAK2E,QAChCiE,KAAeC,KAASJ,EAASzI,KAAK2E,OACxC,OAASmE,GACPC,cAAQC,MAAM,6DACRF,CACR,CAGA,MAAMG,EAAO/B,KAAKgC,OAAOlJ,KAAK0E,IAAM1E,KAAKuE,OAAS,GAAKvE,KAAKuE,MAE5D,GAAIoE,IAAc3I,KAAK2E,OAAOC,OAAS,GAAsB,IAAjBgE,EAI1C,OAFA5I,KAAKmJ,mCACLnJ,KAAKwE,SAAWxE,KAAK2E,OAAOyE,OAAO,CAACjG,EAAuBkG,IAAcA,GAAKrJ,KAAKuE,OAAS8E,EAAIrJ,KAAK0E,MAIvG,GAAkB,IAAdiE,GAAmBC,IAAiB5I,KAAK2E,OAAOC,OAAS,EAI3D,OAFA5E,KAAKsJ,6BACLtJ,KAAKwE,SAAWxE,KAAK2E,OAAOyE,OAAO,CAACjG,EAAuBkG,IAAcA,GAAKrJ,KAAKuE,OAAS8E,EAAIrJ,KAAK0E,MAInG1E,KAAK+C,cAAcyE,OAAS,GAAM,EAChCyB,EAAOL,EACT5I,KAAKuJ,WAELvJ,KAAKwJ,QAGHP,EAAOL,GACT5I,KAAKuJ,WAEHN,EAAOL,GACT5I,KAAKwJ,OAGX,CACF,CASA7G,aAAauF,EAA2BpI,EAAmC2J,EAAiBnE,IAAOoE,QACjG,IAAK1J,KAAK+C,gBAAkB/C,KAAK+C,cAAcC,UAC7C,OAEF,MAAM2G,EAA4B3J,KAAK2E,OAAOiF,QAAQ1B,GAChD/B,EAAiBlB,MAAM5E,iBAAiBP,IAC1CqG,IAAWvF,MAEJuF,IAAWnF,OADpBhB,KAAKoF,aAAayE,KAAiB,CAACJ,OAAQA,EAAQtD,OAAQwD,GAIhE,CAOAvF,kBAAkBvE,EAAmBC,GACnC,MAAMqG,EAAiBlB,MAAMrF,sBAAsBC,EAAWC,GAC1DqG,IAAWvF,KACbZ,KAAKwJ,OACIrD,IAAWnF,MACpBhB,KAAKuJ,UAET,CAMAO,aAAa5B,GACX,OAAKA,EAAQhF,MAGNgF,EAAQhF,MAAMiC,WAAa+C,EAAQ9E,MAAM+B,WAAa,GAFpD+C,EAAQ9E,MAAM+B,WAAa,EAGtC,CAMA3B,SAAS0E,GACP,OAAKA,EAAQhF,MAGNgF,EAAQhF,MAAM6G,OAAS7B,EAAQ9E,MAAM2G,OAAS,GAF5C7B,EAAQ9E,MAAM2G,OAAS,EAGlC,CAMA9G,OAAOiF,GACL,OAAKA,EAAQhF,MAGNgF,EAAQhF,MAAM8G,KAAO9B,EAAQ9E,MAAM4G,KAAO,GAFxC9B,EAAQ9E,MAAM4G,KAAO,EAGhC,CAQAvF,UAAUwF,EAAeC,GACvB,OAAOA,EAAK/B,EACd,CAQAxE,mBAAmBwG,GAEjB,OAAOnK,KAAKgF,UAAUoF,yBAAyB,OAASD,EAAc,IACxE,CAQAvG,sBACE,OAAI5D,KAAK+C,eAAiB/C,KAAK+C,cAAcQ,UAEpC,QAAqB,GADFvD,KAAK+C,cAAcQ,UAAU0D,QAAQ,KAAM,IACrC,KAE3B,OACT,CAMAoD,cACMrK,KAAK0F,wBACP1F,KAAK0F,uBAAuB4E,aAEhC,CAQQ5C,aAAaC,EAAgChD,GACnD,IAAIsF,EACJ,IACEA,KAAQpB,KAASlB,EAAchD,EACjC,OAASmE,GACP,MAAMA,CACR,CACA,OAAQmB,GACN,KAAK,EAEHjK,KAAKmJ,8BACL,MACF,KAAKxE,EAAOC,OAAS,EAEnB5E,KAAKsJ,wBAQTtJ,KAAKwE,SAAWG,EAAOyE,OAAO,CAACjG,EAAuBkG,IAAcA,GAAKrJ,KAAKuE,OAAS8E,EAAIrJ,KAAK0E,IAClG,CAKQyE,8BACNnJ,KAAKuE,MAAQ,EACbvE,KAAK0E,IAAMwC,KAAKC,IAAYnH,KAAK+C,cAAcyE,OAAQxH,KAAK2E,OAAOC,OACrE,CAKQ0E,wBACNtJ,KAAKuE,MAAQvE,KAAK2E,OAAOC,OAAS,GAAa5E,KAAK+C,cAAcyE,OAAS,GAC3ExH,KAAK0E,IAAM1E,KAAK2E,OAAOC,MACzB,CAKQ4E,OAEFxJ,KAAKuK,iBAAiBvK,KAAK2E,OAAOC,OAAS,IAI3C5E,KAAK0E,MAAQ1E,KAAK2E,OAAOC,SAI7B5E,KAAKuE,QACLvE,KAAK0E,IAAMwC,KAAKC,IAAInH,KAAK0E,IAAM,EAAG1E,KAAK2E,OAAOC,QAE9C5E,KAAKwE,SAAWxE,KAAK2E,OAAOyE,OAAO,CAACjG,EAAuBkG,IAAcA,GAAKrJ,KAAKuE,OAAS8E,EAAIrJ,KAAK0E,KACvG,CAKQ6E,WAEFvJ,KAAKuK,iBAAiB,IAIP,IAAfvK,KAAKuE,QAITvE,KAAKuE,MAAQ2C,KAAKsD,IAAIxK,KAAKuE,MAAQ,EAAG,GACtCvE,KAAK0E,IAAMwC,KAAKC,IAAInH,KAAK0E,IAAM,EAAG1E,KAAK2E,OAAOC,QAE9C5E,KAAKwE,SAAWxE,KAAK2E,OAAOyE,OAAO,CAACjG,EAAuBkG,IAAcA,GAAKrJ,KAAKuE,OAAS8E,EAAIrJ,KAAK0E,KACvG,CAOQ6F,iBAAiBE,GACvB,SAAO5B,KAAS7I,KAAK2H,aAAc3H,KAAK2E,UAAY8F,CACtD,CAACxJ,SAAAjB,KAAA,mBAAAkB,iBA5dU2D,GAAyBhD,mBAAA6I,MAAA7I,MAAA8I,MAAA,EAAA1J,SAAAjB,KAAA,UAAA4K,EAAAxJ,IAAA,MAAzByD,EAAyBxD,UAAA,2BAAAwJ,SAAA,EAAAC,aAAA,SAAArJ,EAAAC,GAAA,EAAAD,oCAAzBI,MAAA,YAAAH,EAAAwD,gmCDnDbrD,MAAA,EAAAkJ,EAAA,mBAAMlJ,MAAA,aAAAH,EAAAqB,cAAA,KAAArB,EAAAqB,cAAAwE,09ICmDO1C,CAA0B,iTClBhC,IAAMmG,EAAgB,MAAvB,MAAOA,EAOXrL,YAAoBsL,EAA6BC,GAA7BlL,KAAAiL,WAA6BjL,KAAAkL,IACjD,CAOA7D,WACErH,KAAKmL,YACP,CAOA/C,cACEpI,KAAKmL,YACP,CAKQA,aACDnL,KAAKoL,aAGNpL,KAAKoL,WAAW3D,UAClBzH,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,YAAatL,KAAKoL,WAAW3D,UAEzEzH,KAAKoL,WAAW7H,WAClBvD,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,aAActL,KAAKoL,WAAW7H,WAEhF,CAACtC,SAAAjB,KAAA,mBAAAkB,iBAzCU8J,GAAgBnJ,0BAAA,EAAAZ,SAAAjB,KAAA,UAAAuL,EAAAC,IAAA,MAAhBR,EAAgB3J,UAAA,sBAAAa,OAAA,CAAAkJ,WAAA,cAAAK,SAAA,CAAA5J,gBAAhBmJ,CAAgB,4LCxBzBnJ,MAAA,4CASAA,MAAA,UAIGA,MADA,iBAAAS,GAAAT,MAAAU,GAAA,MAAAmJ,EAAA7J,MAAA,UAAAA,MAAS6J,EAAAtH,kBAAkB,OAAM9B,EAAAoJ,EAAA9I,aAAsB,EACvDf,CADwD,iBAAAS,GAAAT,MAAAU,GAAA,MAAAmJ,EAAA7J,MAAA,UAAAA,MAC/C6J,EAAAtH,kBAAkB,OAAM9B,EAAAoJ,EAAA7I,gBAAyB,GAC3DhB,MAAA,YAIFA,iCAPGA,MAAA,WAAA6J,EAAAC,cAAAD,EAAAE,UAAA,0EAIC/J,cAAA,UAAA6J,EAAAG,eAAAH,EAAAE,WAAAF,EAAAI,eAAAC,WAAA,2CAEAlK,MAAA,QAAA6J,EAAA3J,oBAAA9C,+CAGJ4C,MAAA,4BAeAA,MAAA,yCAGYA,MADc,oBAAA6J,EAAAM,2BAAA,KAAAN,EAAAM,2BAAAC,YACdpK,CADqE,YAAA6J,EAAAQ,0BAAArK,iDAGjFA,MAAA,UAIGA,MADA,iBAAAS,GAAAT,MAAA6B,GAAA,MAAAgI,EAAA7J,MAAA,UAAAA,MAAS6J,EAAAtH,kBAAkB,QAAO9B,EAAAoJ,EAAA9I,aAAsB,EACxDf,CADyD,iBAAAS,GAAAT,MAAA6B,GAAA,MAAAgI,EAAA7J,MAAA,UAAAA,MAChD6J,EAAAtH,kBAAkB,QAAO9B,EAAAoJ,EAAA7I,gBAAyB,GAC5DhB,MAAA,YAIFA,iCAPGA,MAAA,WAAA6J,EAAAC,cAAAD,EAAAE,UAAA,0EAIC/J,cAAA,UAAA6J,EAAAC,cAAAD,EAAAE,WAAAF,EAAAI,eAAAC,WAAA,4CAEAlK,MAAA,QAAA6J,EAAA3J,oBAAA5C,kEA3CN0C,MAAA,cAeEA,MAXA,EAAAsK,GAAA,UAWAtK,CAP+D,EAAAuK,GAAA,sBAS/DvK,MAAA,WAWKA,MAFA,mBAAAA,MAAAwK,GAAA,MAAAX,EAAA7J,QAAA,OAAAA,MAAS6J,EAAAY,sBAAqB,EAE9BzK,CAF+B,qBAAAS,GAAAT,MAAAwK,GAAA,MAAAX,EAAA7J,QAAA,OAAAA,MAClB6J,EAAAa,MAAAjK,EAAAkK,MAAkB,EAC/B3K,CADgC,sBAAAS,GAAAT,MAAAwK,GAAA,MAAAX,EAAA7J,QAAA,OAAAA,MAClB6J,EAAAa,MAAAjK,EAAAkK,MAAkB,GAXrC3K,QAkBAA,MALA,EAAA4K,GAAA,oBAKA5K,CAFoD,EAAA6K,GAAA,YAclD7K,MADF,WACEA,CADa,gBAKJA,MAAA,oBAAAS,GAAAT,MAAAwK,GAAA,MAAAX,EAAA7J,QAAA,OAAAA,MAAY6J,EAAAiB,WAAArK,GAAkB,GAG3CT,+CArDeA,MAAA,aAAAA,MAAA,GAAA+K,EAAA,MAAAlB,EAAAI,eAAA,KAAAJ,EAAAI,eAAArE,WAGQ5F,cAAA,aAAA6J,EAAAI,eAAA,KAAAJ,EAAAI,eAAAC,YAWNlK,cAAA,mBAAAgL,GAGVhL,cAAA,mBAAA6J,EAAAI,eAAA,KAAAJ,EAAAI,eAAAgB,WAMAjL,MAAA,MAAA6J,EAAA/D,aAAAvE,MAAA4G,IAAA0B,EAAA/D,aAAAvE,MAAA4G,IAAA0B,EAAAqB,4BACAlL,MANU,aAAAA,MAAA,GAAAmL,EAAA,MAAAtB,EAAAI,eAAA,KAAAJ,EAAAI,eAAArE,SAAA,MAAAiE,EAAAI,eAAA,KAAAJ,EAAAI,eAAAvI,WAMV1B,CAL+D,MAAA6J,EAAA/D,aAAAvE,MAAAD,IAAAtB,MAK/DA,CAJ8B,QAAA6J,EAAA/D,aAAAvE,MAAA2G,MAAA2B,EAAA/D,aAAAvE,MAAA2G,MAAA2B,EAAAuB,oBAI9BpL,CAFmF,iEAO3EA,cAAA,YAAA6J,EAAAQ,2BAKSrK,cAAA,aAAA6J,EAAAI,eAAA,KAAAJ,EAAAI,eAAAC,YAYXlK,MAAA,GAGAA,MAHA,eAAA6J,EAAA/D,aAGA9F,CAH6B,aAAA6J,EAAAwB,WAG7BrL,CAFyB,sBAAA6J,EAAA3J,oBAEzBF,CAD2C,SAAA6J,EAAA/G,kDAcpD9C,MAAA,UAIGA,MADA,iBAAAS,GAAAT,MAAAsL,GAAA,MAAAzB,EAAA7J,MAAA,UAAAA,MAAS6J,EAAAtH,kBAAkB,OAAM9B,EAAAoJ,EAAA9I,aAAsB,EACvDf,CADwD,iBAAAS,GAAAT,MAAAsL,GAAA,MAAAzB,EAAA7J,MAAA,UAAAA,MAC/C6J,EAAAtH,kBAAkB,OAAM9B,EAAAoJ,EAAA7I,gBAAyB,GAC3DhB,MAAA,YAIFA,iCAPGA,MAAA,WAAA6J,EAAAC,cAAAD,EAAAE,UAAA,0EAIC/J,cAAA,UAAA6J,EAAAG,eAAAH,EAAAE,WAAAF,EAAAI,eAAAC,WAAA,2CAEAlK,MAAA,QAAA6J,EAAA3J,oBAAA9C,8CAGJ4C,MAAA,2BAmBEA,MAAA,kCAGKA,MADc,oBAAA6J,EAAAM,2BAAA,KAAAN,EAAAM,2BAAAC,YACdpK,CADqE,YAAA6J,EAAAQ,0BAAArK,gDAI5EA,MAAA,UAIGA,MADA,iBAAAS,GAAAT,MAAAuL,GAAA,MAAA1B,EAAA7J,MAAA,UAAAA,MAAS6J,EAAAtH,kBAAkB,QAAO9B,EAAAoJ,EAAA9I,aAAsB,EACxDf,CADyD,iBAAAS,GAAAT,MAAAuL,GAAA,MAAA1B,EAAA7J,MAAA,UAAAA,MAChD6J,EAAAtH,kBAAkB,QAAO9B,EAAAoJ,EAAA7I,gBAAyB,GAC5DhB,MAAA,YAIFA,iCAPGA,MAAA,WAAA6J,EAAAC,cAAAD,EAAAE,UAAA,0EAIC/J,cAAA,UAAA6J,EAAAC,cAAAD,EAAAE,WAAAF,EAAAI,eAAAC,WAAA,4CAEAlK,MAAA,QAAA6J,EAAA3J,oBAAA5C,iEAhDN0C,MAAA,WAeEA,MAXA,EAAAwL,GAAA,UAWAxL,CAP+D,EAAAyL,EAAA,sBAS/DzL,MAAA,YAeKA,MAFA,mBAAAA,MAAA0L,GAAA,MAAA7B,EAAA7J,QAAA,OAAAA,MAAS6J,EAAAY,sBAAqB,EAE9BzK,CAF+B,qBAAAS,GAAAT,MAAA0L,GAAA,MAAA7B,EAAA7J,QAAA,OAAAA,MAClB6J,EAAAa,MAAAjK,EAAAkK,MAAkB,EAC/B3K,CADgC,sBAAAS,GAAAT,MAAA0L,GAAA,MAAA7B,EAAA7J,QAAA,OAAAA,MAClB6J,EAAAa,MAAAjK,EAAAkK,MAAkB,GAEnC3K,MAAA,EAAA2L,EAAA,cAIF3L,QAEAA,MAAA,EAAA4L,EAAA,YAYE5L,MADF,WACEA,CADkB,gBAKTA,MAAA,oBAAAS,GAAAT,MAAA0L,GAAA,MAAA7B,EAAA7J,QAAA,OAAAA,MAAY6J,EAAAiB,WAAArK,GAAkB,GAG3CT,+CA1DYA,MAAA,aAAAA,MAAA,GAAA+K,EAAA,MAAAlB,EAAAI,eAAA,KAAAJ,EAAAI,eAAArE,WAGW5F,cAAA,aAAA6J,EAAAI,eAAA,KAAAJ,EAAAI,eAAAC,YAWNlK,cAAA,mBAAAgL,GAGVhL,QAKAA,MALA,iCAKAA,CALwC,mBAAA6J,EAAA/H,mBAAA+H,EAAA/D,aAAAvE,MAAAD,IAAA,IAKxCtB,CAJ0E,sCAI1EA,CAH6C,0BAG7CA,CAFiC,gCAEjCA,CADuC,kCAOvCA,MALO,aAAAA,MAAA,GAAA6L,EAAA,MAAAhC,EAAAI,eAAA,KAAAJ,EAAAI,eAAAvI,WAKP1B,CAJyD,aAAAA,MAAA,GAAA8L,GAAA,MAAAjC,EAAAI,eAAA,KAAAJ,EAAAI,eAAArE,UAIzD5F,CAH6D,QAAA6J,EAAA/D,aAAAvE,MAAA2G,MAAA2B,EAAA/D,aAAAvE,MAAA2G,MAAA2B,EAAAuB,oBAG7DpL,CADmF,iEAMhFA,cAAA,YAAA6J,EAAAQ,2BAMcrK,cAAA,aAAA6J,EAAAI,eAAA,KAAAJ,EAAAI,eAAAC,YAYXlK,MAAA,GAGAA,MAHA,eAAA6J,EAAA/D,aAGA9F,CAH6B,aAAA6J,EAAAwB,WAG7BrL,CAFyB,sBAAA6J,EAAA3J,oBAEzBF,CAD2C,SAAA6J,EAAA/G,SCnErD,IAAMiJ,EAAkB,MAAzB,MAAOA,UAA0BlO,IAuJrCmO,eACO7N,KAAK8N,WAAWC,cAGrB/N,KAAKgO,cACP,CAMAC,gBACOjO,KAAK8N,WAAWC,eAAiB/N,KAAK8N,WAAWI,UAGtDlO,KAAKmO,cACP,CAMAC,gBACOpO,KAAK8L,eAAeuC,gBAGzBrO,KAAKsO,WACP,CAMAC,kBACOvO,KAAK8L,eAAeuC,gBAGzBrO,KAAKwO,WACP,CAEA7O,YAC+B8O,EACrBC,EACAC,EACA7J,EAEAE,IAERC,QAP6BjF,KAAAyO,cACrBzO,KAAA0O,UACA1O,KAAA2O,iBACA3O,KAAA8E,MAEA9E,KAAAgF,aAhMVhF,KAAAmF,UAAY,WAoCZnF,KAAA4O,WAAyB,CAACrH,SAAS,GAWnCvH,KAAA4L,UAAW,EAMX5L,KAAA+B,oBAA2CzE,IAM3C0C,KAAA6O,KAAsC,IAAIxJ,MAK1CrF,KAAA8O,WAA4C,IAAIzJ,MAKhDrF,KAAA+O,UAA2C,IAAI1J,MAM/CrF,KAAA4C,YAAsB0C,IAAOC,MAK7BvF,KAAA6C,eAAyByC,IAAOE,SA6BhCxF,KAAA6L,cAAe,EAKf7L,KAAA2L,aAAc,EAId3L,KAAAgP,mBAAyC,CACvCC,SAAUC,KAAqBC,OAC/BC,OAAQ,IAAIC,MAAe,GAAI,IAMzBrP,KAAAsP,OAAS,IAAIC,KAIbvP,KAAAwP,MAAQ,IAAID,KAKZvP,KAAAyP,aAAe,CACrBC,KAAM,YACNC,MAAO,aACPC,GAAI,UACJC,KAAM,YAwDR,CAEAzH,YAAYC,GAEV,MAAMyH,EAAiCzH,EAAQuG,WAC3CkB,GAAoBA,EAAiBpH,eAAiBoH,EAAiBtH,gBACzExI,KAAKkN,WAAa4C,EAAiBpH,cAGrC,MAAMqH,EAAqC1H,EAAQrE,eAC/C+L,GAAwBA,EAAqBrH,eAAiBqH,EAAqBvH,gBACrFxI,KAAK8L,eAAiBiE,EAAqBrH,cAG7C,MAAMsH,EAAiC3H,EAAQ4H,WAC/C,GAAID,EAAkB,CACpB,MACME,GAAmCF,EAAiBtH,aADjBsH,EAAiBxH,gBAE7B0H,KAC3BlQ,KAAK8N,WAAakC,EAAiBtH,aAG/BwH,GAAqBhC,WAAa8B,EAAiBG,gBACrDnQ,KAAKsP,OAAO9F,OAEZxJ,KAAKgO,eAGX,CACF,CAEA3G,WACErH,KAAK2H,aAAe3H,KAAK2E,OAAO,GAEhC,MAQMyL,EAAkC,CACtCnB,SAAUoB,IAAoBC,cAC9BC,UAAW,SACXC,gBAAiB,IACjBC,sBAAuB,MACvBC,MAbgD,CAChDC,QAAS,oBACTC,UAAW,QACXC,UAAW,MACXC,aAAc,MACdC,WAAY,MACZC,YAAa,QAsCf,GAVAhR,KAAKgM,2BAA6BnF,OAAOC,OAAO,GAnBO,CACrDmF,YAAamE,EACba,aAAa,GAiBgEjR,KAAKkR,qBACpFlR,KAAKgM,2BAA2BC,YAAcpF,OAAOC,OAAO,GAAIsJ,EAAoBpQ,KAAKgM,2BAA2BC,aAGpHjM,KAAKkN,WAAarG,OAAOC,OADS,CAACS,SAAS,GACGvH,KAAK4O,YAEpD5O,KAAK8L,eAAiBjF,OAAOC,OAAO,GArBiB,CACnDW,SAAU,OACVlE,UAAW,QACXwI,YAAY,EACZe,UAAW,QACXuB,gBAAgB,EAChB8C,oBAAoB,EACpBlN,gBAAgB,GAcoDjE,KAAKgE,gBAC3EhE,KAAK8N,WAAajH,OAAOC,OAAO,GAbe,CAC7CoH,UAAU,EACVkD,SAAU,IACVrD,cAAc,GAUgD/N,KAAKiQ,YAGjEjQ,KAAK8N,WAAWsD,UAAY,EAC9B,MAAM,IAAIC,MAAM,6CAGlBrR,KAAKsR,mBACP,CAEAC,sBAGE,EAAIC,MAAkBxR,KAAKyO,cACzBzO,KAAK0O,QAAQ+C,kBAAkB,KAC7BzR,KAAKsP,OACFoC,QACCC,KAAI,IAAM3R,KAAK8N,WAAWsD,WAAQ,EAClChI,KAAOgI,GAAYA,EAAW,IAAC,EAC/BQ,KAAUR,MAAYS,KAAMT,GAAUM,QAAKI,KAAU9R,KAAKwP,UAE3DtJ,UAAU,IACTlG,KAAK0O,QAAQqD,IAAI,KACX/R,KAAK8N,WAAWI,UAClBlO,KAAKwO,YAEPxO,KAAK8E,IAAIsC,cAAY,IAI3BpH,KAAKsP,OAAO9F,MAAI,EAGtB,CAQA7F,mBAAmBwG,GAEjB,OAAOnK,KAAKgF,UAAUoF,yBAAyB,OAASD,EAAc,IACxE,CAMAwC,WAAW1C,GACTjK,KAAKgS,mBAAmBhS,KAAK2E,OAAOsF,GAAQ3E,IAAOoE,OACrD,CAQAtF,kBAAkBvE,EAAmBC,EAAsB2J,EAAiBnE,IAAOoE,QACjF,MAAMvD,EAAiBlB,MAAMrF,sBAAsBC,EAAWC,GAC1DqG,IAAWvF,KACbZ,KAAKwO,UAAU/E,GACNtD,IAAWnF,MACpBhB,KAAKsO,UAAU7E,EAEnB,CAMA6C,sBACE,IAAKtM,KAAK8L,eAAeqF,mBACvB,OAEF,MAAMlH,KAAQpB,KAAS7I,KAAK2H,aAAc3H,KAAK2E,QAC/C3E,KAAK2O,eAAesD,YAAYjS,KAAKmI,GAAI8B,EAC3C,CAUAiC,wBAAwBgG,EAAelS,KAAK2H,cAC1C,IAAK3H,KAAKgM,6BAA+BhM,KAAKgM,2BAA2BC,YACvE,MAAM,IAAIoF,MAAM,mFAGlB,MAAMc,GAAoCD,EAAM9O,QAAU8O,EAAM9O,MAAM6I,aAA2C,KAA5BiG,EAAM9O,MAAM6I,YAEjG,OAAQjM,KAAKgM,2BAA2BC,YAAYgD,UAClD,KAAKoB,IAAoB+B,cACvB,OAAOD,EAA0B,GAAKD,EAAM9O,MAAM6I,YAAc,GAClE,KAAKoE,IAAoBC,cACvB,MAAO,GACT,QAEE,OAAOtQ,KAAKqS,qBAAqBH,EAAOC,GAE9C,CAMA5F,MAAM9C,EAASzJ,KAAKyP,aAAaE,OAC/B,OAAQlG,GACN,KAAKzJ,KAAKyP,aAAaE,MACjB3P,KAAKgM,2BAA2BiF,YAClCjR,KAAKsO,UAAUhJ,IAAOgN,OAEtBtS,KAAKwO,UAAUlJ,IAAOgN,OAExB,MACF,KAAKtS,KAAKyP,aAAaC,KACjB1P,KAAKgM,2BAA2BiF,YAClCjR,KAAKwO,UAAUlJ,IAAOgN,OAEtBtS,KAAKsO,UAAUhJ,IAAOgN,OAQ9B,CAOAhE,UAAU7E,EAAiBnE,IAAOoE,QAE5B1J,KAAKuK,iBAAiB,KAG1BvK,KAAKgS,mBAAmBhS,KAAKuS,eAAgB9I,GAE7CzJ,KAAKsR,oBAELtR,KAAKsP,OAAO9F,OACd,CAOAgF,UAAU/E,EAAiBnE,IAAOoE,QAE5B1J,KAAKuK,iBAAiBvK,KAAK2E,OAAOC,OAAS,KAG/C5E,KAAKgS,mBAAmBhS,KAAKwS,eAAgB/I,GAE7CzJ,KAAKsR,oBAELtR,KAAKsP,OAAO9F,OACd,CAQA/E,UAAUwF,EAAeC,GACvB,OAAOA,EAAK/B,EACd,CAMAsK,eAAe3S,GACb,MAAM4S,EAAoB1S,KAAK2E,OAAe7E,EAAMqG,QAC9CuM,IACJ1S,KAAKsR,oBACLtR,KAAKgS,mBAA0BU,EAAY5S,EAAM2J,QAErD,CAKA0E,eACEnO,KAAKsP,OAAO9F,MACd,CAKAwE,eACEhO,KAAKwP,MAAMhG,MACb,CASAuD,yBAAyBmF,EAAelS,KAAK2H,cAC3C,OAAKuK,EAGEA,EAAM9O,OAAS8O,EAAM9O,MAAM6I,YAAciG,EAAM9O,MAAM6I,YAAc,YAASpD,KAASqJ,EAAOlS,KAAK2E,QAAU,IAFzG,EAGX,CAWAsI,kBAAkBiF,EAAelS,KAAK2H,cACpC,IAAK3H,KAAKgM,6BAA+BhM,KAAKgM,2BAA2BC,YACvE,MAAM,IAAIoF,MAAM,mFAIlB,OAD4BrR,KAAKqS,qBAAqBH,GADZA,EAAM9O,QAAU8O,EAAM9O,MAAM6I,aAA2C,KAA5BiG,EAAM9O,MAAM6I,YAGnG,CAsBA5B,cACErK,KAAKgO,cACP,CAOQgE,mBAAmBE,EAAczI,GACvCzJ,KAAK2H,aAAeuK,EACpB,MAAMjI,KAAgBpB,KAASqJ,EAAOlS,KAAK2E,QAG3C3E,KAAK2S,kBAAkBlJ,EAAQQ,GAG/BjK,KAAK6O,KAAKhF,KAAK,IAAI+I,KAAgBnJ,EAAQQ,EAAQ,GACrD,CAOQuI,eACN,MAAM5J,KAAuBC,KAAS7I,KAAK2H,aAAc3H,KAAK2E,QAC9D,IAAIkO,EAAW,EACf,OACEA,EADEjK,GAAgB,GAAKA,EAAe5I,KAAK2E,OAAOC,OAAS,EAChDgE,EAAe,EAEf,EAEN5I,KAAK2E,OAAOkO,EACrB,CAOQN,eACN,MAAM3J,KAAuBC,KAAS7I,KAAK2H,aAAc3H,KAAK2E,QAC9D,IAAIkO,EAAW,EACf,OACEA,EADEjK,EAAe,GAAKA,GAAgB5I,KAAK2E,OAAOC,OAAS,EAChDgE,EAAe,EAEf5I,KAAK2E,OAAOC,OAAS,EAE3B5E,KAAK2E,OAAOkO,EACrB,CASQR,qBAAqBH,EAAcC,GACzC,IAAKnS,KAAKgM,6BAA+BhM,KAAKgM,2BAA2BC,YACvE,MAAM,IAAIoF,MAAM,mFAIlB,GAAIrR,KAAKgM,2BAA2BC,YAAY6G,uBAA+F,KAAtE9S,KAAKgM,2BAA2BC,YAAY6G,sBACnH,OAAO9S,KAAKgM,2BAA2BC,YAAY6G,sBAGrD,MAAMlK,KAAuBC,KAASqJ,EAAOlS,KAAK2E,QAI5CoO,EAA0B/S,KAAKgM,2BAA2BC,YAAYsE,UAAYvQ,KAAKgM,2BAA2BC,YAAYsE,UAAY,GAI1IyC,GAA4BpK,EAAe,GAHpB5I,KAAKgM,2BAA2BC,YAAYuE,gBACrExQ,KAAKgM,2BAA2BC,YAAYuE,gBAC5C,IACgExQ,KAAK2E,OAAOC,OAEhF,OAAIuN,EACKY,EAAkBC,GAKpBD,EAAkBC,IADMhT,KAAKgM,2BAA2BC,YAAYwE,uBADxCyB,EAAM9O,OAAS8O,EAAM9O,MAAM6I,YAAciG,EAAM9O,MAAM6I,YAAc,IAGxG,CAOQgH,iBAAiBrK,GACvB,GAA2B,IAAvB5I,KAAK2E,OAAOC,OAGd,OAFA5E,KAAK6L,cAAe,OACpB7L,KAAK2L,aAAc,GAGrB,OAAQ/C,GACN,KAAK,EAEH5I,KAAK6L,cAAe,EACpB7L,KAAK2L,aAAc,EACnB,MACF,KAAK3L,KAAK2E,OAAOC,OAAS,EAExB5E,KAAK6L,cAAe,EACpB7L,KAAK2L,aAAc,EACnB,MACF,QACE3L,KAAK6L,cAAe,EACpB7L,KAAK2L,aAAc,EAGzB,CAOQ2F,oBACN,IAAIrH,EACJ,IACEA,KAAQpB,KAAS7I,KAAK2H,aAAc3H,KAAK2E,OAC3C,OAASmE,GACPC,cAAQC,MAAM,uDACRF,CACR,EAEsB,IAAlB9I,KAAK4L,UAEP5L,KAAK6L,cAAe,EACpB7L,KAAK2L,aAAc,GAEnB3L,KAAKiT,iBAAiBhJ,EAE1B,CAQQ0I,kBAAkBlJ,EAAgByJ,GAExC,OAAQA,GACN,KAAK,EACHlT,KAAK8O,WAAWjF,KAAK,IAAI+I,KAAgBnJ,GAAQ,IACjD,MACF,KAAKzJ,KAAK2E,OAAOC,OAAS,EACxB5E,KAAK+O,UAAUlF,KAAK,IAAI+I,KAAgBnJ,GAAQ,IAGtD,CAWQc,iBAAiBE,GACvB,OAAQzK,KAAK4L,aAAY/C,KAAS7I,KAAK2H,aAAc3H,KAAK2E,UAAY8F,CACxE,CAACxJ,SAAAjB,KAAA,mBAAAkB,iBA5rBU0M,GAAiB/L,MAgMlBsR,OAAWtR,mBAAA6I,KAAA7I,mBAAA8I,MAAA,EAAA1J,SAAAjB,KAAA,UAAAuL,EAAAnK,IAAA,MAhMVwM,EAAiBvM,UAAA,kBAAAwJ,SAAA,EAAAC,aAAA,SAAArJ,EAAAC,GAAA,EAAAD,GAAjBI,MAAA,+BAAAH,EAAAmM,cAAc,EAAdhM,CAAiB,+BAAjBH,EAAAuM,cAAc,EAAdpM,CAAiB,sCAAjBH,EAAA0M,eAAe,EAAfvM,CAAiB,uCAAjBH,EAAA6M,iBAAiB,qzDD5D9B1M,MAAA,YAwEEA,MAhEA,EAAAuR,EAAA,yBAAAvR,MAgEAA,CAhEsB,EAAAwR,GAAA,gBAgEtBxR,CAxD2C,EAAAyR,EAAA,0BAAAzR,OAuH7CA,QAEAA,MAAA,4BAKsBA,MAAA,wBAAAS,IAAAT,aAAAsC,GAAAtC,MAAgBH,EAAA+Q,eAAAnQ,IAAsB,GAAET,QAE9DA,MAAA,iDA7IgBA,MADV,QAAAH,EAAAK,oBAAAhD,uBACU8C,CAD0C,aAAAA,MAAA,GAAA0R,EAAA,MAAA7R,EAAAoK,eAAA,KAAApK,EAAAoK,eAAArE,gFAYxB5F,MAAA,GAAgDA,MAAhD,mBAAAH,EAAAoK,eAAA,KAAApK,EAAAoK,eAAA7H,gBAAgDpC,CAAA,WAAA2R,GA2H5D3R,MAAA,GAIAA,MAJA,SAAAH,EAAAiD,OAIA9C,CAJiB,eAAAH,EAAAiG,aAIjB9F,CAH6B,iBAAAH,EAAAoK,eAG7BjK,CAFiC,gBAAAH,EAAAqF,cAEjClF,CAD+B,sBAAAH,EAAAK,qBAInCF,QAAiCA,MAAjC,KAAAH,EAAAyG,GAAiCtG,CAAxB,cAAAH,EAAAiD,OAAwB9C,CAAD,qBAAAH,EAAAsN,85JCpFrCpB,CAAkB,mJCzDzB/L,MAAA,GACEA,MAAA,yCAA8BA,cAAA,MAAAC,EAAA2R,QAAAC,KAAAC,SAAA9R,6BAG9BA,MAAA,oBAAgCA,MAAA,OAAAA,MAAA,EAAAwB,ICYjC,IAAMuQ,EAAgB,MAAvB,MAAOA,EAIXjU,cACA,CAEA0H,WACA,CAACpG,SAAAjB,KAAA,mBAAAkB,iBARU0S,EAAgB,EAAA3S,SAAAjB,KAAA,UAAAiC,EAAAb,IAAA,MAAhBwS,EAAgBvS,UAAA,iBAAAa,OAAA,CAAAuR,QAAA,WAAAnS,MAAA,GAAAC,KAAA,EAAAa,OAAA,0SAAAZ,SAAA,SAAAC,EAAAC,MAAA,EAAAD,IDjBzBI,MAFJ,UAEIA,CAFwC,UAExCA,CAD0C,WAKxCA,MAHA,EAAAgS,EAAA,qBAGAhS,CAHyD,EAAAiS,EAAA,yBAAAjS,OAO3DA,QACAA,MAAA,WAA4BA,MAAA,GAAiDA,QAC7EA,MAAA,WAA0CA,MAAA,oBAC5CA,UAEAA,MAAA,YACEA,MAAA,IAEJA,iCAfqBA,MAAA,GAA8BA,MAA9B,aAAAH,EAAA+R,QAAAC,KAAA,KAAAhS,EAAA+R,QAAAC,KAAAC,SAA8B9R,CAAA,WAAAkS,GAQnBlS,MAAA,GAAAA,OAAA,MAAAH,EAAA+R,QAAAC,KAAA,KAAAhS,EAAA+R,QAAAC,KAAAM,YAAA,MAAAtS,EAAA+R,QAAAC,KAAA,KAAAhS,EAAA+R,QAAAC,KAAAO,QACcpS,MAAA,GAAAA,YAAA,KAAAH,EAAA+R,QAAAS,mBAAA,oCAI1CrS,MAAA,GAAAA,MAAA,IAAAH,EAAA+R,gBAAA,ixCCGSG,CAAgB,kPCZvB/R,MAAA,GACEA,MAAA,qDAEEA,cAAA,UAAAsS,6BAJNtS,MAAA,GACEA,MAAA,EAAAuS,EAAA,mEAAkCvS,QAAaA,MAAb,UAAAwS,EAAaxS,CAAA,eAAA6J,EAAA4I,kCAS/CzS,MAAA,YACEA,MAAA,wBAEFA,eAFEA,cAAA,IAAAA,MAAA,0DAfNA,MAAA,WAaEA,MATA,EAAA0S,EAAA,qBASA1S,CAT0D,EAAA2S,EAAA,yBAAA3S,OAgB5DA,wCAhBiBA,QAA2BA,MAA3B,OAAAwS,EAAAzP,OAAA,EAA2B/C,CAAA,WAAA4S,6BA0B1C5S,MADF,WACEA,CADkF,aAC1DA,MAAA,GAC1BA,+BAD0BA,MAAA,GAAAA,MAAA6S,0BAGxB7S,MAAA,YACEA,MAAA,gBACFA,eAD2BA,cAAA,OAAAA,MAAA,EAAAwB,8BAL7BxB,MAAA,EAAA8S,EAAA,+BAGA9S,MAAA,EAAA+S,EAAA,yBAAA/S,wCAH4CA,MAAtC,OAAAA,MAAA,IAAA6J,EAAAmJ,eAAsChT,CAAV,WAAAiT,ICjB7B,IAAMC,EAAiB,MAAxB,MAAOA,EAgCXpV,YAAoBmF,GAAA9E,KAAA8E,MAjBb9E,KAAAgV,aAA2B,KAK1BhV,KAAAiV,cAAgB,IAAI1F,KAKrBvP,KAAAkV,WAAY,EAKZlV,KAAA6U,cAAgB,IAAItF,KAKnBvP,KAAAmV,kBAAyB,CAHY,CAQ7C,MACIhN,CAAGiN,GACLpV,KAAKqV,KAAOD,EAEZpV,KAAKiV,cAAczL,OAEfxJ,KAAKsV,oBACPtV,KAAKuV,YAAYvV,KAAKmI,GAE1B,CAEA,MAAIA,GACF,OAAOnI,KAAKqV,GACd,CAEAhO,WACErH,KAAKuV,YAAYvV,KAAKmI,GACxB,CAMAoN,YAAYC,GACVxV,KAAKkV,WAAY,EACjBlV,KAAKgV,aAAe,KAEpBhV,KAAKsV,mBACFG,KAAKD,GACL9D,QACCI,KAAU9R,KAAKiV,gBAAa,EAC5BS,KAAS,KACP1V,KAAKkV,WAAY,KAClB,EACDS,KAAW3M,IACThJ,KAAKkV,WAAY,EACjBlV,KAAK6U,cAAcrL,KAAKR,IAAK,EACtB4M,WAGV1P,UAAU2P,IACT7V,KAAKgV,aAA2Ba,EAChC7V,KAAK8E,IAAIgR,eAAa,EAE5B,CAMAC,YAAYC,GACLA,IACDhW,KAAKmV,mBACTnV,KAAKmV,kBAAkB,EACvBnV,KAAKiW,eAAezM,KAAK,CAAER,MAAO,GAAIkN,SAAS,IAE/ClW,KAAKsV,mBACFa,OAAOnW,KAAKmI,GAAI6N,GAChBtE,QACCiE,KAAW3M,IACThJ,KAAKiW,eAAezM,KAAK,CAAER,MAAOA,EAAOkN,SAAS,IAClDlW,KAAKmV,kBAAkB,KAChBS,WAGV1P,UAAWkQ,IACVpW,KAAKgV,aAAaqB,KAAKD,EAASE,MAEhCtW,KAAKiW,eAAezM,KAAK,CAAER,MAAO,GAAIkN,SAAS,IAC/ClW,KAAKmV,kBAAkB,EAEvBnV,KAAK8E,IAAIgR,eAAa,IAE5B,CAOAxB,UAAUrK,EAAOC,GACf,OAAOD,CACT,CAAChJ,SAAAjB,KAAA,mBAAAkB,iBA1HU6T,GAAiBlT,aAAA,EAAAZ,SAAAjB,KAAA,UAAAiC,EAAAb,IAAA,MAAjB2T,EAAiB1T,UAAA,kBAAAa,OAAA,CAAAoT,mBAAA,qBAAAnN,GAAA,MAAA7G,MAAA,EAAAC,KAAA,EAAAa,OAAA,8eAAAZ,SAAA,SAAAC,EAAAC,GAAA,KAAAD,EAAA,iBDb5BI,MADF,UACEA,CAD4B,WACRA,MAAA,wBAAmCA,QACvDA,MAAA,EAAA0U,EAAA,aAqBF1U,QACAA,MAAA,iBACEA,MAAA,4BAAAS,GAAAT,aAAAsC,GAAAtC,MAAAH,EAAAuU,eAAA3T,KAAAZ,EAAAuU,eAAA3T,GAAAT,MAAAS,EAAA,GACAT,MAAA,yBAAAS,GAAAT,aAAAsC,GAAAtC,MAAiBH,EAAAqU,YAAAzT,GAAmB,GACrCT,QAGDA,MAAA,EAAA2U,EAAA,yBAAA3U,gCA7BsBA,MAAA,GAAAA,YAAA,yBACdA,MAAA,GAAgCA,MAAhC,OAAAH,EAAAsT,aAAgCnT,CAAb,WAAA4U,GAuBzB5U,cAAA,aAAAH,EAAAuU,knDCXWlB,CAAiB,yUCaxBlT,MAAA,GACEA,MAAA,SACEA,MAAA,gBACFA,uBADwBA,MAAA,GAAAA,MAAA,OAAAA,MAAA,EAAA8L,2BAIxB9L,MAAA,YACEA,MAAA,gBACFA,eAD2BA,cAAA,OAAAA,MAAA,EAAA6U,6CA/BjC7U,MAHF,UAGEA,CAF0B,WAK1BA,MAAA,wBAEEA,MAAA,YAA8CA,MAAA,mBAAAA,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAASa,EAAAiU,kBAAiB,GACtE9U,MAAA,eAEJA,UAKIA,MAHJ,UAGIA,CAD6B,kBAMnBA,MAAA,mBAAAA,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAASa,EAAAkU,aAAY,GACnC/U,UAGEA,MADF,UACEA,CADsG,aACjGA,MAAA,mBAAAA,MAAAsC,GAAA,MAAA0S,EAAAhV,MAAA,GAAAa,EAAAb,QAAA,OAAAA,MAASa,EAAAoU,KAAAD,GAAa,GAOzBhV,MALA,GAAAkV,EAAA,sBAKAlV,CALwD,GAAAmV,EAAA,yBAAAnV,OAc9DA,yDArCOA,cAAA,UAAAA,MAAA,GAAA0R,EAAA0D,EAAAjO,QAELnH,cAAA,IAAAA,MAAA,0BAGaA,MAAA,GAAAA,MAAA,OAAAA,MAAA,GAAA+K,IAMX/K,cAAA,UAAAA,MAAA,GAAAmL,EAAAtK,EAAAwU,UAGYrV,QAEAA,MAFA,cAAAa,EAAAyU,YAEAtV,CAF2B,WAAAoV,EAAAf,SAMLrU,MAAA,GAAAA,MAAA,UAAAA,MAAA,GAAA6L,EAAAuJ,EAAAf,UAGjBrU,MAAA,GAA2BA,MAA3B,QAAAoV,EAAAf,QAA2BrU,CAAA,WAAAuV,ICbzC,IAAMC,EAAe,MAAtB,MAAOA,EAyBX1X,cAf4BK,KAAAsX,iBAAmB,IAAIjS,MAKzCrF,KAAAuX,cAAgB,IAAIlS,MAKtBrF,KAAAiV,cAAgB,IAAI1F,KAE5BvP,KAAAkX,SAAmB,EACnBlX,KAAAmX,YAAsB,kHAGtB,CAEA9P,WAEErH,KAAKwX,YAAc,IAAIC,IAAgB,CAACzO,MAAO,GAAIkN,SAAS,IAC5DlW,KAAKsX,iBAAiBzN,KAAK7J,KAAKwX,aAGhCxX,KAAKwX,YACF9F,QACCI,KAAU9R,KAAKiV,gBAEhB/O,UAAUwR,IACJ1X,KAAKgW,SAEM,KAAZ0B,EAAE1O,QAA8B,IAAd0O,EAAExB,UACtBlW,KAAKgW,QAAQ1K,cAAc8J,MAAQ,KAG3C,CAEA/K,cACErK,KAAKiV,cAAczL,OACnBxJ,KAAKiV,cAAc0C,UACrB,CAMAb,KAAKc,GACEA,EAASxC,MAQdpV,KAAKuX,cAAc1N,KAAK+N,EAASxC,OAL/BpV,KAAK6X,mBAMT,CAKAA,oBACE7X,KAAKkX,SAAU,EACflX,KAAKmX,YAAc,yGACrB,CAGAR,kBACE3W,KAAKwX,YAAYhO,KAAK,CAACR,MAAO,GAAIkN,SAAS,GAC7C,CAEAU,aACE5W,KAAKkX,SAAU,EACflX,KAAKmX,YAAc,kHACrB,CAAClW,SAAAjB,KAAA,mBAAAkB,iBApFUmW,EAAe,EAAApW,SAAAjB,KAAA,UAAAiC,EAAAb,IAAA,MAAfiW,EAAehW,UAAA,gBAAAyW,UAAA,SAAArW,EAAAC,MAAA,EAAAD,8sBDd5BI,MAAA,EAAAkW,EAAA,sCAAMlW,MAAA,OAAAA,MAAA,IAAAH,EAAA8V,y5ECcOH,CAAe,2LCahBW,YAAZ,SAAYA,GACVA,WAAAC,IAAA,UACAD,IAAAE,WAAA,iBACAF,IAAAG,YAAA,kBACAH,IAAAI,SAAA,eACAJ,IAAAK,WAAA,iBALUL,CAMZ,CANA,CAAYA,GAAQ,sECEb,IAAMM,EAA2B,MAAlC,MAAOA,EAHb3Y,cAQEK,KAAAuY,SAAiC,IAAIlT,MASrCmT,UAAUC,GACHzY,KAAKmC,QAGVnC,KAAKuY,SAAS1O,KAAK4O,EAAEC,QACvB,CAACzX,SAAAjB,KAAA,mBAAAkB,iBAnBUoX,EAA2B,EAAArX,SAAAjB,KAAA,UAAAuL,EAAAC,IAAA,MAA3B8M,EAA2BjX,UAAA,iCAAAyJ,aAAA,SAAArJ,EAAAC,GAAA,EAAAD,GAA3BI,MAAA,mBAAAS,GAAA,OAAAZ,EAAA8W,UAAAlW,EAAiB,KAAAT,wEAAjByW,CAA2B,4HCXhCzW,MAAA,YAWKA,MADA,iBAAAS,GAAAT,MAAAwK,GAAA,MAAAsM,EAAA9W,MAAA,UAAAA,MAAS8W,EAAAvU,kBAAkB,OAAM9B,EAAAqW,EAAA/V,aAAsB,EACvDf,CADwD,iBAAAS,GAAAT,MAAAwK,GAAA,MAAAsM,EAAA9W,MAAA,UAAAA,MAC/C8W,EAAAvU,kBAAkB,OAAM9B,EAAAqW,EAAA9V,gBAAyB,GAX/DhB,gDAQKA,MAAA,MAAA+W,EAAAxV,MAAA4G,IAAA4O,EAAAxV,MAAA4G,IAAA2O,EAAA5L,yBAAA6L,IACA/W,MAPA,YAAA+W,EAAA1V,OAAA0V,EAAA1V,MAAAC,IAAAyV,EAAA1V,MAAAC,IAAAyV,EAAAxV,MAAAD,IAAAtB,MAOAA,CAP8E,SAAA8W,EAAAzC,QAO9ErU,CANkB,aAAAA,MAAA,EAAA0R,EAAA,MAAAoF,EAAAE,YAAAC,aAAA,KAAAH,EAAAE,YAAAC,aAAAC,KAAAzV,MAAA,MAAAqV,EAAAE,YAAAC,aAAA,KAAAH,EAAAE,YAAAC,aAAAC,KAAAC,QAMlBnX,CAJ2G,QAAA+W,EAAAxV,MAAA2G,MAAA6O,EAAAxV,MAAA2G,MAAA4O,EAAAzM,wBAAA0M,GAI3G/W,CAFkG,6EAMrGA,MAAA,kCAEKA,MAAA,aAAAA,MAAA,EAAA0R,EAAA,MAAAoF,EAAAE,YAAAC,aAAA,KAAAH,EAAAE,YAAAC,aAAAC,KAAAzV,MAAA,MAAAqV,EAAAE,YAAAC,aAAA,KAAAH,EAAAE,YAAAC,aAAAC,KAAAC,mCAhBTnX,MAAA,GAaEA,MAZA,EAAAoX,EAAA,cAYApX,CADkE,EAAAqX,EAAA,yBAAArX,iDAX5DA,QAAqBA,MAArB,QAAA8W,EAAA9M,aAAqBhK,CAAA,WAAAsX,6BAF/BtX,MAAA,GACEA,MAAA,EAAAuX,EAAA,oDAAevX,cAAA,OAAA8W,EAAAU,gDAyCfxX,MAAA,wCAGYA,MADc,oBAAA8W,EAAAW,mBAAA,KAAAX,EAAAW,mBAAArN,YACdpK,CAD6D,YAAA8W,EAAAzM,0BAAArK,iDAK3EA,MAAA,cAEOA,MAAA,kBAAAS,GAAAT,MAAA0L,GAAA,MAAAoL,EAAA9W,QAAA,OAAAA,MAAU8W,EAAAY,eAAAjX,EAAAkX,OAAAC,SAAqC,GAFtD5X,gCAGOA,MAAA,UAAA8W,EAAAe,kDAKL7X,MAFF,WAEEA,CAD2C,sBAKzCA,MADA,4BAAAA,MAAAsL,GAAA,MAAAwL,EAAA9W,QAAA,OAAAA,MAAkB8W,EAAAgB,mBAAkB,EACpC9X,CADqC,mBAAAS,GAAAT,MAAAsL,GAAA,MAAAwL,EAAA9W,QAAA,OAAAA,MAC1B8W,EAAAiB,eAAAtX,GAAsB,GAIrCT,kCATKA,MAAA,UAAA8W,EAAAzC,QAAA,WAEDrU,QAKAA,MALA,UAAA8W,EAAAhR,aAAAQ,GAKAtG,CAL2B,qBAAA8W,EAAArD,mBAK3BzT,CAJyC,eAAA8W,EAAAkB,aAIzChY,CAD6B,mBAAA8W,EAAAmB,4DAS7BjY,MAAA,YAWKA,MADA,iBAAAS,GAAAT,MAAAuL,GAAA,MAAAuL,EAAA9W,MAAA,UAAAA,MAAS8W,EAAAvU,kBAAkB,QAAO9B,EAAAqW,EAAA/V,aAAsB,EACxDf,CADyD,iBAAAS,GAAAT,MAAAuL,GAAA,MAAAuL,EAAA9W,MAAA,UAAAA,MAChD8W,EAAAvU,kBAAkB,QAAO9B,EAAAqW,EAAA9V,gBAAyB,GAXhEhB,gDAQKA,MAAA,MAAAkY,EAAA3W,MAAA4G,IAAA+P,EAAA3W,MAAA4G,IAAA2O,EAAA5L,yBAAAgN,IACAlY,MAPA,YAAAkY,EAAA7W,OAAA6W,EAAA7W,MAAAC,IAAA4W,EAAA7W,MAAAC,IAAA4W,EAAA3W,MAAAD,IAAAtB,MAOAA,CAPiF,SAAA8W,EAAAzC,QAOjFrU,CANkB,aAAAA,MAAA,EAAA0R,EAAA,MAAAoF,EAAAqB,YAAAlB,aAAA,KAAAH,EAAAqB,YAAAlB,aAAAC,KAAAzV,MAAA,MAAAqV,EAAAqB,YAAAlB,aAAA,KAAAH,EAAAqB,YAAAlB,aAAAC,KAAAC,QAMlBnX,CAJ2G,QAAAkY,EAAA3W,MAAA2G,MAAAgQ,EAAA3W,MAAA2G,MAAA4O,EAAAzM,wBAAA6N,GAI3GlY,CAFqG,8EAMxGA,MAAA,kCAEKA,MAAA,aAAAA,MAAA,EAAA0R,EAAA,MAAAoF,EAAAqB,YAAAlB,aAAA,KAAAH,EAAAqB,YAAAlB,aAAAC,KAAAzV,MAAA,MAAAqV,EAAAqB,YAAAlB,aAAA,KAAAH,EAAAqB,YAAAlB,aAAAC,KAAAC,oCAhBTnX,MAAA,GAaEA,MAZA,EAAAoY,GAAA,cAYApY,CADmE,EAAAqY,GAAA,yBAAArY,iDAX7DA,QAAoBA,MAApB,QAAA8W,EAAAhN,YAAoB9J,CAAA,WAAAsY,8BAF9BtY,MAAA,GACEA,MAAA,EAAAuY,GAAA,oDAAevY,cAAA,OAAA8W,EAAA0B,mDAsBjBxY,MAAA,GACEA,MAAA,yDAAoBA,QACAA,MADA,sBAAA8W,EAAAW,mBAAA,KAAAX,EAAAW,mBAAAgB,cACAzY,CADmD,sBAAA8W,EAAA5W,sBC3CtE,IAAMwY,GACX,MADI,MAAOA,UACH7a,IA0JRC,YAAyC8O,EAAqBC,EAAyB5J,GACrFG,QADuCjF,KAAAyO,cAAqBzO,KAAA0O,UAAyB1O,KAAA8E,MArHvF9E,KAAAwa,sBAAwB,IAAInV,MA0BnBrF,KAAAya,aAAuB,EAMhCza,KAAA0a,UAA0C,IAAIrV,MAK9CrF,KAAA2a,YAA6C,IAAItV,MAKjDrF,KAAA4a,MAAuC,IAAIvV,MAEjCrF,KAAA6a,YAAc,IAAIxV,MAQpBrF,KAAAsP,OAAS,IAAIC,KAIbvP,KAAAwP,MAAQ,IAAID,KAMpBvP,KAAA8a,aAAuBxV,IAAOoE,OAK9B1J,KAAA4C,YAAsB0C,IAAOC,MAK7BvF,KAAA6C,eAAyByC,IAAOE,SAKhCxF,KAAA6L,cAAe,EAKf7L,KAAA2L,aAAc,EAKd3L,KAAAkW,SAAU,EAaVlW,KAAA+a,SAAkB,EAGlB/a,KAAAgb,MAAe,EAMPhb,KAAAyP,aAAe,CACrBC,KAAM,YACNC,MAAO,aACPC,GAAI,UACJC,KAAM,YAMR,CAMAhC,gBAEO7N,KAAK6Y,cAAgB7Y,KAAK6Y,YAAY5I,YAGtCjQ,KAAK6Y,YAAY5I,WAAWlC,cAGjC/N,KAAKgO,cACP,CAMAC,gBAEOjO,KAAK6Y,cAAgB7Y,KAAK6Y,YAAY5I,aAGtCjQ,KAAK6Y,YAAY5I,WAAWlC,eAAiB/N,KAAK6Y,YAAY5I,WAAW/B,UAG9ElO,KAAKmO,cACP,CAOA9G,WACE,MAYM+I,EAAkC,CACtCnB,SAAUoB,IAAoB4K,eAC9B1K,UAAW,SACXC,gBAAiB,IACjBC,sBAAuB,MACvBC,MAbgD,CAChDC,QAAS,oBACTC,UAAW,QACXC,UAAW,MACXC,aAAc,MACdC,WAAY,MACZC,YAAa,QAiBfhR,KAAKsZ,mBAAqBzS,OAAOC,OAAO,GARc,CACpDoU,iBAAiB,EACjBZ,cArBoC,CACpCa,QAAQ,EACR3O,KAAM4O,IAAYC,UAoBlBpP,YAAamE,EACbkL,cAAc,EACdrK,aAAa,GAGwDjR,KAAKub,oBAC5Evb,KAAKsZ,mBAAmBrN,YAAcpF,OAAOC,OAAO,GAAIsJ,EAAoBpQ,KAAKsZ,mBAAmBrN,aAEpGjM,KAAK6Y,YAAchS,OAAOC,OAAO,GAAI9G,KAAKga,YAC5C,CAQA5R,YAAYC,GACV,MAAM1D,EAAuB0D,EAAQ1D,OAC/BgD,EAA6BU,EAAQV,cAEvCA,GAAgBA,EAAaa,gBAAkBb,EAAae,cAIrD/D,GAAUA,EAAO6D,gBAAkB7D,EAAO+D,eAHnD1I,KAAKwb,gBAOP,MAAMxB,EAA4B3R,EAAQ2R,YACtCA,GAAeA,EAAYxR,gBAAkBwR,EAAYtR,eAC3D1I,KAAK6Y,YAAchS,OAAOC,OAAO,GAAI9G,KAAKga,aAE9C,CAEAzI,sBAGE,EAAIC,MAAkBxR,KAAKyO,cACzBzO,KAAK0O,QAAQ+C,kBAAkB,KAC7BzR,KAAKsP,OACFoC,QACCC,KACE,IACE3R,KAAK6Y,aACL7Y,KAAK6Y,YAAY5I,YACjBjQ,KAAK6Y,YAAY5I,WAAW/B,UAC5BlO,KAAK6Y,YAAY5I,WAAWmB,WAAQ,EAExChI,KAAOgI,GAAYA,EAAW,IAAC,EAC/BQ,KAAUR,MAAYS,KAAMT,GAAUM,QAAKI,KAAU9R,KAAKwP,UAE3DtJ,UAAU,IACTlG,KAAK0O,QAAQqD,IAAI,KACV/R,KAAK2L,aACR3L,KAAKwO,UAAUlJ,IAAOmW,UAExBzb,KAAK8E,IAAIsC,cAAY,IAI3BpH,KAAKsP,OAAO9F,MAAI,EAGtB,CAOAkS,WAAWhD,GAOT,OAAQA,GACN,KAPkB1Y,KAAK2b,gBAAkB3b,KAAK2b,eAAeC,IAAM5b,KAAK2b,eAAeC,IAAM5D,EAASC,IAQpGjY,KAAK4a,MAAM/Q,KAAK,IAAI+I,KAAgBtN,IAAOE,UAAU,IACrD,MACF,KARAxF,KAAK2b,gBAAkB3b,KAAK2b,eAAeE,MAAQ7b,KAAK2b,eAAeE,MAAQ7D,EAASG,YAStFnY,KAAKwO,UAAUlJ,IAAOE,UACtB,MACF,KATAxF,KAAK2b,gBAAkB3b,KAAK2b,eAAeG,KAAO9b,KAAK2b,eAAeG,KAAO9D,EAASE,WAUpFlY,KAAKsO,UAAUhJ,IAAOE,UAG5B,CAUA0G,wBAAwBgG,EAAelS,KAAK2H,cAC1C,IAAK3H,KAAKsZ,qBAAuBtZ,KAAKsZ,mBAAmBrN,YACvD,MAAM,IAAIoF,MAAM,mFAGlB,MAAMc,GAAoCD,EAAM9O,QAAU8O,EAAM9O,MAAM6I,aAA2C,KAA5BiG,EAAM9O,MAAM6I,YAEjG,OAAQjM,KAAKsZ,mBAAmBrN,YAAYgD,UAC1C,KAAKoB,IAAoB+B,cACvB,OAAOD,EAA0B,GAAKD,EAAM9O,MAAM6I,YAAc,GAClE,KAAKoE,IAAoBC,cACvB,MAAO,GACT,QAEE,OAAOtQ,KAAKqS,qBAAqBH,EAAOC,GAE9C,CAQApF,yBAAyBmF,EAAelS,KAAK2H,cAC3C,OAAKuK,EAGEA,EAAM9O,OAAS8O,EAAM9O,MAAM6I,YAC9BiG,EAAM9O,MAAM6I,YACZ,YAASpD,KAASqJ,EAAOlS,KAAK2E,QAAU,IAJnC,EAKX,CAUAsI,kBAAkBiF,EAAelS,KAAK2H,cACpC,IAAK3H,KAAKsZ,qBAAuBtZ,KAAKsZ,mBAAmBrN,YACvD,MAAM,IAAIoF,MAAM,mFAIlB,OAD4BrR,KAAKqS,qBAAqBH,GADZA,EAAM9O,QAAU8O,EAAM9O,MAAM6I,aAA2C,KAA5BiG,EAAM9O,MAAM6I,YAGnG,CAMAoN,sBACE,MAAMzQ,KAAuBC,KAAS7I,KAAK2H,aAAc3H,KAAK2E,QAC9D,OAAqB,IAAjBiE,GAAsB5I,KAAK6Y,YAAYjN,SAIlC5L,KAAK2E,OAAO3E,KAAK2E,OAAOC,OAAS,IAE1C5E,KAAKiT,iBAAiBrK,GACf5I,KAAK2E,OAAOuC,KAAKsD,IAAI5B,EAAe,EAAG,IAChD,CAMAyR,uBACE,MAAMzR,KAAuBC,KAAS7I,KAAK2H,aAAc3H,KAAK2E,QAC9D,OAAIiE,IAAiB5I,KAAK2E,OAAOC,OAAS,GAAK5E,KAAK6Y,YAAYjN,SAIvD5L,KAAK2E,OAAO,IAErB3E,KAAKiT,iBAAiBrK,GACf5I,KAAK2E,OAAOuC,KAAKC,IAAIyB,EAAe,EAAG5I,KAAK2E,OAAOC,OAAS,IACrE,CAQAjC,aAAa7C,EAAmC2J,EAAiBnE,IAAOoE,QACtE1J,KAAK+a,SAAW/a,KAAK+a,SAIjBtR,IAAWnE,IAAOC,OAAUvF,KAAKsZ,mBAAmB4B,kBAMjCjW,MAAM5E,iBAAiBP,KAC/Bc,MACbZ,KAAKwO,UAAU/E,EAEnB,CASArF,kBAAkBvE,EAAmBC,EAAsB2J,EAAiBnE,IAAOoE,OAAQqS,GAAmB,GAC5G,GAAIA,EACF,OAEF,MAAM5V,EAAiBlB,MAAMrF,sBAAsBC,EAAWC,GAC1DqG,IAAWvF,KACbZ,KAAKwO,UAAU/E,GACNtD,IAAWnF,MACpBhB,KAAKsO,UAAU7E,EAEnB,CAOA6E,UAAU7E,EAAiBnE,IAAOoE,QAEhC,GAAI1J,KAAKuK,iBAAiB,GACxB,OAGF,MAAM+D,EAA8BtO,KAAKuS,eACzCvS,KAAKkW,SAAW5H,EAAU0N,iBAC1Bhc,KAAK2a,YAAY9Q,KAAK,IAAI+I,KAAgBnJ,KAAQZ,KAASyF,EAAWtO,KAAK2E,UAE3E3E,KAAKsP,OAAO9F,MACd,CAOAgF,UAAU/E,EAAiBnE,IAAOoE,QAEhC,GAAI1J,KAAKuK,iBAAiBvK,KAAK2E,OAAOC,OAAS,GAC7C,OAGF,MAAM4J,EAA8BxO,KAAKwS,eACzCxS,KAAKkW,SAAW1H,EAAUwN,iBAC1Bhc,KAAK2a,YAAY9Q,KAAK,IAAI+I,KAAgBnJ,KAAQZ,KAAS2F,EAAWxO,KAAK2E,UAE3E3E,KAAKsP,OAAO9F,MACd,CAOAyS,YAAYnc,EAAYqD,GACtBnD,KAAKkc,eAAepc,EAAM0Z,QAG1BrW,EAAIgZ,QAEJ,MAAMC,EAAgC,CACpCC,QAAQ,EACRpS,SAAOpB,KAAS7I,KAAK2H,aAAc3H,KAAK2E,QACxCwD,GAAInI,KAAK2H,aAAaQ,IAGxBnI,KAAK0a,UAAU7Q,KAAKuS,GAEpBpc,KAAKkW,SAAU,CACjB,CAMA3J,MAAM9C,EAASzJ,KAAKyP,aAAaE,OAC/B,OAAQlG,GACN,KAAKzJ,KAAKyP,aAAaE,MACjB3P,KAAKsZ,mBAAmBrI,YAC1BjR,KAAKsO,UAAUhJ,IAAOgN,OAEtBtS,KAAKwO,UAAUlJ,IAAOgN,OAExB,MACF,KAAKtS,KAAKyP,aAAaC,KACjB1P,KAAKsZ,mBAAmBrI,YAC1BjR,KAAKwO,UAAUlJ,IAAOgN,OAEtBtS,KAAKsO,UAAUhJ,IAAOgN,OAQ9B,CAOAgK,iBAAiBpK,EAAelS,KAAK2H,cACnC,SAAOkB,KAASqJ,EAAOlS,KAAK2E,OAC9B,CAKAwJ,eACEnO,KAAKsP,OAAO9F,MACd,CAKAwE,eACEhO,KAAKwP,MAAMhG,MACb,CAMAa,cACErK,KAAKgO,cACP,CAOQiF,iBAAiBrK,GACvB,GAA2B,IAAvB5I,KAAK2E,OAAOC,OAGd,OAFA5E,KAAK6L,cAAe,OACpB7L,KAAK2L,aAAc,GAGrB,GAAK3L,KAAK6Y,cAA6C,IAA9B7Y,KAAK6Y,YAAYjN,SAKxC,OAAQhD,GACN,KAAK,EAEH5I,KAAK6L,cAAe,EACpB7L,KAAK2L,aAAc,EACnB,MACF,KAAK3L,KAAK2E,OAAOC,OAAS,EAExB5E,KAAK6L,cAAe,EACpB7L,KAAK2L,aAAc,EACnB,MACF,QACE3L,KAAK6L,cAAe,EACpB7L,KAAK2L,aAAc,OAhBvB3L,KAAK6L,cAAe,EACpB7L,KAAK2L,aAAc,CAmBvB,CAWQpB,iBAAiBE,GACvB,QACIzK,KAAK6Y,cACuB,IAA9B7Y,KAAK6Y,YAAYjN,WAAa,EAC9B/C,KAAS7I,KAAK2H,aAAc3H,KAAK2E,UAAY8F,CAEjD,CAOQ+H,eACN,MAAM5J,KAAuBC,KAAS7I,KAAK2H,aAAc3H,KAAK2E,QAC9D,IAAIkO,EAAW,EACf,OACEA,EADEjK,GAAgB,GAAKA,EAAe5I,KAAK2E,OAAOC,OAAS,EAChDgE,EAAe,EAEf,EAEN5I,KAAK2E,OAAOkO,EACrB,CAOQN,eACN,MAAM3J,KAAuBC,KAAS7I,KAAK2H,aAAc3H,KAAK2E,QAC9D,IAAIkO,EAAW,EACf,OACEA,EADEjK,EAAe,GAAKA,GAAgB5I,KAAK2E,OAAOC,OAAS,EAChDgE,EAAe,EAEf5I,KAAK2E,OAAOC,OAAS,EAE3B5E,KAAK2E,OAAOkO,EACrB,CASQR,qBAAqBH,EAAcC,GACzC,IAAKnS,KAAKsZ,qBAAuBtZ,KAAKsZ,mBAAmBrN,YACvD,MAAM,IAAIoF,MAAM,mFAIlB,GACErR,KAAKsZ,mBAAmBrN,YAAY6G,uBAC0B,KAA9D9S,KAAKsZ,mBAAmBrN,YAAY6G,sBAEpC,OAAO9S,KAAKsZ,mBAAmBrN,YAAY6G,sBAG7C,MAAMlK,KAAuBC,KAASqJ,EAAOlS,KAAK2E,QAI5CoO,EAA0B/S,KAAKsZ,mBAAmBrN,YAAYsE,UAChEvQ,KAAKsZ,mBAAmBrN,YAAYsE,UACpC,GAIEyC,EAA4BpK,EAAe,GAHpB5I,KAAKsZ,mBAAmBrN,YAAYuE,gBAC7DxQ,KAAKsZ,mBAAmBrN,YAAYuE,gBACpC,IACgExQ,KAAK2E,OAAOC,OAEhF,OAAIuN,EACKY,EAAkBC,EAKpBD,EAAkBC,GADMhT,KAAKsZ,mBAAmBrN,YAAYwE,uBADhCyB,EAAM9O,OAAS8O,EAAM9O,MAAM6I,YAAciG,EAAM9O,MAAM6I,YAAc,IAGxG,CAKQuP,gBACN,IAAIvR,EACJ,IACElB,QAAQwT,IAAI,gBAAgBvc,KAAK2H,aAAc3H,KAAK2E,QACpDsF,KAAQpB,KAAS7I,KAAK2H,aAAc3H,KAAK2E,OAC3C,OAASmE,GACPC,cAAQC,MAAM,uDACRF,CACR,CACI9I,KAAKmC,QACPnC,KAAKiT,iBAAiBhJ,EAE1B,CAEA0P,mBACE3Z,KAAKwc,sBAAsBlR,cAAcoF,MAAQ,EACnD,CAEAkJ,eAAeyC,GACbrc,KAAKyc,iBAAmBJ,EACxBrc,KAAKwa,sBAAsB3Q,KAAK7J,KAAKyc,gBACvC,CAMAC,eAAevZ,GACb,MAAMwZ,EAAQxZ,EAAIwZ,MAGlB,OAAKxZ,EAAIC,YAAmBwZ,IAAVD,EAIX,YAAcA,EAHZ,EAIX,CAGA,WAAWjD,GACT,OAAO1Z,KAAK6c,eAAeC,UAAU9c,KAAK2H,aAAaQ,GACzD,CAEAoR,eAAezZ,GACbE,KAAK6a,YAAYhR,KAAK,CAAE1B,IAAKnI,KAAK2H,aAAaQ,GAAIsR,QAAS3Z,GAC9D,CAGAid,YAAYtE,GAEV,GAAGzY,KAAK+a,QAAS,OACjB,IAAI5X,EAAsBsV,EAAEe,OAExBwD,EADmB7Z,EAAI8Z,cACZC,wBAEXpB,GAAQrD,EAAE0E,EAAIH,EAAKG,IAAInd,KAAKgb,MAAM,GAClCoC,GAAO3E,EAAE4E,EAAIL,EAAKK,IAAIrd,KAAKgb,MAAM,GACrC7X,EAAIuN,MAAM4M,UAAW,SAAStd,KAAKgb,SACnChb,KAAKud,UAAUpa,EAAKia,EAAKtB,EAG3B,CAEA0B,WAAW/E,GAGT,GAAGzY,KAAK+a,QAAS,OACjB,IAAI5X,EAAiBsV,EAAEe,OACJ,OAAfrW,EAAIsa,UAAkBta,EAAMA,EAAIua,qBAAqB,OAAO,IAEhEva,EAAIuN,MAAM4M,UAAW,UACrBna,EAAIuN,MAAM0M,IAAM,MAChBja,EAAIuN,MAAMoL,KAAO,KACnB,CAEAyB,UAAUpa,EAAsBia,EAAYtB,GAC1C,IAAI6B,EAAY,KAAK3d,KAAKgb,MAAM,GAC5B4C,EAAY,KAAK5d,KAAKgb,MAAM,GAE7Bhb,KAAK6d,YAAY,IACjBF,EAAY,KAAK3d,KAAKgb,MAAM,GAC5B4C,EAAY,KAAK5d,KAAKgb,MAAM,IAG/B,IAAI2B,EAAQ3c,KAAK2H,aAAagV,MACnB,GAARA,IACDxZ,EAAIuN,MAAM0M,KAAOA,EAAMQ,EAAU,KACjCza,EAAIuN,MAAMoL,MAAQA,EAAM6B,EAAW,KACnCxa,EAAIuN,MAAMoN,OAAS,QACnB3a,EAAIuN,MAAMmL,MAAS,SAEV,IAARc,IACDxZ,EAAIuN,MAAMoL,MAAQsB,EAAMO,EAAU,KAClCxa,EAAIuN,MAAMoN,QAAUhC,EAAM8B,EAAW,KACrCza,EAAIuN,MAAM0M,IAAM,QAChBja,EAAIuN,MAAMmL,MAAS,SAEV,KAARc,IACDxZ,EAAIuN,MAAMoN,QAAUV,EAAMQ,EAAU,KACpCza,EAAIuN,MAAMmL,OAASC,EAAM6B,EAAW,KACpCxa,EAAIuN,MAAM0M,IAAM,QAChBja,EAAIuN,MAAMoL,KAAO,SAER,KAARa,IACDxZ,EAAIuN,MAAMmL,OAASuB,EAAMO,EAAU,KACnCxa,EAAIuN,MAAM0M,KAAOtB,EAAM8B,EAAW,KAClCza,EAAIuN,MAAMoN,OAAS,QACnB3a,EAAIuN,MAAMoL,KAAO,QAGrB,CAEAiC,QAAQje,GAEN,GAA6B,QAA1BA,EAAM0Z,OAAOiE,QAAoB,OACD3d,EAAM0Z,OACrC9I,MAAM4M,UAAW,SAAStd,KAAKgb,SACnC,IAAIgD,EAAYhe,KAAKgb,MAAQlb,EAAMme,OAAO,IACvCD,EAAS,GAAKA,GAAU,IAAGhe,KAAKgb,MAAQgD,EAC7C,CAEA9B,eAAe/Y,GACbA,EAAI8Z,cAAcA,cAAciB,UAAUC,OAAO,OAEjDhb,EAAIuN,MAAMsI,OAAS,UACnB7V,EAAIuN,MAAMpN,MAAQ,QAClBtD,KAAK6d,YAAc1a,EAAIib,cAAgBjb,EAAIkb,aAExCre,KAAK6d,YAAY,IAElB1a,EAAIuN,MAAMsI,OAAS,QACnB7V,EAAIuN,MAAMpN,MAAQ,UAClBH,EAAI8Z,cAAcA,cAAciB,UAAUI,IAAI,OAGlD,CAEAC,uBAAuBpW,GACrB,OAAOnI,KAAK2E,OAAO6Z,KAAMtU,GAAOA,EAAK/B,IAAIA,EAC3C,CAAClH,SAAAjB,KAAA,mBAAAkB,iBAvzBUqZ,GAAqB1Y,MA2JZsR,OAAWtR,0BAAA,EAAAZ,SAAAjB,KAAA,UAAAuL,EAAAnK,IAAA,MA3JpBmZ,EAAqBlZ,UAAA,uBAAAyW,UAAA,SAAArW,EAAAC,MAAA,EAAAD,+GAArBI,MAAA,+BAAAH,EAAAmM,cAAc,EAAdhM,CAAqB,+BAArBH,EAAAuM,cAAc,i2EDlE3BpM,MAAA,YAC6CA,MAAA,oBAAAS,GAAAT,aAAAsC,GAAAtC,MAAYH,EAAAga,WAAApZ,GAAkB,GAKvET,MADF,UACEA,CAD8B,SAK3BA,MADA,iBAAAS,GAAAT,aAAAsC,GAAAtC,MAASH,EAAA0C,kBAAkB,OAAM9B,EAAAZ,EAAAoZ,aAAApZ,EAAAmK,cAAqC,EACtEhK,CADuE,iBAAAS,GAAAT,aAAAsC,GAAAtC,MAC9DH,EAAA0C,kBAAkB,OAAM9B,EAAAZ,EAAAoZ,aAAApZ,EAAAmK,cAAqC,GACvEhK,MAAA,WAGFA,QAEAA,MAAA,EAAA4c,EAAA,sBAqBF5c,QAEAA,MAAA,WAA8DA,MAAA,iBAAAS,GAAAT,aAAAsC,GAAAtC,MAASH,EAAAqc,QAAAzb,GAAe,GACpFT,MAAA,iBAAoDA,MAAA,oBAAAS,GAAAT,aAAAsC,GAAAtC,MAAYH,EAAA8b,WAAAlb,GAAkB,GAE9ET,MAAA,cAaKA,MAPA,gBAAAS,GAAAT,MAAAsC,GAAA,MAAAua,EAAA7c,MAAA,UAAAA,MAAQH,EAAAua,YAAA3Z,EAAAoc,GAAiC,EAOzC7c,CAP0C,iBAAAS,GAAAT,aAAAsC,GAAAtC,MACjCH,EAAAiB,aAAAL,EAAAZ,EAAAkB,aAAiC,EAM1Cf,CAN2C,iBAAAS,GAAAT,aAAAsC,GAAAtC,MAClCH,EAAAiB,aAAAL,EAAAZ,EAAAmB,gBAAoC,EAK7ChB,CAL8C,qBAAAS,GAAAT,aAAAsC,GAAAtC,MACjCH,EAAA6K,MAAAjK,EAAAkK,MAAkB,EAI/B3K,CAJgC,sBAAAS,GAAAT,aAAAsC,GAAAtC,MAClBH,EAAA6K,MAAAjK,EAAAkK,MAAkB,EAGhC3K,CAHiC,kBAAAS,GAAAT,aAAAsC,GAAAtC,MAAAH,EAAAwU,QAAA5T,EAAA,EAGjCT,CAF2B,qBAAAS,GAAAT,aAAAsC,GAAAtC,MAEdH,EAAAqb,YAAAza,GAAmB,GAbrCT,QAgBFA,MAAA,GAAA8c,EAAA,qBAKF9c,QAQAA,MANA,GAAA+c,GAAA,eAMA/c,CAFC,GAAAgd,EAAA,cAaHhd,QAEAA,MAAA,aAwBEA,MAvBA,GAAAid,GAAA,qBAuBAjd,CAvBsD,GAAAkd,GAAA,sBA4BtDld,MAAA,UAIGA,MADA,iBAAAS,GAAAT,aAAAsC,GAAAtC,MAASH,EAAA0C,kBAAkB,QAAO9B,EAAAZ,EAAAoZ,aAAApZ,EAAAiK,aAAoC,EACtE9J,CADuE,iBAAAS,GAAAT,aAAAsC,GAAAtC,MAC9DH,EAAA0C,kBAAkB,QAAO9B,EAAAZ,EAAAoZ,aAAApZ,EAAAiK,aAAoC,GACvE9J,MAAA,YAKNA,kBAxHMA,MAFqB,SAAAH,EAAAS,OAErBN,CAFsC,QAAAH,EAAAK,oBAAA/D,qFAKrC6D,MAAA,GAAAA,MAAA,YAAAH,EAAAmK,aAAA,oBAEAhK,MAAA,WAAAH,EAAAmK,cAAA,sEAGIhK,cAAA,UAAAH,EAAAmK,aAAA,2CAEAhK,MAAA,QAAAH,EAAAmK,aAAA,GAAAnK,EAAAK,oBAAA7D,oBAGQ2D,cAAA,aAAAH,EAAAmX,aAAA,MAAAnX,EAAAmX,YAAAC,aAAA,KAAApX,EAAAmX,YAAAC,aAAAjK,MAuBIhN,cAAA,UAAAH,EAAAgb,eAAAhb,EAAAiG,eACyF9F,cAAA,UAAAH,EAAAwU,QAAA,WAMnGrU,MAAA,GAAAA,MAAA,MAAAH,EAAAiG,aAAAvE,MAAA4G,IAAAtI,EAAAiG,aAAAvE,MAAA4G,IAAAtI,EAAAqL,4BACAlL,MAHA,MAAAH,EAAAiG,aAAAvE,MAAA4b,OAAAnd,MAGAA,CAHiC,iEAc3BA,MAAA,GAAAA,MAAA,YAAAH,EAAAwK,2BAOarK,cAAA,QAAAH,EAAAwU,SAAAxU,EAAA+Y,aAML5Y,cAAA,OAAAH,EAAA+a,iBAcR5a,MAAA,GAAAA,MAAA,aAAAH,EAAAsY,aAAA,MAAAtY,EAAAsY,YAAAlB,aAAA,KAAApX,EAAAsY,YAAAlB,aAAAjK,MAuBAhN,cAAA,OAAAH,EAAAwU,UAAA,MAAAxU,EAAA4X,oBAAA,MAAA5X,EAAA4X,mBAAAgB,cAAA,KAAA5Y,EAAA4X,mBAAAgB,cAAAa,SAKZtZ,cAAA,aAAAH,EAAAmK,aAAA,oBAEAhK,MAAA,WAAAH,EAAAiK,aAAA,sEAGI9J,cAAA,UAAAH,EAAAiK,YAAA,4CAEA9J,MAAA,QAAAH,EAAAiK,YAAA,GAAAjK,EAAAK,oBAAA3D,gzQCtDEmc,CACX,8GC/DE1Y,MAAA,GACEA,MAAA,WAGEA,MAFA,UAEAA,CAF6C,UAE7CA,CAD6C,WAE/CA,uCAEFA,MAAA,GACEA,MAAA,0CAGFA,MAAA,GACEA,MAAA,0CAGFA,MAAA,GACEA,MAAA,0CAGFA,MAAA,GAEIA,MADF,WACEA,CADwB,YAKtBA,MAHA,YAGAA,CAH2B,YAG3BA,CAF2B,YAE3BA,CAD2B,aAG/BA,yCAEFA,MAAA,GACEA,MAAA,YACEA,MAAA,YACFA,uCAEFA,MAAA,GACEA,MAAA,YAIEA,MAHA,SAGAA,CAHa,SAGbA,CAFa,SAEbA,CADa,UAEfA,iBCEC,IAAMod,EAAuB,MAA9B,MAAOA,EAdbtf,cAgCEK,KAAAkf,gBAA+B9D,IAAYC,SAK3Crb,KAAAmf,YAA2B/D,IAAYgE,KAKvCpf,KAAAqf,gBAA+BjE,IAAYkE,SAK3Ctf,KAAAuf,YAA2BnE,IAAYoE,KAKvCxf,KAAAyf,oBAAmCrE,IAAYsE,cAK/C1f,KAAA2f,eAA8BvE,IAAYwE,QAK1C5f,KAAA6f,wBAAuCzE,IAAY0E,kBACpD7e,SAAAjB,KAAA,mBAAAkB,iBAjDY+d,EAAuB,EAAAhe,SAAAjB,KAAA,UAAAmB,EAAAC,IAAA,MAAvB6d,EAAuB5d,UAAA,yBAAAa,OAAA,CAAAoY,cAAA,gBAAAvY,oBAAA,uBAAAT,MAAA,EAAAC,KAAA,GAAAa,OAAA,6WAAAZ,SAAA,SAAAC,EAAAC,GAAA,EAAAD,ID9CpCI,MAAA,WAGEA,MAAA,KAmCEA,MAlCA,EAAAke,EAAA,qBAkCAle,CAlC8C,EAAAme,EAAA,qBAkC9Cne,CA3B0C,EAAAoe,EAAA,qBA2B1Cpe,CAvB8C,EAAAqe,EAAA,qBAuB9Cre,CAnB0C,EAAAse,EAAA,qBAmB1Cte,CAfkD,EAAAue,EAAA,qBAelDve,CAL6C,EAAAwe,EAAA,8BAiBjDxe,eAjDKA,MAAA,cAAAH,EAAAK,oBAAA,KAAAL,EAAAK,oBAAAjE,wHAEW+D,cAAA,WAAAH,EAAA4Y,cAAA9N,KAAA8T,YACGze,cAAA,eAAAH,EAAAwd,iBAOArd,cAAA,eAAAH,EAAAyd,aAIAtd,cAAA,eAAAH,EAAA2d,iBAIAxd,cAAA,eAAAH,EAAA6d,aAIA1d,cAAA,eAAAH,EAAA+d,qBAUA5d,cAAA,eAAAH,EAAAie,gBAKA9d,cAAA,eAAAH,EAAAme,utRCQNZ,CAAuB,yLC3ChCpd,MAAA,WAKyCA,MAApC,iBAAAS,GAAA,MAAAie,EAAA1e,MAAAsC,GAAA8F,MAAA0O,EAAA9W,MAAA,UAAAA,MAAS8W,EAAA6H,WAAAD,EAAAje,GAAyB,EAAET,CAAD,iBAAAS,GAAA,MAAAie,EAAA1e,MAAAsC,GAAA8F,MAAA0O,EAAA9W,MAAA,UAAAA,MAAU8W,EAAA6H,WAAAD,EAAAje,GAAyB,GAAET,2CADxEA,MAFA,UAAAA,MAAA,EAAAwB,EAAAsV,EAAA7V,SAAAyd,IAEA1e,CAFuC,4IAH9CA,MAAA,GACEA,MAAA,EAAA4e,EAAA,2CACqB5e,QAAWA,MAAX,UAAA8W,EAAAhU,OAAW9C,CAAA,eAAA8W,EAAAlU,YCyC7B,IAAMic,EAAc,MAArB,MAAOA,UAAsBhhB,IANnCC,kCAuBEK,KAAA4O,WAAyB,CAACrH,SAAS,GAYnCvH,KAAA2gB,SAAiC,IAAItb,MAarCgC,WAEErH,KAAKkN,WAAarG,OAAOC,OADS,CAACS,SAAS,GACGvH,KAAK4O,WACtD,CAMAxG,YAAYC,GACV,MAAMuY,EAAkCvY,EAAQuG,WAC5CgS,GAAqBA,EAAkBlY,eAAiBkY,EAAkBpY,gBAC5ExI,KAAKkN,WAAa0T,EAAkBlY,aAExC,CAQA5F,SAASmH,GACP,IAAKjK,KAAK2H,eAAiB3H,KAAK2E,QAAiC,IAAvB3E,KAAK2E,OAAOC,OACpD,OAAO,EAET,IAAIic,EACJ,IACEA,KAAahY,KAAS7I,KAAK2H,aAAc3H,KAAK2E,OAChD,OAASmE,GACPC,eAAQC,MAAM,uDAAwDF,IAC/D,CACT,CACA,OAAOmB,IAAU4W,CACnB,CAOAL,WAAWvW,EAAenK,GACDmF,MAAM5E,iBAAiBP,KAC/Bc,MACbZ,KAAK2gB,SAAS9W,KAAKI,EAEvB,CAQAxF,UAAUwF,EAAeC,GACvB,OAAOA,EAAK/B,EACd,CAAClH,SAAAjB,KAAA,4DAlGU0gB,KAAaxf,GAAbwf,EAAa,GAkGvB,GAlGuBzf,SAAAjB,KAAA,UAAAmB,EAAAC,IAAA,MAAbsf,EAAarf,UAAA,cAAAa,OAAA,CAAAyF,aAAA,eAAAhD,OAAA,SAAAiK,WAAA,aAAA7M,oBAAA,uBAAA+e,QAAA,CAAAH,SAAA,YAAAlV,SAAA,CAAA5J,aAAAP,MAAA,EAAAC,KAAA,EAAAa,OAAA,+OAAAZ,SAAA,SAAAC,EAAAC,GAAA,EAAAD,ID7C1BI,MAAA,WAEEA,MAAA,EAAAkf,EAAA,sBAQFlf,eATKA,MAAA,cAAAH,EAAAK,oBAAA,KAAAL,EAAAK,oBAAAzD,sHACYuD,cAAA,QAAAH,EAAAwL,aAAA,MAAAxL,EAAAwL,WAAA,KAAAxL,EAAAwL,WAAA3F,6uBC2CJmZ,CAAc,6KCvCzB7e,MAAA,wCAGEA,MADA,KAAAC,EAAAkf,QACAnf,CADc,qBAAAC,EAAAwT,6CAIhBzT,MAAA,oCAEEA,MAAA,eAAAC,EAAA+X,qCAGFhY,MAAA,OAAqBA,MAAA,kBAAWA,SCR3B,IAAMof,EAAkB,MAAzB,MAAOA,EAmBXthB,cAJUK,KAAAkhB,eAAiB,IAAI7b,MAErBrF,KAAAmhB,QAAU,IAAI9b,KAET,CAEfgC,WACErH,KAAKkhB,eAAerX,MACtB,CAEAQ,cACErK,KAAKmhB,QAAQtX,MAAK,EACpB,CAEA+Q,QACE5a,KAAKmhB,QAAQtX,MAAK,EACpB,CAAC5I,SAAAjB,KAAA,mBAAAkB,iBA/BU+f,EAAkB,EAAAhgB,SAAAjB,KAAA,UAAAmB,EAAAC,IAAA,MAAlB6f,EAAkB5f,UAAA,oBAAAa,OAAA,CAAA2X,aAAA,eAAAC,iBAAA,mBAAAsH,QAAA,UAAA9L,mBAAA,qBAAA0L,QAAA,WAAAF,QAAA,CAAAI,eAAA,iBAAAC,QAAA,WAAA7f,MAAA,EAAAC,KAAA,EAAAa,OAAA,mNAAAZ,SAAA,SAAAC,EAAAC,GAAA,EAAAD,IDJ/BI,MAAA,KAYEA,MAXA,EAAAwf,EAAA,oBAWAxf,CAPC,EAAAyf,EAAA,gBAODzf,CAFC,EAAA0f,EAAA,mBAKH1f,MAAA,YAEEA,MAAA,0BAASH,EAAAkZ,OAAO,GAChB/Y,MAAA,eACFA,eAnBcA,MAAA,YAAAH,EAAAoY,kBAETjY,cAAA,kBAMAA,cAAA,mBAUMA,MAAA,GAAAA,MAAA,OAAAA,MAAA,EAAAwB,4aCdE4d,CAAkB,sICH3Bpf,MAAA,gCAEEA,MAAA,YAAAC,EAAAN,SAAAK,8BAMAA,MAAA,WACEA,MAAA,wBACFA,eADEA,cAAA,IAAAA,MAAA,mCCPD,IAAM2f,EAAa,MAApB,MAAOA,EAIX7hB,YAAoBqF,GAAAhF,KAAAgF,WAA0B,CAE9CoD,YAAYC,GACVrI,KAAKwB,SAAWxB,KAAKgF,UAAUyc,wBAC7BzhB,KAAKiH,QAAQoB,EAAQwR,aAAanR,aAAalH,SAAU6G,EAAQwR,aAAanR,aAAagZ,WAE/F,CAEAra,WAAkB,CAElBJ,QAAQzF,EAAUkgB,GAShB,IAAIC,EADJngB,EAAW,oBADXA,GALAA,GADAA,EAAWA,EAASogB,MAAM,QACNjQ,IAAIkQ,IACtB,GAAIA,EACF,MAAO,OAAOA,QAAI,IAGFC,KAAK,WAIzB,QAASthB,KAAOkhB,EACd,GAAY,iBAARlhB,EAWJmhB,EAAOA,EAAK1a,QAAQ,KAAOzG,EAAM,KAAMkhB,EAAUlhB,QAXjD,CACE,MAAMuhB,EAAOL,EAAUlhB,GAMjBwhB,EALY,IAAIC,KAAKC,eAAe,KAAM,CAC9CC,KAAM,UACNC,MAAO,OACPC,IAAK,YAEwBC,OAAOP,GACtCJ,EAAOA,EAAK1a,QAAQ,KAAOzG,EAAM,KAAMwhB,EAEzC,CAIF,OAAOL,CACT,CAAC1gB,SAAAjB,KAAA,mBAAAkB,iBAzCUsgB,GAAa3f,MAAA6I,MAAA,EAAAzJ,SAAAjB,KAAA,UAAAiC,EAAAb,IAAA,MAAbogB,EAAangB,UAAA,cAAAa,OAAA,CAAA2X,aAAA,gBAAApO,SAAA,CAAA5J,OAAAP,MAAA,EAAAC,KAAA,EAAAa,OAAA,oOAAAZ,SAAA,SAAAC,EAAAC,MAAA,EAAAD,IDPxBI,MADF,UACEA,CAD4B,WACNA,MAAA,wBAAsCA,QAC5DA,MAAA,WAWEA,MAPA,EAAA0gB,EAAA,YAOA1gB,CAHC,EAAA2gB,EAAA,yBAAA3gB,OAULA,iCAnBwBA,MAAA,GAAAA,MAAA,IAAAA,MAAA,+BAMjBA,MAAA,GAAoBA,MAApB,OAAAH,EAAAmY,aAAoBhY,CAAA,WAAA4gB,gnBCCdjB,CAAa,gLCsBnB,IAAMkB,EAAkB,MAAzB,MAAOA,EADb/iB,cAEEK,KAAA2iB,IAAM,IAAIC,IASVC,YAAYC,GACV,IAAKC,OAAOC,UAAUF,IAAcA,EAAY,EAC9C,MAAM,IAAIzR,MAAM,oGAElB,GAAIrR,KAAK2iB,IAAIM,IAAIH,GACf,MAAM,IAAIzR,MAAM,iCAAiCyR,kFAEnD,OAAA9iB,KAAK2iB,IAAIO,IAAIJ,EAAWA,IACjB,CACT,CAQA3E,OAAO2E,GACL,IAAKC,OAAOC,UAAUF,IAAcA,EAAY,EAC9C,MAAM,IAAIzR,MAAM,oGAKlB,OAAArR,KAAK2iB,IAAIQ,OAAOL,IACT,CACT,CAAC7hB,SAAAjB,KAAA,mBAAAkB,iBApCUwhB,EAAkB,EAAAzhB,SAAAjB,KAAA,WAAAuL,EAAA6X,IAAA,OAAlBV,EAAkBW,QAAlBX,EAAkBY,UAAAC,WADN,gBACZb,CAAkB,0ECIxB,IAAMc,EAAqB,MAA5B,MAAOA,EAHb7jB,cAaEK,KAAAyjB,aAAsC,IAAIpe,MAO1Cqe,QAAQ5jB,GACNA,EAAM6jB,kBAEN,MAAMC,EAAqB9jB,EAAM0Z,OAEjC,IAAKxZ,KAAK6jB,qBAAuBD,EAC/B,OAGF,IAAIE,GAAW,EACXC,GAAW,EAEwB,iBAA5BH,EAAcI,UAGvBF,GAAW,GAGXA,EAAWF,EAAcI,WAAaJ,EAAcI,UAAUC,WAAW,UACzEF,EAAWH,EAAcI,UAAUlH,SAAS,aAYzCgH,GAAYC,IAEf/jB,KAAKyjB,aAAa5Z,MAAK,EAE3B,CAAC5I,SAAAjB,KAAA,mBAAAkB,iBApDUsiB,EAAqB,EAAAviB,SAAAjB,KAAA,UAAAuL,EAAAC,IAAA,MAArBgY,EAAqBniB,UAAA,2BAAAyJ,aAAA,SAAArJ,EAAAC,GAAA,EAAAD,GAArBI,MAAA,iBAAAS,GAAA,OAAAZ,EAAAgiB,QAAAphB,EAAe,oGAAfkhB,CAAqB,6CCzBlC3hB,MAAA,WAIKA,MAAA,wBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAAgBa,EAAAwhB,eAAA5hB,GAAsB,GAKrCT,MAHJ,UAGIA,CAH6B,UAG7BA,CAFgC,wBAadA,MATA,kBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAAUa,EAAAyhB,SAAA7hB,GAAgB,EAS1BT,CAT2B,oBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MACfa,EAAA0hB,WAAA9hB,GAAkB,EAQ9BT,CAR+B,oBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MACnBa,EAAA2hB,WAAA/hB,GAAkB,EAO9BT,CAP+B,iBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MACtBa,EAAA4hB,eAAAhiB,GAAsB,EAM/BT,CANgC,sBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAClBa,EAAA6hB,aAAAjiB,GAAoB,EAKlCT,CALmC,sBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MACrBa,EAAA8hB,aAAAliB,GAAoB,EAIlCT,CAJmC,oBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MACvBa,EAAA+hB,eAAAniB,GAAsB,EAGlCT,CAHmC,kBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MACzBa,EAAAgiB,SAAApiB,GAAgB,EAE1BT,CAF2B,qBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MACda,EAAAiiB,YAAAriB,GAAmB,EAChCT,CADiC,gBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MACzBa,EAAAkiB,WAAAtiB,GAAkB,GAC3CT,QAGDA,MAAA,wBAIkBA,MAAA,iCAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,qBAAAa,EAAAmiB,gBAAAviB,KAAAI,EAAAmiB,gBAAAviB,GAAAT,MAAAS,EAAA,GASAT,MAJA,qBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAAaa,EAAAuZ,YAAA3Z,GAAmB,EAIhCT,CAJiC,uBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAClBa,EAAAoiB,qBAAAxiB,GAA4B,EAG3CT,CAH4C,iBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAEnCa,EAAA4hB,eAAAhiB,GAAsB,EAC/BT,CADgC,uBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MACjBa,EAAA6W,eAAAjX,GAAsB,GAKpCT,QAGjBA,MADF,QACEA,CADG,eAKMA,MAAA,oBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAAYa,EAAAiK,WAAArK,GAAkB,GAAET,QAEzCA,MAAA,mBAIaA,MAAA,wBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAAgBa,EAAA+P,eAAAnQ,GAAsB,GAI3DT,wCAxDoBA,MADf,QAAAa,EAAAX,oBAAAnE,yBACeiE,CADuC,qBAAAa,EAAAqiB,2FAOnCljB,MAAA,GACAA,MADA,eAAAa,EAAAiF,aACA9F,CAD6B,gBAAAa,EAAAsiB,eAe7BnjB,QAGAA,MAHA,KAAAa,EAAAyF,GAGAtG,CAHS,SAAAa,EAAAiC,OAGT9C,CAFiB,eAAAa,EAAAiF,aAEjB9F,CAD6B,SAAAa,EAAAuiB,QAE7BpjB,MAAA,kBAAAa,EAAAmiB,iBAaAhjB,MAZA,cAAAa,EAAAmW,YAYAhX,CAZ2B,iBAAAa,EAAAiZ,eAY3B9Z,CAXiC,sBAAAa,EAAAX,oBAWjCF,CAV2C,qBAAAa,EAAA6Y,mBAU3C1Z,CATyC,qBAAAa,EAAA4S,mBASzCzT,CANyC,iBAAAa,EAAAma,eAMzChb,CAHiC,eAAAa,EAAAmX,aAGjChY,CAF6B,mBAAAa,EAAAoX,iBAE7BjY,CADqC,cAAAa,EAAA+X,aAK5C5Y,MAAA,GAGAA,MAHA,SAAAa,EAAAiC,OAGA9C,CAHiB,eAAAa,EAAAiF,aAGjB9F,CAF6B,aAAAa,EAAAkM,WAE7B/M,CADyB,sBAAAa,EAAAX,qBAIrBF,QAGAA,MAHA,SAAAa,EAAAiC,OAGA9C,CAHiB,eAAAa,EAAAiF,aAGjB9F,CAF6B,gBAAAa,EAAAqE,cAE7BlF,CAD+B,sBAAAa,EAAAX,sBCD7C,IAAMmjB,EAAqB,MAA5B,MAAOA,EAsKXC,WAAW1M,GACTzY,KAAKolB,cACP,CAKAzlB,YACU0lB,EACA1W,EACqB2W,EACrBC,EACAC,EACAxgB,GALAhF,KAAAqlB,kBACArlB,KAAA2O,iBACqB3O,KAAAslB,aACrBtlB,KAAAulB,oBACAvlB,KAAAwlB,qBACAxlB,KAAAgF,YAxJVhF,KAAA+kB,oBAAqB,EA6BrB/kB,KAAA+B,oBAA2CzE,IAgBlC0C,KAAAya,aAAuB,EAQhCza,KAAA4a,MAAuC,IAAIvV,MAK3CrF,KAAA6O,KAAsC,IAAIxJ,MAK1CrF,KAAA8O,WAA4C,IAAIzJ,MAKhDrF,KAAA+O,UAA2C,IAAI1J,MAK/CrF,KAAAylB,QAAyC,IAAIpgB,MAK7CrF,KAAA0lB,iBAA8C,IAAIrgB,MAKlDrF,KAAA2lB,gBAA6C,IAAItgB,MAKjDrF,KAAA4lB,MAAwC,IAAIvgB,MAElCrF,KAAA6a,YAAc,IAAIxV,MAElBrF,KAAA6lB,KAAO,IAAIxgB,MAWrBrF,KAAAilB,QAAS,EAITjlB,KAAA6kB,iBAAkB,EAIlB7kB,KAAA8lB,aAAc,CA0CX,CAQH1d,YAAYC,GAGV,MAAM0d,EAA6B1d,EAAQ2d,YACrCC,EAAyC5d,EAAQ6d,mBAMvD,GAJIH,IAAiBA,EAAaI,aAAeJ,EAAavd,gBAAkBud,EAAard,cAC3F1I,KAAKomB,aAGHH,EAA0B,CAE5B,MAAMI,EAAmDJ,EAAyBvd,aAEhF2d,EAA6BjX,QAC7BiX,EAA6BjX,kBAAkBC,OACY,IAA3DgX,EAA6BjX,OAAOkX,oBAGpCtmB,KAAKumB,iBAAiBF,EAA6BjX,OAAOkX,mBAE9D,CACF,CAOAjf,WAIE,GAHArH,KAAKwlB,mBAAmB3C,YAAY7iB,KAAKmI,KAGnCnI,KAAKmI,IAAkB,IAAZnI,KAAKmI,IAAanI,KAAKmI,GAAK,EAC3C,MAAM,IAAIkJ,MACR,8KAMJrR,KAAKomB,aAcLpmB,KAAK6Y,YAAchS,OAAOC,OAAO,GAZO,CACtC8E,UAAU,EACVqE,WAAwB,CACtB/B,UAAU,EACVkD,SAAU,IACVrD,cAAc,GAEhB+K,aAAkC,CAChCjK,MAAM,EACNkK,KAAM,CAAEzV,MAAO,QAAS0V,OAAQ,UAGqBhZ,KAAKga,aAE9Dha,KAAKwmB,mCAAqCxmB,KAAK2O,eAAe8X,SAASvgB,UACpEwgB,IACMA,SAIqB9J,IAAtB8J,EAAQ5D,WAA2B4D,EAAQ5D,UAAY,GAAK4D,EAAQ5D,YAAc9iB,KAAKmI,IAIvFue,EAAQzc,MAAQ,GAAKyc,EAAQzc,MAAQjK,KAAK2E,OAAOC,QAGrD5E,KAAKumB,iBAAiBG,EAAQzc,OAAO,GAAI,GAI7CjK,KAAK2mB,gCAAkC3mB,KAAK2O,eAAeiM,MAAM1U,UAAW4c,IACtEA,EAAY,GAAK9iB,KAAKmI,KAAO2a,GAGjC9iB,KAAKolB,aAAa9f,IAAOoE,QAAQ,EAAI,GAGvC1J,KAAK4mB,iCAAmC5mB,KAAK2O,eAAekY,OAAO3gB,UAAWwgB,IAS5E,IARKA,QAIqB9J,IAAtB8J,EAAQ5D,WAA2B4D,EAAQ5D,UAAY,GAAK4D,EAAQ5D,YAAc9iB,KAAKmI,IAIvFue,EAAQzc,MAAQ,GAAKyc,EAAQzc,MAAQjK,KAAK2E,OAAOC,SAAW8hB,EAAQxU,MACtE,OAEF,MAAMtJ,KAAuBC,KAAS6d,EAAQxU,MAAOlS,KAAK2E,QAC1D3E,KAAK2E,OAAS3E,KAAK2E,OAAOgN,IAAI,CAACO,EAAyBjI,IAClDiI,EAAM/J,KAAOue,EAAQzc,MACEyc,EAAQxU,MAE5BA,GAELtJ,IAAiB8d,EAAQzc,QAC3BjK,KAAK2H,aAAe3H,KAAK2E,OAAO+hB,EAAQzc,QAE1CjK,KAAKulB,kBAAkBne,cAAY,GAGrCpH,KAAK8mB,mCAAqC9mB,KAAK2O,eAAeT,SAAShI,UACpEwgB,SAE2B9J,IAAtB8J,EAAQ5D,WAA2B4D,EAAQ5D,UAAY,GAAK4D,EAAQ5D,YAAc9iB,KAAKmI,KAG3FnI,KAAK6Y,YAAY5I,WAAW/B,SAAWwY,EAAQvgB,SAGrD,CAMAqe,aAAa1kB,GACX,MAAMinB,EAA2B/mB,KAAKgnB,qBAAqBlnB,GAC3DE,KAAK0lB,iBAAiB7b,KAAKkd,GAE3B/mB,KAAK2lB,gBAAgB9b,KAAKkd,EAC5B,CAMAnC,WAAW9kB,GACT,MAAMinB,EAA2B/mB,KAAKgnB,qBAAqBlnB,GAE3DE,KAAK0lB,iBAAiB7b,KAAKkd,GAEvB/mB,KAAK6kB,gBACH7kB,KAAK8Z,mBAAqBha,EAAMe,OAAO2L,KACzCxM,KAAK6kB,iBAAkB,EAEvB7kB,KAAK8Z,iBAAmBmN,KAAWC,MAGrClnB,KAAK8Z,iBAAmBmN,KAAWC,KACnClnB,KAAK6kB,iBAAkB,GAGzB7kB,KAAK6lB,KAAKhc,KAAK/J,GAEfE,KAAK2lB,gBAAgB9b,KAAKkd,EAC5B,CAyCAtC,eAAe3kB,GACb,MAAMinB,EAA2B/mB,KAAKgnB,qBAAqBlnB,GAE3DE,KAAK0lB,iBAAiB7b,KAAKkd,GAEvB/mB,KAAK6kB,gBACH7kB,KAAK8Z,mBAAqBha,EAAMe,OAAO2L,KACzCxM,KAAK6kB,iBAAkB,EAEvB7kB,KAAK8Z,iBAAmBmN,KAAWE,UAGrCnnB,KAAK8Z,iBAAmBmN,KAAWE,SACnCnnB,KAAK6kB,iBAAkB,GAGzB7kB,KAAK2lB,gBAAgB9b,KAAKkd,EAC5B,CAMArC,SAAS5kB,GACP,MAAMinB,EAA2B/mB,KAAKgnB,qBAAqBlnB,GAS3D,OARAE,KAAK0lB,iBAAiB7b,KAAKkd,GAGtBA,EAAY7U,MAAM9O,MAAMuZ,QAC3BoK,EAAY7U,MAAM9O,MAAMuZ,MAAQ,GAI1BoK,EAAYlmB,OAAO2L,MACzB,KAAK,EACHua,EAAY7U,MAAM9O,MAAMuZ,OAASoK,EAAY7U,MAAM9O,MAAMuZ,MAAQ,IAAM,IAAM,IAC7E,MAEF,KAAK,EACHoK,EAAY7U,MAAM9O,MAAMuZ,OAASoK,EAAY7U,MAAM9O,MAAMuZ,MAAQ,IAAM,IAAM,IAMjF3c,KAAK2H,aAAed,OAAOC,OAAO,GAAI9G,KAAK2H,cAgD3C3H,KAAK2lB,gBAAgB9b,KAAKkd,EAC5B,CAMApC,YAAY7kB,GAEV,IAAIoS,EAAQlS,KAAK2H,aACjB,IAAIuK,EAAO,OACXlS,KAAKonB,YAAYlV,EAAMpS,EAAMe,OAAO2L,MACpC,MAAMua,EAA2B/mB,KAAKqnB,wBAAwBvnB,GAE9DE,KAAK0lB,iBAAiB7b,KAAKkd,GAC3B/mB,KAAK2lB,gBAAgB9b,KAAKkd,EAC5B,CAEAK,YAAYlV,EAAMoV,GAChB,IAAIC,EAAgBvnB,KAAKue,uBAAuBrM,EAAM/J,IACxC,IAAXmf,IACDpV,EAAMyK,MAAQzK,EAAMyK,MAAO,GAC3B4K,EAAe5K,MAAQ4K,EAAe5K,MAAO,GACnB,KAAvB4K,EAAe5K,QAChBzK,EAAMyK,MAAO,EACb4K,EAAe5K,MAAO,IAGZ,IAAX2K,IACDpV,EAAMyK,MAAQzK,EAAMyK,MAAO,GAC3B4K,EAAe5K,MAAQ4K,EAAe5K,MAAO,IAClB,IAAxB4K,EAAe5K,QAChBzK,EAAMyK,MAAO,IACb4K,EAAe5K,MAAO,KAG5B,CAMA4H,aAAazkB,GACX,MAAMinB,EAA2B/mB,KAAKgnB,qBAAqBlnB,GAC3DE,KAAK0lB,iBAAiB7b,KAAKkd,GAE3B,MAAMS,EAAgBC,SAChBC,EAAkBD,SAASE,gBAG9BH,EAAII,mBAAsBJ,EAAIK,yBAA4BL,EAAIM,sBAAyBN,EAAIO,oBAaxFP,EAAIQ,eACNR,EAAIQ,iBACKR,EAAIS,iBACbT,EAAIS,mBACKT,EAAIU,oBACbV,EAAIU,sBACKV,EAAIW,sBACbX,EAAIW,uBAjBFT,EAAMU,kBACRV,EAAMU,oBACGV,EAAMW,wBACfX,EAAMW,0BACGX,EAAMY,qBACfZ,EAAMY,uBACGZ,EAAMa,qBACfb,EAAMa,sBAcVvoB,KAAK2lB,gBAAgB9b,KAAKkd,EAC5B,CAMA5C,SAASrkB,GACP,MAAMinB,EAA2B/mB,KAAKgnB,qBAAqBlnB,GAC3DE,KAAK0lB,iBAAiB7b,KAAKkd,GAEA,IAAvB/mB,KAAK2E,OAAOC,QACd5E,KAAKolB,eAG4BplB,KAAKwoB,sBAAsBlM,iBAAiBxc,EAAMoS,SAC1DlS,KAAK2E,OAAOC,OAAS,EAE9C5E,KAAKwoB,sBAAsBla,YAE3BtO,KAAKwoB,sBAAsBha,YAG7BxO,KAAK2lB,gBAAgB9b,KAAKkd,EAC5B,CAMA3C,WAAWtkB,GACT,MAAMinB,EAA2B/mB,KAAKgnB,qBAAqBlnB,GAC3DE,KAAK0lB,iBAAiB7b,KAAKkd,IAAW,EAElCvV,MAAkBxR,KAAKslB,aACrByB,EAAY7U,OAAS6U,EAAY7U,MAAM9O,MAAM4b,SAE3C+H,EAAYlmB,QAAUkmB,EAAYlmB,OAAO4nB,eAOzBC,OAAOC,KAAK5B,EAAY7U,MAAM9O,MAAM4b,OAAQ,wBACpD4J,OAAS,KAEnBF,OAAOG,SAASC,KAAO/B,EAAY7U,MAAM9O,MAAM4b,QAIrDhf,KAAK2lB,gBAAgB9b,KAAKkd,EAC5B,CAMA1C,WAAWvkB,GACT,MAAMinB,EAA2B/mB,KAAKgnB,qBAAqBlnB,GAC3DE,KAAK0lB,iBAAiB7b,KAAKkd,GAC3B/mB,KAAK+oB,gBACL/oB,KAAK2lB,gBAAgB9b,KAAKkd,EAC5B,CAOAzC,eAAexkB,EAAoB2J,EAAiBnE,IAAOoE,QACzD,MAAMqd,EAA2B/mB,KAAKgnB,qBAAqBlnB,GAC3DE,KAAK0lB,iBAAiB7b,KAAKkd,GAC3B/mB,KAAKolB,aAAa3b,GAClBzJ,KAAK2lB,gBAAgB9b,KAAKkd,EAC5B,CAQA3B,aAAa3b,EAAiBnE,IAAOoE,OAAQsf,GAA6B,GACxEhpB,KAAK4a,MAAM/Q,KAAK,IAAI+I,KAAgBnJ,GAAQ,IAC5CzJ,KAAKilB,QAAS,EACdjlB,KAAKqlB,gBAAgB4D,QAIVjpB,KAAKue,uBAAuBve,KAAK2H,aAAaQ,IACnDwU,MAAO,EACT3c,KAAK2H,aAAavE,OAASpD,KAAK2H,aAAavE,MAAMuZ,QACrD3c,KAAK2H,aAAavE,MAAMuZ,WAAQC,GAIlC6K,SAASnR,KAAK5F,MAAMwY,SAAW,UAE3BF,GAGFhpB,KAAKulB,kBAAkBne,cAE3B,CAMA+hB,mBAAmBlf,GACjBjK,KAAKumB,iBAAiBtc,EACxB,CAWAsc,iBAAiBtc,EAAe+e,GAA6B,GAE3DvB,SAASnR,KAAK5F,MAAMwY,SAAW,SAE/BlpB,KAAKqlB,gBAAgB/G,IAAI,CAACxe,EAAsBspB,KAC1CtpB,EAAMupB,eACRvpB,EAAMupB,iBAGNvpB,EAAMwpB,aAAc,EAEtBtpB,KAAK+oB,eAAa,GAGpB/oB,KAAKilB,QAAS,EAEdjlB,KAAK2H,aAAe3H,KAAK2E,OAAOsF,GAGhCjK,KAAK6O,KAAKhF,KAAK,IAAI+I,KAAgBtN,IAAOikB,KAAMtf,EAAQ,IAEpD+e,GAGFhpB,KAAKulB,kBAAkBne,cAE3B,CAMA0d,qBAAqBhlB,GACnB,MAAM+S,EAA2B/S,EAAMqG,OACnC0M,EAAW,GAAKA,GAAY7S,KAAK2E,OAAOC,SAKjC5E,KAAKue,uBAAuBve,KAAK2H,aAAaQ,IACnDwU,MAAO,EAGT3c,KAAK2H,aAAavE,OAASpD,KAAK2H,aAAavE,MAAMuZ,QACrD3c,KAAK2H,aAAavE,MAAMuZ,WAAQC,GAGlC5c,KAAK2H,aAAe3H,KAAK2E,OAAOkO,GAGhC7S,KAAK2S,kBAAkB7S,EAAM2J,OAAQoJ,GAGrC7S,KAAK6O,KAAKhF,KAAK,IAAI+I,KAAgB9S,EAAM2J,OAAQoJ,EAAW,IAC9D,CAEA2W,wBACE,QACExpB,KAAKkmB,oBACLlmB,KAAKkmB,mBAAmB9W,QACxBpP,KAAKkmB,mBAAmB9W,kBAAkBC,MAElCrP,KAAKkmB,mBAAmB9W,OAAOqa,wBAG3C,CAOAvF,eAAepkB,GACTA,GAASE,KAAK+kB,oBAChB/kB,KAAKolB,aAAa9f,IAAOC,MAE7B,CAOA0W,YAAYnc,GAKVE,KAAK2E,OAAS3E,KAAK2E,OAAOgN,IAAKxO,GACzBA,GAAOA,EAAIgF,KAAOrI,EAAMqI,GACnBtB,OAAOC,OAAO,GAAI3D,EAAK,CAAE6Y,iBAAkBlc,EAAMuc,SAEnDlZ,EAIX,CAMAwJ,WAAW1C,GACTjK,KAAK2H,aAAe3H,KAAK2E,OAAOsF,EAClC,CAMAwI,eAAe3S,GACbE,KAAK8kB,qBAAqBhlB,EAC5B,CAWAipB,gBACM/oB,KAAKub,qBAAuBvb,KAAKub,mBAAmBD,cAGxDtb,KAAK0pB,0BACP,CAMArf,cACErK,KAAKqlB,gBAAgB4D,QAErBjpB,KAAKwlB,mBAAmBrH,OAAOne,KAAKmI,IAEhCnI,KAAKwmB,oCACPxmB,KAAKwmB,mCAAmClc,cAEtCtK,KAAK2mB,iCACP3mB,KAAK2mB,gCAAgCrc,cAEnCtK,KAAK4mB,kCACP5mB,KAAK4mB,iCAAiCtc,cAEpCtK,KAAK8mB,oCACP9mB,KAAK8mB,mCAAmCxc,aAE5C,CAQQof,2BACN,MAAMC,EAAOlC,SAASmC,cAAc,KACpC,IACIzmB,EADA0mB,GAAW,EASf,GALE1mB,EADyC,iBAAhCnD,KAAK2H,aAAavE,MAAMD,IAC3BnD,KAAK2H,aAAavE,MAAMD,IAGxBnD,KAAKgF,UAAU8kB,SAASC,MAAgBC,aAAchqB,KAAK2H,aAAavE,MAAMD,KAElFA,EAAI2Z,SAAS,gBAAkB3Z,EAAI2Z,SAAS,YAAa,CAC3D,MAAMmN,EAAoB9mB,EAAI8D,QAAQ,cAAe,IAAI2a,MAAM,YAAY,GACrEsI,EAAqB/mB,EAAIye,MAAM,YAAY,GAC3CuI,EAAanqB,KAAKoqB,aAAaF,EAAY,SAAWD,GAC5DN,EAAKb,KAAOuB,IAAIC,gBAAgBH,GAChCN,GAAW,EACXF,EAAKY,aAAa,WAAYvqB,KAAKwqB,YAAYxqB,KAAK2H,aAAckiB,EAAUI,GAC9E,MACEN,EAAKb,KAAO3lB,EACZwmB,EAAKY,aAAa,WAAYvqB,KAAKwqB,YAAYxqB,KAAK2H,aAAckiB,IAEpEpC,SAASnR,KAAKmU,YAAYd,GAC1BA,EAAKe,QACLjD,SAASnR,KAAKqU,YAAYhB,EAC5B,CASQS,aAAaQ,EAAoBC,EAAsB,IAE7D,MAAMC,EAAyBC,KAAKH,GAC9BI,EAAsBF,EAAelmB,OACrCqmB,EAAsB/jB,KAAKgkB,KAAKF,EAAcG,MAC9CC,GAAgC,IAAIC,MAAMJ,GAChD,QAASK,EAAa,EAAGA,EAAaL,IAAeK,EAAY,CAC/D,MAAMC,GAA6BJ,KAAbG,EAChB5mB,GAAcwC,KAAKC,IAAIokB,GAAQJ,KAAWH,GAC1CQ,GAAuB,IAAIH,MAAM3mB,GAAM6mB,IAC7C,QAASE,GAASF,GAAOliB,GAAI,EAAGoiB,GAAS/mB,KAAO2E,KAAKoiB,GACnDD,GAAMniB,IAAKyhB,EAAeW,IAAQC,WAAW,GAE/CN,GAAWE,GAAc,IAAIK,WAAWH,GAC1C,CACA,OAAO,IAAII,KAAKR,GAAY,CAAE5e,KAAMqe,GACtC,CAQQ7D,qBAAqBlnB,GAC3B,OAAO+G,OAAOC,OAAOhH,EAAO,CAAEoS,MAAOlS,KAAK2H,cAC5C,CAQU0f,wBAAwBvnB,GAC9B,OAAO+G,OAAOC,OAAOhH,EAAO,CAAEoS,MAAOlS,KAAKue,uBAAuBve,KAAK2H,aAAaQ,KACrF,CAYMqiB,YAAYtY,EAAc2X,GAAoB,EAAOgC,EAA0B,IACrF,OAAK3Z,EAAM9O,MAAM0oB,kBAA4D,IAAxC5Z,EAAM9O,MAAM0oB,iBAAiBlnB,OAOzDsN,EAAM9O,MAAM0oB,iBANfjC,EACK,SAAS3X,EAAM/J,MAA0B,KAApB0jB,EAAyBA,EAAkB,QAE/D3Z,EAAM9O,MAAMD,IAAe8D,QAAQ,YAAa,GAK9D,CAMQmf,aAENpmB,KAAK2E,OAA6B3E,KAAKgmB,YACvChmB,KAAKylB,QAAQ5b,KAAK,IAAI+I,KAAgBtN,IAAOikB,MAAM,IACnDvpB,KAAK8lB,YAAc9lB,KAAK2E,OAAOC,OAAS,CAC1C,CAQQ+N,kBAAkBlJ,EAAgByJ,GAExC,OAAQA,GACN,KAAK,EACHlT,KAAK8O,WAAWjF,KAAK,IAAI+I,KAAgBnJ,GAAQ,IACjD,MACF,KAAKzJ,KAAK2E,OAAOC,OAAS,EACxB5E,KAAK+O,UAAUlF,KAAK,IAAI+I,KAAgBnJ,GAAQ,IAGtD,CAEA8P,eAAezZ,GACbE,KAAK6a,YAAYhR,KAAK/J,EACxB,CAEDisB,eACC/rB,KAAK8Z,iBAAmBmN,KAAWE,SACnCnnB,KAAK6kB,iBAAkB,CACxB,CACAmH,gBACIhsB,KAAK8Z,kBAAoBmN,KAAWE,WACvCnnB,KAAK6kB,iBAAkB,EACxB,CAGCtG,uBAAuBpW,GACrB,OAAOnI,KAAK2E,OAAO6Z,KAAMtU,GAAOA,EAAK/B,IAAIA,EAC3C,CACA8jB,4BAA4B9jB,GAC1B,OAAOnI,KAAKgmB,YAAYxH,KAAMtU,GAAOA,EAAK/B,IAAIA,EAChD,CAAClH,SAAAjB,KAAA,mBAAAkB,iBA38BUgkB,GAAqBrjB,MAAA6I,KAAA7I,MAAA8I,KAAA9I,MAgLtBsR,OAAWtR,mBAAAqqB,GAAArqB,MAAAsqB,MAAA,EAAAlrB,SAAAjB,KAAA,UAAAuL,EAAAnK,IAAA,MAhLV8jB,EAAqB7jB,UAAA,uBAAAyW,UAAA,SAAArW,EAAAC,MAAA,EAAAD,SA4HrB8Y,IAAqB,oGA5HrB1Y,MAAA,oBAAAS,GAAA,OAAAZ,EAAAyjB,WAAA7iB,EAAkB,KAAAT,uuDD7D/BA,MAAA,wBAIkBA,MAAA,gBAAAS,GAAA,OAAQZ,EAAAynB,mBAAA7mB,EAA0B,GAAET,QAEtDA,MAAA,qBAGAA,MAAA,EAAAuqB,EAAA,qBANkBvqB,MAHA,SAAAH,EAAAiD,OAGA9C,CAHiB,cAAAH,EAAAokB,aAAApkB,EAAA8nB,wBAGjB3nB,CAFsD,qBAAAH,EAAAwkB,mBAEtDrkB,CADyC,sBAAAH,EAAAK,qBAI5CF,QACAA,MADA,SAAAH,EAAAujB,OACApjB,CADiB,sBAAAH,EAAAK,qBAGCF,cAAA,OAAAH,EAAAujB,6ZCoDpBC,CAAqB,6GC7B3B,IAAMmH,EAAa,MAApB,MAAOA,EAYX1sB,YAAoBsL,EAA6BC,GAA7BlL,KAAAiL,WAA6BjL,KAAAkL,IACjD,CAOA7D,WACErH,KAAKmL,YACP,CAOA/C,cACEpI,KAAKmL,YACP,CAKQA,aAEDnL,KAAKssB,OAGVtsB,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,QAAStL,KAAKsD,OAC5DtD,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,YAAatL,KAAKssB,KAAO,OAAS,UAClF,CAACrrB,SAAAjB,KAAA,mBAAAkB,iBA3CUmrB,GAAaxqB,0BAAA,EAAAZ,SAAAjB,KAAA,UAAAuL,EAAAC,IAAA,MAAb6gB,EAAahrB,UAAA,mBAAAa,OAAA,CAAAoqB,KAAA,OAAAhpB,MAAA,SAAAmI,SAAA,CAAA5J,gBAAbwqB,CAAa,KCAbE,EAAkB,MAAzB,MAAOA,EAYX5sB,YAAoBsL,EAA6BC,GAA7BlL,KAAAiL,WAA6BjL,KAAAkL,IACjD,CAOA7D,WACErH,KAAKmL,YACP,CAOA/C,cACEpI,KAAKmL,YACP,CAKQA,cACDnL,KAAKH,YAAcG,KAAKwsB,UAG7BxsB,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,iBAAkBtL,KAAKH,WACrEG,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,kBAAmBtL,KAAKwsB,SACxE,CAACvrB,SAAAjB,KAAA,mBAAAkB,iBA1CUqrB,GAAkB1qB,0BAAA,EAAAZ,SAAAjB,KAAA,UAAAuL,EAAAC,IAAA,MAAlB+gB,EAAkBlrB,UAAA,wBAAAa,OAAA,CAAArC,UAAA,YAAA2sB,QAAA,WAAA/gB,SAAA,CAAA5J,gBAAlB0qB,CAAkB,gGCrBvB1qB,MAAA,WAQ+CA,MAA1C,mBAAAA,MAAAsC,GAAA,MAAAsoB,EAAA5qB,MAAA,GAAAY,UAAAkW,EAAA9W,MAAA,UAAAA,MAAS8W,EAAA+T,wBAAAD,GAA+B,EAAE5qB,CAAD,mBAAAA,MAAAsC,GAAA,MAAAsoB,EAAA5qB,MAAA,GAAAY,UAAAkW,EAAA9W,MAAA,UAAAA,MAAU8W,EAAA+T,wBAAAD,GAA+B,GARvF5qB,sDAMKA,MAAA,YAAA4qB,EAAAvpB,OAAAupB,EAAAvpB,MAAA8G,IAAAyiB,EAAAvpB,MAAA8G,IAAA2O,EAAAgU,8BAAAF,IACA5qB,MANA,YAAA4qB,EAAAvpB,OAAAupB,EAAAvpB,MAAAC,IAAAspB,EAAAvpB,MAAAC,IAAAspB,EAAArpB,MAAAD,IAAAtB,MAMAA,CAN+D,aAAAA,MAAA,EAAAwB,EAAA,MAAAsV,EAAAI,KAAA,KAAAJ,EAAAI,KAAAzV,MAAA,MAAAqV,EAAAI,KAAA,KAAAJ,EAAAI,KAAAC,QAM/DnX,CAJgE,cAAA4qB,EAAAvpB,OAAAupB,EAAAvpB,MAAA6G,MAAA0iB,EAAAvpB,MAAA6G,MAAA4O,EAAAiU,gBAAAH,GAIhE5qB,CAF4E,iGANnFA,MAAA,GACEA,MAAA,EAAAgrB,EAAA,qDAAMhrB,cAAA,aAAA4qB,GAAA,MAAAA,EAAArpB,MAAA,KAAAqpB,EAAArpB,MAAAD,8CAYNtB,MAAA,SAOiCA,MAA9B,mBAAAA,MAAAirB,GAAA,MAAAC,EAAAlrB,MAAA,GAAAoI,MAAA0O,EAAA9W,MAAA,UAAAA,MAAS8W,EAAA4N,iBAAAwG,GAAmB,EAAElrB,CAAD,mBAAAA,MAAAirB,GAAA,MAAAC,EAAAlrB,MAAA,GAAAoI,MAAA0O,EAAA9W,MAAA,UAAAA,MAAU8W,EAAA4N,iBAAAwG,GAAmB,GAAElrB,sDAL7BA,MAAA,MAAA8W,EAAAqU,mBAAAC,SAAA,KAAAtU,EAAAqU,mBAAAC,SAAAC,sBAI/BrrB,MAJc,QAAA4qB,EAId5qB,CAJ8B,aAAAA,MAAA,EAAAwB,EAAA,MAAAsV,EAAAI,KAAA,KAAAJ,EAAAI,KAAAzV,MAAA,MAAAqV,EAAAI,KAAA,KAAAJ,EAAAI,KAAAC,QAI9BnX,CAHgE,cAAA4qB,EAAAvpB,OAAAupB,EAAAvpB,MAAA6G,MAAA0iB,EAAAvpB,MAAA6G,MAAA4O,EAAAiU,gBAAAH,GAGhE5qB,CAD4E,gGAL/EA,MAAA,EAAAsrB,EAAA,2CAAItrB,MAAA,aAAA4qB,GAAA,MAAAA,EAAArpB,MAAA,KAAAqpB,EAAArpB,MAAAD,+BAfRtB,MAAA,GAcEA,MAZA,EAAAurB,EAAA,qBAYAvrB,CAZsE,EAAAwrB,EAAA,yBAAAxrB,iDAAvDA,QAA2CA,MAA3C,eAAA8W,EAAAqU,mBAAAC,UAAAtU,EAAAqU,mBAAAC,SAAAK,OAA2CzrB,CAAA,WAAA0rB,6BAH9D1rB,MAAA,GACEA,MAAA,EAAA2rB,EAAA,wDAAiC3rB,cAAA,UAAA4rB,6BARrC5rB,MAAA,WAOEA,MAAA,EAAA6rB,EAAA,sBA6BF7rB,8BA/BKA,MAHO,OAAA8W,EAAAgV,UAGP9rB,CAHyB,QAAA8W,EAAAiV,WAGzB/rB,CAH8C,YAAA8W,EAAAkV,eAG9ChsB,CAFwC,UAAA8W,EAAAmV,aAExCjsB,CAFiE,cAAA8W,EAAA5W,oBAAA,KAAA4W,EAAA5W,oBAAArE,kIAInCmE,cAAA,UAAA8W,EAAAoV,YCuC5B,IAAMC,EAAqB,MAA5B,MAAOA,EANbruB,cAiCEK,KAAA6O,KAA6B,IAAIxJ,MAWjCrF,KAAA+tB,UAAuB,GAUvB/tB,KAAA2tB,WAAY,EAKZ3tB,KAAA4tB,WAAa,GAeL5tB,KAAAiuB,YAAoB,CAAC3qB,MAAO,OAAQ0V,OAAQ,QAK5ChZ,KAAAkuB,cAA4B,IAAIC,KAAWnuB,KAAKiuB,YAAa,CAACrpB,QAAQ,EAAI0nB,MAAM,GAAQ,cAIxFtsB,KAAAouB,mBAAyC,CAC/Cnf,SAAUC,KAAqBmf,IAC/Bjf,OAAQpP,KAAKkuB,cACbjB,SAAU,CAACK,OAAO,EAAOJ,qBAAsB,kBAQjD9kB,YAAYC,GACV,MAAM0d,EAA6B1d,EAAQ1D,OACrC2pB,EAA6BjmB,EAAQ6d,mBAKzCoI,IACCA,EAAanI,cACbmI,EAAa9lB,gBAAkB8lB,EAAa5lB,eAAkB4lB,EAAa9lB,gBAAkB8lB,EAAa5lB,gBAE3G1I,KAAKgtB,mBAAqBhtB,KAAKuuB,0BAE7BxI,IAAiBA,EAAaI,aAAeJ,EAAavd,gBAAkBud,EAAard,cAC3F1I,KAAKwuB,eAET,CAQAnnB,WACErH,KAAKgtB,mBAAqBhtB,KAAKuuB,yBAC/BvuB,KAAKwuB,eACP,CAOAjI,iBAAiBtc,GACfjK,KAAK6O,KAAKhF,KAAKI,EACjB,CAOAyiB,wBAAwBvpB,GACtB,MAAM8G,EAAgBjK,KAAK2E,OAAO8pB,UAAWC,GAAeA,GAAOvrB,GAAOurB,EAAIvmB,KAAOhF,EAAIgF,IACzFnI,KAAKumB,iBAAiBtc,EACxB,CAQA0iB,8BAA8Bza,GAC5B,OAAKA,EAGEA,EAAMhP,OAASgP,EAAMhP,MAAM+I,YAAciG,EAAMhP,MAAM+I,YAAc,YAASpD,KAASqJ,EAAOlS,KAAK2E,QAAU,IAFzG,EAGX,CAOAioB,gBAAgB1a,GACd,IAAIjG,EAAc,GAEdiG,EAAMhP,OAASgP,EAAMhP,MAAM+I,YAC7BA,EAAciG,EAAMhP,MAAM+I,YACjBiG,EAAM9O,OAAS8O,EAAM9O,MAAM6I,cACpCA,EAAciG,EAAM9O,MAAM6I,aAK5B,IAAI0iB,EAA6B1iB,GAA4B,GAE7D,MAA2B,KAAvB0iB,IACFA,EAAqB,MAAQA,GAJC,aADH9lB,KAASqJ,EAAOlS,KAAK2E,QACS,GAAK,IAAM3E,KAAK2E,OAAOC,OAMzD+pB,CAC3B,CAQAlqB,UAAUwF,EAAeC,GACvB,OAAOA,EAAK/B,EACd,CAOQomB,yBACN,MAAMK,EAA6B/nB,OAAOC,OAAO,GAAI9G,KAAKouB,mBAAoBpuB,KAAKkmB,oBAEnF,GAAI0I,EAAOxf,kBAAkB+e,KAAY,CACvC,GAAIS,EAAO3f,WAAaC,KAAqBmf,KAAOO,EAAO3f,WAAaC,KAAqB2f,OAC3F,MAAM,IAAIxd,MAAM,qDAElB,IAAKud,EAAOxf,SAAWwf,EAAOxf,OAAO0f,YACnC,MAAM,IAAIzd,MAAM,4CAEpB,CAEA,GAAIud,EAAOxf,kBAAkB2f,KAAY,CACvC,GAAIH,EAAO3f,WAAaC,KAAqB8f,KAC3C,MAAM,IAAI3d,MAAM,qCAElB,IAAKud,EAAOxf,SAAWwf,EAAOxf,OAAO0f,YACnC,MAAM,IAAIzd,MAAM,6CAGlBud,EAAOxf,OAAO0f,YAAYxC,MAAO,CACnC,CAEA,GAAIsC,EAAOxf,kBAAkBC,MACvBuf,EAAO3f,WAAaC,KAAqBC,OAC3C,MAAM,IAAIkC,MAAM,2CAGpB,OAAOud,CACT,CAMQJ,gBACN,MAAMI,EAA6B5uB,KAAKgtB,mBAKxC,GAFAhtB,KAAK+tB,UAAY,GAEba,EAAOxf,kBAAkB+e,KAAY,CACvC,MAAM/e,EAAqBwf,EAAOxf,OAC5B6f,EAAejvB,KAAK2E,OAAOyE,OAAO,CAACslB,EAAYrlB,IAAcA,EAAI+F,EAAO0f,YAAYlqB,SAAwC,IAA9BwK,EAAO0f,YAAYlqB,QAKvH,OAJA5E,KAAK+tB,UAAY,CAACkB,GAElBjvB,KAAK+Y,KAAO6V,EAAOxf,OAAO2J,KAElB6V,EAAO3f,UACb,KAAKC,KAAqBmf,IACxBruB,KAAK6tB,eAAiB,MACtB,MACF,KAAK3e,KAAqB2f,OACxB7uB,KAAK6tB,eAAiB,SACtB7tB,KAAK2tB,UAAYve,EAAO0f,YAAYxC,KAGxCtsB,KAAK8tB,aAAe1e,EAAOod,OAC7B,CAEA,GAAIoC,EAAOxf,kBAAkB2f,KAAY,CACvC,MAAM3f,EAAqBwf,EAAOxf,OAC5B8f,EAAgBhoB,KAAKgkB,KAAKlrB,KAAK2E,OAAOC,OAASwK,EAAO0f,YAAYlqB,QACxE,IAAIL,EAAQ,EACRG,EAAc0K,EAAO0f,YAAYlqB,OAAS,EAE9C,QAASuqB,EAAI,EAAGA,EAAID,EAAOC,IAAK,CAC9B,MAAMF,EAAejvB,KAAK2E,OAAOyE,OAAO,CAACslB,EAAYrlB,IAAcA,GAAK9E,GAAS8E,GAAK3E,GACtF1E,KAAK+tB,UAAU1X,KAAK4Y,GACpB1qB,EAAQG,EAAM,EACdA,EAAMH,EAAQ6K,EAAO0f,YAAYlqB,OAAS,CAC5C,CAEA5E,KAAK+Y,KAAO6V,EAAOxf,OAAO2J,KAE1B,MAAMqW,GAAkBhgB,EAAO2J,KAAKzV,MAAM2D,QAAQ,KAAM,IAExDjH,KAAK4tB,WAAawB,EAAShgB,EAAO0f,YAAYlqB,OAASwqB,EAAS,EAAI,KACpEpvB,KAAK2tB,UAAYve,EAAO0f,YAAYxC,KAEpCtsB,KAAK6tB,eAAiB,KACxB,CAEIe,EAAOxf,kBAAkBC,OAC3BrP,KAAK+tB,UAAY,CAAC/tB,KAAK2E,QAE3B,CAAC1D,SAAAjB,KAAA,mBAAAkB,iBAlRU8sB,EAAqB,EAAA/sB,SAAAjB,KAAA,UAAAuL,EAAAnK,IAAA,MAArB4sB,EAAqB3sB,UAAA,uBAAAa,OAAA,CAAAyC,OAAA,SAAAmhB,YAAA,cAAAI,mBAAA,qBAAAnkB,oBAAA,uBAAA+e,QAAA,CAAAjS,KAAA,QAAApD,SAAA,CAAA5J,OAAAP,MAAA,EAAAC,KAAA,EAAAa,OAAA,gtBAAAZ,SAAA,SAAAC,EAAAC,GAAA,EAAAD,GD9ClCI,MAAA,EAAAwtB,EAAA,kBAAMxtB,MAAA,OAAAH,EAAAokB,+WC8COkI,CAAqB,qOC9B5BnsB,MAAA,WAUKA,MADA,iBAAAS,GAAAT,MAAAU,GAAA,MAAAC,EAAAX,QAAAY,UAAAC,EAAAb,MAAA,UAAAA,MAASa,EAAAC,aAAAH,EAAAF,EAAAI,EAAAE,aAA0C,EACnDf,CADoD,iBAAAS,GAAAT,MAAAU,GAAA,MAAAC,EAAAX,QAAAY,UAAAC,EAAAb,MAAA,UAAAA,MAC3Ca,EAAAC,aAAAH,EAAAF,EAAAI,EAAAG,gBAA6C,GAV3DhB,qDACKA,MAAA,wBAAAa,EAAAI,SAAAN,GAAA,eAAAE,EAAAK,cAAAC,UAAA,sBAMAnB,MAAA,MAAAW,EAAAY,MAAA4G,IAAAxH,EAAAY,MAAA4G,IAAA,IACAnI,MANA,YAAAW,EAAAU,OAAAV,EAAAU,MAAAC,IAAAX,EAAAU,MAAAC,IAAAX,EAAAY,MAAAD,IAAAtB,MAMAA,CANkE,aAAAA,MAAA,GAAAwB,EAAAX,EAAAK,cAAAgW,KAAArW,EAAAK,cAAAgW,KAAAzV,MAAAZ,EAAA4sB,mBAAAhsB,MAAAZ,EAAAK,cAAAgW,KAAArW,EAAAK,cAAAgW,KAAAC,OAAAtW,EAAA4sB,mBAAAtW,QAMlEnX,CAJ0G,QAAAW,EAAAY,MAAA2G,MAAAvH,EAAAY,MAAA2G,MAAA,GAI1GlI,CAFwD,mGAP/DA,MAAA,GACEA,MAAA,EAAA0tB,EAAA,gDAAM1tB,cAAA,aAAAW,GAAA,MAAAA,EAAAY,MAAA,KAAAZ,EAAAY,MAAAD,8CAZVtB,MAAA,GACEA,MAAA,SAG+CA,MAA5C,iBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAASa,EAAA0B,kBAAkB,OAAM9B,GAAS,EAAET,CAAD,iBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAAUa,EAAA0B,kBAAkB,OAAM9B,GAAS,GACvFT,MAAA,WAIFA,QAEAA,MAAA,EAAA2tB,EAAA,sBAeA3tB,MAAA,SAGgDA,MAA7C,iBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAASa,EAAA0B,kBAAkB,QAAO9B,GAAS,EAAET,CAAD,iBAAAS,GAAAT,MAAAsC,GAAA,MAAAzB,EAAAb,QAAA,OAAAA,MAAUa,EAAA0B,kBAAkB,QAAO9B,GAAS,GACzFT,MAAA,WAIFA,wCA/BGA,cAAA,WAAAa,EAAAK,cAAAuB,QAAA5B,EAAA6B,MAAA,8GAGC1C,cAAA,UAAAa,EAAAK,cAAAuB,QAAA5B,EAAA6B,MAAA,6DAEA1C,MAAA,cAAAa,EAAAX,oBAAA,KAAAW,EAAAX,oBAAApD,wBAG8BkD,QAAaA,MAAb,UAAAa,EAAA8B,SAAa3C,CAAA,eAAAa,EAAA+B,WAiB5C5C,cAAA,WAAAa,EAAAK,cAAAuB,QAAA5B,EAAAgC,IAAAhC,EAAAiC,OAAAC,OAAA,4GAGC/C,cAAA,UAAAa,EAAAK,cAAAuB,QAAA5B,EAAAgC,IAAAhC,EAAAiC,OAAAC,OAAA,4DAEA/C,MAAA,cAAAa,EAAAX,oBAAA,KAAAW,EAAAX,oBAAAlD,yBCWD,IAAM4wB,EAAkB,MAAzB,MAAOA,UAA0B/vB,IANvCC,kCAuCEK,KAAAoF,aAAyC,IAAIC,MAW7CrF,KAAA4C,YAAsB0C,IAAOC,MAK7BvF,KAAA6C,eAAyByC,IAAOE,SAKhCxF,KAAAwE,SAA+B,GAmB/BxE,KAAAsvB,mBAA2B,CAACtW,OAAQ,OAAQ1V,MAAO,QAK3CtD,KAAAsH,qBAAsC,CAC5CC,SAAS,EACTC,OAAQ,EACRlD,QAAQ,EACRtB,WAAW,EAEX+V,KAAM/Y,KAAKsvB,oBASbjoB,WACErH,KAAK+C,cAAgB8D,OAAOC,OAAO,GAAI9G,KAAKsH,qBAAsBtH,KAAK+G,eAGnE/G,KAAK+C,eAAiB/C,KAAK+C,cAAcyE,QAAUxH,KAAK+C,cAAcyE,QAAU,IAClFxH,KAAK+C,cAAcyE,OAASxH,KAAKsH,qBAAqBE,QAIxDxH,KAAK0H,aAAa1H,KAAK2H,aAAc3H,KAAK2E,OAC5C,CAOA7B,SAASoF,GACP,SAAKA,IAAYlI,KAAK2H,eAGfO,EAAQC,KAAOnI,KAAK2H,aAAaQ,EAC1C,CASAC,YAAYC,GACV,MAAM1D,EAAuB0D,EAAQ1D,OAC/BgD,EAA6BU,EAAQV,aAE3C,IAAIY,EACAE,EAEAd,GACFY,EAAOZ,EAAaa,cACpBC,EAAUd,EAAae,cAEvBD,EAAUzI,KAAK2H,aAGbc,GAAW9D,GAAUA,EAAO6D,eAAiB7D,EAAO+D,cAItD1I,KAAK0H,aAAae,EAAS9D,EAAO+D,cAGhCH,GAAQE,GAAWF,EAAKJ,KAAOM,EAAQN,IACzCnI,KAAK0vB,eAAennB,EAAME,EAE9B,CAQA9F,aAAauF,EAA2BpI,EAAmC2J,EAAiBnE,IAAOoE,QACjG,IAAK1J,KAAK+C,gBAAkB/C,KAAK+C,cAAcC,UAC7C,OAEF,MAAMmD,EAAiBlB,MAAM5E,iBAAiBP,IAC1CqG,IAAWvF,MAAQuF,IAAWnF,OAChChB,KAAKoF,aAAayE,KAAK,IAAI+I,KAAgBnJ,KAAQZ,KAASX,EAASlI,KAAK2E,SAE9E,CAQAP,kBAAkBvE,EAAmBC,EAAmC2J,EAAiBnE,IAAOoE,QAC9F,MAAMvD,EAAiBlB,MAAMrF,sBAAsBC,EAAWC,GAC1DqG,IAAWvF,KAEbZ,KAAKwJ,OACIrD,IAAWnF,MAEpBhB,KAAKuJ,UAET,CAQA9E,UAAUwF,EAAeC,GACvB,OAAOA,EAAK/B,EACd,CAQQT,aAAaC,EAAgChD,GACnD,IAAIsF,EACJ,IACEA,KAAQpB,KAASlB,EAAchD,EACjC,OAASmE,GACP,MAAMA,CACR,CACA,OAAQmB,GACN,KAAK,EAEHjK,KAAKmJ,8BACL,MACF,KAAKxE,EAAOC,OAAS,EAEnB5E,KAAKsJ,wBACL,MACF,QAEEtJ,KAAK2vB,qBAGT3vB,KAAKwE,SAAWG,EAAOyE,OAAO,CAACjG,EAAuBkG,IAAcA,GAAKrJ,KAAKuE,OAAS8E,EAAIrJ,KAAK0E,IAClG,CAKQyE,8BACNnJ,KAAKuE,MAAQ,EACbvE,KAAK0E,IAAMwC,KAAKC,IAAYnH,KAAK+C,cAAcyE,OAAQxH,KAAK2E,OAAOC,OACrE,CAKQ0E,wBACNtJ,KAAKuE,MAAQvE,KAAK2E,OAAOC,OAAS,GAAa5E,KAAK+C,cAAcyE,OAAS,GAC3ExH,KAAK0E,IAAM1E,KAAK2E,OAAOC,MACzB,CAKQ+qB,qBACN3vB,KAAKuE,SAAQsE,KAAS7I,KAAK2H,aAAc3H,KAAK2E,QAAUuC,KAAKgC,MAAclJ,KAAK+C,cAAcyE,OAAS,GACvGxH,KAAK0E,OAAMmE,KAAS7I,KAAK2H,aAAc3H,KAAK2E,QAAUuC,KAAKgC,MAAclJ,KAAK+C,cAAcyE,OAAS,GAAK,CAC5G,CAKQgC,OAEFxJ,KAAKuK,iBAAiBvK,KAAK2E,OAAOC,OAAS,IAI3C5E,KAAK0E,MAAQ1E,KAAK2E,OAAOC,SAI7B5E,KAAKuE,QACLvE,KAAK0E,IAAMwC,KAAKC,IAAInH,KAAK0E,IAAM,EAAG1E,KAAK2E,OAAOC,QAE9C5E,KAAKwE,SAAWxE,KAAK2E,OAAOyE,OAAO,CAACjG,EAAuBkG,IAAcA,GAAKrJ,KAAKuE,OAAS8E,EAAIrJ,KAAK0E,KACvG,CAKQ6E,WAEFvJ,KAAKuK,iBAAiB,IAIP,IAAfvK,KAAKuE,QAITvE,KAAKuE,MAAQ2C,KAAKsD,IAAIxK,KAAKuE,MAAQ,EAAG,GACtCvE,KAAK0E,IAAMwC,KAAKC,IAAInH,KAAK0E,IAAM,EAAG1E,KAAK2E,OAAOC,QAE9C5E,KAAKwE,SAAWxE,KAAK2E,OAAOyE,OAAO,CAACjG,EAAuBkG,IAAcA,GAAKrJ,KAAKuE,OAAS8E,EAAIrJ,KAAK0E,KACvG,CAOQ6F,iBAAiBE,GACvB,QAASzK,KAAKga,cAA6C,IAA9Bha,KAAKga,YAAYpO,WAAa,EAAS/C,KAAS7I,KAAK2H,aAAc3H,KAAK2E,UAAY8F,CACnH,CAKQilB,eAAennB,EAAwBE,GAI7C,IAAIE,EACAC,EACJ,IACED,KAAYE,KAASN,EAAMvI,KAAK2E,QAChCiE,KAAeC,KAASJ,EAASzI,KAAK2E,OACxC,OAASmE,GACPC,cAAQC,MAAM,6DACRF,CACR,CACA,OAAIH,IAAc3I,KAAK2E,OAAOC,OAAS,GAAsB,IAAjBgE,GAE1C5I,KAAKmJ,mCACLnJ,KAAKwE,SAAWxE,KAAK2E,OAAOyE,OAAO,CAACjG,EAAuBkG,IAAcA,GAAKrJ,KAAKuE,OAAS8E,EAAIrJ,KAAK0E,OAIrF,IAAdiE,GAAmBC,IAAiB5I,KAAK2E,OAAOC,OAAS,GAE3D5E,KAAKsJ,6BACLtJ,KAAKwE,SAAWxE,KAAK2E,OAAOyE,OAAO,CAACjG,EAAuBkG,IAAcA,GAAKrJ,KAAKuE,OAAS8E,EAAIrJ,KAAK0E,YAKnGiE,EAAYC,EACd5I,KAAKuJ,WACIZ,EAAYC,GACrB5I,KAAKwJ,OAET,CAACvI,SAAAjB,KAAA,4DA1UUyvB,KAAiBvuB,GAAjBuuB,EAAiB,GA0U3B,GA1U2BxuB,SAAAjB,KAAA,UAAA4vB,EAAAxuB,IAAA,MAAjBquB,EAAiBpuB,UAAA,kBAAAa,OAAA,CAAAyF,aAAA,eAAAhD,OAAA,SAAAqV,YAAA,cAAAjT,cAAA,gBAAAhF,oBAAA,uBAAA+e,QAAA,CAAA1b,aAAA,gBAAAqG,SAAA,CAAA5J,aAAAP,MAAA,EAAAC,KAAA,EAAAa,OAAA,kbAAAZ,SAAA,SAAAC,EAAAC,GAAA,EAAAD,IDhD9BI,MAAA,WAIEA,MAAA,EAAAguB,EAAA,uBAqCFhuB,eAvCKA,MAAA,cAAAH,EAAAK,oBAAA,KAAAL,EAAAK,oBAAAtD,8HAEYoD,cAAA,aAAAH,EAAAqB,cAAA,KAAArB,EAAAqB,cAAAwE,whJC4CJkoB,CAAkB,wGC1CxB,MAAMK,EAAwB,CAAC9W,OAAQ,OAAQ1V,MAAO,QAKhDysB,EAAqC,CAChD/L,UAAW,cACXjL,KAAM+W,EACNtjB,KAAMya,KAAW+I,MACjBjmB,MAAO,iCACP5E,UAAW,iCACXoC,SAAS,GAME0oB,EAAwC,CACnDjM,UAAW,iBACXjL,KAAM+W,EACNtjB,KAAMya,KAAWiJ,SACjBnmB,MAAO,6BACP5E,UAAW,6BACXoC,SAAS,GAME4oB,EAAsC,CACjDnM,UAAW,gBACXjL,KAAM+W,EACNtjB,KAAMya,KAAWmJ,OACjBrmB,MAAO,6BACP5E,UAAW,6BACXoC,SAAS,GAiBE8oB,EAAsC,CACjDrM,UAAW,eACXjL,KAAM+W,EACNtjB,KAAMya,KAAWqJ,OACjBvmB,MAAO,2BACP5E,UAAW,2BACXoC,SAAS,GAMEgpB,EAA2C,CACtDvM,UAAW,mBACXjL,KAAM+W,EACNtjB,KAAMya,KAAWuJ,WACjBzmB,MAAO,wBACP5E,UAAW,wBACXoC,SAAS,oQCxEL1F,MAAA,SAOGA,MADA,iBAAAS,GAAAT,MAAAsC,GAAA,MAAAssB,EAAA5uB,QAAAY,UAAAkW,EAAA9W,MAAA,UAAAA,MAAS8W,EAAA+X,QAAAD,EAAAnuB,GAAoB,EAC7BT,CAD8B,iBAAAS,GAAAT,MAAAsC,GAAA,MAAAssB,EAAA5uB,QAAAY,UAAAkW,EAAA9W,MAAA,UAAAA,MACrB8W,EAAA+X,QAAAD,EAAAnuB,GAAoB,GAE9BT,MAAA,eACFA,0CALGA,MAHO,aAAAA,MAAA,EAAAwB,EAAA,MAAAotB,EAAA1X,KAAA,KAAA0X,EAAA1X,KAAAzV,MAAA,MAAAmtB,EAAA1X,KAAA,KAAA0X,EAAA1X,KAAAC,QAGPnX,CAHwE,UAAAA,MAAA,EAAA0R,EAAAkd,EAAAE,UAGxE9uB,CAFuC,8CAMhBA,QAAkCA,MAAlC,OAAA4uB,EAAAzM,UAAApC,MAAA,KAAkC/f,CAAD,QAAA4uB,EAAA1mB,iCAV7DlI,MAAA,GACEA,MAAA,EAAA+uB,EAAA,8CAAI/uB,cAAA,OAAA4uB,EAAAlpB,mCAFR1F,MAAA,GACEA,MAAA,EAAAgvB,EAAA,oDAA8BhvB,QAAYA,MAAZ,UAAA8W,EAAAmY,QAAYjvB,CAAA,eAAA8W,EAAAlU,YC+DvC,IAAMssB,EAAsB,MAA7B,MAAOA,UAA8BrxB,IAN3CC,kCAuBEK,KAAAgxB,QAAqC,IAAI3rB,MAKzCrF,KAAAmjB,OAAoC,IAAI9d,MAKxCrF,KAAAymB,SAAsC,IAAIphB,MAK1CrF,KAAAixB,SAAsC,IAAI5rB,MAK1CrF,KAAA4a,MAAmC,IAAIvV,MAKvCrF,KAAAkxB,WAAwC,IAAI7rB,MAK5CrF,KAAAmxB,OAAoC,IAAI9rB,MAKxCrF,KAAAoxB,SAAsC,IAAI/rB,MAK1CrF,KAAAqxB,WAAwC,IAAIhsB,MAK5CrF,KAAA6lB,KAAkC,IAAIxgB,MAMpCrF,KAAAsxB,UAAuC,IAAIjsB,MAgBrCrF,KAAAuxB,sBAAwC,CAACxB,MAIzC/vB,KAAAwxB,qBAAuC,CAACvB,QAA4BjwB,KAAKuxB,uBAIzEvxB,KAAAyxB,uBAAyC,CAACtB,QAA0BnwB,KAAKwxB,sBAIzExxB,KAAA0xB,mBAAqC,CAE3CnB,KACAF,QACGrwB,KAAKyxB,wBASVpqB,WAGE,OADArH,KAAK2xB,cAAgB9qB,OAAOC,OADS,CAAES,SAAS,EAAM0H,SAAU2iB,KAAgBC,SAC9B7xB,KAAKglB,eAC/ChlB,KAAK2xB,cAAc1iB,UACzB,KAAK2iB,KAAgBE,OACnB9xB,KAAK8wB,QAAU9wB,KAAK+xB,aAAa/xB,KAAKwxB,sBACtC,MACF,KAAKI,KAAgBI,SACnBhyB,KAAK8wB,QAAU9wB,KAAK+xB,aAAa/xB,KAAKyxB,wBACtC,MACF,KAAKG,KAAgBK,KACnBjyB,KAAK8wB,QAAU9wB,KAAK+xB,aAAa/xB,KAAK0xB,oBACtC,MACF,KAAKE,KAAgBziB,OACnBnP,KAAK8wB,QAAU9wB,KAAK+xB,aAAa/xB,KAAKkyB,sBAAsBlyB,KAAK2xB,cAAcb,UAC/E,MAEF,QACE9wB,KAAK8wB,QAAU9wB,KAAK+xB,aAAa/xB,KAAKuxB,uBAG5C,CAUAb,QAAQ7vB,EAA8Bf,EAAmC2J,EAAiBnE,IAAOC,OAC/F,IAAKzF,EACH,OAEF,MAAMqyB,EAA0B,CAC9BtxB,OAAQA,EAGRqR,MAAO,KACPzI,OAAQA,GAEV,OAAQ5I,EAAO2L,MAIb,KAAKya,KAAWqJ,OACdtwB,KAAKoyB,0BAA0BpyB,KAAKmjB,OAAQrjB,EAAOqyB,GACnD,MACF,KAAKlL,KAAWmJ,OACd,IAAKpwB,KAAK2H,eAAiB3H,KAAK2H,aAAavE,QAAUpD,KAAK2H,aAAavE,MAAM4b,OAC7E,OAEFhf,KAAKoyB,0BAA0BpyB,KAAKymB,SAAU3mB,EAAOqyB,GACrD,MACF,KAAKlL,KAAWiJ,SACdlwB,KAAKoyB,0BAA0BpyB,KAAKixB,SAAUnxB,EAAOqyB,GACrD,MACF,KAAKlL,KAAW+I,MACdhwB,KAAKoyB,0BAA0BpyB,KAAK4a,MAAO9a,EAAOqyB,GAClD,MACF,KAAKlL,KAAW9X,OACdnP,KAAKoyB,0BAA0BpyB,KAAKqxB,WAAYvxB,EAAOqyB,GACvD,MACF,KAAKlL,KAAWuJ,WACdxwB,KAAKoyB,0BAA0BpyB,KAAKkxB,WAAYpxB,EAAOqyB,GACvD,MACF,KAAKlL,KAAWoL,aAGhB,KAAKpL,KAAWqL,YACdtyB,KAAKoyB,0BAA0BpyB,KAAKmxB,OAAQrxB,EAAOqyB,GACnD,MACF,KAAKlL,KAAWE,SACdnnB,KAAKoyB,0BAA0BpyB,KAAKoxB,SAAUtxB,EAAOqyB,GACrD,MACF,KAAKlL,KAAWC,KACdlnB,KAAKoyB,0BAA0BpyB,KAAK6lB,KAAM/lB,EAAOqyB,GACjD,MACF,KAAKlL,KAAWsL,iBAGhB,KAAKtL,KAAWuL,gBACdxyB,KAAKoyB,0BAA0BpyB,KAAKsxB,UAAWxxB,EAAOqyB,GACtD,MACF,QACE,MAAM,IAAI9gB,MAAM,2CAEtB,CAQA5M,UAAUwF,EAAeC,GACvB,OAAOA,EAAOA,EAAK/B,QAAKyU,CAC1B,CAQQwV,0BACNK,EACA3yB,EACAqyB,GAEA,IAAKM,EACH,MAAM,IAAIphB,MAAM,sEAGKpM,MAAM5E,iBAAiBP,KAC/Bc,MACb6xB,EAAQ5oB,KAAKsoB,EAEjB,CAUQJ,aAAajB,GACnB,OAAOA,EAAQnf,IAAI,CAAC+c,EAAmBrlB,IAAcxC,OAAOC,OAAO4nB,EAAK,CAAEvmB,GAAI2oB,EAAQlsB,OAAS,EAAIyE,IACrG,CAQQ6oB,sBAAsBpB,EAA0B,IACtDA,SAAQ4B,QAAShE,IAEf,IAA0B,IADQiE,KAAuBlE,UAAWjiB,GAAqBA,IAASkiB,EAAIliB,MAEpG,MAAM,IAAI6E,MAAM,6DAA4D,GAGzEyf,CACT,CAAC7vB,SAAAjB,KAAA,4DAhQU+wB,KAAqB7vB,GAArB6vB,EAAqB,GAgQ/B,GAhQ+B9vB,SAAAjB,KAAA,UAAA4yB,EAAAxxB,IAAA,MAArB2vB,EAAqB1vB,UAAA,uBAAAa,OAAA,CAAAyF,aAAA,eAAAqd,cAAA,iBAAAlE,QAAA,CAAAkQ,QAAA,UAAA7N,OAAA,SAAAsD,SAAA,WAAAwK,SAAA,WAAArW,MAAA,QAAAsW,WAAA,aAAAC,OAAA,SAAAC,SAAA,WAAAC,WAAA,aAAAxL,KAAA,OAAAyL,UAAA,aAAA7lB,SAAA,CAAA5J,OAAAP,MAAA,EAAAC,KAAA,EAAAa,OAAA,6TAAAZ,SAAA,SAAAC,EAAAC,GAAA,EAAAD,IDlElCI,MAAA,cAEEA,MAAA,EAAAgxB,EAAA,sBAeFhxB,eAfiBA,cAAA,QAAAH,EAAAiwB,gBAAA,MAAAjwB,EAAAiwB,cAAA,KAAAjwB,EAAAiwB,cAAApqB,8wcCgEJwpB,CAAsB,2EC/B5B,IAAM+B,EAAoB,MAA3B,MAAOA,EAaXnzB,YAAoBsL,EAA6BC,GAA7BlL,KAAAiL,WAA6BjL,KAAAkL,IACjD,CAOA7D,WACErH,KAAKmL,YACP,CAOA/C,cACEpI,KAAKmL,YACP,CAKQA,aACDnL,KAAKkS,QAAWlS,KAAKkS,MAAMhP,OAAUlD,KAAKkS,MAAM9O,QAKrDpD,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,aAAc,QADlBtL,KAAKkS,MAAMhP,OAASlD,KAAKkS,MAAMhP,MAAMC,IAAMnD,KAAKkS,MAAMhP,MAAMC,IAAMnD,KAAKkS,MAAM9O,MAAMD,SAC5CnD,KAAK0Q,QACxF,CAACzP,SAAAjB,KAAA,mBAAAkB,iBA5CU4xB,GAAoBjxB,0BAAA,EAAAZ,SAAAjB,KAAA,UAAAmB,EAAAqK,IAAA,MAApBsnB,EAAoBzxB,UAAA,0BAAAa,OAAA,CAAAgQ,MAAA,QAAAxB,MAAA,SAAAjF,SAAA,CAAA5J,gBAApBixB,CAAoB,kECF1B,IAAMC,EAAoB,MAA3B,MAAOA,EAOXpzB,YAAoBsL,EAA6BC,GAA7BlL,KAAAiL,WAA6BjL,KAAAkL,IACjD,CAOA7D,WACErH,KAAKmL,YACP,CAOA/C,cACEpI,KAAKmL,YACP,CAKQA,aACDnL,KAAKiM,aAINjM,KAAKiM,YAAYyE,QACnB1Q,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,aAActL,KAAKiM,YAAYyE,MAAMC,SACnF3Q,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,QAAStL,KAAKiM,YAAYyE,MAAME,WAE1E5Q,KAAKiM,YAAYyE,MAAMpN,OACzBtD,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,QAAStL,KAAKiM,YAAYyE,MAAMpN,OAE5EtD,KAAKiM,YAAYyE,MAAMsI,QACzBhZ,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,SAAUtL,KAAKiM,YAAYyE,MAAMsI,QAE7EhZ,KAAKiM,YAAYyE,MAAMsiB,UACzBhzB,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,WAAYtL,KAAKiM,YAAYyE,MAAMsiB,UAE/EhzB,KAAKiM,YAAYyE,MAAM0M,KACzBpd,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,MAAOtL,KAAKiM,YAAYyE,MAAM0M,KAE1Epd,KAAKiM,YAAYyE,MAAMoN,QACzB9d,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,SAAUtL,KAAKiM,YAAYyE,MAAMoN,QAE7E9d,KAAKiM,YAAYyE,MAAMoL,MACzB9b,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,OAAQtL,KAAKiM,YAAYyE,MAAMoL,MAE3E9b,KAAKiM,YAAYyE,MAAMmL,OACzB7b,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,QAAStL,KAAKiM,YAAYyE,MAAMmL,OAGhF7b,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,aAActL,KAAKiM,YAAYyE,MAAMG,UAAY7Q,KAAKiM,YAAYyE,MAAMG,UAAY,OAClI7Q,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,gBAAiBtL,KAAKiM,YAAYyE,MAAMI,aAAe9Q,KAAKiM,YAAYyE,MAAMI,aAAe,OAC3I9Q,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,cAAetL,KAAKiM,YAAYyE,MAAMK,WAAa/Q,KAAKiM,YAAYyE,MAAMK,WAAa,OACrI/Q,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,eAAgBtL,KAAKiM,YAAYyE,MAAMM,YAAchR,KAAKiM,YAAYyE,MAAMM,YAAc,OAE5I,CAAC/P,SAAAjB,KAAA,mBAAAkB,iBAnEU6xB,GAAoBlxB,0BAAA,EAAAZ,SAAAjB,KAAA,UAAAiC,EAAAuJ,IAAA,MAApBunB,EAAoB1xB,UAAA,0BAAAa,OAAA,CAAA+J,YAAA,eAAAR,SAAA,CAAA5J,gBAApBkxB,CAAoB,iECA1B,IAAME,EAAa,MAApB,MAAOA,EAOXtzB,YAAoBsL,EAA6BC,GAA7BlL,KAAAiL,WAA6BjL,KAAAkL,IACjD,CAOA7D,WACErH,KAAKmL,YACP,CAOA/C,cACEpI,KAAKmL,YACP,CAKQA,aACDnL,KAAKoL,aAIVpL,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,QAAStL,KAAKoL,WAAW9H,OACvEtD,KAAKiL,SAASI,SAASrL,KAAKkL,GAAGI,cAAe,SAAUtL,KAAKoL,WAAW4N,QAC1E,CAAC/X,SAAAjB,KAAA,mBAAAkB,iBAtCU+xB,GAAapxB,0BAAA,EAAAZ,SAAAjB,KAAA,UAAAiC,EAAAuJ,IAAA,MAAbynB,EAAa5xB,UAAA,mBAAAa,OAAA,CAAAkJ,WAAA,cAAAK,SAAA,CAAA5J,gBAAboxB,CAAa,kEC5BnB,IAAMC,EAAmB,MAA1B,MAAOA,EAeXvzB,YAAoBwzB,EACAloB,GADAjL,KAAAmzB,aACAnzB,KAAAiL,WAdZjL,KAAAozB,WAAa,EAEbpzB,KAAAqzB,SAAW,IAAIC,iBAAiB,KAEtC,IAAIC,EAAYvzB,KAAKmzB,WAAW7nB,cAAckoB,aAE1CxzB,KAAKozB,aAAeG,IACtBvzB,KAAKmzB,WAAW7nB,cAAcmoB,SAAS,CAACrW,IAAKpd,KAAKmzB,WAAW7nB,cAAckoB,aAAcE,SAAU,WAEnG1zB,KAAKozB,WAAaG,KAMpBvzB,KAAKiL,SAAS0oB,SAAS3zB,KAAKmzB,WAAW7nB,cAAe,iBACxD,CAEAjE,WACErH,KAAKqzB,SAAS1tB,QAAQ3F,KAAKmzB,WAAW7nB,cAAe,CAACsoB,YAAY,EAAMC,SAAS,GAEnF,CAAC5yB,SAAAjB,KAAA,mBAAAkB,iBAvBUgyB,GAAmBrxB,0BAAA,EAAAZ,SAAAjB,KAAA,UAAAiC,EAAAuJ,IAAA,MAAnB0nB,EAAmB7xB,UAAA,gCAAnB6xB,CAAmB,2NCkCzB,IAAMY,EAAsB,MAA7B,MAAOA,UAA8BC,KACzCC,YAAYC,GACV,OAAO,IAAIC,OAAOD,EAAS,CACzBE,YAAa,SAEjB,CAAClzB,SAAAjB,KAAA,4DALU8zB,KAAqB5yB,GAArB4yB,EAAqB,GAK/B,GAL+B7yB,SAAAjB,KAAA,WAAAo0B,EAAAhR,IAAA,OAArB0Q,EAAqBzQ,QAArByQ,EAAqBxQ,mBAArBwQ,CAAsB,KAOlC,SAASO,EAAYC,GACpB,OAAO,IAAIC,IAAgBD,EAC7B,CAsBO,IAAME,EAAa,MAApB,MAAOA,EAEX70B,YAAY80B,GACV,CAOF,cAAOC,CAAQ9F,GACb,MAAO,CACL+F,SAAUH,EACVI,UAAW,CACT,CACEC,QAASC,IACTC,SAAUnG,GAAkB,IAE9B,CACEiG,QAASN,IACTS,WAAYC,EACZC,KAAM,CAACJ,OAIf,CAAC7zB,SAAAjB,KAAA,mBAAAkB,iBAzBUszB,GAAa3yB,MAAA6I,MAAA,EAAAzJ,SAAAjB,KAAA,UAAAo0B,EAAAe,GAAA,MAAbX,IAAavzB,SAAAjB,KAAA,UAAAo0B,EAAAgB,IAAA,WAdb,CACT,CACEP,QAASQ,KACTC,SAAUxB,GACE,CACZe,QAASN,IACTS,WAAYX,EACZa,KAAM,CAACJ,MACK,CACZD,QAASC,IACTC,SAAU,KAEbQ,QAAA,CAfSC,KAAcC,KAAoBC,IAEOA,cAexClB,CAAa,KAiCpB,SAAUS,EAAqBX,GACnC,OAAO,IAAIC,IAAgBD,EAC7B,iDC9EO,IAAKhvB,EAAZ,SAAYA,GACVA,WAAAoE,OAAA,YACApE,IAAAC,MAAA,WACAD,IAAAE,SAAA,cACAF,IAAAgN,MAAA,WACAhN,IAAAikB,KAAA,UACAjkB,IAAAmW,SAAA,cANUnW,CAOZ,CAPA,CAAYA,GAAM,sECoCX,IAAKssB,EAAZ,SAAYA,GAGVA,WAAAC,QAAA,aACAD,IAAAE,OAAA,YACAF,IAAAI,SAAA,cACAJ,IAAAK,KAAA,UACAL,IAAAziB,OAAA,YAPUyiB,CAQZ,CARA,CAAYA,GAAe,IAaf3K,EAAZ,SAAYA,GAIVA,WAAAqJ,OAAA,YACArJ,IAAAmJ,OAAA,YACAnJ,IAAAiJ,SAAA,cACAjJ,IAAA+I,MAAA,WACA/I,IAAA9X,OAAA,YACA8X,IAAAuJ,WAAA,gBACAvJ,IAAAqL,YAAA,iBACArL,IAAAoL,aAAA,kBACApL,IAAAE,SAAA,cACAF,IAAAC,KAAA,WACAD,IAAAuL,gBAAA,sBACAvL,IAAAsL,iBAAA,uBAfUtL,CAgBZ,CAhBA,CAAYA,GAAU,IAqBf,MAAM0L,EAAuC,CAElD1L,EAAWuJ,WACXvJ,EAAWqJ,OACXrJ,EAAWmJ,OACXnJ,EAAWiJ,SACXjJ,EAAW+I,MACX/I,EAAW9X,OACX8X,EAAWqL,YACXrL,EAAWoL,aACXpL,EAAWE,SACXF,EAAWC,KACXD,EAAWuL,gBACXvL,EAAWsL,iECpEN,IAAKliB,EAAZ,SAAYA,GACVA,WAAAC,cAAA,mBACAD,IAAA4K,eAAA,oBACA5K,IAAA+B,cAAA,mBAHU/B,CAIZ,CAJA,CAAYA,GAAmB,oGCVzB,MAAOslB,EAMXh2B,YAAYwI,EAAY/E,EAAmBF,GACzClD,KAAKmI,GAAKA,EACVnI,KAAKoD,MAAQA,EACbpD,KAAKkD,MAAQA,EACblD,KAAK2c,MAAM,CACb,EAkCI,MAAOiZ,EAIXj2B,YAAY8J,EAAgBtD,GAC1BnG,KAAKyJ,OAASA,EACdzJ,KAAKmG,OAASA,CAChB,EAMI,MAAOyM,UAAwBgjB,EACnCj2B,YAAY8J,EAAgBtD,GAC1BlB,MAAMwE,EAAQtD,EAChB,kDC1DK,IAAKiV,EAAZ,SAAYA,GACVA,WAAAC,SAAA,cACAD,IAAAkE,SAAA,cACAlE,IAAAgE,KAAA,UACAhE,IAAAoE,KAAA,UACApE,IAAAsE,cAAA,mBACAtE,IAAAwE,QAAA,aACAxE,IAAA0E,kBAAA,uBAPU1E,CAQZ,CARA,CAAYA,GAAW,+ECWjB,MAAO+S,EAKXxuB,YAAYoZ,EAAY+V,EAA0BtC,GAChDxsB,KAAK+Y,KAAOA,EACZ/Y,KAAK8uB,YAAcA,EACnB9uB,KAAKwsB,QAAUA,CACjB,EAMI,MAAOuC,EAIXpvB,YAAYoZ,EAAY+V,GACtB9uB,KAAK+Y,KAAOA,EACZ/Y,KAAK8uB,YAAcA,CACrB,EAMI,MAAOzf,EAIX1P,YAAY2mB,EAA4BmD,GACtCzpB,KAAKsmB,mBAAqBA,EAC1BtmB,KAAKypB,wBAA0BA,CACjC,EAMK,IAAKva,EAAZ,SAAYA,GAGVA,WAAAmf,IAAA,SACAnf,IAAA2f,OAAA,YACA3f,IAAA8f,KAAA,UACA9f,IAAAC,OAAA,YANUD,CAOZ,CAPA,CAAYA,GAAoB,iECjDzB,IAAM2mB,EAAc,MAArB,MAAOA,EADbl2B,cAEEK,KAAAymB,SAAiD,IAAIphB,MACrDrF,KAAA4a,MAA8B,IAAIvV,MAClCrF,KAAA6mB,OAA+C,IAAIxhB,MACnDrF,KAAAkO,SAAiD,IAAI7I,MASrD4M,YAAY6Q,EAA+B7Y,GACzC,QAAkB2S,IAAdkG,GAA2BA,EAAY,GAAK7Y,EAAQ,EACtD,MAAM,IAAIoH,MAAM,sGAElBrR,KAAKymB,SAAS5c,KAAK,CACjBiZ,UAAWA,EACX7Y,MAAOA,GAEX,CASA6rB,gBAAgBhT,EAA+B7Y,GAC7C,QAAkB2S,IAAdkG,GAA2BA,EAAY,GAAK7Y,EAAQ,EACtD,MAAM,IAAIoH,MAAM,kGAElBrR,KAAKymB,SAAS5c,KAAK,CACjBiZ,UAAWA,EACX7Y,MAAOA,GAEX,CAOAmb,aAAatC,GACX,QAAkBlG,IAAdkG,GAA2BA,EAAY,EACzC,MAAM,IAAIzR,MAAM,qFAElBrR,KAAK4a,MAAM/Q,KAAKiZ,EAClB,CAUAiT,cAAcjT,EAA+B7Y,EAAeiI,GAC1D,QAAkB0K,IAAdkG,GAA2BA,EAAY,GAAK7Y,EAAQ,EACtD,MAAM,IAAIoH,MAAM,wGAElB,IAAKa,EACH,MAAM,IAAIb,MAAM,wEAElBrR,KAAK6mB,OAAOhd,KAAK,CACfiZ,UAAWA,EACX7Y,MAAOA,EACPiI,MAAOA,GAEX,CASA8jB,KAAKlT,GACH,QAAkBlG,IAAdkG,GAA2BA,EAAY,EACzC,MAAM,IAAIzR,MAAM,oFAElBrR,KAAKkO,SAASrE,KAAK,CACjBiZ,UAAWA,EACX3c,QAAQ,GAEZ,CASA8vB,KAAKnT,GACH,QAAkBlG,IAAdkG,GAA2BA,EAAY,EACzC,MAAM,IAAIzR,MAAM,oFAElBrR,KAAKkO,SAASrE,KAAK,CACjBiZ,UAAWA,EACX3c,QAAQ,GAEZ,CAAClF,SAAAjB,KAAA,mBAAAkB,iBA1GU20B,EAAc,EAAA50B,SAAAjB,KAAA,WAAAiC,EAAAmhB,IAAA,OAAdyS,EAAcxS,QAAdwS,EAAcvS,UAAAC,WADF,gBACZsS,CAAc,qFCPpB,MAAMf,EAAyB,IAAIoB,MAAsC,0BAMzE,IAAM3B,EAAe,MAAtB,MAAOA,EAcX50B,YAAoDivB,GAAA5uB,KAAA4uB,SAIlD5uB,KAAKm2B,UAAYn2B,KAAK4uB,QAAU5uB,KAAK4uB,OAAOuH,UAAYn2B,KAAK4uB,OAAOuH,UAAY,CAAC,SAAU,UAGvFn2B,KAAK4uB,SAAW5uB,KAAK4uB,OAAOwH,6BAEnB1N,OAAW,MACpB2N,EAAQ,OACRr2B,KAAKs2B,UAAY,IAAUC,EAGjC,CAMAjY,IAAIkY,GAEEx2B,KAAK4uB,SAAW5uB,KAAK4uB,OAAOwH,6BAEnB1N,OAAW,KACpB1oB,KAAKs2B,UAAUG,KAAKz2B,KAAKm2B,UAAW,CAACr2B,EAAsBspB,KACrDtpB,EAAMupB,eACRvpB,EAAMupB,iBAGNvpB,EAAMwpB,aAAc,EAEtBkN,EAAO12B,EAAOspB,EAAK,EAI3B,CAMAH,QAEMjpB,KAAK4uB,SAAW5uB,KAAK4uB,OAAOwH,6BAEnB1N,OAAW,KACpB1oB,KAAKs2B,UAAUrN,OAGrB,CAAChoB,SAAAjB,KAAA,mBAAAkB,iBAhEUqzB,GAAe1yB,MAcNizB,GAAsB,EAAA7zB,SAAAjB,KAAA,WAAAmB,EAAAiiB,IAAA,OAd/BmR,EAAelR,QAAfkR,EAAejR,mBAAfiR,CAAe,mCCHtB,SAAU1rB,EAASqJ,EAAcwkB,GACrC,IAAKxkB,EACH,MAAM,IAAIb,MAAM,sCAGlB,IAAKqlB,EACH,MAAM,IAAIrlB,MAAM,yCAGlB,IAAKa,EAAM/J,IAAmB,IAAb+J,EAAM/J,GAErB,MAAM,IAAIkJ,MAAM,qCAGlB,GAAIa,EAAM/J,GAAK,EACb,MAAM,IAAIkJ,MAAM,2BAGlB,OAAOqlB,EAAcjI,UAAWC,GAAeA,EAAIvmB,KAAO+J,EAAM/J,GAClE,wHC1BO,MAIMxH,EAAa,QAqCbD,EAAa,QAUbI,EAA0B,EAK1BF,EAAO,EAIPI,GAAO,EAIPZ,EAAU,EAKVW,EAAkB,2XCrExB,IAAM41B,EAAY,MAAnB,MAAOA,EAIJ,cAAOjC,CAAQkC,GACpB,MAAO,CACLjC,SAAUgC,EACV/B,UAAW,IACNiC,KACH,CAAChC,QAASiC,IAAiBxB,SAAUwB,KACrC,CAACjC,QAASkC,IAAsBhC,SAAU6B,IAGhD,CAAC31B,SAAAjB,KAAA,mBAAAkB,iBAbUy1B,EAAY,EAAA11B,SAAAjB,KAAA,UAAAuL,EAAA4pB,GAAA,MAAZwB,IAAY11B,SAAAjB,KAAA,UAAAuL,EAAA6pB,IAAA,WAAZuB,CAAY,wFCnBzB,IAAIK,EAAW,EAWFC,EAAQ,MAAf,MAAOA,EA2BXt3B,YAAoBu3B,GAAAl3B,KAAAk3B,iBApBJl3B,KAAAm3B,WAAY,EACZn3B,KAAAo3B,OAAS,mBAWRp3B,KAAAq3B,YAAkC,IAAIhyB,MAEtCrF,KAAAs3B,QAAgD,IAAIjyB,MAE7DrF,KAAAu3B,sBAAuB,EAEvBv3B,KAAAw3B,yBAA2C,GAGjDx3B,KAAKqV,KAAO2hB,KAAY1W,UAC1B,CAEOlY,YAAYC,GACjB,IAAKrI,KAAKu3B,qBAKR,OAHAv3B,KAAKk3B,eAAeO,UAAUz3B,MAC9BA,KAAKu3B,sBAAuB,OAC5Bv3B,KAAK03B,qBAGHrvB,EAAQsvB,UACV33B,KAAKk3B,eAAeU,YAAY53B,OAG9BqI,EAAQwvB,UAAexvB,EAAQyvB,aACjC/uB,QAAQwT,IAAI,gBAAiB,CAACwb,OAAQ,CAAC/3B,KAAK63B,SAAU73B,KAAK83B,aAC3D93B,KAAKk3B,eAAec,aAAah4B,KAAM,CAAC+3B,OAAQ,CAAC/3B,KAAK63B,SAAU73B,KAAK83B,cAGnEzvB,EAAQ8uB,WACVn3B,KAAKk3B,eAAec,aAAah4B,KAAM,CAACm3B,UAAWn3B,KAAKm3B,WAE5D,CAEO9sB,cACLrK,KAAKk3B,eAAee,aAAaj4B,MACjCA,KAAKw3B,yBAAyB9E,QAASwF,GAAMA,EAAE5tB,cACjD,CAEQotB,qBAEN,MAAMS,EAAKn4B,KAAKk3B,eAAekB,sBAAsB,QAASp4B,MAAMkG,UAAU,KAG5ElG,KAAKq3B,YAAYxtB,KAAK,KAAI,GAE5B7J,KAAKw3B,yBAAyBnhB,KAAK8hB,GAGnC,MAAME,EAAKr4B,KAAKk3B,eAAekB,sBAA2C,UAAWp4B,MAAMkG,UAAWuS,IAGpG,MAAMsf,EADgBtf,EAAEwK,IAAI,UACCqV,SAASC,iBACtCv4B,KAAKk3B,eAAesB,gBAAgBx4B,MAAMy4B,KAAMC,IAE9C14B,KAAKs3B,QAAQztB,KAAK,CAAC8uB,IAAKZ,EAAO,GAAIa,IAAKb,EAAO,GAAIc,aAAcH,GAA4B,EAC9F,GAEH14B,KAAKw3B,yBAAyBnhB,KAAKgiB,EACrC,CAACp3B,SAAAjB,KAAA,mBAAAkB,iBA9EU+1B,GAAQp1B,MAAA6I,KAAA,EAAAzJ,SAAAjB,KAAA,UAAA4K,EAAAY,IAAA,MAARyrB,EAAQ51B,UAAA,gBAAAa,OAAA,CAAA21B,SAAA,WAAAC,UAAA,YAAAgB,cAAA,gBAAAC,qBAAA,uBAAAC,mBAAA,qBAAAC,qBAAA,uBAAA9B,UAAA,YAAAC,OAAA,SAAA8B,YAAA,cAAAvB,SAAA,WAAAwB,WAAA,aAAAC,cAAA,gBAAAC,cAAA,gBAAAC,gBAAA,mBAAAxY,QAAA,CAAAuW,YAAA,cAAAC,QAAA,WAAA7rB,SAAA,CAAA5J,MANR,CACT03B,MACD13B,gBAIUo1B,CAAQ,4HCMd,IAAMuC,EAAK,MAAZ,MAAOA,EAkBX75B,YAAoB85B,EAA2BC,GAA3B15B,KAAAy5B,QAA2Bz5B,KAAA05B,eAhB/B15B,KAAA83B,UAAY,EACZ93B,KAAA63B,SAAW,EACX73B,KAAA25B,KAAO,EAGP35B,KAAA45B,QAAe,aACf55B,KAAA65B,SAAkB,KAGjB75B,KAAA85B,SAAsD,IAAIz0B,MAC1DrF,KAAA+5B,WAAwD,IAAI10B,MAEtErF,KAAAg6B,SAAU,EAETh6B,KAAAw3B,yBAA2C,EAGnD,CAEOnwB,WACL,MAAM4yB,EAAYj6B,KAAKy5B,MAAMnuB,cAAc4uB,cAAc,wBACzDl6B,KAAKm6B,iBAAiBF,GACtBj6B,KAAKg6B,SAAU,CACjB,CAEO5xB,YAAYC,GACbrI,KAAKg6B,UACPh6B,KAAKo6B,eAAe/xB,GACpBrI,KAAKq6B,MAAMhyB,GAEf,CAEQ8xB,iBAAiBjvB,GAErBlL,KAAK05B,aAAaY,UAAUpvB,EADT,MAAjBlL,KAAK65B,SACyB,CAC9BU,OAAQ,CAACv6B,KAAK63B,SAAU73B,KAAK83B,WAAY6B,KAAM35B,KAAK25B,KAAMntB,KAAMxM,KAAK45B,QACrEC,SAAU75B,KAAK65B,UAIe,CAC9BU,OAAQ,CAACv6B,KAAK63B,SAAU73B,KAAK83B,WAAY6B,KAAM35B,KAAK25B,KAAMntB,KAAMxM,KAAK45B,UAKzE55B,KAAKw6B,uBACP,CAEQJ,eAAe/xB,GACM,MAAvBA,EAAQwvB,UAA+C,MAAxBxvB,EAAQyvB,WAG3C93B,KAAK05B,aAAae,UAAUz6B,KAAK63B,SAAU73B,KAAK83B,UAClD,CAEQuC,MAAMhyB,GACmB,MAA3BA,EAAQqyB,cAGZ16B,KAAK05B,aAAaW,MAAMr6B,KAAK06B,aAAaC,OAAQ36B,KAAK06B,aAAaE,OACtE,CAEQJ,wBAUN,MAGMK,EAAkB,CACtB,CAACC,KAAM,aAAcrI,QAASzyB,KAAK+5B,aAJR,CAC3B,CAACe,KAAM,QAASrI,QAASzyB,KAAK85B,WAMpBpH,QAASja,IACnB,MAAMyf,EAAIl4B,KAAK05B,aAAaqB,oBAAqCtiB,EAAEqiB,MAAM50B,UACtEpG,IACC,MAAMi4B,EAASj4B,EAAMmjB,IAAI,UAEzBxK,EAAEga,QAAQ5oB,KADI,CAAC8uB,IAAKZ,EAAO,GAAIa,IAAKb,EAAO,IACvB,GAExB/3B,KAAKw3B,yBAAyBnhB,KAAK6hB,EAAC,GAGtC2C,EAAOnI,QAASja,IACd,MAAMyf,EAAIl4B,KAAK05B,aAAaqB,oBAAqCtiB,EAAEqiB,MAAM50B,UACtEpG,IAECE,KAAK05B,aAAasB,YAAYvC,KAAMV,IAClC/3B,KAAK63B,SAAWE,EAAO,GACvB/3B,KAAK83B,UAAYC,EAAO,GAExBtf,EAAEga,QAAQ5oB,KADI,CAAC8uB,IAAKZ,EAAO,GAAIa,IAAKb,EAAO,IACvB,EACrB,GAGL/3B,KAAKw3B,yBAAyBnhB,KAAK6hB,EAAC,EAGxC,CAACj3B,SAAAjB,KAAA,mBAAAkB,iBA3GUs4B,GAAK33B,mBAAA6I,KAAA,EAAAzJ,SAAAjB,KAAA,UAAA4yB,EAAAxxB,IAAA,MAALo4B,EAAKn4B,UAAA,aAAAa,OAAA,CAAA41B,UAAA,YAAAD,SAAA,WAAA8B,KAAA,OAAAsB,QAAA,UAAAC,QAAA,UAAAtB,QAAA,UAAAC,SAAA,WAAAa,aAAA,gBAAA5Z,QAAA,CAAAgZ,SAAA,WAAAC,WAAA,cAAAtuB,SAAA,CAAA5J,MAbL,CACT03B,IACA4B,IACAC,IACAC,MACDx5B,OAAAy5B,mBAAAj4B,EAAA/B,MAAA,EAAAC,KAAA,EAAAa,OAAA,uCAAAZ,SAAA,SAAAC,EAAAC,GAAA,EAAAD,YAECI,MAAA,WACEA,MAAA,GACFA,mCAIS23B,CAAK,6EClBX,IAAM4B,EAAc,MAArB,MAAOA,EAIXz7B,YAAoB+5B,EAAwC6B,GAAxCv7B,KAAA05B,eAAwC15B,KAAAu7B,QAHpDv7B,KAAAw7B,UACN,IAAI5Y,GAGN,CAEO6Y,WAAWC,GAChB,MAAMC,EAAiB37B,KAAK05B,aAAakC,cAAcF,GACvD17B,KAAKw7B,UAAUtY,IAAIwY,EAASC,EAC9B,CAAC16B,SAAAjB,KAAA,mBAAAkB,iBAVUk6B,GAAcv5B,MAAA6I,KAAA7I,aAAA,EAAAZ,SAAAjB,KAAA,WAAAmB,EAAAiiB,IAAA,OAAdgY,EAAc/X,QAAd+X,EAAc9X,mBAAd8X,CAAc,sFCEpB,IAAMD,EAAa,MAApB,MAAOA,EAIXx7B,YAAoB+5B,EAAwC6B,GAAxCv7B,KAAA05B,eAAwC15B,KAAAu7B,QAHpDv7B,KAAA67B,SACN,IAAIjZ,GAGN,CAEOqV,aAAa6D,GAClB,MAAMpD,EAAI14B,KAAK67B,SAAS5Y,IAAI6Y,GAC5B,OAAS,MAALpD,EACKqD,QAAQC,UAGVtD,EAAED,KAAMC,GACN14B,KAAKu7B,MAAMxpB,IAAI,KAEpB/R,KAAKw4B,gBAAgBsD,GAAQrD,KAAMC,IACjC14B,KAAK05B,aAAauC,UAAUvD,GAC5B14B,KAAK67B,SAAS1Y,OAAO2Y,EAAM,EAC5B,GAGP,CAEOrE,UAAUqE,GACf,MAAMI,EAAgBl8B,KAAK05B,aAAayC,aAAaL,GACrD97B,KAAK67B,SAAS3Y,IAAI4Y,EAAQI,EAC5B,CAEOlE,aAAa8D,EAAkBM,GACpC,MAAM1D,EAAI14B,KAAK67B,SAAS5Y,IAAI6Y,GAC5B,OAAS,MAALpD,EACKqD,QAAQC,UAGVtD,EAAED,KAAMC,GACN14B,KAAKu7B,MAAMxpB,IAAI,KAEpB/R,KAAKw4B,gBAAgBsD,GAAQrD,KAAMC,IACjC14B,KAAK05B,aAAa1B,aAAaU,EAAG0D,EAAM,EAEzC,GAGP,CAEOxE,YAAYkE,GACjB97B,KAAKw4B,gBAAgBsD,GAAQrD,KAAMC,IACjCA,EAAE2D,QAAQ1T,MAAI,EAGlB,CAEO6P,gBAAgBsD,GACrB,OAAO97B,KAAK67B,SAAS5Y,IAAI6Y,EAC3B,CAEO1D,sBAAyBkE,EAAmBR,GACjD,OAAOS,IAAWC,OAAQnJ,IACxBrzB,KAAK67B,SAAS5Y,IAAI6Y,GAAQrD,KAAMC,IAC9BA,EAAEmC,OAAOvc,IAAIge,EAAY7jB,GAASzY,KAAKu7B,MAAMxpB,IAAI,IAAMshB,EAAS7pB,KAAKiP,IAAG,EACzE,EAEL,CAACxX,SAAAjB,KAAA,mBAAAkB,iBA/DUi6B,GAAat5B,MAAA6I,KAAA7I,aAAA,EAAAZ,SAAAjB,KAAA,WAAA4K,EAAAwY,IAAA,OAAb+X,EAAa9X,QAAb8X,EAAa7X,mBAAb6X,CAAa,6ECFnB,IAAME,EAAoB,MAA3B,MAAOA,EAIX17B,YAAoB+5B,EAAwC6B,GAAxCv7B,KAAA05B,eAAwC15B,KAAAu7B,QAHpDv7B,KAAAy8B,UACN,IAAI7Z,GAGN,CAEOtE,IAAIoe,GACT,MAAMC,EAAiB38B,KAAK05B,aAAakD,oBAAoBF,GAC7D18B,KAAKy8B,UAAUvZ,IAAIwZ,EAASC,EAC9B,CAEOE,oBAAoBH,EAA0Bv0B,GACnDnI,KAAK88B,iBAAiBJ,GAASjE,KAAMsE,IACnC/8B,KAAK05B,aAAamD,oBAAoBE,EAAG50B,EAAE,EAG/C,CAEO20B,iBAAiBJ,GACtB,OAAO18B,KAAKy8B,UAAUxZ,IAAIyZ,EAC5B,CAEOM,UAAUN,EAA0BtzB,GACzCpJ,KAAK88B,iBAAiBJ,GAASjE,KAAMsE,IACnC/8B,KAAK05B,aAAauD,uBAAuBF,EAAG3zB,EAAM,EAEtD,CAACnI,SAAAjB,KAAA,mBAAAkB,iBA3BUm6B,GAAoBx5B,MAAA6I,KAAA7I,aAAA,EAAAZ,SAAAjB,KAAA,WAAAmB,EAAAiiB,IAAA,OAApBiY,EAAoBhY,QAApBgY,EAAoB/X,mBAApB+X,CAAoB,oFCA1B,MAAMtE,EAAuB,IAAIb,MAA6C,mCAa9E,IAAMY,EAAe,MAAtB,MAAOA,EAMXn3B,YAAsDivB,EAAc,KAAMsO,EAAcC,GACtFn9B,KAAK4uB,OAASA,EACd5uB,KAAKo9B,WAAaF,EAClBl9B,KAAKq9B,aAAeF,CACtB,CAEO1nB,OACL,MAAM6nB,EAASt9B,KAAKq9B,aAAaE,oBAAoB3T,cAAc,UAMnE0T,OALAA,EAAO9wB,KAAO,kBACd8wB,EAAOE,OAAQ,EACfF,EAAOG,OAAQ,EACfH,EAAOn1B,GAAK,WAEZm1B,EAAOI,IAAM,0CAA0C19B,KAAK4uB,OAAO+O,oBAEnE39B,KAAK49B,sBAAwB,IAAI7B,QAAc,CAACC,EAAmB6B,KACjEP,EAAOQ,OAAS,KACd9B,GAAO,EAETsB,EAAOS,QAAW/0B,IAChB60B,GAAM,CACR,GAEF79B,KAAKq9B,aAAaE,oBAAoBjnB,KAAKmU,YAAY6S,GAChDt9B,KAAK49B,qBACd,CAAC38B,SAAAjB,KAAA,mBAAAkB,iBA/BU41B,GAAej1B,MAMMk1B,EAAoB,GAAAl1B,MAAA6I,MAAA7I,MAAA6I,MAAA,EAAAzJ,SAAAjB,KAAA,WAAAmB,EAAAiiB,IAAA,OANzC0T,EAAezT,QAAfyT,EAAexT,mBAAfwT,CAAe,sEClBtB,MAAOkH,EACJC,kBACL,OAAOvV,MACT,EAII,MAAOwV,EAEJX,oBACL,OAAO9V,QACT,EAIK,MAAMoP,EAAwC,CAACmH,EAAWE,8FCH1D,IAAM3E,EAAgB,MAAvB,MAAOA,EAKX55B,YAAoBw+B,EAAkC5C,EAAe4B,GAAjDn9B,KAAAm+B,UAAkCn+B,KAAAu7B,QACpDv7B,KAAKq9B,aAAeF,EACpBn9B,KAAKo+B,KAAO,IAAIrC,QAAa,CAACC,EAAc6B,KAC1C79B,KAAKq+B,aAAerC,GAExB,CAEO1B,UAAUpvB,EAAiBozB,GAYhC,OAXYt+B,KAAKm+B,QAAQ1oB,OAAOgjB,KAAK,KACnC,MAAM+D,EAASA,IAAM+B,WAAW,KAC9B,GAAIC,MAAM5b,IAAK,CACb,MAAMjR,EAAM,IAAI6sB,MAAM5b,IAAI1X,EAAIozB,GAC9Bt+B,KAAKq+B,aAAa1sB,EACpB,MACE6qB,GAAM,EAEP,KACHA,GAAM,GACLiC,MAAOhmB,GAAM1P,QAAQwT,IAAI9D,GAE9B,CAEOgiB,UAAU5C,EAAkBC,GACjC93B,KAAKo+B,KAAK3F,KAAM9mB,IACdA,EAAI8oB,UAAU,CAAC5C,EAAUC,GAAU,EAEvC,CAEOkD,YACL,OAAOh7B,KAAKo+B,KAAK3F,KAAM9mB,GACdA,EAAIqpB,YAEf,CAEOX,MAAMM,EAAe+D,GAC1B1+B,KAAKo+B,KAAK3F,KAAM9mB,IACdA,EAAI0oB,MAAMM,EAAQ+D,EAAO,EAE7B,CAEO3D,oBAAuBuB,GAC5B,OAAOC,IAAWC,OAAQnJ,IACxBrzB,KAAKo+B,KAAK3F,KAAMC,IACdA,EAAEmC,OAAOvc,IAAIge,EAAYqC,IACvB3+B,KAAKu7B,MAAMxpB,IAAI,IAAMshB,EAAS7pB,KAAKm1B,GAAI,EACxC,EACF,EAEL,CAEOxC,aAAaL,GAClB,OAAO97B,KAAKo+B,KAAK3F,KAAM9mB,IACrB,MAAM+mB,EAAI,IAAI8F,MAAMI,UAAU,CAAC9C,EAAOjE,SAAUiE,EAAOhE,WAAY,CAC/DiB,qBAAsB+C,EAAO/C,qBAC7BC,mBAAoB8C,EAAO9C,mBAC3BC,qBAAsB6C,EAAO7C,qBAC7BC,YAAa4C,EAAO5C,aAEtB,CACE/B,UAAW2E,EAAO3E,UAClBC,OAAQ0E,EAAO1E,OACf+B,WAAY2C,EAAO3C,WACnBC,cAAe0C,EAAO1C,cACtBC,cAAeyC,EAAOzC,cACtBC,gBAAiBwC,EAAOxC,kBAE5B3nB,SAAIktB,WAAWvgB,IAAIoa,GACZA,GAEX,CAEOuD,UAAU6C,GACf9+B,KAAKo+B,KAAK3F,KAAM9mB,IACdA,EAAIktB,WAAW1gB,OAAO2gB,EAAO,EAEjC,CAEO9G,aAAa8D,EAAaM,GAC/Bp8B,KAAKo+B,KAAK3F,KAAM9mB,IACVyqB,EAAO2C,eAAe,WACxBjD,EAAOxD,SAAS0G,eAAe5C,EAAOrE,QAGpCqE,EAAO2C,eAAe,cACxBjD,EAAO4C,QAAQxb,IAAI,CAACiU,UAAWiF,EAAOjF,WAAU,EAGtD,CAEOyE,cAAcF,GACnB,OAAO17B,KAAKo+B,KAAK3F,KAAM9mB,IACrB,GAA+B,IAA3B+pB,EAAQuD,QAAQr6B,OAClB,OAGF,IAAIs6B,EACJA,EAAe,IAAI7T,MACnBqQ,EAAQuD,QAAQvM,QAASvV,IACvB,MAAMgiB,EAAQ,IAAIX,MAAMY,UAAU,CAChC9G,SAAU,CAAC9rB,KAAM2Q,EAAE3Q,KAAM6yB,YAAa,CAACliB,EAAEwb,IAAKxb,EAAEyb,QAElDsG,EAAa7oB,KAAK8oB,EAAK,GAGzB,MAAMG,EAAY,IAAId,MAAMe,UAAU,IACtCD,SAAUhhB,IAAI4gB,GACdvtB,EAAIktB,WAAWvgB,IAAIghB,GAEZA,GAGX,CAEO1C,oBAAoB4C,GACzB,OAAOx/B,KAAKo+B,KAAK3F,KAAM9mB,IAErB,GAAwC,IAApC6tB,EAAcC,WAAW76B,OAC3B,OAGF,MAAM86B,EAAsB,IAAIlB,MAAMmB,cAAc,CAClDC,WAAYJ,EAAcI,WAC1BC,SAAUL,EAAcK,WAG1BH,SAAoBphB,IAAIkhB,EAAcC,YAEtCC,EAAoBI,QAAQpB,QAAQxb,IAAI,SAAUsc,EAAcO,cAChEL,EAAoBM,SAAStB,QAAQxb,IAAI,SAAUsc,EAAcS,eACjEtuB,EAAIktB,WAAWvgB,IAAIohB,GACZA,GAEX,CAEO7C,oBAAoB2C,EAAoBr3B,GAC7C,MAAM+3B,EAAMV,EAAcM,QAAQK,QAAQh4B,GACtC+3B,IACFlgC,KAAKy6B,UAAUyF,EAAI5H,SAAS+G,YAAY,GAAIa,EAAI5H,SAAS+G,YAAY,IACrEG,EAAcM,QAAQzD,QAAQ1T,KAAKxgB,GAEvC,CAEOi4B,qBACL,OAAOpgC,KAAKq9B,aAAaE,oBAAoB8C,eAAe,WAC9D,CAEOpD,uBAAuBuC,EAAoBp2B,GAChDo2B,EAAcxC,UAAU5zB,EAC1B,CAACnI,SAAAjB,KAAA,mBAAAkB,iBAzJUq4B,GAAgB13B,MAAA6I,KAAA7I,mBAAA8I,MAAA,EAAA1J,SAAAjB,KAAA,WAAA4vB,EAAAxM,IAAA,OAAhBmW,EAAgBlW,QAAhBkW,EAAgBjW,mBAAhBiW,CAAgB,8GCPtB,IAAM+G,EAAS,MAAhB,MAAOA,EACX3gC,YACU4gC,EACAC,EACAC,EACAC,GAHA1gC,KAAAugC,MACAvgC,KAAAwgC,cACAxgC,KAAAygC,SACAzgC,KAAA0gC,SAA8B,CAExCC,cACE53B,QAAQwT,IAAI,iFAIZ,IAAIqkB,EAAQ5gC,KAAK0gC,QAAQG,SAAS,gBAClC,QAAID,IAAU5gC,KAAKugC,IAAIO,eAAeF,MAEpC5gC,KAAKygC,OAAOha,SAAS,CAAC,WAGf,EAIX,CAACxlB,SAAAjB,KAAA,mBAAAkB,iBAtBUo/B,GAASz+B,MAAA6I,MAAA7I,MAAA8I,MAAA9I,MAAAqqB,MAAArqB,MAAAsqB,MAAA,EAAAlrB,SAAAjB,KAAA,WAAAmB,EAAAiiB,IAAA,OAATkd,EAASjd,QAATid,EAAShd,mBAATgd,CAAS,qJCDf,IAAMS,EAAe,MAAtB,MAAOA,EACXphC,YAAoBqhC,EAAgCP,GAAhCzgC,KAAAghC,KAAgChhC,KAAAygC,QAAiB,CAErEzE,QAAQiF,EAA+BC,GAErC,IAAKD,EAAMprB,KAAKsrB,WACd,SAAOvrB,OAAG,GAGZ,MAAMwrB,EAAWphC,KAAKghC,GAAGK,IAAIJ,EAAMprB,KAAKsrB,YAExC,OAAKC,GACHphC,KAAKygC,OAAOha,SAAS,CAAC,IAAK,UAAO,EAG7B7Q,MAAGwrB,EACZ,CAACngC,SAAAjB,KAAA,mBAAAkB,iBAhBU6/B,GAAel/B,MAAA6I,MAAA7I,MAAA8I,MAAA,EAAA1J,SAAAjB,KAAA,WAAAuL,EAAA6X,IAAA,OAAf2d,EAAe1d,QAAf0d,EAAezd,mBAAfyd,CAAe,8BCCrB,IAAMO,EAAmB,MAA1B,MAAOA,EACX3hC,YAAoB4hC,EAAkCC,EAA+CC,GAAjFzhC,KAAAuhC,cAAkCvhC,KAAAwhC,qBAA+CxhC,KAAAyhC,aAA2B,CAEhIzF,QAAQiF,EAA+BC,GAErC,OAAOlhC,KAAKuhC,YAAYte,IAAI,gCAAgCvR,QAE1DgwB,KAAIC,IACF3hC,KAAKwhC,mBAAmBI,eAAeD,EAAW,IAEnD,EACDhsB,KAAW3M,IACTD,QAAQC,MAAM,wBACdD,QAAQC,MAAMA,GAEdhJ,KAAKwhC,mBAAmBI,eAAe,KAAE,EAElChsB,MAAG,MAGhB,CAAC3U,SAAAjB,KAAA,mBAAAkB,iBApBUogC,GAAmBz/B,MAAA6I,MAAA7I,MAAA6I,MAAA7I,MAAA6I,MAAA,EAAAzJ,SAAAjB,KAAA,WAAAuL,EAAA6X,IAAA,OAAnBke,EAAmBje,QAAnBie,EAAmBhe,mBAAnBge,CAAmB,6GCAzB,IAAMO,EAAW,MAAlB,MAAOA,EACXliC,YACU4gC,EACAE,EACAC,EACAF,GAHAxgC,KAAAugC,MACAvgC,KAAAygC,SACAzgC,KAAA0gC,UACA1gC,KAAAwgC,aAA4B,CAEtCG,cAEE,IAAIC,EAAQ5gC,KAAK0gC,QAAQG,SAAS,gBAElC,OAAKD,IAOD5gC,KAAKugC,IAAIO,eAAeF,KAL1B5gC,KAAKwgC,YAAYsB,UACV,EAWX,CAAC7gC,SAAAjB,KAAA,mBAAAkB,iBAzBU2gC,GAAWhgC,MAAA6I,MAAA7I,MAAA8I,MAAA9I,MAAAqqB,MAAArqB,MAAAsqB,MAAA,EAAAlrB,SAAAjB,KAAA,WAAAmB,EAAAiiB,IAAA,OAAXye,EAAWxe,QAAXwe,EAAWve,mBAAXue,CAAW,sICHlB,MAAOE,EAyCXpiC,YAAYkW,EAAO,IAvCnB7V,KAAAmI,GAAK,KACLnI,KAAAgiC,QAAS,EACThiC,KAAAiU,MAAgB,GAChBjU,KAAA86B,KAAe,GACf96B,KAAAgU,SAAmB,GACnBhU,KAAAiiC,UAAoB,GACpBjiC,KAAAkiC,SAAmB,GACnBliC,KAAAmiC,WAAqB,GACrBniC,KAAAoiC,SAAmB,GACnBpiC,KAAAqiC,gBAA2B,GAE3BriC,KAAAsiC,YAAsB,GACtBtiC,KAAAgzB,SAA0B,KAC1BhzB,KAAAuiC,MAAgB,GAChBviC,KAAAwiC,YAAsB,KAGtBxiC,KAAAyiC,WAA2C,CAAEt6B,GAAI,KAAMqE,KAAM,IAC7DxM,KAAA0iC,aAAuB,KAGvB1iC,KAAA2iC,uBAAwB,EAKxB3iC,KAAA4iC,wBAAyB,EACzB5iC,KAAA6iC,SAA2B,GAC3B7iC,KAAA8iC,YAAc,GACd9iC,KAAA+iC,WAAa,EACb/iC,KAAAgjC,WAA+B,GAC/BhjC,KAAAijC,QAAkB,GAClBjjC,KAAAkjC,WAAsB,KACtBljC,KAAAmjC,aAAwB,KACxBnjC,KAAAojC,sBAAgC,EAChCpjC,KAAAqjC,gBAA0B,EAKxBx8B,OAAOC,OAAO9G,KAAM6V,GACA,MAAjB7V,KAAKsjC,YACNtjC,KAAKsjC,WAAWC,OAASvjC,KAAKmI,GAC9BnI,KAAKsjC,WAAWn7B,GAAKnI,KAAKmI,IAG1BnI,KAAKsjC,WAAa,CAChBC,OAASvjC,KAAKmI,GACdA,GAAKnI,KAAKmI,GACVrF,UAAU,EAGhB,ECtCI,MAAO0gC,EAiBX7jC,YAAYkW,EAAO,IAhBZ7V,KAAAmI,GAAK,KAILnI,KAAAyjC,aAAe,GACfzjC,KAAA0jC,UAAY,GACZ1jC,KAAA2jC,gBAAkB,GAClB3jC,KAAA8C,UAAW,EACX9C,KAAA4jC,wBAAyB,EAGzB5jC,KAAA6jC,aAAe,EACf7jC,KAAA8jC,SAAW,EACX9jC,KAAA+jC,aAAe,EACf/jC,KAAAgkC,UAAY,KAGjBn9B,OAAOC,OAAO9G,KAAM6V,EACtB,ECvCI,MAAOouB,EAsBXtkC,YAAYkW,GACV7V,KAAKgiC,QAASnsB,IAAQA,EAAKkpB,eAAe,WAAYlpB,EAAKmsB,OAC3DhiC,KAAKkkC,SAAQruB,IAAQA,EAAKkpB,eAAe,WAAWlpB,EAAKquB,MACzDlkC,KAAKmkC,QAAUtuB,GAAQA,EAAKkpB,eAAe,WAAalpB,EAAKsuB,UAAU,IAAKC,MAAOC,4BACnFrkC,KAAKskC,YAActkC,KAAKmkC,QAAQ7jB,WAAWikB,6BAA+B,IAAIH,KAC9EpkC,KAAKmI,GAAK0N,GAAQA,EAAKkpB,eAAe,MAAQlpB,EAAK1N,GAAK,KACxDnI,KAAKwkC,oBAAsB3uB,GAAQA,EAAKkpB,eAAe,uBAAyBlpB,EAAK2uB,oBAAsB,EAC3GxkC,KAAKykC,iBAAmB5uB,GAAQA,EAAKkpB,eAAe,oBAAsBlpB,EAAK4uB,iBAAmB,GAClGzkC,KAAK0kC,eAAiB7uB,GAAQA,EAAKkpB,eAAe,kBAAoBlpB,EAAK6uB,eAAiB,GAC5F1kC,KAAK2kC,UAAY9uB,GAAQA,EAAKkpB,eAAe,aAAelpB,EAAK8uB,UAAY,GAC7E3kC,KAAK4kC,iBAAmB/uB,GAAQA,EAAKkpB,eAAe,oBAAsBlpB,EAAK+uB,iBAAmB,GAClG5kC,KAAK6kC,iBAAmBhvB,GAAQA,EAAKkpB,eAAe,oBAAsBlpB,EAAKgvB,iBAAmB,GAClG7kC,KAAK8kC,QAAUjvB,GAAQA,EAAKkpB,eAAe,WAAalpB,EAAKivB,QAAU,KACvE9kC,KAAK+kC,UAAYlvB,GAAQA,EAAKkpB,eAAe,aAAelpB,EAAKkvB,UAAY,KAC7E/kC,KAAKglC,YAAcnvB,GAAQA,EAAKkpB,eAAe,eAAiBlpB,EAAKmvB,YAAc,GACnFhlC,KAAKilC,eAAiBpvB,GAAQA,EAAKkpB,eAAe,kBAAoBlpB,EAAKovB,eAAiB,KAC5FjlC,KAAKklC,cAAgBrvB,GAAQA,EAAKkpB,eAAe,iBAAmBlpB,EAAKqvB,cAAgB,GACzFllC,KAAKmlC,eAAiBtvB,GAAQA,EAAKkpB,eAAe,kBAAoBlpB,EAAKsvB,eAAiB,GAC5FnlC,KAAKolC,aAAevvB,GAAQA,EAAKkpB,eAAe,gBAAkBlpB,EAAKuvB,aAAe,GACtFplC,KAAKujC,OAAS1tB,GAAQA,EAAKkpB,eAAe,UAAYlpB,EAAK0tB,OAAS,KACpEvjC,KAAKqlC,UAAYxvB,GAAQA,EAAKkpB,eAAe,aAAelpB,EAAKwvB,UAAY,EAC/E,EC3CI,MAAOC,GCgBP,MAAOC,EAaX5lC,YAAYkW,EAAO,IAZnB7V,KAAA8kC,QAAU,KACV9kC,KAAAwlC,UAAY,GACZxlC,KAAA2kC,UAAY,GACZ3kC,KAAAylC,iBAAmB,GACnBzlC,KAAA4kC,iBAAmB,GACnB5kC,KAAA0lC,wBAA0B,GAC1B1lC,KAAA2lC,YAAc,GACd3lC,KAAA63B,SAAW,EACX73B,KAAA83B,UAAY,EACZ93B,KAAA4lC,SAAW,EACX5lC,KAAA6iC,SAAW,GAGTh8B,OAAOC,OAAO9G,KAAM6V,GAEpB7V,KAAK6iC,SAAWhtB,GAAQA,EAAKkpB,eAAe,aAAelpB,EAAKgtB,SAAchtB,EAAKgtB,SAAoB,EACzG,EC3BI,MAAOgD,EAKXlmC,YAAYkW,EAAO,IAJnB7V,KAAAqc,QAAS,EACTrc,KAAA8lC,UAAY,QACZ9lC,KAAA+lC,QAAU,QAGRl/B,OAAOC,OAAO9G,KAAM6V,EACtB,ECII,MAAOmwB,EAaXrmC,YAAYkW,EAAO,IAZnB7V,KAAAilC,eAAiB,KACjBjlC,KAAAylC,iBAAmB,GACnBzlC,KAAA4kC,iBAAmB,GACnB5kC,KAAA0lC,wBAA0B,GAC1B1lC,KAAA2lC,YAAc,GACd3lC,KAAA63B,SAAW,EACX73B,KAAA83B,UAAY,EAGZ93B,KAAAimC,YAAc,KACdjmC,KAAAkmC,qBAAuB,KAGrBr/B,OAAOC,OAAO9G,KAAM6V,GAEpB7V,KAAKgjC,WACHntB,GAAQA,EAAKkpB,eAAe,cACxBlpB,EAAKmtB,WAAcrxB,IAAI8G,GAAK,IAAIotB,EAAeptB,IAC/C,IAAI4S,MAAM,GAAG1Z,IAAI,IACR,IAAIk0B,EAAe,CAAExpB,QAAQ,EAAMypB,UAAW,QAASC,QAAS,UAEjF,iBCRI,MAAOI,EAeXxmC,YAAYkW,EAAO,IAdZ7V,KAAAmI,GAAK,KACLnI,KAAA+hB,KAAe,GACf/hB,KAAA8C,UAAoB,EACpB9C,KAAAomC,eAAyB,EACzBpmC,KAAAqlC,UAAoB,GACpBrlC,KAAAqmC,WAAqB,GACrBrmC,KAAAsmC,SAAmB,GACnBtmC,KAAAolC,aAAuB,GACvBplC,KAAA4kC,iBAA2B,GAC3B5kC,KAAA2lC,YAAsB,GACtB3lC,KAAAumC,gBAA0B,GAC1BvmC,KAAAglC,YAAsB,GAI3Bn+B,OAAOC,OAAO9G,KAAM6V,EACtB,EAWI,MAAO2wB,UAAyBL,EAOpCxmC,YAAYkW,EAAO,IACjB5Q,QAHKjF,KAAAymC,WAAgC,GAIrC5/B,OAAOC,OAAO9G,KAAM6V,EACtB,ECrEI,MAAO6wB,EAUX/mC,YACCm7B,EAAe,GACd6L,EAAiB,GACjBC,GAAqB,EACrBC,GAAkB,EAClBC,GAA2B,EAC3BhkC,GAAmB,EACnBikC,EAAyB,GACvB/mC,KAAK86B,KAAMA,EACX96B,KAAK2mC,QAASA,EACd3mC,KAAK4mC,UAAWA,EAChB5mC,KAAK6mC,QAAUA,EACf7mC,KAAK8mC,iBAAmBA,EACzB9mC,KAAK8C,SAAWA,EACf9C,KAAK+mC,gBAAkBA,CAC3B,kDCpBI,MAAOC,EAKXrnC,YAAYkW,EAAO,IAJZ7V,KAAAmI,GAAK,KACLnI,KAAA86B,KAAO,GAIZj0B,OAAOC,OAAO9G,KAAM6V,EACtB,eCZFuuB,KAAK6C,UAAU5C,0BAmCf,SAASA,IACP,MAAM6C,EAAKlnC,KAAKmnC,UAAY,GAAK,IAAMnnC,KAAKmnC,UAAYnnC,KAAKmnC,UACvDC,EAAKpnC,KAAKqnC,WAAa,EAAI,GAAK,KAAOrnC,KAAKqnC,WAAa,GAAKrnC,KAAKqnC,WAAa,EAEtF,QAAS,GADIrnC,KAAKsnC,cACGF,EAAKF,EAC5B,EAvCA9C,KAAK6C,UAAUM,+BA+Cf,SAASA,IAIP,MAAO,GAHIvnC,KAAKmnC,UAAY,GAAK,IAAMnnC,KAAKmnC,UAAYnnC,KAAKmnC,aAClDnnC,KAAKqnC,WAAa,EAAI,GAAK,KAAOrnC,KAAKqnC,WAAa,GAAKrnC,KAAKqnC,WAAa,KACzErnC,KAAKsnC,eAEpB,EAnDAlD,KAAK6C,UAAUO,8BAqDf,SAASA,IACP,MAAMN,EAAKlnC,KAAKmnC,UAAY,GAAK,IAAMnnC,KAAKmnC,UAAYnnC,KAAKmnC,UACvDC,EAAKpnC,KAAKqnC,WAAa,EAAI,GAAK,KAAOrnC,KAAKqnC,WAAa,GAAKrnC,KAAKqnC,WAAa,EAEtF,MAAO,GADMrnC,KAAKsnC,iBACAF,KAAMF,GAC1B,EAzDA9C,KAAK6C,UAAUQ,wBAiFf,SAASA,IACP,OAAa,OAATznC,KAAsB,MAElB,IAAMA,KAAK0nC,YAAYC,OAAM,GAAM,KAAO,IAAM3nC,KAAK4nC,cAAcD,OAAM,EACnF,EApFAvD,KAAK6C,UAAUY,6BAqCf,SAASA,IAIP,MAAQ,IAHG7nC,KAAKmnC,UAAY,GAAK,IAAYnnC,KAAKmnC,UAAannC,KAAKmnC,YACzDnnC,KAAKqnC,WAAa,EAAI,GAAK,KAAOrnC,KAAKqnC,WAAa,GAAKrnC,KAAKqnC,WAAa,GACzErnC,KAAKsnC,aAEpB,EAxCAQ,OAAOb,UAAU1C,0BAwDjB,SAASA,IACP,MAAMwD,GAAQ/nC,KAAKgoC,OAAO,EAAG,GACvBZ,GAAMpnC,KAAKgoC,OAAO,EAAG,GACrBd,GAAMlnC,KAAKgoC,OAAO,EAAG,GAC3B,OAAO,IAAI5D,KAAK2D,EAAMX,EAAK,EAAGF,EAChC,EA5DAY,OAAOb,UAAUgB,wBA+FjB,SAASA,IACP,IAAKjoC,MAAmC,IAA3BA,KAAKsgB,WAAW1b,OAC3B,OAAO,KAGT,MAAOsjC,EAAM/gC,EAAKghC,GAAOnoC,KAAK4hB,MAAM,KAEpC,OAAQ5hB,KAAKooC,MAAM,MAAMxjC,QACvB,KAAK,EACH,OAAO,IAAIw/B,KAAK,EAAG,EAAG,GAAI8D,GAAO/gC,GAEnC,KAAK,EACH,OAAO,IAAIi9B,KAAK,EAAG,EAAG,GAAI8D,GAAO/gC,GAAMghC,GAEzC,QACE,OAAO,IAAI/D,KAAK,GAGtB,EAhHA0D,OAAOb,UAAUoB,+BA6DjB,SAASA,IACP,MAAMnB,EAAKlnC,KAAKgoC,OAAO,EAAG,GACpBZ,EAAKpnC,KAAKgoC,OAAO,EAAG,GACpBD,EAAO/nC,KAAKgoC,OAAO,EAAG,GAC5B,OAAO,IAAI5D,KAAK2D,EAAMX,EAAK,EAAGF,EAChC,EAjEAY,OAAOb,UAAUqB,8BAmEjB,SAASA,IACP,MAAMP,GAAQ/nC,KAAKgoC,OAAO,EAAG,GACvBZ,GAAMpnC,KAAKgoC,OAAO,EAAG,GACrBd,GAAMlnC,KAAKgoC,OAAO,EAAG,GAC3B,OAAO,IAAI5D,KAAK2D,EAAMX,EAAK,EAAGF,EAChC,EAvEAY,OAAOb,UAAUsB,eAgFjB,SAASA,IACP,OAAKvoC,KAEEA,KAAK,GAAGwoC,cAAgBxoC,KAAK2nC,MAAM,GAFxB3nC,IAGpB,EAnFA8nC,OAAOb,UAAUwB,aAqFjB,SAASA,IACP,OAAKzoC,KAEEA,KAAK,GAAG0oC,cAAgB1oC,KAAK2nC,MAAM,GAFxB3nC,IAGpB,EAxFAqrB,MAAM4b,UAAU0B,mBAqHhB,SAASA,EAAmBC,EAAgCC,EAAkBC,GAAc,GAC1F,QAASz/B,EAAI,EAAGA,EAAIrJ,KAAK4E,OAAQyE,IAC/B,GAAIw/B,GACF,GAAI7oC,KAAKqJ,GAAGw/B,KAAaD,EACvB,OAAOE,EAAcz/B,EAAIrJ,KAAKqJ,QAAC,GAG7BrJ,KAAKqJ,KAAOu/B,EACd,OAAOE,EAAcz/B,EAAIrJ,KAAKqJ,GAIpC,OAAO,IACT,gGCvIO,IAAM0/B,EAAa,MAApB,MAAOA,EACXppC,YAAsB4hC,GAAAvhC,KAAAuhC,aAA2B,CAMjD,wBAAOyH,CAAkBC,GACvB,MAAMC,EAAQ,CACZ,IACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,UAEIC,EAAQ,CACZ,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,KACA,IACA,IACA,GACA,GACA,GACA,GACA,IACA,KAGF,QAAS9/B,EAAI,EAAGA,EAAI6/B,EAAMtkC,OAAQyE,IAAK,CACrC,IAAI+/B,EAAM,IAAIC,OAAOH,EAAM7/B,GAAI,KAC/B4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AEbJ,CAAU,yHCRhB,IAAMK,GAAa,MAApB,MAAOA,EAAap+C,SAAAjB,KAAA,mBAAAkB,iBAAbm+C,EAAa,EAAAp+C,SAAAjB,KAAA,UAAAuL,EAAA4pB,GAAA,MAAbkqB,IAAap+C,SAAAjB,KAAA,UAAAuL,EAAA6pB,IAAA,WAAbiqB,CAAa,yGCgB1B,MAAMC,GAAajpB,EAAQ,MA+IrB,SAAUkpB,GAAsBC,GACpC,OAAO,IAAIC,KAAoBD,EAAM,iBAAkB,QACzD,EACAE,QAAmBC,KAAU,MA+EtB,IAAMC,GAAS,MAAhB,MAAOA,EACXjgD,YAAY80B,GACVA,EAAQorB,SACNC,OACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,OACAC,MACAC,MACAC,OACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,OACAC,MACAC,MACAC,OACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,OACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACA3B,MACA4B,MACAC,MACAC,MACAC,MACAC,OACAC,MACAC,MACAC,MACAC,MACAC,KACAC,MACAC,MACAnC,OACAoC,MACAC,MACAC,MACAC,MACAC,KACAC,MACAC,MACAC,MACAC,MACAC,MACAC,OACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,MACAC,OACAC,MACAD,OACAE,MACAlC,MACAmC,MACAC,QAAQ,EAEVC,OAAa5H,KAAU,EACvBlC,OAAO+J,UAAUC,SACnB,CAACnmD,SAAAjB,KAAA,mBAAAkB,iBA9HU0+C,GAAS/9C,MAAA6I,MAAA,EAAAzJ,SAAAjB,KAAA,UAAAuL,EAAA4pB,GAAA,MAATyqB,EAASyH,UAAA,CAFRxJ,MAAY58C,SAAAjB,KAAA,UAAAuL,EAAA6pB,IAAA,WAXb,CACT4nB,GACA1b,IACA,CAAEzM,QAASyyB,MAAWvyB,SAAU,OAAI,EACpCwyB,SACFC,MAAwB,CAAEC,UAAW,IAAKC,eAAe,KAAM,EAC/DC,SAAgB,EAChBC,UAGCryB,QAAA,CArECsyB,KACAnK,GACAoK,KACAC,MACAC,MACAhJ,GACArK,KACAngB,MACA8hB,KAAa5hB,QAAQ,CACnB4c,QAAS,IACT2W,cAAe,oBAEjB5R,MAAiB3hB,QAAQ,CACvBwzB,cAAeC,MAAyBC,YACxCC,yBAA0B,kBAC1BC,qBAAsB,MACtBC,cAAe,UACfC,gBAAiB,UACjBC,eAAgB,YAElB/yB,IAAgBhB,QAAQ,CACtBg0B,OAAQ,CACN7zB,QAAS8zB,KACT3zB,WAAYuqB,GACZrqB,KAAM,CAAC0zB,UAGXC,MAAUn0B,QAAQ,CAChB9F,OAAQ,CACNk6B,YAAaA,IACJnb,KAAKuF,MAAOjD,aAAakD,QAAQ,gCAAiC,QAE3E4V,eAAgBpR,EAEhBqR,WAAY,MAGhBvzB,KACAwzB,MAAcv0B,QACZ,CAAEvsB,GAAI,SAAU+gD,SAAUnS,IAAYC,aAExCqI,GACA1oB,MAAajC,QAAQ,CACnBiJ,OAAQ,yCAEV2Y,KAAa5hB,QAAQ,CACnB4c,QAAS,IACT2W,cAAe,qBACf9M,aAAa,IAEfgO,MAAoBC,SAAS,iBAAkB,CAC7CC,QAAStS,IAAYC,WAGrBsS,qBAAsB,6BAExBC,gBAgBS3J,CAAS,KCnPlB7I,IAAYC,eACdwS,SAGFC,OACGC,gBAAgB9J,IAChBnhB,MAAM31B,GAAOC,QAAQC,MAAMF","names":["KS_DEFAULT_ACCESSIBILITY_CONFIG","backgroundAriaLabel","backgroundTitle","plainGalleryContentAriaLabel","plainGalleryContentTitle","modalGalleryContentAriaLabel","modalGalleryContentTitle","loadingSpinnerAriaLabel","loadingSpinnerTitle","mainContainerAriaLabel","mainContainerTitle","mainPrevImageAriaLabel","mainPrevImageTitle","mainNextImageAriaLabel","mainNextImageTitle","dotsContainerAriaLabel","dotsContainerTitle","dotAriaLabel","previewsContainerAriaLabel","previewsContainerTitle","previewScrollPrevAriaLabel","previewScrollPrevTitle","previewScrollNextAriaLabel","previewScrollNextTitle","carouselContainerAriaLabel","carouselContainerTitle","carouselPrevImageAriaLabel","carouselPrevImageTitle","carouselNextImageAriaLabel","carouselNextImageTitle","carouselPreviewsContainerAriaLabel","carouselPreviewsContainerTitle","carouselPreviewScrollPrevAriaLabel","carouselPreviewScrollPrevTitle","carouselPreviewScrollNextAriaLabel","carouselPreviewScrollNextTitle","AccessibleComponent","constructor","handleNavigationEvent","direction","event","KeyboardEvent","this","handleKeyboardNavigationEvent","MouseEvent","handleMouseNavigationEvent","NOTHING","handleImageEvent","handleImageKeyboardEvent","handleImageMouseEvent","key","code","SPACE_CODE","ENTER_CODE","NEXT","button","MOUSE_MAIN_BUTTON_CLICK","DIRECTION_RIGHT","PREV","static","t","_angular_core__WEBPACK_IMPORTED_MODULE_1__","VBU","selectors","decls","vars","template","rf","ctx","encapsulation","changeDetection","i0","ctx_r0","accessibilityConfig","BackgroundComponent","_angular_core__WEBPACK_IMPORTED_MODULE_0__","inputs","isOpen","consts","BackgroundComponent_div_0_Template","$event","_r3","preview_r4","$implicit","ctx_r1","onImageEvent","clickAction","keyboardAction","isActive","configPreview","clickable","getAlt","plain","img","modal","_c0","width","maxHeight","getTitle","CarouselPreviewsComponent_nav_0_ng_container_4_ng_container_1_img_1_Template","_r5","sanitizeUrlBgStyle","getIE11LegacyBgSize","CarouselPreviewsComponent_nav_0_ng_container_4_ng_template_2_div_0_Template","CarouselPreviewsComponent_nav_0_ng_container_4_ng_container_1_Template","CarouselPreviewsComponent_nav_0_ng_container_4_ng_template_2_Template","carouselConfig","legacyIE11Mode","legacyMode_r6","_r1","onNavigationEvent","CarouselPreviewsComponent_nav_0_ng_container_4_Template","arrows","start","previews","trackById","end","images","length","CarouselPreviewsComponent","ref","breakpointObserver","sanitizer","super","hostMaxWidth","ariaLabel","clickPreview","EventEmitter","Action","CLICK","KEYBOARD","defaultMaxHeight","breakpointSubscription","observe","Breakpoints","XSmall","Small","Medium","Large","XLarge","subscribe","result","breakpoints","updateHeight","xSmall","small","medium","large","xLarge","configBreakpointHeight","newConfigPreview","Object","assign","previewConfig","heightNum","replace","Math","min","markForCheck","ngOnInit","defaultPreviewConfig","visible","number","maxWidth","initPreviews","currentImage","isXsmallScreen","isMatched","isSmallScreen","isMediumScreen","isLargeScreen","isxLargeScreen","preview","id","ngOnChanges","changes","simpleChange","prev","previousValue","current","currentValue","prevIndex","currentIndex","getIndex","err","console","error","calc","floor","setBeginningIndexesPreviews","filter","i","setEndIndexesPreviews","previous","next","action","NORMAL","clickedImageIndex","indexOf","emit","getAriaLabel","title","alt","index","item","unsafeStyle","bypassSecurityTrustStyle","ngOnDestroy","unsubscribe","isPreventSliding","max","boundaryIndex","i1","i2","_angular_core__WEBPACK_IMPORTED_MODULE_2__","hostVars","hostBindings","CarouselPreviewsComponent_nav_0_Template","MaxSizeDirective","renderer","el","applyStyle","sizeConfig","setStyle","nativeElement","core","FsC","features","ctx_r3","isLastImage","infinite","isFirstImage","configCarousel","showArrows","configCurrentImageCarousel","description","getDescriptionToDisplay","CarouselComponent_figure_3_a_1_Template","CarouselComponent_figure_3_ng_container_2_Template","_r2","onClickCurrentImage","swipe","type","CarouselComponent_figure_3_figcaption_4_Template","CarouselComponent_figure_3_a_5_Template","onClickDot","_c2","content_r6","objectFit","getAltDescriptionByImage","_c3","getTitleToDisplay","configDots","_r8","_r9","CarouselComponent_ng_template_4_a_1_Template","CarouselComponent_ng_template_4_ng_container_2_Template","_r7","CarouselComponent_ng_template_4_div_4_Template","CarouselComponent_ng_template_4_a_5_Template","_c4","_c5","CarouselComponent","onMouseEnter","configPlay","pauseOnHover","stopCarousel","onMouseLeave","autoPlay","playCarousel","onKeyDownLeft","keyboardEnable","prevImage","onKeyDownLRight","nextImage","_platformId","_ngZone","galleryService","dotsConfig","show","firstImage","lastImage","plainGalleryHidden","strategy","PlainGalleryStrategy","CUSTOM","layout","AdvancedLayout","start$","Subject","stop$","SWIPE_ACTION","LEFT","RIGHT","UP","DOWN","configDotsChange","carouselConfigChange","playConfigChange","playConfig","playConfigChangeCurr","isFirstChange","defaultDescription","DescriptionStrategy","ALWAYS_HIDDEN","imageText","numberSeparator","beforeTextDescription","style","bgColor","textColor","marginTop","marginBottom","marginLeft","marginRight","invertSwipe","carouselImageConfig","modalGalleryEnable","interval","Error","manageSlideConfig","ngAfterContentInit","isPlatformBrowser","runOutsideAngular","pipe","map","switchMap","timer","takeUntil","run","changeCurrentImage","openGallery","image","imageWithoutDescription","HIDE_IF_EMPTY","buildTextDescription","SWIPE","getPrevImage","getNextImage","onClickPreview","imageFound","emitBoundaryEvent","ImageModalEvent","newIndex","customFullDescription","prevDescription","middleDescription","handleBoundaries","indexToCheck","PLATFORM_ID","CarouselComponent_ng_template_1_Template","CarouselComponent_figure_3_Template","CarouselComponent_ng_template_4_Template","_c1","legacyMode_r10","comment","user","photoUrl","CommentComponent","CommentComponent_ng_container_3_Template","CommentComponent_ng_template_4_Template","noAva_r2","fullName","login","commentCreatedDate","comment_r2","CommentsComponent_div_4_ng_container_1_ng_container_1_Template","comments_r3","trackByFn","CommentsComponent_div_4_ng_container_1_Template","CommentsComponent_div_4_ng_template_2_Template","noContent_r5","error_r6","CommentsComponent_ng_template_6_div_0_Template","CommentsComponent_ng_template_6_ng_template_2_Template","loadingError$","loading_r7","CommentsComponent","commentsList","ngUnsubscribe","isLoading","isCommentLoading","value","_id","commentsDataSource","getComments","photoId","load","finalize","catchError","of","data","detectChanges","sendMessage","message","sendFormStatus","loading","insert","response","push","body","CommentsComponent_div_4_Template","CommentsComponent_ng_template_6_Template","loadingOrError_r8","_c6","closeErrorBlock","resetAlert","message_r3","send","SenderComponent_div_0_ng_container_11_Template","SenderComponent_div_0_ng_template_12_Template","formStatus_r4","isEmpty","placeholder","loading_r5","SenderComponent","formStatusChange","onSendMessage","formStatus$","BehaviorSubject","v","complete","textarea","alertEmptyMessage","viewQuery","SenderComponent_div_0_Template","Keyboard","ESC","LEFT_ARROW","RIGHT_ARROW","UP_ARROW","DOWN_ARROW","KeyboardNavigationDirective","keyPress","onKeyDown","e","keyCode","ctx_r2","leftPreview_r4","configSlide","sidePreviews","size","height","CurrentImageComponent_ng_container_4_ng_container_1_img_1_Template","CurrentImageComponent_ng_container_4_ng_container_1_ng_template_2_Template","firstImage_r5","CurrentImageComponent_ng_container_4_ng_container_1_Template","getLeftPreviewImage","configCurrentImage","checkboxChange","target","checked","isCheck","onResetSizeStyle","closeInfoBlock","infoTemplate","infoBlockContent","rightPreview_r10","slideConfig","CurrentImageComponent_ng_container_14_ng_container_1_img_1_Template","CurrentImageComponent_ng_container_14_ng_container_1_ng_template_2_Template","lastImage_r11","CurrentImageComponent_ng_container_14_ng_container_1_Template","getRightPreviewImage","loadingConfig","CurrentImageComponent","isOpenInfoBlockChange","isCheckable","loadImage","changeImage","close","selectImage","normalAction","isLoked","scale","ALWAYS_VISIBLE","navigateOnClick","enable","LoadingType","STANDARD","downloadable","currentImageConfig","updateIndexes","AUTOPLAY","onKeyPress","keyboardConfig","esc","right","left","disable","previouslyLoaded","onImageLoad","setOriantation","focus","loadImageData","status","getIndexToDelete","log","galleryImageContainer","isOpenInfoBlock","getRotateClass","angle","undefined","selectedImages","includes","onMousemove","rect","parentElement","getBoundingClientRect","x","top","y","transform","setOffset","onMouseOut","tagName","getElementsByTagName","letDeltaX","letDeltaY","orientation","bottom","onWheel","newScale","deltaY","classList","remove","naturalHeight","naturalWidth","add","getImageByIdFromImages","find","CurrentImageComponent_ng_container_4_Template","galleryImage_r6","CurrentImageComponent_figcaption_10_Template","CurrentImageComponent_input_11_Template","CurrentImageComponent_div_12_Template","CurrentImageComponent_ng_container_14_Template","CurrentImageComponent_ng_container_15_Template","extUrl","LoadingSpinnerComponent","loadingStandard","loadingBars","BARS","loadingCircular","CIRCULAR","loadingDots","DOTS","loadingCubeFlipping","CUBE_FLIPPING","loadingCircles","CIRCLES","loadingExplosingSquares","EXPLOSING_SQUARES","LoadingSpinnerComponent_ng_container_2_Template","LoadingSpinnerComponent_ng_container_3_Template","LoadingSpinnerComponent_ng_container_4_Template","LoadingSpinnerComponent_ng_container_5_Template","LoadingSpinnerComponent_ng_container_6_Template","LoadingSpinnerComponent_ng_container_7_Template","LoadingSpinnerComponent_ng_container_8_Template","toString","index_r2","onDotEvent","DotsComponent_ng_container_1_div_1_Template","DotsComponent","clickDot","dotsConfigChanges","imageIndex","outputs","DotsComponent_ng_container_1_Template","imageId","InfoBlockComponent","resetSizeStyle","onClose","content","InfoBlockComponent_ks_comments_1_Template","InfoBlockComponent_ks_info_2_Template","InfoBlockComponent_p_3_Template","InfoComponent","bypassSecurityTrustHtml","photoInfo","text","split","elem","join","date","dateStringRU","Intl","DateTimeFormat","year","month","day","format","InfoComponent_div_5_Template","InfoComponent_ng_template_6_Template","noContent_r2","IdValidatorService","ids","Map","checkAndAdd","galleryId","Number","isInteger","get","set","delete","jDH","factory","ɵfac","providedIn","ClickOutsideDirective","clickOutside","onClick","stopPropagation","targetElement","clickOutsideEnable","isInside","isHidden","className","startsWith","onClickOutside","onDelete","onNavigate","onDownload","onCloseGallery","onFullScreen","onCustomEmit","onShowComments","onRotate","onRotateCss","onShowInfo","openedInfoBlock","onChangeCurrentImage","enableCloseOutside","buttonsConfig","opened","ModalGalleryComponent","onPopState","closeGallery","keyboardService","platformId","changeDetectorRef","idValidatorService","hasData","buttonBeforeHook","buttonAfterHook","arrow","info","showGallery","imagesChange","modalImages","plainGalleryConfigChange","plainGalleryConfig","firstChange","initImages","currPlainGalleryConfigChange","modalOpenerByIndex","showModalGallery","galleryServiceNavigateSubscription","navigate","payload","galleryServiceCloseSubscription","galleryServiceUpdateSubscription","update","galleryServiceAutoPlaySubscription","eventToEmit","getButtonEventToEmit","ButtonType","INFO","COMMENTS","RotateImage","getButtonEventToEmitCSS","idButton","imageFromArray","doc","document","docEl","documentElement","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","exitFullscreen","msExitFullscreen","mozCancelFullScreen","webkitExitFullscreen","requestFullscreen","webkitRequestFullscreen","mozRequestFullScreen","msRequestFullscreen","currentImageComponent","extUrlInNewTab","window","open","opener","location","href","downloadImage","isCalledByService","reset","overflow","onShowModalGallery","combo","preventDefault","returnValue","LOAD","isPlainGalleryVisible","hideDefaultPlainGallery","downloadImageAllBrowsers","link","createElement","isBase64","sanitize","SecurityContext","RESOURCE_URL","extension","pureBase64","blob","base64toBlob","URL","createObjectURL","setAttribute","getFileName","appendChild","click","removeChild","base64Data","contentType","byteCharacters","atob","bytesLength","slicesCount","ceil","sliceSize","byteArrays","Array","sliceIndex","begin","bytes","offset","charCodeAt","Uint8Array","Blob","base64Extension","downloadFileName","showComments","closeComments","getImageByIdFromModalImages","i3","i4","ModalGalleryComponent_div_2_Template","WrapDirective","wrap","DirectionDirective","justify","imgCol_r2","showModalGalleryByImage","getAltPlainDescriptionByImage","getTitleDisplay","PlainGalleryComponent_div_0_ng_container_1_ng_container_1_ng_container_1_img_1_Template","_r4","j_r5","configPlainGallery","advanced","additionalBackground","PlainGalleryComponent_div_0_ng_container_1_ng_container_1_ng_template_2_a_0_Template","PlainGalleryComponent_div_0_ng_container_1_ng_container_1_ng_container_1_Template","PlainGalleryComponent_div_0_ng_container_1_ng_container_1_ng_template_2_Template","aTags","aTags_r6","PlainGalleryComponent_div_0_ng_container_1_ng_container_1_Template","imgRow_r7","PlainGalleryComponent_div_0_ng_container_1_Template","wrapStyle","widthStyle","directionStyle","justifyStyle","imageGrid","PlainGalleryComponent","defaultSize","defaultLayout","LineLayout","defaultPlainConfig","ROW","configChange","initPlainGalleryConfig","initImageGrid","findIndex","val","currImgDescription","config","COLUMN","breakConfig","GridLayout","GRID","row","count","j","pixels","PlainGalleryComponent_div_0_Template","defaultPreviewSize","PreviewsComponent_ng_container_1_ng_container_3_img_1_Template","PreviewsComponent_ng_container_1_ng_container_3_Template","PreviewsComponent","updatePreviews","setIndexesPreviews","_angular_core__WEBPACK_IMPORTED_MODULE_3__","PreviewsComponent_ng_container_1_Template","KS_DEFAULT_SIZE","KS_DEFAULT_BTN_CLOSE","CLOSE","KS_DEFAULT_BTN_DOWNLOAD","DOWNLOAD","KS_DEFAULT_BTN_EXTURL","EXTURL","KS_DEFAULT_BTN_DELETE","DELETE","KS_DEFAULT_BTN_FULL_SCREEN","FULLSCREEN","btn_r2","onEvent","fontSize","UpperButtonsComponent_ng_container_1_ng_container_1_a_1_Template","UpperButtonsComponent_ng_container_1_ng_container_1_Template","buttons","UpperButtonsComponent","refresh","download","fullscreen","rotate","comments","customEmit","rotateCss","defaultButtonsDefault","simpleButtonsDefault","advancedButtonsDefault","fullButtonsDefault","configButtons","ButtonsStrategy","DEFAULT","SIMPLE","addButtonIds","ADVANCED","FULL","validateCustomButtons","dataToEmit","triggerOnMouseAndKeyboard","ROTATE_RIGHT","ROTATE_LEFT","ROTATE_RIGHT_CSS","ROTATE_LEFT_CSS","emitter","forEach","WHITELIST_BUTTON_TYPES","_angular_core__WEBPACK_IMPORTED_MODULE_4__","UpperButtonsComponent_ng_container_1_Template","ATagBgImageDirective","DescriptionDirective","position","SizeDirective","SlimScrollDirective","elementRef","lastHeight","observer","MutationObserver","newHeight","scrollHeight","scrollTo","behavior","addClass","attributes","subtree","KsHammerGestureConfig","HammerGestureConfig","buildHammer","element","Hammer","touchAction","_angular_core__WEBPACK_IMPORTED_MODULE_13__","setupRouter","injector","KeyboardService","GalleryModule","library","forRoot","ngModule","providers","provide","KEYBOARD_CONFIGURATION","useValue","useFactory","setupKeyboardService","deps","$C","G2t","HAMMER_GESTURE_CONFIG","useClass","imports","CommonModule","FontAwesomeModule","TranslateModule","Image","ImageEvent","GalleryService","navigateGallery","updateGallery","play","stop","InjectionToken","shortcuts","disableSsrWorkaround","require","mousetrap","Mousetrap","onBind","bind","arrayOfImages","YaCoreModule","yaMapsAPILoaderConfig","BROWSER_GLOBALS_PROVIDERS","YaMapsAPILoader","LAZY_MAPS_API_CONFIG","markerId","YaMarker","_markerManager","draggable","preset","markerClick","dragEnd","_markerAddedToManger","_observableSubscriptions","addMarker","_addEventListeners","showInfo","showBalloon","latitude","longitude","coords","updateMarker","deleteMarker","s","cs","createEventObservable","ds","geometry","getCoordinates","getNativeMarker","then","m","lat","lng","nativeMarker","balloonLayout","balloonContentHeader","balloonContentBody","balloonContentFooter","iconContent","iconLayout","iconImageHref","iconImageSize","iconImageOffset","YaMapsAPIWrapper","YaMap","_elem","_mapsWrapper","zoom","mapType","controls","mapClick","actionTick","mapInit","container","querySelector","_initMapInstance","updatePosition","panTo","createMap","center","_handleMapMouseEvents","setCenter","panToObjects","points","params","events","name","subscribeToMapEvent","getCenter","minZoom","maxZoom","MarkerManager","ClasterManager","ObjectManagerManager","ngContentSelectors","_zone","_clasters","addClaster","claster","clasterPromise","createClaster","_markers","marker","Promise","resolve","removeGeo","markerPromise","createMarker","object","balloon","eventName","Observable","create","_managers","manager","managerPromise","createObjectManager","navigateToGeoObject","getNativeManager","p","setFilter","objectManagerSetFilter","w","d","_windowRef","_documentRef","script","getNativeDocument","async","defer","src","apiKey","_scriptLoadingPromise","reject","onload","onerror","WindowRef","getNativeWindow","DocumentRef","_loader","_map","_mapResolver","mapOptions","setTimeout","ymaps","catch","options","arg","Placemark","geoObjects","overlay","hasOwnProperty","setCoordinates","markers","myGeoObjects","point","GeoObject","coordinates","clusterer","Clusterer","objectManager","datasource","nativeObjectManager","ObjectManager","clusterize","gridSize","objects","objectPreset","clusters","clasterPreset","obj","getById","checkYaSciptLoaded","getElementById","AuthGuard","jwt","userService","router","storage","canActivate","token","retrieve","isTokenExpired","CanActivateTeam","ps","route","state","permission","isAccept","has","PermissionsResolver","httpService","permissionsService","userServise","tap","permissions","setPermissions","NoAuthGuard","logout","UserModel","active","firstName","lastName","middleName","password","confirmPassword","phoneNumber","email","languageKey","movingType","movingTypeId","hasExtendedPermission","dataSourceSwitchEnable","projects","supervisors","storeCount","workedDays","address","hasCluster","hasRoutePlan","isVisitTimeAvailable","isFteAvailable","absentUser","userId","ProjectModel","abbreviation","colorText","colorBackground","useLoadingDataByServer","userWageRate","wageRate","wageRateStep","routeType","RoutePlan","check","dateInt","Date","convertDateToServerString","dateIntDate","convertServerStringToDate","numberOrderOfVisits","storeChainBanner","storeChainName","storeCode","projectStoreCode","storeFullAddress","storeId","projectId","projectName","projectStoreId","storeLatitude","storeLongitude","userFullName","userLogin","TableFiltersModel","StoreModel","storeName","projectStoreName","projectStoreChainBanner","fullAddress","mchCount","WorkedDayModel","timeBegin","timeEnd","ProjectStoreModel","storeStatus","routeVisitPeriodRule","VisitModel","visitTimeSpent","regionName","cityName","startServerTime","VisitDetailModel","taskGroups","Application","version","isDefault","isLight","isRequiredUpdate","mobilePackageId","VisitPeriodRuleModel","prototype","dd","getDate","mm","getMonth","getFullYear","convertDateToServerStringPoint","convertDateToServerStringDash","convertDateToTimeString","getHours","slice","getMinutes","convertDateToServerStringNew","String","yyyy","substr","convertTimeStringToDate","hour","sec","match","convertServerStringToDatePoint","convertServerStringToDateDash","upperFirstChar","toUpperCase","lowFirstChar","toLowerCase","findElementInArray","searchElement","dataKey","returnIndex","HelperService","convertToTranslit","str","arrRu","arrEn","reg","RegExp","createRandomString","randomstring","rnum","chars","random","substring","downloadFile","contentDisposition","base64Name","filename","toFixed","filenames","decodeURI","Base64","decode","saveAs","downloadFileTest","autoBom","addUTF8BOMToString","inputString","bom","textBytes","TextEncoder","encode","resultBytes","TextDecoder","addUTF8BOMToStringOld","expandPolygon","polygon","createPolygonByPoint","createPolygonByTwoPoint","countAngles","distance","azimut","earth","PI","rad","x1","cos","y1","sin","getCenterPolygon","reduce","createPolygonByMoreThreePoint","atan2","rad45deg","rad1","rad2","x2","y2","transformDatePoint","transformStringPoint","BASE_URL","env","serverUrl","HttpService","httpClient","headers","HttpHeaders","setUrl","path","HttpParams","formatErrors","getResponse","getBlobGet","responseType","getBlobGetTest","getBlob","post","JSON","stringify","getBlobTest","getFileBlob","deleteResponse","postResponse","putResponse","put","postResponseBlob","throwError","postResponseMultipart","localBody","FormData","getTest","getResponseTest","postResponseMultipartTest","postTest","postResponseTest","deleteTest","deleteResponseTest","patch","patchResponse","MAXAGE","UserService","reportNotificationService","isRequiredPersonalData","isRequiredPersonalDataOpen","setUser","getUser","getValue","getUserObservable","getUserStream","stopListerningAfterLogout","clear","ProjectService","project","clearProject","setProject","localStorage","setItem","siteUrl","getProject","PermissionsService","b","getPermissions","permissionsState","hasNav","PhotoReportNotificationService","ReportNotificationService","toastr","reports$","reportsResponse$","reportsInOrder$","reportsReady$","showedOrdersIds","isListerningSubject","countReqests","notifier","enableHtml","timeOut","report","markAsWiewed","reportName","url","closeButton","onTap","take","markDownloaded","addReportAsShowed","onstorage","onStorage","fetchIsListerningNotification","getReportNotify","reportOrder","reportsReady","filterNotification","hasReportsProcessing","timeoutId","getDelay","stopListerning","onReqestOrder","getIsListerning","startListerning","append","sessionId","loadreports","isListerning","parse","getItem","isListerningNotification","getReportOrder","statusId","setIsListerningNotification","boolean","getReportOrderResponse","_angular_core__WEBPACK_IMPORTED_MODULE_6__","reports","some","checkReportsInOrder","initialization","checkNotifications","self","isFitByDate","created","convertStringToDateDash","isFitByDownloadd","isDownloaded","string","onReadyReport","delayM","clearTimeout","_angular_core__WEBPACK_IMPORTED_MODULE_5__","DxSharedModule","DxVectorMapModule","DxBarGaugeModule","DxListModule","DxDropDownBoxModule","DxAccordionModule","DxButtonModule","DxChartModule","DxTextBoxModule","DxTabPanelModule","DxPieChartModule","DxDataGridModule","DxPopupModule","DxTreeListModule","DxNumberBoxModule","DxFileUploaderModule","DxSelectBoxModule","DxDateBoxModule","DxCheckBoxModule","DxFormModule","DxTagBoxModule","DxLookupModule","DxLoadIndicatorModule","DxValidatorModule","DxValidationSummaryModule","DxValidationGroupModule","NgxLoadingModule","ToastrModule","DxTabsModule","DxLoadPanelModule","RouterModule","DxSwitchModule","DxCalendarModule","DxScrollViewModule","DxSliderModule","DxDateRangeBoxModule","environment","production","productionBD","envName","slideInAnimation","trigger","transition","query","optional","animateChild","group","animate","whitelistedDomains","photoUrlSmallSize","HeaderComponent","translate","changeMenuSizeClass","menuSizeClass","onChangeMenuSizeClass","HeaderComponent_ng_container_15_Template","HeaderComponent_ng_template_16_Template","noAva_r3","sizeMenuClass","m_r2","expanded","subm_r4","header","subm_r5","expand","NavComponent_ng_container_4_div_2_fa_icon_7_Template","NavComponent_ng_container_4_div_2_div_9_Template","NavComponent_ng_container_4_div_2_div_10_Template","icon","children","getVisibleMenu","NavComponent_ng_container_4_div_2_Template","NavComponent_ng_container_4_ng_template_3_Template","noChildren_r6","NavComponent","projectService","menu","array","isArray","NavComponent_ng_container_4_Template","opacity","breadcrumb_r2","BodyComponent_form_18_div_56_fa_icon_1_Template","loginLoading","onSavePrivasy","privacy","phone","BodyComponent_form_18_div_56_Template","BodyComponent","translateService","privacyOk","checkComparison","setDefaultLang","prepareRoute","outlet","activatedRouteData","animation","contentClass","mainMenu","big","contains","ok","toPromise","success","progressBar","BodyComponent_ng_container_8_Template","BodyComponent_form_18_Template","AuthLayoutComponent","CONTENT_ROUTES","loadChildren","__webpack_require__","HomeModule","breadcrumb","skip","all","RoutesModule","LogisticModule","MatrixModule","label","EmployeesModule","StatusMchModule","ConstructorPlanogrammModule","StoresModule","BiReportsModule","ReportsModule","VisitsModule","MassVissitModule","CrowdsourcingModule","AdminModule","OtherModule","FilehostingModule","SettingsModule","PosmModule","UserResolver","toastrService","lang","use","locale","routes","redirectTo","pathMatch","component","AuthModule","AppRoutingModule","preloadingStrategy","PreloadAllModules","AppComponent","titleService","metrika","photoReportNotificationService","setTitle","prevPath","NavigationEnd","newPath","hit","referer","i5","i6","i7","i8","i9","TokenInterceptor","intercept","request","handle","CoreModule","HTTP_INTERCEPTORS","multi","provideHttpClient","withInterceptorsFromDi","YamapngModule","ruMessages","createTranslateLoader","http","TranslateHttpLoader","registerLocaleData","localeRu","AppModule","addIcons","faPaperPlane","faUndo","faRedo","faAngleDoubleLeft","faAngleDoubleRight","faAngleDoubleDown","faAngleDoubleUp","faAngleDown","faAngleLeft","faAngleRight","faPlusSquare","faMinusCircle","faAngleUp","faPencilAlt","faBars","faUserSecret","faArrowUp","faArrowDown","faSpinner","faDoorOpen","faInfo","faInfoCircle","faChevronDown","faChevronUp","faChevronRight","faChevronLeft","faCircle","faCalendar","faCalendarDay","faTrash","faEye","faHourglassStart","faUserFriends","faFileCsv","faFileDownload","faDownload","faExchangeAlt","faFile","faFileAlt","faSave","faSyncAlt","faIdCard","faUserEdit","faStoreAlt","faCross","faMagic","faGlobeAmericas","faCoins","faUser","faUserClock","faTimes","faCar","faClock","faLongArrowAltRight","faWindowMaximize","faWindowMinimize","faDrawPolygon","faGlobe","faDraftingCompass","faCloudDownloadAlt","faArrowRight","faCopyright","faBomb","faExclamationTriangle","faCheckDouble","faCheckCircleReg","faEdit","faHome","faChartPie","faThList","faUserCircle","faRoute","faMapMarkerAlt","faPuzzlePiece","faPlayCircle","faPlus","faUserPlus","faQrcode","faCaretUp","faCaretDown","faChartLine","faChartBar","faCalendarCheck","faFilter","faTasks","faCheck","faSquare","faLanguage","faPaintBrush","faLightbulb","faStream","faBook","faMinus","faEraser","faCog","faGripVertical","faKey","faFolderOpen","faImages","faImage","faComments","faExternalLinkAlt","faAlignJustify","faCarSide","faWalking","faBus","faCheckCircle","faTimesCircle","faQuestionCircle","faReceipt","faCloudUploadAlt","faFilePdf","faUpload","faCaretRight","faObjectGroup","faMagnet","loadMessages","navigator","language","bootstrap","LOCALE_ID","provideNgxWebstorage","withNgxWebstorageConfig","separator","caseSensitive","withLocalStorage","withSessionStorage","BrowserModule","BreadcrumbModule","DragulaModule","BrowserAnimationsModule","positionClass","animationType","ngxLoadingAnimationTypes","chasingDots","backdropBackgroundColour","backdropBorderRadius","primaryColour","secondaryColour","tertiaryColour","loader","TranslateLoader","HttpClient","JwtModule","tokenGetter","allowedDomains","authScheme","MetrikaModule","webvisor","ServiceWorkerModule","register","enabled","registrationStrategy","NgxSkeletonLoaderModule","enableProdMode","__NgCli_bootstrap_1","bootstrapModule"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./projects/ks89/angular-modal-gallery/src/lib/components/accessibility-default.ts","./projects/ks89/angular-modal-gallery/src/lib/components/accessible.component.ts","./projects/ks89/angular-modal-gallery/src/lib/components/background/background.html","./projects/ks89/angular-modal-gallery/src/lib/components/background/background.component.ts","./projects/ks89/angular-modal-gallery/src/lib/components/carousel/carousel-previews/carousel-previews.html","./projects/ks89/angular-modal-gallery/src/lib/components/carousel/carousel-previews/carousel-previews.component.ts","./projects/ks89/angular-modal-gallery/src/lib/directives/max-size.directive.ts","./projects/ks89/angular-modal-gallery/src/lib/components/carousel/carousel.html","./projects/ks89/angular-modal-gallery/src/lib/components/carousel/carousel.component.ts","./projects/ks89/angular-modal-gallery/src/lib/components/comments/comment/comment.component.html","./projects/ks89/angular-modal-gallery/src/lib/components/comments/comment/comment.component.ts","./projects/ks89/angular-modal-gallery/src/lib/components/comments/comments.component.html","./projects/ks89/angular-modal-gallery/src/lib/components/comments/comments.component.ts","./projects/ks89/angular-modal-gallery/src/lib/components/comments/sender/sender.component.html","./projects/ks89/angular-modal-gallery/src/lib/components/comments/sender/sender.component.ts","./projects/ks89/angular-modal-gallery/src/lib/model/keyboard.enum.ts","./projects/ks89/angular-modal-gallery/src/lib/directives/keyboard-navigation.directive.ts","./projects/ks89/angular-modal-gallery/src/lib/components/current-image/current-image.html","./projects/ks89/angular-modal-gallery/src/lib/components/current-image/current-image.component.ts","./projects/ks89/angular-modal-gallery/src/lib/components/current-image/loading-spinner/loading-spinner.html","./projects/ks89/angular-modal-gallery/src/lib/components/current-image/loading-spinner/loading-spinner.component.ts","./projects/ks89/angular-modal-gallery/src/lib/components/dots/dots.html","./projects/ks89/angular-modal-gallery/src/lib/components/dots/dots.component.ts","./projects/ks89/angular-modal-gallery/src/lib/components/info-block/info-block.component.html","./projects/ks89/angular-modal-gallery/src/lib/components/info-block/info-block.component.ts","./projects/ks89/angular-modal-gallery/src/lib/components/info-block/info/info.component.html","./projects/ks89/angular-modal-gallery/src/lib/components/info-block/info/info.component.ts","./projects/ks89/angular-modal-gallery/src/lib/services/id-validator.service.ts","./projects/ks89/angular-modal-gallery/src/lib/directives/click-outside.directive.ts","./projects/ks89/angular-modal-gallery/src/lib/components/modal-gallery/modal-gallery.html","./projects/ks89/angular-modal-gallery/src/lib/components/modal-gallery/modal-gallery.component.ts","./projects/ks89/angular-modal-gallery/src/lib/directives/wrap.directive.ts","./projects/ks89/angular-modal-gallery/src/lib/directives/direction.directive.ts","./projects/ks89/angular-modal-gallery/src/lib/components/plain-gallery/plain-gallery.html","./projects/ks89/angular-modal-gallery/src/lib/components/plain-gallery/plain-gallery.component.ts","./projects/ks89/angular-modal-gallery/src/lib/components/previews/previews.html","./projects/ks89/angular-modal-gallery/src/lib/components/previews/previews.component.ts","./projects/ks89/angular-modal-gallery/src/lib/components/upper-buttons/upper-buttons-default.ts","./projects/ks89/angular-modal-gallery/src/lib/components/upper-buttons/upper-buttons.html","./projects/ks89/angular-modal-gallery/src/lib/components/upper-buttons/upper-buttons.component.ts","./projects/ks89/angular-modal-gallery/src/lib/directives/a-tag-bg-image.directive.ts","./projects/ks89/angular-modal-gallery/src/lib/directives/description.directive.ts","./projects/ks89/angular-modal-gallery/src/lib/directives/size.directive.ts","./projects/ks89/angular-modal-gallery/src/lib/directives/slim-scroll.directive.ts","./projects/ks89/angular-modal-gallery/src/lib/modal-gallery.module.ts","./projects/ks89/angular-modal-gallery/src/lib/model/action.enum.ts","./projects/ks89/angular-modal-gallery/src/lib/model/buttons-config.interface.ts","./projects/ks89/angular-modal-gallery/src/lib/model/description.interface.ts","./projects/ks89/angular-modal-gallery/src/lib/model/image.class.ts","./projects/ks89/angular-modal-gallery/src/lib/model/loading-config.interface.ts","./projects/ks89/angular-modal-gallery/src/lib/model/plain-gallery-config.interface.ts","./projects/ks89/angular-modal-gallery/src/lib/services/gallery.service.ts","./projects/ks89/angular-modal-gallery/src/lib/services/keyboard.service.ts","./projects/ks89/angular-modal-gallery/src/lib/utils/image.util.ts","./projects/ks89/angular-modal-gallery/src/lib/utils/user-input.util.ts","./projects/yamapng/src/lib/core.module.ts","./projects/yamapng/src/lib/directives/marker.ts","./projects/yamapng/src/lib/directives/ymap.ts","./projects/yamapng/src/lib/services/managers/claster-manager.ts","./projects/yamapng/src/lib/services/managers/marker-manager.ts","./projects/yamapng/src/lib/services/managers/objectManager-manager.ts","./projects/yamapng/src/lib/services/ya-maps-loader.ts","./projects/yamapng/src/lib/utils/browser-globals.ts","./projects/yamapng/src/lib/ya-maps-api-wrapper.ts","./src/app/core/guards/auth.guard.ts","./src/app/core/guards/can-activate-team.resolver.ts","./src/app/core/guards/permissions.resolver.ts","./src/app/core/guards/no-auth.guard.ts","./src/app/core/model/user.model.ts","./src/app/core/model/project.model.ts","./src/app/core/model/route-plan.model.ts","./src/app/core/model/table-filters.model.ts","./src/app/core/model/store.model.ts","./src/app/core/model/worked-days.model.ts","./src/app/core/model/project-store.model.ts","./src/app/core/model/visit.model.ts","./src/app/core/model/application.model.ts","./src/app/core/model/visit-period-rule.model.ts","./src/app/core/services/declarations.service.ts","./src/app/core/services/helpers.service.ts","./src/app/core/services/http.service.ts","./src/app/core/services/user.service.ts","./src/app/core/services/project.service.ts","./src/app/core/services/permissions.service.ts","./src/app/core/services/photo-report-notification.service.ts","./src/app/core/services/report-notification.service.ts","./src/app/shared/dx-shared.module.ts","./src/environments/environment.ts","./src/environments/.env.ts","./src/app/core/const/animations.const.ts","./src/app/core/const/whitelistedDomains.const.ts","./src/app/layouts/header/header.component.html","./src/app/layouts/header/header.component.ts","./src/app/layouts/nav/nav.component.html","./src/app/layouts/nav/nav.component.ts","./src/app/layouts/body/body.component.html","./src/app/layouts/body/body.component.ts","./src/app/layouts/auth-layout/auth-layout.component.ts","./src/app/layouts/auth-layout/auth-layout.component.html","./src/app/shared/routes/pages.routes.ts","./src/app/core/guards/user.resolver.ts","./src/app/app-routing.module.ts","./src/app/app.component.ts","./src/app/app.component.html","./src/app/core/interceptors/token.interceptor.ts","./src/app/core/core.module.ts","./projects/yamapng/src/lib/yamapng.module.ts","./src/app/app.module.ts","./src/main.ts"],"sourcesContent":["import { AccessibilityConfig } from '../model/accessibility.interface';\r\n\r\n/**\r\n * Default accessibility configuration.\r\n */\r\nexport const KS_DEFAULT_ACCESSIBILITY_CONFIG: AccessibilityConfig = {\r\n backgroundAriaLabel: 'Modal gallery full screen background',\r\n backgroundTitle: '',\r\n\r\n plainGalleryContentAriaLabel: 'Plain gallery content',\r\n plainGalleryContentTitle: '',\r\n\r\n modalGalleryContentAriaLabel: 'Modal gallery content',\r\n modalGalleryContentTitle: '',\r\n\r\n loadingSpinnerAriaLabel: 'The current image is loading. Please be patient.',\r\n loadingSpinnerTitle: 'The current image is loading. Please be patient.',\r\n\r\n mainContainerAriaLabel: 'Current image and navigation',\r\n mainContainerTitle: '',\r\n mainPrevImageAriaLabel: 'Previous image',\r\n mainPrevImageTitle: 'Previous image',\r\n mainNextImageAriaLabel: 'Next image',\r\n mainNextImageTitle: 'Next image',\r\n\r\n dotsContainerAriaLabel: 'Image navigation dots',\r\n dotsContainerTitle: '',\r\n dotAriaLabel: 'Navigate to image number',\r\n\r\n previewsContainerAriaLabel: 'Image previews',\r\n previewsContainerTitle: '',\r\n previewScrollPrevAriaLabel: 'Scroll previous previews',\r\n previewScrollPrevTitle: 'Scroll previous previews',\r\n previewScrollNextAriaLabel: 'Scroll next previews',\r\n previewScrollNextTitle: 'Scroll next previews',\r\n\r\n carouselContainerAriaLabel: 'Current image and navigation',\r\n carouselContainerTitle: '',\r\n carouselPrevImageAriaLabel: 'Previous image',\r\n carouselPrevImageTitle: 'Previous image',\r\n carouselNextImageAriaLabel: 'Next image',\r\n carouselNextImageTitle: 'Next image',\r\n carouselPreviewsContainerAriaLabel: 'Image previews',\r\n carouselPreviewsContainerTitle: '',\r\n carouselPreviewScrollPrevAriaLabel: 'Scroll previous previews',\r\n carouselPreviewScrollPrevTitle: 'Scroll previous previews',\r\n carouselPreviewScrollNextAriaLabel: 'Scroll next previews',\r\n carouselPreviewScrollNextTitle: 'Scroll next previews'\r\n};\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\nimport {\r\n DIRECTION_RIGHT,\r\n ENTER_CODE,\r\n MOUSE_MAIN_BUTTON_CLICK,\r\n NEXT,\r\n NOTHING,\r\n PREV,\r\n SPACE_CODE\r\n} from '../utils/user-input.util';\r\n\r\n/**\r\n * Provides some useful methods to add accessibility features to subclasses.\r\n * In particular, it exposes a method to handle navigation event with both Keyboard and Mouse\r\n * and another with also the direction (right or left).\r\n *\r\n * Предоставляет несколько полезных методов для добавления специальных возможностей к подклассам.\r\n * В частности, метод обработки событий навигации с помощью клавиатуры и мыши\r\n * и еще один с направлением (вправо или влево)\r\n */\r\n@Component({\r\n selector: 'ks-accessible',\r\n template: ``,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class AccessibleComponent {\r\n constructor() {}\r\n\r\n /**\r\n * Method to handle navigation events with both Keyboard and Mouse.\r\n * @param string direction of the navigation that can be either 'next' or 'prev'\r\n * @param KeyboardEvent | MouseEvent event payload\r\n * @returns number -1 for PREV, 1 for NEXT and 0 for NOTHING\r\n */\r\n handleNavigationEvent(direction: string, event: KeyboardEvent | MouseEvent): number {\r\n if (!event) {\r\n return NOTHING;\r\n }\r\n if (event instanceof KeyboardEvent) {\r\n return this.handleKeyboardNavigationEvent(direction, event);\r\n } else if (event instanceof MouseEvent) {\r\n return this.handleMouseNavigationEvent(direction, event);\r\n }\r\n return NOTHING;\r\n }\r\n\r\n /**\r\n * Method to handle events over an image, for instance a keypress with the Keyboard or a Mouse click.\r\n * @param KeyboardEvent | MouseEvent event payload\r\n * @returns number 1 for NEXT and 0 for NOTHING\r\n */\r\n handleImageEvent(event: KeyboardEvent | MouseEvent): number {\r\n if (!event) {\r\n return NOTHING;\r\n }\r\n if (event instanceof KeyboardEvent) {\r\n return this.handleImageKeyboardEvent(event);\r\n } else if (event instanceof MouseEvent) {\r\n return this.handleImageMouseEvent(event);\r\n }\r\n return NOTHING;\r\n }\r\n\r\n /**\r\n * Private method to handle keyboard events over an image.\r\n * @param KeyboardEvent event payload\r\n * @returns number 1 for NEXT and 0 for NOTHING\r\n */\r\n private handleImageKeyboardEvent(event: KeyboardEvent): number {\r\n const key: string = event.code;\r\n if (key === SPACE_CODE || key === ENTER_CODE) {\r\n return NEXT;\r\n }\r\n return NOTHING;\r\n }\r\n\r\n /**\r\n * Private method to handle mouse events over an image.\r\n * @param MouseEvent event payload\r\n * @returns number 1 for NEXT and 0 for NOTHING\r\n */\r\n private handleImageMouseEvent(event: MouseEvent): number {\r\n const mouseBtn: number = event.button;\r\n if (mouseBtn === MOUSE_MAIN_BUTTON_CLICK) {\r\n return NEXT;\r\n }\r\n return NOTHING;\r\n }\r\n\r\n /**\r\n * Method to handle events over an image, for instance a keypress with the Keyboard or a Mouse click.\r\n * @param string direction of the navigation that can be either 'next' or 'prev'\r\n * @param KeyboardEvent event payload\r\n * @returns number -1 for PREV, 1 for NEXT and 0 for NOTHING\r\n */\r\n private handleKeyboardNavigationEvent(direction: string, event: KeyboardEvent): number {\r\n const key: string = event.code;\r\n if (key === SPACE_CODE || key === ENTER_CODE) {\r\n return direction === DIRECTION_RIGHT ? NEXT : PREV;\r\n }\r\n return NOTHING;\r\n }\r\n\r\n /**\r\n * Method to handle events over an image, for instance a keypress with the Keyboard or a Mouse click.\r\n * @param string direction of the navigation that can be either 'next' or 'prev'\r\n * @param MouseEvent event payload\r\n * @returns number -1 for PREV, 1 for NEXT and 0 for NOTHING\r\n */\r\n private handleMouseNavigationEvent(direction: string, event: MouseEvent): number {\r\n const mouseBtn: number = event.button;\r\n if (mouseBtn === MOUSE_MAIN_BUTTON_CLICK) {\r\n return direction === DIRECTION_RIGHT ? NEXT : PREV;\r\n }\r\n return NOTHING;\r\n }\r\n}\r\n","
\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\nimport { AccessibilityConfig } from '../../model/accessibility.interface';\r\n\r\n/**\r\n * Component with the semi-transparent background.\r\n */\r\n@Component({\r\n selector: 'ks-background',\r\n styleUrls: ['background.scss'],\r\n templateUrl: 'background.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class BackgroundComponent {\r\n /**\r\n * Boolean that it is true if the modal gallery is visible,\r\n * so also this component should be visible.\r\n */\r\n @Input()\r\n isOpen: boolean;\r\n /**\r\n * Object of type `AccessibilityConfig` to init custom accessibility features.\r\n * For instance, it contains titles, alt texts, aria-labels and so on.\r\n */\r\n @Input()\r\n accessibilityConfig: AccessibilityConfig;\r\n}\r\n","\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostBinding, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChange, SimpleChanges } from '@angular/core';\r\nimport { DomSanitizer, SafeStyle } from '@angular/platform-browser';\r\nimport { BreakpointObserver, Breakpoints, BreakpointState } from '@angular/cdk/layout';\r\n\r\n\r\nimport { AccessibleComponent } from '../../accessible.component';\r\n\r\nimport { AccessibilityConfig } from '../../../model/accessibility.interface';\r\nimport { Image, ImageEvent } from '../../../model/image.class';\r\nimport { InternalLibImage } from '../../../model/image-internal.class';\r\nimport { BreakpointsConfig, CarouselPreviewConfig } from '../../../model/carousel-preview-config.interface';\r\nimport { CarouselConfig } from '../../../model/carousel-config.interface';\r\n\r\nimport { NEXT, PREV } from '../../../utils/user-input.util';\r\nimport { getIndex } from '../../../utils/image.util';\r\nimport { Action } from '../../../model/action.enum';\r\nimport { Subscription } from 'rxjs';\r\n\r\n/**\r\n * Component with image previews for carousel\r\n */\r\n@Component({\r\n selector: 'ks-carousel-previews',\r\n styleUrls: ['carousel-previews.scss', '../../previews-arrows.scss'],\r\n templateUrl: 'carousel-previews.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CarouselPreviewsComponent extends AccessibleComponent implements OnInit, OnChanges, OnDestroy {\r\n /**\r\n * Variable to change the max-width of the host component\r\n */\r\n @HostBinding('style.max-width')\r\n hostMaxWidth = '100%';\r\n\r\n /**\r\n * Variable to set aria-label of the host component\r\n */\r\n @HostBinding('attr.aria-label')\r\n ariaLabel = `Carousel previews`;\r\n\r\n /**\r\n * Object of type `CarouselConfig` to init CarouselComponent's features.\r\n * For instance, it contains parameters to change the style, how it navigates and so on.\r\n */\r\n @Input()\r\n carouselConfig: CarouselConfig;\r\n /**\r\n * Object of type `InternalLibImage` that represent the visible image.\r\n */\r\n @Input()\r\n currentImage: InternalLibImage;\r\n /**\r\n * Array of `InternalLibImage` that represent the model of this library with all images,\r\n * thumbs and so on.\r\n */\r\n @Input()\r\n images: InternalLibImage[];\r\n /**\r\n * Object of type `CarouselPreviewConfig` to init PreviewsComponent's features.\r\n * For instance, it contains a param to show/hide this component, sizes.\r\n */\r\n @Input()\r\n previewConfig: CarouselPreviewConfig;\r\n /**\r\n * Object of type `AccessibilityConfig` to init custom accessibility features.\r\n * For instance, it contains titles, alt texts, aria-labels and so on.\r\n */\r\n @Input()\r\n accessibilityConfig: AccessibilityConfig;\r\n /**\r\n * Output to emit the clicked preview. The payload contains the `InternalLibImage` associated to the clicked preview.\r\n */\r\n @Output()\r\n clickPreview: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Enum of type `Action` that represents a mouse click on a button.\r\n * Declared here to be used inside the template.\r\n */\r\n clickAction: Action = Action.CLICK;\r\n /**\r\n * Enum of type `Action` that represents a keyboard action.\r\n * Declared here to be used inside the template.\r\n */\r\n keyboardAction: Action = Action.KEYBOARD;\r\n /**\r\n * Array of `InternalLibImage` exposed to the template. This field is initialized\r\n * applying transformations, default values and so on to the input of the same type.\r\n */\r\n previews: InternalLibImage[] = [];\r\n /**\r\n * Object of type `CarouselPreviewConfig` exposed to the template. This field is initialized\r\n * applying transformations, default values and so on to the input of the same type.\r\n */\r\n configPreview: CarouselPreviewConfig;\r\n\r\n /**\r\n * Start index (inclusive) of the input images used to display previews.\r\n */\r\n start: number;\r\n /**\r\n * End index (non inclusive) of the input images used to display previews.\r\n */\r\n end: number;\r\n\r\n /**\r\n * Private property with the default max height of previews.\r\n */\r\n private defaultMaxHeight = '200px';\r\n\r\n private breakpointSubscription: Subscription;\r\n\r\n constructor(\r\n private ref: ChangeDetectorRef,\r\n private breakpointObserver: BreakpointObserver,\r\n // sanitizer is used only to sanitize style before add it to background property when legacyIE11Mode is enabled\r\n private sanitizer: DomSanitizer\r\n ) {\r\n super();\r\n\r\n // listen for width changes and update preview heights accordingly\r\n this.breakpointSubscription = breakpointObserver\r\n .observe([Breakpoints.XSmall, Breakpoints.Small, Breakpoints.Medium, Breakpoints.Large, Breakpoints.XLarge])\r\n .subscribe((result: BreakpointState) => {\r\n if (!this.configPreview) {\r\n return;\r\n }\r\n if (result.breakpoints[Breakpoints.XSmall]) {\r\n this.updateHeight(this.configPreview.breakpoints.xSmall);\r\n } else if (result.breakpoints[Breakpoints.Small]) {\r\n this.updateHeight(this.configPreview.breakpoints.small);\r\n } else if (result.breakpoints[Breakpoints.Medium]) {\r\n this.updateHeight(this.configPreview.breakpoints.medium);\r\n } else if (result.breakpoints[Breakpoints.Large]) {\r\n this.updateHeight(this.configPreview.breakpoints.large);\r\n } else if (result.breakpoints[Breakpoints.XLarge]) {\r\n this.updateHeight(this.configPreview.breakpoints.xLarge);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Method to update the height of previews, passing the desired height as input.\r\n * @param configBreakpointHeight is a number that represent the desired height to set.\r\n */\r\n private updateHeight(configBreakpointHeight: number) {\r\n const newConfigPreview = Object.assign({}, this.configPreview);\r\n if (this.previewConfig && this.previewConfig.maxHeight) {\r\n const heightNum: number = +this.previewConfig.maxHeight.replace('px', '').replace('%', '');\r\n newConfigPreview.maxHeight = Math.min(configBreakpointHeight, heightNum) + 'px';\r\n } else {\r\n const heightNum: number = +this.defaultMaxHeight.replace('px', '').replace('%', '');\r\n newConfigPreview.maxHeight = Math.min(configBreakpointHeight, heightNum) + 'px';\r\n }\r\n this.configPreview = newConfigPreview;\r\n this.ref.markForCheck();\r\n }\r\n\r\n /**\r\n * Method ´ngOnInit´ to build `configPreview` applying a default value and also to\r\n * init the `previews` array.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called only one time!!!\r\n */\r\n ngOnInit() {\r\n const defaultBreakpoints: BreakpointsConfig = {xSmall: 100, small: 100, medium: 150, large: 200, xLarge: 200};\r\n const defaultPreviewConfig: CarouselPreviewConfig = {\r\n visible: true,\r\n number: 4,\r\n arrows: true,\r\n clickable: true,\r\n width: 100 / 4 + '%',\r\n maxHeight: this.defaultMaxHeight,\r\n breakpoints: defaultBreakpoints\r\n };\r\n\r\n this.configPreview = Object.assign({}, defaultPreviewConfig, this.previewConfig);\r\n\r\n // if number is <= 0 reset to default\r\n if (this.configPreview && this.configPreview.number <= 0) {\r\n this.configPreview.number = defaultPreviewConfig.number;\r\n }\r\n\r\n // Init preview image width based on the number of previews in PreviewConfig\r\n // Don't move this line above, because I need to be sure that both configPreview.number\r\n // and configPreview.size are initialized\r\n this.configPreview.width = 100 / this.configPreview.number + '%';\r\n\r\n // change the max-width of this component if there is a specified width !== 100% in carouselConfig\r\n if (this.carouselConfig && this.carouselConfig.maxWidth !== '100%') {\r\n this.hostMaxWidth = this.carouselConfig.maxWidth;\r\n }\r\n\r\n // init previews based on currentImage and the full array of images\r\n this.initPreviews(this.currentImage, this.images);\r\n\r\n // apply custom height based on responsive breakpoints\r\n // This is required, because the breakpointSubscription is not triggered at creation,\r\n // but only when the width changes\r\n const isXsmallScreen = this.breakpointObserver.isMatched(Breakpoints.XSmall);\r\n const isSmallScreen = this.breakpointObserver.isMatched(Breakpoints.Small);\r\n const isMediumScreen = this.breakpointObserver.isMatched(Breakpoints.Medium);\r\n const isLargeScreen = this.breakpointObserver.isMatched(Breakpoints.Large);\r\n const isxLargeScreen = this.breakpointObserver.isMatched(Breakpoints.XLarge);\r\n if (isXsmallScreen) {\r\n this.updateHeight(this.configPreview.breakpoints.xSmall);\r\n } else if (isSmallScreen) {\r\n this.updateHeight(this.configPreview.breakpoints.small);\r\n } else if (isMediumScreen) {\r\n this.updateHeight(this.configPreview.breakpoints.medium);\r\n } else if (isLargeScreen) {\r\n this.updateHeight(this.configPreview.breakpoints.large);\r\n } else if (isxLargeScreen) {\r\n this.updateHeight(this.configPreview.breakpoints.xLarge);\r\n }\r\n }\r\n\r\n /**\r\n * Method to check if an image is active (i.e. a preview image).\r\n * @param InternalLibImage preview is an image to check if it's active or not\r\n * @returns boolean true if is active, false otherwise\r\n */\r\n isActive(preview: InternalLibImage): boolean {\r\n if (!preview || !this.currentImage) {\r\n return false;\r\n }\r\n return preview.id === this.currentImage.id;\r\n }\r\n\r\n /**\r\n * Method ´ngOnChanges´ to update `previews` array.\r\n * Also, both `start` and `end` local variables will be updated accordingly.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called when any data-bound property of a directive changes!!!\r\n */\r\n ngOnChanges(changes: SimpleChanges) {\r\n const simpleChange: SimpleChange = changes.currentImage;\r\n if (!simpleChange) {\r\n return;\r\n }\r\n\r\n const prev: InternalLibImage = simpleChange.previousValue;\r\n const current: InternalLibImage = simpleChange.currentValue;\r\n\r\n if (current && changes.images && changes.images.previousValue && changes.images.currentValue) {\r\n // I'm in this if statement, if input images are changed (for instance, because I removed one of them with the 'delete button',\r\n // or because users changed the images array while modal gallery is still open).\r\n // In this case, I have to re-init previews, because the input array of images is changed.\r\n this.initPreviews(current, changes.images.currentValue);\r\n }\r\n\r\n if (prev && current && prev.id !== current.id) {\r\n // to manage infinite sliding I have to reset both `start` and `end` at the beginning\r\n // to show again previews from the first image.\r\n // This happens when you navigate over the last image to return to the first one\r\n let prevIndex: number;\r\n let currentIndex: number;\r\n try {\r\n prevIndex = getIndex(prev, this.images);\r\n currentIndex = getIndex(current, this.images);\r\n } catch (err) {\r\n console.error('Cannot get previous and current image indexes in previews');\r\n throw err;\r\n }\r\n\r\n // apply a formula to get a values to be used to decide if go next, return back or stay without doing anything\r\n const calc = Math.floor((this.end - this.start) / 2) + this.start;\r\n\r\n if (prevIndex === this.images.length - 1 && currentIndex === 0) {\r\n // first image\r\n this.setBeginningIndexesPreviews();\r\n this.previews = this.images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\r\n return;\r\n }\r\n // the same for the opposite case, when you navigate back from the fist image to go to the last one.\r\n if (prevIndex === 0 && currentIndex === this.images.length - 1) {\r\n // last image\r\n this.setEndIndexesPreviews();\r\n this.previews = this.images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\r\n return;\r\n }\r\n\r\n if (this.configPreview.number % 2 === 0) {\r\n if (calc > currentIndex) {\r\n this.previous();\r\n } else {\r\n this.next();\r\n }\r\n } else {\r\n if (calc > currentIndex) {\r\n this.previous();\r\n }\r\n if (calc < currentIndex) {\r\n this.next();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Method called by events from both keyboard and mouse on a preview.\r\n * This will trigger the `clickpreview` output with the input preview as its payload.\r\n * @param InternalLibImage preview that triggered this method\r\n * @param KeyboardEvent | MouseEvent event payload\r\n * @param Action that triggered this event (Action.NORMAL by default)\r\n */\r\n onImageEvent(preview: InternalLibImage, event: KeyboardEvent | MouseEvent, action: Action = Action.NORMAL) {\r\n if (!this.configPreview || !this.configPreview.clickable) {\r\n return;\r\n }\r\n const clickedImageIndex: number = this.images.indexOf(preview);\r\n const result: number = super.handleImageEvent(event);\r\n if (result === NEXT) {\r\n this.clickPreview.emit({action: action, result: clickedImageIndex});\r\n } else if (result === PREV) {\r\n this.clickPreview.emit({action: action, result: clickedImageIndex});\r\n }\r\n }\r\n\r\n /**\r\n * Method called by events from both keyboard and mouse on a navigation arrow.\r\n * @param string direction of the navigation that can be either 'next' or 'prev'\r\n * @param KeyboardEvent | MouseEvent event payload\r\n */\r\n onNavigationEvent(direction: string, event: KeyboardEvent | MouseEvent) {\r\n const result: number = super.handleNavigationEvent(direction, event);\r\n if (result === NEXT) {\r\n this.next();\r\n } else if (result === PREV) {\r\n this.previous();\r\n }\r\n }\r\n\r\n /**\r\n * Method to get aria-label text for a preview image.\r\n * @param Image is the preview\r\n */\r\n getAriaLabel(preview: Image): string {\r\n if (!preview.plain) {\r\n return preview.modal.ariaLabel || '';\r\n }\r\n return preview.plain.ariaLabel || preview.modal.ariaLabel || '';\r\n }\r\n\r\n /**\r\n * Method to get title text for a preview image.\r\n * @param Image is the preview\r\n */\r\n getTitle(preview: Image): string {\r\n if (!preview.plain) {\r\n return preview.modal.title || '';\r\n }\r\n return preview.plain.title || preview.modal.title || '';\r\n }\r\n\r\n /**\r\n * Method to get alt text for a preview image.\r\n * @param Image is the preview\r\n */\r\n getAlt(preview: Image): string {\r\n if (!preview.plain) {\r\n return preview.modal.alt || '';\r\n }\r\n return preview.plain.alt || preview.modal.alt || '';\r\n }\r\n\r\n /**\r\n * Method used in the template to track ids in ngFor.\r\n * @param number index of the array\r\n * @param Image item of the array\r\n * @returns number the id of the item\r\n */\r\n trackById(index: number, item: Image): number {\r\n return item.id;\r\n }\r\n\r\n /**\r\n * Method used in template to sanitize an url when you need legacyIE11Mode.\r\n * In this way you can set an url as background of a div.\r\n * @param unsafeStyle is a string and represents the url to sanitize.\r\n * @returns a SafeStyle object that can be used in template without problems.\r\n */\r\n sanitizeUrlBgStyle(unsafeStyle: string): SafeStyle {\r\n // Method used only to sanitize background-image style before add it to background property when legacyIE11Mode is enabled\r\n return this.sanitizer.bypassSecurityTrustStyle('url(' + unsafeStyle + ')');\r\n }\r\n\r\n /**\r\n * Method to get the background-size value when IE11LegacyMode is enabled.\r\n * This prevent weired behaviour on IE11 when previews are really small, but original images (.png/.jgp/...) are big.\r\n * Using 'cover' it's not enough, because it's causing empty background in some cases.\r\n * After some experiments, I decided to use the double of the height and auto as width.\r\n */\r\n getIE11LegacyBgSize(): string {\r\n if (this.configPreview && this.configPreview.maxHeight) {\r\n const bgHeight: number = +this.configPreview.maxHeight.replace('px', '');\r\n return '100% ' + bgHeight * 2 + 'px';\r\n }\r\n return 'cover';\r\n }\r\n\r\n /**\r\n * Method to cleanup resources. In fact, it cleans breakpointSubscription.\r\n * This is an Angular's lifecycle hook that is called when this component is destroyed.\r\n */\r\n ngOnDestroy(): void {\r\n if (this.breakpointSubscription) {\r\n this.breakpointSubscription.unsubscribe();\r\n }\r\n }\r\n\r\n /**\r\n * Private method to init previews based on the currentImage and the full array of images.\r\n * The current image in mandatory to show always the current preview (as highlighted).\r\n * @param InternalLibImage currentImage to decide how to show previews, because I always want to see the current image as highlighted\r\n * @param InternalLibImage[] images is the array of all images.\r\n */\r\n private initPreviews(currentImage: InternalLibImage, images: InternalLibImage[]) {\r\n let index: number;\r\n try {\r\n index = getIndex(currentImage, images);\r\n } catch (err) {\r\n throw err;\r\n }\r\n switch (index) {\r\n case 0:\r\n // first image\r\n this.setBeginningIndexesPreviews();\r\n break;\r\n case images.length - 1:\r\n // last image\r\n this.setEndIndexesPreviews();\r\n break;\r\n // default:\r\n // // other images\r\n // // TODO unused because it starts always at image 0\r\n // this.setIndexesPreviews();\r\n // break;\r\n }\r\n this.previews = images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\r\n }\r\n\r\n /**\r\n * Private method to init both `start` and `end` to the beginning.\r\n */\r\n private setBeginningIndexesPreviews() {\r\n this.start = 0;\r\n this.end = Math.min(this.configPreview.number, this.images.length);\r\n }\r\n\r\n /**\r\n * Private method to init both `start` and `end` to the end.\r\n */\r\n private setEndIndexesPreviews() {\r\n this.start = this.images.length - 1 - (this.configPreview.number - 1);\r\n this.end = this.images.length;\r\n }\r\n\r\n /**\r\n * Private method to update the visible previews navigating to the right (next).\r\n */\r\n private next() {\r\n // check if nextImage should be blocked\r\n if (this.isPreventSliding(this.images.length - 1)) {\r\n return;\r\n }\r\n\r\n if (this.end === this.images.length) {\r\n return;\r\n }\r\n\r\n this.start++;\r\n this.end = Math.min(this.end + 1, this.images.length);\r\n\r\n this.previews = this.images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\r\n }\r\n\r\n /**\r\n * Private method to update the visible previews navigating to the left (previous).\r\n */\r\n private previous() {\r\n // check if prevImage should be blocked\r\n if (this.isPreventSliding(0)) {\r\n return;\r\n }\r\n\r\n if (this.start === 0) {\r\n return;\r\n }\r\n\r\n this.start = Math.max(this.start - 1, 0);\r\n this.end = Math.min(this.end - 1, this.images.length);\r\n\r\n this.previews = this.images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\r\n }\r\n\r\n /**\r\n * Private method to block/permit sliding between previews.\r\n * @param number boundaryIndex is the first or the last index of `images` input array\r\n * @returns boolean if true block sliding, otherwise not\r\n */\r\n private isPreventSliding(boundaryIndex: number): boolean {\r\n return getIndex(this.currentImage, this.images) === boundaryIndex;\r\n }\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { Directive, ElementRef, Input, OnChanges, OnInit, Renderer2 } from '@angular/core';\r\nimport { MaxSize } from '../model/max-size.interface';\r\n\r\n/**\r\n * Directive to change the max size of an element.\r\n */\r\n@Directive({\r\n selector: '[ksMaxSize]'\r\n})\r\nexport class MaxSizeDirective implements OnInit, OnChanges {\r\n /**\r\n * Object of type `MaxSize` to resize the element.\r\n */\r\n @Input()\r\n sizeConfig: MaxSize;\r\n\r\n constructor(private renderer: Renderer2, private el: ElementRef) {\r\n }\r\n\r\n /**\r\n * Method ´ngOnInit´ to apply the style of this directive.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called only one time!!!\r\n */\r\n ngOnInit() {\r\n this.applyStyle();\r\n }\r\n\r\n /**\r\n * Method ´ngOnChanges´ to apply the style of this directive.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called when any data-bound property of a directive changes!!!\r\n */\r\n ngOnChanges() {\r\n this.applyStyle();\r\n }\r\n\r\n /**\r\n * Private method to change both max-width and max-height of an element.\r\n */\r\n private applyStyle() {\r\n if (!this.sizeConfig) {\r\n return;\r\n }\r\n if (this.sizeConfig.maxWidth) {\r\n this.renderer.setStyle(this.el.nativeElement, 'max-width', this.sizeConfig.maxWidth);\r\n }\r\n if (this.sizeConfig.maxHeight) {\r\n this.renderer.setStyle(this.el.nativeElement, 'max-height', this.sizeConfig.maxHeight);\r\n }\r\n }\r\n}\r\n","
\r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n
\r\n\r\n \r\n \r\n \r\n\r\n \r\n\r\n \"{{currentImage.modal.alt\r\n\r\n
\r\n\r\n \r\n \r\n \r\n\r\n
\r\n \r\n
\r\n\r\n
\r\n\r\n \r\n \r\n
\r\n\r\n \r\n
\r\n \r\n\r\n \r\n\r\n
\r\n\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n\r\n
\r\n \r\n
\r\n\r\n \r\n
\r\n\r\n
\r\n\r\n\r\n\r\n\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\n// The idea to create a carousel with two Subjects came from ng-bootstrap\r\n// So a big thank you to the ng-bootstrap team for the interesting implementation that I used here with some customizations.\r\n\r\nimport { AfterContentInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostBinding, HostListener, Inject, Input, NgZone, OnChanges, OnDestroy, OnInit, Output, PLATFORM_ID, SimpleChange, SimpleChanges } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\nimport { Subject, timer } from 'rxjs';\r\nimport { filter, map, switchMap, takeUntil } from 'rxjs/operators';\r\n\r\nimport { AccessibleComponent } from '../accessible.component';\r\n\r\nimport { AccessibilityConfig } from '../../model/accessibility.interface';\r\nimport { Image, ImageEvent, ImageModalEvent } from '../../model/image.class';\r\nimport { Action } from '../../model/action.enum';\r\nimport { getIndex } from '../../utils/image.util';\r\nimport { NEXT, PREV } from '../../utils/user-input.util';\r\nimport { Description, DescriptionStrategy, DescriptionStyle } from '../../model/description.interface';\r\nimport { DotsConfig } from '../../model/dots-config.interface';\r\nimport { KS_DEFAULT_ACCESSIBILITY_CONFIG } from '../accessibility-default';\r\nimport { GalleryService } from '../../services/gallery.service';\r\nimport { AdvancedLayout, PlainGalleryConfig, PlainGalleryStrategy } from '../../model/plain-gallery-config.interface';\r\nimport { PlayConfig } from '../../model/play-config.interface';\r\nimport { CarouselConfig } from '../../model/carousel-config.interface';\r\nimport { CarouselImageConfig } from '../../model/carousel-image-config.interface';\r\nimport { DomSanitizer, SafeStyle } from '@angular/platform-browser';\r\nimport { CarouselPreviewConfig } from '../../model/carousel-preview-config.interface';\r\n\r\n/**\r\n * Component with configurable inline/plain carousel.\r\n */\r\n@Component({\r\n selector: 'ks-carousel',\r\n styleUrls: ['carousel.scss', '../image-arrows.scss'],\r\n templateUrl: 'carousel.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CarouselComponent extends AccessibleComponent implements OnInit, AfterContentInit, OnDestroy, OnChanges {\r\n /**\r\n * Attribute to set ariaLabel of the host component\r\n */\r\n @HostBinding('attr.aria-label')\r\n ariaLabel = `Carousel`;\r\n /**\r\n * Unique id (>=0) of the current instance of the carousel. This is useful when you are using\r\n * the carousel's feature to open modal gallery.\r\n */\r\n @Input()\r\n id: number;\r\n /**\r\n * Array of `InternalLibImage` that represent the model of this library with all images,\r\n * thumbs and so on.\r\n */\r\n @Input()\r\n images: Image[];\r\n /**\r\n * Object of type `CarouselConfig` to init CarouselComponent's features.\r\n * For instance, it contains parameters to change the style, how it navigates and so on.\r\n */\r\n @Input()\r\n carouselConfig: CarouselConfig;\r\n /**\r\n * Object of type `PlayConfig` to init CarouselComponent's features about auto-play.\r\n * For instance, it contains parameters to enable/disable autoPlay, interval and so on.\r\n */\r\n @Input()\r\n playConfig: PlayConfig;\r\n /**\r\n * Interface to configure current image in carousel.\r\n * For instance you can change the description.\r\n */\r\n @Input()\r\n carouselImageConfig: CarouselImageConfig;\r\n /**\r\n * Object of type `DotsConfig` to init DotsComponent's features.\r\n * For instance, it contains a param to show/hide this component.\r\n */\r\n @Input()\r\n dotsConfig: DotsConfig = {visible: true};\r\n /**\r\n * Object of type `CarouselPreviewConfig` to init PreviewsComponent's features.\r\n * For instance, it contains a param to show/hide previews, change sizes and so on.\r\n */\r\n @Input()\r\n previewConfig: CarouselPreviewConfig;\r\n /**\r\n * boolean to enable/disable infinite sliding. Enabled by default.\r\n */\r\n @Input()\r\n infinite = true;\r\n /**\r\n * Object of type `AccessibilityConfig` to init custom accessibility features.\r\n * For instance, it contains titles, alt texts, aria-labels and so on.\r\n */\r\n @Input()\r\n accessibilityConfig: AccessibilityConfig = KS_DEFAULT_ACCESSIBILITY_CONFIG;\r\n\r\n /**\r\n * Output to emit an event when an image is changed.\r\n */\r\n @Output()\r\n show: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit an event when the current image is the first one.\r\n */\r\n @Output()\r\n firstImage: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit an event when the current image is the last one.\r\n */\r\n @Output()\r\n lastImage: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Enum of type `Action` that represents a mouse click on a button.\r\n * Declared here to be used inside the template.\r\n */\r\n clickAction: Action = Action.CLICK;\r\n /**\r\n * Enum of type `Action` that represents a keyboard action.\r\n * Declared here to be used inside the template.\r\n */\r\n keyboardAction: Action = Action.KEYBOARD;\r\n /**\r\n * `Image` that is visible right now.\r\n */\r\n currentImage: Image;\r\n /**\r\n * Object of type `CarouselConfig` exposed to the template. This field is initialized\r\n * applying transformations, default values and so on to the input of the same type.\r\n */\r\n configCarousel: CarouselConfig;\r\n /**\r\n * Object of type `PlayConfig` exposed to the template. This field is initialized\r\n * applying transformations, default values and so on to the input of the same type.\r\n */\r\n configPlay: PlayConfig;\r\n /**\r\n * Object of type `CarouselImageConfig` exposed to the template. This field is initialized\r\n * applying transformations, default values and so on to the input of the same type.\r\n */\r\n configCurrentImageCarousel: CarouselImageConfig;\r\n /**\r\n * Object of type `DotsConfig` exposed to the template. This field is initialized\r\n * applying transformations, default values and so on to the input of the same type.\r\n */\r\n configDots: DotsConfig;\r\n /**\r\n * Boolean that it's true when you are watching the first image (currently visible).\r\n * False by default\r\n */\r\n isFirstImage = false;\r\n /**\r\n * Boolean that it's true when you are watching the last image (currently visible).\r\n * False by default\r\n */\r\n isLastImage = false;\r\n /**\r\n * Object of type `PlainGalleryConfig` to force ks-modal-gallery to hide plain-gallery\r\n */\r\n plainGalleryHidden: PlainGalleryConfig = {\r\n strategy: PlainGalleryStrategy.CUSTOM,\r\n layout: new AdvancedLayout(-1, true)\r\n };\r\n\r\n /**\r\n * Subject to play the carousel.\r\n */\r\n private start$ = new Subject();\r\n /**\r\n * Subject to stop the carousel.\r\n */\r\n private stop$ = new Subject();\r\n\r\n /**\r\n * Private object without type to define all swipe actions used by hammerjs.\r\n */\r\n private SWIPE_ACTION = {\r\n LEFT: 'swipeleft',\r\n RIGHT: 'swiperight',\r\n UP: 'swipeup',\r\n DOWN: 'swipedown'\r\n };\r\n\r\n /**\r\n * Listener to stop the gallery when the mouse pointer is over the current image.\r\n */\r\n @HostListener('mouseenter')\r\n onMouseEnter() {\r\n if (!this.configPlay.pauseOnHover) {\r\n return;\r\n }\r\n this.stopCarousel();\r\n }\r\n\r\n /**\r\n * Listener to play the gallery when the mouse pointer leave the current image.\r\n */\r\n @HostListener('mouseleave')\r\n onMouseLeave() {\r\n if (!this.configPlay.pauseOnHover || !this.configPlay.autoPlay) {\r\n return;\r\n }\r\n this.playCarousel();\r\n }\r\n\r\n /**\r\n * Listener to navigate carousel images with keyboard (left).\r\n */\r\n @HostListener('keydown.arrowLeft')\r\n onKeyDownLeft() {\r\n if (!this.configCarousel.keyboardEnable) {\r\n return;\r\n }\r\n this.prevImage();\r\n }\r\n\r\n /**\r\n * Listener to navigate carousel images with keyboard (right).\r\n */\r\n @HostListener('keydown.arrowRight')\r\n onKeyDownLRight() {\r\n if (!this.configCarousel.keyboardEnable) {\r\n return;\r\n }\r\n this.nextImage();\r\n }\r\n\r\n constructor(\r\n @Inject(PLATFORM_ID) private _platformId,\r\n private _ngZone: NgZone,\r\n private galleryService: GalleryService,\r\n private ref: ChangeDetectorRef,\r\n // sanitizer is used only to sanitize style before add it to background property when legacyIE11Mode is enabled\r\n private sanitizer: DomSanitizer\r\n ) {\r\n super();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // handle changes of dotsConfig\r\n const configDotsChange: SimpleChange = changes.dotsConfig;\r\n if (configDotsChange && configDotsChange.currentValue !== configDotsChange.previousValue) {\r\n this.configDots = configDotsChange.currentValue;\r\n }\r\n // handle changes of carouselConfig\r\n const carouselConfigChange: SimpleChange = changes.carouselConfig;\r\n if (carouselConfigChange && carouselConfigChange.currentValue !== carouselConfigChange.previousValue) {\r\n this.configCarousel = carouselConfigChange.currentValue;\r\n }\r\n // handle changes of playConfig starting/stopping the carousel accordingly\r\n const playConfigChange: SimpleChange = changes.playConfig;\r\n if (playConfigChange) {\r\n const playConfigChangePrev: PlayConfig = playConfigChange.previousValue;\r\n const playConfigChangeCurr: PlayConfig = playConfigChange.currentValue;\r\n if (playConfigChangePrev !== playConfigChangeCurr) {\r\n this.configPlay = playConfigChange.currentValue;\r\n // if autoplay is enabled, and this is not the\r\n // first change (to prevent multiple starts at the beginning)\r\n if (playConfigChangeCurr.autoPlay && !playConfigChange.isFirstChange()) {\r\n this.start$.next();\r\n } else {\r\n this.stopCarousel();\r\n }\r\n }\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.currentImage = this.images[0];\r\n\r\n const defaultDescriptionStyle: DescriptionStyle = {\r\n bgColor: 'rgba(0, 0, 0, .5)',\r\n textColor: 'white',\r\n marginTop: '0px',\r\n marginBottom: '0px',\r\n marginLeft: '0px',\r\n marginRight: '0px'\r\n };\r\n const defaultDescription: Description = {\r\n strategy: DescriptionStrategy.ALWAYS_HIDDEN,\r\n imageText: 'Image ',\r\n numberSeparator: '/',\r\n beforeTextDescription: ' - ',\r\n style: defaultDescriptionStyle\r\n };\r\n const defaultCurrentImageConfig: CarouselImageConfig = {\r\n description: defaultDescription,\r\n invertSwipe: false\r\n };\r\n const defaultCurrentCarouselConfig: CarouselConfig = {\r\n maxWidth: '100%',\r\n maxHeight: '400px',\r\n showArrows: true,\r\n objectFit: 'cover',\r\n keyboardEnable: true,\r\n modalGalleryEnable: false,\r\n legacyIE11Mode: false\r\n };\r\n const defaultCurrentCarouselPlay: PlayConfig = {\r\n autoPlay: true,\r\n interval: 5000,\r\n pauseOnHover: true\r\n };\r\n\r\n this.configCurrentImageCarousel = Object.assign({}, defaultCurrentImageConfig, this.carouselImageConfig);\r\n this.configCurrentImageCarousel.description = Object.assign({}, defaultDescription, this.configCurrentImageCarousel.description);\r\n\r\n const defaultConfig: DotsConfig = {visible: true};\r\n this.configDots = Object.assign(defaultConfig, this.dotsConfig);\r\n\r\n this.configCarousel = Object.assign({}, defaultCurrentCarouselConfig, this.carouselConfig);\r\n this.configPlay = Object.assign({}, defaultCurrentCarouselPlay, this.playConfig);\r\n\r\n // check values\r\n if (this.configPlay.interval <= 0) {\r\n throw new Error(`Carousel's interval must be a number >= 0`);\r\n }\r\n\r\n this.manageSlideConfig();\r\n }\r\n\r\n ngAfterContentInit() {\r\n // interval doesn't play well with SSR and protractor,\r\n // so we should run it in the browser and outside Angular\r\n if (isPlatformBrowser(this._platformId)) {\r\n this._ngZone.runOutsideAngular(() => {\r\n this.start$\r\n .pipe(\r\n map(() => this.configPlay.interval),\r\n filter(interval => interval > 0),\r\n switchMap(interval => timer(interval).pipe(takeUntil(this.stop$)))\r\n )\r\n .subscribe(() =>\r\n this._ngZone.run(() => {\r\n if (this.configPlay.autoPlay) {\r\n this.nextImage();\r\n }\r\n this.ref.markForCheck();\r\n })\r\n );\r\n\r\n this.start$.next();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Method used in template to sanitize an url when you need legacyIE11Mode.\r\n * In this way you can set an url as background of a div.\r\n * @param unsafeStyle is a string and represents the url to sanitize.\r\n * @returns a SafeStyle object that can be used in template without problems.\r\n */\r\n sanitizeUrlBgStyle(unsafeStyle: string): SafeStyle {\r\n // Method used only to sanitize background-image style before add it to background property when legacyIE11Mode is enabled\r\n return this.sanitizer.bypassSecurityTrustStyle('url(' + unsafeStyle + ')');\r\n }\r\n\r\n /**\r\n * Method called when a dot is clicked and used to update the current image.\r\n * @param number index of the clicked dot\r\n */\r\n onClickDot(index: number) {\r\n this.changeCurrentImage(this.images[index], Action.NORMAL);\r\n }\r\n\r\n /**\r\n * Method called by events from both keyboard and mouse on a navigation arrow.\r\n * @param string direction of the navigation that can be either 'next' or 'prev'\r\n * @param KeyboardEvent | MouseEvent event payload\r\n * @param Action action that triggered the event or `Action.NORMAL` if not provided\r\n */\r\n onNavigationEvent(direction: string, event: KeyboardEvent, action: Action = Action.NORMAL) {\r\n const result: number = super.handleNavigationEvent(direction, event);\r\n if (result === NEXT) {\r\n this.nextImage(action);\r\n } else if (result === PREV) {\r\n this.prevImage(action);\r\n }\r\n }\r\n\r\n /**\r\n * Method triggered when you click on the current image.\r\n * Also, if modalGalleryEnable is true, you can open the modal-gallery.\r\n */\r\n onClickCurrentImage() {\r\n if (!this.configCarousel.modalGalleryEnable) {\r\n return;\r\n }\r\n const index = getIndex(this.currentImage, this.images);\r\n this.galleryService.openGallery(this.id, index);\r\n }\r\n\r\n /**\r\n * Method to get the image description based on input params.\r\n * If you provide a full description this will be the visible description, otherwise,\r\n * it will be built using the `Description` object, concatenating its fields.\r\n * @param Image image to get its description. If not provided it will be the current image\r\n * @returns String description of the image (or the current image if not provided)\r\n * @throws an Error if description isn't available\r\n */\r\n getDescriptionToDisplay(image: Image = this.currentImage): string {\r\n if (!this.configCurrentImageCarousel || !this.configCurrentImageCarousel.description) {\r\n throw new Error('Description input must be a valid object implementing the Description interface');\r\n }\r\n\r\n const imageWithoutDescription: boolean = !image.modal || !image.modal.description || image.modal.description === '';\r\n\r\n switch (this.configCurrentImageCarousel.description.strategy) {\r\n case DescriptionStrategy.HIDE_IF_EMPTY:\r\n return imageWithoutDescription ? '' : image.modal.description + '';\r\n case DescriptionStrategy.ALWAYS_HIDDEN:\r\n return '';\r\n default:\r\n // ----------- DescriptionStrategy.ALWAYS_VISIBLE -----------------\r\n return this.buildTextDescription(image, imageWithoutDescription);\r\n }\r\n }\r\n\r\n /**\r\n * Method used by Hammerjs to support touch gestures (you can also invert the swipe direction with configCurrentImage.invertSwipe).\r\n * @param action String that represent the direction of the swipe action. 'swiperight' by default.\r\n */\r\n swipe(action = this.SWIPE_ACTION.RIGHT) {\r\n switch (action) {\r\n case this.SWIPE_ACTION.RIGHT:\r\n if (this.configCurrentImageCarousel.invertSwipe) {\r\n this.prevImage(Action.SWIPE);\r\n } else {\r\n this.nextImage(Action.SWIPE);\r\n }\r\n break;\r\n case this.SWIPE_ACTION.LEFT:\r\n if (this.configCurrentImageCarousel.invertSwipe) {\r\n this.nextImage(Action.SWIPE);\r\n } else {\r\n this.prevImage(Action.SWIPE);\r\n }\r\n break;\r\n // case this.SWIPE_ACTION.UP:\r\n // break;\r\n // case this.SWIPE_ACTION.DOWN:\r\n // break;\r\n }\r\n }\r\n\r\n /**\r\n * Method to go back to the previous image.\r\n * @param action Enum of type `Action` that represents the source\r\n * action that moved back to the previous image. `Action.NORMAL` by default.\r\n */\r\n prevImage(action: Action = Action.NORMAL) {\r\n // check if prevImage should be blocked\r\n if (this.isPreventSliding(0)) {\r\n return;\r\n }\r\n this.changeCurrentImage(this.getPrevImage(), action);\r\n\r\n this.manageSlideConfig();\r\n\r\n this.start$.next();\r\n }\r\n\r\n /**\r\n * Method to go back to the previous image.\r\n * @param action Enum of type `Action` that represents the source\r\n * action that moved to the next image. `Action.NORMAL` by default.\r\n */\r\n nextImage(action: Action = Action.NORMAL) {\r\n // check if nextImage should be blocked\r\n if (this.isPreventSliding(this.images.length - 1)) {\r\n return;\r\n }\r\n this.changeCurrentImage(this.getNextImage(), action);\r\n\r\n this.manageSlideConfig();\r\n\r\n this.start$.next();\r\n }\r\n\r\n /**\r\n * Method used in the template to track ids in ngFor.\r\n * @param number index of the array\r\n * @param Image item of the array\r\n * @returns number the id of the item\r\n */\r\n trackById(index: number, item: Image): number {\r\n return item.id;\r\n }\r\n\r\n /**\r\n * Method called when an image preview is clicked and used to update the current image.\r\n * @param event an ImageEvent object with the relative action and the index of the clicked preview.\r\n */\r\n onClickPreview(event: ImageEvent) {\r\n const imageFound: Image = this.images[event.result];\r\n if (!!imageFound) {\r\n this.manageSlideConfig();\r\n this.changeCurrentImage(imageFound, event.action);\r\n }\r\n }\r\n\r\n /**\r\n * Method to play carousel.\r\n */\r\n playCarousel() {\r\n this.start$.next();\r\n }\r\n\r\n /**\r\n * Stops the carousel from cycling through items.\r\n */\r\n stopCarousel() {\r\n this.stop$.next();\r\n }\r\n\r\n // TODO remove this because duplicated\r\n /**\r\n * Method to get `alt attribute`.\r\n * `alt` specifies an alternate text for an image, if the image cannot be displayed.\r\n * @param Image image to get its alt description. If not provided it will be the current image\r\n * @returns String alt description of the image (or the current image if not provided)\r\n */\r\n getAltDescriptionByImage(image: Image = this.currentImage): string {\r\n if (!image) {\r\n return '';\r\n }\r\n return image.modal && image.modal.description ? image.modal.description : `Image ${getIndex(image, this.images) + 1}`;\r\n }\r\n\r\n // TODO remove this because duplicated\r\n /**\r\n * Method to get the title attributes based on descriptions.\r\n * This is useful to prevent accessibility issues, because if DescriptionStrategy is ALWAYS_HIDDEN,\r\n * it prevents an empty string as title.\r\n * @param Image image to get its description. If not provided it will be the current image\r\n * @returns String title of the image based on descriptions\r\n * @throws an Error if description isn't available\r\n */\r\n getTitleToDisplay(image: Image = this.currentImage): string {\r\n if (!this.configCurrentImageCarousel || !this.configCurrentImageCarousel.description) {\r\n throw new Error('Description input must be a valid object implementing the Description interface');\r\n }\r\n const imageWithoutDescription: boolean = !image.modal || !image.modal.description || image.modal.description === '';\r\n const description: string = this.buildTextDescription(image, imageWithoutDescription);\r\n return description;\r\n }\r\n\r\n /**\r\n * Method to reset carousel (force image with index 0 to be the current image and re-init also previews)\r\n */\r\n // temporary removed because never tested\r\n // reset() {\r\n // if (this.configPlay && this.configPlay.autoPlay) {\r\n // this.stopCarousel();\r\n // }\r\n // this.currentImage = this.images[0];\r\n // this.handleBoundaries(0);\r\n // if (this.configPlay && this.configPlay.autoPlay) {\r\n // this.playCarousel();\r\n // }\r\n // this.ref.markForCheck();\r\n // }\r\n\r\n /**\r\n * Method to cleanup resources. In fact, this will stop the carousel.\r\n * This is an Angular's lifecycle hook that is called when this component is destroyed.\r\n */\r\n ngOnDestroy() {\r\n this.stopCarousel();\r\n }\r\n\r\n /**\r\n * Method to change the current image, receiving the new image as input the relative action.\r\n * @param image an Image object that represents the new image to set as current.\r\n * @param action Enum of type `Action` that represents the source action that triggered the change.\r\n */\r\n private changeCurrentImage(image: Image, action: Action) {\r\n this.currentImage = image;\r\n const index: number = getIndex(image, this.images);\r\n\r\n // emit first/last event based on newIndex value\r\n this.emitBoundaryEvent(action, index);\r\n\r\n // emit current visible image index\r\n this.show.emit(new ImageModalEvent(action, index + 1));\r\n }\r\n\r\n /**\r\n * Private method to get the next index.\r\n * This is necessary because at the end, when you call next again, you'll go to the first image.\r\n * That happens because all modal images are shown like in a circle.\r\n */\r\n private getNextImage(): Image {\r\n const currentIndex: number = getIndex(this.currentImage, this.images);\r\n let newIndex = 0;\r\n if (currentIndex >= 0 && currentIndex < this.images.length - 1) {\r\n newIndex = currentIndex + 1;\r\n } else {\r\n newIndex = 0; // start from the first index\r\n }\r\n return this.images[newIndex];\r\n }\r\n\r\n /**\r\n * Private method to get the previous index.\r\n * This is necessary because at index 0, when you call prev again, you'll go to the last image.\r\n * That happens because all modal images are shown like in a circle.\r\n */\r\n private getPrevImage(): Image {\r\n const currentIndex: number = getIndex(this.currentImage, this.images);\r\n let newIndex = 0;\r\n if (currentIndex > 0 && currentIndex <= this.images.length - 1) {\r\n newIndex = currentIndex - 1;\r\n } else {\r\n newIndex = this.images.length - 1; // start from the last index\r\n }\r\n return this.images[newIndex];\r\n }\r\n\r\n /**\r\n * Private method to build a text description.\r\n * This is used also to create titles.\r\n * @param Image image to get its description. If not provided it will be the current image.\r\n * @param boolean imageWithoutDescription is a boolean that it's true if the image hasn't a 'modal' description.\r\n * @returns String description built concatenating image fields with a specific logic.\r\n */\r\n private buildTextDescription(image: Image, imageWithoutDescription: boolean): string {\r\n if (!this.configCurrentImageCarousel || !this.configCurrentImageCarousel.description) {\r\n throw new Error('Description input must be a valid object implementing the Description interface');\r\n }\r\n\r\n // If customFullDescription use it, otherwise proceed to build a description\r\n if (this.configCurrentImageCarousel.description.customFullDescription && this.configCurrentImageCarousel.description.customFullDescription !== '') {\r\n return this.configCurrentImageCarousel.description.customFullDescription;\r\n }\r\n\r\n const currentIndex: number = getIndex(image, this.images);\r\n // If the current image hasn't a description,\r\n // prevent to write the ' - ' (or this.description.beforeTextDescription)\r\n\r\n const prevDescription: string = this.configCurrentImageCarousel.description.imageText ? this.configCurrentImageCarousel.description.imageText : '';\r\n const midSeparator: string = this.configCurrentImageCarousel.description.numberSeparator\r\n ? this.configCurrentImageCarousel.description.numberSeparator\r\n : '';\r\n const middleDescription: string = currentIndex + 1 + midSeparator + this.images.length;\r\n\r\n if (imageWithoutDescription) {\r\n return prevDescription + middleDescription;\r\n }\r\n\r\n const currImgDescription: string = image.modal && image.modal.description ? image.modal.description : '';\r\n const endDescription: string = this.configCurrentImageCarousel.description.beforeTextDescription + currImgDescription;\r\n return prevDescription + middleDescription + endDescription;\r\n }\r\n\r\n /**\r\n * Private method to update both `isFirstImage` and `isLastImage` based on\r\n * the index of the current image.\r\n * @param number currentIndex is the index of the current image\r\n */\r\n private handleBoundaries(currentIndex: number) {\r\n if (this.images.length === 1) {\r\n this.isFirstImage = true;\r\n this.isLastImage = true;\r\n return;\r\n }\r\n switch (currentIndex) {\r\n case 0:\r\n // execute this only if infinite sliding is disabled\r\n this.isFirstImage = true;\r\n this.isLastImage = false;\r\n break;\r\n case this.images.length - 1:\r\n // execute this only if infinite sliding is disabled\r\n this.isFirstImage = false;\r\n this.isLastImage = true;\r\n break;\r\n default:\r\n this.isFirstImage = false;\r\n this.isLastImage = false;\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Private method to manage boundary arrows and sliding.\r\n * This is based on the slideConfig input to enable/disable 'infinite sliding'.\r\n * @param number index of the visible image\r\n */\r\n private manageSlideConfig() {\r\n let index: number;\r\n try {\r\n index = getIndex(this.currentImage, this.images);\r\n } catch (err) {\r\n console.error('Cannot get the current image index in current-image');\r\n throw err;\r\n }\r\n\r\n if (this.infinite === true) {\r\n // enable infinite sliding\r\n this.isFirstImage = false;\r\n this.isLastImage = false;\r\n } else {\r\n this.handleBoundaries(index);\r\n }\r\n }\r\n\r\n /**\r\n * Private method to emit events when either the last or the first image are visible.\r\n * @param action Enum of type Action that represents the source of the event that changed the\r\n * current image to the first one or the last one.\r\n * @param indexToCheck is the index number of the image (the first or the last one).\r\n */\r\n private emitBoundaryEvent(action: Action, indexToCheck: number) {\r\n // to emit first/last event\r\n switch (indexToCheck) {\r\n case 0:\r\n this.firstImage.emit(new ImageModalEvent(action, true));\r\n break;\r\n case this.images.length - 1:\r\n this.lastImage.emit(new ImageModalEvent(action, true));\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Private method to check if next/prev actions should be blocked.\r\n * It checks if slideConfig.infinite === false and if the image index is equals to the input parameter.\r\n * If yes, it returns true to say that sliding should be blocked, otherwise not.\r\n * @param number boundaryIndex that could be either the beginning index (0) or the last index\r\n * of images (this.images.length - 1).\r\n * @returns boolean true if slideConfig.infinite === false and the current index is\r\n * either the first or the last one.\r\n */\r\n private isPreventSliding(boundaryIndex: number): boolean {\r\n return !this.infinite && getIndex(this.currentImage, this.images) === boundaryIndex;\r\n }\r\n}\r\n","
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n
\r\n
{{comment.user?.fullName || comment.user?.login}}
\r\n
{{comment.commentCreatedDate | date: 'dd.MM.yyyy г. в HH:mm'}}
\r\n
\r\n\r\n
\r\n {{comment.comment}}\r\n
\r\n
\r\n","import { Component, Input, OnInit } from '@angular/core';\r\n\r\nexport interface IComment {\r\n comment: string;\r\n commentCreatedDate: number;\r\n photoCode: string;\r\n user: {\r\n fullName: string;\r\n id: number;\r\n login: string;\r\n photoUrl: string;\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'ks-comment',\r\n templateUrl: './comment.component.html',\r\n styleUrls: ['./comment.component.scss']\r\n})\r\nexport class CommentComponent implements OnInit {\r\n @Input()\r\n public comment: IComment;\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n","
\r\n
{{'gallery.comments' | translate}}
\r\n
\r\n\r\n 0; else noContent\">\r\n \r\n \r\n \r\n \r\n\r\n \r\n
\r\n {{'gallery.no_comments' | translate}}\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n
\r\n {{error}}\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit } from '@angular/core';\r\nimport { catchError, finalize, takeUntil } from 'rxjs/operators';\r\nimport { BehaviorSubject, of, Subject } from 'rxjs';\r\nimport { IComment } from './comment/comment.component';\r\nimport { CommentSendStatus } from './sender/sender.component';\r\nimport { HttpResponse } from '@angular/common/http';\r\nimport { CommentsDataSource } from '../../model/comments-data-source.interface';\r\n\r\n@Component({\r\n selector: 'ks-comments',\r\n templateUrl: './comments.component.html',\r\n styleUrls: ['./comments.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CommentsComponent implements OnInit {\r\n /**\r\n * DataSource для работы с комментариями\r\n */\r\n @Input()\r\n commentsDataSource: CommentsDataSource;\r\n\r\n /**\r\n * Статус формы компонента sender\r\n */\r\n public sendFormStatus: BehaviorSubject;\r\n\r\n /**\r\n * Массив с комментариями\r\n */\r\n public commentsList: IComment[] = null;\r\n\r\n /**\r\n * Subject для отписки.\r\n */\r\n private ngUnsubscribe = new Subject();\r\n\r\n /**\r\n * Статус загзузки комментариев.\r\n */\r\n public isLoading = false;\r\n\r\n /**\r\n * Observable для отображения ошибки.\r\n */\r\n public loadingError$ = new Subject();\r\n\r\n constructor(private ref: ChangeDetectorRef) {}\r\n\r\n private _id: number;\r\n private isCommentLoading:boolean=false;\r\n /**\r\n * Текущий id фотографии\r\n * @param value\r\n */\r\n @Input()\r\n set id(value) {\r\n this._id = +value;\r\n // При смене фото, отменяем предущие запросы и запрашиваем комментарии по id фотографии.\r\n this.ngUnsubscribe.next();\r\n\r\n if (this.commentsDataSource) {\r\n this.getComments(this.id);\r\n }\r\n }\r\n\r\n get id() {\r\n return this._id;\r\n }\r\n\r\n ngOnInit() {\r\n this.getComments(this.id);\r\n }\r\n\r\n /**\r\n * Получение списка комментариев по photoId\r\n * @param photoId\r\n */\r\n getComments(photoId: number): void {\r\n this.isLoading = true;\r\n this.commentsList = null;\r\n\r\n this.commentsDataSource\r\n .load(photoId)\r\n .pipe(\r\n takeUntil(this.ngUnsubscribe),\r\n finalize(() => {\r\n this.isLoading = false;\r\n }),\r\n catchError(error => {\r\n this.isLoading = false;\r\n this.loadingError$.next(error);\r\n return of();\r\n })\r\n )\r\n .subscribe(data => {\r\n this.commentsList = data;\r\n this.ref.detectChanges();\r\n });\r\n }\r\n\r\n /**\r\n * Отправка сообщения\r\n * @param message\r\n */\r\n sendMessage(message: string) {\r\n if (!message) return;\r\n if( this.isCommentLoading) return\r\n this.isCommentLoading =true;\r\n this.sendFormStatus.next({ error: '', loading: true });\r\n\r\n this.commentsDataSource\r\n .insert(this.id, message)\r\n .pipe(\r\n catchError(error => {\r\n this.sendFormStatus.next({ error: error, loading: false });\r\n this.isCommentLoading =false;\r\n return of();\r\n })\r\n )\r\n .subscribe((response: HttpResponse) => {\r\n this.commentsList.push(response.body);\r\n\r\n this.sendFormStatus.next({ error: '', loading: false });\r\n this.isCommentLoading =false;\r\n\r\n this.ref.detectChanges();\r\n });\r\n }\r\n\r\n /**\r\n * Ускорение перерендеринга.\r\n * @param index\r\n * @param item\r\n */\r\n trackByFn(index, item) {\r\n return index;\r\n }\r\n}\r\n","
\r\n\r\n
\r\n {{'gallery.error' | translate}}\r\n \r\n \r\n \r\n \r\n
\r\n\r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n\r\n\r\n","import { Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';\r\nimport { BehaviorSubject, Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\n\r\nexport class CommentSendStatus {\r\n public error: string;\r\n public loading: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'ks-sender',\r\n templateUrl: './sender.component.html',\r\n styleUrls: ['./sender.component.scss']\r\n})\r\nexport class SenderComponent implements OnInit, OnDestroy {\r\n /**\r\n * Привязка к textarea.\r\n */\r\n @ViewChild('message') message: ElementRef;\r\n\r\n /**\r\n * Двухсторонний биндинг статуса формы.\r\n */\r\n @Input('formStatus') formStatus$: BehaviorSubject;\r\n @Output('formStatusChange') formStatusChange = new EventEmitter>();\r\n\r\n /**\r\n * Событие отправки введенного сообщения.\r\n */\r\n @Output() onSendMessage = new EventEmitter();\r\n\r\n /**\r\n * Subject для отписки.\r\n */\r\n private ngUnsubscribe = new Subject();\r\n\r\n isEmpty: boolean = false;\r\n placeholder: string = 'Введите комментарий...';\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnInit() {\r\n // Задаем стартовые значения состояния формы.\r\n this.formStatus$ = new BehaviorSubject({error: '', loading: false});\r\n this.formStatusChange.emit(this.formStatus$);\r\n\r\n // Подписываемся на состояние формы для отслеживания успешной отправки комментария и обнуления textarea\r\n this.formStatus$\r\n .pipe(\r\n takeUntil(this.ngUnsubscribe)\r\n )\r\n .subscribe(v => {\r\n if (!this.message) return;\r\n\r\n if (v.error === '' && v.loading === false) {\r\n this.message.nativeElement.value = '';\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n /**\r\n * Отправка сообщения\r\n * @param textarea\r\n */\r\n send(textarea: HTMLTextAreaElement) {\r\n if (!textarea.value) {\r\n //TODO Проверка на пустую форму и подсветка\r\n\r\n this.alertEmptyMessage();\r\n\r\n return;\r\n }\r\n\r\n this.onSendMessage.emit(textarea.value);\r\n }\r\n\r\n /**\r\n * Скрыть блок с ошибкой.\r\n */\r\n alertEmptyMessage() {\r\n this.isEmpty = true;\r\n this.placeholder = 'Пустой комментарий';\r\n }\r\n\r\n // Скрыть блок с ошибкой.\r\n closeErrorBlock() {\r\n this.formStatus$.next({error: '', loading: false});\r\n }\r\n\r\n resetAlert() {\r\n this.isEmpty = false;\r\n this.placeholder = 'Введите комментарий...';\r\n }\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\n/**\r\n * Enum `Keyboard` with keys and their relative key codes.\r\n */\r\nexport enum Keyboard {\r\n ESC = 27,\r\n LEFT_ARROW = 37,\r\n RIGHT_ARROW = 39,\r\n UP_ARROW = 38,\r\n DOWN_ARROW = 40\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[ksKeyboardNavigation]'\r\n})\r\nexport class KeyboardNavigationDirective {\r\n @Input()\r\n isOpen: boolean;\r\n\r\n @Output()\r\n keyPress: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Listener to catch keyboard's events and call the right method based on the key.\r\n * For instance, pressing esc, this will call `closeGallery(Action.KEYBOARD)` and so on.\r\n * If you passed a valid `keyboardConfig` esc, right and left buttons will be customized based on your data.\r\n * @param e KeyboardEvent caught by the listener.\r\n */\r\n @HostListener('window:keydown', ['$event'])\r\n onKeyDown(e: KeyboardEvent) {\r\n if (!this.isOpen) {\r\n return;\r\n }\r\n this.keyPress.emit(e.keyCode);\r\n }\r\n}\r\n","
\r\n\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n \r\n \"{{leftPreview.modal.alt\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n \"{{currentImage.modal.alt\r\n \r\n
\r\n
\r\n
\r\n\r\n \r\n\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n \r\n \r\n \"{{rightPreview.modal.alt\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n\r\n \r\n
\r\n
\r\n
\r\n
\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { AfterContentInit, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostListener, Inject, Input, NgZone, OnChanges, OnDestroy, OnInit, Output, PLATFORM_ID, SimpleChange, SimpleChanges, ViewChild } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\nimport { Subject, timer } from 'rxjs';\r\nimport { filter, map, switchMap, takeUntil } from 'rxjs/operators';\r\n\r\nimport { AccessibleComponent } from '../accessible.component';\r\n\r\nimport { AccessibilityConfig } from '../../model/accessibility.interface';\r\nimport { Action } from '../../model/action.enum';\r\nimport { Description, DescriptionStrategy, DescriptionStyle } from '../../model/description.interface';\r\nimport { Image, ImageModalEvent } from '../../model/image.class';\r\nimport { InternalLibImage } from '../../model/image-internal.class';\r\nimport { Keyboard } from '../../model/keyboard.enum';\r\nimport { KeyboardConfig } from '../../model/keyboard-config.interface';\r\nimport { LoadingConfig, LoadingType } from '../../model/loading-config.interface';\r\nimport { SlideConfig } from '../../model/slide-config.interface';\r\n\r\nimport { NEXT, PREV } from '../../utils/user-input.util';\r\nimport { getIndex } from '../../utils/image.util';\r\nimport { CurrentImageConfig } from '../../model/current-image-config.interface';\r\nimport { SelectedImage } from '../../model/selectedImage.interface';\r\n\r\n/**\r\n * Interface to describe the Load Event, used to\r\n * emit an event when the image is finally loaded and the spinner has gone.\r\n */\r\nexport interface ImageLoadEvent {\r\n status: boolean;\r\n index: number;\r\n id: number;\r\n}\r\n\r\n/**\r\n * Component with the current image with some additional elements like arrows and side previews.\r\n */\r\n@Component({\r\n selector: 'ks-current-image',\r\n styleUrls: ['current-image.scss', '../image-arrows.scss', 'current-image-previews.scss'],\r\n templateUrl: 'current-image.html',\r\n //changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CurrentImageComponent\r\n extends AccessibleComponent\r\n implements OnInit, OnChanges, AfterContentInit, OnDestroy {\r\n @Input()\r\n commentsDataSource: any;\r\n /**\r\n * Unique id (>=0) of the current instance of this library. This is useful when you are using\r\n * the service to call modal gallery without open it manually.\r\n */\r\n @Input()\r\n id: number;\r\n /**\r\n * Object of type `InternalLibImage` that represent the visible image.\r\n */\r\n @Input()\r\n currentImage: InternalLibImage;\r\n /**\r\n * Array of `InternalLibImage` that represent the model of this library with all images,\r\n * thumbs and so on.\r\n */\r\n @Input()\r\n images: InternalLibImage[];\r\n /**\r\n * Boolean that it is true if the modal gallery is visible.\r\n * If yes, also this component should be visible.\r\n */\r\n @Input()\r\n isOpen: boolean;\r\n /**\r\n * Boolean that it is true if the info-block is visible.\r\n * If yes, also this component should be visible.\r\n */\r\n @Input()\r\n isOpenInfoBlock: boolean;\r\n\r\n @Input() infoTemplate;\r\n @Input() infoBlockContent;\r\n @Output()\r\n isOpenInfoBlockChange = new EventEmitter();\r\n /**\r\n * Interface to configure current image in modal-gallery.\r\n * For instance you can disable navigation on click on current image (enabled by default).\r\n */\r\n @Input()\r\n currentImageConfig: CurrentImageConfig;\r\n /**\r\n * Object of type `SlideConfig` to get `infinite sliding`.\r\n */\r\n @Input()\r\n slideConfig: SlideConfig;\r\n /**\r\n * Object of type `AccessibilityConfig` to init custom accessibility features.\r\n * For instance, it contains titles, alt texts, aria-labels and so on.\r\n */\r\n @Input()\r\n accessibilityConfig: AccessibilityConfig;\r\n /**\r\n * Object of type `KeyboardConfig` to assign custom keys to both ESC, RIGHT and LEFT keyboard's actions.\r\n */\r\n @Input()\r\n keyboardConfig: KeyboardConfig;\r\n\r\n @Input() selectedImages: number[];\r\n\r\n @Input() isCheckable: boolean = true;\r\n\r\n /**\r\n * Output to emit an event when images are loaded. The payload contains an `ImageLoadEvent`.\r\n */\r\n @Output()\r\n loadImage: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit any changes of the current image. The payload contains an `ImageModalEvent`.\r\n */\r\n @Output()\r\n changeImage: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit an event when the modal gallery is closed. The payload contains an `ImageModalEvent`.\r\n */\r\n @Output()\r\n close: EventEmitter = new EventEmitter();\r\n\r\n @Output() selectImage = new EventEmitter();\r\n\r\n @ViewChild('galleryImageContainer')\r\n galleryImageContainer: ElementRef;\r\n\r\n /**\r\n * Subject to play modal-gallery.\r\n */\r\n private start$ = new Subject();\r\n /**\r\n * Subject to stop modal-gallery.\r\n */\r\n private stop$ = new Subject();\r\n\r\n /**\r\n * Enum of type `Action` that represents a normal action.\r\n * Declared here to be used inside the template.\r\n */\r\n normalAction: Action = Action.NORMAL;\r\n /**\r\n * Enum of type `Action` that represents a mouse click on a button.\r\n * Declared here to be used inside the template.\r\n */\r\n clickAction: Action = Action.CLICK;\r\n /**\r\n * Enum of type `Action` that represents a keyboard action.\r\n * Declared here to be used inside the template.\r\n */\r\n keyboardAction: Action = Action.KEYBOARD;\r\n /**\r\n * Boolean that it's true when you are watching the first image (currently visible).\r\n * False by default\r\n */\r\n isFirstImage = false;\r\n /**\r\n * Boolean that it's true when you are watching the last image (currently visible).\r\n * False by default\r\n */\r\n isLastImage = false;\r\n /**\r\n * Boolean that it's true if an image of the modal gallery is still loading.\r\n * True by default\r\n */\r\n loading = true;\r\n /**\r\n * Object of type `CurrentImageConfig` exposed to the template. This field is initialized\r\n * applying transformations, default values and so on to the input of the same type.\r\n */\r\n configCurrentImage: CurrentImageConfig;\r\n\r\n configSlide: SlideConfig;\r\n\r\n /**\r\n * Boolean, блокирует лупу если true\r\n * False by default\r\n */\r\n isLoked: boolean =false;\r\n\r\n\r\n scale: number =2;\r\n\r\n orientation;\r\n /**\r\n * Private object without type to define all swipe actions used by hammerjs.\r\n */\r\n private SWIPE_ACTION = {\r\n LEFT: 'swipeleft',\r\n RIGHT: 'swiperight',\r\n UP: 'swipeup',\r\n DOWN: 'swipedown'\r\n };\r\n\r\n\r\n constructor(@Inject(PLATFORM_ID) private _platformId, private _ngZone: NgZone, private ref: ChangeDetectorRef) {\r\n super();\r\n }\r\n\r\n /**\r\n * Listener to stop the gallery when the mouse pointer is over the current image.\r\n */\r\n @HostListener('mouseenter')\r\n onMouseEnter() {\r\n // if carousel feature is disable, don't do anything in any case\r\n if (!this.configSlide || !this.configSlide.playConfig) {\r\n return;\r\n }\r\n if (!this.configSlide.playConfig.pauseOnHover) {\r\n return;\r\n }\r\n this.stopCarousel();\r\n }\r\n\r\n /**\r\n * Listener to play the gallery when the mouse pointer leave the current image.\r\n */\r\n @HostListener('mouseleave')\r\n onMouseLeave() {\r\n // if carousel feature is disable, don't do anything in any case\r\n if (!this.configSlide || !this.configSlide.playConfig) {\r\n return;\r\n }\r\n if (!this.configSlide.playConfig.pauseOnHover || !this.configSlide.playConfig.autoPlay) {\r\n return;\r\n }\r\n this.playCarousel();\r\n }\r\n\r\n /**\r\n * Method ´ngOnInit´ to build `configCurrentImage` applying default values.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called only one time!!!\r\n */\r\n ngOnInit() {\r\n const defaultLoading: LoadingConfig = {\r\n enable: true,\r\n type: LoadingType.STANDARD\r\n };\r\n const defaultDescriptionStyle: DescriptionStyle = {\r\n bgColor: 'rgba(0, 0, 0, .5)',\r\n textColor: 'white',\r\n marginTop: '0px',\r\n marginBottom: '0px',\r\n marginLeft: '0px',\r\n marginRight: '0px'\r\n };\r\n const defaultDescription: Description = {\r\n strategy: DescriptionStrategy.ALWAYS_VISIBLE,\r\n imageText: 'Image ',\r\n numberSeparator: '/',\r\n beforeTextDescription: ' - ',\r\n style: defaultDescriptionStyle\r\n };\r\n const defaultCurrentImageConfig: CurrentImageConfig = {\r\n navigateOnClick: true,\r\n loadingConfig: defaultLoading,\r\n description: defaultDescription,\r\n downloadable: false,\r\n invertSwipe: false\r\n };\r\n\r\n this.configCurrentImage = Object.assign({}, defaultCurrentImageConfig, this.currentImageConfig);\r\n this.configCurrentImage.description = Object.assign({}, defaultDescription, this.configCurrentImage.description);\r\n\r\n this.configSlide = Object.assign({}, this.slideConfig);\r\n }\r\n\r\n /**\r\n * Method ´ngOnChanges´ to update `loading` status and emit events.\r\n * If the gallery is open, then it will also manage boundary arrows and sliding.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called when any data-bound property of a directive changes!!!\r\n */\r\n ngOnChanges(changes: SimpleChanges) {\r\n const images: SimpleChange = changes.images;\r\n const currentImage: SimpleChange = changes.currentImage;\r\n\r\n if (currentImage && currentImage.previousValue !== currentImage.currentValue) {\r\n this.updateIndexes();\r\n\r\n\r\n } else if (images && images.previousValue !== images.currentValue) {\r\n this.updateIndexes();\r\n }\r\n\r\n const slideConfig: SimpleChange = changes.slideConfig;\r\n if (slideConfig && slideConfig.previousValue !== slideConfig.currentValue) {\r\n this.configSlide = Object.assign({}, this.slideConfig);\r\n }\r\n }\r\n\r\n ngAfterContentInit() {\r\n // interval doesn't play well with SSR and protractor,\r\n // so we should run it in the browser and outside Angular\r\n if (isPlatformBrowser(this._platformId)) {\r\n this._ngZone.runOutsideAngular(() => {\r\n this.start$\r\n .pipe(\r\n map(\r\n () =>\r\n this.configSlide &&\r\n this.configSlide.playConfig &&\r\n this.configSlide.playConfig.autoPlay &&\r\n this.configSlide.playConfig.interval\r\n ),\r\n filter(interval => interval > 0),\r\n switchMap(interval => timer(interval).pipe(takeUntil(this.stop$)))\r\n )\r\n .subscribe(() =>\r\n this._ngZone.run(() => {\r\n if (!this.isLastImage) {\r\n this.nextImage(Action.AUTOPLAY);\r\n }\r\n this.ref.markForCheck();\r\n })\r\n );\r\n\r\n this.start$.next();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Method to handle keypress based on the `keyboardConfig` input. It gets the keyCode of\r\n * the key that triggered the keypress event to navigate between images or to close the modal gallery.\r\n * @param number keyCode of the key that triggered the keypress event\r\n */\r\n onKeyPress(keyCode: number) {\r\n const esc: number = this.keyboardConfig && this.keyboardConfig.esc ? this.keyboardConfig.esc : Keyboard.ESC;\r\n const right: number =\r\n this.keyboardConfig && this.keyboardConfig.right ? this.keyboardConfig.right : Keyboard.RIGHT_ARROW;\r\n const left: number =\r\n this.keyboardConfig && this.keyboardConfig.left ? this.keyboardConfig.left : Keyboard.LEFT_ARROW;\r\n\r\n switch (keyCode) {\r\n case esc:\r\n this.close.emit(new ImageModalEvent(Action.KEYBOARD, true));\r\n break;\r\n case right:\r\n this.nextImage(Action.KEYBOARD);\r\n break;\r\n case left:\r\n this.prevImage(Action.KEYBOARD);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Method to get the image description based on input params.\r\n * If you provide a full description this will be the visible description, otherwise,\r\n * it will be built using the `Description` object, concatenating its fields.\r\n * @param Image image to get its description. If not provided it will be the current image\r\n * @returns String description of the image (or the current image if not provided)\r\n * @throws an Error if description isn't available\r\n */\r\n getDescriptionToDisplay(image: Image = this.currentImage): string {\r\n if (!this.configCurrentImage || !this.configCurrentImage.description) {\r\n throw new Error('Description input must be a valid object implementing the Description interface');\r\n }\r\n\r\n const imageWithoutDescription: boolean = !image.modal || !image.modal.description || image.modal.description === '';\r\n\r\n switch (this.configCurrentImage.description.strategy) {\r\n case DescriptionStrategy.HIDE_IF_EMPTY:\r\n return imageWithoutDescription ? '' : image.modal.description + '';\r\n case DescriptionStrategy.ALWAYS_HIDDEN:\r\n return '';\r\n default:\r\n // ----------- DescriptionStrategy.ALWAYS_VISIBLE -----------------\r\n return this.buildTextDescription(image, imageWithoutDescription);\r\n }\r\n }\r\n\r\n /**\r\n * Method to get `alt attribute`.\r\n * `alt` specifies an alternate text for an image, if the image cannot be displayed.\r\n * @param Image image to get its alt description. If not provided it will be the current image\r\n * @returns String alt description of the image (or the current image if not provided)\r\n */\r\n getAltDescriptionByImage(image: Image = this.currentImage): string {\r\n if (!image) {\r\n return '';\r\n }\r\n return image.modal && image.modal.description\r\n ? image.modal.description\r\n : `Image ${getIndex(image, this.images) + 1}`;\r\n }\r\n\r\n /**\r\n * Method to get the title attributes based on descriptions.\r\n * This is useful to prevent accessibility issues, because if DescriptionStrategy is ALWAYS_HIDDEN,\r\n * it prevents an empty string as title.\r\n * @param Image image to get its description. If not provided it will be the current image\r\n * @returns String title of the image based on descriptions\r\n * @throws an Error if description isn't available\r\n */\r\n getTitleToDisplay(image: Image = this.currentImage): string {\r\n if (!this.configCurrentImage || !this.configCurrentImage.description) {\r\n throw new Error('Description input must be a valid object implementing the Description interface');\r\n }\r\n const imageWithoutDescription: boolean = !image.modal || !image.modal.description || image.modal.description === '';\r\n const description: string = this.buildTextDescription(image, imageWithoutDescription);\r\n return description;\r\n }\r\n\r\n /**\r\n * Method to get the left side preview image.\r\n * @returns Image the image to show as size preview on the left\r\n */\r\n getLeftPreviewImage(): Image {\r\n const currentIndex: number = getIndex(this.currentImage, this.images);\r\n if (currentIndex === 0 && this.configSlide.infinite) {\r\n // the current image is the first one,\r\n // so the previous one is the last image\r\n // because infinite is true\r\n return this.images[this.images.length - 1];\r\n }\r\n this.handleBoundaries(currentIndex);\r\n return this.images[Math.max(currentIndex - 1, 0)];\r\n }\r\n\r\n /**\r\n * Method to get the right side preview image.\r\n * @returns Image the image to show as size preview on the right\r\n */\r\n getRightPreviewImage(): Image {\r\n const currentIndex: number = getIndex(this.currentImage, this.images);\r\n if (currentIndex === this.images.length - 1 && this.configSlide.infinite) {\r\n // the current image is the last one,\r\n // so the next one is the first image\r\n // because infinite is true\r\n return this.images[0];\r\n }\r\n this.handleBoundaries(currentIndex);\r\n return this.images[Math.min(currentIndex + 1, this.images.length - 1)];\r\n }\r\n\r\n /**\r\n * Method called by events from both keyboard and mouse on an image.\r\n * This will invoke the nextImage method.\r\n * @param KeyboardEvent | MouseEvent event payload\r\n * @param Action action that triggered the event or `Action.NORMAL` if not provided\r\n */\r\n onImageEvent(event: KeyboardEvent | MouseEvent, action: Action = Action.NORMAL) {\r\n this.isLoked = !this.isLoked;\r\n\r\n // check if triggered by a mouse click\r\n // If yes, It should block navigation when navigateOnClick is false\r\n if (action === Action.CLICK && !this.configCurrentImage.navigateOnClick) {\r\n // пользователь заблокировал навигацию по клику\r\n // a user has requested to block navigation via configCurrentImage.navigateOnClick property\r\n return;\r\n }\r\n\r\n const result: number = super.handleImageEvent(event);\r\n if (result === NEXT) {\r\n this.nextImage(action);\r\n }\r\n }\r\n\r\n /**\r\n * Method called by events from both keyboard and mouse on a navigation arrow.\r\n * @param string direction of the navigation that can be either 'next' or 'prev'\r\n * @param KeyboardEvent | MouseEvent event payload\r\n * @param Action action that triggered the event or `Action.NORMAL` if not provided\r\n * @param boolean disable to disable navigation\r\n */\r\n onNavigationEvent(direction: string, event: KeyboardEvent, action: Action = Action.NORMAL, disable: boolean = false) {\r\n if (disable) {\r\n return;\r\n }\r\n const result: number = super.handleNavigationEvent(direction, event);\r\n if (result === NEXT) {\r\n this.nextImage(action);\r\n } else if (result === PREV) {\r\n this.prevImage(action);\r\n }\r\n }\r\n\r\n /**\r\n * Method to go back to the previous image.\r\n * @param action Enum of type `Action` that represents the source\r\n * action that moved back to the previous image. `Action.NORMAL` by default.\r\n */\r\n prevImage(action: Action = Action.NORMAL) {\r\n // check if prevImage should be blocked\r\n if (this.isPreventSliding(0)) {\r\n return;\r\n }\r\n\r\n const prevImage: InternalLibImage = this.getPrevImage();\r\n this.loading = !prevImage.previouslyLoaded;\r\n this.changeImage.emit(new ImageModalEvent(action, getIndex(prevImage, this.images)));\r\n\r\n this.start$.next();\r\n }\r\n\r\n /**\r\n * Method to go back to the previous image.\r\n * @param action Enum of type `Action` that represents the source\r\n * action that moved to the next image. `Action.NORMAL` by default.\r\n */\r\n nextImage(action: Action = Action.NORMAL) {\r\n // check if nextImage should be blocked\r\n if (this.isPreventSliding(this.images.length - 1)) {\r\n return;\r\n }\r\n\r\n const nextImage: InternalLibImage = this.getNextImage();\r\n this.loading = !nextImage.previouslyLoaded;\r\n this.changeImage.emit(new ImageModalEvent(action, getIndex(nextImage, this.images)));\r\n\r\n this.start$.next();\r\n }\r\n\r\n /**\r\n * Method to emit an event as loadImage output to say that the requested image if loaded.\r\n * This method is invoked by the javascript's 'load' event on an img tag.\r\n * @param Event event that triggered the load\r\n */\r\n onImageLoad(event: any, img) {\r\n this.setOriantation(event.target);\r\n\r\n\r\n img.focus();\r\n\r\n const loadImageData: ImageLoadEvent = {\r\n status: true,\r\n index: getIndex(this.currentImage, this.images),\r\n id: this.currentImage.id\r\n };\r\n\r\n this.loadImage.emit(loadImageData);\r\n\r\n this.loading = false;\r\n }\r\n\r\n /**\r\n * Method used by Hammerjs to support touch gestures (you can also invert the swipe direction with configCurrentImage.invertSwipe).\r\n * @param action String that represent the direction of the swipe action. 'swiperight' by default.\r\n */\r\n swipe(action = this.SWIPE_ACTION.RIGHT) {\r\n switch (action) {\r\n case this.SWIPE_ACTION.RIGHT:\r\n if (this.configCurrentImage.invertSwipe) {\r\n this.prevImage(Action.SWIPE);\r\n } else {\r\n this.nextImage(Action.SWIPE);\r\n }\r\n break;\r\n case this.SWIPE_ACTION.LEFT:\r\n if (this.configCurrentImage.invertSwipe) {\r\n this.nextImage(Action.SWIPE);\r\n } else {\r\n this.prevImage(Action.SWIPE);\r\n }\r\n break;\r\n // case this.SWIPE_ACTION.UP:\r\n // break;\r\n // case this.SWIPE_ACTION.DOWN:\r\n // break;\r\n }\r\n }\r\n\r\n /**\r\n * Method used in `modal-gallery.component` to get the index of an image to delete.\r\n * @param Image image to get the index, or the visible image, if not passed\r\n * @returns number the index of the image\r\n */\r\n getIndexToDelete(image: Image = this.currentImage): number {\r\n return getIndex(image, this.images);\r\n }\r\n\r\n /**\r\n * Method to play modal gallery.\r\n */\r\n playCarousel() {\r\n this.start$.next();\r\n }\r\n\r\n /**\r\n * Stops modal gallery from cycling through items.\r\n */\r\n stopCarousel() {\r\n this.stop$.next();\r\n }\r\n\r\n /**\r\n * Method to cleanup resources. In fact, this will stop the modal gallery.\r\n * This is an Angular's lifecycle hook that is called when this component is destroyed.\r\n */\r\n ngOnDestroy() {\r\n this.stopCarousel();\r\n }\r\n\r\n /**\r\n * Private method to update both `isFirstImage` and `isLastImage` based on\r\n * the index of the current image.\r\n * @param number currentIndex is the index of the current image\r\n */\r\n private handleBoundaries(currentIndex: number) {\r\n if (this.images.length === 1) {\r\n this.isFirstImage = true;\r\n this.isLastImage = true;\r\n return;\r\n }\r\n if (!this.configSlide || this.configSlide.infinite === true) {\r\n // infinite sliding enabled\r\n this.isFirstImage = false;\r\n this.isLastImage = false;\r\n } else {\r\n switch (currentIndex) {\r\n case 0:\r\n // execute this only if infinite sliding is disabled\r\n this.isFirstImage = true;\r\n this.isLastImage = false;\r\n break;\r\n case this.images.length - 1:\r\n // execute this only if infinite sliding is disabled\r\n this.isFirstImage = false;\r\n this.isLastImage = true;\r\n break;\r\n default:\r\n this.isFirstImage = false;\r\n this.isLastImage = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Private method to check if next/prev actions should be blocked.\r\n * It checks if configSlide.infinite === false and if the image index is equals to the input parameter.\r\n * If yes, it returns true to say that sliding should be blocked, otherwise not.\r\n * @param number boundaryIndex that could be either the beginning index (0) or the last index\r\n * of images (this.images.length - 1).\r\n * @returns boolean true if configSlide.infinite === false and the current index is\r\n * either the first or the last one.\r\n */\r\n private isPreventSliding(boundaryIndex: number): boolean {\r\n return (\r\n !!this.configSlide &&\r\n this.configSlide.infinite === false &&\r\n getIndex(this.currentImage, this.images) === boundaryIndex\r\n );\r\n }\r\n\r\n /**\r\n * Private method to get the next index.\r\n * This is necessary because at the end, when you call next again, you'll go to the first image.\r\n * That happens because all modal images are shown like in a circle.\r\n */\r\n private getNextImage(): InternalLibImage {\r\n const currentIndex: number = getIndex(this.currentImage, this.images);\r\n let newIndex = 0;\r\n if (currentIndex >= 0 && currentIndex < this.images.length - 1) {\r\n newIndex = currentIndex + 1;\r\n } else {\r\n newIndex = 0; // start from the first index\r\n }\r\n return this.images[newIndex];\r\n }\r\n\r\n /**\r\n * Private method to get the previous index.\r\n * This is necessary because at index 0, when you call prev again, you'll go to the last image.\r\n * That happens because all modal images are shown like in a circle.\r\n */\r\n private getPrevImage(): InternalLibImage {\r\n const currentIndex: number = getIndex(this.currentImage, this.images);\r\n let newIndex = 0;\r\n if (currentIndex > 0 && currentIndex <= this.images.length - 1) {\r\n newIndex = currentIndex - 1;\r\n } else {\r\n newIndex = this.images.length - 1; // start from the last index\r\n }\r\n return this.images[newIndex];\r\n }\r\n\r\n /**\r\n * Private method to build a text description.\r\n * This is used also to create titles.\r\n * @param Image image to get its description. If not provided it will be the current image.\r\n * @param boolean imageWithoutDescription is a boolean that it's true if the image hasn't a 'modal' description.\r\n * @returns String description built concatenating image fields with a specific logic.\r\n */\r\n private buildTextDescription(image: Image, imageWithoutDescription: boolean): string {\r\n if (!this.configCurrentImage || !this.configCurrentImage.description) {\r\n throw new Error('Description input must be a valid object implementing the Description interface');\r\n }\r\n\r\n // If customFullDescription use it, otherwise proceed to build a description\r\n if (\r\n this.configCurrentImage.description.customFullDescription &&\r\n this.configCurrentImage.description.customFullDescription !== ''\r\n ) {\r\n return this.configCurrentImage.description.customFullDescription;\r\n }\r\n\r\n const currentIndex: number = getIndex(image, this.images);\r\n // If the current image hasn't a description,\r\n // prevent to write the ' - ' (or this.description.beforeTextDescription)\r\n\r\n const prevDescription: string = this.configCurrentImage.description.imageText\r\n ? this.configCurrentImage.description.imageText\r\n : '';\r\n const midSeparator: string = this.configCurrentImage.description.numberSeparator\r\n ? this.configCurrentImage.description.numberSeparator\r\n : '';\r\n const middleDescription: string = currentIndex + 1 + midSeparator + this.images.length;\r\n\r\n if (imageWithoutDescription) {\r\n return prevDescription + middleDescription;\r\n }\r\n\r\n const currImgDescription: string = image.modal && image.modal.description ? image.modal.description : '';\r\n const endDescription: string = this.configCurrentImage.description.beforeTextDescription + currImgDescription;\r\n return prevDescription + middleDescription + endDescription;\r\n }\r\n\r\n /**\r\n * Private method to call handleBoundaries when ngOnChanges is called.\r\n */\r\n private updateIndexes() {\r\n let index: number;\r\n try {\r\n console.log(\"updateIndexes\",this.currentImage, this.images);\r\n index = getIndex(this.currentImage, this.images);\r\n } catch (err) {\r\n console.error('Cannot get the current image index in current-image');\r\n throw err;\r\n }\r\n if (this.isOpen) {\r\n this.handleBoundaries(index);\r\n }\r\n }\r\n\r\n onResetSizeStyle() {\r\n this.galleryImageContainer.nativeElement.style = '';\r\n }\r\n\r\n closeInfoBlock(status: boolean): void {\r\n this.isOpenInfoBlock = !status;\r\n this.isOpenInfoBlockChange.emit(this.isOpenInfoBlock);\r\n }\r\n\r\n /**\r\n * возвращает класс rotate-angle, где angle - угол поворота\r\n * при первом открытии картинки возвращает пустую строку\r\n */\r\n getRotateClass(img) {\r\n const angle = img.angle;\r\n //const angle = this.getImageByIdFromImages(img.id).angle;\r\n\r\n if (!img.modal || angle === undefined ) {\r\n return '';\r\n }\r\n\r\n return 'rotateNew' + angle;\r\n }\r\n\r\n\r\n public get isCheck(): boolean {\r\n return this.selectedImages.includes(+this.currentImage.id);\r\n }\r\n\r\n checkboxChange(event) {\r\n this.selectImage.emit({ id: +this.currentImage.id, checked: event });\r\n }\r\n\r\n\r\n onMousemove(e:any){\r\n //console.log(e);\r\n if(this.isLoked) return;\r\n let img: HTMLImageElement=e.target;\r\n let div: HTMLElement = img.parentElement;\r\n let rect = div.getBoundingClientRect();\r\n\r\n let left = (e.x - rect.x)*(this.scale-1);\r\n let top = (e.y - rect.y)*(this.scale-1);\r\n img.style.transform =`scale(${this.scale})`;\r\n this.setOffset(img, top, left);\r\n //img.style.top = -top + 270+\"px\";\r\n //img.style.left = -left +200 +\"px\";\r\n }\r\n\r\n onMouseOut(e:any){\r\n //console.log(\"onMouseOut\",e);\r\n //debugger;\r\n if(this.isLoked) return;\r\n let img: HTMLElement=e.target;\r\n if (img.tagName != \"IMG\") img = img.getElementsByTagName(\"img\")[0];\r\n //()\r\n img.style.transform =\"initial\";\r\n img.style.top = 0 +\"px\";\r\n img.style.left = 0 +\"px\";\r\n }\r\n\r\n setOffset(img:HTMLImageElement, top:number, left:number){\r\n let letDeltaX = 200*(this.scale-1);\r\n let letDeltaY = 266*(this.scale-1);\r\n\r\n if(this.orientation<0){\r\n letDeltaX = 266*(this.scale-1);\r\n letDeltaY = 200*(this.scale-1);\r\n }\r\n\r\n let angle = this.currentImage.angle;\r\n if(angle ==0){\r\n img.style.top = -top + letDeltaY+\"px\";\r\n img.style.left = -left +letDeltaX +\"px\";\r\n img.style.bottom = \"unset\";\r\n img.style.right = \"unset\";\r\n }\r\n if(angle ==90) {\r\n img.style.left = -top + letDeltaX+\"px\";\r\n img.style.bottom = -left +letDeltaY +\"px\";\r\n img.style.top = \"unset\";\r\n img.style.right = \"unset\";\r\n }\r\n if(angle ==180) {\r\n img.style.bottom = -top + letDeltaY+\"px\";\r\n img.style.right = -left +letDeltaX +\"px\";\r\n img.style.top = \"unset\";\r\n img.style.left = \"unset\";\r\n }\r\n if(angle ==270) {\r\n img.style.right = -top + letDeltaX+\"px\";\r\n img.style.top = -left +letDeltaY +\"px\";\r\n img.style.bottom = \"unset\";\r\n img.style.left = \"unset\";\r\n \r\n }\r\n }\r\n\r\n onWheel(event:WheelEvent ){\r\n // console.log(event.target['tagName'])\r\n if(event.target['tagName']!==\"IMG\") return\r\n let img: HTMLElement=event.target;\r\n img.style.transform =`scale(${this.scale})`;\r\n let newScale = this.scale - event.deltaY/1000;\r\n if(newScale>1 && newScale<=4) this.scale = newScale;\r\n }\r\n\r\n setOriantation(img:HTMLImageElement){\r\n img.parentElement.parentElement.classList.remove(\"hor\");\r\n //debugger;\r\n img.style.height = \"533.3px\";\r\n img.style.width = \"400px\";\r\n this.orientation = img.naturalHeight - img.naturalWidth;\r\n\r\n if(this.orientation<0) {\r\n //this.currentImage.angle =90;\r\n img.style.height = \"400px\";\r\n img.style.width = \"533.3px\";\r\n img.parentElement.parentElement.classList.add(\"hor\");\r\n }\r\n \r\n }\r\n\r\n getImageByIdFromImages(id){\r\n return this.images.find((item)=>item.id==id)\r\n }\r\n}\r\n","
\r\n\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\nimport { AccessibilityConfig } from '../../../model/accessibility.interface';\r\nimport { LoadingConfig, LoadingType } from '../../../model/loading-config.interface';\r\n\r\n/**\r\n * Component with the loading spinner\r\n */\r\n@Component({\r\n selector: 'ks-loading-spinner',\r\n styleUrls: [\r\n 'style-loading-spinner-standard.css',\r\n 'style-loading-spinner-dots.css',\r\n 'style-loading-spinner-bars.css',\r\n 'style-loading-spinner-circular.css',\r\n 'style-loading-spinner-cube-flipping.css',\r\n 'style-loading-spinner-circles.css',\r\n 'style-loading-spinner-explosing-squares.scss'\r\n ],\r\n templateUrl: 'loading-spinner.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class LoadingSpinnerComponent {\r\n /**\r\n * Object of type `LoadingConfig` exposed to the template.\r\n * It contains a field to choose a loading spinner.\r\n */\r\n @Input()\r\n loadingConfig: LoadingConfig;\r\n /**\r\n * Object of type `AccessibilityConfig` to init custom accessibility features.\r\n * For instance, it contains titles, alt texts, aria-labels and so on.\r\n */\r\n @Input()\r\n accessibilityConfig: AccessibilityConfig;\r\n\r\n /**\r\n * Enum of type `LoadingType` to choose the standard loading spinner.\r\n * Declared here to be used inside the template.\r\n */\r\n loadingStandard: LoadingType = LoadingType.STANDARD;\r\n /**\r\n * Enum of type `LoadingType` to choose the bars loading spinner.\r\n * Declared here to be used inside the template.\r\n */\r\n loadingBars: LoadingType = LoadingType.BARS;\r\n /**\r\n * Enum of type `LoadingType` to choose the circular loading spinner.\r\n * Declared here to be used inside the template.\r\n */\r\n loadingCircular: LoadingType = LoadingType.CIRCULAR;\r\n /**\r\n * Enum of type `LoadingType` to choose the dots loading spinner.\r\n * Declared here to be used inside the template.\r\n */\r\n loadingDots: LoadingType = LoadingType.DOTS;\r\n /**\r\n * Enum of type `LoadingType` to choose the cube flipping loading spinner.\r\n * Declared here to be used inside the template.\r\n */\r\n loadingCubeFlipping: LoadingType = LoadingType.CUBE_FLIPPING;\r\n /**\r\n * Enum of type `LoadingType` to choose the circles loading spinner.\r\n * Declared here to be used inside the template.\r\n */\r\n loadingCircles: LoadingType = LoadingType.CIRCLES;\r\n /**\r\n * Enum of type `LoadingType` to choose the explosing squares loading spinner.\r\n * Declared here to be used inside the template.\r\n */\r\n loadingExplosingSquares: LoadingType = LoadingType.EXPLOSING_SQUARES;\r\n}\r\n","\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChange, SimpleChanges } from '@angular/core';\r\n\r\nimport { AccessibleComponent } from '../accessible.component';\r\n\r\nimport { AccessibilityConfig } from '../../model/accessibility.interface';\r\nimport { Image } from '../../model/image.class';\r\nimport { InternalLibImage } from '../../model/image-internal.class';\r\nimport { DotsConfig } from '../../model/dots-config.interface';\r\n\r\nimport { NEXT } from '../../utils/user-input.util';\r\nimport { getIndex } from '../../utils/image.util';\r\n\r\n/**\r\n * Component with clickable dots (small circles) to navigate between images inside the modal gallery.\r\n */\r\n@Component({\r\n selector: 'ks-dots',\r\n styleUrls: ['dots.scss'],\r\n templateUrl: 'dots.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class DotsComponent extends AccessibleComponent implements OnInit, OnChanges {\r\n /**\r\n * Object of type `InternalLibImage` that represent the visible image.\r\n */\r\n @Input()\r\n currentImage: InternalLibImage;\r\n /**\r\n * Array of `InternalLibImage` that represent the model of this library with all images,\r\n * thumbs and so on.\r\n */\r\n @Input()\r\n images: InternalLibImage[];\r\n /**\r\n * Object of type `DotsConfig` to init DotsComponent's features.\r\n * For instance, it contains a param to show/hide this component.\r\n */\r\n @Input()\r\n dotsConfig: DotsConfig = {visible: true};\r\n /**\r\n * Object of type `AccessibilityConfig` to init custom accessibility features.\r\n * For instance, it contains titles, alt texts, aria-labels and so on.\r\n */\r\n @Input()\r\n accessibilityConfig: AccessibilityConfig;\r\n /**\r\n * Output to emit clicks on dots. The payload contains a number that represent\r\n * the index of the clicked dot.\r\n */\r\n @Output()\r\n clickDot: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Object of type `DotsConfig` exposed to the template. This field is initialized\r\n * applying transformations, default values and so on to the input of the same type.\r\n */\r\n configDots: DotsConfig;\r\n\r\n /**\r\n * Method ´ngOnInit´ to build `configDots` applying a default value.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called only one time!!!\r\n */\r\n ngOnInit() {\r\n const defaultConfig: DotsConfig = {visible: true};\r\n this.configDots = Object.assign(defaultConfig, this.dotsConfig);\r\n }\r\n\r\n /**\r\n * Method ´ngOnChanges´ to change `configDots` if the input dotsConfig is changed.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n */\r\n ngOnChanges(changes: SimpleChanges) {\r\n const dotsConfigChanges: SimpleChange = changes.dotsConfig;\r\n if (dotsConfigChanges && dotsConfigChanges.currentValue !== dotsConfigChanges.previousValue) {\r\n this.configDots = dotsConfigChanges.currentValue;\r\n }\r\n }\r\n\r\n /**\r\n * Method to check if an image is active (i.e. the current image).\r\n * It checks currentImage and images to prevent errors.\r\n * @param number index of the image to check if it's active or not\r\n * @returns boolean true if is active (and input params are valid), false otherwise\r\n */\r\n isActive(index: number): boolean {\r\n if (!this.currentImage || !this.images || this.images.length === 0) {\r\n return false;\r\n }\r\n let imageIndex: number;\r\n try {\r\n imageIndex = getIndex(this.currentImage, this.images);\r\n } catch (err) {\r\n console.error(`Internal error while trying to show the active 'dot'`, err);\r\n return false;\r\n }\r\n return index === imageIndex;\r\n }\r\n\r\n /**\r\n * Method called by events from keyboard and mouse.\r\n * @param number index of the dot\r\n * @param KeyboardEvent | MouseEvent event payload\r\n */\r\n onDotEvent(index: number, event: KeyboardEvent | MouseEvent) {\r\n const result: number = super.handleImageEvent(event);\r\n if (result === NEXT) {\r\n this.clickDot.emit(index);\r\n }\r\n }\r\n\r\n /**\r\n * Method used in the template to track ids in ngFor.\r\n * @param number index of the array\r\n * @param Image item of the array\r\n * @returns number the id of the item\r\n */\r\n trackById(index: number, item: Image): number {\r\n return item.id;\r\n }\r\n}\r\n","\r\n\r\n\r\n \r\n \r\n \r\n \r\n

No Content

\r\n
\r\n\r\n\r\n \r\n\r\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\r\nimport { CommentsDataSource } from '../../model/comments-data-source.interface';\r\nimport { ButtonType } from '../../model/buttons-config.interface';\r\n\r\n@Component({\r\n selector: 'ks-info-block',\r\n templateUrl: './info-block.component.html',\r\n styleUrls: ['./info-block.component.scss']\r\n})\r\nexport class InfoBlockComponent implements OnInit, OnDestroy {\r\n @Input() infoTemplate;\r\n @Input() infoBlockContent;\r\n @Input() content: ButtonType; // компонент который будет грузиться внутрь инфо блока\r\n /**\r\n * DataSource для работы с комментариями\r\n */\r\n @Input()\r\n commentsDataSource: CommentsDataSource;\r\n\r\n /**\r\n * Id текущей картинки.\r\n */\r\n @Input() imageId: number;\r\n\r\n @Output() resetSizeStyle = new EventEmitter();\r\n\r\n @Output() onClose = new EventEmitter();\r\n\r\n constructor() {}\r\n\r\n ngOnInit() {\r\n this.resetSizeStyle.emit();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.onClose.emit(true);\r\n }\r\n\r\n close() {\r\n this.onClose.emit(true);\r\n }\r\n}\r\n","
\r\n
{{'gallery.information' | translate}}
\r\n
\r\n\r\n \r\n
\r\n\r\n \r\n
\r\n {{'gallery.no_photo_data' | translate}}\r\n
\r\n
\r\n\r\n
\r\n\r\n\r\n\r\n","import { Component, Input, OnInit, SimpleChange } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n@Component({\r\n selector: 'ks-info',\r\n templateUrl: './info.component.html',\r\n styleUrls: ['./info.component.scss']\r\n})\r\nexport class InfoComponent implements OnInit {\r\n @Input() infoTemplate;\r\n template;\r\n\r\n constructor(private sanitizer: DomSanitizer) {}\r\n\r\n ngOnChanges(changes) {\r\n this.template = this.sanitizer.bypassSecurityTrustHtml(\r\n this.replace(changes.infoTemplate.currentValue.template, changes.infoTemplate.currentValue.photoInfo)\r\n );\r\n }\r\n\r\n ngOnInit(): void {}\r\n\r\n replace(template, photoInfo) {\r\n template = template.split('\\\\n');\r\n template = template.map(elem => {\r\n if (elem) {\r\n return `
  • ${elem}
  • `;\r\n }\r\n });\r\n template = template.join('');\r\n template = `
      ${template}
    `;\r\n let text = template;\r\n\r\n for (let key in photoInfo) {\r\n if (key === 'VisitDateInt') {\r\n const date = photoInfo[key];\r\n const formatter = new Intl.DateTimeFormat('ru', {\r\n year: 'numeric',\r\n month: 'long',\r\n day: 'numeric'\r\n });\r\n const dateStringRU = formatter.format(date);\r\n text = text.replace('{{' + key + '}}', dateStringRU);\r\n continue;\r\n }\r\n text = text.replace('{{' + key + '}}', photoInfo[key]);\r\n }\r\n\r\n return text;\r\n }\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Service to check if the provided id is unique\r\n */\r\n@Injectable({providedIn: 'root'})\r\nexport class IdValidatorService {\r\n ids = new Map();\r\n\r\n /**\r\n * Method to check and reserve an id for the current instance of the library.\r\n * In this way, no other instances can use the same id.\r\n * @param galleryId number or undefined that represents the unique id of the gallery.\r\n * @return boolean true if success. false is never returned, instead an exception is thrown\r\n * @throws a error with a message if galleryId is neither unique, < 0 or an integer\r\n */\r\n checkAndAdd(galleryId: number | undefined): boolean {\r\n if (!Number.isInteger(galleryId) || galleryId < 0) {\r\n throw new Error('You must provide a valid [id]=\"unique integer > 0 here\" to the gallery/carousel in your template');\r\n }\r\n if (this.ids.get(galleryId)) {\r\n throw new Error(`Cannot create gallery with id=${galleryId} because already used in your application. This must be a unique integer >= 0`);\r\n }\r\n this.ids.set(galleryId, galleryId);\r\n return true;\r\n }\r\n\r\n /**\r\n * Method to remove a reserved id. In this way you are able to use the id again for another instance of the library.\r\n * @param galleryId number or undefined that represents the unique id of the gallery.\r\n * @return boolean true if success. false is never returned, instead an exception is thrown\r\n * @throws a error with a message if galleryId is neither integer or < 0\r\n */\r\n remove(galleryId: number | undefined): boolean {\r\n if (!Number.isInteger(galleryId) || galleryId < 0) {\r\n throw new Error('You must provide a valid [id]=\"unique integer > 0 here\" to the gallery/carousel in your template');\r\n }\r\n // if (this.ids.find(id => id === galleryId)) {\r\n // throw new Error(`Cannot create gallery with id=${galleryId} because already used in your application. This must be a unique number >= 0.`);\r\n // }\r\n this.ids.delete(galleryId);\r\n return true;\r\n }\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';\r\n\r\n/**\r\n * Directive to close the modal gallery clicking on the semi-transparent background.\r\n * In fact, it listens for a click on all elements that aren't 'inside' and it emits\r\n * an event using `@Output clickOutside`.\r\n */\r\n@Directive({\r\n selector: '[ksClickOutside]'\r\n})\r\nexport class ClickOutsideDirective {\r\n /**\r\n * Boolean to enable this directive.\r\n */\r\n @Input()\r\n clickOutsideEnable: boolean;\r\n /**\r\n * Output to emit an event if the clicked element class doesn't contain 'inside' or it is 'hidden'. The payload is a boolean.\r\n */\r\n @Output()\r\n clickOutside: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Method called by Angular itself every click thanks to `@HostListener`.\r\n * @param MouseEvent event payload received evey click\r\n */\r\n @HostListener('click', ['$event'])\r\n onClick(event: MouseEvent) {\r\n event.stopPropagation();\r\n\r\n const targetElement: any = event.target;\r\n\r\n if (!this.clickOutsideEnable || !targetElement) {\r\n return;\r\n }\r\n\r\n let isInside = false;\r\n let isHidden = false;\r\n\r\n if (typeof targetElement.className !== 'string') {\r\n // it happens with @fortawesome/fontawesome 5\r\n // for some reasons className is an object with 2 empty properties inside\r\n isInside = true;\r\n } else {\r\n // in normal scenarios, use classname, because it's a simple string\r\n isInside = targetElement.className && targetElement.className.startsWith('inside');\r\n isHidden = targetElement.className.includes('hidden');\r\n }\r\n\r\n // if inside => don't close modal gallery\r\n // if hidden => close modal gallery\r\n /*\r\n i i' h | close\r\n 0 1 0 | 1 => close modal gallery\r\n 0 1 1 | 1 => close modal gallery\r\n 1 0 0 | 0\r\n 1 0 1 | 1 => close modal gallery\r\n */\r\n if (!isInside || isHidden) {\r\n // close modal gallery\r\n this.clickOutside.emit(true);\r\n }\r\n }\r\n}\r\n","\r\n\r\n\r\n\r\n\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostListener, Inject, Input, OnChanges, OnDestroy, OnInit, Output, PLATFORM_ID, SecurityContext, SimpleChange, SimpleChanges, ViewChild } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\nimport { ButtonEvent, ButtonsConfig, ButtonType } from '../../model/buttons-config.interface';\r\nimport { Image, ImageModalEvent } from '../../model/image.class';\r\nimport { Action } from '../../model/action.enum';\r\nimport { KeyboardConfig } from '../../model/keyboard-config.interface';\r\nimport { PreviewConfig } from '../../model/preview-config.interface';\r\nimport { SidePreviewsConfig, SlideConfig } from '../../model/slide-config.interface';\r\nimport { AccessibilityConfig } from '../../model/accessibility.interface';\r\nimport { KeyboardService } from '../../services/keyboard.service';\r\nimport { GalleryService, InternalGalleryPayload } from '../../services/gallery.service';\r\nimport { DotsConfig } from '../../model/dots-config.interface';\r\nimport { CurrentImageComponent, ImageLoadEvent } from '../current-image/current-image.component';\r\nimport { InternalLibImage } from '../../model/image-internal.class';\r\nimport { AdvancedLayout, PlainGalleryConfig } from '../../model/plain-gallery-config.interface';\r\nimport { KS_DEFAULT_ACCESSIBILITY_CONFIG } from '../accessibility-default';\r\nimport { CurrentImageConfig } from '../../model/current-image-config.interface';\r\nimport { getIndex } from '../../utils/image.util';\r\n\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { IdValidatorService } from '../../services/id-validator.service';\r\nimport { InteractionEvent } from '../../model/interaction-event.interface';\r\nimport { PlayConfig } from '../../model/play-config.interface';\r\nimport { SelectedImage } from '../../model/selectedImage.interface';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n/**\r\n * Main Component of this library with both the plain and modal galleries.\r\n */\r\n@Component({\r\n selector: 'ks-modal-gallery',\r\n exportAs: 'ksModalGallery',\r\n styleUrls: ['modal-gallery.scss'],\r\n templateUrl: 'modal-gallery.html',\r\n //changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ModalGalleryComponent implements OnInit, OnDestroy, OnChanges {\r\n /**\r\n * DataSource for comments\r\n */\r\n @Input()\r\n commentsDataSource: any;\r\n /**\r\n * Unique id (>=0) of the current instance of this library. This is useful when you are using\r\n * the service to call modal gallery without open it manually.\r\n */\r\n @Input()\r\n id: number;\r\n /**\r\n * Array of `Image` that represent the model of this library with all images, thumbs and so on.\r\n */\r\n @Input()\r\n modalImages: Image[];\r\n /**\r\n * Object of type `ButtonsConfig` to show/hide buttons.\r\n */\r\n @Input()\r\n buttonsConfig: ButtonsConfig;\r\n /**\r\n * Boolean to enable modal-gallery close behaviour when clicking\r\n * on the semi-transparent background. Enabled by default.\r\n */\r\n @Input()\r\n enableCloseOutside = true;\r\n /**\r\n * Interface to configure current image in modal-gallery.\r\n * For instance you can disable navigation on click on current image (enabled by default).\r\n */\r\n @Input()\r\n currentImageConfig: CurrentImageConfig;\r\n /**\r\n * Object of type `DotsConfig` to init DotsComponent's features.\r\n * For instance, it contains a param to show/hide dots.\r\n */\r\n @Input()\r\n dotsConfig: DotsConfig;\r\n /**\r\n * Object of type `PreviewConfig` to init PreviewsComponent's features.\r\n * For instance, it contains a param to show/hide previews.\r\n */\r\n @Input()\r\n previewConfig: PreviewConfig;\r\n /**\r\n * Object of type `SlideConfig` to init side previews and `infinite sliding`.\r\n */\r\n @Input()\r\n slideConfig: SlideConfig;\r\n /**\r\n * Object of type `AccessibilityConfig` to init custom accessibility features.\r\n * For instance, it contains titles, alt texts, aria-labels and so on.\r\n */\r\n @Input()\r\n accessibilityConfig: AccessibilityConfig = KS_DEFAULT_ACCESSIBILITY_CONFIG;\r\n /**\r\n * Object of type `KeyboardConfig` to assign custom keys to ESC, RIGHT and LEFT keyboard's actions.\r\n */\r\n @Input()\r\n keyboardConfig: KeyboardConfig;\r\n /**\r\n * Object of type `PlainGalleryConfig` to configure the plain gallery.\r\n */\r\n @Input()\r\n plainGalleryConfig: PlainGalleryConfig;\r\n\r\n @Input() selectedImages: number[];\r\n\r\n @Input() infoTemplate;\r\n\r\n @Input() isCheckable: boolean = true;\r\n\r\n \r\n\r\n /**\r\n * Output to emit an event when the modal gallery is closed.\r\n */\r\n @Output()\r\n close: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit an event when an image is changed.\r\n */\r\n @Output()\r\n show: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit an event when the current image is the first one.\r\n */\r\n @Output()\r\n firstImage: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit an event when the current image is the last one.\r\n */\r\n @Output()\r\n lastImage: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit an event when the modal gallery is closed.\r\n */\r\n @Output()\r\n hasData: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit an event when a button is clicked, but before that the action is triggered.\r\n */\r\n @Output()\r\n buttonBeforeHook: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit an event when a button is clicked, but after that the action is triggered.\r\n */\r\n @Output()\r\n buttonAfterHook: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit an event when someone clicks either an arrow of modal gallery or also in previews.\r\n */\r\n @Output()\r\n arrow: EventEmitter = new EventEmitter();\r\n\r\n @Output() selectImage = new EventEmitter();\r\n\r\n @Output() info = new EventEmitter();\r\n\r\n /**\r\n * Reference to the CurrentImageComponent to invoke methods on it.\r\n */\r\n @ViewChild(CurrentImageComponent)\r\n currentImageComponent;\r\n\r\n /**\r\n * Boolean that it is true if the modal gallery is visible. False by default.\r\n */\r\n opened = false;\r\n /**\r\n * Boolean that it is true if the modal gallery is visible. False by default.\r\n */\r\n openedInfoBlock = false;\r\n /**\r\n * Boolean to open the modal gallery. False by default.\r\n */\r\n showGallery = false;\r\n /**\r\n * Array of `InternalLibImage` representing the model of this library with all images, thumbs and so on.\r\n */\r\n images: InternalLibImage[];\r\n /**\r\n * `Image` that is visible right now.\r\n */\r\n currentImage: InternalLibImage;\r\n /**\r\n * Object of type `SlideConfig` passed to currentImage and used to handle play/stop features. This field is initialized\r\n * applying transformations, default values and so on to the input of the same type.\r\n */\r\n configSlide: SlideConfig;\r\n\r\n infoBlockContent;\r\n\r\n private galleryServiceNavigateSubscription: Subscription;\r\n private galleryServiceCloseSubscription: Subscription;\r\n private galleryServiceUpdateSubscription: Subscription;\r\n private galleryServiceAutoPlaySubscription: Subscription;\r\n\r\n /**\r\n * HostListener to catch browser's back button and destroy the gallery.\r\n * This prevents weired behaviour about scrolling.\r\n * Added to fix this issue: https://github.com/Ks89/angular-modal-gallery/issues/159\r\n */\r\n @HostListener('window:popstate', ['$event'])\r\n onPopState(e: Event) {\r\n this.closeGallery();\r\n }\r\n\r\n /**\r\n * Constructor with the injection of ´KeyboardService´, an object to support Server-Side Rendering and other useful services.\r\n */\r\n constructor(\r\n private keyboardService: KeyboardService,\r\n private galleryService: GalleryService,\r\n @Inject(PLATFORM_ID) private platformId: Object,\r\n private changeDetectorRef: ChangeDetectorRef,\r\n private idValidatorService: IdValidatorService,\r\n private sanitizer: DomSanitizer\r\n ) {}\r\n\r\n /**\r\n * Method ´ngOnChanges´ to re-init images if input is changed.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called before `ngOnInit()` and whenever one or more data-bound input properties change.\r\n * @param changes `SimpleChanges` object of current and previous property values provided by Angular.\r\n */\r\n ngOnChanges(changes: SimpleChanges) {\r\n\r\n // console.log('changes modal', changes);\r\n const imagesChange: SimpleChange = changes.modalImages;\r\n const plainGalleryConfigChange: SimpleChange = changes.plainGalleryConfig;\r\n\r\n if (imagesChange && !imagesChange.firstChange && imagesChange.previousValue !== imagesChange.currentValue) {\r\n this.initImages();\r\n }\r\n\r\n if (plainGalleryConfigChange) {\r\n // const prevPlainGalleryConfigChange: any = plainGalleryConfigChange.previousValue;\r\n const currPlainGalleryConfigChange: PlainGalleryConfig = plainGalleryConfigChange.currentValue;\r\n if (\r\n currPlainGalleryConfigChange.layout &&\r\n currPlainGalleryConfigChange.layout instanceof AdvancedLayout &&\r\n currPlainGalleryConfigChange.layout.modalOpenerByIndex !== -1\r\n ) {\r\n // console.log('opening modal gallery from custom plain gallery, index: ', currPlainGalleryConfigChange);\r\n this.showModalGallery(currPlainGalleryConfigChange.layout.modalOpenerByIndex);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Method ´ngOnInit´ to init images calling `initImages()`.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called only one time!!!\r\n */\r\n ngOnInit() {\r\n this.idValidatorService.checkAndAdd(this.id);\r\n\r\n // id is a mandatory input and must a number > 0\r\n if ((!this.id && this.id !== 0) || this.id < 0) {\r\n throw new Error(\r\n `'[id]=\"a number >= 0\"' is a mandatory input from 6.0.0 in angular-modal-gallery.` +\r\n `If you are using multiple instances of this library, please be sure to use different ids`\r\n );\r\n }\r\n\r\n // call initImages to init images and to emit `hasData` event\r\n this.initImages();\r\n\r\n const defaultSlideConfig: SlideConfig = {\r\n infinite: false,\r\n playConfig: {\r\n autoPlay: false,\r\n interval: 5000,\r\n pauseOnHover: true\r\n },\r\n sidePreviews: {\r\n show: true,\r\n size: { width: '100px', height: 'auto' }\r\n }\r\n };\r\n this.configSlide = Object.assign({}, defaultSlideConfig, this.slideConfig);\r\n\r\n this.galleryServiceNavigateSubscription = this.galleryService.navigate.subscribe(\r\n (payload: InternalGalleryPayload) => {\r\n if (!payload) {\r\n return;\r\n }\r\n // if galleryId is not valid OR galleryId is related to another instance and not this one\r\n if (payload.galleryId === undefined || payload.galleryId < 0 || payload.galleryId !== this.id) {\r\n return;\r\n }\r\n // if image index is not valid\r\n if (payload.index < 0 || payload.index > this.images.length) {\r\n return;\r\n }\r\n this.showModalGallery(payload.index, true);\r\n }\r\n );\r\n\r\n this.galleryServiceCloseSubscription = this.galleryService.close.subscribe((galleryId: number) => {\r\n if (galleryId < 0 || this.id !== galleryId) {\r\n return;\r\n }\r\n this.closeGallery(Action.NORMAL, true);\r\n });\r\n\r\n this.galleryServiceUpdateSubscription = this.galleryService.update.subscribe((payload: InternalGalleryPayload) => {\r\n if (!payload) {\r\n return;\r\n }\r\n // if galleryId is not valid OR galleryId is related to another instance and not this one\r\n if (payload.galleryId === undefined || payload.galleryId < 0 || payload.galleryId !== this.id) {\r\n return;\r\n }\r\n // if either image index or image are not valid\r\n if (payload.index < 0 || payload.index > this.images.length || !payload.image) {\r\n return;\r\n }\r\n const currentIndex: number = getIndex(payload.image, this.images);\r\n this.images = this.images.map((image: InternalLibImage, index: number) => {\r\n if (image.id === payload.index) {\r\n return payload.image;\r\n }\r\n return image;\r\n });\r\n if (currentIndex === payload.index) {\r\n this.currentImage = this.images[payload.index];\r\n }\r\n this.changeDetectorRef.markForCheck();\r\n });\r\n\r\n this.galleryServiceAutoPlaySubscription = this.galleryService.autoPlay.subscribe(\r\n (payload: InternalGalleryPayload) => {\r\n // if galleryId is not valid OR galleryId is related to another instance and not this one\r\n if (payload.galleryId === undefined || payload.galleryId < 0 || payload.galleryId !== this.id) {\r\n return;\r\n }\r\n this.configSlide.playConfig.autoPlay = payload.result;\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Method called by custom upper buttons.\r\n * @param ButtonEvent event payload\r\n */\r\n onCustomEmit(event: ButtonEvent) {\r\n const eventToEmit: ButtonEvent = this.getButtonEventToEmit(event);\r\n this.buttonBeforeHook.emit(eventToEmit);\r\n // console.log('on onCustomEmit', eventToEmit);\r\n this.buttonAfterHook.emit(eventToEmit);\r\n }\r\n\r\n /**\r\n * Реакция на нажатие кнопки информации о фото\r\n * @param ButtonEvent event payload\r\n */\r\n onShowInfo(event: ButtonEvent) {\r\n const eventToEmit: ButtonEvent = this.getButtonEventToEmit(event);\r\n\r\n this.buttonBeforeHook.emit(eventToEmit);\r\n\r\n if (this.openedInfoBlock) {\r\n if (this.infoBlockContent === event.button.type) {\r\n this.openedInfoBlock = false;\r\n } else {\r\n this.infoBlockContent = ButtonType.INFO;\r\n }\r\n } else {\r\n this.infoBlockContent = ButtonType.INFO;\r\n this.openedInfoBlock = true;\r\n }\r\n\r\n this.info.emit(event);\r\n\r\n this.buttonAfterHook.emit(eventToEmit);\r\n }\r\n\r\n // TODO implement on refresh\r\n // /**\r\n // * Method called by the refresh upper button.\r\n // * STILL NOT IMPLEMENTED, SO DON'T USE IT\r\n // * @param ButtonEvent event payload\r\n // */\r\n // onRefresh(event: ButtonEvent) {\r\n // const eventToEmit: ButtonEvent = this.getButtonEventToEmit(event);\r\n //\r\n // this.buttonBeforeHook.emit(eventToEmit);\r\n // // console.log('TODO implement on refresh inside the library', eventToEmit);\r\n //\r\n // this.currentImage = Object.assign({}, this.currentImage, { previouslyLoaded: false });\r\n //\r\n // // TODO add logic to hide and show the current image\r\n //\r\n // // console.log('onRefresh', this.currentImage);\r\n //\r\n // // const indexNum: number = this.currentImageComponent.getIndex();\r\n //\r\n // // this.images = this.images.map((val: InternalLibImage, index: number) => {\r\n // // if (index !== 2) {\r\n // // return val;\r\n // // } else {\r\n // // const img: InternalLibImage = Object.assign({}, val, {previouslyLoaded: false});\r\n // // return img;\r\n // // }\r\n // // });\r\n // //\r\n // // this.closeGallery();\r\n // // this.showModalGallery(2);\r\n //\r\n // this.buttonAfterHook.emit(eventToEmit);\r\n // }\r\n\r\n /**\r\n * Method called by show comments button.\r\n * @param ButtonEvent event payload\r\n */\r\n onShowComments(event: ButtonEvent) {\r\n const eventToEmit: ButtonEvent = this.getButtonEventToEmit(event);\r\n\r\n this.buttonBeforeHook.emit(eventToEmit);\r\n\r\n if (this.openedInfoBlock) {\r\n if (this.infoBlockContent === event.button.type) {\r\n this.openedInfoBlock = false;\r\n } else {\r\n this.infoBlockContent = ButtonType.COMMENTS;\r\n }\r\n } else {\r\n this.infoBlockContent = ButtonType.COMMENTS;\r\n this.openedInfoBlock = true;\r\n }\r\n\r\n this.buttonAfterHook.emit(eventToEmit);\r\n }\r\n\r\n /**\r\n * Method called by the rotate upper button.\r\n * @param ButtonEvent event payload\r\n */\r\n onRotate(event: ButtonEvent) {\r\n const eventToEmit: ButtonEvent = this.getButtonEventToEmit(event);\r\n this.buttonBeforeHook.emit(eventToEmit);\r\n\r\n // Устанавливаем дефолтное значение угла = 0.\r\n if (!eventToEmit.image.modal.angle) {\r\n eventToEmit.image.modal.angle = 0;\r\n }\r\n\r\n // Вычисляем угол поворота в соответствии с типом нажатой кнопки.\r\n switch (eventToEmit.button.type) {\r\n case 7: {\r\n eventToEmit.image.modal.angle = (eventToEmit.image.modal.angle + 360 - 90) % 360;\r\n break;\r\n }\r\n case 8: {\r\n eventToEmit.image.modal.angle = (eventToEmit.image.modal.angle + 360 + 90) % 360;\r\n break;\r\n }\r\n }\r\n\r\n // Т.к. стратегия используется OnPush, создаем новый объект текущего изображения.\r\n this.currentImage = Object.assign({}, this.currentImage);\r\n\r\n //\r\n // console.log(event)\r\n //\r\n // const canv = document.createElement('canvas');\r\n // let ctx;\r\n // canv.id = 'someId';\r\n // // canv.style.display = 'none';\r\n //\r\n // var image = document.createElement(\"img\");\r\n // image.src = eventToEmit.image.modal.img;\r\n // image.onload=function(){\r\n // let rotatedDrawImage = (ctx, canvas, image, angle) => {\r\n // ctx.clearRect(0,0,canvas.width,canvas.height);\r\n // ctx.save();\r\n // ctx.translate(canvas.width/2,canvas.height/2);\r\n // ctx.rotate(angle*Math.PI/180);\r\n // ctx.drawImage(image,-image.width/2,-image.width/2);\r\n // ctx.restore();\r\n // }\r\n //\r\n // canv.width = image.height;\r\n // canv.height = image.width;\r\n //\r\n // document.body.appendChild(canv); // adds the canvas to the body element\r\n //\r\n // const canvas = document.getElementById(\"someId\");\r\n //\r\n // ctx = canvas.getContext(\"2d\");\r\n //\r\n // ctx.drawImage(image,canvas.width/2-image.width/2,canvas.height/2-image.width/2);\r\n // // ctx.drawImage(image,canvas.width/2-image.width/2,canvas.height/2-image.width/2);\r\n //\r\n // rotatedDrawImage(ctx, canvas, image, 90)\r\n // }\r\n //\r\n //\r\n //\r\n\r\n //\r\n // const ctx = canvas.getContext(\"2d\");\r\n //\r\n // ctx.drawImage(eventToEmit.image,canvas.width/2-eventToEmit.image.width/2,canvas.height/2-eventToEmit.image.width/2);\r\n //\r\n\r\n // TODO implement rotation logic\r\n\r\n this.buttonAfterHook.emit(eventToEmit);\r\n }\r\n\r\n /**\r\n * Method called by the rotateCss upper button.\r\n * @param ButtonEvent event payload\r\n */\r\n onRotateCss(event: ButtonEvent) {\r\n //console.log(\"onRotateCss\",event)\r\n let image = this.currentImage;\r\n if(!image) return;\r\n this.RotateImage(image,event.button.type);\r\n const eventToEmit: ButtonEvent = this.getButtonEventToEmitCSS(event);\r\n\r\n this.buttonBeforeHook.emit(eventToEmit);\r\n this.buttonAfterHook.emit(eventToEmit);\r\n }\r\n\r\n RotateImage(image,idButton){\r\n let imageFromArray= this.getImageByIdFromImages(image.id);\r\n if(idButton ==12) {\r\n image.angle = image.angle +90;\r\n imageFromArray.angle = imageFromArray.angle +90;\r\n if(imageFromArray.angle== 360) {\r\n image.angle =0;\r\n imageFromArray.angle =0;\r\n }\r\n }\r\n if(idButton ==11) {\r\n image.angle = image.angle -90;\r\n imageFromArray.angle = imageFromArray.angle -90;\r\n if(imageFromArray.angle == -90) {\r\n image.angle =270\r\n imageFromArray.angle =270\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Method called by the full-screen upper button.\r\n * @param ButtonEvent event payload\r\n */\r\n onFullScreen(event: ButtonEvent) {\r\n const eventToEmit: ButtonEvent = this.getButtonEventToEmit(event);\r\n this.buttonBeforeHook.emit(eventToEmit);\r\n\r\n const doc: any = document;\r\n const docEl: any = document.documentElement;\r\n\r\n const fullscreenDisabled: boolean =\r\n !doc.fullscreenElement && !doc.webkitFullscreenElement && !doc.mozFullScreenElement && !doc.msFullscreenElement;\r\n\r\n if (fullscreenDisabled) {\r\n if (docEl.requestFullscreen) {\r\n docEl.requestFullscreen();\r\n } else if (docEl.webkitRequestFullscreen) {\r\n docEl.webkitRequestFullscreen();\r\n } else if (docEl.mozRequestFullScreen) {\r\n docEl.mozRequestFullScreen();\r\n } else if (docEl.msRequestFullscreen) {\r\n docEl.msRequestFullscreen();\r\n }\r\n } else {\r\n if (doc.exitFullscreen) {\r\n doc.exitFullscreen();\r\n } else if (doc.msExitFullscreen) {\r\n doc.msExitFullscreen();\r\n } else if (doc.mozCancelFullScreen) {\r\n doc.mozCancelFullScreen();\r\n } else if (doc.webkitExitFullscreen) {\r\n doc.webkitExitFullscreen();\r\n }\r\n }\r\n\r\n this.buttonAfterHook.emit(eventToEmit);\r\n }\r\n\r\n /**\r\n * Method called by the delete upper button.\r\n * @param ButtonEvent event payload\r\n */\r\n onDelete(event: ButtonEvent) {\r\n const eventToEmit: ButtonEvent = this.getButtonEventToEmit(event);\r\n this.buttonBeforeHook.emit(eventToEmit);\r\n\r\n if (this.images.length === 1) {\r\n this.closeGallery();\r\n }\r\n\r\n const imageIndexToDelete: number = this.currentImageComponent.getIndexToDelete(event.image);\r\n if (imageIndexToDelete === this.images.length - 1) {\r\n // last image\r\n this.currentImageComponent.prevImage();\r\n } else {\r\n this.currentImageComponent.nextImage();\r\n }\r\n\r\n this.buttonAfterHook.emit(eventToEmit);\r\n }\r\n\r\n /**\r\n * Method called by the navigate upper button.\r\n * @param ButtonEvent event payload\r\n */\r\n onNavigate(event: ButtonEvent) {\r\n const eventToEmit: ButtonEvent = this.getButtonEventToEmit(event);\r\n this.buttonBeforeHook.emit(eventToEmit);\r\n // To support SSR\r\n if (isPlatformBrowser(this.platformId)) {\r\n if (eventToEmit.image && eventToEmit.image.modal.extUrl) {\r\n // where I should open this link? The current tab or another one?\r\n if (eventToEmit.button && eventToEmit.button.extUrlInNewTab) {\r\n // in this case I should use target _blank to open the url in a new tab, however these is a security issue.\r\n // Prevent Reverse Tabnabbing's attacks (https://www.owasp.org/index.php/Reverse_Tabnabbing)\r\n // Some resources:\r\n // - https://www.owasp.org/index.php/HTML5_Security_Cheat_Sheet#Tabnabbing\r\n // - https://medium.com/@jitbit/target-blank-the-most-underestimated-vulnerability-ever-96e328301f4c\r\n // - https://developer.mozilla.org/en-US/docs/Web/API/Window/open\r\n const newWindow = window.open(eventToEmit.image.modal.extUrl, 'noopener,noreferrer,');\r\n newWindow.opener = null; // required to prevent security issues\r\n } else {\r\n window.location.href = eventToEmit.image.modal.extUrl;\r\n }\r\n }\r\n }\r\n this.buttonAfterHook.emit(eventToEmit);\r\n }\r\n\r\n /**\r\n * Method called by the download upper button.\r\n * @param ButtonEvent event payload\r\n */\r\n onDownload(event: ButtonEvent) {\r\n const eventToEmit: ButtonEvent = this.getButtonEventToEmit(event);\r\n this.buttonBeforeHook.emit(eventToEmit);\r\n this.downloadImage();\r\n this.buttonAfterHook.emit(eventToEmit);\r\n }\r\n\r\n /**\r\n * Method called by the close upper button.\r\n * @param ButtonEvent event payload\r\n * @param Action action that triggered the close method. `Action.NORMAL` by default\r\n */\r\n onCloseGallery(event: ButtonEvent, action: Action = Action.NORMAL) {\r\n const eventToEmit: ButtonEvent = this.getButtonEventToEmit(event);\r\n this.buttonBeforeHook.emit(eventToEmit);\r\n this.closeGallery(action);\r\n this.buttonAfterHook.emit(eventToEmit);\r\n }\r\n\r\n /**\r\n * Method to close the modal gallery specifying the action.\r\n * It also reset the `keyboardService` to prevent multiple listeners.\r\n * @param Action action type. `Action.NORMAL` by default\r\n * @param boolean isCalledByService is true if called by gallery.service, otherwise false\r\n */\r\n closeGallery(action: Action = Action.NORMAL, isCalledByService: boolean = false) {\r\n this.close.emit(new ImageModalEvent(action, true));\r\n this.opened = false;\r\n this.keyboardService.reset();\r\n\r\n\r\n // чтобы сбрасывался класс rotate\r\n let image= this.getImageByIdFromImages(this.currentImage.id);\r\n image.angle =0;\r\n if (this.currentImage.modal && this.currentImage.modal.angle) {\r\n this.currentImage.modal.angle = undefined;\r\n }\r\n\r\n // shows scrollbar\r\n document.body.style.overflow = 'visible';\r\n\r\n if (isCalledByService) {\r\n // the following is required, otherwise the view will not be updated\r\n // this happens only if called by gallery.service\r\n this.changeDetectorRef.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * Method called when you click on an image of your plain (or inline) gallery.\r\n * @param number index of the clicked image\r\n */\r\n onShowModalGallery(index: number) {\r\n this.showModalGallery(index);\r\n }\r\n\r\n /**\r\n * Method to show the modal gallery displaying the image with\r\n * the index specified as input parameter.\r\n * It will also register a new `keyboardService` to catch keyboard's events to download the current\r\n * image with keyboard's shortcuts. This service, will be removed either when modal gallery component\r\n * will be destroyed or when the gallery is closed invoking the `closeGallery` method.\r\n * @param number index of the image to show\r\n * @param boolean isCalledByService is true if called by gallery.service, otherwise false\r\n */\r\n showModalGallery(index: number, isCalledByService: boolean = false) {\r\n // hides scrollbar\r\n document.body.style.overflow = 'hidden';\r\n\r\n this.keyboardService.add((event: KeyboardEvent, combo: string) => {\r\n if (event.preventDefault) {\r\n event.preventDefault();\r\n } else {\r\n // internet explorer\r\n event.returnValue = false;\r\n }\r\n this.downloadImage();\r\n });\r\n\r\n this.opened = true;\r\n // console.log(\"showModalGallery\",this.images,index)\r\n this.currentImage = this.images[index];\r\n\r\n // emit a new ImageModalEvent with the index of the current image\r\n this.show.emit(new ImageModalEvent(Action.LOAD, index + 1));\r\n\r\n if (isCalledByService) {\r\n // the following is required, otherwise the view will not be updated\r\n // this happens only if called by gallery.service\r\n this.changeDetectorRef.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * Method called when the image changes and used to update the `currentImage` object.\r\n * @param ImageModalEvent event payload\r\n */\r\n onChangeCurrentImage(event: ImageModalEvent) {\r\n const newIndex: number = event.result;\r\n if (newIndex < 0 || newIndex >= this.images.length) {\r\n return;\r\n }\r\n\r\n\r\n let image= this.getImageByIdFromImages(this.currentImage.id);\r\n image.angle =0;\r\n\r\n // чтобы сбрасывался класс rotate\r\n if (this.currentImage.modal && this.currentImage.modal.angle) {\r\n this.currentImage.modal.angle = undefined;\r\n }\r\n\r\n this.currentImage = this.images[newIndex];\r\n\r\n // emit first/last event based on newIndex value\r\n this.emitBoundaryEvent(event.action, newIndex);\r\n\r\n // emit current visible image index\r\n this.show.emit(new ImageModalEvent(event.action, newIndex + 1));\r\n }\r\n\r\n isPlainGalleryVisible(): boolean {\r\n if (\r\n this.plainGalleryConfig &&\r\n this.plainGalleryConfig.layout &&\r\n this.plainGalleryConfig.layout instanceof AdvancedLayout\r\n ) {\r\n return !this.plainGalleryConfig.layout.hideDefaultPlainGallery;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Method called when you click 'outside' (i.e. on the semi-transparent background)\r\n * to close the modal gallery if `enableCloseOutside` is true.\r\n * @param boolean event payload. True to close the modal gallery, false otherwise\r\n */\r\n onClickOutside(event: boolean) {\r\n if (event && this.enableCloseOutside) {\r\n this.closeGallery(Action.CLICK);\r\n }\r\n }\r\n\r\n /**\r\n * Method called when an image is loaded and the loading spinner has gone.\r\n * It sets the previouslyLoaded flag inside the Image to hide loading spinner when displayed again.\r\n * @param ImageLoadEvent event payload\r\n */\r\n onImageLoad(event: ImageLoadEvent) {\r\n // console.log('modal-image onImageLoad', event);\r\n // console.log('modal-image onImageLoad images before', this.images);\r\n\r\n // sets as previously loaded the image with index specified by `event.status`\r\n this.images = this.images.map((img: InternalLibImage) => {\r\n if (img && img.id === event.id) {\r\n return Object.assign({}, img, { previouslyLoaded: event.status });\r\n }\r\n return img;\r\n });\r\n\r\n // console.log('modal-image onImageLoad images after', this.images);\r\n }\r\n\r\n /**\r\n * Method called when a dot is clicked and used to update the current image.\r\n * @param number index of the clicked dot\r\n */\r\n onClickDot(index: number) {\r\n this.currentImage = this.images[index];\r\n }\r\n\r\n /**\r\n * Method called when an image preview is clicked and used to update the current image.\r\n * @param Image preview image\r\n */\r\n onClickPreview(event: ImageModalEvent) {\r\n this.onChangeCurrentImage(event);\r\n }\r\n\r\n // onClickArrow(event: InteractionEvent) {\r\n // // TODO validate before to emit\r\n // this.arrow.emit(event);\r\n // }\r\n\r\n /**\r\n * Method to download the current image, only if `downloadable` is true.\r\n * It contains also a logic to enable downloading features also for IE11.\r\n */\r\n downloadImage() {\r\n if (this.currentImageConfig && !this.currentImageConfig.downloadable) {\r\n return;\r\n }\r\n this.downloadImageAllBrowsers();\r\n }\r\n\r\n /**\r\n * Method to cleanup resources. In fact, this will reset keyboard's service.\r\n * This is an Angular's lifecycle hook that is called when this component is destroyed.\r\n */\r\n ngOnDestroy() {\r\n this.keyboardService.reset();\r\n\r\n this.idValidatorService.remove(this.id);\r\n\r\n if (this.galleryServiceNavigateSubscription) {\r\n this.galleryServiceNavigateSubscription.unsubscribe();\r\n }\r\n if (this.galleryServiceCloseSubscription) {\r\n this.galleryServiceCloseSubscription.unsubscribe();\r\n }\r\n if (this.galleryServiceUpdateSubscription) {\r\n this.galleryServiceUpdateSubscription.unsubscribe();\r\n }\r\n if (this.galleryServiceAutoPlaySubscription) {\r\n this.galleryServiceAutoPlaySubscription.unsubscribe();\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Private method to download the current image for all browsers.\r\n * @private\r\n */\r\n private downloadImageAllBrowsers(): void {\r\n const link = document.createElement('a');\r\n let isBase64 = false;\r\n let img: string;\r\n // convert a SafeResourceUrl to a string\r\n if (typeof this.currentImage.modal.img === 'string') {\r\n img = this.currentImage.modal.img as string;\r\n } else {\r\n // if it's a SafeResourceUrl\r\n img = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.currentImage.modal.img) as string;\r\n }\r\n if (img.includes('data:image/') || img.includes(';base64,')) {\r\n const extension: string = img.replace('data:image/', '').split(';base64,')[0];\r\n const pureBase64: string = img.split(';base64,')[1];\r\n const blob: Blob = this.base64toBlob(pureBase64, 'image/' + extension);\r\n link.href = URL.createObjectURL(blob);\r\n isBase64 = true;\r\n link.setAttribute('download', this.getFileName(this.currentImage, isBase64, extension));\r\n } else {\r\n link.href = img;\r\n link.setAttribute('download', this.getFileName(this.currentImage, isBase64));\r\n }\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n }\r\n\r\n /**\r\n * Method to convert a base64 to a Blob\r\n * @param base64Data string with base64 data\r\n * @param contentType string with the MIME type\r\n * @return Blob converted from the input base64Data\r\n * @private\r\n */\r\n private base64toBlob(base64Data: string, contentType: string = ''): Blob {\r\n const sliceSize = 1024;\r\n const byteCharacters: string = atob(base64Data);\r\n const bytesLength: number = byteCharacters.length;\r\n const slicesCount: number = Math.ceil(bytesLength / sliceSize);\r\n const byteArrays: Array = new Array(slicesCount);\r\n for (let sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\r\n const begin: number = sliceIndex * sliceSize;\r\n const end: number = Math.min(begin + sliceSize, bytesLength);\r\n const bytes: Array = new Array(end - begin);\r\n for (let offset = begin, i = 0; offset < end; ++i, ++offset) {\r\n bytes[i] = byteCharacters[offset].charCodeAt(0);\r\n }\r\n byteArrays[sliceIndex] = new Uint8Array(bytes);\r\n }\r\n return new Blob(byteArrays, { type: contentType });\r\n }\r\n\r\n /**\r\n * Private method to get the `ButtonEvent` to emit, merging the input `ButtonEvent`\r\n * with the current image.\r\n * @param ButtonEvent event payload to return\r\n * @returns ButtonEvent event payload with the current image included\r\n */\r\n private getButtonEventToEmit(event: ButtonEvent): ButtonEvent {\r\n return Object.assign(event, { image: this.currentImage });\r\n }\r\n\r\n /**\r\n * Private method to get the `ButtonEvent` to emit, merging the input `ButtonEvent`\r\n * with the current image.\r\n * @param ButtonEvent event payload to return\r\n * @returns ButtonEvent event payload with the current image included\r\n */\r\n private getButtonEventToEmitCSS(event: ButtonEvent): ButtonEvent {\r\n return Object.assign(event, { image: this.getImageByIdFromImages(this.currentImage.id) });\r\n }\r\n\r\n /**\r\n * Private method to get the file name from an input path.\r\n * This is used either to get the image's name from its path or from the Image itself,\r\n * if specified as 'downloadFileName' by the user.\r\n * @param image Image image to extract its file name\r\n * @param isBase64 boolean to set if the image is a base64 file or not. False by default.\r\n * @param base64Extension string to force the extension of the base64 image. Empty string by default.\r\n * @returns string string file name of the input image.\r\n * @private\r\n */\r\n private getFileName(image: Image, isBase64: boolean = false, base64Extension: string = ''): string {\r\n if (!image.modal.downloadFileName || image.modal.downloadFileName.length === 0) {\r\n if (isBase64) {\r\n return `Image-${image.id}.${base64Extension !== '' ? base64Extension : 'png'}`;\r\n } else {\r\n return (image.modal.img as string).replace(/^.*[\\\\\\/]/, '');\r\n }\r\n } else {\r\n return image.modal.downloadFileName;\r\n }\r\n }\r\n\r\n /**\r\n * Private method to initialize `images` as array of `Image`s.\r\n * Also, it will emit ImageowmodaModalEvent to say that images are loaded.\r\n */\r\n private initImages() {\r\n // I'm not cloning the array, but I'm doing this to cast it to an array of InternalLibImages\r\n this.images = this.modalImages;\r\n this.hasData.emit(new ImageModalEvent(Action.LOAD, true));\r\n this.showGallery = this.images.length > 0;\r\n }\r\n\r\n /**\r\n * Private method to emit events when either the last or the first image are visible.\r\n * @param action Enum of type Action that represents the source of the event that changed the\r\n * current image to the first one or the last one.\r\n * @param indexToCheck is the index number of the image (the first or the last one).\r\n */\r\n private emitBoundaryEvent(action: Action, indexToCheck: number) {\r\n // to emit first/last event\r\n switch (indexToCheck) {\r\n case 0:\r\n this.firstImage.emit(new ImageModalEvent(action, true));\r\n break;\r\n case this.images.length - 1:\r\n this.lastImage.emit(new ImageModalEvent(action, true));\r\n break;\r\n }\r\n }\r\n\r\n checkboxChange(event) {\r\n this.selectImage.emit(event);\r\n }\r\n\r\n showComments(){\r\n this.infoBlockContent = ButtonType.COMMENTS;\r\n this.openedInfoBlock = true;\r\n }\r\n closeComments(){\r\n if(this.infoBlockContent == ButtonType.COMMENTS)\r\n this.openedInfoBlock = false;\r\n }\r\n\r\n\r\n getImageByIdFromImages(id){\r\n return this.images.find((item)=>item.id==id)\r\n }\r\n getImageByIdFromModalImages(id){\r\n return this.modalImages.find((item)=>item.id==id)\r\n }\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { Directive, ElementRef, Input, OnChanges, OnInit, Renderer2 } from '@angular/core';\r\n\r\n/**\r\n * Directive to change the flex-wrap css property of an element.\r\n */\r\n@Directive({\r\n selector: '[ksWrap]'\r\n})\r\nexport class WrapDirective implements OnInit, OnChanges {\r\n /**\r\n * Boolean input that it's true to add 'flex-wrap: wrap', 'flex-wrap: nowrap' otherwise.\r\n */\r\n @Input()\r\n wrap: boolean;\r\n /**\r\n * String input to force the width of the element to be able to see wrapping.\r\n */\r\n @Input()\r\n width: string;\r\n\r\n constructor(private renderer: Renderer2, private el: ElementRef) {\r\n }\r\n\r\n /**\r\n * Method ´ngOnInit´ to apply the style of this directive.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called only one time!!!\r\n */\r\n ngOnInit() {\r\n this.applyStyle();\r\n }\r\n\r\n /**\r\n * Method ´ngOnChanges´ to apply the style of this directive.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called when any data-bound property of a directive changes!!!\r\n */\r\n ngOnChanges() {\r\n this.applyStyle();\r\n }\r\n\r\n /**\r\n * Private method to change both widht and flex-wrap css properties.\r\n */\r\n private applyStyle() {\r\n // TODO is this right???? If wrap os false I cannot apply width and flex-wrap\r\n if (!this.wrap) {\r\n return;\r\n }\r\n this.renderer.setStyle(this.el.nativeElement, 'width', this.width);\r\n this.renderer.setStyle(this.el.nativeElement, 'flex-wrap', this.wrap ? 'wrap' : 'nowrap');\r\n }\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { Directive, ElementRef, Input, OnChanges, OnInit, Renderer2 } from '@angular/core';\r\n\r\n/**\r\n * Directive to change the flex-direction of an element, based on two inputs (`direction` and `justify`).\r\n */\r\n@Directive({\r\n selector: '[ksDirection]'\r\n})\r\nexport class DirectionDirective implements OnInit, OnChanges {\r\n /**\r\n * String input to set the css flex-direction of an element.\r\n */\r\n @Input()\r\n direction: string;\r\n /**\r\n * String input to set the css justify-content of an element.\r\n */\r\n @Input()\r\n justify: string;\r\n\r\n constructor(private renderer: Renderer2, private el: ElementRef) {\r\n }\r\n\r\n /**\r\n * Method ´ngOnInit´ to apply the style of this directive.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called only one time!!!\r\n */\r\n ngOnInit() {\r\n this.applyStyle();\r\n }\r\n\r\n /**\r\n * Method ´ngOnChanges´ to apply the style of this directive.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called when any data-bound property of a directive changes!!!\r\n */\r\n ngOnChanges() {\r\n this.applyStyle();\r\n }\r\n\r\n /**\r\n * Private method to change both direction and justify of an element.\r\n */\r\n private applyStyle() {\r\n if (!this.direction || !this.justify) {\r\n return;\r\n }\r\n this.renderer.setStyle(this.el.nativeElement, 'flex-direction', this.direction);\r\n this.renderer.setStyle(this.el.nativeElement, 'justify-content', this.justify);\r\n }\r\n}\r\n","
    \r\n\r\n \r\n \r\n\r\n \r\n \"{{imgCol.plain?.alt\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n
    \r\n\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChange, SimpleChanges } from '@angular/core';\r\n\r\nimport { AccessibilityConfig } from '../../model/accessibility.interface';\r\nimport { Image } from '../../model/image.class';\r\nimport { Size } from '../../model/size.interface';\r\nimport { AdvancedLayout, GridLayout, LineLayout, PlainGalleryConfig, PlainGalleryStrategy } from '../../model/plain-gallery-config.interface';\r\n\r\nimport { getIndex } from '../../utils/image.util';\r\n\r\n/**\r\n * Component with the gallery of thumbs.\r\n * In receives an array of Images, a boolean to show/hide\r\n * the gallery (feature used by imagePointer) and a config\r\n * object to customize the behaviour of this component.\r\n * Also, it emits click events as outputs.\r\n */\r\n@Component({\r\n selector: 'ks-plain-gallery',\r\n styleUrls: ['plain-gallery.scss'],\r\n templateUrl: 'plain-gallery.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PlainGalleryComponent implements OnInit, OnChanges {\r\n /**\r\n * Array of `Image` that represent the model of this library with all images, thumbs and so on.\r\n */\r\n @Input()\r\n images: Image[];\r\n /**\r\n * Boolean to show/hide plain gallery. If true the plain gallery will be visible, false otherwise.\r\n */\r\n @Input()\r\n showGallery: boolean;\r\n /**\r\n * Object of type `PlainGalleryConfig` to configure the plain gallery.\r\n */\r\n @Input()\r\n plainGalleryConfig: PlainGalleryConfig;\r\n /**\r\n * Object of type `AccessibilityConfig` to init custom accessibility features.\r\n * For instance, it contains titles, alt texts, aria-labels and so on.\r\n */\r\n @Input()\r\n accessibilityConfig: AccessibilityConfig;\r\n\r\n /**\r\n * Output to emit an event when an image is changed.\r\n */\r\n @Output()\r\n show: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Object of type `PlainGalleryConfig` to configure this component.\r\n */\r\n configPlainGallery: PlainGalleryConfig;\r\n\r\n /**\r\n * Bi-dimensional array of `Image` object to store images to display as plain gallery.\r\n * [] by default.\r\n */\r\n imageGrid: Image[][] = [];\r\n /**\r\n * Size object used in the template to resize images.\r\n */\r\n size: Size;\r\n /**\r\n * Boolean passed as input to `ks-wrap` directive to configure flex-wrap css property.\r\n * However it's not enough, because you need to limit the width using `widthStyle` public variable.\r\n * For more info check https://developer.mozilla.org/it/docs/Web/CSS/flex-wrap\r\n */\r\n wrapStyle = false;\r\n /**\r\n * String passed as input to `ks-wrap` directive to set width to be able to force overflow.\r\n * In this way, `wrapStyle` (flex-wrap css property) will be used as requested.\r\n */\r\n widthStyle = '';\r\n /**\r\n * String passed as input to `ks-direction` directive to set the flex-direction css property.\r\n * For more info check https://developer.mozilla.org/it/docs/Web/CSS/flex-direction\r\n */\r\n directionStyle: string;\r\n /**\r\n * String passed as input to `ks-direction` directive to set the justify-content css property.\r\n * For more info check https://developer.mozilla.org/it/docs/Web/CSS/justify-content\r\n */\r\n justifyStyle: string;\r\n\r\n /**\r\n * Default image size object\r\n */\r\n private defaultSize: Size = {width: '50px', height: 'auto'};\r\n /**\r\n * Default layout config object\r\n * Note that length=-1 means infinity\r\n */\r\n private defaultLayout: LineLayout = new LineLayout(this.defaultSize, {length: -1, wrap: false}, 'flex-start');\r\n /**\r\n * Default plain gallery config object\r\n */\r\n private defaultPlainConfig: PlainGalleryConfig = {\r\n strategy: PlainGalleryStrategy.ROW,\r\n layout: this.defaultLayout,\r\n advanced: {aTags: false, additionalBackground: '50% 50%/cover'}\r\n };\r\n\r\n /**\r\n * Method ´ngOnChanges´ to update both `imageGrid` and`configPlainGallery`.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called when any data-bound property of a directive changes!!!\r\n */\r\n ngOnChanges(changes: SimpleChanges) {\r\n const imagesChange: SimpleChange = changes.images;\r\n const configChange: SimpleChange = changes.plainGalleryConfig;\r\n\r\n // I'm using !change.firstChange because the first time will be called both onInit and onChange and I don't\r\n // want to execute initialization two times.\r\n if (\r\n configChange &&\r\n !configChange.firstChange &&\r\n (configChange.previousValue !== configChange.currentValue || (!configChange.previousValue && !configChange.currentValue))\r\n ) {\r\n this.configPlainGallery = this.initPlainGalleryConfig();\r\n }\r\n if (imagesChange && !imagesChange.firstChange && imagesChange.previousValue !== imagesChange.currentValue) {\r\n this.initImageGrid();\r\n }\r\n }\r\n\r\n /**\r\n * Method ´ngOnInit´ to init both `configPlainGallery` calling `initPlainGalleryConfig()`\r\n * and `imageGrid invoking `initImageGrid()`.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called only one time!!!\r\n */\r\n ngOnInit() {\r\n this.configPlainGallery = this.initPlainGalleryConfig();\r\n this.initImageGrid();\r\n }\r\n\r\n /**\r\n * Method called when you click on an image of the plain (or inline) gallery.\r\n * This will emit the show event with the index number as payload.\r\n * @param number index of the clicked image\r\n */\r\n showModalGallery(index: number) {\r\n this.show.emit(index);\r\n }\r\n\r\n /**\r\n * Method called when you click on an image of the plain (or inline) gallery.\r\n * This will emit the show event with the image as payload.\r\n * @param Image img is the Image to show\r\n */\r\n showModalGalleryByImage(img: Image) {\r\n const index: number = this.images.findIndex((val: Image) => val && img && val.id === img.id);\r\n this.showModalGallery(index);\r\n }\r\n\r\n /**\r\n * Method to get `alt attribute`.\r\n * `alt` specifies an alternate text for an image, if the image cannot be displayed.\r\n * @param Image image to get its alt description.\r\n * @returns string alt description of the image\r\n */\r\n getAltPlainDescriptionByImage(image: Image): string {\r\n if (!image) {\r\n return '';\r\n }\r\n return image.plain && image.plain.description ? image.plain.description : `Image ${getIndex(image, this.images) + 1}`;\r\n }\r\n\r\n /**\r\n * Method to get the title for an image.\r\n * @param Image image to get its title\r\n * @returns string the title of the input image\r\n */\r\n getTitleDisplay(image: Image): string {\r\n let description = '';\r\n\r\n if (image.plain && image.plain.description) {\r\n description = image.plain.description;\r\n } else if (image.modal && image.modal.description) {\r\n description = image.modal.description;\r\n }\r\n\r\n const currentIndex: number = getIndex(image, this.images);\r\n const prevDescription: string = 'Image ' + (currentIndex + 1) + '/' + this.images.length;\r\n let currImgDescription: string = description ? description : '';\r\n\r\n if (currImgDescription !== '') {\r\n currImgDescription = ' - ' + currImgDescription;\r\n }\r\n return prevDescription + currImgDescription;\r\n }\r\n\r\n /**\r\n * Method used in the template to track ids in ngFor.\r\n * @param number index of the array\r\n * @param Image item of the array\r\n * @returns number the id of the item\r\n */\r\n trackById(index: number, item: Image): number {\r\n return item.id;\r\n }\r\n\r\n /**\r\n * Private method to build and return a `PlainGalleryConfig` object, proving also default values.\r\n * @returns PlainGalleryConfig the plain gallery configuration\r\n * @throws an Error if layout and strategy aren't compatible\r\n */\r\n private initPlainGalleryConfig(): PlainGalleryConfig {\r\n const config: PlainGalleryConfig = Object.assign({}, this.defaultPlainConfig, this.plainGalleryConfig);\r\n\r\n if (config.layout instanceof LineLayout) {\r\n if (config.strategy !== PlainGalleryStrategy.ROW && config.strategy !== PlainGalleryStrategy.COLUMN) {\r\n throw new Error('LineLayout requires either ROW or COLUMN strategy');\r\n }\r\n if (!config.layout || !config.layout.breakConfig) {\r\n throw new Error('Both layout and breakConfig must be valid');\r\n }\r\n }\r\n\r\n if (config.layout instanceof GridLayout) {\r\n if (config.strategy !== PlainGalleryStrategy.GRID) {\r\n throw new Error('GridLayout requires GRID strategy');\r\n }\r\n if (!config.layout || !config.layout.breakConfig) {\r\n throw new Error('Both layout and breakConfig must be valid');\r\n }\r\n // force wrap for grid layout\r\n config.layout.breakConfig.wrap = true;\r\n }\r\n\r\n if (config.layout instanceof AdvancedLayout) {\r\n if (config.strategy !== PlainGalleryStrategy.CUSTOM) {\r\n throw new Error('AdvancedLayout requires CUSTOM strategy');\r\n }\r\n }\r\n return config;\r\n }\r\n\r\n /**\r\n * Private method to init both `imageGrid` and other style variables,\r\n * based on the layout type.\r\n */\r\n private initImageGrid() {\r\n const config: PlainGalleryConfig = this.configPlainGallery;\r\n\r\n // reset the array to prevent issues in case of GridLayout\r\n this.imageGrid = [];\r\n\r\n if (config.layout instanceof LineLayout) {\r\n const layout: LineLayout = config.layout;\r\n const row: Image[] = this.images.filter((val: Image, i: number) => i < layout.breakConfig.length || layout.breakConfig.length === -1);\r\n this.imageGrid = [row];\r\n\r\n this.size = config.layout.size;\r\n\r\n switch (config.strategy) {\r\n case PlainGalleryStrategy.ROW:\r\n this.directionStyle = 'row';\r\n break;\r\n case PlainGalleryStrategy.COLUMN:\r\n this.directionStyle = 'column';\r\n this.wrapStyle = layout.breakConfig.wrap;\r\n break;\r\n }\r\n this.justifyStyle = layout.justify;\r\n }\r\n\r\n if (config.layout instanceof GridLayout) {\r\n const layout: GridLayout = config.layout;\r\n const count: number = Math.ceil(this.images.length / layout.breakConfig.length);\r\n let start = 0;\r\n let end: number = layout.breakConfig.length - 1;\r\n\r\n for (let j = 0; j < count; j++) {\r\n const row: Image[] = this.images.filter((val: Image, i: number) => i >= start && i <= end);\r\n this.imageGrid.push(row);\r\n start = end + 1;\r\n end = start + layout.breakConfig.length - 1;\r\n }\r\n\r\n this.size = config.layout.size;\r\n\r\n const pixels: number = +layout.size.width.replace('px', '');\r\n\r\n this.widthStyle = pixels * layout.breakConfig.length + pixels / 2 + 'px';\r\n this.wrapStyle = layout.breakConfig.wrap;\r\n\r\n this.directionStyle = 'row';\r\n }\r\n\r\n if (config.layout instanceof AdvancedLayout) {\r\n this.imageGrid = [this.images];\r\n }\r\n }\r\n}\r\n","\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChange, SimpleChanges } from '@angular/core';\r\n\r\nimport { AccessibleComponent } from '../accessible.component';\r\n\r\nimport { AccessibilityConfig } from '../../model/accessibility.interface';\r\nimport { Image, ImageEvent, ImageModalEvent } from '../../model/image.class';\r\nimport { InternalLibImage } from '../../model/image-internal.class';\r\nimport { Size } from '../../model/size.interface';\r\nimport { PreviewConfig } from '../../model/preview-config.interface';\r\nimport { SlideConfig } from '../../model/slide-config.interface';\r\n\r\nimport { NEXT, PREV } from '../../utils/user-input.util';\r\nimport { getIndex } from '../../utils/image.util';\r\nimport { Action } from '../../model/action.enum';\r\n\r\n/**\r\n * Component with image previews\r\n */\r\n@Component({\r\n selector: 'ks-previews',\r\n styleUrls: ['previews.scss', '../previews-arrows.scss'],\r\n templateUrl: 'previews.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PreviewsComponent extends AccessibleComponent implements OnInit, OnChanges {\r\n /**\r\n * Object of type `InternalLibImage` that represent the visible image.\r\n */\r\n @Input()\r\n currentImage: InternalLibImage;\r\n /**\r\n * Array of `InternalLibImage` that represent the model of this library with all images,\r\n * thumbs and so on.\r\n */\r\n @Input()\r\n images: InternalLibImage[];\r\n /**\r\n * Object of type `SlideConfig` to get `infinite sliding`.\r\n */\r\n @Input()\r\n slideConfig: SlideConfig;\r\n /**\r\n * Object of type `PreviewConfig` to init PreviewsComponent's features.\r\n * For instance, it contains a param to show/hide this component, sizes.\r\n */\r\n @Input()\r\n previewConfig: PreviewConfig;\r\n /**\r\n * Object of type `AccessibilityConfig` to init custom accessibility features.\r\n * For instance, it contains titles, alt texts, aria-labels and so on.\r\n */\r\n @Input()\r\n accessibilityConfig: AccessibilityConfig;\r\n /**\r\n * Output to emit the clicked preview. The payload contains the `ImageEvent` associated to the clicked preview.\r\n */\r\n @Output()\r\n clickPreview: EventEmitter = new EventEmitter();\r\n // /**\r\n // * Output to emit the clicked arrow. The payload contains which arrow (left or right).\r\n // */\r\n // @Output()\r\n // clickArrow: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Enum of type `Action` that represents a mouse click on a button.\r\n * Declared here to be used inside the template.\r\n */\r\n clickAction: Action = Action.CLICK;\r\n /**\r\n * Enum of type `Action` that represents a keyboard action.\r\n * Declared here to be used inside the template.\r\n */\r\n keyboardAction: Action = Action.KEYBOARD;\r\n /**\r\n * Array of `InternalLibImage` exposed to the template. This field is initialized\r\n * applying transformations, default values and so on to the input of the same type.\r\n */\r\n previews: InternalLibImage[] = [];\r\n /**\r\n * Object of type `PreviewConfig` exposed to the template. This field is initialized\r\n * applying transformations, default values and so on to the input of the same type.\r\n */\r\n configPreview: PreviewConfig;\r\n\r\n /**\r\n * Start index of the input images used to display previews.\r\n */\r\n start: number;\r\n /**\r\n * End index of the input images used to display previews.\r\n */\r\n end: number;\r\n\r\n /**\r\n * Default preview's size object, also used in the template to apply default sizes to ksSize's directive.\r\n */\r\n defaultPreviewSize: Size = {height: '50px', width: 'auto'};\r\n\r\n /**\r\n * Default preview's config object\r\n */\r\n private defaultPreviewConfig: PreviewConfig = {\r\n visible: true,\r\n number: 3,\r\n arrows: true,\r\n clickable: true,\r\n // alwaysCenter: false, // TODO still not implemented\r\n size: this.defaultPreviewSize\r\n };\r\n\r\n /**\r\n * Method ´ngOnInit´ to build `configPreview` applying a default value and also to\r\n * init the `previews` array.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called only one time!!!\r\n */\r\n ngOnInit() {\r\n this.configPreview = Object.assign({}, this.defaultPreviewConfig, this.previewConfig);\r\n\r\n // if number is <= 0 reset to default\r\n if (this.configPreview && this.configPreview.number && this.configPreview.number <= 0) {\r\n this.configPreview.number = this.defaultPreviewConfig.number;\r\n }\r\n\r\n // init previews based on currentImage and the full array of images\r\n this.initPreviews(this.currentImage, this.images);\r\n }\r\n\r\n /**\r\n * Method to check if an image is active (i.e. a preview image).\r\n * @param InternalLibImage preview is an image to check if it's active or not\r\n * @returns boolean true if is active, false otherwise\r\n */\r\n isActive(preview: InternalLibImage): boolean {\r\n if (!preview || !this.currentImage) {\r\n return false;\r\n }\r\n return preview.id === this.currentImage.id;\r\n }\r\n\r\n // TODO improve this method to simplify the sourcecode + remove duplicated codelines\r\n /**\r\n * Method ´ngOnChanges´ to update `previews` array.\r\n * Also, both `start` and `end` local variables will be updated accordingly.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called when any data-bound property of a directive changes!!!\r\n */\r\n ngOnChanges(changes: SimpleChanges) {\r\n const images: SimpleChange = changes.images;\r\n const currentImage: SimpleChange = changes.currentImage;\r\n\r\n let prev;\r\n let current;\r\n\r\n if (currentImage) {\r\n prev = currentImage.previousValue;\r\n current = currentImage.currentValue;\r\n } else {\r\n current = this.currentImage;\r\n }\r\n\r\n if (current && images && images.previousValue && images.currentValue) {\r\n // I'm in this if statement, if input images are changed (for instance, because I removed one of them with the 'delete button',\r\n // or because users changed the images array while modal gallery is still open).\r\n // In this case, I have to re-init previews, because the input array of images is changed.\r\n this.initPreviews(current, images.currentValue);\r\n }\r\n\r\n if (prev && current && prev.id !== current.id) {\r\n this.updatePreviews(prev, current);\r\n }\r\n }\r\n\r\n /**\r\n * Method called by events from both keyboard and mouse on a preview.\r\n * This will trigger the `clickpreview` output with the input preview as its payload.\r\n * @param InternalLibImage preview that triggered this method\r\n * @param KeyboardEvent | MouseEvent event payload\r\n */\r\n onImageEvent(preview: InternalLibImage, event: KeyboardEvent | MouseEvent, action: Action = Action.NORMAL) {\r\n if (!this.configPreview || !this.configPreview.clickable) {\r\n return;\r\n }\r\n const result: number = super.handleImageEvent(event);\r\n if (result === NEXT || result === PREV) {\r\n this.clickPreview.emit(new ImageModalEvent(action, getIndex(preview, this.images)));\r\n }\r\n }\r\n\r\n /**\r\n * Method called by events from both keyboard and mouse on a navigation arrow.\r\n * It also emits an event to specify which arrow.\r\n * @param string direction of the navigation that can be either 'next' or 'prev'\r\n * @param KeyboardEvent | MouseEvent event payload\r\n */\r\n onNavigationEvent(direction: string, event: KeyboardEvent | MouseEvent, action: Action = Action.NORMAL) {\r\n const result: number = super.handleNavigationEvent(direction, event);\r\n if (result === NEXT) {\r\n // this.clickArrow.emit({ source: 'modal-previews', payload: DIRECTION_RIGHT, action: action });\r\n this.next();\r\n } else if (result === PREV) {\r\n // this.clickArrow.emit({ source: 'modal-previews', payload: DIRECTION_LEFT, action: action });\r\n this.previous();\r\n }\r\n }\r\n\r\n /**\r\n * Method used in the template to track ids in ngFor.\r\n * @param number index of the array\r\n * @param Image item of the array\r\n * @returns number the id of the item\r\n */\r\n trackById(index: number, item: Image): number {\r\n return item.id;\r\n }\r\n\r\n /**\r\n * Private method to init previews based on the currentImage and the full array of images.\r\n * The current image in mandatory to show always the current preview (as highlighted).\r\n * @param InternalLibImage currentImage to decide how to show previews, because I always want to see the current image as highlighted\r\n * @param InternalLibImage[] images is the array of all images.\r\n */\r\n private initPreviews(currentImage: InternalLibImage, images: InternalLibImage[]) {\r\n let index: number;\r\n try {\r\n index = getIndex(currentImage, images);\r\n } catch (err) {\r\n throw err;\r\n }\r\n switch (index) {\r\n case 0:\r\n // first image\r\n this.setBeginningIndexesPreviews();\r\n break;\r\n case images.length - 1:\r\n // last image\r\n this.setEndIndexesPreviews();\r\n break;\r\n default:\r\n // other images\r\n this.setIndexesPreviews();\r\n break;\r\n }\r\n this.previews = images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\r\n }\r\n\r\n /**\r\n * Private method to init both `start` and `end` to the beginning.\r\n */\r\n private setBeginningIndexesPreviews() {\r\n this.start = 0;\r\n this.end = Math.min(this.configPreview.number, this.images.length);\r\n }\r\n\r\n /**\r\n * Private method to init both `start` and `end` to the end.\r\n */\r\n private setEndIndexesPreviews() {\r\n this.start = this.images.length - 1 - (this.configPreview.number - 1);\r\n this.end = this.images.length;\r\n }\r\n\r\n /**\r\n * Private method to update both `start` and `end` based on the currentImage.\r\n */\r\n private setIndexesPreviews() {\r\n this.start = getIndex(this.currentImage, this.images) - Math.floor(this.configPreview.number / 2);\r\n this.end = getIndex(this.currentImage, this.images) + Math.floor(this.configPreview.number / 2) + 1;\r\n }\r\n\r\n /**\r\n * Private method to update the visible previews navigating to the right (next).\r\n */\r\n private next() {\r\n // check if nextImage should be blocked\r\n if (this.isPreventSliding(this.images.length - 1)) {\r\n return;\r\n }\r\n\r\n if (this.end === this.images.length) {\r\n return;\r\n }\r\n\r\n this.start++;\r\n this.end = Math.min(this.end + 1, this.images.length);\r\n\r\n this.previews = this.images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\r\n }\r\n\r\n /**\r\n * Private method to update the visible previews navigating to the left (previous).\r\n */\r\n private previous() {\r\n // check if prevImage should be blocked\r\n if (this.isPreventSliding(0)) {\r\n return;\r\n }\r\n\r\n if (this.start === 0) {\r\n return;\r\n }\r\n\r\n this.start = Math.max(this.start - 1, 0);\r\n this.end = Math.min(this.end - 1, this.images.length);\r\n\r\n this.previews = this.images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\r\n }\r\n\r\n /**\r\n * Private method to block/permit sliding between previews.\r\n * @param number boundaryIndex is the first or the last index of `images` input array\r\n * @returns boolean if true block sliding, otherwise not\r\n */\r\n private isPreventSliding(boundaryIndex: number): boolean {\r\n return !!this.slideConfig && this.slideConfig.infinite === false && getIndex(this.currentImage, this.images) === boundaryIndex;\r\n }\r\n\r\n /**\r\n * Private method to handle navigation changing the previews array and other variables.\r\n */\r\n private updatePreviews(prev: InternalLibImage, current: InternalLibImage) {\r\n // to manage infinite sliding I have to reset both `start` and `end` at the beginning\r\n // to show again previews from the first image.\r\n // This happens when you navigate over the last image to return to the first one\r\n let prevIndex: number;\r\n let currentIndex: number;\r\n try {\r\n prevIndex = getIndex(prev, this.images);\r\n currentIndex = getIndex(current, this.images);\r\n } catch (err) {\r\n console.error('Cannot get previous and current image indexes in previews');\r\n throw err;\r\n }\r\n if (prevIndex === this.images.length - 1 && currentIndex === 0) {\r\n // first image\r\n this.setBeginningIndexesPreviews();\r\n this.previews = this.images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\r\n return;\r\n }\r\n // the same for the opposite case, when you navigate back from the fist image to go to the last one.\r\n if (prevIndex === 0 && currentIndex === this.images.length - 1) {\r\n // last image\r\n this.setEndIndexesPreviews();\r\n this.previews = this.images.filter((img: InternalLibImage, i: number) => i >= this.start && i < this.end);\r\n return;\r\n }\r\n\r\n // otherwise manage standard scenarios\r\n if (prevIndex > currentIndex) {\r\n this.previous();\r\n } else if (prevIndex < currentIndex) {\r\n this.next();\r\n }\r\n }\r\n}\r\n","import { ButtonConfig, ButtonType } from '../../model/buttons-config.interface';\r\nimport { Size } from '../../model/size.interface';\r\n\r\n/**\r\n * Default button size object\r\n */\r\nexport const KS_DEFAULT_SIZE: Size = {height: 'auto', width: '30px'};\r\n\r\n/**\r\n * Default close button object\r\n */\r\nexport const KS_DEFAULT_BTN_CLOSE: ButtonConfig = {\r\n className: 'close-image',\r\n size: KS_DEFAULT_SIZE,\r\n type: ButtonType.CLOSE,\r\n title: 'Close this modal image gallery',\r\n ariaLabel: 'Close this modal image gallery',\r\n visible: true\r\n};\r\n\r\n/**\r\n * Default download button object\r\n */\r\nexport const KS_DEFAULT_BTN_DOWNLOAD: ButtonConfig = {\r\n className: 'download-image',\r\n size: KS_DEFAULT_SIZE,\r\n type: ButtonType.DOWNLOAD,\r\n title: 'Download the current image',\r\n ariaLabel: 'Download the current image',\r\n visible: true\r\n};\r\n\r\n/**\r\n * Default exturl button object\r\n */\r\nexport const KS_DEFAULT_BTN_EXTURL: ButtonConfig = {\r\n className: 'ext-url-image',\r\n size: KS_DEFAULT_SIZE,\r\n type: ButtonType.EXTURL,\r\n title: 'Navigate the current image',\r\n ariaLabel: 'Navigate the current image',\r\n visible: true\r\n};\r\n// /**\r\n// * Default refresh button object\r\n// */\r\n// export const KS_DEFAULT_BTN_REFRESH: ButtonConfig = {\r\n// className: 'refresh-image',\r\n// size: KS_DEFAULT_SIZE,\r\n// type: ButtonType.REFRESH,\r\n// title: 'Refresh all images',\r\n// ariaLabel: 'Refresh all images',\r\n// visible: true\r\n// };\r\n\r\n/**\r\n * Default delete button object\r\n */\r\nexport const KS_DEFAULT_BTN_DELETE: ButtonConfig = {\r\n className: 'delete-image',\r\n size: KS_DEFAULT_SIZE,\r\n type: ButtonType.DELETE,\r\n title: 'Delete the current image',\r\n ariaLabel: 'Delete the current image',\r\n visible: true\r\n};\r\n\r\n/**\r\n * Default full-screen button object\r\n */\r\nexport const KS_DEFAULT_BTN_FULL_SCREEN: ButtonConfig = {\r\n className: 'fullscreen-image',\r\n size: KS_DEFAULT_SIZE,\r\n type: ButtonType.FULLSCREEN,\r\n title: 'Switch to full-screen',\r\n ariaLabel: 'Switch to full-screen',\r\n visible: true\r\n};\r\n/**\r\n * Default rotate button object\r\n */\r\n// export const KS_DEFAULT_BTN_ROTATE: ButtonConfig = {\r\n// className: 'rotate-image',\r\n// size: KS_DEFAULT_SIZE,\r\n// type: ButtonType.ROTATE,\r\n// title: 'Rotate clockwise of 90 degrees the current image',\r\n// ariaLabel: 'Rotate clockwise of 90 degrees the current image',\r\n// visible: true\r\n// };\r\n","
    \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\n\r\nimport { AccessibleComponent } from '../accessible.component';\r\n\r\nimport { Action } from '../../model/action.enum';\r\nimport { Image } from '../../model/image.class';\r\nimport {\r\n ButtonConfig,\r\n ButtonEvent,\r\n ButtonsConfig,\r\n ButtonsStrategy,\r\n ButtonType,\r\n WHITELIST_BUTTON_TYPES\r\n} from '../../model/buttons-config.interface';\r\n\r\nimport {\r\n KS_DEFAULT_BTN_CLOSE,\r\n KS_DEFAULT_BTN_DELETE,\r\n KS_DEFAULT_BTN_DOWNLOAD,\r\n KS_DEFAULT_BTN_EXTURL,\r\n KS_DEFAULT_BTN_FULL_SCREEN\r\n} from './upper-buttons-default';\r\n\r\nimport { NEXT } from '../../utils/user-input.util';\r\n\r\n/**\r\n * Internal representation of `ButtonConfig` with an optional `id` field, used by trackId to improve performances.\r\n */\r\nexport interface InternalButtonConfig extends ButtonConfig {\r\n id?: number; // useful only for trackById, not needed by users\r\n}\r\n\r\n/**\r\n * Component with all upper buttons.\r\n * Also it emits click events as outputs.\r\n */\r\n@Component({\r\n selector: 'ks-upper-buttons',\r\n styleUrls: ['upper-buttons.scss'],\r\n templateUrl: 'upper-buttons.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class UpperButtonsComponent extends AccessibleComponent implements OnInit {\r\n /**\r\n * Object of type `Image` that represent the visible image.\r\n */\r\n @Input()\r\n currentImage: Image;\r\n /**\r\n * Object of type `ButtonsConfig` to init UpperButtonsComponent's features.\r\n * For instance, it contains an array of buttons.\r\n */\r\n @Input()\r\n buttonsConfig: ButtonsConfig;\r\n\r\n /**\r\n * Output to emit clicks on refresh button. The payload contains a `ButtonEvent`.\r\n */\r\n @Output()\r\n refresh: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit clicks on delete button. The payload contains a `ButtonEvent`.\r\n */\r\n @Output()\r\n delete: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit clicks on navigate button. The payload contains a `ButtonEvent`.\r\n */\r\n @Output()\r\n navigate: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit clicks on download button. The payload contains a `ButtonEvent`.\r\n */\r\n @Output()\r\n download: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit clicks on close button. The payload contains a `ButtonEvent`.\r\n */\r\n @Output()\r\n close: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit clicks on full-screen button. The payload contains a `ButtonEvent`.\r\n */\r\n @Output()\r\n fullscreen: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit clicks on rotate button. The payload contains a `ButtonEvent`.\r\n */\r\n @Output()\r\n rotate: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit clicks on comments button. The payload contains a `ButtonEvent`.\r\n */\r\n @Output()\r\n comments: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit clicks on all custom buttons. The payload contains a `ButtonEvent`.\r\n */\r\n @Output()\r\n customEmit: EventEmitter = new EventEmitter();\r\n /**\r\n * Output to emit clicks on all custom buttons. The payload contains a `ButtonEvent`.\r\n */\r\n @Output()\r\n info: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Output to emit clicks on rotate button. The payload contains a `ButtonEvent`.\r\n */\r\n @Output()\r\n rotateCss: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Array of `InternalButtonConfig` exposed to the template. This field is initialized\r\n * applying transformations, default values and so on to the input of the same type.\r\n */\r\n buttons: InternalButtonConfig[];\r\n /**\r\n * Object of type `ButtonsConfig` exposed to the template. This field is initialized\r\n * applying transformations, default values and so on to the input of the same type.\r\n */\r\n configButtons: ButtonsConfig;\r\n\r\n /**\r\n * Default buttons array for standard configuration\r\n */\r\n private defaultButtonsDefault: ButtonConfig[] = [KS_DEFAULT_BTN_CLOSE];\r\n /**\r\n * Default buttons array for simple configuration\r\n */\r\n private simpleButtonsDefault: ButtonConfig[] = [KS_DEFAULT_BTN_DOWNLOAD, ...this.defaultButtonsDefault];\r\n /**\r\n * Default buttons array for advanced configuration\r\n */\r\n private advancedButtonsDefault: ButtonConfig[] = [KS_DEFAULT_BTN_EXTURL, ...this.simpleButtonsDefault];\r\n /**\r\n * Default buttons array for full configuration\r\n */\r\n private fullButtonsDefault: ButtonConfig[] = [\r\n /*KS_DEFAULT_BTN_REFRESH, */\r\n KS_DEFAULT_BTN_FULL_SCREEN,\r\n KS_DEFAULT_BTN_DELETE,\r\n ...this.advancedButtonsDefault\r\n ];\r\n\r\n /**\r\n * Method ´ngOnInit´ to build `configButtons` applying a default value and also to\r\n * init the `buttons` array.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called only one time!!!\r\n */\r\n ngOnInit() {\r\n const defaultConfig: ButtonsConfig = { visible: true, strategy: ButtonsStrategy.DEFAULT };\r\n this.configButtons = Object.assign(defaultConfig, this.buttonsConfig);\r\n switch (this.configButtons.strategy) {\r\n case ButtonsStrategy.SIMPLE:\r\n this.buttons = this.addButtonIds(this.simpleButtonsDefault);\r\n break;\r\n case ButtonsStrategy.ADVANCED:\r\n this.buttons = this.addButtonIds(this.advancedButtonsDefault);\r\n break;\r\n case ButtonsStrategy.FULL:\r\n this.buttons = this.addButtonIds(this.fullButtonsDefault);\r\n break;\r\n case ButtonsStrategy.CUSTOM:\r\n this.buttons = this.addButtonIds(this.validateCustomButtons(this.configButtons.buttons));\r\n break;\r\n case ButtonsStrategy.DEFAULT:\r\n default:\r\n this.buttons = this.addButtonIds(this.defaultButtonsDefault);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Method called by events from both keyboard and mouse on a button.\r\n * This will call a private method to trigger an output with the right payload.\r\n * @param InternalButtonConfig button that called this method\r\n * @param KeyboardEvent | MouseEvent event payload\r\n * @param Action action that triggered the source event or `Action.CLICK` if not specified\r\n * @throws an error if the button type is unknown\r\n */\r\n onEvent(button: InternalButtonConfig, event: KeyboardEvent | MouseEvent, action: Action = Action.CLICK) {\r\n if (!event) {\r\n return;\r\n }\r\n const dataToEmit: ButtonEvent = {\r\n button: button,\r\n // current image initialized as null\r\n // (I'll fill this value inside the parent of this component\r\n image: null,\r\n action: action\r\n };\r\n switch (button.type) {\r\n // case ButtonType.REFRESH:\r\n // this.triggerOnMouseAndKeyboard(this.refresh, event, dataToEmit);\r\n // break;\r\n case ButtonType.DELETE:\r\n this.triggerOnMouseAndKeyboard(this.delete, event, dataToEmit);\r\n break;\r\n case ButtonType.EXTURL:\r\n if (!this.currentImage || !this.currentImage.modal || !this.currentImage.modal.extUrl) {\r\n return;\r\n }\r\n this.triggerOnMouseAndKeyboard(this.navigate, event, dataToEmit);\r\n break;\r\n case ButtonType.DOWNLOAD:\r\n this.triggerOnMouseAndKeyboard(this.download, event, dataToEmit);\r\n break;\r\n case ButtonType.CLOSE:\r\n this.triggerOnMouseAndKeyboard(this.close, event, dataToEmit);\r\n break;\r\n case ButtonType.CUSTOM:\r\n this.triggerOnMouseAndKeyboard(this.customEmit, event, dataToEmit);\r\n break;\r\n case ButtonType.FULLSCREEN:\r\n this.triggerOnMouseAndKeyboard(this.fullscreen, event, dataToEmit);\r\n break;\r\n case ButtonType.ROTATE_RIGHT:\r\n this.triggerOnMouseAndKeyboard(this.rotate, event, dataToEmit);\r\n break;\r\n case ButtonType.ROTATE_LEFT:\r\n this.triggerOnMouseAndKeyboard(this.rotate, event, dataToEmit);\r\n break;\r\n case ButtonType.COMMENTS:\r\n this.triggerOnMouseAndKeyboard(this.comments, event, dataToEmit);\r\n break;\r\n case ButtonType.INFO:\r\n this.triggerOnMouseAndKeyboard(this.info, event, dataToEmit);\r\n break;\r\n case ButtonType.ROTATE_RIGHT_CSS:\r\n this.triggerOnMouseAndKeyboard(this.rotateCss, event, dataToEmit);\r\n break;\r\n case ButtonType.ROTATE_LEFT_CSS:\r\n this.triggerOnMouseAndKeyboard(this.rotateCss, event, dataToEmit);\r\n break;\r\n default:\r\n throw new Error(`Unknown button's type into ButtonConfig`);\r\n }\r\n }\r\n\r\n /**\r\n * Method used in the template to track ids in ngFor.\r\n * @param number index of the array\r\n * @param Image item of the array\r\n * @returns number the id of the item or undefined if the item is not valid\r\n */\r\n trackById(index: number, item: InternalButtonConfig): number | undefined {\r\n return item ? item.id : undefined;\r\n }\r\n\r\n /**\r\n * Private method to emit an event using the specified output as an `EventEmitter`.\r\n * @param EventEmitter emitter is the output to emit the `ButtonEvent`\r\n * @param KeyboardEvent | MouseEvent event is the source that triggered this method\r\n * @param ButtonEvent dataToEmit payload to emit\r\n */\r\n private triggerOnMouseAndKeyboard(\r\n emitter: EventEmitter,\r\n event: KeyboardEvent | MouseEvent,\r\n dataToEmit: ButtonEvent\r\n ) {\r\n if (!emitter) {\r\n throw new Error(`UpperButtonsComponent unknown emitter in triggerOnMouseAndKeyboard`);\r\n }\r\n\r\n const result: number = super.handleImageEvent(event);\r\n if (result === NEXT) {\r\n emitter.emit(dataToEmit);\r\n }\r\n }\r\n\r\n /**\r\n * Private method to add ids to the array of buttons.\r\n * It adds ids in a reverse way, to be sure that the last button will always have id = 0.\r\n * This is really useful in unit testing to be sure that close button always have id = 0, download 1 and so on...\r\n * It's totally transparent to the user.\r\n * @param ButtonConfig[] buttons config array\r\n * @returns ButtonConfig[] the input array with incremental numeric ids\r\n */\r\n private addButtonIds(buttons: ButtonConfig[]): ButtonConfig[] {\r\n return buttons.map((val: ButtonConfig, i: number) => Object.assign(val, { id: buttons.length - 1 - i }));\r\n }\r\n\r\n /**\r\n * Private method to validate custom buttons received as input.\r\n * @param ButtonConfig[] buttons config array\r\n * @returns ButtonConfig[] the same input buttons config array\r\n * @throws an error is exists a button with an unknown type\r\n */\r\n private validateCustomButtons(buttons: ButtonConfig[] = []): ButtonConfig[] {\r\n buttons.forEach((val: ButtonConfig) => {\r\n const indexOfButtonType: number = WHITELIST_BUTTON_TYPES.findIndex((type: ButtonType) => type === val.type);\r\n if (indexOfButtonType === -1) {\r\n throw new Error(`Unknown ButtonType. For custom types use ButtonType.CUSTOM`);\r\n }\r\n });\r\n return buttons;\r\n }\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { Directive, ElementRef, Input, OnChanges, OnInit, Renderer2 } from '@angular/core';\r\n\r\nimport { Image } from '../model/image.class';\r\nimport { SafeResourceUrl } from '@angular/platform-browser';\r\n\r\n/**\r\n * Directive to add an image to an `` tag with some additional custom properties.\r\n */\r\n@Directive({\r\n selector: '[ksATagBgImage]'\r\n})\r\nexport class ATagBgImageDirective implements OnInit, OnChanges {\r\n /**\r\n * Object of type `Image` that represents the image to add to the `` tag.\r\n */\r\n @Input()\r\n image: Image;\r\n /**\r\n * Additional style to customize the background attribute.\r\n * Empty string by default.\r\n */\r\n @Input()\r\n style: string;\r\n\r\n constructor(private renderer: Renderer2, private el: ElementRef) {\r\n }\r\n\r\n /**\r\n * Method ´ngOnInit´ to apply the style of this directive.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called only one time!!!\r\n */\r\n ngOnInit() {\r\n this.applyStyle();\r\n }\r\n\r\n /**\r\n * Method ´ngOnChanges´ to apply the style of this directive.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called when any data-bound property of a directive changes!!!\r\n */\r\n ngOnChanges() {\r\n this.applyStyle();\r\n }\r\n\r\n /**\r\n * Private method to add an image as background of an `` tag.\r\n */\r\n private applyStyle() {\r\n if (!this.image || (!this.image.plain && !this.image.modal)) {\r\n return;\r\n }\r\n\r\n const imgPath: string | SafeResourceUrl = this.image.plain && this.image.plain.img ? this.image.plain.img : this.image.modal.img;\r\n this.renderer.setStyle(this.el.nativeElement, 'background', `url(\"${imgPath}\") ${this.style}`);\r\n }\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { Directive, ElementRef, Input, OnChanges, OnInit, Renderer2 } from '@angular/core';\r\nimport { Description } from '../model/description.interface';\r\n\r\n/**\r\n * Directive to customize the description.\r\n */\r\n@Directive({\r\n selector: '[ksDescription]'\r\n})\r\nexport class DescriptionDirective implements OnInit, OnChanges {\r\n /**\r\n * Object of type `Description` to resize the element.\r\n */\r\n @Input()\r\n description: Description;\r\n\r\n constructor(private renderer: Renderer2, private el: ElementRef) {\r\n }\r\n\r\n /**\r\n * Method ´ngOnInit´ to apply the style of this directive.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called only one time!!!\r\n */\r\n ngOnInit() {\r\n this.applyStyle();\r\n }\r\n\r\n /**\r\n * Method ´ngOnChanges´ to apply the style of this directive.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called when any data-bound property of a directive changes!!!\r\n */\r\n ngOnChanges() {\r\n this.applyStyle();\r\n }\r\n\r\n /**\r\n * Private method to change description's style.\r\n */\r\n private applyStyle() {\r\n if (!this.description) {\r\n return;\r\n }\r\n\r\n if (this.description.style) {\r\n this.renderer.setStyle(this.el.nativeElement, 'background', this.description.style.bgColor);\r\n this.renderer.setStyle(this.el.nativeElement, 'color', this.description.style.textColor);\r\n\r\n if (this.description.style.width) {\r\n this.renderer.setStyle(this.el.nativeElement, 'width', this.description.style.width);\r\n }\r\n if (this.description.style.height) {\r\n this.renderer.setStyle(this.el.nativeElement, 'height', this.description.style.height);\r\n }\r\n if (this.description.style.position) {\r\n this.renderer.setStyle(this.el.nativeElement, 'position', this.description.style.position);\r\n }\r\n if (this.description.style.top) {\r\n this.renderer.setStyle(this.el.nativeElement, 'top', this.description.style.top);\r\n }\r\n if (this.description.style.bottom) {\r\n this.renderer.setStyle(this.el.nativeElement, 'bottom', this.description.style.bottom);\r\n }\r\n if (this.description.style.left) {\r\n this.renderer.setStyle(this.el.nativeElement, 'left', this.description.style.left);\r\n }\r\n if (this.description.style.right) {\r\n this.renderer.setStyle(this.el.nativeElement, 'right', this.description.style.right);\r\n }\r\n\r\n this.renderer.setStyle(this.el.nativeElement, 'margin-top', this.description.style.marginTop ? this.description.style.marginTop : '0px');\r\n this.renderer.setStyle(this.el.nativeElement, 'margin-bottom', this.description.style.marginBottom ? this.description.style.marginBottom : '0px');\r\n this.renderer.setStyle(this.el.nativeElement, 'margin-left', this.description.style.marginLeft ? this.description.style.marginLeft : '0px');\r\n this.renderer.setStyle(this.el.nativeElement, 'margin-right', this.description.style.marginRight ? this.description.style.marginRight : '0px');\r\n }\r\n }\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { Directive, ElementRef, Input, OnChanges, OnInit, Renderer2 } from '@angular/core';\r\nimport { Size } from '../model/size.interface';\r\n\r\n/**\r\n * Directive to change the size of an element.\r\n */\r\n@Directive({\r\n selector: '[ksSize]'\r\n})\r\nexport class SizeDirective implements OnInit, OnChanges {\r\n /**\r\n * Object of type `Size` to resize the element.\r\n */\r\n @Input()\r\n sizeConfig: Size;\r\n\r\n constructor(private renderer: Renderer2, private el: ElementRef) {\r\n }\r\n\r\n /**\r\n * Method ´ngOnInit´ to apply the style of this directive.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called only one time!!!\r\n */\r\n ngOnInit() {\r\n this.applyStyle();\r\n }\r\n\r\n /**\r\n * Method ´ngOnChanges´ to apply the style of this directive.\r\n * This is an Angular's lifecycle hook, so its called automatically by Angular itself.\r\n * In particular, it's called when any data-bound property of a directive changes!!!\r\n */\r\n ngOnChanges() {\r\n this.applyStyle();\r\n }\r\n\r\n /**\r\n * Private method to change both width and height of an element.\r\n */\r\n private applyStyle() {\r\n if (!this.sizeConfig) {\r\n return;\r\n }\r\n // apply [style.width]\r\n this.renderer.setStyle(this.el.nativeElement, 'width', this.sizeConfig.width);\r\n this.renderer.setStyle(this.el.nativeElement, 'height', this.sizeConfig.height);\r\n }\r\n}\r\n","import { Directive, ElementRef, OnInit, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[slimScroll]'\r\n})\r\nexport class SlimScrollDirective implements OnInit {\r\n\r\n private lastHeight = 0;\r\n\r\n private observer = new MutationObserver(() => {\r\n\r\n let newHeight = this.elementRef.nativeElement.scrollHeight;\r\n\r\n if (this.lastHeight !== newHeight) {\r\n this.elementRef.nativeElement.scrollTo({top: this.elementRef.nativeElement.scrollHeight, behavior: 'smooth'});\r\n\r\n this.lastHeight = newHeight;\r\n }\r\n });\r\n\r\n constructor(private elementRef: ElementRef,\r\n private renderer: Renderer2) {\r\n this.renderer.addClass(this.elementRef.nativeElement, 'slim-scrollbar');\r\n }\r\n\r\n ngOnInit() {\r\n this.observer.observe(this.elementRef.nativeElement, {attributes: true, subtree: true});\r\n\r\n }\r\n\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { Injectable, ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { DIRECTIVES } from './directives/directives';\r\nimport { CarouselComponent, COMPONENTS, ModalGalleryComponent } from './components/components';\r\nimport { KEYBOARD_CONFIGURATION, KeyboardService } from './services/keyboard.service';\r\nimport { KeyboardServiceConfig } from './model/keyboard-service-config.interface';\r\nimport { HAMMER_GESTURE_CONFIG, HammerGestureConfig } from '@angular/platform-browser';\r\nimport { FaIconLibrary, FontAwesomeModule } from '@fortawesome/angular-fontawesome';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\n\r\n// to prevent bad scrolling behaviour on mobile phone with carousels.\r\n// From @mohaxspb (https://github.com/Ks89/angular-modal-gallery/pull/187)\r\n@Injectable()\r\nexport class KsHammerGestureConfig extends HammerGestureConfig {\r\n buildHammer(element: HTMLElement) {\r\n return new Hammer(element, {\r\n touchAction: 'pan-y'\r\n });\r\n }\r\n}\r\n function setupRouter(injector: KeyboardServiceConfig) {\r\n return new KeyboardService(injector);\r\n}\r\n/**\r\n * Module to import it in the root module of your application.\r\n */\r\n@NgModule({\r\n imports: [CommonModule, FontAwesomeModule, TranslateModule],\r\n declarations: [COMPONENTS, DIRECTIVES],\r\n exports: [ModalGalleryComponent, CarouselComponent,TranslateModule],\r\n providers: [\r\n {\r\n provide: HAMMER_GESTURE_CONFIG,\r\n useClass: KsHammerGestureConfig\r\n }, {\r\n provide: KeyboardService,\r\n useFactory: setupRouter,\r\n deps: [KEYBOARD_CONFIGURATION]\r\n }, {\r\n provide: KEYBOARD_CONFIGURATION,\r\n useValue: {}\r\n },\r\n ]\r\n})\r\nexport class GalleryModule {\r\n\r\n constructor(library: FaIconLibrary) {\r\n // library.addIcons();\r\n\r\n }\r\n /**\r\n * Importing with '.forRoot()' is deprecated. I'll provide a new way to do this in next releases.\r\n * Will be removed in 8.0.0 or 9.0.0\r\n */\r\n static forRoot(config?: KeyboardServiceConfig): ModuleWithProviders {\r\n return {\r\n ngModule: GalleryModule,\r\n providers: [\r\n {\r\n provide: KEYBOARD_CONFIGURATION,\r\n useValue: config ? config : {}\r\n },\r\n {\r\n provide: KeyboardService,\r\n useFactory: setupKeyboardService,\r\n deps: [KEYBOARD_CONFIGURATION]\r\n }\r\n ]\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Function to setup the keyboard service inside the `forRoot` method.\r\n * @param KeyboardServiceConfig injector is an interface of type `KeyboardServiceConfig` to pass data to KeyboardService\r\n * @returns KeyboardService an instance of the `KeyboardService`\r\n */\r\nexport function setupKeyboardService(injector: KeyboardServiceConfig): KeyboardService {\r\n return new KeyboardService(injector);\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\n/**\r\n * Enum `Action` with a list of possible actions, based on the source of the action.\r\n */\r\nexport enum Action {\r\n NORMAL, // default value\r\n CLICK, // mouse click\r\n KEYBOARD,\r\n SWIPE,\r\n LOAD,\r\n AUTOPLAY\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { Action } from './action.enum';\r\nimport { InternalLibImage } from './image-internal.class';\r\nimport { Size } from './size.interface';\r\n\r\n/**\r\n * Interface `ButtonsConfig` to add buttons, show/hide their, and to add the strategy.\r\n */\r\nexport interface ButtonsConfig {\r\n visible: boolean;\r\n strategy: ButtonsStrategy;\r\n buttons?: ButtonConfig[];\r\n}\r\n\r\n/**\r\n * Interface `ButtonConfig` to configure a single button.\r\n */\r\nexport interface ButtonConfig {\r\n className?: string;\r\n size?: Size;\r\n fontSize?: string;\r\n type: ButtonType;\r\n title?: string;\r\n ariaLabel?: string;\r\n extUrlInNewTab?: boolean; // to open the external url in a new tab, instead of the current one\r\n visible: boolean;\r\n}\r\n\r\n/**\r\n * Interface `ButtonEvent` to represent the event payload when a button is clicked.\r\n */\r\nexport interface ButtonEvent {\r\n button: ButtonConfig;\r\n image: InternalLibImage | null;\r\n action: Action;\r\n}\r\n\r\n/**\r\n * Enum `ButtonsStrategy` to configure the logic of a button.\r\n */\r\nexport enum ButtonsStrategy {\r\n // don't use 0 here\r\n // the first index is 1 and all of the following members are auto-incremented from that point on\r\n DEFAULT = 1,\r\n SIMPLE,\r\n ADVANCED,\r\n FULL,\r\n CUSTOM\r\n}\r\n\r\n/**\r\n * Enum `ButtonType` is the type of a button.\r\n */\r\nexport enum ButtonType {\r\n // don't use 0 here\r\n // the first index is 1 and all of the following members are auto-incremented from that point on\r\n // REFRESH = 1,\r\n DELETE = 1,\r\n EXTURL,\r\n DOWNLOAD,\r\n CLOSE,\r\n CUSTOM,\r\n FULLSCREEN,\r\n ROTATE_LEFT,\r\n ROTATE_RIGHT,\r\n COMMENTS,\r\n INFO,\r\n ROTATE_LEFT_CSS, //11\r\n ROTATE_RIGHT_CSS, //12\r\n}\r\n\r\n/**\r\n * Array of admitted types of buttons.\r\n */\r\nexport const WHITELIST_BUTTON_TYPES: ButtonType[] = [\r\n // ButtonType.REFRESH,\r\n ButtonType.FULLSCREEN,\r\n ButtonType.DELETE,\r\n ButtonType.EXTURL,\r\n ButtonType.DOWNLOAD,\r\n ButtonType.CLOSE,\r\n ButtonType.CUSTOM,\r\n ButtonType.ROTATE_LEFT,\r\n ButtonType.ROTATE_RIGHT,\r\n ButtonType.COMMENTS,\r\n ButtonType.INFO,\r\n ButtonType.ROTATE_LEFT_CSS,\r\n ButtonType.ROTATE_RIGHT_CSS,\r\n];\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\n/**\r\n * Interface `Description` to change the description, either with a full custom\r\n * description or with a small and simple customization.\r\n * Also, you could change margins, background style and so on.\r\n */\r\nexport interface Description {\r\n strategy: DescriptionStrategy;\r\n customFullDescription?: string;\r\n imageText?: string;\r\n numberSeparator?: string;\r\n beforeTextDescription?: string;\r\n\r\n style?: DescriptionStyle;\r\n}\r\n\r\n/**\r\n * Enum `DescriptionStrategy` with keys and their relative key codes.\r\n */\r\nexport enum DescriptionStrategy {\r\n ALWAYS_HIDDEN = 1,\r\n ALWAYS_VISIBLE,\r\n HIDE_IF_EMPTY\r\n}\r\n\r\n/**\r\n * Interface to change css properties.\r\n */\r\nexport interface DescriptionStyle {\r\n bgColor?: string;\r\n textColor?: string;\r\n width?: string;\r\n height?: string;\r\n position?: string;\r\n top?: string;\r\n bottom?: string;\r\n left?: string;\r\n right?: string;\r\n marginTop?: string;\r\n marginBottom?: string;\r\n marginRight?: string;\r\n marginLeft?: string;\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { Action } from './action.enum';\r\nimport { Size } from './size.interface';\r\nimport { SafeResourceUrl } from '@angular/platform-browser';\r\n\r\n/**\r\n * Class `Image` that represents an image with both `modal` and `plain` configurations.\r\n * Both image `id` and `modal` are mandatory, instead `plain` is optional.\r\n */\r\nexport class Image {\r\n id: number;\r\n\r\n modal: ModalImage;\r\n plain?: PlainImage;\r\n angle: number;\r\n constructor(id: number, modal: ModalImage, plain?: PlainImage ) {\r\n this.id = id;\r\n this.modal = modal;\r\n this.plain = plain;\r\n this.angle=0;\r\n }\r\n}\r\n\r\n/**\r\n * Interface `ImageData` to configure an image, but it isn't used directly.\r\n * Please, refers to `PlainImage` or `ModalImage`.\r\n */\r\nexport interface ImageData {\r\n img: string | SafeResourceUrl;\r\n description?: string;\r\n title?: string;\r\n alt?: string;\r\n ariaLabel?: string;\r\n angle?: number;\r\n}\r\n\r\n/**\r\n * Interface `ModalImage` to configure the modal image.\r\n */\r\nexport interface ModalImage extends ImageData {\r\n extUrl?: string;\r\n downloadFileName?: string;\r\n}\r\n\r\n/**\r\n * Interface `PlainImage` to configure the plain image.\r\n */\r\nexport interface PlainImage extends ImageData {\r\n size?: Size;\r\n}\r\n\r\n/**\r\n * Class `ImageEvent` that represents the event payload with the result and the triggered action.\r\n */\r\nexport class ImageEvent {\r\n action: Action;\r\n result: number | boolean;\r\n\r\n constructor(action: Action, result: number | boolean) {\r\n this.action = action;\r\n this.result = result;\r\n }\r\n}\r\n\r\n/**\r\n * Class `ImageModalEvent` that represents the event payload with the result and the triggered action.\r\n */\r\nexport class ImageModalEvent extends ImageEvent {\r\n constructor(action: Action, result: number | boolean) {\r\n super(action, result);\r\n }\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\n/**\r\n * Interface `LoadingConfig` to configure loading icon.\r\n */\r\nexport interface LoadingConfig {\r\n enable: boolean;\r\n type: LoadingType;\r\n}\r\n\r\n/**\r\n * Enum `LoadingType` with a list of possible types.\r\n */\r\nexport enum LoadingType {\r\n STANDARD = 1,\r\n CIRCULAR,\r\n BARS,\r\n DOTS,\r\n CUBE_FLIPPING,\r\n CIRCLES,\r\n EXPLOSING_SQUARES\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { Size } from './size.interface';\r\n\r\n/**\r\n * Interface `PlainGalleryConfig` to configure plain-gallery features.\r\n */\r\nexport interface PlainGalleryConfig {\r\n strategy: PlainGalleryStrategy;\r\n layout: PlainGalleryLayout;\r\n advanced?: AdvancedConfig;\r\n}\r\n\r\n/**\r\n * Interface `PlainGalleryLayout` to configure the layout. This interface isn't used directly, instead\r\n * refers to either `LineLayout`, `GridLayout` or `AdvancedLayout`.\r\n */\r\n// tslint:disable-next-line no-empty-interface\r\nexport interface PlainGalleryLayout {\r\n}\r\n\r\n/**\r\n * Class `LineLayout` to configure a linear plain gallery.\r\n */\r\nexport class LineLayout implements PlainGalleryLayout {\r\n breakConfig: BreakConfig;\r\n justify: string;\r\n size: Size;\r\n\r\n constructor(size: Size, breakConfig: BreakConfig, justify: string) {\r\n this.size = size;\r\n this.breakConfig = breakConfig;\r\n this.justify = justify;\r\n }\r\n}\r\n\r\n/**\r\n * Class `GridLayout` to configure a grid plain gallery.\r\n */\r\nexport class GridLayout implements PlainGalleryLayout {\r\n breakConfig: BreakConfig;\r\n size: Size;\r\n\r\n constructor(size: Size, breakConfig: BreakConfig) {\r\n this.size = size;\r\n this.breakConfig = breakConfig;\r\n }\r\n}\r\n\r\n/**\r\n * Class `AdvancedLayout` to configure a fully custom plain gallery.\r\n */\r\nexport class AdvancedLayout implements PlainGalleryLayout {\r\n modalOpenerByIndex: number;\r\n hideDefaultPlainGallery: boolean;\r\n\r\n constructor(modalOpenerByIndex: number, hideDefaultPlainGallery: boolean) {\r\n this.modalOpenerByIndex = modalOpenerByIndex;\r\n this.hideDefaultPlainGallery = hideDefaultPlainGallery;\r\n }\r\n}\r\n\r\n/**\r\n * Enum `PlainGalleryStrategy` to choose the behaviour of the plain gallery.\r\n */\r\nexport enum PlainGalleryStrategy {\r\n // don't use 0 here\r\n // the first index is 1 and all of the following members are auto-incremented from that point on\r\n ROW = 1,\r\n COLUMN,\r\n GRID,\r\n CUSTOM // full custom strategy\r\n}\r\n\r\n/**\r\n * Interface `BreakConfig` to limit the number of items of the plain gallery or to force it to fill other lines.\r\n */\r\nexport interface BreakConfig {\r\n length: number;\r\n wrap: boolean;\r\n}\r\n\r\n/**\r\n * Interface `AdvancedConfig` to use `` tags instead of ``.\r\n * It also contains a string property to customize the css background property.\r\n * For more info check here https://www.w3schools.com/cssref/css3_pr_background.asp\r\n */\r\nexport interface AdvancedConfig {\r\n aTags: boolean;\r\n additionalBackground: string;\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { EventEmitter, Injectable } from '@angular/core';\r\nimport { Image } from '../model/image.class';\r\n\r\nexport interface InternalGalleryPayload {\r\n galleryId: number;\r\n index?: number;\r\n image?: Image;\r\n result?: boolean;\r\n}\r\n\r\n/**\r\n * Service to call methods on a gallery by its galleryId.\r\n */\r\n@Injectable({providedIn: 'root'})\r\nexport class GalleryService {\r\n navigate: EventEmitter = new EventEmitter();\r\n close: EventEmitter = new EventEmitter();\r\n update: EventEmitter = new EventEmitter();\r\n autoPlay: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Method to open the modal gallery with the galleryId passed as parameter.\r\n * It will automatically shows the image at position index.\r\n * @param galleryId number or undefined that represents the unique id of the gallery.\r\n * @param index number of the image that you want to open.\r\n * @throws a error with a message if galleryId is either undefined, < 0 or index is < 0\r\n */\r\n openGallery(galleryId: number | undefined, index: number): void {\r\n if (galleryId === undefined || galleryId < 0 || index < 0) {\r\n throw new Error('Cannot open gallery via GalleryService with either index<0 or galleryId<0 or galleryId===undefined');\r\n }\r\n this.navigate.emit({\r\n galleryId: galleryId,\r\n index: index\r\n });\r\n }\r\n\r\n /**\r\n * Method to navigate to a specific index of the modal gallery with the galleryId passed as parameter.\r\n * At the moment, it's like openGallery, but in upcoming releases it will change the behaviour.\r\n * @param galleryId number or undefined that represents the unique id of the gallery.\r\n * @param index number of the image that you want to open.\r\n * @throws a error with a message if galleryId is either undefined, < 0 or index is < 0\r\n */\r\n navigateGallery(galleryId: number | undefined, index: number): void {\r\n if (galleryId === undefined || galleryId < 0 || index < 0) {\r\n throw new Error('Cannot navigate via GalleryService with either index<0 or galleryId<0 or galleryId===undefined');\r\n }\r\n this.navigate.emit({\r\n galleryId: galleryId,\r\n index: index\r\n });\r\n }\r\n\r\n /**\r\n * Method to close the modal gallery with the galleryId passed as parameter.\r\n * @param galleryId number or undefined that represents the unique id of the gallery.\r\n * @throws a error with a message if galleryId is either undefined or < 0\r\n */\r\n closeGallery(galleryId: number | undefined): void {\r\n if (galleryId === undefined || galleryId < 0) {\r\n throw new Error('Cannot close gallery via GalleryService with galleryId<0 or galleryId===undefined');\r\n }\r\n this.close.emit(galleryId);\r\n }\r\n\r\n /**\r\n * Service to update an image with a new object\r\n * @param galleryId number or undefined that represents the unique id of the gallery.\r\n * @param index number of the image that you want to update.\r\n * @throws a error with a message if galleryId is either undefined, < 0 or index is < 0\r\n *\r\n * @since 6.3.0\r\n */\r\n updateGallery(galleryId: number | undefined, index: number, image: Image): void {\r\n if (galleryId === undefined || galleryId < 0 || index < 0) {\r\n throw new Error('Cannot update gallery via GalleryService with either index<0 or galleryId<0 or galleryId===undefined');\r\n }\r\n if (!image) {\r\n throw new Error('Cannot update gallery via GalleryService, because image is not valid');\r\n }\r\n this.update.emit({\r\n galleryId: galleryId,\r\n index: index,\r\n image: image\r\n });\r\n }\r\n\r\n /**\r\n * Service to play modal-gallery\r\n * @param galleryId number or undefined that represents the unique id of the gallery.\r\n * @throws a error with a message if galleryId is either undefined or < 0\r\n *\r\n * @since 7.2.0\r\n */\r\n play(galleryId: number | undefined): void {\r\n if (galleryId === undefined || galleryId < 0) {\r\n throw new Error('Cannot play gallery via GalleryService with galleryId<0 or galleryId===undefined');\r\n }\r\n this.autoPlay.emit({\r\n galleryId: galleryId,\r\n result: true\r\n });\r\n }\r\n\r\n /**\r\n * Service to stop modal-gallery\r\n * @param galleryId number or undefined that represents the unique id of the gallery.\r\n * @throws a error with a message if galleryId is either undefined or < 0\r\n *\r\n * @since 7.2.0\r\n */\r\n stop(galleryId: number | undefined): void {\r\n if (galleryId === undefined || galleryId < 0) {\r\n throw new Error('Cannot stop gallery via GalleryService with galleryId<0 or galleryId===undefined');\r\n }\r\n this.autoPlay.emit({\r\n galleryId: galleryId,\r\n result: false\r\n });\r\n }\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { Inject, Injectable, InjectionToken } from '@angular/core';\r\n\r\nimport { KeyboardServiceConfig } from '../model/keyboard-service-config.interface';\r\n\r\nimport * as Mousetrap from 'mousetrap';\r\nimport { ExtendedKeyboardEvent, MousetrapInstance } from 'mousetrap';\r\n\r\nexport const KEYBOARD_CONFIGURATION = new InjectionToken('KEYBOARD_CONFIGURATION');\r\n\r\n/**\r\n * Service to intercept ctrl+s (or cmd+s on macOS) using a third-party library, called Mousetrap.\r\n */\r\n@Injectable()\r\nexport class KeyboardService {\r\n /**\r\n * Private Mousetrap variable to store the instance.\r\n */\r\n private mousetrap: MousetrapInstance;\r\n /**\r\n * Private variable to store shortcuts as either Array or string.\r\n */\r\n private shortcuts: Array | string;\r\n\r\n /**\r\n * Constructor of `KeyboardService` to init `mousetrap` and `shortcuts` private variables.\r\n * @param KeyboardServiceConfig config object received by the `forRoot()` function to init custom shortcuts\r\n */\r\n constructor(@Inject(KEYBOARD_CONFIGURATION) private config: KeyboardServiceConfig) {\r\n // this.config is always defined, because forced by forRoot inside the module\r\n // when empty, it's simply an empty object: {}\r\n\r\n this.shortcuts = this.config && this.config.shortcuts ? this.config.shortcuts : ['ctrl+s', 'meta+s'];\r\n\r\n // temporary workaround to fix this issue: https://github.com/Ks89/angular-modal-gallery/issues/142\r\n if (this.config && !this.config.disableSsrWorkaround) {\r\n // To prevent issues with angular-universal on server-side\r\n if (typeof window !== 'undefined') {\r\n require('mousetrap');\r\n this.mousetrap = new (Mousetrap)();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Method to add a lister for ctrl+s/cmd+s keyboard events.\r\n * @param (e: ExtendedKeyboardEvent, combo: string) => any onBind callback function to add shortcuts\r\n */\r\n add(onBind: (e: ExtendedKeyboardEvent, combo: string) => any) {\r\n // temporary workaround to fix this issue: https://github.com/Ks89/angular-modal-gallery/issues/142\r\n if (this.config && !this.config.disableSsrWorkaround) {\r\n // To prevent issues with angular-universal on server-side\r\n if (typeof window !== 'undefined') {\r\n this.mousetrap.bind(this.shortcuts, (event: KeyboardEvent, combo: string) => {\r\n if (event.preventDefault) {\r\n event.preventDefault();\r\n } else {\r\n // internet explorer\r\n event.returnValue = false;\r\n }\r\n onBind(event, combo);\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Method to reset all listeners. Please, call this function when needed\r\n * to free resources ad prevent leaks.\r\n */\r\n reset() {\r\n // temporary workaround to fix this issue: https://github.com/Ks89/angular-modal-gallery/issues/142\r\n if (this.config && !this.config.disableSsrWorkaround) {\r\n // To prevent issues with angular-universal on server-side\r\n if (typeof window !== 'undefined') {\r\n this.mousetrap.reset();\r\n }\r\n }\r\n }\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\nimport { Image } from '../model/image.class';\r\n\r\n/**\r\n * Utility function to get the index of the input `image` from `arrayOfImages`\r\n * @param Image image to get the index. The image 'id' must be a number >= 0\r\n * @param Image[] arrayOfImages to search the image within it\r\n * @returns number the index of the image. -1 if not found.\r\n * @throws an Error if either image or arrayOfImages are not valid,\r\n * or if the input image doesn't contain an 'id', or the 'id' is < 0\r\n */\r\nexport function getIndex(image: Image, arrayOfImages: Image[]): number {\r\n if (!image) {\r\n throw new Error('image must be a valid Image object');\r\n }\r\n\r\n if (!arrayOfImages) {\r\n throw new Error('arrayOfImages must be a valid Image[]');\r\n }\r\n\r\n if (!image.id && image.id !== 0) {\r\n // id = 0 is admitted\r\n throw new Error(`A numeric Image 'id' is mandatory`);\r\n }\r\n\r\n if (image.id < 0) {\r\n throw new Error(`Image 'id' must be >= 0`);\r\n }\r\n\r\n return arrayOfImages.findIndex((val: Image) => val.id === image.id);\r\n}\r\n","/*\r\n The MIT License (MIT)\r\n\r\n Copyright (c) 2017-2018 Stefano Cappa (Ks89)\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be included in all\r\n copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n SOFTWARE.\r\n */\r\n\r\n/**\r\n * Key of the keyboard's key `enter`\r\n */\r\nexport const ENTER_KEY = 'Enter';\r\n/**\r\n * Code of the keyboard's key `enter`\r\n */\r\nexport const ENTER_CODE = 'Enter';\r\n\r\n/**\r\n * Key of the keyboard's key 'right arrow'\r\n */\r\nexport const RIGHT_ARROW_KEY = 'ArrowRight';\r\n/**\r\n * Code of the keyboard's key 'right arrow'\r\n */\r\nexport const RIGHT_ARROW_CODE = 'ArrowRight';\r\n/**\r\n * KeyCode of the keyboard's key 'right arrow'\r\n * Used in unit tests only\r\n */\r\nexport const RIGHT_ARROW_KEYCODE = 39;\r\n\r\n/**\r\n * Key of the keyboard's key 'left arrow'\r\n */\r\nexport const LEFT_ARROW_KEY = 'ArrowLeft';\r\n/**\r\n * Code of the keyboard's key 'left arrow'\r\n */\r\nexport const LEFT_ARROW_CODE = 'ArrowLeft';\r\n/**\r\n * KeyCode of the keyboard's key 'left arrow'\r\n * Used in unit tests only\r\n */\r\nexport const LEFT_ARROW_KEYCODE = 37;\r\n\r\n/**\r\n * Key of the keyboard's key `space`\r\n */\r\nexport const SPACE_KEY = '';\r\n/**\r\n * Code of the keyboard's key `space`\r\n */\r\nexport const SPACE_CODE = 'Space';\r\n/**\r\n * KeyCode of the keyboard's key 'space'\r\n * Used in unit tests only\r\n */\r\nexport const SPACE_KEYCODE = 32;\r\n\r\n/**\r\n * KeyCode of the main mouse button\r\n */\r\nexport const MOUSE_MAIN_BUTTON_CLICK = 0;\r\n\r\n/**\r\n * Const NEXT\r\n */\r\nexport const NEXT = 1;\r\n/**\r\n * Const PREV\r\n */\r\nexport const PREV = -1;\r\n/**\r\n * Const NOTHING to represents a situation when it isn't both NEXT and PREV\r\n */\r\nexport const NOTHING = 0;\r\n\r\n/**\r\n * Const to represent the right direction\r\n */\r\nexport const DIRECTION_RIGHT = 'right';\r\n/**\r\n * Const to represent the left direction\r\n */\r\nexport const DIRECTION_LEFT = 'left';\r\n","import { ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { YaMarker } from './directives/marker';\r\nimport { YaClaster } from './directives/claster';\r\nimport { YaObjectManager } from './directives/objectManager';\r\nimport { LAZY_MAPS_API_CONFIG, YaMapsAPILoader, YaMapsAPILoaderConfigLiteral } from './services/ya-maps-loader';\r\nimport { BROWSER_GLOBALS_PROVIDERS } from './utils/browser-globals';\r\nimport { YaMap } from './directives/ymap';\r\n\r\nexport * from './ya-maps-types';\r\n\r\n/**\r\n * @internal\r\n */\r\nexport function coreDirectives() {\r\n return [\r\n YaMap,\r\n YaMarker,\r\n YaClaster,\r\n YaObjectManager\r\n ];\r\n}\r\n\r\n/**\r\n * The angular-ya-maps core module. Contains all Directives/Services/Pipes\r\n * of the core module. Please use `YaCoreModule.forRoot()` in your app module.\r\n */\r\n@NgModule({declarations: coreDirectives(), exports: coreDirectives()})\r\nexport class YaCoreModule {\r\n /**\r\n * Please use this method when you register the module at the root level.\r\n */\r\n public static forRoot(yaMapsAPILoaderConfig: YaMapsAPILoaderConfigLiteral): ModuleWithProviders {\r\n return {\r\n ngModule: YaCoreModule,\r\n providers: [\r\n ...BROWSER_GLOBALS_PROVIDERS,\r\n {provide: YaMapsAPILoader, useClass: YaMapsAPILoader},\r\n {provide: LAZY_MAPS_API_CONFIG, useValue: yaMapsAPILoaderConfig}\r\n ],\r\n };\r\n }\r\n}\r\n\r\nexport function YaCoreModuleForRoot(yaMapsAPILoaderConfig: YaMapsAPILoaderConfigLiteral) {\r\n return [\r\n YaCoreModule.forRoot(yaMapsAPILoaderConfig)\r\n ];\r\n}\r\n","import { Directive, EventEmitter, Input, OnChanges, OnDestroy, Output, SimpleChange } from '@angular/core';\r\n\r\nimport { YaMapsAPIWrapper } from '../ya-maps-api-wrapper';\r\nimport * as mapTypes from '../ya-maps-types';\r\nimport { Marker } from '../ya-maps-types';\r\nimport { MarkerManager } from '../services/managers/marker-manager';\r\nimport { Subscription } from 'rxjs';\r\n\r\nlet markerId = 0;\r\n\r\n@Directive({\r\n // tslint:disable-next-line:directive-selector\r\n selector: 'ya-marker',\r\n providers: [\r\n YaMapsAPIWrapper\r\n ]\r\n})\r\n\r\n// tslint:disable-next-line:directive-class-suffix\r\nexport class YaMarker implements OnChanges, OnDestroy {\r\n @Input() public latitude: number;\r\n @Input() public longitude: number;\r\n @Input() public balloonLayout: any;\r\n @Input() public balloonContentHeader: string;\r\n @Input() public balloonContentBody: string;\r\n @Input() public balloonContentFooter: string;\r\n @Input() public draggable = false;\r\n @Input() public preset = 'islands#blueIcon';\r\n @Input() public iconContent: string;\r\n @Input() public showInfo: boolean;\r\n // default#image\r\n @Input() public iconLayout: any;\r\n @Input() public iconImageHref: any;\r\n // [30, 42]\r\n @Input() public iconImageSize: any;\r\n // [-5, -38]\r\n @Input() public iconImageOffset: any;\r\n\r\n @Output() public markerClick: EventEmitter = new EventEmitter();\r\n // tslint:disable-next-line:max-line-length\r\n @Output() public dragEnd: EventEmitter = new EventEmitter();\r\n\r\n private _markerAddedToManger = false;\r\n private _id: string;\r\n private _observableSubscriptions: Subscription[] = [];\r\n\r\n constructor(private _markerManager: MarkerManager) {\r\n this._id = (markerId++).toString();\r\n }\r\n\r\n public ngOnChanges(changes: { [key: string]: SimpleChange }) {\r\n if (!this._markerAddedToManger) {\r\n\r\n this._markerManager.addMarker(this);\r\n this._markerAddedToManger = true;\r\n this._addEventListeners();\r\n return;\r\n }\r\n if (changes['showInfo']) {\r\n this._markerManager.showBalloon(this);\r\n }\r\n\r\n if (changes['latitude'] || changes['longitude']) {\r\n console.log('CHANGE coords', {coords: [this.latitude, this.longitude]});\r\n this._markerManager.updateMarker(this, {coords: [this.latitude, this.longitude]});\r\n }\r\n\r\n if (changes['draggable']) {\r\n this._markerManager.updateMarker(this, {draggable: this.draggable});\r\n }\r\n }\r\n\r\n public ngOnDestroy() {\r\n this._markerManager.deleteMarker(this);\r\n this._observableSubscriptions.forEach((s) => s.unsubscribe());\r\n }\r\n\r\n private _addEventListeners() {\r\n // click event\r\n const cs = this._markerManager.createEventObservable('click', this).subscribe(() => {\r\n\r\n //this._markerManager.showBalloon(this);\r\n this.markerClick.emit(null);\r\n });\r\n this._observableSubscriptions.push(cs);\r\n // dragend event\r\n // tslint:disable-next-line:max-line-length\r\n const ds = this._markerManager.createEventObservable('dragend', this).subscribe((e: mapTypes.MouseEvent) => {\r\n\r\n const thisPlacemark = e.get('target');\r\n const coords = thisPlacemark.geometry.getCoordinates();\r\n this._markerManager.getNativeMarker(this).then((m: Marker) => {\r\n // tslint:disable-next-line:max-line-length\r\n this.dragEnd.emit({lat: coords[0], lng: coords[1], nativeMarker: m} as mapTypes.MapMouseEvent);\r\n });\r\n });\r\n this._observableSubscriptions.push(ds);\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { YaMapsAPIWrapper } from '../ya-maps-api-wrapper';\r\nimport { MarkerManager } from '../services/managers/marker-manager';\r\nimport { ClasterManager } from '../services/managers/claster-manager';\r\nimport { ObjectManagerManager } from '../services/managers/objectManager-manager';\r\nimport * as mapTypes from '../ya-maps-types';\r\n\r\n@Component({\r\n // tslint:disable-next-line:component-selector\r\n selector: 'ya-map',\r\n providers: [\r\n YaMapsAPIWrapper,\r\n MarkerManager,\r\n ClasterManager,\r\n ObjectManagerManager\r\n ],\r\n template: `\r\n
    \r\n \r\n
    \r\n `\r\n})\r\n// tslint:disable-next-line:component-class-suffix\r\nexport class YaMap implements OnInit, OnChanges {\r\n\r\n @Input() public longitude = 0;\r\n @Input() public latitude = 0;\r\n @Input() public zoom = 8;\r\n @Input() public minZoom: number;\r\n @Input() public maxZoom: number;\r\n @Input() public mapType: any = 'yandex#map';\r\n @Input() public controls: any[] = null;\r\n @Input() public panToObjects: mapTypes.PanToObjects;\r\n // tslint:disable-next-line:max-line-length\r\n @Output() public mapClick: EventEmitter = new EventEmitter();\r\n @Output() public actionTick: EventEmitter = new EventEmitter();\r\n\r\n public mapInit = false;\r\n\r\n private _observableSubscriptions: Subscription[] = [];\r\n\r\n constructor(private _elem: ElementRef, private _mapsWrapper: YaMapsAPIWrapper) {\r\n }\r\n\r\n public ngOnInit() {\r\n const container = this._elem.nativeElement.querySelector('.map-container-inner');\r\n this._initMapInstance(container);\r\n this.mapInit = true;\r\n }\r\n\r\n public ngOnChanges(changes: SimpleChanges) {\r\n if (this.mapInit) {\r\n this.updatePosition(changes);\r\n this.panTo(changes);\r\n }\r\n }\r\n\r\n private _initMapInstance(el: HTMLElement) {\r\n if (this.controls != null) {\r\n this._mapsWrapper.createMap(el, {\r\n center: [this.latitude, this.longitude], zoom: this.zoom, type: this.mapType,\r\n controls: this.controls\r\n });\r\n\r\n } else {\r\n this._mapsWrapper.createMap(el, {\r\n center: [this.latitude, this.longitude], zoom: this.zoom, type: this.mapType\r\n });\r\n\r\n }\r\n\r\n this._handleMapMouseEvents();\r\n }\r\n\r\n private updatePosition(changes: SimpleChanges) {\r\n if (changes['latitude'] == null && changes['longitude'] == null) {\r\n return;\r\n }\r\n this._mapsWrapper.setCenter(this.latitude, this.longitude);\r\n }\r\n\r\n private panTo(changes: SimpleChanges) {\r\n if (changes['panToObjects'] == null) {\r\n return;\r\n }\r\n this._mapsWrapper.panTo(this.panToObjects.points, this.panToObjects.params);\r\n }\r\n\r\n private _handleMapMouseEvents() {\r\n interface Emitter {\r\n emit(value: any): void;\r\n }\r\n\r\n interface Event {\r\n name: string;\r\n emitter: Emitter;\r\n }\r\n\r\n const clickEvents: Event[] = [\r\n {name: 'click', emitter: this.mapClick}\r\n ];\r\n const events: Event[] = [\r\n {name: 'actiontick', emitter: this.actionTick}\r\n ];\r\n\r\n clickEvents.forEach((e: Event) => {\r\n const s = this._mapsWrapper.subscribeToMapEvent<{ latLng: any }>(e.name).subscribe(\r\n (event: any) => {\r\n const coords = event.get('coords');\r\n const value = {lat: coords[0], lng: coords[1]} as mapTypes.MapClickMouseEvent;\r\n e.emitter.emit(value);\r\n });\r\n this._observableSubscriptions.push(s);\r\n });\r\n\r\n events.forEach((e: Event) => {\r\n const s = this._mapsWrapper.subscribeToMapEvent<{ latLng: any }>(e.name).subscribe(\r\n (event: any) => {\r\n\r\n this._mapsWrapper.getCenter().then((coords: any) => {\r\n this.latitude = coords[0];\r\n this.longitude = coords[1];\r\n const value = {lat: coords[0], lng: coords[1]} as mapTypes.MapClickMouseEvent;\r\n e.emitter.emit(value);\r\n });\r\n\r\n });\r\n this._observableSubscriptions.push(s);\r\n });\r\n\r\n }\r\n}\r\n\r\n","import { Injectable, NgZone } from '@angular/core';\r\n\r\nimport { YaClaster } from '../../directives/claster';\r\nimport { YaMapsAPIWrapper } from '../../ya-maps-api-wrapper';\r\nimport { Claster } from '../../ya-maps-types';\r\n\r\n@Injectable()\r\nexport class ClasterManager {\r\n private _clasters: Map> =\r\n new Map>();\r\n\r\n constructor(private _mapsWrapper: YaMapsAPIWrapper, private _zone: NgZone) {\r\n }\r\n\r\n public addClaster(claster: YaClaster) {\r\n const clasterPromise = this._mapsWrapper.createClaster(claster);\r\n this._clasters.set(claster, clasterPromise);\r\n }\r\n\r\n /* getNativeMarker(marker: YaMarker): Promise {\r\n return this._markers.get(marker);\r\n }\r\n createEventObservable(eventName: string, marker: YaMarker): Observable {\r\n return Observable.create((observer: Observer) => {\r\n this._markers.get(marker).then((m: Marker) => {\r\n m.events.add(eventName, (e: T) => this._zone.run(() => observer.next(e)));\r\n });\r\n });\r\n }\r\n */\r\n}\r\n","import { Injectable, NgZone } from '@angular/core';\r\nimport { Observable, Observer } from 'rxjs';\r\n\r\nimport { YaMarker } from '../../directives/marker';\r\n\r\nimport { YaMapsAPIWrapper } from '../../ya-maps-api-wrapper';\r\nimport { Marker } from '../../ya-maps-types';\r\n\r\n@Injectable()\r\nexport class MarkerManager {\r\n private _markers: Map> =\r\n new Map>();\r\n\r\n constructor(private _mapsWrapper: YaMapsAPIWrapper, private _zone: NgZone) {\r\n }\r\n\r\n public deleteMarker(marker: YaMarker): Promise {\r\n const m = this._markers.get(marker);\r\n if (m == null) {\r\n return Promise.resolve();\r\n }\r\n // tslint:disable-next-line:no-shadowed-variable\r\n return m.then((m: Marker) => {\r\n return this._zone.run(() => {\r\n // tslint:disable-next-line:no-shadowed-variable\r\n this.getNativeMarker(marker).then((m: Marker) => {\r\n this._mapsWrapper.removeGeo(m);\r\n this._markers.delete(marker);\r\n });\r\n });\r\n });\r\n }\r\n\r\n public addMarker(marker: YaMarker) {\r\n const markerPromise = this._mapsWrapper.createMarker(marker);\r\n this._markers.set(marker, markerPromise);\r\n }\r\n\r\n public updateMarker(marker: YaMarker, object: any): Promise {\r\n const m = this._markers.get(marker);\r\n if (m == null) {\r\n return Promise.resolve();\r\n }\r\n // tslint:disable-next-line:no-shadowed-variable\r\n return m.then((m: Marker) => {\r\n return this._zone.run(() => {\r\n // tslint:disable-next-line:no-shadowed-variable\r\n this.getNativeMarker(marker).then((m: Marker) => {\r\n this._mapsWrapper.updateMarker(m, object);\r\n\r\n });\r\n });\r\n });\r\n }\r\n\r\n public showBalloon(marker: YaMarker) {\r\n this.getNativeMarker(marker).then((m: Marker) => {\r\n m.balloon.open();\r\n });\r\n\r\n }\r\n\r\n public getNativeMarker(marker: YaMarker): Promise {\r\n return this._markers.get(marker);\r\n }\r\n\r\n public createEventObservable(eventName: string, marker: YaMarker): Observable {\r\n return Observable.create((observer: Observer) => {\r\n this._markers.get(marker).then((m: Marker) => {\r\n m.events.add(eventName, (e: T) => this._zone.run(() => observer.next(e)));\r\n });\r\n });\r\n }\r\n}\r\n","import { Injectable, NgZone } from '@angular/core';\r\n\r\nimport { YaObjectManager } from '../../directives/objectManager';\r\nimport { YaMapsAPIWrapper } from '../../ya-maps-api-wrapper';\r\nimport { ObjectManager } from '../../ya-maps-types';\r\n\r\n@Injectable()\r\nexport class ObjectManagerManager {\r\n private _managers: Map> =\r\n new Map>();\r\n\r\n constructor(private _mapsWrapper: YaMapsAPIWrapper, private _zone: NgZone) {\r\n }\r\n\r\n public add(manager: YaObjectManager) {\r\n const managerPromise = this._mapsWrapper.createObjectManager(manager);\r\n this._managers.set(manager, managerPromise);\r\n }\r\n\r\n public navigateToGeoObject(manager: YaObjectManager, id: number) {\r\n this.getNativeManager(manager).then((p: any) => {\r\n this._mapsWrapper.navigateToGeoObject(p, id);\r\n });\r\n\r\n }\r\n\r\n public getNativeManager(manager: YaObjectManager): Promise {\r\n return this._managers.get(manager);\r\n }\r\n\r\n public setFilter(manager: YaObjectManager, filter: any) {\r\n this.getNativeManager(manager).then((p: any) => {\r\n this._mapsWrapper.objectManagerSetFilter(p, filter);\r\n });\r\n }\r\n}\r\n","import { Inject, Injectable, InjectionToken, Optional } from '@angular/core';\r\nimport { DocumentRef, WindowRef } from '../utils/browser-globals';\r\n\r\n/**\r\n * Token for the config of the YaMapsAPILoaderConfigLiteral. Please provide an object of type {@link\r\n * YaMapsAPILoaderConfigLiteral}.\r\n */\r\nexport const LAZY_MAPS_API_CONFIG = new InjectionToken('angular-ya-maps MAPS_API_CONFIG');\r\n\r\n/**\r\n * Configuration for the {@link LazyMapsAPILoader}.\r\n */\r\nexport interface YaMapsAPILoaderConfigLiteral {\r\n /**\r\n * API Key.\r\n */\r\n apiKey?: string;\r\n}\r\n\r\n@Injectable()\r\nexport class YaMapsAPILoader {\r\n private _scriptLoadingPromise: Promise;\r\n private config: YaMapsAPILoaderConfigLiteral;\r\n private _windowRef: WindowRef;\r\n private _documentRef: DocumentRef;\r\n\r\n constructor(@Optional() @Inject(LAZY_MAPS_API_CONFIG) config: any = null, w: WindowRef, d: DocumentRef) {\r\n this.config = config;\r\n this._windowRef = w;\r\n this._documentRef = d;\r\n }\r\n\r\n public load(): Promise {\r\n const script = this._documentRef.getNativeDocument().createElement('script');\r\n script.type = 'text/javascript';\r\n script.async = false;\r\n script.defer = true;\r\n script.id = 'YaScript';\r\n const callbackName = `angular2YAMapsAPILoader`;\r\n script.src = `https://api-maps.yandex.ru/2.1/?apikey=${this.config.apiKey}&lang=ru_RU`;\r\n // tslint:disable-next-line:ban-types\r\n this._scriptLoadingPromise = new Promise((resolve: Function, reject: Function) => {\r\n script.onload = () => {\r\n resolve();\r\n };\r\n script.onerror = (error: Event) => {\r\n reject();\r\n };\r\n });\r\n this._documentRef.getNativeDocument().body.appendChild(script);\r\n return this._scriptLoadingPromise;\r\n }\r\n\r\n}\r\n","import { Provider } from '@angular/core';\r\n\r\nexport class WindowRef {\r\n public getNativeWindow(): any {\r\n return window;\r\n }\r\n}\r\n\r\n// tslint:disable-next-line:max-classes-per-file\r\nexport class DocumentRef {\r\n\r\n public getNativeDocument(): any {\r\n return document;\r\n }\r\n\r\n}\r\n\r\nexport const BROWSER_GLOBALS_PROVIDERS: Provider[] = [WindowRef, DocumentRef];\r\n","import { Injectable, NgZone } from '@angular/core';\r\nimport { Observable, Observer } from 'rxjs';\r\n\r\nimport * as mapTypes from './ya-maps-types';\r\nimport { YaMapsAPILoader } from './services/ya-maps-loader';\r\nimport { YaMarker } from './directives/marker';\r\nimport { YaClaster } from './directives/claster';\r\nimport { YaObjectManager } from './directives/objectManager';\r\nimport { DocumentRef } from './utils/browser-globals';\r\n\r\n\r\ndeclare var ymaps: any;\r\n\r\n@Injectable()\r\nexport class YaMapsAPIWrapper {\r\n private _map: Promise;\r\n private _mapResolver: (value?: mapTypes.YandexMap) => void;\r\n private _documentRef: DocumentRef;\r\n\r\n constructor(private _loader: YaMapsAPILoader, private _zone: NgZone, d: DocumentRef) {\r\n this._documentRef = d;\r\n this._map = new Promise((resolve: any, reject: any) => {\r\n this._mapResolver = resolve;\r\n });\r\n }\r\n\r\n public createMap(el: HTMLElement, mapOptions: mapTypes.MapOptions): Promise {\r\n const res = this._loader.load().then(() => {\r\n const create = () => setTimeout(() => {\r\n if (ymaps.Map) {\r\n const map = new ymaps.Map(el, mapOptions);\r\n this._mapResolver(map as mapTypes.YandexMap);\r\n } else {\r\n create();\r\n }\r\n }, 100);\r\n create();\r\n }).catch((e) => console.log(e));\r\n return res;\r\n }\r\n\r\n public setCenter(latitude: number, longitude: number) {\r\n this._map.then((map: mapTypes.YandexMap) => {\r\n map.setCenter([latitude, longitude]);\r\n });\r\n }\r\n\r\n public getCenter(): Promise {\r\n return this._map.then((map: mapTypes.YandexMap) => {\r\n return map.getCenter();\r\n });\r\n }\r\n\r\n public panTo(points: any[], options: any[]) {\r\n this._map.then((map: mapTypes.YandexMap) => {\r\n map.panTo(points, options);\r\n });\r\n }\r\n\r\n public subscribeToMapEvent(eventName: string): Observable {\r\n return Observable.create((observer: Observer) => {\r\n this._map.then((m: mapTypes.YandexMap) => {\r\n m.events.add(eventName, (arg: E) => {\r\n this._zone.run(() => observer.next(arg));\r\n });\r\n });\r\n });\r\n }\r\n\r\n public createMarker(marker: YaMarker): Promise {\r\n return this._map.then((map: mapTypes.YandexMap) => {\r\n const m = new ymaps.Placemark([marker.latitude, marker.longitude], {\r\n balloonContentHeader: marker.balloonContentHeader,\r\n balloonContentBody: marker.balloonContentBody,\r\n balloonContentFooter: marker.balloonContentFooter,\r\n iconContent: marker.iconContent\r\n },\r\n {\r\n draggable: marker.draggable,\r\n preset: marker.preset,\r\n iconLayout: marker.iconLayout,\r\n iconImageHref: marker.iconImageHref,\r\n iconImageSize: marker.iconImageSize,\r\n iconImageOffset: marker.iconImageOffset\r\n });\r\n map.geoObjects.add(m);\r\n return m;\r\n });\r\n }\r\n\r\n public removeGeo(overlay: any) {\r\n this._map.then((map: mapTypes.YandexMap) => {\r\n map.geoObjects.remove(overlay);\r\n });\r\n }\r\n\r\n public updateMarker(marker: any, object: any) {\r\n this._map.then((map: mapTypes.YandexMap) => {\r\n if (object.hasOwnProperty('coords')) {\r\n marker.geometry.setCoordinates(object.coords);\r\n }\r\n\r\n if (object.hasOwnProperty('draggable')) {\r\n marker.options.set({draggable: object.draggable});\r\n }\r\n });\r\n }\r\n\r\n public createClaster(claster: YaClaster): Promise {\r\n return this._map.then((map: mapTypes.YandexMap) => {\r\n if (claster.markers.length === 0) {\r\n return;\r\n }\r\n\r\n let myGeoObjects: any[];\r\n myGeoObjects = new Array();\r\n claster.markers.forEach((x: mapTypes.MarkerClaster) => {\r\n const point = new ymaps.GeoObject({\r\n geometry: {type: x.type, coordinates: [x.lat, x.lng]}\r\n });\r\n myGeoObjects.push(point);\r\n });\r\n\r\n const clusterer = new ymaps.Clusterer({});\r\n clusterer.add(myGeoObjects);\r\n map.geoObjects.add(clusterer);\r\n\r\n return clusterer;\r\n });\r\n\r\n }\r\n\r\n public createObjectManager(objectManager: YaObjectManager): any {\r\n return this._map.then((map: mapTypes.YandexMap) => {\r\n\r\n if (objectManager.datasource.length === 0) {\r\n return;\r\n }\r\n\r\n const nativeObjectManager = new ymaps.ObjectManager({\r\n clusterize: objectManager.clusterize,\r\n gridSize: objectManager.gridSize\r\n });\r\n\r\n nativeObjectManager.add(objectManager.datasource);\r\n\r\n nativeObjectManager.objects.options.set('preset', objectManager.objectPreset);\r\n nativeObjectManager.clusters.options.set('preset', objectManager.clasterPreset);\r\n map.geoObjects.add(nativeObjectManager);\r\n return nativeObjectManager;\r\n });\r\n }\r\n\r\n public navigateToGeoObject(objectManager: any, id: any) {\r\n const obj = objectManager.objects.getById(id);\r\n if (obj) {\r\n this.setCenter(obj.geometry.coordinates[0], obj.geometry.coordinates[1]);\r\n objectManager.objects.balloon.open(id);\r\n }\r\n }\r\n\r\n public checkYaSciptLoaded() {\r\n return this._documentRef.getNativeDocument().getElementById('YaScript');\r\n }\r\n\r\n public objectManagerSetFilter(objectManager: any, filter: any) {\r\n objectManager.setFilter(filter);\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { LocalStorageService } from 'ngx-webstorage';\r\nimport { UserService } from '../services';\r\n\r\n@Injectable()\r\nexport class AuthGuard {\r\n constructor(\r\n private jwt: JwtHelperService,\r\n private userService: UserService,\r\n private router: Router,\r\n private storage:LocalStorageService) {}\r\n\r\n canActivate(): boolean {\r\n console.log('Сработал canActivate в AuthGuard');\r\n\r\n // let token = localStorage.getItem('access_token');\r\n // const token = localStorage.getItem('ngx-webstorage|access_token');\r\n let token = this.storage.retrieve('access_token');\r\n if (token || !this.jwt.isTokenExpired(token)) {\r\n\r\n this.router.navigate(['/home']);\r\n // alert(\"AuthGuard\")\r\n // alert(\"return false;\")\r\n return false;\r\n }\r\n // alert(\"return true;\")\r\n return true;\r\n }\r\n\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router';\r\nimport { PermissionsService } from '@app/core/services';\r\nimport { Observable, of } from 'rxjs';\r\n\r\n@Injectable()\r\nexport class CanActivateTeam {\r\n constructor(private ps: PermissionsService, private router: Router) {}\r\n\r\n resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable {\r\n // Если не указаны пермишены для роута, то пускаем всех.\r\n if (!route.data['permission']) {\r\n return of(true);\r\n }\r\n\r\n const isAccept = this.ps.has(route.data['permission']);\r\n\r\n if (!isAccept) {\r\n this.router.navigate(['/', 'home']);\r\n }\r\n\r\n return of(isAccept);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\r\nimport { Observable, of } from 'rxjs';\r\nimport { HttpService, PermissionsService, UserService } from '@app/core/services';\r\nimport { catchError, tap } from 'rxjs/operators';\r\n\r\n@Injectable()\r\nexport class PermissionsResolver {\r\n constructor(private httpService: HttpService, private permissionsService: PermissionsService,private userServise: UserService) {}\r\n\r\n resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable {\r\n\r\n return this.httpService.get('user-service/api/permissions').pipe(\r\n \r\n tap(permissions => {\r\n this.permissionsService.setPermissions(permissions);\r\n // console.log('user-service/api/permissions')\r\n }),\r\n catchError(error => {\r\n console.error(`Resolve: permissions`);\r\n console.error(error);\r\n\r\n this.permissionsService.setPermissions({});\r\n\r\n return of({});\r\n })\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { LocalStorageService } from 'ngx-webstorage';\r\nimport { UserService } from '../services';\r\n\r\n@Injectable()\r\nexport class NoAuthGuard {\r\n constructor(\r\n private jwt: JwtHelperService, \r\n private router: Router,\r\n private storage:LocalStorageService,\r\n private userService: UserService,) {}\r\n\r\n canActivate(): boolean {\r\n // const token = localStorage.getItem('ngx-webstorage|access_token');\r\n let token = this.storage.retrieve('access_token');\r\n // Проверяем наличие токена\r\n if (!token) {\r\n // alert(\"noToken NoAuthGuard\")\r\n this.userService.logout()\r\n return false;\r\n }\r\n\r\n // Проверяем валидность токена\r\n if (this.jwt.isTokenExpired(token)) {\r\n // alert(\"isTokenExpired NoAuthGuard\")\r\n this.userService.logout()\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n","import { ProjectModel } from '@app/core/model/project.model';\r\nimport { WorkedDayModel } from '@app/core/model/worked-days.model';\r\nimport { PositionModel } from '@app/core/model/position.model';\r\n\r\nexport class UserModel {\r\n isRequiredPersonalData:boolean;\r\n id = null;\r\n active = true;\r\n login: string = '';\r\n name: string = '';\r\n fullName: string = '';\r\n firstName: string = '';\r\n lastName: string = '';\r\n middleName: string = '';\r\n password: string = '';\r\n confirmPassword?: string = '';\r\n clusterId?: number[];\r\n phoneNumber: string = '';\r\n position: PositionModel = null;\r\n email: string = '';\r\n languageKey: string = 'ru';\r\n roleCode: string;\r\n roleName: string;\r\n movingType: { id: number; type: string } = { id: null, type: '' };\r\n movingTypeId: number = null;\r\n positionId: number;\r\n positionName: string;\r\n hasExtendedPermission = false;\r\n imagePosition: { x1: number; x2: number; y1: number; y2: number };\r\n photoUrlSmallSize?: string ;\r\n photoUrlMiddleSize?: string ;\r\n photoUrlOriginalSize?: string ;\r\n dataSourceSwitchEnable = false;\r\n projects: ProjectModel[] = [];\r\n supervisors = [];\r\n storeCount = 0;\r\n workedDays: WorkedDayModel[] = [];\r\n address: string = '';\r\n hasCluster: boolean = null;\r\n hasRoutePlan: boolean = null;\r\n isVisitTimeAvailable: boolean = false;\r\n isFteAvailable: boolean = false;\r\n absentUser: {dateBeg?: string, dateEnd?: string, isActive: boolean, userId:number, id:number}\r\n ProjectBranch?: Array<{id:number, name:string}> \r\n ProjectStoreChain?: Array<{id:number, name:string}> \r\n constructor(data = {}) {\r\n Object.assign(this, data);\r\n if(this.absentUser!=null){\r\n this.absentUser.userId = this.id;\r\n this.absentUser.id = this.id;\r\n }\r\n else{\r\n this.absentUser = {\r\n userId : this.id,\r\n id : this.id,\r\n isActive: false\r\n };\r\n }\r\n }\r\n}\r\n","import { RouteTypeModel } from '@app/core/model/route-type.model';\r\n\r\nexport interface IProjectModel {\r\n id: number;\r\n name: string;\r\n code: string;\r\n description: string;\r\n abbreviation: string;\r\n colorText: string;\r\n colorBackground: string;\r\n isActive: boolean;\r\n useLoadingDataByServer: boolean;\r\n url: string;\r\n siteUrl: string;\r\n userWageRate: number;\r\n wageRate: number;\r\n wageRateStep: number;\r\n routeType: RouteTypeModel | null;\r\n}\r\n\r\nexport class ProjectModel implements IProjectModel {\r\n public id = null;\r\n public name;\r\n public code;\r\n public description;\r\n public abbreviation = '';\r\n public colorText = '';\r\n public colorBackground = '';\r\n public isActive = true;\r\n public useLoadingDataByServer = false;\r\n public url;\r\n public siteUrl;\r\n public userWageRate = 0;\r\n public wageRate = 0;;\r\n public wageRateStep = 0;\r\n public routeType = null;\r\n\r\n constructor(data = {}) {\r\n Object.assign(this, data);\r\n }\r\n}\r\n","export class RoutePlan {\r\n active: boolean;\r\n check: boolean;\r\n dateInt: number;\r\n dateIntDate: Date;\r\n id: number;\r\n numberOrderOfVisits: number;\r\n storeChainBanner: string;\r\n storeChainName: string;\r\n storeCode: string;\r\n projectStoreCode: string;\r\n storeFullAddress: string;\r\n storeId: number;\r\n projectId: number;\r\n projectName: string;\r\n projectStoreId: number;\r\n storeLatitude: number;\r\n storeLongitude: number;\r\n userFullName: string;\r\n userId: number;\r\n userLogin: string;\r\n\r\n constructor(data?: any) {\r\n this.active = data && data.hasOwnProperty('active') ? data.active : true;\r\n this.check = data && data.hasOwnProperty('check') ? data.check : false;\r\n this.dateInt = data && data.hasOwnProperty('dateInt') ? data.dateInt : +new Date().convertDateToServerString();\r\n this.dateIntDate = this.dateInt.toString().convertServerStringToDate() || new Date();\r\n this.id = data && data.hasOwnProperty('id') ? data.id : null;\r\n this.numberOrderOfVisits = data && data.hasOwnProperty('numberOrderOfVisits') ? data.numberOrderOfVisits : 1;\r\n this.storeChainBanner = data && data.hasOwnProperty('storeChainBanner') ? data.storeChainBanner : '';\r\n this.storeChainName = data && data.hasOwnProperty('storeChainName') ? data.storeChainName : '';\r\n this.storeCode = data && data.hasOwnProperty('storeCode') ? data.storeCode : '';\r\n this.projectStoreCode = data && data.hasOwnProperty('projectStoreCode') ? data.projectStoreCode : '';\r\n this.storeFullAddress = data && data.hasOwnProperty('storeFullAddress') ? data.storeFullAddress : '';\r\n this.storeId = data && data.hasOwnProperty('storeId') ? data.storeId : null;\r\n this.projectId = data && data.hasOwnProperty('projectId') ? data.projectId : null;\r\n this.projectName = data && data.hasOwnProperty('projectName') ? data.projectName : '';\r\n this.projectStoreId = data && data.hasOwnProperty('projectStoreId') ? data.projectStoreId : null;\r\n this.storeLatitude = data && data.hasOwnProperty('storeLatitude') ? data.storeLatitude : '';\r\n this.storeLongitude = data && data.hasOwnProperty('storeLongitude') ? data.storeLongitude : '';\r\n this.userFullName = data && data.hasOwnProperty('userFullName') ? data.userFullName : '';\r\n this.userId = data && data.hasOwnProperty('userId') ? data.userId : null;\r\n this.userLogin = data && data.hasOwnProperty('userLogin') ? data.userLogin : '';\r\n }\r\n}\r\n","export class TableFiltersModel {\r\n [key: string]: any;\r\n}\r\n","import { ProjectModel } from '@app/core/model/project.model';\r\n\r\nexport interface IStoreModel {\r\n storeId: number;\r\n storeName: string;\r\n storeCode: string;\r\n projectStoreName: string;\r\n projectStoreCode: string;\r\n projectStoreChainBanner: string;\r\n fullAddress: string;\r\n latitude: number;\r\n longitude: number;\r\n mchCount: number;\r\n projects: ProjectModel[];\r\n}\r\n\r\nexport class StoreModel implements IStoreModel {\r\n storeId = null;\r\n storeName = '';\r\n storeCode = '';\r\n projectStoreName = '';\r\n projectStoreCode = '';\r\n projectStoreChainBanner = '';\r\n fullAddress = '';\r\n latitude = 0;\r\n longitude = 0;\r\n mchCount = 0;\r\n projects = [];\r\n\r\n constructor(data = {}) {\r\n Object.assign(this, data);\r\n\r\n this.projects = data && data.hasOwnProperty('projects') ? (data['projects'] ? data['projects'] : []) : [];\r\n }\r\n}\r\n","interface IWorkedDay {\r\n status: boolean;\r\n timeBegin: string;\r\n timeEnd: string;\r\n}\r\n\r\nexport class WorkedDayModel implements IWorkedDay {\r\n status = true;\r\n timeBegin = '01:00';\r\n timeEnd = '23:00';\r\n\r\n constructor(data = {}) {\r\n Object.assign(this, data);\r\n }\r\n}\r\n","import { ProjectModel } from '@app/core/model/project.model';\r\nimport { WorkedDayModel } from '@app/core/model/worked-days.model';\r\n\r\ninterface IProjectStore {\r\n projectStoreId: number;\r\n projectStoreName: string;\r\n projectStoreCode: string;\r\n projectStoreChainBanner: string;\r\n fullAddress: string;\r\n latitude: number;\r\n longitude: number;\r\n project: ProjectModel;\r\n workedDays: WorkedDayModel[];\r\n storeStatus: { id: number; name: string };\r\n routeVisitPeriodRule: { id: number; name: string };\r\n}\r\n\r\nexport class ProjectStoreModel implements IProjectStore {\r\n projectStoreId = null;\r\n projectStoreName = '';\r\n projectStoreCode = '';\r\n projectStoreChainBanner = '';\r\n fullAddress = '';\r\n latitude = 0;\r\n longitude = 0;\r\n project;\r\n workedDays;\r\n storeStatus = null;\r\n routeVisitPeriodRule = null;\r\n\r\n constructor(data = {}) {\r\n Object.assign(this, data);\r\n\r\n this.workedDays =\r\n data && data.hasOwnProperty('workedDays')\r\n ? data['workedDays'].map(e => new WorkedDayModel(e))\r\n : new Array(7).map(() => {\r\n return new WorkedDayModel({ status: true, timeBegin: '01:00', timeEnd: '23:00' });\r\n });\r\n }\r\n}\r\n","export interface ITaskGroupModel {\r\n id: number;\r\n taskGroupName: string;\r\n}\r\n\r\nexport class TaskGroupModel implements ITaskGroupModel {\r\n public id = null;\r\n public taskGroupName: string = '';\r\n\r\n constructor(data = {}) {\r\n Object.assign(this, data);\r\n }\r\n}\r\n\r\n\r\nexport interface IVisitModel {\r\n id: number;\r\n date: string;\r\n isActive: boolean;\r\n visitTimeSpent: number;\r\n userLogin: string;\r\n userFullName: string;\r\n projectName: string;\r\n regionName: string;\r\n cityName: string;\r\n fullAddress: string;\r\n projectStoreCode: string;\r\n startServerTime: string;\r\n\r\n}\r\n\r\nexport class VisitModel implements IVisitModel {\r\n public id = null;\r\n public date: string = '';\r\n public isActive: boolean = true;\r\n public visitTimeSpent: number = 0;\r\n public userLogin: string = '';\r\n public regionName: string = '';\r\n public cityName: string = '';\r\n public userFullName: string = '';\r\n public projectStoreCode: string = '';\r\n public fullAddress: string = '';\r\n public startServerTime: string = '';\r\n public projectName: string = '';\r\n\r\n\r\n constructor(data = {}) {\r\n Object.assign(this, data);\r\n }\r\n}\r\n\r\nexport interface IVisitDetailModel {\r\n visitTimeSpent: number;\r\n latitude: number;\r\n longitude: number;\r\n projectStoreChainBanner: string;\r\n taskGroups: ITaskGroupModel[];\r\n}\r\n\r\nexport class VisitDetailModel extends VisitModel implements IVisitDetailModel {\r\n public visitTimeSpent: number;\r\n public latitude: number;\r\n public longitude: number;\r\n public projectStoreChainBanner: string;\r\n public taskGroups: ITaskGroupModel[] = [];\r\n\r\n constructor(data = {}) {\r\n super();\r\n Object.assign(this, data);\r\n }\r\n}\r\n","export class Application {\r\n id?: number;\r\n name: string;\r\n version: string;\r\n isDefault: boolean;\r\n isLight: boolean;\r\n isRequiredUpdate: boolean;\r\n isActive: boolean;\r\n distributionPath?: string;\r\n mobilePackageId?:number;\r\n constructor(\r\n name: string = \"\", \r\n version: string =\"\", \r\n isDefault: boolean = false,\r\n isLight: boolean =false,\r\n isRequiredUpdate: boolean =false,\r\n isActive: boolean =true,\r\n mobilePackageId: number =1 ){\r\n this.name =name;\r\n this.version =version;\r\n this.isDefault =isDefault;\r\n this.isLight = isLight;\r\n this.isRequiredUpdate = isRequiredUpdate;\r\n this.isActive = isActive;\r\n this.mobilePackageId = mobilePackageId\r\n }\r\n}\r\n","interface IVisitPeriodRule {\r\n id: number;\r\n name: string;\r\n}\r\n\r\nexport class VisitPeriodRuleModel implements IVisitPeriodRule {\r\n public id = null;\r\n public name = '';\r\n public visitPlanned: number;\r\n\r\n constructor(data = {}) {\r\n Object.assign(this, data);\r\n }\r\n}\r\n","Date.prototype.convertDateToServerString = convertDateToServerString;\r\nDate.prototype.convertDateToServerStringPoint= convertDateToServerStringPoint\r\nDate.prototype.convertDateToServerStringDash= convertDateToServerStringDash\r\nDate.prototype.convertDateToTimeString = convertDateToTimeString;\r\nDate.prototype.convertDateToServerStringNew = convertDateToServerStringNew;\r\n\r\nString.prototype.convertServerStringToDate = convertServerStringToDate;\r\nString.prototype.convertTimeStringToDate = convertTimeStringToDate;\r\nString.prototype.convertServerStringToDatePoint = convertServerStringToDatePoint;\r\nString.prototype.convertServerStringToDateDash = convertServerStringToDateDash;\r\nString.prototype.upperFirstChar = upperFirstChar;\r\nString.prototype.lowFirstChar = lowFirstChar;\r\nArray.prototype.findElementInArray = findElementInArray;\r\n\r\ninterface Date {\r\n convertDateToServerString: typeof convertDateToServerString;\r\n convertDateToTimeString: typeof convertDateToTimeString;\r\n convertDateToServerStringPoint: typeof convertDateToServerStringPoint;\r\n convertDateToServerStringDash: typeof convertDateToServerStringDash;\r\n convertDateToServerStringNew: typeof convertDateToServerStringNew\r\n}\r\n\r\ninterface String {\r\n convertServerStringToDate: typeof convertServerStringToDate;\r\n convertTimeStringToDate: typeof convertTimeStringToDate;\r\n convertServerStringToDatePoint:typeof convertServerStringToDatePoint;\r\n convertServerStringToDateDash:typeof convertServerStringToDateDash;\r\n upperFirstChar: typeof upperFirstChar;\r\n lowFirstChar: typeof lowFirstChar;\r\n}\r\n\r\ninterface Array {\r\n findElementInArray(searchElement: string | number, dataKey: string, returnIndex: boolean): Array | number;\r\n}\r\n\r\nfunction convertDateToServerString(): number {\r\n const dd = this.getDate() < 10 ? '0' + this.getDate() : this.getDate();\r\n const mm = this.getMonth() + 1 < 10 ? '0' + (this.getMonth() + 1) : this.getMonth() + 1;\r\n const yyyy = this.getFullYear();\r\n return +('' + yyyy + mm + dd);\r\n}\r\nfunction convertDateToServerStringNew(): string {\r\n const dd = this.getDate() < 10 ? '0' + (\"\" + this.getDate()) : this.getDate();\r\n const mm = this.getMonth() + 1 < 10 ? '0' + (this.getMonth() + 1) : this.getMonth() + 1;\r\n const yyyy = this.getFullYear();\r\n return ('' + dd + mm + yyyy );\r\n}\r\n\r\nfunction convertDateToServerStringPoint(): string {\r\n const dd = this.getDate() < 10 ? '0' + this.getDate() : this.getDate();\r\n const mm = this.getMonth() + 1 < 10 ? '0' + (this.getMonth() + 1) : this.getMonth() + 1;\r\n const yyyy = this.getFullYear();\r\n return `${dd}.${mm}.${yyyy}`;\r\n}\r\n\r\nfunction convertDateToServerStringDash(): string {\r\n const dd = this.getDate() < 10 ? '0' + this.getDate() : this.getDate();\r\n const mm = this.getMonth() + 1 < 10 ? '0' + (this.getMonth() + 1) : this.getMonth() + 1;\r\n const yyyy = this.getFullYear();\r\n return `${yyyy}-${mm}-${dd}`;\r\n}\r\n\r\nfunction convertServerStringToDate(): Date {\r\n const yyyy = +this.substr(0, 4);\r\n const mm = +this.substr(4, 2);\r\n const dd = +this.substr(6, 2);\r\n return new Date(yyyy, mm - 1, dd);\r\n}\r\n\r\nfunction convertServerStringToDatePoint(): Date {\r\n const dd = this.substr(0, 2);\r\n const mm = this.substr(3, 2);\r\n const yyyy = this.substr(6, 4);\r\n return new Date(yyyy, mm - 1, dd);\r\n}\r\n\r\nfunction convertServerStringToDateDash(): Date {\r\n const yyyy = +this.substr(0, 4);\r\n const mm = +this.substr(5, 2);\r\n const dd = +this.substr(8, 2);\r\n return new Date(yyyy, mm - 1, dd);\r\n}\r\n\r\n\r\nfunction convertDateToTimeString(): string {\r\n if (this === null) return null;\r\n\r\n return ('0' + this.getHours()).slice(-2) + ':' + ('0' + this.getMinutes()).slice(-2);\r\n}\r\n\r\nfunction upperFirstChar(): string {\r\n if (!this) return this;\r\n\r\n return this[0].toUpperCase() + this.slice(1);\r\n}\r\n\r\nfunction lowFirstChar(): string {\r\n if (!this) return this;\r\n\r\n return this[0].toLowerCase() + this.slice(1);\r\n}\r\n\r\nfunction convertTimeStringToDate(): Date {\r\n if (!this || this.toString().length === 0) {\r\n return null;\r\n }\r\n\r\n const [hour, min, sec] = this.split(':');\r\n\r\n switch (this.match(/:/g).length) {\r\n case 1: {\r\n return new Date(0, 0, 0, +hour, +min);\r\n }\r\n case 2: {\r\n return new Date(0, 0, 0, +hour, +min, +sec);\r\n }\r\n default: {\r\n return new Date(0);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Поиск элемента в массиве. Возвращаем найденный элемент или его индекс.\r\n * @param {string | number} searchElement (искомый элемент)\r\n * @param {string} dataKey (по какому полю в массиве ищем)\r\n * @param {boolean} returnIndex (если true - вернуть индекс массива, если false - вернуть значение)\r\n * @returns {any[] | number} (массив или число)\r\n */\r\nfunction findElementInArray(searchElement: string | number, dataKey?: string, returnIndex = false): any[] | number {\r\n for (let i = 0; i < this.length; i++) {\r\n if (dataKey) {\r\n if (this[i][dataKey] === searchElement) {\r\n return returnIndex ? i : this[i];\r\n }\r\n } else {\r\n if (this[i] === searchElement) {\r\n return returnIndex ? i : this[i];\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { saveAs } from 'file-saver';\r\nimport { Base64 } from 'js-base64';\r\nimport { HttpService } from './http.service';\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class HelperService {\r\n constructor(protected httpService: HttpService) {}\r\n\r\n /**\r\n * Конвертация в транслит\r\n * @param str\r\n */\r\n static convertToTranslit(str: string): string {\r\n const arrRu = [\r\n ' ',\r\n 'Я',\r\n 'я',\r\n 'Ю',\r\n 'ю',\r\n 'Ч',\r\n 'ч',\r\n 'Ш',\r\n 'ш',\r\n 'Щ',\r\n 'щ',\r\n 'Ж',\r\n 'ж',\r\n 'А',\r\n 'а',\r\n 'Б',\r\n 'б',\r\n 'В',\r\n 'в',\r\n 'Г',\r\n 'г',\r\n 'Д',\r\n 'д',\r\n 'Е',\r\n 'е',\r\n 'Ё',\r\n 'ё',\r\n 'З',\r\n 'з',\r\n 'И',\r\n 'и',\r\n 'Й',\r\n 'й',\r\n 'К',\r\n 'к',\r\n 'Л',\r\n 'л',\r\n 'М',\r\n 'м',\r\n 'Н',\r\n 'н',\r\n 'О',\r\n 'о',\r\n 'П',\r\n 'п',\r\n 'Р',\r\n 'р',\r\n 'С',\r\n 'с',\r\n 'Т',\r\n 'т',\r\n 'У',\r\n 'у',\r\n 'Ф',\r\n 'ф',\r\n 'Х',\r\n 'х',\r\n 'Ц',\r\n 'ц',\r\n 'Ы',\r\n 'ы',\r\n 'Ь',\r\n 'ь',\r\n 'Ъ',\r\n 'ъ',\r\n 'Э',\r\n 'э'\r\n ];\r\n const arrEn = [\r\n '-',\r\n 'Ya',\r\n 'ya',\r\n 'Yu',\r\n 'yu',\r\n 'Ch',\r\n 'ch',\r\n 'Sh',\r\n 'sh',\r\n 'Sh',\r\n 'sh',\r\n 'Zh',\r\n 'zh',\r\n 'A',\r\n 'a',\r\n 'B',\r\n 'b',\r\n 'V',\r\n 'v',\r\n 'G',\r\n 'g',\r\n 'D',\r\n 'd',\r\n 'E',\r\n 'e',\r\n 'E',\r\n 'e',\r\n 'Z',\r\n 'z',\r\n 'I',\r\n 'i',\r\n 'J',\r\n 'j',\r\n 'K',\r\n 'k',\r\n 'L',\r\n 'l',\r\n 'M',\r\n 'm',\r\n 'N',\r\n 'n',\r\n 'O',\r\n 'o',\r\n 'P',\r\n 'p',\r\n 'R',\r\n 'r',\r\n 'S',\r\n 's',\r\n 'T',\r\n 't',\r\n 'U',\r\n 'u',\r\n 'F',\r\n 'f',\r\n 'H',\r\n 'h',\r\n 'Ts',\r\n 'ts',\r\n 'Y',\r\n 'y',\r\n '',\r\n '',\r\n '',\r\n '',\r\n 'E',\r\n 'e'\r\n ];\r\n\r\n for (let i = 0; i < arrRu.length; i++) {\r\n let reg = new RegExp(arrRu[i], 'g');\r\n str = str.replace(reg, arrEn[i]);\r\n }\r\n return str;\r\n }\r\n\r\n /**\r\n * Генерация строки определенной длины\r\n * @param count\r\n */\r\n static createRandomString(count: number = 6): string {\r\n const chars: string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz';\r\n let randomstring: string = '';\r\n for (let i = 0; i < count; i++) {\r\n let rnum = Math.floor(Math.random() * chars.length);\r\n randomstring += chars.substring(rnum, rnum + 1);\r\n }\r\n return randomstring;\r\n }\r\n\r\n /**\r\n * Создание нового файла с содержимым из response и именем файла из Content-Disposition\r\n * с последующим скачиванием его.\r\n * @param data\r\n * @param contentDisposition\r\n * @param base64Name\r\n */\r\n static downloadFile(data: any, contentDisposition: string, base64Name = true): void {\r\n const blob = new Blob([data], { type: 'text/plain' });\r\n // Формируем дефолтное имя файла\r\n let filename = `${(Math.random() * 1e8).toFixed()}_${\r\n new Date().getFullYear() +\r\n '-' +\r\n ('0' + (new Date().getMonth() + 1)).slice(-2) +\r\n '-' +\r\n ('0' + new Date().getDate()).slice(-2)\r\n }`;\r\n\r\n if (contentDisposition && contentDisposition.length > 0) {\r\n let filenames = contentDisposition.match(/(filename\\*=|filename=)\\\"?(.*)\\\"?/);\r\n if (filenames[2]) {\r\n filenames[2]=filenames[2].replace(/\\\"/, '')\r\n filename = decodeURI(filenames[2].replace(/.*''/, ''));\r\n }\r\n }\r\n\r\n filename = base64Name ? Base64.decode(filename) : filename;\r\n\r\n saveAs(blob, filename);\r\n }\r\n\r\n /**\r\n * Создание нового файла с содержимым из response и именем файла из Content-Disposition\r\n * с последующим скачиванием его.\r\n * @param data\r\n * @param contentDisposition\r\n * @param base64Name\r\n */\r\n static downloadFileTest(data: any, contentDisposition: string, base64Name = true): void {\r\n // console.log(\"downloadFileTest\",contentDisposition)\r\n const blob = new Blob([String.fromCharCode(0xFEFF), data], { type: 'text/csv;charset=utf-8' });\r\n let filename = `${(Math.random() * 1e8).toFixed()}_${\r\n new Date().getFullYear() +\r\n '-' +\r\n ('0' + (new Date().getMonth() + 1)).slice(-2) +\r\n '-' +\r\n ('0' + new Date().getDate()).slice(-2)\r\n }`;\r\n\r\n if (contentDisposition && contentDisposition.length > 0) {\r\n let filenames = contentDisposition.match(/(filename\\*=|filename=)\\\"?(.*)\\\"?/);\r\n \r\n if (filenames[2]) {\r\n filenames[2]=filenames[2].replace(/\\\"/, '')\r\n filename = decodeURI(filenames[2].replace(/.*''/, ''));\r\n }\r\n }\r\n filename = base64Name ? Base64.decode(filename) : filename;\r\n saveAs(blob, filename, { autoBom: true });\r\n \r\n }\r\n\r\n\r\n\r\n\r\n\r\n \r\n\r\n static addUTF8BOMToString(inputString) {\r\n // Create a Uint8Array containing the UTF-8 BOM (Byte Order Mark).\r\n const bom = new Uint8Array([0xEF, 0xBB, 0xBF]);\r\n \r\n // Convert the input string to a Uint8Array.\r\n const textBytes = new TextEncoder().encode(inputString);\r\n \r\n // Combine the BOM and the text bytes into a single Uint8Array.\r\n const resultBytes = new Uint8Array(bom.length + textBytes.length);\r\n resultBytes.set(bom, 0);\r\n resultBytes.set(textBytes, bom.length);\r\n \r\n // Convert the combined bytes back to a string.\r\n const resultString = new TextDecoder('utf-8').decode(resultBytes);\r\n \r\n return resultString;\r\n }\r\n \r\n\r\n static addUTF8BOMToStringOld(inputString) {\r\n // Create a Uint8Array containing the UTF-8 BOM (Byte Order Mark).\r\n const bom = new Uint8Array([0xEF, 0xBB, 0xBF]);\r\n \r\n // Convert the input string to a Uint8Array.\r\n const textBytes = new TextEncoder().encode(inputString);\r\n \r\n // Combine the BOM and the text bytes into a single Uint8Array.\r\n const resultBytes = new Uint8Array(bom.length + textBytes.length);\r\n resultBytes.set(bom, 0);\r\n resultBytes.set(textBytes, bom.length);\r\n \r\n // Convert the combined bytes back to a string.\r\n const resultString = new TextDecoder('utf-8').decode(resultBytes);\r\n \r\n return resultString;\r\n }\r\n static expandPolygon(coords: number[][]) {\r\n if (!coords || !coords.length) {\r\n return null;\r\n }\r\n let polygon = [];\r\n\r\n switch (coords.length) {\r\n case 1: {\r\n polygon = this.createPolygonByPoint(coords, 12, 150);\r\n break;\r\n }\r\n case 2: {\r\n polygon = this.createPolygonByTwoPoint(coords, 150);\r\n break;\r\n }\r\n default: {\r\n // polygon = this.createPolygonByMoreThreePoint(coords, 150);\r\n polygon = coords;\r\n }\r\n }\r\n\r\n return polygon;\r\n }\r\n\r\n private static createPolygonByPoint(\r\n coords: number[][],\r\n countAngles: number = 12,\r\n distance: number = 150\r\n ): number[][] {\r\n if (coords.length !== 1 || countAngles === 0) {\r\n return null;\r\n }\r\n\r\n const azimut = 360 / countAngles;\r\n const earth = (6371000 * Math.PI) / 180;\r\n let polygon = [];\r\n\r\n for (let i = 0; i < countAngles; i++) {\r\n let rad = (azimut * i * Math.PI) / 180;\r\n\r\n let x1 = coords[0][0] + (distance * Math.cos(rad)) / earth;\r\n let y1 = coords[0][1] + (distance * Math.sin(rad)) / Math.cos((coords[0][0] * Math.PI) / 180) / earth;\r\n\r\n polygon.push([x1, y1]);\r\n }\r\n\r\n return polygon;\r\n }\r\n\r\n private static getCenterPolygon(coords: number[][]): number[] {\r\n if (!coords || !coords.length) {\r\n return null;\r\n }\r\n\r\n return [coords.reduce((x, y) => x + y[0], 0) / coords.length, coords.reduce((x, y) => x + y[1], 0) / coords.length];\r\n }\r\n\r\n private static createPolygonByMoreThreePoint(coords: number[][], distance: number = 150) {\r\n if (!coords || !coords.length) {\r\n return null;\r\n }\r\n\r\n const earth = (6371000 * Math.PI) / 180;\r\n const center = this.getCenterPolygon(coords);\r\n const polygon = [];\r\n\r\n for (let i = 0; i < coords.length; i++) {\r\n let rad = Math.atan2(coords[i][1] - center[1], coords[i][0] - center[0]);\r\n\r\n let x1 = coords[i][0] + (distance * Math.cos(rad)) / earth;\r\n let y1 = coords[i][1] + (distance * Math.sin(rad)) / Math.cos((coords[i][0] * Math.PI) / 180) / earth;\r\n\r\n polygon.push([x1, y1]);\r\n }\r\n\r\n return polygon;\r\n }\r\n\r\n private static createPolygonByTwoPoint(coords: number[][], distance: number = 150) {\r\n if (!coords || !coords.length) {\r\n return null;\r\n }\r\n\r\n const earth = (6371000 * Math.PI) / 180;\r\n const center = this.getCenterPolygon(coords);\r\n const polygon = [];\r\n\r\n const rad45deg = (45 * Math.PI) / 180;\r\n\r\n for (let i = 0; i < coords.length; i++) {\r\n let rad1 = Math.atan2(coords[i][1] - center[1], coords[i][0] - center[0]) + rad45deg;\r\n\r\n let x1 = coords[i][0] + (distance * Math.cos(rad1)) / earth;\r\n let y1 = coords[i][1] + (distance * Math.sin(rad1)) / Math.cos((coords[i][0] * Math.PI) / 180) / earth;\r\n\r\n polygon.push([x1, y1]);\r\n\r\n let rad2 = Math.atan2(coords[i][1] - center[1], coords[i][0] - center[0]) - rad45deg;\r\n\r\n let x2 = coords[i][0] + (distance * Math.cos(rad2)) / earth;\r\n let y2 = coords[i][1] + (distance * Math.sin(rad2)) / Math.cos((coords[i][0] * Math.PI) / 180) / earth;\r\n\r\n polygon.push([x2, y2]);\r\n }\r\n \r\n return polygon;\r\n }\r\n\r\n\r\n transformDatePoint(date:Date|\"\"){\r\n // console.log (\"transformDatePoint\",date)\r\n if(!date) return \"\"\r\n const month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1;\r\n const day = date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate();\r\n return `${day}.${month}.${date.getFullYear()}`;\r\n }\r\n transformStringPoint(date:string){\r\n const dd = +date.substr(0, 2);\r\n const mm = +date.substr(3, 2);\r\n const yyyy = +date.substr(6, 4);\r\n return new Date(yyyy, mm - 1, dd);\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders, HttpParams, HttpResponse } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { environment as env } from '@env/environment';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError } from 'rxjs/operators';\r\n\r\nconst BASE_URL = env.serverUrl;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class HttpService {\r\n private headers = new HttpHeaders();\r\n\r\n constructor(private httpClient: HttpClient) {}\r\n\r\n setUrl(path:string){\r\n return BASE_URL + path\r\n }\r\n\r\n public get(path: string, params: HttpParams = new HttpParams()): Observable {\r\n return this.httpClient.get(BASE_URL + path, { params }).pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public getResponse(path: string, params: HttpParams = new HttpParams()): Observable> {\r\n return this.httpClient.get(BASE_URL + path, { params, observe: 'response' }).pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public getBlobGet(path: string, params: HttpParams = new HttpParams()): Observable> {\r\n return this.httpClient.get(BASE_URL + path, {\r\n headers: this.headers.set('Content-Type', 'application/octet-stream'),\r\n params,\r\n responseType: 'arraybuffer',\r\n observe: 'response'\r\n });\r\n }\r\n\r\n public getBlobGetTest(path: string, params: HttpParams = new HttpParams()): any {\r\n return this.httpClient.get(BASE_URL + path, {\r\n headers: this.headers.set('Content-Type', 'application/octet-stream'),\r\n params,\r\n responseType: 'blob',\r\n observe: 'response'\r\n });\r\n }\r\n \r\n\r\n public getBlob(\r\n path: string,\r\n body: object = {},\r\n params: HttpParams = new HttpParams()\r\n ): Observable> {\r\n return this.httpClient\r\n .post(BASE_URL + path, JSON.stringify(body), {\r\n headers: this.headers.set('Content-Type', 'application/json'),\r\n params,\r\n responseType: 'blob',\r\n observe: 'response'\r\n })\r\n .pipe(catchError(this.formatErrors));\r\n }\r\n public getBlobTest(\r\n path: string,\r\n body: object = {},\r\n params: HttpParams = new HttpParams()\r\n ): Observable> {\r\n return this.httpClient\r\n .post( path, JSON.stringify(body), {\r\n headers: this.headers.set('Content-Type', 'application/json'),\r\n params,\r\n responseType: 'blob',\r\n observe: 'response'\r\n })\r\n .pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public getFileBlob(path: string, params: HttpParams = new HttpParams()): Observable> {\r\n return this.httpClient\r\n .get(BASE_URL + path, {\r\n params,\r\n responseType: 'blob',\r\n observe: 'response'\r\n })\r\n .pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public deleteResponse(path: string, params: HttpParams = new HttpParams()): Observable {\r\n return this.httpClient\r\n .delete(BASE_URL + path, {\r\n params,\r\n headers: this.headers.set('Content-Type', 'application/json'),\r\n observe: 'response'\r\n })\r\n .pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public post(path: string, body: object = {}, params = new HttpParams()): Observable {\r\n return this.httpClient\r\n .post(BASE_URL + path, JSON.stringify(body), {\r\n params,\r\n headers: this.headers.set('Content-Type', 'application/json')\r\n })\r\n .pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public postResponse(path: string, body: object = {}, params = new HttpParams()): Observable {\r\n return this.httpClient\r\n .post(BASE_URL + path, JSON.stringify(body), {\r\n params,\r\n headers: this.headers.set('Content-Type', 'application/json'),\r\n observe: 'response'\r\n })\r\n .pipe(catchError(this.formatErrors));\r\n }\r\n public putResponse(path: string, body: object = {}, params = new HttpParams()): Observable {\r\n return this.httpClient\r\n .put(BASE_URL + path, JSON.stringify(body), {\r\n params,\r\n headers: this.headers.set('Content-Type', 'application/json'),\r\n observe: 'response'\r\n })\r\n .pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public postResponseBlob(path: string, body: object = {}, params = new HttpParams()): Observable{\r\n return this.httpClient\r\n .post(BASE_URL + path, JSON.stringify(body), {\r\n params,\r\n responseType: 'arraybuffer',\r\n headers: this.headers.set('Content-Type', 'application/json'),\r\n observe: 'response'\r\n })\r\n .pipe(catchError(this.formatErrors))\r\n }\r\n\r\n public delete(path: string, params: HttpParams = new HttpParams()): Observable {\r\n return this.httpClient.delete(BASE_URL + path, { params }).pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public formatErrors(error: any): Observable {\r\n return throwError(error);\r\n }\r\n\r\n public postResponseMultipart(path: string, body: object = {}, params = new HttpParams()): Observable {\r\n const localBody = body instanceof FormData ? body : JSON.stringify(body);\r\n return this.httpClient\r\n .post(BASE_URL + path, localBody, { params, headers: this.headers, observe: 'response' })\r\n .pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public getTest(path: string, params: HttpParams = new HttpParams()): Observable {\r\n return this.httpClient.get(path, { params }).pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public getResponseTest(path: string, params: HttpParams = new HttpParams()): Observable> {\r\n return this.httpClient.get(path, { params, observe: 'response', }).pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public postResponseMultipartTest(path: string, body: object = {}, params = new HttpParams()): Observable {\r\n const localBody = body instanceof FormData ? body : JSON.stringify(body);\r\n return this.httpClient\r\n .post(path, localBody, { params, headers: this.headers, observe: 'response' })\r\n .pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public postTest(path: string, body: object = {}, params = new HttpParams()): Observable {\r\n return this.httpClient\r\n .post(path, JSON.stringify(body), {\r\n params,\r\n headers: this.headers.set('Content-Type', 'application/json')\r\n })\r\n .pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public postResponseTest(path: string, body: object = {}, params = new HttpParams()): Observable {\r\n return this.httpClient\r\n .post(path, JSON.stringify(body), {\r\n params,\r\n headers: this.headers.set('Content-Type', 'application/json'),\r\n observe: 'response'\r\n })\r\n .pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public deleteTest(path: string, params: HttpParams = new HttpParams()): Observable {\r\n return this.httpClient.delete(path, { params }).pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public deleteResponseTest(path: string, params: HttpParams = new HttpParams()): Observable {\r\n return this.httpClient\r\n .delete(path, { params, headers: this.headers.set('Content-Type', 'application/json'), observe: 'response' })\r\n .pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public patch(path: string, params: HttpParams = new HttpParams()): Observable {\r\n return this.httpClient.patch(BASE_URL + path, {},{ params }).pipe(catchError(this.formatErrors));\r\n }\r\n\r\n public patchResponse(path: string, params: HttpParams = new HttpParams()): Observable> {\r\n return this.httpClient.patch(BASE_URL + path, {},{ params, observe: 'response' }).pipe(catchError(this.formatErrors));\r\n\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable, of, Subject } from 'rxjs';\r\nimport { UserModel } from '@app/core/model';\r\nimport { LocalStorageService } from 'ngx-webstorage';\r\nimport { Router } from '@angular/router';\r\nimport { ReportNotificationService } from './report-notification.service';\r\n\r\nexport const MAXAGE =16;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserService {\r\n user: BehaviorSubject;\r\n \r\n isRequiredPersonalData:BehaviorSubject = new BehaviorSubject (true)\r\n isRequiredPersonalDataOpen:BehaviorSubject = new BehaviorSubject (false)\r\n constructor( private storage: LocalStorageService, private reportNotificationService: ReportNotificationService,\r\n private router: Router) {\r\n this.user = new BehaviorSubject(null);\r\n \r\n }\r\n\r\n setUser(message) {\r\n this.user.next(message);\r\n }\r\n\r\n getUser(): UserModel {\r\n return this.user.getValue();\r\n }\r\n\r\n getUserObservable(): Observable {\r\n return of(this.getUser());\r\n }\r\n\r\n getUserStream() {\r\n return this.user;\r\n }\r\n\r\n logout() {\r\n // alert(\"logout\")\r\n this.reportNotificationService.stopListerningAfterLogout()\r\n this.setUser({})\r\n this.storage.clear('access_token');\r\n this.router.navigate(['/auth/login']);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { ProjectModel } from '@app/core/model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ProjectService {\r\n private project: BehaviorSubject;\r\n\r\n constructor() {\r\n this.project = new BehaviorSubject(null);\r\n }\r\n\r\n clearProject() {\r\n this.project.next(null);\r\n }\r\n\r\n setProject(message) {\r\n this.project.next(message);\r\n localStorage.setItem('projectName', message.siteUrl);\r\n }\r\n\r\n getProject(): ProjectModel {\r\n return this.project.getValue();\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { UserService } from './user.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PermissionsService {\r\n\r\n isRequiredPersonalData:boolean =true;\r\n isRequiredPersonalDataOpen:boolean =false;\r\n constructor( private userService: UserService,) {\r\n\r\n this.isRequiredPersonalData = this.userService.isRequiredPersonalData.getValue()\r\n this.userService.isRequiredPersonalData.subscribe((b) => {\r\n // console.log(\"isRequiredPersonalData.subscribe\", b);\r\n this.isRequiredPersonalData=b\r\n });\r\n this.isRequiredPersonalDataOpen = this.userService.isRequiredPersonalDataOpen.getValue()\r\n this.userService.isRequiredPersonalDataOpen.subscribe((b) => {\r\n // console.log(\"isRequiredPersonalData.subscribe\", b);\r\n this.isRequiredPersonalData=b\r\n });\r\n\r\n }\r\n\r\n public permissionsState: { [key: string]: boolean };\r\n\r\n getPermissions() {\r\n // if(this.isRequiredPersonalData) return {}\r\n return this.permissionsState;\r\n }\r\n\r\n setPermissions(value) {\r\n this.permissionsState = value;\r\n }\r\n \r\n hasNav(key: string): boolean {\r\n if(this.isRequiredPersonalData) return false\r\n if (!this.permissionsState.hasOwnProperty(key)) {\r\n return false;\r\n }\r\n\r\n return this.permissionsState[key];\r\n }\r\n\r\n has(key: string): boolean {\r\n if(this.isRequiredPersonalDataOpen) return false\r\n if (!this.permissionsState.hasOwnProperty(key)) {\r\n return false;\r\n }\r\n\r\n return this.permissionsState[key];\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ReportNotificationService, ReportsOrder } from './report-notification.service';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { HttpService } from './http.service';\r\nimport { take, takeUntil } from 'rxjs/operators';\r\nimport { HttpParams, HttpResponse } from '@angular/common/http';\r\nimport { Subject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PhotoReportNotificationService extends ReportNotificationService {\r\n public reports$: Subject = new Subject()\r\n\r\n public reportsResponse$: Subject> = new Subject()\r\n \r\n public reportsInOrder$: Subject = new Subject()\r\n\r\n public reportsReady$: Subject = new Subject()\r\n\r\n showedOrdersIds=[];\r\n\r\n isListerningNotification: boolean;\r\n\r\n isListerningSubject :Subject = new Subject();\r\n\r\n countReqests=-1;\r\n notifier:Subject =new Subject();\r\n timeoutId;\r\n\r\n constructor( \r\n protected toastr: ToastrService,\r\n protected httpService: HttpService)\r\n {\r\n super (toastr,httpService);\r\n\r\n this.reportsInOrder$.subscribe((data)=>{\r\n this.toastr.info(`Фотоотчет поставлен в очередь (всего ${data.length} фотоотчетов в очереди). Посмотреть список очереди можно по
    ссылке или дождитесь уведомления`,\"\",{enableHtml:true,timeOut:10000})\r\n })\r\n\r\n this.reportsReady$.subscribe((data)=>{\r\n data.forEach((report,i)=>{\r\n let id = 'link' + i;\r\n this.markAsWiewed(report)\r\n let toastr =this.toastr.info(`Отчет \"${report.reportName}\" готов. Нажмите на кнопку чтобы скачать`,\"\",{enableHtml:true,timeOut:0,closeButton:true});\r\n toastr.onTap .pipe(take(1)) .subscribe((data:any)=>{\r\n // console.log((event.target as HTMLElement).tagName==\"A\")\r\n if((event.target as HTMLElement).tagName==\"A\") {\r\n console.log (report)\r\n this.markDownloaded(report)\r\n }\r\n \r\n })\r\n // this.onReadyReport();\r\n this.addReportAsShowed(report)\r\n })\r\n })\r\n onstorage = this.onStorage.bind(this)\r\n this.fetchIsListerningNotification();\r\n \r\n \r\n \r\n this.notifier.subscribe((data)=>{\r\n this.getReportNotify().pipe(\r\n take(1),//отменит подписку, когда getReportNotify передаст первое значение.\r\n takeUntil(this.isListerningSubject),//отменит подписку до первого значения, если прекращение прослушки пришло с другой страницы\r\n ).subscribe((reportOrder:ReportsOrder[])=>{\r\n if(reportOrder.length){\r\n let reportsReady = this.filterNotification(reportOrder)\r\n if(reportsReady.length) this.reportsReady$.next(reportsReady )\r\n if(this.hasReportsProcessing(reportOrder)) {\r\n this.countReqests++;\r\n this.timeoutId =setTimeout(()=>{\r\n this.notifier.next(true)\r\n },this.getDelay())\r\n }\r\n else this.stopListerning()\r\n }\r\n else \r\n this.stopListerning()\r\n })\r\n })\r\n }\r\n\r\n onReqestOrder(){\r\n if(!this.getIsListerning()) this.startListerning()\r\n }\r\n markAsWiewed(data){\r\n let params = new HttpParams().append('sessionId',data.sessionId)\r\n this.httpService.post('photo-service/api/photo/notify/read',{}, params).subscribe((data:any)=>{\r\n // this.loadreports()\r\n })\r\n } \r\n markDownloaded(data){\r\n let params = new HttpParams().append('sessionId',data.sessionId)\r\n this.httpService.post('photo-service/api/photo/download-report',{}, params).subscribe((data:any)=>{\r\n this.loadreports()\r\n })\r\n }\r\n\r\n onStorage(){\r\n // console.log(\"onStorage\")\r\n let isListerning = !! JSON.parse(localStorage.getItem(\"isListerningPhotoNotification\"))\r\n // console.log(\"onStorage\",isListerning ,this.isListerningNotification)\r\n if(isListerning && ! this.isListerningNotification) {\r\n this.startListerning();\r\n return;\r\n }\r\n if( !isListerning && ! this.isListerningNotification) {\r\n this.stopListerning();\r\n return;\r\n }\r\n if(!isListerning && this.isListerningNotification){\r\n this.getReportOrder().subscribe((reportOrder:ReportsOrder[])=>{\r\n this.reports$.next(reportOrder)\r\n let reportOrderFiltered = reportOrder.filter((item)=>{return item.statusId==1 || item.statusId==2})\r\n if(!reportOrderFiltered.length) this.stopListerning()\r\n })\r\n }\r\n }\r\n\r\n fetchIsListerningNotification(){\r\n this.isListerningNotification = !! JSON.parse(localStorage.getItem(\"isListerningPhotoNotification\"))\r\n if(!this.getIsListerning()) this.isListerningSubject.next(false)\r\n }\r\n\r\n setIsListerningNotification(boolean: boolean){\r\n localStorage.setItem(\"isListerningPhotoNotification\",JSON.stringify(boolean))\r\n }\r\n\r\n\r\n getReportOrder(){\r\n return this.get('photo-service/api/photo/all')\r\n }\r\n getReportOrderResponse(){\r\n return this.getResponse('photo-service/api/photo/all')\r\n }\r\n\r\n getReportNotify(){\r\n // if()\r\n return this.httpService.get('photo-service/api/photo/notify/show')\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { Observable, Scheduler, Subject, asyncScheduler, from, fromEvent, of, scheduled, timer } from 'rxjs';\r\nimport { HttpService } from './http.service';\r\nimport { HttpParams, HttpResponse } from '@angular/common/http';\r\nimport { delay, repeat, repeatWhen, retryWhen, take, takeUntil, timeInterval, timeout, timeoutWith } from 'rxjs/operators';\r\nimport { AsyncScheduler } from 'rxjs/internal/scheduler/AsyncScheduler';\r\nimport { Action } from 'rxjs/internal/scheduler/Action';\r\nimport { timeStamp } from 'console';\r\n\r\n\r\nexport interface ReportsOrder {\r\n id: number,\r\n reportId: number,\r\n reportName : string,\r\n url: string,\r\n isDownloaded:0|1,\r\n statusId: number,\r\n statusdescription: string,\r\n createdOn: Date,\r\n created:string, // \"2024-01-09\"\r\n complitedDate: Date,\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ReportNotificationService {\r\n \r\n public reports$: Subject = new Subject()\r\n\r\n public reportsResponse$: Subject> = new Subject()\r\n \r\n public reportsInOrder$: Subject = new Subject()\r\n\r\n public reportsReady$: Subject = new Subject()\r\n\r\n showedOrdersIds=[];\r\n\r\n isListerningNotification: boolean;\r\n\r\n isListerningSubject :Subject = new Subject();\r\n\r\n countReqests=-1;\r\n notifier:Subject =new Subject();\r\n timeoutId;\r\n\r\n constructor( \r\n protected toastr: ToastrService,\r\n protected httpService: HttpService\r\n ) { \r\n this.reportsInOrder$.subscribe((data)=>{\r\n this.toastr.info(`Отчет поставлен в очередь (всего ${data.length} в очереди). Посмотреть список очереди можно по ссылке или дождитесь уведомления`,\"\",{enableHtml:true,timeOut:10000})\r\n })\r\n this.reportsReady$.subscribe((data)=>{\r\n data.forEach((report,i)=>{\r\n let id = 'link' + i;\r\n this.markAsWiewed(report)\r\n let toastr =this.toastr.info(`Отчет \"${report.reportName}\" готов. Нажмите на кнопку чтобы скачать`,\"\",{enableHtml:true,timeOut:0,closeButton:true});\r\n toastr.onTap .pipe(take(1)) .subscribe((data:any)=>{\r\n // console.log((event.target as HTMLElement).tagName==\"A\")\r\n if((event.target as HTMLElement).tagName==\"A\") {\r\n console.log (report)\r\n this.markDownloaded(report)\r\n }\r\n \r\n })\r\n // this.onReadyReport();\r\n this.addReportAsShowed(report)\r\n })\r\n })\r\n onstorage = this.onStorage.bind(this)\r\n this.fetchIsListerningNotification();\r\n\r\n\r\n\r\n this.notifier.subscribe((data)=>{\r\n this.getReportNotify().pipe(\r\n take(1),//отменит подписку, когда getReportNotify передаст первое значение.\r\n takeUntil(this.isListerningSubject),//отменит подписку до первого значения, если прекращение прослушки пришло с другой страницы\r\n ).subscribe((reportOrder:ReportsOrder[])=>{\r\n if(reportOrder.length){\r\n let reportsReady = this.filterNotification(reportOrder)\r\n if(reportsReady.length) this.reportsReady$.next(reportsReady )\r\n if(this.hasReportsProcessing(reportOrder)) {\r\n this.countReqests++;\r\n this.timeoutId =setTimeout(()=>{\r\n this.notifier.next(true)\r\n },this.getDelay())\r\n }\r\n else this.stopListerning()\r\n }\r\n else \r\n this.stopListerning()\r\n })\r\n })\r\n }\r\n\r\n\r\n hasReportsProcessing(reports:ReportsOrder[]):boolean{\r\n return reports.some((report)=>{return report.statusId==2})\r\n }\r\n\r\n addReportAsShowed(report:ReportsOrder){\r\n this.showedOrdersIds.push(report.id)\r\n }\r\n\r\n\r\n checkReportsInOrder(){\r\n this.getReportOrder().subscribe((reportOrder:ReportsOrder[])=>{\r\n this.reports$.next(reportOrder)\r\n this.reportsInOrder$.next(reportOrder.filter((item)=>{return item.statusId==1 || item.statusId==2}))\r\n })\r\n }\r\n\r\n getReportOrder(){\r\n return this.get('report-service/api/outer-report/all')\r\n }\r\n getReportOrderResponse(){\r\n return this.getResponse('report-service/api/outer-report/all')\r\n }\r\n\r\n getReportNotify(){\r\n // if()\r\n return this.httpService.get('report-service/api/outer-report/notify/show')\r\n }\r\n\r\n loadreports(){\r\n this.getReportOrderResponse().subscribe((response:HttpResponse)=>{\r\n this.reportsResponse$.next(response)\r\n this.reports$.next(response.body)\r\n })\r\n }\r\n\r\ninitialization(){\r\n \r\n if( !this.getIsListerning() ) this.checkNotifications()\r\n else this.startListerning();\r\n}\r\n\r\n checkNotifications(){\r\n this.getReportNotify().pipe(takeUntil(this.isListerningSubject)).subscribe((reportOrder:ReportsOrder[])=>{\r\n if(reportOrder.length){\r\n let reportsReady = this.filterNotification(reportOrder)\r\n this.reportsReady$.next(reportsReady )\r\n }\r\n })\r\n }\r\n\r\n filterNotification(reports:ReportsOrder[]):ReportsOrder[]{\r\n let self =this;\r\n let result =[];\r\n reports.forEach((report:ReportsOrder)=>{\r\n if(isFitByDate(report) && isFitByDownloadd(report)) result.push(report)\r\n else this.markAsWiewed(report)\r\n \r\n })\r\n return result.filter((report:ReportsOrder)=>{return report.statusId==3})\r\n\r\n function isFitByDate(report:ReportsOrder):boolean{\r\n let created = self.convertStringToDateDash(report.created);\r\n return (+new Date() - +created ) <= 1000*60*60*24\r\n }\r\n function isFitByDownloadd(report:ReportsOrder):boolean{\r\n return !report.isDownloaded\r\n }\r\n\r\n }\r\n \r\n convertStringToDateDash(string):Date{ //\"16.01.2024 16:39:43\"\r\n const dd = +string.substr(0,2 );\r\n const mm = +string.substr(3, 2);\r\n const yyyy = +string.substr(6, 4 );\r\n return new Date(yyyy, mm - 1, dd);\r\n }\r\n\r\n\r\n public get(path: string, params?): Observable {\r\n return this.httpService.get(path, params)\r\n }\r\n public getResponse(path: string, params?): Observable {\r\n return this.httpService.getResponse(path, params)\r\n }\r\n\r\n public getBlob(path: string, body?, params?): Observable {\r\n return this.httpService.getBlob(path, body,params)\r\n }\r\n\r\n markDownloaded(data){\r\n let params = new HttpParams().append('sessionId',data.sessionId)\r\n this.httpService.post('report-service/api/outer-report/download',{}, params).subscribe((data:any)=>{\r\n this.loadreports()\r\n })\r\n }\r\n\r\n markAsWiewed(data){\r\n let params = new HttpParams().append('sessionId',data.sessionId)\r\n this.httpService.post('report-service/api/outer-report/notify/read',{}, params).subscribe((data:any)=>{\r\n // this.loadreports()\r\n })\r\n }\r\n\r\n \r\n\r\n onReqestOrder(){\r\n if(!this.getIsListerning()) this.startListerning()\r\n }\r\n\r\n onReadyReport(){\r\n // console.log (\"onReadyReport\")\r\n this.getReportOrder().subscribe((reportOrder:ReportsOrder[])=>{\r\n this.reports$.next(reportOrder)\r\n let reportOrderFiltered = reportOrder.filter((item)=>{return item.statusId==1 || item.statusId==2})\r\n if(!reportOrderFiltered.length) this.stopListerning()\r\n })\r\n }\r\n\r\n startListerning(delayM:boolean = false){\r\n this.isListerningNotification =true;\r\n this.setIsListerningNotification(true);\r\n this.notifier.next(true)\r\n }\r\n\r\n stopListerning(){\r\n this.isListerningNotification =false;\r\n this.setIsListerningNotification(false);\r\n this.isListerningSubject.next(false);\r\n this.countReqests = -1;\r\n clearTimeout(this.timeoutId)\r\n }\r\n\r\n stopListerningAfterLogout(){\r\n this.isListerningNotification =false;\r\n this.isListerningSubject.next(false);\r\n this.countReqests = -1;\r\n clearTimeout(this.timeoutId)\r\n }\r\n\r\n getIsListerning(){\r\n return this.isListerningNotification\r\n }\r\n\r\n\r\n fetchIsListerningNotification(){\r\n this.isListerningNotification = !! JSON.parse(localStorage.getItem(\"isListerningNotification\"))\r\n if(!this.getIsListerning()) this.isListerningSubject.next(false)\r\n }\r\n\r\n setIsListerningNotification(boolean: boolean){\r\n localStorage.setItem(\"isListerningNotification\",JSON.stringify(boolean))\r\n }\r\n\r\n getDelay(){\r\n if(this.countReqests ==-1) return 0\r\n return (10 + 0.03*this.countReqests*10 ) > 60 ? 60*1000 :(10 + 0.03*this.countReqests*10 )*1000\r\n }\r\n\r\n\r\n onStorage(){\r\n // console.log(\"onStorage\")\r\n let isListerning = !! JSON.parse(localStorage.getItem(\"isListerningNotification\"))\r\n // console.log(\"onStorage\",isListerning ,this.isListerningNotification)\r\n if(isListerning && ! this.isListerningNotification) {\r\n this.startListerning();\r\n return;\r\n }\r\n if( !isListerning && ! this.isListerningNotification) {\r\n this.stopListerning();\r\n return;\r\n }\r\n if(!isListerning && this.isListerningNotification){\r\n this.getReportOrder().subscribe((reportOrder:ReportsOrder[])=>{\r\n this.reports$.next(reportOrder)\r\n let reportOrderFiltered = reportOrder.filter((item)=>{return item.statusId==1 || item.statusId==2})\r\n if(!reportOrderFiltered.length) this.stopListerning()\r\n })\r\n }\r\n }\r\n\r\n}\r\n","import {\r\n DxAccordionModule,\r\n DxBarGaugeModule,\r\n DxButtonModule,\r\n DxCalendarModule,\r\n DxChartModule,\r\n DxCheckBoxModule,\r\n DxDataGridModule,\r\n DxDateBoxModule,\r\n DxDateRangeBoxModule,\r\n DxDropDownBoxModule,\r\n DxFileUploaderModule,\r\n DxFormComponent,\r\n DxFormModule,\r\n DxListModule,\r\n DxLoadIndicatorModule,\r\n DxLoadPanelModule,\r\n DxLookupModule,\r\n DxNumberBoxModule,\r\n DxPieChartModule,\r\n DxPopupModule,\r\n DxScrollViewModule,\r\n DxSelectBoxModule,\r\n DxSliderModule,\r\n DxSwitchModule,\r\n DxTabPanelModule,\r\n DxTabsModule,\r\n DxTagBoxModule,\r\n DxTextBoxModule,\r\n DxTreeListModule,\r\n DxValidationGroupModule,\r\n DxValidationSummaryModule,\r\n DxValidatorModule,\r\n DxVectorMapModule\r\n} from 'devextreme-angular';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\n\r\nimport { SafePipe } from '@app/core/pipes/safe.pipe';\r\nimport { SharedGetFilesComponent } from '@app/shared/components/get-files/shared-get-files.component';\r\nimport { SharedLogTableComponent } from '@app/shared/components/log-table/shared-log-table.component';\r\nimport { NgxLoadingModule } from 'ngx-loading';\r\nimport { ToastrModule } from 'ngx-toastr';\r\nimport { FilterPhotoReportComponent } from './components/filter-photo-report/filter-photo-report.component';\r\nimport { ConfirmDialogComponent } from './components/confirm-dialog/confirm-dialog.component';\r\nimport { ImageCropperComponentTR } from './components/image-cropper/image-cropper.component';\r\n\r\nimport { RouterModule } from '@angular/router';\r\nimport { PhonePipe } from '@app/core/pipes/phone.pipe';\r\nimport { FilenameCropDirective, GenComponentDirective } from '@app/core/directives';\r\nimport { WorkingDaysComponent } from './components/working-days/working-days.component';\r\nimport { ShortFioPipe } from '@app/core/pipes/short-fio.pipe';\r\nimport { SlimScrollDirective } from '@app/core/directives/slim-scroll.directive';\r\nimport { TimeTextPipe } from '@app/core/pipes/time-text.pipe';\r\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome';\r\nimport { IconazerComponent } from './components/iconazer/iconazer.component';\r\nimport { DropDownWithTagsComponent } from './components/drop-down-with-tags/drop-down-with-tags.component';\r\nimport { StoreDraggableComponent } from './components/store-draggable/store-draggable.component';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { RemoveCommaPipe } from '@app/core/pipes/remove-comma.pipe';\r\nimport { StringToDatePipe } from '@app/core/pipes/string-to-date.pipe';\r\nimport { SwitcherComponent } from './components/switcher/switcher.component';\r\nimport { DatePickerComponent } from './components/date-picker/date-picker.component';\r\nimport { DatePickerIntervalComponent } from './components/date-picker-interval/date-picker-interval.component';\r\nimport { PaginationComponent } from './components/pagination/pagination.component';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FontAwesomeModule,\r\n DxVectorMapModule,\r\n DxBarGaugeModule,\r\n DxListModule,\r\n DxDropDownBoxModule,\r\n DxAccordionModule,\r\n DxButtonModule,\r\n DxChartModule,\r\n DxTextBoxModule,\r\n DxTabPanelModule,\r\n DxPieChartModule,\r\n DxDataGridModule,\r\n DxPopupModule,\r\n DxTreeListModule,\r\n DxNumberBoxModule,\r\n DxFileUploaderModule,\r\n DxSelectBoxModule,\r\n DxDateBoxModule,\r\n DxCheckBoxModule,\r\n DxFormModule,\r\n DxTagBoxModule,\r\n DxLookupModule,\r\n DxLoadIndicatorModule,\r\n DxValidatorModule,\r\n DxValidationSummaryModule,\r\n DxValidationGroupModule,\r\n NgxLoadingModule,\r\n ToastrModule,\r\n DxTabsModule,\r\n DxLoadPanelModule,\r\n RouterModule,\r\n DxSwitchModule,\r\n DxCalendarModule,\r\n DxScrollViewModule,\r\n TranslateModule,\r\n DxSliderModule,\r\n DxDateRangeBoxModule,\r\n DxFormModule,\r\n \r\n ],\r\n exports: [\r\n CommonModule,\r\n FontAwesomeModule,\r\n DxVectorMapModule,\r\n DxBarGaugeModule,\r\n DxListModule,\r\n DxDropDownBoxModule,\r\n DxAccordionModule,\r\n DxButtonModule,\r\n DxChartModule,\r\n DxTextBoxModule,\r\n DxTabPanelModule,\r\n DxPieChartModule,\r\n DxDataGridModule,\r\n DxPopupModule,\r\n DxTreeListModule,\r\n DxNumberBoxModule,\r\n DxFileUploaderModule,\r\n SharedLogTableComponent,\r\n SharedGetFilesComponent,\r\n DxSelectBoxModule,\r\n DxDateBoxModule,\r\n DxCheckBoxModule,\r\n DxFormModule,\r\n DxLoadIndicatorModule,\r\n DxTagBoxModule,\r\n DxLookupModule,\r\n DxValidatorModule,\r\n DxValidationSummaryModule,\r\n DxValidationGroupModule,\r\n SafePipe,\r\n PhonePipe,\r\n RemoveCommaPipe,\r\n ShortFioPipe,\r\n TimeTextPipe,\r\n NgxLoadingModule,\r\n ToastrModule,\r\n DxTabsModule,\r\n DxLoadPanelModule,\r\n FilterPhotoReportComponent,\r\n DxSwitchModule,\r\n GenComponentDirective,\r\n SlimScrollDirective,\r\n WorkingDaysComponent,\r\n WorkingDaysComponent,\r\n DxCalendarModule,\r\n IconazerComponent,\r\n DropDownWithTagsComponent,\r\n StoreDraggableComponent,\r\n DxScrollViewModule,\r\n FilenameCropDirective,\r\n TranslateModule,\r\n DxSliderModule,\r\n StringToDatePipe,\r\n SwitcherComponent,\r\n DatePickerComponent,\r\n DatePickerIntervalComponent,\r\n DxDateRangeBoxModule,\r\n PaginationComponent,\r\n DxFormModule\r\n ],\r\n declarations: [\r\n SharedLogTableComponent,\r\n SharedGetFilesComponent,\r\n SafePipe,\r\n PhonePipe,\r\n StringToDatePipe,\r\n RemoveCommaPipe,\r\n ShortFioPipe,\r\n TimeTextPipe,\r\n FilterPhotoReportComponent,\r\n ConfirmDialogComponent,\r\n ImageCropperComponentTR,\r\n GenComponentDirective,\r\n SlimScrollDirective,\r\n WorkingDaysComponent,\r\n WorkingDaysComponent,\r\n IconazerComponent,\r\n DropDownWithTagsComponent,\r\n StoreDraggableComponent,\r\n FilenameCropDirective,\r\n SwitcherComponent,\r\n DatePickerComponent,\r\n DatePickerIntervalComponent,\r\n PaginationComponent,\r\n \r\n ]\r\n})\r\nexport class DxSharedModule {}\r\n","import env from './.env';\r\n\r\nexport const environment = {\r\n production: true,\r\n productionBD: true, // ДЛЯ ВЫПЛАТ\r\n version: env.npm_package_version,\r\n serverUrl: 'https://backend-3.tr-portal.ru/',\r\n envName: 'PROD'\r\n};\r\n","export default {\r\n npm_package_version: '3.23.7.3'\r\n};\r\n","import { animate, animateChild, group, query, style, transition, trigger } from '@angular/animations';\r\n\r\nexport const slideInAnimation = trigger('routeAnimations', [\r\n transition('* <=> *', [\r\n style({ position: 'relative' }),\r\n query(\r\n ':enter, :leave',\r\n [\r\n style({\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n width: '100%'\r\n })\r\n ],\r\n { optional: true }\r\n ),\r\n query(':enter', [style({ left: '-100%' })], { optional: true }),\r\n query(':leave', animateChild(), { optional: true }),\r\n group([\r\n query(':leave', [animate('300ms linear', style({ left: '100%' }))], { optional: true }),\r\n query(':enter', [animate('300ms linear', style({ left: '0%' }))], { optional: true })\r\n ]),\r\n query(':enter', animateChild(), { optional: true })\r\n ])\r\n]);\r\n","export const whitelistedDomains = [\r\n \"backend-3.tr-portal.ru\",\r\n \"develop-backend.tr-portal.ru\",\r\n \"develop-backend2.tr-portal.ru\",\r\n \"stepan-backend.tr-portal.ru\",\r\n 'test.tr-portal.ru',\r\n \"test-backend-3.tr-portal.ru\",\r\n \"192.168.201.124:8080\", // Андрей\r\n \"192.168.201.167:8080\", // Андрей О.\r\n \"192.168.204.201:8080\", // 1й тестовый\r\n \"192.168.204.201:8081\", // 2й тестовый\r\n \"192.168.204.211:8080\", // 3й тестовый\r\n \"192.168.204.211:8081\",\r\n \"192.168.204.144:8080\",\r\n \"localhost:8080\",\r\n \"192.168.204.144:81\",\r\n \"192.168.150.103:8080\",\r\n \"trback.btlsrv.ru\",\r\n \"mobile.tr-portal.ru\"\r\n];\r\n","
    \r\n
    \r\n \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n \"TRportal\"\r\n \r\n
    \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n
    \r\n","import { Component, EventEmitter, OnInit, Output } from '@angular/core';\r\nimport { UserModel } from '@app/core/model';\r\nimport { UserService } from '@app/core/services';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { pipe, Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-header',\r\n templateUrl: './header.component.html',\r\n styleUrls: ['./header.component.scss']\r\n})\r\nexport class HeaderComponent implements OnInit {\r\n @Output() changeMenuSizeClass = new EventEmitter();\r\n\r\n public user: UserModel;\r\n\r\n public menuSizeClass = localStorage.getItem('menuSizeClass') || 'big';\r\n\r\n constructor(private userService: UserService, private translate: TranslateService) {\r\n this.userService.getUserStream().subscribe(data => (this.user = data));\r\n }\r\n\r\n ngOnInit() {}\r\n\r\n onChangeMenuSizeClass(menuSizeClass: string): void {\r\n this.menuSizeClass = menuSizeClass === 'small' ? 'big' : 'small';\r\n localStorage.setItem('menuSizeClass', this.menuSizeClass);\r\n this.changeMenuSizeClass.emit(this.menuSizeClass);\r\n }\r\n}\r\n","\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { HttpService, PermissionsService, ProjectService } from '@app/core/services';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { Router } from '@angular/router';\r\nimport { animate, group, query, state, style, transition, trigger } from '@angular/animations';\r\nimport { LocalStorageService } from 'ngx-webstorage';\r\nimport { isArray } from 'lodash-es';\r\n\r\n@Component({\r\n selector: 'app-nav',\r\n templateUrl: './nav.component.html',\r\n styleUrls: ['./nav.component.scss'],\r\n animations: [\r\n trigger('animationForm', [\r\n state(\r\n 'small',\r\n style({\r\n width: '45px'\r\n })\r\n ),\r\n state(\r\n 'big',\r\n style({\r\n width: '225px'\r\n })\r\n ),\r\n\r\n transition('small => big', [\r\n group([\r\n query('.title, .icon-expand', style({ opacity: 0 })),\r\n query('.title, .icon-expand', [animate('0.1s', style({ opacity: 1 }))], { optional: true }),\r\n animate('0.23s')\r\n ])\r\n ]),\r\n\r\n transition('big => small', [\r\n group([\r\n query('.title, .icon-expand', style({ opacity: 1 })),\r\n query('.title, .icon-expand', [animate('.1s', style({ opacity: 0 }))], { optional: true }),\r\n animate('.23s')\r\n ])\r\n ])\r\n ])\r\n\r\n // transition('closedSecondForm => openedSecondForm, closedFirstForm => openedFirstForm', [\r\n // animate('0.3s 0.2s')\r\n // ]),\r\n\r\n // trigger('animationFormTitle', [\r\n // state('small', style({\r\n // opacity: 0,\r\n // })),\r\n // state('big', style({\r\n // opacity: 1,\r\n // })),\r\n // transition('small <=> big', [\r\n // animate('1.2s')\r\n // ]),\r\n // // transition('closedSecondForm => openedSecondForm, closedFirstForm => openedFirstForm', [\r\n // // animate('0.3s 0.2s')\r\n // // ]),\r\n // ])\r\n ]\r\n})\r\nexport class NavComponent implements OnInit {\r\n @Input() sizeMenuClass: string;\r\n\r\n public menu: any;\r\n\r\n constructor(\r\n private httpService: HttpService,\r\n private projectService: ProjectService,\r\n public ps: PermissionsService,\r\n private translate: TranslateService,\r\n private router: Router,\r\n private storage:LocalStorageService\r\n ) {\r\n this.menu = [\r\n {\r\n header: 'layouts.navigation.HOME',\r\n visible: true,\r\n icon: ['fas', 'home'],\r\n url: ['/', 'home']\r\n },\r\n {\r\n header: 'layouts.navigation.EMPLOYEES',\r\n visible: 'TAB_EMPLOYEES_DISPLAY',\r\n icon: ['fas', 'user-friends'],\r\n url: ['/', 'employees', 'users'],\r\n expanded: false\r\n },\r\n {\r\n header: 'layouts.navigation.STATUS_MCH',\r\n visible: 'TAB_STATUS-MERCH_DISPLAY',//\r\n icon: ['far', 'calendar'],\r\n url: ['/', 'status-mch'],\r\n expanded: false\r\n }, {\r\n header: 'layouts.navigation.POSM',\r\n visible: 'TAB_POSM_DISPLAY',\r\n icon: ['far', 'calendar'],\r\n url: ['/', 'posm'],\r\n expanded: false,\r\n children: [\r\n {\r\n header: 'layouts.navigation.LIBERY',\r\n visible: 'TAB_POSM_LIBRARY_DISPLAY',\r\n url: ['/', 'posm', 'libery']\r\n },\r\n {\r\n header: 'layouts.navigation.LOADPOSM',\r\n visible: 'BUTTON_POSM_CREATE_DISPLAY',\r\n url: ['/', 'posm', 'load']\r\n },\r\n {\r\n header: 'layouts.navigation.LOADORDER',\r\n visible: 'TAB_ORDER_CREATE_DISPLAY',\r\n url: ['/', 'posm', 'load-order']\r\n },\r\n {\r\n header: 'layouts.navigation.ORDERS',\r\n visible: 'TAB_ORDER_DISPLAY',\r\n url: ['/', 'posm', 'orders']\r\n },\r\n {\r\n header: 'layouts.navigation.LOADADRESS',\r\n visible: 'TAB_POSM_GETFILES_DISPLAY',\r\n url: ['/', 'posm', 'load-adress']\r\n },\r\n {\r\n header: 'layouts.navigation.DELIVERIES',\r\n visible: 'TAB_DELIVERY_DISPLAY',\r\n url: ['/', 'posm', 'deliveries']\r\n },\r\n ]\r\n },\r\n {\r\n header: 'layouts.navigation.LOGISTIC',\r\n visible: 'TAB_LOGISTIC_DISPLAY',\r\n icon: ['fas', 'map-marker-alt'],\r\n url: ['/', 'logistic', 'merchandisers'],\r\n expanded: false\r\n },\r\n {\r\n header: 'layouts.navigation.ROUTES',\r\n visible: 'TAB_ROUTES_DISPLAY',\r\n icon: ['fas', 'route'],\r\n url: ['/', 'routes'],\r\n expanded: false,\r\n children: [\r\n {\r\n header: 'layouts.navigation.ROUTES_ROUTE-PLAN',\r\n visible: 'TAB_ROUTES_ROUTE-PLAN_DISPLAY',\r\n url: ['/', 'routes', 'route-plans']\r\n },\r\n {\r\n header: 'layouts.navigation.ROUTES_LOAD-FILES',\r\n visible: 'TAB_ROUTES_LOAD-FILES_DISPLAY',\r\n url: ['/', 'routes', 'load-files']\r\n }\r\n ]\r\n }, {\r\n header: 'layouts.navigation.MATRIX',\r\n visible: 'TAB_CL_STORES_DISPLAY',\r\n icon: ['fas', 'square'],\r\n url: ['/', 'matrix'],\r\n expanded: false,\r\n children: [\r\n {\r\n header: 'layouts.navigation.MATRIX_STORES',\r\n visible: 'TAB_CL_STORES_DISPLAY',\r\n url: ['/', 'matrix', 'stores']\r\n },\r\n {\r\n header: 'layouts.navigation.MATRIX_LOADER',\r\n visible: 'TAB_CL_GETFILES_DISPLAY',\r\n url: ['/', 'matrix', 'loader']\r\n },\r\n {\r\n header: 'layouts.navigation.MATRIX_CONTRACT-LIST',\r\n visible: 'TAB_CL_FORMATS_DISPLAY',\r\n url: ['/', 'matrix', 'contract-list']\r\n },\r\n {\r\n header: 'layouts.navigation.MATRIX_FORMATS',\r\n visible: 'TAB_CL_FORMATS_DISPLAY',\r\n url: ['/', 'matrix', 'formats']\r\n }\r\n ]\r\n },\r\n {\r\n header: 'layouts.navigation.BI_REPORTS',\r\n visible: false,\r\n icon: ['fas', 'chart-pie'],\r\n url: ['/', 'bi-reports']\r\n },\r\n {\r\n header: 'layouts.navigation.STORES',\r\n visible: 'TAB_STORES_DISPLAY',\r\n icon: ['fas', 'store-alt'],\r\n url: ['/', 'stores']\r\n },\r\n {\r\n header: 'layouts.navigation.REPORTS',\r\n visible: 'TAB_REPORTS_DISPLAY',\r\n icon: ['fas', 'chart-pie'],\r\n url: ['/', 'reports'],\r\n expanded: false,\r\n children: [\r\n {\r\n header: 'layouts.navigation.REPORTS_PHOTO',\r\n visible: 'TAB_REPORTS_PHOTO_DISPLAY',\r\n url: ['/', 'reports', 'photo']\r\n },\r\n {\r\n header: 'layouts.navigation.REPORTS_SERVICE',\r\n visible: 'TAB_REPORTS_SERVICE_DISPLAY',\r\n url: ['/', 'reports', 'service']\r\n },\r\n {\r\n header: 'layouts.navigation.REPORTS_EXCEL',\r\n visible: 'TAB_REPORTS_EXCEL_DISPLAY',\r\n url: ['/', 'reports', 'excel']\r\n },\r\n {\r\n header: 'layouts.navigation.ORDER',\r\n visible: 'TAB_REPORTS_EXCEL_DISPLAY',\r\n url: ['/', 'reports', 'order']\r\n }\r\n ]\r\n },\r\n {\r\n header: 'layouts.navigation.CROWDSOUNCING',\r\n visible: 'TAB_CROWDSOUNCING_DISPLAY',\r\n icon: ['fas', 'info-circle'],\r\n url: ['/', 'crowdsourcing'],\r\n expanded: false,\r\n children: [\r\n {\r\n header: 'layouts.navigation.LOTS',\r\n visible: 'TAB_REPORTS_CROWDSOUNCING_LOTS_DISPLAY',\r\n url: ['/', 'crowdsourcing', 'lots']\r\n },\r\n {\r\n header: 'layouts.navigation.EMPLOYEERS',\r\n visible: 'TAB_CROWDSOUNCING_EMPLOYEERS_DISPLAY',\r\n url: ['/', 'crowdsourcing', 'employeers']\r\n },\r\n {\r\n header: 'layouts.navigation.DOCUMENTS',\r\n visible: 'TAB_CROWDSOUNCING_EMPLOYEERS_DISPLAY',\r\n url: ['/', 'crowdsourcing', 'documents']\r\n },\r\n {\r\n header: 'layouts.navigation.PAYMENTS',\r\n visible: 'TAB_CROWDSOUNCING_PAYMENTS_DISPLAY',\r\n url: ['/', 'crowdsourcing', 'payments']\r\n },\r\n {\r\n header: 'layouts.navigation.PAYMENTS_CREATE',\r\n visible: 'TAB_CROWDSOUNCING_PAYMENTS_CREATE_DISPLAY',\r\n url: ['/', 'crowdsourcing', 'payments', 'create']\r\n }\r\n ]\r\n },\r\n {\r\n header: 'layouts.navigation.CONSTRUCTOR_PLANOGRAMM',\r\n visible: false,\r\n icon: ['fas', 'puzzle-piece'],\r\n url: ['/', 'constructor']\r\n },\r\n {\r\n header: 'layouts.navigation.VISITS',\r\n visible: 'TAB_VISITS_DISPLAY',\r\n icon: ['fas', 'check-double'],\r\n url: ['/', 'visits']\r\n },\r\n {\r\n header: 'layouts.navigation.MASS_VISITS',\r\n visible: 'TAB_MASSIVE_CHANGES_DISPLAY',\r\n icon: ['fas', 'upload'],\r\n url: ['/', 'mass-visits']\r\n },\r\n {\r\n header: 'layouts.navigation.ADMINISTRATIONS',\r\n visible: 'TAB_ADMINISTRATIONS_DISPLAY',\r\n icon: ['fas', 'user-secret'],\r\n url: ['/', 'administration'],\r\n expanded: false,\r\n children: [\r\n {\r\n header: 'layouts.navigation.GET_FILES',\r\n visible: true,\r\n url: ['/', 'administration', 'get-files']\r\n },\r\n {\r\n header: 'layouts.navigation.PROJECTS',\r\n visible: true,\r\n url: ['/', 'administration', 'projects']\r\n },\r\n {\r\n header: 'layouts.navigation.APPLICATIONS',\r\n visible: true,\r\n url: ['/', 'administration', 'applications']\r\n },\r\n {\r\n header: 'layouts.navigation.STATUS',\r\n visible: true,\r\n url: ['/', 'administration', 'status']\r\n },\r\n {\r\n header: 'layouts.navigation.SMS',\r\n visible: true,\r\n url: ['/', 'administration', 'sms']\r\n }\r\n ]\r\n },\r\n {\r\n header: 'layouts.navigation.CAP',\r\n visible: 'TAB_CAP_DISPLAY',\r\n icon: ['fas', 'copyright'],\r\n url: ['/', 'other', 'cap']\r\n },\r\n {\r\n header: 'layouts.navigation.PROMO',\r\n visible: ['TAB_OREH-PROMO_DISPLAY', 'TAB_DONON-PROMO_DISPLAY'],\r\n icon: ['far', 'check-circle'],\r\n url: ['/', 'other', 'promo']\r\n },\r\n {\r\n header: 'layouts.navigation.REQUEST',\r\n visible: 'TAB_TASKS_DISPLAY',\r\n icon: ['fas', 'tasks'],\r\n url: ['/', 'other', 'request']\r\n },\r\n {\r\n header: 'layouts.navigation.FILEHOSTING',\r\n visible: 'TAB_FILEHOSTING_DISPLAY',\r\n icon: ['fas', 'folder-open'],\r\n url: ['/', 'filehosting']\r\n }\r\n ];\r\n }\r\n // орех - 1 донон -2\r\n\r\n ngOnInit() {}\r\n\r\n getVisibleMenu(array) {\r\n return array.filter(el => this.has(el.visible) === true);\r\n }\r\n\r\n expand(m, event) {\r\n m.expanded = !m.expanded;\r\n }\r\n\r\n logout() {\r\n this.storage.clear('access_token');\r\n //localStorage.clear();\r\n this.router.navigate(['/auth/login']);\r\n }\r\n\r\n has(permission:string | string[]| boolean){\r\n if( typeof(permission) == 'boolean') return permission\r\n if (isArray(permission) )return permission.some((p)=> {return this.ps.has(p)})\r\n return this.ps.hasNav(permission)\r\n }\r\n}\r\n","
    \r\n
    \r\n \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n
    \r\n\r\n
    \r\n \r\n \r\n {{ breadcrumb | translate }}\r\n \r\n \r\n\r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n {{ 'home.FOOTER' | translate }} v{{ version }} \r\n
    \r\n
    \r\n\r\n\r\n\r\n
    \r\n
    \r\n Для продолжения работы необходимо указать персональные данные!\r\n
    \r\n
    \r\n
    \r\n
    Фамилия*
    \r\n
    \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n
    Имя*
    \r\n
    \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n
    Отчество*
    \r\n
    \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n
    e-mail
    \r\n
    \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n
    Телефон*
    \r\n
    \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Я даю согласие на обработку персональных данных.\r\n
    \r\n \r\n
    \r\n \r\n
    \r\n \r\n Сохранить\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n","import {\r\n Component,\r\n OnInit,\r\n ViewChild,\r\n ChangeDetectorRef,\r\n OnDestroy,\r\n} from \"@angular/core\";\r\nimport { Route, Router, RouterOutlet } from \"@angular/router\";\r\nimport { slideInAnimation } from \"@app/core/const\";\r\nimport { HttpService, PermissionsService, ProjectService, UserService } from \"@app/core/services\";\r\nimport { TranslateService } from \"@ngx-translate/core\";\r\nimport { environment } from \"@env/environment\";\r\n\r\nimport { BreadcrumbModule } from \"params-xng-breadcrumb\";\r\nimport { HttpResponse } from \"@angular/common/http\";\r\nimport { takeUntil } from \"rxjs/operators\";\r\nimport { Subject } from \"rxjs\";\r\nimport { ToastrService } from \"ngx-toastr\";\r\n\r\n// import * as ruMessages from 'devextreme/localization/messages/ru.json';\r\n\r\n@Component({\r\n selector: \"app-body\",\r\n templateUrl: \"./body.component.html\",\r\n styleUrls: [\"./body.component.scss\"],\r\n animations: [slideInAnimation],\r\n})\r\nexport class BodyComponent implements OnInit, OnDestroy {\r\n public version = environment.version;\r\n public menuSizeClass = localStorage.getItem(\"menuSizeClass\") || \"big\";\r\n\r\n // rus = ruMessages;\r\n isRequiredPersonalDataOpen: boolean = false;\r\n loginLoading: boolean = false;\r\n privacy: any = {\r\n lastName: null,\r\n middleName: null,\r\n firstName: null,\r\n email: null,\r\n phone: null,\r\n privacyOk: false\r\n };\r\n\r\n constructor(\r\n private httpService: HttpService,\r\n private projectService: ProjectService,\r\n private userService: UserService,\r\n private translate: TranslateService,\r\n private ref: ChangeDetectorRef,\r\n private translateService: TranslateService,\r\n private toastr: ToastrService,\r\n private router : Router\r\n\r\n ) // private breadcrumbService :BreadcrumbService\r\n\r\n {\r\n translate.setDefaultLang(\"ru\");\r\n // loadMessages(this.rus);\r\n // locale('ru');\r\n }\r\n\r\n ngOnInit() {\r\n this.userService.isRequiredPersonalDataOpen.subscribe((b) => {\r\n this.isRequiredPersonalDataOpen = b\r\n if(b) {\r\n console.log('ngOnInit body',this.router.url)\r\n if(this.router.url !='/home') this.router.navigate(['/home'])\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n\r\n onChangeMenuSizeClass(e: string) {\r\n this.menuSizeClass = e;\r\n this.ref.detectChanges();\r\n }\r\n\r\n prepareRoute(outlet: RouterOutlet) {\r\n return (\r\n outlet &&\r\n outlet.activatedRouteData &&\r\n outlet.activatedRouteData[\"animation\"]\r\n );\r\n }\r\n\r\n get contentClass() {\r\n let mainMenu = document.getElementById(\"mainMenu\");\r\n return {\r\n big: mainMenu.classList.contains(\"big\"),\r\n small: mainMenu.classList.contains(\"small\"),\r\n };\r\n }\r\n private ngUnsubscribe = new Subject();\r\n\r\n checkComparison = () => true;\r\n\r\n\r\n onSavePrivasy() {\r\n\r\n let body = {\r\n lastName: this.privacy.lastName,\r\n firstName: this.privacy.firstName,\r\n middleName: this.privacy.middleName,\r\n email: this.privacy.email,\r\n phoneNumber: this.privacy.phone,\r\n };\r\n this.httpService\r\n .postResponse(\"employee-service/api/employee/short\", body)\r\n .subscribe(\r\n (response: HttpResponse) => {\r\n if (response.ok) {\r\n this.translateService\r\n .get(\"notification.SUCCESS\")\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .toPromise()\r\n .then((v) => {\r\n this.toastr.success(v, \"\", { timeOut: 2000 });\r\n });\r\n }\r\n // this.isRequiredPersonalDataOpen = false;\r\n this.userService.isRequiredPersonalData.next(false)\r\n this.userService.isRequiredPersonalDataOpen.next(false)\r\n },\r\n (error: any) => {\r\n // this.dataGrids.instance.clearSelection();\r\n // Получаем перевод ошибки при отправке и показываем тостер\r\n this.translateService\r\n .get([\"notification.FAILURE\", \"notification.ERROR_CODE\"], {\r\n value: error.status,\r\n })\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .toPromise()\r\n .then((v) => {\r\n this.toastr.error(\r\n error.error.message,\r\n v[\"notification.ERROR_CODE\"],\r\n {\r\n progressBar: false,\r\n timeOut: 100000,\r\n closeButton: true,\r\n }\r\n );\r\n });\r\n }\r\n );\r\n }\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-auth-layout',\r\n templateUrl: './auth-layout.component.html',\r\n styleUrls: ['./auth-layout.component.scss']\r\n})\r\nexport class AuthLayoutComponent implements OnInit {\r\n constructor() {}\r\n\r\n ngOnInit() {}\r\n}\r\n","
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n\r\n","import { Routes } from '@angular/router';\r\nimport { CanActivateTeam } from '@app/core/guards';\r\n\r\nexport const CONTENT_ROUTES: Routes = [\r\n {\r\n path: 'home',\r\n loadChildren: () => import('@app/modules/home/home.module').then(m => m.HomeModule),\r\n data: {\r\n breadcrumb: {\r\n skip: true\r\n }\r\n }\r\n },\r\n {\r\n path: 'routes',\r\n loadChildren: () => import('@app/modules/routes/routes.module').then(m => m.RoutesModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n permission: 'TAB_ROUTES_DISPLAY',\r\n breadcrumb: {\r\n skip: true\r\n }\r\n }\r\n },\r\n {\r\n path: 'logistic',\r\n loadChildren: () => import('@app/modules/logistic/logistic.module').then(m => m.LogisticModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n permission: 'TAB_LOGISTIC_DISPLAY',\r\n breadcrumb: {\r\n skip: true\r\n }\r\n }\r\n },\r\n {\r\n path: 'matrix',\r\n loadChildren: () => import('@app/modules/matrix/matrix.module').then(m => m.MatrixModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n permission: 'TAB_CL_DISPLAY',\r\n breadcrumb: {\r\n label: 'breadcrumbs.matrix.MATRIX'\r\n }\r\n }\r\n },\r\n {\r\n path: 'employees',\r\n loadChildren: () => import('@app/modules/employees/employees.module').then(m => m.EmployeesModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n permission: 'TAB_EMPLOYEES_DISPLAY',\r\n breadcrumb: {\r\n label: 'breadcrumbs.employees.EMPLOYEES'\r\n }\r\n }\r\n },\r\n {\r\n path: 'status-mch',\r\n loadChildren: () => import('@app/modules/status-mch/status-mch.module').then(m => m.StatusMchModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n permission: 'TAB_STATUS-MERCH_DISPLAY',\r\n breadcrumb: {\r\n label: 'breadcrumbs.status-mch.STATUS_MCH'\r\n }\r\n }\r\n },\r\n {\r\n path: 'constructor',\r\n loadChildren: () => import('@app/modules/constructor-planogramm/constructor-planogramm.module').then(m => m.ConstructorPlanogrammModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n breadcrumb: {\r\n skip: true\r\n },\r\n permission: '-'\r\n }\r\n },\r\n {\r\n path: 'stores',\r\n loadChildren: () => import('@app/modules/stores/stores.module').then(m => m.StoresModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n permission: 'TAB_STORES_DISPLAY'\r\n }\r\n },\r\n {\r\n path: 'bi-reports',\r\n loadChildren: () => import('@app/modules/bi-reports/bi-reports.module').then(m => m.BiReportsModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n permission: '-',\r\n breadcrumb: {\r\n skip: true\r\n }\r\n }\r\n },\r\n {\r\n path: 'reports',\r\n loadChildren: () => import('@app/modules/reports/reports.module').then(m => m.ReportsModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n permission: 'TAB_REPORTS_DISPLAY',\r\n breadcrumb: {\r\n skip: true\r\n }\r\n }\r\n },\r\n {\r\n path: 'visits',\r\n loadChildren: () => import('@app/modules/visits/visits.module').then(m => m.VisitsModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n permission: 'TAB_VISITS_DISPLAY',\r\n breadcrumb: {\r\n label: 'breadcrumbs.visits.VISITS'\r\n }\r\n }\r\n },\r\n {\r\n path: 'mass-visits',\r\n loadChildren: () => import('@app/modules/mass-vissit/mass-vissit.module').then(m => m.MassVissitModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n permission: 'TAB_MASSIVE_CHANGES_DISPLAY',\r\n breadcrumb: {\r\n label: 'breadcrumbs.mass-visits.MASSVISITS'\r\n }\r\n }\r\n },\r\n {\r\n path: 'crowdsourcing',\r\n loadChildren: () => import('@app/modules/crowdsourcing/crowdsourcing.module').then(m => m.CrowdsourcingModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n permission: 'TAB_CROWDSOUNCING_DISPLAY',\r\n breadcrumb: {\r\n label: 'breadcrumbs.crowdsourcing.CROWDSOUNCING'\r\n }\r\n }\r\n },\r\n {\r\n path: 'administration',\r\n loadChildren: () => import('@app/modules/admin/admin.module').then(m => m.AdminModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n breadcrumb: {\r\n label: 'breadcrumbs.administrations.ADMINISTRATIONS'\r\n },\r\n permission: 'TAB_ADMINISTRATIONS_DISPLAY'\r\n }\r\n },\r\n {\r\n path: 'other',\r\n loadChildren: () => import('@app/modules/other/other.module').then(m => m.OtherModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n breadcrumb: {\r\n skip: true\r\n }\r\n }\r\n },\r\n {\r\n path: 'filehosting',\r\n loadChildren: () => import('@app/modules/filehosting/filehosting.module').then(m => m.FilehostingModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n breadcrumb: {\r\n skip: true\r\n },\r\n permission: 'TAB_FILEHOSTING_DISPLAY'\r\n }\r\n },\r\n {\r\n path: 'settings',\r\n loadChildren: () => import('@app/modules/settings/settings.module').then(m => m.SettingsModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n breadcrumb: {\r\n skip: true\r\n }\r\n }\r\n }, {\r\n path: 'posm',\r\n loadChildren: () => import('@app/modules/posm/posm.module').then(m => m.PosmModule),\r\n resolve: { user: CanActivateTeam },\r\n data: {\r\n breadcrumb: {\r\n // label: 'breadcrumbs.administrations.ADMINISTRATIONS'\r\n },\r\n permission: 'TAB_POSM_DISPLAY'\r\n }\r\n },\r\n];\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router';\r\nimport { Observable, of } from 'rxjs';\r\nimport { HttpService, UserService } from '@app/core/services';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { catchError, tap } from 'rxjs/operators';\r\nimport { UserModel } from '@app/core/model';\r\nimport { locale } from 'devextreme/localization';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { LocalStorageService } from 'ngx-webstorage';\r\nimport { ToastrService } from 'ngx-toastr';\r\n\r\n@Injectable()\r\nexport class UserResolver {\r\n constructor(\r\n private httpService: HttpService,\r\n private jwt: JwtHelperService,\r\n private userService: UserService,\r\n private translate: TranslateService,\r\n private toastrService: ToastrService\r\n\r\n ) {}\r\n\r\n resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable {\r\n return this.httpService.get('user-service/api/users/me').pipe(\r\n tap((user: UserModel) => {\r\n this.userService.setUser(user);\r\n // console.log('users/me')\r\n\r\n // if(true) {\r\n let self = this\r\n setTimeout(()=>{\r\n // console.log('self.userService.isRequiredPersonalData')\r\n self.userService.isRequiredPersonalData.next(user.isRequiredPersonalData)\r\n self.userService.isRequiredPersonalDataOpen.next(user.isRequiredPersonalData)\r\n }) \r\n\r\n\r\n // Определяем язык пользователя и устанавливаем его для сайта и компонентов.\r\n const lang = user.languageKey || 'ru';\r\n this.translate.use(lang);\r\n locale(lang);\r\n }),\r\n catchError(error => {\r\n if(error.status=403) {\r\n this.toastrService.error(\"Ошибка: 403\", \"Ошибка\");\r\n this.userService.logout();\r\n }\r\n let user = new UserModel();\r\n this.userService.setUser(user);\r\n return of(user);\r\n })\r\n );\r\n }\r\n\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { PreloadAllModules, RouterModule, Routes } from '@angular/router';\r\nimport { BodyComponent } from '@app/layouts/body/body.component';\r\nimport { AuthLayoutComponent } from '@app/layouts/auth-layout/auth-layout.component';\r\nimport { NoAuthGuard } from '@app/core/guards/no-auth.guard';\r\nimport { AuthGuard } from '@app/core/guards/auth.guard';\r\nimport { CONTENT_ROUTES } from '@app/shared/routes/pages.routes';\r\nimport { UserResolver } from '@app/core/guards/user.resolver';\r\nimport { PermissionsResolver } from '@app/core/guards';\r\n\r\nconst routes: Routes = [\r\n {\r\n path: '',\r\n redirectTo: '/auth/login',\r\n pathMatch: 'full',\r\n data: {\r\n breadcrumb: 'breadcrumbs.home.HOME'\r\n }\r\n },\r\n {\r\n path: '',\r\n component: BodyComponent,\r\n canActivate: [NoAuthGuard],\r\n resolve: { user: UserResolver, permissions: PermissionsResolver },\r\n children: CONTENT_ROUTES\r\n },\r\n {\r\n path: 'auth',\r\n component: AuthLayoutComponent,\r\n canActivate: [AuthGuard],\r\n loadChildren: () => import('@app/modules/auth/auth.module').then(m => m.AuthModule)\r\n },\r\n\r\n // Fallback when no prior routes is matched\r\n { path: '**', redirectTo: '/auth/login', pathMatch: 'full' }\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })],\r\n exports: [RouterModule],\r\n providers: []\r\n})\r\nexport class AppRoutingModule {}\r\n","import { Component } from '@angular/core';\r\nimport { Location } from '@angular/common';\r\nimport { Title } from '@angular/platform-browser';\r\nimport { Metrika } from 'ng-yandex-metrika';\r\nimport { NavigationEnd, Router } from '@angular/router';\r\nimport { filter, first } from 'rxjs/operators';\r\nimport { HttpService, UserService } from '@app/core/services';\r\nimport { environment } from '@env/environment';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { ReportNotificationService } from './core/services/report-notification.service';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { PhotoReportNotificationService } from './core/services/photo-report-notification.service';\r\n\r\n@Component({\r\n selector: 'app-root',\r\n templateUrl: './app.component.html',\r\n styleUrls: ['./app.component.css']\r\n})\r\nexport class AppComponent {\r\n public version = environment.version;\r\n\r\n constructor(\r\n private titleService: Title,\r\n private metrika: Metrika,\r\n private router: Router,\r\n private location: Location,\r\n private userService: UserService,\r\n private httpService: HttpService,\r\n private toastr: ToastrService,\r\n private reportNotificationService: ReportNotificationService,\r\n private photoReportNotificationService: PhotoReportNotificationService,\r\n private translate: TranslateService,\r\n ) {\r\n console.log(\"AppComponent\")\r\n translate.setDefaultLang('ru');\r\n titleService.setTitle('TR Portal');\r\n // translate.setDefaultLang('ru');\r\n let prevPath = this.location.path();\r\n this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(() => {\r\n const newPath = this.location.path();\r\n\r\n this.metrika.hit(newPath, {\r\n referer: prevPath,\r\n params: {\r\n userId: this.userService.getUser() ? this.userService.getUser()['id'] : null,\r\n login: this.userService.getUser() ? this.userService.getUser()['login'] : 'anonimus'\r\n }\r\n });\r\n // toastr.success(\"test ссылка \",\"\",{enableHtml:true})\r\n prevPath = newPath;\r\n });\r\n reportNotificationService.initialization()\r\n photoReportNotificationService.initialization()\r\n }\r\n}\r\n\r\n","\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Injectable()\r\nexport class TokenInterceptor implements HttpInterceptor {\r\n constructor() {}\r\n\r\n intercept(request: HttpRequest, next: HttpHandler): Observable> {\r\n // request = request.clone({\r\n // setHeaders: {\r\n // Authorization: `Bearer ${this.auth.getToken()}`\r\n // }\r\n // });\r\n return next.handle(request);\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\r\nimport { TokenInterceptor } from './interceptors';\r\nimport { AuthGuard, CanActivateTeam, NoAuthGuard } from '@app/core/guards';\r\n\r\n@NgModule({ declarations: [], imports: [], providers: [\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: TokenInterceptor,\r\n multi: true\r\n },\r\n AuthGuard,\r\n NoAuthGuard,\r\n CanActivateTeam,\r\n provideHttpClient(withInterceptorsFromDi())\r\n ] })\r\nexport class CoreModule {\r\n constructor() {}\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { YamapngComponent } from './yamapng.component';\r\n\r\n@NgModule({\r\n declarations: [YamapngComponent],\r\n imports: [],\r\n exports: [YamapngComponent]\r\n})\r\nexport class YamapngModule {\r\n}\r\n","import { BrowserModule } from '@angular/platform-browser';\r\nimport { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\r\nimport { LOCALE_ID } from '@angular/core';\r\nimport { HeaderComponent } from '@app/layouts/header/header.component';\r\nimport { BodyComponent } from '@app/layouts/body/body.component';\r\nimport { AppRoutingModule } from '@app/app-routing.module';\r\nimport { AuthLayoutComponent } from '@app/layouts/auth-layout/auth-layout.component';\r\nimport { AppComponent } from '@app/app.component';\r\nimport { NavComponent } from '@app/layouts/nav/nav.component';\r\nimport { DragulaModule } from 'ng2-dragula';\r\nimport { CoreModule } from '@app/core/core.module';\r\nimport { DxSharedModule } from '@app/shared/dx-shared.module';\r\nimport { ngxLoadingAnimationTypes, NgxLoadingModule } from 'ngx-loading';\r\nimport { TranslateLoader, TranslateModule } from '@ngx-translate/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { TranslateHttpLoader } from '@ngx-translate/http-loader';\r\nimport { JwtModule } from '@auth0/angular-jwt';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { FaIconLibrary } from '@fortawesome/angular-fontawesome';\r\nimport { MetrikaModule } from 'ng-yandex-metrika';\r\nimport { environment } from '@env/environment';\r\nimport 'hammerjs';\r\nimport 'mousetrap';\r\n\r\nconst ruMessages = require('devextreme/localization/messages/ru.json');\r\n// Set locale according the browser language\r\nimport { locale, loadMessages } from \"devextreme/localization\";\r\nimport './core/services/declarations.service';\r\nimport { ToastrModule } from 'ngx-toastr';\r\nimport {BreadcrumbService } from 'xng-breadcrumb';\r\nimport {BreadcrumbModule } from 'params-xng-breadcrumb';\r\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome';\r\n// import { BrowserTransferStateModule } from '@angular/platform-browser';\r\n\r\n\r\nimport { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';\r\nimport { UserResolver } from '@app/core/guards/user.resolver';\r\nimport {\r\n faAlignJustify,\r\n \r\n faAngleDoubleDown,\r\n faAngleDoubleLeft,\r\n faAngleDoubleRight,\r\n faAngleDoubleUp,\r\n faAngleDown,\r\n faAngleLeft,\r\n faAngleRight,\r\n faAngleUp,\r\n faArrowDown,\r\n faArrowRight,\r\n faArrowUp,\r\n faBars,\r\n faBomb,\r\n faBook,\r\n faBus,\r\n faCar,\r\n faCaretDown,\r\n faCaretUp,\r\n faCarSide,\r\n faChartBar,\r\n faChartLine,\r\n faChartPie,\r\n faCheck,\r\n faCheckDouble,\r\n faCheckCircle,\r\n faChevronDown,\r\n faChevronLeft,\r\n faChevronRight,\r\n faChevronUp,\r\n faCircle,\r\n faCloudDownloadAlt,\r\n faCloudUploadAlt,\r\n faCog,\r\n faCoins,\r\n faCopyright,\r\n faPlusSquare,\r\n faMinusCircle,\r\n // faCalendar,\r\n faCalendarDay,\r\n faCross,\r\n faDoorOpen,\r\n faDownload,\r\n faDraftingCompass,\r\n faDrawPolygon,\r\n faEdit,\r\n faEraser,\r\n faExchangeAlt,\r\n faExclamationTriangle,\r\n faExternalLinkAlt,\r\n faFile,\r\n faFileCsv,\r\n faFileDownload,\r\n faFilter,\r\n faFolderOpen,\r\n faGlobe,\r\n faGlobeAmericas,\r\n faGripVertical,\r\n faHome,\r\n faHourglassStart,\r\n faImage,\r\n faImages,\r\n faInfo,\r\n faInfoCircle,\r\n faKey,\r\n faLanguage,\r\n faLightbulb,\r\n faLongArrowAltRight,\r\n faDotCircle,\r\n faMagic,\r\n faMapMarkerAlt,\r\n faMinus,\r\n faPaintBrush,\r\n faPencilAlt,\r\n faPlayCircle,\r\n faPlus,\r\n faPuzzlePiece,\r\n faReceipt,\r\n faRedo,\r\n faRoute,\r\n faSave,\r\n faSpinner,\r\n faSquare,\r\n faStoreAlt,\r\n faStream,\r\n faSyncAlt,\r\n faTasks,\r\n faThList,\r\n faTimes,\r\n faTrash,\r\n faUndo,\r\n faUser,\r\n faUserCircle,\r\n faUserClock,\r\n faUserEdit,\r\n faUserFriends,\r\n faUserPlus,\r\n faUserSecret,\r\n faWalking,\r\n faWindowMinimize,\r\n faUpload,\r\n faSquareCaretRight,\r\n faCaretRight,\r\n faObjectGroup,\r\n faMagnet\r\n\r\n} from '@fortawesome/free-solid-svg-icons';\r\nimport { faCalendarCheck, faClock, faComments, \r\n faCalendar , faEye, faFileAlt, faFilePdf, faIdCard, faPaperPlane, faWindowMaximize } from '@fortawesome/free-regular-svg-icons';\r\nimport { PermissionsResolver } from '@app/core/guards';\r\nimport { YamapngModule } from 'projects/yamapng/src/public_api';\r\nimport { YaCoreModule } from 'projects/yamapng/src/lib/core.module';\r\nimport { GalleryModule } from 'projects/ks89/angular-modal-gallery/src/public_api';\r\nimport { whitelistedDomains } from '@app/core/const';\r\n// import { faCheckCircle } from '@fortawesome/free-solid-svg-icons/faCheckCircle';\r\nimport { faCheckCircle as faCheckCircleReg, } from '@fortawesome/free-regular-svg-icons/faCheckCircle';\r\nimport { faTimesCircle } from '@fortawesome/free-solid-svg-icons/faTimesCircle';\r\nimport { faQuestionCircle } from '@fortawesome/free-solid-svg-icons/faQuestionCircle';\r\n\r\nimport { faQrcode } from '@fortawesome/free-solid-svg-icons/faQrcode';\r\nimport { registerLocaleData } from '@angular/common';\r\nimport localeRu from '@angular/common/locales/ru';\r\nimport { ServiceWorkerModule } from '@angular/service-worker';\r\nimport { LocalStorageService, provideNgxWebstorage, withLocalStorage, withNgxWebstorageConfig, withSessionStorage } from 'ngx-webstorage';\r\n\r\n\r\n\r\n\r\nexport function createTranslateLoader(http: HttpClient) {\r\n return new TranslateHttpLoader(http, './assets/i18n/', '.json');\r\n}\r\nregisterLocaleData(localeRu, 'ru');\r\n\r\n\r\n@NgModule({\r\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\r\n declarations: [AppComponent, HeaderComponent, NavComponent, BodyComponent, AuthLayoutComponent],\r\n imports: [\r\n BrowserModule,\r\n AppRoutingModule,\r\n BreadcrumbModule,\r\n DragulaModule,\r\n BrowserAnimationsModule,\r\n CoreModule,\r\n DxSharedModule,\r\n GalleryModule,\r\n ToastrModule.forRoot({\r\n timeOut: 2000,\r\n positionClass: 'toast-top-right'\r\n }),\r\n NgxLoadingModule.forRoot({\r\n animationType: ngxLoadingAnimationTypes.chasingDots,\r\n backdropBackgroundColour: 'rgba(0,0,0,0.1)',\r\n backdropBorderRadius: '4px',\r\n primaryColour: '#7b7782',\r\n secondaryColour: '#b57a7c',\r\n tertiaryColour: '#6d2d28'\r\n }),\r\n TranslateModule.forRoot({\r\n loader: {\r\n provide: TranslateLoader,\r\n useFactory: createTranslateLoader,\r\n deps: [HttpClient]\r\n }\r\n }),\r\n JwtModule.forRoot({\r\n config: {\r\n tokenGetter: () => {\r\n return JSON.parse( localStorage.getItem('ngx-webstorage:access_token') ||\"null\") //localStorage.getItem('access_token');\r\n },\r\n allowedDomains: whitelistedDomains,\r\n // disallowedRoutes: [\"https://js.devexpress.com/\"],\r\n authScheme: ''\r\n }\r\n }),\r\n FontAwesomeModule,\r\n MetrikaModule.forRoot(\r\n { id: 51418249, webvisor: environment.production } // CounterConfig | CounterConfig[]\r\n ),\r\n YamapngModule,\r\n YaCoreModule.forRoot({\r\n apiKey: '6dc6eebd-4766-439e-af89-6be9736df6f4'\r\n }),\r\n ToastrModule.forRoot({\r\n timeOut: 4000,\r\n positionClass: 'toast-bottom-right',\r\n progressBar: true\r\n }), \r\n ServiceWorkerModule.register('ngsw-worker.js', {\r\n enabled: environment.production,\r\n // Register the ServiceWorker as soon as the app is stable\r\n // or after 30 seconds (whichever comes first).\r\n registrationStrategy: 'registerWhenStable:30000'\r\n }),\r\n NgxSkeletonLoaderModule\r\n //NgxWebstorageModule,\r\n ],\r\n providers: [\r\n UserResolver, \r\n PermissionsResolver,\r\n { provide: LOCALE_ID, useValue: 'ru' }, \t\r\n provideNgxWebstorage(\r\n\t\twithNgxWebstorageConfig({ separator: ':', caseSensitive: true }),\r\n\t\twithLocalStorage(),\r\n\t\twithSessionStorage(),\r\n\r\n\t),\r\n ],\r\n bootstrap: [AppComponent]\r\n})\r\nexport class AppModule {\r\n constructor(library: FaIconLibrary) {\r\n library.addIcons(\r\n faPaperPlane,\r\n faUndo,\r\n faRedo,\r\n faAngleDoubleLeft,\r\n faAngleDoubleRight,\r\n faAngleDoubleDown,\r\n faAngleDoubleUp,\r\n faAngleDown,\r\n faAngleLeft,\r\n faAngleRight,\r\n faPlusSquare,\r\n faMinusCircle,\r\n faAngleUp,\r\n faPencilAlt,\r\n faBars,\r\n faUserSecret,\r\n faArrowUp,\r\n faArrowDown,\r\n faSpinner,\r\n faDoorOpen,\r\n faInfo,\r\n faInfoCircle,\r\n faChevronDown,\r\n faChevronUp,\r\n faChevronRight,\r\n faChevronLeft,\r\n faCircle,\r\n faCalendar,\r\n faCalendarDay,\r\n faTrash,\r\n faEye,\r\n faHourglassStart,\r\n faUserFriends,\r\n faFileCsv,\r\n faFileDownload,\r\n faDownload,\r\n faExchangeAlt,\r\n faFile,\r\n faFileAlt,\r\n faSave,\r\n faSyncAlt,\r\n faIdCard,\r\n faUserEdit,\r\n faStoreAlt,\r\n faCross,\r\n faMagic,\r\n faGlobeAmericas,\r\n faCoins,\r\n faUser,\r\n faUserClock,\r\n faTimes,\r\n faCar,\r\n faClock,\r\n faLongArrowAltRight,\r\n faWindowMaximize,\r\n faWindowMinimize,\r\n faDrawPolygon,\r\n faGlobe,\r\n faDraftingCompass,\r\n faCloudDownloadAlt,\r\n faArrowRight,\r\n faCopyright,\r\n faBomb,\r\n faExclamationTriangle,\r\n faCheckDouble,\r\n faCheckCircleReg,\r\n faEdit,\r\n faHome,\r\n faChartPie,\r\n faThList,\r\n faUserCircle,\r\n faRoute,\r\n faMapMarkerAlt,\r\n faPuzzlePiece,\r\n faPlayCircle,\r\n faPlus,\r\n faUserPlus,\r\n faQrcode,\r\n faTimes,\r\n faCaretUp,\r\n faCaretDown,\r\n faChartLine,\r\n faChartBar,\r\n faCalendarCheck,\r\n faFilter,\r\n faTasks,\r\n faCheck,\r\n faSquare,\r\n faLanguage,\r\n faPaintBrush,\r\n faLightbulb,\r\n faWindowMaximize,\r\n faStream,\r\n faBook,\r\n faMinus,\r\n faEraser,\r\n faCog,\r\n faGripVertical,\r\n faKey,\r\n faFolderOpen,\r\n faImages,\r\n faImage,\r\n faComments,\r\n faExternalLinkAlt,\r\n faAlignJustify,\r\n faCarSide,\r\n faWalking,\r\n faBus,\r\n faCheckCircle,\r\n faTimesCircle,\r\n faQuestionCircle,\r\n faReceipt,\r\n faCloudUploadAlt,\r\n faFilePdf,\r\n faUpload,\r\n faFilePdf,\r\n faCaretRight, \r\n faCaretDown,\r\n faObjectGroup,\r\n faMagnet\r\n );\r\n loadMessages(ruMessages);\r\n locale(navigator.language);\r\n }\r\n\r\n}\r\n","import { enableProdMode } from '@angular/core';\r\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\r\n\r\nimport { AppModule } from './app/app.module';\r\nimport { environment } from './environments/environment';\r\n\r\nif (environment.production) {\r\n enableProdMode();\r\n}\r\n\r\nplatformBrowserDynamic()\r\n .bootstrapModule(AppModule)\r\n .catch(err => console.error(err));\r\n"],"x_google_ignoreList":[]}