{"version":3,"file":"main.4d57a0ef2a1b6f6d.js","mappings":"4HAEO,MAAMA,EAAY,IAAIC,IAAiB,CAC5C,CAAC,QAASC,MACV,CAAC,iBAAkBA,MACnB,CAAC,kBAAmBA,MACpB,CAAC,aAAcA,MACf,CAAC,oBAAqBA,6DCuBxB,WAAoBC,EAAc,IAUhC,OAAOC,EARa,IAAIC,KAAkB,CACxCC,WAAuB,IAAhBH,EAAOI,KAAqBJ,EAAOI,KAAOC,KAAKF,MACtDG,QAASN,EAAOM,SAAWD,KAAKC,QAChCC,YAA0B,IAAlBP,EAAOO,OAAuBP,EAAOO,OAASF,KAAKE,OAC3DC,WAAYR,EAAOQ,YAAcH,KAAKG,WACtCC,IAAKT,EAAOS,KAAOJ,KAAKI,UAAO,KAMnC,WAA4BT,GAC1B,cAAOU,OAAOV,EAAe,CAC3BI,KAAMJ,EAAcG,MACpBQ,MAAOC,EAAWC,KAAKb,KAElBA,gBCvCF,MAAMc,EAAoB,CAC/BC,4BAA6B,CAAEC,+BAAgC,CAAC,IAAK,MAAO,QAC5EC,aAAc,CAAEC,WAAY,KAC5BC,QAAS,CACPC,cAAe,YACfC,qBAAsB,gBACtBC,iBAAkB,CAChBC,UAAW,CACTC,YAAa,ICfd,MAAMC,UCAN,MAAeC,UCAf,MAAeC,EACpBC,eAEAC,MAAMC,EAAiC,IACrC,IAAIC,EAAO,GACPC,EAAKF,EAAcG,QACZ,IAAPD,IAAqBF,EAAcI,WAAaJ,EAAcK,SAChEH,GAAK,QAAYF,EAAe,OAAQ,OAGtCE,IACFD,GAAQ,IAAIC,KAGd,MAAMI,EAASN,EAAcK,OAK7B,GAJIC,IACFL,GAAQ,IAAIK,KAGVN,EAAcI,SAAU,CAC1BH,GAAQ,IAAID,EAAcI,WAEtBJ,EAAcO,gBAChBN,GAAQ,QAGV,MAAMO,EAAaR,EAAcS,aAAc,QAAYT,EAAe,OAAQ,MAC9EQ,IACFP,GAAQ,IAAIO,KAIhB,OAAIR,EAAcU,QAChBT,GAAQ,UAEHA,QHnBHU,cAAe,IIfhB,MAAMC,UCGN,MAAeC,UCCf,MAAeC,EAGpBhB,cAFAvB,UAAOwC,sBAGPC,IAAIhB,GACF,MAAQ1B,UAAS4B,GAAkBF,EAE7BM,EAAsBW,IAAUf,IAGpCgB,cACAC,QACAC,SACAC,cACAC,gBAAe,OACfC,mBAAiB,EACjBC,qBACElB,EAEJ,IAAM9B,WAAY8B,EAElB,MAAMmB,EAAe,CACnBH,gBACA9C,QAAS,IAAIJ,KACbsD,iBAAiB,EACjBC,QAAS,YAGX,OAAInB,IACFiB,EAAQG,OAASpB,GAGnBqB,EAAUA,GAAW,GAErBA,EAAQC,KAAK,CACXC,WAAY,eACZC,MAAO,qBAETH,EAAQC,KAAK,CACXC,WAAY,SACZC,MAAO,qBAIU,mBAAfC,IACFJ,EAAQC,KAAK,CACXC,WAAY,eACZC,MAAO,gCAIPH,GAAWA,EAAQK,QACrBL,EAAQM,QAAQC,IACd,MAAQL,aAAYC,UAAUI,EAC9BX,EAAQjD,QAAUiD,EAAQjD,QAAQ6D,OAAOC,EAAYC,MAIzDd,EAAQF,eAAiBiB,IAGrBC,IAAQC,MACVjB,EAAQjD,QAAQ6D,OAAO,eAAgB,uBACvCM,OAAO/D,OAAO6C,EAAS,CACrBF,gBAAgB,EAChBI,QAAS,YAITiB,IAAoBA,GAAiBV,QACvCU,GAAiBT,QAAQC,IACvBX,EAAQjD,QAAUiD,EAAQjD,QAAQ6D,OAAOD,EAAiB,MAM9DX,EAAQjD,QAAUiD,EAAQjD,QAAQ6D,OAAOQ,KAAyBtE,KAAKuE,MAEhErB,ID/ET3B,cACEiD,QAGF/B,IAAIhB,GACF,MAAQgD,QAAOC,iBAAgBC,OAAMC,OAAMC,kBAAgBlC,gBAAgBlB,EACrEiC,GAAc,GACdoB,GAAgBN,MAAM/B,IAAIhB,IACxBsD,SAAOC,WAASC,UAAWxD,EAEnC,MAA6B,QAAzBA,EAAcyD,SAChBzD,EAAc1B,KAAO0B,EAAc1B,MAAQ,IAGzC2B,GAASA,EAAMiC,SACjBD,GAAOe,MAAQ/C,EAAMyD,KAAK,MAOC,QAA7B1D,EAAkByD,aACH,IAATnD,IACF2B,GAAO0B,WAAarD,QAGT,IAATE,IACFyB,GAAO2B,SAAWpD,QAGG,IAAnBiC,KACFR,GAAOmB,eAAiBX,IAGtBD,KACFP,GAAO4B,QAAUC,KAAKC,UAAUvB,MAEA,SAAzBxC,EAAcyD,SACnBb,IAAWA,GAAQV,SACrBlC,EAAc1B,KAAK0F,QAAUpB,GAC1BqB,OAAOxC,GAAckB,OAAOuB,KAAKzC,GAAYS,QAC7ClB,IAAIS,IAAS,CACZqB,KAAMrB,EAAK0C,SACXC,UAAW3C,EAAK2C,YAAcrD,SAA4B,EAAI,WAIvD,IAATT,IACFN,EAAc1B,KAAKqF,WAAarD,QAGrB,IAATE,IACFR,EAAc1B,KAAKsF,SAAWpD,QAGT,IAAnBiC,KACFzC,EAAc1B,KAAK8E,eAAiBX,IAGlCD,KACFxC,EAAc1B,KAAK2F,OAASzB,IAG1BX,GACFc,OAAO/D,OAAOoB,EAAc1B,KAAMuD,IAIlCa,IACFC,OAAO/D,OAAOqD,GAAQS,IAGxBW,GAAczB,OAASyB,GAAczB,QAAU,GAC3Ce,OAAOuB,KAAKjC,IAAQC,QACtBS,OAAO/D,OAAOyE,GAAczB,OAAQK,IAG/BoB,KDlFXvD,kCACEvB,UAAOwC,uBJeDsD,eAAgB,IOjBjB,MAAMC,UCDN,MAAeC,UCMf,MAAeC,UCHf,MAAeC,EACpB3E,eAEA4E,YAAe1E,GACb,OAAOA,GAAaA,EAAU1B,KAGhCqG,qBAAwB3E,EAAWC,GACjC,MAAMC,EAAQnC,MAAckC,GAC5B,OAAKC,EAGE,IAAIA,EAAMF,GAFRA,EAKX4E,sBAAyB5E,EAAYC,GACnC,MAAMC,EAAQnC,MAAckC,GAC5B,OAAKC,EAGEF,EAAMgB,IAAIV,GAAQ,IAAIJ,EAAMI,IAF1BN,EAKX6E,uBAAuB7E,GACrB,OAAOA,EAGT8E,gBAAmB9E,GACjB,OAAOzB,KAAKwG,eAAe/E,MAAeA,EAASgF,WAGrDD,eAAkB/E,GAChB,OAAOiF,MAAMC,QAAQlF,EAASmF,WD5BhCrF,cACEiD,QAGF/B,IACEhB,EACAC,GAEA,MAAMC,EAEF3B,KAAKmG,YAAe1E,GAExB,IAAKE,IAAaA,EAASiF,QACzB,OAAOjF,EAET,IAAMiF,WAAYjF,EAElB,GAAI3B,KAAKuG,gBAAmB5E,GAC1BI,EAAWA,EAAgBU,IAAIR,GAAQjC,KAAKsG,uBAAuBrE,IACnEN,EAASiF,QAAU5G,KAAKqG,sBAAyBtE,EAASL,QAAkB,GACnE1B,KAAKwG,eAAkB7E,GAChC,GAA2B,eAAvBD,EAAqC,CACvC,MAAMO,EAAoC,CAAE4E,KAAM9E,GAClDJ,EAASiF,QAAU3E,OAEnBF,EAAWA,EAAgBU,IAAIR,GAAQjC,KAAKsG,uBAAuBrE,IACnEN,EAASiF,QAAU5G,KAAKqG,sBAAyBtE,EAASL,QAG5D,OAAQA,OACD,QACH,MAAMO,EAAW,CAAEE,MAAOJ,GAC1BJ,EAASiF,QAAU3E,EACnB,UACG,SACH,MAAMiC,GAAY,CAAE4C,QAAS/E,GAC7BJ,EAASiF,QAAU1C,GACnB,UACG,aACH,MAAMC,GAAoC,CACxC0C,KAAM9E,GAERJ,EAASiF,QAAUzC,GACnB,cAEApC,EAAU/B,KAAKsG,uBAAuBvE,GACtCJ,EAASiF,QAAU5G,KAAKoG,qBAAwBrE,EAASL,GAI/D,OAAOC,QTtCHoF,eAAgB,IWlBjB,MAAMC,UCWN,MAAeC,UbVf,MAAeC,EACpB3F,eAEAkB,KAAM0E,MAAKC,UACT,OAAI1F,aAAiB7B,OACnB6B,EAAS9B,EAAmB8B,IAGvBA,EAAMpB,MAAM,CACjBP,KAAM,CACJ6G,aAAS,EACTH,gBAAY,EACZzB,aAAS,EACTqC,SAAU,CAAEC,WAAY,IACxBpH,OAAQwB,EAAMxB,OACdC,WAAYuB,EAAMvB,WAClBC,IAAKsB,EAAMtB,IACXH,QAASyB,EAAMzB,QACfsH,WAAY9F,EAAI4B,OAChB6B,OAAQzD,EAAIyD,OACZsC,gBAAgB,EAChBC,aAAc/F,EAAM3B,UaV1B0C,KAAM0E,MAAKC,UAET,MAAMzF,GADND,EAAQ8C,MAAM/B,IAAI,CAAE0E,MAAKC,WACuBrH,KAC1CgC,EAAeL,EAAM3B,KAAK0H,aAEhC,GAAoB,MAAhB1F,EAAsB,CACxB,MAAME,EAAOF,EAAa8E,KAG1B,IAFiB,QAAY5E,EAAM,SAErB,CACZ,MAAQyF,YAAUhE,IAAezB,EAEjCN,EAAWiF,QAAUzC,GAErBxC,EAAW8E,WAAazG,KAAK2H,cAAcjE,SAGlCzB,IACTN,EAAWiF,QAAU3E,GAGnBF,EAAasF,WACf1F,EAAW0F,SAAWtF,EAAasF,UAIvC,OAAO3F,EAAMpB,MAAM,CACjBP,KAAM4B,IAIVgG,cAAclG,GACZ,OAAKA,EAGwC,CAC3CmG,MAAOnG,EAAWoG,gBAClBC,KAAMrG,EAAWsG,YACjBlD,eAAgBpD,EAAWoD,eAC3BF,KAAMlD,EAAWuG,UACjBpD,KAAMnD,EAAW4D,SACjB4C,YAAaxG,EAAWU,MACxB+F,WAAYzG,EAAW0G,WACvBC,WAAY3G,EAAW2G,iBAVvB,OZzBAC,cAAe,CACbjG,cAAe,IapBhB,MAAMkG,UCEN,MAAeC,GAGpBhH,cAFAvB,UAAOwC,0BAYPgG,gBAAgB/G,GACd,MAAQG,KAAI6G,MAAKxD,SAAQS,SAAQX,SAAO2D,aAAWC,WAAS3D,WAASpC,SAASnB,EAC9E,IAAMmD,QAAMD,QAASlD,EACrB,MAAMyB,EAA6B,CAAE6B,UAC/BlB,EAAuB,GAGzBH,IACFU,OAAO/D,OAAO6C,EAAc,CAC1ByF,kBAKO,IAAPjH,IACFmC,EAAgBjC,GAAKF,GAEnBC,IACFkC,EAAgB4E,IAAM9G,GAGxB,MAAMoC,EAA2B,GAEjC,OAAIhC,GAAQ4B,QACVI,EAAkBR,QAAQxB,GAIxBE,GAAQ0B,QACVI,EAAkBR,QAAQtB,GAExB8B,EAAkBJ,QACpB3D,KAAK4I,oBAAoB,CAAEC,kBAAiBC,sBAI1ChE,IACF9E,KAAK+I,oBAAoB,CAAEF,kBAAiB7D,cAI1CX,IAAQf,KACLe,KACH5C,EAAcmD,KAAO,GACrBP,GAAO,IAEJf,IACH7B,EAAckD,KAAO,EACrBrB,EAAO,GAETtD,KAAKgJ,uBAAuB,CAAEH,kBAAiBjE,QAAMD,UAGnDV,IACFG,OAAO/D,OAAOwD,EAAiB,CAAEjB,KAAMqB,GAAKgF,aAI1C9E,IACFC,OAAO/D,OAAOwD,EAAiBM,IAEjCjB,EAAawF,UAAY7E,EAIlBX,EAGTgG,mBAAmBzH,GACjB,MAAQG,KAAIuH,WAAUpJ,OAAM2I,YAAWU,sBAAoBC,qBAAmBV,YAAYlH,EACpFqD,GAAmC,CAAEqE,YACrClF,GAAuB,GAe7B,GAZIP,IACFU,OAAO/D,OAAOyE,GAAiB,CAC7B6D,kBAKO,IAAPjH,IACFuC,GAAgBrC,GAAKF,GAInBK,EAMF,QAH2B,IAAvBkC,GAAgBrC,SAAgC,IAAZG,EAAKH,KAC3CqC,GAAgBrC,GAAKG,EAAKH,IAExBG,EAAKuH,WAAY,CAGnB,MAAMjF,GAAiBtC,EAAKuH,kBACrBjF,GAAezC,GACtBwC,OAAO/D,OAAO4D,GAAiB,CAAEsF,MAAOlF,iBAEjCtC,EAAKH,GACZwC,OAAO/D,OAAO4D,GAAiB,CAAEsF,MAAOxH,IAK5C,OAAIE,GACFmC,OAAO/D,OAAO4D,GAAiBhC,GAG7BA,GAAWW,MACbwB,OAAO/D,OAAO4D,GAAiB,CAAErB,KAAMX,EAAUW,KAAKqG,aAGxDnE,GAAgB4D,UAAYzE,GAExBC,KACFY,GAAgBsE,mBAAqBlF,GACrCY,GAAgB0E,OAAS,CAACnF,GAAOf,KAG/Ba,GAAkBsF,KAAKnG,KAUpBwB,KD9ITvD,cACEiD,QAHFxE,UAAOwC,yBAMGoG,qBAAsBC,kBAAiBC,sBAC/CrH,EAAgBiE,OAAS,aAAahE,MAG9BqH,qBAAsBF,kBAAiB7D,YAC/CZ,OAAO/D,OAAOoB,EAAiB,CAC7BiI,OAAQhI,EAAQe,IAAId,GAAQA,EAAKiE,UAAU+D,UAC3CC,UAAWlI,EAAQe,IAAId,GAAQA,EAAKkE,WAAW8D,YAIzCX,wBAAyBH,kBAAiBjE,OAAMD,SACxDP,OAAO/D,OAAOoB,EAAiB,CAC7BmG,MAAOlG,EACPmI,MAAOnI,GAAQC,EAAO,ObApBmE,eAAgB,IerBjB,MAAMgE,UCKN,MAAeC,EACpBxI,eAkBAyI,iBACEvI,EACAC,GAGA,YAAKuI,WAAcxI,EAAeC,GAAmB,GAGrD1B,KAAKkK,gBAAgBzI,EAAeC,GAGpC1B,KAAKmK,mBAAmB1I,EAAeC,GAEhCA,EAGT0I,oBACE3I,EACAC,GAGA,YAAKuI,WAAWxI,EAAeC,GAAmB,GAE3CA,EAGDuI,WACNxI,EACAC,EACAC,GAEA,QAAuC,IAAnCD,EAAkB+F,cAAiE,OAAnC/F,EAAkB+F,aACpE,OAGF,MAAQ4C,eAAgB5I,EACxB,GAAIM,EAAa,CACf,MAAME,EAAWjC,KAAKsK,2BAA2B5I,EAAmBK,EAAaJ,GACjF,GAAIM,EAAU,CAEZ,MAAMiC,GAAQlE,KAAKuK,SAASxI,GACxBmC,KAEElE,KAAKwK,gBAAgBvI,GAEvBP,EAAkBkF,QAAU5G,KAAKyK,kBAAqBxI,EAAUiC,IAGhExC,EAAkBkF,QAAU,IAAI1C,GAAMjC,EAAS4E,MAAQ5E,MASzDiI,gBAAgBzI,EAAoCC,GAC1D,MAAQ2I,eAAgB5I,EAEpBzB,KADkBsK,2BAA2B5I,EAAmBC,GAAa,KAE/ED,EAAkBsD,QAAUvD,EAAcuD,SAItCmF,mBACN1I,EACAC,GAEA,MAAQ2I,eAAgB5I,EAClBM,EAAW/B,KAAKsK,2BAA2B5I,EAAmBC,GAAa,GAC7EI,IAAaN,EAAcmD,MAAQnD,EAAckD,QACnDjD,EAAkB+E,WAAazG,KAAK0K,oBAAoBjJ,EAAeM,IAInEuI,2BACN7I,EACAC,EACAC,GAEA,IAAII,EAIJ,MAAME,EAAeR,EAAkBgG,aAAa/F,IAAgBD,EAAkBgG,aACtF,IAAKxF,EAEH,MAAM,IAAI0I,MAAM,qBAAqBjJ,gBAEvC,OACEK,EADEJ,EACSM,EAEAjC,KAAK4K,mCAAmC,CAAEnD,eAAcoD,sBAG9D9I,EAGDwI,SAAS9I,GACf,MAAMC,EAAQlC,MAAciC,GAC5B,OAAKC,GACHoJ,QAAQhL,MAAM,0BAA0B2B,eAEnCC,ID/HTH,cACEiD,QAIQgG,gBAAgB/I,GACxB,QAASA,EAASsJ,MAGVN,kBAAqBhJ,EAAUC,GACvC,OAAOD,EAASsJ,MAAMtI,IAAId,GAAQ,IAAID,EAAMC,EAAKqJ,OAGzCN,oBAAoBjJ,EAAoCC,GAEhE,MAAMC,EAAOF,EAAcmD,KACrB7C,EAAON,EAAckD,KACrB1C,EAAaP,EAASyG,WACtBjE,GAAa+G,KAAKC,KAAKjJ,EAAaN,GAEpC+B,GAAO3B,IAASmC,GACtB,IAAIY,GACJ,OAEIA,GAFApB,GACFzB,EAAiBN,EAAO,EACRM,EAAaN,EAEbA,EAGhBA,EAAWI,GAAQE,EACHN,EAEA,EAGX,CACLiG,MAjBqB,IAAT7F,EAkBZ+F,QACAnD,OACAC,OACAqD,eACAC,aACAE,eAKMwC,oCAAqCnD,eAAcoD,sBAC3D,SAAkB/D,QAAUrF,GAAcqF,QAC1CpF,EAAkByJ,QAAU1J,GAAc0J,QACnC1J,GAAc2J,Sf7BjBrE,eAAgB,IiBvBjB,MAAMsE,UCIN,MAAMC,GACX/J,eAEAkB,IAAIhB,EAAoCC,GACtC,MAAMC,EAAoB,CACxBiF,aAAS,EACTH,gBAAY,EACZzB,aAAS,EACTqC,SAAU,CAAEC,WAAY,IACxBiE,cAAe7J,EAAgB6J,cAE/B9D,aAAc/F,EAAgBmF,KAC9B2E,aAAc,KAIRnB,eAAgB5I,EAClBQ,EAAUP,GAAiBmF,MAAQnF,EAAgBmF,KAAK9E,IAAcoJ,SAG5D,KADAzJ,GAAiBmF,MAAQnF,EAAgBmF,KAAK9E,IAAc+E,SAE1EnF,EAAkB0F,SAASC,WAAW/D,KAAK,CACzCkI,MAAO,QACPN,QAASlJ,GAAW,0BACpByJ,KAAM,QACNC,OAAQ,UAIN1J,GACFN,EAAkB0F,SAASC,WAAW/D,KAAK,CACzCkI,MAAO,GACPN,UACAO,KAAM,OACNC,OAAQ,UAMd,MAAQC,WAAWlK,EACnB,GAAIyC,IAAQR,OAAQ,CAClB,MAAMD,GAAeS,GAAO0H,OAAO,CAAC/G,GAAKb,KAAUa,GAAMb,GAAMkH,QAAS,IACxExJ,EAAkB0F,SAASC,WAAW/D,KAAK,CACzCkI,MAAO,QACPN,QAASzH,GACTgI,KAAM,QACNC,OAAQ,UAIZ,OAAOhK,IDtDTJ,cACEiD,cEGSsH,GAAe1H,OAAO/D,OAAOI,EALjB,CACvBsL,KAAM,CAAEC,YAAa,IAAKC,UAAW,WAAYC,WAAY,YAC7DC,IAAK,CAAEC,cAAe,CAAEC,oBAAqB,KAASC,cAAe,CAAEC,mBAAoB,6ECFtF,MAAM/M,EAA0B,iBAE1BgD,EAA2B,CACtCgK,UAAU,OAAgB,kCAC1BC,OAAO,OAAgB,+BACvBC,WAAW,OAAgB,oCAC3BC,WAAW,OAAgB,oCAC3BC,KAAK,OAAgB,6BACrBC,KAAK,OAAgB,6BACrBC,cAAc,OAAgB,uCAC9BC,eAAe,OAAgB,8BAC/BC,YAAY,OAAgB,qCAC5BC,iBAAiB,OAAgB,2CACjCC,SAAS,OAAgB,kCACzBC,YAAY,OAAgB,qCAC5BC,cAAc,OAAgB,wCCfnBvN,EAAY,CACvBwN,UAAW,CACTC,MAAO,CACLC,eAAe,OAAgB,kCAC/BC,SAAS,OAAgB,mCAE3BC,aAAa,OAAgB,iCAE/BC,oBAAqB,CACnB,CAAEC,KAAM,KAAMC,MAAO,WACrB,CAAED,KAAM,KAAMC,MAAO,YACrB,CAAED,KAAM,KAAMC,MAAO,WACrB,CAAED,KAAM,KAAMC,MAAO,WACrB,CAAED,KAAM,KAAMC,MAAO,aAEvBC,iBAAkB,CAAEF,KAAM,KAAMC,MAAO,WACvCE,sBAAuB,GCdlB,MAAMC,EAAgB,CAC3BC,2BAA4B,KAC5BC,gCAAyBC,EACzBC,oBAAqB,IAChB3L,IAIME,EAAY0B,OAAO/D,OAAOR,EAAkBkO,yGCLlD,MAAMlO,EACX0B,eAEA6M,mDAHWvO,8BAAiBwO,wICP9B3O,iBAAuC,QACjCA,2CAA+BA,eAAyBA,gBAAIA,mBAA1BA,moBCyBlC,MAAgB4O,EAmBpB/M,YAAsBgN,mBARdvO,yBAAsB,IAAIP,IAE3BO,gBAAa,CAClBwO,aAAa,EACbC,eAAe,EACfC,qBAAqB,GAMjBC,OAAI,qCACRzL,EAAK0L,UAAY1L,EAAKqL,SAASM,IAAIC,MACnC5L,EAAK6L,aAAe7L,EAAKqL,SAASM,IAAIG,MACtC9L,EAAK+L,cAAgB/L,EAAKqL,SAASM,IAAIK,MACvChM,EAAKiM,OAASjM,EAAKqL,SAASM,IAAIO,MAChClM,EAAKmM,mBAAqBnM,EAAKqL,SAASM,IAAIS,MAK5CpM,EAAKqM,eAAiBrM,EAAKqL,SAASM,IAAIW,MAExCtM,EAAKuM,yBAA2BvM,EAAKqL,SAASM,IAAIa,KAClD,MAAMC,EAAUzM,EAAKuM,yBAAyBd,OAAOiB,KAAK,KACxD1M,EAAK2M,WAAWrB,aAAc,EAC9BtL,EAAK4M,oBAAsB5M,EAAKqL,SAASM,IAAIkB,KAC7C7M,EAAK4M,oBAAoBnB,SAG3B,SAAKqB,0BAA4B9M,EAAKqL,SAASM,IAAIoB,GACnD/M,EAAK8M,0BAA0BrB,OAE/BzL,EAAKgN,oBAAsBhN,EAAKqL,SAASM,IAAIsB,MAC7CjN,EAAKgN,oBAAoBvB,OAEzBzL,EAAKkN,kBAELlN,EAAKmN,gBAIAC,gBACHxF,QAAQyF,IAAI,MAAOD,KAGrBE,OAAOC,SAAc,KACnB3F,QAAQyF,IAAI,gBAAiBD,KAC7BxF,QAAQyF,IAAI,gBAAiBG,MAC7B5F,QAAQ6F,MAAMC,MACd9F,QAAQ6F,MAAMzN,EAAK6L,aAAa8B,MAAMC,oBAGjCC,QAAQC,IAAI,CAACrB,KA1CZ,GA6CVS,kBACE,MAAMa,EAAa,KACjB,MAAMC,EAA0B,IAArBV,OAAOW,YAClBC,SAASC,gBAAgBC,MAAMC,YAAY,OAAQ,GAAGL,QAExDD,KAEAO,OAAUhB,OAAQ,UACfiB,MACCC,OAAa,MACbC,OAAI,IAAMV,MAEXW,YAGLC,yBAEE7R,KAAKqP,mBACFjM,QAAQ,CACPwN,YACAA,WACAA,YACAA,WACAA,YACAA,aACAA,YACAA,SACAA,qBACAA,oBACAA,iBACAA,sBACAA,qBACAA,oBAEDgB,UAAU,KACT5R,KAAK+O,aAAa+C,SAAUjB,IAC1BA,EAAMC,kBAAkBiB,SAAW/R,KAAKqP,mBAAmB2C,UAAUpB,aACrEC,EAAMC,kBAAkBmB,QAAUjS,KAAKqP,mBAAmB2C,UAAUpB,YACpEC,EAAMC,kBAAkBoB,SAAWlS,KAAKqP,mBAAmB2C,UAAUpB,aACrEC,EAAMC,kBAAkBqB,QAAUnS,KAAKqP,mBAAmB2C,UAAUpB,YACpEC,EAAMC,kBAAkBsB,SAAWpS,KAAKqP,mBAAmB2C,UAAUpB,aACrEC,EAAMC,kBAAkBuB,UAAYrS,KAAKqP,mBAAmB2C,UAAUpB,cACtEC,EAAMC,kBAAkBwB,SAAWtS,KAAKqP,mBAAmB2C,UAAUpB,aACrEC,EAAMC,kBAAkByB,MAAQvS,KAAKqP,mBAAmB2C,UAAUpB,UAClEC,EAAMC,kBAAkB0B,kBAAoBxS,KAAKqP,mBAAmB2C,UAClEpB,sBAEFC,EAAMC,kBAAkB2B,iBAAmBzS,KAAKqP,mBAAmB2C,UACjEpB,qBAEFC,EAAMC,kBAAkB4B,cAAgB1S,KAAKqP,mBAAmB2C,UAAUpB,kBAC1EC,EAAMC,kBAAkB6B,mBAAqB3S,KAAKqP,mBAAmB2C,UACnEpB,uBAEFC,EAAMC,kBAAkB8B,kBAAoB5S,KAAKqP,mBAAmB2C,UAClEpB,sBAEFC,EAAMC,kBAAkB+B,eAAiB7S,KAAKqP,mBAAmB2C,UAC/DpB,mBAGF5Q,KAAK8S,qBAAqBjC,IACzBkC,mBAICD,qBAAqBjC,GACzBA,EAAMC,kBAAkB0B,mBAAqB3B,EAAMC,kBAAkB2B,kBACvE5B,EAAMC,kBAAkBkC,iBAAkB,EAC1CnC,EAAMC,kBAAkBmC,gBAAiB,EACzCpC,EAAMC,kBAAkBoC,aAAc,IAEtCrC,EAAMC,kBAAkB6B,oBACxB9B,EAAMC,kBAAkB8B,mBACxB/B,EAAMC,kBAAkByB,SAExB1B,EAAMC,kBAAkBkC,iBAAkB,EAC1CnC,EAAMC,kBAAkBmC,gBAAiB,EACzCpC,EAAMC,kBAAkBoC,aAAc,0CAjJtB5E,GAAqB6E,yCAArB7E,EAAqB8E,QAArB9E,EAAqB,qBAF7B,yVAwBZ+E,GADCC,SACDrM,6GC1CI,MAAOsM,EACX5E,OACE6B,OAAOgD,UAAehD,OAAOgD,WAAgB,GAC7C,MAAMC,EAAiBnD,eACnBtQ,KAAK0T,kCACP1T,KAAK2T,cAAcF,EAAeG,QACzBtD,iBACTE,OAAOgD,UAAajQ,KAAO,QAIvBmQ,kCACN,MAAMD,EAAiBnD,eACvB,GAAImD,EAAgB,CAClB,QAA+BI,IAA3BJ,EAAeK,QACjBhJ,eAAQiJ,KAAK,4CACN,EAET,GAAIN,EAAeK,cACaD,IAA1BJ,EAAeG,OACjB9I,eAAQiJ,KAAK,2CACN,EAKb,OAAyB,MAAlBN,GAA0BA,EAAeK,QAG9CN,gBACF,OAAOhD,OAAOgD,UAGRG,cAAcC,GACpBxC,SAAS4C,KAAKC,YAAYjU,KAAKkU,aAAaC,EAAuBP,KAG7DM,aAAaE,GACnB,MAAMC,EAASjD,SAASkD,cAAc,UACtCD,SAAOD,KAAOA,EACPC,yCAxCEd,gCAAqBH,QAArBG,EAAqB,qBAFpB,SA8Cd,MAAMY,EAA0BP,GAAmB,gVAKRA,2CC3CpC,MAAMrL,GACXhH,YAAoB2B,EAAgCW,GAAhC7D,kBAAgCA,yBAEpD2O,OACE3O,KAAKuU,kBAAkBC,WAAW5C,UAAU,KAC1C5R,KAAKyU,aAITA,WACE,MAAMvR,EAAU,GAAGgD,mBACbrC,EAAO6Q,aAAaC,QAAQzR,GAClC,GAAIW,EAAM,CAGR,MAAMG,GAAW,CACf4Q,MAAOrP,KAH0CsP,MAAMhR,GAG/BpB,IAAIqS,KAAQ,CAClCC,KAAMD,GAAIrJ,OAAS,GACnBuJ,IAAK5T,cAAwB8E,YAC7B+O,MAAOH,GAAIG,MACXC,IAAKhP,SACLiP,KAAM,IAAKL,GAAKM,WAAYnP,KAAaoP,UAAWpP,UAIxDjG,KAAKsV,WACFC,KAAK,GAAGrP,oCAA4CA,gBAAwBsP,KAAKC,QAASzR,IAC1F4N,UAAU,KAET8C,aAAagB,WAAWxS,8CA7BrBqF,IAAuB3I,oDAAvB2I,GAAuB6K,QAAvB7K,GAAuB,qBAFtB,SCGR,MAAOoN,UAA0BrH,EACrC/M,YACUqU,EACAC,EACAC,EACEvH,IAEV/J,MAAM+J,IALEvO,6BACAA,+BACAA,yBACEA,iBAKN2O,OAAI,4DACFzL,YAMNW,EAAKgO,yBACLhO,EAAKiS,kBAAkBnH,OAIvB9K,EAAKgS,wBAAwBlH,OAE7B9K,EAAKiM,oBAAoBnB,OACzB9K,EAAKiM,oBAAoBiG,yBAfjB,GAiCAjD,qBAAqBjC,GACzBA,EAAMC,kBAAkBuB,WAAaxB,EAAMC,kBAAkB2B,kBAC/D5B,EAAMC,kBAAkBkC,iBAAkB,EAC1CnC,EAAMC,kBAAkBmC,gBAAiB,EACzCpC,EAAMC,kBAAkBoC,aAAc,IAC7BrC,EAAMC,kBAAkB8B,mBAAqB/B,EAAMC,kBAAkByB,SAC9E1B,EAAMC,kBAAkBkC,iBAAkB,EAC1CnC,EAAMC,kBAAkBmC,gBAAiB,EACzCpC,EAAMC,kBAAkBoC,aAAc,GAI1C7C,wDAvDWsF,GAAiBxC,wEAAjBwC,EAAiBvC,QAAjBuC,EAAiB,qBAFhB,wBCFP,MAAetK,EAYpB9J,cAXUvB,sBAAmC,CAC3C0L,KAAM1F,aACNyF,MAAO,GACPuK,iBAAkBhQ,YAClBiQ,mBAAoBjQ,YACpBkQ,SAAU5K,6BACV6K,eAAe,EACfC,gBAAiB,GACjBC,iBAAiB,0CATChL,gCAAwB+H,QAAxB/H,EAAwB,qBAFhC,sBCGP,MAAMvB,UAAmCuB,EAE9C9J,YAAsB2B,GACpBsB,QADoBxE,mBAItBsW,KAAKpT,GACH,IAAIW,EAAmBX,EAAKuI,OAAS,GACjCvI,EAAKuI,OAASvI,EAAKiI,UACrBtH,GAAoB,OAEtBA,GAAoBX,EAAKiI,SAAW,GAEpC,MAAMpH,EAAU,CACdmS,SAAUhT,EAAKgT,UAAYlW,KAAKuW,iBAAiBL,SACjDD,mBAAoB/S,EAAK+S,oBAAsBjQ,YAC/CgQ,iBAAkB9S,EAAK8S,kBAAoBhQ,aAE7ChG,KAAKwW,YAAYC,KAAK5S,EAAkB,KAAME,GAGhD2S,2DArBW5M,GAA0BlK,wCAA1BkK,EAA0BsJ,QAA1BtJ,EAA0B,qBAFzB,SCCP,MAAMrJ,UAA6BqJ,EACxCvI,YAAsB2B,GACpBsB,MAAMtB,GADclD,0DADXS,GAAoBb,wCAApBa,EAAoB2S,QAApB3S,EAAoB,qBAFnB,uBCCP,MAAMqL,GAEXvK,YAAmB2B,oBACjBlD,KAAK2W,OAASzT,0CAHL4I,IAAclM,0CAAdkM,GAAcsH,QAAdtH,GAAc,qBAFb,uBCeP,MAAerK,EAapBF,YAAsB2B,mBAZtBlD,+BAA2B,EAC3BA,oCAAiC,GACjCA,6BAA0B,GAC1BA,0BAAuB,GAWvB2O,OACE3O,KAAK4W,kBAAoB5W,KAAKuO,SAASM,IAAIvG,GAC3CtI,KAAK6W,iBAAmB7W,KAAKuO,SAASM,IAAIhP,MAC1CG,KAAKmP,OAASnP,KAAKuO,SAASM,IAAIrM,MAChCxC,KAAK8W,qBAAuB9W,KAAKuO,SAASM,IAAIpO,GAC9CT,KAAK+W,eAAiB/W,KAAKuO,SAASM,IAAI/C,IACxC9L,KAAK+O,aAAe/O,KAAKuO,SAASM,IAAInP,MACtCM,KAAKgX,YAAchX,KAAKuO,SAASM,IAAInP,MACrCM,KAAKiX,iBACLjX,KAAKkX,kBAGPD,iBACEjX,KAAKmX,oCACLnX,KAAKoX,2BAGPF,kBACElX,KAAK+O,aAAa8B,MAAMwG,YAAYzF,UAAW1O,IAC7C,OAAQA,EAAUwI,UACX,2BACC1L,KAAKsX,+BAA+BpU,EAAUqU,WAChDvX,KAAKsX,+BAA+BpU,EAAUqU,UAAUrU,GAE1D,UACG,iBACClD,KAAKwX,qBAAqBtU,EAAUqU,WACtCvX,KAAKwX,qBAAqBtU,EAAUqU,UAAUrU,MAOxDiU,oCACE,MAAMjU,EAAmB,EAAGuU,cAC1BzX,KAAK8W,qBAAqBR,KAAK,CAC7B7K,MAAOzL,KAAK6W,iBAAiBa,SAAQ,OAAgB,sBAAwB,GAC7EvM,QAAS,GAAGnL,KAAK6W,iBAAiBa,SAAQ,OAAgB,uCACxD,QAAQ7T,IACV6H,KAAM1F,cAGVhG,KAAKsX,+BAA+B,OAASpU,EAC7ClD,KAAKsX,+BAA+B,OAASpU,EAC7ClD,KAAKsX,+BAA+B,GAAOpU,EAG7CkU,2BACEpX,KAAKwX,qBAAqBxR,YAA+B9C,IACvDlD,KAAK2X,oBAAoBzU,EAAW,CAAEgT,SAAU5K,yCAGlDtL,KAAKwX,qBAAqBxR,cAAiC9C,IACzD,MAAMW,EAA6BX,EAAUuU,QAC7C3M,QAAQyF,IAAI1M,IAGd7D,KAAKwX,qBAAqBxR,kBAAqC9C,IAC7DlD,KAAK4X,yBAAyB1U,IAIlCyU,oBAAoBzU,EAA4BW,EAAe,IAC7D,MAAME,EAA0Bb,EAAUuU,QACN,MAAhCvU,EAAUuU,QAAQ5W,aACpBgD,EAAQqS,SAAWhT,EAAUuU,QAAQ5W,YAEvCb,KAAK8W,qBAAqBR,KACxBlS,OAAO/D,OACL,CACEoL,MAAO1H,EAAQ0H,OAAS,GACxBN,QAASpH,EAAQoH,SAAW,GAC5BO,KAAM3H,EAAQ2H,MAEhB7H,IAKN+T,yBAAyB1U,EAA4BW,EAAU,IAC7D,MAAME,EAAa/D,KAAK+O,aAAa8B,MAAMC,kBAAkBoC,YAAc,OAAS,OAC9ElP,GAAgBhE,KAAK+O,aAAa8B,MAAMC,kBAAkBoC,YAAc,QAAU,OAClF4B,GAA6B5R,EAAUuU,QAC7CzX,KAAK+W,eAAeJ,OAAOF,KACzBrV,gCACAgD,OAAO/D,OACL,CACEwX,MAAO9T,EACP+T,SAAU9T,GACV+T,OAAQhU,EACRiU,UAAWhU,GACX6C,KAAMiO,IAERjR,2CA7GcpC,GAA6B7B,yCAA7B6B,EAA6B2R,QAA7B3R,EAA6B,qBAFrC,SCNP,MAAMC,UAAyCD,EACpDF,YAAsB2B,GACpBsB,MAAMtB,GADclD,gBAItBmX,oCACE3S,MAAM2S,oCAENnX,KAAKsX,+BAA+B,KAAS,KAC3CtX,KAAK+W,eAAeJ,OAAOsB,WAW3BjY,KAVoB+W,eAAeJ,OAAOF,KAAKrV,6BAAmC,CAChFyW,MAAO,MACPC,SAAU,QACVI,cAAc,EACdrR,KAAM,CACJ4E,OAAO,OAAgB,wCACvBN,SAAS,OAAgB,8CACzBgN,QAAQ,OAAgB,oBAGrBC,cAAcxG,UAAU,KAC7B5R,KAAKqY,0BAA2B,EAChCrY,KAAKgX,YAAYsB,aAKvBlB,2BACE5S,MAAM4S,2BAENpX,KAAKwX,qBAAqBxR,aAA+B9C,IACvD,MAAMW,EAA6BX,EAAUuU,QAC7CzX,KAAK+W,eAAeJ,OAAOsB,WAC3BjY,KAAK+W,eAAeJ,OAAOF,KAAKrV,6BAAmC,CACjEyW,MAAO,MACPC,SAAU,QACVI,cAAc,EACdrR,KAAM,CACJ4E,MAAO5H,EAAQ4H,OAAS,GACxBN,QAAStH,EAAQsH,SAAW,GAE5BgN,QAAQ,OAAgB,qBAK9BnY,KAAKwX,qBAAqBxR,iBAAmC9C,IAC3D,MAAQiI,UAASM,SAA6BvI,EAAUuU,QACxDzX,KAAKmP,OAAOoJ,SAAS,CAAC,UAAW,CAAE5V,YAAa,CAAEwI,UAASM,mDAhDpD/J,GAAgC9B,yCAAhC8B,EAAgC0R,QAAhC1R,EAAgC,qBAF/B,SCJP,MAAMC,UAAkCD,EAC7CH,YAAsB2B,GACpBsB,MAAMtB,GADclD,uDADX2B,GAAyB/B,yCAAzB+B,EAAyByR,QAAzBzR,EAAyB,qBAFxB,iBCHP,MAAMM,EAUXV,YAAY2B,GACVkB,OAAO/D,OAAOL,KAAMkD,ICXjB,MAAMgB,GAOX3C,YAAY2B,GACVkB,OAAO/D,OAAOL,KAAMkD,wCCAjB,MAAMe,GAQX1C,cAPAvB,YAA2B,GACXA,iBAAc,IAAI0D,MAE1B1D,yBAAgD,GAE9CA,kBAAe,IASzBwY,YAAYtV,GACV,OAAOlD,KAAKyY,YAAYhH,MAAK,QAAO5N,GAAQA,EAAKjC,KAAOsB,IAG1DwV,QAAQxV,GACN,GAAIlD,KAAK2Y,oBAAoBC,KAAK7U,GAAQA,EAAK8U,gBAAkB3V,GAC/D,OAEF,MAAMW,EAAqB,IAAIK,GAAuB,CAAE2U,cAAe3V,IAGvEW,EAAmBiV,OAAS9Y,KAAK8Y,OAC9BpT,OAAO3B,GAASA,EAAMgV,SAASC,SAASnV,EAAmBgV,gBAE3DpW,IAAIsB,GAAS,IAAI9B,EAAe8B,IACnCF,EAAmBoV,UAAYzD,KAAKC,MAEpCzV,KAAK2Y,oBAAoBpV,KAAKM,GAEzB7D,KAAKkZ,aACRlZ,KAAKmZ,kBACLnZ,KAAKkZ,WAAaE,YAAY,KAC5BpZ,KAAKmZ,mBACJnZ,KAAKqZ,eAIZ3D,WAAWxS,GACT,MAAMW,EAA0B7D,KAAK2Y,oBAAoBW,UAAUxE,IAAQA,GAAK+D,gBAAkB3V,GAC5Fa,EAAqB/D,KAAK2Y,oBAAoB9U,GACpD,IAAKE,EACH,OAGFA,EAAmBwV,QAAU/D,KAAKC,MAElC,MAAMzR,GAAmBD,EAAmB+U,OACzCpT,OACCoP,IACEA,GAAM0E,YAAc1U,UAA0BgQ,GAAM2E,cAAgB1V,EAAmB2V,aAE1FC,KAAK,CAAC7E,GAAQ8E,MAAyD,GAA7C9E,GAAO2E,aAAeG,GAAOH,eAAoB,GAE1EzV,IACFhE,KAAK6Z,UAAU7V,IAGjBhE,KAAK2Y,oBAAoBmB,OAAOjW,EAAyB,GACjB,IAApC7D,KAAK2Y,oBAAoBhV,SAC3BoW,cAAc/Z,KAAKkZ,YACnBlZ,KAAKkZ,gBAAa,GAIdC,kBACNnZ,KAAK2Y,oBAAoB/U,QAAQV,IAC/BA,EAAmBwW,YAAclE,KAAKC,MAAQvS,EAAmB+V,UAEjE/V,EAAmB4V,OAAOlV,QAAQC,IAC5BX,EAAmBwW,aAAe7V,EAAW4V,eAC/CzZ,KAAKga,YAAYnW,GACbA,EAAW2V,YAAc1U,YAC3B9E,KAAK6Z,UAAUhW,QAOjBgW,UAAU3W,GAChBlD,KAAKyY,YAAYhP,KAAKvG,GAGtBlD,KAAK2Y,oBAAoB/U,QAAQC,IAC/BA,EAAmBiV,OAAOlV,QAAQG,IAChC,GAAIA,EAAMnC,KAAOsB,EAAWtB,GAAI,CAC9B,MAAMoC,GAAQH,EAAmBiV,OAAOmB,QAAQlW,GAChDF,EAAmBiV,OAAOgB,OAAO,EAAG9V,GAAQ,QAM5CgW,YAAY9W,GACdA,EAAWgX,aAGfhX,EAAWgX,YAAa,EAEpBhX,EAAWiX,OACb,IAAIC,MAAMlX,EAAWiX,OAAOE,OAE1BnX,EAAWoX,WACbta,KAAKua,QAAQrX,EAAWoX,YAIpBC,QAAQrX,GACVsN,OAAOgK,UAAUD,SACnB/J,OAAOgK,UAAUD,QAAQrX,2CAlHlBe,mCAAsBmP,QAAtBnP,GAAsB,qBAFrB,SCEP,MAAMI,WAA2BJ,GACtC1C,YAAmB2B,GACjBsB,QADiBxE,gBAGjBA,KAAK8Y,OAAS,CACZ,IAAI7W,EAAe,CACjBL,GAAIoE,YACJyT,aAAc,IACdV,SAAU,CAAC/S,2BACXwT,UAAWxT,UACXmU,MAAO,sEAVF9V,IAAkBzE,0CAAlByE,GAAkB+O,QAAlB/O,GAAkB,qBAFjB,4SCRF7E,EAIAgD,ECHA3C,YDDAL,MAAkB,KAC5Bib,4BAGF,SAAYlY,GACVA,kBACAA,0BACAA,oBACAA,oBAJF,CAAYC,MAAmB,KCH/B,SAAYD,GACVA,0BACAA,8BAFF,CAAY1C,MAAgB,KAKrB,MAAMyE,EAAgB,IAAK5E,QAAsBG,GCNxD,IAAYkO,EAIArL,GAJZ,SAAYH,GACVA,kBADF,CAAYwL,MAAW,KAIvB,SAAYxL,GACVA,8CADF,CAAYG,MAAoB,oECDhC,MAAM7C,EAAiB,CACrB,CAAE6a,KAAM,GAAIC,WAAY,OAAQC,UAAW,QAG3C,CACEF,KAAM,GACNG,aAAc,IAAMC,2EAA2ClL,KAAKmL,GAAKA,EAAEC,iBAQxE,MAAM1W,qGAHD9B,aAAqB3C,EAAQ,CAAEob,uBAAwB,WACvDzY,sBCLL,MAAME,EACXnB,YAAoB2Z,4BAClBlb,KAAK4W,kBAAkBjI,8CAFdjM,GAAYlD,sCAAZkD,EAAY2L,oECVzB7O,yHCCO,MAAMI,EAAmB,CAACmb,EAAaG,IAC5CH,EAAYI,oBAAoBvC,KAAKwC,GAAOF,EAAI9a,IAAI4Y,SAASoC,KAC7DF,EAAI9a,IAAI4Y,SAAS,cACjBkC,EAAI9a,IAAI4Y,SAAS+B,EAAYM,oCCOxB,MAAMha,EACXE,YAAoB2Z,sBAEpBI,UAAUJ,EAAuBE,GAC/B,GAAIF,EAAIjb,QAAQsb,IAAIja,6BAA2C,CAC7D,MAAMka,GAASN,EAAI5a,MAAM,CACvBL,QAASib,EAAIjb,QAAQwb,OAAOna,+BAE9B,OAAO8Z,EAAKM,OAAOF,IAIrB,MAAMG,EAA0BT,EAAI9a,IAAI4Y,SAAS,kBAEjD,GACEpZ,EAAiBW,IAAa2a,KAC7BS,IACD,QAAY3b,KAAKgX,YAAa,oBAAqB,SACnD,CACA,MAAMwE,GAAUN,EAAI5a,MAAM,CACxBL,QAASib,EAAIjb,QAAQ2b,IAAI,gBAAiB,UAAU5b,KAAKgX,aAAa6E,mBAAmBC,WAE3F,OAAOV,EAAKM,OAAOF,IAErB,OAAOJ,EAAKM,OAAOR,0CAxBV7Z,GAAoB7B,wCAApB6B,EAAoB+R,QAApB/R,EAAoB,6ECO1B,MAAMiK,GACX/J,eAEA+Z,UAAUJ,EAAuBE,GAC/B,IAAKxb,EAAiBW,IAAa2a,KAAS3a,4BAC1C,OAAO6a,EAAKM,OAAOR,GAGrB,GAAIA,EAAIjb,QAAQsb,IAAIja,6BAA2C,CAC7D,MAAMya,GAASb,EAAI5a,MAAM,CACvBL,QAASib,EAAIjb,QAAQwb,OAAOna,+BAE9B,OAAO8Z,EAAKM,OAAOK,IAGrB,MAAMJ,EAASpb,0BAAkC2a,EAAIhW,OAAO8W,gBAAkB,KAC9E,IAAKL,IAAWA,EAAO7H,QACrB,OAAOsH,EAAKM,OAAOR,GAGrB,IAAIM,GAAe,EACnB,OAAOJ,EAAKM,OAAOR,GAAKzJ,MACtB,OAAQkK,EAAOM,SAAW,EAAI,GAAMT,MACpC,QACGO,IACCA,GAAItK,MACF,OAAUyK,KACRV,KACA,MAAMW,GACJD,cAAiBjW,MAAqB0V,EAAOS,sBAAsBpD,SAASkD,GAAMhc,QAC9Emc,GAAmBb,IAAgBG,EAAOW,WAC1CC,GAAiBL,cAAiBlV,IACpCuV,KAEFL,GAAQ,IAAIjW,KAAkB,CAAE7F,IAAK8a,EAAI9a,IAAKH,QAASib,EAAIjb,QAASH,YAEtE,MAAM0c,GAAuBD,IAAkBZ,EAAOM,QACtD,OAAII,KAAqBF,IAAwBK,KAExC,OAAM,KAAQ,EAAI,IAAOhB,GAAe,MAE1C,OAAWU,iDAzCnB5Q,mCAAoB8H,QAApB9H,GAAoB,0BCJ1B,MAAMvB,EACXxI,YAAoB2Z,uBAEpBI,UAAUJ,EAAuBE,GAC/B,IAAKxb,EAAiBW,IAAa2a,GACjC,OAAOE,EAAKM,OAAOR,GAGrB,GAAIA,EAAIjb,QAAQsb,IAAIja,uCAAqD,CACvE,MAAMqa,EAAST,EAAI5a,MAAM,CACvBL,QAASib,EAAIjb,QAAQwb,OAAOna,yCAE9B,OAAO8Z,EAAKM,OAAOC,GAGrB,OAAOP,EAAKM,OAAOR,GAAKzJ,MACtB,OACEkK,IACMA,aAAoB1V,MACtBjG,KAAKkX,gBAAgByE,EAAS5b,MAEzB4b,GAETA,IACMA,aAAyB1V,MAE3BjG,KAAKkX,gBAAgByE,EAAc5b,SAO7CmX,gBAAgBgE,GACd,MAAME,EAAaF,GAAeA,EAAY7T,UAAY6T,EAAY7T,SAASC,WAE3E8T,GAAcA,EAAWzX,QAC3ByX,EAAWxX,QAAS+X,IAClB3b,KAAK+O,aAAa8B,MAAMwG,YAAY5N,KAAK,CACvCiC,KAAM,iBACN6L,SAAUkF,OAAOd,EAAQhQ,QACzB8L,QAASkE,6CAzCN5R,GAA4BvK,wCAA5BuK,EAA4BqJ,QAA5BrJ,EAA4B,0BCDlC,MAAMtJ,EACXc,YAAoB2Z,yBAEpBI,UAAUJ,EAAuBE,GAC/B,GAAIF,EAAIjb,QAAQsb,IAAIja,gCAA8C,CAChE,MAAMqa,EAAST,EAAI5a,MAAM,CACvBL,QAASib,EAAIjb,QAAQwb,OAAOna,kCAE9B,OAAO8Z,EAAKM,OAAOC,GAErB,GAAI/b,EAAiBW,IAAa2a,GAAM,CACtC,MAAMS,GACJ,QAAY3b,KAAKuP,eAAe1I,KAAM,qBAAuBiD,sBACzD0R,GAASN,EAAI5a,MAAM,CAAEL,QAASib,EAAIjb,QAAQ2b,IAAI,WAAYD,EAAShO,QACzE,OAAOyN,EAAKM,OAAOF,IAErB,OAAOJ,EAAKM,OAAOR,0CAhBVza,GAAuBjB,wCAAvBiB,EAAuB2S,QAAvB3S,EAAuB,gDCA9B,MAAOic,EACXnb,YACSwV,EACChI,EACAiB,EACAgH,IAHDhX,sBACCA,oBACAA,iCACAA,oBAGVsb,UAAUnU,EAAuBsC,GAC/B,IAAKkT,EAAiBrM,IAAanJ,GACjC,OAAOsC,EAAKiS,OAAOvU,GAGrB,GAAIA,EAAIlH,QAAQsb,IAAIqB,kCAAgD,CAClE,MAAMC,EAAS1V,EAAI7G,MAAM,CACvBL,QAASkH,EAAIlH,QAAQwb,OAAOmB,oCAE9B,OAAOnT,EAAKiS,OAAOmB,GAGrB,OAAOpT,EAAKiS,OAAOvU,GAAKsK,MACtBE,OACE,OACAmL,IACE,KAAMA,aAAyBC,MAC7B,OAIF,MAAMzV,GACJwV,EAAc/c,MACd+c,EAAc/c,KAAQsH,UACtByV,EAAc/c,KAAQsH,SAASC,WAEjC,GAAIA,IAAcA,GAAW3D,OAC3B,OAEF,MAAMqZ,GAAaP,OAAOK,EAAc5c,QAClC+c,GAAc,CAACD,GAAY,GAAGA,GAAWE,MAAM,IAAI,QACzD,UAAWC,MAAMF,GACf,GAAIG,wEAAiFD,IAAK,CAGrE,QAAfH,GACFhd,KAAKqd,kCAAkCzN,KACrC,KACE5P,KAAKsd,YAAYH,GAAIL,EAAc3R,SAAW6R,KAEhD,QAGFhd,KAAKsd,YAAYH,GAAIL,EAAc3R,SAAW6R,IAEhD,UAQJM,YAAYN,EAAoB7R,GACtCnL,KAAK+O,aAAa8B,MAAMwG,YAAY5N,KAAK,CACvCiC,KAAM,2BACN6L,SAAUyF,EACVvF,QAAStM,IAICkS,kCAA+B,sCAG3C,OAAO,IAAItM,QAAc,CAACjK,EAAShH,KAC7Bob,EAAKlL,0BAA0BqI,yBACjCvY,EAAM,2CAGRob,EAAKnM,aACFwO,YAAYxK,qBACZtB,MAAK+L,QAAK,IACV5L,UAAU,KACT,GAAIsJ,EAAKlE,YAAYyG,iBAKnB,OAJAvC,EAAKlL,0BAA0BqI,0BAA2B,EAE1D6C,EAAKlE,YAAY0G,WAAWjU,KAAKkU,0BACjC7W,IAGFhH,EAAM,gCAnB+B,0CArElC4c,GAAwBvJ,4EAAxBuJ,EAAwBtJ,QAAxBsJ,EAAwB,oCCQ9B,MAAM3a,EACXuZ,UAAUJ,EAAuBE,GAC/B,IAAKxb,EAAiBW,IAAa2a,GACjC,OAAOE,EAAKM,OAAOR,GAGrB,GAAIA,EAAIjb,QAAQsb,IAAIja,2CAAyD,CAC3E,MAAMqa,EAAST,EAAI5a,MAAM,CACvBL,QAASib,EAAIjb,QAAQwb,OAAOna,6CAE9B,OAAO8Z,EAAKM,OAAOC,GAGrB,GAAIT,EAAIjb,QAAQsb,IAAIzR,MAA0B,CAC5C,MAAM6R,EAA2BT,EAAIjb,QAAQ4O,IAAI/E,MAC3C0R,GAAiB7b,6BAAsCgc,GAC7D,IAAII,GAAUb,EAAIjb,QAAQwb,OAAO3R,MAE7B0R,GAAeoC,eACjBxZ,OAAOuB,KAAK6V,GAAeoC,eAAeha,QAAQuY,KAChDJ,GAAUA,GAAQjY,OAAOqY,GAAQX,GAAeoC,cAAczB,OAGlE,MAAMD,GAAShB,EAAI5a,MAAM,CACvBL,aAEF,OAAOmb,EAAKM,OAAOQ,IAAQzK,MACzB,OAAK0K,KACCA,cAAiBlW,OACnBkW,GAAQnc,KAAK6d,SAAS,CAAEzW,SAAO0W,kBAAgB3W,SAE1CgV,MAET,OAAWA,KACLA,cAAiBlW,OACnBkW,GAAQnc,KAAK6d,SAAS,CAAEzW,MAAO+U,GAAO2B,kBAAgB3W,UAEjD,OAAWgV,OAKxB,OAAOf,EAAKM,OAAOR,GAGb2C,UAAWzW,QAAO0W,iBAAgB3W,QACxC,OAAOiU,EAAerU,eAClBqU,EAAerU,eAAetE,IAAI,CAChCqb,iBACA3W,MACAC,UAEF8T,yCApDKnZ,gCAAgCqR,QAAhCrR,EAAgC,sECqGtC,MAAMmB,sGA9EA,CACT,CACE6a,QAAS9X,KACT+X,SAAU3c,EACV4c,OAAO,GAET,CACEF,QAAS9X,KACT+X,SAAUvd,EACVwd,OAAO,GAET,CACEF,QAAS9X,KACT+X,SAAUvc,EACVwc,OAAO,GAET,CACEF,QAAS9X,KACT+X,SAAUjU,EACVkU,OAAO,GAET,CACEF,QAAS9X,KACT+X,SAAUjc,EACVkc,OAAO,GAET,CACEF,QAAS9X,KACT+X,SAAU1S,GACV2S,OAAO,GAET,CAAEF,QAASve,MAAcwe,SAAU/b,KACnC,CAEE8b,QAAS5Z,MACT+Z,WAAanD,IACX,MAAMG,EAAOH,EAASoD,OAAO,CAC3BC,IAAK7d,eACL8d,mBAAmB,IAmBrB,MAAO,CACLC,MAAO,IAAIxZ,KACXyZ,KAAMrD,EACNsD,eAAgB,CACdC,WAAY,CACVC,YAAa,WACbC,YAAa,OAEf5Z,MAAO,CACL2Z,YAAa,WACbC,YAAa,UAKrBC,KAAM,CAAClb,SAEVmb,SAtFC1a,MACAzE,KACAwH,KACAjB,KACAD,aAAwB,CACtB8Y,OAAQ,CACNf,QAAS/X,KACTkY,WAbD,WAA2BnD,GAChC,OAAO,IAAI7U,IAAoB6U,EAAM,iBAAkB,WAAW7W,UAa5D0a,KAAM,CAAC3Y,oBC7Ba8Y,EASrB,MAAMnF,GACXrY,YAGE2Z,ICxBG,WAA8BH,EAAmBG,GACtD,GAAIH,EACF,MAAM,IAAIpQ,MAAM,GAAGuQ,yEDwBnBrX,CAAqBqX,EAAc,sDAN1BtB,IAAUpa,MAILoa,GAAU,+BAJfA,kCALD1W,EAAkBV,KAAcF,cAAwBC,QEA7D,MAAMyc,4EAASC,WAFRvc,kCADF4B,EAAkBsV,GAAYtX,OCNtC/B,iBACF,WAGFb,OACGwf,gBAAgBF,IAChBpP,KAAKmL,IACJvK,OAAO2O,aAAkBpE,EAAOxM,WAEjC6Q,MAAMrE,GAAOjQ,QAAQyF,IAAIwK,IAExB,kBAAmBP,WAAaja,2BAClCia,UAAUpO,cAAciT,SAAS,wcCT5B,MAAMzf,EAKX2B,YAAmB0F,uBAHVjH,cAA6B,OAC7BA,uBAAoB,OAI7BoO,mDAPWxO,GAAmB4C,sCAAnB5C,EAAmByO,+hBCThC7L,iBAC+L,SAE3LA,wBAQAA,iBACEA,SACFA,UAEFA,iBACEA,wBAQAA,iBACEA,wBAOFA,YAGJA,iBAA8D,UAIvCA,uBAAUA,iBAtC/BA,iKAIIA,gFAA+D,mVAO/DA,+DAMAA,iFAAgE,mVAS9DA,0TAUJA,0DAA+C,miDC7B5C,MAAMA,EAoBXjB,YAAoB+C,wBAnBpBtE,wBAAqB,CACnB0D,GAAI,CAAE9B,GAAI,WAAY6J,MAAO,iBAAkB6T,YAAa,gBAAiBC,WAAY,MACzFC,GAAI,CACF5d,GAAI,WACJ6J,MAAO,kCACP6T,YAAa,iCACbC,WAAY,MAEdE,GAAI,CACF7d,GAAI,WACJ6J,MAAO,4BACP6T,YAAa,yBACbC,WAAY,MAEdG,GAAI,CAAE9d,GAAI,WAAY6J,MAAO,iBAAkB6T,YAAa,gBAAiBC,WAAY,SACzFI,GAAI,CAAE/d,GAAI,WAAY6J,MAAO,0BAAwB6T,YAAa,oBAAqBC,WAAY,OAErGvf,yBAA2BA,KAAK4f,mBAAmBF,GAInDtR,WACEpO,KAAK6f,oBACH7f,KAAK4f,mBAAmB5f,KAAK8f,cAAcC,OAAOpS,OAAS3N,KAAK4f,mBAAmBF,GAErF1f,KAAKggB,kBAGPA,kBACExP,OAAOyP,KAAUzP,OAAOyP,MAAW,GACnCzP,OAAOyP,KAAQC,gBAAqB,CAClCC,0BAA0B,EAC1BC,4BAA4B,EAC5BC,kBAAkB,EAClBC,YAAY,EACZC,iCAAkC,eAClCC,6BAA6B,EAC7BC,mBAAmB,EACnBC,OAAQ,QACRC,YAAY,EACZC,eAAgB5gB,KAAK6f,oBAAoBje,GACzCif,KAAM7gB,KAAK6f,oBAAoBN,WAC/BuB,OAAQ,CACNC,yBAA0B,UAC1BC,kBAAmB,UACnBC,qBAAqB,EACrBC,gBAAiB,UACjBC,mBAAmB,EACnBC,qBAAsB,UACtBC,eAAgB,UAChBC,oBAAoB,EACpBC,4BAA6B,UAC7BC,qBAAsB,UACtBC,wBAAwB,EACxBC,oBAAoB,EACpBC,cAAc,EACdC,KAAM,KACNC,SAAU,SACVC,yBAA0B,UAC1BC,kBAAmB,UACnBC,qBAAqB,EACrBC,UAAW,YAIf,MAAM3d,EAAO8M,SAASkD,cAAc,UACpChQ,EAAK4d,aAAa,OAAQ,mBAC1B5d,EAAK4d,aAAa,MAAO,qCACzB9Q,SAASrR,KAAKkU,YAAY3P,GAE1B,MAAMyJ,EAAaqD,SAASkD,cAAc,UAC1CvG,EAAWmU,aAAa,OAAQ,mBAChCnU,EAAWmU,aAAa,MAAO,sCAC/B9Q,SAASrR,KAAKkU,YAAYlG,0CA1EjBvL,GAAehD,qCAAfgD,EAAe6L,6gBCR5B7O,oBACEA,iBAEAA,kBACEA,2DACAA,eAEuCA,SAA8BA,QACrEA,kBAAoB,SAG4BA,SAAoCA,qBANjFA,oIAEDA,4EAAqCA,6EAInCA,2FAA4CA,ybCH7C,MAAM8E,EACX/C,YACUH,EACAiB,GADArC,gBACAA,4BAGVyW,KAAKrV,GACH,SAAe+gB,iBAAmBniB,KAAKoiB,SAASC,wBAAwBjhB,EAAekhB,WAChFtiB,KAAKuiB,qBAAqB9L,KAAKrV,GAGxCohB,MAAMphB,GACJpB,KAAKuiB,qBAAqBC,MAAMphB,0CAZvBkD,GAAqBzE,oDAArByE,EAAqB8O,QAArB9O,EAAqB,qBAFpB9E,uHCHVK,oBACEA,0DAASA,iCAGTA,oBAAUA,gBAAIA,+EAmBhBA,eAEiD,UACzCA,SAAcA,oCADpBA,2CACMA,kHAfVA,iBACgE,QADhEA,CACgE,UAGtDA,gBAAIA,UAGZA,eAC8B,UACtBA,oBAAQA,UAGhBA,qBAKFA,8BAdIA,wCAKAA,wCAKkBA,uDChBjB,MAAMwB,EACXE,YAAmBH,EAAmCiB,GAAnCrC,oBAAmCA,6BAEtDoO,YAEAqU,qBACEziB,KAAK0iB,sBACFjM,KAAK,CACJ6L,UAAW5f,IACXigB,cAAe,CACbC,OAAQ5iB,KAAK+O,aAAa8B,MAAM+R,QAElCC,eAAgB,CACdC,KAAMpjB,UACNmiB,SAAUniB,aAGbkS,UAAU,+CAjBJvQ,GAAexB,+CAAfwB,EAAegN,urBDX5BxO,yBACkB,WAEdA,0BAMAA,iBAGFA,QAEAA,uBAkBFA,eA3BOA,8EAKDA,wCAKDA,m1BEqBE,MAAM4B,EAAmB,CAC9Be,KACA8B,KACAyJ,KACArL,KACAH,KACAD,KACA2D,KACAD,KACAkB,KACA3G,KACAX,KACAsO,IACAjH,KACA3F,KACA4E,KACA7E,KACA2F,KACA5F,KACAiB,KACA6D,KACAH,KACAwC,MACA+C,MACAhD,KACA+C,KACAtB,KACAtJ,KACAsiB,MACAjX,MACAnM,KACAmK,KACAjK,yECpEFoC,SACEA,iBAA4B,UAA5BA,CAA4B,WAGtBA,iBAA2B,UAA3BA,CAA2B,WAG7BA,YAGNA,SCEO,MAAMyB,GAIXnC,YAAoByhB,wBAHpBhjB,oBAAgB,EAKhBoO,WACEpO,KAAKiP,cAAcgU,eAAerR,UAAWoR,IAC3C,OAAQA,EAAalhB,aACdH,UACH3B,KAAKkjB,WAAaF,EAAanc,KAC/B7G,KAAKsW,OACLtW,KAAKiP,cAAckU,WAAY,EAC/B,WACGxhB,UACH3B,KAAKkjB,gBAAa,EAClBljB,KAAKojB,OACLpjB,KAAKiP,cAAckU,WAAY,KAMvC7M,OACE+M,WAAW,IAAOrjB,KAAKsjB,eAAgB,GAGzCF,OACEC,WAAW,IAAOrjB,KAAKsjB,eAAgB,2CA5B9B5f,IAAmBzB,uCAAnByB,GAAmB2K,qMDZhCpM,sCAAeA,kkCEcR,MAAM4B,EAsBXtC,YAAoByhB,8BAjBpBhjB,uBAAoB2B,aAIpB3B,aAA6B,GAM7BA,2BAAwBkD,KAExBlD,iBAAc,IAAIqE,MAAmB,MAC7BrE,kBAA6B,IAAIsD,IAMzC8K,WACEpO,KAAKujB,YAAcvjB,KAAKkQ,oBAAoBsT,eAAexjB,KAAKyjB,iBAAkBzjB,KAAK0jB,mBAEvF1jB,KAAK2jB,sBAAwB3jB,KAAKkQ,oBAAoBsT,eACpDxjB,KAAKyjB,iBACL9hB,iBAGF3B,KAAS4jB,cACP5jB,KAAK6jB,eAGL7jB,KAAK8jB,aAAe9jB,KAAKkQ,oBAAoB6T,eAAe/jB,KAAKyjB,kBAAkB7R,UAAU,KAC3F5R,KAAK6jB,mBAMP7jB,KAAKujB,YAAY1c,KAAKjB,SAAW5F,KAAKgkB,OAAOvgB,MAAMmC,SACnD5F,KAAKikB,kBAGLjkB,KAAK8jB,aAAe9jB,KAAKkQ,oBAAoB6T,eAAe/jB,KAAKyjB,kBAAkB7R,UAAU,KAC3F5R,KAAKikB,qBAMXC,kBAAkBlB,GAChBhjB,KAAKujB,YAAY1c,KAAOmc,EAAMvf,MAAMmC,SAAWod,EAAMvf,WAAQ,EAC7DzD,KAAKmkB,gBAIPxK,KAAKqJ,GACH,OAAQA,EAAOvf,MAAMoC,gBACd3C,SACHlD,KAAKujB,YAAY1c,KAAKhB,UAAY3C,UAClC,WACGA,UACHlD,KAAKujB,YAAY1c,KAAKhB,UAAY3C,eAClC,WACGA,eACHlD,KAAKujB,YAAY1c,KAAKhB,UAAY3C,SAGtClD,KAAKikB,kBACLjkB,KAAKmkB,gBAGPP,aACE,OAAO5jB,KAAKokB,QAAQzgB,OAAS,EAGvBkgB,eACN,MAAMb,EAAOhjB,KAAKujB,YAAY1c,KAC9B,GAAImc,EAAM,CACR,MAAMqB,EAAcrkB,KAAKokB,QAAQE,KAC/BC,IAAQA,GAAK9gB,MAAMmC,WAAaod,EAAKpd,UAAY2e,GAAK9gB,MAAMoC,YAAcmd,EAAKnd,WAE7Ewe,GACFrkB,KAAKwkB,YAAYC,WAAWJ,EAAY5gB,QAKtCwgB,kBAENjkB,KAAKgkB,OAAOvgB,MAAMoC,UAAY7F,KAAKujB,YAAY1c,KAAKhB,WAAa3C,eAG3DihB,gBACNnkB,KAAKkQ,oBAAoB4B,SAAS,KAChC9R,KAAK2jB,sBAAsBe,SAC1B1kB,KAAKyjB,kBAGVkB,cACE3kB,KAAK8jB,aAAac,qDAxGT/gB,GAAiB5B,sCAAjB4B,EAAiBwK,2PCL1BpM,wBAEEA,8BACFA,kCAHYA,uBAEVA,0KAXNA,4BAIuB,eACVA,8BAAwCA,QACnDA,wBACEA,qEAAmBA,sDAEnBA,+BAIFA,kCAXAA,yCAAmC,sCAGxBA,mDACCA,iEAEVA,mCAEqBA,2DAYrBA,oBAAuEA,wBAAYA,+BACnFA,oBAAwEA,0BAAcA,iDAP1FA,SACEA,oBAGEA,0DAASA,4BACTA,8BACAA,4BACAA,4BACFA,QACFA,gCAPIA,gCAGAA,kDACWA,8EACAA,gFCdR,MAAMuZ,WAA6B3X,EAL1CtC,kCAQWvB,kBAAc,uEAHZwb,MAAoB6I,GAApB7I,oCAAoBnN,ycDTjCpM,mCAgBAA,uCAhBiBA,6BAgBFA,6mBEKR,MAAMka,GASX5a,YACUyhB,EACAqB,EACAE,GACAM,GACA9F,GAJA/e,eACAA,mBACAA,iBACAA,6BACAA,oBAXVA,YAAmC,GAGnCA,kBAA6B,IAAIsD,IAWjC8K,WACEpO,KAAK8kB,OAAS9kB,KAAK8kB,QAAU,GACxB9kB,KAAK8kB,QAAW9kB,KAAK8kB,OAAOhjB,QAK5B9B,KAAK8kB,OAAOhC,OACf9iB,KAAK8kB,OAAOhC,KAAOnhB,aAErB3B,KAAK+kB,aACL/kB,KAAKglB,yBARHhlB,KAAKilB,kBAWDF,aACN,MAAM/B,EAAOhjB,KAAK8kB,OAAOI,UACpBllB,KAAKmlB,qBAAqBC,KAAKplB,KAAK8kB,OAAOhjB,OAAQ9B,KAAK8kB,OAAOje,MAChE7G,KAAKmlB,qBAAqBC,KAAKplB,KAAK8kB,OAAOhjB,OAAQ9B,KAAK8kB,OAAOje,MAEnE,OAAQ7G,KAAK8kB,OAAOhC,WACbnhB,YACCqhB,GACFhjB,KAAKqlB,qBACLrlB,KAAKslB,cAAc,YACVtlB,KAAKulB,iBACdvlB,KAAKulB,eAAeC,UACpBxlB,KAAKulB,oBAAiB,GAExB,WACG5jB,eAEH,GADA3B,KAAKqlB,sBACArlB,KAAKylB,sBACR,OAEFpC,WAAW,KACLL,EACFhjB,KAAKslB,cAAc,WACVtlB,KAAKulB,gBACdvlB,KAAKslB,cAAc,WAEpB,GACH,WACG3jB,cAEH,GADA3B,KAAKqlB,sBACArlB,KAAKylB,sBACR,OAEFpC,WAAW,KACJL,EAGHhjB,KAAK0lB,SAASC,gBAAgB3lB,KAAK4lB,cAAe,YAFlD5lB,KAAK0lB,SAASxD,aAAaliB,KAAK4lB,cAAe,WAAY,QAI7D5lB,KAAKslB,cAAc,YAClB,GACH,WACG3jB,eAEH,GADA3B,KAAKqlB,sBACArlB,KAAKylB,sBACR,OAEFpC,WAAW,KACJL,EAGHhjB,KAAK0lB,SAASC,gBAAgB3lB,KAAK4lB,cAAe,YAFlD5lB,KAAK0lB,SAASxD,aAAaliB,KAAK4lB,cAAe,WAAY,QAI7D5lB,KAAKslB,cAAc,YAClB,IAKDD,qBACN,MAAMrC,EAAwBhjB,KAAKilB,kBACnCjlB,KAAK4lB,cAAgB5C,EAAiB6C,UAAU,GAC5C7lB,KAAKylB,wBACPzlB,KAAK0lB,SAASI,SAAS9lB,KAAK4lB,cAAe,kBAC3C5lB,KAAKslB,cAAc,WAIfA,cAActC,GAChBhjB,KAAKylB,uBACPzlB,KAAK0lB,SAASK,SAAS/lB,KAAK4lB,cAAe,aAAc5C,GAIrDiC,kBACN,OAAKjlB,KAAKulB,iBACRvlB,KAAKulB,eAAiBvlB,KAAKgmB,QAAQX,mBAAmBrlB,KAAKimB,YAAa,KAGnEjmB,KAAKulB,eAGNE,sBACN,YAAwC,IAAjCzlB,KAAK4lB,cAAcM,UAGpBlB,yBACDhlB,KAAK8kB,OAAOqB,uBAAyBnmB,KAAK8kB,OAAOqB,qBAAqBxiB,QAI3E3D,KAAK8jB,aAAasC,IAChBpmB,KAAK+O,aAAasX,OACf5U,MACC,QAAOuR,GAAShjB,KAAK8kB,OAAOqB,qBAAqBnN,SAASgK,EAAMlhB,UAChE,QAAI,IAAM9B,KAAK+kB,eAEhBnT,aAIP+S,cACE3kB,KAAK8jB,aAAac,sDArITzI,IAA0Bla,0FAA1Bka,GAA0B9N,yFCfhC,MAAMgO,GAMX9a,YAAoByhB,6BAFZhjB,wBAAoB,EAI5BoO,WACEpO,KAAKsmB,aAAetmB,KAAKumB,eAGCC,aAC1BxmB,KAAKymB,mBAAoB,EACzBzmB,KAAK0mB,mBAAmBhO,QAAQ1Y,KAAKsmB,cAGbK,WACxB3mB,KAAKymB,mBAAoB,EACzBzmB,KAAK0mB,mBAAmBhR,WAAW1V,KAAKsmB,cAGbM,cAC3B5mB,KAAKymB,mBAAoB,EACzBzmB,KAAK0mB,mBAAmBhR,WAAW1V,KAAKsmB,cAGfO,YACrB7mB,KAAKymB,mBAGTzmB,KAAK0mB,mBAAmBhO,QAAQ1Y,KAAKsmB,cAGdQ,UACnB9mB,KAAKymB,mBAGTzmB,KAAK0mB,mBAAmBhR,WAAW1V,KAAKsmB,sDAtC/BjK,IAAuBpa,uCAAvBoa,GAAuBhO,0GAAvBgW,iBAAY,6BAAZA,eAAU,gCAAVA,kBAAa,8BAAbA,gBAAW,4BAAXA,qJCcb,MAAM0C,GAAiB,CAACvnB,IAAoBE,KAAc+B,ERoD/B,IQjDzBqD,KACAb,KAIAsY,KACAC,KACAwK,KACAC,KACAC,KACAC,KACAC,KACAC,KAUK,MAAMC,GAAYC,iBAErB,MAAO,CACLC,SAAUF,GACVG,UAAW,4CAJJH,gEALEP,GApBSvnB,IAAoBE,KAAc8C,yXCMtDA,eAEEA,yDAASA,0BAETA,cAAIA,SAAcA,sCADlBA,2CACIA,yFCpBH,MAAM0E,EAGX3F,YAAoB3B,gCAFpBI,YAAkB,GAIlBoO,WACEpO,KAAK4iB,OAAS5iB,KAAK0iB,sBAAsBgF,aAAaC,SAAS/E,OAGjEgF,eACE5nB,KAAK0iB,sBAAsBF,MAAM,CAAEtiB,OAAQV,oDAVlC0H,GAAgB1E,qCAAhB0E,EAAgBmH,+hBDV7B7L,iBAAsC,kBAAtCA,CAAsC,WAIhCA,iBAEAA,oBAEEA,gCAAS0L,mBACT1L,oBAAUA,iBAAKA,cAIrBA,iBAAgG,SAE5FA,gCAAS0L,mBAET1L,cAAIA,iBAAIA,UAGVA,gBACEA,gCAAS0L,mBAET1L,eAAIA,qBAAQA,UAGdA,sBAMFA,iBAhBIA,wCAMAA,wCAKkBA,6gBEzBpB9C,iBAGEA,wBAOFA,sDATEA,6DAIEA,qMAOJA,eAEEA,yDAASA,2BAAiBA,kBAACA,iDAC7BA,eAEEA,yDAASA,2BAAiBA,kBAACA,iDAM7BA,mBAEEA,kEAASA,wBACoCA,2CAF7CA,yEAJJA,qBAGEA,yBAIFA,8BADsBA,oCCpBjB,MAAMsG,EAIXzE,cAFAvB,iBAAc,EAIdoO,YAEAyZ,gBACM7nB,KAAK8nB,YACP9nB,KAAK8nB,cAEL9nB,KAAK8nB,YAAc9nB,KAAK+nB,OAAOpkB,OAAS,EAI5CqkB,gBACEhoB,KAAK8nB,aAAe9nB,KAAK8nB,YAAc,GAAK9nB,KAAK+nB,OAAOpkB,OAG1DskB,UAAU1nB,GACRP,KAAK8nB,YAAcvnB,yCArBVyF,8BAAkBqI,+jBDR/B3O,iBAA0D,gBAEtDA,wBAYAA,qBAGAA,qBAGFA,QAEAA,uBAQFA,eA1BwBA,mCAWjBA,+DAGAA,+DAKFA,61CEpBE,MAAeG,EAOpB0B,YAAY2M,EAAc,IACxB9J,OAAO/D,OAAOL,KAAMkO,GAChBA,IAG4B,iBAArBA,EAAOga,YAChBloB,KAAKkoB,UAAY,IAAIxoB,KAAKwO,EAAOga,YAEF,iBAAtBha,EAAOia,aAChBnoB,KAAKmoB,WAAa,IAAIzoB,KAAKwO,EAAOia,cAMlC7nB,YACF,OAAOkC,IAAUxC,KAAKsJ,YAGxB8e,cAAcla,GACZ,KAAKA,GAAUA,aAAgBsH,MAC7B,MAAO,GAGT,MAAMvO,EAAWiH,EAAKma,WAAa,EAC7B/mB,EAAQ2F,EAAW,GAAK,IAAIA,IAAaA,EACzC5F,EAAM6M,EAAKoa,UAAY,GAAK,IAAIpa,EAAKoa,YAAcpa,EAAKoa,UAC9D,MAAO,GAAGpa,EAAKqa,iBAAiBjnB,KAASD,KCnCtC,MAAMiD,UAAazE,EAIxB0B,YAAY2M,EAAO,IACjB1J,MAAM0J,GAEJ5E,iBACF,MAAO,CACL1H,GAAI5B,KAAK4B,GACT4mB,UAAWxoB,KAAKwoB,UAChBC,SAAUzoB,KAAKyoB,SACfhc,MAAOzM,KAAKyM,OAIZic,kBACF,OAAO,iBCdJ,MAAMhmB,UAAcqL,IAMzBxM,YAAY2M,GACV1J,MAAM0J,ICRH,MAAM5L,UCCN,MAAMC,EAQXhB,YAAY2M,EAA6B,IACvC9J,OAAO/D,OAAOL,KAAMkO,KDPtB3M,YAAY2M,GACV1J,MAAM0J,kBELH,MAAMjI,UAAcpG,EAQzB0B,YAAY2M,EAAO,IACjB1J,MAAM0J,GAEFlO,KAAK2oB,UACP3oB,KAAK2oB,QAAU,IAAIC,IAAI5oB,KAAK2oB,QAASziB,YAAoB2iB,MAGvD7oB,KAAK8oB,aACP9oB,KAAK8oB,WAAa,IAAIF,IAAI5oB,KAAK8oB,WAAY5iB,YAAoB2iB,MAG7D7oB,KAAK+oB,SACP/oB,KAAK+oB,OAAS,IAAIH,IAAI5oB,KAAK+oB,OAAQ7iB,YAAoB2iB,MAGrD7oB,KAAKgpB,YACPhpB,KAAKgpB,UAAY,IAAIJ,IAAI5oB,KAAKgpB,UAAW9iB,YAAoB2iB,MAK7Dvf,iBACF,MAAO,CACL1H,GAAI5B,KAAK4B,GACTqnB,SAAUjpB,KAAKipB,SACfN,QAAS3oB,KAAK2oB,QACdG,WAAY9oB,KAAK8oB,WACjBC,OAAQ/oB,KAAK+oB,OACbC,UAAWhpB,KAAKgpB,UAChBE,SAAUlpB,KAAKkpB,WCrCd,MAAMljB,UAAcnG,EASzB0B,YAAY2M,EAAY,IACtB1J,MAAM0J,GAEFA,EAAKib,aACPnpB,KAAKmpB,WAAa,IAAIljB,EAAMiI,EAAKib,aAE/Bjb,EAAKkb,aACPppB,KAAKopB,WAAa,IAAInjB,EAAMiI,EAAKkb,aAE/Blb,EAAKmb,QACPrpB,KAAKqpB,MAAQ,IAAIpjB,EAAMiI,EAAKmb,QAK5B/f,iBACF,MAAO,CACL1H,GAAI5B,KAAK4B,GACT+L,KAAM3N,KAAK2N,KACXpJ,KAAMvE,KAAKuE,KACX+kB,SAAUtpB,KAAKspB,SACfC,YAAavpB,KAAKupB,YAClBJ,WAAYnpB,KAAKmpB,WACjBC,WAAYppB,KAAKopB,WACjBC,MAAOrpB,KAAKqpB,QCjCX,MAAMniB,UAAerH,EAG1B0B,YAAY2M,EAAY,IACtB1J,MAAM0J,GAENA,EAASsb,SACPxpB,KAAKwpB,SAAWtb,EAAKsb,SAAS/mB,IAAIwE,GAAQ,IAAIhB,EAAMgB,IAEpDjH,KAAKwpB,SAAW,GAKhBlgB,iBACF,MAAO,CACL1H,GAAI5B,KAAK4B,GACT4nB,SAAUxpB,KAAKwpB,WCjBd,MAAMjpB,UAAgBV,EA4B3B0B,YAAY2M,EAAY,IACtB1J,MAAM0J,GAENA,EAASub,WACPzpB,KAAKypB,WAAavb,EAAKub,WAAWhnB,IAAIwE,IAAS,IAAKA,EAAMoiB,MAAO,IAAIpjB,EAAMgB,EAAKoiB,UAEhFrpB,KAAKypB,WAAa,GAGfvb,EAAKwb,mBACR1pB,KAAK0pB,iBAAmB,IAGrBxb,EAAKyb,qBACR3pB,KAAK2pB,mBAAqB,IAK1BrgB,iBACF,MAAO,CACL1H,GAAI5B,KAAK4B,GACTgoB,QAAS5pB,KAAK4pB,QACdC,IAAK7pB,KAAK6pB,IACVpe,MAAOzL,KAAKyL,MACZqe,UAAW9pB,KAAK8pB,UAChBC,QAAS/pB,KAAK+pB,QACdN,WAAYzpB,KAAKypB,WACjBC,iBAAkB1pB,KAAK0pB,iBACvBC,mBAAoB3pB,KAAK2pB,6TC7CxB,MAAM/pB,EACX2B,YAAoByoB,uBAGpBC,sBAAsBD,GACpB,OAAQhqB,KAAKkqB,UAAUF,EAAe,iBAA+CxhB,gBACnFwhB,GAKJG,yBAAyBH,GACvB,OAAQhqB,KAAKkqB,UAAUF,EAAe,iBAA+C9gB,mBACnF8gB,GAKJI,YAAYJ,EAAoCK,GAM9C,OAL0DrqB,KAAKkqB,UAC7DF,EACA,kBAC+BvnB,IAAIunB,EAAeK,GAOtDrgB,iBACEggB,EACAK,GAOA,OALwBrqB,KAAKkqB,UAC3BF,EACA,kBAC+BhgB,iBAAoBggB,EAAeK,GAMtEjgB,oBACE4f,EACAK,GASA,OALwBrqB,KAAKkqB,UAC3BF,EACA,kBAC+B5f,oBAAuB4f,EAAeK,GAKzEC,oBAAoBN,GAKlB,OAAO,QAAG,CACRpe,OAAQ,CACN,CACET,QAAS6e,EAAY7e,YAM7Bof,kBAAkBP,GAShB,IAAIK,EAEJ,OAVAL,EAAkB3iB,SAASC,WAAW1D,QAAQ4mB,GAC5CxqB,KAAK+O,aAAa8B,MAAMwG,YAAY5N,KAAK,CACvCiC,KAAM,iBACN6L,SAAUiT,EAAU7e,OACpB8L,QAAS+S,KAMTR,EAAkB3iB,SAASC,WAAW3D,SACxC0mB,EAAeL,EAAkB3iB,SAASC,WACvC5B,OAAO8kB,GAAgC,UAAnBA,EAAU9e,MAC9BjJ,IAAI+nB,GAASA,EAAMrf,SACnBhG,KAAK,MACJklB,IACFvf,QAAQyF,IAAI8Z,IACL,OAAW,IAAI1f,MAAM0f,MAGzB,QAAGL,GAGZS,yBAAyBT,EAAcK,EAAgCG,GACrE,OAAIH,GACFjmB,OAAO/D,OAAOgqB,EAAgCG,IAEzC,OAAWR,GAGZE,UACNF,EACAK,GAEA,MAAMG,EAAqBR,EAAcU,WAAanqB,iCAChDoqB,EAASpqB,6BAAsCiqB,GACrD,IAAKG,EACH,MAAM,IAAIhgB,MAAM,sBAElB,OAAOggB,EAAON,kBCnHX,MAAepjB,EAOpB1F,YAAsByoB,mBACpBhqB,KAAK4qB,OAAS5qB,KAAKuO,SAASM,IAAYnP,MACxCM,KAAKiP,cAAgBjP,KAAKuO,SAASM,IAAmBX,MACtDlO,KAAK+O,aAAe/O,KAAKuO,SAASM,IAAkBX,MACpDlO,KAAK6qB,wBAA0B7qB,KAAKuO,SAASM,IAA6B3H,KAE1ElH,KAAK8qB,aAGAC,wBAAwBf,EAAgCK,EAAc,GAC3E,IAAKL,EAAYrmB,OACf,OAAO,aAAG,GAEZ,MAAM6mB,EAAY,GACZG,EAAS,GAiBTK,GAAwBhB,EAb3BvnB,IAAIwoB,IACHA,GAAIxZ,MACF,OAAWyZ,KACTlrB,KAAK6qB,wBAAwBnP,OAAOwP,IACpCP,EAAOpnB,KAAK2nB,KACL,SAAG,MAEZ,OAAIA,KACFV,EAAUjnB,KAAK2nB,QAIpBrf,OAAO,CAACof,GAAGC,GAAGC,MAAOA,GAAId,EAAcY,GAAEA,GAAEtnB,OAAS,GAAGJ,KAAK2nB,IAAKD,GAAE1nB,KAAK,CAAC2nB,OAAQD,GAAG,IACtCxoB,IAAIwoB,KAAqB,OAASA,KAE7EG,IAAa,SAAG,GAAM3Z,MAC1B,OAAU,IACJkZ,EAAOhnB,QACF,OAAW,CAAEiI,SAAQyf,eAEvB,QAAGb,KAMd,OAAO,UAAUQ,IAAuBvZ,MACtC,OAAS,IACT,OAAU,IAAM2Z,KAIVrmB,MAASilB,GACjB,MAAMK,EAAUrqB,KAAKsrB,OAAOrB,sBAAsBD,GAClD,OAAOhqB,KAAK4qB,OAAO7lB,MAAMslB,GAAS5Y,MAEhC,OAAW+Y,GAAexqB,KAAKsrB,OAAOhB,oBAAoBE,KAG1D,OAAIA,GAAmBxqB,KAAKsrB,OAAOlB,YAAYJ,EAAeQ,KAI9D,OAAUA,GAAqBxqB,KAAKsrB,OAAOf,kBAAkBC,KAE7D,OAAIA,GAAqBxqB,KAAKsrB,OAAOthB,iBAAoBggB,EAAeQ,KACxE,OAAS,KAAOR,EAAcuB,mBAAqBvrB,KAAKiP,cAAcmU,SAIhEoI,OACRxB,EACAK,GAQA,IAAIG,EAAc,GACdH,IACFG,EAAcxqB,KAAKyrB,qBAAqBpB,EAAgCL,EAAcjqB,MACtFqE,OAAO/D,OAAOgqB,EAAgCL,EAAcjqB,OAG9D,MAAM4qB,EAAU3qB,KAAKsrB,OAAOnB,yBAAyBH,GACrD,OAAO,OAMLhqB,KAAK4qB,OAAOY,OAAOb,IACnBlZ,MACA,OAAWia,GAAe1rB,KAAKsrB,OAAOhB,oBAAoBoB,KAC1D,OAAIA,GAAmB1rB,KAAKsrB,OAAOlB,YAAYJ,EAAe0B,KAC9D,OAAIA,GAAqB1rB,KAAKsrB,OAAOlhB,oBAAuB4f,EAAe0B,KAC3E,OAAUA,GAAqB1rB,KAAKsrB,OAAOf,kBAAkBmB,KAE7D,OAAWA,GACT1rB,KAAKsrB,OAAOb,yBAAyBiB,EAAOrB,EAAgCG,KAE9E,OAAS,KAAOR,EAAcuB,mBAAqBvrB,KAAKiP,cAAcmU,SAKhEuI,cAEFF,qBAAqBzB,EAAqBK,GAChD,MAAMG,EAAc,GACpB,cAAO7kB,KAAK0kB,GAAWzmB,QAAQ+mB,GAAQH,EAAYG,GAAOX,EAAeW,IAClEH,EAGDM,aACN9qB,KAAKsrB,OAAS,IAAI1rB,EAAkBI,KAAK+O,6BCvHtC,MAAM1N,UAAsB4F,EACjC1F,YAAmByoB,GACjBxlB,MAAMwlB,GADWhqB,gBAInB4rB,eAAe5B,EAAqC,IAClD,SAAc3f,YAAc,iBAC5B2f,EAAcjlB,MAAQrF;;;;;;;;;;;;;;;MAiBf8E,MAAMO,MAAcilB,0CAxBlB3oB,GAAaC,yCAAbD,EAAa+R,QAAb/R,EAAa,qBAHZ,uBCMP,MAAMD,UAAsB6F,EACjC1F,YAAmByoB,GACjBxlB,MAAMwlB,GADWhqB,gBAInB6rB,aAAa7B,GACX,OAAIhqB,KAAK+O,aAAa8B,MAAM+R,QAC1B5iB,KAAK+O,aAAa+C,SAASuY,IACzBA,EAAMyB,QAAU9B,GACfhjB,oBACI,QAAGhH,KAAK+O,aAAa8B,MAAM+R,OAAO0B,KAAK+F,GAASA,EAAMzoB,KAAOooB,KAE7DhqB,KAAK+rB,kBAAkBta,MAC5B,OAAI4Y,IACF,MAAMG,EAASH,EAAIzjB,QACnB,YAAKmI,aAAa+C,SAAS6Y,IACzBA,EAAM/H,OAAS4H,GACdxjB,iBACHhH,KAAK+O,aAAa+C,SAAS6Y,IACzBA,EAAMmB,QAAU9B,GACfhjB,mBAEIhH,KAAK+O,aAAa8B,MAAM+R,OAAO0B,KAAKqG,GAASA,EAAM/oB,KAAOooB,MAMzE+B,gBAAgB/B,EAAqC,IACnD,SAAc3f,YAAc,kBAC5B2f,EAAcjlB,MAAQrF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAyCf8E,MAAMO,MAAeilB,0CAvEnB5oB,GAAaE,yCAAbF,EAAagS,QAAbhS,EAAa,qBAHZ,SCAP,MAAMiB,UAAwB4E,EACnC1F,YAAmByoB,GACjBxlB,MAAMwlB,GADWhqB,gBAInBgsB,WAAWhC,EAAqC,IAC9C,SAAc3f,YAAc,aAC5B2f,EAAcjlB,MAAQrF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAsCf8E,MAAMO,MAAeilB,GAI9BiC,kBAAkBjC,EAAqC,IACrD,SAAc3f,YAAc,oBAC5B2f,EAAcjlB,MAAQrF;;;;;;;;;;;;;;;;;;;;MAsBf8E,MAAMO,MAAiBilB,0CAzErB3nB,GAAef,yCAAfe,EAAe+Q,QAAf/Q,EAAe,qBAHd,8hBCiBR,MAAgB6pB,EAkBpB3qB,YAAsBgN,mBAjBdvO,4BAAyB,EACzBA,yBAAsB,EACtBA,qBAAkB,IAG1BA,kBAAe,IAAImsB,MAKnBnsB,+BAA4B,GAQ1BA,KAAKmP,OAASnP,KAAKuO,SAASM,IAAIO,MAEhCiU,WAAW,KACTrjB,KAAK4W,kBAAoB5W,KAAKuO,SAASM,IAAI8G,OAC1C,GACH3V,KAAKosB,aAAepsB,KAAKuO,SAASM,IAAIwd,MACtCrsB,KAAK+O,aAAe/O,KAAKuO,SAASM,IAAIG,MACtChP,KAAK6W,iBAAmB7W,KAAKuO,SAASM,IAAIC,MAC1C9O,KAAK6qB,wBAA0B7qB,KAAKuO,SAASM,IAAIyd,KACjDtsB,KAAKuP,eAAiBhB,EAASM,IAAIW,MAEnCxP,KAAK0d,WAAa,IAAIyO,MAElBnsB,KAAKusB,gBACPvsB,KAAKwsB,uBAMTC,kBAAkBC,IAClBC,gBAAgBC,IAEZ/Q,wBACF,GAAI7b,KAAK6sB,mBACP,OAAO7sB,KAAK6sB,mBAEd,MAAMC,EAAWpY,aAAaC,QAAQ,GAAGrE,6BACzC,OAAIwc,GACF9sB,KAAK6sB,mBAAqBtnB,KAAKsP,MAAMiY,GAC9B9sB,KAAK6sB,yBAFd,EAOEhR,sBAAkBA,GAEpB7b,KAAK+O,aAAa+C,SAAS,KACpB+J,GAKH7b,KAAK6sB,mBAAqBhR,EAC1BnH,aAAaqY,QAAQ,GAAGzc,4BAAqC/K,KAAKC,UAAUqW,IAC5E7b,KAAKwsB,yBANLQ,aAAahtB,KAAKitB,qBAClBvY,aAAagB,WAAW,GAAGpF,6BAC3BtQ,KAAK6sB,wBAAqBhZ,IAM3Bd,qBAGDma,iBACF,MAAO,CACLC,UAAWntB,KAAKyd,iBAChB2P,WAAYptB,KAAKqtB,mBAIrBC,OAAOC,GACLvtB,KAAK6b,kBAAoB7b,KAAKwtB,YAAYD,GAC1CvtB,KAAK0d,WAAWjU,KAAKkU,sBACjB4P,GAAiBA,EAAcE,MACjCztB,KAAK0tB,QAAQH,EAAcE,MAI/BE,gBACE3tB,KAAK0tB,aAAQ7Z,GACb7T,KAAK6b,uBAAoBhI,EACrB7T,KAAKitB,qBACPD,aAAahtB,KAAKitB,qBAItB3U,UACEtY,KAAK2tB,gBACL3tB,KAAK0d,WAAWjU,KAAKkU,mBACrB3d,KAAK4tB,uBAGGA,uBAGRvK,WAAW,KACTrjB,KAAKmP,OAAOoJ,SAAS,CAAC6E,uBACrB,KAGLyQ,mBAAmBpkB,GACjB,OAAOzJ,KAAKosB,aAAa0B,QAAQrc,MAC/BhP,OAAKiqB,IAEH,GADA1sB,KAAK0tB,QAAQhB,EAAS9lB,UACjB8lB,EAAS9lB,QACZ,MAAM,IAAI+D,MAAM,eAElB,OAAO,KAETojB,OAAWjuB,IACT,MAAMA,aAAiBkuB,KACrBhuB,KAAKsY,UAEDxY,KAKZysB,eACE,OAAQvsB,KAAKyd,iBAGfA,iBACE,OAAIzd,KAAK6b,oBAAqB7b,KAAK6b,kBAAkBoS,WAC5CzY,KAAKC,MAAQzV,KAAK6b,kBAAkBoS,UAK/CZ,kBACE,OAAKrtB,KAAKkuB,2BAA8BluB,KAAK6b,kBAGtC7b,KAAK6b,kBAAkBoS,UAAYzY,KAAKC,MAAyC,GAAjCzV,KAAKkuB,0BAAiC,IAFpFluB,KAAKyd,iBAKhB0Q,uBACMnuB,KAAKouB,yBAGTpuB,KAAKouB,uBAAyBhV,YAAY,IAAMpZ,KAAKquB,aAAa5kB,KAAKzJ,KAAKktB,YAAa,MAI3FV,uBACE,IAAKxsB,KAAK6b,kBACR,OAEF,MAAMyS,EAAQrjB,KAAK2B,IAAI,WAAY3B,KAAK4B,IAAI,EAAG7M,KAAK6b,kBAAkBoS,UAAYzY,KAAKC,QACnFzV,KAAKitB,qBACPD,aAAahtB,KAAKitB,qBAGpBjtB,KAAKitB,oBAAsB5J,WAAW,KACpCrjB,KAAKuuB,gBACJD,EAAQ,KAIbC,eACMvuB,KAAKwuB,yBAA2BxuB,KAAKyuB,qBAMzCzuB,KAAK0uB,aACF9e,KAAK,KACJ5P,KAAKwuB,uBAAyB,IAE/BpP,MAAMtf,IAGDA,GACFE,KAAK6qB,wBAAwBnP,OAAO5b,GAEtCE,KAAKwuB,yBACLnL,WAAW,KACTrjB,KAAKuuB,gBACJvuB,KAAK2uB,mBAIRD,aAAU,sCACd,SAAKpB,YAAOzZ,GACL9C,QAAQ6d,UAFD,GAKhBC,iBACE7uB,KAAK0d,WAAWjU,KAAKkU,aAGvBmR,aAAaC,EAAe,GAAIC,EAA4BrR,kBAC1D3d,KAAK0d,WAAWjU,KAAKulB,GACrBhvB,KAAK2tB,gBACLtK,WAAW,IAAMrjB,KAAKivB,aAAaF,EAAcG,aAK7CC,SAASlqB,QACXjF,KAAKmP,OAAOigB,cAAchS,oBAI9BiS,YAAYC,EAAc,GAAIN,EAA4BrR,iBACxD3d,KAAK0d,WAAWjU,KAAKulB,GACrB3L,WAAW,IAAMrjB,KAAKivB,aAAaK,EAAaJ,YAGlDK,eAAeP,KAA+BQ,GAC5C,MAAMC,EAAUzvB,KAAKuP,eAAe1I,KAC9B6oB,EAAcD,EAAQC,YACxBA,UACKD,EAAQC,YACf1vB,KAAKuP,eAAeogB,QAAQF,GAC5Bjf,OAAO2e,SAASS,QAAQF,IAExB1vB,KAAKmP,OAAOoJ,SAAS,CAAC,KAIhBmV,QAAQD,GAChBztB,KAAK+O,aAAa+C,SAAUjB,IAC1BA,EAAM4c,KAAOA,GACZ1a,eAGGkc,aAAa9jB,EAAkBO,EAAOwjB,YAC5C,IAAIzjB,EAAQ,GACRC,IAASwjB,WACXzjB,EAAQzL,KAAK6W,iBAAiBa,SAAQmY,OAAgB,qBAC7CnkB,IAASwjB,YAClBzjB,EAAQzL,KAAK6W,iBAAiBa,SAAQmY,OAAgB,qBAExD7vB,KAAK+O,aAAa8B,MAAMwG,YAAY5N,KAAK,CACvCiC,KAAM,iBACN6L,SAAUuY,WACVrY,QAAS,CACPhM,QACAC,OACAP,cAjGNkI,KADCC,SACDxH,+HAeAuH,KADCC,SACDxH,0OCzLK,MAAenK,UAA2BhC,EAC/C4B,YAAsByoB,GACpBxlB,MAAMwlB,GADchqB,gBAEtBunB,mBAEmByC,GACjB,IAAKA,EACH,OAEF,MAAMK,EAAaL,EAAc+F,aAAa7S,MAAM,KAC9CsN,EAAejlB,KAAKsP,MAAMmb,KAAK3F,EAAW,KAEhD,cAAOhqB,OAAOmqB,EAAc,CAC1B1O,MAAOkO,EAAc+F,aACrB9B,UAA8B,IAAnBzD,EAAayF,IACxBC,IAAwB,IAAnB1F,EAAa0F,IAClBD,IAAwB,IAAnBzF,EAAayF,MAGbzF,EAGT8C,OAAOtD,GACLxlB,MAAM8oB,OAAOtD,GAIfwD,YAAYxD,GACV,OAAOroB,EAAmB6rB,YAAYxD,wUADxCvoB,GADC,kIC3BI,MAAMM,UAAoBJ,EAE/BJ,YAAsByoB,GACpBxlB,MAAMwlB,GADchqB,gBADtBA,+BAA4B,EAK5BmwB,+DANWpuB,GAAWT,yCAAXS,EAAWqR,QAAXrR,EAAW,qBAFV,yFCMP,MAAMuB,EACX/B,YAAoByoB,EAA2BK,EAAoBG,GAA/CxqB,iBAA2BA,kBAAoBA,qBAEnEowB,mBAAmBpG,EAAiC,IAClD,MAAO,CACLtP,KAAM1a,KAAKqwB,iBAAiBrG,GAC5B5F,QAASpkB,KAAKswB,kBAAkBtG,GAChCjqB,KAAMC,KAAKuwB,eAAevG,IAK9BqG,iBAAiBrG,EAAiC,IAChD,MAAMK,EAAYrqB,KAAKwwB,eAAexG,GAAexoB,MAAMwoB,GAE3D,IAAIQ,EAAOxqB,KAAKywB,cAAczG,GAAiBK,EAC/C,OAAIL,EAActP,OAChB8P,GAAQR,EAActP,MAEjB8P,EAGTgG,eAAexG,GACb,OAAOhqB,KAAKkqB,UAAU,cAAeF,GAGvC0G,UAAU1G,EAAiC,IACzC,OAAOA,EAAc2G,QAAU3wB,KAAKqb,YAAc5a,WAGpDgwB,cAAczG,EAAiC,IAC7C,MAAO,GAAGhqB,KAAK0wB,UAAU1G,KAAiBhqB,KAAK4wB,YAIjDN,kBAAkBtG,EAAiC,IACjD,OAAOhqB,KAAK6wB,iBAAiB7G,GAAevnB,IAAIunB,GAGlD6G,iBAAiB7G,EAAiC,IAChD,OAAOhqB,KAAKkqB,UAAU,gBAAiBF,GAIzCI,YAAeJ,EAAYK,EAAiC,IAC1D,OAAOrqB,KAAK8wB,kBAAkBzG,GAAe5nB,IAAOunB,EAAYhqB,KAAK+wB,eAAe1G,IAGtF0G,eAAe/G,GACb,MAAQnoB,WAAUwI,eAAgB2f,EAClC,OAAOQ,GAAeH,GAAYrqB,KAAK4wB,UAGzCE,kBAAkB9G,EAAiC,IACjD,OAAOhqB,KAAKkqB,UAAU,iBAAkBF,GAG1CE,UACEF,EACAK,GAEA,MAAMG,EACJxqB,KAAKgxB,eAAiB3G,EAAcK,WAAanqB,0BAC7CoqB,EAASpqB,6BAAsCiqB,GACrD,IAAKG,EACH,MAAM,IAAIhgB,MAAM,sBAElB,OAAOggB,EAAOX,GAIhBuG,eAAevG,GACb,IAAIK,EAAOL,EAAcjqB,KACzB,IAAKsqB,EACH,OAAO,KAWT,OARKL,EAAciH,YAEf5G,EADEA,EAAK1mB,OACA0mB,EAAK5nB,IAAI+nB,GAAQA,EAAKlhB,YAEtB+gB,EAAK/gB,YAIR0gB,EAAclnB,gBACf,WACH,MAAM0nB,EAAW,IAAI0G,SACrB,cAAOC,QAAQ9G,GAAMzmB,QAAQ,EAAE8nB,EAAKV,OAClCR,EAAS5O,IAAI8P,EAAKV,MAEbR,MACJ,iBACH,MAAMG,EAAuB,GAC7B,cAAOwG,QAAQ9G,GAAMzmB,QAAQ,EAAE8nB,EAAKV,OAClCL,EAAWpnB,KAAK,GAAGmoB,KAAOV,QAErBL,EAAWxlB,KAAK,KAAG,QAE1B,OAAOklB,kBCnGR,MAAMtmB,UCON,MAAeF,EASpBtC,YACYyoB,EACAK,EACAG,EACAG,GAHA3qB,YACAA,gBACAA,kBACAA,qBARFA,gBAAY,EAUpBA,KAAKiP,cAAgBjP,KAAKuO,SAASM,IAAIX,MACvClO,KAAKsV,WAAatV,KAAKuO,SAASM,IAAI5M,MACpCjC,KAAKuU,kBAAoBvU,KAAKuO,SAASM,IAAI3L,KAC3ClD,KAAK8qB,aACL9qB,KAAKoxB,eAAiB5G,EAGxB3b,IAAOmb,EAAiC,IACtC,OAAOhqB,KAAKqxB,QAAa,IACpBrH,EACH9kB,OAAQ,QAIZosB,KAAQtH,EAAiC,IACvC,SAAciH,WAAY,EACnBjxB,KAAKqxB,QAAa,CACvB3W,KAAM,WACHsP,EACH9kB,OAAQ,SAIZqsB,QAAWvH,EAAiC,IAC1C,OAAOhqB,KAAKqxB,QAAW,IAAKrH,EAAe9kB,OAAQ,QAGrDqQ,KAAQyU,EAAiC,IACvC,OAAOhqB,KAAKqxB,QAAW,IAAKrH,EAAe9kB,OAAQ,SAGrDssB,MAASxH,EAAiC,IACxC,OAAOhqB,KAAKqxB,QAAW,IAClBrH,EACH9kB,OAAQ,UAIZusB,IAAOzH,EAAiC,IACtC,OAAOhqB,KAAKqxB,QAAW,IAAKrH,EAAe9kB,OAAQ,QAGrDuW,OAAOuO,EAAiC,IACtC,OAAOhqB,KAAKqxB,QAAwB,IAC/BrH,EACH9kB,OAAQ,SACRmF,YAAa,WAIjBqnB,WAAW1H,GACT,OAAOhqB,KAAKqxB,QAAwB,IAC/BrH,EACH9kB,OAAQ,SACRwV,KAAM,cACNrQ,YAAa,WAKjBsnB,UAAa3H,GACX,MAAMK,EAAsDL,EAAcjqB,KAAK0C,IAAK+nB,GAClFxqB,KAAKwxB,MAAS,IAAKxH,EAAejqB,KAAMyqB,KAG1C,OAAO,OAASH,GAAa5Y,MAC3B,OAAK+Y,IAEI,CAAE5jB,QAAS,CAAEE,UADF0jB,EAAa9kB,OAAOgmB,KAAcA,EAAS9kB,SAASjD,YAM5ExB,MAAM6nB,EAAiC,IACrC,OAAOhqB,KAAKqxB,QAAuB,IAC9BrH,EACH9kB,OAAQ,MACR/C,OAAO,EACPkI,YAAa,UAKjBunB,OAAU5H,GACR,OAAOhqB,KAAKqxB,QAAW,IAClBrH,EACH9kB,OAAQ,QAIZ2sB,QAAW7H,GACT,OAAOhqB,KAAKqxB,QAAa,IACpBrH,EACH9kB,OAAQ,QAIZ4sB,WAAc9H,EAAiC,IAC7C,OAAOhqB,KAAKqxB,QAAW,IAClBrH,EACH9kB,OAAQ,QAIZ6sB,QAAW/H,GACT,OAAOhqB,KAAKqxB,QAAW,IAClBrH,EACH9kB,OAAQ,SAIZ8sB,OAAUhI,GACR,OAAOhqB,KAAKqxB,QAAW,IAClBrH,EACH9kB,OAAQ,QAIZ+sB,SAAYjI,EAAiC,IAC3C,OAAOhqB,KAAKqxB,QAAW,IAClBrH,EACH9kB,OAAQ,UAIZgtB,UAAUlI,GACR,OAAOhqB,KAAKqxB,QAAwB,IAC/BrH,EACH9kB,OAAQ,SACRmF,YAAa,WAIjB8nB,SAASnI,GACP,OAAOhqB,KAAKqxB,QAAuB,IAC9BrH,EACH9kB,OAAQ,MACRmF,YAAa,QACblI,OAAO,IAKXiwB,QAAWpI,GACT,OAAOhqB,KAAKqxB,QAAwB,IAC/BrH,EACH9kB,OAAQ,OACRlD,eAAe,EACfqI,YAAa,WAIjBgoB,UAAarI,GACX,OAAOhqB,KAAKqxB,QAAwB,IAC/BrH,EACH9kB,OAAQ,SACRlD,eAAe,EACfqI,YAAa,WAIjBvI,OAAUkoB,EAAiC,IACzC,OAAOhqB,KAAKqxB,QAAW,CACrBhnB,YAAa,YACV2f,EACH9kB,YAA+B,IAAvB8kB,EAAcjqB,KAAqB,MAAQ,SAIvDuyB,mBAAmBtI,EAAiC,IAClD,OAAOhqB,KAAK4xB,OAA2B,IAClC5H,EACHnoB,SAAU,mBACVwI,YAAa,qBACZoH,MAAK,OAAI4Y,GAAYA,EAASzjB,UAGnC2rB,SAASvI,GACP,OAAOhqB,KAAKwyB,MAAM,CAChB3wB,SAAU,WACVqD,OAAQ,MACRnC,aAAc,iBACXinB,EACH/pB,QAAS,CAAC,CAAEuD,WAAYwD,4BAA0CvD,MAAO,WAI7EgvB,OAAUzI,EAAiC,IACzC,SAAcpnB,KAAK8vB,mBACnB1I,EAAcjqB,KAAOiqB,EAAcjqB,MAAQ,GAE3CqE,OAAO/D,OAAO2pB,EAAcjqB,KAAMiqB,EAAcpnB,KAAK+vB,UAChD3I,EAAc4I,oBACjB5I,EAAc4I,kBAAoB,QAEpCxuB,OAAO/D,OAAO2pB,EAAcjqB,KAAM,EAC/BiqB,EAAc4I,mBAAoB5I,EAAcpnB,KAAKqG,aAExD+gB,EAAgB,CACd9kB,OAAQ,OACRpC,WAAY,WACZmuB,WAAW,EACXjuB,gBAAgB,EAChBI,QAAS,SACTrD,KAAMiqB,EAAcjqB,QACjBiqB,GAGEhqB,KAAKwyB,MAAMxI,GAAevY,MAC/B,OAAI4Y,IACFrqB,KAAK6yB,iBAAiBxI,EAAOL,EAAcpnB,SAE7C,QAAQynB,GAA0BA,EAAM3e,OAASzJ,gBACjD,OAAIooB,GAAYrqB,KAAKsrB,OAAOlB,YAAeC,EAAUL,KAIzD8I,eAAkB9I,EAAiC,IAEjD,MAAMQ,EAAwB,IAAIlf,MAC5Bqf,EAAwCX,EAAcnnB,MAAMJ,IAAI,CAACipB,EAAoBV,MACzF,MAAMI,GAAmB,IACpBjnB,KAAU6lB,GACbpnB,KAAM8oB,GAIR,IAAIT,GACJ,OACEA,GADED,GAAQ,GACA,SAAG,GAEHR,EAAsB/Y,MAC9B,QAAQyZ,IAAiCF,IAASE,GAAuB,IACzE,QAAK,IAGFD,GAAQxZ,MACb,OAAU,IACRzR,KAAKyyB,OAAUrH,IAAkB3Z,MAC/B,OAAI,IAAM+Y,EAAsB/gB,KAAKuhB,MACrC,OAAYE,KACVQ,EAASqH,YAAc7H,GACvBQ,EAASsH,iBAAkB,EAC3BtH,EAASuH,aAAc,EACvBzI,EAAsB/gB,KAAKuhB,KAGpB,QAAG,CACRpkB,aAAS,WASrB,OAAO,OAAS+jB,GAGVkI,iBAAiB7I,EAAuBK,GAC9C,OAAQL,EAAMte,WACPzJ,UACHooB,EAAK4I,aAAc,EACnB,WACGhxB,oBACHooB,EAAK6I,mBAAqBjoB,KAAKkoB,MAAO,IAAMnJ,EAAMoJ,OAAUpJ,EAAMqJ,OAE9DhJ,EAAK6I,oBAAsB,KAC7B7I,EAAKiJ,cAAe,GAEtB,WACGrxB,cACHooB,EAAKiJ,cAAe,EACpBjJ,EAAK6I,mBAAqB,IAC1B7I,EAAKkJ,YAAa,EAClBlJ,EAAK4I,aAAc,EAGvB,OAAOjJ,EAOTqH,QAAWrH,EAAiC,IAC1C,OAAOhqB,KAAKwyB,MAAMxI,GAAevY,MAC/B,OAAK4Y,GACHrqB,KAAKsrB,OAAOlB,YAAeC,EAAUL,KAS3CwI,MAAMxI,EAAiC,IACrC,MAAMK,EAAsBrqB,KAAKsrB,OAAO8E,mBAAmBpG,GAC3D,IAAIQ,EACJ,MAAMG,EAAQnV,KAAKC,MACnB,OAAQuU,EAAc9kB,YACf,MACHslB,EAAUxqB,KAAKsV,WAAW0U,EAAc9kB,OAAOsuB,qBAC7CnJ,EAAoB3P,KACpB2P,EAAoBjG,SAEtB,UACG,SAEDoG,EADEH,EAAoBtqB,KACZC,KAAKsV,WAAW+b,QACxBrH,EAAc9kB,OAAOsuB,oBACrBnJ,EAAoB3P,KACpB,CACE3a,KAAMsqB,EAAoBtqB,OAIpBC,KAAKsV,WAAW0U,EAAc9kB,OAAOsuB,qBAC7CnJ,EAAoB3P,KACpB2P,EAAoBjG,SAIxB,UACG,WACA,UACA,QACHoG,EAAUxqB,KAAKsV,WAAW0U,EAAc9kB,OAAOsuB,qBAC7CnJ,EAAoB3P,KACpB2P,EAAoBtqB,KACpBsqB,EAAoBjG,SAI1B,OAAOoG,EAAQ/Y,MAIb,QAAUia,GACRA,EAAWja,MACT,OAAUuZ,KAER,MAAMI,GAAcprB,KAAKuO,SAASM,IAAIX,MACtC,GAAI8c,cAAsB/oB,MAA2C,MAAtB+oB,GAAW9qB,OACxD,OAAO,QAAKkrB,GAAYsD,cAAcjd,MACpC,OAAW,KAET,MAAMuZ,MAIV,MAAMA,QAKd,OAAWU,IACT,QAAMxmB,OAAS8kB,EAAc9kB,OAC7BwmB,EAAM+H,YAAczJ,EAAcjqB,KAClC2rB,EAAM/oB,YAAc0nB,EAAoBjG,QAAQ/gB,OAC1CqoB,KAER,OAAI,KACF,GAAI1B,EAAc0J,WAAa1zB,KAAK0zB,UAAW,CAC7C,MAAMhI,EAAUlW,KAAKC,MAAQkV,EACvBK,GAAkBvqB,iCAClB2qB,GAAkB3qB,iCACxBT,KAAKuU,kBAAkBhE,IAAI,CACzB0E,MAAO,OACP0e,UACAloB,MAAO,UAAUigB,SAAe1B,EAAc9kB,UAAUmlB,EAAoB3P,OAC5ExV,OAAQ8kB,EAAc9kB,OACtB9E,IAAKiqB,EAAoB3P,KACzB/X,YAAaqoB,GAAkBzlB,KAAKC,UAAU6kB,EAAoBjG,QAAQ/gB,aAAa,EACvFtD,KACEsqB,EAAoBtqB,MAAQqrB,GACxB7lB,KAAKC,UAAU6kB,EAAoBtqB,WACnC,QAIZ,OAAS,KAAOiqB,EAAcuB,mBAAqBvrB,KAAKiP,cAAcmU,SAIlE0H,aACN9qB,KAAKsrB,OAAS,IAAIhoB,EAActD,KAAKuE,KAAMvE,KAAKqb,WAAYrb,KAAKgxB,iBDzZnEzvB,YAAmByoB,GACjBxlB,MAAM,QAASwlB,EAAUvpB,eAAwB,gBADhCT,gBAInB8tB,QACE,OAAOtpB,MAAM6sB,QAAc,CACzB3W,KAAM,MACNxV,OAAQ,MACRqmB,mBAAmB,2CATZxnB,GAAYzC,yCAAZyC,EAAYqP,QAAZrP,EAAY,qBAFX,SECP,MAAMC,GACXzC,YAAoByoB,uBAEpB5E,KAAK4E,EAAQK,GACX,OAAQL,IACDhjB,eACIhH,KAAK+O,aAAa8B,MAAM4c,KAAK/E,oDAN/B1kB,IAAoB1C,yCAApB0C,GAAoBoP,QAApBpP,GAAoB,qBAFnB,SCAP,MAAM+W,UCIN,MAAeiE,GAQpBzd,cAEE,GATFvB,oBAA6C,IAAIsL,MAKjDtL,sBAAmB,EAGjBA,KAAK4zB,YAAc9e,KACfrU,4BAAqC,CACvC,MAAMupB,EAAQvpB,0BACR4pB,EAAUjmB,OAAOuB,KAAKqkB,GAAOne,OAAO,CAAC2e,EAAqBG,KAC9D,GAAIX,EAAMW,GAAK1O,QAAS,CACtB,MAAMyP,GAAc1B,EAAMW,GAAKrO,YAAc,GAAK,EAClDkO,EAAcvf,KAAK4B,IAAI2d,EAAaR,EAAMW,GAAK1O,QAAUyP,GAE3D,OAAOlB,GAnBK,KAsBdxqB,KAAK4zB,YAAcvJ,EAvBX,IAyBN5pB,KAAaozB,eAAe/f,UAC9B9T,KAAK4zB,YAAc3oB,KAAK4B,IAAI7M,KAAK4zB,YAAanzB,KAAaozB,eAAeC,gBAAkB,IAIhGxd,KAAK0T,GACHhqB,KAAK+zB,gBACL/zB,KAAKg0B,kBAAoB,EACzBh0B,KAAKi0B,UAAY5Q,WAAW,KAC1BrjB,KAAKijB,eAAexZ,KAAK,CAAE3H,OAAQkF,UAAwBH,UAlCnD,OAoCLmjB,GAASA,IAASA,EAAKuB,qBAC1BvrB,KAAKk0B,cAAgB7Q,WAAW,KAC9BrjB,KAAKg0B,iBAAmB,EACxBh0B,KAAKojB,QACJpjB,KAAK4zB,cAIZxQ,OACEpjB,KAAKg0B,kBAAoB,EACrBh0B,KAAKg0B,kBAAoB,GAC3Bh0B,KAAKm0B,YAITA,YACEn0B,KAAK+zB,gBACL/zB,KAAKijB,eAAexZ,KAAK,CAAE3H,OAAQkF,YACnChH,KAAKg0B,iBAAmB,EAGlBD,gBACN/G,aAAahtB,KAAKi0B,WAClBjH,aAAahtB,KAAKk0B,iBD3DpB3yB,cACEiD,+CAFSuW,gCAAa3H,QAAb2H,EAAa,qBAFZ,SEEP,MAAeY,EAKpBpa,YACSyoB,EACAK,EACAG,EAAiC,CAAE3jB,KAAM,GAAIutB,UAAW,IACxDzJ,GAHA3qB,WACAA,gBACAA,uBACAA,eAPDA,mBAAiC,GASvCA,KAAK0kB,QAGP/V,KAAKqb,GACH,MAAMK,EAASjmB,OAAO/D,OAAO,GAAI,EAAGL,KAAKq0B,KAAMlwB,KAAUnE,KAAKs0B,kBAAoBtK,GAClFhqB,KAAKu0B,cAAgBnwB,OAAO/D,OAAO2pB,EAAYK,GAG7CxjB,WACF,OAAO7G,KAAKw0B,WAAW3tB,KAIrBA,SAAKmjB,GACPhqB,KAAKw0B,WAAW3tB,KAAOmjB,EAGrBoK,gBACF,OAAOp0B,KAAKw0B,WAAWJ,UAIrBA,cAAUpK,GACZhqB,KAAKw0B,WAAWJ,UAAYpK,EAG1ByK,WACF,OAAOz0B,KAAK00B,MAGVD,SAAKzK,GACPhqB,KAAK00B,MAAQ1K,EAKftF,QACE1kB,KAAKy0B,UAAO,EACZz0B,KAAK20B,MAAQ,GACb30B,KAAKu0B,cAAcv0B,KAAKq0B,KAAOjwB,OAAO/D,OAAO,GAAIL,KAAKs0B,iBAGxDM,QACE50B,KAAKy0B,UAAO,EACZz0B,KAAK20B,MAAQ,GACb30B,KAAKu0B,cAAcv0B,KAAKq0B,KAAO,CAAExtB,KAAM,GAAIutB,UAAW,IAG5CI,iBACV,OAAOx0B,KAAKu0B,cAAcv0B,KAAKq0B,MC/D5B,MAAMtY,WAAqCJ,EAChDpa,YACSyoB,EACAK,EACAG,GAEPhmB,MAAMwlB,EAAKhjB,gBAAsC,CAAEH,KAAMwjB,IAJlDrqB,WACAA,yBACAA,eAKTwB,QACE,MAAMwoB,EAAOhqB,KAAK6G,KAAKlC,KACjB0lB,EAAOrqB,KAAK6G,KAAKjC,KACvB5E,KAAKy0B,KAAO,SACG,IAATzK,GAAsB,CAAErlB,gBACf,IAAT0lB,GAAsB,CAAEzlB,UAG1B5E,KAAK6G,KAAKhC,gBAA+C,KAA7B7E,KAAK6G,KAAKhC,kBACxC7E,KAAKy0B,KAAK5vB,eAAiB7E,KAAK6G,KAAKhC,iBCfpC,MAAMqiB,GAAqB,CAChC,CACEzD,iBAAkBzc,kBAClB6tB,aAAc,CACZ,ICTC,MAAM3Y,WAA4CH,GACvDxa,YAAYyoB,EAAKK,EAAmBG,GAClChmB,MAAMwlB,EAAKK,EAAmBG,KDQ1BxjB,gBACA,CAAErC,KAAM,EAAGC,KAAM,IACjB,CAAEkwB,gBAAiB,IAErB,IEbC,MAAMtY,WAAiCb,EAC5Cpa,aACEmiB,oBAAoB1c,YACpB+tB,qBAAqB/tB,aACnB,IACFxC,MAAMwlB,EAAmBK,GAG3B7oB,QACExB,KAAKy0B,KAAOz0B,KAAKo0B,aFMjBY,mBAAoB,IGfjB,MAAM7N,WCCN,MAAM/L,UCAN,MAAeF,EAAtB3Z,cACEvB,6BAAuE,CACrEC,QAAS,GACT0C,YAAa,GACbsyB,aAAc,GACdlwB,MAAO,GACPE,OAAQ,GACRS,OAAQ,GACRjB,MAAO,GACPC,eAAgB,GAChBM,QAAS,GACT6B,KAAM,GACNJ,WAAY,CAAE9B,UAAM,EAAWC,UAAM,EAAWC,oBAAgB,IAKlEqwB,gBAAgBlL,GACdA,EAAamL,WAAanL,EAAamL,YAAc,GACrDn1B,KAAK0kB,QAEDhe,MAAMC,QAAQqjB,EAAa6K,eAC7B7K,EAAa6K,aAAajxB,QAASymB,IACjCA,EAAY7oB,QAER6oB,EAAYoK,OACe,eAAzBpK,EAAY+K,SACdp1B,KAAKq1B,wBAAwBhL,EAAY+K,UAAY/K,EAAYoK,KAGjEz0B,KAD0Bq1B,wBAAwBhL,EAAY+K,UACjD7xB,KAAK8mB,EAAYoK,SAMtCz0B,KAAKs1B,0BAA0BtL,GAC/BhqB,KAAKu1B,gBAAgBvL,GAGbsL,0BAA0BtL,GAClC,MAAMK,EAAarqB,KAAKq1B,wBAAwB5uB,iBACxB,IAApB4jB,EAAW1lB,WAA0C,IAApB0lB,EAAWzlB,QAC9ColB,EAAamL,WAAWxwB,KAAO3E,KAAKq1B,wBAAwB5uB,WAAW9B,KACvEqlB,EAAamL,WAAWvwB,KAAO5E,KAAKq1B,wBAAwB5uB,WAAW7B,WAEvC,IAA9BylB,EAAWxlB,iBACbmlB,EAAamL,WAAWtwB,eAAiB7E,KAAKq1B,wBAAwB5uB,WAAW5B,gBAI3E6f,QACRtgB,OAAOuB,KAAK3F,KAAKq1B,yBAAyBzxB,QAAQomB,IAChDhqB,KAAKq1B,wBAAwBrL,GAAmB,KAI1CwL,8BACRxL,EACAK,GAEAL,EAAamL,WAAW9K,GAAY,GACpCrqB,KAAKq1B,wBAAwBhL,GAAUzmB,QAAQ4mB,IACzC9jB,MAAMC,QAAQ6jB,GAChBR,EAAamL,WAAW9K,GAAU9mB,QAAQinB,GAE1CR,EAAamL,WAAW9K,GAAU9mB,KAAKinB,KAKnCiL,+BACRzL,EACAK,GAEAL,EAAamL,WAAW9K,GAAY,GACpCrqB,KAAKq1B,wBAAwBhL,GAAUzmB,QAAQ4mB,IACzC9jB,MAAMC,QAAQ6jB,GAGhBA,EAAG5mB,QAAQ+mB,GAAOX,EAAamL,WAAW9K,GAAUM,EAAGpmB,MAAQomB,EAAGlnB,OAElEW,OAAO/D,OAAO2pB,EAAamL,WAAW9K,GAAWG,ODjFvD+K,gBAAgBvL,GACdhqB,KAAKw1B,8BAA8BxL,EAAchjB,cAEjDhH,KAAKw1B,8BAA8BxL,EAAchjB,aAEjDhH,KAAKw1B,8BAA8BxL,EAAchjB,mBEK9C,MAAMigB,GAKX1lB,YAAYyoB,GAJZhqB,oBAAiB,IAAIsL,MACbtL,mBAAgB,IAAIP,IAI1BO,KAAK+O,aAAeib,EAASnb,IAAIX,MAGnCS,QACOuY,IAGLA,WAA4B8C,IAC1BhqB,KAAK01B,iBAAiB1L,GAClBA,EAAagL,oBACfhL,EAAagL,mBAAmBE,gBAAgBlL,GAElDhqB,KAAK21B,cAAc/Z,IAAIoO,EAAavG,iBAAkBuG,KAInDlY,SAASkY,EAAsCK,GACpDrqB,KAAK+O,aAAa+C,SAAU0Y,IAC1BR,EAAGQ,EAAMoL,aAAavL,IACtBrqB,KAAK61B,mBAAmBxL,IACvBrqB,KAAK81B,kBAAkBzL,IAGpByL,kBAAkB9L,GACxB,MAAO,GAAGhjB,8BAAkDgjB,IAGtD0L,iBAAiB1L,GACvB,MAAMK,EAAmBL,EAAavG,kBACrCuG,EAAa6K,cAAgB,IAAIjxB,QAAS4mB,IACzC,MAAMG,EAAoB3qB,KAAK+O,aAAa8B,MAAM+kB,aAClDjL,EAAkBN,GAAoBM,EAAkBN,IAAqB,GAC7EG,EAAY7b,KAAKgc,EAAkBN,MAI/BwL,mBAAmB7L,GACzB,MAAMK,EAAerqB,KAAK+1B,gBAAgB/L,GACtCK,EAAa2K,oBACf3K,EAAa2K,mBAAmBE,gBAAgB7K,GAGlDrqB,KAAKg2B,eAAevsB,KAAK4gB,GAM3B4L,qBAAqBjM,EAAgBK,GACnC,IAAIG,EACJ,OAAQR,QACDhjB,YACHhH,KAAK8R,SAAS,OAAUuY,GACxB,WAEGrjB,uBACHwjB,EAAexqB,KAAK21B,cAAc9mB,IAAIwb,GACtCG,EAAaqK,aAAajxB,QAAS+mB,GAAoCA,EAAYjG,SAGnF1kB,KAAKi2B,qBAAqBjvB,YAAiCqjB,IAKjE0L,gBAAgB/L,GACd,IAAIK,EAAkCrqB,KAAK21B,cAAc9mB,IAAImb,GAC7D,OAAKK,IACHA,EAAerqB,KAAKk2B,uBAAuBlM,GAC3ChqB,KAAK21B,cAAc/Z,IAAIoO,EAAkBK,IAEpCA,EAGT8L,cAAcnM,GACZ,OAAOhqB,KAAK+1B,gBAAgB/L,GAAkBmL,YAAc,GAG9De,uBAAuBlM,GAErB,OAD4B9C,GAAmB8C,IAIxC,CAAEvG,oBAGXD,eAAewG,EAA0BK,GAEvC,MAAMM,EAAiB3qB,KADN+1B,gBAAgB/L,GACN6K,aAAavQ,KACrCoH,GAAoCA,EAAY2I,MAAQhK,GAE3D,IAAKM,EACH,MAAM,IAAIhgB,MACR,0GAIJ,OAAOggB,EAMTyL,yBAAyBpM,GACvB,OAAOhqB,KAAKg2B,eAAevkB,MACzB,QAAQ4Y,GAAoCA,EAAa5G,mBAAqBuG,IAI3EjG,eAAeiG,GACpB,OAAOhqB,KAAK+O,aAAawO,YAAYvd,KAAK81B,kBAAkB9L,IAAmBvY,MAC7E,OACG4Y,IAAqE,CACpEvoB,OAAQuoB,EAAMvoB,OACd+O,MAAOwZ,EAAMxZ,MAAM+kB,aAAa5L,+CAxH7B/C,IAAuB3lB,0CAAvB2lB,GAAuB7T,QAAvB6T,GAAuB,qBAFtB,SCPP,MAAMG,WAA4BH,GACvC1lB,YAAsByoB,GACpBxlB,MAAMwlB,GADchqB,wDADXonB,IAAmB9lB,0CAAnB8lB,GAAmBhU,QAAnBgU,GAAmB,qBAFlB,wBCGP,MAAMJ,GAGXzlB,YAAoByoB,EAAgDK,GAAhDrqB,0BAAgDA,sBAFpEA,0BAAsB,EAItB2O,OACE3O,KAAKqP,mBACFjM,QAAQ,CAACikB,aAAoBA,YAAmBA,eAChDzV,UAAU,KACJ5R,KAAKq2B,qBACRr2B,KAAK+W,eAAeJ,OAAOsB,WAE7BjY,KAAKq2B,qBAAsB,4CAZtBrP,IAAiB1lB,sDAAjB0lB,GAAiB5T,QAAjB4T,GAAiB,qBAFhB,wBCUP,MAAMsP,WCHN,MAAevP,GAgBpBxlB,aACEg1B,cACAC,aACA/G,YAMA,GApBczvB,YAAS,IAAIsL,OAoBtB+e,EACH,MAAM,IAAI1f,MAAM,6BAElB3K,KAAKw2B,WAAanM,EAClBrqB,KAAKu2B,YAAcvM,GAAgB,GACnChqB,KAAKyvB,QAAUjF,EAEbxqB,KAAKy2B,OADPjM,EACgBA,EAAQ3jB,KAER,IAAIwjB,EAAWlmB,KAAUnE,KAAKu2B,cAO5C1lB,YACF,OAAO7Q,KAAKy2B,OAMdC,aAGM12B,KAAKyvB,SACPzvB,KAAKyvB,QAAQkH,eACb32B,KAAKy2B,OAASz2B,KAAKyvB,QAAQ5oB,MAE3B7G,KAAKy2B,OAAS,IAAIz2B,KAAKw2B,WAAWryB,KAAUnE,KAAKu2B,cAEnD/lB,OAAOK,MAAW7Q,KAAKy2B,OACvBz2B,KAAKqmB,OAAO5c,KAAK,CAAE3H,OAAQkF,WAAqB6J,MAAO7Q,KAAK6Q,QAa9DiB,SAASkY,EAAwBK,EAAiBrjB,aAChDgjB,EAAGhqB,KAAK6Q,OACJ7Q,KAAKyvB,SACPzvB,KAAKyvB,QAAQE,QAAQ3vB,KAAK6Q,OAE5BL,OAAOK,MAAW7Q,KAAKy2B,OACvBz2B,KAAKqmB,OAAO5c,KAAK,CAAE3H,SAAQ+O,MAAO7Q,KAAK6Q,QAQzC0M,YAAYyM,GACV,OAAItjB,MAAMC,QAAQqjB,GACThqB,KAAKqmB,OAAO5U,MAAK,QAAO4Y,GAAQL,EAAOhR,SAASqR,EAAKvoB,UAEvD9B,KAAKqmB,OAAO5U,MAAK,QAAO4Y,GAAQA,EAAKvoB,SAAWkoB,MDrFzDzoB,YAAYyoB,GAEVxlB,MAAM,CAAEgyB,WAAYI,MAAOnH,QAASzF,4CAH3BsM,IAAYh1B,yCAAZg1B,GAAYljB,QAAZkjB,GAAY,qBAPX,4CEIP,MAAejS,EAkBpB9iB,aACEg1B,cACAM,eACAC,gBAAgBpiB,aAChBqiB,cAME,IACF,GA5BF/2B,cAAW,IAAIsL,MACLtL,gBAAa,GAAGS,uBA2BnB4pB,EACH,MAAM,IAAI1f,MAAM,6BAElB3K,KAAK62B,aAAexM,EACpBrqB,KAAK82B,cAAgBtM,EACrBxqB,KAAKu2B,YAAcvM,GAAgB,GAC/BW,IACF3qB,KAAK+2B,WAAa,GAAGt2B,eAAuBkqB,KAE9C3qB,KAAKg3B,cACLh3B,KAAKi3B,kBAGCD,cACDh3B,KAAKyvB,UACRzvB,KAAKyvB,QAAUzvB,KAAKk3B,mBAIhBA,kBACN,MAAO,CACLC,UAAW3hB,KAAKC,MAChB2hB,WAAY5hB,KAAKC,MACjB4hB,QAASrU,2BACTnc,KAAM,IAAI7G,KAAK62B,aAAa1yB,KAAUnE,KAAKu2B,eAU3C9G,cACF,MAAMzF,EAAczkB,KAAKsP,MAAM7U,KAAK82B,cAAcniB,QAAQ3U,KAAK+2B,aAC/D,OAAI/M,GAAeA,EAAYnjB,KACtB,IAAKmjB,EAAanjB,KAAM,IAAI7G,KAAK62B,aAAa7M,EAAYnjB,OAE5DmjB,EAOLyF,YAAQzF,GACVhqB,KAAK82B,cAAc/J,QAAQ/sB,KAAK+2B,WAAYxxB,KAAKC,UAAUwkB,IAMzDnjB,WACF,OAAI7G,KAAKyvB,SAAWzvB,KAAKyvB,QAAQ5oB,KACxB,IAAI7G,KAAK62B,aAAa72B,KAAKyvB,QAAQ5oB,MAErC,IAAI7G,KAAK62B,aAMdhwB,SAAKmjB,GACP,MAAMK,EAAUrqB,KAAKyvB,QAErBpF,EAAQxjB,KAAOywB,IAAOt3B,KAAKyvB,QAAQ5oB,KAAMmjB,GACzChqB,KAAKu3B,cAAclN,GAQrBsF,QAAQ3F,GACN,MAAMK,EAAUrqB,KAAKyvB,QACrBpF,EAAQxjB,KAAOmjB,EACfhqB,KAAKu3B,cAAclN,GAMrBmN,YACE,MAAMxN,EAAUhqB,KAAKyvB,QACrBzF,EAAQnjB,KAAO,GACf7G,KAAKu3B,cAAcvN,GAMrB2M,eACE,MAAM3M,EAAUhqB,KAAKy3B,iBACrBz3B,KAAKyvB,QAAUzF,EACfhqB,KAAK03B,SAASjuB,KAAKugB,EAAQnjB,MAM7B4wB,iBACE,OAAOz3B,KAAKk3B,kBAGND,kBAEFj3B,KADiByvB,QACT4H,UAAYrU,4BACtBhjB,KAAK22B,eAIDY,cAAcvN,GACpBA,EAAQoN,WAAa5hB,KAAKC,MAC1BzV,KAAKyvB,QAAUzF,EACfhqB,KAAK03B,SAASjuB,KAAKugB,EAAQnjB,OCjJxB,MAAM0d,WAAuBF,EAClC9iB,cACEiD,MAAM,CACJsyB,cAAepiB,aACfqiB,WAAY,UACZF,aAAcD,MACdL,YAAa,CAAEoB,MAAO,mEANfpT,mCAAcnR,QAAdmR,GAAc,qBALb,SCEP,MAAMM,WAA4BR,EACvC9iB,cACEiD,MAAM,CACJsyB,cAAec,eACfb,WAAY,gBACZF,aAAcD,MACdL,YAAa,CAAEoB,MAAO,yEANf9S,mCAAmBzR,QAAnByR,GAAmB,qBAFlB,4RCPFrlB,IAOAgD,EAIA3C,YAXAyE,QAAS,KACnBuzB,sBACAvzB,kBACAA,sBACAA,wBAGF,SAAYA,GACVA,kBADF,CAAY9B,MAAM,KAIlB,SAAY8B,GACVA,sBADF,CAAYzE,MAAY,uDCLZyE,oDAAW,KACrBwzB,QACAp1B,UACAA,UACAA,UACAA,UAQK,MAAMqL,EAwBXxM,YAAoBgB,uBAvBXvC,iBAAa,EAEbA,YAAiC,aACjCA,uBAAoB,KAa7BA,SAAM,GACNA,YAAS,GACTA,WAAQ,GACRA,cAAW,GAEHA,iBAAc,CAAE83B,GAAI,EAAGC,GAAI,IAAKC,GAAI,IAAKC,GAAI,KAAMC,GAAI,MAI/D9pB,WACEpO,KAAKm4B,sBAGPC,YAAY71B,GACLA,EAAQ81B,SAASC,aACpBt4B,KAAKm4B,sBAGF51B,EAAQg2B,QAAQD,aACnBt4B,KAAKm4B,sBAGF51B,EAAQi2B,mBAAmBF,aAC9Bt4B,KAAKm4B,sBAIDA,sBAENn4B,KAAKy4B,IAAM,GACXz4B,KAAK04B,OAAS,GACd14B,KAAK24B,MAAQ,GACb34B,KAAK44B,SAAW,GAChBx0B,OAAOuB,KAAK3F,KAAK64B,aAAaj1B,QAAQrB,IAEhB,eAAhBvC,KAAKu4B,OACPv4B,KAAK84B,sBAAsBv2B,GACF,UAAhBvC,KAAKu4B,QACdv4B,KAAK+4B,iBAAiBx2B,KAK1B6B,OAAO40B,OAAOh5B,KAAK64B,aAChBlvB,UACA/F,QAAQrB,IACP,MAAMD,EAAO,eAAiBC,EAAa,OAAcA,EAAa,OACtEvC,KAAK24B,OAASr2B,IAIlBtC,KAAK24B,OAAS34B,KAAK64B,YAAY74B,KAAKw4B,mBAAqB,KAEzDx4B,KAAKi5B,eAAej5B,KAAK+O,aAAa8B,OAEtC7Q,KAAK+O,aAAawO,YAAY/d,iBAA0BoS,UAAWrP,IACjEvC,KAAKi5B,eAAe12B,EAAMsO,SAItBooB,eAAe12B,GACrB,IAAID,EAAoB,KAEtBA,EADkB,UAAhBtC,KAAKu4B,QAGah2B,EAAMuO,kBAAkBiB,SAFxB,KAIhBxP,EAAMuO,kBAAkBmB,QACxB,KACA1P,EAAMuO,kBAAkBoB,SACxB,KACA3P,EAAMuO,kBAAkBqB,QACxB,KACA,KAGN,IAAIjM,EAASlG,KAAKq4B,QAAQ/1B,GACrB4D,IAEHA,EAASlG,KAAKq4B,QAAQj0B,OAAOuB,KAAK3F,KAAKq4B,SAAS1uB,UAAU,KAE5D,MAAM1D,EAAQC,GAAQ2R,OAAS,OACzB7R,EAASE,GAAQ6R,QAAU,OAEjC/X,KAAK44B,SAAW,CACd/gB,QACAE,YACI7R,EAAOgzB,WAAa,CAAEA,UAAWhzB,GAAQgzB,cACzChzB,EAAOizB,aAAe,CAAEA,YAAajzB,GAAQizB,cAK7CL,sBAAsBv2B,GAC5B,GAAIvC,KAAKq4B,QAAQ91B,GAAa,CAC5B,MAAMD,EAAWtC,KAAKq4B,QAAQ91B,GAAY,MACtCvC,KAAKq4B,QAAQ91B,GAAY,MACzBvC,KAAKq4B,QAAQ91B,GAAY,MACvB2D,EAAalG,KAAK64B,YAAYt2B,GAAc,IAClD,GAAID,EAAU,CACZ,MAAM2D,EAAU3D,EAAW,IAAM4D,EAAa,KAC9ClG,KAAK04B,QAAUzyB,EAEVjG,KAAKy4B,MACRz4B,KAAKy4B,IAAMn2B,KAOXy2B,iBAAiBx2B,GACvB,GAAIvC,KAAKq4B,QAAQ91B,GAAa,CAC5B,GAAIvC,KAAKq4B,QAAQ91B,GAAY,MAAO,CAClC,MAAMD,EAAatC,KAAKq4B,QAAQ91B,GAAY,MAC5C,GAAID,EAAY,CACd,MAAM4D,EAAY5D,EAAa,QAC/BtC,KAAK04B,QAAUxyB,EAEVlG,KAAKy4B,MACRz4B,KAAKy4B,IAAMn2B,IAKjB,GAAItC,KAAKq4B,QAAQ91B,GAAY,MAAO,CAClC,MAAMD,EAAatC,KAAKq4B,QAAQ91B,GAAY,MAC5C,GAAID,EAAY,CACd,MAAM4D,EAAY5D,EAAa,QAC/BtC,KAAK04B,QAAUxyB,EAEVlG,KAAKy4B,MACRz4B,KAAKy4B,IAAMn2B,6CArJVyL,GAAkBvL,sCAAlBuL,EAAkBM,8QCnB/B7L,uBAAKA,2CAA6B,wBAA7BA,CAA6B,gBAA7BA,CAA6B,sBAGhCA,6WCHFA,SACEA,iBAA4B,WAExBA,yBAEFA,UAEJA,8BAHQA,uCCMD,MAAME,EAMXnB,YAAoBe,wBALXtC,cAAW,GAEpBA,oBAAgB,EAKhBoO,WACEpO,KAAKiP,cAAcgU,eAAerR,UAAWtP,IAC3C,OAAQA,EAAaR,aACdtC,UACHQ,KAAKkjB,WAAa5gB,EAAauE,KAC/B7G,KAAKsW,OACLtW,KAAKiP,cAAckU,WAAY,EAC/B,WACG3jB,UACHQ,KAAKkjB,gBAAa,EAClBljB,KAAKojB,OACLpjB,KAAKiP,cAAckU,WAAY,KAMvC7M,OACE+M,WAAW,IAAOrjB,KAAKsjB,eAAgB,GAGzCF,OACEC,WAAW,IAAOrjB,KAAKsjB,eAAgB,0CA9B9B5gB,GAAsBF,sCAAtBE,EAAsB2L,8MDVnC7L,qCAAeA,yhBEEb3C,6DAEEA,mFAGFA,kBAEe,qBAFfA,CAEe,eAGAA,8BAA0CA,QACrDA,wCAIFA,gCATAA,0BAIaA,oFAGTA,wGADAA,8HAQNA,qBACEA,yDAASA,sBAETA,8BACFA,gCADEA,oGAGFA,qBAEEA,yDAASA,kBAITA,8BACFA,gCANEA,wCAAgC,wBAKhCA,wDCpBG,MAAMU,EAIXgB,YACS2M,EACyBjH,EACxB3F,GAFDtB,iBACyBA,kBACxBA,mBAEJiH,EAAWmyB,SACbp5B,KAAKq5B,KAAOr5B,KAAKs5B,YAAYC,MAAM,CACjC91B,MAAO,CAACwD,EAAWmyB,OAAO31B,OAAS,GAAIwD,EAAWmyB,OAAOI,WAAah6B,cAAsB,OAKlG4O,WACE,OAAQpO,KAAKy5B,WAAWC,kBAEjB,UACH15B,KAAK05B,aAAe,UACpB,UACG,YAQH,QAEA15B,KAAK05B,aAAe,eARpB,IACG,UAEH,IACG,SACH15B,KAAK05B,aAAe,QAO1BC,OACE35B,KAAK45B,UAAUpX,MAAM,CACnBtiB,OAAQsC,QACRqE,KAAM7G,KAAKq5B,MAAQr5B,KAAKq5B,KAAK51B,QAIjCo2B,WACE75B,KAAK45B,UAAUpX,MAAM,CACnBtiB,OAAQsC,qDA7CDjC,GAA8BV,kBAM/BH,MAAeG,sCANdU,EAA8B8N,wlBDd3CxO,gBAAqBA,8BAAkCA,QACvDA,8BACEA,wBAKAA,wBAYFA,QAEAA,gCACEA,0BAMAA,0BAQFA,eApCqBA,8CAEZA,4CAKAA,8BAiBJA,+CASAA,qREpBE,MAAMA,EA2BX0B,YAAoB2E,8BApBpBlG,qBAAkB,CAAC,GAAI,GAAI,GAAI,KAG/BA,qBAAkB,EAalBA,gBAA+C,IAAIN,MAT/C+G,eAAWP,GACblG,KAAK85B,YAAc5zB,EACnBlG,KAAK+5B,kBAEHtzB,iBACF,OAAOzG,KAAK85B,YAUd1rB,WACMpO,KAAKyjB,mBACPzjB,KAAKujB,YAAcvjB,KAAKkQ,oBAAoBsT,eAC1CxjB,KAAKyjB,iBACLjhB,iBAGExC,KAAKujB,aAAaa,SAAS4V,kBAC7Bh6B,KAAKg6B,gBAAkBh6B,KAAKujB,YAAYa,QAAQ4V,iBAE9Ch6B,KAAKujB,aAAaa,SAAS0Q,kBAC7B90B,KAAK80B,gBAAkB90B,KAAKujB,YAAYa,QAAQ0Q,kBAKtDmF,aAAa/zB,GACPlG,KAAKyjB,kBACPzjB,KAAKkQ,oBAAoB4B,SAAS,KAChC9R,KAAKujB,YAAY1c,KAAO,CACtBlC,KAAMuB,EAAWvB,KACjBC,KAAMsB,EAAWtB,OAElB5E,KAAKyjB,kBAGVzjB,KAAKk6B,WAAWC,KAAKj0B,GAGvB6zB,0DA1DWl6B,GAAsBH,sCAAtBG,EAAsBwO,sVCbnC3O,2BAQEA,yDAAQA,8BACVA,gCATeA,qDAA6C,iDAA7CA,CAA6C,8CAA7CA,CAA6C,iCAA7CA,CAA6C,6BAA7CA,CAA6C,gDAA7CA,CAA6C,sCCSrD,MAAM6C,UAAkC1C,EAG7Cu6B,gBAAgBl0B,GACdlG,KAAKyG,WAAW9B,KAAOuB,EAAM8B,UAAYhI,KAAK80B,gBAC9C90B,KAAKyG,WAAW7B,KAAOsB,EAAMb,SAC7BrF,KAAKi6B,aAAaj6B,KAAKyG,gFANdlE,KAAyB0D,GAAzB1D,iCAAyB8L,gYDTtC3O,sCAGGA,kNEUI,MAAMuG,EA0CX1E,YAAoBwE,8BArCpB/F,uBAAoBkG,YASpBlG,oBAAgB,EAGhBA,sBAAkB,EAGlBA,kBAAc,EAGdA,UAAO,KAGPA,iBAAc,GAELA,eAAY,EAGrBA,oBAAiB,IAGjBA,kBAAkC,IAAIN,MAItCM,iBAAkC,IAAIR,KAAmB,IACzDQ,kBAA6B,IAAI0C,IACjC1C,wBAAoB,EAIpBoO,YACOpO,KAAKq6B,UAAYr6B,KAAKs6B,WAEzBt6B,KAAKs6B,SAAW,CAAC,YAGft6B,KAAKq6B,UACPr6B,KAAKs6B,SAAW,CAACt6B,KAAKq6B,UAGpBr6B,KAAKyjB,mBACPzjB,KAAKujB,YAAcvjB,KAAKkQ,oBAAoBsT,eAC1CxjB,KAAKyjB,iBACLzjB,KAAK0jB,mBAGP1jB,KAAK2jB,sBAAwB3jB,KAAKkQ,oBAAoBsT,eACpDxjB,KAAKyjB,iBACLvd,iBAGFlG,KAAK8jB,aAAe9jB,KAAKkQ,oBAAoB6T,eAAe/jB,KAAKyjB,kBAAkB7R,UAAU,KAC3F5R,KAAKu6B,4BAEPv6B,KAAKu6B,2BAGPv6B,KAAKwkB,YAAYgW,aACd/oB,MACC,OAAK1L,IACC/F,KAAKyjB,kBACPzjB,KAAKs6B,SAAS12B,QAAQ2E,KACpBvI,KAAKujB,YAAY6Q,UAAU7rB,IAAOxC,OAIxC,OAAS,KAAM,OAAM/F,KAAKy6B,kBAC1B,UAEA,OAAO10B,GAASA,EAAMpC,QAAU3D,KAAK06B,WAAc16B,KAAK26B,mBAAsC,IAAjB50B,EAAMpC,SAEpFiO,UAAU7L,IACT/F,KAAK26B,mBAAoB,EACrB36B,KAAKyjB,mBACPzjB,KAAK2jB,sBAAsBe,QAC3B1kB,KAAKkQ,oBAAoB4B,SAAS,OAAU9R,KAAKyjB,mBAEnDzjB,KAAKw6B,aAAaL,KAAKp0B,KAI7B60B,mBACE56B,KAAKwkB,YAAYqW,SAAS,IAGpBN,0BACN,MAAMx0B,EAAY/F,KAAKujB,YAAY6Q,UAC/Bp0B,KAAK86B,mBAEP96B,KAAKwkB,YAAYC,WAAW1e,EAAU/F,KAAKs6B,SAAS,IAAK,CAAEzgB,WAAW,IACtE7Z,KAAK26B,mBAAoB,IAEzB36B,KAAKwkB,YAAYC,WAAW,GAAI,CAAE5K,WAAW,IAC7C7Z,KAAK26B,mBAAoB,GAInBG,kBAER,MAAM/0B,EAAY/F,KAAKujB,aAAa6Q,UACpC,OAAOruB,GAAaA,EAAU/F,KAAKs6B,SAAS,IAG9C3V,cACE3kB,KAAK8jB,aAAac,qDAtHT3e,GAAmBvG,sCAAnBuG,EAAmBoI,wfCL9B3O,sBACwBA,kBAAMA,kDAE9BA,oBAGEA,2DAASA,+BAETA,oBAAUA,iBAAKA,gGCRZ,MAAM0B,UAA+B6E,uEAA/B7E,KAAsBmH,IAAtBnH,iCAAsBiN,gaDRnC3O,4BAG8C,eACjCA,SAAeA,QAC1BA,mBAGAA,4BAGAA,0BAOFA,eAhBEA,wCAAmC,qCAExBA,+BAETA,6CAA2B,8BAG1BA,wCAMAA,+WEbE,WAAsB4E,GAC3B,OAAO,SAASyJ,EAAarL,EAAqBH,GAChD,IAAID,EAAiB,QACjBC,EAAWsM,KAAiC,mBAAnBtM,EAAWsM,IACtCvM,EAAiB,MACRC,EAAWqZ,KAAiC,mBAAnBrZ,EAAWqZ,MAC7CtZ,EAAiB,OAEnB,MAAM4D,EAA2BrG,EAA0BW,KAAKR,MAChE,IAAIiG,EACmB,UAAnB3D,GACF2D,EAAmB1D,EAAWD,GAC9BC,EAAWkB,MAAQyC,EAAyBD,EAAkB8H,EAAQrL,KAEtEuD,EAAmB1D,EAAWsM,IAC9BtM,EAAWsM,IAAM3I,EAAyBD,EAAkB8H,EAAQrL,GACpEuD,EAAmB1D,EAAWqZ,IAC9BrZ,EAAWqZ,IAAM1V,EAAyBD,EAAkB8H,EAAQrL,KAK1E,WAAmC4B,EAAkByJ,EAAQrL,GAC3D,OAAO,YAAYH,GACjB,IACE,OAAO+B,EAAiBy2B,MAAM/6B,KAAMuC,SAC7BD,GACF5C,gBACHoL,QAAQhL,MAAMwC,GAGhB+gB,WAAW,KACmB7S,OAAO2O,aAAgBtQ,IAAIrP,KACnCkc,OAAOpZ,EAAO,CAChC04B,eAAe,EACfC,UAAWltB,EAAOxM,YAAYgD,KAC9B22B,aAAcx4B,KAEf,mCCxCT,IAAYhD,8BAA8B,KACxCkN,UACApN,YACAA,sBACAA,8BACAA,gBACAA,wBACAA,wBACAA,oBACAA,sGCNF,IAAIgD,ECMG,MAAe8B,EA2BpB/C,YAAYmB,EAAiB,IA1B7B1C,uBAAoB,CAClB+R,UAAU,EACVE,SAAS,EACTC,UAAU,EACVC,SAAS,EACTC,UAAU,EACVC,WAAW,EACXC,UAAU,EACVC,OAAO,EACPC,mBAAmB,EACnBC,kBAAkB,EAClBC,eAAe,EACfC,oBAAoB,EACpBC,mBAAmB,EACnBC,gBAAgB,EAChBG,iBAAiB,EACjBC,gBAAgB,EAChBC,aAAa,GAGflT,mBAAe,EAEfA,iBAAc,IAAIN,KAElBM,kBAAmD,GAGjDoE,OAAO/D,OAAOL,KAAM0C,GAGlBy4B,cACF,ODpCG,aACL,MAAMptB,EAAwB,CAC5BqtB,SAAS,EACTC,WAAW,EACXC,UAAU,EACVC,gBAAgB,EAChBC,MAAM,EACNC,QAAQ,EACRC,UAAU,EACVC,SAAS,EACTC,eAAgBp8B,iBAChBq8B,SAAS,GAGX,GAAIr5B,EACF,OAAOA,EAITuL,EAAQqtB,UACH5qB,OAAOsrB,OAAYtrB,OAAOsrB,IAAOC,UAClCvrB,OAAOwrB,OACTxhB,UAAUyhB,UAAUhiB,QAAQ,UAAY,EAEtClM,EAAQqtB,UACVrtB,EAAQ6tB,eAAiBp8B,YAK3BuO,EAAQstB,iBAAmBa,eAAmB,IAC1CnuB,EAAQstB,YACVttB,EAAQ6tB,eAAiBp8B,cAI3BuO,EAAQutB,WAAa9gB,UAAUyhB,UAAUE,MAAM,4BAC3CpuB,EAAQutB,WACVvtB,EAAQ6tB,eAAiBp8B,aAG3BuO,EAAQwtB,iBACJ/qB,OAAOgK,UAAUyhB,UAAUE,MAAM,YAAc3rB,OAAOgK,UAAUyhB,UAAUE,MAAM,WAChFpuB,EAAQwtB,iBACVxtB,EAAQ6tB,eAAiBp8B,oBAG3BuO,EAAQ8tB,QAAU9tB,EAAQutB,UAAYvtB,EAAQwtB,eAG9CxtB,EAAQytB,OAA+BpqB,SAASgrB,aAC5CruB,EAAQytB,OACVztB,EAAQ6tB,eAAiBp8B,SAI3BuO,EAAQ0tB,QAAU1tB,EAAQytB,QAAUhrB,OAAO6rB,WACvCtuB,EAAQ0tB,SACV1tB,EAAQ6tB,eAAiBp8B,WAG3B,MAAMkD,IAAe8N,OAAO8rB,OACtB/5B,EAAaiO,OAAOgK,UAAU+hB,OAIpC,OAFoB/rB,OAAOgK,UAAUyhB,UAAUE,MAAM,UAEjCz5B,GAA6B,gBAAfH,IAAiCwL,EAAQqtB,UAAYrtB,EAAQ0tB,UAC7F1tB,EAAQ2tB,UAAW,GAEjB3tB,EAAQ2tB,WACV3tB,EAAQ6tB,eAAiBp8B,aAI3BuO,EAAQ4tB,SAAW5tB,EAAQ2tB,UAAY3tB,EAAQqtB,YAAc5qB,OAAOgsB,IAEpEh6B,EAAgBuL,EACTA,ECzCElO,GAGLs7B,YAAQz4B,IAEZ+5B,SACE,MAAM/5B,EAAO0B,OAAO/D,OAAO,GAAIL,MAC/B,cAAO0C,EAAKoO,yBACLpO,EAAK2U,YAEL3U,wGCvCJ,MAAMqL,UAAgCrO,MAC3C6B,YAAoBgB,GAClBiC,QADkBxE,gBAIpB08B,YAAYn6B,GACVvC,KAAK0b,OAAOnZ,GACZiC,MAAMk4B,YAAYn6B,GAGpBmZ,OAAOnZ,EAAqCD,EAAkC,IAG5E,MAAM4D,EAAgD,GACtD,GAAI3D,aAAoBoI,OACtB,GACE9K,gCACCyC,EAAa04B,eAAiBn7B,wCAC/B,CACA,MAAMoG,EAAa1D,EAASo6B,OAASp6B,EAASo6B,MAAMzf,MAAM,UAC1D9Y,OAAO/D,OAAO6F,EAAQ,CACpB+O,MAAO,QACPxJ,MAAO,cAELxF,GACF7B,OAAO/D,OAAO6F,EAAQ,CACpBqjB,YAAatjB,EAAW,GACxBkpB,SAAUlpB,EAAW,KAGzBC,EAAO3B,KAAOhC,EAASgC,KACvB2B,EAAOiF,QAAU5I,EAAS4I,iBAEnB5I,aAAoBC,KAAmB,CAMhD,MAAMyD,GAAe1D,EAASnC,KAAO,IAAIw8B,WAAW/8B,yBAC9CmG,EAAayW,OAAOla,EAASrC,QAC7BgH,EAAc,CAAClB,EAAY,GAAGA,EAAWkX,MAAM,IAAI,QACnD3c,EACJV,yDAAiEqH,EAAY,KAC7ErH,yDAAiEqH,EAAY,IAC/E,IAAKjB,GAAe1F,EAAgB,CAClC,IAAIX,EAAa,oBACjB,MAAMsO,GAAQ,QAAY3L,EAAU,QAAS,WAAY,cAAgB,OAAS,QAC9EA,EAASzC,OAASyC,EAASzC,MAAMyE,OACnC3E,EAAa2C,EAASzC,MAAMyE,KAC5B2B,EAAO3B,KAAOhC,EAASgC,MAEzBH,OAAO/D,OAAO6F,EAAQ,CACpB+O,QACAxJ,MAAO7L,EAAa,MAAQ2C,EAAS4I,QACrC0xB,kBAAmB78B,KAAK88B,mBAAmBv6B,WAI/C6B,OAAO/D,OAAO6F,EAAQ,CACpB+O,MAAQ3S,GAAgBA,EAAa2S,OAAU,OAC/CxJ,MAAOnJ,EAAamJ,OAAS,cAC7B8d,YAAajnB,EAAainB,aAAe,gBAGzCnlB,OAAOuB,KAAKO,GAAQvC,SACtBS,OAAO/D,OAAO6F,EAAQ5D,GAClBzC,0BACFwjB,WAAW,KACarjB,KAAKuO,SAASM,IAAIrP,KAC1B+Q,IAAIrK,IACjB,IAKD42B,mBAAmBv6B,GACzB,IAAID,EACJ,IACEA,EAAciD,KAAKC,UAAUjD,EAASzC,aAEtCwC,OAAc,EAEhB,MAAQpC,SAAQC,aAAYC,MAAKmE,OAAM4G,WAAY5I,EACnD,MAAO,CACLrC,SACAC,aACAC,MACAmE,OACA4G,UACArL,MAAOwC,EACP4C,OAAQ3C,EAAS2C,OACjBnF,KACEF,kCAA4C0C,EAASkxB,YACjDluB,KAAKC,UAAUjD,EAASkxB,kBACxB,EACN9wB,YACE9C,kCAA4C0C,EAASI,YACjD4C,KAAKC,UAAUjD,EAASI,kBACxB,0CAnGCoL,GAAuBrO,yCAAvBqO,EAAuBqF,QAAvBrF,EAAuB,qBAFtB,gICER,MAAO2B,EAIXnO,YAAoBsV,EAA4CtH,GAA5CvP,wBAA4CA,sBAFzDA,mBAAgB,IAAI+8B,SAAwBlpB,GAI7ClF,OAAI,qCACR,OAAOzI,EAAK82B,yBAAyB92B,EAAK+2B,gBADlC,GAINld,aACF,OAAO/f,KAAKk9B,QAGVD,oBACF,MAAME,EAAcn9B,KAAKuP,eAAe1I,KAAKu2B,iBACvCC,EAAoB7iB,UAAU8iB,SAC9BC,EAAyB/iB,UAAU8iB,SAASpgB,MAAM,KAAK,GACvDsgB,EACJC,8BAAmC5c,GAAQA,EAAKlT,OAAS0vB,IACzDI,8BAAmC5c,GAAQA,EAAKlT,KAAKqO,gBAAkBuhB,GAGzE,OAFeJ,GAAgBK,GAAgCC,sBAK3DC,UAAU3d,GAAqB,2CAC7B9Z,EAAK+2B,yBAAyBjd,GACpC9Z,EAAKsJ,eAAe1I,KAAO,CAAEu2B,iBAAkBn3B,EAAKi3B,UAFjB,GAK/BF,yBAAyBjd,GAAqB,qCAClD9Z,EAAK03B,cAAcl0B,KAAKsW,EAAOpS,MAC/B,MAAMiwB,EAAa7d,EAAOpS,KACpBkwB,EAAa53B,EAAK4Q,iBAAiBinB,IAAIF,GAAYG,kBACnD93B,EAAK+3B,eAAeJ,SACpBC,EAIN53B,EAAKi3B,QAAUnd,GATmC,GAY9Cie,eAAeJ,GAAkB,qCACrC,MAAMK,QAAmBh4B,EAAKi4B,WAAWN,GACzC,OAAOO,QAAmBF,IAFW,GAKzBC,WAAWne,GAAc,0BAErC,aADqBjF,QAAO,KAA8BiF,IAC5Cqe,SAFuB,0CAhD5B1uB,GAAwByD,oDAAxBzD,EAAwB0D,QAAxB1D,EAAwB,qBAFvB,0ICWP,MAAMpN,EAMXf,YAAoB0E,EAA4CD,GAA5ChG,wBAA4CA,oBAHhEA,gBAA8B,IAAIR,KAClCQ,qBAAkB,IAAIR,KAGhBuO,4BACF/N,KAAKwU,YAAa,QAAM,OAAS,KAAQxU,KAAKq+B,iBAAiB5sB,MAAK,OAAa,OAIrFlB,IAAItK,GACEuK,OAAO8tB,SACTt+B,KAAKu+B,qBAAqBv+B,KAAKw+B,aAAav4B,IAE5CjG,KAAKy+B,eAAe7uB,KAClB,KACE5P,KAAKu+B,qBAAqBv+B,KAAKw+B,aAAav4B,KAE9C,KACEjG,KAAKu+B,qBAAqBv+B,KAAKw+B,aAAav4B,MAM5Cu4B,aAAav4B,GACnB,MAAMD,EACJhG,KAAK0+B,4BAA4Bh/B,KAC7BM,KAAK0+B,iBAAiBhkB,OACtBlK,OAAO2e,SAAStG,KAChB3hB,EAAUsJ,OAAO2e,SAAStG,KAEhC,IAAItoB,EACAP,KAAK+O,aAAa8B,MAAM4c,MAAQztB,KAAK+O,aAAa8B,MAAM4c,KAAK7rB,KAC/DrB,EAASP,KAAK+O,aAAa8B,MAAM4c,KAAK7rB,GAAG+8B,YAE3C,MAAM/+B,EAA0B,IAC3BqG,EACH24B,QAAS7wB,YACTuC,YAAavC,SACb8wB,QACAC,UACAC,MAAM,IAAIvpB,MAAOinB,SACjBuC,UAEF,GAAKxuB,OAAe8tB,SAAU,CAC5B,MAAMpwB,EAAW,IAAIsC,OAAO8tB,SACtBr3B,EAAciH,EAAS+wB,iBAC7B76B,OAAO/D,OAAOT,EAAQ,CACpBu7B,QAASl0B,EAAYk0B,QACrB+D,GAAIj4B,EAAYi4B,GAChBC,OAAQjxB,EAASkxB,gBACjBC,SAAUnxB,EAASoxB,gBAGvB,OAAO1/B,EAGD2+B,qBAAqBt4B,GAC3B,MAAMD,EAAU,GAAG+H,mBACb7G,EAAOwN,aAAaC,QAAQ3O,GAClC,IAAIzF,EAAmB,GACnB2G,IACF3G,EAAmBgF,KAAKsP,MAAM3N,IAI3B3G,EADgCqY,KAAK1K,GAAUlO,KAAKu/B,cAAct5B,EAASiI,KAE9E3N,EAAiBi/B,QAAQv5B,GAGvB1F,EAAiBoD,OAASoK,oCAC5BxN,EAAiBoD,OAASoK,mCAE5B2G,aAAaqY,QAAQ/mB,EAAST,KAAKC,UAAUjF,IAEzCwN,2BACF/N,KAAKq+B,gBAAgB50B,QAGlBsE,gBAA4C,UAAlB9H,EAAQgP,OACrCnK,QAAQhL,MAAMmG,GAIVw4B,eACN,OAAO,IAAI1tB,QAAQ,CAAC9K,EAASD,KAC3B,MAAMkB,EAASkK,SAASkD,cAAc,UACtCpN,EAAOwE,KAAO,kBACdxE,EAAOuxB,IAAM,uEACbvxB,EAAOu4B,OAASx5B,EAChBiB,EAAOw4B,QAAU15B,EACjBoL,SAASrR,KAAKkU,YAAY/M,KAItBq4B,cAAct5B,EAAuBD,GAE3C,GAAIiF,KADiB00B,IAAI,IAAInqB,KAAKvP,EAAK84B,MAAMa,UAAY,IAAIpqB,KAAKxP,EAAK+4B,MAAMa,YAC9Dt9B,EAAkBu9B,aAAc,CAC7C,MAAMt/B,EAAQ6D,OAAO/D,OAAO,GAAI4F,UACzB1F,EAAMw+B,KACb,MAAMn/B,EAAQwE,OAAO/D,OAAO,GAAI2F,GAChC,cAAOpG,EAAMm/B,KAENx5B,KAAKC,UAAUjF,KAAWgF,KAAKC,UAAU5F,GAGlD,OAAO,GA5Ge0C,eAAe,0CAD5BA,GAAiBC,oDAAjBD,EAAiB8Q,QAAjB9Q,EAAiB,qBAFhB,kGCZR,MAAOyN,EAMXxO,YAAoB4T,EAAoB1J,EAAsBoL,GAA1C7W,YAAoBA,aAAsBA,wBAL9DA,iBAAc,GACdA,kBAAe,GACfA,kBAAe,GACfA,wBAAqB,GAIrB2O,OACE3O,KAAK8/B,mBAGPC,kBACM//B,KAAKggC,cACPhgC,KAAKigC,aAAajgC,KAAKggC,cAI3BjqB,wBACM/V,KAAKkgC,oBACPlgC,KAAKmgC,eAAe,CAAC,CAAE57B,KAAM,cAAeqC,QAAS5G,KAAKkgC,sBAI9DJ,mBACE9/B,KAAKogC,YAAcpgC,KAAK6W,iBAAiBa,QAAQ,kCAAoC1X,KAAKogC,YAC1FpgC,KAAKggC,aAAehgC,KAAK6W,iBAAiBa,QAAQ,mCAAqC1X,KAAKggC,aAC5FhgC,KAAKqgC,aAAergC,KAAK6W,iBAAiBa,QAAQ,mCAAqC1X,KAAKqgC,aAC5FrgC,KAAKkgC,mBACHlgC,KAAK6W,iBAAiBa,QAAQ,yCAA2C1X,KAAKkgC,mBAQrED,aAAaK,EAA0BC,GAAmB,qCACrE,MAAMC,EAAwBl+B,EAAK89B,aAAe99B,EAAKuU,iBAAiBa,QAAQpV,EAAK89B,aACrF,IAAIK,EAAkBH,GAAoBh+B,EAAKuU,iBAAiBa,QAAQ4oB,GACnEG,IACHA,EAAkBn+B,EAAK09B,cAEzB,MAAMU,EAAyBp+B,EAAK+9B,cAAgB/9B,EAAKuU,iBAAiBa,QAAQpV,EAAK+9B,cACvF,IAAIM,EAAYH,EACZG,EACFA,GAAa,IAAIF,IAEjBE,EAAYF,EAEdv5B,GAAiBq5B,EACfI,GAAa,IAAIJ,IACRA,IACTI,EAAYJ,GAEVI,GAAaD,IACfC,GAAa,IAAID,KAEnBp+B,EAAKmJ,MAAMm1B,SAASD,IArBiD,GA8BhER,eAAeU,GACpBA,EAASj9B,QAAQk9B,IACfA,EAAQl6B,QAAU5G,KAAK6W,iBAAiBa,QAAQopB,EAAQl6B,SACxD5G,KAAKmV,KAAK4rB,UAAUD,4CAtEb/wB,GAAmBoD,gEAAnBpD,EAAmBqD,QAAnBrD,EAAmB,qBAFlB,yFCIP,MAAMlQ,EAQX0B,cALAvB,kBAAc,EAEdA,kBAAwC,KACxCA,aAA6C,IAAIN,KAIjDiP,KAAKZ,EAAqBrL,GACxB1C,KAAKghC,QAAUjzB,EACf/N,KAAKihC,eAAiBv+B,EACtB1C,KAAKkhC,aAAc,EAEnBlhC,KAAKghC,QAAQG,YAAYvvB,UAAU,IAAM5R,KAAKwiB,SAGhD/L,KAAK1I,GACH,IAAK/N,KAAKkhC,YACR,MAAMv2B,MAAM,2CAId,GADA3K,KAAKihC,eAAerM,SAChB7mB,EAAKoU,iBAIP,MAAMxX,MAAM,8CAGd,OANE3K,KAAK0nB,aAAe1nB,KAAKihC,eAAehc,gBAAgBlX,EAAKoU,kBAC7D/d,OAAO/D,OAAOL,KAAK0nB,aAAaC,SAAU5Z,EAAK4U,eAAiB,IAKlEve,OAAO/D,OAAOL,KAAKghC,QAAShhC,KAAKohC,oBAAqBrzB,EAAK8U,gBAC3D7iB,KAAKghC,QAAQvqB,OACbzW,KAAKqhC,qBAEErhC,KAAKshC,QAGNF,oBACN,MAAO,CACLte,KAAM,OACNjB,SAAU,MACV3J,cAAc,GAIlBsK,MAASzU,EAAmC,CAAE7N,OAAQV,aACpDQ,KAAK0nB,aAAalC,UAClBxlB,KAAKihC,eAAerM,QACpB50B,KAAKghC,QAAQxe,QACbxiB,KAAKshC,QAAQ73B,KAAKsE,GAGpBszB,qBACErhC,KAAKshC,QAAQC,UAAU39B,QAAQmK,GAAYA,EAASyzB,mDAtD3C3hC,gCAA2BuT,QAA3BvT,EAA2B,qBAF1B,qCCPd,IAAYH,IAOAF,ECPAgD,ECAA3C,EAOAyE,EAOAyJ,EASArL,ECvBAH,ECAAD,ECAA4D,ECAAD,ECAAD,ECAAkB,ECAA3G,EAKAX,ECLAsO,EAOAjH,ECPA3F,ECAAD,ECAA2F,ECAA5F,ECAAiB,ECAA0D,8KhBAAuC,QAAqB,KAC/BA,aACAA,uBACAA,qBACAA,qBAGF,SAAYA,GACVA,gBACAA,oBACAA,kBACAA,gCACAA,UACAA,cACAA,kBACAA,gBACAA,4BATF,CAAY9I,MAAY,KCPxB,SAAY8I,GACVA,UACAA,cAFF,CAAY9F,MAAmB,KCA/B,SAAY8F,GACVA,cACAA,YACAA,eAHF,CAAYzI,MAAqB,KAOjC,SAAYyI,GACVA,oBACAA,cACAA,oBACAA,gBAJF,CAAYhE,MAAkB,KAO9B,SAAYgE,GACVA,gBACAA,0BACAA,kBACAA,oBACAA,4BACAA,0BANF,CAAYyF,MAAoB,KAShC,SAAYzF,GACVA,kBACAA,gDACAA,wCAHF,CAAY5F,MAAwB,KCvBpC,SAAY4F,GACVA,8BACAA,gCACAA,sCACAA,qCACAA,kCACAA,kCACAA,8BAPF,CAAY/F,MAAY,KCAxB,SAAY+F,GACVA,uCACAA,sCACAA,mDAHF,CAAYhG,MAAmB,KCA/B,SAAYgG,GACVA,aACAA,WACAA,eACAA,aACAA,gBACAA,uBACAA,cACAA,qBACAA,6BATF,CAAYpC,MAAyB,KCArC,SAAYoC,GACVA,YACAA,UACAA,YACAA,aACAA,iBACAA,2BACAA,uBACAA,sBACAA,6BACAA,wBACAA,+BACAA,eACAA,sBACAA,aACAA,oBACAA,cACAA,qBACAA,UACAA,iBACAA,oBApBF,CAAYrC,MAA+B,KCA3C,SAAYqC,GACVA,cACAA,cAFF,CAAYtC,MAAiB,KCA7B,SAAYsC,GACVA,yDACAA,kEACAA,sDACAA,gDACAA,0EACAA,gDACAA,2DAPF,CAAYpB,MAAiB,KCA7B,SAAYoB,GACVA,YACAA,kBAFF,CAAY/H,MAA0B,KAKtC,SAAY+H,GACVA,gBACAA,kBACAA,YACAA,cACAA,gBALF,CAAY1I,MAA4B,KCLxC,SAAY0I,GACVA,gBACAA,cACAA,YACAA,gBAJF,CAAY4F,MAAoB,KAOhC,SAAY5F,GACVA,cACAA,cACAA,cAHF,CAAYrB,MAAgB,KCP5B,SAAYqB,GACVA,8BACAA,wCACAA,oCACAA,kBACAA,4BACAA,0BACAA,0CACAA,kCARF,CAAYhH,MAAc,KCA1B,SAAYgH,GACVA,kBACAA,kBACAA,gBACAA,sBACAA,4BACAA,0BACAA,kCAPF,CAAYjH,MAAiB,KCA7B,SAAYiH,GACVA,qBACAA,yBACAA,qBACAA,2BACAA,eACAA,mCACAA,+BAPF,CAAYtB,MAAsB,KCAlC,SAAYsB,GACVA,iBACAA,eAFF,CAAYlH,MAAmB,KCA/B,SAAYkH,GACVA,oBACAA,6BACAA,+BACAA,gBACAA,kBACAA,kBACAA,gBACAA,mCACAA,oBACAA,cACAA,0BAXF,CAAYjG,MAAyB,KCArC,SAAYiG,GACVA,sBACAA,kBAFF,CAAYvC,MAAe,qECApB,MAkBMvG,EAAc,CAACK,KAAQyE,IAAMA,EAAEuH,OAAO,CAACkC,EAAGrL,IAAM0B,OAAO2J,GAAGrL,GAAI7C,GAE9D2C,EAAsB3C,KAC5BA,IAGa,OAAXA,IAAoB6G,MAAMC,QAAQ9G,IAA6B,iBAAXA,gCCpBtD,WAAyBL,GAC9B,OAAOA,mLCAF,MAAMwG,EAAiB,qMAEvB,WAA2BqF,GAChC,MAAMtB,EAAM,IAAI03B,OAAOz7B,GACjB8D,EAAQuB,EAAY5H,OAAS4H,EAAY5H,MAAMi+B,KAAOr2B,EAAY5H,MAAMi+B,OAASr2B,EAAY5H,MACnG,OAAOsG,EAAI43B,KAAK73B,IAAiB,CAAE2C,OAAO,0cCWtC,MAAOm1B,UAAwBC,KAYnCtgC,YACEugC,EAAiB,KACjBC,EACAC,GAEAx9B,MAAMs9B,EAAWC,EAAiBC,GAf5BhiC,sBAAkC,GAElCA,uBAAiD,GAEjDA,wBAA0B,IAAKy9B,0BAGvCz9B,gBAAY,EASVA,KAAKiiC,oBAAoBF,GACzB/hC,KAAKkiC,iBAMPC,oBACEC,EACAC,GAKI37B,MAAMC,QAAQy7B,GAChBA,EAAkBx+B,QAAQ0+B,IACxBtiC,KAAKuiC,oBAAoBD,KAG3BtiC,KAAKuiC,oBAAoBH,GAG3BpiC,KAAKwiC,gBAAgBH,GAKvBI,uBAAuBpO,GACrBr0B,KAAK0iC,kBAAoB1iC,KAAK0iC,kBAAkBh9B,OAAOi9B,GAAoBA,EAAiBtO,MAAQA,GACpGr0B,KAAKwiC,kBAGPI,mBAAmBC,GACjB7iC,KAAK8iC,iBAAiBv/B,KAAKs/B,GAC3B7iC,KAAKwiC,kBAKPO,sBAAsBC,GAChBhjC,KAAK8iC,iBAAiBn/B,QAAUq/B,IAGpChjC,KAAK8iC,iBAAiBhpB,OAAOkpB,EAAgB,GAC7ChjC,KAAKwiC,mBAGPS,cACE,MAAMC,EAAWljC,KAAKmjC,MACtB3+B,MAAMy+B,cACDC,GACFljC,KAAKojC,cAAoCjJ,KAAKn6B,KAAKE,QAIxDmjC,gBACE,MAAMC,EAAatjC,KAAKujC,QACxB/+B,MAAM6+B,gBACDC,GACFtjC,KAAKojC,cAAoCjJ,KAAKn6B,KAAKE,QAIxDgiC,kBACEsB,OAAMxjC,KAAKojC,cAAepjC,KAAKw6B,cAC5B/oB,MACCgyB,OAAS,KAAMnV,OAAM,OACrB3c,OAAI,IAAM0R,WAAW,IAAMrjB,KAAK0jC,cAEjC9xB,YAIL8xB,WAGE,GAFA1jC,KAAK2jC,UAAY3jC,KAAK4jC,SAAW5jC,KAAKmjC,OAEjCnjC,KAAK2jC,UAER,YADA3jC,KAAK6jC,sBAAmBhwB,GAI1B,MAAMlO,EAAsB,GACtBtC,EAAc,GAEpBe,OAAOuB,KAAK3F,KAAK4L,QAAQhI,QAAQywB,IAC/B,IAAKr0B,KAAK8jC,mBAAmBzP,GAC3B,MAAM,IAAI1pB,MACR,6BAA6B0pB,4DAIjC1uB,EAAKpC,KAAKvD,KAAK8jC,mBAAmBzP,IAClCjwB,OAAO/D,OAAOgD,EAAQrD,KAAK4L,OAAOyoB,MAGpCr0B,KAAK6jC,iBAAmB,CACtBl+B,OACAtC,UAII4+B,oBACNF,GAEA,MAAMc,GAAakB,QAAmBhC,IACrCA,EAA2CiC,WACvCjC,EAA2CiC,WAC5CjC,GAECc,IAIL7iC,KAAK8iC,iBAAmBp8B,MAAMC,QAAQk8B,GAAaA,EAAY,CAACA,IAG1DN,oBAAoB0B,GAC1B,MAAMC,EAAwBlkC,KAAK0iC,kBAAkBppB,UACnDqpB,GAAoBA,EAAiBtO,MAAQ4P,EAAoB5P,MAGrC,IAA1B6P,EACFlkC,KAAK0iC,kBAAkBwB,GAAyBD,EAEhDjkC,KAAK0iC,kBAAkBn/B,KAAK0gC,GAgBxBzB,gBAAgBH,GACtB,MAAM2B,EAAiC,IAAIhkC,KAAK8iC,oBAAqB9iC,KAAKmkC,6BAC1EnkC,KAAKokC,cAAcJ,GACnBhkC,KAAKqkC,uBAAuBhC,GAGtB8B,4BACN,OAAKnkC,KAAK0iC,kBAAkB/+B,OAIrB3D,KAAK0iC,kBAAkBjgC,IAAKkgC,IACjC,MAAQtO,MAAKhxB,SAAQihC,oBAAoB3B,EAEzC,OAAO2B,GACHtkC,KAAKukC,eAAeD,GAAiBjhC,GACrCrD,KAAKwkC,oBAAoBnQ,EAAKhxB,KAR3B,GAYHkhC,eAAeE,EAAoBphC,EAAS,MAClD,OAAQA,EAASohC,KAAsBphC,GAAUohC,EAI3CD,oBAAoBE,EAA8CrhC,GACxE,IAGE,OAFAA,EAASqD,MAAMC,QAAQtD,GAAUA,EAASA,EAAS,CAACA,QAAUwQ,EAE1D6wB,IAAiBC,UACZC,EAGF5kC,KAAKukC,eAAeM,KAAWH,GAAerhC,GACtD,MACC,MAAMsH,MAAM,oCAAoC+5B,0CAtGpDrxB,IADCC,SACD1T,gHA4FAyT,IADCC,SACD1T,wJCrMI,MAAOklC,UAA+BC,KAC1CC,QACElD,EACAC,EACAC,GAEA,OAAO,IAAIJ,EAAgBE,EAAWC,EAAiBC,uEAN9C8C,KAAsB9a,GAAtB8a,mCAAsB1xB,QAAtB0xB,EAAsB,qBAFrB,SCMP,MAAMzjC,EACXE,YAAoBwI,2BAEpBk7B,UAAUl7B,GACR,OAAKA,EAGDA,GAAQpE,KAOHoE,EAAOpE,KAAKlD,IAAIqH,GAAO9J,KAAK6W,iBAAiBa,QAAQ5N,EAAKC,EAAO1G,SAAS8B,KAAK,MAG/Ef,OAAOuB,KAAKoE,GAChBtH,IAAIqH,GAAO9J,KAAK6W,iBAAiBa,QAAQzR,yBAA8B6D,GAAMC,EAAOD,KACpF3E,KAAK,MAdD,0CALA9D,GAA4B4F,0EAA5B5F,EAA4B6jC,oCAA5B7jC,EAA4B+R,QAA5B/R,EAA4B,YCHzC,MAAM2F,EAAiB,CAACtH,KAAcF,KAAqBA,KAAagD,MAKlE8F,EAAY,CAAC,CAAC,CAAEyV,QAASve,KAAoBwe,SAAU1c,KAetD,MAAMgK,4GAFA,IAAIhD,GAAUuW,SAVZ7X,EARStH,KAAcF,KAAqBA,KAAagD,sDCPxE,MAAMhD,EAAS,mCACTgD,EACJ,2HAEW3C,EAAc,CACzBslC,YAAY,EACZ5gC,KAAM,aACNq6B,QAAS,2BACTwG,eAAgB,QAChBzU,SACA0U,aACAlqB,oBAAqB,CAAC3b,EAAQgD,GAC9B6Y,WAAY,0BACZiqB,OAAQ,GACRC,QAAS,CAAEnlC,IAAK,IAChBolC,gBAAiB,CACf1xB,SAAS,EACT2xB,MAAO,CACL52B,IAAK,CAAEiF,SAAS,EAAMmI,QAAS,IAAMK,WAAY,EAAGF,sBAAuB,CAAC,MAC5E7G,KAAM,CAAEzB,SAAS,EAAOmI,QAAS,KAAMK,WAAY,EAAGF,sBAAuB,CAAC,MAC9EoV,MAAO,CAAE1d,SAAS,EAAOmI,QAAS,KAAMK,WAAY,EAAGF,sBAAuB,CAAC,MAC/EqV,IAAK,CAAE3d,SAAS,EAAOmI,QAAS,KAAMK,WAAY,EAAGF,sBAAuB,CAAC,MAC7EX,OAAQ,CAAE3H,SAAS,EAAOmI,QAAS,KAAMK,WAAY,EAAGF,sBAAuB,CAAC,QAGpFyX,cAAe,CACb/f,SAAS,EACTggB,eAAgB,KAElB4R,aAAc,CACZ5xB,SAAS,EACT6xB,iBAAkB,GAClBC,+BAAgC,CAAC,IAAK,MAAO,OAC7CC,wBAAwB,EACxBC,eAAe,EACfC,wBAAyB,IACzBT,OAAQ,GACR7wB,UAAU,EACVuxB,iBAAiB,EACjBC,iBAAiB,GAEnBC,WAAY,CACVpyB,SAAS,EACTF,OAAQ,IAEVuyB,uBAAuB,2DC5ClB,MAAMzmC,EAAc,QAGdG,EAAa,2CCL1B,OACA,QACA,KACA,oBAEA,WACA,KACA,oBAEA,QACA,IACA,oBAEA,WACA,IACA,oBAEA,QACA,IACA,oBAEA,WACA,IACA,oBAEA,QACA,KACA,oBAEA,WACA,KACA,oBAEA,QACA,KACA,oBAEA,WACA,KACA,qBAGA,cACA,aACA,mCACA,8CACA,gCACAkO,IAIA,kBACA,0BACA+M,MAGAtb,0BACAA,UACA4mC","names":["c","Map","i","H","h","n","error","body","this","headers","status","statusText","url","assign","clone","C","bind","G","apiErrorsInterceptorService","interceptHttpResponsesWithCode","toastMessage","durationMs","parsers","defaultParser","defaultGraphQlParser","parserStrategies","appParser","pathBuilder","V","j","v","constructor","build","g","I","b","id","relation","action","L","linkUnlinkRel","u","relationId","count","requestMapper","W","S","l","a","map","O","queryParams","file","files","bodyParser","responseType","reportProgress","skipInterceptors","s","withCredentials","observe","params","F","push","headerName","value","it","length","forEach","M","append","z","dt","nt","st","at","Object","ct","R","name","super","embed","computedFields","page","size","paginationInfo","tt","query","sorting","search","method","join","pageNumber","pageSize","filters","JSON","stringify","orderby","filter","keys","property","direction","responseMapper","Y","P","p","E","getEnvelope","modelInstanceFactory","modelInstancesFactory","unwrapExtraModelFields","isResponsePaged","isResponseList","pagination","Array","isArray","content","data","success","envelopeMapper","x","A","y","req","event","metadata","uiMessages","httpParams","isMockResponse","originalBody","items","mapPagination","first","hasPreviousPage","last","hasNextPage","pageIndex","itemsInPage","totalItems","totalCount","totalPages","pimcoreParser","r","et","mapQueryRequest","ids","variables","context","mapFiltersVariables","mappedVariables","filterAccumulator","mapSortingVariables","mapPaginationVariables","fileObject","mapMutationRequest","mutation","optimisticResponse","optimisticUpdate$","serialised","input","update","next","sortBy","reverse","sortOrder","after","N","D","mapQueryResponse","mapContent","mapQuerySorting","mapQueryPagination","mapMutationResponse","modelMapper","extractResponseAndMetadata","getModel","isResponseArray","getContentAsArray","calculatePagination","Error","extractMutationResponseAndMetadata","responseEnveloped","console","edges","node","Math","ceil","message","output","q","ot","networkStatus","bulkResponse","title","type","target","errors","reduce","rt","urls","homePageUrl","signInUrl","signOutUrl","pwa","serviceWorker","checkUpdateInterval","installPrompt","askAgainAfterNDays","required","email","maxlength","minlength","min","max","requiredTrue","nullValidator","emailsList","atLeastRequired","isEmpty","validRegex","invalidRegex","META_TAGS","TITLE","DEFAULT_TITLE","POSTFIX","DESCRIPTION","SUPPORTED_LANGUAGES","code","label","DEFAULT_LANGUAGE","LOCAL_STORAGE_VERSION","d","fullScreenMessageComponent","okCancelDialogComponent","m","VALIDATION_MESSAGES","ngOnInit","selectors","BitfAppSessionService","injector","localeReady","platformReady","currencyLocaleReady","init","translate","get","TranslateService","storeService","StoreService","loaderService","LoaderService","router","Router","breakpointObserver","BreakpointObserver","storageService","StorageService","bitfDynamicLocaleService","BitfDynamicLocaleService","localeP","then","readyState","bitfMetadataService","BitfMetadataService","uiMessagesListenerService","UiMessagesListenerService","apiCallStateService","ApiCallStateService","initMobileFixes","initLogSender","environment","log","window","printEnv","APP_VERSION","table","Breakpoints","store","activeBreakpoints","Promise","all","setVhValue","vh","innerHeight","document","documentElement","style","setProperty","fromEvent","pipe","debounceTime","tap","subscribe","initBreakpointListener","setStore","isXSmall","isMatched","isSmall","isMedium","isLarge","isXLarge","isHandset","isTablet","isWeb","isHandsetPortrait","isTabletPortrait","isWebPortrait","isHandsetLandscape","isTabletLandscape","isWebLandscape","setLayoutBreakpoints","eStoreActions","isHandsetLayout","isTabletLayout","isWebLayout","i0","factory","__decorate","BitfTryCatch","BitfTagManagerService","dataLayer","tagManagerConf","isConfiguredCorrectlyAndEnabled","injectScripts","apiKey","undefined","enabled","warn","head","appendChild","createScript","TAG_MANAGER_DATA_LAYER","text","script","createElement","bitfLoggerService","logEvents$","sendLogs","localStorage","getItem","lines","parse","ht","line","app","level","env","meta","appVersion","buildDate","httpClient","post","Date","now","removeItem","AppSessionService","bitfTagManagerService","bitfLogDnaSenderService","responsiveService","setDefaultDescription","verticalPosition","horizontalPosition","duration","keyboardClose","closeButtonText","showCloseButton","show","defaultToastData","matSnackBar","open","clearAllMessages","dialog","appSessionService","translateService","toastMessagesService","dialogsService","authService","initStrategies","parseUiMessages","initApiErrorsInterceptorSrategies","initUiMessagesStrategies","uiMessages$","apiErrorsInterceptorStrategies","strategy","uiMessagesStrategies","payload","instant","displayToastMessage","displayFullScreenMessage","width","maxWidth","height","maxHeight","closeAll","disableClose","okText","afterClosed","isSessionExpiredNotified","signOut","navigate","selectEvent","touchEvent$","addItem","touchEventSnapshots","some","triggerItemId","events","triggers","includes","startTime","intervalId","processSnapshot","setInterval","timeInterval","findIndex","endTime","eventType","milliseconds","elapsedTime","sort","ft","emitEvent","splice","clearInterval","notifyEvent","indexOf","isNotified","sound","Audio","play","vibration","vibrate","navigator","PRODUCT_LIST","path","redirectTo","pathMatch","loadChildren","e","Z","DesktopModule","relativeLinkResolution","T","authInterceptorUrls","$","mockApiUrl","intercept","has","ut","delete","handle","K","set","authTokenMetaData","token","St","toLowerCase","timeout","Tt","pt","retryForStatusesCodes","Ot","maxRetries","Lt","_t","String","BitfApiErrorsInterceptor","bitfIsCallingApi","EBitfInterceptors","newReq","errorResponse","HttpErrorResponse","statusCode","statusCodes","split","sC","BITF_CONFIGS","shouldShowSessionExpiredMessage","showMessage","selectStore","take","isTokenExpired","authState$","EBitfAuthState","customHeaders","mapEvent","parserStrategy","provide","useClass","multi","useFactory","create","uri","includeExtensions","cache","link","defaultOptions","watchQuery","fetchPolicy","errorPolicy","deps","imports","loader","w","Et","bootstrap","bootstrapModule","rootInjector","catch","register","cookieTitle","bannerCode","fr","es","en","de","iubendaPrivacyData","selectedPrivacyData","localeService","locale","setCookieBanner","_iub","csConfiguration","ccpaAcknowledgeOnDisplay","consentOnContinuedBrowsing","countryDetection","enableCcpa","floatingPreferencesButtonDisplay","invalidateConsentWithoutLog","perPurposeConsent","siteId","whitelabel","cookiePolicyId","lang","banner","acceptButtonCaptionColor","acceptButtonColor","acceptButtonDisplay","backgroundColor","backgroundOverlay","brandBackgroundColor","brandTextColor","closeButtonDisplay","customizeButtonCaptionColor","customizeButtonColor","customizeButtonDisplay","explicitWithdrawal","listPurposes","logo","position","rejectButtonCaptionColor","rejectButtonColor","rejectButtonDisplay","textColor","setAttribute","componentFactory","resolver","resolveComponentFactory","component","sidenavGlobalService","close","onToggleMenuButton","bitfMatSidenavService","componentData","brands","sidenavOptions","mode","mt","U","onLoaderChange","loaderData","isLoading","hide","setTimeout","canShowLoader","requestPart","getRequestPart","apiCallStateName","apiRequestPartKey","paginationRequestPart","isDropDown","initDropdown","subscription","getStateStore$","option","updateSortState","onSelectionChange","dispatchEvent","options","Q","find","vt","formControl","patchValue","reset","ngOnDestroy","unsubscribe","It","config","mutateView","listenForStoreActions","createComponent","inverted","uiRoleManagerService","canI","createEmbeddedView","setVisibility","embededViewRef","destroy","isNativeElementReal","renderer","removeAttribute","nativeElement","rootNodes","addClass","setStyle","viewRef","templateRef","innerHTML","storeActionsToListen","add","store$","touchItemKey","bitfTouchEvent","touchstart","isTouchDeviceOnly","touchEventsService","touchend","touchcancel","mousedown","mouseup","Ft","Mt","Ct","Bt","xt","bt","Dt","Rt","static","ngModule","providers","componentRef","instance","closeSidenav","showPrevSlide","activeIndex","images","showNextSlide","showSlide","createdBy","modifiedBy","serialiseDate","getMonth","getDate","getFullYear","firstName","lastName","canViewLogs","desktop","URL","href","desktop_15","mobile","mobile_15","filename","mimetype","logo_white","logo_black","image","subtitle","description","children","frontImage","primaryPackaging","secondaryPackaging","eu_item","ean","shadeName","segment","t","mapQueryRequestParams","getParser","mapMutationRequestParams","mapEnvelope","o","handleApolloErrors$","handleUiMessages$","f","revertOptimisticUpdates$","apiParser","_","apollo","bitfErrorHandlerService","initHelper","getThrottledObservables","lt","yt","At","Ut","gt","responses","helper","disableHideLoader","mutate","extractPropsToMutate","k","uploadFile","getAssetFolder","getBrandById","brandId","getBrandListing","getProduct","getProductListing","BitfAuthService","Subject","usersService","UsersService","BitfErrorHandlerService","isTokenValid","activateRefreshToken","extractRenewToken","response","signInWithToken","newToken","_authTokenMetaData","metaData","setItem","clearTimeout","refreshTokenHandler","tokenState","isExpired","isExpiring","isTokenExpiring","signIn","loginResponse","decodeToken","user","setUser","clearAuthData","redirectAfterSignOut","loginUserWithToken","getMe","catchError","TimeoutError","expiresAt","tokenAlertTresholdMinutes","watchTokenExpiration","tokenExpirationHandler","tokenEvents$","timer","refreshToken","renewTokenRetryAttempt","renewTokenMaxAtempt","renewToken","renewTokenDelay","reject","onLoginSuccess","onLoginError","errorMessage","authState","notifyClient","EBitfUiMessageType","location","navigateByUrl","onLoginInfo","infoMessage","handleRedirect","args","storage","redirectUrl","setData","replace","bitfToTranslate","EBitfUiMessageTarget","encodedToken","atob","exp","iat","handleAuthentication","parseRequestParams","buildRequestPath","mapRequestOptions","mapBodyRequest","getPathBuilder","getBaseApiUrl","getApiUrl","apiUrl","apiEntity","getRequestMapper","getResponseMapper","getModelMapper","mockApiParser","isBodyRaw","FormData","entries","isMockActive","request","list","getById","patch","put","bulkDelete","bulkPatch","getRel","getRels","getRelById","postRel","putRel","patchRel","deleteRel","countRel","linkRel","unLinkRel","getFormItemsConfig","download","fetch","upload","resetUploadState","bodyData","fileFormFieldName","parseUploadState","uploadMultiple","uploadError","hasUploadErrors","isUploading","uploadedPercentage","round","loaded","total","isProcessing","isUploaded","toLocaleLowerCase","requestBody","logTiming","elapsed","hideTimeout","graphQlConfig","requestTimeout","clearTimeouts","showCallsCounter","timeoutId","hideTimeoutId","forceHide","formValue","key","defaultPartData","_storeSection","_storePart","part","_part","chips","clear","requestParts","pageIndexOffset","apiRequestPartName","apiCallStateMapper","actionParams","mapApiCallState","apiRequest","partName","computedApiRequestParts","buildApiRequestPagination","buildApiRequest","assignApiRequestValuesAsArray","assignApiRequestValuesAsObject","initRequestParts","apiCallStates","apiCallState","updateApiCallState","getStoreActionFor","getApiCallState","apiCallStates$","dispatchApiCallState","getDefaultApiCallState","getApiRequest","getApiCallStateOservable","isInitialBreakpoint","Pt","initialData","storeClass","_store","resetStore","resetStorage","Nt","storageClass","nativeStorage","storageKey","initStorage","validateStorage","getEmptyStorage","createdAt","modifiedAt","version","X","updateStorage","clearData","migrateStorage","storage$","prop1","sessionStorage","READ_ONLY","xs","sm","md","lg","xl","initImageProperties","ngOnChanges","sources","firstChange","layout","defaultBreakpoint","src","srcset","sizes","imgStyle","breakpoints","setSrcsetAsResponsive","setSrcsetAsFixed","values","updateImgStyle","objectFit","aspectRatio","prompt","form","formBuilder","group","isRequired","dialogData","okButtonType","onOk","dialogRef","onCancel","_pagination","updatePaginator","pageSizeOptions","onPageChange","pageChange","emit","onMatPagechange","formKey","formKeys","patchWithApiRequestPart","valueChanges","debounceTimeMs","minLength","isFirstSearchDone","clearSearchField","setValue","hasInitialValue","apply","fromDecorator","className","functionName","browser","isOpera","isFirefox","isSafari","isSafariMobile","isIe","isEdge","isChrome","isBlink","currentBrowser","isApple","opr","addons","opera","userAgent","InstallTrigger","match","documentMode","StyleMedia","chrome","vendor","CSS","toJSON","handleError","stack","startsWith","httpErrorResponse","createHttpErrorLog","BehaviorSubject","setLocaleNoSaveToStorage","defaultLocale","_locale","fromStorage","selectedLanguage","navigatorLanguage","language","navigatorLanguageShort","fromNavigator","CONSTANTS","setLocale","localeChange$","localeCode","translateP","use","toPromise","registerLocale","localeData","loadLocale","registerLocaleData","default","flushLogEvents$","ClientJS","addToLogMessagesPipe","createLogObj","loadClientJs","locationStrategy","toString","appName","route","fullUrl","time","userId","getBrowserData","os","device","getDeviceType","timeZone","getTimeZone","messageEquals","unshift","onload","onerror","abs","getTime","MAX_DELAY_MS","loadTranslations","setDefaultTitle","defaultTitle","setPageTitle","defaultDescription","updateMetaTags","titlePrefix","titlePostfix","titleToTranslate","extraTitle","translatedTitlePrefix","translatedTitle","translatedTitlePostfix","fullTitle","setTitle","metaTags","metaTag","updateTag","sidenav","sidenavContent","initialised","closedStart","getDefaultOptions","completeAllSubject","subject","observers","complete","RegExp","trim","test","BitfFormControl","UntypedFormControl","formState","validatorOrOpts","asyncValidator","setStaticValidators","initValidation","setDynamicValidator","formItemValidator","opts","dynamicValidatorItem","addDynamicValidator","applyValidators","removeDynamicValidator","dynamicValidators","dynamicValidator","addStaticValidator","validator","staticValidators","removeStaticValidator","validatorIndex","markAsDirty","wasDirty","dirty","statusChanges","markAsTouched","wasTouched","touched","merge","debounce","validate","isInvalid","invalid","validationErrors","validationMessages","bitfIsStrictObject","validators","newDynamicValidator","dynamicValidatorIndex","proccessDynamicValidators","setValidators","updateValueAndValidity","customValidator","getValidatorFn","getAngularValidator","validationFunction","validatorKey","EBitfFormControlValidatorsKeys","bitfValidateEmail","Validators","BitfFormBuilderService","UntypedFormBuilder","control","transform","pure","production","storageVersion","graphQlUrl","logUrl","sockets","httpRetryConfig","verbs","loggerConfig","maxLogRentention","logHttpErrorsWithStatusesCodes","logDecoratedExceptions","logExceptions","saveLogMessagesInterval","sendRequestBody","sendQueryParams","tagManager","registerServiceWorker","J"],"sourceRoot":"webpack:///","sources":["./src/common/core/parsers/models-mapper/models-mapper.strategy.ts","./src/common/libs/bitforce/core/parsers/rest-parser/bitf-rest-envelope.mapper.ts","./src/common/configs/common-bitf.configs.ts","./src/apps/web/core/parsers/app-parser/app-path.builder.ts","./src/common/libs/bitforce/core/parsers/p-parser/bitf-p-path.builder.ts","./src/common/libs/bitforce/core/parsers/rest-parser/bitf-rest-path.builder.ts","./src/apps/web/core/parsers/app-parser/app-request.mapper.ts","./src/common/libs/bitforce/core/parsers/p-parser/bitf-p-request.mapper.ts","./src/common/libs/bitforce/core/parsers/rest-parser/bitf-rest-request.mapper.ts","./src/apps/web/core/parsers/app-parser/app-response.mapper.ts","./src/common/libs/bitforce/core/parsers/p-parser/bitf-p-response.mapper.ts","./src/common/libs/bitforce/core/parsers/default-parser/bitf-default-response.mapper.ts","./src/common/libs/bitforce/core/parsers/rest-parser/bitf-rest-response.mapper.ts","./src/apps/web/core/parsers/app-parser/app-envelope.mapper.ts","./src/common/libs/bitforce/core/parsers/p-parser/bitf-p-envelope.mapper.ts","./src/common/libs/bitforce/core/parsers/pimcore-parser/bitf-pimcore-request.mapper.ts","./src/common/libs/bitforce/core/parsers/graph-ql-parser/bitf-graph-ql-request.mapper.ts","./src/common/libs/bitforce/core/parsers/pimcore-parser/bitf-pimcore-response.mapper.ts","./src/common/libs/bitforce/core/parsers/graph-ql-parser/bitf-graph-ql-response.mapper.ts","./src/common/libs/bitforce/core/parsers/pimcore-parser/bitf-pimcore-envelope.mapper.ts","./src/common/libs/bitforce/core/parsers/graph-ql-parser/bitf-graph-ql-envelope.mapper.ts","./src/apps/web/configs/bitf.config.ts","./src/common/libs/bitforce/constants/constants.ts","./src/common/constants/common.constants.ts","./src/apps/web/constants/constants.ts","./src/apps/web/core/components/not-found/not-found.component.ts","./src/apps/web/core/components/not-found/not-found.component.html","./src/common/libs/bitforce/core/services/app-session/bitf-app-session.service.ts","./src/common/libs/bitforce/core/services/tag-manager/bitf-tag-manager.service.ts","./src/common/libs/bitforce/core/services/logger/bitf-log-dna-sender.service.ts","./src/apps/web/core/services/app-session.service.ts","./src/common/libs/bitforce/core/services/toast-messages/bitf-toast-messages.service.ts","./src/common/libs/bitforce/core/services/toast-messages/material/bitf-mat-toast-message.service.ts","./src/apps/web/core/services/toast-messages.service.ts","./src/apps/web/core/services/dialogs.service.ts","./src/common/libs/bitforce/core/services/ui-messages-listener/bitf-ui-messages-listener.service.ts","./src/common/libs/bitforce/core/services/ui-messages-listener/web/bitf-web-ui-messages-listener.service.ts","./src/apps/web/core/services/ui-messages-listener.service.ts","./src/common/libs/bitforce/core/models/bitf-touch-event.model.ts","./src/common/libs/bitforce/core/models/bitf-touch-event-snapshot.model.ts","./src/common/libs/bitforce/directives/bitf-touch-events/bitf-touch-events.service.ts","./src/apps/web/core/services/touch-events.service.ts","./src/apps/web/core/api-call-state/api-call-state.enum.ts","./src/apps/web/enums/app.enum.ts","./src/apps/web/enums/touch-event.enum.ts","./src/apps/web/app-routing.module.ts","./src/apps/web/app.component.ts","./src/apps/web/app.component.html","./src/common/libs/bitforce/utils/bitf-urls.utils.ts","./src/common/libs/bitforce/interceptors/bitf-oauth-interceptor.service.ts","./src/common/libs/bitforce/interceptors/bitf-retry-interceptor.service.ts","./src/common/libs/bitforce/interceptors/bitf-api-ui-messages-interceptor.service.ts","./src/common/libs/bitforce/interceptors/bitf-language-interceptor.service.ts","./src/common/libs/bitforce/interceptors/bitf-api-errors-interceptor.service.ts","./src/common/libs/bitforce/interceptors/bitf-api-envelope-mapper-interceptor.service.ts","./src/common/core/common-core.module.ts","./src/apps/web/core/core.module.ts","./src/apps/web/core/module-config.ts","./src/apps/web/app.module.ts","./src/apps/web/main.ts","./src/apps/web/shared/brand-block/brand-block.component.ts","./src/apps/web/shared/brand-block/brand-block.component.html","./src/apps/web/shared/footer/footer.component.ts","./src/apps/web/shared/footer/footer.component.html","./src/common/libs/bitforce/core/services/sidenav/material/bitf-mat-sidenav.service.ts","./src/apps/web/shared/header/header.component.html","./src/apps/web/shared/header/header.component.ts","./src/apps/web/shared/material-modules.ts","./src/common/libs/bitforce/core/components/ui/loader/bitf-loader.component.html","./src/common/libs/bitforce/core/components/ui/loader/bitf-loader.component.ts","./src/common/libs/bitforce/core/components/ui/sort/bitf-sort.component.ts","./src/common/libs/bitforce/core/components/ui/sort/material/bitf-mat-sort.component.html","./src/common/libs/bitforce/core/components/ui/sort/material/bitf-mat-sort.component.ts","./src/common/libs/bitforce/directives/ui-role-manager/bitf-ui-role-manager.directive.ts","./src/common/libs/bitforce/directives/bitf-touch-events/bitf-touch-event.directive.ts","./src/apps/web/shared/shared.module.ts","./src/apps/web/shared/sidenav/sidenav.component.html","./src/apps/web/shared/sidenav/sidenav.component.ts","./src/apps/web/shared/slideshow/slideshow.component.html","./src/apps/web/shared/slideshow/slideshow.component.ts","./src/common/core/models/super-model.model.ts","./src/common/core/models/user.model.ts","./src/common/core/models/store.model.ts","./src/common/core/models/storage.model.ts","./src/common/libs/bitforce/core/models/bitf-storage.model.ts","./src/common/core/models/asset.model.ts","./src/common/core/models/brand.model.ts","./src/common/core/models/folder.model.ts","./src/common/core/models/product.model.ts","./src/common/libs/bitforce/core/services/graph-ql/bitf-graph-ql.helper.ts","./src/common/libs/bitforce/core/services/graph-ql/bitf-graph-ql.service.ts","./src/common/core/services/graph-ql/assets.service.ts","./src/common/core/services/graph-ql/brands.service.ts","./src/common/core/services/graph-ql/products.service.ts","./src/common/libs/bitforce/core/services/auth/bitf-auth.service.ts","./src/common/libs/bitforce/core/services/auth/jwt/bitf-jwt-auth.service.ts","./src/common/core/services/auth.service.ts","./src/common/libs/bitforce/core/services/api/bitf-api.helper.ts","./src/common/core/services/api/users.service.ts","./src/common/libs/bitforce/core/services/api/bitf-api.service.ts","./src/common/core/services/ui-role-manager.service.ts","./src/common/core/services/loader.service.ts","./src/common/libs/bitforce/core/services/loader/bitf-loader.service.ts","./src/common/libs/bitforce/core/api-call-state/bitf-api-request-part.ts","./src/common/libs/bitforce/core/api-call-state/bitf-pagination-api-request-part.builder.ts","./src/apps/web/core/api-call-state/api-call-state.config.ts","./src/common/libs/bitforce/core/api-call-state/bitf-graph-ql-api-call-state/bitf-graph-ql-pagination-api-request-part.builder.ts","./src/common/libs/bitforce/core/api-call-state/bitf-search-api-request-part.builder.ts","./src/apps/web/core/api-call-state/default-api-call-state.mapper.ts","./src/common/libs/bitforce/core/api-call-state/bitf-graph-ql-api-call-state/bitf-graph-ql-api-call-state.mapper.ts","./src/common/libs/bitforce/core/api-call-state/bitf-api-call-state.mapper.ts","./src/common/libs/bitforce/core/services/api-call-state/bitf-api-call-state.service.ts","./src/common/core/services/api-call-state.service.ts","./src/common/core/services/responsive.service.ts","./src/common/core/services/store.service.ts","./src/common/libs/bitforce/core/services/store/bitf-store.service.ts","./src/common/libs/bitforce/core/services/storage/bitf-storage.service.ts","./src/common/core/services/storage.service.ts","./src/common/core/services/store-storage.service.ts","./src/common/enums/ui-role.enum.ts","./src/common/libs/bitforce/core/components/ui/image/bitf-image/bitf-image.component.ts","./src/common/libs/bitforce/core/components/ui/image/bitf-image/bitf-image.component.html","./src/common/libs/bitforce/core/components/ui/loader/material/bitf-mat-loader/bitf-mat-loader.component.html","./src/common/libs/bitforce/core/components/ui/loader/material/bitf-mat-loader/bitf-mat-loader.component.ts","./src/common/libs/bitforce/core/components/ui/ok-cancel-dialog/material/bitf-mat-ok-cancel-dialog.component.html","./src/common/libs/bitforce/core/components/ui/ok-cancel-dialog/material/bitf-mat-ok-cancel-dialog.component.ts","./src/common/libs/bitforce/core/components/ui/paginator/bitf-paginator.component.ts","./src/common/libs/bitforce/core/components/ui/paginator/material/bitf-mat-paginator.component.html","./src/common/libs/bitforce/core/components/ui/paginator/material/bitf-mat-paginator.component.ts","./src/common/libs/bitforce/core/components/ui/search/bitf-search.component.ts","./src/common/libs/bitforce/core/components/ui/search/material/bitf-mat-search.component.html","./src/common/libs/bitforce/core/components/ui/search/material/bitf-mat-search.component.ts","./src/common/libs/bitforce/core/decorators/bitf-try-catch.decorator.ts","./src/common/libs/bitforce/core/form/bitf-form-control-validators.enum.ts","./src/common/libs/bitforce/utils/bitf-browser.utils.ts","./src/common/libs/bitforce/core/models/bitf-store.model.ts","./src/common/libs/bitforce/core/services/error-handler/bitf-error-handler.service.ts","./src/common/libs/bitforce/core/services/locale/bitf-dynamic-locale.service.ts","./src/common/libs/bitforce/core/services/logger/bitf-logger.service.ts","./src/common/libs/bitforce/core/services/metadata/bitf-metadata.service.ts","./src/common/libs/bitforce/core/services/sidenav/material/bitf-mat-sidenav-global.service.ts","./src/common/libs/bitforce/enums/bitf.enum.ts","./src/common/libs/bitforce/enums/bitf-touch-event-type.enum.ts","./src/common/libs/bitforce/core/services/api/bitf-api.enum.ts","./src/common/libs/bitforce/core/parsers/bitf-parsers.enum.ts","./src/common/libs/bitforce/core/parsers/bitf-graph-ql-parsers.enum.ts","./src/common/libs/bitforce/core/parsers/graph-ql-parser/bitf-graph-ql-query-operator.enum.ts","./src/common/libs/bitforce/core/parsers/strapi-graph-ql-parser/bitf-strapi-graph-ql-query-operator.enum.ts","./src/common/libs/bitforce/core/components/ui/loader/bitf-loader.enum.ts","./src/common/libs/bitforce/interceptors/bitf-interceptor.enum.ts","./src/common/libs/bitforce/core/services/toast-messages/bitf-toast-messages.enum.ts","./src/common/libs/bitforce/core/services/sidenav/bitf-sidenav.enum.ts","./src/common/libs/bitforce/core/services/auth/auth.enum.ts","./src/common/libs/bitforce/core/services/store/bitf-store.enum.ts","./src/common/libs/bitforce/core/parsers/p-parser/bitf-p-query-comparators.enum.ts","./src/common/libs/bitforce/core/parsers/p-parser/bitf-p-query-operator.enum.ts","./src/common/libs/bitforce/core/services/api-call-state/bitf-api-call-state.enums.ts","./src/common/libs/bitforce/core/components/ui/switch/bitf-switch.enum.ts","./src/common/libs/bitforce/utils/bitf-objects.utils.ts","./src/common/libs/bitforce/utils/bitf-translate.utils.ts","./src/common/libs/bitforce/validators/bitf-email.validator.ts","./src/common/libs/bitforce/core/form/bitf-form-control.ts","./src/common/libs/bitforce/core/form/bitf-form-builder.service.ts","./src/common/libs/bitforce/pipes/translate/bitf-form-control-translate.pipe.ts","./src/common/shared/common-shared.module.ts","./src/environments/environment.production.ts","./src/environments/version.ts","./src/locale/ lazy ^\\.\\/.*$ namespace object"],"sourcesContent":["import * as Models from '@models';\n\nexport const modelsMap = new Map([\n ['users', Models.User],\n ['getAssetFolder', Models.Folder],\n ['getBrandListing', Models.Brand],\n ['getProduct', Models.Product],\n ['getProductListing', Models.Product],\n]);\n","import { HttpResponse, HttpErrorResponse } from '@angular/common/http';\nimport { IBitfEnvelopeMapper, IBitfEnvelopeMapperData, IBitfApiResponse } from '@interfaces';\n\nexport abstract class BitfRestEnvelopeMapper implements IBitfEnvelopeMapper {\n constructor() {}\n\n map({ req, event }: IBitfEnvelopeMapperData): HttpResponse> {\n if (event instanceof HttpErrorResponse) {\n event = (toHttpResponseLike(event) as any) as HttpResponse;\n }\n\n return event.clone({\n body: {\n content: undefined,\n pagination: undefined,\n sorting: undefined,\n metadata: { uiMessages: [] },\n status: event.status,\n statusText: event.statusText,\n url: event.url,\n headers: event.headers,\n httpParams: req.params,\n method: req.method,\n isMockResponse: false,\n originalBody: event.body,\n } as IBitfApiResponse,\n });\n }\n}\n\nfunction cloneMixin(update: any = {}): HttpErrorResponse {\n // https://github.com/angular/angular/blob/5c18f23788ebd25e096d1030c913b1edfb0d39b5/packages/common/http/src/response.ts#LC277\n const newResponse = new HttpErrorResponse({\n error: update.body !== undefined ? update.body : this.error,\n headers: update.headers || this.headers,\n status: update.status !== undefined ? update.status : this.status,\n statusText: update.statusText || this.statusText,\n url: update.url || this.url || undefined,\n });\n\n return toHttpResponseLike(newResponse);\n}\n\nfunction toHttpResponseLike(errorResponse: HttpErrorResponse): HttpErrorResponse {\n Object.assign(errorResponse, {\n body: errorResponse.error,\n clone: cloneMixin.bind(errorResponse),\n });\n return errorResponse;\n}\n","import { AppPathBuilder, AppRequestMapper, AppResponseMapper, AppEnvelopeMapper } from '@web/core/parsers';\n\nimport { IBitfGraphQlParserStrategy, IBitfParserStrategy } from '@interfaces';\nimport {\n BitfPimcoreEnvelopeMapper,\n BitfPimcoreRequestMapper,\n BitfPimcoreResponseMapper,\n} from '@common/libs/bitforce/core/parsers/pimcore-parser';\n\nexport const BITF_CONFIGS: any = {\n apiErrorsInterceptorService: { interceptHttpResponsesWithCode: [401, '4XX', '5XX'] },\n toastMessage: { durationMs: 5000 },\n parsers: {\n defaultParser: 'appParser',\n defaultGraphQlParser: 'pimcoreParser',\n parserStrategies: {\n appParser: {\n pathBuilder: new AppPathBuilder(),\n requestMapper: new AppRequestMapper(),\n responseMapper: new AppResponseMapper(),\n envelopeMapper: new AppEnvelopeMapper(),\n } as IBitfParserStrategy,\n pimcoreParser: {\n requestMapper: new BitfPimcoreRequestMapper(),\n responseMapper: new BitfPimcoreResponseMapper(),\n envelopeMapper: new BitfPimcoreEnvelopeMapper(),\n } as IBitfGraphQlParserStrategy,\n },\n },\n};\n","import { BitfPPathBuilder } from '@bitf/core/parsers/p-parser';\n\nexport class AppPathBuilder extends BitfPPathBuilder {}\n","import { BitfRestPathBuilder } from '../rest-parser/bitf-rest-path.builder';\n\nexport abstract class BitfPPathBuilder extends BitfRestPathBuilder {}\n","import { IBitfApiRequest, IBitfPathBuilder } from '@interfaces';\nimport { bitfGetProp } from '@bitf/utils/bitf-objects.utils';\nexport abstract class BitfRestPathBuilder implements IBitfPathBuilder {\n constructor() {}\n\n build(requestParams: IBitfApiRequest = {}): string {\n let path = '';\n let id = requestParams.id;\n if (id === undefined && !requestParams.relation && !requestParams.action) {\n id = bitfGetProp(requestParams, 'body', 'id');\n }\n\n if (id) {\n path += `/${id}`;\n }\n\n const action = requestParams.action;\n if (action) {\n path += `/${action}`;\n }\n\n if (requestParams.relation) {\n path += `/${requestParams.relation}`;\n\n if (requestParams.linkUnlinkRel) {\n path += '/rel';\n }\n\n const relationId = requestParams.relationId || bitfGetProp(requestParams, 'body', 'id');\n if (relationId) {\n path += `/${relationId}`;\n }\n }\n\n if (requestParams.count) {\n path += '/count';\n }\n return path;\n }\n}\n","import { BitfPRequestMapper } from '@bitf/core/parsers/p-parser';\nimport { EBitfParsers } from '@enums';\n\nexport class AppRequestMapper extends BitfPRequestMapper {\n name = EBitfParsers.BITF_APP_PARSER;\n}\n","import { IBitfApiRequest, IBitfRequestMapper } from '@interfaces';\nimport { EBitfApiSortDirection } from '@enums';\n\nimport { BitfRestRequestMapper } from '@bitf/parsers/rest-parser/bitf-rest-request.mapper';\nimport { objectTypeCallProperty } from '@babel/types';\n\nexport abstract class BitfPRequestMapper extends BitfRestRequestMapper implements IBitfRequestMapper {\n constructor() {\n super();\n }\n\n map(requestParams: IBitfApiRequest) {\n const { embed, computedFields, page, size, paginationInfo, queryParams } = requestParams;\n const params: any = {};\n const requestMapped = super.map(requestParams);\n const { query, sorting, search } = requestParams;\n\n if (requestParams.method !== 'GET') {\n requestParams.body = requestParams.body || {};\n }\n\n if (embed && embed.length) {\n params.embed = embed.join(',');\n }\n\n // if (computedFields) {\n // params.computedFields = computedFields.join(',');\n // }\n\n if (requestParams.method === 'GET') {\n if (page !== undefined) {\n params.pageNumber = page;\n }\n\n if (size !== undefined) {\n params.pageSize = size;\n }\n\n if (paginationInfo !== undefined) {\n params.paginationInfo = paginationInfo;\n }\n\n if (query) {\n params.filters = JSON.stringify(query);\n }\n } else if (requestParams.method === 'POST') {\n if (sorting && sorting.length) {\n requestParams.body.orderby = sorting\n .filter(itemFilter => Object.keys(itemFilter).length)\n .map(item => ({\n name: item.property,\n direction: item.direction === EBitfApiSortDirection.ASC ? 0 : 1,\n }));\n }\n\n if (page !== undefined) {\n requestParams.body.pageNumber = page;\n }\n\n if (size !== undefined) {\n requestParams.body.pageSize = size;\n }\n\n if (paginationInfo !== undefined) {\n requestParams.body.paginationInfo = paginationInfo;\n }\n\n if (query) {\n requestParams.body.filter = query;\n }\n\n if (search) {\n Object.assign(requestParams.body, search);\n }\n }\n\n if (queryParams) {\n Object.assign(params, queryParams);\n }\n\n requestMapped.params = requestMapped.params || {};\n if (Object.keys(params).length) {\n Object.assign(requestMapped.params, params);\n }\n\n return requestMapped;\n }\n}\n","import { HttpHeaders } from '@angular/common/http';\n\nimport { IBitfApiRequest, IBitfRequestMapper } from '@interfaces';\nimport { BITF_PARSER_HEADER_NAME } from '@constants';\nimport { EBitfParsers } from '@enums';\nimport justClone from 'just-clone';\n\nexport abstract class BitfRestRequestMapper implements IBitfRequestMapper {\n name = EBitfParsers.BITF_REST_PARSER;\n\n constructor() {}\n map(apiRequest: IBitfApiRequest) {\n const { body, ...requestParams } = apiRequest;\n // NOTE: We need to clone only request params, not the body here.\n const clonedRequestParams = justClone(requestParams);\n\n const {\n queryParams,\n file,\n files,\n bodyParser,\n responseType = 'json',\n reportProgress = false,\n skipInterceptors,\n } = clonedRequestParams;\n\n let { headers } = clonedRequestParams;\n\n const options: any = {\n responseType,\n headers: new HttpHeaders(),\n withCredentials: false,\n observe: 'response',\n };\n\n if (queryParams) {\n options.params = queryParams;\n }\n\n headers = headers || [];\n // NOTE: add the default header content type\n headers.push({\n headerName: 'Content-Type',\n value: 'application/json',\n });\n headers.push({\n headerName: 'Accept',\n value: 'application/json',\n });\n\n // NOTE: override Content-Type\n if (bodyParser === 'formUrlEncoded') {\n headers.push({\n headerName: 'Content-Type',\n value: 'application/form-urlencoded',\n });\n }\n\n if (headers && headers.length) {\n headers.forEach(header => {\n const { headerName, value } = header;\n options.headers = options.headers.append(headerName, value);\n });\n }\n\n options.reportProgress = reportProgress;\n\n // NOTE: override Content-Type\n if (file || files) {\n options.headers.append('Content-Type', 'multipart/form-data');\n Object.assign(options, {\n reportProgress: true,\n observe: 'events',\n });\n }\n\n if (skipInterceptors && skipInterceptors.length) {\n skipInterceptors.forEach(skipInterceptor => {\n options.headers = options.headers.append(skipInterceptor, '');\n });\n }\n\n // NOTE: this is needed in the BitfApiEnvelopeMapperInterceptor to\n // map the response with the envelopeMapper specified in the CommonCoreModule\n options.headers = options.headers.append(BITF_PARSER_HEADER_NAME, this.name);\n\n return options;\n }\n}\n","import { BitfPResponseMapper } from '@bitf/core/parsers/p-parser';\n\nexport class AppResponseMapper extends BitfPResponseMapper {}\n","import { BitfDefaultResponseMapper } from '../default-parser/bitf-default-response.mapper';\nexport abstract class BitfPResponseMapper extends BitfDefaultResponseMapper {}\n","import { HttpResponse } from '@angular/common/http';\n\nimport { IBitfApiResponse, IBitfApiCount, IBitfApiAction, IBitfApiActionData } from '@interfaces';\n\n// FIXME import this from barrel will break the app\nimport { BitfRestResponseMapper } from '../rest-parser/bitf-rest-response.mapper';\n\nexport abstract class BitfDefaultResponseMapper extends BitfRestResponseMapper {\n constructor() {\n super();\n }\n\n map(\n apiOutput: HttpResponse>,\n selctedModelMapper: string\n ): IBitfApiResponse {\n const envelope: IBitfApiResponse<\n T | T[] | IBitfApiCount | IBitfApiActionData | IBitfApiAction\n > = this.getEnvelope(apiOutput);\n\n if (!envelope || !envelope.content) {\n return envelope;\n }\n let { content } = envelope;\n\n if (this.isResponsePaged(envelope as IBitfApiResponse)) {\n content = (content as T[]).map(item => this.unwrapExtraModelFields(item));\n envelope.content = this.modelInstancesFactory(content, selctedModelMapper);\n } else if (this.isResponseList(envelope as IBitfApiResponse)) {\n if (selctedModelMapper === 'actionData') {\n const apiActionData: IBitfApiActionData = { data: content } as IBitfApiActionData;\n envelope.content = apiActionData as any;\n } else {\n content = (content as T[]).map(item => this.unwrapExtraModelFields(item));\n envelope.content = this.modelInstancesFactory(content, selctedModelMapper);\n }\n } else {\n switch (selctedModelMapper) {\n case 'count':\n const apiCount = { count: content as any } as IBitfApiCount;\n envelope.content = apiCount;\n break;\n case 'action':\n const apiAction = { success: content as any } as IBitfApiAction;\n envelope.content = apiAction as any;\n break;\n case 'actionData':\n const apiActionData: IBitfApiActionData = {\n data: content,\n } as IBitfApiActionData;\n envelope.content = apiActionData as any;\n break;\n default:\n content = this.unwrapExtraModelFields(content);\n envelope.content = this.modelInstanceFactory(content, selctedModelMapper);\n }\n }\n\n return envelope;\n }\n\n // NOTE: this is just for reference\n // unwrapExtraModelFields(item: any) {\n // if (!item) {\n // return;\n // }\n // const extraFields = ['embed', 'computedFields'];\n // extraFields.forEach(extraField => {\n // if (item[extraField]) {\n // Object.entries(item[extraField]).forEach(([key, val]) => {\n // item[key] = val;\n // });\n // }\n // });\n\n // // NOTE: don't use delete for performance reason\n // const returnObj = {};\n // Object.entries(item).forEach(([key, val]) => {\n // if (!extraFields.includes(key)) {\n // returnObj[key] = val;\n // }\n // });\n // return returnObj;\n // }\n}\n","import { HttpResponse } from '@angular/common/http';\nimport { IBitfApiResponse } from '@interfaces';\nimport { modelsMap } from '@common/parsers/models-mapper/models-mapper.strategy';\n\nexport abstract class BitfRestResponseMapper {\n constructor() {}\n\n getEnvelope(apiOutput: HttpResponse>): IBitfApiResponse {\n return apiOutput && apiOutput.body;\n }\n\n modelInstanceFactory(item: any, modelMapper: string): T {\n const model = modelsMap.get(modelMapper);\n if (!model) {\n return item;\n }\n return new model(item);\n }\n\n modelInstancesFactory(items: any, modelMapper: string): T[] {\n const model = modelsMap.get(modelMapper);\n if (!model) {\n return items;\n }\n return items.map(item => new model(item));\n }\n\n unwrapExtraModelFields(item: any) {\n return item;\n }\n\n isResponsePaged(response: IBitfApiResponse): boolean {\n return this.isResponseList(response) && !!response.pagination;\n }\n\n isResponseList(response: IBitfApiResponse): boolean {\n return Array.isArray(response.content);\n }\n}\n","import { BitfPEnvelopeMapper } from '@bitf/core/parsers/p-parser';\n\nexport class AppEnvelopeMapper extends BitfPEnvelopeMapper {}\n","import { HttpResponse } from '@angular/common/http';\n\nimport { BitfRestEnvelopeMapper } from '@bitf/parsers/rest-parser/bitf-rest-envelope.mapper';\nimport { bitfGetProp } from '@bitf/utils/bitf-objects.utils';\n\nimport {\n IBitfEnvelopeMapper,\n IBitfEnvelopeMapperData,\n IBitfApiResponse,\n IBitfApiPagination,\n IBitfApiPPaginationResponse,\n} from '@interfaces';\n\nexport abstract class BitfPEnvelopeMapper extends BitfRestEnvelopeMapper implements IBitfEnvelopeMapper {\n map({ req, event }: IBitfEnvelopeMapperData): HttpResponse> {\n event = super.map({ req, event });\n const mappedBody: IBitfApiResponse = event.body;\n const originalBody = event.body.originalBody;\n\n if (originalBody != null) {\n const data = originalBody.data;\n const hasItems = bitfGetProp(data, 'items');\n\n if (hasItems) {\n const { items, ...pagination } = data;\n // NOTE: Map items -> content\n mappedBody.content = items;\n\n mappedBody.pagination = this.mapPagination(pagination);\n\n // mappedBody.sorting = this.mapSorting(sorting);\n } else if (data) {\n mappedBody.content = data;\n }\n\n if (originalBody.metadata) {\n mappedBody.metadata = originalBody.metadata;\n }\n }\n\n return event.clone({\n body: mappedBody,\n });\n }\n\n mapPagination(pagination: IBitfApiPPaginationResponse): IBitfApiPagination {\n if (!pagination) {\n return;\n }\n const mappedPagination: IBitfApiPagination = {\n first: pagination.hasPreviousPage,\n last: pagination.hasNextPage,\n paginationInfo: pagination.paginationInfo,\n page: pagination.pageIndex,\n size: pagination.pageSize,\n itemsInPage: pagination.count,\n totalItems: pagination.totalCount,\n totalPages: pagination.totalPages,\n };\n return mappedPagination;\n }\n\n // mapSorting(sortingResponse: IBitfApiDefaultSortingResponse[]): IBitfApiSorting[] {\n // if (!sortingResponse || !sortingResponse.length) {\n // return;\n // }\n // return sortingResponse.map((sorting: IBitfApiDefaultSortingResponse) => {\n // return { property: sorting.property, direction: sorting.direction } as IBitfApiSorting;\n // });\n // }\n}\n","import { BitfGraphQlRequestMapper } from '../graph-ql-parser/bitf-graph-ql-request.mapper';\nimport { EBitfGraphQlParsers } from '@enums';\n\nexport class BitfPimcoreRequestMapper extends BitfGraphQlRequestMapper {\n name = EBitfGraphQlParsers.BITF_PIMCORE_PARSER;\n\n constructor() {\n super();\n }\n\n protected mapFiltersVariables({ mappedVariables, filterAccumulator }) {\n mappedVariables.filter = `{\"$and\": [${filterAccumulator}]}`;\n }\n\n protected mapSortingVariables({ mappedVariables, sorting }) {\n Object.assign(mappedVariables, {\n sortBy: sorting.map(sort => sort.property).reverse(),\n sortOrder: sorting.map(sort => sort.direction).reverse(),\n });\n }\n\n protected mapPaginationVariables({ mappedVariables, size, page }) {\n Object.assign(mappedVariables, {\n first: size,\n after: size * (page - 1),\n });\n }\n}\n","import { QueryOptions, MutationOptions } from '@apollo/client/core';\n\nimport { IBitfApiSorting, IBitfGraphQlRequest, IBitfGraphQlRequestMapper } from '@interfaces';\nimport { EBitfGraphQlParsers } from '@enums';\n\nexport abstract class BitfGraphQlRequestMapper implements IBitfGraphQlRequestMapper {\n name = EBitfGraphQlParsers.BITF_GRAPH_QL_PARSER;\n\n constructor() {}\n\n protected abstract mapFiltersVariables(params: { mappedVariables: any; filterAccumulator: any[] }): void;\n protected abstract mapSortingVariables(params: { mappedVariables: any; sorting: IBitfApiSorting[] }): void;\n protected abstract mapPaginationVariables(params: {\n mappedVariables: any;\n size: number;\n page: number;\n }): void;\n\n mapQueryRequest(requestParams: IBitfGraphQlRequest): QueryOptions {\n const { id, ids, search, filter, query, variables, context, sorting, file } = requestParams;\n let { size, page } = requestParams;\n const queryOptions: QueryOptions = { query };\n const mappedVariables: any = {};\n\n // CONTEXT\n if (context) {\n Object.assign(queryOptions, {\n context,\n });\n }\n\n // ID\n if (id !== undefined) {\n mappedVariables.id = id;\n }\n if (ids) {\n mappedVariables.ids = ids;\n }\n\n const filterAccumulator: any[] = [];\n // SEARCH\n if (search?.length) {\n filterAccumulator.push(...search);\n }\n\n // FILTER\n if (filter?.length) {\n filterAccumulator.push(...filter);\n }\n if (filterAccumulator.length) {\n this.mapFiltersVariables({ mappedVariables, filterAccumulator });\n }\n\n // SORTING\n if (sorting) {\n this.mapSortingVariables({ mappedVariables, sorting });\n }\n\n // PAGINATION\n if (size || page) {\n if (!size) {\n requestParams.size = 10;\n size = 10;\n }\n if (!page) {\n requestParams.page = 1;\n page = 1;\n }\n this.mapPaginationVariables({ mappedVariables, size, page });\n }\n\n if (file) {\n Object.assign(mappedVariables, { file: file.fileObject });\n }\n\n // CUSTOM VARIABLES\n if (variables) {\n Object.assign(mappedVariables, variables);\n }\n queryOptions.variables = mappedVariables;\n\n // console.log(queryOptions);\n\n return queryOptions;\n }\n\n mapMutationRequest(requestParams: IBitfGraphQlRequest): MutationOptions {\n const { id, mutation, body, variables, optimisticResponse, optimisticUpdate$, context } = requestParams;\n const mutationOptions: MutationOptions = { mutation };\n const mappedVariables: any = {};\n\n // CONTEXT\n if (context) {\n Object.assign(mutationOptions, {\n context,\n });\n }\n\n // ID\n if (id !== undefined) {\n mappedVariables.id = id;\n }\n\n // BODY\n if (body) {\n // NOTE read the id from the body to avoid to pass in requestParams\n // a separate id field\n if (mappedVariables.id === undefined && body.id !== undefined) {\n mappedVariables.id = body.id;\n }\n if (body.serialised) {\n // TODO: we need a method to extract the right props for the\n // current mutation\n const serialisedBody = body.serialised;\n delete serialisedBody.id;\n Object.assign(mappedVariables, { input: serialisedBody });\n } else {\n delete body.id;\n Object.assign(mappedVariables, { input: body });\n }\n }\n\n // CUSTOM VARIABLES\n if (variables) {\n Object.assign(mappedVariables, variables);\n }\n\n if (variables?.file) {\n Object.assign(mappedVariables, { file: variables.file.fileObject });\n }\n\n mutationOptions.variables = mappedVariables;\n\n if (optimisticResponse) {\n mutationOptions.optimisticResponse = optimisticResponse;\n mutationOptions.update = (proxy, data) => {\n // NOTE: this is a way to extract the optmistic update\n // below there is the method to update the InMemoryCache\n optimisticUpdate$.next(data);\n // Read the data from our cache for this query.\n // const data = proxy.readQuery({ query: CommentAppQuery });\n // Add our comment from the mutation to the end.\n // data.comments.push(submitComment);\n // Write our data back to the cache.\n // proxy.writeQuery({ query: CommentAppQuery, data });\n };\n }\n\n return mutationOptions;\n }\n}\n","import { IBitfApiPagination, IBitfGraphQlRequest } from '@interfaces';\nimport { BitfGraphQlResponseMapper } from '../graph-ql-parser/bitf-graph-ql-response.mapper';\n\nexport class BitfPimcoreResponseMapper extends BitfGraphQlResponseMapper {\n constructor() {\n super();\n }\n\n // Query\n protected isResponseArray(response): boolean {\n return !!response.edges;\n }\n\n protected getContentAsArray(response, model): T[] {\n return response.edges.map(edge => new model(edge.node));\n }\n\n protected calculatePagination(requestParams: IBitfGraphQlRequest, response: any): IBitfApiPagination {\n // NOTE: page starts from 1 to avoid mismatch between page and totalPages\n const size = requestParams.size;\n const page = requestParams.page;\n const totalItems = response.totalCount;\n const totalPages = Math.ceil(totalItems / size);\n const first = page === 1;\n const last = page === totalPages;\n let itemsInPage;\n if (last) {\n if (totalItems % size > 0) {\n itemsInPage = totalItems % size;\n } else {\n itemsInPage = size;\n }\n } else {\n if (size * page <= totalItems) {\n itemsInPage = size;\n } else {\n itemsInPage = 0;\n }\n }\n return {\n first,\n last,\n page,\n size,\n itemsInPage,\n totalItems,\n totalPages,\n };\n }\n\n // Mutation\n protected extractMutationResponseAndMetadata({ originalBody, responseEnveloped }) {\n responseEnveloped.success = originalBody?.success;\n responseEnveloped.message = originalBody?.message;\n return originalBody?.output;\n }\n}\n","import {\n IBitfGraphQlResponse,\n IBitfGraphQlRequest,\n IBitfApiPagination,\n IBitfGraphQlResponseMapper,\n} from '@interfaces';\nimport { modelsMap } from '@common/parsers/models-mapper/models-mapper.strategy';\n\nexport abstract class BitfGraphQlResponseMapper implements IBitfGraphQlResponseMapper {\n constructor() {}\n // NOTE query abstract methods\n protected abstract isResponseArray(response): boolean;\n protected abstract getContentAsArray(response, model: T): T[];\n protected abstract calculatePagination(\n requestParams: IBitfGraphQlRequest,\n response: any\n ): IBitfApiPagination;\n\n // NOTE: mutations abstract methods\n protected abstract extractMutationResponseAndMetadata({\n originalBody,\n responseEnveloped,\n }: {\n originalBody: any;\n responseEnveloped?: IBitfGraphQlResponse;\n }): void;\n\n mapQueryResponse(\n requestParams: IBitfGraphQlRequest,\n responseEnveloped: IBitfGraphQlResponse\n ): IBitfGraphQlResponse {\n // CONTENT\n this.mapContent(requestParams, responseEnveloped, true);\n\n // SORTING\n this.mapQuerySorting(requestParams, responseEnveloped);\n\n // PAGINATION\n this.mapQueryPagination(requestParams, responseEnveloped);\n\n return responseEnveloped as IBitfGraphQlResponse;\n }\n\n mapMutationResponse(\n requestParams: IBitfGraphQlRequest,\n responseEnveloped: IBitfGraphQlResponse\n ): IBitfGraphQlResponse {\n // CONTENT\n this.mapContent(requestParams, responseEnveloped, false);\n\n return responseEnveloped as IBitfGraphQlResponse;\n }\n\n private mapContent(\n requestParams: IBitfGraphQlRequest,\n responseEnveloped: IBitfGraphQlResponse,\n isQuery: boolean\n ) {\n if (responseEnveloped.originalBody === undefined || responseEnveloped.originalBody === null) {\n return undefined;\n }\n\n const { modelMapper } = requestParams;\n if (modelMapper) {\n const response = this.extractResponseAndMetadata(responseEnveloped, modelMapper, isQuery);\n if (response) {\n // NOTE: we've that model in the response we can create the object\n const model = this.getModel(modelMapper);\n if (model) {\n // NOTE: single response entity\n if (this.isResponseArray(response)) {\n // NOTE: response with array of objects\n responseEnveloped.content = this.getContentAsArray(response, model);\n } else {\n // NOTE: Response with a single object\n responseEnveloped.content = new model(response.data || response);\n }\n }\n }\n } else {\n // NOTE: this is a delete mutation\n }\n }\n\n private mapQuerySorting(requestParams: IBitfGraphQlRequest, responseEnveloped: IBitfGraphQlResponse) {\n const { modelMapper } = requestParams;\n const response = this.extractResponseAndMetadata(responseEnveloped, modelMapper, true);\n if (response) {\n responseEnveloped.sorting = requestParams.sorting;\n }\n }\n\n private mapQueryPagination(\n requestParams: IBitfGraphQlRequest,\n responseEnveloped: IBitfGraphQlResponse\n ) {\n const { modelMapper } = requestParams;\n const response = this.extractResponseAndMetadata(responseEnveloped, modelMapper, true);\n if (response && (requestParams.size || requestParams.page)) {\n responseEnveloped.pagination = this.calculatePagination(requestParams, response);\n }\n }\n\n private extractResponseAndMetadata(\n responseEnveloped: IBitfGraphQlResponse,\n modelMapper: string,\n isQuery: boolean\n ) {\n let response: any;\n // NOTE: if there is not the model specified in the request, could be a multi entity request so we'll not\n // find the model specified as prop ex modelMapper = Filter but in the query there is\n // colors, brands etc...\n const originalBody = responseEnveloped.originalBody[modelMapper] || responseEnveloped.originalBody;\n if (!originalBody) {\n // NOTE: not logged in UI because this is a dev error in model strategy settings\n throw new Error(`responseEnveloped[${modelMapper}] not found`);\n }\n if (isQuery) {\n response = originalBody;\n } else {\n response = this.extractMutationResponseAndMetadata({ originalBody, responseEnveloped });\n }\n\n return response;\n }\n\n private getModel(modelMapper: string) {\n const model = modelsMap.get(modelMapper);\n if (!model) {\n console.error(`model for modelMapper: ${modelMapper} not found`);\n }\n return model;\n }\n}\n","import { BitfGraphQlEnvelopeMapper } from '../graph-ql-parser/bitf-graph-ql-envelope.mapper';\n\nexport class BitfPimcoreEnvelopeMapper extends BitfGraphQlEnvelopeMapper {\n constructor() {\n super();\n }\n}\n","import {\n IBitfApiUiMessage,\n IBitfGraphQlEnvelopeMapper,\n IBitfGraphQlRequest,\n IBitfGraphQlResponse,\n} from '@interfaces';\nexport class BitfGraphQlEnvelopeMapper implements IBitfGraphQlEnvelopeMapper {\n constructor() {}\n // NOTE: this is not running at HTTP level as interceptor so we have few parameters mapped here\n map(requestParams: IBitfGraphQlRequest, graphQlResponse: any): IBitfGraphQlResponse {\n const envelopedResponse = {\n content: undefined,\n pagination: undefined,\n sorting: undefined,\n metadata: { uiMessages: [] },\n networkStatus: graphQlResponse.networkStatus,\n // headers: undefined,\n originalBody: graphQlResponse.data,\n bulkResponse: {},\n } as IBitfGraphQlResponse;\n\n // NOTE: Search for errors\n const { modelMapper } = requestParams;\n const message = graphQlResponse?.data && graphQlResponse.data[modelMapper]?.message;\n // NOTE: check if the mutation return success: false\n const success = graphQlResponse?.data && graphQlResponse.data[modelMapper]?.success;\n if (success === false) {\n envelopedResponse.metadata.uiMessages.push({\n title: 'Error',\n message: message || 'Error running the query',\n type: 'ERROR',\n target: 'TOAST',\n } as IBitfApiUiMessage);\n } else {\n // NOTE: check if there is a message. This should be an info, the error case should be handled above\n if (message) {\n envelopedResponse.metadata.uiMessages.push({\n title: '',\n message,\n type: 'INFO',\n target: 'TOAST',\n } as IBitfApiUiMessage);\n }\n }\n\n // NOTE: Search for query errors\n const { errors } = graphQlResponse;\n if (errors?.length) {\n const errorsForLog = errors.reduce((acc, error) => acc + error.message, '');\n envelopedResponse.metadata.uiMessages.push({\n title: 'Error',\n message: errorsForLog,\n type: 'ERROR',\n target: 'TOAST',\n } as IBitfApiUiMessage);\n }\n\n return envelopedResponse;\n }\n}\n","import { BITF_CONFIGS as COMMON_BITF_CONFIGS } from '@common/configs/common-bitf.configs';\n\nconst WEB_BITF_CONFIGS = {\n urls: { homePageUrl: '/', signInUrl: '/sign-in', signOutUrl: '/sign-in' },\n pwa: { serviceWorker: { checkUpdateInterval: 30000 }, installPrompt: { askAgainAfterNDays: 10 } },\n};\n\nexport const BITF_CONFIGS = Object.assign(COMMON_BITF_CONFIGS, WEB_BITF_CONFIGS);\n","import { bitfToTranslate } from '../utils/bitf-translate.utils';\n\nexport const BITF_PARSER_HEADER_NAME = 'BitfParserType';\n\nexport const BITF_VALIDATION_MESSAGES = {\n required: bitfToTranslate('BITF.VALIDATION_ERROR.REQUIRED'),\n email: bitfToTranslate('BITF.VALIDATION_ERROR.EMAIL'),\n maxlength: bitfToTranslate('BITF.VALIDATION_ERROR.MAX_LENGTH'),\n minlength: bitfToTranslate('BITF.VALIDATION_ERROR.MIN_LENGTH'),\n min: bitfToTranslate('BITF.VALIDATION_ERROR.MIN'),\n max: bitfToTranslate('BITF.VALIDATION_ERROR.MIN'),\n requiredTrue: bitfToTranslate('BITF.VALIDATION_ERROR.REQUIRED_TRUE'),\n nullValidator: bitfToTranslate('BITF.VALIDATION_ERROR.NULL'),\n emailsList: bitfToTranslate('BITF.VALIDATION_ERROR.EMAILS_LIST'),\n atLeastRequired: bitfToTranslate('BITF.VALIDATION_ERROR.AT_LEAST_REQUIRED'),\n isEmpty: bitfToTranslate('BITF.VALIDATION_ERROR.IS_EMPTY'),\n validRegex: bitfToTranslate('BITF.VALIDATION_ERROR.VALID_REGEX'),\n invalidRegex: bitfToTranslate('BITF.VALIDATION_ERROR.INVALID_REGEX'),\n};\n","import { bitfToTranslate } from '@bitf/utils/bitf-translate.utils';\n\nexport const CONSTANTS = {\n META_TAGS: {\n TITLE: {\n DEFAULT_TITLE: bitfToTranslate('COMMON.META_TAGS.DEFAULT_TITLE'),\n POSTFIX: bitfToTranslate('COMMON.META_TAGS.TITLE_POSTFIX'),\n },\n DESCRIPTION: bitfToTranslate('COMMON.META_TAGS.DESCRIPTION'),\n },\n SUPPORTED_LANGUAGES: [\n { code: 'en', label: 'English' },\n { code: 'it', label: 'Italiano' },\n { code: 'es', label: 'Espanol' },\n { code: 'de', label: 'Deutsch' },\n { code: 'fr', label: 'Francais' },\n ],\n DEFAULT_LANGUAGE: { code: 'en', label: 'English' },\n LOCAL_STORAGE_VERSION: 1,\n};\n","import { CONSTANTS as COMMON_CONSTANTS } from '@common/constants/common.constants';\nimport { BitfMatOkCancelDialogComponent } from '@common/libs/bitforce/core/components/ui/ok-cancel-dialog/material/bitf-mat-ok-cancel-dialog.component';\nimport { BITF_VALIDATION_MESSAGES } from '@bitf/constants';\n\nexport const WEB_CONSTANTS = {\n fullScreenMessageComponent: null,\n okCancelDialogComponent: BitfMatOkCancelDialogComponent,\n VALIDATION_MESSAGES: {\n ...BITF_VALIDATION_MESSAGES,\n },\n};\n\nexport const CONSTANTS = Object.assign(COMMON_CONSTANTS, WEB_CONSTANTS);\n","import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: 'app-not-found',\n templateUrl: './not-found.component.html',\n styleUrls: ['./not-found.component.scss'],\n})\nexport class NotFoundComponent implements OnInit {\n constructor() {}\n\n ngOnInit() {}\n}\n","
\n

Pagina non trovata, torna alla home

\n
","import { Injectable, Injector } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { fromEvent } from 'rxjs';\nimport { tap, debounceTime } from 'rxjs/operators';\n\nimport { BitfMetadataService } from '@bitf/services/metadata/bitf-metadata.service';\nimport { BitfDynamicLocaleService } from '@bitf/services/locale/bitf-dynamic-locale.service';\nimport { environment } from '@env/environment';\nimport { APP_VERSION } from '@env/version';\nimport { Store } from '@models';\nimport { eStoreActions } from '@enums';\n\nimport {\n UiMessagesListenerService,\n ApiCallStateService,\n StorageService,\n StoreService,\n LoaderService,\n} from '@services';\nimport { Breakpoints, BreakpointObserver } from '@angular/cdk/layout';\nimport { BitfTryCatch } from '../../decorators/bitf-try-catch.decorator';\n\n@Injectable({\n providedIn: 'root',\n})\nexport abstract class BitfAppSessionService {\n protected translate: TranslateService;\n protected bitfMetadataService: BitfMetadataService;\n protected loaderService: LoaderService;\n protected uiMessagesListenerService: UiMessagesListenerService;\n protected apiCallStateService: ApiCallStateService;\n protected storageService: StorageService;\n protected storeService: StoreService;\n protected bitfDynamicLocaleService: BitfDynamicLocaleService;\n protected router: Router;\n protected breakpointObserver: BreakpointObserver;\n private loaderShownForRoute = new Map();\n\n public readyState = {\n localeReady: false,\n platformReady: false,\n currencyLocaleReady: false,\n };\n\n constructor(protected injector: Injector) {}\n\n @BitfTryCatch()\n async init(): Promise {\n this.translate = this.injector.get(TranslateService);\n this.storeService = this.injector.get(StoreService);\n this.loaderService = this.injector.get(LoaderService);\n this.router = this.injector.get(Router);\n this.breakpointObserver = this.injector.get(BreakpointObserver);\n\n /* NOTE:\n The StorageService initialize in the constructor because access is gained from dynamic local service\n */\n this.storageService = this.injector.get(StorageService);\n\n this.bitfDynamicLocaleService = this.injector.get(BitfDynamicLocaleService);\n const localeP = this.bitfDynamicLocaleService.init().then(() => {\n this.readyState.localeReady = true;\n this.bitfMetadataService = this.injector.get(BitfMetadataService);\n this.bitfMetadataService.init();\n });\n\n this.uiMessagesListenerService = this.injector.get(UiMessagesListenerService);\n this.uiMessagesListenerService.init();\n\n this.apiCallStateService = this.injector.get(ApiCallStateService);\n this.apiCallStateService.init();\n\n this.initMobileFixes();\n\n this.initLogSender();\n\n // this.initShowLoaderOnRouteChange();\n\n if (!environment.production) {\n console.log('ENV', environment);\n }\n\n window['printEnv'] = () => {\n console.log('Environment: ', environment);\n console.log('App Version: ', APP_VERSION);\n console.table(Breakpoints);\n console.table(this.storeService.store.activeBreakpoints);\n };\n\n return Promise.all([localeP]);\n }\n\n initMobileFixes() {\n const setVhValue = () => {\n const vh = window.innerHeight * 0.01;\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n };\n setVhValue();\n\n fromEvent(window, 'resize')\n .pipe(\n debounceTime(100),\n tap(() => setVhValue())\n )\n .subscribe();\n }\n\n initBreakpointListener() {\n // Ref: https://material.io/design/layout/responsive-layout-grid.html#breakpoints\n this.breakpointObserver\n .observe([\n Breakpoints.XSmall,\n Breakpoints.Small,\n Breakpoints.Medium,\n Breakpoints.Large,\n Breakpoints.XLarge,\n Breakpoints.Handset,\n Breakpoints.Tablet,\n Breakpoints.Web,\n Breakpoints.HandsetPortrait,\n Breakpoints.TabletPortrait,\n Breakpoints.WebPortrait,\n Breakpoints.HandsetLandscape,\n Breakpoints.TabletLandscape,\n Breakpoints.WebLandscape,\n ])\n .subscribe(() => {\n this.storeService.setStore((store: Store) => {\n store.activeBreakpoints.isXSmall = this.breakpointObserver.isMatched(Breakpoints.XSmall);\n store.activeBreakpoints.isSmall = this.breakpointObserver.isMatched(Breakpoints.Small);\n store.activeBreakpoints.isMedium = this.breakpointObserver.isMatched(Breakpoints.Medium);\n store.activeBreakpoints.isLarge = this.breakpointObserver.isMatched(Breakpoints.Large);\n store.activeBreakpoints.isXLarge = this.breakpointObserver.isMatched(Breakpoints.XLarge);\n store.activeBreakpoints.isHandset = this.breakpointObserver.isMatched(Breakpoints.Handset);\n store.activeBreakpoints.isTablet = this.breakpointObserver.isMatched(Breakpoints.Tablet);\n store.activeBreakpoints.isWeb = this.breakpointObserver.isMatched(Breakpoints.Web);\n store.activeBreakpoints.isHandsetPortrait = this.breakpointObserver.isMatched(\n Breakpoints.HandsetPortrait\n );\n store.activeBreakpoints.isTabletPortrait = this.breakpointObserver.isMatched(\n Breakpoints.TabletPortrait\n );\n store.activeBreakpoints.isWebPortrait = this.breakpointObserver.isMatched(Breakpoints.WebPortrait);\n store.activeBreakpoints.isHandsetLandscape = this.breakpointObserver.isMatched(\n Breakpoints.HandsetLandscape\n );\n store.activeBreakpoints.isTabletLandscape = this.breakpointObserver.isMatched(\n Breakpoints.TabletLandscape\n );\n store.activeBreakpoints.isWebLandscape = this.breakpointObserver.isMatched(\n Breakpoints.WebLandscape\n );\n\n this.setLayoutBreakpoints(store);\n }, eStoreActions.BREAKPOINT);\n });\n }\n\n protected setLayoutBreakpoints(store) {\n if (store.activeBreakpoints.isHandsetPortrait || store.activeBreakpoints.isTabletPortrait) {\n store.activeBreakpoints.isHandsetLayout = true;\n store.activeBreakpoints.isTabletLayout = false;\n store.activeBreakpoints.isWebLayout = false;\n } else if (\n store.activeBreakpoints.isHandsetLandscape ||\n store.activeBreakpoints.isTabletLandscape ||\n store.activeBreakpoints.isWeb\n ) {\n store.activeBreakpoints.isHandsetLayout = false;\n store.activeBreakpoints.isTabletLayout = false;\n store.activeBreakpoints.isWebLayout = true;\n }\n }\n\n // initShowLoaderOnRouteChange() {\n // this.router.events.subscribe((event: RouterEvent): void => {\n // if (event instanceof RouteConfigLoadStart) {\n // if (!this.loaderShownForRoute.has(event.route.path)) {\n // this.loaderShownForRoute.set(event.route.path, true);\n // this.loaderService.show();\n // }\n // } else if (event instanceof RouteConfigLoadEnd) {\n // if (this.loaderShownForRoute.has(event.route.path)) {\n // this.loaderShownForRoute.delete(event.route.path);\n // }\n // this.loaderService.hide();\n // }\n // });\n // }\n\n abstract initLogSender();\n}\n","import { Injectable } from '@angular/core';\nimport { environment } from '@env/environment';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BitfTagManagerService {\n init() {\n window['dataLayer'] = window['dataLayer'] || [];\n const tagManagerConf = environment['tagManager'];\n if (this.isConfiguredCorrectlyAndEnabled()) {\n this.injectScripts(tagManagerConf.apiKey);\n } else if (environment.production) {\n window['dataLayer'].push = () => undefined;\n }\n }\n\n private isConfiguredCorrectlyAndEnabled() {\n const tagManagerConf = environment['tagManager'];\n if (tagManagerConf) {\n if (tagManagerConf.enabled === undefined) {\n console.warn('Cannot find tagManager.enabled property');\n return false;\n }\n if (tagManagerConf.enabled) {\n if (tagManagerConf.apiKey === undefined) {\n console.warn('Cannot find tagManager.apiKey property');\n return false;\n }\n }\n }\n\n return tagManagerConf != null && tagManagerConf.enabled;\n }\n\n get dataLayer() {\n return window['dataLayer'];\n }\n\n private injectScripts(apiKey: string) {\n document.head.appendChild(this.createScript(TAG_MANAGER_DATA_LAYER(apiKey)));\n }\n\n private createScript(text: string) {\n const script = document.createElement('script');\n script.text = text;\n return script;\n }\n}\n\nconst TAG_MANAGER_DATA_LAYER = (apiKey: string) => `\n(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\nnew Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\nj=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\n'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n})(window,document,'script','dataLayer','${apiKey}');\n`;\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\n\nimport { environment } from '@env/environment';\nimport { IBitfLoggerParams } from '@interfaces';\nimport { APP_VERSION, BUILD_DATE } from '@env/version';\nimport { CONSTANTS } from '@constants';\nimport { BitfLoggerService } from '@bitf/services/logger/bitf-logger.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BitfLogDnaSenderService {\n constructor(private httpClient: HttpClient, private bitfLoggerService: BitfLoggerService) {}\n\n init() {\n this.bitfLoggerService.logEvents$.subscribe(() => {\n this.sendLogs();\n });\n }\n\n sendLogs() {\n const keyName = `${environment.appName}-logs`;\n const logs = localStorage.getItem(keyName);\n if (logs) {\n const logMessagesArray: IBitfLoggerParams[] = JSON.parse(logs);\n\n const logLines = {\n lines: logMessagesArray.map(log => ({\n line: log.title || '',\n app: CONSTANTS['appName'] || environment.appName,\n level: log.level,\n env: environment.name,\n meta: { ...log, appVersion: APP_VERSION, buildDate: BUILD_DATE },\n })),\n };\n\n this.httpClient\n .post(`${environment.loggerConfig.logUrl}&hostname=${environment.name}&now=${Date.now()}`, logLines)\n .subscribe(() => {\n // Log added successfully, remove logs\n localStorage.removeItem(keyName);\n });\n }\n }\n}\n","import { Injectable, Injector } from '@angular/core';\n\nimport { initDynamicLayoutUrl } from '@bitf/utils/bitf-responsive.utils';\n\nimport { BitfAppSessionService } from '@bitf/services/app-session/bitf-app-session.service';\nimport { BitfTagManagerService } from '@bitf/services/tag-manager/bitf-tag-manager.service';\nimport { BitfLogDnaSenderService } from '@bitf/services/logger/bitf-log-dna-sender.service';\nimport { ResponsiveService } from '@services';\nimport { environment } from '@env/environment';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AppSessionService extends BitfAppSessionService {\n constructor(\n private bitfTagManagerService: BitfTagManagerService,\n private bitfLogDnaSenderService: BitfLogDnaSenderService,\n private responsiveService: ResponsiveService,\n protected injector: Injector\n ) {\n super(injector);\n }\n\n async init() {\n await super.init();\n // NOTE: At this point translations are already loaded\n\n // NOTE: needed for mobile/desktop routing support\n //initDynamicLayoutUrl(this.router, this.storeService);\n\n this.initBreakpointListener();\n this.responsiveService.init();\n\n // this.bitfTagManagerService.init();\n\n this.bitfLogDnaSenderService.init();\n\n this.bitfMetadataService.init();\n this.bitfMetadataService.setDefaultDescription();\n\n // PWA\n /* this.bitfPwaService.initOnlineChecker();\n // this.bitfPwaService.showDefaultOnlineStateChangeToast();\n if (environment.registerServiceWorker) {\n this.bitfPwaService.init();\n\n this.bitfPwaService.initManifest();\n\n this.bitfPwaService.initSwUpdate();\n this.bitfPwaService.handleSwUpdate();\n\n this.bitfPwaService.initBeforeInstallPrompt();\n this.bitfPwaService.checkForBeforeInstallPromptEvent();\n } */\n }\n\n protected setLayoutBreakpoints(store) {\n if (store.activeBreakpoints.isHandset || store.activeBreakpoints.isTabletPortrait) {\n store.activeBreakpoints.isHandsetLayout = true;\n store.activeBreakpoints.isTabletLayout = false;\n store.activeBreakpoints.isWebLayout = false;\n } else if (store.activeBreakpoints.isTabletLandscape || store.activeBreakpoints.isWeb) {\n store.activeBreakpoints.isHandsetLayout = false;\n store.activeBreakpoints.isTabletLayout = false;\n store.activeBreakpoints.isWebLayout = true;\n }\n }\n\n initLogSender() {\n // console.log('initLogSender, Implement me');\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { IBitfToastData } from '@interfaces';\nimport { EBitfToastVerticalPosition, EBitfToastHorizontalPosition, EBitfUiMessageType } from '@enums';\nimport { BITF_CONFIGS } from '@configs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport abstract class BitfToastMessagesService {\n protected defaultToastData: IBitfToastData = {\n type: EBitfUiMessageType.SUCCESS,\n title: '',\n verticalPosition: EBitfToastVerticalPosition.BOTTOM,\n horizontalPosition: EBitfToastHorizontalPosition.CENTER,\n duration: BITF_CONFIGS.toastMessage.durationMs,\n keyboardClose: true,\n closeButtonText: '',\n showCloseButton: false,\n };\n\n constructor() {}\n}\n","import { Injectable } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { IBitfToastData, IBitfToastMessagesService } from '@interfaces';\nimport { BitfToastMessagesService } from '../bitf-toast-messages.service';\nimport { EBitfToastHorizontalPosition, EBitfToastVerticalPosition } from '@enums';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BitfMatToastMessageService extends BitfToastMessagesService\n implements IBitfToastMessagesService {\n constructor(protected matSnackBar: MatSnackBar) {\n super();\n }\n\n show(data: IBitfToastData) {\n let messageToDisplay = data.title || '';\n if (data.title && data.message) {\n messageToDisplay += ' | ';\n }\n messageToDisplay += data.message || '';\n\n const options = {\n duration: data.duration || this.defaultToastData.duration,\n horizontalPosition: data.horizontalPosition || EBitfToastHorizontalPosition.CENTER,\n verticalPosition: data.verticalPosition || EBitfToastVerticalPosition.BOTTOM,\n };\n this.matSnackBar.open(messageToDisplay, null, options);\n }\n\n clearAllMessages() {}\n}\n","import { Injectable } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { BitfMatToastMessageService } from '@bitf/services/toast-messages/material/bitf-mat-toast-message.service';\nimport { IBitfToastMessagesService } from '@interfaces';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ToastMessagesService extends BitfMatToastMessageService implements IBitfToastMessagesService {\n constructor(protected matSnackBar: MatSnackBar) {\n super(matSnackBar);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\n\nimport { IBitfDialog, IBitfDialogService } from '@interfaces';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DialogsService implements IBitfDialogService {\n public dialog: IBitfDialog;\n constructor(public matDialog: MatDialog) {\n this.dialog = matDialog;\n }\n}\n","import { Injectable, Injector } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Router } from '@angular/router';\n\nimport { bitfToTranslate } from '@bitf/utils/bitf-translate.utils';\n\nimport { CONSTANTS } from '@constants';\nimport { BITF_CONFIGS } from '@configs';\nimport { IBitfUiMessages, IBitfApiUiMessage, IBitfToastData } from '@interfaces';\nimport {\n AppSessionService,\n ToastMessagesService,\n DialogsService,\n StoreService,\n AuthService,\n} from '@services';\nimport { EBitfUiMessageType, EBitfUiMessageTarget } from '@enums';\n\n@Injectable({\n providedIn: 'root',\n})\nexport abstract class BitfUiMessagesListenerService {\n isSessionExpiredNotified = false;\n apiErrorsInterceptorStrategies = {};\n graphQlErrorsStrategies = {};\n uiMessagesStrategies = {};\n protected appSessionService: AppSessionService;\n protected translateService: TranslateService;\n protected router: Router;\n protected toastMessagesService: ToastMessagesService;\n protected dialogsService: DialogsService;\n protected storeService: StoreService;\n protected authService: AuthService;\n\n constructor(protected injector: Injector) {}\n\n init() {\n this.appSessionService = this.injector.get(AppSessionService);\n this.translateService = this.injector.get(TranslateService);\n this.router = this.injector.get(Router);\n this.toastMessagesService = this.injector.get(ToastMessagesService);\n this.dialogsService = this.injector.get(DialogsService);\n this.storeService = this.injector.get(StoreService);\n this.authService = this.injector.get(AuthService);\n this.initStrategies();\n this.parseUiMessages();\n }\n\n initStrategies() {\n this.initApiErrorsInterceptorSrategies();\n this.initUiMessagesStrategies();\n }\n\n parseUiMessages() {\n this.storeService.store.uiMessages$.subscribe((uiMessage: IBitfUiMessages) => {\n switch (uiMessage.type) {\n case 'BitfApiErrorsInterceptor':\n if (this.apiErrorsInterceptorStrategies[uiMessage.strategy]) {\n this.apiErrorsInterceptorStrategies[uiMessage.strategy](uiMessage);\n }\n break;\n case 'BitfUiMessages':\n if (this.uiMessagesStrategies[uiMessage.strategy]) {\n this.uiMessagesStrategies[uiMessage.strategy](uiMessage);\n }\n break;\n }\n });\n }\n\n initApiErrorsInterceptorSrategies() {\n const showErrorMEssage = ({ payload }) => {\n this.toastMessagesService.show({\n title: this.translateService.instant(bitfToTranslate('BITF.LABEL.ERROR')) || '',\n message: `${this.translateService.instant(bitfToTranslate('BITF.TOAST.HTTP_ERROR.DESCRIPTION')) ||\n ''} : ${payload}`,\n type: EBitfUiMessageType.ERROR,\n });\n };\n this.apiErrorsInterceptorStrategies['4XX'] = showErrorMEssage;\n this.apiErrorsInterceptorStrategies['5XX'] = showErrorMEssage;\n this.apiErrorsInterceptorStrategies['0'] = showErrorMEssage;\n }\n\n initUiMessagesStrategies() {\n this.uiMessagesStrategies[EBitfUiMessageTarget.TOAST] = (uiMessage: IBitfUiMessages) => {\n this.displayToastMessage(uiMessage, { duration: BITF_CONFIGS.toastMessage.uiMessageDurationMs });\n };\n\n this.uiMessagesStrategies[EBitfUiMessageTarget.CONSOLE] = (uiMessage: IBitfUiMessages) => {\n const payload: IBitfApiUiMessage = uiMessage.payload;\n console.log(payload);\n };\n\n this.uiMessagesStrategies[EBitfUiMessageTarget.FULL_SCREEN] = (uiMessage: IBitfUiMessages) => {\n this.displayFullScreenMessage(uiMessage);\n };\n }\n\n displayToastMessage(uiMessage: IBitfUiMessages, options: any = {}) {\n const payload: IBitfToastData = uiMessage.payload;\n if (uiMessage.payload.durationMs != null) {\n options.duration = uiMessage.payload.durationMs;\n }\n this.toastMessagesService.show(\n Object.assign(\n {\n title: payload.title || '',\n message: payload.message || '',\n type: payload.type,\n },\n options\n )\n );\n }\n\n displayFullScreenMessage(uiMessage: IBitfUiMessages, options = {}) {\n const dialogSize = this.storeService.store.activeBreakpoints.isWebLayout ? 'auto' : '100%';\n const dialogSizeMax = this.storeService.store.activeBreakpoints.isWebLayout ? '750px' : '100%';\n const payload: IBitfApiUiMessage = uiMessage.payload;\n this.dialogsService.dialog.open(\n CONSTANTS.fullScreenMessageComponent,\n Object.assign(\n {\n width: dialogSize,\n maxWidth: dialogSizeMax,\n height: dialogSize,\n maxHeight: dialogSizeMax,\n data: payload,\n },\n options\n )\n );\n }\n}\n","import { Injectable, Injector } from '@angular/core';\n\nimport { bitfToTranslate } from '@bitf/utils/bitf-translate.utils';\n\nimport { IBitfApiUiMessage } from '@interfaces';\nimport { EBitfUiMessageTarget, EBitfUiMessageType } from '@enums';\nimport { BITF_CONFIGS } from '@configs';\nimport { CONSTANTS } from '@constants';\nimport { BitfUiMessagesListenerService } from '../bitf-ui-messages-listener.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BitfWebUiMessagesListenerService extends BitfUiMessagesListenerService {\n constructor(protected injector: Injector) {\n super(injector);\n }\n\n initApiErrorsInterceptorSrategies() {\n super.initApiErrorsInterceptorSrategies();\n\n this.apiErrorsInterceptorStrategies['401'] = () => {\n this.dialogsService.dialog.closeAll();\n const dialog = this.dialogsService.dialog.open(CONSTANTS.okCancelDialogComponent, {\n width: '80%',\n maxWidth: '600px',\n disableClose: true,\n data: {\n title: bitfToTranslate('BITF.DIALOG.SESSION_EXPIRATION.TITLE'),\n message: bitfToTranslate('BITF.DIALOG.SESSION_EXPIRATION.DESCRIPTION'),\n okText: bitfToTranslate('BITF.LABEL.OK'),\n },\n });\n dialog.afterClosed().subscribe(() => {\n this.isSessionExpiredNotified = false;\n this.authService.signOut();\n });\n };\n }\n\n initUiMessagesStrategies() {\n super.initUiMessagesStrategies();\n\n this.uiMessagesStrategies[EBitfUiMessageTarget.DIALOG] = uiMessage => {\n const payload: IBitfApiUiMessage = uiMessage.payload;\n this.dialogsService.dialog.closeAll();\n this.dialogsService.dialog.open(CONSTANTS.okCancelDialogComponent, {\n width: '80%',\n maxWidth: '600px',\n disableClose: true,\n data: {\n title: payload.title || '',\n message: payload.message || '',\n // FIXME: these text should came form the payload\n okText: bitfToTranslate('BITF.LABEL.OK'),\n },\n });\n };\n\n this.uiMessagesStrategies[EBitfUiMessageTarget.ERROR_PAGE] = uiMessage => {\n const { message, title }: IBitfApiUiMessage = uiMessage.payload;\n this.router.navigate(['/error'], { queryParams: { message, title } });\n };\n }\n}\n","import { Injectable, Injector } from '@angular/core';\n\nimport { BitfWebUiMessagesListenerService } from '@bitf/services/ui-messages-listener/web/bitf-web-ui-messages-listener.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UiMessagesListenerService extends BitfWebUiMessagesListenerService {\n constructor(protected injector: Injector) {\n super(injector);\n }\n}\n","import { EBitfTouchEventType } from '../../enums';\n\nexport class BitfTouchEvent {\n id: string;\n milliseconds: number;\n triggers: string[];\n eventType: EBitfTouchEventType;\n vibration: number[];\n sound: string;\n isNotified: boolean;\n handler?: () => void;\n\n constructor(event: Partial) {\n Object.assign(this, event);\n }\n}\n","import { BitfTouchEvent } from './bitf-touch-event.model';\n\nexport class BitfTouchEventSnapshot {\n triggerItemId: string;\n startTime: number;\n endTime: number;\n elapsedTime: number;\n events: BitfTouchEvent[];\n\n constructor(item: Partial) {\n Object.assign(this, item);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { filter } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\n\nimport { BitfTouchEventSnapshot, BitfTouchEvent } from '../../core/models';\nimport { EBitfTouchEventType } from '../../enums';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BitfTouchEventsService {\n events: BitfTouchEvent[] = [];\n public readonly touchEvent$ = new Subject();\n\n private touchEventSnapshots: BitfTouchEventSnapshot[] = [];\n private intervalId;\n protected timeInterval = 200;\n\n constructor() {}\n\n /**\n * Utility function to listen only to a certain event\n *\n * @param eventId Id of the event\n */\n selectEvent(eventId: string) {\n return this.touchEvent$.pipe(filter(item => item.id === eventId));\n }\n\n addItem(key: string) {\n if (this.touchEventSnapshots.some(item => item.triggerItemId === key)) {\n return;\n }\n const touchEventSnapshot = new BitfTouchEventSnapshot({ triggerItemId: key });\n\n // NOTE: Add all events related to the pressed item\n touchEventSnapshot.events = this.events\n .filter(event => event.triggers.includes(touchEventSnapshot.triggerItemId))\n // NOTE: we've to shallo clone the object because we need to mutate it (ex isNotfied prop)\n .map(event => new BitfTouchEvent(event));\n touchEventSnapshot.startTime = Date.now();\n\n this.touchEventSnapshots.push(touchEventSnapshot);\n\n if (!this.intervalId) {\n this.processSnapshot();\n this.intervalId = setInterval(() => {\n this.processSnapshot();\n }, this.timeInterval);\n }\n }\n\n removeItem(key: string) {\n const touchEventSnapshotIndex = this.touchEventSnapshots.findIndex(item => item.triggerItemId === key);\n const touchEventSnapshot = this.touchEventSnapshots[touchEventSnapshotIndex];\n if (!touchEventSnapshot) {\n return;\n }\n\n touchEventSnapshot.endTime = Date.now();\n\n const lastUpTouchEvent = touchEventSnapshot.events\n .filter(\n event =>\n event.eventType === EBitfTouchEventType.UP && event.milliseconds <= touchEventSnapshot.elapsedTime\n )\n .sort((event1, event2) => (event1.milliseconds - event2.milliseconds) * -1)[0];\n\n if (lastUpTouchEvent) {\n this.emitEvent(lastUpTouchEvent);\n }\n\n this.touchEventSnapshots.splice(touchEventSnapshotIndex, 1);\n if (this.touchEventSnapshots.length === 0) {\n clearInterval(this.intervalId);\n this.intervalId = undefined;\n }\n }\n\n private processSnapshot() {\n this.touchEventSnapshots.forEach(touchEventSnapshot => {\n touchEventSnapshot.elapsedTime = Date.now() - touchEventSnapshot.startTime;\n\n touchEventSnapshot.events.forEach(touchEvent => {\n if (touchEventSnapshot.elapsedTime >= touchEvent.milliseconds) {\n this.notifyEvent(touchEvent);\n if (touchEvent.eventType === EBitfTouchEventType.DOWN) {\n this.emitEvent(touchEvent);\n }\n }\n });\n });\n }\n\n private emitEvent(touchEvent: BitfTouchEvent) {\n this.touchEvent$.next(touchEvent);\n\n // Remove this event from all TouchItems\n this.touchEventSnapshots.forEach(touchEventSnapshot => {\n touchEventSnapshot.events.forEach(event => {\n if (event.id === touchEvent.id) {\n const index = touchEventSnapshot.events.indexOf(event);\n touchEventSnapshot.events.splice(0, index + 1);\n }\n });\n });\n }\n\n private notifyEvent(touchEvent: BitfTouchEvent) {\n if (touchEvent.isNotified) {\n return;\n }\n touchEvent.isNotified = true;\n\n if (touchEvent.sound) {\n new Audio(touchEvent.sound).play();\n }\n if (touchEvent.vibration) {\n this.vibrate(touchEvent.vibration);\n }\n }\n\n private vibrate(vibrationConfig: number | number[]) {\n if (window.navigator.vibrate) {\n window.navigator.vibrate(vibrationConfig);\n }\n }\n}\n","import { Injectable, Injector } from '@angular/core';\n\nimport { BitfTouchEvent } from '@common/libs/bitforce/core/models';\nimport { BitfTouchEventsService } from '@common/libs/bitforce/directives/bitf-touch-events/bitf-touch-events.service';\n\nimport { ETouchEvent, EBitfTouchEventType, ETouchEventTriggerId } from '@web/enums';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TouchEventsService extends BitfTouchEventsService {\n constructor(public injector: Injector) {\n super();\n\n this.events = [\n new BitfTouchEvent({\n id: ETouchEvent.DEMO_1,\n milliseconds: 2000,\n triggers: [ETouchEventTriggerId.DEMO_TOUCH_EVENT_BTN],\n eventType: EBitfTouchEventType.DOWN,\n sound: 'assets/sounds/switch.mp3',\n }),\n ];\n }\n}\n","export enum EApiCallStateNames {\n PRODUCT_LIST = 'PRODUCT_LIST',\n}\n\nexport enum EApiRequestPartKeys {\n SEARCH = 'SEARCH',\n PAGINATION = 'PAGINATION',\n FILTERS = 'FILTERS',\n SORTING = 'SORTING',\n}\n","import { EBitfStoreActions } from '@common/enums';\nexport enum EWebStoreActions {\n SET_BRANDS = 'SET_BRANDS',\n SET_BRAND_ID = 'SET_BRAND_ID',\n}\n\nexport const eStoreActions = { ...EBitfStoreActions, ...EWebStoreActions };\n","export enum ETouchEvent {\n DEMO_1 = 'DEMO_1',\n}\n\nexport enum ETouchEventTriggerId {\n DEMO_TOUCH_EVENT_BTN = 'DEMO_TOUCH_EVENT_BTN',\n}\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\n\nconst routes: Routes = [\n { path: '', redirectTo: 'home', pathMatch: 'full' },\n\n // NOTE: do not change the order or routes\n {\n path: '',\n loadChildren: () => import('./modules/desktop/desktop.module').then(m => m.DesktopModule),\n },\n];\n\n@NgModule({\n imports: [RouterModule.forRoot(routes, { relativeLinkResolution: 'legacy' })],\n exports: [RouterModule],\n})\nexport class AppRoutingModule {}\n","import { Component } from '@angular/core';\n\nimport { AppSessionService } from '@services';\nimport { environment } from '@env/environment';\n\n@Component({\n selector: 'app-root',\n templateUrl: './app.component.html',\n styleUrls: ['./app.component.scss'],\n})\nexport class AppComponent {\n constructor(private appSessionService: AppSessionService) {\n this.appSessionService.init();\n }\n}\n","","import { HttpRequest } from '@angular/common/http';\nexport const bitfIsCallingApi = (environment, req: HttpRequest) =>\n environment.authInterceptorUrls.some(url => req.url.includes(url)) ||\n req.url.includes('localhost') ||\n req.url.includes(environment.mockApiUrl);\nexport const bitfIsCallingMockService = (environment, req: HttpRequest) =>\n req.url.includes(environment.mockApiUrl);\n","import { Injectable } from '@angular/core';\nimport { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\nimport { environment } from '@env/environment';\nimport { AuthService } from '@services';\n\nimport { bitfIsCallingApi } from '@bitf/utils/bitf-urls.utils';\nimport { bitfGetProp } from '@bitf/utils/bitf-objects.utils';\nimport { EBitfInterceptors } from '@enums';\n@Injectable()\nexport class BitfOAuthInterceptor implements HttpInterceptor {\n constructor(private authService: AuthService) {}\n\n intercept(req: HttpRequest, next: HttpHandler): Observable> {\n if (req.headers.has(EBitfInterceptors.BITF_OAUTH_INTERCEPTOR)) {\n const newReq = req.clone({\n headers: req.headers.delete(EBitfInterceptors.BITF_OAUTH_INTERCEPTOR),\n });\n return next.handle(newReq);\n }\n\n // FIXME: this is custom must be fixed\n const isCallingLoginEndpoints = req.url.includes('/auth/security');\n\n if (\n bitfIsCallingApi(environment, req) &&\n !isCallingLoginEndpoints &&\n bitfGetProp(this.authService, 'authTokenMetaData', 'token')\n ) {\n const authReq = req.clone({\n headers: req.headers.set('Authorization', `Bearer ${this.authService?.authTokenMetaData?.token}`),\n });\n return next.handle(authReq);\n }\n return next.handle(req);\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n HttpEvent,\n HttpInterceptor,\n HttpHandler,\n HttpRequest,\n HttpErrorResponse,\n} from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { throwError, TimeoutError, timer } from 'rxjs';\nimport { timeout, retryWhen, switchMap } from 'rxjs/operators';\n\nimport { bitfIsCallingApi } from '@bitf/utils/bitf-urls.utils';\n\nimport { environment } from '@env/environment';\nimport { EBitfInterceptors } from '@enums';\n\n@Injectable()\nexport class BitfRetryInterceptor implements HttpInterceptor {\n constructor() {}\n\n intercept(req: HttpRequest, next: HttpHandler): Observable> {\n if (!bitfIsCallingApi(environment, req) || !environment.httpRetryConfig.enabled) {\n return next.handle(req);\n }\n\n if (req.headers.has(EBitfInterceptors.BITF_RETRY_INTERCEPTOR)) {\n const newReq = req.clone({\n headers: req.headers.delete(EBitfInterceptors.BITF_RETRY_INTERCEPTOR),\n });\n return next.handle(newReq);\n }\n\n const config = environment.httpRetryConfig.verbs[req.method.toLowerCase()] || null;\n if (!config || !config.enabled) {\n return next.handle(req);\n }\n\n let retryAttempt = 0;\n return next.handle(req).pipe(\n timeout(config.timeout * (1 + 0.2 * retryAttempt)),\n retryWhen(\n (obs: Observable): Observable =>\n obs.pipe(\n switchMap(error => {\n retryAttempt++;\n const shouldRetryForStatus =\n error instanceof HttpErrorResponse && config.retryForStatusesCodes.includes(error.status);\n const shouldRetryAgain = retryAttempt <= config.maxRetries;\n const isTimeoutError = error instanceof TimeoutError;\n if (isTimeoutError) {\n // Create an HttpErrorResponse to send data to logger\n error = new HttpErrorResponse({ url: req.url, headers: req.headers, error });\n }\n const shouldRetryOnTimeout = isTimeoutError && config.timeout;\n if (shouldRetryAgain && (shouldRetryForStatus || shouldRetryOnTimeout)) {\n // NOTE: wait 1sec + incremental shift before to do another call\n return timer(1000 * (1 + 0.2 * (retryAttempt - 1)));\n }\n return throwError(error);\n })\n )\n )\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpEvent, HttpHandler, HttpRequest, HttpResponse, HttpErrorResponse } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\n\nimport { bitfIsCallingApi } from '@bitf/utils/bitf-urls.utils';\n\nimport { EBitfInterceptors } from '@enums';\nimport { IBitfApiUiMessage, IBitfApiResponse } from '@interfaces';\nimport { StoreService } from '@services';\n\nimport { environment } from '@env/environment';\n\n@Injectable()\nexport class BitfApiUiMessagesInterceptor {\n constructor(private storeService: StoreService) {}\n\n intercept(req: HttpRequest, next: HttpHandler): Observable> {\n if (!bitfIsCallingApi(environment, req)) {\n return next.handle(req);\n }\n\n if (req.headers.has(EBitfInterceptors.BITF_API_UI_MESSAGES_INTERCEPTOR)) {\n const newReq = req.clone({\n headers: req.headers.delete(EBitfInterceptors.BITF_API_UI_MESSAGES_INTERCEPTOR),\n });\n return next.handle(newReq);\n }\n\n return next.handle(req).pipe(\n tap(\n response => {\n if (response instanceof HttpResponse) {\n this.parseUiMessages(response.body);\n }\n return response;\n },\n errorResponse => {\n if (errorResponse instanceof HttpErrorResponse) {\n // Envelop mapper has modified the error response to have a body\n this.parseUiMessages(errorResponse['body']);\n }\n }\n )\n );\n }\n\n parseUiMessages(apiResponse: IBitfApiResponse) {\n const uiMessages = apiResponse && apiResponse.metadata && apiResponse.metadata.uiMessages;\n\n if (uiMessages && uiMessages.length) {\n uiMessages.forEach((message: IBitfApiUiMessage) => {\n this.storeService.store.uiMessages$.next({\n type: 'BitfUiMessages',\n strategy: String(message.target),\n payload: message,\n });\n });\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\nimport { bitfIsCallingApi } from '@bitf/utils/bitf-urls.utils';\nimport { bitfGetProp } from '@bitf/utils/bitf-objects.utils';\nimport { EBitfInterceptors } from '@enums';\n\nimport { CONSTANTS } from '@constants';\nimport { environment } from '@env/environment';\nimport { StorageService } from '@services';\n\n@Injectable()\nexport class BitfLanguageInterceptor implements HttpInterceptor {\n constructor(private storageService: StorageService) {}\n\n intercept(req: HttpRequest, next: HttpHandler): Observable> {\n if (req.headers.has(EBitfInterceptors.BITF_LANGUAGE_INTERCEPTOR)) {\n const newReq = req.clone({\n headers: req.headers.delete(EBitfInterceptors.BITF_LANGUAGE_INTERCEPTOR),\n });\n return next.handle(newReq);\n }\n if (bitfIsCallingApi(environment, req)) {\n const language =\n bitfGetProp(this.storageService.data, 'selectedLanguage') || CONSTANTS.DEFAULT_LANGUAGE;\n const newReq = req.clone({ headers: req.headers.set('Language', language.code) });\n return next.handle(newReq);\n }\n return next.handle(req);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpEvent, HttpHandler, HttpRequest, HttpErrorResponse } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { tap, take } from 'rxjs/operators';\n\nimport { bitfIsCallingApi } from '@bitf/utils/bitf-urls.utils';\n\nimport { StoreService, DialogsService, UiMessagesListenerService, AuthService } from '@services';\nimport { BITF_CONFIGS } from '@configs';\nimport { EBitfInterceptors, eStoreActions, EBitfAuthState } from '@enums';\nimport { environment } from '@env/environment';\n\n@Injectable()\nexport class BitfApiErrorsInterceptor {\n constructor(\n public dialogsService: DialogsService,\n private storeService: StoreService,\n private uiMessagesListenerService: UiMessagesListenerService,\n private authService: AuthService\n ) {}\n\n intercept(req: HttpRequest, next: HttpHandler): Observable> {\n if (!bitfIsCallingApi(environment, req)) {\n return next.handle(req);\n }\n\n if (req.headers.has(EBitfInterceptors.BITF_API_ERRORS_INTERCEPTOR)) {\n const newReq = req.clone({\n headers: req.headers.delete(EBitfInterceptors.BITF_API_ERRORS_INTERCEPTOR),\n });\n return next.handle(newReq);\n }\n\n return next.handle(req).pipe(\n tap(\n () => {},\n errorResponse => {\n if (!(errorResponse instanceof HttpErrorResponse)) {\n return;\n }\n // NOTE we've injected the body prop in the HttpErrorResponse object when we create the envelope\n // TODO: handle graphQl uiMessages\n const uiMessages =\n errorResponse['body'] &&\n errorResponse['body'].metadata &&\n errorResponse['body'].metadata.uiMessages;\n // If there is a uiMessages, this error will be handled by BitfApiUiMessagesInterceptor\n if (uiMessages && uiMessages.length) {\n return;\n }\n const statusCode = String(errorResponse.status);\n const statusCodes = [statusCode, `${statusCode.split('')[0]}XX`];\n for (const sC of statusCodes) {\n if (BITF_CONFIGS.apiErrorsInterceptorService.interceptHttpResponsesWithCode.includes(sC)) {\n // NOTE: if is a 401 error not authorized / session expired we've to wait that the authService\n // performs a renewToken and then check again if there is a token valid\n if (statusCode === '401') {\n this.shouldShowSessionExpiredMessage().then(\n () => {\n this.showMessage(sC, errorResponse.message || statusCode);\n },\n () => {}\n );\n } else {\n this.showMessage(sC, errorResponse.message || statusCode);\n }\n break;\n }\n }\n }\n )\n );\n }\n\n private showMessage(statusCode: string, message: string) {\n this.storeService.store.uiMessages$.next({\n type: 'BitfApiErrorsInterceptor',\n strategy: statusCode,\n payload: message,\n });\n }\n\n private async shouldShowSessionExpiredMessage() {\n // NOTE we've to wait for a renewToken call because this interceptor runs\n // before the retryWhen inside the fetch in super api\n return new Promise((success, error) => {\n if (this.uiMessagesListenerService.isSessionExpiredNotified) {\n error('showSessionExpiredMessage already shown');\n return;\n }\n this.storeService\n .selectStore(eStoreActions.SET_AUTH_TOKEN)\n .pipe(take(1))\n .subscribe(() => {\n if (this.authService.isTokenExpired()) {\n this.uiMessagesListenerService.isSessionExpiredNotified = true;\n // NOTE: we are sending a NOT_AUTHORISED event here because this comes from a 401 response\n this.authService.authState$.next(EBitfAuthState.NOT_AUTHORISED);\n success();\n return;\n }\n error('token have been renewed');\n });\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n HttpInterceptor,\n HttpRequest,\n HttpHandler,\n HttpEvent,\n HttpResponse,\n HttpErrorResponse,\n} from '@angular/common/http';\n\nimport { Observable, throwError } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\n\nimport { bitfIsCallingApi } from '@bitf/utils/bitf-urls.utils';\n\nimport { BITF_CONFIGS } from '@configs';\nimport { EBitfInterceptors, EBitfParsers } from '@enums';\nimport { BITF_PARSER_HEADER_NAME } from '@constants';\nimport { environment } from '@env/environment';\n\n@Injectable()\nexport class BitfApiEnvelopeMapperInterceptor implements HttpInterceptor {\n intercept(req: HttpRequest, next: HttpHandler): Observable> {\n if (!bitfIsCallingApi(environment, req)) {\n return next.handle(req);\n }\n\n if (req.headers.has(EBitfInterceptors.BITF_API_ENVELOPE_MAPPER_INTERCEPTOR)) {\n const newReq = req.clone({\n headers: req.headers.delete(EBitfInterceptors.BITF_API_ENVELOPE_MAPPER_INTERCEPTOR),\n });\n return next.handle(newReq);\n }\n\n if (req.headers.has(BITF_PARSER_HEADER_NAME)) {\n const parserName: EBitfParsers = req.headers.get(BITF_PARSER_HEADER_NAME) as EBitfParsers;\n const parserStrategy = BITF_CONFIGS.parsers.parserStrategies[parserName];\n let headers = req.headers.delete(BITF_PARSER_HEADER_NAME);\n\n if (parserStrategy.customHeaders) {\n Object.keys(parserStrategy.customHeaders).forEach(header => {\n headers = headers.append(header, parserStrategy.customHeaders[header]);\n });\n }\n const newReq = req.clone({\n headers,\n });\n return next.handle(newReq).pipe(\n map((event: HttpEvent) => {\n if (event instanceof HttpResponse) {\n event = this.mapEvent({ event, parserStrategy, req });\n }\n return event;\n }),\n catchError(error => {\n if (error instanceof HttpErrorResponse) {\n error = this.mapEvent({ event: error, parserStrategy, req });\n }\n return throwError(error);\n })\n );\n }\n\n return next.handle(req);\n }\n\n private mapEvent({ event, parserStrategy, req }) {\n return parserStrategy.envelopeMapper\n ? parserStrategy.envelopeMapper.map({\n parserStrategy,\n req,\n event,\n })\n : event;\n }\n}\n","import { NgModule, ErrorHandler } from '@angular/core';\nimport { TranslateHttpLoader } from '@ngx-translate/http-loader';\nimport { HttpClientModule, HttpClient, HTTP_INTERCEPTORS } from '@angular/common/http';\n\nimport { BrowserModule } from '@angular/platform-browser';\nimport { TranslateModule, TranslateLoader } from '@ngx-translate/core';\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\n\nimport { BitfOAuthInterceptor } from '@bitf/interceptors/bitf-oauth-interceptor.service';\nimport { BitfRetryInterceptor } from '@bitf/interceptors/bitf-retry-interceptor.service';\nimport { BitfApiUiMessagesInterceptor } from '@bitf/interceptors/bitf-api-ui-messages-interceptor.service';\nimport { BitfLanguageInterceptor } from '@bitf/interceptors/bitf-language-interceptor.service';\nimport { BitfApiErrorsInterceptor } from '@bitf/interceptors/bitf-api-errors-interceptor.service';\nimport { BitfApiEnvelopeMapperInterceptor } from '@bitf/interceptors/bitf-api-envelope-mapper-interceptor.service';\n\nimport { BitfErrorHandlerService } from '@bitf/services/error-handler/bitf-error-handler.service';\n\nimport { APP_VERSION } from '@env/version';\nimport { ApolloModule, APOLLO_OPTIONS } from 'apollo-angular';\nimport { HttpLink } from 'apollo-angular/http';\nimport { InMemoryCache } from '@apollo/client/core';\nimport { environment } from '@env/environment';\n\nconst EXPORTS_COMPONENTS = [];\nconst COMPONENTS = [];\n\nexport function HttpLoaderFactory(http: HttpClient) {\n return new TranslateHttpLoader(http, './assets/i18n/', `.json?v=${APP_VERSION}`);\n}\n\n@NgModule({\n imports: [\n ApolloModule,\n BrowserModule,\n BrowserAnimationsModule,\n HttpClientModule,\n TranslateModule.forRoot({\n loader: {\n provide: TranslateLoader,\n useFactory: HttpLoaderFactory,\n deps: [HttpClient],\n },\n }),\n ],\n providers: [\n {\n provide: HTTP_INTERCEPTORS,\n useClass: BitfOAuthInterceptor,\n multi: true,\n },\n {\n provide: HTTP_INTERCEPTORS,\n useClass: BitfLanguageInterceptor,\n multi: true,\n },\n {\n provide: HTTP_INTERCEPTORS,\n useClass: BitfApiErrorsInterceptor,\n multi: true,\n },\n {\n provide: HTTP_INTERCEPTORS,\n useClass: BitfApiUiMessagesInterceptor,\n multi: true,\n },\n {\n provide: HTTP_INTERCEPTORS,\n useClass: BitfApiEnvelopeMapperInterceptor,\n multi: true,\n },\n {\n provide: HTTP_INTERCEPTORS,\n useClass: BitfRetryInterceptor,\n multi: true,\n },\n { provide: ErrorHandler, useClass: BitfErrorHandlerService },\n {\n // AUTH: https://apollo-angular.com/docs/1.0/basics/network-layer/#middleware\n provide: APOLLO_OPTIONS,\n useFactory: (httpLink: HttpLink) => {\n const http = httpLink.create({\n uri: environment.graphQlUrl,\n includeExtensions: true,\n });\n\n // const middleware = new ApolloLink((operation, forward) => {\n // // operation.setContext({\n // // headers: new HttpHeaders().set(\n // // 'Authorization',\n // // `Bearer ${localStorage.getItem('token') || null}`\n // // ),\n // // });\n // forward(operation).map(response => {\n // debugger;\n // console.log(response);\n // });\n // return forward(operation);\n // });\n\n // const link = middleware.concat((http as any) as ApolloLink);\n\n return {\n cache: new InMemoryCache(),\n link: http,\n defaultOptions: {\n watchQuery: {\n fetchPolicy: 'no-cache',\n errorPolicy: 'all',\n },\n query: {\n fetchPolicy: 'no-cache',\n errorPolicy: 'all',\n },\n },\n };\n },\n deps: [HttpLink],\n },\n ],\n declarations: [...EXPORTS_COMPONENTS, ...COMPONENTS],\n exports: [...EXPORTS_COMPONENTS],\n})\nexport class CommonCoreModule {}\n","import { NgModule, Optional, SkipSelf } from '@angular/core';\nimport { RouterModule } from '@angular/router';\n\nimport { PortalModule } from '@angular/cdk/portal';\n\nimport { SharedModule } from '@shared/shared.module';\nimport { CommonCoreModule } from '@common/core/common-core.module';\n\nimport { throwIfAlreadyLoaded } from './module-config';\nimport { NotFoundComponent } from './components/not-found/not-found.component';\n\nconst EXPORTS_COMPONENTS = [NotFoundComponent];\nconst COMPONENTS = [];\n\n@NgModule({\n imports: [CommonCoreModule, RouterModule, SharedModule.forRoot(), PortalModule],\n exports: [...EXPORTS_COMPONENTS],\n declarations: [...EXPORTS_COMPONENTS, ...COMPONENTS],\n providers: [],\n})\nexport class CoreModule {\n constructor(\n @Optional()\n @SkipSelf()\n parentModule: CoreModule\n ) {\n throwIfAlreadyLoaded(parentModule, 'CoreModule');\n }\n}\n","export function throwIfAlreadyLoaded(parentModule: any, moduleName: string) {\n if (parentModule) {\n throw new Error(`${moduleName} has already been loaded. Import Core modules in the AppModule only.`);\n }\n}\n","import { NgModule } from '@angular/core';\n\nimport { AppRoutingModule } from './app-routing.module';\nimport { AppComponent } from './app.component';\n\nimport { CoreModule } from '@core/core.module';\nimport { SharedModule } from '@shared/shared.module';\nimport { ServiceWorkerModule } from '@angular/service-worker';\nimport { environment } from '@env/environment';\n\n@NgModule({\n declarations: [AppComponent],\n imports: [AppRoutingModule, CoreModule, SharedModule],\n bootstrap: [AppComponent],\n})\nexport class AppModule {}\n","import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app.module';\nimport { environment } from '@env/environment';\n\nif (environment.production) {\n enableProdMode();\n}\n\nplatformBrowserDynamic()\n .bootstrapModule(AppModule)\n .then(module => {\n window['rootInjector'] = module.injector;\n })\n .catch(err => console.log(err));\n\nif ('serviceWorker' in navigator && environment.registerServiceWorker) {\n navigator.serviceWorker.register('/ngsw-worker.js');\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { Brand } from '@common/core/models';\nimport { StoreService } from '@common/core/services';\n\n@Component({\n selector: 'mks-brand-block',\n templateUrl: './brand-block.component.html',\n styleUrls: ['./brand-block.component.scss'],\n})\nexport class BrandBlockComponent implements OnInit {\n @Input() brand: Brand;\n @Input() textSide: 'right' | 'left' = 'left';\n @Input() buttonBorderColor = '#000';\n\n constructor(public storeService: StoreService) {}\n\n ngOnInit(): void {}\n}\n","
\n
\n \n \n
\n {{brand?.description}}\n
\n
\n
\n \n \n
\n \n \n
\n
\n
\n","import { Component, OnInit } from '@angular/core';\nimport { BitfDynamicLocaleService } from '@common/libs/bitforce/core/services/locale/bitf-dynamic-locale.service';\n\n@Component({\n selector: 'app-footer',\n templateUrl: './footer.component.html',\n styleUrls: ['./footer.component.scss'],\n})\nexport class FooterComponent implements OnInit {\n iubendaPrivacyData = {\n it: { id: '39692961', title: 'Privacy Policy', cookieTitle: 'Cookie Policy', bannerCode: 'it' },\n fr: {\n id: '39297569',\n title: 'Politique de confidentialité',\n cookieTitle: 'Politique relative aux Cookies',\n bannerCode: 'fr',\n },\n es: {\n id: '83921498',\n title: 'Política de Privacidad',\n cookieTitle: 'Política de Cookies',\n bannerCode: 'es',\n },\n en: { id: '98753195', title: 'Privacy Policy', cookieTitle: 'Cookie Policy', bannerCode: 'en-GB' },\n de: { id: '70982919', title: 'Datenschutzerklärung', cookieTitle: 'Cookie-Richtlinie', bannerCode: 'de' },\n };\n selectedPrivacyData: any = this.iubendaPrivacyData.en;\n\n constructor(private localeService: BitfDynamicLocaleService) {}\n\n ngOnInit(): void {\n this.selectedPrivacyData =\n this.iubendaPrivacyData[this.localeService.locale.code] || this.iubendaPrivacyData.en;\n\n this.setCookieBanner();\n }\n\n setCookieBanner() {\n window['_iub'] = window['_iub'] || [];\n window['_iub']['csConfiguration'] = {\n ccpaAcknowledgeOnDisplay: true,\n consentOnContinuedBrowsing: false,\n countryDetection: true,\n enableCcpa: true,\n floatingPreferencesButtonDisplay: 'bottom-right',\n invalidateConsentWithoutLog: true,\n perPurposeConsent: true,\n siteId: 2749784,\n whitelabel: false,\n cookiePolicyId: this.selectedPrivacyData.id,\n lang: this.selectedPrivacyData.bannerCode,\n banner: {\n acceptButtonCaptionColor: '#FFFFFF',\n acceptButtonColor: '#0073CE',\n acceptButtonDisplay: true,\n backgroundColor: '#FFFFFF',\n backgroundOverlay: true,\n brandBackgroundColor: '#FFFFFF',\n brandTextColor: '#000000',\n closeButtonDisplay: false,\n customizeButtonCaptionColor: '#4D4D4D',\n customizeButtonColor: '#DADADA',\n customizeButtonDisplay: true,\n explicitWithdrawal: true,\n listPurposes: true,\n logo: null,\n position: 'bottom',\n rejectButtonCaptionColor: '#FFFFFF',\n rejectButtonColor: '#0073CE',\n rejectButtonDisplay: true,\n textColor: '#000000',\n },\n };\n\n const stub = document.createElement('script');\n stub.setAttribute('type', 'text/javascript');\n stub.setAttribute('src', '//cdn.iubenda.com/cs/ccpa/stub.js');\n document.body.appendChild(stub);\n\n const iubenda_cs = document.createElement('script');\n iubenda_cs.setAttribute('type', 'text/javascript');\n iubenda_cs.setAttribute('src', '//cdn.iubenda.com/cs/iubenda_cs.js');\n document.body.appendChild(iubenda_cs);\n }\n}\n","","import { Injectable, ComponentFactoryResolver } from '@angular/core';\nimport { CommonSharedModule } from '@common/shared/common-shared.module';\nimport { IBitfSidenavContent } from '@interfaces';\nimport { BitfMatSidenavGlobalService } from './bitf-mat-sidenav-global.service';\nimport { IBitfCloseEvent } from '@interfaces';\n@Injectable({\n providedIn: CommonSharedModule,\n})\nexport class BitfMatSidenavService {\n constructor(\n private resolver: ComponentFactoryResolver,\n private sidenavGlobalService: BitfMatSidenavGlobalService\n ) {}\n\n open(sidenavContent: IBitfSidenavContent) {\n sidenavContent.componentFactory = this.resolver.resolveComponentFactory(sidenavContent.component);\n return this.sidenavGlobalService.open(sidenavContent);\n }\n\n close(event: IBitfCloseEvent) {\n this.sidenavGlobalService.close(event);\n }\n}\n","\n
\n \n \n
\n\n \n
","import { Component, OnInit } from '@angular/core';\nimport { EBitfSidenavMode, EBitfSidenavPosition } from '@common/enums';\nimport { BitfMatSidenavService } from '@common/libs/bitforce/core/services/sidenav/material/bitf-mat-sidenav.service';\nimport { StoreService } from '@web/core/services';\nimport { SidenavComponent } from '../sidenav/sidenav.component';\n\n@Component({\n selector: 'app-header',\n templateUrl: './header.component.html',\n styleUrls: ['./header.component.scss'],\n})\nexport class HeaderComponent implements OnInit {\n constructor(public storeService: StoreService, public bitfMatSidenavService: BitfMatSidenavService) {}\n\n ngOnInit(): void {}\n\n onToggleMenuButton() {\n this.bitfMatSidenavService\n .open({\n component: SidenavComponent,\n componentData: {\n brands: this.storeService.store.brands,\n },\n sidenavOptions: {\n mode: EBitfSidenavMode.OVER,\n position: EBitfSidenavPosition.LEFT,\n },\n })\n .subscribe(() => {});\n }\n}\n","import { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatNativeDateModule, MatRippleModule } from '@angular/material/core';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatGridListModule } from '@angular/material/grid-list';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatListModule } from '@angular/material/list';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatStepperModule } from '@angular/material/stepper';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\n// import { CdkTableModule } from '@angular/cdk/table';\n// import { PlatformModule } from '@angular/cdk/platform';\n// import { ObserversModule } from '@angular/cdk/observers';\n\nexport const MATERIAL_MODULES = [\n MatAutocompleteModule,\n MatButtonModule,\n MatButtonToggleModule,\n MatCardModule,\n MatCheckboxModule,\n MatChipsModule,\n MatDatepickerModule,\n MatDialogModule,\n MatExpansionModule,\n MatGridListModule,\n MatIconModule,\n MatInputModule,\n MatListModule,\n MatMenuModule,\n MatNativeDateModule,\n MatPaginatorModule,\n MatProgressBarModule,\n MatProgressSpinnerModule,\n MatRadioModule,\n MatRippleModule,\n MatSelectModule,\n MatSidenavModule,\n MatSliderModule,\n MatSlideToggleModule,\n MatSnackBarModule,\n MatSortModule,\n MatTableModule,\n MatTabsModule,\n MatToolbarModule,\n MatTooltipModule,\n MatStepperModule,\n MatBadgeModule,\n];\n\n// export const CDK_MODULES = [CdkTableModule, PlatformModule, ObserversModule];\nexport const CDK_MODULES = [];\n","\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
","import { Component, OnInit } from '@angular/core';\n\nimport { IBitfLoaderAction, IBitfLoaderComponent } from '@interfaces';\nimport { EBitfLoaderAction } from '@enums';\nimport { LoaderService } from '@services';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'bitf-loader',\n templateUrl: './bitf-loader.component.html',\n styleUrls: ['./bitf-loader.component.scss'],\n})\nexport class BitfLoaderComponent implements OnInit, IBitfLoaderComponent {\n canShowLoader = false;\n loaderData: any;\n\n constructor(private loaderService: LoaderService) {}\n\n ngOnInit() {\n this.loaderService.onLoaderChange.subscribe((loaderAction: IBitfLoaderAction) => {\n switch (loaderAction.action) {\n case EBitfLoaderAction.SHOW:\n this.loaderData = loaderAction.data;\n this.show();\n this.loaderService.isLoading = true;\n break;\n case EBitfLoaderAction.HIDE:\n this.loaderData = undefined;\n this.hide();\n this.loaderService.isLoading = false;\n break;\n }\n });\n }\n\n show() {\n setTimeout(() => (this.canShowLoader = true));\n }\n\n hide() {\n setTimeout(() => (this.canShowLoader = false));\n }\n}\n","import { OnInit, Input, OnDestroy, Component } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { Subscription } from 'rxjs';\n\nimport { ApiCallStateService } from '@services';\nimport { EApiRequestPartKeys } from '@enums';\nimport { EBitfApiSortDirection } from '@bitf/enums';\nimport { BitfApiRequestPart } from '@bitf/core/api-call-state/bitf-api-request-part';\nimport { IBitfSortOption } from '@interfaces';\n\n@Component({\n selector: 'bitf-sort',\n template: '',\n})\nexport class BitfSortComponent implements OnInit, OnDestroy {\n @Input()\n apiCallStateName;\n\n @Input()\n apiRequestPartKey = EApiRequestPartKeys.SORTING;\n\n // Use for type dropdown\n @Input()\n options: IBitfSortOption[] = [];\n\n // Use for type button\n @Input()\n option: IBitfSortOption;\n\n EBitfApiSortDirection = EBitfApiSortDirection;\n\n formControl = new UntypedFormControl(null);\n private subscription: Subscription = new Subscription();\n private requestPart: BitfApiRequestPart;\n private paginationRequestPart: BitfApiRequestPart;\n\n constructor(private apiCallStateService: ApiCallStateService) {}\n\n ngOnInit() {\n this.requestPart = this.apiCallStateService.getRequestPart(this.apiCallStateName, this.apiRequestPartKey);\n\n this.paginationRequestPart = this.apiCallStateService.getRequestPart(\n this.apiCallStateName,\n EApiRequestPartKeys.PAGINATION\n );\n\n if (this.isDropDown()) {\n this.initDropdown();\n // NOTE: this refresh is needed in case some other part or controller will change this part data\n // (the value of the sorting)\n this.subscription = this.apiCallStateService.getStateStore$(this.apiCallStateName).subscribe(() => {\n this.initDropdown();\n });\n } else {\n // NOTE: we've to set only the property because the direction could being already set\n // by the apiCallState part defaultPartData or from user interaction.\n // We don't want to override that value\n this.requestPart.data.property = this.option.value.property;\n this.updateSortState();\n // NOTE: this refresh is needed in case some other part or controller will change this part data\n // (the value of the sorting), this is needed also to update the: this.option.value.direction\n this.subscription = this.apiCallStateService.getStateStore$(this.apiCallStateName).subscribe(() => {\n this.updateSortState();\n });\n }\n }\n\n // Dropdown\n onSelectionChange(event) {\n this.requestPart.data = event.value.property ? event.value : undefined;\n this.dispatchEvent();\n }\n\n // Button\n sort(option: IBitfSortOption) {\n switch (option.value.direction) {\n case EBitfApiSortDirection.ASC:\n this.requestPart.data.direction = EBitfApiSortDirection.DESC;\n break;\n case EBitfApiSortDirection.DESC:\n this.requestPart.data.direction = EBitfApiSortDirection.UNDEFINED;\n break;\n case EBitfApiSortDirection.UNDEFINED:\n this.requestPart.data.direction = EBitfApiSortDirection.ASC;\n break;\n }\n this.updateSortState();\n this.dispatchEvent();\n }\n\n isDropDown(): boolean {\n return this.options.length > 0;\n }\n\n private initDropdown() {\n const data = this.requestPart.data;\n if (data) {\n const optionFound = this.options.find(\n item => item.value.property === data.property && item.value.direction === data.direction\n );\n if (optionFound) {\n this.formControl.patchValue(optionFound.value);\n }\n }\n }\n\n private updateSortState() {\n // NOTE: we need to update just the direction value, the property stays the same\n this.option.value.direction = this.requestPart.data.direction || EBitfApiSortDirection.UNDEFINED;\n }\n\n private dispatchEvent() {\n this.apiCallStateService.setStore(() => {\n this.paginationRequestPart.reset();\n }, this.apiCallStateName);\n }\n\n ngOnDestroy() {\n this.subscription.unsubscribe();\n }\n}\n","\n {{ 'COMMON.LABEL.ORDER_BY' | translate}}\n \n \n {{option.label | translate}}\n \n \n\n\n\n \n","import { Component, Input } from '@angular/core';\n\nimport { BitfSortComponent } from '../bitf-sort.component';\n\n@Component({\n selector: 'bitf-mat-sort',\n templateUrl: './bitf-mat-sort.component.html',\n styleUrls: ['./bitf-mat-sort.component.scss'],\n})\nexport class BitfMatSortComponent extends BitfSortComponent {\n @Input() color: string;\n @Input() fontSize: string;\n @Input() isInToolbar = false;\n}\n","import {\n Directive,\n Input,\n OnInit,\n Renderer2,\n ViewContainerRef,\n TemplateRef,\n OnDestroy,\n EmbeddedViewRef,\n} from '@angular/core';\nimport { filter, tap } from 'rxjs/operators';\nimport { Subscription } from 'rxjs';\n\nimport { UiRoleManagerService, StoreService } from '@services';\nimport { ERoleMode } from '@enums';\n\nimport { IBitfUiRoleManagerConfig } from './bitf-ui-role-manager.interface';\n\n@Directive({\n selector: '[bitfUiRoleManager]',\n})\nexport class BitfUiRoleManagerDirective implements OnInit, OnDestroy {\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('bitfUiRoleManager')\n config: IBitfUiRoleManagerConfig = {};\n nativeElement: HTMLElement;\n\n subscription: Subscription = new Subscription();\n embededViewRef: EmbeddedViewRef;\n\n constructor(\n private viewRef: ViewContainerRef,\n private templateRef: TemplateRef,\n private renderer: Renderer2,\n private uiRoleManagerService: UiRoleManagerService,\n private storeService: StoreService\n ) {}\n\n ngOnInit(): void {\n this.config = this.config || {};\n if (!this.config || !this.config.action) {\n this.createComponent();\n return;\n }\n\n if (!this.config.mode) {\n this.config.mode = ERoleMode.HIDDEN;\n }\n this.mutateView();\n this.listenForStoreActions();\n }\n\n private mutateView() {\n const canI = this.config.inverted\n ? !this.uiRoleManagerService.canI(this.config.action, this.config.data)\n : this.uiRoleManagerService.canI(this.config.action, this.config.data);\n\n switch (this.config.mode) {\n case ERoleMode.HIDDEN:\n if (canI) {\n this.createEmbeddedView();\n this.setVisibility('visible');\n } else if (this.embededViewRef) {\n this.embededViewRef.destroy();\n this.embededViewRef = undefined;\n }\n break;\n case ERoleMode.INVISIBLE:\n this.createEmbeddedView();\n if (!this.isNativeElementReal()) {\n return;\n }\n setTimeout(() => {\n if (canI) {\n this.setVisibility('visible');\n } else if (this.embededViewRef) {\n this.setVisibility('hidden');\n }\n }, 0);\n break;\n case ERoleMode.DISABLED:\n this.createEmbeddedView();\n if (!this.isNativeElementReal()) {\n return;\n }\n setTimeout(() => {\n if (!canI) {\n this.renderer.setAttribute(this.nativeElement, 'disabled', 'true');\n } else {\n this.renderer.removeAttribute(this.nativeElement, 'disabled');\n }\n this.setVisibility('visible');\n }, 0);\n break;\n case ERoleMode.READ_ONLY:\n this.createEmbeddedView();\n if (!this.isNativeElementReal()) {\n return;\n }\n setTimeout(() => {\n if (!canI) {\n this.renderer.setAttribute(this.nativeElement, 'readonly', 'true');\n } else {\n this.renderer.removeAttribute(this.nativeElement, 'readonly');\n }\n this.setVisibility('visible');\n }, 0);\n break;\n }\n }\n\n private createEmbeddedView() {\n const viewContainerRef: any = this.createComponent();\n this.nativeElement = viewContainerRef.rootNodes[0];\n if (this.isNativeElementReal()) {\n this.renderer.addClass(this.nativeElement, 'uiRolesManager');\n this.setVisibility('hidden');\n }\n }\n\n private setVisibility(state: string) {\n if (this.isNativeElementReal()) {\n this.renderer.setStyle(this.nativeElement, 'visibility', state);\n }\n }\n\n private createComponent(): any {\n if (!this.embededViewRef) {\n this.embededViewRef = this.viewRef.createEmbeddedView(this.templateRef, {});\n }\n\n return this.embededViewRef;\n }\n\n private isNativeElementReal(): boolean {\n return this.nativeElement.innerHTML !== undefined;\n }\n\n private listenForStoreActions() {\n if (!this.config.storeActionsToListen || !this.config.storeActionsToListen.length) {\n return;\n }\n\n this.subscription.add(\n this.storeService.store$\n .pipe(\n filter(store => this.config.storeActionsToListen.includes(store.action)),\n tap(() => this.mutateView())\n )\n .subscribe()\n );\n }\n\n ngOnDestroy(): void {\n this.subscription.unsubscribe();\n }\n}\n","import { Directive, HostListener, Input, OnInit } from '@angular/core';\nimport { TouchEventsService } from '@services';\n\n@Directive({\n selector: '[bitfTouchEvent]',\n})\nexport class BitfTouchEventDirective implements OnInit {\n @Input() bitfTouchEvent: string;\n\n private touchItemKey: string;\n private isTouchDeviceOnly = false;\n\n constructor(private touchEventsService: TouchEventsService) {}\n\n ngOnInit() {\n this.touchItemKey = this.bitfTouchEvent;\n }\n\n @HostListener('touchstart') touchstart(): void {\n this.isTouchDeviceOnly = true;\n this.touchEventsService.addItem(this.touchItemKey);\n }\n\n @HostListener('touchend') touchend(): void {\n this.isTouchDeviceOnly = true;\n this.touchEventsService.removeItem(this.touchItemKey);\n }\n\n @HostListener('touchcancel') touchcancel(): void {\n this.isTouchDeviceOnly = true;\n this.touchEventsService.removeItem(this.touchItemKey);\n }\n\n @HostListener('mousedown') mousedown(): void {\n if (this.isTouchDeviceOnly) {\n return;\n }\n this.touchEventsService.addItem(this.touchItemKey);\n }\n\n @HostListener('mouseup') mouseup(): void {\n if (this.isTouchDeviceOnly) {\n return;\n }\n this.touchEventsService.removeItem(this.touchItemKey);\n }\n}\n","import { NgModule, ModuleWithProviders, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { CommonSharedModule } from '@common/shared/common-shared.module';\nimport { MATERIAL_MODULES, CDK_MODULES } from './material-modules';\n\nimport { BitfLoaderComponent } from '@bitf/core/components/ui/loader/bitf-loader.component';\nimport { BitfMatPaginatorComponent } from '@bitf/core/components/ui/paginator/material/bitf-mat-paginator.component';\nimport { BitfMatSearchComponent } from '@common/libs/bitforce/core/components/ui/search/material/bitf-mat-search.component';\nimport { BitfMatSortComponent } from '@common/libs/bitforce/core/components/ui/sort/material/bitf-mat-sort.component';\nimport { BitfUiRoleManagerDirective } from '@common/libs/bitforce/directives/ui-role-manager/bitf-ui-role-manager.directive';\nimport { BitfTouchEventDirective } from '@common/libs/bitforce/directives/bitf-touch-events/bitf-touch-event.directive';\nimport { BitfMatOkCancelDialogComponent } from '@common/libs/bitforce/core/components/ui/ok-cancel-dialog/material/bitf-mat-ok-cancel-dialog.component';\nimport { BitfMatLoaderComponent } from '@bitf/core/components/ui/loader/material/bitf-mat-loader/bitf-mat-loader.component';\nimport { FooterComponent } from './footer/footer.component';\nimport { SidenavComponent } from './sidenav/sidenav.component';\nimport { HeaderComponent } from './header/header.component';\nimport { BrandBlockComponent } from './brand-block/brand-block.component';\nimport { SlideshowComponent } from './slideshow/slideshow.component';\nimport { BitfImageComponent } from '@common/libs/bitforce/core/components/ui/image/bitf-image/bitf-image.component';\n\nconst SHARED_MODULES = [CommonSharedModule, RouterModule, MATERIAL_MODULES, CDK_MODULES];\nconst SHARED_COMPONENTS = [\n BitfLoaderComponent,\n BitfMatPaginatorComponent,\n BitfMatSearchComponent,\n BitfMatSortComponent,\n BitfUiRoleManagerDirective,\n BitfTouchEventDirective,\n BitfMatOkCancelDialogComponent,\n BitfMatLoaderComponent,\n BitfImageComponent,\n HeaderComponent,\n SidenavComponent,\n FooterComponent,\n BrandBlockComponent,\n SlideshowComponent,\n];\nconst SHARED_DIRECTIVES = [];\n\n@NgModule({\n imports: [...SHARED_MODULES],\n exports: [...SHARED_MODULES, ...SHARED_COMPONENTS, ...SHARED_DIRECTIVES],\n declarations: [...SHARED_COMPONENTS, ...SHARED_DIRECTIVES],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class SharedModule {\n static forRoot(): ModuleWithProviders {\n return {\n ngModule: SharedModule,\n providers: [],\n };\n }\n}\n","
\n \n
\n \n \n
\n
\n \n
","import { Component, OnInit } from '@angular/core';\nimport { Brand } from '@common/core/models';\nimport { BitfMatSidenavGlobalService } from '@common/libs/bitforce/core/services/sidenav/material/bitf-mat-sidenav-global.service';\nimport { EBitfCloseEventStatus } from '@web/enums';\n\n@Component({\n selector: 'mks-sidenav',\n templateUrl: './sidenav.component.html',\n styleUrls: ['./sidenav.component.scss'],\n})\nexport class SidenavComponent implements OnInit {\n brands: Brand[] = [];\n\n constructor(private bitfMatSidenavService: BitfMatSidenavGlobalService) {}\n\n ngOnInit(): void {\n this.brands = this.bitfMatSidenavService.componentRef.instance['brands'];\n }\n\n closeSidenav() {\n this.bitfMatSidenavService.close({ status: EBitfCloseEventStatus.CLOSE });\n }\n}\n","","import { Component, Input, OnInit } from '@angular/core';\nimport { Asset } from '@common/core/models';\n\n@Component({\n selector: 'mks-slideshow',\n templateUrl: './slideshow.component.html',\n styleUrls: ['./slideshow.component.scss'],\n})\nexport class SlideshowComponent implements OnInit {\n @Input() images: Asset[];\n activeIndex = 0;\n\n constructor() {}\n\n ngOnInit(): void {}\n\n showPrevSlide() {\n if (this.activeIndex) {\n this.activeIndex--;\n } else {\n this.activeIndex = this.images.length - 1;\n }\n }\n\n showNextSlide() {\n this.activeIndex = (this.activeIndex + 1) % this.images.length;\n }\n\n showSlide(n) {\n this.activeIndex = n;\n }\n}\n","import { User } from '@models';\nimport justClone from 'just-clone';\n\nexport abstract class SuperModel {\n id?: string;\n createdAt?: string | Date;\n modifiedAt?: string | Date;\n createdBy: string | User;\n modifiedBy: string | User;\n\n constructor(object: any = {}) {\n Object.assign(this, object);\n if (!object) {\n return;\n }\n if (typeof object.createdBy === 'object') {\n this.createdBy = new User(object.createdBy);\n }\n if (typeof object.modifiedBy === 'object') {\n this.modifiedBy = new User(object.modifiedBy);\n }\n }\n\n abstract readonly serialised;\n\n get clone() {\n return justClone(this.serialised);\n }\n\n serialiseDate(date: Date) {\n if (!date || !(date instanceof Date)) {\n return '';\n }\n\n const monthNum = date.getMonth() + 1;\n const month = monthNum < 10 ? `0${monthNum}` : monthNum;\n const day = date.getDate() < 10 ? `0${date.getDate()}` : date.getDate();\n return `${date.getFullYear()}-${month}-${day}`;\n }\n}\n","import { SuperModel } from './super-model.model';\n\nexport class User extends SuperModel {\n firstName: string;\n lastName: string;\n email: string;\n constructor(data = {}) {\n super(data);\n }\n get serialised() {\n return {\n id: this.id,\n firstName: this.firstName,\n lastName: this.lastName,\n email: this.email,\n };\n }\n\n get canViewLogs() {\n return true;\n }\n}\n","import { BitfStore } from '@bitf/core/models/bitf-store.model';\nimport { Brand, User } from '@models';\n\n// NOTE: default values must be defined in the StoreService, not in the model\n// (otherwise the default here will override the super Object.assign())\nexport class Store extends BitfStore {\n user: User;\n prop1: any;\n brands: Brand[];\n brandId: string;\n\n constructor(storeData: Partial) {\n super(storeData);\n }\n}\n","import { BitfStorage } from '@bitf/core/models/bitf-storage.model';\n\n// NOTE: default values must be defined in the StorageService, not in the model\n// (otherwise the default here will override the super Object.assign())\nexport class Storage extends BitfStorage {\n prop1?: any;\n\n constructor(storageData: Partial) {\n super(storageData);\n }\n}\n","import { IBitfLanguage } from '@interfaces';\n\n/**\n * General Storage model with properties needed from the Bitf core services.\n */\nexport class BitfStorage {\n /**\n * Selected language, used by BitfDynamicLocaleService\n */\n selectedLanguage?: IBitfLanguage;\n /** Redirect url used by auth system */\n redirectUrl?: string;\n\n constructor(data: Partial = {}) {\n Object.assign(this, data);\n }\n}\n","import { environment } from '@env/environment';\nimport { SuperModel } from './super-model.model';\n\nexport class Asset extends SuperModel {\n filename: string;\n desktop: string;\n desktop_15: string;\n mobile: string;\n mobile_15: string;\n mimetype: string;\n\n constructor(data = {}) {\n super(data);\n\n if (this.desktop) {\n this.desktop = new URL(this.desktop, environment.apiUrl).href;\n }\n\n if (this.desktop_15) {\n this.desktop_15 = new URL(this.desktop_15, environment.apiUrl).href;\n }\n\n if (this.mobile) {\n this.mobile = new URL(this.mobile, environment.apiUrl).href;\n }\n\n if (this.mobile_15) {\n this.mobile_15 = new URL(this.mobile_15, environment.apiUrl).href;\n }\n }\n\n // We do not include readonly fields like inventory, label, description\n get serialised() {\n return {\n id: this.id,\n filename: this.filename,\n desktop: this.desktop,\n desktop_15: this.desktop_15,\n mobile: this.mobile,\n mobile_15: this.mobile_15,\n mimetype: this.mimetype,\n };\n }\n}\n","import { Asset } from './asset.model';\nimport { SuperModel } from './super-model.model';\n\nexport class Brand extends SuperModel {\n code: string;\n name: string;\n subtitle: string;\n description: string;\n logo_white: Asset;\n logo_black: Asset;\n image: Asset;\n\n constructor(data: any = {}) {\n super(data);\n\n if (data.logo_white) {\n this.logo_white = new Asset(data.logo_white);\n }\n if (data.logo_black) {\n this.logo_black = new Asset(data.logo_black);\n }\n if (data.image) {\n this.image = new Asset(data.image);\n }\n }\n\n // We do not include readonly fields like inventory, label, description\n get serialised() {\n return {\n id: this.id,\n code: this.code,\n name: this.name,\n subtitle: this.subtitle,\n description: this.description,\n logo_white: this.logo_white,\n logo_black: this.logo_black,\n image: this.image,\n };\n }\n}\n","import { Asset } from './asset.model';\nimport { SuperModel } from './super-model.model';\n\nexport class Folder extends SuperModel {\n children: Asset[];\n\n constructor(data: any = {}) {\n super(data);\n\n if (data.children) {\n this.children = data.children.map(item => new Asset(item));\n } else {\n this.children = [];\n }\n }\n\n // We do not include readonly fields like inventory, label, description\n get serialised() {\n return {\n id: this.id,\n children: this.children,\n };\n }\n}\n","import { Asset } from './asset.model';\nimport { SuperModel } from './super-model.model';\n\nexport class Product extends SuperModel {\n eu_item: string;\n ean: string;\n title: string;\n shadeName: string;\n segment: {\n description: string;\n };\n frontImage: {\n image: Asset;\n }[];\n primaryPackaging: {\n material: string;\n sortingDetails: string;\n material_fr: string;\n sortingDetails_fr: string;\n material_it: string;\n sortingDetails_it: string;\n }[];\n secondaryPackaging: {\n material: string;\n sortingDetails: string;\n material_fr: string;\n sortingDetails_fr: string;\n material_it: string;\n sortingDetails_it: string;\n }[];\n\n constructor(data: any = {}) {\n super(data);\n\n if (data.frontImage) {\n this.frontImage = data.frontImage.map(item => ({ ...item, image: new Asset(item.image) }));\n } else {\n this.frontImage = [];\n }\n\n if (!data.primaryPackaging) {\n this.primaryPackaging = [];\n }\n\n if (!data.secondaryPackaging) {\n this.secondaryPackaging = [];\n }\n }\n\n // We do not include readonly fields like inventory, label, description\n get serialised() {\n return {\n id: this.id,\n eu_item: this.eu_item,\n ean: this.ean,\n title: this.title,\n shadeName: this.shadeName,\n segment: this.segment,\n frontImage: this.frontImage,\n primaryPackaging: this.primaryPackaging,\n secondaryPackaging: this.secondaryPackaging,\n };\n }\n}\n","import { QueryOptions, MutationOptions } from '@apollo/client/core';\nimport { Observable, of, throwError } from 'rxjs';\n\nimport { StoreService } from '@services';\nimport { BITF_CONFIGS } from '@configs';\nimport {\n IBitfGraphQlRequest,\n IBitfGraphQlResponse,\n IBitfGraphQlRequestMapper,\n IBitfGraphQlEnvelopeMapper,\n IBitfGraphQlResponseMapper,\n IBitfUiMessages,\n IBitfApiUiMessage,\n} from '@interfaces';\n\nexport class BitfGraphQlHelper {\n constructor(private storeService: StoreService) {}\n\n // REQUEST QUERY\n mapQueryRequestParams(requestParams: IBitfGraphQlRequest): QueryOptions {\n return (this.getParser(requestParams, 'requestMapper') as IBitfGraphQlRequestMapper).mapQueryRequest(\n requestParams\n );\n }\n\n // REQUEST MUTATION\n mapMutationRequestParams(requestParams: IBitfGraphQlRequest): MutationOptions {\n return (this.getParser(requestParams, 'requestMapper') as IBitfGraphQlRequestMapper).mapMutationRequest(\n requestParams\n );\n }\n\n // ENVELOPE\n mapEnvelope(requestParams: IBitfGraphQlRequest, graphQlResponse: any): IBitfGraphQlResponse {\n const envelopedResponse: IBitfGraphQlResponse = (this.getParser(\n requestParams,\n 'envelopeMapper'\n ) as IBitfGraphQlEnvelopeMapper).map(requestParams, graphQlResponse);\n\n return envelopedResponse;\n }\n\n // RESPONSE QUERY\n // TODO if possible add an interface for graphQlResponse\n mapQueryResponse(\n requestParams: IBitfGraphQlRequest,\n envelopedResponse: IBitfGraphQlResponse\n ): IBitfGraphQlResponse {\n const responseMapped = (this.getParser(\n requestParams,\n 'responseMapper'\n ) as IBitfGraphQlResponseMapper).mapQueryResponse(requestParams, envelopedResponse);\n\n return responseMapped as IBitfGraphQlResponse;\n }\n\n // TODO if possible add an interface for graphQlResponse\n mapMutationResponse(\n requestParams: IBitfGraphQlRequest,\n envelopedResponse: IBitfGraphQlResponse\n ): IBitfGraphQlResponse {\n // this.showUiMessages(envelopedResponse);\n\n const responseMapped = (this.getParser(\n requestParams,\n 'responseMapper'\n ) as IBitfGraphQlResponseMapper).mapMutationResponse(requestParams, envelopedResponse);\n\n return responseMapped as IBitfGraphQlResponse;\n }\n\n handleApolloErrors$(apolloError: Error) {\n // FIXME: in case of http error, both interceptor and ApolloErorr are raised\n // material is not able to show multiple toasts at the same time, it closes the previous one\n // NOTE: we are creating a fake graphQl error response because we are here because an AppolloError\n // exception have been catch\n return of({\n errors: [\n {\n message: apolloError.message,\n },\n ],\n });\n }\n\n handleUiMessages$(envelopedResponse: IBitfGraphQlResponse) {\n envelopedResponse.metadata.uiMessages.forEach(uiMessage =>\n this.storeService.store.uiMessages$.next({\n type: 'BitfUiMessages',\n strategy: uiMessage.target,\n payload: uiMessage,\n } as IBitfUiMessages)\n );\n\n let errorsForLog;\n\n if (envelopedResponse.metadata.uiMessages.length) {\n errorsForLog = envelopedResponse.metadata.uiMessages\n .filter(uiMessage => uiMessage.type === 'ERROR')\n .map(error => error.message)\n .join(', ');\n if (errorsForLog) {\n console.log(errorsForLog);\n return throwError(new Error(errorsForLog));\n }\n }\n return of(envelopedResponse);\n }\n\n revertOptimisticUpdates$(error: Error, mutateThisObjectOptimistically, backupProps) {\n if (mutateThisObjectOptimistically) {\n Object.assign(mutateThisObjectOptimistically, backupProps);\n }\n return throwError(error);\n }\n\n private getParser(\n requestParams: IBitfGraphQlRequest,\n type: 'requestMapper' | 'envelopeMapper' | 'responseMapper'\n ): IBitfGraphQlRequestMapper | IBitfGraphQlEnvelopeMapper | IBitfGraphQlResponseMapper {\n const parserStrategyName = requestParams.apiParser || BITF_CONFIGS.parsers.defaultGraphQlParser;\n const parser = BITF_CONFIGS.parsers.parserStrategies[parserStrategyName];\n if (!parser) {\n throw new Error(`parser not present`);\n }\n return parser[type];\n }\n}\n","import { Injector } from '@angular/core';\nimport { Apollo } from 'apollo-angular';\nimport { concat, forkJoin, merge, Observable, of, throwError } from 'rxjs';\nimport { catchError, finalize, map, switchMap, takeLast, tap } from 'rxjs/operators';\n\nimport { BitfErrorHandlerService } from '@bitf/core/services/error-handler/bitf-error-handler.service';\nimport { IBitfGraphQlRequest, IBitfGraphQlResponse } from '@interfaces';\nimport { BitfGraphQlHelper } from './bitf-graph-ql.helper';\nimport { StoreService, LoaderService } from '@services';\n\nexport abstract class BitfGraphQlService {\n protected apollo: Apollo;\n protected storeService: StoreService;\n protected helper: BitfGraphQlHelper;\n protected loaderService: LoaderService;\n protected bitfErrorHandlerService: BitfErrorHandlerService;\n\n constructor(protected injector: Injector) {\n this.apollo = this.injector.get(Apollo);\n this.loaderService = this.injector.get(LoaderService);\n this.storeService = this.injector.get(StoreService);\n this.bitfErrorHandlerService = this.injector.get(BitfErrorHandlerService);\n\n this.initHelper();\n }\n\n public getThrottledObservables(observables: Observable[], concurrency = 5) {\n if (!observables.length) {\n return of(undefined);\n }\n const responses = [];\n const errors = [];\n const groupedObservables = observables\n // NOTE: We are catching the error here to avoid to break the chain in case one OBS\n // will generate an error\n .map(obs =>\n obs.pipe(\n catchError(error => {\n this.bitfErrorHandlerService.handle(error);\n errors.push(error);\n return of(true);\n }),\n tap(response => {\n responses.push(response);\n })\n )\n )\n .reduce((r, e, i) => (i % concurrency ? r[r.length - 1].push(e) : r.push([e])) && r, []);\n const forkJoinedObservables = groupedObservables.map(groupedObservable => forkJoin(groupedObservable));\n\n const checkPipe$ = of(true).pipe(\n switchMap(() => {\n if (errors.length) {\n return throwError({ errors, responses });\n }\n return of(responses);\n })\n );\n\n // NOTE: the concat will fire the throttling [[...],[...]] with one emit per fork then we want\n // to flat all the responses in only one final emit with the outcome of all the calls\n return concat(...forkJoinedObservables).pipe(\n takeLast(1),\n switchMap(() => checkPipe$)\n );\n }\n\n protected query(requestParams: IBitfGraphQlRequest): Observable> {\n const request = this.helper.mapQueryRequestParams(requestParams);\n return this.apollo.query(request).pipe(\n // NOTE: Catch Apollo errors, generate a uiMessage and forward the error\n catchError(apolloError => this.helper.handleApolloErrors$(apolloError)),\n // NOTE: Generate the IBitfGraphQlEnvelopeMapper response envelope\n // in this stage we populate the uiMessages if there are some errors\n map(graphQlResponse => this.helper.mapEnvelope(requestParams, graphQlResponse)),\n // NOTE: If there are any uiMessages we show them to the user\n // If some uiMessages are type === 'Error' we raise an exception to break the\n // observable chain\n switchMap(envelopedResponse => this.helper.handleUiMessages$(envelopedResponse)),\n // NOTE: If the chain reach this point we can map the response which doesn't contains any errors\n map(envelopedResponse => this.helper.mapQueryResponse(requestParams, envelopedResponse)),\n finalize(() => !requestParams.disableHideLoader && this.loaderService.hide())\n );\n }\n\n protected mutate(\n requestParams: IBitfGraphQlRequest,\n mutateThisObjectOptimistically?: any\n ): Observable> {\n // NOTE: provide a subject to emit an event in case of Apollo optimistic update is enabled\n // const optimisticUpdate$ = new Subject();\n // requestParams.optimisticUpdate$ = optimisticUpdate$;\n\n // NOTE: if mutateThisObjectOptimistically is passed we handle the optimistic update\n // applying the mutation straight and reverting it in case of errors\n let backupProps = {};\n if (mutateThisObjectOptimistically) {\n backupProps = this.extractPropsToMutate(mutateThisObjectOptimistically, requestParams.body);\n Object.assign(mutateThisObjectOptimistically, requestParams.body);\n }\n\n const request = this.helper.mapMutationRequestParams(requestParams);\n return merge(\n // optimisticUpdate$.pipe(\n // //NOTE: we need only the optimistic update because the second is the\n // // real response which return from apollo.mutate observable too.\n // take(1)\n // ),\n this.apollo.mutate(request)\n ).pipe(\n catchError(apolloError => this.helper.handleApolloErrors$(apolloError)),\n map(graphQlResponse => this.helper.mapEnvelope(requestParams, graphQlResponse)),\n map(envelopedResponse => this.helper.mapMutationResponse(requestParams, envelopedResponse)),\n switchMap(envelopedResponse => this.helper.handleUiMessages$(envelopedResponse)),\n // NOTE: At this stage we'll have exception raised for both apolloError and query error\n catchError(error =>\n this.helper.revertOptimisticUpdates$(error, mutateThisObjectOptimistically, backupProps)\n ),\n finalize(() => !requestParams.disableHideLoader && this.loaderService.hide())\n );\n }\n\n // TODO\n protected uploadFile() {}\n\n private extractPropsToMutate(originalObject: any, newObject: any) {\n const backupProps = {};\n Object.keys(newObject).forEach(key => (backupProps[key] = originalObject[key]));\n return backupProps;\n }\n\n private initHelper() {\n this.helper = new BitfGraphQlHelper(this.storeService);\n }\n}\n\n// new items\n// - apollo config with no-cache\n// - graph ql interface\n// - super graph ql service\n// - parsers interface\n// - parsers (request / response / envelope) - (FIXME) envelope non va interceptor\n// - graph ql helper\n// - single query / multiple query(WIP ma da dismettere) / apollo native batch (TODO)\n// - fragments\n// - mutations / custom mutation serialiser (???) / optimistic updates\n// - file upload (TODO)\n// - pagination (bitf-mat-paginator) / sorting (options/ single) / search input / form filters\n// - api call state mappers\n// - http errors, gestiti da BitfApiErrorsInterceptor (FIXME bypassati dal catchError)\n// - query errors gestiti da handleQueryErrors$\n// - apollo error gestiti da catchError\n// - ui messages listener aggiunto graphQl\n// - ui messages (TODO)\n// - retry (prob in apollo) (TODO)\n// - gestione auth, attivato BitfOAuthInterceptor (TBT) + 401 nell BitfApiErrorsInterceptor\n// - rimossa persistenza dallo storage (store-storage)\n","import { Injectable, Injector } from '@angular/core';\n\nimport { gql } from 'apollo-angular';\n\nimport { BitfGraphQlService } from '@bitf/services/graph-ql/bitf-graph-ql.service';\n\nimport { IBitfGraphQlRequest } from '@interfaces';\nimport { Folder } from '@common/core/models';\n\n@Injectable({\n providedIn: 'root',\n})\n// NOTE: Add methods following CRUD order\nexport class AssetsService extends BitfGraphQlService {\n constructor(public injector: Injector) {\n super(injector);\n }\n\n getAssetFolder(requestParams: IBitfGraphQlRequest = {}) {\n requestParams.modelMapper = 'getAssetFolder';\n requestParams.query = gql`\n {\n getAssetFolder(fullpath: \"/Site/Slider\") {\n children {\n ... on asset {\n filename\n desktop: fullpath(thumbnail: \"slideshow_desktop\")\n desktop_15: fullpath(thumbnail: \"slideshow_desktop_15\")\n mobile: fullpath(thumbnail: \"slideshow_mobile\")\n mobile_15: fullpath(thumbnail: \"slideshow_mobile_15\")\n mimetype\n }\n }\n }\n }\n `;\n\n return super.query(requestParams);\n }\n}\n","import { Injectable, Injector } from '@angular/core';\n\nimport { gql } from 'apollo-angular';\n\nimport { BitfGraphQlService } from '@bitf/services/graph-ql/bitf-graph-ql.service';\n\nimport { IBitfGraphQlRequest, IBitfGraphQlResponse } from '@interfaces';\nimport { Brand } from '@common/core/models';\nimport { Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { eStoreActions } from '@web/enums';\n\n@Injectable({\n providedIn: 'root',\n})\n// NOTE: Add methods following CRUD order\nexport class BrandsService extends BitfGraphQlService {\n constructor(public injector: Injector) {\n super(injector);\n }\n\n getBrandById(brandId: string): Observable {\n if (this.storeService.store.brands) {\n this.storeService.setStore(store => {\n store.brandId = brandId;\n }, eStoreActions.SET_BRAND_ID);\n return of(this.storeService.store.brands.find(brand => brand.id === brandId));\n } else {\n return this.getBrandListing().pipe(\n map(res => {\n const brands = res.content;\n this.storeService.setStore(store => {\n store.brands = brands;\n }, eStoreActions.SET_BRANDS);\n this.storeService.setStore(store => {\n store.brandId = brandId;\n }, eStoreActions.SET_BRAND_ID);\n\n return this.storeService.store.brands.find(brand => brand.id === brandId);\n })\n );\n }\n }\n\n getBrandListing(requestParams: IBitfGraphQlRequest = {}): Observable> {\n requestParams.modelMapper = 'getBrandListing';\n requestParams.query = gql`\n {\n getBrandListing(first: 10, after: 0, sortBy: \"order\") {\n edges {\n node {\n id\n code\n name\n subtitle\n description\n logo_white {\n filename\n desktop: fullpath(thumbnail: \"logo_desktop\")\n desktop_15: fullpath(thumbnail: \"logo_desktop_15\")\n mobile: fullpath(thumbnail: \"logo_mobile\")\n mobile_15: fullpath(thumbnail: \"logo_mobile_15\")\n mimetype\n }\n logo_black {\n filename\n desktop: fullpath(thumbnail: \"logo_desktop\")\n desktop_15: fullpath(thumbnail: \"logo_desktop_15\")\n mobile: fullpath(thumbnail: \"logo_mobile\")\n mobile_15: fullpath(thumbnail: \"logo_mobile_15\")\n mimetype\n }\n image {\n filename\n desktop: fullpath(thumbnail: \"logo_desktop\")\n desktop_15: fullpath(thumbnail: \"logo_desktop_15\")\n mobile: fullpath(thumbnail: \"logo_mobile\")\n mobile_15: fullpath(thumbnail: \"logo_mobile_15\")\n mimetype\n }\n }\n }\n totalCount\n }\n }\n `;\n\n return super.query(requestParams);\n }\n}\n","import { Injectable, Injector } from '@angular/core';\n\nimport { gql } from 'apollo-angular';\n\nimport { BitfGraphQlService } from '@bitf/services/graph-ql/bitf-graph-ql.service';\n\nimport { IBitfGraphQlRequest } from '@interfaces';\nimport { Product } from '@common/core/models';\n\n@Injectable({\n providedIn: 'root',\n})\n// NOTE: Add methods following CRUD order\nexport class ProductsService extends BitfGraphQlService {\n constructor(public injector: Injector) {\n super(injector);\n }\n\n getProduct(requestParams: IBitfGraphQlRequest = {}) {\n requestParams.modelMapper = 'getProduct';\n requestParams.query = gql`\n query Query($id: Int) {\n getProduct(id: $id, defaultLanguage: \"en\") {\n title\n frontImage {\n image {\n filename\n desktop: fullpath(thumbnail: \"product_desktop\")\n desktop_15: fullpath(thumbnail: \"product_desktop_15\")\n mobile: fullpath(thumbnail: \"product_mobile\")\n mobile_15: fullpath(thumbnail: \"product_mobile_15\")\n mimetype\n }\n }\n primaryPackaging {\n ... on fieldcollection_ProductPackaging {\n material\n sortingDetails\n material_fr: material(language: \"fr\")\n sortingDetails_fr: sortingDetails(language: \"fr\")\n material_it: material(language: \"it\")\n sortingDetails_it: sortingDetails(language: \"it\")\n }\n }\n secondaryPackaging {\n ... on fieldcollection_ProductPackaging {\n material\n sortingDetails\n material_fr: material(language: \"fr\")\n sortingDetails_fr: sortingDetails(language: \"fr\")\n material_it: material(language: \"it\")\n sortingDetails_it: sortingDetails(language: \"it\")\n }\n }\n }\n }\n `;\n\n return super.query(requestParams);\n }\n\n // TODO pagination\n getProductListing(requestParams: IBitfGraphQlRequest = {}) {\n requestParams.modelMapper = 'getProductListing';\n requestParams.query = gql`\n query Query($first: Int, $after: Int, $filter: String) {\n getProductListing(first: $first, after: $after, filter: $filter) {\n edges {\n node {\n id\n eu_item: sku\n ean\n title\n shadeName\n segment: brandSubcategory {\n ... on object_BrandSubcategory {\n description\n }\n }\n }\n }\n totalCount\n }\n }\n `;\n\n return super.query(requestParams);\n }\n}\n","import { Injector } from '@angular/core';\nimport { Router, ActivatedRouteSnapshot } from '@angular/router';\nimport { HttpResponse } from '@angular/common/http';\nimport { Subject, TimeoutError, of } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport { TranslateService } from '@ngx-translate/core';\n\nimport { bitfToTranslate } from '@bitf/utils/bitf-translate.utils';\nimport { BitfTryCatch } from '@bitf/core/decorators/bitf-try-catch.decorator';\nimport { BitfErrorHandlerService } from '@bitf/services/error-handler/bitf-error-handler.service';\n\nimport { User, Store } from '@models';\nimport { AppSessionService, UsersService, StoreService, StorageService } from '@services';\nimport { BITF_CONFIGS } from '@configs';\nimport { EBitfAuthState, eStoreActions } from '@enums';\nimport { environment } from '@env/environment';\n\nimport {\n IBitfTokenState,\n IBitfTokenMetadata,\n IBitfLogin,\n IBitfUiMessages,\n IBitfToastData,\n IBitfApiResponse,\n} from '@interfaces';\nimport { EBitfUiMessageType, EBitfUiMessageTarget } from '@enums';\n\nexport abstract class BitfAuthService {\n private renewTokenRetryAttempt = 0;\n private renewTokenMaxAtempt = 3;\n private renewTokenDelay = 3000;\n _authTokenMetaData: any;\n authState$: Subject;\n tokenEvents$ = new Subject();\n router: Router;\n appSessionService: AppSessionService;\n refreshTokenHandler: any;\n tokenExpirationHandler: any;\n tokenAlertTresholdMinutes = 10;\n usersService: UsersService;\n storeService: StoreService;\n translateService: TranslateService;\n bitfErrorHandlerService: BitfErrorHandlerService;\n protected storageService: StorageService;\n\n constructor(protected injector: Injector) {\n this.router = this.injector.get(Router);\n // FIXME @kouti\n setTimeout(() => {\n this.appSessionService = this.injector.get(AppSessionService);\n }, 0);\n this.usersService = this.injector.get(UsersService);\n this.storeService = this.injector.get(StoreService);\n this.translateService = this.injector.get(TranslateService);\n this.bitfErrorHandlerService = this.injector.get(BitfErrorHandlerService);\n this.storageService = injector.get(StorageService);\n\n this.authState$ = new Subject();\n\n if (this.isTokenValid()) {\n this.activateRefreshToken();\n }\n }\n\n abstract handleAuthentication(...args: any[]): void;\n abstract decodeToken(loginResponse: LoginType): TokenType;\n extractRenewToken(response: HttpResponse): any {}\n signInWithToken(newToken: unknown) {}\n\n get authTokenMetaData(): TokenType {\n if (this._authTokenMetaData) {\n return this._authTokenMetaData;\n }\n const metaData = localStorage.getItem(`${environment.appName}-TokenMetadata`);\n if (metaData) {\n this._authTokenMetaData = JSON.parse(metaData);\n return this._authTokenMetaData;\n }\n return undefined;\n }\n\n set authTokenMetaData(authTokenMetaData: TokenType) {\n // NOTE: the authTokenMetaData value is in the authService memory not in the store\n this.storeService.setStore(() => {\n if (!authTokenMetaData) {\n clearTimeout(this.refreshTokenHandler);\n localStorage.removeItem(`${environment.appName}-TokenMetadata`);\n this._authTokenMetaData = undefined;\n } else {\n this._authTokenMetaData = authTokenMetaData;\n localStorage.setItem(`${environment.appName}-TokenMetadata`, JSON.stringify(authTokenMetaData));\n this.activateRefreshToken();\n }\n }, eStoreActions.SET_AUTH_TOKEN);\n }\n\n get tokenState(): IBitfTokenState {\n return {\n isExpired: this.isTokenExpired(),\n isExpiring: this.isTokenExpiring(),\n } as IBitfTokenState;\n }\n\n signIn(loginResponse: LoginType) {\n this.authTokenMetaData = this.decodeToken(loginResponse);\n this.authState$.next(EBitfAuthState.TOKEN_RETRIEVED);\n if (loginResponse && loginResponse.user) {\n this.setUser(loginResponse.user);\n }\n }\n\n clearAuthData() {\n this.setUser(undefined);\n this.authTokenMetaData = undefined;\n if (this.refreshTokenHandler) {\n clearTimeout(this.refreshTokenHandler);\n }\n }\n\n signOut() {\n this.clearAuthData();\n this.authState$.next(EBitfAuthState.TO_BE_LOGGED);\n this.redirectAfterSignOut();\n }\n\n protected redirectAfterSignOut() {\n // NOTE: Important leave the browser the time to clear cookies and localstorage before tro try\n // another autologin from the sign-in page\n setTimeout(() => {\n this.router.navigate([BITF_CONFIGS.urls.signOutUrl]);\n }, 1000);\n }\n\n loginUserWithToken(next?: ActivatedRouteSnapshot) {\n return this.usersService.getMe().pipe(\n map((response: IBitfApiResponse) => {\n this.setUser(response.content);\n if (!response.content) {\n throw new Error('Empty user!');\n }\n return true;\n }),\n catchError(error => {\n if (!(error instanceof TimeoutError)) {\n this.signOut();\n }\n throw error;\n })\n );\n }\n\n isTokenValid(): boolean {\n return !this.isTokenExpired();\n }\n\n isTokenExpired(): boolean {\n if (this.authTokenMetaData && this.authTokenMetaData.expiresAt) {\n return Date.now() > this.authTokenMetaData.expiresAt;\n }\n return true;\n }\n\n isTokenExpiring(): boolean {\n if (!this.tokenAlertTresholdMinutes || !this.authTokenMetaData) {\n return this.isTokenExpired();\n }\n return this.authTokenMetaData.expiresAt - Date.now() < this.tokenAlertTresholdMinutes * 60 * 1000;\n }\n\n watchTokenExpiration() {\n if (this.tokenExpirationHandler) {\n return;\n }\n this.tokenExpirationHandler = setInterval(() => this.tokenEvents$.next(this.tokenState), 5000);\n }\n\n @BitfTryCatch()\n activateRefreshToken() {\n if (!this.authTokenMetaData) {\n return;\n }\n const timer = Math.min(2147483647, Math.max(1, this.authTokenMetaData.expiresAt - Date.now()));\n if (this.refreshTokenHandler) {\n clearTimeout(this.refreshTokenHandler);\n }\n\n this.refreshTokenHandler = setTimeout(() => {\n this.refreshToken();\n }, timer - 10000);\n }\n\n @BitfTryCatch()\n refreshToken() {\n if (this.renewTokenRetryAttempt === this.renewTokenMaxAtempt) {\n // NOTE we are not doing sign out here, or show any ui messages because this is a silent refresh\n // We'll wait the next api call which will return 401 which will show a dialog\n return;\n }\n\n this.renewToken()\n .then(() => {\n this.renewTokenRetryAttempt = 0;\n })\n .catch(error => {\n // NOTE: the default implementation return a rejection for auth that doens't have the refresh\n // so we don't want to log that\n if (error) {\n this.bitfErrorHandlerService.handle(error);\n }\n this.renewTokenRetryAttempt++;\n setTimeout(() => {\n this.refreshToken();\n }, this.renewTokenDelay);\n });\n }\n\n async renewToken(): Promise {\n this.signIn(undefined);\n return Promise.reject();\n }\n\n onLoginSuccess() {\n this.authState$.next(EBitfAuthState.LOGGED);\n }\n\n onLoginError(errorMessage = '', authState: EBitfAuthState = EBitfAuthState.LOGIN_ERROR) {\n this.authState$.next(authState);\n this.clearAuthData();\n setTimeout(() => this.notifyClient(errorMessage, EBitfUiMessageType.ERROR));\n\n // NOTE this is to prevent the user refresh the page in login error state with an invalid token\n // this will reload the page without queryParams (the token) so the page will redirect again to the\n // oauth service login page\n if (location.search) {\n this.router.navigateByUrl(BITF_CONFIGS.urls.signInUrl);\n }\n }\n\n onLoginInfo(infoMessage = '', authState: EBitfAuthState = EBitfAuthState.LOGIN_INFO) {\n this.authState$.next(authState);\n setTimeout(() => this.notifyClient(infoMessage, EBitfUiMessageType.INFO));\n }\n\n handleRedirect(authState?: EBitfAuthState, ...args: any[]) {\n const storage = this.storageService.data;\n const redirectUrl = storage.redirectUrl;\n if (redirectUrl) {\n delete storage.redirectUrl;\n this.storageService.setData(storage);\n window.location.replace(redirectUrl);\n } else {\n this.router.navigate(['']);\n }\n }\n\n protected setUser(user: User) {\n this.storeService.setStore((store: Store) => {\n store.user = user;\n }, eStoreActions.SET_USER);\n }\n\n private notifyClient(message?: string, type = EBitfUiMessageType.ERROR) {\n let title = '';\n if (type === EBitfUiMessageType.ERROR) {\n title = this.translateService.instant(bitfToTranslate('BITF.LABEL.ERROR'));\n } else if (type === EBitfUiMessageType.INFO) {\n title = this.translateService.instant(bitfToTranslate('BITF.LABEL.INFO'));\n }\n this.storeService.store.uiMessages$.next({\n type: 'BitfUiMessages',\n strategy: EBitfUiMessageTarget.TOAST,\n payload: {\n title,\n type,\n message,\n } as IBitfToastData,\n } as IBitfUiMessages);\n }\n}\n","import { Injector } from '@angular/core';\n\nimport { BitfTryCatch } from '@bitf/core/decorators/bitf-try-catch.decorator';\n\nimport { BitfAuthService } from '../bitf-auth.service';\nimport { IBitfJwtTokenMetadata, IBitfJwtLogin } from './bitf-jwt-auth.interface';\n\nexport abstract class BitfJwtAuthService extends BitfAuthService {\n constructor(protected injector: Injector) {\n super(injector);\n }\n\n static decodeToken(loginResponse: IBitfJwtLogin): IBitfJwtTokenMetadata {\n if (!loginResponse) {\n return undefined;\n }\n const tokenParts = loginResponse.encodedToken.split('.');\n const decodedToken = JSON.parse(atob(tokenParts[1]));\n\n Object.assign(decodedToken, {\n token: loginResponse.encodedToken,\n expiresAt: decodedToken.exp * 1000,\n iat: decodedToken.iat * 1000,\n exp: decodedToken.exp * 1000,\n });\n\n return decodedToken as IBitfJwtTokenMetadata;\n }\n\n signIn(loginResponse: IBitfJwtLogin) {\n super.signIn(loginResponse);\n }\n\n @BitfTryCatch()\n decodeToken(loginResponse: IBitfJwtLogin): IBitfJwtTokenMetadata {\n return BitfJwtAuthService.decodeToken(loginResponse);\n }\n}\n","import { Injectable, Injector } from '@angular/core';\nimport { BitfJwtAuthService } from '@bitf/services/auth/jwt/bitf-jwt-auth.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthService extends BitfJwtAuthService {\n tokenAlertTresholdMinutes = 5;\n constructor(protected injector: Injector) {\n super(injector);\n }\n\n handleAuthentication() {}\n}\n","import { BITF_CONFIGS } from '@configs';\nimport { environment } from '@env/environment';\nimport {\n IBitfApiRequest,\n IBitfApiResponse,\n IBitfPathBuilder,\n IBitfRequestMapper,\n IBitfResponseMapper,\n} from '@interfaces';\n\nexport class BitfApiHelper {\n constructor(private apiEntity: string, private mockApiUrl, private mockApiParser) {}\n\n parseRequestParams(requestParams: IBitfApiRequest = {}) {\n return {\n path: this.buildRequestPath(requestParams),\n options: this.mapRequestOptions(requestParams),\n body: this.mapBodyRequest(requestParams),\n };\n }\n\n // URL\n buildRequestPath(requestParams: IBitfApiRequest = {}) {\n const builtPath = this.getPathBuilder(requestParams).build(requestParams);\n\n let path = this.getBaseApiUrl(requestParams) + builtPath;\n if (requestParams.path) {\n path += requestParams.path;\n }\n return path;\n }\n\n getPathBuilder(requestParams: IBitfApiRequest): IBitfPathBuilder {\n return this.getParser('pathBuilder', requestParams) as IBitfPathBuilder;\n }\n\n getApiUrl(requestParams: IBitfApiRequest = {}): string {\n return requestParams.apiUrl || this.mockApiUrl || environment.apiUrl;\n }\n\n getBaseApiUrl(requestParams: IBitfApiRequest = {}): string {\n return `${this.getApiUrl(requestParams)}${this.apiEntity}`;\n }\n\n // REQUEST\n mapRequestOptions(requestParams: IBitfApiRequest = {}) {\n return this.getRequestMapper(requestParams).map(requestParams);\n }\n\n getRequestMapper(requestParams: IBitfApiRequest = {}): IBitfRequestMapper {\n return this.getParser('requestMapper', requestParams) as IBitfRequestMapper;\n }\n\n // RESPONSE\n mapEnvelope(apiOputput, requestParams: IBitfApiRequest = {}): IBitfApiResponse {\n return this.getResponseMapper(requestParams).map(apiOputput, this.getModelMapper(requestParams));\n }\n\n getModelMapper(requestParams: IBitfApiRequest) {\n const { relation, modelMapper } = requestParams;\n return modelMapper || relation || this.apiEntity;\n }\n\n getResponseMapper(requestParams: IBitfApiRequest = {}): IBitfResponseMapper {\n return this.getParser('responseMapper', requestParams) as IBitfResponseMapper;\n }\n\n getParser(\n type: 'requestMapper' | 'responseMapper' | 'pathBuilder',\n requestParams: IBitfApiRequest\n ): IBitfRequestMapper | IBitfResponseMapper | IBitfPathBuilder {\n const parserStrategyName =\n this.mockApiParser || requestParams.apiParser || BITF_CONFIGS.parsers.defaultParser;\n const parser = BITF_CONFIGS.parsers.parserStrategies[parserStrategyName];\n if (!parser) {\n throw new Error(`parser not present`);\n }\n return parser[type];\n }\n\n // BODY\n mapBodyRequest(requestParams: IBitfApiRequest) {\n let body = requestParams.body;\n if (!body) {\n return null;\n }\n\n if (!requestParams.isBodyRaw) {\n if (body.length) {\n body = body.map(item => item.serialised);\n } else {\n body = body.serialised;\n }\n }\n\n switch (requestParams.bodyParser) {\n case 'formData':\n const formData = new FormData();\n Object.entries(body).forEach(([key, val]) => {\n formData.set(key, val as any);\n });\n return formData;\n case 'formUrlEncoded':\n const bodyString: string[] = [];\n Object.entries(body).forEach(([key, val]) => {\n bodyString.push(`${key}=${val}`);\n });\n return bodyString.join('&');\n default:\n return body;\n }\n }\n}\n","import { Injectable, Injector } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { BitfApiService } from '@bitf/services/api/bitf-api.service';\nimport { IBitfApiResponse } from '@interfaces';\nimport { User } from '@models';\nimport { environment } from '@env/environment';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UsersService extends BitfApiService {\n constructor(public injector: Injector) {\n super('users', injector, environment.mockApiUrl, 'mockDbParser');\n }\n\n getMe(): Observable> {\n return super.request({\n path: '/me',\n method: 'GET',\n disableHideLoader: true,\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport { HttpClient, HttpEvent, HttpEventType, HttpResponse, HttpErrorResponse } from '@angular/common/http';\nimport justClone from 'just-clone';\n\nimport { Observable, forkJoin, of, from, Subject } from 'rxjs';\nimport { map, tap, finalize, filter, catchError, retryWhen, switchMap, mergeMap, take } from 'rxjs/operators';\n\nimport { BitfApiHelper } from './bitf-api.helper';\nimport { BitfLoggerService } from '@bitf/services/logger/bitf-logger.service';\nimport { BitfFile } from '@bitf/core/models/bitf-file.model';\n\nimport { IBitfApiRequest, IBitfApiResponse, IBitfApiCount, IBitfApiAction } from '@interfaces';\nimport { AuthService, LoaderService } from '@services';\nimport { environment } from '@env/environment';\nimport { BitfFormItemConfig } from '../../models';\nimport { EBitfInterceptors } from '@enums';\n\nexport abstract class BitfApiService {\n protected loaderService: LoaderService;\n protected httpClient: HttpClient;\n protected helper: BitfApiHelper;\n protected isMockActive: boolean;\n protected logTiming = false;\n protected bitfLoggerService: BitfLoggerService;\n protected authService: AuthService;\n\n constructor(\n protected name: string,\n protected injector: Injector,\n protected mockApiUrl?: string,\n protected mockApiParser?: string\n ) {\n this.loaderService = this.injector.get(LoaderService);\n this.httpClient = this.injector.get(HttpClient);\n this.bitfLoggerService = this.injector.get(BitfLoggerService);\n this.initHelper();\n this.isMockActive = !!mockApiUrl;\n }\n\n get(requestParams: IBitfApiRequest = {}): Observable> {\n return this.request({\n ...requestParams,\n method: 'GET',\n });\n }\n\n list(requestParams: IBitfApiRequest = {}): Observable> {\n requestParams.isBodyRaw = true;\n return this.request({\n path: '/list',\n ...requestParams,\n method: 'POST',\n });\n }\n\n getById(requestParams: IBitfApiRequest = {}): Observable> {\n return this.request({ ...requestParams, method: 'GET' });\n }\n\n post(requestParams: IBitfApiRequest = {}): Observable> {\n return this.request({ ...requestParams, method: 'POST' });\n }\n\n patch(requestParams: IBitfApiRequest = {}): Observable> {\n return this.request({\n ...requestParams,\n method: 'PATCH',\n });\n }\n\n put(requestParams: IBitfApiRequest = {}): Observable> {\n return this.request({ ...requestParams, method: 'PUT' });\n }\n\n delete(requestParams: IBitfApiRequest = {}): Observable> {\n return this.request({\n ...requestParams,\n method: 'DELETE',\n modelMapper: 'action',\n });\n }\n\n bulkDelete(requestParams: IBitfApiRequest): Observable> {\n return this.request({\n ...requestParams,\n method: 'DELETE',\n path: '/delete-all',\n modelMapper: 'action',\n });\n }\n\n // FIXME: this should be a single call\n bulkPatch(requestParams: IBitfApiRequest): Observable> {\n const observables: Array>> = requestParams.body.map((item: T) =>\n this.patch({ ...requestParams, body: item })\n );\n\n return forkJoin(observables).pipe(\n map((allResponses: Array>) => {\n const success = !!allResponses.filter(response => !!response.content).length;\n return { content: { success } } as IBitfApiResponse;\n })\n );\n }\n\n count(requestParams: IBitfApiRequest = {}): Observable> {\n return this.request({\n ...requestParams,\n method: 'GET',\n count: true,\n modelMapper: 'count',\n });\n }\n\n // METHODS to call related entities ====================================================\n getRel(requestParams: IBitfApiRequest): Observable> {\n return this.request({\n ...requestParams,\n method: 'GET',\n });\n }\n\n getRels(requestParams: IBitfApiRequest): Observable> {\n return this.request({\n ...requestParams,\n method: 'GET',\n });\n }\n\n getRelById(requestParams: IBitfApiRequest = {}): Observable> {\n return this.request({\n ...requestParams,\n method: 'GET',\n });\n }\n\n postRel(requestParams: IBitfApiRequest): Observable> {\n return this.request({\n ...requestParams,\n method: 'POST',\n });\n }\n\n putRel(requestParams: IBitfApiRequest): Observable> {\n return this.request({\n ...requestParams,\n method: 'PUT',\n });\n }\n\n patchRel(requestParams: IBitfApiRequest = {}): Observable> {\n return this.request({\n ...requestParams,\n method: 'PATCH',\n });\n }\n\n deleteRel(requestParams: IBitfApiRequest): Observable> {\n return this.request({\n ...requestParams,\n method: 'DELETE',\n modelMapper: 'action',\n });\n }\n\n countRel(requestParams: IBitfApiRequest): Observable> {\n return this.request({\n ...requestParams,\n method: 'GET',\n modelMapper: 'count',\n count: true,\n });\n }\n\n // ADD and remove already existing entity as relations\n linkRel(requestParams: IBitfApiRequest): Observable> {\n return this.request({\n ...requestParams,\n method: 'POST',\n linkUnlinkRel: true,\n modelMapper: 'action',\n });\n }\n\n unLinkRel(requestParams: IBitfApiRequest): Observable> {\n return this.request({\n ...requestParams,\n method: 'DELETE',\n linkUnlinkRel: true,\n modelMapper: 'action',\n });\n }\n\n action(requestParams: IBitfApiRequest = {}): Observable> {\n return this.request({\n modelMapper: 'action',\n ...requestParams,\n method: requestParams.body === undefined ? 'GET' : 'POST',\n });\n }\n\n getFormItemsConfig(requestParams: IBitfApiRequest = {}): Observable {\n return this.getRel({\n ...requestParams,\n relation: 'form-item-config',\n modelMapper: 'form-item-config',\n }).pipe(map(response => response.content));\n }\n\n download(apiRequest: IBitfApiRequest) {\n return this.fetch({\n relation: 'download',\n method: 'GET',\n responseType: 'arraybuffer',\n ...apiRequest,\n headers: [{ headerName: EBitfInterceptors.BITF_RETRY_INTERCEPTOR, value: 'skip' }],\n });\n }\n\n upload(requestParams: IBitfApiRequest = {}): Observable> {\n requestParams.file.resetUploadState();\n requestParams.body = requestParams.body || {};\n\n Object.assign(requestParams.body, requestParams.file.bodyData);\n if (!requestParams.fileFormFieldName) {\n requestParams.fileFormFieldName = 'file';\n }\n Object.assign(requestParams.body, {\n [requestParams.fileFormFieldName]: requestParams.file.fileObject,\n });\n requestParams = {\n method: 'POST',\n bodyParser: 'formData',\n isBodyRaw: true,\n reportProgress: true,\n observe: 'events',\n body: requestParams.body,\n ...requestParams,\n };\n\n return this.fetch(requestParams).pipe(\n tap(event => {\n this.parseUploadState(event, requestParams.file);\n }),\n filter((event: HttpEvent) => event.type === HttpEventType.Response),\n map(envelope => this.helper.mapEnvelope(envelope, requestParams))\n );\n }\n\n uploadMultiple(requestParams: IBitfApiRequest = {}): Observable[]> {\n const numberOfparallelsUploads = 3;\n const apiCallCompleteEvent$ = new Subject();\n const fileUploadRequests: Observable[] = requestParams.files.map((fileItem: BitfFile, index) => {\n const newRequestParams = {\n ...justClone(requestParams),\n file: fileItem,\n };\n\n // NOTE: throttle start in bulk of numberOfparallelsUploads\n let starter: Observable;\n if (index < numberOfparallelsUploads) {\n starter = of(true);\n } else {\n starter = apiCallCompleteEvent$.pipe(\n filter((completedUploadIndex: number) => index <= completedUploadIndex + numberOfparallelsUploads),\n take(1)\n );\n }\n return starter.pipe(\n switchMap(() =>\n this.upload(newRequestParams).pipe(\n tap(() => apiCallCompleteEvent$.next(index)),\n catchError((errors: any) => {\n fileItem.uploadError = errors;\n fileItem.hasUploadErrors = true;\n fileItem.isUploading = false;\n apiCallCompleteEvent$.next(index);\n // NOTE: we don't want to break the forkJoin and prevent the upload of the other files\n // the error is stored in the file object\n return of({\n content: undefined,\n } as IBitfApiResponse);\n })\n )\n )\n );\n });\n // const source = of(fileUploadRequests);\n // return source.pipe(mergeMap(calls => forkJoin(calls), undefined, 1));\n return forkJoin(fileUploadRequests);\n }\n\n private parseUploadState(event: HttpEvent, file: BitfFile) {\n switch (event.type) {\n case HttpEventType.Sent:\n file.isUploading = true;\n break;\n case HttpEventType.UploadProgress:\n file.uploadedPercentage = Math.round((100 * event.loaded) / event.total);\n // NOTE: start a little bit before\n if (file.uploadedPercentage >= 98) {\n file.isProcessing = true;\n }\n break;\n case HttpEventType.Response:\n file.isProcessing = false;\n file.uploadedPercentage = 100;\n file.isUploaded = true;\n file.isUploading = false;\n break;\n }\n return event;\n }\n\n /**\n * This is an Api helper that will parse the request and response, calling the this.apiUrl\n * as base endpoint\n */\n request(requestParams: IBitfApiRequest = {}): Observable> {\n return this.fetch(requestParams).pipe(\n map((envelope: HttpResponse>) =>\n this.helper.mapEnvelope(envelope, requestParams)\n )\n );\n }\n\n /**\n * This is a generic Api helper usefull to do httpClient calls to arbitrary endpoint without parsing the\n * response. Note taht this is parsing the request, so this method can call only application API's\n */\n fetch(requestParams: IBitfApiRequest = {}): Observable {\n const parsedRequestParams = this.helper.parseRequestParams(requestParams);\n let apiCall: Observable;\n const start = Date.now();\n switch (requestParams.method) {\n case 'GET':\n apiCall = this.httpClient[requestParams.method.toLocaleLowerCase()](\n parsedRequestParams.path,\n parsedRequestParams.options\n );\n break;\n case 'DELETE':\n if (parsedRequestParams.body) {\n apiCall = this.httpClient.request(\n requestParams.method.toLocaleLowerCase(),\n parsedRequestParams.path,\n {\n body: parsedRequestParams.body,\n }\n );\n } else {\n apiCall = this.httpClient[requestParams.method.toLocaleLowerCase()](\n parsedRequestParams.path,\n parsedRequestParams.options\n );\n }\n\n break;\n case 'POST':\n case 'PUT':\n case 'PATCH':\n apiCall = this.httpClient[requestParams.method.toLocaleLowerCase()](\n parsedRequestParams.path,\n parsedRequestParams.body,\n parsedRequestParams.options\n );\n break;\n }\n return apiCall.pipe(\n // This retry will be used in case we have renewToken mechanism for the auth system used\n // This will retry only one time, if the renewToken resolve the promise otherwise it will forward\n // the error\n retryWhen(retryEvent =>\n retryEvent.pipe(\n switchMap(errorEvent => {\n // NOTE: doing this in the constructor will lead errors since the authService use this class\n const authService = this.injector.get(AuthService);\n if (errorEvent instanceof HttpErrorResponse && errorEvent.status === 401) {\n return from(authService.renewToken()).pipe(\n catchError(() => {\n // NOTE: forward the HttpErrorResponse not the renewToken one\n throw errorEvent;\n })\n );\n } else {\n throw errorEvent;\n }\n })\n )\n ),\n catchError(error => {\n error.method = requestParams.method;\n error.requestBody = requestParams.body;\n error.queryParams = parsedRequestParams.options['params'];\n throw error;\n }),\n tap(() => {\n if (requestParams.logTiming || this.logTiming) {\n const elapsed = Date.now() - start;\n const sendQueryParams = environment.loggerConfig.sendQueryParams;\n const sendRequestBody = environment.loggerConfig.sendRequestBody;\n this.bitfLoggerService.log({\n level: 'TIME',\n elapsed,\n title: `TIME - ${elapsed}ms - ${requestParams.method} ${parsedRequestParams.path}`,\n method: requestParams.method,\n url: parsedRequestParams.path,\n queryParams: sendQueryParams ? JSON.stringify(parsedRequestParams.options['params']) : undefined,\n body:\n parsedRequestParams.body && sendRequestBody\n ? JSON.stringify(parsedRequestParams.body)\n : undefined,\n });\n }\n }),\n finalize(() => !requestParams.disableHideLoader && this.loaderService.hide())\n );\n }\n\n private initHelper() {\n this.helper = new BitfApiHelper(this.name, this.mockApiUrl, this.mockApiParser);\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { IBitfUiRoleManagerService } from '@interfaces';\nimport { ERoleActions } from '@enums';\nimport { StoreService } from '@services';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UiRoleManagerService implements IBitfUiRoleManagerService {\n constructor(private storeService: StoreService) {}\n\n canI(action, data?: any): boolean {\n switch (action) {\n case ERoleActions.VIEW_LOG:\n return this.storeService.store.user.canViewLogs;\n default:\n return false;\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { BitfLoaderService } from '@bitf/services/loader/bitf-loader.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LoaderService extends BitfLoaderService {\n constructor() {\n super();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\nimport { IBitfLoaderAction } from '@interfaces';\nimport { EBitfLoaderAction } from '@enums';\n\nimport { environment } from '@env/environment';\n\nconst DELAY = 600;\nconst MIN_TIMEOUT = 5000;\n\nexport abstract class BitfLoaderService {\n onLoaderChange: Subject = new Subject();\n isLoading: boolean;\n timeoutId: any;\n hideTimeout: number;\n hideTimeoutId: any;\n showCallsCounter = 0;\n\n constructor() {\n this.hideTimeout = DELAY + MIN_TIMEOUT;\n if (environment.httpRetryConfig.enabled) {\n const verbs = environment.httpRetryConfig.verbs;\n const timeout = Object.keys(verbs).reduce((accumulator: number, key: string) => {\n if (verbs[key].timeout) {\n const maxRetries = (verbs[key].maxRetries || 0) + 1;\n accumulator = Math.max(accumulator, verbs[key].timeout * maxRetries);\n }\n return accumulator;\n }, MIN_TIMEOUT);\n\n this.hideTimeout = timeout + DELAY;\n }\n if (environment?.graphQlConfig?.enabled) {\n this.hideTimeout = Math.max(this.hideTimeout, environment?.graphQlConfig?.requestTimeout || 0);\n }\n }\n\n show(data?: any) {\n this.clearTimeouts();\n this.showCallsCounter += 1;\n this.timeoutId = setTimeout(() => {\n this.onLoaderChange.next({ action: EBitfLoaderAction.SHOW, data } as IBitfLoaderAction);\n }, DELAY);\n if (!data || (data && !data.disableHideLoader)) {\n this.hideTimeoutId = setTimeout(() => {\n this.showCallsCounter = 0;\n this.hide();\n }, this.hideTimeout);\n }\n }\n\n hide() {\n this.showCallsCounter -= 1;\n if (this.showCallsCounter <= 0) {\n this.forceHide();\n }\n }\n\n forceHide() {\n this.clearTimeouts();\n this.onLoaderChange.next({ action: EBitfLoaderAction.HIDE } as IBitfLoaderAction);\n this.showCallsCounter = 0;\n }\n\n private clearTimeouts() {\n clearTimeout(this.timeoutId);\n clearTimeout(this.hideTimeoutId);\n }\n}\n","import justClone from 'just-clone';\n\nimport { IBitfApiRequestPartChips, IBitfPartData, IBitfStoreParts } from '@interfaces';\nimport { EBitfApiRequestPartsNames } from '@enums';\n\nexport type UpdateStorFn = (fn: (storeParts: IBitfStoreParts) => void) => void;\n\nexport abstract class BitfApiRequestPart {\n private _part: any;\n private _storeSection: IBitfStoreParts = {};\n chips?: Array;\n\n constructor(\n public key: string,\n public partName: EBitfApiRequestPartsNames,\n public defaultPartData: IBitfPartData = { data: {}, formValue: {} },\n public options?: any\n ) {\n this.reset();\n }\n\n init(storeParts: IBitfStoreParts) {\n const merged = Object.assign({}, { [this.key]: justClone(this.defaultPartData) }, storeParts);\n this._storeSection = Object.assign(storeParts, merged);\n }\n\n get data() {\n return this._storePart.data;\n }\n\n // NOTE: must be treated as immutable, no change properties, re assign the object\n set data(data: any) {\n this._storePart.data = data;\n }\n\n get formValue() {\n return this._storePart.formValue;\n }\n\n // NOTE: must be treated as immutable, no change properties, re assign the object\n set formValue(formValue: any) {\n this._storePart.formValue = formValue;\n }\n\n get part() {\n return this._part;\n }\n\n set part(part: any) {\n this._part = part;\n }\n\n abstract build(): void;\n\n reset() {\n this.part = undefined;\n this.chips = [];\n this._storeSection[this.key] = Object.assign({}, this.defaultPartData);\n }\n\n clear() {\n this.part = undefined;\n this.chips = [];\n this._storeSection[this.key] = { data: {}, formValue: {} };\n }\n\n private get _storePart(): IBitfPartData {\n return this._storeSection[this.key];\n }\n}\n","import { BitfApiRequestPart } from './bitf-api-request-part';\n\nimport { EBitfApiRequestPartsNames } from '@enums';\n\nexport class BitfPaginationApiRequestPart extends BitfApiRequestPart {\n constructor(\n public key: string,\n public initialPagination: { page?: number; size?: number; paginationInfo?: string },\n public options?: { pageSizeOptions?: number[]; pageIndexOffset?: number }\n ) {\n super(key, EBitfApiRequestPartsNames.PAGINATION, { data: initialPagination });\n }\n\n build() {\n const page = this.data.page;\n const size = this.data.size;\n this.part = {\n ...(page !== undefined && { page }),\n ...(size !== undefined && { size }),\n };\n\n if (this.data.paginationInfo || this.data.paginationInfo === '') {\n this.part.paginationInfo = this.data.paginationInfo;\n }\n }\n}\n","import { BitfGraphQlPaginationApiRequestPart } from '@common/libs/bitforce/core/api-call-state/bitf-graph-ql-api-call-state';\nimport { BitfSearchApiRequestPart } from '@common/libs/bitforce/core/api-call-state/bitf-search-api-request-part.builder';\n\nimport { EApiCallStateNames, EApiRequestPartKeys } from '@enums';\nimport { IBitfApiCallState } from '@interfaces';\nimport { DefaultApiCallStateMapper } from './default-api-call-state.mapper';\n\nexport const apiCallStateConfig = [\n {\n apiCallStateName: EApiCallStateNames.PRODUCT_LIST,\n requestParts: [\n new BitfGraphQlPaginationApiRequestPart(\n EApiRequestPartKeys.PAGINATION,\n { page: 1, size: 30 },\n { pageIndexOffset: 1 }\n ),\n new BitfSearchApiRequestPart(),\n ],\n apiCallStateMapper: new DefaultApiCallStateMapper(),\n } as IBitfApiCallState,\n];\n","import { BitfPaginationApiRequestPart } from '@bitf/core/api-call-state/bitf-pagination-api-request-part.builder';\n\nexport class BitfGraphQlPaginationApiRequestPart extends BitfPaginationApiRequestPart {\n constructor(key, initialPagination, options) {\n super(key, initialPagination, options);\n }\n}\n","import { BitfApiRequestPart } from './bitf-api-request-part';\nimport { EApiRequestPartKeys, EBitfApiRequestPartsNames } from '@enums';\n\nexport class BitfSearchApiRequestPart extends BitfApiRequestPart {\n constructor({\n apiRequestPartKey = EApiRequestPartKeys.SEARCH,\n apiRequestPartName = EBitfApiRequestPartsNames.SEARCH,\n } = {}) {\n super(apiRequestPartKey, apiRequestPartName);\n }\n\n build(): void {\n this.part = this.formValue;\n }\n}\n","import { IBitfApiCallState } from '@interfaces';\nimport { BitfGraphQlApiCallStateMapper } from '@common/libs/bitforce/core/api-call-state/bitf-graph-ql-api-call-state';\n\nexport class DefaultApiCallStateMapper extends BitfGraphQlApiCallStateMapper {}\n","import { IBitfApiCallState } from '@interfaces';\nimport { BitfApiCallStateMapper } from '@bitf/core/api-call-state/bitf-api-call-state.mapper';\nimport { EBitfApiRequestPartsNames } from '@enums';\n\nexport class BitfGraphQlApiCallStateMapper extends BitfApiCallStateMapper {\n buildApiRequest(apiCallState: IBitfApiCallState): void {\n this.assignApiRequestValuesAsArray(apiCallState, EBitfApiRequestPartsNames.SORTING);\n\n this.assignApiRequestValuesAsArray(apiCallState, EBitfApiRequestPartsNames.SEARCH);\n\n this.assignApiRequestValuesAsArray(apiCallState, EBitfApiRequestPartsNames.FILTER);\n }\n}\n","import { IBitfApiCallState } from '@bitf/interfaces';\nimport { BitfApiRequestPart } from './bitf-api-request-part';\nimport { EBitfApiRequestPartsNames } from '@enums';\n\nexport abstract class BitfApiCallStateMapper {\n computedApiRequestParts: { [key in EBitfApiRequestPartsNames]: any } = {\n headers: [],\n queryParams: [],\n actionParams: [],\n query: [],\n search: [],\n filter: [],\n embed: [],\n computedFields: [],\n sorting: [],\n data: [],\n pagination: { page: undefined, size: undefined, paginationInfo: undefined },\n };\n\n abstract buildApiRequest(apiCallState: IBitfApiCallState): void;\n\n mapApiCallState(apiCallState: IBitfApiCallState) {\n apiCallState.apiRequest = apiCallState.apiRequest || {};\n this.reset();\n\n if (Array.isArray(apiCallState.requestParts)) {\n apiCallState.requestParts.forEach((requestPart: BitfApiRequestPart) => {\n requestPart.build();\n //NOTE: this prevent to add parts which are nullish\n if (requestPart.part) {\n if (requestPart.partName === 'pagination') {\n this.computedApiRequestParts[requestPart.partName] = requestPart.part;\n } else {\n const computedPart = this.computedApiRequestParts[requestPart.partName] as any[];\n computedPart.push(requestPart.part);\n }\n }\n });\n }\n\n this.buildApiRequestPagination(apiCallState);\n this.buildApiRequest(apiCallState);\n }\n\n protected buildApiRequestPagination(apiCallState: IBitfApiCallState): void {\n const pagination = this.computedApiRequestParts.pagination;\n if (pagination.page !== undefined || pagination.size !== undefined) {\n apiCallState.apiRequest.page = this.computedApiRequestParts.pagination.page;\n apiCallState.apiRequest.size = this.computedApiRequestParts.pagination.size;\n }\n if (pagination.paginationInfo !== undefined) {\n apiCallState.apiRequest.paginationInfo = this.computedApiRequestParts.pagination.paginationInfo;\n }\n }\n\n protected reset() {\n Object.keys(this.computedApiRequestParts).forEach(requestPartName => {\n this.computedApiRequestParts[requestPartName] = [];\n });\n }\n\n protected assignApiRequestValuesAsArray(\n apiCallState: IBitfApiCallState,\n property: EBitfApiRequestPartsNames\n ) {\n apiCallState.apiRequest[property] = [];\n this.computedApiRequestParts[property].forEach(el => {\n if (Array.isArray(el)) {\n apiCallState.apiRequest[property].push(...el);\n } else {\n apiCallState.apiRequest[property].push(el);\n }\n });\n }\n\n protected assignApiRequestValuesAsObject(\n apiCallState: IBitfApiCallState,\n property: EBitfApiRequestPartsNames\n ) {\n apiCallState.apiRequest[property] = {};\n this.computedApiRequestParts[property].forEach(el => {\n if (Array.isArray(el)) {\n // NOTE: this was = [qp.value], not sure why we need an array there, in case we need an array is the\n // qp.value that must be an array\n el.forEach(qp => (apiCallState.apiRequest[property][qp.name] = qp.value));\n } else {\n Object.assign(apiCallState.apiRequest[property], el);\n }\n });\n }\n}\n","import { Injectable, Injector } from '@angular/core';\nimport { Subject, Observable } from 'rxjs';\n\nimport { EBitfApiCallStateActions } from '@enums';\nimport { IBitfApiCallState, IBitfStoreEvent } from '@interfaces';\nimport { apiCallStateConfig } from '@api-call-state';\nimport { BitfApiRequestPart } from '@bitf/core/api-call-state/bitf-api-request-part';\nimport { filter, map } from 'rxjs/operators';\nimport { StoreService } from '@services';\nimport { Store } from '@models';\nimport { IBitfStoreParts } from '../../api-call-state/bitf-api-call-state.interfaces';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BitfApiCallStateService {\n apiCallStates$ = new Subject();\n private apiCallStates = new Map();\n private storeService: StoreService;\n\n constructor(injector: Injector) {\n this.storeService = injector.get(StoreService);\n }\n\n init() {\n if (!apiCallStateConfig) {\n return;\n }\n apiCallStateConfig.forEach((apiCallState: IBitfApiCallState) => {\n this.initRequestParts(apiCallState);\n if (apiCallState.apiCallStateMapper) {\n apiCallState.apiCallStateMapper.mapApiCallState(apiCallState);\n }\n this.apiCallStates.set(apiCallState.apiCallStateName, apiCallState);\n });\n }\n\n public setStore(fn: (store: IBitfStoreParts) => void, apiCallStateName: string) {\n this.storeService.setStore((store: Store) => {\n fn(store.apiCallState[apiCallStateName]);\n this.updateApiCallState(apiCallStateName);\n }, this.getStoreActionFor(apiCallStateName));\n }\n\n private getStoreActionFor(apiCallStateName: string) {\n return `${EBitfApiCallStateActions.UPDATE_API_CALL_STATE}.${apiCallStateName}`;\n }\n\n private initRequestParts(apiCallState: IBitfApiCallState) {\n const apiCallStateName = apiCallState.apiCallStateName;\n (apiCallState.requestParts || []).forEach((requestPart: BitfApiRequestPart) => {\n const storeApiCallState = this.storeService.store.apiCallState;\n storeApiCallState[apiCallStateName] = storeApiCallState[apiCallStateName] || {};\n requestPart.init(storeApiCallState[apiCallStateName]);\n });\n }\n\n private updateApiCallState(apiCallStateName: string) {\n const apiCallState = this.getApiCallState(apiCallStateName);\n if (apiCallState.apiCallStateMapper) {\n apiCallState.apiCallStateMapper.mapApiCallState(apiCallState);\n }\n // TODO: can be removed when deprecated sections will be remvoed\n this.apiCallStates$.next(apiCallState);\n }\n\n /**\n * @deprecated Use apiPart.setStore(...) instead\n */\n dispatchApiCallState(action: string, apiCallStateName: string) {\n let apiCallState: IBitfApiCallState;\n switch (action) {\n case EBitfApiCallStateActions.UPDATE:\n this.setStore(() => {}, apiCallStateName);\n break;\n\n case EBitfApiCallStateActions.RESET_ALL_FILTERS:\n apiCallState = this.apiCallStates.get(apiCallStateName);\n apiCallState.requestParts.forEach((requestPart: BitfApiRequestPart) => requestPart.reset());\n\n // eslint-disable-next-line import/no-deprecated\n this.dispatchApiCallState(EBitfApiCallStateActions.UPDATE, apiCallStateName);\n break;\n }\n }\n\n getApiCallState(apiCallStateName: string): IBitfApiCallState {\n let apiCallState: IBitfApiCallState = this.apiCallStates.get(apiCallStateName);\n if (!apiCallState) {\n apiCallState = this.getDefaultApiCallState(apiCallStateName);\n this.apiCallStates.set(apiCallStateName, apiCallState);\n }\n return apiCallState;\n }\n\n getApiRequest(apiCallStateName: string) {\n return this.getApiCallState(apiCallStateName).apiRequest || {};\n }\n\n getDefaultApiCallState(apiCallStateName: string) {\n const defaultApiCallState = apiCallStateConfig[apiCallStateName];\n if (defaultApiCallState) {\n return defaultApiCallState;\n }\n return { apiCallStateName } as IBitfApiCallState;\n }\n\n getRequestPart(apiCallStateName: string, apiRequestPartKey: string) {\n const aCS = this.getApiCallState(apiCallStateName);\n const apiRequestPart = aCS.requestParts.find(\n (requestPart: BitfApiRequestPart) => requestPart.key === apiRequestPartKey\n );\n if (!apiRequestPart) {\n throw new Error(\n 'You have to add correct object of class BitfApiRequestPart' +\n ' to DEFAULT_API_CALL_STATES -> request_parts'\n );\n }\n return apiRequestPart;\n }\n\n /**\n * @deprecated Use getStateStore$(...)\n */\n getApiCallStateOservable(apiCallStateName: string) {\n return this.apiCallStates$.pipe(\n filter((apiCallState: IBitfApiCallState) => apiCallState.apiCallStateName === apiCallStateName)\n );\n }\n\n public getStateStore$(apiCallStateName: string): Observable> {\n return this.storeService.selectStore(this.getStoreActionFor(apiCallStateName)).pipe(\n map(\n (event: IBitfStoreEvent): IBitfStoreEvent => ({\n action: event.action,\n store: event.store.apiCallState[apiCallStateName],\n })\n )\n );\n }\n}\n","import { Injectable, Injector } from '@angular/core';\nimport { BitfApiCallStateService } from '@bitf/services/api-call-state/bitf-api-call-state.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ApiCallStateService extends BitfApiCallStateService {\n constructor(protected injector: Injector) {\n super(injector);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\nimport { DialogsService } from '@services';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ResponsiveService {\n isInitialBreakpoint = true;\n\n constructor(private breakpointObserver: BreakpointObserver, private dialogsService: DialogsService) {}\n\n init() {\n this.breakpointObserver\n .observe([Breakpoints.Medium, Breakpoints.Large, Breakpoints.XLarge])\n .subscribe(() => {\n if (!this.isInitialBreakpoint) {\n this.dialogsService.dialog.closeAll();\n }\n this.isInitialBreakpoint = false;\n });\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { BitfStoreService } from '@bitf/services/store/bitf-store.service';\n\nimport { Store } from '@models';\nimport { StoreStorageService } from '@services';\n\n@Injectable({\n providedIn: 'root',\n})\n\n// NOTE: if you use storeStorage, the initalData must defined in the storeStorage, otherwise here\n// NOTE: inital data must be an object literal to be passed in the storeClass constructor not a storeClass\n// instance this is to avoid to create something like new storeClass(justClone(StoreClassInstance));\n// which will lead to problems\nexport class StoreService extends BitfStoreService {\n constructor(storeStorageService: StoreStorageService) {\n // NOTE: Verstion with storage\n super({ storeClass: Store, storage: storeStorageService });\n // NOTE: version without storage and inital value here\n // super({ storeClass: Store, initialData: { prop1: 'Initial store value' } });\n }\n}\n","import { Subject } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport justClone from 'just-clone';\n\nimport { IBitfStoreEvent } from '@interfaces';\nimport { eStoreActions } from '@enums';\nimport { BitfStorageService } from '../storage/bitf-storage.service';\n\n/**\n * Store service.\n * The store is a centralized application state\n */\nexport abstract class BitfStoreService {\n protected _store: T;\n protected storeClass: new (data?: Partial) => T;\n protected storage: BitfStorageService;\n protected initialData: Partial;\n public readonly store$ = new Subject>();\n\n // NOTE: inital data must be an object to be passed in the storeClass constructor not a storeClass instance\n // this is to avoid to create something like new storeClass(justClone(StoreClassInstance)); which will\n // lead to problems\n\n /**\n * @param initialData for the application state\n * @param storeClass class for the Store model\n * @param storage Optional: you can provice a storage service to persist the store state\n */\n constructor({\n initialData,\n storeClass,\n storage,\n }: {\n initialData?: Partial;\n storeClass: new (data?: Partial) => T;\n storage?: BitfStorageService;\n }) {\n if (!storeClass) {\n throw new Error('storageClass is undefined');\n }\n this.storeClass = storeClass;\n this.initialData = initialData || ({} as T);\n this.storage = storage;\n if (storage) {\n this._store = storage.data;\n } else {\n this._store = new storeClass(justClone(this.initialData));\n }\n }\n\n /**\n * Returns the Store\n */\n get store(): T {\n return this._store;\n }\n\n /**\n * Method to reset the store state\n */\n resetStore() {\n // FIME: this will break the apiCallStates since in the BitfRequestPart.init() there we assign the\n // store in the constructor and then it change\n if (this.storage) {\n this.storage.resetStorage();\n this._store = this.storage.data;\n } else {\n this._store = new this.storeClass(justClone(this.initialData));\n }\n window['store'] = this._store;\n this.store$.next({ action: eStoreActions.RESET, store: this.store } as IBitfStoreEvent);\n }\n\n // NOTE: this '= eStoreActions.CREATE' will infer the action eStoreActions also if it is a constant\n /**\n * Method to update the store. It is important to use this method to update the store, otherwise\n * listeners will not be notified of the changes in the store state.\n * Eg.\n * storeService.setStore((store)=>store.appTitle = 'A title', eStoreActions.TITLE_CHANGED)\n *\n * @param callback used to update the store\n * @param action optional, the action to notify only the listeners interested in this update\n */\n setStore(fn: (store: T) => void, action: string = eStoreActions.UPDATE) {\n fn(this.store);\n if (this.storage) {\n this.storage.setData(this.store);\n }\n window['store'] = this._store;\n this.store$.next({ action, store: this.store } as IBitfStoreEvent);\n }\n\n /**\n * Utility function to listen only for store updates of this action\n *\n * @param action The action to listen to\n */\n selectStore(action: string | string[]) {\n if (Array.isArray(action)) {\n return this.store$.pipe(filter(item => action.includes(item.action)));\n }\n return this.store$.pipe(filter(item => item.action === action));\n }\n}\n","import { Subject } from 'rxjs';\nimport extend from 'just-extend';\nimport justClone from 'just-clone';\n\nimport { environment } from '@env/environment';\nimport { CONSTANTS } from '@constants';\nimport { IBitfStorage } from './bitf-storage.interface';\n\n/**\n * BitfStorageService\n * Service to interact with a native Storage (like localStorage) that supports versioning\n */\nexport abstract class BitfStorageService {\n storage$ = new Subject();\n protected storageKey = `${environment.appName}-storage`;\n protected nativeStorage: Storage;\n protected storageClass: new (data?: Partial) => T;\n private initialData: Partial;\n\n // NOTE: inital data must be an object to be passed in the storeClass constructor not a storeClass instance\n // this is to avoid to create something like new storeClass(justClone(StoreClassInstance)); which will\n // lead to problems\n\n /**\n *\n * @param initialData the initial data for the storage\n * @param storageClass the class of the Storage model\n * @param nativeStorage the native storage to be used (localStorage, sessionStorage or a storage like obj)\n * @parame storageKey the storage key to be used to persist the storage data inside the native storage\n */\n constructor({\n initialData,\n storageClass,\n nativeStorage = localStorage,\n storageKey,\n }: {\n initialData?: Partial;\n storageClass?: new (data?: Partial) => T;\n nativeStorage?: Storage;\n storageKey?: string;\n } = {}) {\n if (!storageClass) {\n throw new Error('storageClass is undefined');\n }\n this.storageClass = storageClass;\n this.nativeStorage = nativeStorage;\n this.initialData = initialData || ({} as T);\n if (storageKey) {\n this.storageKey = `${environment.appName}-${storageKey}`;\n }\n this.initStorage();\n this.validateStorage();\n }\n\n private initStorage() {\n if (!this.storage) {\n this.storage = this.getEmptyStorage();\n }\n }\n\n private getEmptyStorage() {\n return {\n createdAt: Date.now(),\n modifiedAt: Date.now(),\n version: CONSTANTS.LOCAL_STORAGE_VERSION,\n data: new this.storageClass(justClone(this.initialData)),\n };\n }\n\n /**\n * NOTE: consider this object as immutable, since every thime this getter runs you'll receive a new\n * object. This could be also a performance bottleneck in case we've tons of readings from the local storage\n *\n * @returns The storage row data\n */\n get storage(): IBitfStorage {\n const storageData = JSON.parse(this.nativeStorage.getItem(this.storageKey));\n if (storageData && storageData.data) {\n return { ...storageData, data: new this.storageClass(storageData.data) };\n }\n return storageData;\n }\n\n /**\n * This setter will overwrite the storage data writing directly to the storage.\n * Use storage.data = ... instead\n */\n set storage(storage: IBitfStorage) {\n this.nativeStorage.setItem(this.storageKey, JSON.stringify(storage));\n }\n\n /**\n * @returns The parsed storage Model\n */\n get data(): T {\n if (this.storage && this.storage.data) {\n return new this.storageClass(this.storage.data);\n }\n return new this.storageClass();\n }\n\n /**\n * This setter will update hte storage data (not overwrite)\n */\n set data(data: T) {\n const storage = this.storage;\n // @ts-ignore\n storage.data = extend(this.storage.data, data);\n this.updateStorage(storage);\n }\n\n /**\n * This function will overwrite the storage model\n *\n * @param data the Storage model\n */\n setData(data: T) {\n const storage = this.storage;\n storage.data = data;\n this.updateStorage(storage);\n }\n\n /**\n * This method will clear storage data\n */\n clearData() {\n const storage = this.storage;\n storage.data = {} as T;\n this.updateStorage(storage);\n }\n\n /**\n * This method will reset storage data\n */\n resetStorage() {\n const storage = this.migrateStorage();\n this.storage = storage;\n this.storage$.next(storage.data);\n }\n\n /**\n * Method to be override to create a custom migrate logic for the application specific storage\n */\n migrateStorage() {\n return this.getEmptyStorage();\n }\n\n private validateStorage() {\n const storage = this.storage;\n if (storage.version !== CONSTANTS.LOCAL_STORAGE_VERSION) {\n this.resetStorage();\n }\n }\n\n private updateStorage(storage: IBitfStorage) {\n storage.modifiedAt = Date.now();\n this.storage = storage;\n this.storage$.next(storage.data);\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { BitfStorageService } from '@bitf/services/storage/bitf-storage.service';\n\nimport { Storage } from '@models';\n\n@Injectable({\n providedIn: 'root',\n})\n// NOTE: inital data must be an object literal to be passed in the storeClass constructor not a storeClass\n// instance this is to avoid to create something like new storeClass(justClone(StoreClassInstance));\n// which will lead to problems\nexport class StorageService extends BitfStorageService {\n constructor() {\n super({\n nativeStorage: localStorage,\n storageKey: 'storage',\n storageClass: Storage,\n initialData: { prop1: 'Initial storage value' },\n });\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { BitfStorageService } from '@bitf/services/storage/bitf-storage.service';\n\nimport { Store } from '@models';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class StoreStorageService extends BitfStorageService {\n constructor() {\n super({\n nativeStorage: sessionStorage,\n storageKey: 'store-storage',\n storageClass: Store,\n initialData: { prop1: 'Initial store storage value' },\n });\n }\n}\n","export enum ERoleMode {\n READ_ONLY = 'READ_ONLY',\n HIDDEN = 'HIDDEN',\n DISABLED = 'DISABLED',\n INVISIBLE = 'INVISIBLE',\n}\n\nexport enum ERoles {\n MASTER = 'MASTER',\n}\n\nexport enum ERoleActions {\n VIEW_LOG = 'VIEW_LOG',\n}\n","import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { StoreService } from '@common/core/services';\nimport { eStoreActions } from '@web/enums';\nimport { IBitfStoreEvent } from '@common/interfaces';\nimport { Store } from '@common/core/models';\n\nexport enum EBreakpoint {\n xs = 'xs',\n sm = 'sm',\n md = 'md',\n lg = 'lg',\n xl = 'xl',\n}\n\n@Component({\n selector: 'bitf-image',\n templateUrl: './bitf-image.component.html',\n styleUrls: ['./bitf-image.component.scss'],\n})\nexport class BitfImageComponent implements OnInit, OnChanges {\n @Input() nativeLazy = true;\n @Input() placeholderSrc: string; // placeholder url\n @Input() layout: 'responsive' | 'fixed' = 'responsive';\n @Input() defaultBreakpoint = 'xs';\n @Input() sources: {\n [x: string]: {\n '1x': string;\n '2x'?: string;\n aspectRatio?: string;\n width?: string;\n height?: string;\n objectFit?: 'fill' | 'contain' | 'cover' | 'none' | 'scale-down ';\n };\n };\n\n // Img props\n src = '';\n srcset = '';\n sizes = '';\n imgStyle = {};\n\n private breakpoints = { xs: 1, sm: 600, md: 960, lg: 1280, xl: 1920 };\n\n constructor(private storeService: StoreService) {}\n\n ngOnInit(): void {\n this.initImageProperties();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!changes.sources?.firstChange) {\n this.initImageProperties();\n }\n\n if (!changes.layout?.firstChange) {\n this.initImageProperties();\n }\n\n if (!changes.defaultBreakpoint?.firstChange) {\n this.initImageProperties();\n }\n }\n\n private initImageProperties() {\n // reset attributes\n this.src = '';\n this.srcset = '';\n this.sizes = '';\n this.imgStyle = [];\n Object.keys(this.breakpoints).forEach(breakpoint => {\n // set src and srcset\n if (this.layout === 'responsive') {\n this.setSrcsetAsResponsive(breakpoint);\n } else if (this.layout === 'fixed') {\n this.setSrcsetAsFixed(breakpoint);\n }\n });\n\n // Set sizes\n Object.values(this.breakpoints)\n .reverse()\n .forEach(breakpoint => {\n const size = '(min-width: ' + breakpoint + 'px' + ') ' + breakpoint + 'px, ';\n this.sizes += size;\n });\n\n // set default size\n this.sizes += this.breakpoints[this.defaultBreakpoint] + 'px';\n\n this.updateImgStyle(this.storeService.store);\n\n this.storeService.selectStore(eStoreActions.BREAKPOINT).subscribe((event: IBitfStoreEvent) => {\n this.updateImgStyle(event.store);\n });\n }\n\n private updateImgStyle(store: Store) {\n let currentBreakpoint = 'xs';\n if (this.layout === 'fixed') {\n currentBreakpoint = 'xs';\n } else {\n currentBreakpoint = store.activeBreakpoints.isXSmall\n ? 'xs'\n : store.activeBreakpoints.isSmall\n ? 'sm'\n : store.activeBreakpoints.isMedium\n ? 'md'\n : store.activeBreakpoints.isLarge\n ? 'lg'\n : 'xl';\n }\n\n let source = this.sources[currentBreakpoint];\n if (!source) {\n // FIXME: se non c'è la dimensione prendo quella più grande\n source = this.sources[Object.keys(this.sources).reverse()[0]];\n }\n const width = source?.width || '100%';\n const height = source?.height || '100%';\n\n this.imgStyle = {\n width,\n height,\n ...(source.objectFit && { objectFit: source?.objectFit }),\n ...(source.aspectRatio && { aspectRatio: source?.aspectRatio }),\n };\n }\n\n // Responsive srcset\n private setSrcsetAsResponsive(breakpoint: string) {\n if (this.sources[breakpoint]) {\n const imageUrl = this.sources[breakpoint]['2x']\n ? this.sources[breakpoint]['2x']\n : this.sources[breakpoint]['1x'];\n const imageWidth = this.breakpoints[breakpoint] + 'w';\n if (imageUrl) {\n const setItem = imageUrl + ' ' + imageWidth + ', ';\n this.srcset += setItem;\n\n if (!this.src) {\n this.src = imageUrl;\n }\n }\n }\n }\n\n // Fixed srcset\n private setSrcsetAsFixed(breakpoint: string) {\n if (this.sources[breakpoint]) {\n if (this.sources[breakpoint]['1x']) {\n const image1xUrl = this.sources[breakpoint]['1x'];\n if (image1xUrl) {\n const set1xItem = image1xUrl + ' 1x' + ', ';\n this.srcset += set1xItem;\n\n if (!this.src) {\n this.src = image1xUrl;\n }\n }\n }\n\n if (this.sources[breakpoint]['2x']) {\n const image2xUrl = this.sources[breakpoint]['2x'];\n if (image2xUrl) {\n const set2xItem = image2xUrl + ' 2x' + ', ';\n this.srcset += set2xItem;\n\n if (!this.src) {\n this.src = image2xUrl;\n }\n }\n }\n }\n }\n}\n","","\n
\n
\n \n
\n
\n
","import { Component, Input, OnInit } from '@angular/core';\nimport { LoaderService } from '@common/core/services';\nimport { EBitfLoaderAction } from '@common/enums';\nimport { IBitfLoaderAction } from '@common/interfaces';\n\n@Component({\n selector: 'bitf-mat-loader',\n templateUrl: './bitf-mat-loader.component.html',\n styleUrls: ['./bitf-mat-loader.component.scss'],\n})\nexport class BitfMatLoaderComponent implements OnInit {\n @Input() diameter = 30;\n\n canShowLoader = false;\n loaderData: any;\n\n constructor(private loaderService: LoaderService) {}\n\n ngOnInit() {\n this.loaderService.onLoaderChange.subscribe((loaderAction: IBitfLoaderAction) => {\n switch (loaderAction.action) {\n case EBitfLoaderAction.SHOW:\n this.loaderData = loaderAction.data;\n this.show();\n this.loaderService.isLoading = true;\n break;\n case EBitfLoaderAction.HIDE:\n this.loaderData = undefined;\n this.hide();\n this.loaderService.isLoading = false;\n break;\n }\n });\n }\n\n show() {\n setTimeout(() => (this.canShowLoader = true));\n }\n\n hide() {\n setTimeout(() => (this.canShowLoader = false));\n }\n}\n","

{{ dialogData.title | translate }}

\n\n \n \n\n
\n \n {{ dialogData.prompt?.label | translate }}\n \n \n
\n
\n\n\n \n\n \n","import { Component, Inject, OnInit } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { ThemePalette } from '@angular/material/core';\n\nimport { IBitfOkCancelDialogData, IBitfCloseEvent } from '@interfaces';\nimport { EBitfCloseEventStatus } from '@enums';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'bitf-mat-ok-cancel-dialog',\n templateUrl: './bitf-mat-ok-cancel-dialog.component.html',\n styleUrls: ['./bitf-mat-ok-cancel-dialog.component.scss'],\n})\nexport class BitfMatOkCancelDialogComponent implements OnInit {\n form: UntypedFormGroup;\n okButtonType: ThemePalette;\n\n constructor(\n public dialogRef: MatDialogRef,\n @Inject(MAT_DIALOG_DATA) public dialogData: IBitfOkCancelDialogData,\n private formBuilder: UntypedFormBuilder\n ) {\n if (dialogData.prompt) {\n this.form = this.formBuilder.group({\n value: [dialogData.prompt.value || '', dialogData.prompt.isRequired ? Validators.required : ''],\n });\n }\n }\n\n ngOnInit() {\n switch (this.dialogData.okButtonType) {\n // NOTE all possible material values are primary, accent, or warn\n case 'PRIMARY':\n this.okButtonType = 'primary';\n break;\n case 'SECONDARY':\n this.okButtonType = 'accent';\n break;\n case 'WARNING':\n this.okButtonType = 'warn';\n break;\n case 'DANGER':\n this.okButtonType = 'warn';\n break;\n default:\n this.okButtonType = 'accent';\n }\n }\n\n onOk() {\n this.dialogRef.close({\n status: EBitfCloseEventStatus.OK,\n data: this.form && this.form.value,\n } as IBitfCloseEvent);\n }\n\n onCancel() {\n this.dialogRef.close({\n status: EBitfCloseEventStatus.CANCEL,\n } as IBitfCloseEvent);\n }\n}\n","import { OnInit, Input, Output, EventEmitter, Component } from '@angular/core';\nimport { PageEvent } from '@angular/material/paginator';\n\nimport { BitfApiRequestPart } from '@bitf/core/api-call-state/bitf-api-request-part';\n\nimport { ApiCallStateService } from '@services';\nimport { EApiCallStateNames, EApiRequestPartKeys } from '@enums';\nimport { IBitfApiPagination, IBitfPaginatorOptions } from '@interfaces';\n\n@Component({\n selector: 'bitf-paginator',\n template: '',\n})\nexport class BitfPaginatorComponent implements OnInit {\n @Input()\n apiCallStateName: EApiCallStateNames;\n\n @Input()\n options: IBitfPaginatorOptions;\n @Input()\n pageSizeOptions = [10, 30, 50, 100];\n // NOTE: mat paginator first page starts with 0 index\n @Input()\n pageIndexOffset = 0;\n\n _pagination: IBitfApiPagination;\n @Input()\n set pagination(value: IBitfApiPagination) {\n this._pagination = value;\n this.updatePaginator();\n }\n get pagination(): IBitfApiPagination {\n return this._pagination;\n }\n\n @Output()\n pageChange: EventEmitter = new EventEmitter();\n\n requestPart: BitfApiRequestPart;\n\n constructor(private apiCallStateService: ApiCallStateService) {}\n\n ngOnInit() {\n if (this.apiCallStateName) {\n this.requestPart = this.apiCallStateService.getRequestPart(\n this.apiCallStateName,\n EApiRequestPartKeys.PAGINATION\n );\n\n if (this.requestPart?.options?.pageSizeOptions) {\n this.pageSizeOptions = this.requestPart.options.pageSizeOptions;\n }\n if (this.requestPart?.options?.pageIndexOffset) {\n this.pageIndexOffset = this.requestPart.options.pageIndexOffset;\n }\n }\n }\n\n onPageChange(pagination: IBitfApiPagination) {\n if (this.apiCallStateName) {\n this.apiCallStateService.setStore(() => {\n this.requestPart.data = {\n page: pagination.page,\n size: pagination.size,\n };\n }, this.apiCallStateName);\n }\n\n this.pageChange.emit(pagination);\n }\n\n updatePaginator() {}\n}\n","\n","import { Component, Input } from '@angular/core';\nimport { BitfPaginatorComponent } from '../bitf-paginator.component';\nimport { PageEvent } from '@angular/material/paginator';\n\n@Component({\n selector: 'bitf-mat-paginator',\n templateUrl: './bitf-mat-paginator.component.html',\n styleUrls: ['./bitf-mat-paginator.component.scss'],\n})\nexport class BitfMatPaginatorComponent extends BitfPaginatorComponent {\n @Input() showFirstLastButtons: boolean;\n\n onMatPagechange(event: PageEvent) {\n this.pagination.page = event.pageIndex + this.pageIndexOffset;\n this.pagination.size = event.pageSize;\n this.onPageChange(this.pagination);\n }\n}\n","import { OnInit, Output, Input, EventEmitter, OnDestroy, Component } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { debounce, filter, distinctUntilChanged, tap } from 'rxjs/operators';\nimport { timer, Subscription } from 'rxjs';\n\nimport { BitfApiRequestPart } from '@bitf/core/api-call-state/bitf-api-request-part';\nimport { ApiCallStateService } from '@services';\nimport { EApiRequestPartKeys } from '@enums';\n\n@Component({\n selector: 'bitf-search',\n template: '',\n})\nexport class BitfSearchComponent implements OnInit, OnDestroy {\n @Input()\n apiCallStateName: string;\n\n @Input()\n apiRequestPartKey = EApiRequestPartKeys.SEARCH;\n\n @Input()\n formKey: string;\n\n @Input()\n formKeys: string[];\n\n @Input()\n hasSearchIcon = true;\n\n @Input()\n hasCancelButton = false;\n\n @Input()\n isInToolbar = false;\n\n @Input()\n size = 'sm'; // \"sm\" | \"xl\"\n\n @Input()\n placeholder = '';\n\n @Input() minLength = 3;\n\n @Input()\n debounceTimeMs = 500;\n\n @Output()\n valueChanges: EventEmitter = new EventEmitter();\n\n requestPart: BitfApiRequestPart;\n paginationRequestPart: BitfApiRequestPart;\n formControl: UntypedFormControl = new UntypedFormControl('');\n subscription: Subscription = new Subscription();\n isFirstSearchDone = false;\n\n constructor(private apiCallStateService: ApiCallStateService) {}\n\n ngOnInit() {\n if (!this.formKey && !this.formKeys) {\n // NOTE: this will work as default\n this.formKeys = ['keyword'];\n }\n\n if (this.formKey) {\n this.formKeys = [this.formKey];\n }\n\n if (this.apiCallStateName) {\n this.requestPart = this.apiCallStateService.getRequestPart(\n this.apiCallStateName,\n this.apiRequestPartKey\n );\n\n this.paginationRequestPart = this.apiCallStateService.getRequestPart(\n this.apiCallStateName,\n EApiRequestPartKeys.PAGINATION\n );\n\n this.subscription = this.apiCallStateService.getStateStore$(this.apiCallStateName).subscribe(() => {\n this.patchWithApiRequestPart();\n });\n this.patchWithApiRequestPart();\n }\n\n this.formControl.valueChanges\n .pipe(\n tap((value: string) => {\n if (this.apiCallStateName) {\n this.formKeys.forEach(key => {\n this.requestPart.formValue[key] = value;\n });\n }\n }),\n debounce(() => timer(this.debounceTimeMs)),\n distinctUntilChanged(),\n // NOTE: the second || is to run the query if the user cancel the text\n filter(value => value.length >= this.minLength || (this.isFirstSearchDone && value.length === 0))\n )\n .subscribe(value => {\n this.isFirstSearchDone = true;\n if (this.apiCallStateName) {\n this.paginationRequestPart.reset();\n this.apiCallStateService.setStore(() => {}, this.apiCallStateName);\n }\n this.valueChanges.emit(value);\n });\n }\n\n clearSearchField() {\n this.formControl.setValue('');\n }\n\n private patchWithApiRequestPart() {\n const formValue = this.requestPart.formValue;\n if (this.hasInitialValue()) {\n // NOTE: we use the first key because the content of all keys is the same\n this.formControl.patchValue(formValue[this.formKeys[0]], { emitEvent: false });\n this.isFirstSearchDone = true;\n } else {\n this.formControl.patchValue('', { emitEvent: false });\n this.isFirstSearchDone = false;\n }\n }\n\n protected hasInitialValue() {\n // NOTE: we use the first key because the content of all keys is the same\n const formValue = this.requestPart?.formValue;\n return formValue && formValue[this.formKeys[0]];\n }\n\n ngOnDestroy(): void {\n this.subscription.unsubscribe();\n }\n}\n","\n {{placeholder}}\n \n search\n\n \n","import { Component, Input } from '@angular/core';\nimport { BitfSearchComponent } from '../bitf-search.component';\n\n@Component({\n selector: 'bitf-mat-search',\n templateUrl: './bitf-mat-search.component.html',\n styleUrls: ['./bitf-mat-search.component.scss'],\n})\nexport class BitfMatSearchComponent extends BitfSearchComponent {\n @Input() fontSize?: string;\n}\n","import { environment } from '@env/environment';\nimport { BitfErrorHandlerService } from '@bitf/services/error-handler/bitf-error-handler.service';\nexport function BitfTryCatch(message?) {\n return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n let descriptorType = 'value';\n if (descriptor.get && typeof descriptor.get === 'function') {\n descriptorType = 'get';\n } else if (descriptor.set && typeof descriptor.set === 'function') {\n descriptorType = 'set';\n }\n const decoratorFunctionFactory = _decoratorFunctionFactory.bind(this);\n let originalFunction;\n if (descriptorType === 'value') {\n originalFunction = descriptor[descriptorType];\n descriptor.value = decoratorFunctionFactory(originalFunction, target, propertyKey);\n } else {\n originalFunction = descriptor.get;\n descriptor.get = decoratorFunctionFactory(originalFunction, target, propertyKey);\n originalFunction = descriptor.set;\n descriptor.set = decoratorFunctionFactory(originalFunction, target, propertyKey);\n }\n };\n}\n\nfunction _decoratorFunctionFactory(originalFunction, target, propertyKey) {\n return function(...args) {\n try {\n return originalFunction.apply(this, args);\n } catch (error) {\n if (!environment.production) {\n console.error(error);\n }\n // NOTE: wait the app finish to load\n setTimeout(() => {\n const errorHandlerService = window['rootInjector'].get(BitfErrorHandlerService);\n errorHandlerService.handle(error, {\n fromDecorator: true,\n className: target.constructor.name,\n functionName: propertyKey,\n });\n }, 0);\n }\n };\n}\n","export enum EBitfFormControlValidatorsKeys {\n min = 'min',\n max = 'max',\n required = 'required',\n requiredTrue = 'requiredTrue',\n email = 'email',\n minLength = 'minLength',\n maxLength = 'maxLength',\n pattern = 'pattern',\n nullValidator = 'nullValidator',\n}\n","import { IBitfBrowser } from '@interfaces';\nimport { EBitfBrowser } from '@enums';\n\nlet cachedBrowser: IBitfBrowser;\n\nexport function detectBrowser(): IBitfBrowser {\n const browser: IBitfBrowser = {\n isOpera: false,\n isFirefox: false,\n isSafari: false,\n isSafariMobile: false,\n isIe: false,\n isEdge: false,\n isChrome: false,\n isBlink: false,\n currentBrowser: EBitfBrowser.NOT_DEFINED,\n isApple: false,\n };\n\n if (cachedBrowser) {\n return cachedBrowser;\n }\n\n // Opera 8.0+\n browser.isOpera =\n (!!window['opr'] && !!window['opr'].addons) ||\n !!window['opera'] ||\n navigator.userAgent.indexOf(' OPR/') >= 0;\n\n if (browser.isOpera) {\n browser.currentBrowser = EBitfBrowser.OPERA;\n }\n\n // Firefox 1.0+\n // @ts-ignore\n browser.isFirefox = typeof InstallTrigger !== 'undefined';\n if (browser.isFirefox) {\n browser.currentBrowser = EBitfBrowser.FIREFOX;\n }\n\n // Safari\n browser.isSafari = !!navigator.userAgent.match(/Version\\/[\\d\\.]+.*Safari/);\n if (browser.isSafari) {\n browser.currentBrowser = EBitfBrowser.SAFARI;\n }\n\n browser.isSafariMobile =\n !!window.navigator.userAgent.match(/iPad/i) || !!window.navigator.userAgent.match(/iPhone/i);\n if (browser.isSafariMobile) {\n browser.currentBrowser = EBitfBrowser.SAFARI_MOBILE;\n }\n\n browser.isApple = browser.isSafari && browser.isSafariMobile;\n\n // Internet Explorer 6-11\n browser.isIe = /*@cc_on!@*/ false || !!document['documentMode'];\n if (browser.isIe) {\n browser.currentBrowser = EBitfBrowser.IE;\n }\n\n // Edge 20+\n browser.isEdge = !browser.isIe && !!window['StyleMedia'];\n if (browser.isEdge) {\n browser.currentBrowser = EBitfBrowser.EDGE;\n }\n\n const isChromium = !!window['chrome'];\n const vendorName = window.navigator.vendor;\n // is Google Chrome on IOS\n const isIOSChrome = window.navigator.userAgent.match('CriOS');\n\n if (isIOSChrome || (isChromium && vendorName === 'Google Inc.' && !browser.isOpera && !browser.isEdge)) {\n browser.isChrome = true;\n }\n if (browser.isChrome) {\n browser.currentBrowser = EBitfBrowser.CHROME;\n }\n\n // Blink engine detection\n browser.isBlink = (browser.isChrome || browser.isOpera) && !!window['CSS'];\n\n cachedBrowser = browser;\n return browser;\n}\n","import { Subject } from 'rxjs';\n\nimport { IBitfUiMessages, IBitfBrowser } from '@interfaces';\nimport { detectBrowser } from '@bitf/utils/bitf-browser.utils';\nimport { IBitfStoreParts } from '../api-call-state/bitf-api-call-state.interfaces';\n\n/**\n * The store model, used by Bitf core services\n */\nexport abstract class BitfStore {\n activeBreakpoints = {\n isXSmall: false,\n isSmall: false,\n isMedium: false,\n isLarge: false,\n isXLarge: false,\n isHandset: false,\n isTablet: false,\n isWeb: false,\n isHandsetPortrait: false,\n isTabletPortrait: false,\n isWebPortrait: false,\n isHandsetLandscape: false,\n isTabletLandscape: false,\n isWebLandscape: false,\n isHandsetLayout: false,\n isTabletLayout: false,\n isWebLayout: false,\n };\n // NOTE: will be true if the app is lounched in standalone mode from PWA\n isStandAlone = false;\n\n uiMessages$ = new Subject();\n\n apiCallState: { [key: string]: IBitfStoreParts } = {};\n\n constructor(storeData: any = {}) {\n Object.assign(this, storeData);\n }\n\n get browser(): IBitfBrowser {\n return detectBrowser();\n }\n\n set browser(data: IBitfBrowser) {}\n\n toJSON() {\n const copy = Object.assign({}, this);\n delete copy.activeBreakpoints;\n delete copy.uiMessages$;\n\n return copy;\n }\n}\n","import { Injectable, Injector, ErrorHandler } from '@angular/core';\nimport { BitfLoggerService } from '@bitf/services/logger/bitf-logger.service';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { environment } from '@env/environment';\n// FIXME\n// import { BitfPWAService } from '@bitf/services';\nimport { IBitfLoggerParams } from '@interfaces';\nimport { bitfGetProp } from '@bitf/utils/bitf-objects.utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BitfErrorHandlerService extends ErrorHandler {\n constructor(private injector: Injector) {\n super();\n }\n\n handleError(error: Error | HttpErrorResponse) {\n this.handle(error);\n super.handleError(error);\n }\n\n handle(errorObj: Error | HttpErrorResponse, loggerParams: IBitfLoggerParams = {}) {\n // FIXME\n // const pwaService = this.injector.get(BitfPWAService);\n const logObj: IBitfLoggerParams & { name?: string } = {};\n if (errorObj instanceof Error) {\n if (\n environment.loggerConfig.logExceptions ||\n (loggerParams.fromDecorator && environment.loggerConfig.logDecoratedExceptions)\n ) {\n const stackParts = errorObj.stack && errorObj.stack.split(/\\u000A/);\n Object.assign(logObj, {\n level: 'ERROR',\n title: 'Exception',\n });\n if (stackParts) {\n Object.assign(logObj, {\n description: stackParts[0],\n location: stackParts[1],\n });\n }\n logObj.name = errorObj.name;\n logObj.message = errorObj.message;\n }\n } else if (errorObj instanceof HttpErrorResponse) {\n // FIXME\n // if (pwaService.onlineStatus === EBitfOnlineStates.OFFLINE) {\n // return;\n // }\n // NOTE do not log the error logger POST calls\n const isLoggerUrl = (errorObj.url || '').startsWith(environment.loggerConfig.logUrl);\n const statusCode = String(errorObj.status);\n const statusCodes = [statusCode, `${statusCode.split('')[0]}XX`];\n const shouldLogError =\n environment.loggerConfig.logHttpErrorsWithStatusesCodes.includes(statusCodes[0]) ||\n environment.loggerConfig.logHttpErrorsWithStatusesCodes.includes(statusCodes[1]);\n if (!isLoggerUrl && shouldLogError) {\n let errorTitle = 'HttpErrorResponse';\n const level = bitfGetProp(errorObj, 'error', 'metadata', 'uiMessages') ? 'WARN' : 'ERROR';\n if (errorObj.error && errorObj.error.name) {\n errorTitle = errorObj.error.name;\n logObj.name = errorObj.name;\n }\n Object.assign(logObj, {\n level,\n title: errorTitle + ' - ' + errorObj.message,\n httpErrorResponse: this.createHttpErrorLog(errorObj),\n });\n }\n } else {\n Object.assign(logObj, {\n level: (loggerParams && loggerParams.level) || 'INFO',\n title: loggerParams.title || 'Generic log',\n description: loggerParams.description || 'Generic log',\n });\n }\n if (Object.keys(logObj).length) {\n Object.assign(logObj, loggerParams);\n if (environment.loggerConfig.enabled) {\n setTimeout(() => {\n const loggerService = this.injector.get(BitfLoggerService);\n loggerService.log(logObj);\n }, 0);\n }\n }\n }\n\n private createHttpErrorLog(errorObj: HttpErrorResponse) {\n let errorString;\n try {\n errorString = JSON.stringify(errorObj.error);\n } catch (err) {\n errorString = undefined;\n }\n const { status, statusText, url, name, message } = errorObj;\n return {\n status,\n statusText,\n url,\n name,\n message,\n error: errorString,\n method: errorObj['method'],\n body:\n environment.loggerConfig.sendRequestBody && errorObj['requestBody']\n ? JSON.stringify(errorObj['requestBody'])\n : undefined,\n queryParams:\n environment.loggerConfig.sendQueryParams && errorObj['queryParams']\n ? JSON.stringify(errorObj['queryParams'])\n : undefined,\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { registerLocaleData } from '@angular/common';\n\nimport { CONSTANTS } from '@constants';\nimport { StorageService } from '@services';\nimport { IBitfLanguage } from './bitf-dynamic-locale.interface';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BitfDynamicLocaleService {\n private _locale: IBitfLanguage;\n public localeChange$ = new BehaviorSubject(undefined);\n\n constructor(private translateService: TranslateService, private storageService: StorageService) {}\n\n async init() {\n return this.setLocaleNoSaveToStorage(this.defaultLocale);\n }\n\n get locale() {\n return this._locale;\n }\n\n get defaultLocale(): IBitfLanguage {\n const fromStorage = this.storageService.data.selectedLanguage;\n const navigatorLanguage = navigator.language;\n const navigatorLanguageShort = navigator.language.split('-')[0];\n const fromNavigator =\n CONSTANTS.SUPPORTED_LANGUAGES.find(lang => lang.code === navigatorLanguage) ||\n CONSTANTS.SUPPORTED_LANGUAGES.find(lang => lang.code.toLowerCase() === navigatorLanguageShort);\n const result = fromStorage || (fromNavigator ? fromNavigator : CONSTANTS.DEFAULT_LANGUAGE);\n\n return result;\n }\n\n async setLocale(locale: IBitfLanguage): Promise {\n await this.setLocaleNoSaveToStorage(locale);\n this.storageService.data = { selectedLanguage: this._locale };\n }\n\n async setLocaleNoSaveToStorage(locale: IBitfLanguage): Promise {\n this.localeChange$.next(locale.code);\n const localeCode = locale.code;\n const translateP = this.translateService.use(localeCode).toPromise();\n await this.registerLocale(localeCode);\n await translateP;\n\n // NOTE: _locale must be set at the end, because it is read from pipes and locale\n // data must be already loaded\n this._locale = locale;\n }\n\n async registerLocale(localeCode: string): Promise {\n const localeData = await this.loadLocale(localeCode);\n return registerLocaleData(localeData);\n }\n\n private async loadLocale(locale: string): Promise {\n const module = await import('../../../../../../locale/' + locale);\n return module.default;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { LocationStrategy, PathLocationStrategy } from '@angular/common';\nimport { Subject, Observable, merge, interval } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\nimport { environment } from '@env/environment';\nimport { IBitfLoggerParams } from '@interfaces';\nimport { StoreService } from '@services';\n\ntype EnhancedMessage = IBitfLoggerParams & {\n time: string;\n environment: string;\n appName: string;\n route: string;\n fullUrl: string;\n userId: string;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BitfLoggerService {\n private static readonly MAX_DELAY_MS = 5000;\n\n logEvents$: Observable = new Subject();\n flushLogEvents$ = new Subject();\n\n constructor(private locationStrategy: LocationStrategy, private storeService: StoreService) {\n if (environment.loggerConfig.sendLogs) {\n this.logEvents$ = merge(interval(10000), this.flushLogEvents$).pipe(debounceTime(2000));\n }\n }\n\n log(params: IBitfLoggerParams) {\n if (window['ClientJS']) {\n this.addToLogMessagesPipe(this.createLogObj(params));\n } else {\n this.loadClientJs().then(\n () => {\n this.addToLogMessagesPipe(this.createLogObj(params));\n },\n () => {\n this.addToLogMessagesPipe(this.createLogObj(params));\n }\n );\n }\n }\n\n private createLogObj(params: IBitfLoggerParams): EnhancedMessage {\n const route =\n this.locationStrategy instanceof PathLocationStrategy\n ? this.locationStrategy.path()\n : window.location.href;\n const fullUrl = window.location.href;\n\n let userId;\n if (this.storeService.store.user && this.storeService.store.user.id) {\n userId = this.storeService.store.user.id.toString();\n }\n const logObj: EnhancedMessage = {\n ...params,\n appName: environment.appName,\n environment: environment.name,\n route,\n fullUrl,\n time: new Date().toJSON(),\n userId,\n };\n if ((window as any).ClientJS) {\n const clientJs = new window['ClientJS']();\n const browserData = clientJs.getBrowserData();\n Object.assign(logObj, {\n browser: browserData.browser,\n os: browserData.os,\n device: clientJs.getDeviceType(),\n timeZone: clientJs.getTimeZone(),\n });\n }\n return logObj;\n }\n\n private addToLogMessagesPipe(message: EnhancedMessage) {\n const keyName = `${environment.appName}-logs`;\n const logs = localStorage.getItem(keyName);\n let logMessagesArray = [];\n if (logs) {\n logMessagesArray = JSON.parse(logs);\n }\n\n const isDuplicate = logMessagesArray.some(logMsg => this.messageEquals(message, logMsg));\n if (!isDuplicate) {\n logMessagesArray.unshift(message);\n }\n // Trim the array to avoid overflow\n if (logMessagesArray.length > environment.loggerConfig.maxLogRentention) {\n logMessagesArray.length = environment.loggerConfig.maxLogRentention;\n }\n localStorage.setItem(keyName, JSON.stringify(logMessagesArray));\n\n if (environment.loggerConfig.sendLogs) {\n this.flushLogEvents$.next();\n }\n\n if (!environment.production && message.level === 'ERROR') {\n console.error(message);\n }\n }\n\n private loadClientJs() {\n return new Promise((success, error) => {\n const script = document.createElement('script');\n script.type = 'text/javascript';\n script.src = 'https://cdnjs.cloudflare.com/ajax/libs/ClientJS/0.1.11/client.min.js';\n script.onload = success;\n script.onerror = error;\n document.body.appendChild(script);\n });\n }\n\n private messageEquals(msgA: EnhancedMessage, msgB: EnhancedMessage) {\n const elapsed = Math.abs(new Date(msgA.time).getTime() - new Date(msgB.time).getTime());\n if (elapsed <= BitfLoggerService.MAX_DELAY_MS) {\n const copyA = Object.assign({}, msgA);\n delete copyA.time;\n const copyB = Object.assign({}, msgB);\n delete copyB.time;\n\n return JSON.stringify(copyA) === JSON.stringify(copyB);\n }\n\n return false;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Meta, Title, MetaDefinition } from '@angular/platform-browser';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BitfMetadataService {\n titlePrefix = '';\n defaultTitle = '';\n titlePostfix = '';\n defaultDescription = '';\n\n constructor(private meta: Meta, private title: Title, private translateService: TranslateService) {}\n\n init() {\n this.loadTranslations();\n }\n\n setDefaultTitle() {\n if (this.defaultTitle) {\n this.setPageTitle(this.defaultTitle);\n }\n }\n\n setDefaultDescription() {\n if (this.defaultDescription) {\n this.updateMetaTags([{ name: 'description', content: this.defaultDescription }]);\n }\n }\n\n loadTranslations() {\n this.titlePrefix = this.translateService.instant('COMMON.META_TAGS.TITLE_PREFIX') || this.titlePrefix;\n this.defaultTitle = this.translateService.instant('COMMON.META_TAGS.DEFAULT_TITLE') || this.defaultTitle;\n this.titlePostfix = this.translateService.instant('COMMON.META_TAGS.TITLE_POSTFIX') || this.titlePostfix;\n this.defaultDescription =\n this.translateService.instant('COMMON.META_TAGS.DEFAULT_DESCRIPTION') || this.defaultDescription;\n }\n /**\n * Update the HTML Title\n *\n * @param string title\n * @return void\n */\n public async setPageTitle(titleToTranslate: string, extraTitle?: string) {\n const translatedTitlePrefix = this.titlePrefix && this.translateService.instant(this.titlePrefix);\n let translatedTitle = titleToTranslate && this.translateService.instant(titleToTranslate);\n if (!translatedTitle) {\n translatedTitle = this.defaultTitle;\n }\n const translatedTitlePostfix = this.titlePostfix && this.translateService.instant(this.titlePostfix);\n let fullTitle = translatedTitlePrefix;\n if (fullTitle) {\n fullTitle += ` ${translatedTitle}`;\n } else {\n fullTitle = translatedTitle;\n }\n if (fullTitle && extraTitle) {\n fullTitle += ` ${extraTitle}`;\n } else if (extraTitle) {\n fullTitle = extraTitle;\n }\n if (fullTitle && translatedTitlePostfix) {\n fullTitle += ` ${translatedTitlePostfix}`;\n }\n this.title.setTitle(fullTitle);\n }\n\n /**\n * Update the metaTags\n *\n * @param MetaDefinition[] metaTags\n * @return void\n */\n public updateMetaTags(metaTags: MetaDefinition[]) {\n metaTags.forEach(metaTag => {\n metaTag.content = this.translateService.instant(metaTag.content);\n this.meta.updateTag(metaTag);\n });\n }\n}\n","import { Injectable, ViewContainerRef, ComponentRef, Component } from '@angular/core';\nimport { MatSidenav } from '@angular/material/sidenav';\nimport { IBitfSidenavContent, IBitfCloseEvent } from '@interfaces';\nimport { Subject } from 'rxjs';\nimport { EBitfCloseEventStatus } from '@enums';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BitfMatSidenavGlobalService {\n sidenav: MatSidenav;\n sidenavContent: ViewContainerRef;\n initialised = false;\n\n componentRef: ComponentRef = null;\n subject: Subject> = new Subject>();\n\n constructor() {}\n\n init(sidenav: MatSidenav, sidenavContent: ViewContainerRef) {\n this.sidenav = sidenav;\n this.sidenavContent = sidenavContent;\n this.initialised = true;\n\n this.sidenav.closedStart.subscribe(() => this.close());\n }\n\n open(data: IBitfSidenavContent) {\n if (!this.initialised) {\n throw Error('sidenav: component not initialised yet!');\n }\n\n this.sidenavContent.clear();\n if (data.componentFactory) {\n this.componentRef = this.sidenavContent.createComponent(data.componentFactory);\n Object.assign(this.componentRef.instance, data.componentData || {});\n } else {\n throw Error('sidenav: Component factory not initialised');\n }\n\n Object.assign(this.sidenav, this.getDefaultOptions(), data.sidenavOptions);\n this.sidenav.open();\n this.completeAllSubject();\n\n return this.subject;\n }\n\n private getDefaultOptions() {\n return {\n mode: 'over',\n position: 'end',\n disableClose: true,\n };\n }\n\n close(sidenavEvent: IBitfCloseEvent = { status: EBitfCloseEventStatus.CLOSE }) {\n this.componentRef.destroy();\n this.sidenavContent.clear();\n this.sidenav.close();\n this.subject.next(sidenavEvent);\n }\n\n completeAllSubject() {\n this.subject.observers.forEach(observer => observer.complete());\n }\n}\n","export enum EBitfCloseEventStatus {\n OK,\n CANCEL,\n CLOSE,\n ERROR,\n}\n\nexport enum EBitfBrowser {\n OPERA = 'OPERA',\n FIREFOX = 'FIREFOX',\n SAFARI = 'SAFARI',\n SAFARI_MOBILE = 'SAFARI_MOBILE',\n IE = 'IE',\n EDGE = 'EDGE',\n CHROME = 'CHROME',\n BLINK = 'BLINK',\n NOT_DEFINED = 'NOT_DEFINED',\n}\n","export enum EBitfTouchEventType {\n UP = 'UP',\n DOWN = 'DOWN',\n}\n","export enum EBitfApiSortDirection {\n DESC = 'DESC',\n ASC = 'ASC',\n UNDEFINED = '',\n}\n\n// Note order matter\nexport enum EBitfUiMessageType {\n SUCCESS = 'SUCCESS',\n INFO = 'INFO',\n WARNING = 'WARNING',\n ERROR = 'ERROR',\n}\n\nexport enum EBitfUiMessageTarget {\n TOAST = 'TOAST',\n VALIDATION = 'VALIDATION',\n DIALOG = 'DIALOG',\n CONSOLE = 'CONSOLE',\n FULL_SCREEN = 'FULL_SCREEN',\n ERROR_PAGE = 'ERROR_PAGE',\n}\n\nexport enum EBitfApiCallStateActions {\n UPDATE = 'UPDATE',\n UPDATE_API_CALL_STATE = 'UPDATE_API_CALL_STATE',\n RESET_ALL_FILTERS = 'RESET_ALL_FILTERS',\n}\n","export enum EBitfParsers {\n BITF_APP_PARSER = 'appParser',\n BITF_REST_PARSER = 'restParser',\n BITF_DEFAULT_PARSER = 'defaultParser',\n BITF_MOCK_DB_PARSER = 'mockDbParser',\n BITF_MONGO_PARSER = 'mongoParser',\n BITF_ODATA_PARSER = 'oDataParser',\n BITF_SQL_PARSER = 'sqlParser',\n}\n","export enum EBitfGraphQlParsers {\n BITF_GRAPH_QL_PARSER = 'graphQlParser',\n BITF_PIMCORE_PARSER = 'pimcoreParser',\n BITF_STRAPI_GRAPHQL_PARSER = 'strapiGraphQlParser',\n}\n","export enum EBitfGraphQlQueryOperator {\n AND = '$and',\n OR = '$or',\n LIKE = '$like',\n NOT = '$not',\n GREATER = '$gt',\n GREATER_EQUAL = '$gte',\n LOWER = '$lt',\n LOWER_EQUAL = '$lte',\n EQUAL = 'IM_NOT_AN_OPERATOR',\n}\n","export enum EBitfStrapiGraphQlQueryOperator {\n AND = 'and',\n OR = 'or',\n NOT = 'not',\n EQUAL = 'eq',\n NOT_EQUAL = 'ne',\n STARTS_WITH = 'startsWith',\n ENDS_WITH = 'endsWith',\n CONTAINS = 'contains',\n NOT_CONTAINS = 'notContains',\n CONTAINSI = 'containsi',\n NOT_CONTAINSI = 'notContainsi',\n GREATER = 'gt',\n GREATER_EQUAL = 'gte',\n LOWER = 'lt',\n LOWER_EQUAL = 'lte',\n NULL = 'null',\n NOT_NULL = 'notNull',\n IN = 'in',\n NOT_IN = 'notIn',\n BETWEEN = 'between',\n}\n","export enum EBitfLoaderAction {\n SHOW = 'show',\n HIDE = 'hide',\n}\n","export enum EBitfInterceptors {\n BITF_API_ERRORS_INTERCEPTOR = 'BitfApiErrorsInterceptor',\n BITF_API_UI_MESSAGES_INTERCEPTOR = 'BitfApiUiMessagesInterceptor',\n BITF_LANGUAGE_INTERCEPTOR = 'BitfLanguageInterceptor',\n BITF_OAUTH_INTERCEPTOR = 'BitfOAuthInterceptor',\n BITF_API_ENVELOPE_MAPPER_INTERCEPTOR = 'BitfApiEnvelopeMapperInterceptor',\n BITF_RETRY_INTERCEPTOR = 'BitfRetryInterceptor',\n BITF_RENEW_TOKEN_INTERCEPTOR = 'BitfRenewTokenInterceptor',\n}\n","export enum EBitfToastVerticalPosition {\n TOP = 'top',\n BOTTOM = 'bottom',\n}\n\nexport enum EBitfToastHorizontalPosition {\n START = 'start',\n CENTER = 'center',\n END = 'end',\n LEFT = 'left',\n RIGHT = 'right',\n}\n","export enum EBitfSidenavPosition {\n START = 'start',\n LEFT = 'left',\n END = 'end',\n RIGHT = 'right',\n}\n\nexport enum EBitfSidenavMode {\n OVER = 'over',\n PUSH = 'push',\n SIDE = 'side',\n}\n","export enum EBitfAuthState {\n TO_BE_LOGGED = 'TO_BE_LOGGED',\n LOGIN_IN_PROGRESS = 'LOGIN_IN_PROGRESS',\n TOKEN_RETRIEVED = 'TOKEN_RETRIEVED',\n LOGGED = 'LOGGED',\n LOGIN_ERROR = 'LOGIN_ERROR',\n LOGIN_INFO = 'LOGIN_INFO',\n EMAIL_NOT_VERIFIED = 'EMAIL_NOT_VERIFIED',\n NOT_AUTHORISED = 'NOT_AUTHORISED',\n}\n","export enum EBitfStoreActions {\n CREATE = 'CREATE',\n UPDATE = 'UPDATE',\n RESET = 'RESET',\n SET_USER = 'SET_USER',\n UPDATE_USER = 'UPDATE_USER',\n BREAKPOINT = 'BREAKPOINT',\n SET_AUTH_TOKEN = 'SET_AUTH_TOKEN',\n}\n","export enum EBitfPQueryComparators {\n EQUAL = 0,\n GREATER = 1,\n LOWER = 2,\n CONTAINS = 3,\n IN = 4,\n GREATEREQUAL = 5,\n LOWEREQUAL = 6,\n}\n","export enum EBitfPQueryOperator {\n AND,\n OR,\n}\n","export enum EBitfApiRequestPartsNames {\n HEADERS = 'headers',\n QUERY_PARAMS = 'queryParams',\n ACTION_PARAMS = 'actionParams',\n QUERY = 'query',\n SEARCH = 'search',\n FILTER = 'filter',\n EMBED = 'embed',\n COMPUTED_FIELDS = 'computedFields',\n SORTING = 'sorting',\n DATA = 'data',\n PAGINATION = 'pagination',\n}\n","export enum BitfESwitchType {\n CHECKBOX = 'CHECKBOX',\n SWITCH = 'SWITCH',\n}\n","export const bitfStripEmptyProps = (object: any) => {\n if (!object) {\n return {};\n }\n const newObj: any = {};\n for (const prop in object) {\n if (\n object.hasOwnProperty(prop) &&\n object[prop] !== null &&\n object[prop] !== undefined &&\n (!(object[prop] instanceof Array) || object[prop].length)\n ) {\n newObj[prop] = object[prop];\n }\n }\n return newObj;\n};\n\nexport const bitfGetProp = (obj, ...p) => p.reduce((a, c) => Object(a)[c], obj);\n\nexport const bitfIsStrictObject = (object: any): boolean => {\n if (!object) {\n return false;\n }\n return object !== null && !Array.isArray(object) && typeof object === 'object';\n};\n","// NOTE: use this function everytime you use a label to translate inside a .ts\n// without call translateService\n// it's needed by the translate extractor to generate the json\n// e.g. const title = bitfToTranslate('COMMON.TITLE')\nexport function bitfToTranslate(str: string) {\n return str;\n}\n","import { UntypedFormControl } from '@angular/forms';\n\n// https://github.com/angular/angular/blob/e96b3793852ebfd79a54a708363691b11818b4a0/packages/forms/src/validators.ts#L98\n// NOTE changed last * into + to make an email like aaa@bbb not valid (it needs at least a \"bbb.co\")\n// eslint-disable-next-line max-len\nexport const bitfEmailRegex = /^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/;\n\nexport function bitfValidateEmail(formControl: UntypedFormControl) {\n const reg = new RegExp(bitfEmailRegex);\n const value = formControl.value && formControl.value.trim ? formControl.value.trim() : formControl.value;\n return reg.test(value) ? false : { email: true };\n}\n","import { EventEmitter } from '@angular/core';\nimport {\n UntypedFormControl,\n ValidatorFn,\n AbstractControlOptions,\n AsyncValidatorFn,\n Validators,\n} from '@angular/forms';\n\nimport { merge, timer } from 'rxjs';\nimport { debounce, tap } from 'rxjs/operators';\n\nimport { bitfIsStrictObject } from '@bitf/utils/bitf-objects.utils';\nimport { BitfTryCatch } from '../decorators/bitf-try-catch.decorator';\nimport { IBitfFormControlValidator } from './bitf-form-control-validator.interface';\nimport { EBitfFormControlValidatorsKeys } from './bitf-form-control-validators.enum';\n\nimport { IBitfFormControlTranslations } from '@interfaces';\nimport { CONSTANTS } from '@constants';\nimport { bitfValidateEmail } from '../../validators/bitf-email.validator';\n\nexport class BitfFormControl extends UntypedFormControl {\n // NOTE: here are standard formControl validators\n private staticValidators: ValidatorFn[] = [];\n // NOTE: validators which we can control - add / remove\n private dynamicValidators: IBitfFormControlValidator[] = [];\n\n private validationMessages: any = { ...CONSTANTS.VALIDATION_MESSAGES };\n\n // validation\n isInvalid = false;\n validationErrors: IBitfFormControlTranslations;\n\n constructor(\n formState: any = null,\n validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null,\n asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\n ) {\n super(formState, validatorOrOpts, asyncValidator);\n this.setStaticValidators(validatorOrOpts);\n this.initValidation();\n }\n\n // NOTE: This function will be called from bitf form item component to add validators that comes from\n // formItemConfig validators. This can also be called programmatically to add / remove validators at runtime\n // based on some conditions\n setDynamicValidator(\n formItemValidator: IBitfFormControlValidator | Array,\n opts?: {\n onlySelf?: boolean;\n emitEvent?: boolean;\n }\n ) {\n if (Array.isArray(formItemValidator)) {\n formItemValidator.forEach(dynamicValidatorItem => {\n this.addDynamicValidator(dynamicValidatorItem);\n });\n } else {\n this.addDynamicValidator(formItemValidator);\n }\n\n this.applyValidators(opts);\n }\n\n // NOTE: We can remove only validators added from formItemConfig (which is calling setDynamicValidator)\n // not via formBuilder in the constructor because they don't have the key\n removeDynamicValidator(key: EBitfFormControlValidatorsKeys) {\n this.dynamicValidators = this.dynamicValidators.filter(dynamicValidator => dynamicValidator.key !== key);\n this.applyValidators();\n }\n\n addStaticValidator(validator: ValidatorFn) {\n this.staticValidators.push(validator);\n this.applyValidators();\n }\n\n // NOTE: this will be used to remove validators added when the formControl is created via form builder\n // we can u se only his position index in the array because there is no key available for those validators\n removeStaticValidator(validatorIndex: number) {\n if (this.staticValidators.length <= validatorIndex) {\n return;\n }\n this.staticValidators.splice(validatorIndex, 1);\n this.applyValidators();\n }\n\n markAsDirty() {\n const wasDirty = this.dirty;\n super.markAsDirty();\n if (!wasDirty) {\n (this.statusChanges as EventEmitter).emit(this.status);\n }\n }\n\n markAsTouched() {\n const wasTouched = this.touched;\n super.markAsTouched();\n if (!wasTouched) {\n (this.statusChanges as EventEmitter).emit(this.status);\n }\n }\n\n initValidation() {\n merge(this.statusChanges, this.valueChanges)\n .pipe(\n debounce(() => timer(100)),\n tap(() => setTimeout(() => this.validate()))\n )\n .subscribe();\n }\n\n @BitfTryCatch()\n validate() {\n this.isInvalid = this.invalid && this.dirty;\n\n if (!this.isInvalid) {\n this.validationErrors = undefined;\n return;\n }\n\n const keys: Array = [];\n const params: any = {};\n\n Object.keys(this.errors).forEach(key => {\n if (!this.validationMessages[key]) {\n throw new Error(\n `Translation for validator ${key} is missing, add it in COMMON/CONSTATS or WEB/CONSTANTS`\n );\n }\n\n keys.push(this.validationMessages[key]);\n Object.assign(params, this.errors[key]);\n });\n\n this.validationErrors = {\n keys,\n params,\n };\n }\n\n private setStaticValidators(\n validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null\n ): void {\n const validator = (bitfIsStrictObject(validatorOrOpts) &&\n (validatorOrOpts as AbstractControlOptions).validators\n ? (validatorOrOpts as AbstractControlOptions).validators\n : validatorOrOpts) as ValidatorFn | ValidatorFn[] | null;\n\n if (!validator) {\n return;\n }\n\n this.staticValidators = Array.isArray(validator) ? validator : [validator] || [];\n }\n\n private addDynamicValidator(newDynamicValidator: IBitfFormControlValidator) {\n const dynamicValidatorIndex = this.dynamicValidators.findIndex(\n dynamicValidator => dynamicValidator.key === newDynamicValidator.key\n );\n\n if (dynamicValidatorIndex !== -1) {\n this.dynamicValidators[dynamicValidatorIndex] = newDynamicValidator;\n } else {\n this.dynamicValidators.push(newDynamicValidator);\n }\n\n // NOTE: this should not happend since the BE can't send customValidato functions, left here as reference\n // if (newDynamicValidator.customValidationMessage) {\n // this.addCustomValidationMesasge({\n // [newDynamicValidator.key]: newDynamicValidator.customValidationMessage,\n // });\n // }\n }\n\n // NOTE: this should not happend since the BE can't send customValidato functions, left here as reference\n // private addCustomValidationMesasge(customValidaionMessage: { [key: string]: string }) {\n // Object.assign(this.validationMessages, customValidaionMessage);\n // }\n\n private applyValidators(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n const validators: Array = [...this.staticValidators, ...this.proccessDynamicValidators()];\n this.setValidators(validators);\n this.updateValueAndValidity(opts);\n }\n\n private proccessDynamicValidators(): Array {\n if (!this.dynamicValidators.length) {\n return [];\n }\n\n return this.dynamicValidators.map((dynamicValidator: IBitfFormControlValidator) => {\n const { key, params, customValidator } = dynamicValidator;\n\n return customValidator\n ? this.getValidatorFn(customValidator, params)\n : this.getAngularValidator(key, params);\n });\n }\n\n private getValidatorFn(validationFunction, params = null): ValidatorFn {\n return (params ? validationFunction(...params) : validationFunction) as ValidatorFn;\n }\n\n @BitfTryCatch()\n private getAngularValidator(validatorKey: EBitfFormControlValidatorsKeys, params: any): ValidatorFn {\n try {\n params = Array.isArray(params) ? params : params ? [params] : undefined;\n\n if (validatorKey === EBitfFormControlValidatorsKeys.email) {\n return bitfValidateEmail as ValidatorFn;\n }\n\n return this.getValidatorFn(Validators[validatorKey], params);\n } catch (e) {\n throw Error(`Incorrect validatorKey, function ${validatorKey} doesnt exist in Angular Validators`);\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { UntypedFormBuilder, ValidatorFn, AbstractControlOptions, AsyncValidatorFn } from '@angular/forms';\nimport { BitfFormControl } from './bitf-form-control';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BitfFormBuilderService extends UntypedFormBuilder {\n control(\n formState: any,\n validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null,\n asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\n ): BitfFormControl {\n return new BitfFormControl(formState, validatorOrOpts, asyncValidator);\n }\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { CONSTANTS } from '@constants';\n\nimport { TranslateService } from '@ngx-translate/core';\n\nimport { IBitfFormControlTranslations } from './bitf-form-control-translate.interface';\n\n@Injectable()\n@Pipe({\n name: 'bitfFormControlTranslate',\n})\nexport class BitfFormControlTranslatePipe implements PipeTransform {\n constructor(private translateService: TranslateService) {}\n\n transform(errors: IBitfFormControlTranslations): any {\n if (!errors) {\n return '';\n }\n if (errors?.keys) {\n // NOTE: Used for form-item component\n // errors will have this shape, defined in bitf form control\n // this.validationErrors = {\n // keys = [],\n // params = {},\n // };\n return errors.keys.map(key => this.translateService.instant(key, errors.params)).join(', ');\n } else {\n // NOTE: Used for default Angular errors\n return Object.keys(errors)\n .map(key => this.translateService.instant(CONSTANTS.VALIDATION_MESSAGES[key], errors[key]))\n .join(', ');\n }\n }\n}\n","import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule, UntypedFormBuilder } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\n\nimport { BitfFormBuilderService } from '@common/libs/bitforce/core/form';\nimport { BitfFormControlTranslatePipe } from '@common/libs/bitforce/pipes/translate/bitf-form-control-translate.pipe';\n\nconst SHARED_MODULES = [CommonModule, ReactiveFormsModule, FormsModule, TranslateModule];\nconst SHARED_COMPONENTS = [];\nconst SHARED_DIRECTIVES = [];\nconst SHARED_BITF_COMPONENTS = [];\nconst SHARED_PIPES = [BitfFormControlTranslatePipe];\nconst PROVIDERS = [[{ provide: UntypedFormBuilder, useClass: BitfFormBuilderService }]];\n\n@NgModule({\n imports: [...SHARED_MODULES],\n exports: [\n ...SHARED_MODULES,\n ...SHARED_COMPONENTS,\n ...SHARED_DIRECTIVES,\n ...SHARED_BITF_COMPONENTS,\n ...SHARED_PIPES,\n ],\n declarations: [...SHARED_COMPONENTS, ...SHARED_DIRECTIVES, ...SHARED_BITF_COMPONENTS, ...SHARED_PIPES],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n providers: [...PROVIDERS],\n})\nexport class CommonSharedModule {\n // This should only be called inside the CoreModule!\n}\n","const baseApiUrl = 'https://markwins.sintra-soh.com/';\nconst apiUrl = `${baseApiUrl}`;\nconst graphQlUrl =\n 'https://markwins.sintra-soh.com/pimcore-graphql-webservices/packagingInformation?apikey=ff8aff57d36f9977c47eb2db2400ccf4';\n\nexport const environment = {\n production: true,\n name: 'production',\n appName: 'Bitf angular boilerplate',\n storageVersion: '1.0.0',\n apiUrl,\n graphQlUrl,\n authInterceptorUrls: [apiUrl, graphQlUrl],\n mockApiUrl: 'https://localhost:3002/',\n logUrl: '',\n sockets: { url: '' },\n httpRetryConfig: {\n enabled: true,\n verbs: {\n get: { enabled: true, timeout: 6000, maxRetries: 2, retryForStatusesCodes: [500] },\n post: { enabled: false, timeout: null, maxRetries: 1, retryForStatusesCodes: [500] },\n patch: { enabled: false, timeout: null, maxRetries: 1, retryForStatusesCodes: [500] },\n put: { enabled: false, timeout: null, maxRetries: 1, retryForStatusesCodes: [500] },\n delete: { enabled: false, timeout: null, maxRetries: 1, retryForStatusesCodes: [500] },\n },\n },\n graphQlConfig: {\n enabled: true,\n requestTimeout: 5000,\n },\n loggerConfig: {\n enabled: true,\n maxLogRentention: 20,\n logHttpErrorsWithStatusesCodes: ['0', '4XX', '5XX'],\n logDecoratedExceptions: true,\n logExceptions: true,\n saveLogMessagesInterval: 30000,\n logUrl: '',\n sendLogs: false,\n sendRequestBody: false,\n sendQueryParams: false,\n },\n tagManager: {\n enabled: false,\n apiKey: '',\n },\n registerServiceWorker: false,\n};\n","// IMPORTANT: THIS FILE IS AUTO GENERATED! DO NOT MANUALLY EDIT!\n/* tslint:disable */\nexport const APP_VERSION = '1.0.0';\nexport const APP_NAME = 'markwins';\nexport const FILE_HASH = '1659018607777';\nexport const BUILD_DATE = '2022-07-28T14:30:07.777Z';\n/* tslint:enable */\n","var map = {\n\t\"./de\": [\n\t\t7439,\n\t\t\"src_locale_de_ts\"\n\t],\n\t\"./de.ts\": [\n\t\t7439,\n\t\t\"src_locale_de_ts\"\n\t],\n\t\"./en\": [\n\t\t708,\n\t\t\"src_locale_en_ts\"\n\t],\n\t\"./en.ts\": [\n\t\t708,\n\t\t\"src_locale_en_ts\"\n\t],\n\t\"./es\": [\n\t\t230,\n\t\t\"src_locale_es_ts\"\n\t],\n\t\"./es.ts\": [\n\t\t230,\n\t\t\"src_locale_es_ts\"\n\t],\n\t\"./fr\": [\n\t\t4710,\n\t\t\"src_locale_fr_ts\"\n\t],\n\t\"./fr.ts\": [\n\t\t4710,\n\t\t\"src_locale_fr_ts\"\n\t],\n\t\"./it\": [\n\t\t5111,\n\t\t\"src_locale_it_ts\"\n\t],\n\t\"./it.ts\": [\n\t\t5111,\n\t\t\"src_locale_it_ts\"\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(() => {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = () => (Object.keys(map));\nwebpackAsyncContext.id = 4887;\nmodule.exports = webpackAsyncContext;"]}