@flowfuse/flowfuse 2.27.2-c8dedce-202603061540.0 → 2.27.2-c8dedce-202603091032.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/frontend/dist/app/main.04644232882c9fc8d0dd.css.map +1 -1
- package/frontend/dist/app/{main.092167274868f11476f9.js → main.4f5b35eea9509401862b.js} +1 -1
- package/frontend/dist/app/{main.092167274868f11476f9.js.map → main.4f5b35eea9509401862b.js.map} +1 -1
- package/frontend/dist/app/setup.9a2a29151ff05c13f3b5.css.map +1 -1
- package/frontend/dist/app/{setup.aad963648c3fbae6bd6e.js → setup.d32218b2655dfd454d7f.js} +1 -1
- package/frontend/dist/app/{setup.aad963648c3fbae6bd6e.js.map → setup.d32218b2655dfd454d7f.js.map} +1 -1
- package/frontend/dist/index.html +1 -1
- package/frontend/dist-setup/setup.html +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.04644232882c9fc8d0dd.css","mappings":"AAIA,EACI,sBAGJ,wBACI,aACA,uHACA,+HAGJ,KACI,+MACA,eACA,oBAGJ,KACI,SACA,aCTU,CDUV,kBACA,gBAGJ,GACI,iBACA,cENU,CFOV,mBACA,kBEhBS,CFmBb,GACI,iBACA,gBEdU,CFeV,qBACA,iBEzBS,CF4Bb,GACI,cErBU,CFsBV,oBACA,iBE/BS,CFgCT,iBAGJ,GACI,cE5BU,CF6BV,sBACA,iBEtCS,CFuCT,gBAGJ,KACI,iBE3CS,CF4CT,yBACA,WE5CS,CF+Cb,OACI,cAGJ,gBACI,gBE9CU,CF+CV,aC1DU,CELd,SACE,WACA,YACA,qBAGF,aACE,oBACA,WAGF,YACE,WACA,YACA,qBAGF,YACE,WACA,YACA,qBAGF,YACE,WACA,WACA,YACA,qBAOF,mBACE,aACA,mBACA,qBACE,aFGU,CEFV,iBACA,kBACA,oBACA,mBACA,2BACE,0BAKN,gCACE,aFzCY,CE0CZ,iBACA,kBACA,oBACA,mBAQF,gCAEE,WACA,YAEF,mBACE,iBACA,gBD5DW,CC8Db,oBACE,eD/DW,CCgEX,kBAGF,QACE,iBDpEW,CCqEX,aACA,mBACA,gBDhEY,CCiEZ,iBACA,YACA,kBAEA,uBACA,iBACA,YACA,iBACA,SAEA,oBACE,gBAGF,qBACE,gBACA,gBDlFU,CCmFV,iBACA,YAGF,sBACE,gBACA,gBDzFU,CC0FV,iBACA,YAGF,sBACE,uBAGF,cACE,eAGF,iBACE,wBFhEY,CEiEZ,yBACA,aFvHS,CEwHT,+CACE,wBFtEU,CEyEd,mBACE,qBF/HO,CEgIP,aFzEY,CE0EZ,yBACA,mDACE,wBF9EU,CE+EV,oBF/EU,CEgFV,UFrIK,CEwIT,kBACE,aFlFY,CEmFZ,iDACE,wBFtFU,CEuFV,UF5IK,CE8IP,+BACE,0CAGJ,gBACE,UFnJO,CEoJP,wBFlIS,CEmIT,yBACA,sBACE,wBFnIO,CEoIP,UFxJK,CE2JT,0BACE,aF1IS,CE2IT,qBF7JO,CE8JP,yBACA,gCACE,wBF5IO,CE6IP,UFjKK,CEoKT,yBACE,aFnJS,CEoJT,+BACE,wBFnJO,CEoJP,UFxKK,CE6KP,0EAEE,WACA,YAEF,wCACE,gBD1KO,CC4KT,yCACE,eD7KO,CCkLT,oCACE,kBAEF,yCACE,OACA,iBDpLO,CCsLT,yCACE,QACA,kBDxLO,CC4LX,wCAEE,mBACA,oBFvMU,CEwMV,aFtMU,CEuMV,wBFzMU,CEiNd,qCAEI,gCACE,cACA,eAEF,iCACE,cACA,gBAUN,yBAEI,gCACE,cACA,eAEF,iCACE,cACA,gBASN,eACE,kBACA,mBACE,WACA,eACA,yBACE,YFpNQ,CEwNV,0BACE,YFzNQ,CE8Nd,kBACE,aF/PY,CEgQZ,kBACA,SACA,yBACA,aACA,UACA,mDACA,qBACE,gBACA,mBACA,2CACE,aFlQO,CEqQX,wBACE,OAEF,yBACE,wBAIJ,kBACE,WACA,wBF7RY,CE8RZ,gBAMF,iBACE,4BACA,sBACA,uBACE,eACA,wBFzSU,CE2SZ,wBACE,wBF7SU,CE+SZ,qDACE,oBACA,iEACE,WAUJ,wBACE,yBACA,iBDvTS,CCwTT,YACA,WACA,aACA,QACA,mBACA,qBFvUO,CEwUP,oBFnUU,CEoUV,4BACE,WACA,YACA,eDlUO,CCoUT,8BACE,YACA,gBACA,iBDvUO,CCwUP,gBACA,YACA,eACA,YACA,wCACE,wBFrVK,CEsVL,aFnVM,CEqVR,4CACE,YACA,aAGJ,qCACE,oBFtTQ,CEuTR,iBACA,aACA,yCACE,gBAON,+BACE,oBF1VS,CE2VT,iBACA,aAIJ,aACE,kBACA,qBACA,eACA,4BACE,mBACA,wBFtXS,CEuXT,aFnXU,CEqXZ,mCACE,sBACA,yBACA,iBDpXS,CCqXT,gBACA,YACA,WACA,aACA,8BACA,UAEA,8DACE,cACA,mBACA,gBACA,uBAGF,qDACE,cAGJ,kCACE,kBACA,SACA,aACA,iBACA,gBACA,mDACA,sDACE,gBACA,wBFxZO,CEyZP,gCACA,eACA,2BACA,4DACE,wBF5ZM,CE+ZV,kEACE,WACA,2BAEF,2DACE,iBACA,eACA,+EACE,kBD7ZK,CCgaT,kEACE,OAEF,mEACE,QAIF,qDACE,4BACA,6BAEF,oDACE,cACA,UAKN,2BAEE,kBACA,kBACA,aACA,eACA,oIACE,aAEF,uCACE,eACA,gBACA,kBACA,oBAGF,+CACE,kBACA,MACA,OACA,YACA,WACA,gBACA,kBACA,+BACA,iBACA,oBFpdU,CEudV,qGACE,wBF1dQ,CE8dV,iIACE,wBF5dQ,CE+dZ,yDACE,mBACA,kIACE,aFneQ,CEseZ,6DACE,oBAGA,2EACE,wBFzeQ,CE0eR,oBFzeQ,CE2eV,uFACE,cAMJ,6BACE,WACA,aACA,kBACA,WACA,QACA,UACA,YACA,kBACA,yBACA,gCACA,4BACA,wBAQJ,kBACI,wBACA,4BACA,kBACA,qBACA,6BACA,YACA,eACA,wBACE,aAEF,mDACE,wBF9eQ,CEgfV,4EACE,yDACA,qDACA,iDAEF,iCACE,mBACA,0DACE,oBACA,wBFliBM,CEoiBR,0DACE,wBFviBK,CEyiBP,qCACE,aFviBM,CE4iBd,yBACI,kBACA,MACA,OACA,QACA,SACA,wBFjjBU,CEkjBV,mBACA,uBACA,eACA,6BACE,YACA,WACA,YAEF,+BACE,oCAIN,yBACI,kBACA,WACA,YACA,WACA,SACA,WACA,sBACA,kBACA,uBACA,eAQF,sCACE,cAEF,wCACE,cACA,gBAEF,4CACE,aACA,0DACE,mBD9kBQ,CCklBV,wDACE,cACA,kBDrlBQ,CCwlBZ,sCACE,aACA,oDACE,cACA,kBD5lBQ,CCkmBZ,wBACE,kBACA,MACA,OACA,YACA,WACA,kBACA,+BACA,yBACA,yDAIJ,mBACE,aACA,eACA,ODznBW,CC0nBX,6CACE,mCACA,aACA,sBACA,qBFzoBO,CE0oBP,kBACA,yBACA,iBDloBS,CCmoBT,kBACA,YACA,gDACE,gBACA,eACA,kBACA,mDACE,mBAGJ,wDACE,eAEF,qDACE,aACA,8BACA,mBACA,wDACE,eAEF,wDACE,aACA,mBACA,ODzpBK,CC0pBL,kBDxpBK,CCypBL,SACA,4DACE,WACA,YACA,YFrqBI,CEsqBJ,2FACE,eACA,YFjoBE,CEkoBF,iGACE,YF1nBE,CEgoBZ,oDACE,kBACA,uDACE,SACA,iBAEF,0DACE,gBD3qBM,CC8qBV,0DACE,YACA,cDvrBO,CCwrBP,eDxrBO,CCyrBP,6BAEF,mDACE,cD3rBO,CC4rBP,eD5rBO,CC6rBP,6BACA,uDACE,aACA,8BACA,WACA,iBDnsBK,CCosBL,kEACE,gBAIN,iFACE,eACA,gDAEF,oDACE,gDACA,0FACE,oCAGJ,sDACE,WAQN,eACE,WACA,kBACA,oBACA,wBACE,kBACA,aACA,QACA,yBAEF,qCACE,YACA,WACA,YACA,kBAEF,wBACE,aACA,QAEF,qBACE,yBACA,iBACA,WAEE,mDACE,cAEF,sDACE,cAEF,yHAEE,SAEF,sDACE,kBAEF,qDACE,mBAGJ,2BACE,gBAEE,gFACE,2BAEF,+EACE,4BAGJ,gDACE,iBACA,wBFzxBM,CE0xBN,gBACA,0CACA,kDAEE,6DACE,aACA,8BACA,ODzxBC,CC2xBH,kEACE,WAEF,+DACE,wBFtyBE,CEuyBF,eACA,wEACE,WAIN,uDACE,wBF9yBI,CE+yBJ,4EACE,UAQF,8DACE,gBACA,mBACA,UAKF,+DACE,gCAKF,+EACE,wBACA,wBFx0BE,CEy0BF,2FACE,8BAEF,0FACE,+BAKR,gDACE,kBACA,sBACA,0DACE,wBFx1BG,CE01BL,+DACE,kBACA,aFx1BI,CE21BR,qJAEE,eACA,aF1zBM,CE2zBN,wBFn2BK,CEq2BP,qFACE,+BACA,cAKJ,uBACE,yBACA,mBACA,oBF52BQ,CE62BR,mCACE,sBAEF,kCACE,uBAGJ,4BACE,aACA,SACA,yBAKN,uGAGI,eAGJ,aACE,WACA,kBACA,kBACE,qBACA,YACA,aFp2BU,CEq2BV,sBACA,oBACA,yBACA,aACA,0BACA,wBACE,eACA,aF12BQ,CEk3Bd,qBACE,eACA,YACA,MACA,OACA,WACA,YACA,uBACA,uBACA,kBACA,mCACA,2BACE,aAEF,6BACE,aAIJ,eACE,kBACA,UACA,WACA,gBACA,iBACA,aACA,sBACA,qBFx7BS,CEy7BT,gBACA,cAEE,iCACE,YACA,iBACA,wBFr7BQ,CEs7BR,gCACA,eACA,UFl8BK,CEm8BL,gBACA,aACA,8BACA,SAEF,oCACE,YACA,cAEF,kCACE,cD17BQ,CC27BR,cACA,gBAEF,kCACE,aACA,yBACA,2BACA,0CACE,gBDp8BM,CCw8BZ,qBACE,gBAUA,4BACE,YF17BQ,CEm8Bd,sBACE,wBF59BW,CE69BX,UFj/BS,CEk/BT,gBACA,gBACA,iBD1+BW,CC2+BX,gBDp+BY,CCu+Bd,uBACE,kBACA,qBF1/BS,CE2/BT,yBACA,yBACA,gDACA,0BACA,gBAEA,4BACE,YACA,SDx/BS,CCy/BT,sBACA,cACA,kBACA,MACA,OAGF,6BACE,oBFtgCU,CEugCV,yDACE,wBFxgCQ,CE2gCZ,gCACE,oBFjgCS,CEkgCT,4DACE,wBFngCO,CEsgCX,qCACE,oBF19BW,CE29BX,iEACE,wBF59BS,CEg+Bb,gCACE,aACA,+BACA,QDrhCS,CCshCT,oCACE,gBAIJ,8BACE,eACA,kBACA,aACA,gBACA,kCACE,kBACA,UACA,YAEF,iDACE,UAEF,oCACE,aFhgCU,CEogCd,gCACE,cD/iCS,CCijCT,aACA,yBAOJ,mBACE,UAHe,CAIf,WAJe,CAKf,kBACA,MACA,OACA,gBAGF,eACE,UACA,YACA,kBACA,eFjlCS,CEklCT,yBAGF,mBACE,0BACA,4BACA,YACA,kBAGF,kBACE,4BACA,YACA,iBACA,SACA,UAGF,gBACE,UACA,YACA,kBACA,YACA,UACA,mBAGF,gBACE,0BACA,+BAGF,gBACE,aACA,oBAGF,gBACE,aACA,oBAOF,SACE,aACA,aFxnCY,CEynCZ,wBACE,aACA,mBACA,QACA,WD5nCS,CC6nCT,8BACE,aF9lCQ,CE+lCR,eAEF,qCACE,YACA,WACA,cACA,cAEF,sCACE,mBAGJ,6BACE,mBACA,4CACE,gBD9oCO,CC+oCP,iIAEE,gCAIN,2BACE,sBACA,0CACE,qBD1pCO,CC2pCP,2BACA,iBD1pCO,CC2pCP,6HAEE,8BAIN,6DAEE,aFpoCU,CE2oCd,iBACE,kBACA,aACA,mBAIE,uEACE,gBACA,uBACA,YAKF,kEACE,cAGF,8EACE,gBACA,kBACA,uBACA,qBACA,wBAGA,iGACE,aAKN,4CACE,OACA,YAGF,2CACE,kBACA,MACA,SACA,aACA,mBACA,uBACA,WDxtCS,CCytCT,gBACA,YACA,+BACA,aF/tCU,CEguCV,eACA,WACA,wBAEA,oDACE,WACA,YAEA,mEACE,kBAIJ,iDACE,kBFlvCQ,CEmvCR,aF7uCQ,CE8uCR,oBFjvCQ,CEovCV,kDACE,kBFvvCQ,CE0vCV,iDACE,OACA,+BACA,iBAGF,kDACE,QACA,8BACA,kBAIJ,wCACE,kBACA,qBAEA,8CACE,kBACA,OACA,MACA,SAGF,+CACE,kBACA,QACA,MACA,SAIJ,oCACE,kBACA,qBACA,gBACA,yBACA,kBACA,sCACA,YACA,gBACA,gBAEA,0CACE,OAGF,2CACE,QAIJ,yCACE,aACA,mBACA,QACA,gBACA,aF7yCU,CE8yCV,qCAEA,sDACE,YACA,WACA,cACA,cAGF,uDACE,mBACA,gBACA,uBACA,YAGF,+CACE,kBFt0CQ,CEu0CR,aF/xCQ,CEgyCR,eAGF,iDACE,kBF50CQ,CE60CR,aFryCQ,CEsyCR,eAGF,4DACE,aF3yCQ,CE4yCR,kBFlzCO,CEqzCT,qDACE,0BAGF,oDACE,0BAGF,oDACE,kBAQN,YACE,kBACA,YACA,mBACA,4BACA,mBACA,sBACA,WACA,iBACA,kBACA,UACA,oBACA,uBACA,+BAEE,oCACE,YACA,kBACA,QACA,WACA,gBACA,iBACA,mBACA,4DAIF,mCACE,YACA,kBACA,QACA,UACA,gBACA,iBACA,mBACA,4DAGJ,2BACE,2BACA,kCACE,YACA,kBACA,SACA,SACA,iBACA,iBACA,mBACA,4DAGJ,8BACE,2BACA,qCACE,YACA,kBACA,YACA,SACA,iBACA,iBACA,mBACA,4DAGJ,qBACE,UAGJ,sBACE,kBACA,sBACA,wCACE,UAIJ,YACE,qBACA,WACA,YACA,aFn7CY,CEo7CZ,mBACE,qBANJ,YAQE,uCACA,+CACA,gBACE,GACE,kCAGJ,wBACE,GACE,kCC18CN,aACI,wBHIS,CGDb,gBAEI,aHOU,CGHV,+FACI,aHCM,CGEV,kBACI,aHFM,CGKV,gCACI,aHTM,CGYV,uBACI,wBHlBK,CGqBT,qBACI,wBHrBM,CGsBN,oBHrBM,CG2BN,iCACI,qBHhCD,CGiCC,oBH5BE,CG6BF,aH7BE,CIRd,YACI,wBJYU,CITd,eACI,cAKI,gDACI,oBJDE,CIKV,sBACI,wBJHM,CIMV,oBACI,wBJNM,CION,oBJTM,CIYV,+BACI,aJhBM,CIyBN,iCACI,UJhCD,CIiCC,uCAEI,UJnCL,CIsCH,gCACI,wBJ9BE,CI+BF,oBJjCE,CIkCF,aJlCE,CI0CV,uCACI,wBJzCM,CI0CN,oBJxCM,CIyCN,6CACE,iBJrDC,CI8DH,2CACI,wBJtDE,CIuDF,aJzDE,CI2DN,kDACI,wBJ1DE,CI2DF,oBJ7DE,CI+DN,iDACI,oBJ9DE,CIgEN,gDACI,wBJjEE,CIkEF,oBJjEE,CIkEF,sDACI,wBJnEF,CI6EN,oDACI,+BACA,oBJlFE,CIqFF,iEACI,wBJrFF,CIyFF,+EACI,wBJxFF,CIyFE,oBJ3FF,CIoGN,qCACE,aJnGI,CIqGN,wEACE,wBJtEI,CIyEJ,yEACE,wBJ3GE,CI6GJ,yEACE,wBJ7GE,CI+GJ,oDACE,aJnHE,CIwHV,wCACI,wBJxHM,CIyHN,8CACE,oCAIN,wCACI,qBJvIG,CI+IL,uCACE,yBACA,yDAMI,qDACI,qBJxJL,CIyJK,oBJhJF,CIkJF,2DACI,cAIJ,kEACI,wBJzJF,CI6JF,gFACI,qBJtKL,CI+KP,sCACI,aJtKM,CI8KN,2EACI,YJlLE,CImLF,gHACI,YJpJF,CIuJN,4DACI,wBJtLE,CIuLF,oBJtLE,CIuLF,uEACI,YJ3JF,CI6JF,kEACI,wBJ3LF,CI6LF,iFACI,oBJjKF,CImKF,2EACI,wBJjMF,CIkME,oBJlMF,CI+MF,+DACE,wBJ/MA,CIiNE,8EACE,wBJnNJ,CIsNA,sEACE,wBJtNF,CI4NA,8FACE,wBJhOF,CImOF,+DACE,wBJnOA,CIoOA,yEACE,wBJpOF,CIuOF,iFACE,aJ3MA,CI4MA,wBJ3OA,CIgPJ,sCACE,oBJjPE,CIuPN,iCACE,UJhQC,CIiQD,wBJtPI,CIuPJ,yBACA,uCACE,aJ7NE,CI8NF,wBJ7PE,CKXd,8BACE,kBACA,YACA,aACA,OAEA,8CACE,YACA,WACA,kBACA,aACA,sBACA,qBACA,uBAEF,8DACE,iBAGF,4CACE,eACA,OACA,SACA,QACA,yBACA,gBACA,4BACA,gEACA,aACA,sBACA,gBACA,2BACA,sBACA,UAEA,qGACE,UACA,oBACA,uBAGF,iDACE,gBACA,kBAGF,oDACE,UACA,aACA,gBACA,gCACA,gBACA,WAEA,0DACE,aAEA,4DACE,aACA,mBACA,aLlDI,CKmDJ,QACA,eACA,wBAEA,0EACE,WACA,YAGF,gEACE,YAGF,kEACE,kBLrEE,CKsEF,aLhEE,CKmEJ,mEACE,kBLzEE,CK8ER,0DACE,OACA,mBACA,YAEA,yEACE,mBACA,gBACA,uBAIJ,kEACE,aACA,yBACA,mBACA,aL3FM,CK4FN,cACA,QAEA,uFACE,mBACA,gBACA,YACA,eACA,cACA,aACA,aACA,mBACA,eACA,wBAEA,6FACE,kBLhHE,CKiHF,aL3GE,CK8GJ,8FACE,kBLpHE,CK0HV,iDACE,wBACA,oCAEA,+GACE,UACA,oBAKN,mDACE,wBLjGU,CKoGZ,uCACE,iBACA,iBACA,sBACA,yBACA,qBAEA,qDACE,0R;ACtJN,kCACE,kBACA,SACA,UACA,YACA,eNJS,CMKT,yBACA,wCACA,SAEA,qDACE,2BAEA,uDACE,gBAIJ,qDACE,2BAGF,yCACE,mBACA,kBACA,gCACA,oBAIA,8CACE,kBAEA,gDACE,2BACA,kBACA,cACA,aACA,8BACA,WACA,yBACA,mBACA,YACA,UN3CG,CM6CH,sDACE,qBACA,yBACA,aNJI,CMUZ,2CACE,aACA,yBAGF,kDACE,kBAEA,0DACE,kBACA,aACA,QACA,YACA,YACA,W;ACpEN,iBACI,sBACA,0BACI,iBACA,YACA,aAEJ,oBACI,c;ACVR,2BACE,gBACA,qBRCS,iDQCT,0BACA,2BACA,yBACA,8BAEA,8BACE,iBACA,mBAGF,6BACE,iBAGF,oCACE,gBACA,SACA,aACA,2BACA,8BACA,eAEA,4DACE,wBRmBQ,CQlBR,oBRkBQ,CQhBR,kEACE,wBRgBM,CQRd,yBACE,aACA,sBACA,YACA,WACA,qBAEA,iCACE,WACA,oBACA,gCACA,gBACA,cACA,aACA,mBACA,8BACA,sBAEA,wCACE,eACA,gBACA,cACA,SACA,mBACA,OAGF,iDACE,aACA,mBACA,WAEA,8DACE,SAGF,gEACE,aACA,mBACA,uBACA,WACA,YACA,UACA,gBACA,YACA,kBACA,eACA,cACA,aACA,sCAEA,sEACE,eACA,kBRtFI,CQ4FZ,mCACE,WACA,gCACA,gBACA,aACA,sBACA,sBAEA,4CACE,aACA,QACA,kBAEA,yDACE,wBR1GM,CQ2GN,kBAEA,+DACE,eACA,wBR7GI,CQgHN,kEACE,aRhHI,CQkHJ,wEACE,mBAOV,2CACE,OACA,WACA,wBRhIU,CQiIV,cAMA,4DACE,aACA,mBACA,aRvIQ,CQwIR,qBR9IK,CQ+IL,gCACA,oCACA,2BACA,eAEA,qEACE,iBAEA,2FACE,wBRlJI,CQmJJ,WACA,gBACA,kBACA,iBAIJ,oEACE,aACA,uBACA,mBACA,WACA,eAEA,iFACE,YACA,WACA,UAEA,sFACE,SACA,UAKN,yEACE,aR3IM,CQ8IR,mEACE,2BACA,yBRhJM,CQiJN,aRhLM,CQkLN,2EACE,8BAEA,0GACE,wBRpHI,CQwHR,yEACE,8BAEA,wGACE,wBRtLC,CQ0LL,kGACE,qBAvEC,CA2EL,kEACE,OACA,aACA,sBACA,yBAEA,0EACE,QACA,aACA,8BACA,mBAEA,mFACE,YACA,eACA,gBACA,sBACA,uBACA,aACA,mBACA,uBAGF,iFACE,OACA,2BACA,SAIA,sFACE,eAKN,wEACE,aACA,cACA,mBACA,mBAGF,0EACE,aACA,iBACA,aRzPI,CQ0PJ,cACA,cACA,yBAIJ,kEACE,wBRpQM,CQyQZ,gCACE,OACA,aACA,mBACA,uBACA,kBACA,aR5QU,CQ6QV,WACA,wBRjRU,C;ASHd,+CACI,wBAIJ,gCACI,mHAEA,+BACA,6DAEA,sCACI,+BACA,YAIR,2CACI,GACI,iHAGJ,IACI,kHAGJ,IACI,kHAGJ,IACI,mHAGJ,IACI,mHAGJ,IACI,mHAGJ,IACI,mHAGJ,IACI,mHAGJ,IACI,mHAGJ,IACI,mHAGJ,KACI,oH;AC9DR,gBACI,kBACA,iBACA,oBACA,sBACA,yBACA,kBACA,oBACI,YAEJ,oBACI,YAEJ,mBACI,iBACA,oBACA,YACA,kBACA,mBACA,gBACA,gBAEJ,yBACI,gBACA,iBACA,YACA,mBACA,sBACA,2BACI,qBACA,mBACA,aVlBE,CUqBV,yBACI,aACA,uBACA,QAEJ,sBACI,aACA,uBACA,mBACA,aVlCM,CUqCV,mDACI,yBACA,Y;AC9CR,mBACI,kBACA,kBACA,yBACA,gBACA,2CACA,aACA,WACA,gBACA,aACA,sBACA,8BACA,sBACI,gBACA,kBACA,yBACI,kBAIZ,cACI,sBACA,aACA,uBACA,mBACA,YACA,oCACA,gBACA,2CACA,SACA,kBACA,QACA,WAEA,6BACA,gCACA,kBXjBS,CWmBT,0BACA,oCAEJ,2CAEI,WACA,cACA,QACA,SACA,kBACA,4CACA,YACA,mCACA,+DAEJ,6BACA,6B;ACtDA,oCACI,gBACA,YACA,aACA,sBACA,mBACA,2BAEA,yDACI,eZRG,CYSH,mBACA,YACA,mBACA,mCAEA,wEACI,aACA,uBACA,cAGJ,gEACI,cAGJ,kEACI,aACA,uBACA,SACA,mB;AC7BZ,SACI,OAEA,eACI,uBACA,gBACA,mBACA,kBAGJ,kBACI,aACA,yBAKR,yBACI,cACI,cAKR,qCACI,cACI,c;AC1BR,YACE,qBACA,gBAEA,0BACE,YACA,aAIF,uBACE,yBACA,yBACA,edZO,CccP,qCACI,aAGJ,6BACI,oBdsBM,CclBR,iCACE,aACA,cAMJ,+CACE,4BACA,6BAKN,YACI,kBdrCS,CcsCT,+CACA,iBACA,YACA,gBACA,UACA,8BACA,+BACA,gCACA,4CACI,aAGJ,uBACI,gCACA,wBdpDK,CcqDL,eAEA,oCACI,mBAGJ,0CACI,gBACA,+BAEA,mDACI,wBd9DF,CcgEF,iDACI,yBAEJ,0DACI,2BAIR,6BACI,wBdzEE,Cc0EF,uDACI,2B;AClFhB,gBACI,aACA,2DACI,CAEJ,gBACA,mBACA,sBACI,gBAEJ,qBACI,afFM,CeGN,gBACA,kBACA,iBACA,cACA,WAGJ,yBACI,iBAEJ,uBACI,kBACA,+BACI,aACA,mBACA,gBACA,eACA,kBACA,afpBE,CeqBF,uDACI,aAIR,qCACI,kBACA,QACA,OACA,wBfnCC,CeoCD,Yf/BE,CekCF,qCACI,WAEJ,2CACI,UAMhB,qBACI,gBAGJ,6CACI,eACA,cACA,afnDU,CeoDV,kBACA,mBACA,uBAGJ,wBACI,iBACA,iBAIJ,sCACI,gBACI,wCACA,mDC5ER,cACI,mBACA,sBACI,WACA,aACA,mBACA,8BACA,wBhBDM,CgBEN,yBACA,gBACA,eACA,4BACI,gBAEJ,2BACI,ahBLE,CgBMF,kBAEJ,+BACI,iBACA,yBACA,iCAEJ,4CACI,wBhBjBE,CgBkBF,eAGR,uBACI,mCACA,uCACI,aACA,yBACA,mBAIJ,0DACI,yB;;ACuDZ;IACI,YAAY;AAChB;;AC7FA,mBACI,sBACA,YACA,iBAEA,0BACI,iBACA,oBlBoCM,CkBnCN,4BAGJ,8CACI,kBACA,aAEA,uDACI,mBACA,kBACA,SACA,yBACA,mEACI,kBACA,YACA,WACA,8BACA,mBACA,qBACA,YACA,WACA,yEACI,eACA,alBYN,CkBPN,4DACI,kBACA,QACA,SAMA,iFACI,mBACA,iBAMR,uDACI,gBAEA,0EACI,UAGJ,0EACI,iBAIZ,qCACI,iBACA,oBlBxBM,CkB0BF,2FACI,oBAMA,mGACI,mB;AC5ElB,wCACE,aACA,sBACA,SAGE,2EACE,sBACA,qBAGF,qEACE,WAGF,yEACE,aACA,QAGF,0EACE,aACA,QACA,mBACA,gBAEA,iFACE,eACA,YAEA,+FACE,WACA,YAON,4EACE,aACA,8BAEA,mFACE,mBACA,eAKN,iDACE,kBACA,uDACE,WACA,WACA,kBnBjDM,CmBkDN,kBACA,QACA,cAEF,uDACE,gBACA,YACA,kBACA,W;ACjER,wBACE,aACA,Q;ACFF,gCACI,arBMU,C;AsBPd,eACE,iCACA,WACA,wBACA,qBACA,gB;ACLF,mCACE,sBACA,WACA,wBACA,qBACA,gB;ACLF,iCACE,oBACA,mBACA,QACA,kBACA,uCACE,eAEF,iDACE,oBACA,mBACA,uBACA,YACA,YACA,yBACA,kBACA,eACA,wBACA,axBsCY,CwBpCZ,uDACE,UxBpBK,CwBqBL,wBxBgCU,CwB7BZ,wDACE,wBxB4BU,CwBzBZ,0DACE,oBAGF,gEACE,axB+BS,CwB5Bb,4CACE,sBACA,WACA,YACA,kBACA,kBACA,gBACA,gBACA,aACA,YACA,UAEF,iDACE,aACA,W;ACnDJ,+CACI,gBACA,iBAEA,yBACA,kBAEA,YACA,gBACA,WACA,aACA,QACA,mBACA,sBACA,qBAEJ,2DACI,iBACA,cACA,gBACA,eAEJ,iEACI,eAEJ,qDACI,e;AAxBI,uDACI,azBME,C;A0BXd,gBACI,aACA,qDACA,SAEA,2BACI,aACA,2BACA,M;ACRR,iBACI,aACA,QACA,mBACA,mBAGJ,qBACI,aACA,cAGJ,sBACI,iBACA,sBACA,yBAGJ,kBACI,gBAGJ,iDACI,kBACA,mBACA,gC;ACvBJ,+BACI,aACA,mBACA,SACA,kBACA,eAEA,qCACI,YAGJ,wCACI,aACA,sBAEA,qDACI,a5BTE,C4BaV,qCACI,kB5BjBM,C;A6BHd,+BACI,aACA,uBACA,mBAGJ,qCACI,gBAGJ,yCACI,mBACA,kBACA,mBACA,uEACA,yCAGJ,uCACE,GACE,UACA,8BAEF,IACE,UACA,0BAEF,KACE,UACA,8B;AC7BJ,+BACI,aACA,uBACA,mBAGJ,kCACI,gBAGJ,sCACI,mBACA,kBACA,mBACA,oEACA,yCAGJ,oCACE,GACE,UACA,8BAEF,IACE,UACA,0BAEF,KACE,UACA,8B;AC7BJ,+BACI,aACA,uBACA,mBAGJ,kCACI,gBAGJ,sCACI,mBACA,kBACA,mBACA,oEACA,yCAGJ,oCACE,GACE,UACA,6BAEF,IACE,UACA,0BAEF,KACE,UACA,+B;AC7BJ,yCACI,gBACA,kBACA,mBACA,uEAGJ,uCACE,GACE,WACA,yBAEF,IACE,UAEF,IACE,UAEF,KACE,WACA,wB;ACrBJ,+BACI,aACA,uBACA,mBAGJ,mCACI,kBACA,6CACA,kBACA,kBACA,wBACA,yBACA,kBACA,8BACA,mBACA,+EACA,yCAGJ,qFACI,WACA,qBACA,kBACA,MAEJ,2CACI,iCACA,wBACA,yBACA,kBACA,8BACA,mBACA,wEACA,mBAEJ,0CACI,wBACA,wBACA,yBACA,kBACA,8BACA,mBACA,wEACA,iCAGJ,qCACE,GACE,8BAEF,SACE,uC;ACnDA,uBACI,mBACA,mBAIJ,wCACI,mBAEJ,mDACI,gBAEJ,iDACI,sB;ACdR,gCACI,OACA,aAEA,uCACI,OACA,YACA,WACA,iB;ACRR,gCACI,OACA,aAEA,uCACI,OACA,YACA,WACA,iB;ACRR,yBACI,yBACA,wBrCoEW,CqCnEX,iBpCQS,CoCPT,WpCQS,CoCNT,uCACI,e;ACNJ,oCACI,gBAEA,2CACI,gBACA,iBACA,kBACA,yBACA,4CACA,eACA,gBAEA,iDACI,mBAGJ,iDACI,+B;AClBhB,kCACI,aACA,SACA,mBAEA,yCACI,UvCNG,CuCOH,gBAGJ,0CACI,yBACA,aACA,kBAEA,yDACI,aACA,uDACA,kBACA,+BACA,kBAEA,oEACI,kBACA,MACA,OACA,YACA,kBvC4BA,CuC3BA,kBACA,8BACA,UAGJ,2DACI,iBACA,kBACA,0BACA,kBACA,UACA,kBAEA,8EACI,UvCzCT,CuC6CC,iEACI,yBACA,avCxCF,CuCyCE,2BACA,kBACA,UACA,kBAEA,+EACI,0BACA,mBAGJ,wEACI,UvC3DT,C;AwCDX,kFACI,mCAGJ,uEACI,UAKJ,yBACI,8EAEI,cAKR,yBACI,8EAEI,gBAOR,qCAEI,8EAEI,cAIR,qCAEI,8EAEI,gB;;AC2GR;EACE,2BAA2B;AAC7B;;ACrJA,sCACI,aACA,cACA,aACA,sBACA,kBAEA,+CACI,kBACA,MACA,OACA,QACA,SACA,oCACA,aACA,uBACA,mBACA,aAGJ,sDACI,aACA,sBACA,cACA,aACA,cACA,UACA,2BAEA,8DACI,W;AC9BZ,0CACI,OAEA,+FACI,OACA,aACA,sBACA,SACA,cAIA,yDACI,yBAKJ,gEACI,iBACA,c;;AC6WZ;IACI,aAAa;AACjB;AAEA;IACI,aAAa;AACjB;;;ACvYA,wBACI,eACA,aACA,kBACA,gBAEA,sCACI,eACA,gBACA,yBACA,kBACA,YACA,gBACA,kBACA,WACA,a7C8BM,C6C3BV,mCACI,yBACA,kBACA,SACA,UAEA,uCACI,WACA,aAEA,gDACI,wBACA,SACA,SACA,YACA,oBACA,oB7C1BF,C6C8BN,0CACI,cACA,aACA,mDACI,yBACA,QACA,SACA,YACA,oBACA,oB7CvCF,C6C2CN,2CACI,cACA,aACA,UAIR,oCACI,kBACA,eAGI,yGACI,SACA,oB7CzDF,C6C0DE,oB;AChEZ,aACI,eACA,gBAEA,sBACI,mBACA,gBACA,uBAEA,6BACI,gBACA,uBAEA,+BACI,WAGJ,+BACI,a9CuBN,C8CnBF,+BACI,cACA,WAIR,uBACI,a9CtBE,C8C0BV,gBACI,kBACA,eAGJ,mBACI,kB9CrCM,C8CsCN,a9ClCM,C8CqCV,iBACI,kB9CzCM,C8C0CN,a9CLM,C8CMN,e;AC/CJ,2BACI,yBACA,kBACA,cAEI,2DACI,a;ACPhB,+CACI,aACA,SACA,mBACA,kBAEA,iEACI,OACA,kBACA,gCACA,mBACA,eACA,2BAEA,wEACI,oBhDsCI,CgDnCR,qFACI,aACA,kBACA,OACA,SACA,kBACA,gB/CNE,C+COF,ahDjBE,C;AiDPV,uCACI,2B;ACDJ,0DACI,gBACA,aACA,qCACA,SAEJ,iEACI,WACA,S;;ACipBR;IACI,+CAAsC;AAC1C;AAEA;IACI,wBAAwB;AAC5B;AACI;AACA;QACI,mCAAmC;AACvC;AACA;QACI,qCAAqC;AACzC;AACA;QACI,wCAAwC;AAC5C;AACJ;;AC3qBA,6BACI,kBACA,QACA,MACA,UACA,YACA,+BACA,yBACA,aACA,mBACA,uBACA,WAEA,qCACI,cACA,kBACA,SACA,yBACA,eACA,mBACA,apDZM,CoDeV,mCACI,iBAEA,2CACI,apDjBE,CoDqBV,wCACI,WACA,WAEA,gDACI,2BAGJ,8CACI,iB;ACxCZ,iCACI,aACA,mBACA,QACA,eACA,SACA,OACA,YACA,wBAGA,arDJU,CqDKV,erDXO,CqDYP,yBACA,iBAGA,aAGA,sCACA,4BAGA,wBACA,qCAEA,qCACI,YAGJ,+CACI,arDzBM,CqD0BN,WACA,YAGJ,wCAEI,yCAGJ,uCACI,e;AC3CR,iCACE,aACA,uBAEF,8CACI,iBACA,iBACA,cACA,kBACA,aACA,0B;ACRI,uEACI,gBAEA,2EACI,S;ACPZ,wBACI,gCAIR,mBACI,yBACA,iBvDKS,CuDJT,aACA,sBACA,2BACA,2BAGJ,sBACI,oBACA,mBACA,yBACA,iBvDNS,CuDOT,2BACA,2BAGJ,2BACI,aACA,mBACA,uBACA,wCACA,2BACA,4BACA,+BACI,8BACA,oCACI,iBAKZ,8CACI,kBACA,kDACI,mBAIR,iDACI,WACA,kBACA,2BACA,8BACA,qDACI,qBAIR,yBACI,yBACA,+BACI,gBAIR,4CACI,gBACA,aACA,sBACA,OvDtDS,CuDuDT,YACA,kDACI,iBACA,gBAIR,4BACI,WACA,aACA,QACA,kBACA,mBAGJ,6BACI,2BACA,2BAGJ,mCACI,2BACA,2BCvFJ,iBACE,aACA,e;ACHF,4BACI,oBACA,cAEA,2CACE,eACA,gBACA,cAEA,8DACE,aACA,mBACA,UACA,cAEA,oFACE,oBACA,cAEA,4FACE,iBAEA,+FACE,eAGF,8FACE,iBACA,iBACA,a1DrBA,C0DyBJ,iHACE,cACA,eAIA,4GACE,eACA,gBACA,gBAGF,0HACE,aACA,mBACA,eAEA,6IACE,WACA,gBACA,eAMR,qFACE,gBAEA,6FACE,YACA,WAMN,8DACE,6B;ACvER,6CACE,aACA,aACA,QACA,a3D6Da,C;A4D/DP,+BACI,8BAKJ,qDACI,kB5D8CI,C4D5CJ,+DACI,kB5DNF,C;A6DHF,8EACI,yBACA,kB7D2CD,C6D1CC,iBACA,kBACA,eACA,2BACA,OACA,kBACA,kBAEA,oFACI,kB7DmCJ,C6DhCA,uFACI,kB7DiCJ,C6DhCI,WAEA,4FACI,gBAIR,uFACI,WACA,mB;AC7BpB,kFACI,mCAGJ,uEACI,UAKJ,yBACE,8EAEE,cAKJ,yBACE,8EAEE,gBAOJ,qCAEE,8EAEE,cAIJ,qCAEE,8EAEE,gB;ACvCA,4CACI,yBACA,kBACA,c;ACJR,YACI,gBACA,SAEJ,gBACI,WACA,aACA,O/DIS,C+DHT,wBACI,cAGR,6CAEI,YACA,yBACA,gBACA,iB/DNS,C+DOT,aACA,mBACA,O/DTS,C+DUT,mBACA,uBACA,kBAEJ,uBACI,ahEnBU,CgEqBd,uBACI,eACA,6BACI,ahEYM,C;AiE3Cd,8BACI,kBACA,oCACI,ajEwCM,CiEpCd,gCACE,W;ACRF,iCACE,gBAEA,4CACE,eACA,gBACA,YACA,2BAGF,6CACE,oCAEA,wDACE,2BACA,uBAEA,uEACE,alETM,CkEUN,mBAGF,8DACE,oC;ACvBR,oBACE,a;ACDF,mDACI,qBACA,2BACA,UAEJ,sDACI,gBACA,uBACA,mBAKJ,yBACE,sHAGE,cAKJ,yBACE,sHAGE,gBAOJ,qCAEE,sHAGE,aAIF,mHAEE,mBACA,qBAIJ,qCAEE,sHAGE,gBAKJ,gDACE,aACA,sBACA,UAIF,yBACE,gDACE,mBAEA,kDACE,QAON,qCACE,gDACE,sBAEA,kDACE,WAKN,qCACE,gDACE,mBAEA,kDACE,Q;AC7FN,8BACI,WAEA,uCACI,aACA,sBACA,mBACA,8BACA,kBACA,gBACA,YACA,gBAEA,iDACI,kBACA,OACA,SACA,WACA,kBrEZE,CqEaF,2BACA,UACA,aACA,8BACA,gBAEA,4DACI,UAEJ,6DACI,QAGJ,qDACI,kBAEA,0DACI,aACA,WACA,kBrEgBJ,CqEfI,UACA,cACA,QACA,kBACA,6BACA,qCAIA,oEACI,wBAMhB,8CACI,WACA,kBACA,OACA,QACA,aAEA,oDACI,kBACA,WACA,YACA,wBrE3DF,CqE4DE,kBACA,UACA,2BAEA,8DACI,wBrElBJ,CqEqBA,2DACI,qBACA,wBrEvBJ,CqEyBI,kEACI,arEzBR,CqE6BA,6DACI,eAGJ,2DACI,kBACA,SACA,gCACA,iBACA,arEvFN,CqEwFM,2B;AC9FpB,qCACI,kBACA,gBACA,YACA,cACA,aACA,sBAEA,sDACI,kBACA,MACA,OACA,WACA,YACA,8BACA,YAGJ,8CACI,OACA,gBACA,aACA,sBACA,c;ACtBJ,uDACI,aACA,yBACA,WACA,kBACA,eACA,2BAEA,6DACI,oBvE0CI,CuEvCR,gEACI,oBvEwCI,CuEhCJ,yEACI,avEhBF,CuEiBE,gBtEPF,CsEWN,oEACI,avEtBE,CuEuBF,gBtEZE,C;AuEhBN,wCACI,kBACA,mBACA,gCACA,aACA,8BAEA,8CAEI,gBAGJ,iDACI,aACA,QAIR,mCACI,eAEA,kDACI,axEhBF,CwEiBE,kB;ACrBA,mFACI,iB;;ACsNpB;EACE;;;;;;GAMC;AACH;;ACpOI,4CACI,gBAIR,kBACI,mBAEI,yBACI,aACA,QAHR,qBAKI,gBACA,yBACI,WAGR,wBACI,iBACA,sBACA,qBACA,yBACA,iBACA,oB3EhBM,C2EiBN,2BACI,YAGA,+CACI,gCAIZ,gCACI,mBAEJ,yCACI,sBAEJ,6BACI,gBCnCR,qCACE,2BACE,iDAKJ,qCACE,2BACE,iDAKJ,UACE,aACA,mBAEA,mBACE,OACA,YACA,gBACA,uBACA,mBAGF,kBACE,cACA,oBACA,mBACA,uBACA,YACA,YACA,yBACA,kBACA,eACA,a5EgBY,C4EfZ,sDAEA,2BACE,WACA,YAEA,sCACE,WACA,YAIJ,wBACE,yBACA,U5EtDK,C4EyDP,2BACE,mBACA,a5EtDQ,C4EwDR,iCACE,+BACA,a5E1DM,C4E+DZ,sBACE,YAEA,4BACE,gBACA,uBACA,mBAON,8CACE,cACA,gBACA,gBACA,uBACA,mB;ACvFF,kBACI,aACA,mBACA,QAGJ,uBACI,WACA,YACA,kBACA,wB7EFU,C6EKd,iCACI,wB7EkDW,C6E/Cf,oCACI,wB7ECS,C6EEb,kBACI,OACA,aACA,sB;ACxBJ,gCACE,eAMF,qCACE,yCACE,gBAIJ,qCACE,yCACE,c;ACZJ,qCACE,sCACE,gBAIJ,qCACE,sCACE,c;ACVJ,mBACI,oBACA,kBAIJ,sDAEI,aACA,mBACA,O/EDS,C+EET,gB/EMU,C+ELV,gBACA,iBACA,qBhFdO,CgFeP,ahFwCY,CgFvCZ,yBACA,eACA,6EAEA,gGACI,wBhFgCQ,CgF/BR,oBhF+BQ,CgF9BR,UhFvBG,CgF0BP,sLAEI,mBACA,oBhFxBM,CgFyBN,ahFxBM,CgFyBN,wBhF7BK,CgFgCT,kFACI,WACA,YAKR,2BACI,yBACA,0BACA,kBACA,mBAKJ,mGAGI,iBAIJ,2BACI,uBACA,W/EjDS,C+EkDT,0BACA,8BAEA,yCACI,WACA,YAGJ,gDACI,yBhFhBQ,CgFmBZ,2FAEI,yBhFrEM,CgF2EV,8GAEI,wBhF3BQ,CgF4BR,oBhF5BQ,CgF6BR,UhFpFG,CgFsFH,wJACI,wBhFlCI,CgFmCJ,oBhFnCI,CgFuCZ,uDACI,qCAEA,4EACI,qCAMZ,wCACI,cACA,eAIJ,+CACI,cACA,eAMJ,qCACE,kBACE,gBAIJ,qCACE,kBACE,c;AC7HJ,qCACI,aACA,sBACA,cACA,O;ACJJ,+BACI,cAEA,wCACI,aACA,mBACA,eACA,OACA,cACA,iBAEA,yBARJ,wCASQ,sBACA,UAGJ,iDACI,OACA,YACA,aACA,sBACA,gBAEA,yBAPJ,iDAQQ,eACA,iBACA,SAIR,mDACI,cACA,gBACA,gBACA,YACA,OAEA,4DACI,cACA,OAEA,gFACI,YACA,aAEA,yFACI,gBACA,oBlF1CV,CkF2CU,YACA,iBACA,mEACA,OAEA,8LACI,elFrDjB,CkFsDiB,oBlFjDd,CkFkDc,gBAGJ,qGACI,oBlFtDd,CkFyDU,yBAlBJ,yFAmBQ,gBACA,iBACA,elFjEjB,CkFkEiB,oBlF7Dd,CkF8Dc,aAKZ,yBApCJ,4DAqCQ,iBACA,OAIR,yBAjDJ,mDAkDQ,WACA,eACA,sBACA,YACA,eAKZ,uCACI,aACA,SACA,qBACA,gBAII,0DACI,iBAGJ,yDACI,kBACA,kBAIR,yBAlBJ,uCAmBQ,cACA,uBACA,wBACA,aACA,sBACA,cACA,mBACA,iB;AAhHA,gDACI,O;ACJhB,eACI,YAEA,8BACI,cACA,gBACA,mBAGI,qEACI,gBACA,WACA,YAKZ,wCACI,gBACA,YACA,cACA,aACA,sBAEA,2CACI,OACA,YACA,cAEA,oDACI,eACA,anFYF,C;AoF3Cd,gCACI,aACA,qCACA,SACA,kBpFDS,CoFET,gCACA,8BACA,YACA,mBAEA,uCACI,oBACA,kBACA,aACA,SACA,8BAEA,0CACI,aACA,QAIR,yCACI,oBACA,aACA,yB;AC1BR,4BACI,SAEA,mCACI,aACA,sCACA,erFLG,CqFMH,SACA,YACA,gCAEA,4CACI,oBACA,aACA,2BACA,iDACI,UrFhBL,CqFiBK,gBAIR,4CACI,oBACA,kBACA,aACA,2BACA,QAGJ,2CACI,qBACA,aACA,yBAIR,8CACI,mBAIA,0DACI,aACA,SACA,mBACA,uBACA,arFtCE,CqFuCF,iBACA,eACA,2BAEA,gEACQ,arFIJ,C;AsFxDhB,iBACI,yBACA,mBAEA,oCACI,eACA,kBtFFM,CsFGN,aACA,gBACA,mBACA,SAEA,2CACI,OACA,aACA,mBACA,SAEA,2FACI,SACA,cAGJ,6CACI,atFhBF,CsFiBE,gBACA,cAIR,6CACI,aACA,sBACA,iBACA,kBACA,gBAGJ,+CACI,2BAGJ,yCACI,gCAEA,oDACI,wBAOJ,mDACI,mB;ACrDZ,uCACI,yBACA,kBACA,aACA,SAEA,iDACI,gB;ACVZ,aACI,WACA,yBACA,kBACA,iCACI,YAEJ,wEAEI,iBACA,aACA,8BACA,mBACA,gCACA,wBxFRM,CwFSN,2BACA,4BACA,SAEJ,uCACI,YACA,wBxFhBK,CwFiBL,6CACI,gBAGR,8CACI,axFJK,CwFKL,kBACA,gBACA,aACA,mBACA,QAEJ,kCACI,aACA,QAEJ,iCACI,aACA,8BACA,+BACA,aACA,oBACA,SACA,gBAIR,mBACI,kBACA,yBACA,gBACA,sBACA,+DAEI,axFXM,CwFaV,2CACI,oBACA,kBACA,QACA,aACA,sBACA,uBACA,mBACA,axFzDM,CwF0DN,iDACI,mBACA,eACA,axFzBE,CwF0BF,oBxF1BE,CwF6BV,0CACI,iBACA,aACA,8BACA,SACA,gBACA,gDACI,axFvEE,CwFyEN,oDACI,uBACA,kBAGR,2CACI,uBACA,qBACA,gCACA,aACA,uBACA,QACA,gBACA,iDACI,axFvFE,CwFwFF,gBACA,mBAKZ,0BACI,oBxFlFS,CwFmFT,oDACI,wBxF3FI,CwF4FJ,gCAIR,mBACI,6BACA,sBACA,mCACA,axFvEU,CwF0Ed,yBACI,GACI,8BACA,UAEJ,IACI,UAEJ,IACI,UAEJ,KACI,6BACA,W;ACjIJ,gDACI,WACA,YAEJ,uDACI,yB;ACLJ,+BACI,YACA,wB1FWI,C0FVJ,yBACA,kBACA,a1FeK,C;AwFvBb,aACI,WACA,yBACA,kBACA,iCACI,YAEJ,wEAEI,iBACA,aACA,8BACA,mBACA,gCACA,wBxFRM,CwFSN,2BACA,4BACA,SAEJ,uCACI,YACA,wBxFhBK,CwFiBL,6CACI,gBAGR,8CACI,axFJK,CwFKL,kBACA,gBACA,aACA,mBACA,QAEJ,kCACI,aACA,QAEJ,iCACI,aACA,8BACA,+BACA,aACA,oBACA,SACA,gBAIR,mBACI,kBACA,yBACA,gBACA,sBACA,+DAEI,axFXM,CwFaV,2CACI,oBACA,kBACA,QACA,aACA,sBACA,uBACA,mBACA,axFzDM,CwF0DN,iDACI,mBACA,eACA,axFzBE,CwF0BF,oBxF1BE,CwF6BV,0CACI,iBACA,aACA,8BACA,SACA,gBACA,gDACI,axFvEE,CwFyEN,oDACI,uBACA,kBAGR,2CACI,uBACA,qBACA,gCACA,aACA,uBACA,QACA,gBACA,iDACI,axFvFE,CwFwFF,gBACA,mBAKZ,0BACI,oBxFlFS,CwFmFT,oDACI,wBxF3FI,CwF4FJ,gCAIR,mBACI,6BACA,sBACA,mCACA,axFvEU,CwF0Ed,yBACI,GACI,8BACA,UAEJ,IACI,UAEJ,IACI,UAEJ,KACI,6BACA,W;AGlIR,eACI,aACA,sBACA,gBAEA,4BACI,OACA,aACA,uBACA,sBAGJ,0BACI,OAEJ,qBACI,iB;ACbR,+BACA,aACA,8BACA,mBACA,kBAEA,iB3FEa,C2FDb,yBAEA,YACA,gBAEA,gB3FGc,C2FFd,iBAEA,mCACE,iBAGF,qCACE,eACA,oB5FmBY,C4FjBZ,a5FiBY,C4FhBZ,wB5FxBW,C4F0BX,8CACI,a5FaQ,C;A6FxCd,cACE,aACA,8BACA,mBACA,kBAEA,iB5FEW,C4FDX,yBAEA,YACA,gBAEA,gB5FGY,C4FFZ,iBAEA,kBACE,iBAGF,oBACE,eACA,oB7FmBU,C6FjBV,a7FiBU,C6FhBV,wB7FxBS,C6F0BT,6BACI,a7FaM,C;A8F3Cd,6BACI,+BACA,4BACA,yBAEA,mCACI,WAGJ,mCACI,UAEA,yCACI,oB9FmDG,C8FjDP,uCACI,oB9FGC,C8FDL,wCACI,oB9FXE,C;A+FRd,sCACI,kBAEA,+CACI,kBACA,MACA,OACA,WACA,YACA,yCACA,uB;ACZR,sBACI,aACA,sBACA,SAEI,qDACI,8BACA,+BACA,wBhGHC,CgGML,8CACI,8BACA,+BACA,gCAGJ,sCACI,2BACA,4BACA,6BAGJ,qCACI,8BACA,+BACA,gCAGR,gDACI,iCACA,aACA,8BACA,aACA,yBACA,qDACI,aACA,mBACA,SAEJ,sDACI,eACA,oBhGGE,CgGDF,2KAEI,ahGDF,CgGKV,sDACI,aACA,sBACA,2DACI,ahG7CE,CgG8CF,iBAGR,iCACI,kBACA,ahGlDM,CgGmDN,aACA,mBACA,QAEA,wCACI,WACA,WACA,YACA,gBACA,wBhG9DE,CgGmEd,gCACI,aACA,gBACA,aACA,sBACA,sCACI,kBACA,ahGxEM,CgGyEN,aACA,mBACA,SACA,6CACI,WACA,WACA,YACA,wBhGlFE,CgGqFV,+CACI,sBACA,oBhGvFM,CgGwFN,iBACA,mBACA,kBACA,aACA,aACA,mBACA,+DACA,qDACI,eACA,oBhG5DE,CgG6DF,oFACI,ahG9DF,CgGgEF,8DACI,ahGjEF,CgGsEV,yCACI,aACA,yBACA,QAIR,gCACI,OACA,aACA,gBAEA,+CACI,aACA,OACA,gBACA,YACA,UACA,QACA,gBAEA,2DACI,gBAIR,+CACI,gBACA,aACA,kBACA,mBACA,uBACA,QACA,ahG1IM,CgG8Id,+BACI,ahGhJU,CgGiJV,kBACA,oBACA,kBCxJJ,YACE,kBACA,ajGGY,oEiGGV,wBAGJ,uBACI,UACA,2BAGJ,qBACI,UACA,wBAGJ,uBACI,UACA,wBAGJ,qBACI,UACA,2BAGJ,iBACI,8B;AClCJ,8BACI,mB;ACCI,4DACI,mB;ACHZ,iCACI,kBACA,kBACA,yBACA,gBACA,2CACA,4BACA,WACA,gBACA,aACA,sBACA,8BAEA,4CACI,sBACA,aACA,uBACA,mBACA,YACA,oCACA,gBACA,2CACA,SACA,kBACA,QACA,WACA,6BACA,gCACA,0BACA,oCAEA,gDACI,kBpGbC,CoGcD,+GAEI,+DAIR,iDACI,kBpGeI,CoGdJ,iHAEI,+DAIR,uGAEI,WACA,cACA,QACA,SACA,kBACA,4CACA,YACA,mCAGJ,2DACA,2D;AC5DR,4BACI,gBAEA,mCACI,YACA,gBACA,aACA,qCACA,SACA,UAEA,6CACI,kBACA,mBACA,gBAEA,6DpGQV,mBACA,gBACA,uBoGRc,kEpGMd,mBACA,gBACA,uBoGLc,4EpGGd,mBACA,gBACA,uBoGCU,sDACI,cACA,eAIR,0CACI,kBAIJ,2CACI,mBACA,iBACA,mBACA,aACA,mBACA,yBAEA,oGACI,kBACA,qBACA,kBACA,mBAEA,4HACI,kBACA,QACA,SACA,gCACA,2BAIA,wIACI,WACA,YAKZ,uDACI,arG3DF,CqG6DF,yDACI,arGlDH,CqGuDT,mDACI,kBrG1EM,CqG4EF,0EACI,gCACA,kBACA,SACA,cAEA,uFACI,Y;ACpFZ,6DACI,gB;ACHR,iBACI,yBACA,kBACA,gBAEA,yBACI,kBvGHE,CuGIF,aACA,gCAGI,uCACI,mBAKZ,+BACI,evGlBD,CuGoBC,uCACI,gCAEA,oDACI,mB;ACxBhB,6BACI,SAEA,mDACI,iBACA,yBACA,wBxG8BC,CwG7BD,kBACA,aACA,iBACA,aACA,8BACA,mBAEA,yDACI,eACA,wBxGqBF,CwGjBN,oDACI,yBACA,gBACA,0BACA,aAGI,oFACI,mBAEA,0FACI,cACA,iBACA,kBAEJ,oGACI,axG9BV,CwG+BU,wBxGnCX,CwGoCW,aACA,eAOZ,wDACI,0B;AChDhB,iCACI,iBACA,kBACA,yBACA,4BACA,oBACA,mBACA,QACA,uCACI,oBzG4CQ,CyG3CR,azG2CQ,CyG1CR,eAGR,2CACI,cACA,aACA,SACA,sBAEJ,oBACI,aACA,8BACA,mB;ACtBA,2CACI,kBACA,eACA,qBACA,iDACI,a1GiDI,C0G/CJ,eAIA,qEACI,8BACA,gCACA,8BACA,qBACA,kBACA,YACA,WACA,WACA,UAEJ,qEACI,UACA,8BACA,qBACA,kBACA,cACA,WACA,YAIR,oDACI,YACA,kBAEA,6DACI,qBAGJ,2DACI,mBACA,aACA,QAEA,sEACI,wB1GCJ,C0GGJ,oEACI,aACA,YAIA,0EACI,qBACA,a1GrDN,C0G2DV,4CACI,gBAGA,oDACI,kB1GvBG,C0G6BC,gEACI,a1GvBJ,C0G0BA,kEACI,wBASJ,iEACI,a1GnFN,C0GoFM,cACA,gBAEA,4EACI,U1GjGb,C0GkGa,iB;AClGxB,8CACI,aACA,sBACA,OACA,YACA,cAEA,sDACI,e3GPG,C2GQH,aACA,kBACA,yBACA,cACA,YAGR,qCACI,8CACI,gB;AClBR,sCACI,gBACA,aACA,kBACA,yBAGJ,gCACI,aACA,wB5GuCW,C4GtCX,a5G4CY,C4G3CZ,kBACA,yBACA,YACA,gBACA,iDACI,YAEJ,gDACI,Y;ACnBR,+BACI,wB7G+CW,C6G9CX,a7GoDY,C6GnDZ,kBACA,yBACA,iBACA,kBACA,oBACA,cACA,kBAEA,qDACI,a7GJM,C6GKN,kBACA,kBAIA,4DACI,kBACA,SACA,SAKR,yCACI,gBACA,uDACA,oBAEA,2DACI,iBAGJ,oDACI,a;AClCJ,8CACI,a9GkDI,C8G7CR,+CACI,a9GDE,C8GGN,8CACI,a9GoDG,C8GlDP,8CACI,a9GIC,C;A+GnBb,sCACI,aACA,sBACA,SACA,e/GHO,C+GIP,aACA,kBACA,yBACA,c;ACRJ,qCACI,aACA,sBACA,OACA,YACA,qBACA,c;ACNJ,sCACI,aACA,mBACA,SACA,cAIJ,qCACI,sCACI,gB;ACRA,+FACI,gCAKJ,6CACI,YACA,UACA,YACA,e;ACZZ,yBACI,yBACA,enHDO,CmHEP,aACA,aACA,sBACA,OAEA,wCACI,aACA,8BACA,mBACA,mBAEA,sDACI,SACA,UACA,iB;;AC8CZ;IACI,6BAA6B;AACjC;;ACjEA,gBACI,cACA,YACA,WACA,kBACA,2B;ACJA,qBACI,gCACA,mBACA,iBAIA,gDACI,yBACA,iBACA,kBACA,aACA,WACA,mBACA,gBACA,8BACA,mBACA,SACA,yBACA,2BAEA,yDACI,aAGJ,sDACI,oBtHtBF,CsHyBF,yDACI,OAGI,sFACI,gBrHjBV,CqHkBU,atH7BV,CsHkCM,qEACI,atHaR,CsHRJ,yDACI,aACA,8BACA,mBAKZ,+BACI,iB;ACxDR,mBACI,aACA,OACA,sBAEA,qBACI,gCACA,mBACA,iBAGJ,qCACI,mBAEA,oDACI,yBACA,yBACA,kBACA,aACA,WACA,mBACA,gBACA,8BACA,mBACA,SACA,0CACA,2BACA,eAEA,6DACI,aAGJ,0DACI,oBvH5BF,CuH6BE,wBvHaD,CuHVH,6DACI,OAGI,mFACI,gBAGJ,oFACI,gBtH7BV,CsH8BU,avHzCV,CuH8CF,6DACI,aACA,8BACA,mBACA,QAEA,oFACI,avHJJ,CuHMI,6FACI,WACA,YAGJ,0FACI,wBvHdR,CuHeQ,UvHpEb,CuH2EP,iCACI,iB;AC7ER,oCACI,YACA,aACA,OACA,sBACA,cACA,2BACA,8BAMA,6CAHJ,oCAIQ,kB;AAbJ,8BACI,YAEA,sCACI,exHJD,CwHKC,YACA,gCAKI,0DACI,kBxHVP,CwHaG,2DACI,Y;ACjBpB,0CACI,aACA,sBACA,eACA,SAEF,oDACE,mBAEA,oEACE,gBACA,gBAGF,mEACE,aACA,eACA,S;ACjBN,oCACI,sBACA,aACA,yBACA,aACA,8BACA,mB;ACNJ,mCACI,aACA,Q;ACJJ,oCACI,sBACA,yBACA,kBACA,aACA,yCACI,YACA,c;ACLR,kDACI,gBACA,mBAEJ,sCACE,aACA,8BACA,mB;ACNE,6BACI,gBACA,aACA,sBACA,sCACA,mBACA,6CACA,gBAEA,0CACI,iBACA,aACA,gDACA,gCACA,2BAEA,gDACI,mBAEJ,gDACI,kBAIA,2DACI,2BACA,UAIR,gDACI,kB9H5BF,C8H8BM,iEACI,UAKZ,uDACI,mBAOR,uCACI,aAKJ,sCACI,iB;ACvDZ,6BACI,WACA,YACA,kBACA,YACA,iBACA,qBAGJ,mCACI,kBACA,YAGJ,wCACI,wB/HCS,C+HEb,0CACI,wB/HsDY,C+HnDhB,uCACI,wB/HsCW,C+HnCf,oCACI,WACA,iB;AC5BJ,oCACI,yBACA,kBACA,gBACA,ehIHO,CgIIP,aACA,aACA,sBACA,SACA,gBAEA,wDACI,aACA,mBACA,QACA,eACA,mBACA,yBACA,YACA,kBACA,2BAEA,8DACI,ahIgCI,CgI/BJ,oBhI+BI,C;AiIvDhB,8BACI,yBACA,kBACA,gBAEA,kDACI,ejILG,CiIMH,aACA,gCACA,2BAEA,wDACI,UjIXD,CiIYC,kBjI0CI,CiIzCJ,sFACI,2BACA,ajITF,CiIaN,2FACI,ajIbE,CiIeF,+HACI,UjIvBL,CiI2BH,uEACI,2BACA,ajIvBE,CiIyBF,6EACI,ajIsBA,CiIlBR,sDACI,aACA,OACA,oBAIR,mDACI,aACA,cAEA,4EACI,aACA,mBACA,SAEA,+EACI,aACA,SACA,mBAEA,mGACI,aAKZ,4EACI,kBACA,ajI1DE,C;AkILN,4DACI,aACA,sBACA,S;ACNZ,2CACI,iBACA,qBACA,sBACA,yBACA,iBACA,qBACA,gBACA,8CACI,YAGA,oIACI,gCAGR,8CACI,gBACA,mB;AClBR,8BACI,mBACA,oBACA,gCAEA,4FACI,+B;ACNR,4BACI,cACA,gBAEA,mCACI,gBACA,Y;ACNR,4BACI,YACA,WACA,cAEA,oCACI,gCACA,oBACA,mBACA,aACA,mBACA,Y;ACRA,mEACI,eACA,eACA,WAGJ,+BACI,eAIA,uCACI,Q;ACdhB,cACI,YACA,WACA,aACA,sBACA,kBxIHS,CwIKT,sBACI,gCACA,eACA,WACA,exIXG,CwIaH,+BACI,eACA,aACA,qBAEA,sCACI,SACA,axIVF,CwIWE,iBACA,kBACA,oBAKZ,+BACI,OACA,WACA,wBxI7BK,CwI8BL,cAED,wCACI,oBACA,mBACA,gCAGI,uDACI,axIjCL,CwIkCK,eAIR,iDACI,mBAKX,sBACI,kBACA,6BACA,exIvDG,C;AyIDX,+BACI,YACA,WACA,aACA,sBACA,kBzIFS,CyIIT,uCACI,gCACA,eACA,WACA,ezIVG,CyIYH,gDACI,eACA,aACA,qBAEA,uDACI,SACA,azITF,CyIUE,iBACA,kBACA,oBAKZ,gDACI,OACA,WACA,wBzI5BK,CyI6BL,cAGI,+DACI,azI3BF,CyI4BE,eAKZ,uCACI,ezI1CG,CyI2CH,kBACA,6B;AC7CR,8BACI,aACA,sBACA,cACA,gBAEA,sCACI,gCACA,oBACA,mBAEA,6DACI,eAKJ,0CACI,aACA,QACA,cACA,mBACA,2BACA,eAEA,iGACI,a1I2BA,C0I1BA,wB1IvBF,C0I4BM,kFACI,aAEJ,iFACI,qBAKZ,uDACI,WACA,4EACI,qBAEJ,2EACI,aAIA,mEACI,qBAOpB,2CACI,OACA,aACA,sBACA,kBACA,uBACA,a1I1DM,C0I2DN,gBAEA,gDACI,eACA,a1IjBI,C;A2IrDhB,iCACI,aACA,SACA,YACA,WACA,cAEA,2CACI,MACA,wDACI,YACA,YACA,gBACA,UACA,iCAIR,8CACI,+BACA,mBACA,2D;ACpBJ,2CACI,aACA,QACA,mBACA,mBAEA,8CACI,SACA,UAIR,0GAEI,aACA,e5IfG,C4IgBH,yBACA,kBAEA,sHACI,aACA,mBAEA,4HACI,gBACA,cACA,OAGJ,4HACI,O;AC/BhB,+BACI,Y;ACCI,qGACI,gCAGR,mCACI,aACA,gBAEA,4EACI,SAGJ,sCACI,gBAEJ,sCACI,iBACA,mB;AClBR,iDACI,aACA,yBACA,WACA,kBACA,eACA,2BAEA,uDACI,oB/I0CI,C+IvCR,0DACI,oB/IwCI,C+IhCJ,mEACI,a/IhBF,C+IiBE,gB9IPF,C8IWN,8DACI,a/ItBE,C+IuBF,gB9IZE,C;A+IjBV,mCACI,eAEA,+CACI,gBAGJ,oDACI,yBACA,kBACA,qBACA,ehJXD,CgJYC,cACA,kBAGI,8DACI,cACA,cACA,eAIR,yEACI,yBAGJ,qHAEI,aAGJ,6DACI,WACA,mBAKJ,sKAEI,kBhJYA,CgJXA,oBhJWA,CgJVA,UhJ3CL,CgJ8CS,0LACI,UhJ/Cb,CgJuDX,kBACI,yBACA,cACA,iBACA,gBACA,sBACA,qBACA,iBACA,kBACA,c;AChEA,8BACI,eAEA,0CACI,gBAGJ,+CACI,yBACA,kBACA,qBACA,ejJXD,CiJYC,cACA,kBAGI,yDACI,cACA,cACA,eAIR,oEACI,yBAGJ,oEACI,aACA,yBACA,cAGJ,wDACI,WACA,mBAKJ,4JAEI,kBjJWA,CiJVA,oBjJUA,CiJTA,UjJ5CL,CiJ+CS,gLACI,UjJhDb,CiJwDX,0CACI,yB;AC1DJ,mCACI,yBACA,kBACA,mBACA,aACA,QACA,mBACA,eACA,2BACA,mBAEA,0CACI,kBlJqCQ,CkJpCR,yBAEA,qDACI,kBlJmCI,CkJ/BZ,iDACI,aACA,mBACA,iBAGJ,8CACI,UACA,mBACA,kBlJ2CQ,CkJxCZ,yCACI,mCAEA,gBjJjBM,CiJkBN,aACA,Q;ACnCA,sCACI,anJKE,CmJJF,gBACA,gBlJYE,C;AmJfN,sCACI,apJKE,CoJJF,gBACA,gBnJYE,C;AoJjBd,kCACI,aACA,sBACA,MACA,aACA,6BACA,gBACA,cACA,kBACA,iBACA,gBAGJ,iCACI,aACA,8BACA,mBACA,oBAGJ,gCACI,aACA,UAGJ,wBACI,qBACA,qBACA,kBACA,eACA,2BACA,+BAEA,iCACI,WACA,mBAIR,iCACI,sBACA,cACA,qBACA,qBACA,kBAEA,sDACI,yBAIR,2BACI,wBrJEY,CqJDZ,WACA,qBACA,kBACA,qBAEA,gDACI,wBrJJQ,CqJQhB,2BACI,sBACA,cACA,qBACA,aACA,mBACA,UACA,kBACA,qBAEA,mCACI,WACA,aACA,cACA,yBACA,sBAGJ,iCACI,yBAIR,gCACI,OACA,aACA,sBACA,yBACA,oBACA,iCAEA,wCACI,oBrJ1CQ,CqJ6CZ,4CACI,OACA,WACA,aACA,sBACA,gBACA,YACA,aACA,kBACA,gBACA,cACA,YACA,oBACA,gBAEA,kDACI,aAGJ,qDACI,mBACA,yBACA,cAGJ,yDACI,cAIR,yCACI,cACA,aACA,8BACA,WAEA,+CACI,aACA,2BAGA,cACA,OACA,wEACI,OACA,gBACA,qBACA,aACA,UAIR,gDACI,aACA,yB;ACxJZ,oCACI,aACA,WACA,mBAEA,kDACI,yBAEA,kEACI,wBtJ6CI,CsJ5CJ,WACA,oBACA,mCAIR,+CACI,2BAEA,+DACI,wBtJhBE,CsJiBF,cACA,oBACA,kCAGJ,mHACI,mBACA,yHACI,iBACA,aACA,mBACA,QACA,atJxBF,CsJ0BE,2IACI,atJ5BN,CsJgCF,yHACI,gBACA,oBAEA,+HACI,iBAMhB,mDACI,uBAEA,mEACI,yBACA,cACA,oBACA,gBACA,eACA,WAGJ,iEACI,kBACA,gBAGJ,kFACI,yBACA,cAMZ,iCACI,cACA,mBACA,qBACA,yBAEA,mDACI,aAIR,+BACI,eACA,gBAEA,iCACI,mBAEA,4CACI,gBAIR,oEACI,eACA,oBACA,kBAGJ,kCACI,gBAGJ,oCACI,iCACA,uBACA,qBACA,sBACA,iBAGJ,mCACI,iCACA,eACA,oBACA,gBACA,eAEA,wCACI,+BACA,UAIR,iCACI,atJ7EQ,CsJ8ER,0BAEA,uCACI,atJhFI,CsJoFZ,sCACI,gBAGJ,kCACI,kB;AChJR,oCACI,aACA,sBACA,mBACA,WACA,aAGJ,+BACI,aACA,UACA,mBAGJ,8BACI,UACA,WACA,kBACA,wBvJmCY,CuJlCZ,6DAEA,2CACI,uBAGJ,2CACI,uBAIR,+BACI,YACI,qBACA,WAEJ,IACI,mBACA,WAIR,kCACI,kBACA,avJlCU,CuJmCV,kBACA,uCAGJ,4BACI,KACI,UACA,2BAEJ,GACI,UACA,yB;;ACvDR,+BACI,kBACA,aACA,uBACA,UACA,eACA,sBACA,yBACA,oBACA,qBACA,axJEU,CwJDV,wBAEA,qCACI,oBxJqCQ,CwJpCR,wBxJZK,CwJgBb,kCACI,cACA,WACA,YACA,mBACA,sBACA,mBAGJ,+BACI,OACA,YACA,aACA,sBACA,WAEJ,kCACI,kBACA,QACA,UAGJ,+BACI,mBACA,kBACA,gBACA,sBACA,axJlCU,CwJmCV,gBACA,uBACA,mBAGJ,8BACI,iBACA,axJ9CU,CwJ+CV,gBACA,uBACA,mBACA,S;AC1DJ,gCACI,aACA,uBACA,UACA,eACA,sBACA,yBACA,oBACA,qBACA,azJGU,CyJFV,wBAEA,sCACI,oBzJsCQ,CyJrCR,wBzJXK,CyJeb,gCACI,cACA,WACA,YACA,mBACA,mBAGJ,gCACI,OACA,aACA,sBACA,WACA,YAGJ,iCACI,kBACA,gBACA,azJzBU,CyJ0BV,gBACA,uBACA,mBAGJ,+BACI,iBACA,azJrCU,CyJsCV,SACA,gBACA,uBACA,mB;ACjDJ,uCACI,aACA,sBACA,MAGJ,8BACI,oBACA,sBACA,qBAEA,mCACI,qBACA,qBACA,wB1JmCQ,C0JlCR,a1JwCQ,C0JvCR,kBACA,qBAKJ,4CACI,mBACA,gBACA,cACA,mBAGJ,8CACI,cACA,kBACA,kBAIR,gCACI,eACA,gBACA,cACA,oBAGJ,8BACI,mBAEA,0CACI,gBACA,UACA,SACA,aACA,sBACA,WAGJ,yCACI,aACA,uBAGJ,2CACI,cACA,aACA,cACA,aACA,mBACA,uBACA,wB1JbQ,C0JcR,WACA,kBACA,kBACA,oBACA,mBAGJ,4CACI,OAEA,wDACI,eACA,gBACA,a1JrEE,C0JsEF,oBAGJ,yDACI,kBACA,a1J9EE,C0J+EF,oBACA,gBAMR,gDACI,aACA,4DACA,UAKJ,kDACI,aACA,sBACA,UAKJ,8CACI,aACA,sBACA,U;AClHR,2CACI,aACA,sBACA,UAGJ,mCACI,mBAEA,oDACI,mBACA,gBACA,cACA,mBACA,gBAGJ,sDACI,cACA,SACA,gBACA,eAIR,gCACI,eACA,gBACA,cACA,wBAIA,iDACI,aACA,sBACA,UAGJ,gDACI,aACA,uBACA,UACA,eACA,sBACA,yBACA,oBACA,qBACA,a3JpCM,C2JqCN,wBAEA,sDACI,oB3JDI,C2JEJ,wB3JlDC,C2JsDT,gDACI,cACA,WACA,YACA,mBACA,mBAGJ,gDACI,OACA,aACA,sBACA,WACA,YAGJ,iDACI,kBACA,gBACA,a3JhEM,C2JiEN,gBACA,uBACA,mBAGJ,+CACI,iBACA,a3J5EM,C2J6EN,SACA,gBACA,uBACA,mB;AC1FR;EACE,cAAc;EACd,gBAAgB;EAChB;AACF;AACA;EACE;AACF;AACA;;;;;;;;;CASC;AACD;EACE,cAAc;EACd;AACF;AACA;;;;;;;EAOE,gCAAgC;EAChC;AACF;AACA;;;;EAIE,+BAA+B;EAC/B;AACF;AACA;;;;;;;;;;EAUE,iCAAiC;EACjC;AACF;AACA;;;EAGE,+BAA+B;EAC/B;AACF;AACA;;EAEE,iCAAiC;EACjC;AACF;AACA;;;EAGE,gCAAgC;EAChC;AACF;AACA;;;;EAIE,mCAAmC;EACnC;AACF;AACA;EACE,gDAAgD;EAChD;AACF;AACA;EACE,uCAAuC;EACvC,cAAc;EACd;AACF;AACA;EACE,oCAAoC;EACpC;AACF;AACA;EACE,sCAAsC;EACtC,cAAc;EACd;AACF;AACA;EACE,oCAAoC;EACpC,cAAc;EACd;AACF;AACA;EACE,wCAAwC;EACxC,cAAc;EACd;AACF;AACA;EACE,uCAAuC;EACvC,cAAc;EACd;AACF;AACA;;;;;;EAME,sBAAsB;;AAExB,C;ACjHA,sCACI,yBACA,yBACA,kCACA,gBACA,cAGJ,8CACI,aACA,mBACA,oBACA,UACA,sBACA,eACA,iBAEA,oDACI,wB7JjBK,C6JoBT,uDACI,WACA,YACA,a7JlBM,C6JmBN,cACA,8BAEA,+DACI,wBAKZ,6CACI,eACA,gBACA,a7J5BU,C6J6BV,OAGJ,gDACI,eACA,a7JrCU,C6JwCd,4CACI,6BACA,oBACA,aACA,sBACA,WAGJ,4CACI,aACA,sBACA,WAGJ,6CACI,kBACA,gBACA,a7JtDU,C6JyDd,4CACI,aACA,mBACA,YACA,iBACA,a7JjEU,C6JkEV,6FAGJ,6CACI,oBACA,mBACA,uBACA,kBACA,gBACA,iBACA,mBACA,gBACA,a7J7EU,C6J8EV,wB7JlFU,C6JmFV,uBACA,cACA,YAGJ,+CACI,iBACA,aACA,sBACA,UAGJ,+CACI,yBACA,sBACA,gBAGJ,sDACI,aACA,mBACA,YACA,qBACA,sBACA,eACA,iBACA,iBACA,gBACA,a7J3GU,C6J6GV,4DACI,wB7JpHK,C6JuHT,qEACI,aACA,cACA,a7JtHM,C6JuHN,cACA,8BAEA,6EACI,wBAKZ,qDACI,OAGJ,wDACI,a7JrIU,C6JsIV,gBAIA,gDACI,SACA,eACA,wB7JhJM,C6JiJN,sBACA,gBAEA,qDACI,6FACA,mBACA,a7JhJE,C6JiJF,qBACA,sBACA,YACA,yBACA,UAKR,0EACI,6BAEA,8EACI,gB;ACzKZ,gCACI,yBACA,mBACA,gBACA,mBACA,6BAEA,oDACI,cACA,kBACA,SACA,gBAGJ,sDACI,gBACA,aACA,mBACA,8BAGJ,oDACI,aACA,gBACA,kBACA,iEACA,uBAGJ,qDACI,qBACA,yBACA,WACA,gBACA,qBACA,yBACA,sBACA,eACA,wBACA,sBACA,iBAIA,6DACI,wB9JvBC,C8JwBD,a9J3CC,C8J+CT,sLAGI,iBACA,mB;ACtDR,4BACI,aACA,sBACA,YACA,gBACA,gBACA,kBAGJ,qCACI,OACA,gBACA,aACA,uBACA,aAGA,wDACI,UAGJ,8DACI,yBAGJ,8DACI,wB/JpBM,C+JqBN,kBAEA,oEACI,wB/JvBE,C+J4Bd,8BACI,yBACA,oBACA,qBACA,oBAEA,yCACI,cACA,kBACA,SACA,gBAGJ,yCACI,cACA,0BAEA,+CACI,cAIR,0CACI,qBACA,yBACA,WACA,kBACA,gBACA,wBACA,qBACA,yBACA,sBACA,YACA,wBAIR,8BACI,aACA,sBACA,mBACA,uBACA,YACA,kBACA,aACA,a/JvEU,C+JyEV,gDACI,WACA,YACA,mBACA,a/JlCQ,C+JoCR,oDACI,WACA,YAIR,iCACI,iBACA,gBACA,a/JrFM,C+JsFN,mBAGJ,gCACI,eACA,SACA,gBAIR,kCACI,oBAGJ,gCACI,WAGJ,yCACI,kBACA,SACA,SACA,2BACA,UACA,gBACA,kBACA,oCAGJ,uDACI,iB;AChIJ,mCACI,aACA,sBACA,YACA,gBAEA,yCACI,aAGJ,2CACI,oBACA,oIAEA,YACA,sCACA,0BACA,uDACA,cACA,aACA,mBACA,8BAGA,6DACI,OACA,2BAIJ,uDACI,cAEA,+DACI,iBACA,uBAKR,2DACI,OACA,yBAGJ,iDACI,aAEA,8DACI,mBAGJ,uDACI,WAIR,kDACI,eACA,gBACA,iBACA,cACA,SAGJ,2DACI,aACA,mBACA,WAEA,0EACI,aACA,mBACA,uBACA,WACA,YACA,UACA,gBACA,YACA,kBACA,eACA,cACA,aACA,sCAEA,gFACI,eACA,kBhKnFN,CgKsFE,wFACI,0BACA,mBAGJ,+FACI,kBhKxCJ,CgKyCI,WAEA,qGACI,kBhK3CR,CgKoDR,kDACI,OACA,aAKZ,qCACI,GACI,0BAEJ,KACI,6B;ACzHJ,4FACI,wBjKUM,CiKPN,sDACI,wBjKME,CiKLF,mBACA,iBAEJ,qDACI,WACA,gBAEJ,2DACI,UjKbD,CiKeH,oDACI,aACA,sDACI,qBAIZ,oCACI,aACA,MACA,UACA,6BACA,qDACI,YACA,gBACA,sBACA,gBACA,mBACA,iBACA,iBACA,SAEJ,gEACI,wBjKOE,CiKNF,sEACI,wBjKeA,CiKXZ,mCACI,aAIR,iEACI,mB;ACjDF,qEACE,alKQU,CkKPV,aACA,mBACA,OACA,uBACA,WACA,YACA,aACA,kBAEA,uEACE,oBAGF,yEACE,OACA,WACA,YACA,2BACA,mBAIA,+EACE,sBACA,alK0BQ,CkKzBR,oCACA,2BACA,mBACA,mBACA,mCACA,kCAIJ,2FACE,YACA,UACA,kBACA,iBACA,cACA,wBlKzBO,C;AmKrBZ,yBACC,iBACA,gBAGF,4CACE,UACA,wBnKIY,CmKDd,kDACE,wBnKHY,CmKMd,wDACE,wBnKNY,CoKHN,qCACI,gBACA,YACA,gBAEA,4CACI,UAIA,+CACI,apKJN,CoKKM,UACA,kBAMpB,sCACI,oBpKnBU,CoKoBV,apKdU,CoKeV,gCACA,aACA,mBAEA,yDACI,4BACA,aACA,mBACA,SACA,WAEA,kEACI,kBpKjCE,CoKoCN,kEACI,cACA,e;AC3CZ,SACI,mBAEA,gBACI,kBACA,kBACA,aACA,qBACA,QAEA,sBACI,arK4CI,CqKzCR,yBACI,WACA,cAGJ,sBACI,WACA,kBrKhBE,CqKiBF,WACA,OACA,kBAIA,4BACI,0BACA,mBAMR,kCACI,2BACA,iBACA,kBACA,gBACA,cAEA,0CACI,aACA,SACA,mBACA,iBAIA,mDACI,OACA,WACA,cAEJ,mDACI,aACA,QAGJ,gDACI,kBrKdL,CqKeK,YACA,aAIR,wCACI,kBrKrBD,CqKwBH,4CACI,kBACA,aAEA,8CACI,cACA,WACA,cACA,WAEA,oDACI,kBrKnCT,CqKoCS,YACA,aAOpB,sBACI,gBAIR,qCAKoB,mDACI,aACA,gB;ACvGpB,8BACI,cACA,YAEJ,6BACI,aACA,eACA,YACA,2BACA,mBAEJ,kCACI,aAIA,2EACI,aAGJ,0CACI,eAKZ,sCAEQ,8BACI,aAEJ,6BACI,qBACA,oBAEA,mCACI,sBACA,oCACA,2BACA,mBACA,mBACA,mCACA,kCACA,atKSA,E;AuKrDhB,gCACI,UACA,aACA,OACA,yBACA,eAEA,iDACI,kBACA,yBACA,aACA,sBACA,SACA,WAEA,iEACI,aACA,QACA,mBACA,WAEA,gFACI,aACA,eACA,UvKvBL,CuKwBK,eACA,gBAGJ,+EACI,aAGJ,gFACI,OACA,aACA,sBACA,kBACA,WAEA,qMAEI,avKnCN,CuKoCM,kBACA,UACA,QAEA,mNACI,SAGJ,iNACI,UAIR,sFACI,oBACA,iBACA,kBvKxDP,CuKyDO,oBvKvDN,CuKwDM,WACA,iBACA,YACA,sBAEA,oGACI,aAMhB,kEACI,evKzED,CuK0EC,eACA,YACA,yBAEA,gFACI,cACA,WACA,gBACA,aACA,uBACA,mBACA,QACA,yBACA,avKjCA,CuKkCA,kBACA,evKzFL,CuK+FH,yDACI,eACA,WACA,gBACA,SACA,UACA,YACA,YACA,kBAIQ,qNAEI,avKtGV,CuKyGM,8FACI,avK1GV,CuK2GU,OACA,gBACA,aACA,WAEA,4GACI,cACA,2BACA,YACA,iBACA,iBACA,sBAEA,wHACI,4BACA,6BAOpB,0EACI,cACA,gBAEA,sFACI,eAKZ,iDACI,kBACA,YACA,aACA,0BACA,OACA,MACA,YAMZ,sCACI,gCACI,YACA,0CACI,0BAGA,yDACI,WACA,MACA,OACA,yBACA,0BAEA,yEACI,WACA,mBACA,uFACI,eAQxB,qCAEQ,iDACI,cAGI,gFACI,cAGJ,wNAGI,aAIA,mFACI,yCACA,0CAQZ,yDACI,aACA,wEACI,aAIA,gPAGI,e;AAxNI,2FACI,cAEA,wMAEI,YACA,WAMZ,6EACI,evKnBjB,C;AwKDX,wEAEI,+B;ACFJ,+BACI,eACA,8BACA,mBACA,yBACA,SACA,cACA,YACA,WACA,YACA,YACA,mKACA,4CACA,aACA,sBACA,gBAGA,0CACI,gCAIJ,yBAvBJ,+BAwBQ,kBAGJ,2CACI,kBACA,UACA,MACA,SACA,UACA,iBACA,yBACA,aAGA,yBAXJ,2CAYQ,cAIR,uCACI,gBACA,cAGJ,oCACI,QACA,WAGA,gBACA,YAIA,+CAVJ,oCAWQ,gBACA,gBAIJ,yBAhBJ,oCAiBQ,eACA,gBAEA,0CACI,gBAKZ,qCACI,kBACA,YACA,MACA,gBACA,cACA,gBACA,eAGA,gDACI,mBACA,uBACA,uBACA,gBACA,UACA,oBAIR,wCACI,gBACA,0BACA,2BAGJ,gDACI,0BACA,2BAGJ,uCACI,2BAGJ,uCAEI,oGAGJ,uCAEI,oGAIA,0BACA,2B;AC3HR,yBACI,sBACA,iBACA,cAEA,kDACI,iBACA,iBACA,gBAEA,yEACI,UACA,aACA,uBACA,mBAGJ,2EACI,gB;ACjBZ,eACA,qBACA,oBAeA,gBACI,yCACA,qB3KjBO,C2KkBP,aACA,uBACA,mBACA,YACA,mBACA,yDACA,sBACA,4BACA,yBACA,a3KlBU,C2KmBV,iCACI,kBACA,cACA,kBACA,a3KjBK,C2KoBT,+BACI,sBACA,uBACA,cAEA,wDACI,aACA,WACA,uBACA,mBAEA,6JAEI,WAMhB,yBACI,wBACA,WACA,aAGA,+BACI,gBACA,mBAIJ,gCACI,gBACA,YACA,mBAIR,6CAEI,YACA,uBACA,mBAIA,yBACI,gBAEJ,yBACI,kBAEJ,wBACI,gBACA,mBAIR,yBACI,WAGJ,gDACI,iBACA,kBACA,kBACA,a3K5FU,C2K6FV,mDACI,iBACA,mBAEJ,mDACI,iBACA,qBAEJ,sDACI,cACA,a3KvGM,C2KwGN,kBAEJ,oEACI,mBAEJ,kDACI,mBAEJ,kDACI,a3KhFM,C2KkFV,gFACI,oB3KxHM,C2K0HV,0DACI,iBACA,uEACI,oB3K7EI,C2KiFR,wEACE,yBAIN,iEACI,mBAGJ,4DACI,gBAEJ,wDACI,yBACA,WACA,kBAEJ,wEACI,wB3KnGQ,C2KoGR,WACA,8EACI,wB3KrGI,C2KuGR,iFACI,wB3KzJE,C2K0JF,a3KzJE,C2K4JV,yEACI,a3K/GQ,C2KgHR,mBACA,+BACA,+EACI,+BACA,oB3KnHI,C2K6HhB,uCAEI,mBACA,OACA,aACA,sBAGJ,8BACI,gBA9KS,CA+KT,kBACA,WACA,YACA,gBACA,aACA,mBAEA,uCACI,aACA,sBACA,kBACA,gBACA,kBACA,WACA,YACA,uCAEJ,mCACI,wB3K5MK,C2K8MT,8CACI,qB3KjNG,C2KkNH,oB3K9MM,C2KkNd,2BACI,YACA,aACA,sBACA,OAEA,gCACI,wB3K3NK,C2K4NL,OAIR,kBACI,kBACA,WACA,SACA,YACA,gBAGJ,uBACI,eA9NS,CA+NT,iB1KjOS,C0KoOb,2FAGI,wBAGJ,4DAEI,UACA,4BAGJ,iCACI,kBAGJ,mBACI,kBACA,aACA,8BACA,eA9PY,CA+PZ,wCACI,kBACA,eAjQQ,CAkQR,cACA,WACA,gBACA,mBACA,+CACI,cAEJ,4DACI,UACA,mBAIZ,wBACI,iBACA,aACA,sBACA,uBACA,uBACA,8BACI,gBACA,kBACA,a3KtRM,C2KuRN,cAEJ,2BACI,a3KvRM,C2KwRN,mBAGR,uBACI,YACA,aACA,mBACA,eAEJ,WACI,wB3KlSU,C2KmSV,a3KxSU,C2KySV,YACA,kBACA,gCAEA,0BACI,wB3K9QM,C2K+QN,a3K3SM,C2K4SN,gBACA,mBACA,aACA,mBACA,8BACA,kBACA,mBAGJ,6BACI,wB3K1SK,C2K2SL,a3K9TK,C2K+TL,gBACA,gCACA,aACA,mBACA,8BACA,kBACA,mBAGR,WACI,YACA,qB3K5UO,C2K6UP,WAhUS,CAiUT,gCACA,aACA,mBACA,8BACA,eACA,WACA,4BACI,aACA,mBACA,sBAEJ,uBACI,iBACA,oBACA,WA/UK,CAgVL,WACA,6BACI,eAGR,qCACI,aACA,yCACI,Y3K3VE,C2K4VF,eAEJ,4CACI,eACA,wB3KjWE,C2KoWV,yCACI,aACA,aACA,mBACA,6CACI,UACA,eAEJ,gDACI,eACA,wB3KpXE,C2KuXV,0BACI,kBACA,aACA,sBACA,SAEA,8BACI,UACA,iBAEJ,mCACI,aACA,mBACA,iBACA,kBACA,2BACA,mBACA,sBACA,yDACI,iBACA,gBACA,wB3K3XH,C2K4XG,yBACA,kBACA,YACA,mBACA,QAEJ,yCACI,oCACA,2BACA,mBACA,mBACA,mCACA,kCAIZ,2BACI,uBACA,oB3K3ZM,C2K6ZV,gCACI,YACA,mCACI,e3KvaD,C2KwaC,yBAEA,gDACI,2BACA,sDACI,kB3K1aN,C2K2aM,sHACI,a3KzXR,C2K0XQ,Y3K1XR,C2KiYR,0CACI,kBACA,gDACI,kBACA,WACA,UACA,YACA,kB3K1bF,C2K2bE,QAKR,yFAEI,eAIZ,sCAEQ,qEACI,aACA,mBACA,gFACI,yBACA,2BAGA,sFACI,sBACA,oCACA,2BACA,mBACA,oB3KpaJ,E2K0aZ,wBACI,WACA,eA5dQ,CA6dR,kBACA,MACA,aACA,8CACI,gBACA,4BACA,aACA,OACA,8BACA,mBACA,YACA,gBAEJ,6CACI,WACA,oB3K7eE,C2K8eF,eAIQ,wJACI,a3KjcR,C2KkcQ,Y3KlcR,C2KwcZ,4BACI,WACA,cAnfK,CAqfL,0CACI,UAEJ,iDACI,WAjgBI,CAugBZ,sCACI,mBACA,0DACI,mBAGI,4IACI,a3K9fP,C2K+fO,Y3K/fP,C2K0gBL,2EACI,eAKZ,4BACI,gCACA,4BACA,aACA,+BACA,gCACI,Y3KpiBM,C2KqiBN,WAEJ,uCACI,UACA,W3KhjBG,C2KkjBP,kCACI,iBACA,a3K1iBM,C2K2iBN,mBACA,oBAIR,mCACI,gCACA,4BACA,aACA,mBACA,+BACA,WAnjBS,CAojBT,uCACI,S3KlkBG,C2KmkBH,WAEJ,yCACI,iBACA,U3KvkBG,C2KwkBH,mBACA,oBAIR,eACI,eACA,YACA,WACA,8BACA,sCACA,WA9kBY,CAglBZ,4CACI,WACA,sBACA,8BAGQ,yEACI,a3KhkBN,C2KkkBE,uEACI,Y3KnkBN,C2KokBM,8EACI,UACA,c3KtkBV,C2K6kBV,2CACI,QACA,gBACA,4DACI,a3KjlBE,C2KklBF,iBACA,iBACA,kBACA,mBACA,gBACA,uBAEJ,wDACI,kBAGA,kEACI,wB3KlnBF,C2KonBF,qEACI,a3KjmBF,C2KmmBF,mEACI,Y3KpmBF,C2KqmBE,0EACI,UACA,c3KvmBN,C2K6mBV,mCACI,aACA,aAGQ,wHACI,a3K1nBP,C2K2nBO,Y3K3nBP,C2K8nBD,uDACI,kB3KjpBF,C2KkpBE,mBAKJ,2EACI,iBAIZ,oBACI,OAEJ,sBACI,YAEJ,wCACI,aACA,QAEJ,sCACI,wB3K/pBM,C2KgqBN,WACA,iBACA,YACA,cACA,iBACA,gCACA,uBACA,mBACA,gBAEJ,wDACI,UAEJ,4BACI,aACA,8BACA,gCAEJ,yBACI,oBACA,WAEJ,qCACI,iBACA,wB3K/qBK,C2KgrBL,yBAGA,oDACI,6BAMZ,sCAEI,yBACI,UAEJ,eACI,OACA,kBAGA,qCACI,aAEJ,+KAII,aAEJ,4BACI,YAEJ,uBACI,cAMR,qBACI,eAvuBQ,CAwuBR,kBACA,gCACA,YACA,YACA,OACA,e3KlvBG,C2KmvBH,+BACA,cAGI,yDACI,iBAEA,wEACI,YAEA,wFACI,mBACA,eACA,yBACA,a3K3vBV,C2K4vBU,eAKA,wGACI,uBAEA,qHACI,gBAGJ,qHACI,iBACA,kBACA,2IACI,gBAGJ,yHACI,QAGJ,2HACI,kB3KvxBtB,C2K4xBkB,yIACI,kB3KzuBpB,C2K0uBoB,WAKJ,+HACI,a3KjyBtB,C2KkyBsB,mBAW5B,wCACI,YAEA,+CACI,YAGR,oCACI,mBAOZ,sCAEQ,qBACI,YACA,2BACA,uBAEA,4BACI,qCACA,OAIR,iBACI,oBCn1BZ,sCAEE,4BAGF,gCAEE,UAIF,8DAEE,+BAGF,wDAEE,UAIF,sDAEE,+BAEF,gDAEE,UAGF,gDACE,mCAGF,qCACE,UCpCF,QACE,8BAEF,kBACE,QACE,uBAEF,IACE,uBAEF,IACE,wBAEF,IACE,wBAIJ,aACE,gDAGF,uBACE,GACE,mBAEF,IACE,qBAEF,KACE,oBAIJ,OACE,sCAEF,2BACE,GACE,oCAEF,KACE,qCC1CJ,UACI,iBACA,yBACA,kBACA,sBACA,aACI,SAIR,wBACI,aACA,QACA,8BACI,cAEJ,sCACI,iBACA,uBACA,+BACA,wBACA,uBACA,sFACI,gBACA,kBACA,gBAEJ,0CACI,6BACA,mBACA,+BACA,+BACA,sDAGA,gDACI,mCAGR,4CACI,0BAEJ,4CACI,eAEJ,6CACI,kBACA,sBACA,sBAEJ,4FAEI,kBACA,sBACA,sBAEJ,+CACI,kBACA,sBACA,sBAEJ,4CACI,kBACA,sBACA,sBAEJ,+CACI,kBACA,sBACA,sBAEJ,4CACI,YC/DZ,WACI,oBACA,kBACA,gBACA,0DACA,uKAKJ,eACI,YACA,aACA,sBACA,OAGJ,SACI,gBAGJ,QACI,OACA,wB/KxBU,C+K2Bd,SACI,a/KUU,C+KTV,eACI,eACA,a/KSM,C+KRN,0BAIR,WACI,WACA,YACA,kBAEJ,iBACI,WACA,YACA,kBAEJ,YACI,wB/K1CU,C+K2CV,oCACI,wB/KvBM,C+KwBN,0CACI,wB/KxBE,C+K6Bd,YACI,WACA,YACA,eACI,iBACA,gBACA,gBAEJ,wBACI,a/K3DM,C+K6DV,uBACI,WAIR,sBACI,eACA,mFACI,yCACA,iDAEJ,4BACI,a/K1CM,C+K8Cd,YACI,WACA,YACA,iBAGJ,iBACI,a/KrDU,C+KsDV,uBACI,a/KrDM,C+K0DV,uBACI,mBAEJ,yBACI,YACA,aAIR,+BACI,wB/K7GU,C+K8GV,a/K3GU,C+K4GV,kBACA,yBACA,aACA,kBAEA,iEACI,kBAMD,4BACI,cACA,kBACA,mBACA,oBACA,yBAKX,MACI,eAGJ,cACI,yBACA,UAIJ,6BACI,eAGJ,2CACI,mBAGJ,gBACI,aACA,mBACA,sBACI,a/KpHM,C+KqHN,eACA,4BACI,0BAGR,sCACI,oBACA,WAMR,mFAEI,a/KpIU,C+KuId,sEACI,wB/KhLS,C+KiLT,kFACI,kBAIR,uFACI,wB/KtLU,C+KyLd,gBACI,kBACA,wB/KzJU,C+K0JV,a/KvLU,C+KwLV,gBACA,yBACA,aACA,mBACA,uBACA,iBAEA,wBACI,gBACA,YACA,gBAIR,kBACE,oBACA,4BACA,qBACA,gBACA,uBAGA,6BACE,qBAEF,+BACE,qBAEF,8BACE,yB;AChOJ,iEAAc,CAAd,8FAAc;;AAAd;;;CAAc;;AAAd;;CAAc;;AAAd;;;CCcC,sBAAsB;ADdT;;AAAd;;CAAc;;AAAd;CCsBC,gBAAgB;CAChB,cAAW;IAAX,WAAW;ADvBE;;AAAd;;;CAAc;;AAAd;CCgCC,iBAAiB,EAAE,MAAM;CACzB,8BAA8B,EAAE,MAAM;ADjCzB;;AAAd;;;CAAc;;AAAd;;CAAc;;AAAd;CC8CC,SAAS;AD9CI;;AAAd;;CAAc;;AAAd;CCsDC;;;;;;;;;kBASiB;AD/DJ;;AAAd;;;CAAc;;AAAd;;;CAAc;;AAAd;CC6EC,SAAS,EAAE,MAAM;CACjB,cAAc,EAAE,MAAM;AD9ET;;AAAd;;;CAAc;;AAAd;;CAAc;;AAAd;CC2FC,yCAAiC;SAAjC,iCAAiC;AD3FpB;;AAAd;;CAAc;;AAAd;;CCoGC,mBAAmB;ADpGN;;AAAd;;;CAAc;;AAAd;;;;CCgHC;;;;;;WAMU,EAAE,MAAM;CAClB,cAAc,EAAE,MAAM;ADvHT;;AAAd;;CAAc;;AAAd;CC+HC,cAAc;AD/HD;;AAAd;;CAAc;;AAAd;;CCwIC,cAAc;CACd,cAAc;CACd,kBAAkB;CAClB,wBAAwB;AD3IX;;AAAd;CC+IC,eAAe;AD/IF;;AAAd;CCmJC,WAAW;ADnJE;;AAAd;;;CAAc;;AAAd;;;CAAc;;AAAd;CCiKC,cAAc,EAAE,MAAM;CACtB,qBAAqB,EAAE,MAAM;ADlKhB;;AAAd;;;CAAc;;AAAd;;;CAAc;;AAAd;;;;;CCoLC,oBAAoB,EAAE,MAAM;CAC5B,eAAe,EAAE,MAAM;CACvB,iBAAiB,EAAE,MAAM;CACzB,SAAS,EAAE,MAAM;ADvLJ;;AAAd;;;CAAc;;AAAd;SCgMS,MAAM;CACd,oBAAoB;ADjMP;;AAAd;;CAAc;;AAAd;;;;CC4MC,0BAA0B;AD5Mb;;AAAd;;CAAc;;AAAd;CCoNC,kBAAkB;CAClB,UAAU;ADrNG;;AAAd;;CAAc;;AAAd;CC6NC,8BAA8B;AD7NjB;;AAAd;;;CAAc;;AAAd;CCsOC,gBAAgB;ADtOH;;AAAd;;CAAc;;AAAd;CC8OC,UAAU;AD9OG;;AAAd;;CAAc;;AAAd;CCsPC,wBAAwB;ADtPX;;AAAd;;CAAc;;AAAd;;CC+PC,YAAY;AD/PC;;AAAd;;;CAAc;;AAAd;CCwQC,6BAA6B,EAAE,MAAM;CACrC,oBAAoB,EAAE,MAAM;ADzQf;;AAAd;;CAAc;;AAAd;CCiRC,wBAAwB;ADjRX;;AAAd;;;CAAc;;AAAd;CC0RC,0BAA0B,EAAE,MAAM;CAClC,aAAa,EAAE,MAAM;AD3RR;;AAAd;;;CAAc;;AAAd;;CAAc;;AAAd;CCwSC,kBAAkB;ADxSL,CAAd;;;;EAAc;;AAAd;;EAAc;;AAAd;;;;;;;;;;;;;EEuBE,SAAS;AFvBG;;AAAd;EE2BE,6BAA6B;EAC7B,sBAAsB;AF5BV;;AAAd;EEgCE,SAAS;EACT,UAAU;AFjCE;;AAAd;;EEsCE,gBAAgB;EAChB,SAAS;EACT,UAAU;AFxCE;;AAAd;;EAAc;;AAAd;;;;;EAAc;;AAAd;EEuDE,4NAAsP,EAAE,MAAM;EAC9P,gBAAgB,EAAE,MAAM;AFxDZ;;;AAAd;;;EAAc;;AAAd;EEkEE,oBAAoB;EACpB,oBAAoB;AFnER;;AAAd;;;;;;;;;;;;;;;;;;;;;;;;EAAc;;AAAd;;;EEmGE,sBAAsB,EAAE,MAAM;EAC9B,eAAe,EAAE,MAAM;EACvB,mBAAmB,EAAE,MAAM;EAC3B,0BAA0B,EAAE,MAAM;AFtGtB;;AAAd;;EAAc;;AAAd;EE8GE,qBAAqB;AF9GT;;AAAd;;;;;;;;EAAc;;AAAd;EE4HE,mBAAmB;AF5HP;;AAAd;EEgIE,gBAAgB;AFhIJ;;AAAd;EEqIE,UAAU;EACV,cAAwC;AFtI5B;;AAAd;;EEqIE,UAAU;EACV,cAAwC;AFtI5B;;AAAd;;EE2IE,eAAe;AF3IH;;AAAd;;;;;;EAAc;;AAAd;CEuJC,aAAa;AFvJA;;AAAd;EE2JE,yBAAyB;AF3Jb;;AAAd;;;;;;EEoKE,kBAAkB;EAClB,oBAAoB;AFrKR;;AAAd;;;EAAc;;AAAd;EE8KE,cAAc;EACd,wBAAwB;AF/KZ;;AAAd;;;;;;EAAc;;AAAd;;;;;EE+LE,UAAU;EACV,oBAAoB;EACpB,cAAc;AFjMF;;AAAd;;;;;EAAc;;AAAd;;;;EE+ME,+GAAyI;AF/M7H;;AAAd;;;;;;;;;;;;;;;EAAc;;AAAd;;;;;;;;EE2OE,cAAc,EAAE,MAAM;EACtB,sBAAsB,EAAE,MAAM;AF5OlB;;AAAd;;;;;EAAc;;AAAd;;EEwPE,eAAe;EACf,YAAY;AFzPA;;AAAd;;EAAc;;AAAd;EEiQE,aAAa;AFjQD;;AGAd;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IHAA;;;;;;;;;;;OAAc;;IGAd;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;IAAA;SAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;;IHAA,gFAAc;IGAd;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;AHCA;CGDA;AHCoB;AAApB;CGDA;AHCoB;AAApB;;CGDA;EAAA;EAAA;;CAAA;EAAA;EAAA;AHCoB;AAApB;;CGDA;EAAA;EAAA;;CAAA;EAAA;EAAA;AHCoB;AAApB;;CGDA;EAAA;EAAA;;CAAA;EAAA;EAAA;AHCoB;AAApB;;CGDA;EAAA;EAAA;;CAAA;EAAA;EAAA;AHCoB;AAApB;;CGDA;EAAA;EAAA;;CAAA;EAAA;EAAA;AHCoB;AGDpB;CAAA;CAAA;AAAA;;CAAA;EAAA;EAAA;CAAA;AAAA;CAAA;CAAA;CAAA;AAAA;;CAAA;EAAA;EAAA;CAAA;AHEA;CGFA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;;CGFA;EAAA;EAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;;CGFA;EAAA;EAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;IAAA;SAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;MAAA;AHEmB;AAAnB;CGFA;MAAA;AHEmB;AAAnB;CGFA;MAAA;AHEmB;AAAnB;CGFA;MAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAFnB;CGAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;;CGAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;AH2TA;AA3TA;;CGAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;AH2TA;AA3TA;;CGAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;AH2TA;AA3TA;;CGAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;AH2TA;AA3TA;;CGAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;AH2TA;;AIzTA,6BACI,WACA,WACA,wBpLEU,CoLDV,gBACA,mB;ACLJ,aACI,gBAGI,+CACI,4BACA,6BAIR,gCACI,4BACA,yBACA,cpLMM,CoLLN,gBACA,sCACI,oBrLVE,CqLWF,aAIR,yBACI,kBrLnBK,CqLoBL,+CACA,iBACA,YACA,gBACA,UACA,8BACA,+BACA,gCAGJ,wBACI,eACA,gCAEA,qCACI,mBAGJ,2CACI,gBACA,+BAEA,oDACI,wBrLzCF,CqL4CF,kDACI,yBAGJ,2DACI,2BAIR,8BACI,wBrLtDE,CqLuDF,wDACI,2B","sources":["webpack://@flowfuse/flowfuse/./frontend/src/ui-components/stylesheets/ff-core.scss","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/stylesheets/ff-colors.scss","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/stylesheets/ff-utility.scss","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/stylesheets/ff-components.scss","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/stylesheets/ff-theme-light.scss","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/stylesheets/ff-theme-dark.scss","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/stylesheets/ff-immersive-editor.scss","webpack://@flowfuse/flowfuse/./frontend/src/components/dialogs/EducationModal.vue","webpack://@flowfuse/flowfuse/./frontend/src/layouts/Docs.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/notifications.scss","webpack://@flowfuse/flowfuse/./frontend/src/components/ExpertButton.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/empty-state.scss","webpack://@flowfuse/flowfuse/./frontend/src/components/TeamTypeTile.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/PageNotFound.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/SectionTopMenu.vue","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/components/form/ListBox.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/audit-log.scss","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/accordion.scss","webpack://@flowfuse/flowfuse/./frontend/src/components/dialogs/AssetDetailDialog.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/blueprints/BlueprintTile.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/admin/FlowBlueprints/dialogs/ImportFlowBlueprintsDialog.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/admin/FlowBlueprints/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/admin/NotificationsHub.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/admin/Template/sections/Catalogues.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/admin/Template/sections/NPMRegistry.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/TextCopier.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/admin/Template/sections/Environment.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/pages/admin.scss","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/info-card.scss","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/components/PopoverItem.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/icons-animated/Installing.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/icons-animated/Pulling.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/icons-animated/Pushing.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/icons-animated/Restarting.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/icons-animated/Starting.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/device/Overview.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/charts/performance/CpuChart.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/charts/performance/MemoryChart.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/notices/NoticeBanner.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/dialogs/device-group-management/components/device-list.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/elements/ToggleButtonGroup.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/device/VersionHistory/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/dialogs/AssetCompareDialog.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/flow-viewer/FlowViewer.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/drawers/snapshots/SnapshotDetailsDrawer.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/device/VersionHistory/Snapshots/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/version-history/timeline/TimelineGraph.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/version-history/timeline/TimelineEvent.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/device/VersionHistory/Timeline/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Devices/dialogs/components/DeviceCredentialsDialog/InstallationMethodSelector.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Devices/dialogs/components/DeviceCredentialsDialog/OsSelector.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/device/components/AssignDeviceDialog.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/device/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/ResizeBar.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/immersive-editor/DrawerTrigger.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/immersive-editor/LoadingScreenWrapper.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/device/Editor/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/blueprint-selection.scss","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/Blueprints/BlueprintSelection.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/dialogs/BlueprintSelectorDialog.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/components/InstanceForm.vue","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/components/form/DateTime.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/Settings/Maintenance.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/VersionHistory/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/VersionHistory/Timeline/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/FileUpload.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/file-browser/cells/FilePath.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/file-browser/VisibilitySelector.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/Assets.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/DevicesBrowser.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/StepSlider.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/MultiStepForm.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/instance/steps/ApplicationStep.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/instance/steps/DuplicationStep.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/instance/steps/InstanceStep.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/components/InstanceLogs.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/pages/project.scss","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/Overview.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/Performance/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/instance/ActionButton.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/components/DashboardLink.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/components/EditorLink.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/instance/steps/flows-step/BlueprintsSection.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/instance/steps/flows-step/ImportFlowsSection.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/instance/steps/flows-step/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/bill-of-materials/InstancesItem.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/bill-of-materials/VersionsList.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/bill-of-materials/DependencyItem.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/application/DeviceGroup/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/pipelines.scss","webpack://@flowfuse/flowfuse/./frontend/src/pages/application/components/cells/DeploymentName.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/pipelines/DeployStageDialog.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/application/Settings/components/RoleRow.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/IconLink.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/components/ApplicationSummaryLabel.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/tiles/InstanceCounter.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Applications/components/Application.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/applications-list.scss","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Applications/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/AuditLog.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Billing/components/UsageOverview.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/tiles/MediumTile.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Clients/components/BrokerClient.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Clients/dialogs/ClientDialog.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Clients/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Docs/components/TopicDocs.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Docs/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Hierarchy/components/TopicSegment.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Hierarchy/TopicHierarchy/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Hierarchy/TopicInspector/PayloadMetadata.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Hierarchy/components/TopicSchema.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Hierarchy/components/suggestions/TopicSuggestion.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Hierarchy/TopicInspector/PayloadSchema.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Hierarchy/TopicInspector/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Hierarchy/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/components/BrokerForm.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Home/components/DashboardSection.vue","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/components/kebab-menu/KebabMenu.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/components/InstanceMinimalStatusBadge.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Home/components/RecentlyModifiedDevices.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Home/components/RecentlyModifiedInstances.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Home/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Library/Blueprints.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Library/Registry/components/RegistryEntry.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Library/Registry/Index.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/code-previewer.scss","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Library/TeamLibrary.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Members/components/ApplicationPermissionsRow.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Performance/components/CPUUtilizationCell.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Pipelines/components/TeamPipelineStage.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Pipelines/components/TeamPipeline.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Pipelines/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Settings/TeamAdminTools.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/TableExplorer/components/RowsHeader.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/TableExplorer/components/table-cells/text-cell.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/TableExplorer/components/RowsList.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/TableExplorer/drawers/components/TableColumn.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/TableExplorer/drawers/CreateTable.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/TableExplorer/drawers/TableSchema.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/TableExplorer/components/TablesList.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/TableExplorer/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/components/TableCredentials.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/components/ChooseDatabase.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/components/DatabaseForm.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/instance/steps/TeamStep.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/components/CapabilitiesSelector.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/components/ContextSelector.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/components/ContextChip/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/components/IncludeDebugContextButton.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/components/IncludeSelectionButton.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/ExpertChatInput.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/ExpertChatMessage.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/ExpertLoadingDots.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/resource-cards/PackageResourceCard.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/resource-cards/StandardResourceCard.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/ExpertRichGuide.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/ExpertRichResources.vue","webpack://@flowfuse/flowfuse/./node_modules/highlight.js/styles/github.css","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/ExpertToolCall.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/components/UpdateBanner.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/Expert.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/drawers/expert/ExpertDrawer.vue","webpack://@flowfuse/flowfuse/./frontend/src/tours/tour-theme.scss","webpack://@flowfuse/flowfuse/./frontend/src/components/NotificationsButton.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/team-list.scss","webpack://@flowfuse/flowfuse/./frontend/src/components/TeamSelection.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/global-search/components/ResultSection.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/global-search/components/SearchTrigger.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/global-search/GlobalSearch.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/drawers/LeftDrawer.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/drawers/RightDrawer.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/pages/login.scss","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/layouts.scss","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/transitions.scss","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/animations.scss","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/charts.scss","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/common.scss","webpack://@flowfuse/flowfuse/./frontend/src/index.css","webpack://@flowfuse/flowfuse/./frontend/src/%3Cinput%20css%20BzM08p%3E","webpack://@flowfuse/flowfuse/./frontend/src/%3Cinput%20css%20A_4aTr%3E","webpack://@flowfuse/flowfuse/<no source>","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/components/Divider.vue","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/components/form/ComboBox.vue"],"sourcesContent":["/*\n ff-core contains styling on the fundamental HTML elements\n*/\n\n* {\n box-sizing: border-box;\n}\n\n.transition-fade--color {\n --time: 0.3s;\n transition: var(--time) color, var(--time) background-color, var(--time) fill, var(--time) stroke, var(--time) border-color;\n -webkit-transition: var(--time) color, var(--time) background-color, var(--time) fill, var(--time) stroke, var(--time) border-color;\n}\n\nhtml {\n font-family: ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";\n font-size: 14px;\n line-height: 1.25rem;\n}\n\nbody {\n margin: 0;\n color: $ff-grey-800;\n position: relative;\n overflow: hidden;\n}\n\nh1 {\n font-weight: bold;\n font-size: $ff-funit-xl;\n line-height: 1.45 * $ff-funit-xl;\n margin-bottom: $ff-unit-lg;\n}\n\nh2 {\n font-weight: bold;\n font-size: $ff-funit-lg;\n line-height: 1.45 * $ff-funit-lg;\n margin-bottom: $ff-unit-sm;\n}\n\nh3 {\n font-size: $ff-funit-md;\n line-height: 1.45 * $ff-funit-md;\n margin-bottom: $ff-unit-sm;\n font-weight: bold;\n}\n\nh4 {\n font-size: $ff-funit-md;\n line-height: 1.45 * $ff-funit-sm;\n margin-bottom: $ff-unit-sm;\n font-weight: 500;\n}\n\ncode {\n border-radius: $ff-unit-sm;\n border: 1px solid $ff-grey-200;\n padding: $ff-unit-md;\n}\n\np code {\n padding: 0 $ff-unit-xs;\n}\n\n.ff-description {\n font-size: $ff-funit-sm;\n color: $ff-grey-400;\n}\n","// Raw Color Scheme\n\n$ff-black: black;\n$ff-white: white;\n\n$ff-grey-50: #F9FAFB;\n$ff-grey-100: #F3F4F6;\n$ff-grey-200: #E5E7EB;\n$ff-grey-300: #D1D5DB;\n$ff-grey-400: #9CA3AF;\n$ff-grey-500: #6B7280;\n$ff-grey-600: #4B5563;\n$ff-grey-700: #374151;\n$ff-grey-800: #1F2937;\n$ff-grey-900: #111827;\n\n$ff-red-50: #FFEBEB;\n$ff-red-100: #FFC6C6;\n$ff-red-200: #FF8D8D;\n$ff-red-300: #F16F6F;\n$ff-red-400: #ED4E4E;\n$ff-red-500: #D12B2B;\n$ff-red-500B: #D82525;\n$ff-red-600: #BC3838;\n$ff-red-700: #AB1818;\n$ff-red-800: #8F0001;\n$ff-red-900: #760000;\n\n$ff-teal-50: #E4FBFC;\n$ff-teal-100: #C4F3F5;\n$ff-teal-200: #B2EBEE;\n$ff-teal-300: #8CE2E7;\n$ff-teal-400: #74D4D9;\n$ff-teal-500: #50C3C9;\n$ff-teal-600: #35AAB0;\n$ff-teal-700: #31959A;\n$ff-teal-800: #397B7E;\n$ff-teal-900: #406466;\n\n$ff-blue-50: #EFF6FF;\n$ff-blue-100: #DBEAFE;\n$ff-blue-200: #BFDBFE;\n$ff-blue-300: #93C5FD;\n$ff-blue-400: #60A5FA;\n$ff-blue-500: #3B82F6;\n$ff-blue-600: #2563EB;\n$ff-blue-700: #1D4ED8;\n$ff-blue-800: #1E40AF;\n$ff-blue-900: #1E3A8A;\n\n$ff-indigo-50: #EEF2FF;\n$ff-indigo-100: #E0E7FF;\n$ff-indigo-200: #C7D2FE;\n$ff-indigo-300: #A5B4FC;\n$ff-indigo-400: #818CF8;\n$ff-indigo-500: #6366F1;\n$ff-indigo-600: #4F46E5;\n$ff-indigo-700: #4338CA;\n$ff-indigo-800: #3730A3;\n$ff-indigo-900: #312E81;\n\n$ff-green-50: #ECFDF5;\n$ff-green-100: #D1FAE5;\n$ff-green-200: #A7F3D0;\n$ff-green-300: #6EE7B7;\n$ff-green-400: #34D399;\n$ff-green-500: #10B981;\n$ff-green-600: #059669;\n$ff-green-700: #047857;\n$ff-green-800: #065F46;\n$ff-green-900: #064E3B;\n\n$ff-yellow-10: #FFFCF5;\n$ff-yellow-50: #FFFBEB;\n$ff-yellow-100: #FEF3C7;\n$ff-yellow-200: #FDE68A;\n$ff-yellow-300: #FCD34D;\n$ff-yellow-400: #FBBF24;\n$ff-yellow-500: #F59E0B;\n$ff-yellow-600: #D97706;\n$ff-yellow-700: #B45309;\n$ff-yellow-800: #92400E;\n$ff-yellow-900: #78350F;\n\n// Theme Colors\n\n$ff-color--action: $ff-indigo-800;\n$ff-color--highlight: $ff-indigo-600;\n$ff-color--highlight--light: $ff-grey-100;\n$ff-color--danger: $ff-red-500;\n$ff-color--danger--dark: $ff-red-600;\n$ff-color--disabled: $ff-grey-400;\n$ff-color--border: $ff-grey-200;\n$ff-color--context-menu: $ff-white;\n","/*\n ff-utility contains functional variables and classes for padding/margin and sizings\n*/\n\n// screen sizes\n$ff-screen-sm: 640px;\n$ff-screen-md: 768px;\n$ff-screen-lg: 1024px;\n$ff-screen-xl: 1280px;\n$ff-screen-2xl: 1536px;\n\n// unit\n$ff-unit-xs: 3px;\n$ff-unit-sm: 6px;\n$ff-unit-md: 9px;\n$ff-unit-lg: 18px;\n$ff-unit-xl: 27px;\n\n// font unit\n$ff-funit-xs: 0.75rem;\n$ff-funit-sm: 0.85rem;\n$ff-funit-md: 1rem;\n$ff-funit-lg: 1.5rem;\n$ff-funit-xl: 2rem;\n\n@mixin truncate {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n","/*\n ff-core contains styling on the custom, ff components\n*/\n\n.ff-icon {\n width: 20px;\n height: 20px;\n display: inline-block;\n}\n\n.ff-disabled {\n pointer-events: none;\n opacity: 0.4;\n}\n\n.ff-icon-sm {\n width: 16px;\n height: 16px;\n display: inline-block;\n}\n\n.ff-icon-md {\n width: 20px;\n height: 20px;\n display: inline-block;\n}\n\n.ff-icon-lg {\n width: 24px;\n width: 24px;\n height: 24px;\n display: inline-block;\n}\n\n/*\n FF Breadcrumb\n*/\n\n.ff-nav-breadcrumb {\n display: flex;\n align-items: center;\n a {\n color: $ff-blue-600;\n font-weight: bold;\n font-size: 1.25rem;\n line-height: 1.75rem;\n white-space: nowrap;\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.ff-nav-breadcrumb--active span {\n color: $ff-grey-800;\n font-weight: bold;\n font-size: 1.25rem;\n line-height: 1.75rem;\n white-space: nowrap;\n}\n\n/*\n FF Button\n*/\n\n// nested element\n.ff-btn--icon,\n.ff-btn--icon svg {\n width: 20px;\n height: 20px;\n}\n.ff-btn--icon-left {\n margin-left: -$ff-unit-xs;\n margin-right: $ff-unit-sm;\n}\n.ff-btn--icon-right {\n margin-left: $ff-unit-sm;\n margin-right: -$ff-unit-xs;\n}\n\n.ff-btn {\n border-radius: $ff-unit-sm;\n display: flex;\n align-items: center;\n font-size: $ff-funit-sm;\n line-height: 20px;\n height: 32px;\n position: relative;\n\n justify-content: center;\n font-weight: bold;\n height: auto;\n padding: $ff-unit-sm 16px;\n border: 0;\n\n &.ff-btn-icon {\n padding: $ff-unit-sm $ff-unit-md;\n }\n\n &.ff-btn-small {\n padding: $ff-unit-xs $ff-unit-sm;\n font-size: $ff-funit-xs;\n line-height: 16px;\n height: 24px;\n }\n\n &.ff-btn-medium {\n padding: $ff-unit-xs $ff-unit-sm;\n font-size: $ff-funit-xs;\n line-height: 18px;\n height: 26px;\n }\n\n &.ff-btn-fwidth {\n justify-content: center;\n }\n\n &:hover {\n cursor: pointer;\n }\n\n &--primary {\n background-color: $ff-color--action;\n border: 1px solid $ff-color--action;\n color: $ff-grey-50;\n &:hover, &.active {\n background-color: $ff-color--highlight;\n }\n }\n &--secondary {\n background-color: $ff-white;\n color: $ff-color--action;\n border: 1px solid $ff-color--action;\n &:hover, &.active {\n background-color: $ff-color--highlight;\n border-color: $ff-color--highlight;\n color: $ff-white;\n }\n }\n &--tertiary {\n color: $ff-color--action;\n &:hover, &.active {\n background-color: $ff-color--highlight;\n color: $ff-white;\n }\n &[disabled=\"\"] {\n background-color: transparent !important;\n }\n }\n &--danger {\n color: $ff-white;\n background-color: $ff-color--danger;\n border: 1px solid $ff-color--danger;\n &:hover {\n background-color: $ff-color--danger--dark;\n color: $ff-white;\n }\n }\n &--secondary-danger {\n color: $ff-color--danger;\n background-color: $ff-white;\n border: 1px solid $ff-color--danger;\n &:hover {\n background-color: $ff-color--danger--dark;\n color: $ff-white;\n }\n }\n &--tertiary-danger {\n color: $ff-color--danger;\n &:hover {\n background-color: $ff-color--danger--dark;\n color: $ff-white;\n }\n }\n\n &.ff-btn-small {\n .ff-btn--icon,\n .ff-btn--icon svg {\n width: 16px;\n height: 16px;\n }\n .ff-btn--icon-left {\n margin-right: $ff-unit-xs;\n }\n .ff-btn--icon-right {\n margin-left: $ff-unit-xs;\n }\n }\n\n &.ff-btn-fwidth {\n .ff-btn--icon {\n position: absolute;\n }\n .ff-btn--icon-left {\n left: 0;\n padding-left: $ff-unit-lg;\n }\n .ff-btn--icon-left {\n right: 0;\n padding-right: $ff-unit-lg;\n }\n }\n\n &:disabled,\n &[disabled=true] {\n cursor: not-allowed;\n border-color: $ff-grey-200;\n color: $ff-grey-400;\n background-color: $ff-grey-200;\n }\n}\n\n/*\n Drawer responsive context\n Remove icon margins when buttons are in icon-only mode within narrow drawer\n*/\n@container drawer (max-width: 639px) {\n .ff-btn-icon {\n .ff-btn--icon-left {\n margin-left: 0;\n margin-right: 0;\n }\n .ff-btn--icon-right {\n margin-left: 0;\n margin-right: 0;\n }\n }\n}\n\n/*\n Viewport responsive context (for pages outside drawer, e.g., instance overview)\n Remove icon margins when viewport is narrow and buttons are in icon-only mode\n Breakpoint matches Tailwind's sm breakpoint (640px)\n*/\n@media (max-width: 639px) {\n .ff-btn-icon {\n .ff-btn--icon-left {\n margin-left: 0;\n margin-right: 0;\n }\n .ff-btn--icon-right {\n margin-left: 0;\n margin-right: 0;\n }\n }\n}\n\n/*\n FF Kebab Menu\n*/\n\n.ff-kebab-menu {\n position: relative;\n >svg {\n width: 20px;\n cursor: pointer;\n &:hover {\n fill: $ff-blue-600;\n }\n }\n &.active {\n >svg {\n fill: $ff-blue-600;\n }\n }\n}\n\n.ff-kebab-options {\n color: $ff-grey-800;\n position: absolute;\n top: 24px;\n border: 1px solid $ff-grey-300;\n z-index: 1000;\n padding: 0;\n box-shadow: 0px 6px 9px 0px #00000038;\n li {\n min-width: 150px;\n white-space: nowrap;\n &.ff-kebab-item--danger {\n color: $ff-red-500;\n }\n }\n &--left {\n left: 0;\n }\n &--right {\n right: calc(100% - 24px);\n }\n}\n\n.ff-kebab-divider {\n height: 1px;\n background-color: $ff-grey-200;\n list-style: none;\n}\n\n/*\n FF List Item\n*/\nli.ff-kebab-item {\n padding: 12px 48px 12px 12px;\n background-color: white;\n &:hover {\n cursor: pointer;\n background-color: $ff-grey-200;\n }\n &.active {\n background-color: $ff-grey-100;\n }\n &.disabled, :disabled {\n pointer-events: none;\n label {\n opacity: 0.5;\n }\n }\n}\n\n/*\n FF Input\n*/\n\n.ff-input {\n &.ff-text-input {\n border: 1px solid $ff-grey-300;\n border-radius: $ff-unit-sm;\n height: 32px;\n width: 100%;\n display: flex;\n gap: 0px;\n align-items: center;\n background-color: $ff-white;\n border-color: $ff-grey-300;\n svg {\n width: 20px;\n height: 20px;\n margin-left: $ff-unit-sm;\n }\n input {\n flex-grow: 1;\n padding: $ff-unit-sm $ff-unit-md;\n border-radius: $ff-unit-sm;\n background: none;\n height: 100%;\n border-width: 0;\n min-width: 0;\n &[disabled] {\n background-color: $ff-grey-50;\n color: $ff-grey-300;\n }\n &:focus-visible {\n border: none;\n outline: none;\n }\n }\n &:focus-within {\n border-color: $ff-blue-600;\n border-width: 2px;\n outline: none;\n svg {\n margin-left: $ff-unit-sm - 1px;\n }\n }\n }\n}\n\n.ff-input--error {\n &.ff-text-input {\n border-color: $ff-red-500;\n border-width: 2px;\n outline: none;\n }\n}\n\n.ff-dropdown {\n position: relative;\n display: inline-block;\n cursor: pointer;\n &[disabled=\"true\"] {\n cursor: not-allowed;\n background-color: $ff-grey-50;\n color: $ff-grey-400;\n }\n .ff-dropdown-selected {\n background-color: white;\n border: 1px solid $ff-grey-300;\n border-radius: $ff-unit-sm;\n padding: $ff-unit-sm $ff-unit-md;\n height: 32px;\n width: 100%;\n display: flex;\n justify-content: space-between;\n z-index: 2;\n\n > .ff-dropdown-selected-item {\n flex-shrink: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n > .ff-dropdown-icon {\n flex-shrink: 0;\n }\n }\n .ff-dropdown-options {\n position: absolute;\n top: 100%;\n display: none;\n max-height: 14rem;\n overflow-y: auto;\n box-shadow: 0px 6px 9px 0px #00000038;\n .ff-dropdown-option {\n padding: $ff-unit-sm $ff-unit-md;\n background-color: $ff-grey-50;\n border-bottom: 1px solid $ff-grey-200;\n cursor: pointer;\n transition: ease-in-out .3s;\n &:hover {\n background-color: $ff-grey-100;\n }\n }\n &.ff-dropdown-options--full-width {\n width: 100%;\n border-width: 0 1px 1px 1px;\n }\n &.ff-dropdown-options--fit {\n border-width: 1px;\n min-width: none;\n .ff-dropdown-option {\n padding-right: $ff-unit-xl;\n }\n }\n &.ff-dropdown-options--align-left {\n left: 0;\n }\n &.ff-dropdown-options--align-right {\n right: 0;\n }\n }\n &.ff-dropdown--open {\n .ff-dropdown-selected {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n .ff-dropdown-options {\n display: block;\n z-index: 2;\n }\n }\n}\n\n.ff-checkbox,\n.ff-radio-btn {\n position: relative;\n padding-left: 25px;\n display: flex;\n cursor: pointer;\n input[type=checkbox], input[type=radio] {\n display: none;\n }\n label {\n cursor: pointer;\n font-weight: 500;\n font-size: 0.875rem;\n line-height: 1.25rem;\n }\n /* Create a custom checkbox */\n .checkbox {\n position: absolute;\n top: 0;\n left: 0;\n height: 16px;\n width: 16px;\n margin-left: 4px;\n border-radius: 4px;\n background-color: transparent;\n border: 1px solid;\n border-color: $ff-grey-400;\n }\n &:hover:not([disabled=true]) {\n .checkbox {\n background-color: $ff-grey-200;\n }\n }\n &:hover:not([disabled=true]) {\n .checkbox[checked=true] {\n background-color: $ff-grey-500;\n }\n }\n &[disabled=true] {\n cursor: not-allowed;\n label, p {\n color: $ff-grey-400;\n }\n }\n &[disabled=true] * {\n pointer-events: none;\n }\n .checkbox {\n &[checked=true] {\n background-color: $ff-grey-600;\n border-color: $ff-grey-700;\n }\n &[checked=true]:after {\n display: block;\n }\n }\n}\n\n.ff-checkbox {\n .checkbox:after {\n content: \"\";\n display: none;\n position: absolute;\n left: 4.5px;\n top: 1px;\n width: 5px;\n height: 10px;\n border: solid white;\n border-width: 0 2px 2px 0;\n -webkit-transform: rotate(45deg);\n -ms-transform: rotate(45deg);\n transform: rotate(45deg);\n }\n}\n\n/**\n * FF Toggle Switch\n */\n\n.ff-toggle-switch {\n --ff-toggle-width: 54px;\n --ff-toggle-translate: 20px;\n position: relative;\n display: inline-block;\n width: var(--ff-toggle-width);\n height: 34px;\n cursor: pointer;\n input {\n display: none;\n }\n &.checked .ff-toggle-switch-slider {\n background-color: $ff-blue-900;\n }\n &.checked .ff-toggle-switch-slider .ff-toggle-switch-button{\n -webkit-transform: translateX(var(--ff-toggle-translate));\n -ms-transform: translateX(var(--ff-toggle-translate));\n transform: translateX(var(--ff-toggle-translate));\n }\n &[disabled=true] {\n cursor: not-allowed;\n .ff-toggle-switch-slider {\n pointer-events: none;\n background-color: $ff-grey-200;\n }\n .ff-toggle-switch-button {\n background-color: $ff-grey-50;\n }\n svg {\n color: $ff-grey-300;\n }\n }\n}\n\n.ff-toggle-switch-slider {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: $ff-grey-400;\n border-radius: 34px;\n -webkit-transition: 0.4s;\n transition: 0.4s;\n svg {\n padding: 3px;\n width: 100%;\n height: 100%;\n }\n &:hover {\n background-color: $ff-indigo-700 !important;\n }\n}\n\n.ff-toggle-switch-button {\n position: absolute;\n content: \"\";\n height: 26px;\n width: 26px;\n left: 4px;\n bottom: 4px;\n background-color: white;\n border-radius: 50%;\n -webkit-transition: 0.4s;\n transition: 0.4s;\n}\n\n/**\n * FF Radio Group\n */\n\n.ff-radio-group {\n .ff-radio-group-label {\n display: block;\n }\n .ff-radio-group-options {\n display: block;\n margin-top: 1rem;\n }\n .ff-radio-group--horizontal {\n display: flex;\n .ff-radio-btn {\n margin-right: $ff-funit-lg;\n }\n }\n .ff-radio-group--vertical {\n .ff-radio-btn {\n display: block;\n margin-bottom: $ff-funit-md;\n }\n }\n .ff-radio-group--grid {\n display: grid;\n .ff-radio-btn {\n display: block;\n margin-bottom: $ff-funit-md;\n }\n }\n}\n\n.ff-radio-btn {\n .checkbox {\n position: absolute;\n top: 0;\n left: 0;\n height: 16px;\n width: 16px;\n border-radius: 4px;\n background-color: transparent;\n border: 1px solid $ff-grey-400;\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e\")\n }\n}\n\n.ff-tile-selection {\n display: flex;\n flex-wrap: wrap;\n gap: $ff-unit-md;\n .ff-tile-selection-option {\n --ff-tile-selection-color: #{$ff-blue-700};\n display: flex;\n flex-direction: column;\n background-color: $ff-white;\n font-size: 0.875rem;\n border: 2px solid $ff-grey-300;\n border-radius: $ff-unit-sm;\n padding: 12px $ff-unit-lg;\n width: 275px;\n ul {\n list-style: disc;\n margin-top: 3px;\n padding-left: 18px;\n li {\n line-height: 1.5rem;\n }\n }\n &:last-child {\n margin-right: 0;\n }\n &--header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n h2 {\n font-size: 14px;\n }\n > h2 {\n display: flex;\n align-items: center;\n gap: $ff-unit-md;\n padding-right: $ff-unit-xl;\n margin: 0;\n svg {\n width: 20px;\n height: 20px;\n fill: $ff-grey-300;\n &.ff-tile-selection-option--edit {\n cursor: pointer;\n fill: $ff-blue-800;\n &:hover {\n fill: $ff-indigo-600;\n }\n }\n }\n }\n }\n &--price {\n text-align: center;\n h2 {\n margin: 0;\n line-height: 1rem;\n }\n label {\n font-size: $ff-funit-sm;\n }\n }\n &--description {\n flex-grow: 1;\n margin-top: $ff-unit-sm;\n padding-top: $ff-unit-sm;\n border-top: 1px solid $ff-grey-300;\n }\n &--meta {\n margin-top: $ff-unit-md;\n padding-top: $ff-unit-md;\n border-top: 1px solid $ff-grey-300;\n >div {\n display: flex;\n justify-content: space-between;\n width: 100%;\n margin-bottom: $ff-unit-sm;\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n &:not(.editable):not(.disabled):hover {\n cursor: pointer;\n border: 2px solid var(--ff-tile-selection-color);\n }\n &.active {\n border: 2px solid var(--ff-tile-selection-color);\n .ff-tile-selection-option--header svg {\n fill: var(--ff-tile-selection-color);\n }\n }\n &.disabled {\n opacity: 0.5;\n }\n }\n}\n\n/*\n FF Data Table\n*/\n.ff-data-table {\n width: 100%;\n font-size: 0.875rem;\n line-height: 1.25rem;\n &--options {\n margin-bottom: 6px;\n display: flex;\n gap: 6px;\n justify-content: flex-end;\n }\n &--search.ff-text-input {\n flex-grow: 1;\n width: auto;\n height: 34px;\n border-radius: 6px;\n }\n &--actions {\n display: flex;\n gap: 6px;\n }\n &--data {\n border-collapse: separate;\n border-spacing: 0;\n width: 100%;\n .ff-data-table--cell {\n .ff-icon {\n margin: -1px 0;\n }\n .ff-icon-lg {\n margin: -3px 0;\n }\n .ff-btn .ff-icon,\n .ff-btn .ff-icon-lg {\n margin: 0;\n }\n &:first-child {\n padding-left: 16px;\n }\n &:last-child {\n padding-right: 16px;\n }\n }\n thead {\n background: white; // hides td borders when header is sticky\n .ff-data-table--row .ff-data-table--cell {\n &:first-child {\n border-top-left-radius: 6px;\n }\n &:last-child {\n border-top-right-radius: 6px;\n }\n }\n .ff-data-table--cell {\n padding: 9px 12px;\n background-color: $ff-grey-100;\n font-weight: 600;\n transition: 0.3s background-color, 0.3s color;\n -webkit-transition: 0.3s background-color, 0.3s color;\n &.sortable {\n >div {\n display: flex;\n justify-content: space-between;\n gap: $ff-unit-md;\n }\n .ff-icon {\n opacity: 0.2;\n }\n &:hover {\n background-color: $ff-grey-200;\n cursor: pointer;\n .ff-icon {\n opacity: 0.5;\n }\n }\n }\n &.sorted {\n background-color: $ff-grey-200;\n .ff-icon.icon-sorted {\n opacity: 1;\n }\n }\n }\n }\n tbody {\n .ff-data-table--row {\n &.collapsible {\n td {\n border-top: none;\n border-bottom: none;\n padding: 0;\n }\n }\n\n &:last-of-type {\n td {\n border-bottom: 1px solid $ff-grey-300;\n }\n }\n\n &:last-child {\n .ff-data-table--cell {\n border-bottom-width: 1px;\n border-top-color: $ff-grey-200;\n &:first-child {\n border-bottom-left-radius: 6px;\n }\n &:last-child {\n border-bottom-right-radius: 6px;\n }\n }\n }\n }\n .ff-data-table--cell {\n padding: 12px 12px;\n background-color: white;\n &.highlight {\n background-color: $ff-grey-50;\n }\n &.status-message {\n text-align: center;\n color: $ff-grey-400;\n }\n }\n .selectable:hover .ff-data-table--cell,\n .selectable:hover .ff-data-table--cell span svg.ff-icon {\n cursor: pointer;\n color: $ff-blue-600;\n background-color: $ff-grey-50;\n }\n .selectable:hover .ff-data-table--cell button svg.ff-icon {\n background-color: transparent;\n color: inherit;\n }\n }\n }\n &--row {\n td {\n border-width: 1px 0px 0px;\n border-style: solid;\n border-color: $ff-grey-300;\n &:first-child {\n border-left-width: 1px;\n }\n &:last-child {\n border-right-width: 1px;\n }\n }\n &-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n }\n }\n}\n\n.ff-data-table thead .ff-checkbox,\n.ff-data-table tbody .ff-checkbox,\n.ff-data-table tbody .ff-radio-btn {\n display: inline;\n}\n\n.ff-loadmore {\n width: 100%;\n text-align: center;\n span {\n display: inline-block;\n margin: auto;\n color: $ff-blue-500;\n background-color: white;\n padding: $ff-unit-xs $ff-unit-md 4px;\n border: 1px solid $ff-grey-300;\n border-top: 0;\n border-radius: 0 0 6px 6px;\n &:hover {\n cursor: pointer;\n color: $ff-blue-700;\n }\n }\n}\n\n/*\n FF Dialog Box\n*/\n.ff-dialog-container {\n position: fixed;\n z-index: 110;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n justify-content: center;\n align-items: flex-start;\n overflow-y: hidden;\n background-color: rgba($ff-grey-800, 0.3);\n &--open {\n display: flex;\n }\n &--closed {\n display: none;\n }\n}\n\n.ff-dialog-box {\n position: relative;\n z-index: 2;\n width: 100%;\n max-width: 42rem;\n margin: 90px auto;\n display: flex;\n flex-direction: column;\n background-color: $ff-white;\n max-height: 85vh;\n overflow: auto;\n .ff-dialog {\n &-header {\n height: 48px;\n line-height: 48px;\n background-color: $ff-grey-800;\n border-bottom: 2px solid $ff-red-400;\n padding: 0 $ff-unit-lg;\n color: $ff-white;\n font-weight: 600;\n display: flex;\n justify-content: space-between;\n gap: 12px;\n }\n &-subheader {\n opacity: 0.65;\n display: block;\n }\n &-content {\n padding: $ff-funit-lg;\n overflow: auto;\n max-height: 75vh;\n }\n &-actions {\n display: flex;\n justify-content: flex-end;\n padding: $ff-unit-md $ff-unit-lg $ff-unit-lg $ff-unit-lg;\n .ff-btn {\n margin-left: $ff-funit-md;\n }\n }\n }\n &--wide {\n max-width: 52rem;\n }\n}\n\n/*\n Help Tooltip\n*/\n\n.ff-help-tooltip {\n &:hover {\n path {\n fill: $ff-blue-800;\n }\n }\n}\n\n/*\n Notifications\n*/\n\n.ff-notification-pill {\n background-color: $ff-red-600;\n color: $ff-white;\n padding: $ff-unit-xs $ff-unit-md;\n font-weight: 600;\n border-radius: $ff-unit-sm;\n font-size: $ff-funit-sm;\n}\n\n.ff-notification-toast {\n position: relative;\n background-color: $ff-white;\n border: 1px solid $ff-grey-400;\n padding: $ff-unit-md $ff-unit-md $ff-unit-md $ff-unit-lg;\n box-shadow: -$ff-unit-sm $ff-unit-sm $ff-unit-sm #0000008c;\n border-radius: 0 $ff-unit-sm $ff-unit-sm 0;\n max-width: 475px;\n\n &--bar {\n height: 100%;\n width: $ff-unit-md;\n background-color: black;\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n }\n\n &--info {\n border-color: $ff-grey-400;\n .ff-notification-toast--bar {\n background-color: $ff-grey-400;\n }\n }\n &--warning {\n border-color: $ff-red-400;\n .ff-notification-toast--bar {\n background-color: $ff-red-400;\n }\n }\n &--confirmation {\n border-color: $ff-green-400;\n .ff-notification-toast--bar {\n background-color: $ff-green-400;\n }\n }\n\n &--message {\n display: grid;\n grid-template-columns: 1fr 20px;\n gap: $ff-unit-lg;\n >div {\n padding-top: 2px;\n }\n }\n\n &--close {\n cursor: pointer;\n position: relative;\n display: flex;\n max-height: 20px;\n svg {\n position: relative;\n z-index: 2;\n padding: 4px;\n }\n .countdown-wrapper {\n z-index: 1;\n }\n &:hover {\n color: $ff-indigo-600;\n }\n }\n\n &--actions {\n margin-top: $ff-unit-md;\n // margin-right: $ff-unit-xl;\n display: flex;\n justify-content: flex-end;\n }\n}\n\n/* Countdown Pie */\n$countdown_size: 20px;\n\n.countdown-wrapper {\n width: $countdown_size;\n height: $countdown_size;\n position: absolute;\n top: 0;\n left: 0;\n background: white;\n}\n\n.countdown-pie {\n width: 50%;\n height: 100%;\n position: absolute;\n background: $ff-white;\n border: 2px solid $ff-grey-300;\n}\n\n.countdown-spinner {\n transform-origin: 100% 50%;\n border-radius: ($countdown_size*0.5) 0 0 ($countdown_size*0.5);\n z-index: 200;\n border-right: none;\n}\n\n.countdown-filler {\n border-radius: 0 ($countdown_size*0.5) ($countdown_size*0.5) 0;\n z-index: 100;\n border-left: none;\n left: 50%;\n opacity: 0;\n}\n\n.countdown-mask {\n width: 50%;\n height: 100%;\n position: absolute;\n z-index: 300;\n opacity: 1;\n background: inherit;\n}\n\n@keyframes rota {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n@keyframes fill {\n 0% { opacity: 0; }\n 50%, 100% { opacity: 1; }\n}\n\n@keyframes mask {\n 0% { opacity: 1; }\n 50%, 100% { opacity: 0; }\n}\n\n\n/*\n FF Tabs\n*/\n.ff-tabs {\n display: flex;\n color: $ff-grey-800;\n .ff-tab-option {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: $ff-unit-md;\n &:hover {\n color: $ff-blue-700;\n cursor: pointer;\n }\n .ff-tab-icon {\n height: 14px;\n width: 14px;\n flex-shrink: 0;\n display: block;\n }\n .ff-tab-label {\n white-space: nowrap;\n }\n }\n &.ff-tabs--horizontal {\n flex-direction: row;\n .ff-tab-option {\n margin-right: $ff-unit-md;\n &.router-link-active,\n &.ff-tab-option--active {\n border-bottom: $ff-unit-xs solid $ff-blue-700;\n }\n }\n }\n &.ff-tabs--vertical {\n flex-direction: column;\n .ff-tab-option {\n border-left-width: $ff-unit-xs;\n border-color: transparent;\n margin-bottom: $ff-unit-md;\n &.router-link-active,\n &.ff-tab-option--active {\n border-left: $ff-unit-xs solid $ff-blue-700;\n }\n }\n }\n .router-link-active,\n .ff-tab-option--active {\n color: $ff-blue-600;\n }\n}\n\n/*\n FF Tabs - Overflow Handling\n*/\n.ff-tabs-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n\n // When overflow is NOT enabled, apply ellipsis to tab labels\n &:not(.ff-tabs-wrapper--overflow-enabled) {\n .ff-tab-label {\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n }\n }\n\n &.ff-tabs-wrapper--overflow-enabled {\n .ff-tab-option {\n flex-shrink: 0; // Prevent tabs from shrinking, allow them to take full width\n }\n\n .ff-tabs__scroll-container {\n overflow-x: auto;\n overflow-y: hidden;\n scroll-behavior: smooth;\n scrollbar-width: none; // Hide scrollbar for Firefox\n -ms-overflow-style: none; // Hide scrollbar for IE/Edge\n\n // Hide scrollbar for Chrome, Safari, and Opera\n &::-webkit-scrollbar {\n display: none;\n }\n }\n }\n\n .ff-tabs__scroll-container {\n flex: 1;\n min-width: 0;\n }\n\n .ff-tabs__overflow-button {\n position: absolute;\n top: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $ff-unit-sm;\n background: white;\n border: none;\n border-right: 1px solid $ff-grey-300;\n color: $ff-grey-500;\n cursor: pointer;\n z-index: 10;\n transition: all 0.2s ease;\n\n .ff-icon {\n width: 16px;\n height: 16px;\n\n &.ff-icon-second {\n margin-left: -10px;\n }\n }\n\n &:hover {\n background: $ff-grey-100;\n color: $ff-grey-700;\n border-color: $ff-grey-400;\n }\n\n &:active {\n background: $ff-grey-200;\n }\n\n &--left {\n left: 0;\n border-right: 1px solid $ff-grey-300;\n border-left: none;\n }\n\n &--right {\n right: 0;\n border-left: 1px solid $ff-grey-300;\n border-right: none;\n }\n }\n\n .ff-tabs__menu-wrapper {\n position: relative;\n display: inline-block;\n\n &--left {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n }\n\n &--right {\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n }\n }\n\n .ff-tabs__dropdown {\n position: absolute;\n top: calc(100% + 4px);\n background: white;\n border: 1px solid $ff-grey-300;\n border-radius: 4px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n z-index: 100;\n min-width: 150px;\n max-width: 250px;\n\n &--left {\n left: 0;\n }\n\n &--right {\n right: 0;\n }\n }\n\n .ff-tabs__dropdown-item {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: $ff-unit-sm $ff-unit-md;\n color: $ff-grey-800;\n transition: background-color 0.2s ease;\n\n .ff-tab-icon {\n height: 14px;\n width: 14px;\n flex-shrink: 0;\n display: block;\n }\n\n .ff-tab-label {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n }\n\n &:hover {\n background: $ff-grey-100;\n color: $ff-blue-700;\n cursor: pointer;\n }\n\n &--active {\n background: $ff-grey-100;\n color: $ff-blue-700;\n cursor: pointer;\n }\n\n &.router-link-active {\n color: $ff-blue-600;\n background: $ff-blue-50;\n }\n\n &:first-child {\n border-radius: 4px 4px 0 0;\n }\n\n &:last-child {\n border-radius: 0 0 4px 4px;\n }\n\n &:only-child {\n border-radius: 4px;\n }\n }\n}\n\n/*\n FF Tooltip\n*/\n.ff-tooltip {\n position: absolute;\n z-index: 100;\n font-weight: normal; // prevent parent overriding if embedded in hX\n white-space: preserve-breaks;\n height: fit-content;\n background-color: black;\n color: white;\n padding: 3px 12px;\n border-radius: 3px;\n opacity: 0;\n pointer-events: none;\n transition: 0.3s opacity;\n -webkit-transition: 0.3s opacity;\n &.ff-tooltip-right {\n &::after {\n content: \" \";\n position: absolute;\n top: 50%;\n right: 100%; /* To the left of the tooltip */\n margin-top: -5px;\n border-width: 5px;\n border-style: solid;\n border-color: transparent black transparent transparent;\n }\n }\n &.ff-tooltip-left {\n &::after {\n content: \" \";\n position: absolute;\n top: 50%;\n left: 100%; /* To the right of the tooltip */\n margin-top: -5px;\n border-width: 5px;\n border-style: solid;\n border-color: transparent transparent transparent black;\n }\n }\n &.ff-tooltip-top {\n transform: translateX(-50%);\n &::after {\n content: \" \";\n position: absolute;\n top: 100%; /* At the bottom of the tooltip */\n left: 50%;\n margin-left: -5px;\n border-width: 5px;\n border-style: solid;\n border-color: black transparent transparent transparent;\n }\n }\n &.ff-tooltip-bottom {\n transform: translateX(-50%);\n &::after {\n content: \" \";\n position: absolute;\n bottom: 100%; /* At the top of the tooltip */\n left: 50%;\n margin-left: -5px;\n border-width: 5px;\n border-style: solid;\n border-color: transparent transparent black transparent;\n }\n }\n &--visible {\n opacity: 1;\n }\n}\n.ff-tooltip-container {\n position: relative;\n vertical-align: bottom;\n &:hover .ff-tooltip {\n opacity: 1;\n }\n}\n\n.ff-spinner {\n display: inline-block;\n width: 20px;\n height: 20px;\n color: $ff-grey-500;\n circle {\n stroke: transparent;\n }\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n @keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n }\n }\n @-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n }\n }\n}\n",".ff-bg-light {\n background-color: $ff-grey-50;\n}\n\n.ff-theme-light {\n\n color: $ff-grey-800;\n\n /* Core */\n\n h1, h2, h3, h4, h5{\n color: $ff-grey-700;\n }\n \n p {\n color: $ff-grey-800;\n }\n\n .ff-description {\n color: $ff-grey-500;\n }\n\n select {\n background-color: $ff-grey-50;\n }\n\n code {\n background-color: $ff-grey-100;\n border-color: $ff-grey-200;\n }\n\n /* FlowFuse Components */\n\n .ff-btn {\n &:disabled {\n background-color: $ff-white;\n border-color: $ff-grey-300;\n color: $ff-grey-300;\n }\n }\n}\n",".ff-bg-dark {\n background-color: $ff-grey-800;\n}\n\n.ff-theme-dark {\n color: $ff-grey-50;\n \n /* Core */\n\n table {\n td, th {\n border-color: $ff-grey-500;\n }\n }\n\n select {\n background-color: $ff-grey-800;\n }\n\n code {\n background-color: $ff-grey-900;\n border-color: $ff-grey-700;\n }\n\n .ff-description {\n color: $ff-grey-400;\n }\n\n /* FlowFuse Components */\n\n /**\n * Buttons\n */\n .ff-btn {\n &--tertiary {\n color: $ff-white;\n &:hover {\n // background-color: $ff-color--secondary--highlight;\n color: $ff-white;\n }\n }\n &:disabled {\n background-color: $ff-grey-700;\n border-color: $ff-grey-500;\n color: $ff-grey-500;\n }\n }\n\n /**\n * Text Input\n */\n\n .ff-input.ff-text-input {\n background-color: $ff-grey-700;\n border-color: $ff-grey-900;\n &:focus {\n border-color: $ff-white;\n }\n }\n\n /**\n * Dropdowns\n */\n\n .ff-dropdown {\n &[disabled=\"true\"] {\n background-color: $ff-grey-700;\n color: $ff-grey-500;\n }\n .ff-dropdown-selected {\n background-color: $ff-grey-700;\n border-color: $ff-grey-500;\n }\n .ff-dropdown-options {\n border-color: $ff-grey-700;\n }\n .ff-dropdown-option {\n background-color: $ff-grey-700;\n border-color: $ff-grey-800;\n &:hover {\n background-color: $ff-grey-800;\n }\n }\n }\n\n /**\n * Checkboxes\n */\n\n .ff-checkbox {\n .checkbox[checked=true] {\n background-color: transparent;\n border-color: $ff-grey-500;\n }\n &:hover:not([disabled=true]) {\n .checkbox {\n background-color: $ff-grey-600;\n }\n }\n &:hover:not([disabled=true]) {\n .checkbox[checked=true] {\n background-color: $ff-grey-800;\n border-color: $ff-grey-600;\n }\n }\n }\n\n /**\n * FF Toggle Switch\n */\n .ff-toggle-switch {\n svg {\n color: $ff-grey-800;\n }\n input:checked + .ff-toggle-switch-slider {\n background-color: $ff-blue-600;\n }\n &[disabled=true] {\n .ff-toggle-switch-slider {\n background-color: $ff-grey-700;\n }\n .ff-toggle-switch-button {\n background-color: $ff-grey-800;\n }\n svg {\n color: $ff-grey-500;\n }\n }\n }\n\n .ff-toggle-switch-slider {\n background-color: $ff-grey-600;\n &:hover {\n background-color: $ff-indigo-500 !important;\n }\n }\n\n .ff-toggle-switch-button {\n background-color: $ff-white;\n }\n\n /**\n * Radio Group\n */\n\n .ff-radio-btn {\n .checkbox {\n border: 1px solid $ff-grey-600;\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='%231F2937' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='4'/%3e%3c/svg%3e\") \n }\n }\n \n .ff-radio-btn {\n .checkbox {\n &[checked=true] {\n background-color: $ff-white;\n border-color: $ff-grey-700;\n }\n &[checked=true]:after {\n display: block;\n }\n }\n &:hover:not([disabled=true]) {\n .checkbox {\n background-color: $ff-grey-600;\n }\n }\n &:hover:not([disabled=true]) {\n .checkbox[checked=true] {\n background-color: $ff-white;\n }\n }\n }\n\n /**\n * Toast Notification\n */\n\n .ff-notification-toast {\n color: $ff-grey-800;\n }\n\n /**\n * Selection Tile\n */\n\n .ff-tile-selection {\n .ff-tile-selection-option--header > h2 svg {\n fill: $ff-grey-500;\n &.ff-tile-selection-option--edit:hover {\n fill: $ff-blue-300;\n }\n }\n .ff-tile-selection-option {\n background-color: $ff-grey-700;\n border-color: $ff-grey-800;\n &.active svg {\n fill: $ff-blue-300;\n }\n &:hover {\n background-color: $ff-grey-800;\n }\n &:not(.editable):hover {\n border-color: $ff-blue-300;\n }\n &[selected=true] {\n background-color: $ff-grey-800;\n border-color: $ff-grey-800;\n }\n }\n }\n\n /**\n * Data Table\n */\n .ff-data-table {\n &--data {\n .ff-data-table--cell {\n }\n thead {\n .ff-data-table--cell {\n background-color: $ff-grey-900;\n &.sortable {\n &:hover {\n background-color: $ff-grey-800;\n }\n }\n &.sorted {\n background-color: $ff-grey-900;\n }\n }\n }\n tbody {\n .ff-data-table--row:last-child {\n .ff-data-table--cell {\n border-top-color: $ff-grey-600;\n }\n }\n .ff-data-table--cell {\n background-color: $ff-grey-700;\n &.highlight {\n background-color: $ff-grey-800;\n }\n }\n .selectable:hover .ff-data-table--cell {\n color: $ff-blue-300;\n background-color: $ff-grey-600;\n }\n }\n }\n &--row {\n td {\n border-color: $ff-grey-600;\n }\n }\n }\n \n .ff-loadmore {\n span {\n color: $ff-white;\n background-color: $ff-grey-900;\n border: 1px solid $ff-grey-600;\n &:hover {\n color: $ff-blue-300;\n background-color: $ff-grey-600;\n }\n }\n }\n}\n",".ff--immersive-editor-wrapper {\n position: relative;\n height: 100%;\n display: flex;\n flex: 1;\n\n .editor-wrapper {\n height: 100%;\n width: 100%;\n position: absolute;\n display: flex;\n flex-direction: column;\n align-content: center;\n justify-content: center;\n }\n .editor-wrapper .status-wrapper {\n margin-top: -64px;\n }\n\n .tabs-wrapper {\n position: fixed;\n left: 0;\n top: 60px;\n width: 0;\n height: calc(100% - 60px);\n background: white;\n transform: translateX(-100%);\n transition: transform 0.3s ease-in-out, box-shadow 0.3s ease-in-out;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n container-type: inline-size;\n container-name: drawer;\n z-index: 1;\n\n .header, main {\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s;\n }\n\n main {\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n .header {\n padding: 0;\n display: flex;\n line-height: 1.5;\n border-bottom: 1px solid $ff-grey-200;\n background: white;\n z-index: 10;\n\n .logo {\n display: flex;\n\n a {\n display: flex;\n align-items: center;\n color: $ff-grey-500;\n gap: 4px;\n padding: 0 15px;\n transition: all 0.2s ease;\n\n .ff-btn--icon {\n width: 16px;\n height: 16px;\n }\n\n img {\n height: 20px;\n }\n\n &:hover {\n background: $ff-grey-100;\n color: $ff-grey-700;\n }\n\n &:active {\n background: $ff-grey-200;\n }\n }\n }\n\n .tabs {\n flex: 1;\n padding: 0 15px 0 0;\n min-width: 0;\n\n .ff-tab-option {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n .side-actions {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n color: $ff-grey-500;\n flex-shrink: 0;\n gap: 5px;\n\n .close-drawer-button {\n align-self: stretch;\n background: none;\n border: none;\n padding: 0 15px;\n color: inherit;\n font: inherit;\n display: flex;\n align-items: center;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover {\n background: $ff-grey-100;\n color: $ff-grey-700;\n }\n\n &:active {\n background: $ff-grey-200;\n }\n }\n }\n }\n\n &.open {\n transform: translateX(0);\n box-shadow: 5px 0 8px rgba(0, 0, 0, 0.10);\n\n .header, main {\n opacity: 1;\n pointer-events: auto;\n }\n }\n }\n\n .resize-bar.resizing {\n background-color: $ff-blue-500;\n }\n\n &.resizing {\n cursor: ew-resize;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n\n .tabs-wrapper {\n transition: none;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.education-modal {\n position: absolute;\n top: 65px;\n right: 5px;\n width: 350px;\n background: $ff-white;\n border: 1px solid $ff-grey-300;\n box-shadow: -6px 6px 10px rgba(0, 0, 0, .2);\n margin: 0;\n\n .ff-dialog-content {\n padding: 10px 10px 5px 10px;\n\n p {\n line-height: 1.5;\n }\n }\n\n .ff-dialog-actions {\n padding: 5px 10px 10px 10px;\n }\n\n .title {\n margin-bottom: 20px;\n text-align: center;\n border-bottom: 1px solid $ff-grey-200;\n padding-bottom: 15px;\n }\n\n .options {\n li {\n margin-bottom: 5px;\n\n a {\n transition: ease-in-out .3s;\n position: relative;\n line-height: 2;\n display: flex;\n justify-content: space-between;\n width: 100%;\n border: 1px solid $ff-grey-200;\n align-items: center;\n padding: 5px;\n color: $ff-black;\n\n &:hover {\n text-decoration: none;\n border: 1px solid $ff-blue-700;\n color: $ff-blue-700;\n }\n }\n }\n }\n\n .actions {\n display: flex;\n justify-content: flex-end;\n }\n\n .loader-wrapper {\n position: relative;\n\n .loader {\n position: absolute;\n z-index: 1000;\n right: 0;\n bottom: -7px;\n height: 10px;\n width: 100%;\n }\n\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-layout--docs {\n background-color: white;\n &-contents {\n max-width: 1012px;\n margin: auto;\n padding: 16px;\n }\n h1 {\n margin: 16px 0;\n }\n}\n",".ff-notification-interview {\n max-width: 450px;\n background-color: $ff-white;\n box-shadow: -6px 6px 6px #00000040;\n border-radius: 0 6px 6px 0;\n padding: 12px 9px 12px 18px;\n border: 1px solid $ff-blue-700;\n border-left: 8px solid $ff-blue-700;\n\n h3 {\n font-size: 1.1rem;\n margin-bottom: 12px;\n }\n\n p {\n font-size: 1.1rem;\n }\n\n &--actions {\n margin-top: 24px;\n gap: 12px;\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n font-size: 1rem;\n\n .ff-btn.ff-btn--primary {\n background-color: $ff-blue-700;\n border-color: $ff-blue-700;\n\n &:hover {\n background-color: $ff-blue-800;\n }\n }\n }\n}\n\n$ff-notifications-drawer-side-padding: 6px;\n\n.ff-notifications-drawer {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n padding: 0 !important;\n\n > .header {\n width: 100%;\n padding: 1rem 1.5rem;\n border-bottom: 1px solid $ff-grey-200;\n background: white;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n box-sizing: border-box;\n\n .title {\n font-size: 1rem;\n font-weight: 600;\n color: #374151;\n margin: 0;\n line-height: 1.5rem;\n flex: 1;\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n\n .ff-checkbox {\n margin: 0;\n }\n\n .header-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n padding: 0;\n background: none;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n color: inherit;\n font: inherit;\n transition: background-color 0.15s ease;\n\n &:hover {\n cursor: pointer;\n background: $ff-grey-100;\n }\n }\n }\n }\n\n > .controls {\n width: 100%;\n border-bottom: 1px solid $ff-grey-300;\n background: white;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n\n .actions {\n display: flex;\n gap: 5px;\n padding: 10px 12px;\n\n .forge-badge {\n background-color: $ff-grey-100;\n border-radius: 5px;\n\n &:hover {\n cursor: pointer;\n background-color: $ff-grey-300\n }\n\n &.disabled {\n color: $ff-grey-400;\n\n &:hover {\n cursor: not-allowed;\n }\n }\n }\n }\n }\n\n .messages-wrapper {\n flex: 1;\n width: 100%;\n background-color: $ff-grey-100;\n overflow: auto;\n $read: $ff-grey-400;\n $info: blue;\n $warning: $ff-yellow-600;\n $error: $ff-red-500;\n\n .message-wrapper {\n display: flex;\n flex-direction: row;\n color: $ff-grey-400;\n background-color: $ff-white;\n border-bottom: 1px solid $ff-grey-300;\n border-left: 3px solid rgba(0, 0, 0, 0);\n transition: ease-in-out .3s;\n cursor: pointer;\n\n .counter {\n margin-top: 0.2rem;\n\n .ff-notification-pill {\n background-color: $read;\n color: white;\n padding: 2px 7px;\n border-radius: 6px;\n font-size: 0.65rem;\n }\n }\n\n .action {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 40px;\n cursor: default;\n\n .ff-checkbox {\n height: 13px;\n width: 13px;\n padding: 0;\n\n span {\n margin: 0;\n padding: 0;\n }\n }\n }\n\n &:hover .title {\n color: $ff-blue-500;\n }\n\n &.unread {\n border-left: 3px solid $info;\n border-left-color: $ff-blue-500;\n color: $ff-grey-800;\n\n &.warning {\n border-left: 3px solid $warning;\n\n .counter .ff-notification-pill {\n background-color: $warning;\n }\n }\n\n &.error {\n border-left: 3px solid $error;\n\n .counter .ff-notification-pill {\n background-color: $error;\n }\n }\n\n .counter .ff-notification-pill {\n background-color: $info;\n }\n }\n\n .body {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 9px $ff-notifications-drawer-side-padding*2 9px $ff-notifications-drawer-side-padding;\n\n .header {\n gap: 5px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n .ff-icon {\n height: 20px;\n min-width: 20px;\n min-height: 20px;\n max-width: fit-content;\n max-height: fit-content;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .title {\n flex: 1;\n transition: ease-in-out .3s;\n margin: 0;\n }\n\n input {\n &:hover {\n cursor: pointer;\n }\n }\n }\n\n .text {\n display: flex;\n margin: 10px 0;\n align-items: center;\n line-height: 1.5rem;\n }\n\n .footer {\n display: flex;\n text-align: right;\n color: $ff-grey-400;\n font-size: 80%;\n padding: 0 $ff-notifications-drawer-side-padding;\n justify-content: flex-end;\n }\n }\n\n &:hover {\n background-color: $ff-grey-100;\n }\n }\n }\n\n .empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n color: $ff-grey-400;\n width: 100%;\n background-color: $ff-grey-100;\n }\n\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n/* Hide the ::after divider that the header navigation adds to all children */\n.expert-button-wrapper::after {\n display: none !important;\n}\n\n/* Dual-background gradient border technique from flowfuse.com */\n.expert-button {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(135deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n border: 1px solid transparent;\n animation: gradient-border-rotate 4s linear infinite;\n\n &:hover {\n border: 2px solid transparent;\n margin: -1px;\n }\n}\n\n@keyframes gradient-border-rotate {\n 0% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(0deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 10% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(36deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 20% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(72deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 30% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(108deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 40% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(144deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 50% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(180deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 60% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(216deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 70% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(252deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 80% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(288deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 90% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(324deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 100% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(360deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n}\n",".ff-empty-state {\n text-align: center;\n padding-top: 64px;\n padding-bottom: 64px;\n background-color: white;\n border: 1px solid $ff-grey-200;\n border-radius: 3px;\n >div {\n margin: auto;\n }\n img {\n margin: auto;\n }\n h1 {\n font-size: 1.5rem;\n line-height: 1.75rem;\n margin: auto;\n margin-top: 1.5rem;\n margin-bottom: 1rem;\n font-weight: 500;\n max-width: 450px;\n }\n &--message {\n max-width: 500px;\n font-size: 1.1rem;\n margin: auto;\n margin-top: 1.25rem;\n margin-bottom: 1.25rem;\n p {\n margin-bottom: 0.75rem;\n line-height: 1.5rem;\n color: $ff-grey-800;\n }\n }\n &--actions {\n display: flex;\n justify-content: center;\n gap: 6px;\n }\n &--note {\n display: flex;\n justify-content: center;\n margin-top: 1.75rem;\n color: $ff-grey-400;\n }\n\n &.ff-empty-state-feature-unavailable {\n background-color: inherit;\n border: none; \n }\n}","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-team-type-tile {\n position: relative;\n border-radius: 6px;\n border: 2px solid $ff-grey-300;\n background: white;\n box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.25);\n padding: 24px;\n width: 100%;\n max-width: 300px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n ul {\n list-style: disc;\n padding-left: 16px;\n li {\n margin-bottom: 6px;\n }\n }\n}\n.trial-ribbon {\n --ribbon-overlap: 8px;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 30px;\n left: calc(-1 * var(--ribbon-overlap));\n line-height: 1.3;\n width: calc(100% + 2 * var(--ribbon-overlap));\n margin: 0;\n position: absolute;\n top: 8px;\n color: white;\n // text-shadow: 0 1px 1px #111;\n border-top: 1px solid #363636;\n border-bottom: 1px solid #202020;\n background: $ff-red-500;\n // background: linear-gradient($ff-red-500 0%, $ff-red-700 100%);\n border-radius: 2px 2px 0 0;\n box-shadow: 0 1px 2px rgba(0,0,0,0.3);\n}\n.trial-ribbon::before,\n.trial-ribbon::after {\n content: '';\n display: block;\n width: 0;\n height: 0;\n position: absolute;\n bottom: calc((-2 * var(--ribbon-overlap)) - 1px);\n z-index: -10;\n border: var(--ribbon-overlap) solid;\n border-color: $ff-red-900 transparent transparent transparent;\n}\n.trial-ribbon::before {left: 0;}\n.trial-ribbon::after {right: 0;}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.not-found-wrapper {\n background: none;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n\n .not-found-container {\n background: $ff-white;\n padding: 30px 150px;\n margin: 50px;\n border-radius: 20px;\n box-shadow: 0 0 50px rgba(0, 0, 0, 0.2);\n\n .image-wrapper {\n display: flex;\n justify-content: center;\n margin: 30px 0;\n }\n\n .title {\n margin: 30px 0;\n }\n\n .actions {\n display: flex;\n justify-content: center;\n gap: 15px;\n margin: 30px 0 15px;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.wrapper {\n flex: 1;\n\n .info {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n align-self:center;\n }\n\n .actions {\n display: flex;\n justify-content: flex-end;\n }\n}\n\n// Hide info icon on small viewports (below 640px)\n@media (max-width: 639px) {\n .ff-info-icon {\n display: none;\n }\n}\n\n// Also hide info icon when drawer is narrow (below 640px)\n@container drawer (max-width: 639px) {\n .ff-info-icon {\n display: none;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-listbox {\n display: inline-block;\n min-width: 200px;\n\n &:focus-visible {\n border: none;\n outline: none;\n\n }\n\n .ff-button {\n border: 1px solid $ff-grey-300;\n padding: 5px 5px 5px 10px;\n background: $ff-white;\n\n &:focus-visible {\n outline: none;\n }\n\n &:focus {\n border-color: $ff-blue-500;\n }\n\n .icon {\n svg {\n width: 1.5rem;\n height: 1.5rem;\n }\n }\n }\n\n &[data-headlessui-state=\"open\"] {\n button {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n}\n\n.ff-options {\n background: $ff-grey-50;\n box-shadow: 0 6px 9px 0 #00000038;\n max-height: 28rem;\n z-index: 200;\n overflow-y: auto;\n padding: 0;\n border-left: 1px solid $ff-grey-200;\n border-right: 1px solid $ff-grey-200;\n border-bottom: 1px solid $ff-grey-200;\n &:focus-visible, &:focus {\n outline: none;\n }\n\n .ff-option {\n border-bottom: 1px solid $ff-grey-200;\n background-color: $ff-grey-50;\n cursor: pointer;\n\n &:last-of-type {\n border-bottom: none;\n }\n\n .ff-option-content {\n padding: $ff-unit-sm $ff-unit-md;\n border: 1px solid transparent;\n\n &.selected {\n background-color: $ff-grey-200;\n }\n &.active {\n border: 1px solid $ff-indigo-300;\n }\n &.selected.active {\n border-color: transparent;\n }\n }\n\n &:hover {\n background-color: $ff-grey-200;\n .ff-option-content.active {\n border-color: transparent\n }\n }\n }\n}\n",".ff-audit-entry {\n display: grid;\n grid-template-areas:\n 'time author'\n 'entry entry';\n grid-gap: 0.25rem;\n align-items: center;\n label {\n font-weight: 500;\n }\n span {\n color: $ff-grey-400;\n font-weight: 400;\n font-size: 0.875rem;\n line-height: 1rem;\n display: block;\n width:100%;\n }\n\n svg path {\n stroke-width: 2px;\n }\n &--error {\n position: relative;\n summary {\n display: flex;\n align-items: center;\n list-style: none;\n cursor: pointer;\n font-size: 0.875rem;\n color: $ff-grey-500;\n &::-webkit-details-marker {\n display: none;\n }\n }\n // the chevron down will only show when detail is opened\n span .ff-icon {\n position: absolute;\n top: 3px;\n left: 0;\n background-color: $ff-grey-50;\n fill: $ff-grey-500;\n }\n &:hover {\n summary {\n color: black;\n }\n span .ff-icon {\n fill: black;\n }\n }\n }\n}\n\n.ff-audit-entry-info {\n grid-area: entry;\n}\n\n.ff-audit-entry-trigger, .ff-audit-entry-time {\n grid-area: time;\n display: block;\n color: $ff-grey-500;\n overflow-x: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.ff-audit-entry-trigger {\n grid-area: author;\n text-align: right;\n}\n\n\n@media screen and (min-width: $ff-screen-lg) {\n .ff-audit-entry {\n grid-template-areas: 'time entry author';\n grid-template-columns: min-content 1fr min-content;\n }\n}",".ff-accordion {\n margin-bottom: 24px;\n &--button {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n background-color: $ff-grey-100;\n border: 1px solid $ff-grey-300;\n padding: 6px 9px;\n cursor: default;\n label {\n font-weight: 500;\n }\n span {\n color: $ff-grey-500;\n font-size: 0.875rem;\n }\n .ff-icon {\n margin-left: 12px;\n transition: 0.3s transform;\n -webkit-transition: 0.3s transform;\n }\n &:not([disabled]):hover{\n background-color: $ff-grey-200;\n cursor: pointer;\n }\n }\n &--content {\n transition: max-height 0.6s ease-out;\n .ff-audit-entry {\n padding: 12px;\n border: 1px solid $ff-grey-300;\n border-top-width: 0;\n }\n }\n &.open {\n .ff-accordion--button .ff-icon.chevron {\n transform: rotate(-90deg);\n }\n }\n}\n","<template>\n <ff-dialog\n v-if=\"visible\"\n ref=\"dialog\" :header=\"header\" :sub-header=\"`Node-RED Version: ${nrVersion}`\" confirm-label=\"Close\" :closeOnConfirm=\"true\"\n data-el=\"flow-view-dialog\" boxClass=\"!min-w-[80%] !min-h-[80%] !w-[80%] !h-[80%]\"\n contentClass=\"overflow-hidden flex-grow\" @confirm=\"confirm()\"\n >\n <template #default>\n <div ref=\"viewer\" data-el=\"ff-flow-previewer\" class=\"ff-flow-viewer\" @click.stop.prevent>\n Loading...\n </div>\n </template>\n <template #actions>\n <div class=\"flex justify-end\">\n <ff-button data-action=\"dialog-confirm\" @click=\"confirm()\">Close</ff-button>\n </div>\n </template>\n </ff-dialog>\n</template>\n<script>\n\nimport FlowRenderer from '@flowfuse/flow-renderer'\n\nimport BlueprintAPI from '../../api/flowBlueprints.js'\n\nexport default {\n name: 'FlowViewerDialog',\n props: {\n title: {\n type: String,\n default: ''\n }\n },\n setup () {\n return {\n async show (payload) { // accepts blueprints, snapshots and libraries\n // If there is no flows property, but there is a category property, we assume this is a blueprint\n // and try to load the content dynamically\n this.visible = true\n this.$nextTick(async () => {\n if (!payload.flows && Object.hasOwn(payload, 'category')) {\n const blueprint = await BlueprintAPI.getFlowBlueprint(payload.id)\n payload.flows = blueprint.flows\n }\n this.mode = 'view'\n this.$refs.dialog.show()\n this.payload = payload\n setTimeout(() => {\n this.renderFlows()\n }, 20)\n })\n }\n }\n },\n data () {\n return {\n payload: [],\n visible: false\n }\n },\n computed: {\n flow () {\n return this.payload?.flows?.flows || []\n },\n nrVersion () {\n const mods = this.payload?.settings?.modules\n if (mods) {\n return mods['node-red'] || 'Unavailable'\n }\n return ''\n },\n header () {\n return this.payload?.name || this.title || 'Flow'\n }\n },\n mounted () {\n },\n methods: {\n confirm () {\n this.$refs.dialog.close()\n this.visible = false\n },\n renderFlows () {\n const flowRenderer = new FlowRenderer()\n flowRenderer.renderFlows(this.flow, {\n container: this.$refs.viewer\n })\n }\n }\n}\n</script>\n\n<style scoped>\n.ff-flow-viewer {\n height: 100%;\n}\n</style>\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-blueprint-tile {\n background-color: $ff-white;\n width: 250px;\n border-width: 2px;\n\n &.active {\n border-width: 2px;\n border-color: $ff-blue-600;\n transition: border-color .3s;\n }\n\n .ff-blueprint-tile--header {\n position: relative;\n height: 115px;\n\n .ff-icon {\n transform: scale(8);\n position: absolute;\n top: 70px;\n transition: transform .3s;\n &.alt-preview {\n position: absolute;\n height: 30px;\n width: 30px;\n transform: scale(1) !important;\n top: 5px !important;\n right: 5px !important;\n stroke: none;\n opacity: .7;\n &:hover {\n cursor: zoom-in;\n color: $ff-blue-600;\n }\n }\n }\n\n .ff-more-info {\n position: absolute;\n top: 5px;\n left: 5px;\n }\n }\n\n &.no-icon {\n .ff-blueprint-tile--header {\n .ff-icon:not(.alt-preview) {\n transform: scale(4);\n position: initial;\n }\n }\n }\n\n .ff-dialog-container {\n .ff-dialog-box {\n max-width: 75rem;\n\n .ff-dialog-content {\n padding: 0;\n }\n\n .ff-dialog-actions {\n padding: 5px 15px;\n }\n }\n }\n &.interactive:hover {\n border-width: 2px;\n border-color: $ff-blue-600;\n .ff-blueprint-tile--header {\n .ff-icon:not(.alt-preview) {\n transform: scale(10);\n }\n }\n\n &.no-icon {\n .ff-blueprint-tile--header {\n .ff-icon:not(.alt-preview) {\n transform: scale(6);\n }\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-dialog-container {\n .ff-dialog-content {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n .file-upload-section {\n .file-row > div {\n flex-direction: column;\n align-items: baseline;\n }\n\n .ff-btn {\n width: 100%;\n }\n\n .file-input {\n display: flex;\n gap: 5px;\n }\n\n .loaded-file {\n display: flex;\n gap: 5px;\n align-items: center;\n margin-top: 10px;\n\n .clear {\n cursor: pointer;\n padding: 5px;\n\n .ff-btn--icon {\n width: 15px;\n height: 15px;\n }\n }\n }\n }\n\n .textarea-section {\n .textarea-wrapper {\n display: flex;\n justify-content: space-between;\n\n .clear {\n font-weight: normal;\n cursor: pointer;\n }\n }\n }\n\n .divider {\n position: relative;\n .line {\n height: 1px;\n width: 100%;\n background: $ff-grey-400;\n position: absolute;\n top: 50%;\n display: block;\n }\n .text {\n background: white;\n padding: 5px;\n position: relative;\n z-index: 10;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.tools {\n display: flex;\n gap: 5px;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.inactive-team {\n color: $ff-grey-400;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\ninput:disabled {\n background-color: $ff-white !important;\n opacity: .9;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\ntextarea:disabled {\n background-color: $ff-white;\n opacity: .9;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-text-copier {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n position: relative;\n &:hover {\n cursor: pointer;\n }\n .ff-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 4px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: $ff-color--action;\n\n &:hover {\n color: $ff-white;\n background-color: $ff-color--highlight;\n }\n\n &:active {\n background-color: $ff-color--highlight;\n }\n\n .ff-icon {\n pointer-events: none;\n }\n\n .ff-icon-check {\n color: $ff-green-600;\n }\n }\n .ff-copied {\n background-color: black;\n color: white;\n padding: 3px;\n border-radius: 3px;\n position: absolute;\n margin-top: -3px;\n margin-left: 3px;\n display: none;\n z-index: 100;\n left: 100%;\n }\n .ff-copied-left {\n left: inherit;\n right: 100%;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-data-table--cell textarea {\n resize: vertical;\n max-height: 10rem; /* 160px approx ~8 lines, after which user will need to scroll */\n /* Below styles emulate the text control in a form row */\n border: 1px solid #D1D5DB;\n border-radius: 6px;\n /* height: 32px; */\n padding: 6px;\n min-height: 32px; /* align with item in cell-1*/\n width: 100%;\n display: flex;\n gap: 0px;\n align-items: center;\n background-color: white;\n border-color: #D1D5DB;\n}\n.ff-data-table--cell .env-cell-uneditable {\n max-height: 10rem; /* 160px approx ~8 lines, after which user will need to scroll */\n overflow: auto;\n white-space: pre;\n cursor: default;\n}\n.ff-data-table--cell .env-cell-uneditable input {\n cursor: default;\n}\n.ff-data-table--cell div.uneditable {\n cursor: default;\n}\n",".ff-admin-audit {\n display: grid;\n grid-template-columns: 2fr minmax(min-content, 240px);\n gap: 24px;\n \n &.full-width {\n display: flex;\n grid-template-columns: none;\n gap: 0;\n \n \n }\n}\n",".ff-info-card h3 {\n display: flex;\n gap: 9px;\n margin-bottom: 12px;\n align-items: center;\n}\n\n.ff-info-card h3 svg {\n width: 1.5rem;\n height: 1.5rem;\n}\n\n.ff-info-card-content {\n padding: 6px 12px;\n background-color: white;\n border: 1px solid $ff-grey-300;\n}\n\n.ff-info-card-row {\n min-height: 36px;\n}\n\n.ff-info-card .ff-info-card-row:not(:last-child) {\n margin-bottom: 6px;\n padding-bottom: 6px;\n border-bottom: 1px solid $ff-grey-200;\n}","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.popover-item {\n display: flex;\n align-items: center;\n gap: 15px;\n padding: 10px 20px;\n cursor: pointer;\n\n .icon {\n padding: 5px;\n }\n\n .content {\n display: flex;\n flex-direction: column;\n\n .description {\n color: $ff-grey-400;\n }\n }\n\n &:hover {\n background: $ff-grey-100;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n\n.ff-icon-anim {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.ff-icon-installing {\n overflow: hidden;\n}\n\n.ff-icon-installing svg {\n --anim-time: 0.75s;\n position: relative;\n color: currentColor;\n animation: ff-icon-installing var(--anim-time) infinite linear;\n animation-delay: calc(var(--anim-time) / 2);\n}\n\n@keyframes ff-icon-installing {\n 0% {\n opacity: 0;\n transform: translate(0, -100%);\n }\n 50% {\n opacity: 1;\n transform: translate(0, 0);\n }\n 100% {\n opacity: 0;\n transform: translate(0, 100%);\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n\n.ff-icon-anim {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.ff-icon-pulling {\n overflow: hidden;\n}\n\n.ff-icon-pulling svg {\n --anim-time: 0.75s;\n position: relative;\n color: currentColor;\n animation: ff-icon-pulling var(--anim-time) infinite linear;\n animation-delay: calc(var(--anim-time) / 2);\n}\n\n@keyframes ff-icon-pulling {\n 0% {\n opacity: 0;\n transform: translate(0, -100%);\n }\n 50% {\n opacity: 1;\n transform: translate(0, 0);\n }\n 100% {\n opacity: 0;\n transform: translate(0, 100%);\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n\n.ff-icon-anim {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.ff-icon-pushing {\n overflow: hidden;\n}\n\n.ff-icon-pushing svg {\n --anim-time: 0.75s;\n position: relative;\n color: currentColor;\n animation: ff-icon-pushing var(--anim-time) infinite linear;\n animation-delay: calc(var(--anim-time) / 2);\n}\n\n@keyframes ff-icon-pushing {\n 0% {\n opacity: 0;\n transform: translate(0, 100%);\n }\n 50% {\n opacity: 1;\n transform: translate(0, 0);\n }\n 100% {\n opacity: 0;\n transform: translate(0, -100%);\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n\n.ff-icon-restarting svg {\n --anim-time: 1s;\n position: relative;\n color: currentColor;\n animation: ff-icon-restarting var(--anim-time) infinite linear;\n}\n\n@keyframes ff-icon-restarting {\n 0% {\n opacity: 0.2;\n transform: rotate(360deg);\n }\n 33% {\n opacity: 1;\n }\n 66% {\n opacity: 1;\n }\n 100% {\n opacity: 0.2;\n transform: rotate(0deg);\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-icon-anim {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.ff-icon-starting {\n --cell-width: 2px;\n --cell-offset: calc(var(--cell-width) * 1.5);\n --anim-time: 0.5s;\n position: relative;\n width: var(--cell-width);\n height: var(--cell-width);\n border-radius: 5px;\n background-color: currentColor;\n color: currentColor;\n animation: ff-icon-starting var(--anim-time) infinite linear alternate;\n animation-delay: calc(var(--anim-time) / 2);\n}\n\n.ff-icon-starting::before, .ff-icon-starting::after {\n content: \"\";\n display: inline-block;\n position: absolute;\n top: 0;\n}\n.ff-icon-starting::before {\n left: calc(-1 * var(--cell-offset));\n width: var(--cell-width);\n height: var(--cell-width);\n border-radius: 5px;\n background-color: currentColor;\n color: currentColor;\n animation: ff-icon-starting var(--anim-time) infinite alternate;\n animation-delay: 0s;\n}\n.ff-icon-starting::after {\n left: var(--cell-offset);\n width: var(--cell-width);\n height: var(--cell-width);\n border-radius: 5px;\n background-color: currentColor;\n color: currentColor;\n animation: ff-icon-starting var(--anim-time) infinite alternate;\n animation-delay: var(--anim-time);\n}\n\n@keyframes ff-icon-starting {\n 0% {\n background-color: currentColor;\n }\n 50%, 100% {\n background-color: rgba($ff-grey-500, 0.2);\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-device-overview {\n h1 {\n border-bottom: none;\n margin-bottom: 12px;\n }\n}\n.ff-device-overview-audit {\n .ff-accordion {\n margin-bottom: 12px;\n }\n .ff-accordion:last-child {\n margin-bottom: 0;\n }\n .ff-accordion--content {\n background-color: white;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.chart-wrapper {\n flex: 1;\n display: flex;\n\n .chart {\n flex: 1;\n height: 100%;\n width: 100%;\n min-height: 250px;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.chart-wrapper {\n flex: 1;\n display: flex;\n\n .chart {\n flex: 1;\n height: 100%;\n width: 100%;\n min-height: 250px;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.notice {\n border: 1px solid $ff-yellow-100;\n background-color: $ff-yellow-10;\n border-radius: $ff-unit-sm;\n padding: $ff-unit-md;\n\n .icon-wrapper {\n min-width: 40px;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.device-list-accordion {\n &.ff-accordion {\n margin-bottom: 0;\n\n button {\n border-top: none;\n border-left: none;\n border-right: none;\n background: transparent;\n transition: background-color ease-in-out .3s;\n padding-left: 0;\n padding-right: 0;\n\n label {\n font-weight: normal;\n }\n\n &:hover {\n background-color: transparent;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-toggle-group {\n display: flex;\n gap: 15px;\n align-items: center;\n\n .title {\n color: $ff-black;\n font-weight: 400;\n }\n\n .toggle {\n border: 1px solid $ff-blue-800;\n display: flex;\n border-radius: 5px;\n\n .inner-wrapper {\n display: grid;\n grid-template-columns: repeat(var(--button-count), 1fr);\n border-radius: 4px;\n border: 1px solid transparent;\n position: relative;\n\n .indicator {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: $ff-indigo-700;\n border-radius: 4px;\n transition: transform 0.2s ease;\n z-index: 0;\n }\n\n a {\n padding: 5px 10px;\n border-radius: 4px;\n transition: color 0.2s ease;\n position: relative;\n z-index: 1;\n text-align: center;\n\n &.router-link-active {\n color: $ff-white;\n }\n }\n\n .ff-btn {\n background: transparent;\n color: $ff-grey-500;\n border-color: transparent;\n position: relative;\n z-index: 1;\n border-radius: 4px;\n\n &:focus-visible {\n outline: 2px solid $ff-indigo-700;\n outline-offset: 1px;\n }\n\n &.active {\n color: $ff-white;\n }\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.page-fade-enter-active, .page-fade-leave-active {\n transition: opacity .2s ease-in-out;\n}\n\n.page-fade-enter, .page-fade-leave-to {\n opacity: 0;\n}\n\n// Viewport-based responsive behavior (matches Tailwind sm: breakpoint)\n// Hide button text on narrow viewports (< 640px)\n@media (max-width: 639px) {\n .upload-snapshot-text,\n .create-snapshot-text {\n display: none;\n }\n}\n\n// Show button text on wider viewports (>= 640px)\n@media (min-width: 640px) {\n .upload-snapshot-text,\n .create-snapshot-text {\n display: inline;\n }\n}\n\n// Container query for drawer context - responsive button behavior\n// Breakpoint matches DRAWER_MOBILE_BREAKPOINT constant in Editor/index.vue\n// These override viewport-based rules when inside the drawer\n@container drawer (max-width: 639px) {\n // Hide text when drawer is narrow - icon-only mode\n .upload-snapshot-text,\n .create-snapshot-text {\n display: none;\n }\n}\n\n@container drawer (min-width: 640px) {\n // Show text when drawer is wide enough\n .upload-snapshot-text,\n .create-snapshot-text {\n display: inline;\n }\n}\n\n","<template>\n <ff-dialog\n ref=\"dialog\" :header=\"header\" confirm-label=\"Close\" :closeOnConfirm=\"true\" data-el=\"flow-view-dialog\"\n boxClass=\"!min-w-[80%] !min-h-[80%] !w-[80%] !h-[80%]\" contentClass=\"overflow-hidden flex-grow\"\n @confirm=\"confirm()\"\n >\n <template #default>\n <div class=\"flex gap-2\" data-el=\"snapshot-compare-toolbar\">\n <ff-listbox\n v-model=\"compareSnapshot\"\n :options=\"compareSnapshotList\"\n data-el=\"snapshots-list\"\n label-key=\"label\"\n option-title-key=\"description\"\n class=\"flex-grow\"\n />\n <ff-button\n v-if=\"true\"\n :disabled=\"!compareSnapshot\"\n data-action=\"compare-snapshots\"\n kind=\"secondary\"\n style=\"height: 30px; width: 106px\"\n class=\"w-32\"\n @click=\"renderComparison\"\n >\n Compare\n </ff-button>\n </div>\n <div v-if=\"changes.length\" class=\"flex justify-between items-center gap-2 mt-2 ml-2\">\n <div class=\"whitespace-nowrap\">Change {{ changeIndex + 1 }} of {{ changes.length }}:</div>\n <div class=\"text-sm text-gray-500 flex-grow truncate overflow-ellipsis\">\n {{ changes[changeIndex].toString() }}\n </div>\n <ff-button kind=\"secondary\" size=\"small\" class=\"w-14\" @click=\"gotoPreviousDifference\">Prev</ff-button>\n <ff-button kind=\"secondary\" size=\"small\" class=\"w-14\" @click=\"gotoNextDifference\">Next</ff-button>\n </div>\n <div v-else class=\"mt-2\">\n <div class=\"text-sm text-gray-500 flex-grow truncate overflow-ellipsis ml-2\">No differences found</div>\n </div>\n <div ref=\"compareViewer\" data-el=\"ff-flow-compare-view\" class=\"ff-flow-compare-viewer pt-4\" @click.stop.prevent>\n \n </div>\n </template>\n <template #actions>\n <div class=\"flex justify-end\">\n <ff-button data-action=\"dialog-confirm\" @click=\"confirm()\">Close</ff-button>\n </div>\n </template>\n </ff-dialog>\n</template>\n<script>\n\nimport FlowRenderer from '@flowfuse/flow-renderer'\n\nimport SnapshotsApi from '../../api/snapshots.js'\n\nimport Alerts from '../../services/alerts.js'\n\nexport default {\n name: 'AssetCompareDialog',\n props: {\n title: {\n type: String,\n default: ''\n }\n },\n setup () {\n return {\n /**\n * Shows the compare flows dialog and presents the user with a list of snapshots to compare against\n * @param {{flows: { flows :[]}}} v1Snapshot - A snapshot object as the base for comparison\n * @param {[{label: String, value: String}]} snapshotList - A list of snapshots to compare against where label is the snapshot name and value is the snapshot id\n */\n show (v1Snapshot, snapshotList) {\n this.mode = 'compare'\n this.payload = v1Snapshot\n this.compareSnapshot = null\n this.changes = []\n this.changeIndex = 0\n this.compareSnapshotList = snapshotList\n this.$refs.dialog.show()\n }\n }\n },\n data () {\n return {\n payload: [],\n snapshotList: [],\n compareSnapshot: null,\n compareSnapshotList: [],\n mode: 'view', // view, compare\n changes: [],\n changeIndex: 0\n }\n },\n computed: {\n flow () {\n return this.payload?.flows?.flows || []\n },\n header () {\n return this.payload?.name || this.title || 'Flow'\n }\n },\n mounted () {\n },\n methods: {\n confirm () {\n this.cleanup()\n this.$refs.dialog.close()\n },\n renderFlows () {\n this.cleanup()\n const flowRenderer = new FlowRenderer()\n flowRenderer.renderFlows(this.flow, {\n container: this.$refs.compareViewer\n })\n },\n async renderComparison (snapshotId) {\n this.cleanup()\n const compareSnapshot = await SnapshotsApi.getFullSnapshot(this.compareSnapshot)\n if (!compareSnapshot?.flows?.flows) {\n Alerts.emit('Flows not found in the selected snapshot', 'warning')\n return\n }\n const flowRenderer = new FlowRenderer()\n const flows = [this.flow, compareSnapshot?.flows?.flows]\n const result = flowRenderer.compare(flows, {\n container: this.$refs.compareViewer\n })\n this.changes = result?.changes || []\n },\n gotoNextDifference () {\n this.changeIndex = (this.changeIndex + 1) % this.changes.length\n this.changes[this.changeIndex].highlight()\n },\n gotoPreviousDifference () {\n this.changeIndex = (this.changeIndex - 1 + this.changes.length) % this.changes.length\n this.changes[this.changeIndex].highlight()\n },\n cleanup () {\n while (this.$refs.compareViewer?.firstChild) {\n this.$refs.compareViewer.removeChild(this.$refs.compareViewer.firstChild)\n }\n }\n }\n}\n</script>\n\n<style scoped>\n.ff-flow-compare-viewer {\n height: calc(100% - 4.5rem);\n}\n</style>\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.flow-viewer-wrapper {\n display: flex;\n flex: 1 1 auto;\n min-height: 0;\n flex-direction: column;\n position: relative;\n\n .overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(255, 255, 255, 0.4);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 1000;\n }\n\n .ff-flow-viewer {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n opacity: 1;\n transition: ease-in-out .3s;\n\n &.loading {\n opacity: 0.5;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#snapshot-details-drawer {\n flex: 1;\n\n &, .container {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 15px;\n overflow: auto;\n }\n\n .description {\n p {\n white-space: break-spaces;\n }\n }\n\n .flow-viewer {\n .wrapper {\n max-height: 250px;\n overflow: auto;\n }\n }\n}\n","<template>\n <div id=\"device-snapshots\" class=\"flex-1 flex flex-col overflow-auto\">\n <div v-if=\"isOwnedByAnInstance || isUnassigned\" class=\"space-y-6\">\n <EmptyState :feature-unavailable=\"!features.deviceEditor\">\n <template #img>\n <img src=\"../../../../images/empty-states/instance-snapshots.png\">\n </template>\n <template #header>Snapshots are available when a Remote Instance is assigned to an Application</template>\n <template #message>\n <p>\n Snapshots are point-in-time backups of your Node-RED Instances\n and capture the flows, credentials and runtime settings.\n </p>\n <p v-if=\"device.ownerType !== 'application'\" class=\"block\">\n A Remote Instance must first be <a class=\"ff-link\" href=\"https://flowfuse.com/docs/device-agent/register/#assign-the-device-to-an-application\" target=\"_blank\" rel=\"noreferrer\">assigned to an Application</a>, in order to create snapshots.\n </p>\n <p v-else-if=\"!developerMode\" class=\"block\">\n A Remote Instance must be in Developer Mode and online to create a Snapshot.\n </p>\n </template>\n <template v-if=\"hasPermission('device:snapshot:create', { application: device.application })\" #actions>\n <ff-button\n v-if=\"hasPermission('snapshot:import', { application: device.application })\"\n kind=\"secondary\" :disabled=\"busy || !features.deviceEditor || device.ownerType !== 'application'\"\n data-action=\"import-snapshot\"\n @click=\"$emit('show-import-snapshot-dialog')\"\n >\n <template #icon-left><UploadIcon /></template>Upload Snapshot\n </ff-button>\n <ff-button\n v-if=\"hasPermission('device:snapshot:create', { application: device.application })\"\n kind=\"primary\"\n :disabled=\"!developerMode || busy || !features.deviceEditor || device.ownerType !== 'application'\"\n data-action=\"create-snapshot\"\n @click=\"$emit('show-create-snapshot-dialog')\"\n >\n <template #icon-left><PlusSmIcon /></template>Create Snapshot\n </ff-button>\n </template>\n </EmptyState>\n </div>\n <div v-else class=\"space-y-6 flex-1 flex flex-col overflow-auto\">\n <ff-loading v-if=\"loading\" message=\"Loading Snapshots...\" />\n <template v-else-if=\"features.deviceEditor && snapshots.length > 0\">\n <ff-data-table\n data-el=\"snapshots\"\n class=\"space-y-4\"\n :columns=\"columns\"\n :rows=\"snapshotsFiltered\"\n :rows-selectable=\"true\"\n :show-search=\"true\"\n search-placeholder=\"Search Snapshots...\"\n @row-selected=\"onRowSelected\"\n >\n <template #actions>\n <DropdownMenu data-el=\"snapshot-filter\" buttonClass=\"ff-btn ff-btn--secondary\" :options=\"snapshotFilterOptions\">\n <FilterIcon class=\"ff-btn--icon ff-btn--icon-left\" aria-hidden=\"true\" />\n {{ snapshotFilter?.name || 'All Snapshots' }}\n <span class=\"sr-only\">Filter Snapshots</span>\n </DropdownMenu>\n </template>\n </ff-data-table>\n </template>\n <template v-else-if=\"!loading\">\n <EmptyState :feature-unavailable=\"!features.deviceEditor\" :feature-unavailable-message=\"'This requires Developer Mode on Devices, which is a FlowFuse Enterprise Feature'\">\n <template #img>\n <img src=\"../../../../images/empty-states/instance-snapshots.png\">\n </template>\n <template #header>Create your First Snapshot</template>\n <template #message>\n <p>\n Snapshots are point-in-time backups of your Node-RED Instances\n and capture the flows, credentials and runtime settings.\n </p>\n <p v-if=\"device.ownerType !== 'application'\" class=\"block\">\n A Remote Instance must first be <a class=\"ff-link\" href=\"https://flowfuse.com/docs/device-agent/register/#assign-the-device-to-an-application\" target=\"_blank\" rel=\"noreferrer\">assigned to an Application</a>, in order to create snapshots.\n </p>\n <p v-else-if=\"!developerMode\" class=\"block\">\n A Remote Instance must be in Developer Mode and online to create a Snapshot.\n </p>\n </template>\n <template v-if=\"hasPermission('device:snapshot:create', { application: device.application })\" #actions>\n <ff-button\n v-if=\"hasPermission('snapshot:import', { application: device.application })\"\n kind=\"secondary\" :disabled=\"busy || !features.deviceEditor || device.ownerType !== 'application'\"\n data-action=\"import-snapshot\"\n @click=\"$emit('show-import-snapshot-dialog')\"\n >\n <template #icon-left><UploadIcon /></template>Upload Snapshot\n </ff-button>\n <ff-button\n kind=\"primary\"\n :disabled=\"!canCreateSnapshot\"\n data-action=\"create-snapshot\"\n @click=\"$emit('show-create-snapshot-dialog')\"\n >\n <template #icon-left><PlusSmIcon /></template>Create Snapshot\n </ff-button>\n </template>\n </EmptyState>\n </template>\n </div>\n </div>\n</template>\n\n<script>\nimport { FilterIcon, PlusSmIcon, UploadIcon } from '@heroicons/vue/outline'\nimport SemVer from 'semver'\nimport { markRaw } from 'vue'\nimport { mapActions, mapState } from 'vuex'\n\nimport ApplicationApi from '../../../../api/application.js'\nimport DropdownMenu from '../../../../components/DropdownMenu.vue'\n\nimport EmptyState from '../../../../components/EmptyState.vue'\nimport SnapshotDetailsDrawer from '../../../../components/drawers/snapshots/SnapshotDetailsDrawer.vue'\nimport UserCell from '../../../../components/tables/cells/UserCell.vue'\nimport usePermissions from '../../../../composables/Permissions.js'\nimport { applySystemUserDetails } from '../../../../transformers/snapshots.transformer.js'\nimport { isAutoSnapshot } from '../../../../utils/snapshot.js'\nimport DaysSince from '../../../application/Snapshots/components/cells/DaysSince.vue'\nimport SnapshotName from '../../../application/Snapshots/components/cells/SnapshotName.vue'\nimport SnapshotSource from '../../../application/Snapshots/components/cells/SnapshotSource.vue'\n\nexport default {\n name: 'DeviceSnapshots',\n components: {\n DropdownMenu,\n EmptyState,\n FilterIcon,\n PlusSmIcon,\n UploadIcon\n },\n inheritAttrs: false,\n props: {\n device: {\n type: Object,\n required: true\n },\n showDeviceSnapshotsOnly: {\n type: Boolean,\n required: false,\n default: false\n },\n reloadHooks: {\n type: Array,\n required: true,\n default: () => []\n }\n },\n emits: ['device-updated', 'show-import-snapshot-dialog', 'show-create-snapshot-dialog'],\n setup () {\n const { hasPermission } = usePermissions()\n return { hasPermission }\n },\n data () {\n return {\n loading: false,\n deviceCounts: {},\n snapshots: [],\n busyMakingSnapshot: false,\n busyImportingSnapshot: false,\n snapshotFilter: null,\n snapshotFilters: {\n All_Snapshots: {\n name: 'All Snapshots',\n selected: true,\n filter: null,\n action: () => {\n this.snapshotFilters.All_Snapshots.selected = true\n this.snapshotFilters.User_Snapshots.selected = false\n this.snapshotFilters.Auto_Snapshots.selected = false\n this.snapshotFilter = this.snapshotFilters.All_Snapshots\n }\n },\n User_Snapshots: {\n name: 'User Snapshots',\n selected: false,\n filter: (s) => !isAutoSnapshot(s),\n action: () => {\n this.snapshotFilters.All_Snapshots.selected = false\n this.snapshotFilters.User_Snapshots.selected = true\n this.snapshotFilters.Auto_Snapshots.selected = false\n this.snapshotFilter = this.snapshotFilters.User_Snapshots\n }\n },\n Auto_Snapshots: {\n name: 'Auto Snapshots',\n selected: false,\n filter: (s) => isAutoSnapshot(s),\n action: () => {\n this.snapshotFilters.All_Snapshots.selected = false\n this.snapshotFilters.User_Snapshots.selected = false\n this.snapshotFilters.Auto_Snapshots.selected = true\n this.snapshotFilter = this.snapshotFilters.Auto_Snapshots\n }\n }\n }\n }\n },\n computed: {\n ...mapState('account', ['team', 'features']),\n canCreateSnapshot () {\n if (!this.developerMode || this.busy) {\n return false\n }\n return this.isOwnedByAnInstance || this.isOwnedByAnApplication\n },\n columns () {\n const cols = [\n {\n label: 'Snapshot',\n class: ['w-56 sm:w-48'],\n component: {\n is: markRaw(SnapshotName),\n extraProps: {\n clippedDetails: true\n }\n }\n },\n {\n label: 'Source',\n class: ['w-56'],\n key: '_ownerSortKey',\n // sortable: !this.moreThanOnePage,\n component: {\n is: markRaw(SnapshotSource)\n }\n },\n {\n label: 'Node-RED version',\n class: ['w-56'],\n key: 'modules.node-red'\n },\n {\n label: 'Created By',\n class: ['w-48 hidden md:table-cell'],\n component: {\n is: markRaw(UserCell),\n map: {\n avatar: 'user.avatar',\n name: 'user.name',\n username: 'user.username'\n }\n }\n },\n {\n label: 'Date Created',\n class: ['w-48 hidden sm:table-cell'],\n component: { is: markRaw(DaysSince), map: { date: 'createdAt' } }\n }\n ]\n return cols\n },\n snapshotList () {\n return this.snapshots.map(s => {\n return {\n label: s.name,\n description: s.description || '',\n value: s.id\n }\n })\n },\n snapshotsFiltered () {\n if (this.snapshotFilter?.filter) {\n return this.snapshots.filter(this.snapshotFilter.filter)\n }\n return this.snapshots\n },\n snapshotFilterOptions () {\n return Object.values(this.snapshotFilters)\n },\n busy () {\n return this.busyMakingSnapshot || this.busyImportingSnapshot\n },\n developerMode () {\n return this.device?.mode === 'developer'\n },\n isOwnedByAnInstance () {\n return this.device?.ownerType === 'instance'\n },\n isOwnedByAnApplication () {\n return this.device?.ownerType === 'application'\n },\n isUnassigned () {\n return this.device?.ownerType === ''\n }\n },\n watch: {\n team: 'fetchData',\n device: 'fetchData',\n showDeviceSnapshotsOnly: 'fetchData',\n reloadHooks: {\n handler: 'fetchData',\n deep: true\n }\n },\n mounted () {\n this.fetchData()\n },\n methods: {\n ...mapActions('ux/drawers', ['openRightDrawer', 'closeRightDrawer']),\n fetchData: async function () {\n if (!this.features.deviceEditor || this.isOwnedByAnInstance || this.isUnassigned) {\n return\n }\n if (this.device.id && this.device.application) {\n this.loading = true\n const ssFilter = {\n deviceId: this.showDeviceSnapshotsOnly ? this.device.id : null\n }\n const data = await ApplicationApi.getSnapshots(this.device.application.id, null, null, ssFilter) // TODO Move devices snapshots?\n\n this.snapshots = data.snapshots.map(snapshot => {\n const ownerKey = this.getSortKeyForSnapshotSource(snapshot)\n return {\n ...snapshot,\n ...(ownerKey ? { _ownerSortKey: ownerKey } : { _ownerSortKey: undefined })\n }\n })\n this.snapshots = applySystemUserDetails(data.snapshots)\n this.loading = false\n }\n },\n getSortKeyForSnapshotSource (snapshot) {\n if (snapshot.ownerType === 'device') {\n return 'Device:' + snapshot.device?.name || 'No Name'\n }\n\n if (snapshot.ownerType === 'instance') {\n return 'Instance:' + snapshot.instance?.name || 'No Name'\n }\n\n return 'Unassigned'\n },\n // enable/disable snapshot actions\n canDeploy (_row) {\n return (!this.developerMode || this.supportsDevModeSnapshotRestore()) && this.hasPermission('device:edit', { application: this.device.application })\n },\n canDeployReason (snapshot) {\n if (!this.hasPermission('device:edit', { application: this.device.application })) {\n return 'You do not have permission to deploy snapshots to this Remote Instance'\n }\n if (this.developerMode && !this.supportsDevModeSnapshotRestore()) {\n return 'Snapshots deploys to Developer Mode Remote Instances requires Device Agent v3.8.0 or later'\n }\n return ''\n },\n supportsDevModeSnapshotRestore () {\n return this.device.agentVersion && SemVer.gte(this.device.agentVersion, '3.8.0')\n },\n onRowSelected (snapshot) {\n this.openRightDrawer({\n component: markRaw(SnapshotDetailsDrawer),\n props: {\n snapshot,\n snapshotList: this.snapshotList,\n instance: this.device,\n canSetDeviceTarget: false,\n canRestore: this.canDeploy(snapshot),\n canRestoreReason: this.canDeployReason(snapshot),\n isDevice: true,\n isDeviceDevMode: this.developerMode\n },\n on: {\n updatedSnapshot: () => this.fetchData(true),\n restoredSnapshot: () => {\n setTimeout(() => {\n this.$emit('device-updated')\n }, 100)\n this.fetchData(true)\n },\n deletedSnapshot: () => {\n this.closeRightDrawer()\n this.fetchData(true)\n }\n },\n overlay: true,\n wider: true\n })\n }\n }\n}\n</script>\n\n<style>\n\ntbody .ff-data-table--row > .ff-data-table--cell > .deploy-this-snapshot-button {\n display: none;\n}\n\ntbody tr.ff-data-table--row:hover .ff-data-table--cell .deploy-this-snapshot-button {\n display: flex;\n}\n\n</style>\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.graph {\n min-width: 64px;\n padding: 15px;\n position: relative;\n overflow: hidden;\n\n .icon-wrapper {\n min-width: 34px;\n min-height: 35px;\n border: 2px solid $ff-blue-800;\n border-radius: 50%;\n padding: 5px;\n background: #fff;\n position: relative;\n z-index: 10;\n color: $ff-blue-800;\n }\n\n .connector {\n border: 1px solid $ff-blue-800;\n position: absolute;\n left: 47%; // compensates for border width\n z-index: 5;\n\n &.top {\n top: -230px;\n height: 250px;\n\n &.snapshot {\n transform: rotate(45deg);\n top: -25%;\n left: 80%;\n height: 50px;\n border-style: dashed;\n border-color: $ff-grey-500;\n }\n }\n\n &.bottom {\n bottom: -200px;\n height: 230px;\n &.snapshot {\n transform: rotate(-45deg);\n top: 50%;\n left: 83%;\n height: 50px;\n border-style: dashed;\n border-color: $ff-grey-500;\n }\n }\n\n &.through {\n bottom: -100px;\n height: 230px;\n left: 30px;\n }\n }\n\n &.is-snapshot {\n padding-left: 45px;\n min-width: 94px;\n\n .connector {\n &.top, &.bottom {\n left: 65%;\n border-color: $ff-grey-500;\n border-style: dashed;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.event {\n\n .body {\n padding: 15px 0;\n overflow: hidden;\n\n .content {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .title {\n overflow: hidden;\n text-overflow: ellipsis;\n\n i {\n opacity: .5;\n }\n\n a {\n color: $ff-blue-600;\n }\n }\n\n .details {\n font-size: 70%;\n opacity: 0.8;\n }\n }\n\n .username {\n color: $ff-grey-600;\n }\n }\n\n .actions {\n padding: 15px 10px;\n min-width: 40px;\n }\n\n &.is-snapshot {\n background: $ff-grey-100;\n color: $ff-grey-500;\n }\n\n &.load-more {\n background: $ff-grey-200;\n color: $ff-blue-500;\n cursor: pointer;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#visual-timeline {\n .timeline {\n border: 1px solid $ff-grey-300;\n border-radius: 3px;\n overflow: auto;\n li:last-child {\n .connector.bottom {\n display: none;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.installation-method-selector {\n display: flex;\n gap: 50px;\n margin-bottom: 15px;\n position: relative;\n\n .ff-method-option {\n flex: 1;\n text-align: center;\n border-bottom: 2px solid $ff-color--border;\n padding-bottom: 5px;\n cursor: pointer;\n transition: ease-in-out .3s;\n\n &.active {\n border-color: $ff-indigo-500;\n }\n\n &:first-of-type:after {\n content: 'or';\n position: absolute;\n top: 5%;\n left: 49%;\n font-style: italic;\n font-size: $ff-funit-sm;\n color: $ff-grey-500;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.os-selector {\n .os-item {\n transition: ease-in-out .3s;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#assign-device-dialog {\n .ff-tile-selection {\n margin-top: 1rem;\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 1rem;\n }\n .ff-tile-selection-option {\n width: auto;\n margin: 0;\n }\n}\n","<template>\n <main v-if=\"device\" class=\"ff-with-status-header flex-1 flex flex-col overflow-auto\">\n <Teleport v-if=\"mounted\" to=\"#platform-banner\">\n <SubscriptionExpiredBanner :team=\"team\" />\n <TeamTrialBanner v-if=\"team.billing?.trial\" :team=\"team\" />\n </Teleport>\n <SectionNavigationHeader :tabs=\"navigation\">\n <template #breadcrumbs>\n <ff-nav-breadcrumb :to=\"{name: 'TeamDevices', params: {team_slug: team.slug}}\">Remote Instances</ff-nav-breadcrumb>\n <ff-nav-breadcrumb>{{ device.name }}</ff-nav-breadcrumb>\n </template>\n <template #status>\n <div class=\"flex flex-wrap gap-2\">\n <DeviceLastSeenBadge :last-seen-at=\"device.lastSeenAt\" :last-seen-ms=\"device.lastSeenMs\" :last-seen-since=\"device.lastSeenSince\" />\n <StatusBadge :status=\"device.status\" :instanceId=\"device.id\" instanceType=\"device\" />\n <DeviceModeBadge v-if=\"isDevModeAvailable \" :mode=\"device.mode\" />\n </div>\n </template>\n <template #context>\n <div v-if=\"device?.ownerType === 'application' && device.application\" data-el=\"device-assigned-application\">\n Application:\n <ff-team-link :to=\"{name: 'Application', params: {id: device.application?.id}}\" class=\"text-blue-600 cursor-pointer hover:text-blue-700 hover:underline\">{{ device.application?.name }}</ff-team-link>\n </div>\n <div v-else-if=\"device?.ownerType === 'instance' && device.instance\" data-el=\"device-assigned-instance\">\n Instance:\n <ff-team-link :to=\"{name: 'Instance', params: {id: device.instance.id}}\" class=\"text-blue-600 cursor-pointer hover:text-blue-700 hover:underline\">{{ device.instance.name }}</ff-team-link>\n </div>\n <div v-else data-el=\"device-assigned-none\">\n <span class=\"italic\">No Application or Instance Assigned</span> - <a class=\"ff-link\" data-action=\"assign-device\" @click=\"openAssignmentDialog\">Assign</a>\n </div>\n </template>\n <template #tools>\n <!--\n div style 34px is a workaround to prevent the Device Editor button growing taller than adjacent\n button (size difference is caused by odd padding in the toggle button, which though not visible\n is still there and affects the button height in this div group)\n -->\n <div class=\"flex gap-2 align-center\" style=\"height: 34px;\">\n <template v-if=\"isDevModeAvailable\">\n <template v-if=\"neverConnected\">\n <FinishSetupButton\n v-if=\"hasPermission('device:create', {application: device.application})\"\n :is-primary=\"neverConnected\"\n :device=\"device\"\n />\n </template>\n <template v-else>\n <DeveloperModeToggle\n data-el=\"device-devmode-toggle\"\n :device=\"device\"\n :disabled=\"disableModeToggle\"\n :disabledReason=\"disableModeToggleReason\"\n @mode-change=\"setDeviceMode\"\n />\n <device-editor-link\n :device=\"device\"\n :title=\"!editorAvailable ? 'You can edit flows directly when Developer Mode is enabled, and your Edge Instance is connected.' : 'Open Edge Instance Editor'\"\n :disabled=\"!editorAvailable\"\n :primary=\"editorAvailable\"\n data-action=\"open-editor\"\n @open-immersive-editor=\"openTunnel({launchEditor: true, event: $event, immersive: true})\"\n @open-editor=\"openTunnel({launchEditor: true, event: $event, immersive: false})\"\n />\n </template>\n </template>\n <DropdownMenu\n v-if=\"hasPermission('device:change-status', permissionContext) && actionsDropdownOptions.length\"\n data-el=\"device-actions-dropdown\"\n :buttonClass=\"`ff-btn ff-btn-icon ${ actionsButtonKind }`\"\n :options=\"actionsDropdownOptions\"\n >\n <CogIcon class=\"ff-btn--icon ff-btn--icon-left\" />\n Actions\n </DropdownMenu>\n </div>\n </template>\n </SectionNavigationHeader>\n <div class=\"mt-4 sm:mt-8 flex-1 flex flex-col overflow-auto\">\n <Teleport v-if=\"mounted && isVisitingAdmin\" to=\"#platform-banner\">\n <div class=\"ff-banner\" data-el=\"banner-device-as-admin\">You are viewing this device as an Administrator</div>\n </Teleport>\n <div class=\"px-3 pb-3 md:px-6 md:pb-6 flex-1 flex flex-col overflow-auto\">\n <router-view :instance=\"device.instance\" :closingTunnel=\"closingTunnel\" :openingTunnel=\"openingTunnel\" :device=\"device\" @device-updated=\"loadDevice\" @close-tunnel=\"closeTunnel\" @open-tunnel=\"openTunnel\" @device-refresh=\"deviceRefresh\" @assign-device=\"openAssignmentDialog\" />\n </div>\n </div>\n <!-- Dialogs -->\n <!-- device tunnel connecting -->\n <ff-dialog ref=\"dialog\" data-el=\"establish-device-tunnel-dialog\" header=\"Preparing the connection...\">\n <template #default>\n <div class=\"flex flex-col ml-6 mr-6\">\n <div class=\"mb-4\">\n <p>Connecting to the device</p>\n </div>\n <div class=\"flex justify-between items-center\">\n <div class=\"flex text-center\">\n <img class=\"h-16 w-16\" src=\"../../images/pictograms/cloud_teal.png\">\n </div>\n <div class=\"flex-grow m-4\">\n <div class=\"w-full\">\n <div class=\"h-1 w-full bg-teal-200 overflow-hidden\">\n <div kind=\"secondary\" class=\"progress w-full h-full bg-teal-800 left-right\" />\n </div>\n </div>\n </div>\n <div class=\"flex text-center\">\n <img class=\"h-16 w-16\" src=\"../../images/pictograms/devices_red.png\">\n </div>\n </div>\n </div>\n </template>\n <template #actions>\n <ff-button data-action=\"tunnel-connect-cancel\" kind=\"secondary\" class=\"ml-4\" @click=\"closeTunnel()\">Cancel</ff-button>\n </template>\n </ff-dialog>\n <AssignDeviceDialog\n v-if=\"notAssigned\"\n ref=\"assignment-dialog\"\n data-el=\"assignment-dialog\"\n @assign-option-selected=\"assignOptionSelected\"\n />\n <DeviceAssignInstanceDialog\n v-if=\"notAssigned\"\n ref=\"deviceAssignInstanceDialog\"\n data-el=\"assignment-dialog-instance\"\n @assign-device=\"assignDeviceToInstance\"\n />\n <DeviceAssignApplicationDialog\n v-if=\"notAssigned\"\n ref=\"deviceAssignApplicationDialog\"\n data-el=\"assignment-dialog-application\"\n @assign-device=\"assignDeviceToApplication\"\n />\n </main>\n</template>\n\n<script>\n\nimport { CogIcon } from '@heroicons/vue/solid/index.js'\nimport semver from 'semver'\nimport { mapState } from 'vuex'\n\nimport deviceApi from '../../api/devices.js'\nimport DropdownMenu from '../../components/DropdownMenu.vue'\nimport FinishSetupButton from '../../components/FinishSetup.vue'\nimport SectionNavigationHeader from '../../components/SectionNavigationHeader.vue'\nimport StatusBadge from '../../components/StatusBadge.vue'\nimport SubscriptionExpiredBanner from '../../components/banners/SubscriptionExpired.vue'\nimport TeamTrialBanner from '../../components/banners/TeamTrial.vue'\nimport { useNavigationHelper } from '../../composables/NavigationHelper.js'\nimport usePermissions from '../../composables/Permissions.js'\nimport deviceActionsMixin from '../../mixins/DeviceActions.js'\n\nimport Alerts from '../../services/alerts.js'\nimport Dialog from '../../services/dialog.js'\nimport { DeviceStateMutator } from '../../utils/DeviceStateMutator.js'\nimport { createPollTimer } from '../../utils/timers.js'\n\nimport DeviceAssignApplicationDialog from '../team/Devices/dialogs/DeviceAssignApplicationDialog.vue'\nimport DeviceAssignInstanceDialog from '../team/Devices/dialogs/DeviceAssignInstanceDialog.vue'\n\nimport AssignDeviceDialog from './components/AssignDeviceDialog.vue'\n\nimport DeveloperModeToggle from './components/DeveloperModeToggle.vue'\nimport DeviceEditorLink from './components/DeviceEditorLink.vue'\nimport DeviceLastSeenBadge from './components/DeviceLastSeenBadge.vue'\nimport DeviceModeBadge from './components/DeviceModeBadge.vue'\n\n// constants\nconst POLL_TIME = 5000\n\nconst deviceTransitionStates = [\n 'loading',\n 'installing',\n 'starting',\n 'stopping',\n 'restarting',\n 'suspending',\n 'importing'\n]\n\nexport default {\n name: 'DevicePage',\n components: {\n CogIcon,\n DeviceEditorLink,\n FinishSetupButton,\n DeveloperModeToggle,\n DeviceModeBadge,\n DeviceLastSeenBadge,\n DropdownMenu,\n SectionNavigationHeader,\n StatusBadge,\n SubscriptionExpiredBanner,\n TeamTrialBanner,\n AssignDeviceDialog,\n DeviceAssignApplicationDialog,\n DeviceAssignInstanceDialog\n },\n mixins: [deviceActionsMixin],\n setup () {\n const { hasPermission, isVisitingAdmin } = usePermissions()\n const { navigateTo, openInANewTab } = useNavigationHelper()\n\n return { hasPermission, isVisitingAdmin, navigateTo, openInANewTab }\n },\n data: function () {\n return {\n mounted: false,\n device: null,\n agentSupportsDeviceAccess: false,\n agentSupportsActions: false,\n openingTunnel: false,\n closingTunnel: false,\n /** @type {import('../../utils/timers.js').PollTimer} */\n pollTimer: null,\n /** @type {DeviceStateMutator} */\n deviceStateMutator: null\n }\n },\n computed: {\n ...mapState('account', ['teamMembership', 'team', 'features', 'settings']),\n actionsButtonKind () {\n switch (true) {\n case this.neverConnected:\n return 'ff-btn--secondary'\n case this.editorAvailable:\n return 'ff-btn--secondary'\n default:\n return 'ff-btn--primary'\n }\n },\n permissionContext () {\n if (this.device?.ownerType === 'application' || this.device?.ownerType === 'instance') {\n return { application: this.device.application }\n }\n return {}\n },\n isDevModeAvailable: function () {\n return !!this.features.deviceEditor\n },\n developerMode: function () {\n return this.device && this.agentSupportsDeviceAccess && this.device.mode === 'developer'\n },\n deviceRunning () {\n return this.device?.status === 'running'\n },\n disableModeToggle: function () {\n return !this.isDevModeAvailable ||\n !this.device ||\n !this.agentSupportsDeviceAccess ||\n !this.hasPermission('device:editor', this.permissionContext)\n },\n disableModeToggleReason: function () {\n if (!this.device) {\n return 'No Device selected'\n }\n if (!this.agentSupportsDeviceAccess) {\n return 'Device Agent V0.8 or greater is required'\n }\n if (!this.hasPermission('device:editor', this.permissionContext)) {\n return 'Only an Owner or Member can change the Device Mode'\n }\n return undefined\n },\n editorAvailable: function () {\n return this.isDevModeAvailable &&\n this.device &&\n this.agentSupportsDeviceAccess &&\n this.developerMode &&\n this.device.status === 'running'\n },\n deviceEditorURL: function () {\n return this.device.editor?.url || ''\n },\n neverConnected () {\n return !this.device.lastSeenAt\n },\n notAssigned () {\n const device = this.device\n const hasApplication = device?.ownerType === 'application' && device.application\n const hasInstance = device?.ownerType === 'instance' && device.instance\n return !hasApplication && !hasInstance\n },\n navigation () {\n return [\n {\n label: 'Overview',\n to: { name: 'device-overview' },\n tag: 'device-overview'\n },\n {\n label: 'Version History',\n to: {\n name: 'device-version-history',\n params: { id: this.$route.params.id }\n },\n tag: 'version-history'\n },\n {\n label: 'Audit Log',\n to: { name: 'device-audit-log' },\n tag: 'device-audit-log'\n },\n {\n label: 'Node-RED Logs',\n to: { name: 'device-logs' },\n tag: 'device-logs'\n // icon: TerminalIcon\n },\n {\n label: 'Performance',\n to: { name: 'device-performance' },\n tag: 'device-performance'\n },\n {\n label: 'Settings',\n to: { name: 'device-settings' },\n tag: 'device-settings'\n },\n {\n label: 'Developer Mode',\n to: { name: 'device-developer-mode' },\n tag: 'device-devmode',\n hidden: !(this.isDevModeAvailable && this.device.mode === 'developer')\n }\n ]\n },\n actionsDropdownOptions () {\n const flowActionsDisabled = !(this.device.status !== 'suspended')\n\n const deviceStateChanging = this.device.pendingStateChange || this.device.optimisticStateChange\n\n const result = [\n // Start and Suspend are disabled until resolution of the feature is complete\n // See comments in #3292\n // {\n // name: 'Start',\n // action: this.startDevice,\n // disabled: deviceStateChanging || this.deviceRunning\n // },\n // { name: 'Suspend', class: ['text-red-700'], action: this.showConfirmSuspendDialog, disabled: deviceStateChanging || flowActionsDisabled }\n ]\n\n if (!this.neverConnected) {\n // if we've never connected, we know we can't restart\n result.push({ name: 'Restart', action: this.restartDevice, disabled: deviceStateChanging || flowActionsDisabled })\n }\n\n if (this.hasPermission('device:delete', this.permissionContext)) {\n result.push(null)\n result.push({ name: 'Delete', class: ['text-red-700'], action: this.showConfirmDeleteDialog })\n }\n\n return result\n }\n },\n watch: {\n device: 'deviceChanged'\n },\n async mounted () {\n this.mounted = true\n await this.loadDevice()\n },\n unmounted () {\n this.pollTimer?.stop()\n clearTimeout(this.openTunnelTimeout)\n },\n methods: {\n pollTimerElapsed: async function () {\n // Only refresh device via the timer if we are on the overview page, developer mode page\n // the device status is empty or the device is in a transition state\n // This is to prevent settings pages from refreshing the device state while modifying settings\n // See `watch: { device: { handler () ... in pages/device/Settings/General.vue for why that happens\n const settingsPages = ['device-overview', 'device-developer-mode']\n try {\n if (settingsPages.includes(this.$route.name)) {\n await this.loadDevice()\n } else if (typeof this.device?.status === 'undefined') {\n await this.loadDevice()\n } else if (deviceTransitionStates.includes(this.device?.status)) {\n await this.loadDevice()\n }\n } catch (err) {\n if (err.response.status === 404) {\n this.pollTimer?.stop()\n }\n }\n },\n loadDevice: async function () {\n try {\n this.device = await deviceApi.getDevice(this.$route.params.id)\n } catch (err) {\n if (err.status === 403) {\n this.pollTimer?.stop()\n clearTimeout(this.openTunnelTimeout)\n return this.$router.push({ name: 'Home' })\n }\n }\n if (!this.pollTimer) {\n this.pollTimer = createPollTimer(this.pollTimerElapsed, POLL_TIME)\n }\n\n if (this.deviceStateMutator) {\n this.deviceStateMutator.clearState()\n }\n this.agentSupportsDeviceAccess = this.device.agentVersion && semver.gte(this.device.agentVersion, '0.8.0')\n this.agentSupportsActions = this.device.agentVersion && semver.gte(this.device.agentVersion, '2.3.0')\n this.$store.dispatch('account/setTeam', this.device.team.slug)\n },\n deviceRefresh: async function () {\n if (this.pollTimer.running) {\n // If the poll timer is running, we don't need to manually refresh the device\n return\n }\n this.loadDevice()\n },\n showOpenEditorDialog: async function () {\n this.$refs['open-editor-dialog'].show()\n },\n setDeviceMode: async function (newMode, callback) {\n try {\n if (newMode !== 'autonomous' && newMode !== 'developer') {\n throw new Error('Unsupported mode')\n }\n // call to close tunnel regardless of selected mode being set\n const disableResult = await deviceApi.disableEditorTunnel(this.device.id)\n // set the selected mode\n const setModeResult = await deviceApi.setMode(this.device.id, newMode)\n // update the device properties to reflect immediate status\n this.device.editor = {\n enabled: !!disableResult?.editor?.enabled,\n connected: !!disableResult?.editor?.connected,\n url: disableResult?.editor?.url\n }\n this.device.mode = setModeResult?.mode\n callback(null, setModeResult)\n } catch (error) {\n if (callback) {\n callback(error)\n } else {\n throw new Error('Unknown mode')\n }\n }\n },\n openAssignmentDialog () {\n this.$refs['assignment-dialog'].show()\n },\n assignOptionSelected (option) {\n if (option === 'instance') {\n this.$refs.deviceAssignInstanceDialog.show(this.device)\n } else if (option === 'application') {\n this.$refs.deviceAssignApplicationDialog.show(this.device)\n }\n },\n async assignDeviceToInstance (device, instanceId) {\n this.device = await deviceApi.updateDevice(device.id, { instance: instanceId })\n\n Alerts.emit('Device successfully assigned to instance.', 'confirmation')\n },\n\n async assignDeviceToApplication (device, applicationId) {\n this.device = await deviceApi.updateDevice(device.id, { application: applicationId, instance: null })\n\n Alerts.emit('Device successfully assigned to application.', 'confirmation')\n },\n openEditor ({ event = null, immersive = false } = {}) {\n this.$store.dispatch('ux/validateUserAction', 'hasOpenedDeviceEditor')\n if (!immersive) {\n this.openInANewTab(this.deviceEditorURL, `device-editor-${this.device.id}`)\n } else {\n this.navigateTo({ name: 'device-editor' }, event, { target: `device-editor-${this.device.id}` })\n }\n },\n async openTunnel ({\n event,\n immersive = true,\n launchEditor = false\n } = {}) {\n try {\n if (this.deviceRunning) {\n if (this.device.editor?.enabled && this.device.editor?.connected && this.device.editor?.local) {\n this.openEditor({ event, immersive })\n } else {\n this.openingTunnel = true\n this.$refs.dialog.show()\n\n // Polls the tunnel status until we see it connected to the\n // 'local' platform instance - will give up after 10 attempts\n const pollTunnelStatus = (done, attempt = 0, timeout = 500) => {\n if (attempt < 10) {\n this.openTunnelTimeout = setTimeout(async () => {\n await this.loadDevice()\n if (this.device.editor?.enabled && this.device.editor?.connected) {\n if (this.device.editor?.local) {\n if (launchEditor) {\n this.openEditor({ event, immersive })\n }\n } else {\n pollTunnelStatus(done, attempt + 1, 200)\n return\n }\n }\n done()\n }, timeout)\n }\n }\n\n try {\n if (!this.device.editor?.enabled || !this.device.editor?.connected) {\n // * Enable Device Editor (Step 1) - (browser->frontendApi) User clicks button to \"Enable Editor\"\n const result = await deviceApi.enableEditorTunnel(this.device.id)\n this.updateTunnelStatus(result)\n }\n pollTunnelStatus(() => {\n this.$refs.dialog.close()\n this.openingTunnel = false\n })\n } catch (err) {\n this.$refs.dialog?.close()\n this.openingTunnel = false\n\n const enhancedError = new Error(`Failed to enable device editor tunnel: ${err.message}`)\n enhancedError.originalError = err\n enhancedError.deviceId = this.device?.id\n enhancedError.deviceStatus = this.device?.status\n enhancedError.context = 'openTunnel'\n\n throw enhancedError\n }\n }\n } else {\n Alerts.emit('Unable to establish a connection to the device. Please check it is connected and running then try again', 'warning', 7500)\n }\n } catch (err) {\n console.warn('Error in openTunnel', err)\n if (Object.hasOwnProperty.call(err, 'context') && err.context === 'openTunnel') {\n throw err\n }\n }\n },\n async closeTunnel () {\n this.closingTunnel = true\n this.$refs.dialog.close()\n clearTimeout(this.openTunnelTimeout)\n try {\n const result = await deviceApi.disableEditorTunnel(this.device.id)\n this.updateTunnelStatus(result)\n this.loadDevice(this.loadDevice())\n } finally {\n this.closingTunnel = false\n }\n },\n updateTunnelStatus (status) {\n this.device.editor = this.device.editor || {}\n this.device.editor.url = status.url\n this.device.editor.enabled = !!status.enabled\n this.device.editor.connected = !!status.connected\n },\n deviceChanged () {\n this.deviceStateMutator = new DeviceStateMutator(this.device)\n },\n showConfirmDeleteDialog () {\n Dialog.show({\n header: 'Delete Device',\n kind: 'danger',\n text: 'Are you sure you want to delete this device? Once deleted, there is no going back.',\n confirmLabel: 'Delete'\n }, async () => {\n try {\n await deviceApi.deleteDevice(this.device.id)\n Alerts.emit('Successfully deleted the device', 'confirmation')\n // Trigger a refresh of team info to resync following device changes\n await this.$store.dispatch('account/refreshTeam')\n this.$router.push({ name: 'TeamDevices', params: { team_slug: this.team.slug } })\n } catch (err) {\n Alerts.emit('Failed to delete device: ' + err.toString(), 'warning', 7500)\n }\n })\n },\n /**\n * Checks agent version and shows warning if known old version is present. Returns true if the action can proceed\n * @param {string} [message] - optional message to show in confirmation dialog. If omitted, no confirmation is shown\n */\n preActionChecks (message) {\n if (this.device.agentVersion && !this.agentSupportsActions) {\n // if agent version is present but is less than required version, show warning and halt\n Alerts.emit('Device Agent V2.3 or greater is required to perform this action.', 'warning')\n return false\n }\n if (!message) {\n // no message means silent operation, no need to show confirmation\n return true\n }\n if (!this.device.agentVersion) {\n // if agent version is missing, be optimistic and give it a go, but show warning\n Alerts.emit(`${message}. NOTE: The device agent version is not known, the action may timeout`, 'warning')\n } else {\n Alerts.emit(message, 'confirmation')\n }\n return true\n },\n async startDevice () {\n const preCheckOk = this.preActionChecks('Starting device...')\n if (!preCheckOk) {\n return\n }\n this.deviceStateMutator.setStateOptimistically('starting')\n try {\n await deviceApi.startDevice(this.device)\n this.deviceStateMutator.setStateAsPendingFromServer()\n } catch (err) {\n let message = 'Device start request failed.'\n if (err.response?.data?.error) {\n message = err.response.data.error\n }\n console.warn(message, err)\n Alerts.emit(message, 'warning')\n this.deviceStateMutator.restoreState()\n }\n },\n async restartDevice () {\n const preCheckOk = this.preActionChecks('Restarting device...')\n if (!preCheckOk) {\n return\n }\n this.deviceStateMutator.setStateOptimistically('restarting')\n try {\n await deviceApi.restartDevice(this.device)\n this.deviceStateMutator.setStateAsPendingFromServer()\n } catch (err) {\n let message = 'Device restart request failed.'\n if (err.response?.data?.error) {\n message = err.response.data.error\n }\n console.warn(message, err)\n Alerts.emit(message, 'warning')\n }\n },\n showConfirmSuspendDialog () {\n const preCheckOk = this.preActionChecks() // silent check\n if (!preCheckOk) {\n return\n }\n Dialog.show({\n header: 'Suspend Device',\n text: 'Are you sure you want to suspend this device?',\n confirmLabel: 'Suspend',\n kind: 'danger'\n }, () => {\n this.deviceStateMutator.setStateOptimistically('suspending')\n deviceApi.suspendDevice(this.device).then(() => {\n this.deviceStateMutator.setStateAsPendingFromServer()\n Alerts.emit('Device suspend request succeeded.', 'confirmation')\n }).catch(err => {\n let message = 'Device suspend request failed.'\n if (err.response?.data?.error) {\n message = err.response.data.error\n }\n console.warn(message, err)\n Alerts.emit(message, 'warning')\n })\n })\n }\n }\n}\n</script>\n\n<style scoped>\n.progress {\n animation: progress 1s infinite linear;\n}\n\n.left-right {\n transform-origin: 0% 50%;\n}\n @keyframes progress {\n 0% {\n transform: translateX(0) scaleX(0);\n }\n 40% {\n transform: translateX(0) scaleX(0.4);\n }\n 100% {\n transform: translateX(100%) scaleX(0.5);\n }\n}\n</style>\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.resize-bar {\n position: absolute;\n right: 0;\n top: 0;\n width: 6px;\n height: 100%;\n border-right: 1px solid $ff-grey-400;\n background: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 15;\n\n &::before {\n content: '...';\n position: relative;\n left: 3px;\n writing-mode: vertical-rl;\n line-height: 0.5;\n letter-spacing: 4px;\n color: $ff-grey-500;\n }\n\n &:hover {\n cursor: ew-resize;\n\n &::before {\n color: $ff-grey-700;\n }\n }\n\n &.horizontal {\n width: 100%;\n height: 6px;\n\n &::before {\n writing-mode: horizontal-tb;\n }\n\n &:hover {\n cursor: ns-resize;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.drawer-trigger {\n display: flex;\n align-items: center;\n gap: 1px;\n position: fixed;\n top: 10px;\n left: 0;\n z-index: 100;\n padding: 8px 2px 8px 8px;\n\n /* Colors - matching original drawer trigger */\n color: $ff-grey-400;\n background: $ff-white;\n border: 1px solid $ff-grey-400;\n border-left: none;\n\n /* Reset button styles */\n font: inherit;\n\n /* Visual effects */\n box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.10);\n border-radius: 0 10px 10px 0;\n\n /* Animation */\n transform: translateX(0);\n transition: transform ease-in-out 0.3s;\n\n img {\n height: 20px;\n }\n\n .ff-btn--icon {\n color: $ff-grey-400;\n width: 20px;\n height: 20px;\n }\n\n &.hidden {\n // Move completely off-screen: own width (100%) + extra margin (20px)\n transform: translateX(calc(-100% - 20px));\n }\n\n &:hover {\n cursor: pointer;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.status-wrapper {\n display: flex;\n justify-content: center;\n}\n.status-wrapper .status-text {\n font-size: 1.5rem;\n font-weight: bold;\n display: block;\n text-align: center;\n padding: 24px;\n text-transform: capitalize;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff--immersive-editor-wrapper {\n &.remote-instance {\n .device-actions-dropdown {\n padding: 6px 9px;\n\n svg {\n margin: 0;\n }\n }\n }\n}\n",".ff-blueprint-groups {\n h4 {\n border-bottom: 1px solid $ff-grey-200;\n }\n}\n\n.ff-blueprint-tile {\n border: 2px solid $ff-grey-300;\n border-radius: $ff-unit-sm;\n display: flex;\n flex-direction: column;\n --tile-background: #{$ff-blue-100};\n --tile-foreground: #{$ff-blue-300};\n}\n\n.ff-blueprint-tile-sm {\n display: inline-flex;\n flex-direction: row;\n border: 1px solid $ff-grey-300;\n border-radius: $ff-unit-sm;\n --tile-background: #{$ff-blue-100};\n --tile-foreground: #{$ff-blue-300};\n}\n\n.ff-blueprint-tile--header {\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--tile-background);\n border-top-left-radius: 6px;\n border-top-right-radius: 6px;\n svg {\n stroke: var(--tile-foreground);\n path {\n stroke-width: 1px;\n }\n }\n}\n\n.ff-blueprint-tile .ff-blueprint-tile--header {\n overflow-y: hidden;\n svg {\n transform: scale(4);\n }\n}\n\n.ff-blueprint-tile-sm .ff-blueprint-tile--header {\n width: 32px;\n border-radius: 0px;\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n svg {\n transform: scale(1.5);\n }\n}\n\n.ff-blueprint-tile--info {\n padding: $ff-unit-md $ff-unit-xl $ff-unit-md $ff-unit-md;\n label {\n font-weight: 500;\n }\n}\n\n.ff-blueprint-tile .ff-blueprint-tile--info {\n padding: $ff-unit-md $ff-unit-sm;\n display: flex;\n flex-direction: column;\n gap: $ff-unit-sm;\n flex-grow: 1;\n label {\n font-size: 1.2rem;\n font-weight: 600;\n }\n}\n\n.ff-blueprint-tile--actions {\n width: 100%;\n display: flex;\n gap: 5px;\n padding: 0 $ff-unit-sm $ff-unit-md;\n align-items: center;\n}\n\n.ff-blueprint-group--general {\n --tile-background: #{$ff-blue-100};\n --tile-foreground: #{$ff-blue-300};\n}\n\n.ff-blueprint-group--manufacturing {\n --tile-background: #{$ff-teal-100};\n --tile-foreground: #{$ff-teal-400};\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n@import '../../../stylesheets/components/blueprint-selection.scss';\n.blueprint-group {\n display: flex;\n flex-wrap: wrap;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.blueprints-selector-dialog {\n margin: 0 !important;\n display: block;\n\n .ff-dialog-box {\n max-width: 90vw;\n max-height: 80vh;\n overflow: auto;\n\n .ff-dialog-content {\n display: flex;\n flex-direction: row;\n padding: 0;\n overflow: auto;\n\n .blueprints-container {\n padding: 10px 10px 0;\n overflow: auto;\n\n .header {\n padding: 0 0 10px;\n\n h3 {\n font-size: 30px;\n }\n\n p {\n line-height: 20px;\n padding-top: 10px;\n color : $ff-grey-500;\n }\n }\n\n .blueprint-selection-wrapper {\n overflow: auto;\n padding: 10px 0;\n }\n\n .ff-blueprint-groups {\n h4 {\n font-size: 25px;\n line-height: 1.5;\n margin-top: 10px;\n }\n\n .blueprint-group {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n\n .ff-blueprint-tile {\n width: auto;\n max-width: 250px;\n flex: 1 1 200px;\n }\n }\n }\n }\n\n .flow-viewer-container {\n overflow: hidden;\n\n .viewer {\n height: 100%;\n width: 100%;\n }\n }\n\n }\n\n .ff-dialog-actions {\n border-top: 1px solid $ff-grey-400;\n }\n }\n}\n\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.instance-name-confirmation {\n margin: 5px 0;\n display: flex;\n gap: 5px;\n color: $ff-green-600;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-date-picker {\n &.disabled {\n input {\n cursor: not-allowed !important;\n }\n }\n\n .dp__action_button {\n &.dp__action_select {\n background: $ff-indigo-700;\n\n &[disabled] {\n background: $ff-grey-300;\n }\n }\n }\n}\n\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.maintenance {\n .scheduled-upgrade {\n .days-selector {\n .day-selector {\n border: 1px solid $ff-indigo-200;\n background: $ff-indigo-50;\n padding: 5px 15px;\n border-radius: 4px;\n cursor: pointer;\n transition: ease-in-out .3s;\n flex: 1;\n position: relative;\n text-align: center;\n\n &:hover {\n background: $ff-indigo-200;\n }\n\n &.selected {\n background: $ff-indigo-400;\n color: white;\n\n span {\n font-weight: 600;\n }\n }\n\n &.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.page-fade-enter-active, .page-fade-leave-active {\n transition: opacity .2s ease-in-out;\n}\n\n.page-fade-enter, .page-fade-leave-to {\n opacity: 0;\n}\n\n// Viewport-based responsive behavior (matches Tailwind sm: breakpoint)\n// Hide button text on narrow viewports (< 640px)\n@media (max-width: 639px) {\n .upload-snapshot-text,\n .create-snapshot-text {\n display: none;\n }\n}\n\n// Show button text on wider viewports (>= 640px)\n@media (min-width: 640px) {\n .upload-snapshot-text,\n .create-snapshot-text {\n display: inline;\n }\n}\n\n// Container query for drawer context - responsive button behavior\n// Breakpoint matches DRAWER_MOBILE_BREAKPOINT constant in Editor/index.vue\n// These override viewport-based rules when inside the drawer\n@container drawer (max-width: 639px) {\n // Hide text when drawer is narrow - icon-only mode\n .upload-snapshot-text,\n .create-snapshot-text {\n display: none;\n }\n}\n\n@container drawer (min-width: 640px) {\n // Show text when drawer is wide enough\n .upload-snapshot-text,\n .create-snapshot-text {\n display: inline;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#visual-timeline {\n .timeline {\n border: 1px solid $ff-grey-300;\n border-radius: 3px;\n overflow: auto;\n\n li {\n\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.flex-break {\n flex-basis: 100%;\n height: 0;\n}\n.ff-file-upload {\n width: 100%;\n display: flex;\n gap: $ff-unit-sm;\n .ff-btn {\n flex-shrink: 0;\n }\n}\n.ff-file-upload--empty,\n.ff-file-upload--file {\n flex-grow: 1;\n border: 1px solid $ff-grey-300;\n padding: $ff-unit-sm $ff-unit-md;\n border-radius: $ff-unit-sm;\n display: flex;\n align-items: center;\n gap: $ff-unit-sm;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow-x: hidden;\n}\n.ff-file-upload--empty {\n color: $ff-grey-400;\n}\n.ff-file-upload--clear {\n cursor: pointer;\n &:hover {\n color: $ff-blue-600;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-row-file {\n position: relative;\n &:hover {\n color: $ff-blue-600;\n }\n}\n\n.not-available {\n opacity: .4;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-dropdown.visibility-selector {\n min-width: 130px;\n\n .ff-button {\n padding-left: 0;\n padding-right: 0;\n border: none;\n background: none !important;\n }\n\n .ff-options {\n border: 1px solid $ff-grey-200 !important;\n\n .ff-option {\n background: white !important;\n border: none !important;\n\n &[disabled=\"true\"] {\n color: $ff-grey-600;\n cursor: not-allowed;\n }\n\n &:hover {\n background-color: $ff-grey-200 !important;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.banner-wrapper > div {\n margin-top: 0;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-dialog-content .ff-devices-ul {\n list-style-type: disc;\n list-style-position: inside;\n columns: 2;\n}\n.ff-dialog-content .ff-devices-ul li {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n// Viewport-based responsive behavior (matches Tailwind sm: breakpoint)\n// Hide button text on narrow viewports (< 640px)\n@media (max-width: 639px) {\n .target-snapshot-text,\n .add-remote-instance-text,\n .bulk-actions-text {\n display: none;\n }\n}\n\n// Show button text on wider viewports (>= 640px)\n@media (min-width: 640px) {\n .target-snapshot-text,\n .add-remote-instance-text,\n .bulk-actions-text {\n display: inline;\n }\n}\n\n// Container query for drawer context - responsive button behavior\n// Breakpoint matches DRAWER_MOBILE_BREAKPOINT constant in Editor/index.vue\n// These override viewport-based rules when inside the drawer\n@container drawer (max-width: 639px) {\n // Hide text when drawer is narrow - icon-only mode\n .target-snapshot-text,\n .add-remote-instance-text,\n .bulk-actions-text {\n display: none;\n }\n\n // Adjust button padding for icon-only mode to prevent excessive spacing\n .ff-btn[data-action=\"change-target-snapshot\"],\n .ff-btn[data-action=\"register-device\"] {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n }\n}\n\n@container drawer (min-width: 640px) {\n // Show text when drawer is wide enough\n .target-snapshot-text,\n .add-remote-instance-text,\n .bulk-actions-text {\n display: inline;\n }\n}\n\n// Status bars layout - responsive to both viewport and container\n.devices-status-bars-container {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n// On wider viewports (>= 640px), show side-by-side\n@media (min-width: 640px) {\n .devices-status-bars-container {\n flex-direction: row;\n\n > * {\n flex: 1;\n }\n }\n}\n\n// Container query for drawer context\n// Breakpoint matches DRAWER_MOBILE_BREAKPOINT constant in Editor/index.vue\n@container drawer (max-width: 639px) {\n .devices-status-bars-container {\n flex-direction: column;\n\n > * {\n flex: none;\n }\n }\n}\n\n@container drawer (min-width: 640px) {\n .devices-status-bars-container {\n flex-direction: row;\n\n > * {\n flex: 1;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.step-slider {\n width: 100%;\n\n .wrapper {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n position: relative;\n max-width: 600px;\n margin: auto;\n min-height: 50px;\n\n .progress {\n position: absolute;\n left: 0;\n top: 15px;\n height: 4px;\n background: $ff-grey-300;\n transform: translateY(-50%);\n z-index: 1;\n display: flex;\n justify-content: space-between;\n overflow: hidden;\n\n &.multi-step {\n width: 99%;\n }\n &.single-step {\n width: 0;\n }\n\n .st {\n position: relative;\n\n span {\n width: 1000px;\n height: 4px;\n background: $ff-indigo-600;\n z-index: 3;\n display: block;\n right: 0;\n position: absolute;\n transform: translateX(-1000%);\n transition: transform .3s ease-in-out;\n }\n\n &.completed {\n span {\n transform: translateX(0);\n }\n }\n }\n }\n\n .steps {\n width: 100%;\n position: absolute;\n left: 0;\n top: 5px;\n display: flex;\n\n .step {\n position: relative;\n width: 20px;\n height: 20px;\n background-color: $ff-grey-400;\n border-radius: 50%;\n z-index: 2;\n transition: ease-in-out .3s;\n\n &.completed {\n background-color: $ff-indigo-600;\n }\n\n &.active {\n transform: scale(1.1);\n background-color: $ff-indigo-600;\n\n .label {\n color: $ff-indigo-700;\n }\n }\n\n &.disabled {\n cursor: default;\n }\n\n .label {\n position: absolute;\n left: 50%;\n transform: translate(-50%, 150%);\n font-weight: bold;\n color: $ff-grey-300;\n transition: ease-in-out .3s;\n }\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-multi-step-form {\n position: relative;\n max-height: 100%;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left:0;\n width: 100%;\n height: 100%;\n background: rgba(255,255,255, .6);\n z-index: 100;\n }\n\n .content {\n flex: 1;\n max-height: 100%;\n display: flex;\n flex-direction: column;\n overflow: auto;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-select-application-step {\n .app-tile {\n padding: 12px;\n border: 2px solid $ff-grey-300;\n width: 100%;\n border-radius: 6px;\n cursor: pointer;\n transition: ease-in-out .3s;\n\n &:hover {\n border-color: $ff-indigo-400;\n }\n\n &.selected {\n border-color: $ff-indigo-600;\n }\n\n .header {\n .title {\n\n }\n\n .counters {\n color: $ff-grey-400;\n font-size: $ff-funit-xs;\n }\n }\n\n .description {\n color: $ff-grey-400;\n font-size: $ff-funit-sm;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-duplication-step {\n .form-group {\n .title {\n margin-bottom: 5px;\n padding-bottom: 5px;\n border-bottom: 1px solid $ff-grey-200;\n display: flex;\n justify-content: space-between;\n\n label {\n\n font-weight: 500;\n }\n\n .actions {\n display: flex;\n gap: 5px;\n }\n }\n\n p {\n margin-top: 5px;\n\n &:nth-of-type(2) {\n color: $ff-grey-500;\n font-style: italic;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-instance-step {\n form {\n .ff-instance-name {\n .ff-input-wrapper {\n button {\n padding: 5px 10px;\n }\n }\n }\n }\n}\n","<template>\n <div id=\"instance-logs\" class=\"flex-1 flex flex-col overflow-auto\">\n <ff-loading v-if=\"loading\" message=\"Loading Logs...\" />\n <div v-if=\"showOfflineBanner\" class=\"ff-banner ff-banner-info my-2 rounded p-2 font-mono\">\n <span>\n <span>The Node-RED instance cannot be reached at this time. Please wait...</span>\n </span>\n </div>\n <div v-if=\"!instance.meta || instance.meta.state === 'suspended'\" class=\"flex text-gray-500 justify-center italic mb-4 p-8\">\n Logs unavailable\n </div>\n <div v-else :class=\"showOfflineBanner ? 'forge-log-offline-background' : ''\" class=\"w-full mx-auto text-xs border bg-gray-800 text-gray-200 rounded p-2 font-mono\">\n <div v-if=\"prevCursor\" class=\"flex\">\n <a class=\"text-center w-full hover:text-blue-400 cursor-pointer pb-1\" @click=\"loadPrevious\">Load earlier...</a>\n </div>\n <div v-if=\"filteredLogEntries.length > 0\">\n <span\n v-for=\"(item, itemIdx) in filteredLogEntries\"\n :key=\"itemIdx\"\n class=\"whitespace-pre-wrap\"\n :class=\"'forge-log-entry-level-' + item.level\"\n data-el=\"instance-log-row\"\n >\n <template v-if=\"instance.ha?.replicas !== undefined\">\n [{{ item.src }}]\n </template>\n <span>{{ item.date }}</span>\n <span>{{ \" \" }}</span>\n <span>{{ `[${item.level || ''}]`.padEnd(10, ' ') }}</span>\n <span class=\"flex-grow break-all whitespace-pre-wrap inline-flex\">{{ item.msg }}</span>\n <br v-if=\"itemIdx !== filteredLogEntries.length - 1\">\n </span>\n </div>\n </div>\n </div>\n</template>\n\n<script>\n\nimport InstanceApi from '../../../api/instances.js'\nimport Alerts from '../../../services/alerts.js'\nimport { createPollTimer } from '../../../utils/timers.js'\n\nconst POLL_TIME = 5000\n\nexport default {\n name: 'LogsShared',\n inheritAttrs: false,\n props: {\n instance: {\n type: Object,\n required: true\n },\n filter: {\n default: null,\n type: String,\n required: false\n }\n },\n emits: ['ha-instance-detected', 'new-range'],\n data () {\n return {\n doneInitialLoad: false,\n loading: true,\n logEntries: [],\n prevCursor: null,\n nextCursor: null,\n checkInterval: null,\n showOfflineBanner: false,\n /** @type {import('../../../utils/timers.js').PollTimer} */\n pollTimer: null\n }\n },\n computed: {\n filteredLogEntries: function () {\n if (this.filter && this.filter !== 'all') {\n return this.logEntries.filter(l => l.src === this.filter)\n } else {\n return this.logEntries\n }\n }\n },\n watch: {\n instance: 'fetchData'\n },\n async mounted () {\n if (!this.instance.meta || this.instance.meta.state === 'suspended') {\n this.loading = false\n }\n await this.fetchData()\n // since the fetchdata is async, we need to check if the current page is\n // still the log page before starting the poll timer\n if (this.shouldPoll()) {\n this.pollTimer = createPollTimer(this.pollTimerElapsed, POLL_TIME)\n }\n },\n unmounted () {\n this.stopPolling()\n },\n beforeUnmount () {\n this.stopPolling()\n },\n methods: {\n clear: function () {\n this.logEntries = []\n },\n shouldPoll: function () {\n return Object.hasOwnProperty.call(this.$route, 'meta') &&\n Object.hasOwnProperty.call(this.$route.meta, 'shouldPoll') &&\n this.$route.meta.shouldPoll\n },\n pollTimerElapsed: function () {\n if (this.instance.meta && this.instance.meta.state !== 'suspended') {\n this.loadNext()\n }\n },\n stopPolling: function () {\n if (this.pollTimer) {\n this.pollTimer.stop()\n this.pollTimer = null\n }\n },\n fetchData: async function () {\n if (this.instance.id) {\n if (this.instance.meta && this.instance.meta.state !== 'suspended') {\n await this.loadItems(this.instance.id)\n this.loading = false\n } else {\n this.logEntries = []\n this.prevCursor = null\n }\n }\n },\n loadPrevious: async function () {\n this.loadItems(this.instance.id, this.prevCursor)\n },\n loadNext: async function () {\n this.loadItems(this.instance.id, this.nextCursor)\n },\n loadItems: async function (instanceId, cursor) {\n // don't poll if the page is not the log page\n if (!this.shouldPoll()) {\n this.stopPolling()\n return\n }\n\n try {\n const entries = await InstanceApi.getInstanceLogs(instanceId, cursor, null, { showAlert: false })\n this.showOfflineBanner = false\n if (!cursor) {\n this.prevCursor = null\n this.logEntries = []\n }\n const toPrepend = []\n if (entries.log.length > 0) {\n entries.log.forEach(l => {\n const d = new Date(parseInt(l.ts.substring(0, l.ts.length - 4)))\n l.date = `${d.toLocaleDateString()} ${d.toLocaleTimeString()}`\n if (typeof l.msg === 'undefined') {\n l.msg = 'undefined'\n } else if (typeof l.msg !== 'string') {\n l.msg = JSON.stringify(l.msg)\n }\n l.msg = l.msg.replace(/^[\\n]*/, '')\n if (!cursor || cursor[0] !== '-') {\n this.logEntries.push(l)\n } else {\n toPrepend.push(l)\n }\n if (l.src) {\n this.$emit('ha-instance-detected', l.src)\n }\n })\n if (toPrepend.length > 0) {\n this.logEntries = toPrepend.concat(this.logEntries)\n }\n if (!cursor || cursor[0] === '-') {\n this.prevCursor = entries.meta.previous_cursor\n }\n if (!cursor || cursor[0] !== '-') {\n this.nextCursor = entries.meta.next_cursor\n }\n if (entries.meta.first_entry && entries.meta.last_entry) {\n this.$emit('new-range', {\n first: entries.meta.first_entry,\n last: entries.meta.last_entry\n })\n }\n }\n } catch (error) {\n // the page could have been switched while the async request was in progress, if so\n // stop the polling and return immediately to avoid unnecessary error alerts\n if (!this.shouldPoll()) {\n this.stopPolling()\n return\n }\n // log the error as warn for troubleshooting purposes\n console.warn('Unable to retrieve Node-RED instance logs:', error)\n\n // Error 503 is returned by the API when the launcher is offline.\n // Error 500 is handled (and surfaced) by the `client.interceptors` in `../../../api/client.js`\n // Error with data.code === 'project_suspended' is ignored - it is expected when the project is suspended\n if (error.response?.status === 503) {\n if (this.showOfflineBanner === true) {\n return // only show the alert once\n }\n this.showOfflineBanner = true // show the \"offline\" banner\n Alerts.emit('The Node-RED instance cannot be reached at this time', 'warning', (POLL_TIME - 500))\n } else if (error.response?.status !== 500 && error.response?.data?.code !== 'project_suspended') {\n // display an alert. Ensure it is visible for less time than\n // the polling interval to avoid multiple visible alerts\n const message = error.response?.data?.error || error.message\n Alerts.emit('Could not get Node-RED logs: ' + message, 'warning', (POLL_TIME - 500))\n }\n }\n }\n }\n}\n</script>\n\n<style scoped>\n.forge-log-offline-background {\n background: repeating-linear-gradient(\n -45deg,\n #363848,\n #363848 10px,\n rgba(31, 41, 55, var(--tw-bg-opacity)) 10px,\n rgba(31, 41, 55, var(--tw-bg-opacity)) 20px\n );\n}\n</style>\n",".ff-project-overview {\n .ff-accordion--content {\n transition: none;\n }\n}\n\n.ff-instance-info {\n margin-bottom: 12px;\n h1 {\n > div {\n display: flex;\n gap: 6px;\n }\n border-bottom: 0;\n svg {\n width: 20px;\n }\n }\n table {\n padding: 9px 12px;\n background-color: white;\n border-radius: 0.25rem;\n border-collapse: separate;\n border-width: 1px;\n border-color: $ff-grey-300;\n td {\n height: 36px;\n }\n tr:not(:last-child) {\n td {\n border-bottom: 1px solid $ff-grey-100;\n }\n }\n }\n .ff-accordion {\n margin-bottom: -1px;\n }\n .ff-accordion--content {\n background-color: white;\n }\n &:last-child {\n margin-bottom: 0;\n }\n}","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n@import \"../../stylesheets/pages/project.scss\";\n\n// Container query for drawer context\n// Breakpoint matches DRAWER_MOBILE_BREAKPOINT constant in Editor/index.vue\n@container drawer (min-width: 640px) {\n .ff-project-overview .grid {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n}\n\n// Ensure single column layout when container is smaller\n@container drawer (max-width: 639px) {\n .ff-project-overview .grid {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n}\n\n// Info row: content left, action button(s) pushed right\n.info-row {\n display: flex;\n align-items: center;\n\n &__content {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n &__action {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 4px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: $ff-color--action;\n transition: color 0.15s ease, background-color 0.15s ease;\n\n .ff-icon {\n width: 20px;\n height: 20px;\n\n &.ff-icon-sm {\n width: 16px;\n height: 16px;\n }\n }\n\n &:hover {\n background-color: $ff-color--highlight;\n color: $ff-white;\n }\n\n &:disabled {\n cursor: not-allowed;\n color: $ff-grey-300;\n\n &:hover {\n background-color: transparent;\n color: $ff-grey-300;\n }\n }\n }\n\n .url-copier {\n min-width: 0;\n\n .text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n }\n}\n\n// Type field - ellipse from LEFT to show stack name\n.ff-instance-info table tr td.flex .flex-grow {\n direction: rtl;\n text-align: left;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-socket-status {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.ff-socket-status-icon {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: $ff-grey-500;\n}\n\n.ff-socket-status-icon-connected {\n background-color: $ff-green-500;\n}\n\n.ff-socket-status-icon-disconnected {\n background-color: $ff-red-500;\n}\n\n.ff-chart-section {\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.action-button {\n cursor: default;\n}\n\n// Container query for drawer context - responsive button behavior\n// Breakpoint matches DRAWER_MOBILE_BREAKPOINT constant in Editor/index.vue\n// When inside drawer, respond to drawer width instead of viewport\n@container drawer (min-width: 640px) {\n .actions-text-container {\n display: inline;\n }\n}\n\n@container drawer (max-width: 639px) {\n .actions-text-container {\n display: none;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n// Container query for drawer context - responsive button behavior\n// Breakpoint matches DRAWER_MOBILE_BREAKPOINT constant in Editor/index.vue\n// When inside drawer, respond to drawer width instead of viewport\n@container drawer (min-width: 640px) {\n .dashboard-link-text {\n display: inline;\n }\n}\n\n@container drawer (max-width: 639px) {\n .dashboard-link-text {\n display: none;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n// Split dropdown button: two halves styled as one cohesive element\n.editor-link-split {\n display: inline-flex;\n position: relative;\n}\n\n// Shared base styles for both halves (mirrors .ff-btn .ff-btn--secondary)\n.editor-link-split__action,\n.editor-link-split__toggle {\n display: flex;\n align-items: center;\n gap: $ff-unit-xs;\n font-size: $ff-funit-sm;\n font-weight: 600;\n line-height: 20px;\n background-color: $ff-white;\n color: $ff-color--action;\n border: 1px solid $ff-color--action;\n cursor: pointer;\n transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;\n\n &:hover:not(:disabled) {\n background-color: $ff-color--highlight;\n border-color: $ff-color--highlight;\n color: $ff-white;\n }\n\n &:disabled,\n &.editor-link-split--disabled {\n cursor: not-allowed;\n border-color: $ff-grey-300;\n color: $ff-grey-400;\n background-color: $ff-grey-50;\n }\n\n .ff-btn--icon {\n width: 20px;\n height: 20px;\n }\n}\n\n// Left half: main action button\n.editor-link-split__action {\n padding: $ff-unit-sm 12px $ff-unit-sm $ff-unit-sm;\n border-radius: $ff-unit-sm 0 0 $ff-unit-sm;\n border-right: none;\n white-space: nowrap;\n}\n\n// DropdownMenu wrapper: make all wrapper divs invisible to flex layout\n// so the MenuButton becomes a direct flex child of .editor-link-split\n.editor-link-split__dropdown,\n.editor-link-split__dropdown > div,\n.editor-link-split__dropdown > div > div {\n display: contents;\n}\n\n// Right half: chevron dropdown trigger (square)\n.editor-link-split__toggle {\n justify-content: center;\n padding: $ff-unit-sm;\n border-radius: 0 $ff-unit-sm $ff-unit-sm 0;\n border-left: 1px solid $ff-color--action;\n\n .ff-btn--icon {\n width: 20px;\n height: 20px;\n }\n\n &:hover:not(:disabled) {\n border-left-color: $ff-color--highlight;\n }\n\n &:disabled,\n &.editor-link-split--disabled {\n border-left-color: $ff-grey-300;\n }\n}\n\n// Primary variant: filled indigo background with white text\n.editor-link-split--primary {\n .editor-link-split__action,\n .editor-link-split__toggle {\n background-color: $ff-color--action;\n border-color: $ff-color--action;\n color: $ff-white;\n\n &:hover:not(:disabled) {\n background-color: $ff-color--highlight;\n border-color: $ff-color--highlight;\n }\n }\n\n .editor-link-split__toggle {\n border-left-color: rgba($ff-white, 0.3);\n\n &:hover:not(:disabled) {\n border-left-color: rgba($ff-white, 0.3);\n }\n }\n}\n\n// Icon-only minimal button: remove icon margins added by .ff-btn--icon-left\n.editor-link-minimal .ff-btn--icon-left {\n margin-left: 0;\n margin-right: 0;\n}\n\n// Override icon-right margin from DropdownMenu's ChevronDownIcon\n.editor-link-split__toggle .ff-btn--icon-right {\n margin-left: 0;\n margin-right: 0;\n}\n\n// Container query for drawer context - responsive button behavior\n// Breakpoint matches DRAWER_MOBILE_BREAKPOINT constant in Editor/index.vue\n// When inside drawer, respond to drawer width instead of viewport\n@container drawer (min-width: 640px) {\n .editor-link-text {\n display: inline;\n }\n}\n\n@container drawer (max-width: 639px) {\n .editor-link-text {\n display: none;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.blueprints-section {\n display: flex;\n flex-direction: column;\n overflow: auto;\n flex: 1;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.import-flows {\n overflow: auto;\n\n & > .wrapper {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n flex: 1;\n overflow: auto;\n min-height: 400px;\n\n @media (max-width: 768px) {\n flex-direction: column;\n gap: 15px;\n }\n\n .preview {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n max-height: 100%;\n\n @media (max-width: 768px) {\n max-width: 100%;\n max-height: 400px;\n order: 2;\n }\n }\n\n .add-flows {\n overflow: auto;\n min-width: 350px;\n max-width: 600px;\n height: 100%;\n flex: 1;\n\n .content {\n overflow: auto;\n flex: 1;\n\n .flow-input-wrapper {\n height: 100%;\n display: flex;\n\n textarea {\n background: none;\n border-color: $ff-grey-200;\n resize: none;\n min-height: 200px;\n transition: background-color ease-out .3s, border-color ease-out .3s;\n flex: 1;\n\n &:hover, &:focus {\n background: $ff-white;\n border-color: $ff-grey-300;\n resize: vertical;\n }\n\n &.has-content {\n border-color: $ff-grey-300;\n }\n\n @media (max-width: 768px) {\n max-height: 100%;\n min-height: 100px;\n background: $ff-white;\n border-color: $ff-grey-300;\n resize: none;\n }\n }\n }\n\n @media (max-width: 768px) {\n overflow: initial;\n gap: 0;\n }\n }\n\n @media (max-width: 768px) {\n width: 100%;\n min-width: 100%;\n max-width: fit-content;\n height: auto;\n flex: 0 0 auto;\n }\n }\n }\n\n .notice {\n display: flex;\n gap: 15px;\n align-items: baseline;\n font-size: 0.8rem;\n\n .notice-element {\n\n h3 {\n font-weight: bold\n }\n\n p {\n font-style: italic;\n margin-bottom: 5px;\n }\n }\n\n @media (max-width: 768px) {\n flex: 0 0 auto;\n align-items: flex-start;\n justify-content: initial;\n padding: 10px;\n flex-direction: column;\n overflow: auto;\n height: fit-content;\n max-height: 10vh;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-flows-step {\n height: 100%;\n\n .ff-blueprints {\n overflow: auto;\n min-width: 400px;\n padding-right: 15px;\n\n .ff-blueprint-tiles {\n .ff-blueprint-tile {\n max-width: 280px;\n width: 100%;\n height: 100%;\n }\n }\n }\n\n .ff-blueprint-categories {\n min-width: 300px;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n\n ul {\n flex: 1;\n height: 100%;\n overflow: auto;\n\n li:hover {\n cursor: pointer;\n color: $ff-blue-600;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.instance-item {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 15px;\n background: $ff-grey-50;\n border-bottom: 1px solid $ff-grey-300;\n justify-content: space-between;\n padding: 6px;\n align-items: center;\n\n .title {\n grid-column-start: 2;\n grid-column-end: 6;\n display: flex;\n gap: 15px;\n justify-content: space-between;\n\n h6 {\n display: flex;\n gap: 6px;\n }\n }\n\n .actions {\n grid-column-start: 6;\n display: flex;\n justify-content: flex-end;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.versions-list.ff-accordion {\n margin: 0;\n\n button {\n display: grid;\n grid-template-columns: repeat(12, 1fr);\n background: $ff-white;\n gap: 15px;\n border: none;\n border-bottom: 1px solid $ff-grey-300;\n\n .version {\n grid-column-start: 2;\n display: flex;\n justify-content: flex-start;\n span {\n color: $ff-black;\n font-weight: 500;\n }\n }\n\n .counter {\n grid-column-start: 3;\n grid-column-end: 6;\n display: flex;\n justify-content: flex-start;\n gap: 2px;\n }\n\n .toggle {\n grid-column-start: 12;\n display: flex;\n justify-content: flex-end;\n }\n }\n\n &:last-child button {\n border-bottom: none;\n }\n\n .instances-list {\n .ff-show-more {\n display: flex;\n gap: 15px;\n align-items: center;\n justify-content: center;\n color: $ff-grey-500;\n line-height: 30px;\n cursor: pointer;\n transition: ease-in-out .3s;\n\n &:hover {\n color: $ff-color--action\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.dependency-item {\n border: 1px solid $ff-grey-300;\n margin-bottom: 12px;\n\n .dependency-header {\n cursor: pointer;\n background: $ff-grey-100;\n display: flex;\n padding: 6px 9px;\n align-items: center;\n gap: 15px;\n\n .title {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 15px;\n\n h3, p {\n margin: 0;\n line-height: 1;\n }\n\n p {\n color: $ff-grey-500;\n font-weight: 400;\n font-size: 80%;\n }\n }\n\n .details {\n display: flex;\n flex-direction: column;\n text-align: right;\n font-size: 0.875rem;\n font-weight: 500;\n }\n\n .ff-toggle {\n transition: ease-in-out .3s;\n }\n\n &.open {\n border-bottom: 1px solid $ff-grey-300;\n\n .ff-toggle {\n transform: rotate(90deg);\n }\n }\n }\n\n &:last-of-type {\n .ff-accordion {\n button {\n border-bottom: none;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.device-group {\n .ff-target-snapshot-info{\n border: 1px solid $ff-grey-300;\n padding: 10px 15px;\n display: flex;\n gap: 20px;\n\n .ff-title {\n font-weight: 500;\n }\n }\n\n}\n",".ff-pipeline {\n width: 100%;\n border: 1px solid $ff-grey-300;\n border-radius: 6px;\n .ff-pipeline-banner {\n height: 46px;\n }\n .ff-pipeline-banner,\n .ff-pipeline-stage-banner {\n padding: 0px 18px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid $ff-grey-300;\n background-color: $ff-grey-100;\n border-top-left-radius: 6px;\n border-top-right-radius: 6px;\n gap: 48px;\n }\n .ff-pipeline-stage-banner {\n height: 54px;\n background-color: $ff-grey-50;\n label {\n font-weight: 500;\n }\n }\n .ff-pipelines-stage-banner-error {\n color: $ff-red-600;\n font-size: 0.725rem;\n font-weight: 500;\n display: flex;\n align-items: center;\n gap: 2px;\n }\n .ff-pipeline-actions {\n display: flex;\n gap: 6px;\n }\n .ff-pipeline-stages {\n padding: 24px;\n border-bottom-left-radius: 6px;\n border-bottom-right-radius: 6px;\n display: flex;\n align-items: stretch;\n gap: 16px;\n overflow-x: auto;\n }\n}\n\n.ff-pipeline-stage {\n border-radius: 6px;\n border: 1px solid $ff-grey-400;\n min-width: 275px;\n background-color: white;\n a:hover,\n a:hover .ff-icon {\n color: $ff-blue-600;\n }\n &.ff-pipeline-stage-ghost {\n border-style: dashed;\n padding: 48px 64px;\n gap: 6px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n color: $ff-grey-400;\n &:hover {\n border-style: solid;\n cursor: pointer;\n color: $ff-blue-600;\n border-color: $ff-blue-600;\n }\n }\n .ff-pipeline-stage-row {\n padding: 9px 18px;\n display: flex;\n justify-content: space-between;\n gap: 24px;\n font-size: 0.9rem; \n label {\n color: $ff-grey-500;\n }\n a.ff-link {\n text-overflow: ellipsis;\n overflow-x: hidden;\n }\n }\n .ff-pipeline-stage-type {\n padding: 9px 0px 0.75rem;\n margin: 0 18px 0.75rem;\n border-bottom: 1px solid $ff-grey-300;\n display: flex;\n align-items: flex-start;\n gap: 6px;\n font-size: 0.9rem; \n label {\n color: $ff-grey-500;\n font-size: 0.75em;\n line-height: 0.825em;\n }\n }\n}\n\n.ff-pipeline-stage--error {\n border-color: $ff-red-600;\n .ff-pipeline-stage-banner {\n background-color: $ff-red-50;\n border-bottom: 1px solid $ff-red-600;\n }\n}\n\n.animate-deploying {\n animation-name: left-to-right;\n animation-duration: 1s;\n animation-iteration-count: infinite;\n color: $ff-blue-600;\n}\n\n@keyframes left-to-right {\n 0% {\n transform: translate(-24px, 0);\n opacity: 0;\n }\n 40% {\n opacity: 1;\n }\n 75% {\n opacity: 0;\n }\n 100% {\n transform: translate(24px, 0);\n opacity: 0;\n }\n}","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.deployment-name__url {\n :deep(.ff-icon) {\n width: 14px;\n height: 14px;\n }\n :deep(.ff-icon-button) {\n background: transparent;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n\n .error-banner {\n padding: 9px;\n background-color: $ff-red-50;\n border: 1px solid $ff-red-300;\n border-radius: 3px;\n color: $ff-red-600;\n }\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.role-row-cell {\n display: flex;\n flex-direction: column;\n min-height: 40px;\n\n .actual-role {\n flex: 1;\n display: flex;\n justify-content: center;\n flex-direction: column;\n }\n\n .team-role {\n flex: 1;\n }\n .role {\n font-weight: bold;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n@import '../ui-components/stylesheets/ff-colors.scss';\n@import '../ui-components/stylesheets/ff-utility.scss';\n\n.ff-icon-link {\ndisplay: flex;\njustify-content: space-between;\nalign-items: center;\nposition: relative;\n\nborder-radius: $ff-unit-sm;\nborder: 1px solid $ff-grey-300;\n\nheight: 28px;\npadding: $ff-unit-sm 5px;\n\nfont-size: $ff-funit-sm;\nline-height: 20px;\n\nsvg {\n margin-right: 5px;\n}\n\n&:hover {\n cursor: pointer;\n border-color: $ff-blue-600;\n\n color: $ff-blue-600;;\n background-color: $ff-grey-50;\n\n .ff-icon {\n color: $ff-blue-600;\n }\n}\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n@import '../../../ui-components/stylesheets/ff-colors.scss';\n@import '../../../ui-components/stylesheets/ff-utility.scss';\n\n.ff-icon-link {\n display: flex;\n justify-content: space-between;\n align-items: center;\n position: relative;\n\n border-radius: $ff-unit-sm;\n border: 1px solid $ff-grey-300;\n\n height: 28px;\n padding: $ff-unit-sm 5px;\n\n font-size: $ff-funit-sm;\n line-height: 20px;\n\n svg {\n margin-right: 5px;\n }\n\n &:hover {\n cursor: pointer;\n border-color: $ff-blue-600;\n\n color: $ff-blue-600;;\n background-color: $ff-grey-50;\n\n .ff-icon {\n color: $ff-blue-600;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-counter {\n border: 1px solid transparent;\n transition: ease-in-out .15s;\n will-change: border-color;\n\n &.empty {\n opacity: .3;\n }\n\n &:hover {\n opacity: 1;\n\n &.green {\n border-color: $ff-green-500;\n }\n &.red {\n border-color: $ff-red-500;\n }\n &.gray {\n border-color: $ff-grey-500;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.application-wrapper {\n position: relative;\n\n .overlay {\n position: absolute;\n top:0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(255, 255, 255, 0.4) !important;\n border: none !important;\n }\n}\n",".ff-applications-list {\n display: flex;\n flex-direction: column;\n gap: 18px;\n > li {\n > *:not(.ff-dialog-container) {\n border-left: 1px solid $ff-grey-300;\n border-right: 1px solid $ff-grey-300;\n background-color: $ff-grey-50;\n }\n\n > section:last-of-type {\n border-bottom-left-radius: 6px;\n border-bottom-right-radius: 6px;\n border-bottom: 1px solid $ff-grey-300;\n }\n\n > :first-child {\n border-top-left-radius: 6px;\n border-top-right-radius: 6px;\n border-top: 1px solid $ff-grey-300;\n }\n\n > :last-child {\n border-bottom-left-radius: 6px;\n border-bottom-right-radius: 6px;\n border-bottom: 1px solid $ff-grey-300;\n }\n }\n .ff-application-list--app {\n background-color: white !important;\n display: flex;\n justify-content: space-between;\n padding: 12px;\n border: 1px solid $ff-grey-300;\n >span {\n display: flex;\n align-items: center;\n gap: 1rem;\n }\n &:hover {\n cursor: pointer;\n border-color: $ff-blue-600;\n\n .ff-application-list--icon,\n .ff-application-list--icon .ff-icon {\n color: $ff-blue-600;\n }\n }\n }\n .ff-applications-list--instance {\n display: flex;\n flex-direction: column;\n span {\n color: $ff-grey-400;\n font-size: 0.75rem;;\n }\n }\n .delimiter {\n font-size: 0.875rem;\n color: $ff-grey-500;\n display: flex;\n align-items: center;\n gap: 6px;\n\n &::after {\n content: '';\n height: 1px;\n flex-grow: 1;\n margin-left: 9px;\n background-color: $ff-grey-300;\n }\n }\n}\n\n.ff-applications-list-instances {\n padding: 12px;\n padding-top: 6px;\n display: flex;\n flex-direction: column;\n >label {\n font-size: 0.875rem;\n color: $ff-grey-500;\n display: flex;\n align-items: center;\n gap: 12px;\n &::after {\n content: '';\n height: 1px;\n flex-grow: 1;\n background-color: $ff-grey-300;\n }\n }\n > .items-wrapper {\n background-color: white;\n border-color: $ff-grey-300;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n padding: 12px;\n display: grid;\n align-items: center;\n grid-template-columns: 40px 1fr 100px minmax(auto, 220px) 350px;\n &:hover {\n cursor: pointer;\n border-color: $ff-blue-600;\n .ff-application-list--instance {\n color: $ff-blue-600;\n }\n .ff-icon {\n color: $ff-blue-600;\n }\n }\n }\n\n .actions {\n display: flex;\n justify-content: flex-end;\n gap: 9px;\n }\n}\n\n.ff-applications-list-instances {\n flex: 1;\n padding: 12px;\n padding-top: 6px;\n\n .items-wrapper {\n display: flex;\n flex: 1;\n background: none;\n border: none;\n padding: 0;\n gap: 5px;\n margin-top: 10px;\n\n .ff-counter {\n min-width: 125px;\n }\n }\n\n .empty-message {\n min-height: 75px;\n display: flex;\n text-align: center;\n align-items: center;\n justify-content: center;\n gap: 2px;\n color: $ff-grey-500;\n }\n}\n\n.ff-applications-list--details {\n color: $ff-grey-400;\n font-size: 0.875rem;\n padding-bottom: 12px;\n text-align: center;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n@import \"../../../stylesheets/components/applications-list\";\n\n.no-results {\n text-align: center;\n color: $ff-grey-400;\n}\n\n.fade-slide-enter-active,\n.fade-slide-leave-active,\n.fade-slide-move {\n transition: all 0.3s ease;\n}\n\n.fade-slide-enter-from {\n opacity: 0;\n transform: translateX(30px);\n}\n\n.fade-slide-enter-to {\n opacity: 1;\n transform: translateX(0);\n}\n\n.fade-slide-leave-from {\n opacity: 1;\n transform: translateX(0);\n}\n\n.fade-slide-leave-to {\n opacity: 0;\n transform: translateX(30px);\n}\n\n.fade-slide-move {\n transition: transform 0.3s ease;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-admin-audit .ff-accordion {\n margin-bottom: 12px;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.hosted-instances-usage {\n tr:last-of-type {\n td {\n border-bottom: none;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-medium-tile {\n position: relative;\n border-radius: 6px;\n border: 2px solid $ff-grey-300;\n background: white;\n box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.25);\n padding: 49px 24px 24px 24px;\n width: 100%;\n max-width: 300px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n\n .ff-ribbon {\n --ribbon-overlap: 8px;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 30px;\n left: calc(-1 * var(--ribbon-overlap));\n line-height: 1.3;\n width: calc(100% + 2 * var(--ribbon-overlap));\n margin: 0;\n position: absolute;\n top: 8px;\n color: white;\n border-top: 1px solid #363636;\n border-bottom: 1px solid #202020;\n border-radius: 2px 2px 0 0;\n box-shadow: 0 1px 2px rgba(0,0,0,0.3);\n\n &.red {\n background: $ff-red-500;\n &::before,\n &::after {\n border-color: $ff-red-900 transparent transparent transparent;\n }\n }\n\n &.blue {\n background: $ff-indigo-700;\n &::before,\n &::after {\n border-color: $ff-indigo-900 transparent transparent transparent;\n }\n }\n\n &::before,\n &::after {\n content: '';\n display: block;\n width: 0;\n height: 0;\n position: absolute;\n bottom: calc((-2 * var(--ribbon-overlap)) - 1px);\n z-index: -10;\n border: var(--ribbon-overlap) solid;\n }\n\n &::before {left: 0}\n &::after {right: 0}\n }\n\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-accordion.broker-client {\n margin-bottom: 0;\n\n button {\n border: none;\n background: none;\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 15px;\n padding: 0;\n\n .username {\n padding: 15px 10px;\n grid-column: span 2;\n overflow: hidden;\n\n .ff-text-copier {\n @include truncate;\n & > span {\n @include truncate;\n }\n .title-wrapper {\n @include truncate;\n }\n\n }\n\n .ff-icon {\n margin-left: 0;\n min-width: 20px;\n }\n }\n\n .rules {\n padding: 15px 10px;\n\n }\n\n .toggle {\n grid-column: span 3;\n text-align: right;\n padding-right: 10px;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n .edit, .delete {\n padding: 24px 15px;\n display: inline-block;\n position: relative;\n align-self: stretch;\n\n .ff-icon-sm {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n transition: ease-in-out .3s;\n }\n\n &:hover {\n .ff-icon-sm {\n width: 20px;\n height: 20px;\n }\n }\n }\n\n .edit:hover {\n color: $ff-grey-700;\n }\n .delete:hover {\n color: $ff-red-700;\n }\n }\n }\n\n .ff-accordion--content {\n background: $ff-grey-100;\n .acl-list {\n .acl-wrapper {\n border-bottom: 1px solid $ff-grey-200;\n padding: 15px 10px;\n gap: 10px;\n font-size: 80%;\n\n &:last-of-type {\n border: none;\n }\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#client-dialog {\n\n .headers {\n label:first-of-type {\n max-width: 200px;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n\n .clients-wrapper {\n border: 1px solid $ff-grey-300;\n border-radius: 5px;\n overflow: hidden;\n\n .header {\n background: $ff-grey-100;\n padding: 10px;\n border-bottom: 1px solid $ff-grey-300;\n\n span {\n &.username {\n grid-column: span 2;\n }\n }\n }\n\n .clients-list {\n background: $ff-white;\n\n .client {\n border-bottom: 1px solid $ff-grey-300;\n\n &:last-of-type {\n border-bottom: none;\n }\n }\n }\n }\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-topic-docs {\n .ff-accordion {\n margin: 0;\n\n .ff-accordion--button{\n font-weight: bold;\n border: 1px solid $ff-blue-300;\n background-color: $ff-blue-50;\n border-radius: 6px;\n padding: 12px;\n font-weight: bold;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n &:hover {\n cursor: pointer;\n background-color: $ff-blue-100;\n }\n }\n\n .ff-accordion--content {\n border: 1px solid $ff-blue-300;\n border-top: none;\n border-radius: 0 0 6px 6px;\n padding: 12px;\n\n .ff-topic-docs-row-meta {\n section {\n margin-bottom: 15px;\n\n label {\n display: block;\n font-weight: bold;\n margin-bottom: 3px;\n }\n .ff-empty-state {\n color: $ff-grey-400;\n background-color: $ff-grey-50;\n padding: 12px;\n margin-top: 6px;\n }\n }\n }\n }\n\n &.open {\n .ff-accordion--button {\n border-radius: 6px 6px 0 0;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-return-link {\n padding: 9px 12px;\n border-radius: 6px;\n border: 1px solid $ff-grey-200;\n transition: border-color 0.3s;\n display: inline-flex;\n align-items: center;\n gap: 9px;\n &:hover {\n border-color: $ff-indigo-500;\n color: $ff-indigo-500;\n cursor: pointer;\n }\n}\n.ff-schema-docs-hierarchy {\n margin: 24px 0;\n display: flex;\n gap: 12px;\n flex-direction: column;\n}\nh1 {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.segment-wrapper {\n .segment {\n position: relative;\n margin: 5px 0 0;\n transition: ease .15s;\n &:hover {\n color: $ff-indigo-700;\n\n cursor: pointer;\n }\n\n .diagram {\n .connector-elbow {\n border-left: 2px solid $ff-indigo-300;\n border-bottom: 2px solid $ff-indigo-300;\n border-bottom-left-radius: 7px;\n display: inline-block;\n position: absolute;\n height: 50px;\n width: 25px;\n left: -23px;\n top: -35px;\n }\n .connector-trunk {\n width: 1px;\n border-left: 2px solid $ff-indigo-300;\n display: inline-block;\n position: absolute;\n height: 5000px;\n left: -23px;\n top: -5000px;\n }\n }\n\n .content {\n padding: 5px;\n position: relative;\n\n .chevron {\n transition: ease .15s;\n }\n\n .title {\n align-items: center;\n display: flex;\n gap: 3px;\n\n .highlight {\n background-color: $ff-indigo-100;\n }\n }\n\n .ff-text-copier {\n display: none;\n height: 17px;\n }\n\n &:hover {\n .ff-text-copier {\n display: inline-block;\n color: $ff-grey-400;\n }\n }\n }\n }\n\n .children {\n overflow: hidden;\n }\n &.selected > {\n .segment {\n background: $ff-indigo-50;\n }\n }\n &.open > {\n .segment {\n .content {\n .title {\n color: $ff-indigo-700;\n }\n\n .chevron {\n transform: rotate(90deg)\n }\n }\n }\n }\n\n &.empty > {\n .segment {\n .content {\n .title {\n color: $ff-grey-600;\n font-size: 90%;\n font-weight: 300;\n\n .separator {\n color: $ff-black;\n font-weight: bold;\n }\n }\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.unified-namespace-hierarchy {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n overflow: auto;\n\n .topics {\n background: $ff-white;\n padding: 10px;\n border-radius: 6px;\n border: 1px solid $ff-grey-200;\n overflow: auto;\n height: 100%;\n }\n}\n@media screen and (max-width: $ff-screen-md) {\n .unified-namespace-hierarchy {\n min-width: 100%;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-topic-inspecting {\n background: $ff-white;\n padding: 10px;\n border-radius: 6px;\n border: 1px solid $ff-grey-200;\n}\n\n.ff-topic-path {\n display: flex;\n background-color: $ff-indigo-50;\n color: $ff-indigo-600;\n border-radius: 6px;\n border: 1px solid $ff-indigo-100;\n padding: 6px;\n font-weight: 600;\n & > span:first-child {\n flex-grow: 1\n }\n & > span:last-child {\n flex-grow: 0\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.topic-schema {\n background-color: $ff-indigo-50;\n color: $ff-indigo-600;\n border-radius: 6px;\n border: 1px solid $ff-indigo-100;\n padding: 10px 6px;\n font-size: 0.875rem;\n line-height: 1.25rem;\n overflow: auto;\n position: relative;\n\n .topic-schema-unknown {\n color: $ff-grey-500;\n text-align: center;\n font-style: italic;\n }\n\n .schema-container {\n .show-more {\n position: absolute;\n bottom: 0;\n left: 45%;\n }\n\n }\n\n &.collapsed {\n overflow: hidden;\n box-shadow: inset 0 -30px 20px -20px rgba(49, 46, 129, 0.2);\n padding-bottom: 35px;\n\n .schema-container {\n max-height: 400px;\n }\n\n .show-more {\n padding: 10px;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.suggestion {\n .content {\n .format {\n color: $ff-indigo-500;\n }\n }\n\n .actions {\n .preview {\n color: $ff-grey-500\n }\n .accept {\n color: $ff-green-500\n }\n .reject {\n color: $ff-red-500\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-topic-inspecting {\n display: flex;\n flex-direction: column;\n gap: 15px;\n background: $ff-white;\n padding: 10px;\n border-radius: 6px;\n border: 1px solid $ff-grey-200;\n overflow: auto;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-topic-inspector {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n transition: width 0.3s;\n overflow: auto;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-broker-hierarchy {\n display: flex;\n flex-direction: row;\n gap: 12px;\n overflow: auto;\n //height: 100%;\n}\n\n@media screen and (max-width: $ff-screen-md) {\n .ff-broker-hierarchy {\n flex-wrap: wrap;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.broker-form {\n .server, .credentials {\n .title {\n border-bottom: 1px solid $ff-grey-200;\n }\n }\n\n .server {\n &::after {\n content: ' ';\n width: 1px;\n height: 10px;\n background: red;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-box {\n border: 1px solid $ff-color--border;\n background: $ff-white;\n padding: 10px;\n display: flex;\n flex-direction: column;\n flex: 1;\n\n .ff-box-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 10px;\n\n .ff-box-title {\n margin: 0;\n padding: 0;\n font-size: 1.3rem;\n }\n }\n}\n","<template>\n <KebabMenu class=\"relative ff-kebab-menu\" as=\"div\" data-el=\"kebab-menu\">\n <MenuButton\n ref=\"trigger\"\n class=\"ff-btn ff-btn--tertiary ff-btn-icon transition-fade--color ff-kebab-menu__trigger\"\n :disabled=\"disabled\"\n @click=\"() => { $nextTick(() => { updateItemsPosition() } ) }\"\n @keydown.space=\"() => { $nextTick(() => { updateItemsPosition() } ) }\"\n >\n <DotsVerticalIcon class=\"ff-icon\" />\n </MenuButton>\n <teleport to=\"body\">\n <transition\n leave-active-class=\"transition duration-100 ease-in\"\n leave-from-class=\"opacity-100\"\n leave-to-class=\"opacity-0\"\n >\n <MenuItems\n ref=\"menu-items\"\n as=\"ul\"\n class=\"ff-kebab-options\"\n data-el=\"kebab-options\"\n :style=\"{\n position: 'fixed',\n top: position.top + 'px',\n left: position.left + 'px'\n }\"\n >\n <slot></slot>\n </MenuItems>\n </transition>\n </teleport>\n </KebabMenu>\n</template>\n\n<script>\nimport {\n Menu,\n MenuButton,\n MenuItems\n} from '@headlessui/vue'\nimport { DotsVerticalIcon } from '@heroicons/vue/solid'\n\nimport TeleportedMenuMixin from '../../../mixins/TeleportedMenuMixin.js'\n\nexport default {\n name: 'ff-kebab-menu',\n components: {\n DotsVerticalIcon,\n KebabMenu: Menu,\n MenuButton,\n MenuItems\n },\n mixins: [TeleportedMenuMixin],\n props: {\n disabled: {\n default: false,\n required: false,\n type: Boolean\n }\n }\n}\n</script>\n\n<style scoped>\n.ff-kebab-menu__trigger {\n border: 1px solid transparent;\n}\n</style>\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.minimal-status {\n display: block;\n height: 10px;\n width: 10px;\n border-radius: 50%;\n transition: ease-in-out .3s;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.recently-modified {\n & > p {\n border-bottom: 1px solid $ff-grey-100;\n margin-bottom: 10px;\n line-height: 2rem;\n }\n\n .device-wrapper {\n .device-tile {\n border: 1px solid $ff-grey-100;\n padding: 2px 10px;\n border-radius: 5px;\n display: flex;\n width: 100%;\n height: fit-content;\n min-height: 55px;\n justify-content: space-between;\n align-items: center;\n gap: 10px;\n will-change: border-color;\n transition: ease-in-out .3s;\n\n &.has-more {\n padding: 10px;\n }\n\n &:hover {\n border-color: $ff-grey-200;\n }\n\n .details {\n flex: 1;\n\n .detail-wrapper {\n &:last-of-type {\n font-size: $ff-funit-sm;\n color: $ff-grey-400;\n }\n }\n\n .name {\n &:hover {\n color: $ff-indigo-700;\n }\n }\n }\n\n .actions {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n }\n }\n\n .no-devices {\n min-height: 130px;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.recently-modified {\n display: flex;\n flex: 1;\n flex-direction: column;\n\n & > p {\n border-bottom: 1px solid $ff-grey-100;\n margin-bottom: 10px;\n line-height: 2rem;\n }\n\n .instance-wrapper {\n height: fit-content;\n\n .instance-tile {\n border: 1px solid $ff-grey-100;\n padding: 2px 4px 2px 10px;\n border-radius: 5px;\n display: flex;\n width: 100%;\n height: fit-content;\n min-height: 55px;\n justify-content: space-between;\n align-items: center;\n gap: 10px;\n will-change: border-color, background-color;\n transition: ease-in-out 0.3s;\n cursor: pointer;\n\n &.has-more {\n padding: 10px;\n }\n\n &:hover {\n border-color: $ff-grey-300;\n background-color: $ff-indigo-50;\n }\n\n .details {\n flex: 1;\n\n .detail-wrapper {\n .name {\n font-weight: 500;\n }\n\n &.detail {\n font-size: $ff-funit-sm;\n color: $ff-grey-400;\n }\n }\n }\n\n .actions {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 4px;\n\n .ff-kebab-menu .ff-btn {\n color: $ff-color--action;\n\n .ff-icon {\n width: 20px;\n height: 20px;\n }\n\n &:hover {\n background-color: $ff-color--highlight;\n color: $ff-white;\n }\n }\n }\n }\n }\n\n .no-instances {\n min-height: 130px;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-team-dashboard {\n height: 100%;\n display: flex;\n flex: 1;\n flex-direction: column;\n overflow: auto;\n container-type: inline-size;\n container-name: team-dashboard;\n}\n\n.instances-section {\n // Default: stacked (flex-wrap)\n // When container is 640px+ wide, display side-by-side\n @container team-dashboard (min-width: 640px) {\n flex-wrap: nowrap;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.flow-categories-wrapper {\n display: flex;\n flex-direction: column;\n flex-wrap: wrap;\n gap: 20px;\n\n .category {\n margin-bottom: 20px;\n\n .blueprint-tile {\n max-width: 250px;\n min-width: 200px;\n }\n\n .tiles-wrapper {\n display: flex;\n flex-wrap: wrap;\n gap: 15px;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-registry-entry {\n background-color: $ff-white;\n padding: 12px;\n border: 1px solid $ff-grey-200;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-registry-list {\n display: grid;\n gap: 6px;\n}\n",".ff-code-previewer {\n background-color: white;\n border: 1px solid $ff-grey-300;\n border-radius: 6px;\n padding: 12px;\n code {\n border: none;\n padding: unset;\n }\n}","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-team-library .ff-breadcrumbs {\n margin-top: 12px;\n margin-bottom: 12px;\n}\n.breadcrumbs-wrapper {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\ntd {\n .content {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n transition: max-height 0.3s ease-in-out;\n height: fit-content;\n box-shadow: inset 0 2px 15px 0 rgba(0,0,0,0.1);\n overflow-y: auto;\n\n .application {\n line-height: 29px;\n display: grid;\n grid-template-columns: 55px repeat(10, 1fr) 56px;\n border-bottom: 1px solid $ff-grey-200;\n transition: ease-in-out .3s;\n\n .name {\n grid-column: span 8;\n }\n .role {\n padding-left: 15px;\n }\n\n .action {\n .ff-icon {\n transition: ease-in-out .2s;\n opacity: 0;\n }\n }\n\n &:hover {\n background: $ff-grey-100;\n .action {\n .ff-icon {\n opacity: 1;\n }\n }\n }\n\n &:last-of-type {\n border-bottom: none;\n }\n }\n\n }\n\n &.collapsed {\n .content {\n max-height: 0\n }\n }\n\n &.expanded {\n .content {\n max-height: 200px;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-cpu-bar {\n width: 100%;\n height: 100%;\n border-radius: 3px;\n padding: 3px;\n border: 1px solid;\n border-color: $ff-grey-300;\n}\n\n.ff-cpu-bar--fill {\n border-radius: 3px;\n height: 12px;\n}\n\n.ff-cpu-bar--fill.high {\n background-color: $ff-red-200;\n}\n\n.ff-cpu-bar--fill.medium {\n background-color: $ff-yellow-200;\n}\n\n.ff-cpu-bar--fill.low {\n background-color: $ff-green-200;\n}\n\n.ff-cpu-bar--label {\n width: 48px;\n text-align: right;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-pipeline-stage {\n border: 1px solid $ff-grey-300;\n border-radius: 6px;\n overflow: hidden;\n background: $ff-white;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 225px;\n\n .ff-pipeline-target {\n display: flex;\n flex-direction: row;\n gap: 6px;\n font-size: 11px;\n align-items: center;\n border: 1px solid $ff-grey-300;\n padding: 6px;\n border-radius: 6px;\n transition: ease-in-out .3s;\n\n &:hover {\n color: $ff-indigo-700;\n border-color: $ff-indigo-700;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-pipeline {\n border: 1px solid $ff-grey-300;\n border-radius: 5px;\n overflow: hidden;\n\n & > .ff-pipeline-header {\n background: $ff-white;\n padding: 15px;\n border-bottom: 1px solid $ff-grey-300;\n transition: ease-in-out .3s;\n\n &:hover {\n color: $ff-white;\n background: $ff-indigo-700;\n .ff-pipeline-application-name {\n transition: ease-in-out .3s;\n color: $ff-grey-400;\n }\n }\n\n &:has(.ff-pipeline-application-name:hover) {\n color: $ff-grey-500;\n\n .ff-pipeline-application-name:hover {\n color: $ff-white;\n }\n }\n\n .ff-application-name {\n transition: ease-in-out .3s;\n color: $ff-grey-400;\n\n &:hover {\n color: $ff-indigo-700;\n }\n }\n\n .to {\n display: flex;\n flex: 1;\n justify-content: end;\n }\n }\n\n & > .ff-pipeline-content {\n padding: 15px;\n overflow: auto;\n\n .ff-pipeline-stages-list {\n display: flex;\n flex-direction: row;\n gap: 15px;\n\n li {\n display: flex;\n gap: 15px;\n align-items: center;\n\n &:last-child > .ff-icon {\n display: none;\n }\n }\n }\n\n .ff-empty-stages-message {\n text-align: center;\n color: $ff-grey-500;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#team-pipelines {\n\n .pipelines {\n .pipelines-list {\n display: flex;\n flex-direction: column;\n gap: 15px;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-team-properties-table {\n padding: 9px 12px;\n border-radius: 0.25rem;\n background-color: white;\n border-collapse: separate;\n border-width: 1px;\n border-color: $ff-grey-300;\n min-width: 400px;\n td {\n height: 36px;\n }\n tr:not(:last-child) {\n td,th {\n border-bottom: 1px solid $ff-grey-100;\n }\n }\n th {\n font-weight: 600;\n padding-right: 12px;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.rows-header {\n margin-bottom: 15px;\n padding-bottom: 15px;\n border-bottom: 1px solid $ff-color--border;\n\n .toggle-collapse, .refresh-table {\n border: 1px solid transparent;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.text-cell {\n overflow: auto;\n max-height: 3rem;\n\n .value {\n background: none;\n border: none;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#rows-list {\n height: 100%;\n width: 100%;\n overflow: auto;\n\n .header {\n border-bottom: 1px solid $ff-color--border;\n padding-bottom: 15px;\n margin-bottom: 15px;\n display: flex;\n align-items: center;\n height: 50px;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.column {\n .col-section {\n\n .ff-combobox, .ff-listbox {\n min-width: 10px; // resetting min-width\n max-width: 100%;\n width: 100%;\n }\n\n .ff-input {\n min-width: 10px;\n }\n\n .ff-checkbox {\n span {\n top: 8px;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n\n#create-table {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n background: $ff-grey-50;\n\n > .header {\n border-bottom: 1px solid $ff-grey-300;\n padding: 10px 0;\n width: 100%;\n background: $ff-white;\n\n .content {\n padding: 0 12px;\n display: flex;\n align-items: baseline;\n\n .title {\n margin: 0;\n color: $ff-grey-800;\n font-weight: bold;\n font-size: 1.25rem;\n line-height: 1.75rem;\n }\n }\n }\n\n .content-wrapper {\n flex: 1;\n width: 100%;\n background-color: $ff-grey-50;\n overflow: auto;\n\n .section {\n padding-bottom: 15px;\n margin-bottom: 15px;\n border-bottom: 1px solid $ff-grey-200;\n\n .header {\n .title {\n color: $ff-grey-600;\n font-size: 10px;\n }\n }\n\n .columns {\n margin-bottom: 20px;\n }\n }\n }\n\n .footer {\n padding: 10px 12px;\n border-top: 1px solid $ff-grey-300;\n background: $ff-white;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#table-schema {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n background: $ff-grey-50;\n\n > .header {\n border-bottom: 1px solid $ff-grey-300;\n padding: 10px 0;\n width: 100%;\n background: $ff-white;\n\n .content {\n padding: 0 12px;\n display: flex;\n align-items: baseline;\n\n .title {\n margin: 0;\n color: $ff-grey-800;\n font-weight: bold;\n font-size: 1.25rem;\n line-height: 1.75rem;\n }\n }\n }\n\n .content-wrapper {\n flex: 1;\n width: 100%;\n background-color: $ff-grey-50;\n overflow: auto;\n\n .header {\n .title {\n color: $ff-grey-600;\n font-size: 10px;\n }\n }\n }\n\n .footer {\n background: $ff-white;\n padding: 10px 12px;\n border-top: 1px solid $ff-grey-300;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#tables-list {\n display: flex;\n flex-direction: column;\n max-width: 20%;\n min-width: 250px;\n\n .header {\n border-bottom: 1px solid $ff-color--border;\n padding-bottom: 15px;\n margin-bottom: 15px;\n\n .ff-data-table--search {\n min-width: 10px;\n }\n }\n\n .list {\n .item {\n display: flex;\n gap: 5px;\n line-height: 2;\n align-items: center;\n transition: ease-in-out .3s;\n cursor: pointer;\n\n &:hover, &.active {\n color: $ff-indigo-500;\n background-color: $ff-grey-100;\n }\n\n &:hover {\n .icon-toggle {\n .ff-icon:first-child {\n display: none;\n }\n .ff-icon:last-child {\n display: inline-block;\n }\n }\n }\n\n .icon-toggle {\n width: 24px;\n .ff-icon:first-child {\n display: inline-block;\n }\n .ff-icon:last-child {\n display: none;\n }\n\n .edit {\n &:hover {\n transform: scale(1.4);\n }\n }\n }\n }\n }\n\n .empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n text-align: center;\n justify-content: center;\n color: $ff-grey-400;\n line-height: 1.6;\n\n .cta {\n cursor: pointer;\n color: $ff-indigo-500;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#table-explorer {\n display: flex;\n gap: 15px;\n height: 100%;\n width: 100%;\n overflow: auto;\n\n &.collapsed {\n gap: 0;\n #tables-list {\n max-width: 0;\n min-width: 0;\n overflow: hidden;\n padding: 0;\n border-right-color: transparent;\n }\n }\n\n #tables-list {\n border-right: 1px solid $ff-color--border;\n padding-right: 10px;\n transition: ease-in-out .3s, border-right-color ease-out .3s;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#table-credentials {\n .title {\n display: flex;\n gap: 5px;\n align-items: center;\n margin-bottom: 10px;\n\n h3 {\n margin: 0;\n padding: 0;\n }\n }\n\n .client-details,\n .database-details {\n padding: 10px;\n background: $ff-white;\n border: 1px solid $ff-color--border;\n border-radius: 5px;\n\n .item {\n display: flex;\n margin-bottom: 10px;\n\n dt {\n font-weight: 500;\n max-width: 30%;\n flex: 1\n }\n\n dd {\n flex: 1;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#add-database {\n height: 100%;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.database-form {\n .database, .credentials {\n .title {\n border-bottom: 1px solid $ff-grey-200;\n }\n }\n dl {\n padding: 10px;\n max-width: 600px;\n\n dt, dd {\n margin: 0;\n }\n\n dt {\n font-weight: 600;\n }\n dd {\n text-indent: 10px;\n margin-bottom: 10px;\n }\n }\n\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-select-team-step {\n .team-tile {\n padding: 12px;\n border: 2px solid $ff-grey-300;\n width: 100%;\n border-radius: 6px;\n cursor: pointer;\n transition: ease-in-out .3s;\n\n &:hover {\n border-color: $ff-indigo-400;\n }\n\n &.selected {\n border-color: $ff-indigo-600;\n }\n\n .header {\n .title {\n\n }\n\n .counters {\n color: $ff-grey-400;\n font-size: $ff-funit-xs;\n }\n }\n\n .description {\n color: $ff-grey-400;\n font-size: $ff-funit-sm;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.capabilities-selector {\n .ff-listbox {\n min-width: auto;\n\n .ff-options {\n max-width: 320px;\n }\n\n button.ff-button {\n border: 1px solid #c7d2fe; // indigo-300 to match other buttons\n border-radius: 5px;\n padding: 0.25rem 0.50rem;\n background: $ff-white;\n color: #1f2937; // gray-800, explicit dark text\n font-size: 0.875rem;\n\n .icon {\n svg {\n color: inherit;\n width: 1.25rem;\n height: 1.25rem;\n }\n }\n\n &:hover:not(:disabled) {\n background-color: #f9fafb; // gray-50\n }\n\n &:focus,\n &.active {\n outline: none;\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n }\n\n &[data-headlessui-state=\"open\"] {\n button.ff-button,\n button.ff-button:hover {\n background: $ff-indigo-600;\n border-color: $ff-indigo-600;\n color: $ff-white;\n\n .icon {\n svg {\n color: $ff-white;\n }\n }\n }\n }\n }\n}\n\n.tool-count-badge {\n background-color: #e0e7ff; // indigo-100\n color: #4338ca; // indigo-700\n font-size: 0.75rem;\n font-weight: 500;\n padding: 0.125rem 0.5rem;\n border-radius: 9999px;\n min-width: 1.5rem;\n text-align: center;\n flex-shrink: 0;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.context-selector {\n .ff-listbox {\n min-width: auto;\n\n .ff-options {\n max-width: 320px;\n }\n\n button.ff-button {\n border: 1px solid #c7d2fe; // indigo-300 to match other buttons\n border-radius: 5px;\n padding: 0.25rem 0.50rem;\n background: $ff-white;\n color: #1f2937; // gray-800, explicit dark text\n font-size: 0.875rem;\n\n .icon {\n svg {\n color: inherit;\n width: 1.25rem;\n height: 1.25rem;\n }\n }\n\n &:hover:not(:disabled) {\n background-color: #f9fafb; // gray-50\n }\n\n &:focus:not(:disabled) {\n outline: none;\n background-color: #e0e7ff; // indigo-100\n color: #4338ca; // indigo-700\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n }\n\n &[data-headlessui-state=\"open\"] {\n button.ff-button,\n button.ff-button:hover {\n background: $ff-indigo-600;\n border-color: $ff-indigo-600;\n color: $ff-white;\n\n .icon {\n svg {\n color: $ff-white;\n }\n }\n }\n }\n }\n}\n\n.context-selector.active .relative button {\n background-color: #e0e7ff; // indigo-100\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.selection-button {\n border: 1px solid $ff-grey-200;\n border-radius: 5px;\n background: $ff-grey-50;\n display: flex;\n gap: 5px;\n align-items: center;\n cursor: pointer;\n transition: 0.3s ease-in-out;\n white-space: nowrap;\n\n &.active {\n background: $ff-indigo-100;\n border: 1px solid $ff-indigo-300;\n\n .separator {\n background: $ff-indigo-300;\n }\n }\n\n .icon-wrapper {\n display: flex;\n align-items: center;\n margin-right: 5px;\n }\n\n .separator {\n width: 1px;\n align-self: stretch;\n background: $ff-yellow-100;\n }\n\n .text {\n padding: 0.25rem 0.50rem 0.25rem 0.25rem;\n\n font-size: $ff-funit-sm;\n display: flex;\n gap: 2px;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.flow-selection-button {\n .text {\n .counter {\n color: $ff-grey-500;\n margin-left: 4px;\n font-size: $ff-funit-xs;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.flow-selection-button {\n .text {\n .counter {\n color: $ff-grey-500;\n margin-left: 4px;\n font-size: $ff-funit-xs;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-expert-input {\n display: flex;\n flex-direction: column;\n gap: 0;\n padding: 1rem; // p-4\n border-top: 1px solid #E5E7EB; // border-gray-200\n background: white;\n flex-shrink: 0; // Prevent input area from shrinking\n position: relative;\n min-height: 180px;\n max-height: 40vh;\n}\n\n.action-buttons {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.right-buttons {\n display: flex;\n gap: 0.5rem;\n}\n\nbutton {\n padding: 0.5rem 0.75rem; // py-2 px-3\n border-radius: 9999px; // rounded-full\n font-size: 0.875rem; // text-sm\n cursor: pointer;\n transition: colors 0.2s ease;\n border: 1px solid transparent;\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n.btn-start-over {\n background-color: white;\n color: inherit;\n border-color: #C7D2FE; // indigo-300\n padding: 0.25rem 0.50rem;\n border-radius: 5px;\n\n &:hover:not(:disabled) {\n background-color: #F9FAFB; // gray-50\n }\n}\n\n.btn-send {\n background-color: $ff-indigo-600;\n color: white;\n border-color: $ff-indigo-600;\n border-radius: 5px;\n padding: 0.25rem 0.50rem;\n\n &:hover:not(:disabled) {\n background-color: $ff-indigo-700;\n }\n}\n\n.btn-stop {\n background-color: white;\n color: inherit;\n border-color: #C7D2FE; // indigo-300\n display: flex;\n align-items: center;\n gap: 0.5rem;\n border-radius: 5px;\n padding: 0.25rem 0.50rem;\n\n &::before {\n content: '';\n width: 0.75rem; // w-3\n height: 0.75rem; // h-3\n background-color: #1F2937; // gray-800\n border-radius: 0.125rem; // rounded-sm\n }\n\n &:hover {\n background-color: #F9FAFB; // gray-50\n }\n}\n\n.input-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n border: 2px solid #D1D5DB; // border-2 border-gray-300\n border-radius: 0.5rem; // rounded-lg\n transition: border-color 0.2s ease;\n\n &.focused {\n border-color: $ff-indigo-500;\n }\n\n .chat-input {\n flex: 1;\n width: 100%;\n padding: 1rem; // p-4\n box-sizing: border-box;\n overflow-y: auto;\n border: none;\n outline: none;\n font-size: 0.875rem; // text-sm\n line-height: 1.5;\n color: #111827; // text-gray-900\n resize: none;\n font-family: inherit;\n background: white;\n\n &:focus {\n outline: none;\n }\n\n &:disabled {\n cursor: not-allowed;\n background-color: #F9FAFB; // bg-gray-50\n color: #6B7280; // text-gray-500\n }\n\n &::placeholder {\n color: #9CA3AF; // placeholder gray\n }\n }\n\n .actions {\n padding: .5rem;\n display: flex;\n justify-content: space-between;\n gap: 0.75rem;\n\n .left {\n display: flex;\n justify-content: flex-start;\n\n // scroll for overflow of selected chips\n overflow: auto;\n flex: 1;\n .context-items-container {\n flex: 1;\n overflow-x: auto;\n scrollbar-width: none;\n display: flex;\n gap: 0.5rem;\n }\n }\n\n .right {\n display: flex;\n justify-content: flex-end;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-expert-message {\n display: flex;\n width: 100%;\n margin-bottom: 1rem;\n\n &.message-human {\n justify-content: flex-end;\n\n .message-bubble {\n background-color: $ff-indigo-600;\n color: white;\n border-radius: 0.5rem;\n border-bottom-right-radius: 0.125rem;\n }\n }\n\n &.message-ai {\n justify-content: flex-start;\n\n .message-bubble {\n background-color: $ff-grey-100;\n color: #1F2937; // gray-800\n border-radius: 0.5rem;\n border-bottom-left-radius: 0.125rem;\n }\n\n .issues, .suggestions {\n margin-top: 1.25rem;\n h4 {\n font-weight: bold;\n display: flex;\n align-items: center;\n gap: 5px;\n color: $ff-grey-600;\n\n .ff-icon {\n color: $ff-grey-500;\n }\n }\n\n ul {\n list-style: disc;\n padding-left: 1.4rem;\n\n li {\n margin-top: .5rem;\n }\n }\n }\n }\n\n &.message-system {\n justify-content: center;\n\n .message-bubble {\n background-color: #FEF3C7; // amber-100\n color: #92400E; // amber-900\n border-radius: 0.5rem;\n text-align: left;\n max-width: 100%;\n width: 100%;\n }\n\n .message-text {\n font-size: 0.875rem;\n line-height: 1.5;\n }\n\n &.system-expired .message-bubble {\n background-color: #FEE2E2; // red-100\n color: #991B1B; // red-900\n }\n }\n\n}\n\n.message-bubble {\n max-width: 90%; // Always leave a gap on the side\n padding: 0.5rem 1rem; // py-2 px-4\n word-wrap: break-word;\n overflow-wrap: break-word;\n\n &.rich-guide-bubble {\n padding: 1rem; // py-4 px-4\n }\n}\n\n.message-text {\n font-size: 1rem;\n line-height: 1.5;\n\n :deep(p) {\n margin: 0 0 0.5rem 0;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n :deep(ul), :deep(ol) {\n margin: 0.5rem 0;\n padding-left: 1.5rem;\n list-style: square;\n }\n\n :deep(li) {\n margin: 0.25rem 0;\n }\n\n :deep(code) {\n background-color: rgba(0, 0, 0, 0.05);\n padding: 0.125rem 0.25rem;\n border-radius: 0.25rem;\n font-family: monospace;\n font-size: 0.875em;\n }\n\n :deep(pre) {\n background-color: rgba(0, 0, 0, 0.05);\n padding: 0.75rem;\n border-radius: 0.5rem;\n overflow-x: auto;\n margin: 0.5rem 0;\n\n code {\n background-color: transparent;\n padding: 0;\n }\n }\n\n :deep(a) {\n color: $ff-indigo-600;\n text-decoration: underline;\n\n &:hover {\n color: $ff-indigo-700;\n }\n }\n\n :deep(strong) {\n font-weight: 600;\n }\n\n :deep(em) {\n font-style: italic;\n }\n}\n\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-expert-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.75rem;\n padding: 1rem;\n}\n\n.loading-dots {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n}\n\n.loading-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: $ff-indigo-500;\n animation: bounce-dot 1.4s infinite ease-in-out both;\n\n &:nth-child(1) {\n animation-delay: -0.32s;\n }\n\n &:nth-child(2) {\n animation-delay: -0.16s;\n }\n}\n\n@keyframes bounce-dot {\n 0%, 80%, 100% {\n transform: scale(0.7);\n opacity: 0.5;\n }\n 40% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n.loading-message {\n font-size: 0.875rem;\n color: $ff-grey-600;\n font-style: italic;\n animation: fade-in 0.3s ease-in;\n}\n\n@keyframes fade-in {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.package-card {\n position: relative;\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n padding: 0.75rem;\n background-color: white;\n border: 1px solid $ff-grey-200;\n border-radius: 0.5rem;\n text-decoration: none;\n color: $ff-grey-900;\n transition: all 0.2s ease;\n\n &:hover {\n border-color: $ff-indigo-300;\n background-color: $ff-grey-50;\n }\n}\n\n.package-favicon {\n flex-shrink: 0;\n width: 1rem;\n height: 1rem;\n margin-top: 0.125rem;\n vertical-align: middle;\n margin-right: 0.5rem;\n}\n\n.package-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n.package-actions {\n position: absolute;\n top: 8px;\n right: 8px;\n}\n\n.package-name {\n padding-right: 3rem;\n font-size: 0.875rem;\n font-weight: 500;\n font-family: monospace;\n color: $ff-grey-900;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.package-url {\n font-size: 0.75rem;\n color: $ff-grey-500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin: 0;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.resource-card {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n padding: 0.75rem;\n background-color: white;\n border: 1px solid $ff-grey-200;\n border-radius: 0.5rem;\n text-decoration: none;\n color: $ff-grey-900;\n transition: all 0.2s ease;\n\n &:hover {\n border-color: $ff-indigo-300;\n background-color: $ff-grey-50;\n }\n}\n\n.resource-icon {\n flex-shrink: 0;\n width: 1rem;\n height: 1rem;\n margin-top: 0.125rem;\n object-fit: contain;\n}\n\n.resource-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n min-width: 0;\n}\n\n.resource-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: $ff-grey-900;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.resource-url {\n font-size: 0.75rem;\n color: $ff-grey-500;\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-expert-rich-guide {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n\n.guide-badge {\n display: inline-flex;\n align-self: flex-start;\n margin-bottom: 0.75rem; // mb-3\n\n span {\n display: inline-block;\n padding: 0.5rem 0.75rem; // py-2 px-3\n background-color: $ff-indigo-100;\n color: $ff-indigo-700;\n font-size: 0.875rem; // text-sm\n border-radius: 9999px; // rounded-full\n }\n}\n\n.guide-header {\n .guide-title {\n font-size: 1.125rem; // text-lg\n font-weight: 600; // font-semibold\n color: #111827; // text-gray-900\n margin: 0 0 0.5rem 0; // mb-2\n }\n\n .guide-summary {\n color: #374151; // text-gray-700\n margin: 0 0 1rem 0; // mb-4\n line-height: 1.625;\n }\n}\n\n.section-title {\n font-size: 1rem; // text-base\n font-weight: 500; // font-medium\n color: #111827; // text-gray-900\n margin: 0 0 0.75rem 0; // mb-3\n}\n\n.guide-steps {\n margin-bottom: 1rem; // mb-4\n\n .steps-list {\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 0.75rem; // space-y-3\n }\n\n .step-item {\n display: flex;\n align-items: flex-start;\n }\n\n .step-number {\n flex-shrink: 0;\n width: 1.5rem; // w-6\n height: 1.5rem; // h-6\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: $ff-indigo-600;\n color: white;\n font-size: 0.875rem; // text-sm\n border-radius: 50%; // rounded-full\n margin-right: 0.75rem; // mr-3\n margin-top: 0.125rem; // mt-0.5\n }\n\n .step-content {\n flex: 1;\n\n .step-title {\n font-size: 1rem;\n font-weight: 500;\n color: $ff-grey-900;\n margin: 0 0 0.25rem 0;\n }\n\n .step-detail {\n font-size: 0.875rem;\n color: $ff-grey-600;\n margin: 0.25rem 0 0 0;\n line-height: 1.5;\n }\n }\n}\n\n.guide-packages {\n .packages-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 0.5rem;\n }\n}\n\n.guide-resources {\n .resources-grid {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n}\n\n.guide-flows {\n .resources-grid {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-expert-rich-resources {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.resources-header {\n margin-bottom: 1rem;\n\n .resources-title {\n font-size: 1.125rem; // text-lg\n font-weight: 600; // font-semibold\n color: #111827; // text-gray-900\n margin: 0 0 0.5rem 0; // mb-2\n line-height: 1.3;\n }\n\n .resources-content {\n color: #374151; // text-gray-700\n margin: 0;\n line-height: 1.5;\n font-size: 1rem;\n }\n}\n\n.section-title {\n font-size: 1rem; // text-base\n font-weight: 500; // font-medium\n color: #111827; // text-gray-900\n margin: 0.5rem 0 0.75rem 0; // mt-2 mb-3\n}\n\n.resources-list {\n .resources-grid {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .resource-card {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n padding: 0.75rem;\n background-color: white;\n border: 1px solid $ff-grey-200;\n border-radius: 0.5rem;\n text-decoration: none;\n color: $ff-grey-900;\n transition: all 0.2s ease;\n\n &:hover {\n border-color: $ff-indigo-300;\n background-color: $ff-grey-50;\n }\n }\n\n .resource-icon {\n flex-shrink: 0;\n width: 1rem;\n height: 1rem;\n margin-top: 0.125rem;\n object-fit: contain;\n }\n\n .resource-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n min-width: 0;\n }\n\n .resource-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: $ff-grey-900;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .resource-url {\n font-size: 0.75rem;\n color: $ff-grey-500;\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n}\n","pre code.hljs {\n display: block;\n overflow-x: auto;\n padding: 1em\n}\ncode.hljs {\n padding: 3px 5px\n}\n/*!\n Theme: GitHub\n Description: Light theme as seen on github.com\n Author: github.com\n Maintainer: @Hirse\n Updated: 2021-05-15\n\n Outdated base version: https://github.com/primer/github-syntax-light\n Current colors taken from GitHub's CSS\n*/\n.hljs {\n color: #24292e;\n background: #ffffff\n}\n.hljs-doctag,\n.hljs-keyword,\n.hljs-meta .hljs-keyword,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-type,\n.hljs-variable.language_ {\n /* prettylights-syntax-keyword */\n color: #d73a49\n}\n.hljs-title,\n.hljs-title.class_,\n.hljs-title.class_.inherited__,\n.hljs-title.function_ {\n /* prettylights-syntax-entity */\n color: #6f42c1\n}\n.hljs-attr,\n.hljs-attribute,\n.hljs-literal,\n.hljs-meta,\n.hljs-number,\n.hljs-operator,\n.hljs-variable,\n.hljs-selector-attr,\n.hljs-selector-class,\n.hljs-selector-id {\n /* prettylights-syntax-constant */\n color: #005cc5\n}\n.hljs-regexp,\n.hljs-string,\n.hljs-meta .hljs-string {\n /* prettylights-syntax-string */\n color: #032f62\n}\n.hljs-built_in,\n.hljs-symbol {\n /* prettylights-syntax-variable */\n color: #e36209\n}\n.hljs-comment,\n.hljs-code,\n.hljs-formula {\n /* prettylights-syntax-comment */\n color: #6a737d\n}\n.hljs-name,\n.hljs-quote,\n.hljs-selector-tag,\n.hljs-selector-pseudo {\n /* prettylights-syntax-entity-tag */\n color: #22863a\n}\n.hljs-subst {\n /* prettylights-syntax-storage-modifier-import */\n color: #24292e\n}\n.hljs-section {\n /* prettylights-syntax-markup-heading */\n color: #005cc5;\n font-weight: bold\n}\n.hljs-bullet {\n /* prettylights-syntax-markup-list */\n color: #735c0f\n}\n.hljs-emphasis {\n /* prettylights-syntax-markup-italic */\n color: #24292e;\n font-style: italic\n}\n.hljs-strong {\n /* prettylights-syntax-markup-bold */\n color: #24292e;\n font-weight: bold\n}\n.hljs-addition {\n /* prettylights-syntax-markup-inserted */\n color: #22863a;\n background-color: #f0fff4\n}\n.hljs-deletion {\n /* prettylights-syntax-markup-deleted */\n color: #b31d28;\n background-color: #ffeef0\n}\n.hljs-char.escape_,\n.hljs-link,\n.hljs-params,\n.hljs-property,\n.hljs-punctuation,\n.hljs-tag {\n /* purposely ignored */\n \n}","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n@import 'highlight.js/styles/github.css';\n\n.ff-expert-tool-call {\n background-color: $ff-grey-50;\n border: 1px solid $ff-grey-200;\n border-radius: 0.5rem 0.5rem 0.5rem 0;\n overflow: hidden;\n max-width: 90%;\n}\n\n.ff-expert-tool-call--header {\n display: flex;\n align-items: center;\n padding: 0.75rem 1rem;\n gap: 0.5rem;\n background-color: white;\n cursor: pointer;\n user-select: none;\n\n &:hover {\n background-color: $ff-grey-50;\n }\n\n .ff-icon {\n width: 1rem;\n height: 1rem;\n color: $ff-grey-500;\n flex-shrink: 0;\n transition: transform 0.2s ease;\n\n &.rotated {\n transform: rotate(90deg);\n }\n }\n}\n\n.ff-expert-tool-call--count {\n font-size: 1rem;\n font-weight: 500;\n color: $ff-grey-800;\n flex: 1;\n}\n\n.ff-expert-tool-call--duration {\n font-size: 1rem;\n color: $ff-grey-500;\n}\n\n.ff-expert-tool-call--body {\n border-top: 1px solid $ff-grey-200;\n padding: 0.75rem 1rem;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.ff-expert-tool-call--item {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.ff-expert-tool-call--title {\n font-size: 0.875rem;\n font-weight: 600;\n color: $ff-grey-800;\n}\n\n.ff-expert-tool-call--name {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n font-size: 0.75rem;\n color: $ff-grey-500;\n font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;\n}\n\n.ff-expert-tool-call--badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 1.25rem;\n height: 1.125rem;\n padding: 0 0.25rem;\n font-size: 0.5625rem;\n font-weight: 700;\n color: $ff-grey-600;\n background-color: $ff-grey-200;\n border-radius: 0.1875rem;\n flex-shrink: 0;\n cursor: help;\n}\n\n.ff-expert-tool-call--details {\n margin-top: 0.5rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.ff-expert-tool-call--section {\n border: 1px solid $ff-grey-200;\n border-radius: 0.375rem;\n overflow: hidden;\n}\n\n.ff-expert-tool-call--section-header {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.5rem 0.75rem;\n background-color: white;\n cursor: pointer;\n user-select: none;\n font-size: 0.75rem;\n font-weight: 500;\n color: $ff-grey-600;\n\n &:hover {\n background-color: $ff-grey-50;\n }\n\n .ff-icon-small {\n width: 0.75rem;\n height: 0.75rem;\n color: $ff-grey-400;\n flex-shrink: 0;\n transition: transform 0.2s ease;\n\n &.rotated {\n transform: rotate(90deg);\n }\n }\n}\n\n.ff-expert-tool-call--section-label {\n flex: 1;\n}\n\n.ff-expert-tool-call--section-duration {\n color: $ff-grey-400;\n font-weight: 400;\n}\n\n.ff-expert-tool-call--code {\n pre {\n margin: 0;\n padding: 0.75rem;\n background-color: $ff-grey-100;\n border-radius: 0.375rem;\n overflow-x: auto;\n\n code {\n font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;\n font-size: 0.8125rem;\n color: $ff-grey-800;\n white-space: pre-wrap;\n word-break: break-word;\n border: none;\n background: transparent;\n padding: 0;\n }\n }\n\n // When inside a section, remove border-radius top and add border\n .ff-expert-tool-call--section & {\n border-top: 1px solid $ff-grey-200;\n\n pre {\n border-radius: 0;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.update-banner {\n background-color: #eef2ff; // indigo-100\n margin-bottom: 0rem;\n border-radius: 0;\n padding: 0.5rem 1rem;\n border-top: 1px solid #E5E7EB;\n\n .update-banner-text {\n color: #4338ca; // indigo-700\n font-size: 0.875rem;\n margin: 0;\n line-height: 1.5;\n }\n\n .update-banner-header {\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .update-banner-body {\n max-height: 0;\n overflow: hidden;\n visibility: hidden;\n transition: max-height 0.6s ease-in-out, visibility 0.6s ease-in-out;\n transition-delay: 250ms; // avoid showing immediately (minimise false expansion on mousing around the chat)\n }\n\n .update-banner-badge {\n display: inline-block;\n background-color: #818cf8; // indigo-400\n color: white;\n font-weight: 600;\n border-radius: 0.25rem;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n cursor: default;\n vertical-align: text-top;\n padding: 0.125rem 0.5rem;\n font-size: 0.75rem;\n }\n\n &.warning {\n .update-banner-badge {\n background-color: $ff-red-700;\n color: $ff-grey-50;\n }\n }\n\n &:hover .update-banner-body,\n &:focus-within .update-banner-body,\n &:active .update-banner-body {\n max-height: 500px;\n visibility: visible;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-expert {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: white;\n overflow: hidden; // Prevent this container from scrolling\n position: relative;\n}\n\n.messages-container {\n flex: 1;\n overflow-y: auto;\n padding: 1rem; // p-4\n scroll-behavior: smooth;\n min-height: 0; // Important for flex child overflow\n\n // Custom scrollbar styling\n &::-webkit-scrollbar {\n width: 8px;\n }\n\n &::-webkit-scrollbar-track {\n background: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: $ff-grey-300;\n border-radius: 4px;\n\n &:hover {\n background-color: $ff-grey-400;\n }\n }\n}\n\n.info-banner {\n background-color: #eef2ff; // indigo-100\n border-radius: 0.5rem;\n margin-bottom: 1.5rem;\n padding: 0.75rem 1rem;\n\n .info-text {\n color: #4338ca; // indigo-700\n font-size: 0.875rem;\n margin: 0;\n line-height: 1.5;\n }\n\n .info-link {\n color: inherit;\n text-decoration: underline;\n\n &:hover {\n color: #3730a3; // indigo-800\n }\n }\n\n .beta-badge {\n display: inline-block;\n background-color: #818cf8; // indigo-400\n color: white;\n font-size: 0.625rem;\n font-weight: 600;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n cursor: help;\n vertical-align: text-top;\n }\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 2rem;\n color: $ff-grey-600;\n\n .empty-state-icon {\n width: 4rem;\n height: 4rem;\n margin-bottom: 1rem;\n color: $ff-indigo-400;\n\n svg {\n width: 100%;\n height: 100%;\n }\n }\n\n h3 {\n font-size: 1.5rem;\n font-weight: 600;\n color: $ff-grey-900;\n margin: 0 0 0.5rem 0;\n }\n\n p {\n font-size: 1rem;\n margin: 0;\n max-width: 400px;\n }\n}\n\n.message-wrapper {\n margin-bottom: 0.5rem;\n}\n\n.scroll-anchor {\n height: 1px;\n}\n\n.mode-switcher-floating {\n position: absolute;\n top: 1rem;\n left: 50%;\n transform: translateX(-50%);\n z-index: 1;\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n.messages-container.has-mode-switcher {\n padding-top: 4rem; // Extra padding to account for floating mode switcher\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-expert-drawer {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden; // Prevent drawer from scrolling\n\n &:focus {\n outline: none;\n }\n\n .header {\n padding: 1rem 1.5rem;\n background: linear-gradient(white, white) padding-box,\n linear-gradient(90deg, $ff-red-600, #5048e5, $ff-red-600, #5048e5, $ff-red-600) border-box;\n border: none;\n border-bottom: 1px solid transparent;\n background-size: 200% 100%;\n animation: gradient-flow-lr 4s linear infinite;\n flex-shrink: 0; // Prevent header from shrinking\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n // Logo + Expert title on left\n > .flex:first-child {\n flex: 1;\n justify-content: flex-start;\n }\n\n // Mode selector in center\n .agent-mode {\n flex: 0 0 auto;\n\n :deep(.ff-btn) {\n min-width: 5.5rem;\n justify-content: center;\n }\n }\n\n // Actions on right\n .header-actions {\n flex: 1;\n justify-content: flex-end;\n }\n\n .flex {\n display: flex;\n\n &.items-center {\n align-items: center;\n }\n\n &.gap-1 {\n gap: 0.25rem; // gap-1\n }\n }\n\n .title {\n font-size: 1rem;\n font-weight: 700; // font-bold\n line-height: 20px;\n color: #1f2937; // text-gray-800\n margin: 0;\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n\n .header-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n padding: 0;\n background: none;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n color: inherit;\n font: inherit;\n transition: background-color 0.15s ease;\n\n &:hover {\n cursor: pointer;\n background: $ff-grey-100;\n }\n\n &:focus-visible {\n outline: 2px solid $ff-indigo-700;\n outline-offset: 1px;\n }\n\n &.pin-button.is-pinned {\n background: $ff-indigo-800;\n color: white;\n\n &:hover {\n background: $ff-indigo-900;\n }\n }\n }\n }\n }\n\n // Ensure ExpertPanel fills remaining space\n > * {\n &:not(.header) {\n flex: 1;\n min-height: 0; // Important for flex child overflow\n }\n }\n}\n\n@keyframes gradient-flow-lr {\n 0% {\n background-position: 0% 0%;\n }\n 100% {\n background-position: 100% 0%;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n.shepherd-theme-ff {\n &.shepherd-has-title[data-popper-placement^=bottom]>.shepherd-arrow:before {\n background-color: $ff-grey-800;\n }\n .shepherd-content {\n .shepherd-header {\n background-color: $ff-grey-800;\n padding: 0.5rem 1rem;\n line-height: 2rem;\n }\n .shepherd-title {\n color: white;\n font-weight: 500;\n }\n .shepherd-cancel-icon {\n color: $ff-white;\n }\n .shepherd-text {\n padding: 1rem;\n p {\n margin-bottom: 0.75rem;\n }\n }\n }\n .shepherd-footer {\n display: flex;\n gap: 0;\n padding: 0;\n border-top: 1px solid $ff-grey-300;\n .shepherd-button {\n flex-grow: 1;\n border-radius: 0;\n background-color: white;\n font-weight: 500;\n padding: 0.5rem 1rem;\n line-height: 2rem;\n font-weight: bold;\n margin: 0;\n }\n .shepherd-button:last-child {\n background-color: $ff-blue-900;\n &:hover {\n background-color: $ff-indigo-800;\n }\n }\n }\n &.shepherd-hidden {\n display: none\n }\n}\n\n.shepherd-modal-overlay-container.shepherd-modal-is-visible path {\n transition: 0.3s all;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.notifications-button-wrapper {\n\n .notifications-button {\n color: $ff-grey-800;\n display: flex;\n align-items: center;\n flex: 1;\n justify-content: center;\n width: 100%;\n height: 100%;\n padding: 18px;\n position: relative;\n\n > * {\n pointer-events: none;\n }\n\n svg {\n flex: 1;\n width: 24px;\n height: 24px;\n transition: ease-in-out .1s;\n object-fit: contain;\n }\n\n &:hover {\n svg {\n will-change: transform ;\n color: $ff-indigo-600;\n transform: scale(1.25) translateZ(0); /* Using slight adjustments to whole values */\n backface-visibility: hidden;\n perspective: 1000px;\n stroke-width: 1.5px;\n shape-rendering: geometricPrecision;\n text-rendering: geometricPrecision;\n }\n }\n\n .ff-notification-pill {\n bottom: 10px;\n right: 5px;\n position: absolute;\n font-size: 0.65rem;\n padding: 0 7px;\n background-color: $ff-red-500;\n }\n }\n}\n"," .ff-dropdown-option-list {\n max-height: 200px;\n overflow-y: auto;\n}\n\n.ff-dropdown-option-list::-webkit-scrollbar {\n width: 8px;\n background-color: $ff-grey-600;\n}\n\n.ff-dropdown-option-list::-webkit-scrollbar-thumb {\n background-color: $ff-grey-300;\n}\n\n.ff-dropdown-option-list::-webkit-scrollbar-thumb:hover {\n background-color: $ff-grey-400;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n@import \"../stylesheets/components/team-list.scss\";\n\n.ff-team-selection {\n &.ff-listbox {\n button {\n border-radius: 0;\n border: none;\n background: none;\n\n button {\n padding: 0;\n\n }\n .icon {\n svg {\n color: $ff-grey-800;\n width: 80%;\n padding-left: 10px;\n }\n }\n }\n }\n}\n.ff-options .ff-team-selection-option {\n border-color: $ff-color--border;\n color: $ff-grey-800;\n border-bottom: 1px solid $ff-color--border;\n display: flex;\n align-items: center;\n\n .ff-option-content {\n padding: 12px 12px 12px 18px;\n display: flex;\n align-items: center;\n gap: 15px;\n width: 100%;\n\n &.selected {\n background: $ff-grey-200;\n }\n\n .ff-icon {\n width: 1.25rem;\n height: 1.25rem;\n }\n }\n}\n\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.section {\n margin-bottom: 15px;\n\n & > .title {\n position: relative;\n margin-bottom: 5px;\n display: flex;\n align-items: self-end;\n gap: 5px;\n\n .icon {\n color: $ff-indigo-700;\n }\n\n .counter {\n opacity: .6;\n font-size: 90%;\n }\n\n &:after {\n height: 2px;\n background: $ff-grey-200;\n content: '';\n flex: 1;\n align-self: center;\n }\n\n .text {\n &:focus {\n outline: 2px solid $ff-indigo-700;\n outline-offset: 2px;\n }\n }\n }\n\n .results {\n .result-wrapper {\n transition: ease-in-out .3s;\n padding: 2px 10px;\n border-radius: 5px;\n max-height: 90vh;\n overflow: auto;\n\n .result {\n display: flex;\n gap: 10px;\n align-items: center;\n line-height: 25px;\n\n .icon {}\n .title {}\n .details {\n flex: 1;\n opacity: .4;\n font-size: 90%;\n }\n .actions {\n display: flex;\n gap: 5px;\n }\n\n &:focus {\n background: $ff-indigo-50;\n border: none;\n outline: none;\n }\n }\n\n &:hover {\n background: $ff-indigo-50;\n }\n\n &.show-more {\n text-align: center;\n margin: 3px 0;\n\n a {\n padding: 5px 0;\n width: 100%;\n display: block;\n opacity: .6;\n\n &:focus {\n background: $ff-indigo-50;\n border: none;\n outline: none;\n }\n }\n }\n }\n }\n\n &:last-of-type {\n margin-bottom: 0;\n }\n}\n\n@media screen and (max-width: 480px) {\n .section {\n .results {\n .result-wrapper {\n .result {\n .actions {\n display: none;\n background: red;\n }\n }\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#global-search {\n .input-trigger {\n display: block;\n height: 34px;\n }\n .icon-trigger {\n display: none;\n cursor: pointer;\n padding: 5px;\n transition: ease-in-out .1s;\n object-fit: contain;\n }\n .ff-icon-sm.search {\n display: none;\n }\n\n &.focused {\n .input-trigger, .icon-trigger {\n display: none;\n }\n\n .ff-icon-sm.search {\n display: inline;\n }\n }\n\n}\n@media screen and (max-width: 1023px) {\n #global-search {\n .input-trigger {\n display: none;\n }\n .icon-trigger {\n display: inline-block;\n align-self: flex-end;\n\n &:hover {\n will-change: transform ;\n transform: scale(1.25) translateZ(0); /* Using slight adjustments to whole values */\n backface-visibility: hidden;\n perspective: 1000px;\n stroke-width: 1.5px;\n shape-rendering: geometricPrecision;\n text-rendering: geometricPrecision;\n color: $ff-indigo-500;\n }\n }\n }\n}\n\n//@media screen and (max-width: 639px) {\n// #global-search {\n// .content-wrapper {\n// .search-wrapper {\n// .input-wrapper {\n// flex-direction: row\n// }\n// }\n// }\n// }\n//}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#global-search {\n padding: 0;\n display: flex;\n flex: 1;\n justify-content: flex-end;\n max-width: 100%;\n\n .content-wrapper {\n position: relative;\n justify-content: flex-end;\n display: flex;\n flex-direction: column;\n gap: 10px;\n width: 100%;\n\n .search-wrapper {\n display: flex;\n gap: 5px;\n align-items: center;\n width: 100%;\n\n .mobile-search {\n display: none;\n cursor: pointer;\n color: $ff-white;\n min-width: 20px;\n min-height: 20px;\n }\n\n .close-button {\n display: none;\n }\n\n .input-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n position: relative;\n width: 100%;\n\n .ff-icon-sm.close,\n .ff-icon-sm.search {\n color: $ff-grey-400;\n position: absolute;\n z-index: 1;\n top: 8px;\n\n &.search {\n left: 7px;\n }\n\n &.close {\n right: 7px;\n }\n }\n\n input {\n color: transparent;\n padding: 6px 27px;\n background: $ff-grey-50;\n border-color: $ff-color--border;\n width: 100%;\n line-height: 20px;\n height: 34px;\n box-sizing: border-box;\n\n &.overlay-input {\n display: none;\n }\n }\n }\n }\n\n .results-wrapper {\n background: $ff-white;\n min-width: 100%;\n z-index: 120;\n padding: 5px 5px 15px 5px;\n\n .result-badge {\n padding: 0 5px;\n width: 50px;\n max-height: 25px;\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 5px;\n border: 1px solid $ff-indigo-700;\n color: $ff-indigo-700;\n border-radius: 5px;\n background: $ff-white;\n }\n }\n }\n\n &.focused {\n .content-wrapper {\n position: fixed;\n width: 60vw;\n background: white;\n top: 15px;\n left: 20vw;\n z-index: 120;\n border: none;\n border-radius: 5px;\n\n .search-wrapper {\n .input-wrapper {\n .ff-icon-sm.search,\n .ff-icon-sm.close {\n color: $ff-grey-500;\n }\n\n input {\n color: $ff-grey-500;\n flex: 1;\n background: white;\n display: none;\n width: 100%;\n\n &.overlay-input {\n display: block;\n transition: ease-in-out .3s;\n height: 34px;\n line-height: 20px;\n padding: 6px 27px;\n box-sizing: border-box;\n\n &.has-results {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n }\n }\n }\n\n .results-wrapper {\n overflow: auto;\n max-height: 90vh;\n\n .ff-icon-sm {\n min-width: 16px;\n }\n }\n }\n\n .overlay {\n position: absolute;\n width: 100vw;\n height: 100vh;\n background: rgba(0, 0, 0, .3);\n left: 0;\n top: 0;\n z-index: 110;\n }\n }\n\n}\n\n@media screen and (max-width: 1023px) {\n #global-search {\n padding: 0px;\n input.qwe {\n background: red !important;\n }\n &.focused {\n .content-wrapper {\n width: 100%;\n top: 0;\n left: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n\n .search-wrapper {\n margin: 5px;\n padding-right: 10px;\n .close-button {\n display: block;\n }\n\n }\n }\n }\n }\n}\n@media screen and (max-width: 639px) {\n #global-search {\n .content-wrapper {\n padding: 5px 0;\n\n .search-wrapper {\n .mobile-search {\n display: block;\n }\n\n .close,\n .search,\n input {\n display: none;\n }\n\n input {\n &.has-results {\n border-bottom-left-radius: 5px !important;\n border-bottom-right-radius: 5px !important;\n }\n }\n\n }\n }\n\n &.focused {\n .content-wrapper {\n padding: 10px;\n .mobile-search {\n display: none;\n }\n\n .search-wrapper {\n .close,\n .search,\n input {\n display: block;\n }\n }\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity .1s ease-in;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#right-drawer {\n position: fixed;\n border-left: 1px solid $ff-grey-300;\n background: $ff-grey-50;\n height: calc(100% - 60px);\n top: 60px;\n right: -1000px;\n z-index: 110;\n width: 100%;\n max-width: 0;\n min-width: 0;\n transition: right .3s ease-in-out, width .3s ease-in-out, max-width .3s ease-in-out, min-width .3s ease-in-out, box-shadow .3s ease-in-out, border-color .3s ease-in-out;\n box-shadow: -5px 4px 8px -4px rgba(0, 0, 0, 0.1);\n display: flex;\n flex-direction: column;\n overflow: hidden; // Changed from auto to hidden - let child components handle their own scrolling\n\n // Hide border when closed to prevent visible grey line\n &:not(.open) {\n border-left-color: transparent;\n }\n\n // Hide border on small viewports where drawer is full-width\n @media (max-width: 479px) {\n border-left: none;\n }\n\n .resize-bar {\n position: absolute;\n left: -4px; // Center on border (50% of 8px width)\n top: 0;\n bottom: 0;\n width: 8px;\n cursor: ew-resize;\n background: transparent;\n z-index: 1001;\n\n // Hide resize bar on small viewports where drawer is full-width\n @media (max-width: 479px) {\n display: none;\n }\n }\n\n .header {\n background: white;\n flex-shrink: 0;\n }\n\n &.open {\n right: 0;\n width: 100%;\n\n // On small viewports: use 100% width (no minimum)\n max-width: 100vw;\n min-width: 0;\n\n // On viewports 480-767px: use 480px minimum but no max-width constraint\n // (pinning is disabled, so let JS control the width)\n @media (min-width: 480px) and (max-width: 767px) {\n min-width: 480px;\n max-width: none;\n }\n\n // On viewports >= 768px: apply max-width constraints (pinning is enabled)\n @media (min-width: 768px) {\n max-width: 90vw;\n min-width: 480px;\n\n &.wider {\n max-width: 90vw;\n }\n }\n }\n\n &.fixed {\n position: relative; // Changed from initial to relative for resize bar positioning\n height: 100%;\n top: 0; // Reset top offset to prevent gap at top\n box-shadow: none; // Remove shadow when pinned\n flex-shrink: 0; // Prevent flex from shrinking the drawer below its set width\n min-width: unset; // Remove responsive min-width constraint\n max-width: none; // Remove responsive max-width constraint\n\n // Hide drawer when pinned but closed to prevent grey block\n &:not(.open) {\n width: 0 !important;\n min-width: 0 !important;\n max-width: 0 !important;\n overflow: hidden;\n opacity: 0;\n pointer-events: none;\n }\n }\n\n &.resizing {\n transition: none; // Disable transition while actively resizing for smooth dragging\n max-width: none !important; // Remove max-width constraint to allow free resizing\n min-width: unset !important; // Remove min-width constraint to allow free resizing\n }\n\n &.manually-resized {\n max-width: none !important; // Keep custom width after manual resize\n min-width: unset !important; // Keep custom width after manual resize\n }\n\n &.pinning {\n transition: none !important; // Disable all transitions while pinning to prevent visual jump\n }\n\n &.opening {\n // Only animate position during open, not width changes\n transition: right .3s ease-in-out, box-shadow .3s ease-in-out, border-color .3s ease-in-out !important;\n }\n\n &.closing {\n // Only animate position during close, not width changes\n transition: right .3s ease-in-out, box-shadow .3s ease-in-out, border-color .3s ease-in-out !important;\n\n // Maintain current width/max-width/min-width during slide-out to prevent shrinking animation\n // These will be overridden by inline styles from drawerStyle\n max-width: none !important;\n min-width: unset !important;\n }\n}\n",".ff-layout--box.ff-login {\n flex-direction: column;\n min-height: 660px;\n overflow: auto;\n\n .ff-layout--box--wrapper {\n max-width: 1048px;\n min-height: 660px;\n min-width: 400px;\n\n .ff-layout--box--right {\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n }\n .ff-layout--box--content {\n max-width: 380px;\n }\n }\n}\n","\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@import '../ui-components/stylesheets/ff-colors.scss';\n@import '../ui-components/stylesheets/ff-utility.scss';\n\n$sidenav_width: 250px;\n$transition_time: .15s;\n\n/*\n Layout - Box\n used in login/setup/signup screens\n*/\n\n$nav_height: 60px;\n\n.ff-layout--box {\n font-family: 'Heebo', system-ui, sans-serif;\n background-color: $ff-white;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n min-height: inherit;\n background-image: url(\"./images/ff-bg-flow.jpg\");\n background-size: cover;\n background-repeat: no-repeat;\n background-position-y: 0%;\n color: $ff-grey-700;\n .ff-error-inline {\n font-size: 0.875rem;;\n display: block;\n margin-top: 0.25rem;\n color: $ff-red-200;\n }\n\n &.ff--center-box {\n flex-direction: column;\n min-height: fit-content;\n overflow: auto;\n\n .ff-layout--box--wrapper {\n display: flex;\n width: 100%;\n max-height: fit-content;\n height: fit-content;\n\n .ff-layout--box--left,\n .ff-layout--box--right {\n width: 100%;\n }\n }\n }\n}\n\n.ff-layout--box--wrapper {\n width: calc(100% - 48px);\n height: 60%;\n display: grid;\n}\n.ff-layout--box--left {\n .ff-logo {\n max-width: 150px;\n margin-bottom: 16px;\n }\n}\n.ff-layout--box--right {\n .ff-logo {\n max-width: 200px;\n margin: auto;\n margin-bottom: 48px;\n }\n}\n\n.ff-layout--box--left,\n.ff-layout--box--right {\n height: 100%;\n justify-content: center;\n align-items: center;\n}\n\n.ff-layout--box--left {\n h1 {\n max-width: 420px;\n }\n h3 {\n font-size: 1.25rem;\n }\n p {\n font-weight: 300;\n line-height: 1.5rem;\n }\n}\n\n.ff-layout--box--content {\n width: 100%;\n}\n\n.ff-layout--box--right .ff-layout--box--content {\n min-height: 400px;\n padding: 64px 24px;\n @apply rounded-xl;\n color: $ff-grey-700;\n h2 {\n margin-top: -12px;\n margin-bottom: 24px;\n }\n h5 {\n font-weight: bold;\n margin-bottom: 0.75rem;\n }\n label {\n display: block;\n color: $ff-grey-700;\n margin-bottom: 4px;\n }\n .ff-radio-btn label {\n font-weight: normal;\n }\n p {\n margin-bottom: 1rem;\n }\n a {\n color: $ff-blue-600;\n }\n .ff-input:not(.ff-input--error) {\n border-color: $ff-grey-300;\n }\n .ff-input {\n border-width: 2px;\n &:focus-within {\n border-color: $ff-indigo-600;\n }\n }\n .ff-radio-btn {\n .checkbox {\n border: 1px solid $ff-grey-400;\n }\n }\n\n .ff-error-inline {\n margin-bottom: 12px;\n }\n\n .ff-actions {\n margin-top: 18px;\n }\n .ff-btn {\n text-transform: uppercase;\n width: 100%;\n margin-bottom: 6px;\n }\n .ff-btn.ff-btn--primary {\n background-color: $ff-indigo-600;\n color: white;\n &:hover {\n background-color: $ff-indigo-700;\n }\n &:disabled {\n background-color: $ff-grey-300;\n color: $ff-grey-400;\n }\n }\n .ff-btn.ff-btn--tertiary {\n color: $ff-indigo-500;\n font-weight: normal;\n border: 1px solid transparent;\n &:hover {\n background-color: transparent;\n border-color: $ff-indigo-600;\n }\n }\n}\n\n/*\n Layout - Platform / Plain\n used in all other pages\n*/\n\n.ff-layout--platform,\n.ff-layout--plain {\n min-height: inherit;\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n\n.ff-layout--platform--wrapper{\n padding-top: $nav_height;\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: row;\n\n .ff-view {\n display: flex;\n flex-direction: column;\n position: relative;\n overflow-y: auto;\n overflow-x: hidden;\n width: 100%;\n height: 100%;\n transition: ease-in-out margin-left .3s;\n }\n main {\n background-color: $ff-grey-50;\n }\n .ff-page-header {\n background-color: $ff-white;\n border-color: $ff-color--border;\n }\n}\n\n.ff-layout--plain--wrapper {\n height: 100%;\n display: flex;\n flex-direction: column;\n flex: 1;\n\n main {\n background-color: $ff-grey-50;\n flex: 1;\n }\n}\n\n.ff-notifications {\n position: absolute;\n right: 12px;\n top: $nav_height + 12px;\n z-index: 130;\n min-width: 350px;\n}\n\n.ff-notification-toast {\n min-height: $nav_height;\n margin-bottom: $ff-unit-md;\n}\n\n.notifications-list-move,\n.notifications-list-enter-active,\n.notifications-list-leave-active {\n transition: all 0.3s ease;\n}\n\n.notifications-list-enter-from,\n.notifications-list-leave-to {\n opacity: 0;\n transform: translateX(200px);\n}\n\n.notifications-list-leave-active {\n position: absolute;\n}\n\n.ff-team-selection {\n position: relative;\n display: flex;\n justify-content: space-between;\n min-width: $sidenav_width;\n .ff-dropdown-options {\n position: absolute;\n min-width: $sidenav_width;\n display: block;\n z-index: 10;\n border-bottom: 0;\n max-height: initial;\n &.active {\n display: block;\n }\n .ff-dropdown-option {\n padding: 0;\n border-bottom: none;\n }\n }\n}\n.ff-team-selection-name {\n margin-left: 10px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: flex-start;\n label {\n font-size: 0.7rem;\n line-height: 0.7rem;\n color: $ff-grey-500;\n margin-left: 0;\n }\n h5 {\n color: $ff-grey-800;\n white-space: nowrap;\n }\n}\n.ff-team-selection > div {\n flex-grow: 1;\n display: flex;\n align-items: center;\n cursor: pointer;\n}\n.ff-banner {\n background-color: $ff-grey-800;\n color: $ff-grey-300;\n padding: 8px;\n text-align: center;\n border-bottom: 2px solid $ff-red-500;\n\n &.ff-banner-info {\n background-color: $ff-blue-100;\n color: $ff-grey-700;\n text-align: left;\n border-bottom: none;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-left: 16px;\n padding-right: 16px;\n }\n\n &.ff-banner-warning {\n background-color: $ff-red-700;\n color: $ff-grey-50;\n text-align: left;\n border-bottom: 2px solid $ff-red-800;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-left: 16px;\n padding-right: 16px;\n }\n}\n.ff-header {\n z-index: 110;\n background-color: $ff-white;\n height: $nav_height;\n border-bottom: 1px solid $ff-color--border;\n display: flex;\n align-items: center;\n justify-content: space-between;\n position: fixed;\n width: 100%;\n .ff-logo-wrapper {\n display: flex;\n align-items: center;\n min-width: min-content;\n }\n img.ff-logo {\n padding-top: 18px;\n padding-bottom: 18px;\n height: $nav_height;\n width: auto;\n &:hover {\n cursor: pointer;\n }\n }\n .ff-header--mobile-toggle {\n padding: 16px;\n svg {\n fill: $ff-grey-800;\n min-width: 24px;\n }\n &.active {\n cursor: pointer;\n background-color: $ff-grey-700;\n }\n }\n .ff-header--mobile-usertoggle {\n padding: 16px;\n display: flex;\n align-items: center;\n img {\n padding: 0;\n min-width: 24px;\n }\n &.active {\n cursor: pointer;\n background-color: $ff-grey-100;\n }\n }\n .ff-navigation {\n position: absolute;\n display: flex;\n flex-direction: column;\n top: 100%;\n //margin-top: 2px;\n img {\n padding: 0;\n margin-right: 9px;\n }\n .ff-user {\n display: flex;\n align-items: center;\n margin-left: -2px;\n position: relative;\n transition: ease-in-out .1s;\n object-fit: contain;\n will-change: transform;\n .ff-notification-pill {\n font-size: 0.65rem;\n padding: 0px 6px;\n background-color: $ff-red-600;\n border: 1px solid $ff-grey-800;\n position: absolute;\n bottom: -9px;\n line-height: 0.85rem;\n right: 0;\n }\n &:hover {\n transform: scale(1.25) translateZ(0); /* Using slight adjustments to whole values */\n backface-visibility: hidden;\n perspective: 1000px;\n stroke-width: 1.5px;\n shape-rendering: geometricPrecision;\n text-rendering: geometricPrecision;\n }\n }\n }\n .ff-border-left {\n border-width: 0 0 0 1px;\n border-color: $ff-grey-500;\n }\n .ff-navigation-right {\n height: 100%;\n ul {\n background: $ff-white;\n border: 1px solid $ff-color--border;\n\n .ff-nav-item {\n transition: ease-in-out .3s;\n &:hover {\n background: $ff-grey-100;\n label, svg {\n color: $ff-indigo-700;\n fill: $ff-indigo-700;\n }\n }\n }\n }\n }\n .ff-desktop-navigation-right {\n & > * {\n position: relative;\n &:after {\n position: absolute;\n content: '';\n width: 1px;\n height: 15px;\n background: $ff-color--border;\n top: 40%;\n }\n }\n }\n .ff-mobile-navigation-right {\n img,\n button {\n cursor: pointer;\n }\n }\n\n@media screen and (max-width: 1023px) {\n .ff-mobile-navigation-right {\n .ff-header--mobile-teamtoggle {\n display: flex;\n align-items: center;\n .ff-avatar {\n border: 2px solid #1f2937;\n transition: ease-in-out .1s;\n }\n &:hover {\n .ff-avatar {\n will-change: transform;\n transform: scale(1.25) translateZ(0);\n backface-visibility: hidden;\n perspective: 1000px;\n border-color: $ff-indigo-600;\n }\n }\n }\n }\n}\n .ff-dropdown {\n color: white;\n min-width: $sidenav_width;\n position: relative;\n top: 0;\n margin-top: 0;\n .ff-dropdown-selected {\n background: none;\n padding: 16px 16px 16px 24px;\n display: flex;\n flex: 1;\n justify-content: space-between;\n align-items: center;\n border: none;\n border-radius: 0;\n }\n .ff-dropdown-options {\n width: 100%;\n border-color: $ff-color--border;\n border-right: 0;\n\n .ff-dropdown-option {\n &:hover {\n label, svg {\n color: $ff-indigo-700;\n fill: $ff-indigo-700;\n }\n }\n }\n }\n }\n .ff-user-options {\n width: auto;\n min-width: $nav_height;\n\n &.ff-navigation {\n left: auto;\n }\n .ff-dropdown-options {\n width: $sidenav_width;\n }\n }\n}\n\n.ff-user-options {\n .ff-dropdown-options {\n max-height: initial;\n .ff-dropdown-option {\n border-bottom: none;\n\n &.danger {\n label, svg {\n color: $ff-red-700;\n fill: $ff-red-700;\n }\n }\n }\n }\n}\n\n\n.ff-navigation,\n.ff-team-selection ul {\n .ff-nav-item {\n &:hover {\n cursor: pointer;\n }\n }\n}\n\n.ff-navigation .ff-nav-item {\n border-bottom: 1px solid $ff-grey-600;\n padding: 16px 16px 16px 24px;\n display: grid;\n grid-template-columns: 20px 1fr;\n svg {\n fill: $ff-grey-500;\n width: 20px;\n }\n svg.hollow {\n fill: none;\n stroke: $ff-white;\n }\n label {\n margin-left: 12px;\n color: $ff-grey-800;\n white-space: nowrap;\n pointer-events: none;\n }\n}\n\n.ff-team-selection ul .ff-nav-item {\n border-bottom: 1px solid $ff-grey-600;\n padding: 16px 16px 16px 22px;\n display: grid;\n align-items: center;\n grid-template-columns: 24px 1fr;\n height: $nav_height;\n svg {\n fill: $ff-white;\n width: 20px;\n }\n label {\n margin-left: 12px;\n color: $ff-white;\n white-space: nowrap;\n pointer-events: none;\n }\n}\n\n.ff-navigation {\n position: fixed;\n left: -$sidenav_width;\n z-index: 10;\n transition: 0.3s left, 0.3s right;\n -webkit-transition: 0.3s left, 0.3s right;\n width: $sidenav_width;\n // handle router-link active styling for primary options\n .ff-side-navigation--primary {\n width: 100%;\n transition: $transition_time width;\n -webkit-transition: $transition_time width;\n .router-link-active {\n li {\n label {\n color: $ff-teal-300;\n }\n svg {\n fill: $ff-teal-300;\n &.hollow {\n fill: none;\n stroke: $ff-teal-300;\n }\n }\n }\n }\n }\n // nested menu options, including router-link highlighting\n .ff-side-navigation--nested {\n width: 0;\n overflow: hidden;\n .ff-nested-title {\n color: $ff-teal-300;\n font-weight: bold;\n font-size: 1.1rem;\n padding: 12px 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .ff-nav-item {\n padding: 12px 16px;\n }\n .router-link-active {\n li {\n background-color: $ff-grey-600;\n }\n label {\n color: $ff-teal-300;\n }\n svg {\n fill: $ff-teal-300;\n &.hollow {\n fill: none;\n stroke: $ff-teal-300;\n }\n }\n }\n }\n // navigation-right = the admin/user settings\n &.ff-navigation-right {\n left: initial;\n right: -$sidenav_width;\n .ff-nav-item {\n &.danger {\n label, svg {\n color: $ff-red-700;\n fill: $ff-red-700;\n }\n }\n &.create {\n background: $ff-grey-100;\n border-bottom: none;\n }\n }\n\n &.without-divider {\n .ff-nav-item:last-child {\n border-top: unset;\n }\n }\n }\n &.open {\n left: 0;\n }\n &.closed {\n left: -$sidenav_width;\n }\n &.ff-navigation-right.open {\n left: initial;\n right: 0;\n }\n .ff-navigation-divider {\n background-color: $ff-grey-900;\n color: white;\n padding: 6px 12px;\n height: 32px;\n display: block;\n font-size: 0.85rem;\n border-bottom: 1px solid $ff-grey-600;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n }\n .ff-dropdown-options .ff-dropdown-option {\n padding: 0;\n }\n .ff-nav-item {\n display: flex;\n justify-content: space-between;\n border-bottom: 1px solid $ff-color--border;\n }\n .disabled {\n pointer-events: none;\n opacity: 0.5;\n }\n .ff-notification-pill {\n padding: 2px 12px;\n background-color: $ff-red-600;\n border: 1px solid $ff-red-700;\n }\n .ff-side-navigation--options-back {\n li {\n border-top: 1px solid $ff-grey-600;\n }\n }\n}\n\n/* MOBILE LAYOUT */\n@media screen and (min-width: $ff-screen-lg) {\n /* Box */\n .ff-layout--box--wrapper {\n width: 85%;\n }\n .ff-navigation {\n left: 0;\n position: relative;\n }\n .ff-header {\n .ff-header--mobile-toggle {\n display: none;\n }\n .ff-header--mobile-usertoggle,\n .ff-header--mobile-teamtoggle,\n .ff-header--mobile-notificationstoggle,\n .ff-header--mobile-experttoggle {\n display: none;\n }\n .ff-logo-wrapper {\n width: 250px;\n }\n img.ff-logo {\n padding: 18px;\n }\n }\n}\n\n#ff-app {\n #left-drawer {\n min-width: $sidenav_width;\n position: relative;\n transition: ease-in-out left .3s;\n height: 100%;\n z-index: 100;\n left: 0;\n background: $ff-color--context-menu;\n border-right: 1px solid $ff-color--border;\n overflow: auto;\n\n .ff-main-navigation {\n .ff-menu-groups {\n padding-top: 10px;\n\n .ff-menu-group {\n padding: 5px;\n\n .ff-group-title {\n margin: 10px 0 15px;\n padding: 0 10px;\n text-transform: uppercase;\n color: $ff-color--disabled;\n font-size: 11px;\n }\n\n .ff-menu-entries {\n\n .ff-menu-entry {\n margin: 0 10px 5px 10px;\n\n &:last-of-type {\n margin-bottom: 0;\n }\n\n .ff-nav-item {\n padding: 5px 10px;\n border-radius: 5px;\n .ff-tooltip-container {\n max-height: 20px;\n }\n\n & > div {\n gap: 5px;\n }\n\n &:hover {\n background: $ff-color--highlight--light;\n }\n }\n\n .router-link-active {\n .ff-nav-item {\n background: $ff-color--action;\n color: white;\n }\n }\n\n .disabled {\n .ff-nav-item {\n color: $ff-color--disabled;\n cursor: not-allowed;\n }\n }\n }\n }\n }\n }\n }\n }\n\n &.hidden-left-drawer {\n #left-drawer {\n left: -$sidenav_width;\n\n &.active {\n left: -$sidenav_width;\n }\n }\n .ff-view {\n margin-left: -$sidenav_width;\n }\n }\n}\n\n\n/* CSS Media Query for Mobile */\n@media screen and (max-width: 1023px) {\n #ff-app {\n #left-drawer {\n left: -$sidenav_width;\n transition: ease-in-out .3s;\n will-change: box-shadow;\n\n &.active {\n box-shadow: 6px 0 12px rgba(0, 0, 0, 0.2);\n left: 0;\n }\n }\n\n .ff-view {\n margin-left: -$sidenav_width;\n }\n }\n}\n",".fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.3s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n\n\n.mobile-menu-fade-enter-active,\n.mobile-menu-fade-leave-active {\n transition: opacity 0.1s ease-in;\n}\n\n.mobile-menu-fade-enter-from,\n.mobile-menu-fade-leave-to {\n opacity: 0;\n}\n\n\n.primary-fade-enter-active,\n.primary-fade-leave-active {\n transition: opacity 0.1s ease-in;\n}\n.primary-fade-enter-from,\n.primary-fade-leave-to {\n opacity: 0;\n}\n\n.page-fade-enter-active, .page-fade-leave-active {\n transition: opacity .2s ease-in-out;\n}\n\n.page-fade-enter, .page-fade-leave-to {\n opacity: 0;\n}\n",".jiggle {\n animation: jiggle 0.3s infinite;\n}\n@keyframes jiggle {\n 0%, 100% {\n transform: rotate(0deg);\n }\n 25% {\n transform: rotate(3deg);\n }\n 50% {\n transform: rotate(-3deg);\n }\n 75% {\n transform: rotate(3deg);\n }\n}\n\n.pulse-scale {\n animation: pulse-scale 1.5s infinite ease-in-out;\n}\n\n@keyframes pulse-scale {\n 0% {\n transform: scale(1);\n }\n 50% {\n transform: scale(1.5);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n.pulse {\n animation: pulse-animation 2s infinite;\n}\n@keyframes pulse-animation {\n 0% {\n box-shadow: 0 0 0 0px rgba(0, 0, 0, 0.2);\n }\n 100% {\n box-shadow: 0 0 0 20px rgba(0, 0, 0, 0);\n }\n}\n",".ff-chart {\n padding: 8px 18px;\n border: 1px solid $ff-grey-300;\n border-radius: 6px;\n background-color: white;\n h3 {\n margin: 0;\n }\n}\n\n.ff-chart-device-status {\n display: flex;\n gap: 4px;\n label {\n display: block;\n }\n .ff-chart-bar {\n text-align: right;\n border-right: 1px solid;\n border-color: var(--bar-border);\n color: var(--text-color);\n transition: 0.3s opacity;\n >div, >label {\n padding: 3px 6px;\n font-size: 0.875rem;\n font-weight: 600;\n }\n > div {\n border-width: 1px 0px 1px 1px;\n border-style: solid;\n background-color: var(--bar-bg);\n border-color: var(--bar-border);\n transition: 0.3s background-color, 0.3s color, 0.3s opacity;\n }\n &:hover {\n >div {\n background-color: var(--bar-border);\n }\n }\n label {\n text-transform: capitalize;\n }\n &:hover {\n cursor: pointer;\n }\n &--error {\n --bar-bg: #{$ff-red-200};\n --bar-border: #{$ff-red-300};\n --text-color: #{$ff-red-600};\n }\n &--never,\n &--stopped {\n --bar-bg: #{$ff-grey-200};\n --bar-border: #{$ff-grey-300};\n --text-color: #{$ff-grey-600};\n }\n &--offline {\n --bar-bg: #{$ff-grey-50};\n --bar-border: #{$ff-grey-300};\n --text-color: #{$ff-grey-600};\n }\n &--safe {\n --bar-bg: #{$ff-yellow-200};\n --bar-border: #{$ff-yellow-300};\n --text-color: #{$ff-yellow-600};\n }\n &--running {\n --bar-bg: #{$ff-green-200};\n --bar-border: #{$ff-green-300};\n --text-color: #{$ff-green-600};\n }\n &.ghost {\n opacity: 0.15;\n }\n }\n}\n","@import '../ui-components/stylesheets/ff-colors.scss';\n\n@import \"./layouts.scss\";\n@import \"./transitions.scss\";\n@import \"./animations.scss\";\n@import \"./components/charts.scss\";\n\n/* Define Font Family */\n/* latin */\n@font-face {\n font-family: 'Heebo';\n font-style: normal;\n font-weight: 400;\n src: url('./assets/fonts/Heebo-Regular.ttf') format('ttf');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/* Define Global Styles */\n\nhtml, body, #app {\n height: 100%;\n display: flex;\n flex-direction: column;\n flex: 1;\n}\n\nh1, h2, h3 {\n font-weight: 500;\n}\n\n#ff-app {\n flex: 1;\n background-color: $ff-grey-300;\n}\n\n.ff-link {\n color: $ff-blue-700;\n &:hover {\n cursor: pointer;\n color: $ff-blue-900;\n text-decoration: underline;\n }\n}\n\n.ff-avatar {\n width: 24px;\n height: 24px;\n border-radius: 4px;\n}\n.ff-avatar-large {\n width: 48px;\n height: 48px;\n border-radius: 8px;\n}\n.ff-bg-dark {\n background-color: $ff-grey-800;\n .ff-btn.ff-btn--primary {\n background-color: $ff-teal-600;\n &:hover {\n background-color: $ff-teal-700;\n }\n }\n}\n\n.ff-loading {\n width: 100%;\n height: 100%;\n h4 {\n font-size: 1.5rem;\n margin-top: 1rem;\n font-weight: 600;\n }\n &.theme-light {\n color: $ff-grey-900;\n }\n &.theme-dark {\n color: white;\n }\n}\n\n.ff-icon.ff-clickable {\n cursor: pointer;\n path, circle, rect {\n transition: 0.3s color, 0.3s stroke, 0.3s fill;\n -webkit-transition: 0.3s color, 0.3s stroke, 0.3s fill;\n }\n &:hover {\n color: $ff-blue-600;\n }\n}\n\n.ff-icon-xl {\n width: 48px;\n height: 48px;\n stroke-width: 1px;\n}\n\n.ff-dialog-box a {\n color: $ff-blue-600;\n &:hover {\n color: $ff-blue-800;\n }\n}\n\n.ff-dialog-box--info {\n p {\n margin-bottom: 12px;\n }\n img {\n width: 150px;\n height: 150px;\n }\n}\n\n.ff-no-data {\n background-color: $ff-grey-100;\n color: $ff-grey-400;\n font-size: 0.875rem;\n border: $ff-grey-200 solid 1px;\n padding: 12px;\n text-align: center;\n\n &.ff-no-data-large {\n padding: 64px 12px;\n }\n\n &--boxed {\n @extend .ff-no-data;\n\n .message {\n display: block;\n text-align: center;\n margin: 10px 0 10px;\n padding: 10px 0 10px;\n border: 1px solid $ff-grey-300;\n }\n }\n}\n\nlabel {\n cursor: inherit;\n}\n\n::placeholder { /* Chrome, Firefox, Opera, Safari 10.1+ */\n color: $ff-grey-400 !important;\n opacity: 1; /* Firefox */\n}\n\n/* Ensure headlessui MenuItem pointer for active `menuitem` anchors */\n[role=\"menu\"] a[role=\"menuitem\"] {\n cursor: pointer\n}\n\n.ff-dialog-fixed-height .ff-dialog-content {\n overflow-y: visible;\n}\n\n.ff-breadcrumbs {\n display: flex;\n align-items: center;\n label {\n color: $ff-blue-600;\n cursor: pointer;\n &:hover {\n text-decoration: underline;\n }\n }\n span:last-child label {\n pointer-events: none;\n color: black;\n }\n}\n\n// Handle nested buttons in a data table\n\n.ff-data-table--cell a:not(.ff-btn):hover,\n.ff-data-table--cell a:hover svg.ff-icon {\n color: $ff-blue-600;\n}\n\n.ff-data-table--data .ff-data-table--row--nested .ff-data-table--cell {\n background-color: $ff-grey-50;\n &:first-child {\n padding-left: 36px;\n }\n}\n\n.ff-data-table--data .ff-data-table--row--nested.selectable:hover .ff-data-table--cell {\n background-color: $ff-grey-100;\n}\n\n.ff-page-banner {\n border-radius: 5px;\n background-color: $ff-blue-100;\n color: $ff-grey-600;\n text-align: left;\n border: 1px solid $ff-blue-300;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 16px;\n\n &.minimal {\n background: none;\n border: none;\n border-radius: 0;\n }\n}\n\n.clipped-overflow {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n\n // number of lines to clip to\n &--two-lines {\n -webkit-line-clamp: 2;\n }\n &--three-lines {\n -webkit-line-clamp: 3;\n }\n &--four-lines {\n -webkit-line-clamp: 4;\n }\n}\n","@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n /* .forge-block {\n @apply bg-white;\n @apply shadow;\n @apply rounded;\n @apply mx-2;\n @apply sm:mx-4;\n @apply py-6;\n @apply px-2;\n @apply sm:px-6;\n @apply lg:px-8;\n @apply mb-1;\n } */\n\n .forge-inner-block {\n @apply py-6;\n }\n\n .forge-link {\n @apply underline;\n @apply hover:cursor-pointer;\n @apply hover:text-blue-600;\n }\n\n .forge-button {\n @apply px-3;\n @apply py-1;\n @apply bg-blue-900;\n @apply border;\n @apply border-blue-900;\n @apply hover:bg-indigo-700;\n @apply text-white;\n @apply hover:text-gray-100;\n @apply focus:text-gray-300;\n @apply rounded-md;\n @apply inline-flex;\n @apply items-center;\n @apply text-sm;\n @apply focus:outline-none;\n @apply focus:ring-2;\n @apply focus:ring-offset-2;\n @apply focus:ring-offset-gray-600;\n @apply focus:ring-gray-400;\n\n @apply disabled:opacity-30;\n @apply disabled:cursor-not-allowed;\n }\n\n .forge-button-secondary {\n @apply forge-button;\n @apply bg-gray-100;\n @apply border-gray-300;\n @apply hover:bg-gray-300;\n @apply hover:border-gray-300;\n @apply text-gray-500;\n @apply hover:text-gray-600;\n @apply focus:text-gray-700;\n }\n\n .forge-button-tertiary {\n @apply forge-button-secondary;\n @apply bg-white;\n @apply hover:bg-gray-100;\n }\n\n .forge-button-inline {\n @apply forge-button-secondary;\n @apply border-transparent;\n @apply bg-white;\n @apply hover:bg-gray-100;\n }\n\n .forge-button-inline-inactive {\n @apply forge-button-inline;\n pointer-events: none;\n }\n\n .forge-button-danger {\n @apply forge-button;\n @apply bg-white;\n @apply border-red-700;\n @apply hover:bg-red-700;\n @apply text-red-700;\n @apply hover:text-white;\n @apply focus:text-white;\n @apply focus:bg-red-700;\n\n @apply disabled:border-gray-500;\n @apply disabled:text-gray-600;\n @apply disabled:bg-white;\n @apply disabled:cursor-not-allowed;\n }\n\n .forge-button-small {\n @apply px-2;\n @apply py-1;\n @apply text-xs;\n }\n\n\n .forge-button-set > :first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n border-right: none;\n }\n .forge-button-set > :last-child button {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n border-left: none;\n }\n\n .forge-nav-item {\n @apply flex items-center;\n @apply pb-3;\n @apply border-b-4 border-b-transparent;\n }\n .forge-nav-item:not(.forge-nav-item-active) {\n @apply text-sm;\n }\n .forge-nav-item:not(.forge-nav-item-active):hover {\n @apply text-blue-700;\n @apply border-b-4;\n @apply border-gray-400;\n }\n\n .forge-nav-item-active {\n @apply text-sm;\n @apply text-blue-700;\n @apply border-b-4;\n @apply border-blue-700;\n }\n .forge-badge {\n @apply border;\n @apply rounded-full;\n @apply text-xs;\n @apply px-2;\n @apply py-1;\n @apply inline-flex;\n @apply items-center;\n }\n .forge-status-error,\n .forge-status-crashed {\n @apply bg-red-100;\n @apply border-red-400;\n @apply text-red-600;\n }\n .forge-status-suspended {\n @apply bg-red-200;\n @apply border-red-400;\n @apply text-red-600;\n }\n .forge-status-stopped {\n @apply bg-gray-100;\n @apply border-gray-300;\n @apply border-dashed;\n @apply text-gray-700;\n }\n .forge-status-info {\n @apply bg-gray-100;\n @apply border-gray-300;\n @apply border-dashed;\n @apply text-gray-800;\n }\n .forge-status-starting {\n @apply bg-green-100;\n @apply border-green-300;\n @apply border-dashed;\n @apply text-green-700;\n }\n .forge-status-safe {\n @apply bg-yellow-200;\n @apply border-yellow-400;\n @apply text-yellow-600;\n }\n .forge-status-warning {\n @apply bg-yellow-400;\n @apply border-yellow-700;\n @apply text-yellow-900;\n }\n .forge-status-success,\n .forge-status-connected,\n .forge-status-running {\n @apply bg-green-200;\n @apply border-green-400;\n @apply text-green-700;\n }\n .forge-status-importing {\n @apply bg-green-100;\n @apply border-green-300;\n @apply border-dashed;\n @apply text-green-700;\n }\n\n .forge-minimal-status-error,\n .forge-minimal-status-crashed{\n @apply bg-red-600;\n }\n .forge-minimal-status-stopped,\n .forge-minimal-status-suspended,\n .forge-minimal-status-suspending,\n .forge-minimal-status-info,\n .forge-minimal-status-offline{\n @apply bg-gray-300;\n }\n .forge-minimal-status-success,\n .forge-minimal-status-connected,\n .forge-minimal-status-protected,\n .forge-minimal-status-running,\n .forge-minimal-status-importing,\n .forge-minimal-status-safe,\n .forge-minimal-status-warning,\n .forge-minimal-status-starting,\n .forge-minimal-status-info,\n .forge-minimal-status-pushing,\n .forge-minimal-status-pulling,\n .forge-minimal-status-loading,\n .forge-minimal-status-rollback,\n .forge-minimal-status-installing,\n .forge-minimal-status-updating,\n .forge-minimal-status-restarting{\n @apply bg-green-400;\n }\n\n .forge-badge-devmode {\n @apply bg-purple-100;\n @apply border-purple-600;\n @apply text-purple-700;\n }\n .forge-badge-fleetmode {\n @apply bg-teal-100;\n @apply border-teal-600;\n @apply text-teal-700;\n }\n\n th {\n @apply text-left;\n @apply font-medium;\n }\n\n input[type=\"text\"],\n input[type=\"password\"],\n input[type=\"radio\"],\n input[type=\"checkbox\"],\n select,\n textarea,\n .uneditable {\n @apply text-sm;\n @apply appearance-none;\n @apply rounded;\n @apply relative;\n @apply font-normal;\n @apply px-2;\n @apply py-1;\n @apply border;\n @apply border-gray-300;\n @apply placeholder-gray-500;\n @apply text-gray-600;\n }\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n @apply mr-2;\n @apply p-2;\n }\n .uneditable {\n @apply border-opacity-0;\n }\n\n input[type=\"text\"]:focus,\n input[type=\"password\"]:focus,\n input[type=\"radio\"]:focus,\n input[type=\"checkbox\"]:focus,\n select:focus,\n textarea:focus {\n @apply outline-none;\n @apply ring-0;\n @apply border-indigo-500;\n }\n input[type=\"text\"]:disabled,\n input[type=\"password\"]:disabled,\n input[type=\"radio\"]:disabled,\n input[type=\"checkbox\"]:disabled,\n select:disabled,\n textarea:disabled {\n @apply cursor-not-allowed;\n @apply opacity-60;\n }\n\n /* Make sure forge-log-entry-level-* all appear in tailwind.config.js safelist */\n .forge-log-entry-level-system {\n @apply text-blue-400;\n }\n .forge-log-entry-level-info {\n @apply text-gray-100;\n }\n .forge-log-entry-level-warn {\n @apply text-yellow-300;\n }\n .forge-log-entry-level-error {\n @apply text-red-400;\n }\n}\n\n@layer components {\n .ff-layout--box--left,\n .ff-layout--box--right {\n @apply p-0 md:p-12;\n }\n .ff-layout--box--right .ff-layout--box--content {\n @apply rounded-none md:rounded-xl m-auto;\n }\n}\n","/*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n/*\nDocument\n========\n*/\n\n/**\nUse a better box model (opinionated).\n*/\n\n*,\n::before,\n::after {\n\tbox-sizing: border-box;\n}\n\n/**\nUse a more readable tab size (opinionated).\n*/\n\nhtml {\n\t-moz-tab-size: 4;\n\ttab-size: 4;\n}\n\n/**\n1. Correct the line height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n*/\n\nhtml {\n\tline-height: 1.15; /* 1 */\n\t-webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/*\nSections\n========\n*/\n\n/**\nRemove the margin in all browsers.\n*/\n\nbody {\n\tmargin: 0;\n}\n\n/**\nImprove consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n*/\n\nbody {\n\tfont-family:\n\t\tsystem-ui,\n\t\t-apple-system, /* Firefox supports this but not yet `system-ui` */\n\t\t'Segoe UI',\n\t\tRoboto,\n\t\tHelvetica,\n\t\tArial,\n\t\tsans-serif,\n\t\t'Apple Color Emoji',\n\t\t'Segoe UI Emoji';\n}\n\n/*\nGrouping content\n================\n*/\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\nhr {\n\theight: 0; /* 1 */\n\tcolor: inherit; /* 2 */\n}\n\n/*\nText-level semantics\n====================\n*/\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr[title] {\n\ttext-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n\tfont-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n\tfont-family:\n\t\tui-monospace,\n\t\tSFMono-Regular,\n\t\tConsolas,\n\t\t'Liberation Mono',\n\t\tMenlo,\n\t\tmonospace; /* 1 */\n\tfont-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n\tfont-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n\tfont-size: 75%;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsub {\n\tbottom: -0.25em;\n}\n\nsup {\n\ttop: -0.5em;\n}\n\n/*\nTabular data\n============\n*/\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\ntable {\n\ttext-indent: 0; /* 1 */\n\tborder-color: inherit; /* 2 */\n}\n\n/*\nForms\n=====\n*/\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n\tfont-family: inherit; /* 1 */\n\tfont-size: 100%; /* 1 */\n\tline-height: 1.15; /* 1 */\n\tmargin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n1. Remove the inheritance of text transform in Firefox.\n*/\n\nbutton,\nselect { /* 1 */\n\ttext-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n\t-webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n::-moz-focus-inner {\n\tborder-style: none;\n\tpadding: 0;\n}\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n:-moz-focusring {\n\toutline: 1px dotted ButtonText;\n}\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n:-moz-ui-invalid {\n\tbox-shadow: none;\n}\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\nlegend {\n\tpadding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n\tvertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n\theight: auto;\n}\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n\t-webkit-appearance: textfield; /* 1 */\n\toutline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n::-webkit-file-upload-button {\n\t-webkit-appearance: button; /* 1 */\n\tfont: inherit; /* 2 */\n}\n\n/*\nInteractive\n===========\n*/\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n\tdisplay: list-item;\n}\n","/**\n * Manually forked from SUIT CSS Base: https://github.com/suitcss/base\n * A thin layer on top of normalize.css that provides a starting point more\n * suitable for web applications.\n */\n\n/**\n * Removes the default spacing and border for appropriate elements.\n */\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nbutton {\n background-color: transparent;\n background-image: none;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nol,\nul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/**\n * Tailwind custom reset styles\n */\n\n/**\n * 1. Use the user's configured `sans` font-family (with Tailwind's default\n * sans-serif font stack as a fallback) as a sane default.\n * 2. Use Tailwind's default \"normal\" line-height so the user isn't forced\n * to override it to ensure consistency even when using the default theme.\n */\n\nhtml {\n font-family: theme('fontFamily.sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"); /* 1 */\n line-height: 1.5; /* 2 */\n}\n\n\n/**\n * Inherit font-family and line-height from `html` so users can set them as\n * a class directly on the `html` element.\n */\n\nbody {\n font-family: inherit;\n line-height: inherit;\n}\n\n/**\n * 1. Prevent padding and border from affecting element width.\n *\n * We used to set this in the html element and inherit from\n * the parent element for everything else. This caused issues\n * in shadow-dom-enhanced elements like <details> where the content\n * is wrapped by a div with box-sizing set to `content-box`.\n *\n * https://github.com/mozdevs/cssremedy/issues/4\n *\n *\n * 2. Allow adding a border to an element by just adding a border-width.\n *\n * By default, the way the browser specifies that an element should have no\n * border is by setting it's border-style to `none` in the user-agent\n * stylesheet.\n *\n * In order to easily add borders to elements by just setting the `border-width`\n * property, we change the default border-style for all elements to `solid`, and\n * use border-width to hide them instead. This way our `border` utilities only\n * need to set the `border-width` property instead of the entire `border`\n * shorthand, making our border utilities much more straightforward to compose.\n *\n * https://github.com/tailwindcss/tailwindcss/pull/116\n */\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: currentColor; /* 2 */\n}\n\n/*\n * Ensure horizontal rules are visible by default\n */\n\nhr {\n border-top-width: 1px;\n}\n\n/**\n * Undo the `border-style: none` reset that Normalize applies to images so that\n * our `border-{width}` utilities have the expected effect.\n *\n * The Normalize reset is unnecessary for us since we default the border-width\n * to 0 on all elements.\n *\n * https://github.com/tailwindcss/tailwindcss/issues/362\n */\n\nimg {\n border-style: solid;\n}\n\ntextarea {\n resize: vertical;\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1;\n color: theme('colors.gray.400', #a1a1aa);\n}\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/**\n * Override legacy focus reset from Normalize with modern Firefox focus styles.\n *\n * This is actually an improvement over the new defaults in Firefox in our testing,\n * as it triggers the better focus styles even for links, which still use a dotted\n * outline in Firefox by default.\n */\n \n:-moz-focusring {\n\toutline: auto;\n}\n\ntable {\n border-collapse: collapse;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/**\n * Reset links to optimize for opt-in styling instead of\n * opt-out.\n */\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/**\n * Reset form element properties that are easy to forget to\n * style explicitly so you don't inadvertently introduce\n * styles that deviate from your design system. These styles\n * supplement a partial reset that is already applied by\n * normalize.css.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n padding: 0;\n line-height: inherit;\n color: inherit;\n}\n\n/**\n * Use the configured 'mono' font family for elements that\n * are expected to be rendered with a monospace font, falling\n * back to the system monospace stack if there is no configured\n * 'mono' font family.\n */\n\npre,\ncode,\nkbd,\nsamp {\n font-family: theme('fontFamily.mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);\n}\n\n/**\n * 1. Make replaced elements `display: block` by default as that's\n * the behavior you want almost all of the time. Inspired by\n * CSS Remedy, with `svg` added as well.\n *\n * https://github.com/mozdevs/cssremedy/issues/14\n * \n * 2. Add `vertical-align: middle` to align replaced elements more\n * sensibly by default when overriding `display` by adding a\n * utility like `inline`.\n *\n * This can trigger a poorly considered linting error in some\n * tools but is included by design.\n * \n * https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210\n */\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/**\n * Constrain images and videos to the parent width and preserve\n * their intrinsic aspect ratio.\n *\n * https://github.com/mozdevs/cssremedy/issues/14\n */\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/**\n * Ensure the default browser behavior of the `hidden` attribute.\n */\n\n[hidden] {\n display: none;\n}\n",null,"@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-divider {\n width: 100%;\n height: 1px;\n background-color: $ff-grey-200;\n margin-top: 12px;\n margin-bottom: 12px;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-combobox {\n min-width: 200px;\n\n &[data-headlessui-state=\"open\"] {\n input {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n\n .ff-combobox-input {\n padding: 5px 2.5rem 5px 10px;\n border: 1px solid $ff-grey-300;\n font-size: $ff-funit-md;\n line-height: 1.5;\n &:focus {\n border-color: $ff-grey-300;\n outline: none;\n }\n }\n\n .ff-options {\n background: $ff-grey-50;\n box-shadow: 0 6px 9px 0 #00000038;\n max-height: 14rem;\n z-index: 100;\n overflow-y: auto;\n padding: 0;\n border-left: 1px solid $ff-grey-200;\n border-right: 1px solid $ff-grey-200;\n border-bottom: 1px solid $ff-grey-200;\n }\n\n .ff-option {\n cursor: pointer;\n border-bottom: 1px solid $ff-grey-200;\n\n &:last-of-type {\n border-bottom: none;\n }\n\n .ff-option-content {\n padding: $ff-unit-sm $ff-unit-md;\n border: 1px solid transparent;\n\n &.selected {\n background-color: $ff-grey-200;\n }\n\n &.active {\n border: 1px solid $ff-indigo-300;\n }\n\n &.selected.active {\n border-color: transparent;\n }\n }\n\n &:hover {\n background-color: $ff-grey-200;\n .ff-option-content.active {\n border-color: transparent;\n }\n }\n }\n}\n"],"names":[],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"main.04644232882c9fc8d0dd.css","mappings":"AAIA,EACI,sBAGJ,wBACI,aACA,uHACA,+HAGJ,KACI,+MACA,eACA,oBAGJ,KACI,SACA,aCTU,CDUV,kBACA,gBAGJ,GACI,iBACA,cENU,CFOV,mBACA,kBEhBS,CFmBb,GACI,iBACA,gBEdU,CFeV,qBACA,iBEzBS,CF4Bb,GACI,cErBU,CFsBV,oBACA,iBE/BS,CFgCT,iBAGJ,GACI,cE5BU,CF6BV,sBACA,iBEtCS,CFuCT,gBAGJ,KACI,iBE3CS,CF4CT,yBACA,WE5CS,CF+Cb,OACI,cAGJ,gBACI,gBE9CU,CF+CV,aC1DU,CELd,SACE,WACA,YACA,qBAGF,aACE,oBACA,WAGF,YACE,WACA,YACA,qBAGF,YACE,WACA,YACA,qBAGF,YACE,WACA,WACA,YACA,qBAOF,mBACE,aACA,mBACA,qBACE,aFGU,CEFV,iBACA,kBACA,oBACA,mBACA,2BACE,0BAKN,gCACE,aFzCY,CE0CZ,iBACA,kBACA,oBACA,mBAQF,gCAEE,WACA,YAEF,mBACE,iBACA,gBD5DW,CC8Db,oBACE,eD/DW,CCgEX,kBAGF,QACE,iBDpEW,CCqEX,aACA,mBACA,gBDhEY,CCiEZ,iBACA,YACA,kBAEA,uBACA,iBACA,YACA,iBACA,SAEA,oBACE,gBAGF,qBACE,gBACA,gBDlFU,CCmFV,iBACA,YAGF,sBACE,gBACA,gBDzFU,CC0FV,iBACA,YAGF,sBACE,uBAGF,cACE,eAGF,iBACE,wBFhEY,CEiEZ,yBACA,aFvHS,CEwHT,+CACE,wBFtEU,CEyEd,mBACE,qBF/HO,CEgIP,aFzEY,CE0EZ,yBACA,mDACE,wBF9EU,CE+EV,oBF/EU,CEgFV,UFrIK,CEwIT,kBACE,aFlFY,CEmFZ,iDACE,wBFtFU,CEuFV,UF5IK,CE8IP,+BACE,0CAGJ,gBACE,UFnJO,CEoJP,wBFlIS,CEmIT,yBACA,sBACE,wBFnIO,CEoIP,UFxJK,CE2JT,0BACE,aF1IS,CE2IT,qBF7JO,CE8JP,yBACA,gCACE,wBF5IO,CE6IP,UFjKK,CEoKT,yBACE,aFnJS,CEoJT,+BACE,wBFnJO,CEoJP,UFxKK,CE6KP,0EAEE,WACA,YAEF,wCACE,gBD1KO,CC4KT,yCACE,eD7KO,CCkLT,oCACE,kBAEF,yCACE,OACA,iBDpLO,CCsLT,yCACE,QACA,kBDxLO,CC4LX,wCAEE,mBACA,oBFvMU,CEwMV,aFtMU,CEuMV,wBFzMU,CEiNd,qCAEI,gCACE,cACA,eAEF,iCACE,cACA,gBAUN,yBAEI,gCACE,cACA,eAEF,iCACE,cACA,gBASN,eACE,kBACA,mBACE,WACA,eACA,yBACE,YFpNQ,CEwNV,0BACE,YFzNQ,CE8Nd,kBACE,aF/PY,CEgQZ,kBACA,SACA,yBACA,aACA,UACA,mDACA,qBACE,gBACA,mBACA,2CACE,aFlQO,CEqQX,wBACE,OAEF,yBACE,wBAIJ,kBACE,WACA,wBF7RY,CE8RZ,gBAMF,iBACE,4BACA,sBACA,uBACE,eACA,wBFzSU,CE2SZ,wBACE,wBF7SU,CE+SZ,qDACE,oBACA,iEACE,WAUJ,wBACE,yBACA,iBDvTS,CCwTT,YACA,WACA,aACA,QACA,mBACA,qBFvUO,CEwUP,oBFnUU,CEoUV,4BACE,WACA,YACA,eDlUO,CCoUT,8BACE,YACA,gBACA,iBDvUO,CCwUP,gBACA,YACA,eACA,YACA,wCACE,wBFrVK,CEsVL,aFnVM,CEqVR,4CACE,YACA,aAGJ,qCACE,oBFtTQ,CEuTR,iBACA,aACA,yCACE,gBAON,+BACE,oBF1VS,CE2VT,iBACA,aAIJ,aACE,kBACA,qBACA,eACA,4BACE,mBACA,wBFtXS,CEuXT,aFnXU,CEqXZ,mCACE,sBACA,yBACA,iBDpXS,CCqXT,gBACA,YACA,WACA,aACA,8BACA,UAEA,8DACE,cACA,mBACA,gBACA,uBAGF,qDACE,cAGJ,kCACE,kBACA,SACA,aACA,iBACA,gBACA,mDACA,sDACE,gBACA,wBFxZO,CEyZP,gCACA,eACA,2BACA,4DACE,wBF5ZM,CE+ZV,kEACE,WACA,2BAEF,2DACE,iBACA,eACA,+EACE,kBD7ZK,CCgaT,kEACE,OAEF,mEACE,QAIF,qDACE,4BACA,6BAEF,oDACE,cACA,UAKN,2BAEE,kBACA,kBACA,aACA,eACA,oIACE,aAEF,uCACE,eACA,gBACA,kBACA,oBAGF,+CACE,kBACA,MACA,OACA,YACA,WACA,gBACA,kBACA,+BACA,iBACA,oBFpdU,CEudV,qGACE,wBF1dQ,CE8dV,iIACE,wBF5dQ,CE+dZ,yDACE,mBACA,kIACE,aFneQ,CEseZ,6DACE,oBAGA,2EACE,wBFzeQ,CE0eR,oBFzeQ,CE2eV,uFACE,cAMJ,6BACE,WACA,aACA,kBACA,WACA,QACA,UACA,YACA,kBACA,yBACA,gCACA,4BACA,wBAQJ,kBACI,wBACA,4BACA,kBACA,qBACA,6BACA,YACA,eACA,wBACE,aAEF,mDACE,wBF9eQ,CEgfV,4EACE,yDACA,qDACA,iDAEF,iCACE,mBACA,0DACE,oBACA,wBFliBM,CEoiBR,0DACE,wBFviBK,CEyiBP,qCACE,aFviBM,CE4iBd,yBACI,kBACA,MACA,OACA,QACA,SACA,wBFjjBU,CEkjBV,mBACA,uBACA,eACA,6BACE,YACA,WACA,YAEF,+BACE,oCAIN,yBACI,kBACA,WACA,YACA,WACA,SACA,WACA,sBACA,kBACA,uBACA,eAQF,sCACE,cAEF,wCACE,cACA,gBAEF,4CACE,aACA,0DACE,mBD9kBQ,CCklBV,wDACE,cACA,kBDrlBQ,CCwlBZ,sCACE,aACA,oDACE,cACA,kBD5lBQ,CCkmBZ,wBACE,kBACA,MACA,OACA,YACA,WACA,kBACA,+BACA,yBACA,yDAIJ,mBACE,aACA,eACA,ODznBW,CC0nBX,6CACE,mCACA,aACA,sBACA,qBFzoBO,CE0oBP,kBACA,yBACA,iBDloBS,CCmoBT,kBACA,YACA,gDACE,gBACA,eACA,kBACA,mDACE,mBAGJ,wDACE,eAEF,qDACE,aACA,8BACA,mBACA,wDACE,eAEF,wDACE,aACA,mBACA,ODzpBK,CC0pBL,kBDxpBK,CCypBL,SACA,4DACE,WACA,YACA,YFrqBI,CEsqBJ,2FACE,eACA,YFjoBE,CEkoBF,iGACE,YF1nBE,CEgoBZ,oDACE,kBACA,uDACE,SACA,iBAEF,0DACE,gBD3qBM,CC8qBV,0DACE,YACA,cDvrBO,CCwrBP,eDxrBO,CCyrBP,6BAEF,mDACE,cD3rBO,CC4rBP,eD5rBO,CC6rBP,6BACA,uDACE,aACA,8BACA,WACA,iBDnsBK,CCosBL,kEACE,gBAIN,iFACE,eACA,gDAEF,oDACE,gDACA,0FACE,oCAGJ,sDACE,WAQN,eACE,WACA,kBACA,oBACA,wBACE,kBACA,aACA,QACA,yBAEF,qCACE,YACA,WACA,YACA,kBAEF,wBACE,aACA,QAEF,qBACE,yBACA,iBACA,WAEE,mDACE,cAEF,sDACE,cAEF,yHAEE,SAEF,sDACE,kBAEF,qDACE,mBAGJ,2BACE,gBAEE,gFACE,2BAEF,+EACE,4BAGJ,gDACE,iBACA,wBFzxBM,CE0xBN,gBACA,0CACA,kDAEE,6DACE,aACA,8BACA,ODzxBC,CC2xBH,kEACE,WAEF,+DACE,wBFtyBE,CEuyBF,eACA,wEACE,WAIN,uDACE,wBF9yBI,CE+yBJ,4EACE,UAQF,8DACE,gBACA,mBACA,UAKF,+DACE,gCAKF,+EACE,wBACA,wBFx0BE,CEy0BF,2FACE,8BAEF,0FACE,+BAKR,gDACE,kBACA,sBACA,0DACE,wBFx1BG,CE01BL,+DACE,kBACA,aFx1BI,CE21BR,qJAEE,eACA,aF1zBM,CE2zBN,wBFn2BK,CEq2BP,qFACE,+BACA,cAKJ,uBACE,yBACA,mBACA,oBF52BQ,CE62BR,mCACE,sBAEF,kCACE,uBAGJ,4BACE,aACA,SACA,yBAKN,uGAGI,eAGJ,aACE,WACA,kBACA,kBACE,qBACA,YACA,aFp2BU,CEq2BV,sBACA,oBACA,yBACA,aACA,0BACA,wBACE,eACA,aF12BQ,CEk3Bd,qBACE,eACA,YACA,MACA,OACA,WACA,YACA,uBACA,uBACA,kBACA,mCACA,2BACE,aAEF,6BACE,aAIJ,eACE,kBACA,UACA,WACA,gBACA,iBACA,aACA,sBACA,qBFx7BS,CEy7BT,gBACA,cAEE,iCACE,YACA,iBACA,wBFr7BQ,CEs7BR,gCACA,eACA,UFl8BK,CEm8BL,gBACA,aACA,8BACA,SAEF,oCACE,YACA,cAEF,kCACE,cD17BQ,CC27BR,cACA,gBAEF,kCACE,aACA,yBACA,2BACA,0CACE,gBDp8BM,CCw8BZ,qBACE,gBAUA,4BACE,YF17BQ,CEm8Bd,sBACE,wBF59BW,CE69BX,UFj/BS,CEk/BT,gBACA,gBACA,iBD1+BW,CC2+BX,gBDp+BY,CCu+Bd,uBACE,kBACA,qBF1/BS,CE2/BT,yBACA,yBACA,gDACA,0BACA,gBAEA,4BACE,YACA,SDx/BS,CCy/BT,sBACA,cACA,kBACA,MACA,OAGF,6BACE,oBFtgCU,CEugCV,yDACE,wBFxgCQ,CE2gCZ,gCACE,oBFjgCS,CEkgCT,4DACE,wBFngCO,CEsgCX,qCACE,oBF19BW,CE29BX,iEACE,wBF59BS,CEg+Bb,gCACE,aACA,+BACA,QDrhCS,CCshCT,oCACE,gBAIJ,8BACE,eACA,kBACA,aACA,gBACA,kCACE,kBACA,UACA,YAEF,iDACE,UAEF,oCACE,aFhgCU,CEogCd,gCACE,cD/iCS,CCijCT,aACA,yBAOJ,mBACE,UAHe,CAIf,WAJe,CAKf,kBACA,MACA,OACA,gBAGF,eACE,UACA,YACA,kBACA,eFjlCS,CEklCT,yBAGF,mBACE,0BACA,4BACA,YACA,kBAGF,kBACE,4BACA,YACA,iBACA,SACA,UAGF,gBACE,UACA,YACA,kBACA,YACA,UACA,mBAGF,gBACE,0BACA,+BAGF,gBACE,aACA,oBAGF,gBACE,aACA,oBAOF,SACE,aACA,aFxnCY,CEynCZ,wBACE,aACA,mBACA,QACA,WD5nCS,CC6nCT,8BACE,aF9lCQ,CE+lCR,eAEF,qCACE,YACA,WACA,cACA,cAEF,sCACE,mBAGJ,6BACE,mBACA,4CACE,gBD9oCO,CC+oCP,iIAEE,gCAIN,2BACE,sBACA,0CACE,qBD1pCO,CC2pCP,2BACA,iBD1pCO,CC2pCP,6HAEE,8BAIN,6DAEE,aFpoCU,CE2oCd,iBACE,kBACA,aACA,mBAIE,uEACE,gBACA,uBACA,YAKF,kEACE,cAGF,8EACE,gBACA,kBACA,uBACA,qBACA,wBAGA,iGACE,aAKN,4CACE,OACA,YAGF,2CACE,kBACA,MACA,SACA,aACA,mBACA,uBACA,WDxtCS,CCytCT,gBACA,YACA,+BACA,aF/tCU,CEguCV,eACA,WACA,wBAEA,oDACE,WACA,YAEA,mEACE,kBAIJ,iDACE,kBFlvCQ,CEmvCR,aF7uCQ,CE8uCR,oBFjvCQ,CEovCV,kDACE,kBFvvCQ,CE0vCV,iDACE,OACA,+BACA,iBAGF,kDACE,QACA,8BACA,kBAIJ,wCACE,kBACA,qBAEA,8CACE,kBACA,OACA,MACA,SAGF,+CACE,kBACA,QACA,MACA,SAIJ,oCACE,kBACA,qBACA,gBACA,yBACA,kBACA,sCACA,YACA,gBACA,gBAEA,0CACE,OAGF,2CACE,QAIJ,yCACE,aACA,mBACA,QACA,gBACA,aF7yCU,CE8yCV,qCAEA,sDACE,YACA,WACA,cACA,cAGF,uDACE,mBACA,gBACA,uBACA,YAGF,+CACE,kBFt0CQ,CEu0CR,aF/xCQ,CEgyCR,eAGF,iDACE,kBF50CQ,CE60CR,aFryCQ,CEsyCR,eAGF,4DACE,aF3yCQ,CE4yCR,kBFlzCO,CEqzCT,qDACE,0BAGF,oDACE,0BAGF,oDACE,kBAQN,YACE,kBACA,YACA,mBACA,4BACA,mBACA,sBACA,WACA,iBACA,kBACA,UACA,oBACA,uBACA,+BAEE,oCACE,YACA,kBACA,QACA,WACA,gBACA,iBACA,mBACA,4DAIF,mCACE,YACA,kBACA,QACA,UACA,gBACA,iBACA,mBACA,4DAGJ,2BACE,2BACA,kCACE,YACA,kBACA,SACA,SACA,iBACA,iBACA,mBACA,4DAGJ,8BACE,2BACA,qCACE,YACA,kBACA,YACA,SACA,iBACA,iBACA,mBACA,4DAGJ,qBACE,UAGJ,sBACE,kBACA,sBACA,wCACE,UAIJ,YACE,qBACA,WACA,YACA,aFn7CY,CEo7CZ,mBACE,qBANJ,YAQE,uCACA,+CACA,gBACE,GACE,kCAGJ,wBACE,GACE,kCC18CN,aACI,wBHIS,CGDb,gBAEI,aHOU,CGHV,+FACI,aHCM,CGEV,kBACI,aHFM,CGKV,gCACI,aHTM,CGYV,uBACI,wBHlBK,CGqBT,qBACI,wBHrBM,CGsBN,oBHrBM,CG2BN,iCACI,qBHhCD,CGiCC,oBH5BE,CG6BF,aH7BE,CIRd,YACI,wBJYU,CITd,eACI,cAKI,gDACI,oBJDE,CIKV,sBACI,wBJHM,CIMV,oBACI,wBJNM,CION,oBJTM,CIYV,+BACI,aJhBM,CIyBN,iCACI,UJhCD,CIiCC,uCAEI,UJnCL,CIsCH,gCACI,wBJ9BE,CI+BF,oBJjCE,CIkCF,aJlCE,CI0CV,uCACI,wBJzCM,CI0CN,oBJxCM,CIyCN,6CACE,iBJrDC,CI8DH,2CACI,wBJtDE,CIuDF,aJzDE,CI2DN,kDACI,wBJ1DE,CI2DF,oBJ7DE,CI+DN,iDACI,oBJ9DE,CIgEN,gDACI,wBJjEE,CIkEF,oBJjEE,CIkEF,sDACI,wBJnEF,CI6EN,oDACI,+BACA,oBJlFE,CIqFF,iEACI,wBJrFF,CIyFF,+EACI,wBJxFF,CIyFE,oBJ3FF,CIoGN,qCACE,aJnGI,CIqGN,wEACE,wBJtEI,CIyEJ,yEACE,wBJ3GE,CI6GJ,yEACE,wBJ7GE,CI+GJ,oDACE,aJnHE,CIwHV,wCACI,wBJxHM,CIyHN,8CACE,oCAIN,wCACI,qBJvIG,CI+IL,uCACE,yBACA,yDAMI,qDACI,qBJxJL,CIyJK,oBJhJF,CIkJF,2DACI,cAIJ,kEACI,wBJzJF,CI6JF,gFACI,qBJtKL,CI+KP,sCACI,aJtKM,CI8KN,2EACI,YJlLE,CImLF,gHACI,YJpJF,CIuJN,4DACI,wBJtLE,CIuLF,oBJtLE,CIuLF,uEACI,YJ3JF,CI6JF,kEACI,wBJ3LF,CI6LF,iFACI,oBJjKF,CImKF,2EACI,wBJjMF,CIkME,oBJlMF,CI+MF,+DACE,wBJ/MA,CIiNE,8EACE,wBJnNJ,CIsNA,sEACE,wBJtNF,CI4NA,8FACE,wBJhOF,CImOF,+DACE,wBJnOA,CIoOA,yEACE,wBJpOF,CIuOF,iFACE,aJ3MA,CI4MA,wBJ3OA,CIgPJ,sCACE,oBJjPE,CIuPN,iCACE,UJhQC,CIiQD,wBJtPI,CIuPJ,yBACA,uCACE,aJ7NE,CI8NF,wBJ7PE,CKXd,8BACE,kBACA,YACA,aACA,OAEA,8CACE,YACA,WACA,kBACA,aACA,sBACA,qBACA,uBAEF,8DACE,iBAGF,4CACE,eACA,OACA,SACA,QACA,yBACA,gBACA,4BACA,gEACA,aACA,sBACA,gBACA,2BACA,sBACA,UAEA,qGACE,UACA,oBACA,uBAGF,iDACE,gBACA,kBAGF,oDACE,UACA,aACA,gBACA,gCACA,gBACA,WAEA,0DACE,aAEA,4DACE,aACA,mBACA,aLlDI,CKmDJ,QACA,eACA,wBAEA,0EACE,WACA,YAGF,gEACE,YAGF,kEACE,kBLrEE,CKsEF,aLhEE,CKmEJ,mEACE,kBLzEE,CK8ER,0DACE,OACA,mBACA,YAEA,yEACE,mBACA,gBACA,uBAIJ,kEACE,aACA,yBACA,mBACA,aL3FM,CK4FN,cACA,QAEA,uFACE,mBACA,gBACA,YACA,eACA,cACA,aACA,aACA,mBACA,eACA,wBAEA,6FACE,kBLhHE,CKiHF,aL3GE,CK8GJ,8FACE,kBLpHE,CK0HV,iDACE,wBACA,oCAEA,+GACE,UACA,oBAKN,mDACE,wBLjGU,CKoGZ,uCACE,iBACA,iBACA,sBACA,yBACA,qBAEA,qDACE,0R;ACtJN,kCACE,kBACA,SACA,UACA,YACA,eNJS,CMKT,yBACA,wCACA,SAEA,qDACE,2BAEA,uDACE,gBAIJ,qDACE,2BAGF,yCACE,mBACA,kBACA,gCACA,oBAIA,8CACE,kBAEA,gDACE,2BACA,kBACA,cACA,aACA,8BACA,WACA,yBACA,mBACA,YACA,UN3CG,CM6CH,sDACE,qBACA,yBACA,aNJI,CMUZ,2CACE,aACA,yBAGF,kDACE,kBAEA,0DACE,kBACA,aACA,QACA,YACA,YACA,W;ACpEN,iBACI,sBACA,0BACI,iBACA,YACA,aAEJ,oBACI,c;ACVR,2BACE,gBACA,qBRCS,iDQCT,0BACA,2BACA,yBACA,8BAEA,8BACE,iBACA,mBAGF,6BACE,iBAGF,oCACE,gBACA,SACA,aACA,2BACA,8BACA,eAEA,4DACE,wBRmBQ,CQlBR,oBRkBQ,CQhBR,kEACE,wBRgBM,CQRd,yBACE,aACA,sBACA,YACA,WACA,qBAEA,iCACE,WACA,oBACA,gCACA,gBACA,cACA,aACA,mBACA,8BACA,sBAEA,wCACE,eACA,gBACA,cACA,SACA,mBACA,OAGF,iDACE,aACA,mBACA,WAEA,8DACE,SAGF,gEACE,aACA,mBACA,uBACA,WACA,YACA,UACA,gBACA,YACA,kBACA,eACA,cACA,aACA,sCAEA,sEACE,eACA,kBRtFI,CQ4FZ,mCACE,WACA,gCACA,gBACA,aACA,sBACA,sBAEA,4CACE,aACA,QACA,kBAEA,yDACE,wBR1GM,CQ2GN,kBAEA,+DACE,eACA,wBR7GI,CQgHN,kEACE,aRhHI,CQkHJ,wEACE,mBAOV,2CACE,OACA,WACA,wBRhIU,CQiIV,cAMA,4DACE,aACA,mBACA,aRvIQ,CQwIR,qBR9IK,CQ+IL,gCACA,oCACA,2BACA,eAEA,qEACE,iBAEA,2FACE,wBRlJI,CQmJJ,WACA,gBACA,kBACA,iBAIJ,oEACE,aACA,uBACA,mBACA,WACA,eAEA,iFACE,YACA,WACA,UAEA,sFACE,SACA,UAKN,yEACE,aR3IM,CQ8IR,mEACE,2BACA,yBRhJM,CQiJN,aRhLM,CQkLN,2EACE,8BAEA,0GACE,wBRpHI,CQwHR,yEACE,8BAEA,wGACE,wBRtLC,CQ0LL,kGACE,qBAvEC,CA2EL,kEACE,OACA,aACA,sBACA,yBAEA,0EACE,QACA,aACA,8BACA,mBAEA,mFACE,YACA,eACA,gBACA,sBACA,uBACA,aACA,mBACA,uBAGF,iFACE,OACA,2BACA,SAIA,sFACE,eAKN,wEACE,aACA,cACA,mBACA,mBAGF,0EACE,aACA,iBACA,aRzPI,CQ0PJ,cACA,cACA,yBAIJ,kEACE,wBRpQM,CQyQZ,gCACE,OACA,aACA,mBACA,uBACA,kBACA,aR5QU,CQ6QV,WACA,wBRjRU,C;ASHd,+CACI,wBAIJ,gCACI,mHAEA,+BACA,6DAEA,sCACI,+BACA,YAIR,2CACI,GACI,iHAGJ,IACI,kHAGJ,IACI,kHAGJ,IACI,mHAGJ,IACI,mHAGJ,IACI,mHAGJ,IACI,mHAGJ,IACI,mHAGJ,IACI,mHAGJ,IACI,mHAGJ,KACI,oH;AC9DR,gBACI,kBACA,iBACA,oBACA,sBACA,yBACA,kBACA,oBACI,YAEJ,oBACI,YAEJ,mBACI,iBACA,oBACA,YACA,kBACA,mBACA,gBACA,gBAEJ,yBACI,gBACA,iBACA,YACA,mBACA,sBACA,2BACI,qBACA,mBACA,aVlBE,CUqBV,yBACI,aACA,uBACA,QAEJ,sBACI,aACA,uBACA,mBACA,aVlCM,CUqCV,mDACI,yBACA,Y;AC9CR,mBACI,kBACA,kBACA,yBACA,gBACA,2CACA,aACA,WACA,gBACA,aACA,sBACA,8BACA,sBACI,gBACA,kBACA,yBACI,kBAIZ,cACI,sBACA,aACA,uBACA,mBACA,YACA,oCACA,gBACA,2CACA,SACA,kBACA,QACA,WAEA,6BACA,gCACA,kBXjBS,CWmBT,0BACA,oCAEJ,2CAEI,WACA,cACA,QACA,SACA,kBACA,4CACA,YACA,mCACA,+DAEJ,6BACA,6B;ACtDA,oCACI,gBACA,YACA,aACA,sBACA,mBACA,2BAEA,yDACI,eZRG,CYSH,mBACA,YACA,mBACA,mCAEA,wEACI,aACA,uBACA,cAGJ,gEACI,cAGJ,kEACI,aACA,uBACA,SACA,mB;AC7BZ,SACI,OAEA,eACI,uBACA,gBACA,mBACA,kBAGJ,kBACI,aACA,yBAKR,yBACI,cACI,cAKR,qCACI,cACI,c;AC1BR,YACE,qBACA,gBAEA,0BACE,YACA,aAIF,uBACE,yBACA,yBACA,edZO,CccP,qCACI,aAGJ,6BACI,oBdsBM,CclBR,iCACE,aACA,cAMJ,+CACE,4BACA,6BAKN,YACI,kBdrCS,CcsCT,+CACA,iBACA,YACA,gBACA,UACA,8BACA,+BACA,gCACA,4CACI,aAGJ,uBACI,gCACA,wBdpDK,CcqDL,eAEA,oCACI,mBAGJ,0CACI,gBACA,+BAEA,mDACI,wBd9DF,CcgEF,iDACI,yBAEJ,0DACI,2BAIR,6BACI,wBdzEE,Cc0EF,uDACI,2B;AClFhB,gBACI,aACA,2DACI,CAEJ,gBACA,mBACA,sBACI,gBAEJ,qBACI,afFM,CeGN,gBACA,kBACA,iBACA,cACA,WAGJ,yBACI,iBAEJ,uBACI,kBACA,+BACI,aACA,mBACA,gBACA,eACA,kBACA,afpBE,CeqBF,uDACI,aAIR,qCACI,kBACA,QACA,OACA,wBfnCC,CeoCD,Yf/BE,CekCF,qCACI,WAEJ,2CACI,UAMhB,qBACI,gBAGJ,6CACI,eACA,cACA,afnDU,CeoDV,kBACA,mBACA,uBAGJ,wBACI,iBACA,iBAIJ,sCACI,gBACI,wCACA,mDC5ER,cACI,mBACA,sBACI,WACA,aACA,mBACA,8BACA,wBhBDM,CgBEN,yBACA,gBACA,eACA,4BACI,gBAEJ,2BACI,ahBLE,CgBMF,kBAEJ,+BACI,iBACA,yBACA,iCAEJ,4CACI,wBhBjBE,CgBkBF,eAGR,uBACI,mCACA,uCACI,aACA,yBACA,mBAIJ,0DACI,yB;;ACuDZ;IACI,YAAY;AAChB;;AC7FA,mBACI,sBACA,YACA,iBAEA,0BACI,iBACA,oBlBoCM,CkBnCN,4BAGJ,8CACI,kBACA,aAEA,uDACI,mBACA,kBACA,SACA,yBACA,mEACI,kBACA,YACA,WACA,8BACA,mBACA,qBACA,YACA,WACA,yEACI,eACA,alBYN,CkBPN,4DACI,kBACA,QACA,SAMA,iFACI,mBACA,iBAMR,uDACI,gBAEA,0EACI,UAGJ,0EACI,iBAIZ,qCACI,iBACA,oBlBxBM,CkB0BF,2FACI,oBAMA,mGACI,mB;AC5ElB,wCACE,aACA,sBACA,SAGE,2EACE,sBACA,qBAGF,qEACE,WAGF,yEACE,aACA,QAGF,0EACE,aACA,QACA,mBACA,gBAEA,iFACE,eACA,YAEA,+FACE,WACA,YAON,4EACE,aACA,8BAEA,mFACE,mBACA,eAKN,iDACE,kBACA,uDACE,WACA,WACA,kBnBjDM,CmBkDN,kBACA,QACA,cAEF,uDACE,gBACA,YACA,kBACA,W;ACjER,wBACE,aACA,Q;ACFF,gCACI,arBMU,C;AsBPd,eACE,iCACA,WACA,wBACA,qBACA,gB;ACLF,mCACE,sBACA,WACA,wBACA,qBACA,gB;ACLF,iCACE,oBACA,mBACA,QACA,kBACA,uCACE,eAEF,iDACE,oBACA,mBACA,uBACA,YACA,YACA,yBACA,kBACA,eACA,wBACA,axBsCY,CwBpCZ,uDACE,UxBpBK,CwBqBL,wBxBgCU,CwB7BZ,wDACE,wBxB4BU,CwBzBZ,0DACE,oBAGF,gEACE,axB+BS,CwB5Bb,4CACE,sBACA,WACA,YACA,kBACA,kBACA,gBACA,gBACA,aACA,YACA,UAEF,iDACE,aACA,W;ACnDJ,+CACI,gBACA,iBAEA,yBACA,kBAEA,YACA,gBACA,WACA,aACA,QACA,mBACA,sBACA,qBAEJ,2DACI,iBACA,cACA,gBACA,eAEJ,iEACI,eAEJ,qDACI,e;AAxBI,uDACI,azBME,C;A0BXd,gBACI,aACA,qDACA,SAEA,2BACI,aACA,2BACA,M;ACRR,iBACI,aACA,QACA,mBACA,mBAGJ,qBACI,aACA,cAGJ,sBACI,iBACA,sBACA,yBAGJ,kBACI,gBAGJ,iDACI,kBACA,mBACA,gC;ACvBJ,+BACI,aACA,mBACA,SACA,kBACA,eAEA,qCACI,YAGJ,wCACI,aACA,sBAEA,qDACI,a5BTE,C4BaV,qCACI,kB5BjBM,C;A6BHd,+BACI,aACA,uBACA,mBAGJ,qCACI,gBAGJ,yCACI,mBACA,kBACA,mBACA,uEACA,yCAGJ,uCACE,GACE,UACA,8BAEF,IACE,UACA,0BAEF,KACE,UACA,8B;AC7BJ,+BACI,aACA,uBACA,mBAGJ,kCACI,gBAGJ,sCACI,mBACA,kBACA,mBACA,oEACA,yCAGJ,oCACE,GACE,UACA,8BAEF,IACE,UACA,0BAEF,KACE,UACA,8B;AC7BJ,+BACI,aACA,uBACA,mBAGJ,kCACI,gBAGJ,sCACI,mBACA,kBACA,mBACA,oEACA,yCAGJ,oCACE,GACE,UACA,6BAEF,IACE,UACA,0BAEF,KACE,UACA,+B;AC7BJ,yCACI,gBACA,kBACA,mBACA,uEAGJ,uCACE,GACE,WACA,yBAEF,IACE,UAEF,IACE,UAEF,KACE,WACA,wB;ACrBJ,+BACI,aACA,uBACA,mBAGJ,mCACI,kBACA,6CACA,kBACA,kBACA,wBACA,yBACA,kBACA,8BACA,mBACA,+EACA,yCAGJ,qFACI,WACA,qBACA,kBACA,MAEJ,2CACI,iCACA,wBACA,yBACA,kBACA,8BACA,mBACA,wEACA,mBAEJ,0CACI,wBACA,wBACA,yBACA,kBACA,8BACA,mBACA,wEACA,iCAGJ,qCACE,GACE,8BAEF,SACE,uC;ACnDA,uBACI,mBACA,mBAIJ,wCACI,mBAEJ,mDACI,gBAEJ,iDACI,sB;ACdR,gCACI,OACA,aAEA,uCACI,OACA,YACA,WACA,iB;ACRR,gCACI,OACA,aAEA,uCACI,OACA,YACA,WACA,iB;ACRR,yBACI,yBACA,wBrCoEW,CqCnEX,iBpCQS,CoCPT,WpCQS,CoCNT,uCACI,e;ACNJ,oCACI,gBAEA,2CACI,gBACA,iBACA,kBACA,yBACA,4CACA,eACA,gBAEA,iDACI,mBAGJ,iDACI,+B;AClBhB,kCACI,aACA,SACA,mBAEA,yCACI,UvCNG,CuCOH,gBAGJ,0CACI,yBACA,aACA,kBAEA,yDACI,aACA,uDACA,kBACA,+BACA,kBAEA,oEACI,kBACA,MACA,OACA,YACA,kBvC4BA,CuC3BA,kBACA,8BACA,UAGJ,2DACI,iBACA,kBACA,0BACA,kBACA,UACA,kBAEA,8EACI,UvCzCT,CuC6CC,iEACI,yBACA,avCxCF,CuCyCE,2BACA,kBACA,UACA,kBAEA,+EACI,0BACA,mBAGJ,wEACI,UvC3DT,C;AwCDX,kFACI,mCAGJ,uEACI,UAKJ,yBACI,8EAEI,cAKR,yBACI,8EAEI,gBAOR,qCAEI,8EAEI,cAIR,qCAEI,8EAEI,gB;;AC2GR;EACE,2BAA2B;AAC7B;;ACrJA,sCACI,aACA,cACA,aACA,sBACA,kBAEA,+CACI,kBACA,MACA,OACA,QACA,SACA,oCACA,aACA,uBACA,mBACA,aAGJ,sDACI,aACA,sBACA,cACA,aACA,cACA,UACA,2BAEA,8DACI,W;AC9BZ,0CACI,OAEA,+FACI,OACA,aACA,sBACA,SACA,cAIA,yDACI,yBAKJ,gEACI,iBACA,c;;AC6WZ;IACI,aAAa;AACjB;AAEA;IACI,aAAa;AACjB;;;ACvYA,wBACI,eACA,aACA,kBACA,gBAEA,sCACI,eACA,gBACA,yBACA,kBACA,YACA,gBACA,kBACA,WACA,a7C8BM,C6C3BV,mCACI,yBACA,kBACA,SACA,UAEA,uCACI,WACA,aAEA,gDACI,wBACA,SACA,SACA,YACA,oBACA,oB7C1BF,C6C8BN,0CACI,cACA,aACA,mDACI,yBACA,QACA,SACA,YACA,oBACA,oB7CvCF,C6C2CN,2CACI,cACA,aACA,UAIR,oCACI,kBACA,eAGI,yGACI,SACA,oB7CzDF,C6C0DE,oB;AChEZ,aACI,eACA,gBAEA,sBACI,mBACA,gBACA,uBAEA,6BACI,gBACA,uBAEA,+BACI,WAGJ,+BACI,a9CuBN,C8CnBF,+BACI,cACA,WAIR,uBACI,a9CtBE,C8C0BV,gBACI,kBACA,eAGJ,mBACI,kB9CrCM,C8CsCN,a9ClCM,C8CqCV,iBACI,kB9CzCM,C8C0CN,a9CLM,C8CMN,e;AC/CJ,2BACI,yBACA,kBACA,cAEI,2DACI,a;ACPhB,+CACI,aACA,SACA,mBACA,kBAEA,iEACI,OACA,kBACA,gCACA,mBACA,eACA,2BAEA,wEACI,oBhDsCI,CgDnCR,qFACI,aACA,kBACA,OACA,SACA,kBACA,gB/CNE,C+COF,ahDjBE,C;AiDPV,uCACI,2B;ACDJ,0DACI,gBACA,aACA,qCACA,SAEJ,iEACI,WACA,S;;ACipBR;IACI,+CAAsC;AAC1C;AAEA;IACI,wBAAwB;AAC5B;AACI;AACA;QACI,mCAAmC;AACvC;AACA;QACI,qCAAqC;AACzC;AACA;QACI,wCAAwC;AAC5C;AACJ;;AC3qBA,6BACI,kBACA,QACA,MACA,UACA,YACA,+BACA,yBACA,aACA,mBACA,uBACA,WAEA,qCACI,cACA,kBACA,SACA,yBACA,eACA,mBACA,apDZM,CoDeV,mCACI,iBAEA,2CACI,apDjBE,CoDqBV,wCACI,WACA,WAEA,gDACI,2BAGJ,8CACI,iB;ACxCZ,iCACI,aACA,mBACA,QACA,eACA,SACA,OACA,YACA,wBAGA,arDJU,CqDKV,erDXO,CqDYP,yBACA,iBAGA,aAGA,sCACA,4BAGA,wBACA,qCAEA,qCACI,YAGJ,+CACI,arDzBM,CqD0BN,WACA,YAGJ,wCAEI,yCAGJ,uCACI,e;AC3CR,iCACE,aACA,uBAEF,8CACI,iBACA,iBACA,cACA,kBACA,aACA,0B;ACRI,uEACI,gBAEA,2EACI,S;ACPZ,wBACI,gCAIR,mBACI,yBACA,iBvDKS,CuDJT,aACA,sBACA,2BACA,2BAGJ,sBACI,oBACA,mBACA,yBACA,iBvDNS,CuDOT,2BACA,2BAGJ,2BACI,aACA,mBACA,uBACA,wCACA,2BACA,4BACA,+BACI,8BACA,oCACI,iBAKZ,8CACI,kBACA,kDACI,mBAIR,iDACI,WACA,kBACA,2BACA,8BACA,qDACI,qBAIR,yBACI,yBACA,+BACI,gBAIR,4CACI,gBACA,aACA,sBACA,OvDtDS,CuDuDT,YACA,kDACI,iBACA,gBAIR,4BACI,WACA,aACA,QACA,kBACA,mBAGJ,6BACI,2BACA,2BAGJ,mCACI,2BACA,2BCvFJ,iBACE,aACA,e;ACHF,4BACI,oBACA,cAEA,2CACE,eACA,gBACA,cAEA,8DACE,aACA,mBACA,UACA,cAEA,oFACE,oBACA,cAEA,4FACE,iBAEA,+FACE,eAGF,8FACE,iBACA,iBACA,a1DrBA,C0DyBJ,iHACE,cACA,eAIA,4GACE,eACA,gBACA,gBAGF,0HACE,aACA,mBACA,eAEA,6IACE,WACA,gBACA,eAMR,qFACE,gBAEA,6FACE,YACA,WAMN,8DACE,6B;ACvER,6CACE,aACA,aACA,QACA,a3D6Da,C;A4D/DP,+BACI,8BAKJ,qDACI,kB5D8CI,C4D5CJ,+DACI,kB5DNF,C;A6DHF,8EACI,yBACA,kB7D2CD,C6D1CC,iBACA,kBACA,eACA,2BACA,OACA,kBACA,kBAEA,oFACI,kB7DmCJ,C6DhCA,uFACI,kB7DiCJ,C6DhCI,WAEA,4FACI,gBAIR,uFACI,WACA,mB;AC7BpB,kFACI,mCAGJ,uEACI,UAKJ,yBACE,8EAEE,cAKJ,yBACE,8EAEE,gBAOJ,qCAEE,8EAEE,cAIJ,qCAEE,8EAEE,gB;ACvCA,4CACI,yBACA,kBACA,c;ACJR,YACI,gBACA,SAEJ,gBACI,WACA,aACA,O/DIS,C+DHT,wBACI,cAGR,6CAEI,YACA,yBACA,gBACA,iB/DNS,C+DOT,aACA,mBACA,O/DTS,C+DUT,mBACA,uBACA,kBAEJ,uBACI,ahEnBU,CgEqBd,uBACI,eACA,6BACI,ahEYM,C;AiE3Cd,8BACI,kBACA,oCACI,ajEwCM,CiEpCd,gCACE,W;ACRF,iCACE,gBAEA,4CACE,eACA,gBACA,YACA,2BAGF,6CACE,oCAEA,wDACE,2BACA,uBAEA,uEACE,alETM,CkEUN,mBAGF,8DACE,oC;ACvBR,oBACE,a;ACDF,mDACI,qBACA,2BACA,UAEJ,sDACI,gBACA,uBACA,mBAKJ,yBACE,sHAGE,cAKJ,yBACE,sHAGE,gBAOJ,qCAEE,sHAGE,aAIF,mHAEE,mBACA,qBAIJ,qCAEE,sHAGE,gBAKJ,gDACE,aACA,sBACA,UAIF,yBACE,gDACE,mBAEA,kDACE,QAON,qCACE,gDACE,sBAEA,kDACE,WAKN,qCACE,gDACE,mBAEA,kDACE,Q;AC7FN,8BACI,WAEA,uCACI,aACA,sBACA,mBACA,8BACA,kBACA,gBACA,YACA,gBAEA,iDACI,kBACA,OACA,SACA,WACA,kBrEZE,CqEaF,2BACA,UACA,aACA,8BACA,gBAEA,4DACI,UAEJ,6DACI,QAGJ,qDACI,kBAEA,0DACI,aACA,WACA,kBrEgBJ,CqEfI,UACA,cACA,QACA,kBACA,6BACA,qCAIA,oEACI,wBAMhB,8CACI,WACA,kBACA,OACA,QACA,aAEA,oDACI,kBACA,WACA,YACA,wBrE3DF,CqE4DE,kBACA,UACA,2BAEA,8DACI,wBrElBJ,CqEqBA,2DACI,qBACA,wBrEvBJ,CqEyBI,kEACI,arEzBR,CqE6BA,6DACI,eAGJ,2DACI,kBACA,SACA,gCACA,iBACA,arEvFN,CqEwFM,2B;AC9FpB,qCACI,kBACA,gBACA,YACA,cACA,aACA,sBAEA,sDACI,kBACA,MACA,OACA,WACA,YACA,8BACA,YAGJ,8CACI,OACA,gBACA,aACA,sBACA,c;ACtBJ,uDACI,aACA,yBACA,WACA,kBACA,eACA,2BAEA,6DACI,oBvE0CI,CuEvCR,gEACI,oBvEwCI,CuEhCJ,yEACI,avEhBF,CuEiBE,gBtEPF,CsEWN,oEACI,avEtBE,CuEuBF,gBtEZE,C;AuEhBN,wCACI,kBACA,mBACA,gCACA,aACA,8BAEA,8CAEI,gBAGJ,iDACI,aACA,QAIR,mCACI,eAEA,kDACI,axEhBF,CwEiBE,kB;ACrBA,mFACI,iB;;ACsNpB;EACE;;;;;;GAMC;AACH;;ACpOI,4CACI,gBAIR,kBACI,mBAEI,yBACI,aACA,QAHR,qBAKI,gBACA,yBACI,WAGR,wBACI,iBACA,sBACA,qBACA,yBACA,iBACA,oB3EhBM,C2EiBN,2BACI,YAGA,+CACI,gCAIZ,gCACI,mBAEJ,yCACI,sBAEJ,6BACI,gBCnCR,qCACE,2BACE,iDAKJ,qCACE,2BACE,iDAKJ,UACE,aACA,mBAEA,mBACE,OACA,YACA,gBACA,uBACA,mBAGF,kBACE,cACA,oBACA,mBACA,uBACA,YACA,YACA,yBACA,kBACA,eACA,a5EgBY,C4EfZ,sDAEA,2BACE,WACA,YAEA,sCACE,WACA,YAIJ,wBACE,yBACA,U5EtDK,C4EyDP,2BACE,mBACA,a5EtDQ,C4EwDR,iCACE,+BACA,a5E1DM,C4E+DZ,sBACE,YAEA,4BACE,gBACA,uBACA,mBAON,8CACE,cACA,gBACA,gBACA,uBACA,mB;ACvFF,kBACI,aACA,mBACA,QAGJ,uBACI,WACA,YACA,kBACA,wB7EFU,C6EKd,iCACI,wB7EkDW,C6E/Cf,oCACI,wB7ECS,C6EEb,kBACI,OACA,aACA,sB;ACxBJ,gCACE,eAMF,qCACE,yCACE,gBAIJ,qCACE,yCACE,c;ACZJ,qCACE,sCACE,gBAIJ,qCACE,sCACE,c;ACVJ,mBACI,oBACA,kBAIJ,sDAEI,aACA,mBACA,O/EDS,C+EET,gB/EMU,C+ELV,gBACA,iBACA,qBhFdO,CgFeP,ahFwCY,CgFvCZ,yBACA,eACA,6EAEA,gGACI,wBhFgCQ,CgF/BR,oBhF+BQ,CgF9BR,UhFvBG,CgF0BP,sLAEI,mBACA,oBhFxBM,CgFyBN,ahFxBM,CgFyBN,wBhF7BK,CgFgCT,kFACI,WACA,YAKR,2BACI,yBACA,0BACA,kBACA,mBAKJ,mGAGI,iBAIJ,2BACI,uBACA,W/EjDS,C+EkDT,0BACA,8BAEA,yCACI,WACA,YAGJ,gDACI,yBhFhBQ,CgFmBZ,2FAEI,yBhFrEM,CgF2EV,8GAEI,wBhF3BQ,CgF4BR,oBhF5BQ,CgF6BR,UhFpFG,CgFsFH,wJACI,wBhFlCI,CgFmCJ,oBhFnCI,CgFuCZ,uDACI,qCAEA,4EACI,qCAMZ,wCACI,cACA,eAIJ,+CACI,cACA,eAMJ,qCACE,kBACE,gBAIJ,qCACE,kBACE,c;AC7HJ,qCACI,aACA,sBACA,cACA,O;ACJJ,+BACI,cAEA,wCACI,aACA,mBACA,eACA,OACA,cACA,iBAEA,yBARJ,wCASQ,sBACA,UAGJ,iDACI,OACA,YACA,aACA,sBACA,gBAEA,yBAPJ,iDAQQ,eACA,iBACA,SAIR,mDACI,cACA,gBACA,gBACA,YACA,OAEA,4DACI,cACA,OAEA,gFACI,YACA,aAEA,yFACI,gBACA,oBlF1CV,CkF2CU,YACA,iBACA,mEACA,OAEA,8LACI,elFrDjB,CkFsDiB,oBlFjDd,CkFkDc,gBAGJ,qGACI,oBlFtDd,CkFyDU,yBAlBJ,yFAmBQ,gBACA,iBACA,elFjEjB,CkFkEiB,oBlF7Dd,CkF8Dc,aAKZ,yBApCJ,4DAqCQ,iBACA,OAIR,yBAjDJ,mDAkDQ,WACA,eACA,sBACA,YACA,eAKZ,uCACI,aACA,SACA,qBACA,gBAII,0DACI,iBAGJ,yDACI,kBACA,kBAIR,yBAlBJ,uCAmBQ,cACA,uBACA,wBACA,aACA,sBACA,cACA,mBACA,iB;AAhHA,gDACI,O;ACJhB,eACI,YAEA,8BACI,cACA,gBACA,mBAGI,qEACI,gBACA,WACA,YAKZ,wCACI,gBACA,YACA,cACA,aACA,sBAEA,2CACI,OACA,YACA,cAEA,oDACI,eACA,anFYF,C;AoF3Cd,gCACI,aACA,qCACA,SACA,kBpFDS,CoFET,gCACA,8BACA,YACA,mBAEA,uCACI,oBACA,kBACA,aACA,SACA,8BAEA,0CACI,aACA,QAIR,yCACI,oBACA,aACA,yB;AC1BR,4BACI,SAEA,mCACI,aACA,sCACA,erFLG,CqFMH,SACA,YACA,gCAEA,4CACI,oBACA,aACA,2BACA,iDACI,UrFhBL,CqFiBK,gBAIR,4CACI,oBACA,kBACA,aACA,2BACA,QAGJ,2CACI,qBACA,aACA,yBAIR,8CACI,mBAIA,0DACI,aACA,SACA,mBACA,uBACA,arFtCE,CqFuCF,iBACA,eACA,2BAEA,gEACQ,arFIJ,C;AsFxDhB,iBACI,yBACA,mBAEA,oCACI,eACA,kBtFFM,CsFGN,aACA,gBACA,mBACA,SAEA,2CACI,OACA,aACA,mBACA,SAEA,2FACI,SACA,cAGJ,6CACI,atFhBF,CsFiBE,gBACA,cAIR,6CACI,aACA,sBACA,iBACA,kBACA,gBAGJ,+CACI,2BAGJ,yCACI,gCAEA,oDACI,wBAOJ,mDACI,mB;ACrDZ,uCACI,yBACA,kBACA,aACA,SAEA,iDACI,gB;ACVZ,aACI,WACA,yBACA,kBACA,iCACI,YAEJ,wEAEI,iBACA,aACA,8BACA,mBACA,gCACA,wBxFRM,CwFSN,2BACA,4BACA,SAEJ,uCACI,YACA,wBxFhBK,CwFiBL,6CACI,gBAGR,8CACI,axFJK,CwFKL,kBACA,gBACA,aACA,mBACA,QAEJ,kCACI,aACA,QAEJ,iCACI,aACA,8BACA,+BACA,aACA,oBACA,SACA,gBAIR,mBACI,kBACA,yBACA,gBACA,sBACA,+DAEI,axFXM,CwFaV,2CACI,oBACA,kBACA,QACA,aACA,sBACA,uBACA,mBACA,axFzDM,CwF0DN,iDACI,mBACA,eACA,axFzBE,CwF0BF,oBxF1BE,CwF6BV,0CACI,iBACA,aACA,8BACA,SACA,gBACA,gDACI,axFvEE,CwFyEN,oDACI,uBACA,kBAGR,2CACI,uBACA,qBACA,gCACA,aACA,uBACA,QACA,gBACA,iDACI,axFvFE,CwFwFF,gBACA,mBAKZ,0BACI,oBxFlFS,CwFmFT,oDACI,wBxF3FI,CwF4FJ,gCAIR,mBACI,6BACA,sBACA,mCACA,axFvEU,CwF0Ed,yBACI,GACI,8BACA,UAEJ,IACI,UAEJ,IACI,UAEJ,KACI,6BACA,W;ACjIJ,gDACI,WACA,YAEJ,uDACI,yB;ACLJ,+BACI,YACA,wB1FWI,C0FVJ,yBACA,kBACA,a1FeK,C;AwFvBb,aACI,WACA,yBACA,kBACA,iCACI,YAEJ,wEAEI,iBACA,aACA,8BACA,mBACA,gCACA,wBxFRM,CwFSN,2BACA,4BACA,SAEJ,uCACI,YACA,wBxFhBK,CwFiBL,6CACI,gBAGR,8CACI,axFJK,CwFKL,kBACA,gBACA,aACA,mBACA,QAEJ,kCACI,aACA,QAEJ,iCACI,aACA,8BACA,+BACA,aACA,oBACA,SACA,gBAIR,mBACI,kBACA,yBACA,gBACA,sBACA,+DAEI,axFXM,CwFaV,2CACI,oBACA,kBACA,QACA,aACA,sBACA,uBACA,mBACA,axFzDM,CwF0DN,iDACI,mBACA,eACA,axFzBE,CwF0BF,oBxF1BE,CwF6BV,0CACI,iBACA,aACA,8BACA,SACA,gBACA,gDACI,axFvEE,CwFyEN,oDACI,uBACA,kBAGR,2CACI,uBACA,qBACA,gCACA,aACA,uBACA,QACA,gBACA,iDACI,axFvFE,CwFwFF,gBACA,mBAKZ,0BACI,oBxFlFS,CwFmFT,oDACI,wBxF3FI,CwF4FJ,gCAIR,mBACI,6BACA,sBACA,mCACA,axFvEU,CwF0Ed,yBACI,GACI,8BACA,UAEJ,IACI,UAEJ,IACI,UAEJ,KACI,6BACA,W;AGlIR,eACI,aACA,sBACA,gBAEA,4BACI,OACA,aACA,uBACA,sBAGJ,0BACI,OAEJ,qBACI,iB;ACbR,+BACA,aACA,8BACA,mBACA,kBAEA,iB3FEa,C2FDb,yBAEA,YACA,gBAEA,gB3FGc,C2FFd,iBAEA,mCACE,iBAGF,qCACE,eACA,oB5FmBY,C4FjBZ,a5FiBY,C4FhBZ,wB5FxBW,C4F0BX,8CACI,a5FaQ,C;A6FxCd,cACE,aACA,8BACA,mBACA,kBAEA,iB5FEW,C4FDX,yBAEA,YACA,gBAEA,gB5FGY,C4FFZ,iBAEA,kBACE,iBAGF,oBACE,eACA,oB7FmBU,C6FjBV,a7FiBU,C6FhBV,wB7FxBS,C6F0BT,6BACI,a7FaM,C;A8F3Cd,6BACI,+BACA,4BACA,yBAEA,mCACI,WAGJ,mCACI,UAEA,yCACI,oB9FmDG,C8FjDP,uCACI,oB9FGC,C8FDL,wCACI,oB9FXE,C;A+FRd,sCACI,kBAEA,+CACI,kBACA,MACA,OACA,WACA,YACA,yCACA,uB;ACZR,sBACI,aACA,sBACA,SAEI,qDACI,8BACA,+BACA,wBhGHC,CgGML,8CACI,8BACA,+BACA,gCAGJ,sCACI,2BACA,4BACA,6BAGJ,qCACI,8BACA,+BACA,gCAGR,gDACI,iCACA,aACA,8BACA,aACA,yBACA,qDACI,aACA,mBACA,SAEJ,sDACI,eACA,oBhGGE,CgGDF,2KAEI,ahGDF,CgGKV,sDACI,aACA,sBACA,2DACI,ahG7CE,CgG8CF,iBAGR,iCACI,kBACA,ahGlDM,CgGmDN,aACA,mBACA,QAEA,wCACI,WACA,WACA,YACA,gBACA,wBhG9DE,CgGmEd,gCACI,aACA,gBACA,aACA,sBACA,sCACI,kBACA,ahGxEM,CgGyEN,aACA,mBACA,SACA,6CACI,WACA,WACA,YACA,wBhGlFE,CgGqFV,+CACI,sBACA,oBhGvFM,CgGwFN,iBACA,mBACA,kBACA,aACA,aACA,mBACA,+DACA,qDACI,eACA,oBhG5DE,CgG6DF,oFACI,ahG9DF,CgGgEF,8DACI,ahGjEF,CgGsEV,yCACI,aACA,yBACA,QAIR,gCACI,OACA,aACA,gBAEA,+CACI,aACA,OACA,gBACA,YACA,UACA,QACA,gBAEA,2DACI,gBAIR,+CACI,gBACA,aACA,kBACA,mBACA,uBACA,QACA,ahG1IM,CgG8Id,+BACI,ahGhJU,CgGiJV,kBACA,oBACA,kBCxJJ,YACE,kBACA,ajGGY,oEiGGV,wBAGJ,uBACI,UACA,2BAGJ,qBACI,UACA,wBAGJ,uBACI,UACA,wBAGJ,qBACI,UACA,2BAGJ,iBACI,8B;AClCJ,8BACI,mB;ACCI,4DACI,mB;ACHZ,iCACI,kBACA,kBACA,yBACA,gBACA,2CACA,4BACA,WACA,gBACA,aACA,sBACA,8BAEA,4CACI,sBACA,aACA,uBACA,mBACA,YACA,oCACA,gBACA,2CACA,SACA,kBACA,QACA,WACA,6BACA,gCACA,0BACA,oCAEA,gDACI,kBpGbC,CoGcD,+GAEI,+DAIR,iDACI,kBpGeI,CoGdJ,iHAEI,+DAIR,uGAEI,WACA,cACA,QACA,SACA,kBACA,4CACA,YACA,mCAGJ,2DACA,2D;AC5DR,4BACI,gBAEA,mCACI,YACA,gBACA,aACA,qCACA,SACA,UAEA,6CACI,kBACA,mBACA,gBAEA,6DpGQV,mBACA,gBACA,uBoGRc,kEpGMd,mBACA,gBACA,uBoGLc,4EpGGd,mBACA,gBACA,uBoGCU,sDACI,cACA,eAIR,0CACI,kBAIJ,2CACI,mBACA,iBACA,mBACA,aACA,mBACA,yBAEA,oGACI,kBACA,qBACA,kBACA,mBAEA,4HACI,kBACA,QACA,SACA,gCACA,2BAIA,wIACI,WACA,YAKZ,uDACI,arG3DF,CqG6DF,yDACI,arGlDH,CqGuDT,mDACI,kBrG1EM,CqG4EF,0EACI,gCACA,kBACA,SACA,cAEA,uFACI,Y;ACpFZ,6DACI,gB;ACHR,iBACI,yBACA,kBACA,gBAEA,yBACI,kBvGHE,CuGIF,aACA,gCAGI,uCACI,mBAKZ,+BACI,evGlBD,CuGoBC,uCACI,gCAEA,oDACI,mB;ACxBhB,6BACI,SAEA,mDACI,iBACA,yBACA,wBxG8BC,CwG7BD,kBACA,aACA,iBACA,aACA,8BACA,mBAEA,yDACI,eACA,wBxGqBF,CwGjBN,oDACI,yBACA,gBACA,0BACA,aAGI,oFACI,mBAEA,0FACI,cACA,iBACA,kBAEJ,oGACI,axG9BV,CwG+BU,wBxGnCX,CwGoCW,aACA,eAOZ,wDACI,0B;AChDhB,iCACI,iBACA,kBACA,yBACA,4BACA,oBACA,mBACA,QACA,uCACI,oBzG4CQ,CyG3CR,azG2CQ,CyG1CR,eAGR,2CACI,cACA,aACA,SACA,sBAEJ,oBACI,aACA,8BACA,mB;ACtBA,2CACI,kBACA,eACA,qBACA,iDACI,a1GiDI,C0G/CJ,eAIA,qEACI,8BACA,gCACA,8BACA,qBACA,kBACA,YACA,WACA,WACA,UAEJ,qEACI,UACA,8BACA,qBACA,kBACA,cACA,WACA,YAIR,oDACI,YACA,kBAEA,6DACI,qBAGJ,2DACI,mBACA,aACA,QAEA,sEACI,wB1GCJ,C0GGJ,oEACI,aACA,YAIA,0EACI,qBACA,a1GrDN,C0G2DV,4CACI,gBAGA,oDACI,kB1GvBG,C0G6BC,gEACI,a1GvBJ,C0G0BA,kEACI,wBASJ,iEACI,a1GnFN,C0GoFM,cACA,gBAEA,4EACI,U1GjGb,C0GkGa,iB;AClGxB,8CACI,aACA,sBACA,OACA,YACA,cAEA,sDACI,e3GPG,C2GQH,aACA,kBACA,yBACA,cACA,YAGR,qCACI,8CACI,gB;AClBR,sCACI,gBACA,aACA,kBACA,yBAGJ,gCACI,aACA,wB5GuCW,C4GtCX,a5G4CY,C4G3CZ,kBACA,yBACA,YACA,gBACA,iDACI,YAEJ,gDACI,Y;ACnBR,+BACI,wB7G+CW,C6G9CX,a7GoDY,C6GnDZ,kBACA,yBACA,iBACA,kBACA,oBACA,cACA,kBAEA,qDACI,a7GJM,C6GKN,kBACA,kBAIA,4DACI,kBACA,SACA,SAKR,yCACI,gBACA,uDACA,oBAEA,2DACI,iBAGJ,oDACI,a;AClCJ,8CACI,a9GkDI,C8G7CR,+CACI,a9GDE,C8GGN,8CACI,a9GoDG,C8GlDP,8CACI,a9GIC,C;A+GnBb,sCACI,aACA,sBACA,SACA,e/GHO,C+GIP,aACA,kBACA,yBACA,c;ACRJ,qCACI,aACA,sBACA,OACA,YACA,qBACA,c;ACNJ,sCACI,aACA,mBACA,SACA,cAIJ,qCACI,sCACI,gB;ACRA,+FACI,gCAKJ,6CACI,YACA,UACA,YACA,e;ACZZ,yBACI,yBACA,enHDO,CmHEP,aACA,aACA,sBACA,OAEA,wCACI,aACA,8BACA,mBACA,mBAEA,sDACI,SACA,UACA,iB;;AC8CZ;IACI,6BAA6B;AACjC;;ACjEA,gBACI,cACA,YACA,WACA,kBACA,2B;ACJA,qBACI,gCACA,mBACA,iBAIA,gDACI,yBACA,iBACA,kBACA,aACA,WACA,mBACA,gBACA,8BACA,mBACA,SACA,yBACA,2BAEA,yDACI,aAGJ,sDACI,oBtHtBF,CsHyBF,yDACI,OAGI,sFACI,gBrHjBV,CqHkBU,atH7BV,CsHkCM,qEACI,atHaR,CsHRJ,yDACI,aACA,8BACA,mBAKZ,+BACI,iB;ACxDR,mBACI,aACA,OACA,sBAEA,qBACI,gCACA,mBACA,iBAGJ,qCACI,mBAEA,oDACI,yBACA,yBACA,kBACA,aACA,WACA,mBACA,gBACA,8BACA,mBACA,SACA,0CACA,2BACA,eAEA,6DACI,aAGJ,0DACI,oBvH5BF,CuH6BE,wBvHaD,CuHVH,6DACI,OAGI,mFACI,gBAGJ,oFACI,gBtH7BV,CsH8BU,avHzCV,CuH8CF,6DACI,aACA,8BACA,mBACA,QAEA,oFACI,avHJJ,CuHMI,6FACI,WACA,YAGJ,0FACI,wBvHdR,CuHeQ,UvHpEb,CuH2EP,iCACI,iB;AC7ER,oCACI,YACA,aACA,OACA,sBACA,cACA,2BACA,8BAMA,6CAHJ,oCAIQ,kB;AAbJ,8BACI,YAEA,sCACI,exHJD,CwHKC,YACA,gCAKI,0DACI,kBxHVP,CwHaG,2DACI,Y;ACjBpB,0CACI,aACA,sBACA,eACA,SAEF,oDACE,mBAEA,oEACE,gBACA,gBAGF,mEACE,aACA,eACA,S;ACjBN,oCACI,sBACA,aACA,yBACA,aACA,8BACA,mB;ACNJ,mCACI,aACA,Q;ACJJ,oCACI,sBACA,yBACA,kBACA,aACA,yCACI,YACA,c;ACLR,kDACI,gBACA,mBAEJ,sCACE,aACA,8BACA,mB;ACNE,6BACI,gBACA,aACA,sBACA,sCACA,mBACA,6CACA,gBAEA,0CACI,iBACA,aACA,gDACA,gCACA,2BAEA,gDACI,mBAEJ,gDACI,kBAIA,2DACI,2BACA,UAIR,gDACI,kB9H5BF,C8H8BM,iEACI,UAKZ,uDACI,mBAOR,uCACI,aAKJ,sCACI,iB;ACvDZ,6BACI,WACA,YACA,kBACA,YACA,iBACA,qBAGJ,mCACI,kBACA,YAGJ,wCACI,wB/HCS,C+HEb,0CACI,wB/HsDY,C+HnDhB,uCACI,wB/HsCW,C+HnCf,oCACI,WACA,iB;AC5BJ,oCACI,yBACA,kBACA,gBACA,ehIHO,CgIIP,aACA,aACA,sBACA,SACA,gBAEA,wDACI,aACA,mBACA,QACA,eACA,mBACA,yBACA,YACA,kBACA,2BAEA,8DACI,ahIgCI,CgI/BJ,oBhI+BI,C;AiIvDhB,8BACI,yBACA,kBACA,gBAEA,kDACI,ejILG,CiIMH,aACA,gCACA,2BAEA,wDACI,UjIXD,CiIYC,kBjI0CI,CiIzCJ,sFACI,2BACA,ajITF,CiIaN,2FACI,ajIbE,CiIeF,+HACI,UjIvBL,CiI2BH,uEACI,2BACA,ajIvBE,CiIyBF,6EACI,ajIsBA,CiIlBR,sDACI,aACA,OACA,oBAIR,mDACI,aACA,cAEA,4EACI,aACA,mBACA,SAEA,+EACI,aACA,SACA,mBAEA,mGACI,aAKZ,4EACI,kBACA,ajI1DE,C;AkILN,4DACI,aACA,sBACA,S;ACNZ,2CACI,iBACA,qBACA,sBACA,yBACA,iBACA,qBACA,gBACA,8CACI,YAGA,oIACI,gCAGR,8CACI,gBACA,mB;AClBR,8BACI,mBACA,oBACA,gCAEA,4FACI,+B;ACNR,4BACI,cACA,gBAEA,mCACI,gBACA,Y;ACNR,4BACI,YACA,WACA,cAEA,oCACI,gCACA,oBACA,mBACA,aACA,mBACA,Y;ACRA,mEACI,eACA,eACA,WAGJ,+BACI,eAIA,uCACI,Q;ACdhB,cACI,YACA,WACA,aACA,sBACA,kBxIHS,CwIKT,sBACI,gCACA,eACA,WACA,exIXG,CwIaH,+BACI,eACA,aACA,qBAEA,sCACI,SACA,axIVF,CwIWE,iBACA,kBACA,oBAKZ,+BACI,OACA,WACA,wBxI7BK,CwI8BL,cAED,wCACI,oBACA,mBACA,gCAGI,uDACI,axIjCL,CwIkCK,eAIR,iDACI,mBAKX,sBACI,kBACA,6BACA,exIvDG,C;AyIDX,+BACI,YACA,WACA,aACA,sBACA,kBzIFS,CyIIT,uCACI,gCACA,eACA,WACA,ezIVG,CyIYH,gDACI,eACA,aACA,qBAEA,uDACI,SACA,azITF,CyIUE,iBACA,kBACA,oBAKZ,gDACI,OACA,WACA,wBzI5BK,CyI6BL,cAGI,+DACI,azI3BF,CyI4BE,eAKZ,uCACI,ezI1CG,CyI2CH,kBACA,6B;AC7CR,8BACI,aACA,sBACA,cACA,gBAEA,sCACI,gCACA,oBACA,mBAEA,6DACI,eAKJ,0CACI,aACA,QACA,cACA,mBACA,2BACA,eAEA,iGACI,a1I2BA,C0I1BA,wB1IvBF,C0I4BM,kFACI,aAEJ,iFACI,qBAKZ,uDACI,WACA,4EACI,qBAEJ,2EACI,aAIA,mEACI,qBAOpB,2CACI,OACA,aACA,sBACA,kBACA,uBACA,a1I1DM,C0I2DN,gBAEA,gDACI,eACA,a1IjBI,C;A2IrDhB,iCACI,aACA,SACA,YACA,WACA,cAEA,2CACI,MACA,wDACI,YACA,YACA,gBACA,UACA,iCAIR,8CACI,+BACA,mBACA,2D;ACpBJ,2CACI,aACA,QACA,mBACA,mBAEA,8CACI,SACA,UAIR,0GAEI,aACA,e5IfG,C4IgBH,yBACA,kBAEA,sHACI,aACA,mBAEA,4HACI,gBACA,cACA,OAGJ,4HACI,O;AC/BhB,+BACI,Y;ACCI,qGACI,gCAGR,mCACI,aACA,gBAEA,4EACI,SAGJ,sCACI,gBAEJ,sCACI,iBACA,mB;AClBR,iDACI,aACA,yBACA,WACA,kBACA,eACA,2BAEA,uDACI,oB/I0CI,C+IvCR,0DACI,oB/IwCI,C+IhCJ,mEACI,a/IhBF,C+IiBE,gB9IPF,C8IWN,8DACI,a/ItBE,C+IuBF,gB9IZE,C;A+IjBV,mCACI,eAEA,+CACI,gBAGJ,oDACI,yBACA,kBACA,qBACA,ehJXD,CgJYC,cACA,kBAGI,8DACI,cACA,cACA,eAIR,yEACI,yBAGJ,qHAEI,aAGJ,6DACI,WACA,mBAKJ,sKAEI,kBhJYA,CgJXA,oBhJWA,CgJVA,UhJ3CL,CgJ8CS,0LACI,UhJ/Cb,CgJuDX,kBACI,yBACA,cACA,iBACA,gBACA,sBACA,qBACA,iBACA,kBACA,c;AChEA,8BACI,eAEA,0CACI,gBAGJ,+CACI,yBACA,kBACA,qBACA,ejJXD,CiJYC,cACA,kBAGI,yDACI,cACA,cACA,eAIR,oEACI,yBAGJ,oEACI,aACA,yBACA,cAGJ,wDACI,WACA,mBAKJ,4JAEI,kBjJWA,CiJVA,oBjJUA,CiJTA,UjJ5CL,CiJ+CS,gLACI,UjJhDb,CiJwDX,0CACI,yB;AC1DJ,mCACI,yBACA,kBACA,mBACA,aACA,QACA,mBACA,eACA,2BACA,mBAEA,0CACI,kBlJqCQ,CkJpCR,yBAEA,qDACI,kBlJmCI,CkJ/BZ,iDACI,aACA,mBACA,iBAGJ,8CACI,UACA,mBACA,kBlJ2CQ,CkJxCZ,yCACI,mCAEA,gBjJjBM,CiJkBN,aACA,Q;ACnCA,sCACI,anJKE,CmJJF,gBACA,gBlJYE,C;AmJfN,sCACI,apJKE,CoJJF,gBACA,gBnJYE,C;AoJjBd,kCACI,aACA,sBACA,MACA,aACA,6BACA,gBACA,cACA,kBACA,iBACA,gBAGJ,iCACI,aACA,8BACA,mBACA,oBAGJ,gCACI,aACA,UAGJ,wBACI,qBACA,qBACA,kBACA,eACA,2BACA,+BAEA,iCACI,WACA,mBAIR,iCACI,sBACA,cACA,qBACA,qBACA,kBAEA,sDACI,yBAIR,2BACI,wBrJEY,CqJDZ,WACA,qBACA,kBACA,qBAEA,gDACI,wBrJJQ,CqJQhB,2BACI,sBACA,cACA,qBACA,aACA,mBACA,UACA,kBACA,qBAEA,mCACI,WACA,aACA,cACA,yBACA,sBAGJ,iCACI,yBAIR,gCACI,OACA,aACA,sBACA,yBACA,oBACA,iCAEA,wCACI,oBrJ1CQ,CqJ6CZ,4CACI,OACA,WACA,aACA,sBACA,gBACA,YACA,aACA,kBACA,gBACA,cACA,YACA,oBACA,gBAEA,kDACI,aAGJ,qDACI,mBACA,yBACA,cAGJ,yDACI,cAIR,yCACI,cACA,aACA,8BACA,WAEA,+CACI,aACA,2BAGA,cACA,OACA,wEACI,OACA,gBACA,qBACA,aACA,UAIR,gDACI,aACA,yB;ACxJZ,oCACI,aACA,WACA,mBAEA,kDACI,yBAEA,kEACI,wBtJ6CI,CsJ5CJ,WACA,oBACA,mCAIR,+CACI,2BAEA,+DACI,wBtJhBE,CsJiBF,cACA,oBACA,kCAGJ,mHACI,mBACA,yHACI,iBACA,aACA,mBACA,QACA,atJxBF,CsJ0BE,2IACI,atJ5BN,CsJgCF,yHACI,gBACA,oBAEA,+HACI,iBAMhB,mDACI,uBAEA,mEACI,yBACA,cACA,oBACA,gBACA,eACA,WAGJ,iEACI,kBACA,gBAGJ,kFACI,yBACA,cAMZ,iCACI,cACA,mBACA,qBACA,yBAEA,mDACI,aAIR,+BACI,eACA,gBAEA,iCACI,mBAEA,4CACI,gBAIR,oEACI,eACA,oBACA,kBAGJ,kCACI,gBAGJ,oCACI,iCACA,uBACA,qBACA,sBACA,iBAGJ,mCACI,iCACA,eACA,oBACA,gBACA,eAEA,wCACI,+BACA,UAIR,iCACI,atJ7EQ,CsJ8ER,0BAEA,uCACI,atJhFI,CsJoFZ,sCACI,gBAGJ,kCACI,kB;AChJR,oCACI,aACA,sBACA,mBACA,WACA,aAGJ,+BACI,aACA,UACA,mBAGJ,8BACI,UACA,WACA,kBACA,wBvJmCY,CuJlCZ,6DAEA,2CACI,uBAGJ,2CACI,uBAIR,+BACI,YACI,qBACA,WAEJ,IACI,mBACA,WAIR,kCACI,kBACA,avJlCU,CuJmCV,kBACA,uCAGJ,4BACI,KACI,UACA,2BAEJ,GACI,UACA,yB;;ACvDR,+BACI,kBACA,aACA,uBACA,UACA,eACA,sBACA,yBACA,oBACA,qBACA,axJEU,CwJDV,wBAEA,qCACI,oBxJqCQ,CwJpCR,wBxJZK,CwJgBb,kCACI,cACA,WACA,YACA,mBACA,sBACA,mBAGJ,+BACI,OACA,YACA,aACA,sBACA,WAEJ,kCACI,kBACA,QACA,UAGJ,+BACI,mBACA,kBACA,gBACA,sBACA,axJlCU,CwJmCV,gBACA,uBACA,mBAGJ,8BACI,iBACA,axJ9CU,CwJ+CV,gBACA,uBACA,mBACA,S;AC1DJ,gCACI,aACA,uBACA,UACA,eACA,sBACA,yBACA,oBACA,qBACA,azJGU,CyJFV,wBAEA,sCACI,oBzJsCQ,CyJrCR,wBzJXK,CyJeb,gCACI,cACA,WACA,YACA,mBACA,mBAGJ,gCACI,OACA,aACA,sBACA,WACA,YAGJ,iCACI,kBACA,gBACA,azJzBU,CyJ0BV,gBACA,uBACA,mBAGJ,+BACI,iBACA,azJrCU,CyJsCV,SACA,gBACA,uBACA,mB;ACjDJ,uCACI,aACA,sBACA,MAGJ,8BACI,oBACA,sBACA,qBAEA,mCACI,qBACA,qBACA,wB1JmCQ,C0JlCR,a1JwCQ,C0JvCR,kBACA,qBAKJ,4CACI,mBACA,gBACA,cACA,mBAGJ,8CACI,cACA,kBACA,kBAIR,gCACI,eACA,gBACA,cACA,oBAGJ,8BACI,mBAEA,0CACI,gBACA,UACA,SACA,aACA,sBACA,WAGJ,yCACI,aACA,uBAGJ,2CACI,cACA,aACA,cACA,aACA,mBACA,uBACA,wB1JbQ,C0JcR,WACA,kBACA,kBACA,oBACA,mBAGJ,4CACI,OAEA,wDACI,eACA,gBACA,a1JrEE,C0JsEF,oBAGJ,yDACI,kBACA,a1J9EE,C0J+EF,oBACA,gBAMR,gDACI,aACA,4DACA,UAKJ,kDACI,aACA,sBACA,UAKJ,8CACI,aACA,sBACA,U;AClHR,2CACI,aACA,sBACA,UAGJ,mCACI,mBAEA,oDACI,mBACA,gBACA,cACA,mBACA,gBAGJ,sDACI,cACA,SACA,gBACA,eAIR,gCACI,eACA,gBACA,cACA,wBAIA,iDACI,aACA,sBACA,UAGJ,gDACI,aACA,uBACA,UACA,eACA,sBACA,yBACA,oBACA,qBACA,a3JpCM,C2JqCN,wBAEA,sDACI,oB3JDI,C2JEJ,wB3JlDC,C2JsDT,gDACI,cACA,WACA,YACA,mBACA,mBAGJ,gDACI,OACA,aACA,sBACA,WACA,YAGJ,iDACI,kBACA,gBACA,a3JhEM,C2JiEN,gBACA,uBACA,mBAGJ,+CACI,iBACA,a3J5EM,C2J6EN,SACA,gBACA,uBACA,mB;AC1FR;EACE,cAAc;EACd,gBAAgB;EAChB;AACF;AACA;EACE;AACF;AACA;;;;;;;;;CASC;AACD;EACE,cAAc;EACd;AACF;AACA;;;;;;;EAOE,gCAAgC;EAChC;AACF;AACA;;;;EAIE,+BAA+B;EAC/B;AACF;AACA;;;;;;;;;;EAUE,iCAAiC;EACjC;AACF;AACA;;;EAGE,+BAA+B;EAC/B;AACF;AACA;;EAEE,iCAAiC;EACjC;AACF;AACA;;;EAGE,gCAAgC;EAChC;AACF;AACA;;;;EAIE,mCAAmC;EACnC;AACF;AACA;EACE,gDAAgD;EAChD;AACF;AACA;EACE,uCAAuC;EACvC,cAAc;EACd;AACF;AACA;EACE,oCAAoC;EACpC;AACF;AACA;EACE,sCAAsC;EACtC,cAAc;EACd;AACF;AACA;EACE,oCAAoC;EACpC,cAAc;EACd;AACF;AACA;EACE,wCAAwC;EACxC,cAAc;EACd;AACF;AACA;EACE,uCAAuC;EACvC,cAAc;EACd;AACF;AACA;;;;;;EAME,sBAAsB;;AAExB,C;ACjHA,sCACI,yBACA,yBACA,kCACA,gBACA,cAGJ,8CACI,aACA,mBACA,oBACA,UACA,sBACA,eACA,iBAEA,oDACI,wB7JjBK,C6JoBT,uDACI,WACA,YACA,a7JlBM,C6JmBN,cACA,8BAEA,+DACI,wBAKZ,6CACI,eACA,gBACA,a7J5BU,C6J6BV,OAGJ,gDACI,eACA,a7JrCU,C6JwCd,4CACI,6BACA,oBACA,aACA,sBACA,WAGJ,4CACI,aACA,sBACA,WAGJ,6CACI,kBACA,gBACA,a7JtDU,C6JyDd,4CACI,aACA,mBACA,YACA,iBACA,a7JjEU,C6JkEV,6FAGJ,6CACI,oBACA,mBACA,uBACA,kBACA,gBACA,iBACA,mBACA,gBACA,a7J7EU,C6J8EV,wB7JlFU,C6JmFV,uBACA,cACA,YAGJ,+CACI,iBACA,aACA,sBACA,UAGJ,+CACI,yBACA,sBACA,gBAGJ,sDACI,aACA,mBACA,YACA,qBACA,sBACA,eACA,iBACA,iBACA,gBACA,a7J3GU,C6J6GV,4DACI,wB7JpHK,C6JuHT,qEACI,aACA,cACA,a7JtHM,C6JuHN,cACA,8BAEA,6EACI,wBAKZ,qDACI,OAGJ,wDACI,a7JrIU,C6JsIV,gBAIA,gDACI,SACA,eACA,wB7JhJM,C6JiJN,sBACA,gBAEA,qDACI,6FACA,mBACA,a7JhJE,C6JiJF,qBACA,sBACA,YACA,yBACA,UAKR,0EACI,6BAEA,8EACI,gB;ACzKZ,gCACI,yBACA,mBACA,gBACA,mBACA,6BAEA,oDACI,cACA,kBACA,SACA,gBAGJ,sDACI,gBACA,aACA,mBACA,8BAGJ,oDACI,aACA,gBACA,kBACA,iEACA,uBAGJ,qDACI,qBACA,yBACA,WACA,gBACA,qBACA,yBACA,sBACA,eACA,wBACA,sBACA,iBAIA,6DACI,wB9JvBC,C8JwBD,a9J3CC,C8J+CT,sLAGI,iBACA,mB;ACtDR,4BACI,aACA,sBACA,YACA,gBACA,gBACA,kBAGJ,qCACI,OACA,gBACA,aACA,uBACA,aAGA,wDACI,UAGJ,8DACI,yBAGJ,8DACI,wB/JpBM,C+JqBN,kBAEA,oEACI,wB/JvBE,C+J4Bd,8BACI,yBACA,oBACA,qBACA,oBAEA,yCACI,cACA,kBACA,SACA,gBAGJ,yCACI,cACA,0BAEA,+CACI,cAIR,0CACI,qBACA,yBACA,WACA,kBACA,gBACA,wBACA,qBACA,yBACA,sBACA,YACA,wBAIR,8BACI,aACA,sBACA,mBACA,uBACA,YACA,kBACA,aACA,a/JvEU,C+JyEV,gDACI,WACA,YACA,mBACA,a/JlCQ,C+JoCR,oDACI,WACA,YAIR,iCACI,iBACA,gBACA,a/JrFM,C+JsFN,mBAGJ,gCACI,eACA,SACA,gBAIR,kCACI,oBAGJ,gCACI,WAGJ,yCACI,kBACA,SACA,SACA,2BACA,UACA,gBACA,kBACA,oCAGJ,uDACI,iB;AChIJ,mCACI,aACA,sBACA,YACA,gBAEA,yCACI,aAGJ,2CACI,oBACA,oIAEA,YACA,sCACA,0BACA,uDACA,cACA,aACA,mBACA,8BAGA,6DACI,OACA,2BAIJ,uDACI,cAEA,+DACI,iBACA,uBAKR,2DACI,OACA,yBAGJ,iDACI,aAEA,8DACI,mBAGJ,uDACI,WAIR,kDACI,eACA,gBACA,iBACA,cACA,SAGJ,2DACI,aACA,mBACA,WAEA,0EACI,aACA,mBACA,uBACA,WACA,YACA,UACA,gBACA,YACA,kBACA,eACA,cACA,aACA,sCAEA,gFACI,eACA,kBhKnFN,CgKsFE,wFACI,0BACA,mBAGJ,+FACI,kBhKxCJ,CgKyCI,WAEA,qGACI,kBhK3CR,CgKoDR,kDACI,OACA,aAKZ,qCACI,GACI,0BAEJ,KACI,6B;ACzHJ,4FACI,wBjKUM,CiKPN,sDACI,wBjKME,CiKLF,mBACA,iBAEJ,qDACI,WACA,gBAEJ,2DACI,UjKbD,CiKeH,oDACI,aACA,sDACI,qBAIZ,oCACI,aACA,MACA,UACA,6BACA,qDACI,YACA,gBACA,sBACA,gBACA,mBACA,iBACA,iBACA,SAEJ,gEACI,wBjKOE,CiKNF,sEACI,wBjKeA,CiKXZ,mCACI,aAIR,iEACI,mB;ACjDF,qEACE,alKQU,CkKPV,aACA,mBACA,OACA,uBACA,WACA,YACA,aACA,kBAEA,uEACE,oBAGF,yEACE,OACA,WACA,YACA,2BACA,mBAIA,+EACE,sBACA,alK0BQ,CkKzBR,oCACA,2BACA,mBACA,mBACA,mCACA,kCAIJ,2FACE,YACA,UACA,kBACA,iBACA,cACA,wBlKzBO,C;AmKrBZ,yBACC,iBACA,gBAGF,4CACE,UACA,wBnKIY,CmKDd,kDACE,wBnKHY,CmKMd,wDACE,wBnKNY,CoKHN,qCACI,gBACA,YACA,gBAEA,4CACI,UAIA,+CACI,apKJN,CoKKM,UACA,kBAMpB,sCACI,oBpKnBU,CoKoBV,apKdU,CoKeV,gCACA,aACA,mBAEA,yDACI,4BACA,aACA,mBACA,SACA,WAEA,kEACI,kBpKjCE,CoKoCN,kEACI,cACA,e;AC3CZ,SACI,mBAEA,gBACI,kBACA,kBACA,aACA,qBACA,QAEA,sBACI,arK4CI,CqKzCR,yBACI,WACA,cAGJ,sBACI,WACA,kBrKhBE,CqKiBF,WACA,OACA,kBAIA,4BACI,0BACA,mBAMR,kCACI,2BACA,iBACA,kBACA,gBACA,cAEA,0CACI,aACA,SACA,mBACA,iBAIA,mDACI,OACA,WACA,cAEJ,mDACI,aACA,QAGJ,gDACI,kBrKdL,CqKeK,YACA,aAIR,wCACI,kBrKrBD,CqKwBH,4CACI,kBACA,aAEA,8CACI,cACA,WACA,cACA,WAEA,oDACI,kBrKnCT,CqKoCS,YACA,aAOpB,sBACI,gBAIR,qCAKoB,mDACI,aACA,gB;ACvGpB,8BACI,cACA,YAEJ,6BACI,aACA,eACA,YACA,2BACA,mBAEJ,kCACI,aAIA,2EACI,aAGJ,0CACI,eAKZ,sCAEQ,8BACI,aAEJ,6BACI,qBACA,oBAEA,mCACI,sBACA,oCACA,2BACA,mBACA,mBACA,mCACA,kCACA,atKSA,E;AuKrDhB,gCACI,UACA,aACA,OACA,yBACA,eAEA,iDACI,kBACA,yBACA,aACA,sBACA,SACA,WAEA,iEACI,aACA,QACA,mBACA,WAEA,gFACI,aACA,eACA,UvKvBL,CuKwBK,eACA,gBAGJ,+EACI,aAGJ,gFACI,OACA,aACA,sBACA,kBACA,WAEA,qMAEI,avKnCN,CuKoCM,kBACA,UACA,QAEA,mNACI,SAGJ,iNACI,UAIR,sFACI,oBACA,iBACA,kBvKxDP,CuKyDO,oBvKvDN,CuKwDM,WACA,iBACA,YACA,sBAEA,oGACI,aAMhB,kEACI,evKzED,CuK0EC,eACA,YACA,yBAEA,gFACI,cACA,WACA,gBACA,aACA,uBACA,mBACA,QACA,yBACA,avKjCA,CuKkCA,kBACA,evKzFL,CuK+FH,yDACI,eACA,WACA,gBACA,SACA,UACA,YACA,YACA,kBAIQ,qNAEI,avKtGV,CuKyGM,8FACI,avK1GV,CuK2GU,OACA,gBACA,aACA,WAEA,4GACI,cACA,2BACA,YACA,iBACA,iBACA,sBAEA,wHACI,4BACA,6BAOpB,0EACI,cACA,gBAEA,sFACI,eAKZ,iDACI,kBACA,YACA,aACA,0BACA,OACA,MACA,YAMZ,sCACI,gCACI,YACA,0CACI,0BAGA,yDACI,WACA,MACA,OACA,yBACA,0BAEA,yEACI,WACA,mBACA,uFACI,eAQxB,qCAEQ,iDACI,cAGI,gFACI,cAGJ,wNAGI,aAIA,mFACI,yCACA,0CAQZ,yDACI,aACA,wEACI,aAIA,gPAGI,e;AAxNI,2FACI,cAEA,wMAEI,YACA,WAMZ,6EACI,evKnBjB,C;AwKDX,wEAEI,+B;ACFJ,+BACI,eACA,8BACA,mBACA,yBACA,SACA,cACA,YACA,WACA,YACA,YACA,mKACA,4CACA,aACA,sBACA,gBAGA,0CACI,gCAIJ,yBAvBJ,+BAwBQ,kBAGJ,2CACI,kBACA,UACA,MACA,SACA,UACA,iBACA,yBACA,aAGA,yBAXJ,2CAYQ,cAIR,uCACI,gBACA,cAGJ,oCACI,QACA,WAGA,gBACA,YAIA,+CAVJ,oCAWQ,gBACA,gBAIJ,yBAhBJ,oCAiBQ,eACA,gBAEA,0CACI,gBAKZ,qCACI,kBACA,YACA,MACA,gBACA,cACA,gBACA,eAGA,gDACI,mBACA,uBACA,uBACA,gBACA,UACA,oBAIR,wCACI,gBACA,0BACA,2BAGJ,gDACI,0BACA,2BAGJ,uCACI,2BAGJ,uCAEI,oGAGJ,uCAEI,oGAIA,0BACA,2B;AC3HR,yBACI,sBACA,iBACA,cAEA,kDACI,iBACA,iBACA,gBAEA,yEACI,UACA,aACA,uBACA,mBAGJ,2EACI,gB;ACjBZ,eACA,qBACA,oBAeA,gBACI,yCACA,qB3KjBO,C2KkBP,aACA,uBACA,mBACA,YACA,mBACA,yDACA,sBACA,4BACA,yBACA,a3KlBU,C2KmBV,iCACI,kBACA,cACA,kBACA,a3KjBK,C2KoBT,+BACI,sBACA,uBACA,cAEA,wDACI,aACA,WACA,uBACA,mBAEA,6JAEI,WAMhB,yBACI,wBACA,WACA,aAGA,+BACI,gBACA,mBAIJ,gCACI,gBACA,YACA,mBAIR,6CAEI,YACA,uBACA,mBAIA,yBACI,gBAEJ,yBACI,kBAEJ,wBACI,gBACA,mBAIR,yBACI,WAGJ,gDACI,iBACA,kBACA,kBACA,a3K5FU,C2K6FV,mDACI,iBACA,mBAEJ,mDACI,iBACA,qBAEJ,sDACI,cACA,a3KvGM,C2KwGN,kBAEJ,oEACI,mBAEJ,kDACI,mBAEJ,kDACI,a3KhFM,C2KkFV,gFACI,oB3KxHM,C2K0HV,0DACI,iBACA,uEACI,oB3K7EI,C2KiFR,wEACE,yBAIN,iEACI,mBAGJ,4DACI,gBAEJ,wDACI,yBACA,WACA,kBAEJ,wEACI,wB3KnGQ,C2KoGR,WACA,8EACI,wB3KrGI,C2KuGR,iFACI,wB3KzJE,C2K0JF,a3KzJE,C2K4JV,yEACI,a3K/GQ,C2KgHR,mBACA,+BACA,+EACI,+BACA,oB3KnHI,C2K6HhB,uCAEI,mBACA,OACA,aACA,sBAGJ,8BACI,gBA9KS,CA+KT,kBACA,WACA,YACA,gBACA,aACA,mBAEA,uCACI,aACA,sBACA,kBACA,gBACA,kBACA,WACA,YACA,uCAEJ,mCACI,wB3K5MK,C2K8MT,8CACI,qB3KjNG,C2KkNH,oB3K9MM,C2KkNd,2BACI,YACA,aACA,sBACA,OAEA,gCACI,wB3K3NK,C2K4NL,OAIR,kBACI,kBACA,WACA,SACA,YACA,gBAGJ,uBACI,eA9NS,CA+NT,iB1KjOS,C0KoOb,2FAGI,wBAGJ,4DAEI,UACA,4BAGJ,iCACI,kBAGJ,mBACI,kBACA,aACA,8BACA,eA9PY,CA+PZ,wCACI,kBACA,eAjQQ,CAkQR,cACA,WACA,gBACA,mBACA,+CACI,cAEJ,4DACI,UACA,mBAIZ,wBACI,iBACA,aACA,sBACA,uBACA,uBACA,8BACI,gBACA,kBACA,a3KtRM,C2KuRN,cAEJ,2BACI,a3KvRM,C2KwRN,mBAGR,uBACI,YACA,aACA,mBACA,eAEJ,WACI,wB3KlSU,C2KmSV,a3KxSU,C2KySV,YACA,kBACA,gCAEA,0BACI,wB3K9QM,C2K+QN,a3K3SM,C2K4SN,gBACA,mBACA,aACA,mBACA,8BACA,kBACA,mBAGJ,6BACI,wB3K1SK,C2K2SL,a3K9TK,C2K+TL,gBACA,gCACA,aACA,mBACA,8BACA,kBACA,mBAGR,WACI,YACA,qB3K5UO,C2K6UP,WAhUS,CAiUT,gCACA,aACA,mBACA,8BACA,eACA,WACA,4BACI,aACA,mBACA,sBAEJ,uBACI,iBACA,oBACA,WA/UK,CAgVL,WACA,6BACI,eAGR,qCACI,aACA,yCACI,Y3K3VE,C2K4VF,eAEJ,4CACI,eACA,wB3KjWE,C2KoWV,yCACI,aACA,aACA,mBACA,6CACI,UACA,eAEJ,gDACI,eACA,wB3KpXE,C2KuXV,0BACI,kBACA,aACA,sBACA,SAEA,8BACI,UACA,iBAEJ,mCACI,aACA,mBACA,iBACA,kBACA,2BACA,mBACA,sBACA,yDACI,iBACA,gBACA,wB3K3XH,C2K4XG,yBACA,kBACA,YACA,mBACA,QAEJ,yCACI,oCACA,2BACA,mBACA,mBACA,mCACA,kCAIZ,2BACI,uBACA,oB3K3ZM,C2K6ZV,gCACI,YACA,mCACI,e3KvaD,C2KwaC,yBAEA,gDACI,2BACA,sDACI,kB3K1aN,C2K2aM,sHACI,a3KzXR,C2K0XQ,Y3K1XR,C2KiYR,0CACI,kBACA,gDACI,kBACA,WACA,UACA,YACA,kB3K1bF,C2K2bE,QAKR,yFAEI,eAIZ,sCAEQ,qEACI,aACA,mBACA,gFACI,yBACA,2BAGA,sFACI,sBACA,oCACA,2BACA,mBACA,oB3KpaJ,E2K0aZ,wBACI,WACA,eA5dQ,CA6dR,kBACA,MACA,aACA,8CACI,gBACA,4BACA,aACA,OACA,8BACA,mBACA,YACA,gBAEJ,6CACI,WACA,oB3K7eE,C2K8eF,eAIQ,wJACI,a3KjcR,C2KkcQ,Y3KlcR,C2KwcZ,4BACI,WACA,cAnfK,CAqfL,0CACI,UAEJ,iDACI,WAjgBI,CAugBZ,sCACI,mBACA,0DACI,mBAGI,4IACI,a3K9fP,C2K+fO,Y3K/fP,C2K0gBL,2EACI,eAKZ,4BACI,gCACA,4BACA,aACA,+BACA,gCACI,Y3KpiBM,C2KqiBN,WAEJ,uCACI,UACA,W3KhjBG,C2KkjBP,kCACI,iBACA,a3K1iBM,C2K2iBN,mBACA,oBAIR,mCACI,gCACA,4BACA,aACA,mBACA,+BACA,WAnjBS,CAojBT,uCACI,S3KlkBG,C2KmkBH,WAEJ,yCACI,iBACA,U3KvkBG,C2KwkBH,mBACA,oBAIR,eACI,eACA,YACA,WACA,8BACA,sCACA,WA9kBY,CAglBZ,4CACI,WACA,sBACA,8BAGQ,yEACI,a3KhkBN,C2KkkBE,uEACI,Y3KnkBN,C2KokBM,8EACI,UACA,c3KtkBV,C2K6kBV,2CACI,QACA,gBACA,4DACI,a3KjlBE,C2KklBF,iBACA,iBACA,kBACA,mBACA,gBACA,uBAEJ,wDACI,kBAGA,kEACI,wB3KlnBF,C2KonBF,qEACI,a3KjmBF,C2KmmBF,mEACI,Y3KpmBF,C2KqmBE,0EACI,UACA,c3KvmBN,C2K6mBV,mCACI,aACA,aAGQ,wHACI,a3K1nBP,C2K2nBO,Y3K3nBP,C2K8nBD,uDACI,kB3KjpBF,C2KkpBE,mBAKJ,2EACI,iBAIZ,oBACI,OAEJ,sBACI,YAEJ,wCACI,aACA,QAEJ,sCACI,wB3K/pBM,C2KgqBN,WACA,iBACA,YACA,cACA,iBACA,gCACA,uBACA,mBACA,gBAEJ,wDACI,UAEJ,4BACI,aACA,8BACA,gCAEJ,yBACI,oBACA,WAEJ,qCACI,iBACA,wB3K/qBK,C2KgrBL,yBAGA,oDACI,6BAMZ,sCAEI,yBACI,UAEJ,eACI,OACA,kBAGA,qCACI,aAEJ,+KAII,aAEJ,4BACI,YAEJ,uBACI,cAMR,qBACI,eAvuBQ,CAwuBR,kBACA,gCACA,YACA,YACA,OACA,e3KlvBG,C2KmvBH,+BACA,cAGI,yDACI,iBAEA,wEACI,YAEA,wFACI,mBACA,eACA,yBACA,a3K3vBV,C2K4vBU,eAKA,wGACI,uBAEA,qHACI,gBAGJ,qHACI,iBACA,kBACA,2IACI,gBAGJ,yHACI,QAGJ,2HACI,kB3KvxBtB,C2K4xBkB,yIACI,kB3KzuBpB,C2K0uBoB,WAKJ,+HACI,a3KjyBtB,C2KkyBsB,mBAW5B,wCACI,YAEA,+CACI,YAGR,oCACI,mBAOZ,sCAEQ,qBACI,YACA,2BACA,uBAEA,4BACI,qCACA,OAIR,iBACI,oBCn1BZ,sCAEE,4BAGF,gCAEE,UAIF,8DAEE,+BAGF,wDAEE,UAIF,sDAEE,+BAEF,gDAEE,UAGF,gDACE,mCAGF,qCACE,UCpCF,QACE,8BAEF,kBACE,QACE,uBAEF,IACE,uBAEF,IACE,wBAEF,IACE,wBAIJ,aACE,gDAGF,uBACE,GACE,mBAEF,IACE,qBAEF,KACE,oBAIJ,OACE,sCAEF,2BACE,GACE,oCAEF,KACE,qCC1CJ,UACI,iBACA,yBACA,kBACA,sBACA,aACI,SAIR,wBACI,aACA,QACA,8BACI,cAEJ,sCACI,iBACA,uBACA,+BACA,wBACA,uBACA,sFACI,gBACA,kBACA,gBAEJ,0CACI,6BACA,mBACA,+BACA,+BACA,sDAGA,gDACI,mCAGR,4CACI,0BAEJ,4CACI,eAEJ,6CACI,kBACA,sBACA,sBAEJ,4FAEI,kBACA,sBACA,sBAEJ,+CACI,kBACA,sBACA,sBAEJ,4CACI,kBACA,sBACA,sBAEJ,+CACI,kBACA,sBACA,sBAEJ,4CACI,YC/DZ,WACI,oBACA,kBACA,gBACA,0DACA,uKAKJ,eACI,YACA,aACA,sBACA,OAGJ,SACI,gBAGJ,QACI,OACA,wB/KxBU,C+K2Bd,SACI,a/KUU,C+KTV,eACI,eACA,a/KSM,C+KRN,0BAIR,WACI,WACA,YACA,kBAEJ,iBACI,WACA,YACA,kBAEJ,YACI,wB/K1CU,C+K2CV,oCACI,wB/KvBM,C+KwBN,0CACI,wB/KxBE,C+K6Bd,YACI,WACA,YACA,eACI,iBACA,gBACA,gBAEJ,wBACI,a/K3DM,C+K6DV,uBACI,WAIR,sBACI,eACA,mFACI,yCACA,iDAEJ,4BACI,a/K1CM,C+K8Cd,YACI,WACA,YACA,iBAGJ,iBACI,a/KrDU,C+KsDV,uBACI,a/KrDM,C+K0DV,uBACI,mBAEJ,yBACI,YACA,aAIR,+BACI,wB/K7GU,C+K8GV,a/K3GU,C+K4GV,kBACA,yBACA,aACA,kBAEA,iEACI,kBAMD,4BACI,cACA,kBACA,mBACA,oBACA,yBAKX,MACI,eAGJ,cACI,yBACA,UAIJ,6BACI,eAGJ,2CACI,mBAGJ,gBACI,aACA,mBACA,sBACI,a/KpHM,C+KqHN,eACA,4BACI,0BAGR,sCACI,oBACA,WAMR,mFAEI,a/KpIU,C+KuId,sEACI,wB/KhLS,C+KiLT,kFACI,kBAIR,uFACI,wB/KtLU,C+KyLd,gBACI,kBACA,wB/KzJU,C+K0JV,a/KvLU,C+KwLV,gBACA,yBACA,aACA,mBACA,uBACA,iBAEA,wBACI,gBACA,YACA,gBAIR,kBACE,oBACA,4BACA,qBACA,gBACA,uBAGA,6BACE,qBAEF,+BACE,qBAEF,8BACE,yB;AChOJ,iEAAc,CAAd,8FAAc;;AAAd;;;CAAc;;AAAd;;CAAc;;AAAd;;;CCcC,sBAAsB;ADdT;;AAAd;;CAAc;;AAAd;CCsBC,gBAAgB;CAChB,cAAW;IAAX,WAAW;ADvBE;;AAAd;;;CAAc;;AAAd;CCgCC,iBAAiB,EAAE,MAAM;CACzB,8BAA8B,EAAE,MAAM;ADjCzB;;AAAd;;;CAAc;;AAAd;;CAAc;;AAAd;CC8CC,SAAS;AD9CI;;AAAd;;CAAc;;AAAd;CCsDC;;;;;;;;;kBASiB;AD/DJ;;AAAd;;;CAAc;;AAAd;;;CAAc;;AAAd;CC6EC,SAAS,EAAE,MAAM;CACjB,cAAc,EAAE,MAAM;AD9ET;;AAAd;;;CAAc;;AAAd;;CAAc;;AAAd;CC2FC,yCAAiC;SAAjC,iCAAiC;AD3FpB;;AAAd;;CAAc;;AAAd;;CCoGC,mBAAmB;ADpGN;;AAAd;;;CAAc;;AAAd;;;;CCgHC;;;;;;WAMU,EAAE,MAAM;CAClB,cAAc,EAAE,MAAM;ADvHT;;AAAd;;CAAc;;AAAd;CC+HC,cAAc;AD/HD;;AAAd;;CAAc;;AAAd;;CCwIC,cAAc;CACd,cAAc;CACd,kBAAkB;CAClB,wBAAwB;AD3IX;;AAAd;CC+IC,eAAe;AD/IF;;AAAd;CCmJC,WAAW;ADnJE;;AAAd;;;CAAc;;AAAd;;;CAAc;;AAAd;CCiKC,cAAc,EAAE,MAAM;CACtB,qBAAqB,EAAE,MAAM;ADlKhB;;AAAd;;;CAAc;;AAAd;;;CAAc;;AAAd;;;;;CCoLC,oBAAoB,EAAE,MAAM;CAC5B,eAAe,EAAE,MAAM;CACvB,iBAAiB,EAAE,MAAM;CACzB,SAAS,EAAE,MAAM;ADvLJ;;AAAd;;;CAAc;;AAAd;SCgMS,MAAM;CACd,oBAAoB;ADjMP;;AAAd;;CAAc;;AAAd;;;;CC4MC,0BAA0B;AD5Mb;;AAAd;;CAAc;;AAAd;CCoNC,kBAAkB;CAClB,UAAU;ADrNG;;AAAd;;CAAc;;AAAd;CC6NC,8BAA8B;AD7NjB;;AAAd;;;CAAc;;AAAd;CCsOC,gBAAgB;ADtOH;;AAAd;;CAAc;;AAAd;CC8OC,UAAU;AD9OG;;AAAd;;CAAc;;AAAd;CCsPC,wBAAwB;ADtPX;;AAAd;;CAAc;;AAAd;;CC+PC,YAAY;AD/PC;;AAAd;;;CAAc;;AAAd;CCwQC,6BAA6B,EAAE,MAAM;CACrC,oBAAoB,EAAE,MAAM;ADzQf;;AAAd;;CAAc;;AAAd;CCiRC,wBAAwB;ADjRX;;AAAd;;;CAAc;;AAAd;CC0RC,0BAA0B,EAAE,MAAM;CAClC,aAAa,EAAE,MAAM;AD3RR;;AAAd;;;CAAc;;AAAd;;CAAc;;AAAd;CCwSC,kBAAkB;ADxSL,CAAd;;;;EAAc;;AAAd;;EAAc;;AAAd;;;;;;;;;;;;;EEuBE,SAAS;AFvBG;;AAAd;EE2BE,6BAA6B;EAC7B,sBAAsB;AF5BV;;AAAd;EEgCE,SAAS;EACT,UAAU;AFjCE;;AAAd;;EEsCE,gBAAgB;EAChB,SAAS;EACT,UAAU;AFxCE;;AAAd;;EAAc;;AAAd;;;;;EAAc;;AAAd;EEuDE,4NAAsP,EAAE,MAAM;EAC9P,gBAAgB,EAAE,MAAM;AFxDZ;;;AAAd;;;EAAc;;AAAd;EEkEE,oBAAoB;EACpB,oBAAoB;AFnER;;AAAd;;;;;;;;;;;;;;;;;;;;;;;;EAAc;;AAAd;;;EEmGE,sBAAsB,EAAE,MAAM;EAC9B,eAAe,EAAE,MAAM;EACvB,mBAAmB,EAAE,MAAM;EAC3B,0BAA0B,EAAE,MAAM;AFtGtB;;AAAd;;EAAc;;AAAd;EE8GE,qBAAqB;AF9GT;;AAAd;;;;;;;;EAAc;;AAAd;EE4HE,mBAAmB;AF5HP;;AAAd;EEgIE,gBAAgB;AFhIJ;;AAAd;EEqIE,UAAU;EACV,cAAwC;AFtI5B;;AAAd;;EEqIE,UAAU;EACV,cAAwC;AFtI5B;;AAAd;;EE2IE,eAAe;AF3IH;;AAAd;;;;;;EAAc;;AAAd;CEuJC,aAAa;AFvJA;;AAAd;EE2JE,yBAAyB;AF3Jb;;AAAd;;;;;;EEoKE,kBAAkB;EAClB,oBAAoB;AFrKR;;AAAd;;;EAAc;;AAAd;EE8KE,cAAc;EACd,wBAAwB;AF/KZ;;AAAd;;;;;;EAAc;;AAAd;;;;;EE+LE,UAAU;EACV,oBAAoB;EACpB,cAAc;AFjMF;;AAAd;;;;;EAAc;;AAAd;;;;EE+ME,+GAAyI;AF/M7H;;AAAd;;;;;;;;;;;;;;;EAAc;;AAAd;;;;;;;;EE2OE,cAAc,EAAE,MAAM;EACtB,sBAAsB,EAAE,MAAM;AF5OlB;;AAAd;;;;;EAAc;;AAAd;;EEwPE,eAAe;EACf,YAAY;AFzPA;;AAAd;;EAAc;;AAAd;EEiQE,aAAa;AFjQD;;AGAd;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IHAA;;;;;;;;;;;OAAc;;IGAd;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;IAAA;SAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;;IAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;;IHAA,gFAAc;IGAd;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;IAAA;CAAA;CAAA;CAAA;AHCA;CGDA;AHCoB;AAApB;CGDA;AHCoB;AAApB;;CGDA;EAAA;EAAA;;CAAA;EAAA;EAAA;AHCoB;AAApB;;CGDA;EAAA;EAAA;;CAAA;EAAA;EAAA;AHCoB;AAApB;;CGDA;EAAA;EAAA;;CAAA;EAAA;EAAA;AHCoB;AAApB;;CGDA;EAAA;EAAA;;CAAA;EAAA;EAAA;AHCoB;AAApB;;CGDA;EAAA;EAAA;;CAAA;EAAA;EAAA;AHCoB;AGDpB;CAAA;CAAA;AAAA;;CAAA;EAAA;EAAA;CAAA;AAAA;CAAA;CAAA;CAAA;AAAA;;CAAA;EAAA;EAAA;CAAA;AHEA;CGFA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;;CGFA;EAAA;EAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;;CGFA;EAAA;EAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;IAAA;SAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;MAAA;AHEmB;AAAnB;CGFA;MAAA;AHEmB;AAAnB;CGFA;MAAA;AHEmB;AAAnB;CGFA;MAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;CAAA;CAAA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAAnB;CGFA;AHEmB;AAFnB;CGAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;CGAA;AH2TA;AA3TA;CGAA;CAAA;AH2TA;AA3TA;;CGAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;AH2TA;AA3TA;;CGAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;AH2TA;AA3TA;;CGAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;EAAA;AH2TA;AA3TA;;CGAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;AH2TA;AA3TA;;CGAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;;CAAA;EAAA;EAAA;AH2TA;;AIzTA,6BACI,WACA,WACA,wBpLEU,CoLDV,gBACA,mB;ACLJ,aACI,gBAGI,+CACI,4BACA,6BAIR,gCACI,4BACA,yBACA,cpLMM,CoLLN,gBACA,sCACI,oBrLVE,CqLWF,aAIR,yBACI,kBrLnBK,CqLoBL,+CACA,iBACA,YACA,gBACA,UACA,8BACA,+BACA,gCAGJ,wBACI,eACA,gCAEA,qCACI,mBAGJ,2CACI,gBACA,+BAEA,oDACI,wBrLzCF,CqL4CF,kDACI,yBAGJ,2DACI,2BAIR,8BACI,wBrLtDE,CqLuDF,wDACI,2B","sources":["webpack://@flowfuse/flowfuse/./frontend/src/ui-components/stylesheets/ff-core.scss","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/stylesheets/ff-colors.scss","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/stylesheets/ff-utility.scss","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/stylesheets/ff-components.scss","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/stylesheets/ff-theme-light.scss","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/stylesheets/ff-theme-dark.scss","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/stylesheets/ff-immersive-editor.scss","webpack://@flowfuse/flowfuse/./frontend/src/components/dialogs/EducationModal.vue","webpack://@flowfuse/flowfuse/./frontend/src/layouts/Docs.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/notifications.scss","webpack://@flowfuse/flowfuse/./frontend/src/components/ExpertButton.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/empty-state.scss","webpack://@flowfuse/flowfuse/./frontend/src/components/TeamTypeTile.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/PageNotFound.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/SectionTopMenu.vue","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/components/form/ListBox.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/audit-log.scss","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/accordion.scss","webpack://@flowfuse/flowfuse/./frontend/src/components/dialogs/AssetDetailDialog.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/blueprints/BlueprintTile.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/admin/FlowBlueprints/dialogs/ImportFlowBlueprintsDialog.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/admin/FlowBlueprints/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/admin/NotificationsHub.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/admin/Template/sections/Catalogues.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/admin/Template/sections/NPMRegistry.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/TextCopier.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/admin/Template/sections/Environment.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/pages/admin.scss","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/info-card.scss","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/components/PopoverItem.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/icons-animated/Installing.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/icons-animated/Pulling.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/icons-animated/Pushing.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/icons-animated/Restarting.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/icons-animated/Starting.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/device/Overview.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/charts/performance/CpuChart.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/charts/performance/MemoryChart.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/notices/NoticeBanner.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/dialogs/device-group-management/components/device-list.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/elements/ToggleButtonGroup.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/device/VersionHistory/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/dialogs/AssetCompareDialog.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/flow-viewer/FlowViewer.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/drawers/snapshots/SnapshotDetailsDrawer.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/device/VersionHistory/Snapshots/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/version-history/timeline/TimelineGraph.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/version-history/timeline/TimelineEvent.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/device/VersionHistory/Timeline/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Devices/dialogs/components/DeviceCredentialsDialog/InstallationMethodSelector.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Devices/dialogs/components/DeviceCredentialsDialog/OsSelector.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/device/components/AssignDeviceDialog.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/device/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/ResizeBar.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/immersive-editor/DrawerTrigger.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/immersive-editor/LoadingScreenWrapper.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/device/Editor/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/blueprint-selection.scss","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/Blueprints/BlueprintSelection.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/dialogs/BlueprintSelectorDialog.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/components/InstanceForm.vue","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/components/form/DateTime.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/Settings/Maintenance.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/VersionHistory/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/VersionHistory/Timeline/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/FileUpload.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/file-browser/cells/FilePath.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/file-browser/VisibilitySelector.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/Assets.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/DevicesBrowser.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/StepSlider.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/MultiStepForm.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/instance/steps/ApplicationStep.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/instance/steps/DuplicationStep.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/instance/steps/InstanceStep.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/components/InstanceLogs.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/pages/project.scss","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/Overview.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/Performance/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/instance/ActionButton.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/components/DashboardLink.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/components/EditorLink.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/instance/steps/flows-step/BlueprintsSection.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/instance/steps/flows-step/ImportFlowsSection.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/instance/steps/flows-step/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/bill-of-materials/InstancesItem.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/bill-of-materials/VersionsList.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/bill-of-materials/DependencyItem.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/application/DeviceGroup/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/pipelines.scss","webpack://@flowfuse/flowfuse/./frontend/src/pages/application/components/cells/DeploymentName.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/pipelines/DeployStageDialog.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/application/Settings/components/RoleRow.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/IconLink.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/components/ApplicationSummaryLabel.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/tiles/InstanceCounter.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Applications/components/Application.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/applications-list.scss","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Applications/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/AuditLog.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Billing/components/UsageOverview.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/tiles/MediumTile.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Clients/components/BrokerClient.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Clients/dialogs/ClientDialog.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Clients/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Docs/components/TopicDocs.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Docs/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Hierarchy/components/TopicSegment.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Hierarchy/TopicHierarchy/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Hierarchy/TopicInspector/PayloadMetadata.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Hierarchy/components/TopicSchema.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Hierarchy/components/suggestions/TopicSuggestion.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Hierarchy/TopicInspector/PayloadSchema.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Hierarchy/TopicInspector/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/Hierarchy/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Brokers/components/BrokerForm.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Home/components/DashboardSection.vue","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/components/kebab-menu/KebabMenu.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/instance/components/InstanceMinimalStatusBadge.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Home/components/RecentlyModifiedDevices.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Home/components/RecentlyModifiedInstances.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Home/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Library/Blueprints.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Library/Registry/components/RegistryEntry.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Library/Registry/Index.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/code-previewer.scss","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Library/TeamLibrary.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Members/components/ApplicationPermissionsRow.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Performance/components/CPUUtilizationCell.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Pipelines/components/TeamPipelineStage.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Pipelines/components/TeamPipeline.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Pipelines/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Settings/TeamAdminTools.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/TableExplorer/components/RowsHeader.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/TableExplorer/components/table-cells/text-cell.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/TableExplorer/components/RowsList.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/TableExplorer/drawers/components/TableColumn.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/TableExplorer/drawers/CreateTable.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/TableExplorer/drawers/TableSchema.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/TableExplorer/components/TablesList.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/TableExplorer/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/Table/components/TableCredentials.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/components/ChooseDatabase.vue","webpack://@flowfuse/flowfuse/./frontend/src/pages/team/Tables/components/DatabaseForm.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/multi-step-forms/instance/steps/TeamStep.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/components/CapabilitiesSelector.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/components/ContextSelector.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/components/ContextChip/index.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/components/IncludeDebugContextButton.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/components/IncludeSelectionButton.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/ExpertChatInput.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/ExpertChatMessage.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/ExpertLoadingDots.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/resource-cards/PackageResourceCard.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/resource-cards/StandardResourceCard.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/ExpertRichGuide.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/ExpertRichResources.vue","webpack://@flowfuse/flowfuse/./node_modules/highlight.js/styles/github.css","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/ExpertToolCall.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/components/UpdateBanner.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/expert/Expert.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/drawers/expert/ExpertDrawer.vue","webpack://@flowfuse/flowfuse/./frontend/src/tours/tour-theme.scss","webpack://@flowfuse/flowfuse/./frontend/src/components/NotificationsButton.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/team-list.scss","webpack://@flowfuse/flowfuse/./frontend/src/components/TeamSelection.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/global-search/components/ResultSection.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/global-search/components/SearchTrigger.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/global-search/GlobalSearch.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/drawers/LeftDrawer.vue","webpack://@flowfuse/flowfuse/./frontend/src/components/drawers/RightDrawer.vue","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/pages/login.scss","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/layouts.scss","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/transitions.scss","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/animations.scss","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/components/charts.scss","webpack://@flowfuse/flowfuse/./frontend/src/stylesheets/common.scss","webpack://@flowfuse/flowfuse/./frontend/src/index.css","webpack://@flowfuse/flowfuse/./frontend/src/%3Cinput%20css%20aU0re6%3E","webpack://@flowfuse/flowfuse/./frontend/src/%3Cinput%20css%20_AERer%3E","webpack://@flowfuse/flowfuse/<no source>","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/components/Divider.vue","webpack://@flowfuse/flowfuse/./frontend/src/ui-components/components/form/ComboBox.vue"],"sourcesContent":["/*\n ff-core contains styling on the fundamental HTML elements\n*/\n\n* {\n box-sizing: border-box;\n}\n\n.transition-fade--color {\n --time: 0.3s;\n transition: var(--time) color, var(--time) background-color, var(--time) fill, var(--time) stroke, var(--time) border-color;\n -webkit-transition: var(--time) color, var(--time) background-color, var(--time) fill, var(--time) stroke, var(--time) border-color;\n}\n\nhtml {\n font-family: ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";\n font-size: 14px;\n line-height: 1.25rem;\n}\n\nbody {\n margin: 0;\n color: $ff-grey-800;\n position: relative;\n overflow: hidden;\n}\n\nh1 {\n font-weight: bold;\n font-size: $ff-funit-xl;\n line-height: 1.45 * $ff-funit-xl;\n margin-bottom: $ff-unit-lg;\n}\n\nh2 {\n font-weight: bold;\n font-size: $ff-funit-lg;\n line-height: 1.45 * $ff-funit-lg;\n margin-bottom: $ff-unit-sm;\n}\n\nh3 {\n font-size: $ff-funit-md;\n line-height: 1.45 * $ff-funit-md;\n margin-bottom: $ff-unit-sm;\n font-weight: bold;\n}\n\nh4 {\n font-size: $ff-funit-md;\n line-height: 1.45 * $ff-funit-sm;\n margin-bottom: $ff-unit-sm;\n font-weight: 500;\n}\n\ncode {\n border-radius: $ff-unit-sm;\n border: 1px solid $ff-grey-200;\n padding: $ff-unit-md;\n}\n\np code {\n padding: 0 $ff-unit-xs;\n}\n\n.ff-description {\n font-size: $ff-funit-sm;\n color: $ff-grey-400;\n}\n","// Raw Color Scheme\n\n$ff-black: black;\n$ff-white: white;\n\n$ff-grey-50: #F9FAFB;\n$ff-grey-100: #F3F4F6;\n$ff-grey-200: #E5E7EB;\n$ff-grey-300: #D1D5DB;\n$ff-grey-400: #9CA3AF;\n$ff-grey-500: #6B7280;\n$ff-grey-600: #4B5563;\n$ff-grey-700: #374151;\n$ff-grey-800: #1F2937;\n$ff-grey-900: #111827;\n\n$ff-red-50: #FFEBEB;\n$ff-red-100: #FFC6C6;\n$ff-red-200: #FF8D8D;\n$ff-red-300: #F16F6F;\n$ff-red-400: #ED4E4E;\n$ff-red-500: #D12B2B;\n$ff-red-500B: #D82525;\n$ff-red-600: #BC3838;\n$ff-red-700: #AB1818;\n$ff-red-800: #8F0001;\n$ff-red-900: #760000;\n\n$ff-teal-50: #E4FBFC;\n$ff-teal-100: #C4F3F5;\n$ff-teal-200: #B2EBEE;\n$ff-teal-300: #8CE2E7;\n$ff-teal-400: #74D4D9;\n$ff-teal-500: #50C3C9;\n$ff-teal-600: #35AAB0;\n$ff-teal-700: #31959A;\n$ff-teal-800: #397B7E;\n$ff-teal-900: #406466;\n\n$ff-blue-50: #EFF6FF;\n$ff-blue-100: #DBEAFE;\n$ff-blue-200: #BFDBFE;\n$ff-blue-300: #93C5FD;\n$ff-blue-400: #60A5FA;\n$ff-blue-500: #3B82F6;\n$ff-blue-600: #2563EB;\n$ff-blue-700: #1D4ED8;\n$ff-blue-800: #1E40AF;\n$ff-blue-900: #1E3A8A;\n\n$ff-indigo-50: #EEF2FF;\n$ff-indigo-100: #E0E7FF;\n$ff-indigo-200: #C7D2FE;\n$ff-indigo-300: #A5B4FC;\n$ff-indigo-400: #818CF8;\n$ff-indigo-500: #6366F1;\n$ff-indigo-600: #4F46E5;\n$ff-indigo-700: #4338CA;\n$ff-indigo-800: #3730A3;\n$ff-indigo-900: #312E81;\n\n$ff-green-50: #ECFDF5;\n$ff-green-100: #D1FAE5;\n$ff-green-200: #A7F3D0;\n$ff-green-300: #6EE7B7;\n$ff-green-400: #34D399;\n$ff-green-500: #10B981;\n$ff-green-600: #059669;\n$ff-green-700: #047857;\n$ff-green-800: #065F46;\n$ff-green-900: #064E3B;\n\n$ff-yellow-10: #FFFCF5;\n$ff-yellow-50: #FFFBEB;\n$ff-yellow-100: #FEF3C7;\n$ff-yellow-200: #FDE68A;\n$ff-yellow-300: #FCD34D;\n$ff-yellow-400: #FBBF24;\n$ff-yellow-500: #F59E0B;\n$ff-yellow-600: #D97706;\n$ff-yellow-700: #B45309;\n$ff-yellow-800: #92400E;\n$ff-yellow-900: #78350F;\n\n// Theme Colors\n\n$ff-color--action: $ff-indigo-800;\n$ff-color--highlight: $ff-indigo-600;\n$ff-color--highlight--light: $ff-grey-100;\n$ff-color--danger: $ff-red-500;\n$ff-color--danger--dark: $ff-red-600;\n$ff-color--disabled: $ff-grey-400;\n$ff-color--border: $ff-grey-200;\n$ff-color--context-menu: $ff-white;\n","/*\n ff-utility contains functional variables and classes for padding/margin and sizings\n*/\n\n// screen sizes\n$ff-screen-sm: 640px;\n$ff-screen-md: 768px;\n$ff-screen-lg: 1024px;\n$ff-screen-xl: 1280px;\n$ff-screen-2xl: 1536px;\n\n// unit\n$ff-unit-xs: 3px;\n$ff-unit-sm: 6px;\n$ff-unit-md: 9px;\n$ff-unit-lg: 18px;\n$ff-unit-xl: 27px;\n\n// font unit\n$ff-funit-xs: 0.75rem;\n$ff-funit-sm: 0.85rem;\n$ff-funit-md: 1rem;\n$ff-funit-lg: 1.5rem;\n$ff-funit-xl: 2rem;\n\n@mixin truncate {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n","/*\n ff-core contains styling on the custom, ff components\n*/\n\n.ff-icon {\n width: 20px;\n height: 20px;\n display: inline-block;\n}\n\n.ff-disabled {\n pointer-events: none;\n opacity: 0.4;\n}\n\n.ff-icon-sm {\n width: 16px;\n height: 16px;\n display: inline-block;\n}\n\n.ff-icon-md {\n width: 20px;\n height: 20px;\n display: inline-block;\n}\n\n.ff-icon-lg {\n width: 24px;\n width: 24px;\n height: 24px;\n display: inline-block;\n}\n\n/*\n FF Breadcrumb\n*/\n\n.ff-nav-breadcrumb {\n display: flex;\n align-items: center;\n a {\n color: $ff-blue-600;\n font-weight: bold;\n font-size: 1.25rem;\n line-height: 1.75rem;\n white-space: nowrap;\n &:hover {\n text-decoration: underline;\n }\n }\n}\n\n.ff-nav-breadcrumb--active span {\n color: $ff-grey-800;\n font-weight: bold;\n font-size: 1.25rem;\n line-height: 1.75rem;\n white-space: nowrap;\n}\n\n/*\n FF Button\n*/\n\n// nested element\n.ff-btn--icon,\n.ff-btn--icon svg {\n width: 20px;\n height: 20px;\n}\n.ff-btn--icon-left {\n margin-left: -$ff-unit-xs;\n margin-right: $ff-unit-sm;\n}\n.ff-btn--icon-right {\n margin-left: $ff-unit-sm;\n margin-right: -$ff-unit-xs;\n}\n\n.ff-btn {\n border-radius: $ff-unit-sm;\n display: flex;\n align-items: center;\n font-size: $ff-funit-sm;\n line-height: 20px;\n height: 32px;\n position: relative;\n\n justify-content: center;\n font-weight: bold;\n height: auto;\n padding: $ff-unit-sm 16px;\n border: 0;\n\n &.ff-btn-icon {\n padding: $ff-unit-sm $ff-unit-md;\n }\n\n &.ff-btn-small {\n padding: $ff-unit-xs $ff-unit-sm;\n font-size: $ff-funit-xs;\n line-height: 16px;\n height: 24px;\n }\n\n &.ff-btn-medium {\n padding: $ff-unit-xs $ff-unit-sm;\n font-size: $ff-funit-xs;\n line-height: 18px;\n height: 26px;\n }\n\n &.ff-btn-fwidth {\n justify-content: center;\n }\n\n &:hover {\n cursor: pointer;\n }\n\n &--primary {\n background-color: $ff-color--action;\n border: 1px solid $ff-color--action;\n color: $ff-grey-50;\n &:hover, &.active {\n background-color: $ff-color--highlight;\n }\n }\n &--secondary {\n background-color: $ff-white;\n color: $ff-color--action;\n border: 1px solid $ff-color--action;\n &:hover, &.active {\n background-color: $ff-color--highlight;\n border-color: $ff-color--highlight;\n color: $ff-white;\n }\n }\n &--tertiary {\n color: $ff-color--action;\n &:hover, &.active {\n background-color: $ff-color--highlight;\n color: $ff-white;\n }\n &[disabled=\"\"] {\n background-color: transparent !important;\n }\n }\n &--danger {\n color: $ff-white;\n background-color: $ff-color--danger;\n border: 1px solid $ff-color--danger;\n &:hover {\n background-color: $ff-color--danger--dark;\n color: $ff-white;\n }\n }\n &--secondary-danger {\n color: $ff-color--danger;\n background-color: $ff-white;\n border: 1px solid $ff-color--danger;\n &:hover {\n background-color: $ff-color--danger--dark;\n color: $ff-white;\n }\n }\n &--tertiary-danger {\n color: $ff-color--danger;\n &:hover {\n background-color: $ff-color--danger--dark;\n color: $ff-white;\n }\n }\n\n &.ff-btn-small {\n .ff-btn--icon,\n .ff-btn--icon svg {\n width: 16px;\n height: 16px;\n }\n .ff-btn--icon-left {\n margin-right: $ff-unit-xs;\n }\n .ff-btn--icon-right {\n margin-left: $ff-unit-xs;\n }\n }\n\n &.ff-btn-fwidth {\n .ff-btn--icon {\n position: absolute;\n }\n .ff-btn--icon-left {\n left: 0;\n padding-left: $ff-unit-lg;\n }\n .ff-btn--icon-left {\n right: 0;\n padding-right: $ff-unit-lg;\n }\n }\n\n &:disabled,\n &[disabled=true] {\n cursor: not-allowed;\n border-color: $ff-grey-200;\n color: $ff-grey-400;\n background-color: $ff-grey-200;\n }\n}\n\n/*\n Drawer responsive context\n Remove icon margins when buttons are in icon-only mode within narrow drawer\n*/\n@container drawer (max-width: 639px) {\n .ff-btn-icon {\n .ff-btn--icon-left {\n margin-left: 0;\n margin-right: 0;\n }\n .ff-btn--icon-right {\n margin-left: 0;\n margin-right: 0;\n }\n }\n}\n\n/*\n Viewport responsive context (for pages outside drawer, e.g., instance overview)\n Remove icon margins when viewport is narrow and buttons are in icon-only mode\n Breakpoint matches Tailwind's sm breakpoint (640px)\n*/\n@media (max-width: 639px) {\n .ff-btn-icon {\n .ff-btn--icon-left {\n margin-left: 0;\n margin-right: 0;\n }\n .ff-btn--icon-right {\n margin-left: 0;\n margin-right: 0;\n }\n }\n}\n\n/*\n FF Kebab Menu\n*/\n\n.ff-kebab-menu {\n position: relative;\n >svg {\n width: 20px;\n cursor: pointer;\n &:hover {\n fill: $ff-blue-600;\n }\n }\n &.active {\n >svg {\n fill: $ff-blue-600;\n }\n }\n}\n\n.ff-kebab-options {\n color: $ff-grey-800;\n position: absolute;\n top: 24px;\n border: 1px solid $ff-grey-300;\n z-index: 1000;\n padding: 0;\n box-shadow: 0px 6px 9px 0px #00000038;\n li {\n min-width: 150px;\n white-space: nowrap;\n &.ff-kebab-item--danger {\n color: $ff-red-500;\n }\n }\n &--left {\n left: 0;\n }\n &--right {\n right: calc(100% - 24px);\n }\n}\n\n.ff-kebab-divider {\n height: 1px;\n background-color: $ff-grey-200;\n list-style: none;\n}\n\n/*\n FF List Item\n*/\nli.ff-kebab-item {\n padding: 12px 48px 12px 12px;\n background-color: white;\n &:hover {\n cursor: pointer;\n background-color: $ff-grey-200;\n }\n &.active {\n background-color: $ff-grey-100;\n }\n &.disabled, :disabled {\n pointer-events: none;\n label {\n opacity: 0.5;\n }\n }\n}\n\n/*\n FF Input\n*/\n\n.ff-input {\n &.ff-text-input {\n border: 1px solid $ff-grey-300;\n border-radius: $ff-unit-sm;\n height: 32px;\n width: 100%;\n display: flex;\n gap: 0px;\n align-items: center;\n background-color: $ff-white;\n border-color: $ff-grey-300;\n svg {\n width: 20px;\n height: 20px;\n margin-left: $ff-unit-sm;\n }\n input {\n flex-grow: 1;\n padding: $ff-unit-sm $ff-unit-md;\n border-radius: $ff-unit-sm;\n background: none;\n height: 100%;\n border-width: 0;\n min-width: 0;\n &[disabled] {\n background-color: $ff-grey-50;\n color: $ff-grey-300;\n }\n &:focus-visible {\n border: none;\n outline: none;\n }\n }\n &:focus-within {\n border-color: $ff-blue-600;\n border-width: 2px;\n outline: none;\n svg {\n margin-left: $ff-unit-sm - 1px;\n }\n }\n }\n}\n\n.ff-input--error {\n &.ff-text-input {\n border-color: $ff-red-500;\n border-width: 2px;\n outline: none;\n }\n}\n\n.ff-dropdown {\n position: relative;\n display: inline-block;\n cursor: pointer;\n &[disabled=\"true\"] {\n cursor: not-allowed;\n background-color: $ff-grey-50;\n color: $ff-grey-400;\n }\n .ff-dropdown-selected {\n background-color: white;\n border: 1px solid $ff-grey-300;\n border-radius: $ff-unit-sm;\n padding: $ff-unit-sm $ff-unit-md;\n height: 32px;\n width: 100%;\n display: flex;\n justify-content: space-between;\n z-index: 2;\n\n > .ff-dropdown-selected-item {\n flex-shrink: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n > .ff-dropdown-icon {\n flex-shrink: 0;\n }\n }\n .ff-dropdown-options {\n position: absolute;\n top: 100%;\n display: none;\n max-height: 14rem;\n overflow-y: auto;\n box-shadow: 0px 6px 9px 0px #00000038;\n .ff-dropdown-option {\n padding: $ff-unit-sm $ff-unit-md;\n background-color: $ff-grey-50;\n border-bottom: 1px solid $ff-grey-200;\n cursor: pointer;\n transition: ease-in-out .3s;\n &:hover {\n background-color: $ff-grey-100;\n }\n }\n &.ff-dropdown-options--full-width {\n width: 100%;\n border-width: 0 1px 1px 1px;\n }\n &.ff-dropdown-options--fit {\n border-width: 1px;\n min-width: none;\n .ff-dropdown-option {\n padding-right: $ff-unit-xl;\n }\n }\n &.ff-dropdown-options--align-left {\n left: 0;\n }\n &.ff-dropdown-options--align-right {\n right: 0;\n }\n }\n &.ff-dropdown--open {\n .ff-dropdown-selected {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n .ff-dropdown-options {\n display: block;\n z-index: 2;\n }\n }\n}\n\n.ff-checkbox,\n.ff-radio-btn {\n position: relative;\n padding-left: 25px;\n display: flex;\n cursor: pointer;\n input[type=checkbox], input[type=radio] {\n display: none;\n }\n label {\n cursor: pointer;\n font-weight: 500;\n font-size: 0.875rem;\n line-height: 1.25rem;\n }\n /* Create a custom checkbox */\n .checkbox {\n position: absolute;\n top: 0;\n left: 0;\n height: 16px;\n width: 16px;\n margin-left: 4px;\n border-radius: 4px;\n background-color: transparent;\n border: 1px solid;\n border-color: $ff-grey-400;\n }\n &:hover:not([disabled=true]) {\n .checkbox {\n background-color: $ff-grey-200;\n }\n }\n &:hover:not([disabled=true]) {\n .checkbox[checked=true] {\n background-color: $ff-grey-500;\n }\n }\n &[disabled=true] {\n cursor: not-allowed;\n label, p {\n color: $ff-grey-400;\n }\n }\n &[disabled=true] * {\n pointer-events: none;\n }\n .checkbox {\n &[checked=true] {\n background-color: $ff-grey-600;\n border-color: $ff-grey-700;\n }\n &[checked=true]:after {\n display: block;\n }\n }\n}\n\n.ff-checkbox {\n .checkbox:after {\n content: \"\";\n display: none;\n position: absolute;\n left: 4.5px;\n top: 1px;\n width: 5px;\n height: 10px;\n border: solid white;\n border-width: 0 2px 2px 0;\n -webkit-transform: rotate(45deg);\n -ms-transform: rotate(45deg);\n transform: rotate(45deg);\n }\n}\n\n/**\n * FF Toggle Switch\n */\n\n.ff-toggle-switch {\n --ff-toggle-width: 54px;\n --ff-toggle-translate: 20px;\n position: relative;\n display: inline-block;\n width: var(--ff-toggle-width);\n height: 34px;\n cursor: pointer;\n input {\n display: none;\n }\n &.checked .ff-toggle-switch-slider {\n background-color: $ff-blue-900;\n }\n &.checked .ff-toggle-switch-slider .ff-toggle-switch-button{\n -webkit-transform: translateX(var(--ff-toggle-translate));\n -ms-transform: translateX(var(--ff-toggle-translate));\n transform: translateX(var(--ff-toggle-translate));\n }\n &[disabled=true] {\n cursor: not-allowed;\n .ff-toggle-switch-slider {\n pointer-events: none;\n background-color: $ff-grey-200;\n }\n .ff-toggle-switch-button {\n background-color: $ff-grey-50;\n }\n svg {\n color: $ff-grey-300;\n }\n }\n}\n\n.ff-toggle-switch-slider {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: $ff-grey-400;\n border-radius: 34px;\n -webkit-transition: 0.4s;\n transition: 0.4s;\n svg {\n padding: 3px;\n width: 100%;\n height: 100%;\n }\n &:hover {\n background-color: $ff-indigo-700 !important;\n }\n}\n\n.ff-toggle-switch-button {\n position: absolute;\n content: \"\";\n height: 26px;\n width: 26px;\n left: 4px;\n bottom: 4px;\n background-color: white;\n border-radius: 50%;\n -webkit-transition: 0.4s;\n transition: 0.4s;\n}\n\n/**\n * FF Radio Group\n */\n\n.ff-radio-group {\n .ff-radio-group-label {\n display: block;\n }\n .ff-radio-group-options {\n display: block;\n margin-top: 1rem;\n }\n .ff-radio-group--horizontal {\n display: flex;\n .ff-radio-btn {\n margin-right: $ff-funit-lg;\n }\n }\n .ff-radio-group--vertical {\n .ff-radio-btn {\n display: block;\n margin-bottom: $ff-funit-md;\n }\n }\n .ff-radio-group--grid {\n display: grid;\n .ff-radio-btn {\n display: block;\n margin-bottom: $ff-funit-md;\n }\n }\n}\n\n.ff-radio-btn {\n .checkbox {\n position: absolute;\n top: 0;\n left: 0;\n height: 16px;\n width: 16px;\n border-radius: 4px;\n background-color: transparent;\n border: 1px solid $ff-grey-400;\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e\")\n }\n}\n\n.ff-tile-selection {\n display: flex;\n flex-wrap: wrap;\n gap: $ff-unit-md;\n .ff-tile-selection-option {\n --ff-tile-selection-color: #{$ff-blue-700};\n display: flex;\n flex-direction: column;\n background-color: $ff-white;\n font-size: 0.875rem;\n border: 2px solid $ff-grey-300;\n border-radius: $ff-unit-sm;\n padding: 12px $ff-unit-lg;\n width: 275px;\n ul {\n list-style: disc;\n margin-top: 3px;\n padding-left: 18px;\n li {\n line-height: 1.5rem;\n }\n }\n &:last-child {\n margin-right: 0;\n }\n &--header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n h2 {\n font-size: 14px;\n }\n > h2 {\n display: flex;\n align-items: center;\n gap: $ff-unit-md;\n padding-right: $ff-unit-xl;\n margin: 0;\n svg {\n width: 20px;\n height: 20px;\n fill: $ff-grey-300;\n &.ff-tile-selection-option--edit {\n cursor: pointer;\n fill: $ff-blue-800;\n &:hover {\n fill: $ff-indigo-600;\n }\n }\n }\n }\n }\n &--price {\n text-align: center;\n h2 {\n margin: 0;\n line-height: 1rem;\n }\n label {\n font-size: $ff-funit-sm;\n }\n }\n &--description {\n flex-grow: 1;\n margin-top: $ff-unit-sm;\n padding-top: $ff-unit-sm;\n border-top: 1px solid $ff-grey-300;\n }\n &--meta {\n margin-top: $ff-unit-md;\n padding-top: $ff-unit-md;\n border-top: 1px solid $ff-grey-300;\n >div {\n display: flex;\n justify-content: space-between;\n width: 100%;\n margin-bottom: $ff-unit-sm;\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n &:not(.editable):not(.disabled):hover {\n cursor: pointer;\n border: 2px solid var(--ff-tile-selection-color);\n }\n &.active {\n border: 2px solid var(--ff-tile-selection-color);\n .ff-tile-selection-option--header svg {\n fill: var(--ff-tile-selection-color);\n }\n }\n &.disabled {\n opacity: 0.5;\n }\n }\n}\n\n/*\n FF Data Table\n*/\n.ff-data-table {\n width: 100%;\n font-size: 0.875rem;\n line-height: 1.25rem;\n &--options {\n margin-bottom: 6px;\n display: flex;\n gap: 6px;\n justify-content: flex-end;\n }\n &--search.ff-text-input {\n flex-grow: 1;\n width: auto;\n height: 34px;\n border-radius: 6px;\n }\n &--actions {\n display: flex;\n gap: 6px;\n }\n &--data {\n border-collapse: separate;\n border-spacing: 0;\n width: 100%;\n .ff-data-table--cell {\n .ff-icon {\n margin: -1px 0;\n }\n .ff-icon-lg {\n margin: -3px 0;\n }\n .ff-btn .ff-icon,\n .ff-btn .ff-icon-lg {\n margin: 0;\n }\n &:first-child {\n padding-left: 16px;\n }\n &:last-child {\n padding-right: 16px;\n }\n }\n thead {\n background: white; // hides td borders when header is sticky\n .ff-data-table--row .ff-data-table--cell {\n &:first-child {\n border-top-left-radius: 6px;\n }\n &:last-child {\n border-top-right-radius: 6px;\n }\n }\n .ff-data-table--cell {\n padding: 9px 12px;\n background-color: $ff-grey-100;\n font-weight: 600;\n transition: 0.3s background-color, 0.3s color;\n -webkit-transition: 0.3s background-color, 0.3s color;\n &.sortable {\n >div {\n display: flex;\n justify-content: space-between;\n gap: $ff-unit-md;\n }\n .ff-icon {\n opacity: 0.2;\n }\n &:hover {\n background-color: $ff-grey-200;\n cursor: pointer;\n .ff-icon {\n opacity: 0.5;\n }\n }\n }\n &.sorted {\n background-color: $ff-grey-200;\n .ff-icon.icon-sorted {\n opacity: 1;\n }\n }\n }\n }\n tbody {\n .ff-data-table--row {\n &.collapsible {\n td {\n border-top: none;\n border-bottom: none;\n padding: 0;\n }\n }\n\n &:last-of-type {\n td {\n border-bottom: 1px solid $ff-grey-300;\n }\n }\n\n &:last-child {\n .ff-data-table--cell {\n border-bottom-width: 1px;\n border-top-color: $ff-grey-200;\n &:first-child {\n border-bottom-left-radius: 6px;\n }\n &:last-child {\n border-bottom-right-radius: 6px;\n }\n }\n }\n }\n .ff-data-table--cell {\n padding: 12px 12px;\n background-color: white;\n &.highlight {\n background-color: $ff-grey-50;\n }\n &.status-message {\n text-align: center;\n color: $ff-grey-400;\n }\n }\n .selectable:hover .ff-data-table--cell,\n .selectable:hover .ff-data-table--cell span svg.ff-icon {\n cursor: pointer;\n color: $ff-blue-600;\n background-color: $ff-grey-50;\n }\n .selectable:hover .ff-data-table--cell button svg.ff-icon {\n background-color: transparent;\n color: inherit;\n }\n }\n }\n &--row {\n td {\n border-width: 1px 0px 0px;\n border-style: solid;\n border-color: $ff-grey-300;\n &:first-child {\n border-left-width: 1px;\n }\n &:last-child {\n border-right-width: 1px;\n }\n }\n &-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n }\n }\n}\n\n.ff-data-table thead .ff-checkbox,\n.ff-data-table tbody .ff-checkbox,\n.ff-data-table tbody .ff-radio-btn {\n display: inline;\n}\n\n.ff-loadmore {\n width: 100%;\n text-align: center;\n span {\n display: inline-block;\n margin: auto;\n color: $ff-blue-500;\n background-color: white;\n padding: $ff-unit-xs $ff-unit-md 4px;\n border: 1px solid $ff-grey-300;\n border-top: 0;\n border-radius: 0 0 6px 6px;\n &:hover {\n cursor: pointer;\n color: $ff-blue-700;\n }\n }\n}\n\n/*\n FF Dialog Box\n*/\n.ff-dialog-container {\n position: fixed;\n z-index: 110;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n justify-content: center;\n align-items: flex-start;\n overflow-y: hidden;\n background-color: rgba($ff-grey-800, 0.3);\n &--open {\n display: flex;\n }\n &--closed {\n display: none;\n }\n}\n\n.ff-dialog-box {\n position: relative;\n z-index: 2;\n width: 100%;\n max-width: 42rem;\n margin: 90px auto;\n display: flex;\n flex-direction: column;\n background-color: $ff-white;\n max-height: 85vh;\n overflow: auto;\n .ff-dialog {\n &-header {\n height: 48px;\n line-height: 48px;\n background-color: $ff-grey-800;\n border-bottom: 2px solid $ff-red-400;\n padding: 0 $ff-unit-lg;\n color: $ff-white;\n font-weight: 600;\n display: flex;\n justify-content: space-between;\n gap: 12px;\n }\n &-subheader {\n opacity: 0.65;\n display: block;\n }\n &-content {\n padding: $ff-funit-lg;\n overflow: auto;\n max-height: 75vh;\n }\n &-actions {\n display: flex;\n justify-content: flex-end;\n padding: $ff-unit-md $ff-unit-lg $ff-unit-lg $ff-unit-lg;\n .ff-btn {\n margin-left: $ff-funit-md;\n }\n }\n }\n &--wide {\n max-width: 52rem;\n }\n}\n\n/*\n Help Tooltip\n*/\n\n.ff-help-tooltip {\n &:hover {\n path {\n fill: $ff-blue-800;\n }\n }\n}\n\n/*\n Notifications\n*/\n\n.ff-notification-pill {\n background-color: $ff-red-600;\n color: $ff-white;\n padding: $ff-unit-xs $ff-unit-md;\n font-weight: 600;\n border-radius: $ff-unit-sm;\n font-size: $ff-funit-sm;\n}\n\n.ff-notification-toast {\n position: relative;\n background-color: $ff-white;\n border: 1px solid $ff-grey-400;\n padding: $ff-unit-md $ff-unit-md $ff-unit-md $ff-unit-lg;\n box-shadow: -$ff-unit-sm $ff-unit-sm $ff-unit-sm #0000008c;\n border-radius: 0 $ff-unit-sm $ff-unit-sm 0;\n max-width: 475px;\n\n &--bar {\n height: 100%;\n width: $ff-unit-md;\n background-color: black;\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n }\n\n &--info {\n border-color: $ff-grey-400;\n .ff-notification-toast--bar {\n background-color: $ff-grey-400;\n }\n }\n &--warning {\n border-color: $ff-red-400;\n .ff-notification-toast--bar {\n background-color: $ff-red-400;\n }\n }\n &--confirmation {\n border-color: $ff-green-400;\n .ff-notification-toast--bar {\n background-color: $ff-green-400;\n }\n }\n\n &--message {\n display: grid;\n grid-template-columns: 1fr 20px;\n gap: $ff-unit-lg;\n >div {\n padding-top: 2px;\n }\n }\n\n &--close {\n cursor: pointer;\n position: relative;\n display: flex;\n max-height: 20px;\n svg {\n position: relative;\n z-index: 2;\n padding: 4px;\n }\n .countdown-wrapper {\n z-index: 1;\n }\n &:hover {\n color: $ff-indigo-600;\n }\n }\n\n &--actions {\n margin-top: $ff-unit-md;\n // margin-right: $ff-unit-xl;\n display: flex;\n justify-content: flex-end;\n }\n}\n\n/* Countdown Pie */\n$countdown_size: 20px;\n\n.countdown-wrapper {\n width: $countdown_size;\n height: $countdown_size;\n position: absolute;\n top: 0;\n left: 0;\n background: white;\n}\n\n.countdown-pie {\n width: 50%;\n height: 100%;\n position: absolute;\n background: $ff-white;\n border: 2px solid $ff-grey-300;\n}\n\n.countdown-spinner {\n transform-origin: 100% 50%;\n border-radius: ($countdown_size*0.5) 0 0 ($countdown_size*0.5);\n z-index: 200;\n border-right: none;\n}\n\n.countdown-filler {\n border-radius: 0 ($countdown_size*0.5) ($countdown_size*0.5) 0;\n z-index: 100;\n border-left: none;\n left: 50%;\n opacity: 0;\n}\n\n.countdown-mask {\n width: 50%;\n height: 100%;\n position: absolute;\n z-index: 300;\n opacity: 1;\n background: inherit;\n}\n\n@keyframes rota {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n@keyframes fill {\n 0% { opacity: 0; }\n 50%, 100% { opacity: 1; }\n}\n\n@keyframes mask {\n 0% { opacity: 1; }\n 50%, 100% { opacity: 0; }\n}\n\n\n/*\n FF Tabs\n*/\n.ff-tabs {\n display: flex;\n color: $ff-grey-800;\n .ff-tab-option {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: $ff-unit-md;\n &:hover {\n color: $ff-blue-700;\n cursor: pointer;\n }\n .ff-tab-icon {\n height: 14px;\n width: 14px;\n flex-shrink: 0;\n display: block;\n }\n .ff-tab-label {\n white-space: nowrap;\n }\n }\n &.ff-tabs--horizontal {\n flex-direction: row;\n .ff-tab-option {\n margin-right: $ff-unit-md;\n &.router-link-active,\n &.ff-tab-option--active {\n border-bottom: $ff-unit-xs solid $ff-blue-700;\n }\n }\n }\n &.ff-tabs--vertical {\n flex-direction: column;\n .ff-tab-option {\n border-left-width: $ff-unit-xs;\n border-color: transparent;\n margin-bottom: $ff-unit-md;\n &.router-link-active,\n &.ff-tab-option--active {\n border-left: $ff-unit-xs solid $ff-blue-700;\n }\n }\n }\n .router-link-active,\n .ff-tab-option--active {\n color: $ff-blue-600;\n }\n}\n\n/*\n FF Tabs - Overflow Handling\n*/\n.ff-tabs-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n\n // When overflow is NOT enabled, apply ellipsis to tab labels\n &:not(.ff-tabs-wrapper--overflow-enabled) {\n .ff-tab-label {\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n }\n }\n\n &.ff-tabs-wrapper--overflow-enabled {\n .ff-tab-option {\n flex-shrink: 0; // Prevent tabs from shrinking, allow them to take full width\n }\n\n .ff-tabs__scroll-container {\n overflow-x: auto;\n overflow-y: hidden;\n scroll-behavior: smooth;\n scrollbar-width: none; // Hide scrollbar for Firefox\n -ms-overflow-style: none; // Hide scrollbar for IE/Edge\n\n // Hide scrollbar for Chrome, Safari, and Opera\n &::-webkit-scrollbar {\n display: none;\n }\n }\n }\n\n .ff-tabs__scroll-container {\n flex: 1;\n min-width: 0;\n }\n\n .ff-tabs__overflow-button {\n position: absolute;\n top: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $ff-unit-sm;\n background: white;\n border: none;\n border-right: 1px solid $ff-grey-300;\n color: $ff-grey-500;\n cursor: pointer;\n z-index: 10;\n transition: all 0.2s ease;\n\n .ff-icon {\n width: 16px;\n height: 16px;\n\n &.ff-icon-second {\n margin-left: -10px;\n }\n }\n\n &:hover {\n background: $ff-grey-100;\n color: $ff-grey-700;\n border-color: $ff-grey-400;\n }\n\n &:active {\n background: $ff-grey-200;\n }\n\n &--left {\n left: 0;\n border-right: 1px solid $ff-grey-300;\n border-left: none;\n }\n\n &--right {\n right: 0;\n border-left: 1px solid $ff-grey-300;\n border-right: none;\n }\n }\n\n .ff-tabs__menu-wrapper {\n position: relative;\n display: inline-block;\n\n &--left {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n }\n\n &--right {\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n }\n }\n\n .ff-tabs__dropdown {\n position: absolute;\n top: calc(100% + 4px);\n background: white;\n border: 1px solid $ff-grey-300;\n border-radius: 4px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n z-index: 100;\n min-width: 150px;\n max-width: 250px;\n\n &--left {\n left: 0;\n }\n\n &--right {\n right: 0;\n }\n }\n\n .ff-tabs__dropdown-item {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: $ff-unit-sm $ff-unit-md;\n color: $ff-grey-800;\n transition: background-color 0.2s ease;\n\n .ff-tab-icon {\n height: 14px;\n width: 14px;\n flex-shrink: 0;\n display: block;\n }\n\n .ff-tab-label {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n }\n\n &:hover {\n background: $ff-grey-100;\n color: $ff-blue-700;\n cursor: pointer;\n }\n\n &--active {\n background: $ff-grey-100;\n color: $ff-blue-700;\n cursor: pointer;\n }\n\n &.router-link-active {\n color: $ff-blue-600;\n background: $ff-blue-50;\n }\n\n &:first-child {\n border-radius: 4px 4px 0 0;\n }\n\n &:last-child {\n border-radius: 0 0 4px 4px;\n }\n\n &:only-child {\n border-radius: 4px;\n }\n }\n}\n\n/*\n FF Tooltip\n*/\n.ff-tooltip {\n position: absolute;\n z-index: 100;\n font-weight: normal; // prevent parent overriding if embedded in hX\n white-space: preserve-breaks;\n height: fit-content;\n background-color: black;\n color: white;\n padding: 3px 12px;\n border-radius: 3px;\n opacity: 0;\n pointer-events: none;\n transition: 0.3s opacity;\n -webkit-transition: 0.3s opacity;\n &.ff-tooltip-right {\n &::after {\n content: \" \";\n position: absolute;\n top: 50%;\n right: 100%; /* To the left of the tooltip */\n margin-top: -5px;\n border-width: 5px;\n border-style: solid;\n border-color: transparent black transparent transparent;\n }\n }\n &.ff-tooltip-left {\n &::after {\n content: \" \";\n position: absolute;\n top: 50%;\n left: 100%; /* To the right of the tooltip */\n margin-top: -5px;\n border-width: 5px;\n border-style: solid;\n border-color: transparent transparent transparent black;\n }\n }\n &.ff-tooltip-top {\n transform: translateX(-50%);\n &::after {\n content: \" \";\n position: absolute;\n top: 100%; /* At the bottom of the tooltip */\n left: 50%;\n margin-left: -5px;\n border-width: 5px;\n border-style: solid;\n border-color: black transparent transparent transparent;\n }\n }\n &.ff-tooltip-bottom {\n transform: translateX(-50%);\n &::after {\n content: \" \";\n position: absolute;\n bottom: 100%; /* At the top of the tooltip */\n left: 50%;\n margin-left: -5px;\n border-width: 5px;\n border-style: solid;\n border-color: transparent transparent black transparent;\n }\n }\n &--visible {\n opacity: 1;\n }\n}\n.ff-tooltip-container {\n position: relative;\n vertical-align: bottom;\n &:hover .ff-tooltip {\n opacity: 1;\n }\n}\n\n.ff-spinner {\n display: inline-block;\n width: 20px;\n height: 20px;\n color: $ff-grey-500;\n circle {\n stroke: transparent;\n }\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n @keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n }\n }\n @-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n }\n }\n}\n",".ff-bg-light {\n background-color: $ff-grey-50;\n}\n\n.ff-theme-light {\n\n color: $ff-grey-800;\n\n /* Core */\n\n h1, h2, h3, h4, h5{\n color: $ff-grey-700;\n }\n \n p {\n color: $ff-grey-800;\n }\n\n .ff-description {\n color: $ff-grey-500;\n }\n\n select {\n background-color: $ff-grey-50;\n }\n\n code {\n background-color: $ff-grey-100;\n border-color: $ff-grey-200;\n }\n\n /* FlowFuse Components */\n\n .ff-btn {\n &:disabled {\n background-color: $ff-white;\n border-color: $ff-grey-300;\n color: $ff-grey-300;\n }\n }\n}\n",".ff-bg-dark {\n background-color: $ff-grey-800;\n}\n\n.ff-theme-dark {\n color: $ff-grey-50;\n \n /* Core */\n\n table {\n td, th {\n border-color: $ff-grey-500;\n }\n }\n\n select {\n background-color: $ff-grey-800;\n }\n\n code {\n background-color: $ff-grey-900;\n border-color: $ff-grey-700;\n }\n\n .ff-description {\n color: $ff-grey-400;\n }\n\n /* FlowFuse Components */\n\n /**\n * Buttons\n */\n .ff-btn {\n &--tertiary {\n color: $ff-white;\n &:hover {\n // background-color: $ff-color--secondary--highlight;\n color: $ff-white;\n }\n }\n &:disabled {\n background-color: $ff-grey-700;\n border-color: $ff-grey-500;\n color: $ff-grey-500;\n }\n }\n\n /**\n * Text Input\n */\n\n .ff-input.ff-text-input {\n background-color: $ff-grey-700;\n border-color: $ff-grey-900;\n &:focus {\n border-color: $ff-white;\n }\n }\n\n /**\n * Dropdowns\n */\n\n .ff-dropdown {\n &[disabled=\"true\"] {\n background-color: $ff-grey-700;\n color: $ff-grey-500;\n }\n .ff-dropdown-selected {\n background-color: $ff-grey-700;\n border-color: $ff-grey-500;\n }\n .ff-dropdown-options {\n border-color: $ff-grey-700;\n }\n .ff-dropdown-option {\n background-color: $ff-grey-700;\n border-color: $ff-grey-800;\n &:hover {\n background-color: $ff-grey-800;\n }\n }\n }\n\n /**\n * Checkboxes\n */\n\n .ff-checkbox {\n .checkbox[checked=true] {\n background-color: transparent;\n border-color: $ff-grey-500;\n }\n &:hover:not([disabled=true]) {\n .checkbox {\n background-color: $ff-grey-600;\n }\n }\n &:hover:not([disabled=true]) {\n .checkbox[checked=true] {\n background-color: $ff-grey-800;\n border-color: $ff-grey-600;\n }\n }\n }\n\n /**\n * FF Toggle Switch\n */\n .ff-toggle-switch {\n svg {\n color: $ff-grey-800;\n }\n input:checked + .ff-toggle-switch-slider {\n background-color: $ff-blue-600;\n }\n &[disabled=true] {\n .ff-toggle-switch-slider {\n background-color: $ff-grey-700;\n }\n .ff-toggle-switch-button {\n background-color: $ff-grey-800;\n }\n svg {\n color: $ff-grey-500;\n }\n }\n }\n\n .ff-toggle-switch-slider {\n background-color: $ff-grey-600;\n &:hover {\n background-color: $ff-indigo-500 !important;\n }\n }\n\n .ff-toggle-switch-button {\n background-color: $ff-white;\n }\n\n /**\n * Radio Group\n */\n\n .ff-radio-btn {\n .checkbox {\n border: 1px solid $ff-grey-600;\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='%231F2937' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='4'/%3e%3c/svg%3e\") \n }\n }\n \n .ff-radio-btn {\n .checkbox {\n &[checked=true] {\n background-color: $ff-white;\n border-color: $ff-grey-700;\n }\n &[checked=true]:after {\n display: block;\n }\n }\n &:hover:not([disabled=true]) {\n .checkbox {\n background-color: $ff-grey-600;\n }\n }\n &:hover:not([disabled=true]) {\n .checkbox[checked=true] {\n background-color: $ff-white;\n }\n }\n }\n\n /**\n * Toast Notification\n */\n\n .ff-notification-toast {\n color: $ff-grey-800;\n }\n\n /**\n * Selection Tile\n */\n\n .ff-tile-selection {\n .ff-tile-selection-option--header > h2 svg {\n fill: $ff-grey-500;\n &.ff-tile-selection-option--edit:hover {\n fill: $ff-blue-300;\n }\n }\n .ff-tile-selection-option {\n background-color: $ff-grey-700;\n border-color: $ff-grey-800;\n &.active svg {\n fill: $ff-blue-300;\n }\n &:hover {\n background-color: $ff-grey-800;\n }\n &:not(.editable):hover {\n border-color: $ff-blue-300;\n }\n &[selected=true] {\n background-color: $ff-grey-800;\n border-color: $ff-grey-800;\n }\n }\n }\n\n /**\n * Data Table\n */\n .ff-data-table {\n &--data {\n .ff-data-table--cell {\n }\n thead {\n .ff-data-table--cell {\n background-color: $ff-grey-900;\n &.sortable {\n &:hover {\n background-color: $ff-grey-800;\n }\n }\n &.sorted {\n background-color: $ff-grey-900;\n }\n }\n }\n tbody {\n .ff-data-table--row:last-child {\n .ff-data-table--cell {\n border-top-color: $ff-grey-600;\n }\n }\n .ff-data-table--cell {\n background-color: $ff-grey-700;\n &.highlight {\n background-color: $ff-grey-800;\n }\n }\n .selectable:hover .ff-data-table--cell {\n color: $ff-blue-300;\n background-color: $ff-grey-600;\n }\n }\n }\n &--row {\n td {\n border-color: $ff-grey-600;\n }\n }\n }\n \n .ff-loadmore {\n span {\n color: $ff-white;\n background-color: $ff-grey-900;\n border: 1px solid $ff-grey-600;\n &:hover {\n color: $ff-blue-300;\n background-color: $ff-grey-600;\n }\n }\n }\n}\n",".ff--immersive-editor-wrapper {\n position: relative;\n height: 100%;\n display: flex;\n flex: 1;\n\n .editor-wrapper {\n height: 100%;\n width: 100%;\n position: absolute;\n display: flex;\n flex-direction: column;\n align-content: center;\n justify-content: center;\n }\n .editor-wrapper .status-wrapper {\n margin-top: -64px;\n }\n\n .tabs-wrapper {\n position: fixed;\n left: 0;\n top: 60px;\n width: 0;\n height: calc(100% - 60px);\n background: white;\n transform: translateX(-100%);\n transition: transform 0.3s ease-in-out, box-shadow 0.3s ease-in-out;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n container-type: inline-size;\n container-name: drawer;\n z-index: 1;\n\n .header, main {\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s;\n }\n\n main {\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n .header {\n padding: 0;\n display: flex;\n line-height: 1.5;\n border-bottom: 1px solid $ff-grey-200;\n background: white;\n z-index: 10;\n\n .logo {\n display: flex;\n\n a {\n display: flex;\n align-items: center;\n color: $ff-grey-500;\n gap: 4px;\n padding: 0 15px;\n transition: all 0.2s ease;\n\n .ff-btn--icon {\n width: 16px;\n height: 16px;\n }\n\n img {\n height: 20px;\n }\n\n &:hover {\n background: $ff-grey-100;\n color: $ff-grey-700;\n }\n\n &:active {\n background: $ff-grey-200;\n }\n }\n }\n\n .tabs {\n flex: 1;\n padding: 0 15px 0 0;\n min-width: 0;\n\n .ff-tab-option {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n .side-actions {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n color: $ff-grey-500;\n flex-shrink: 0;\n gap: 5px;\n\n .close-drawer-button {\n align-self: stretch;\n background: none;\n border: none;\n padding: 0 15px;\n color: inherit;\n font: inherit;\n display: flex;\n align-items: center;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover {\n background: $ff-grey-100;\n color: $ff-grey-700;\n }\n\n &:active {\n background: $ff-grey-200;\n }\n }\n }\n }\n\n &.open {\n transform: translateX(0);\n box-shadow: 5px 0 8px rgba(0, 0, 0, 0.10);\n\n .header, main {\n opacity: 1;\n pointer-events: auto;\n }\n }\n }\n\n .resize-bar.resizing {\n background-color: $ff-blue-500;\n }\n\n &.resizing {\n cursor: ew-resize;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n\n .tabs-wrapper {\n transition: none;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.education-modal {\n position: absolute;\n top: 65px;\n right: 5px;\n width: 350px;\n background: $ff-white;\n border: 1px solid $ff-grey-300;\n box-shadow: -6px 6px 10px rgba(0, 0, 0, .2);\n margin: 0;\n\n .ff-dialog-content {\n padding: 10px 10px 5px 10px;\n\n p {\n line-height: 1.5;\n }\n }\n\n .ff-dialog-actions {\n padding: 5px 10px 10px 10px;\n }\n\n .title {\n margin-bottom: 20px;\n text-align: center;\n border-bottom: 1px solid $ff-grey-200;\n padding-bottom: 15px;\n }\n\n .options {\n li {\n margin-bottom: 5px;\n\n a {\n transition: ease-in-out .3s;\n position: relative;\n line-height: 2;\n display: flex;\n justify-content: space-between;\n width: 100%;\n border: 1px solid $ff-grey-200;\n align-items: center;\n padding: 5px;\n color: $ff-black;\n\n &:hover {\n text-decoration: none;\n border: 1px solid $ff-blue-700;\n color: $ff-blue-700;\n }\n }\n }\n }\n\n .actions {\n display: flex;\n justify-content: flex-end;\n }\n\n .loader-wrapper {\n position: relative;\n\n .loader {\n position: absolute;\n z-index: 1000;\n right: 0;\n bottom: -7px;\n height: 10px;\n width: 100%;\n }\n\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-layout--docs {\n background-color: white;\n &-contents {\n max-width: 1012px;\n margin: auto;\n padding: 16px;\n }\n h1 {\n margin: 16px 0;\n }\n}\n",".ff-notification-interview {\n max-width: 450px;\n background-color: $ff-white;\n box-shadow: -6px 6px 6px #00000040;\n border-radius: 0 6px 6px 0;\n padding: 12px 9px 12px 18px;\n border: 1px solid $ff-blue-700;\n border-left: 8px solid $ff-blue-700;\n\n h3 {\n font-size: 1.1rem;\n margin-bottom: 12px;\n }\n\n p {\n font-size: 1.1rem;\n }\n\n &--actions {\n margin-top: 24px;\n gap: 12px;\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n font-size: 1rem;\n\n .ff-btn.ff-btn--primary {\n background-color: $ff-blue-700;\n border-color: $ff-blue-700;\n\n &:hover {\n background-color: $ff-blue-800;\n }\n }\n }\n}\n\n$ff-notifications-drawer-side-padding: 6px;\n\n.ff-notifications-drawer {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n padding: 0 !important;\n\n > .header {\n width: 100%;\n padding: 1rem 1.5rem;\n border-bottom: 1px solid $ff-grey-200;\n background: white;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n box-sizing: border-box;\n\n .title {\n font-size: 1rem;\n font-weight: 600;\n color: #374151;\n margin: 0;\n line-height: 1.5rem;\n flex: 1;\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n\n .ff-checkbox {\n margin: 0;\n }\n\n .header-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n padding: 0;\n background: none;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n color: inherit;\n font: inherit;\n transition: background-color 0.15s ease;\n\n &:hover {\n cursor: pointer;\n background: $ff-grey-100;\n }\n }\n }\n }\n\n > .controls {\n width: 100%;\n border-bottom: 1px solid $ff-grey-300;\n background: white;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n\n .actions {\n display: flex;\n gap: 5px;\n padding: 10px 12px;\n\n .forge-badge {\n background-color: $ff-grey-100;\n border-radius: 5px;\n\n &:hover {\n cursor: pointer;\n background-color: $ff-grey-300\n }\n\n &.disabled {\n color: $ff-grey-400;\n\n &:hover {\n cursor: not-allowed;\n }\n }\n }\n }\n }\n\n .messages-wrapper {\n flex: 1;\n width: 100%;\n background-color: $ff-grey-100;\n overflow: auto;\n $read: $ff-grey-400;\n $info: blue;\n $warning: $ff-yellow-600;\n $error: $ff-red-500;\n\n .message-wrapper {\n display: flex;\n flex-direction: row;\n color: $ff-grey-400;\n background-color: $ff-white;\n border-bottom: 1px solid $ff-grey-300;\n border-left: 3px solid rgba(0, 0, 0, 0);\n transition: ease-in-out .3s;\n cursor: pointer;\n\n .counter {\n margin-top: 0.2rem;\n\n .ff-notification-pill {\n background-color: $read;\n color: white;\n padding: 2px 7px;\n border-radius: 6px;\n font-size: 0.65rem;\n }\n }\n\n .action {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 40px;\n cursor: default;\n\n .ff-checkbox {\n height: 13px;\n width: 13px;\n padding: 0;\n\n span {\n margin: 0;\n padding: 0;\n }\n }\n }\n\n &:hover .title {\n color: $ff-blue-500;\n }\n\n &.unread {\n border-left: 3px solid $info;\n border-left-color: $ff-blue-500;\n color: $ff-grey-800;\n\n &.warning {\n border-left: 3px solid $warning;\n\n .counter .ff-notification-pill {\n background-color: $warning;\n }\n }\n\n &.error {\n border-left: 3px solid $error;\n\n .counter .ff-notification-pill {\n background-color: $error;\n }\n }\n\n .counter .ff-notification-pill {\n background-color: $info;\n }\n }\n\n .body {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 9px $ff-notifications-drawer-side-padding*2 9px $ff-notifications-drawer-side-padding;\n\n .header {\n gap: 5px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n .ff-icon {\n height: 20px;\n min-width: 20px;\n min-height: 20px;\n max-width: fit-content;\n max-height: fit-content;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .title {\n flex: 1;\n transition: ease-in-out .3s;\n margin: 0;\n }\n\n input {\n &:hover {\n cursor: pointer;\n }\n }\n }\n\n .text {\n display: flex;\n margin: 10px 0;\n align-items: center;\n line-height: 1.5rem;\n }\n\n .footer {\n display: flex;\n text-align: right;\n color: $ff-grey-400;\n font-size: 80%;\n padding: 0 $ff-notifications-drawer-side-padding;\n justify-content: flex-end;\n }\n }\n\n &:hover {\n background-color: $ff-grey-100;\n }\n }\n }\n\n .empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n color: $ff-grey-400;\n width: 100%;\n background-color: $ff-grey-100;\n }\n\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n/* Hide the ::after divider that the header navigation adds to all children */\n.expert-button-wrapper::after {\n display: none !important;\n}\n\n/* Dual-background gradient border technique from flowfuse.com */\n.expert-button {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(135deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n border: 1px solid transparent;\n animation: gradient-border-rotate 4s linear infinite;\n\n &:hover {\n border: 2px solid transparent;\n margin: -1px;\n }\n}\n\n@keyframes gradient-border-rotate {\n 0% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(0deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 10% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(36deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 20% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(72deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 30% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(108deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 40% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(144deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 50% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(180deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 60% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(216deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 70% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(252deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 80% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(288deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 90% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(324deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n 100% {\n background: linear-gradient(white, white) padding-box,\n linear-gradient(360deg, $ff-red-600, #5048e5, $ff-red-600) border-box;\n }\n}\n",".ff-empty-state {\n text-align: center;\n padding-top: 64px;\n padding-bottom: 64px;\n background-color: white;\n border: 1px solid $ff-grey-200;\n border-radius: 3px;\n >div {\n margin: auto;\n }\n img {\n margin: auto;\n }\n h1 {\n font-size: 1.5rem;\n line-height: 1.75rem;\n margin: auto;\n margin-top: 1.5rem;\n margin-bottom: 1rem;\n font-weight: 500;\n max-width: 450px;\n }\n &--message {\n max-width: 500px;\n font-size: 1.1rem;\n margin: auto;\n margin-top: 1.25rem;\n margin-bottom: 1.25rem;\n p {\n margin-bottom: 0.75rem;\n line-height: 1.5rem;\n color: $ff-grey-800;\n }\n }\n &--actions {\n display: flex;\n justify-content: center;\n gap: 6px;\n }\n &--note {\n display: flex;\n justify-content: center;\n margin-top: 1.75rem;\n color: $ff-grey-400;\n }\n\n &.ff-empty-state-feature-unavailable {\n background-color: inherit;\n border: none; \n }\n}","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-team-type-tile {\n position: relative;\n border-radius: 6px;\n border: 2px solid $ff-grey-300;\n background: white;\n box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.25);\n padding: 24px;\n width: 100%;\n max-width: 300px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n ul {\n list-style: disc;\n padding-left: 16px;\n li {\n margin-bottom: 6px;\n }\n }\n}\n.trial-ribbon {\n --ribbon-overlap: 8px;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 30px;\n left: calc(-1 * var(--ribbon-overlap));\n line-height: 1.3;\n width: calc(100% + 2 * var(--ribbon-overlap));\n margin: 0;\n position: absolute;\n top: 8px;\n color: white;\n // text-shadow: 0 1px 1px #111;\n border-top: 1px solid #363636;\n border-bottom: 1px solid #202020;\n background: $ff-red-500;\n // background: linear-gradient($ff-red-500 0%, $ff-red-700 100%);\n border-radius: 2px 2px 0 0;\n box-shadow: 0 1px 2px rgba(0,0,0,0.3);\n}\n.trial-ribbon::before,\n.trial-ribbon::after {\n content: '';\n display: block;\n width: 0;\n height: 0;\n position: absolute;\n bottom: calc((-2 * var(--ribbon-overlap)) - 1px);\n z-index: -10;\n border: var(--ribbon-overlap) solid;\n border-color: $ff-red-900 transparent transparent transparent;\n}\n.trial-ribbon::before {left: 0;}\n.trial-ribbon::after {right: 0;}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.not-found-wrapper {\n background: none;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n\n .not-found-container {\n background: $ff-white;\n padding: 30px 150px;\n margin: 50px;\n border-radius: 20px;\n box-shadow: 0 0 50px rgba(0, 0, 0, 0.2);\n\n .image-wrapper {\n display: flex;\n justify-content: center;\n margin: 30px 0;\n }\n\n .title {\n margin: 30px 0;\n }\n\n .actions {\n display: flex;\n justify-content: center;\n gap: 15px;\n margin: 30px 0 15px;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.wrapper {\n flex: 1;\n\n .info {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n align-self:center;\n }\n\n .actions {\n display: flex;\n justify-content: flex-end;\n }\n}\n\n// Hide info icon on small viewports (below 640px)\n@media (max-width: 639px) {\n .ff-info-icon {\n display: none;\n }\n}\n\n// Also hide info icon when drawer is narrow (below 640px)\n@container drawer (max-width: 639px) {\n .ff-info-icon {\n display: none;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-listbox {\n display: inline-block;\n min-width: 200px;\n\n &:focus-visible {\n border: none;\n outline: none;\n\n }\n\n .ff-button {\n border: 1px solid $ff-grey-300;\n padding: 5px 5px 5px 10px;\n background: $ff-white;\n\n &:focus-visible {\n outline: none;\n }\n\n &:focus {\n border-color: $ff-blue-500;\n }\n\n .icon {\n svg {\n width: 1.5rem;\n height: 1.5rem;\n }\n }\n }\n\n &[data-headlessui-state=\"open\"] {\n button {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n}\n\n.ff-options {\n background: $ff-grey-50;\n box-shadow: 0 6px 9px 0 #00000038;\n max-height: 28rem;\n z-index: 200;\n overflow-y: auto;\n padding: 0;\n border-left: 1px solid $ff-grey-200;\n border-right: 1px solid $ff-grey-200;\n border-bottom: 1px solid $ff-grey-200;\n &:focus-visible, &:focus {\n outline: none;\n }\n\n .ff-option {\n border-bottom: 1px solid $ff-grey-200;\n background-color: $ff-grey-50;\n cursor: pointer;\n\n &:last-of-type {\n border-bottom: none;\n }\n\n .ff-option-content {\n padding: $ff-unit-sm $ff-unit-md;\n border: 1px solid transparent;\n\n &.selected {\n background-color: $ff-grey-200;\n }\n &.active {\n border: 1px solid $ff-indigo-300;\n }\n &.selected.active {\n border-color: transparent;\n }\n }\n\n &:hover {\n background-color: $ff-grey-200;\n .ff-option-content.active {\n border-color: transparent\n }\n }\n }\n}\n",".ff-audit-entry {\n display: grid;\n grid-template-areas:\n 'time author'\n 'entry entry';\n grid-gap: 0.25rem;\n align-items: center;\n label {\n font-weight: 500;\n }\n span {\n color: $ff-grey-400;\n font-weight: 400;\n font-size: 0.875rem;\n line-height: 1rem;\n display: block;\n width:100%;\n }\n\n svg path {\n stroke-width: 2px;\n }\n &--error {\n position: relative;\n summary {\n display: flex;\n align-items: center;\n list-style: none;\n cursor: pointer;\n font-size: 0.875rem;\n color: $ff-grey-500;\n &::-webkit-details-marker {\n display: none;\n }\n }\n // the chevron down will only show when detail is opened\n span .ff-icon {\n position: absolute;\n top: 3px;\n left: 0;\n background-color: $ff-grey-50;\n fill: $ff-grey-500;\n }\n &:hover {\n summary {\n color: black;\n }\n span .ff-icon {\n fill: black;\n }\n }\n }\n}\n\n.ff-audit-entry-info {\n grid-area: entry;\n}\n\n.ff-audit-entry-trigger, .ff-audit-entry-time {\n grid-area: time;\n display: block;\n color: $ff-grey-500;\n overflow-x: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.ff-audit-entry-trigger {\n grid-area: author;\n text-align: right;\n}\n\n\n@media screen and (min-width: $ff-screen-lg) {\n .ff-audit-entry {\n grid-template-areas: 'time entry author';\n grid-template-columns: min-content 1fr min-content;\n }\n}",".ff-accordion {\n margin-bottom: 24px;\n &--button {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n background-color: $ff-grey-100;\n border: 1px solid $ff-grey-300;\n padding: 6px 9px;\n cursor: default;\n label {\n font-weight: 500;\n }\n span {\n color: $ff-grey-500;\n font-size: 0.875rem;\n }\n .ff-icon {\n margin-left: 12px;\n transition: 0.3s transform;\n -webkit-transition: 0.3s transform;\n }\n &:not([disabled]):hover{\n background-color: $ff-grey-200;\n cursor: pointer;\n }\n }\n &--content {\n transition: max-height 0.6s ease-out;\n .ff-audit-entry {\n padding: 12px;\n border: 1px solid $ff-grey-300;\n border-top-width: 0;\n }\n }\n &.open {\n .ff-accordion--button .ff-icon.chevron {\n transform: rotate(-90deg);\n }\n }\n}\n","<template>\n <ff-dialog\n v-if=\"visible\"\n ref=\"dialog\" :header=\"header\" :sub-header=\"`Node-RED Version: ${nrVersion}`\" confirm-label=\"Close\" :closeOnConfirm=\"true\"\n data-el=\"flow-view-dialog\" boxClass=\"!min-w-[80%] !min-h-[80%] !w-[80%] !h-[80%]\"\n contentClass=\"overflow-hidden flex-grow\" @confirm=\"confirm()\"\n >\n <template #default>\n <div ref=\"viewer\" data-el=\"ff-flow-previewer\" class=\"ff-flow-viewer\" @click.stop.prevent>\n Loading...\n </div>\n </template>\n <template #actions>\n <div class=\"flex justify-end\">\n <ff-button data-action=\"dialog-confirm\" @click=\"confirm()\">Close</ff-button>\n </div>\n </template>\n </ff-dialog>\n</template>\n<script>\n\nimport FlowRenderer from '@flowfuse/flow-renderer'\n\nimport BlueprintAPI from '../../api/flowBlueprints.js'\n\nexport default {\n name: 'FlowViewerDialog',\n props: {\n title: {\n type: String,\n default: ''\n }\n },\n setup () {\n return {\n async show (payload) { // accepts blueprints, snapshots and libraries\n // If there is no flows property, but there is a category property, we assume this is a blueprint\n // and try to load the content dynamically\n this.visible = true\n this.$nextTick(async () => {\n if (!payload.flows && Object.hasOwn(payload, 'category')) {\n const blueprint = await BlueprintAPI.getFlowBlueprint(payload.id)\n payload.flows = blueprint.flows\n }\n this.mode = 'view'\n this.$refs.dialog.show()\n this.payload = payload\n setTimeout(() => {\n this.renderFlows()\n }, 20)\n })\n }\n }\n },\n data () {\n return {\n payload: [],\n visible: false\n }\n },\n computed: {\n flow () {\n return this.payload?.flows?.flows || []\n },\n nrVersion () {\n const mods = this.payload?.settings?.modules\n if (mods) {\n return mods['node-red'] || 'Unavailable'\n }\n return ''\n },\n header () {\n return this.payload?.name || this.title || 'Flow'\n }\n },\n mounted () {\n },\n methods: {\n confirm () {\n this.$refs.dialog.close()\n this.visible = false\n },\n renderFlows () {\n const flowRenderer = new FlowRenderer()\n flowRenderer.renderFlows(this.flow, {\n container: this.$refs.viewer\n })\n }\n }\n}\n</script>\n\n<style scoped>\n.ff-flow-viewer {\n height: 100%;\n}\n</style>\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-blueprint-tile {\n background-color: $ff-white;\n width: 250px;\n border-width: 2px;\n\n &.active {\n border-width: 2px;\n border-color: $ff-blue-600;\n transition: border-color .3s;\n }\n\n .ff-blueprint-tile--header {\n position: relative;\n height: 115px;\n\n .ff-icon {\n transform: scale(8);\n position: absolute;\n top: 70px;\n transition: transform .3s;\n &.alt-preview {\n position: absolute;\n height: 30px;\n width: 30px;\n transform: scale(1) !important;\n top: 5px !important;\n right: 5px !important;\n stroke: none;\n opacity: .7;\n &:hover {\n cursor: zoom-in;\n color: $ff-blue-600;\n }\n }\n }\n\n .ff-more-info {\n position: absolute;\n top: 5px;\n left: 5px;\n }\n }\n\n &.no-icon {\n .ff-blueprint-tile--header {\n .ff-icon:not(.alt-preview) {\n transform: scale(4);\n position: initial;\n }\n }\n }\n\n .ff-dialog-container {\n .ff-dialog-box {\n max-width: 75rem;\n\n .ff-dialog-content {\n padding: 0;\n }\n\n .ff-dialog-actions {\n padding: 5px 15px;\n }\n }\n }\n &.interactive:hover {\n border-width: 2px;\n border-color: $ff-blue-600;\n .ff-blueprint-tile--header {\n .ff-icon:not(.alt-preview) {\n transform: scale(10);\n }\n }\n\n &.no-icon {\n .ff-blueprint-tile--header {\n .ff-icon:not(.alt-preview) {\n transform: scale(6);\n }\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-dialog-container {\n .ff-dialog-content {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n .file-upload-section {\n .file-row > div {\n flex-direction: column;\n align-items: baseline;\n }\n\n .ff-btn {\n width: 100%;\n }\n\n .file-input {\n display: flex;\n gap: 5px;\n }\n\n .loaded-file {\n display: flex;\n gap: 5px;\n align-items: center;\n margin-top: 10px;\n\n .clear {\n cursor: pointer;\n padding: 5px;\n\n .ff-btn--icon {\n width: 15px;\n height: 15px;\n }\n }\n }\n }\n\n .textarea-section {\n .textarea-wrapper {\n display: flex;\n justify-content: space-between;\n\n .clear {\n font-weight: normal;\n cursor: pointer;\n }\n }\n }\n\n .divider {\n position: relative;\n .line {\n height: 1px;\n width: 100%;\n background: $ff-grey-400;\n position: absolute;\n top: 50%;\n display: block;\n }\n .text {\n background: white;\n padding: 5px;\n position: relative;\n z-index: 10;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.tools {\n display: flex;\n gap: 5px;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.inactive-team {\n color: $ff-grey-400;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\ninput:disabled {\n background-color: $ff-white !important;\n opacity: .9;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\ntextarea:disabled {\n background-color: $ff-white;\n opacity: .9;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-text-copier {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n position: relative;\n &:hover {\n cursor: pointer;\n }\n .ff-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 4px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: $ff-color--action;\n\n &:hover {\n color: $ff-white;\n background-color: $ff-color--highlight;\n }\n\n &:active {\n background-color: $ff-color--highlight;\n }\n\n .ff-icon {\n pointer-events: none;\n }\n\n .ff-icon-check {\n color: $ff-green-600;\n }\n }\n .ff-copied {\n background-color: black;\n color: white;\n padding: 3px;\n border-radius: 3px;\n position: absolute;\n margin-top: -3px;\n margin-left: 3px;\n display: none;\n z-index: 100;\n left: 100%;\n }\n .ff-copied-left {\n left: inherit;\n right: 100%;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-data-table--cell textarea {\n resize: vertical;\n max-height: 10rem; /* 160px approx ~8 lines, after which user will need to scroll */\n /* Below styles emulate the text control in a form row */\n border: 1px solid #D1D5DB;\n border-radius: 6px;\n /* height: 32px; */\n padding: 6px;\n min-height: 32px; /* align with item in cell-1*/\n width: 100%;\n display: flex;\n gap: 0px;\n align-items: center;\n background-color: white;\n border-color: #D1D5DB;\n}\n.ff-data-table--cell .env-cell-uneditable {\n max-height: 10rem; /* 160px approx ~8 lines, after which user will need to scroll */\n overflow: auto;\n white-space: pre;\n cursor: default;\n}\n.ff-data-table--cell .env-cell-uneditable input {\n cursor: default;\n}\n.ff-data-table--cell div.uneditable {\n cursor: default;\n}\n",".ff-admin-audit {\n display: grid;\n grid-template-columns: 2fr minmax(min-content, 240px);\n gap: 24px;\n \n &.full-width {\n display: flex;\n grid-template-columns: none;\n gap: 0;\n \n \n }\n}\n",".ff-info-card h3 {\n display: flex;\n gap: 9px;\n margin-bottom: 12px;\n align-items: center;\n}\n\n.ff-info-card h3 svg {\n width: 1.5rem;\n height: 1.5rem;\n}\n\n.ff-info-card-content {\n padding: 6px 12px;\n background-color: white;\n border: 1px solid $ff-grey-300;\n}\n\n.ff-info-card-row {\n min-height: 36px;\n}\n\n.ff-info-card .ff-info-card-row:not(:last-child) {\n margin-bottom: 6px;\n padding-bottom: 6px;\n border-bottom: 1px solid $ff-grey-200;\n}","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.popover-item {\n display: flex;\n align-items: center;\n gap: 15px;\n padding: 10px 20px;\n cursor: pointer;\n\n .icon {\n padding: 5px;\n }\n\n .content {\n display: flex;\n flex-direction: column;\n\n .description {\n color: $ff-grey-400;\n }\n }\n\n &:hover {\n background: $ff-grey-100;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n\n.ff-icon-anim {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.ff-icon-installing {\n overflow: hidden;\n}\n\n.ff-icon-installing svg {\n --anim-time: 0.75s;\n position: relative;\n color: currentColor;\n animation: ff-icon-installing var(--anim-time) infinite linear;\n animation-delay: calc(var(--anim-time) / 2);\n}\n\n@keyframes ff-icon-installing {\n 0% {\n opacity: 0;\n transform: translate(0, -100%);\n }\n 50% {\n opacity: 1;\n transform: translate(0, 0);\n }\n 100% {\n opacity: 0;\n transform: translate(0, 100%);\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n\n.ff-icon-anim {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.ff-icon-pulling {\n overflow: hidden;\n}\n\n.ff-icon-pulling svg {\n --anim-time: 0.75s;\n position: relative;\n color: currentColor;\n animation: ff-icon-pulling var(--anim-time) infinite linear;\n animation-delay: calc(var(--anim-time) / 2);\n}\n\n@keyframes ff-icon-pulling {\n 0% {\n opacity: 0;\n transform: translate(0, -100%);\n }\n 50% {\n opacity: 1;\n transform: translate(0, 0);\n }\n 100% {\n opacity: 0;\n transform: translate(0, 100%);\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n\n.ff-icon-anim {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.ff-icon-pushing {\n overflow: hidden;\n}\n\n.ff-icon-pushing svg {\n --anim-time: 0.75s;\n position: relative;\n color: currentColor;\n animation: ff-icon-pushing var(--anim-time) infinite linear;\n animation-delay: calc(var(--anim-time) / 2);\n}\n\n@keyframes ff-icon-pushing {\n 0% {\n opacity: 0;\n transform: translate(0, 100%);\n }\n 50% {\n opacity: 1;\n transform: translate(0, 0);\n }\n 100% {\n opacity: 0;\n transform: translate(0, -100%);\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n\n.ff-icon-restarting svg {\n --anim-time: 1s;\n position: relative;\n color: currentColor;\n animation: ff-icon-restarting var(--anim-time) infinite linear;\n}\n\n@keyframes ff-icon-restarting {\n 0% {\n opacity: 0.2;\n transform: rotate(360deg);\n }\n 33% {\n opacity: 1;\n }\n 66% {\n opacity: 1;\n }\n 100% {\n opacity: 0.2;\n transform: rotate(0deg);\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-icon-anim {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.ff-icon-starting {\n --cell-width: 2px;\n --cell-offset: calc(var(--cell-width) * 1.5);\n --anim-time: 0.5s;\n position: relative;\n width: var(--cell-width);\n height: var(--cell-width);\n border-radius: 5px;\n background-color: currentColor;\n color: currentColor;\n animation: ff-icon-starting var(--anim-time) infinite linear alternate;\n animation-delay: calc(var(--anim-time) / 2);\n}\n\n.ff-icon-starting::before, .ff-icon-starting::after {\n content: \"\";\n display: inline-block;\n position: absolute;\n top: 0;\n}\n.ff-icon-starting::before {\n left: calc(-1 * var(--cell-offset));\n width: var(--cell-width);\n height: var(--cell-width);\n border-radius: 5px;\n background-color: currentColor;\n color: currentColor;\n animation: ff-icon-starting var(--anim-time) infinite alternate;\n animation-delay: 0s;\n}\n.ff-icon-starting::after {\n left: var(--cell-offset);\n width: var(--cell-width);\n height: var(--cell-width);\n border-radius: 5px;\n background-color: currentColor;\n color: currentColor;\n animation: ff-icon-starting var(--anim-time) infinite alternate;\n animation-delay: var(--anim-time);\n}\n\n@keyframes ff-icon-starting {\n 0% {\n background-color: currentColor;\n }\n 50%, 100% {\n background-color: rgba($ff-grey-500, 0.2);\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-device-overview {\n h1 {\n border-bottom: none;\n margin-bottom: 12px;\n }\n}\n.ff-device-overview-audit {\n .ff-accordion {\n margin-bottom: 12px;\n }\n .ff-accordion:last-child {\n margin-bottom: 0;\n }\n .ff-accordion--content {\n background-color: white;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.chart-wrapper {\n flex: 1;\n display: flex;\n\n .chart {\n flex: 1;\n height: 100%;\n width: 100%;\n min-height: 250px;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.chart-wrapper {\n flex: 1;\n display: flex;\n\n .chart {\n flex: 1;\n height: 100%;\n width: 100%;\n min-height: 250px;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.notice {\n border: 1px solid $ff-yellow-100;\n background-color: $ff-yellow-10;\n border-radius: $ff-unit-sm;\n padding: $ff-unit-md;\n\n .icon-wrapper {\n min-width: 40px;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.device-list-accordion {\n &.ff-accordion {\n margin-bottom: 0;\n\n button {\n border-top: none;\n border-left: none;\n border-right: none;\n background: transparent;\n transition: background-color ease-in-out .3s;\n padding-left: 0;\n padding-right: 0;\n\n label {\n font-weight: normal;\n }\n\n &:hover {\n background-color: transparent;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-toggle-group {\n display: flex;\n gap: 15px;\n align-items: center;\n\n .title {\n color: $ff-black;\n font-weight: 400;\n }\n\n .toggle {\n border: 1px solid $ff-blue-800;\n display: flex;\n border-radius: 5px;\n\n .inner-wrapper {\n display: grid;\n grid-template-columns: repeat(var(--button-count), 1fr);\n border-radius: 4px;\n border: 1px solid transparent;\n position: relative;\n\n .indicator {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: $ff-indigo-700;\n border-radius: 4px;\n transition: transform 0.2s ease;\n z-index: 0;\n }\n\n a {\n padding: 5px 10px;\n border-radius: 4px;\n transition: color 0.2s ease;\n position: relative;\n z-index: 1;\n text-align: center;\n\n &.router-link-active {\n color: $ff-white;\n }\n }\n\n .ff-btn {\n background: transparent;\n color: $ff-grey-500;\n border-color: transparent;\n position: relative;\n z-index: 1;\n border-radius: 4px;\n\n &:focus-visible {\n outline: 2px solid $ff-indigo-700;\n outline-offset: 1px;\n }\n\n &.active {\n color: $ff-white;\n }\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.page-fade-enter-active, .page-fade-leave-active {\n transition: opacity .2s ease-in-out;\n}\n\n.page-fade-enter, .page-fade-leave-to {\n opacity: 0;\n}\n\n// Viewport-based responsive behavior (matches Tailwind sm: breakpoint)\n// Hide button text on narrow viewports (< 640px)\n@media (max-width: 639px) {\n .upload-snapshot-text,\n .create-snapshot-text {\n display: none;\n }\n}\n\n// Show button text on wider viewports (>= 640px)\n@media (min-width: 640px) {\n .upload-snapshot-text,\n .create-snapshot-text {\n display: inline;\n }\n}\n\n// Container query for drawer context - responsive button behavior\n// Breakpoint matches DRAWER_MOBILE_BREAKPOINT constant in Editor/index.vue\n// These override viewport-based rules when inside the drawer\n@container drawer (max-width: 639px) {\n // Hide text when drawer is narrow - icon-only mode\n .upload-snapshot-text,\n .create-snapshot-text {\n display: none;\n }\n}\n\n@container drawer (min-width: 640px) {\n // Show text when drawer is wide enough\n .upload-snapshot-text,\n .create-snapshot-text {\n display: inline;\n }\n}\n\n","<template>\n <ff-dialog\n ref=\"dialog\" :header=\"header\" confirm-label=\"Close\" :closeOnConfirm=\"true\" data-el=\"flow-view-dialog\"\n boxClass=\"!min-w-[80%] !min-h-[80%] !w-[80%] !h-[80%]\" contentClass=\"overflow-hidden flex-grow\"\n @confirm=\"confirm()\"\n >\n <template #default>\n <div class=\"flex gap-2\" data-el=\"snapshot-compare-toolbar\">\n <ff-listbox\n v-model=\"compareSnapshot\"\n :options=\"compareSnapshotList\"\n data-el=\"snapshots-list\"\n label-key=\"label\"\n option-title-key=\"description\"\n class=\"flex-grow\"\n />\n <ff-button\n v-if=\"true\"\n :disabled=\"!compareSnapshot\"\n data-action=\"compare-snapshots\"\n kind=\"secondary\"\n style=\"height: 30px; width: 106px\"\n class=\"w-32\"\n @click=\"renderComparison\"\n >\n Compare\n </ff-button>\n </div>\n <div v-if=\"changes.length\" class=\"flex justify-between items-center gap-2 mt-2 ml-2\">\n <div class=\"whitespace-nowrap\">Change {{ changeIndex + 1 }} of {{ changes.length }}:</div>\n <div class=\"text-sm text-gray-500 flex-grow truncate overflow-ellipsis\">\n {{ changes[changeIndex].toString() }}\n </div>\n <ff-button kind=\"secondary\" size=\"small\" class=\"w-14\" @click=\"gotoPreviousDifference\">Prev</ff-button>\n <ff-button kind=\"secondary\" size=\"small\" class=\"w-14\" @click=\"gotoNextDifference\">Next</ff-button>\n </div>\n <div v-else class=\"mt-2\">\n <div class=\"text-sm text-gray-500 flex-grow truncate overflow-ellipsis ml-2\">No differences found</div>\n </div>\n <div ref=\"compareViewer\" data-el=\"ff-flow-compare-view\" class=\"ff-flow-compare-viewer pt-4\" @click.stop.prevent>\n \n </div>\n </template>\n <template #actions>\n <div class=\"flex justify-end\">\n <ff-button data-action=\"dialog-confirm\" @click=\"confirm()\">Close</ff-button>\n </div>\n </template>\n </ff-dialog>\n</template>\n<script>\n\nimport FlowRenderer from '@flowfuse/flow-renderer'\n\nimport SnapshotsApi from '../../api/snapshots.js'\n\nimport Alerts from '../../services/alerts.js'\n\nexport default {\n name: 'AssetCompareDialog',\n props: {\n title: {\n type: String,\n default: ''\n }\n },\n setup () {\n return {\n /**\n * Shows the compare flows dialog and presents the user with a list of snapshots to compare against\n * @param {{flows: { flows :[]}}} v1Snapshot - A snapshot object as the base for comparison\n * @param {[{label: String, value: String}]} snapshotList - A list of snapshots to compare against where label is the snapshot name and value is the snapshot id\n */\n show (v1Snapshot, snapshotList) {\n this.mode = 'compare'\n this.payload = v1Snapshot\n this.compareSnapshot = null\n this.changes = []\n this.changeIndex = 0\n this.compareSnapshotList = snapshotList\n this.$refs.dialog.show()\n }\n }\n },\n data () {\n return {\n payload: [],\n snapshotList: [],\n compareSnapshot: null,\n compareSnapshotList: [],\n mode: 'view', // view, compare\n changes: [],\n changeIndex: 0\n }\n },\n computed: {\n flow () {\n return this.payload?.flows?.flows || []\n },\n header () {\n return this.payload?.name || this.title || 'Flow'\n }\n },\n mounted () {\n },\n methods: {\n confirm () {\n this.cleanup()\n this.$refs.dialog.close()\n },\n renderFlows () {\n this.cleanup()\n const flowRenderer = new FlowRenderer()\n flowRenderer.renderFlows(this.flow, {\n container: this.$refs.compareViewer\n })\n },\n async renderComparison (snapshotId) {\n this.cleanup()\n const compareSnapshot = await SnapshotsApi.getFullSnapshot(this.compareSnapshot)\n if (!compareSnapshot?.flows?.flows) {\n Alerts.emit('Flows not found in the selected snapshot', 'warning')\n return\n }\n const flowRenderer = new FlowRenderer()\n const flows = [this.flow, compareSnapshot?.flows?.flows]\n const result = flowRenderer.compare(flows, {\n container: this.$refs.compareViewer\n })\n this.changes = result?.changes || []\n },\n gotoNextDifference () {\n this.changeIndex = (this.changeIndex + 1) % this.changes.length\n this.changes[this.changeIndex].highlight()\n },\n gotoPreviousDifference () {\n this.changeIndex = (this.changeIndex - 1 + this.changes.length) % this.changes.length\n this.changes[this.changeIndex].highlight()\n },\n cleanup () {\n while (this.$refs.compareViewer?.firstChild) {\n this.$refs.compareViewer.removeChild(this.$refs.compareViewer.firstChild)\n }\n }\n }\n}\n</script>\n\n<style scoped>\n.ff-flow-compare-viewer {\n height: calc(100% - 4.5rem);\n}\n</style>\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.flow-viewer-wrapper {\n display: flex;\n flex: 1 1 auto;\n min-height: 0;\n flex-direction: column;\n position: relative;\n\n .overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(255, 255, 255, 0.4);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 1000;\n }\n\n .ff-flow-viewer {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n opacity: 1;\n transition: ease-in-out .3s;\n\n &.loading {\n opacity: 0.5;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#snapshot-details-drawer {\n flex: 1;\n\n &, .container {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 15px;\n overflow: auto;\n }\n\n .description {\n p {\n white-space: break-spaces;\n }\n }\n\n .flow-viewer {\n .wrapper {\n max-height: 250px;\n overflow: auto;\n }\n }\n}\n","<template>\n <div id=\"device-snapshots\" class=\"flex-1 flex flex-col overflow-auto\">\n <div v-if=\"isOwnedByAnInstance || isUnassigned\" class=\"space-y-6\">\n <EmptyState :feature-unavailable=\"!features.deviceEditor\">\n <template #img>\n <img src=\"../../../../images/empty-states/instance-snapshots.png\">\n </template>\n <template #header>Snapshots are available when a Remote Instance is assigned to an Application</template>\n <template #message>\n <p>\n Snapshots are point-in-time backups of your Node-RED Instances\n and capture the flows, credentials and runtime settings.\n </p>\n <p v-if=\"device.ownerType !== 'application'\" class=\"block\">\n A Remote Instance must first be <a class=\"ff-link\" href=\"https://flowfuse.com/docs/device-agent/register/#assign-the-device-to-an-application\" target=\"_blank\" rel=\"noreferrer\">assigned to an Application</a>, in order to create snapshots.\n </p>\n <p v-else-if=\"!developerMode\" class=\"block\">\n A Remote Instance must be in Developer Mode and online to create a Snapshot.\n </p>\n </template>\n <template v-if=\"hasPermission('device:snapshot:create', { application: device.application })\" #actions>\n <ff-button\n v-if=\"hasPermission('snapshot:import', { application: device.application })\"\n kind=\"secondary\" :disabled=\"busy || !features.deviceEditor || device.ownerType !== 'application'\"\n data-action=\"import-snapshot\"\n @click=\"$emit('show-import-snapshot-dialog')\"\n >\n <template #icon-left><UploadIcon /></template>Upload Snapshot\n </ff-button>\n <ff-button\n v-if=\"hasPermission('device:snapshot:create', { application: device.application })\"\n kind=\"primary\"\n :disabled=\"!developerMode || busy || !features.deviceEditor || device.ownerType !== 'application'\"\n data-action=\"create-snapshot\"\n @click=\"$emit('show-create-snapshot-dialog')\"\n >\n <template #icon-left><PlusSmIcon /></template>Create Snapshot\n </ff-button>\n </template>\n </EmptyState>\n </div>\n <div v-else class=\"space-y-6 flex-1 flex flex-col overflow-auto\">\n <ff-loading v-if=\"loading\" message=\"Loading Snapshots...\" />\n <template v-else-if=\"features.deviceEditor && snapshots.length > 0\">\n <ff-data-table\n data-el=\"snapshots\"\n class=\"space-y-4\"\n :columns=\"columns\"\n :rows=\"snapshotsFiltered\"\n :rows-selectable=\"true\"\n :show-search=\"true\"\n search-placeholder=\"Search Snapshots...\"\n @row-selected=\"onRowSelected\"\n >\n <template #actions>\n <DropdownMenu data-el=\"snapshot-filter\" buttonClass=\"ff-btn ff-btn--secondary\" :options=\"snapshotFilterOptions\">\n <FilterIcon class=\"ff-btn--icon ff-btn--icon-left\" aria-hidden=\"true\" />\n {{ snapshotFilter?.name || 'All Snapshots' }}\n <span class=\"sr-only\">Filter Snapshots</span>\n </DropdownMenu>\n </template>\n </ff-data-table>\n </template>\n <template v-else-if=\"!loading\">\n <EmptyState :feature-unavailable=\"!features.deviceEditor\" :feature-unavailable-message=\"'This requires Developer Mode on Devices, which is a FlowFuse Enterprise Feature'\">\n <template #img>\n <img src=\"../../../../images/empty-states/instance-snapshots.png\">\n </template>\n <template #header>Create your First Snapshot</template>\n <template #message>\n <p>\n Snapshots are point-in-time backups of your Node-RED Instances\n and capture the flows, credentials and runtime settings.\n </p>\n <p v-if=\"device.ownerType !== 'application'\" class=\"block\">\n A Remote Instance must first be <a class=\"ff-link\" href=\"https://flowfuse.com/docs/device-agent/register/#assign-the-device-to-an-application\" target=\"_blank\" rel=\"noreferrer\">assigned to an Application</a>, in order to create snapshots.\n </p>\n <p v-else-if=\"!developerMode\" class=\"block\">\n A Remote Instance must be in Developer Mode and online to create a Snapshot.\n </p>\n </template>\n <template v-if=\"hasPermission('device:snapshot:create', { application: device.application })\" #actions>\n <ff-button\n v-if=\"hasPermission('snapshot:import', { application: device.application })\"\n kind=\"secondary\" :disabled=\"busy || !features.deviceEditor || device.ownerType !== 'application'\"\n data-action=\"import-snapshot\"\n @click=\"$emit('show-import-snapshot-dialog')\"\n >\n <template #icon-left><UploadIcon /></template>Upload Snapshot\n </ff-button>\n <ff-button\n kind=\"primary\"\n :disabled=\"!canCreateSnapshot\"\n data-action=\"create-snapshot\"\n @click=\"$emit('show-create-snapshot-dialog')\"\n >\n <template #icon-left><PlusSmIcon /></template>Create Snapshot\n </ff-button>\n </template>\n </EmptyState>\n </template>\n </div>\n </div>\n</template>\n\n<script>\nimport { FilterIcon, PlusSmIcon, UploadIcon } from '@heroicons/vue/outline'\nimport SemVer from 'semver'\nimport { markRaw } from 'vue'\nimport { mapActions, mapState } from 'vuex'\n\nimport ApplicationApi from '../../../../api/application.js'\nimport DropdownMenu from '../../../../components/DropdownMenu.vue'\n\nimport EmptyState from '../../../../components/EmptyState.vue'\nimport SnapshotDetailsDrawer from '../../../../components/drawers/snapshots/SnapshotDetailsDrawer.vue'\nimport UserCell from '../../../../components/tables/cells/UserCell.vue'\nimport usePermissions from '../../../../composables/Permissions.js'\nimport { applySystemUserDetails } from '../../../../transformers/snapshots.transformer.js'\nimport { isAutoSnapshot } from '../../../../utils/snapshot.js'\nimport DaysSince from '../../../application/Snapshots/components/cells/DaysSince.vue'\nimport SnapshotName from '../../../application/Snapshots/components/cells/SnapshotName.vue'\nimport SnapshotSource from '../../../application/Snapshots/components/cells/SnapshotSource.vue'\n\nexport default {\n name: 'DeviceSnapshots',\n components: {\n DropdownMenu,\n EmptyState,\n FilterIcon,\n PlusSmIcon,\n UploadIcon\n },\n inheritAttrs: false,\n props: {\n device: {\n type: Object,\n required: true\n },\n showDeviceSnapshotsOnly: {\n type: Boolean,\n required: false,\n default: false\n },\n reloadHooks: {\n type: Array,\n required: true,\n default: () => []\n }\n },\n emits: ['device-updated', 'show-import-snapshot-dialog', 'show-create-snapshot-dialog'],\n setup () {\n const { hasPermission } = usePermissions()\n return { hasPermission }\n },\n data () {\n return {\n loading: false,\n deviceCounts: {},\n snapshots: [],\n busyMakingSnapshot: false,\n busyImportingSnapshot: false,\n snapshotFilter: null,\n snapshotFilters: {\n All_Snapshots: {\n name: 'All Snapshots',\n selected: true,\n filter: null,\n action: () => {\n this.snapshotFilters.All_Snapshots.selected = true\n this.snapshotFilters.User_Snapshots.selected = false\n this.snapshotFilters.Auto_Snapshots.selected = false\n this.snapshotFilter = this.snapshotFilters.All_Snapshots\n }\n },\n User_Snapshots: {\n name: 'User Snapshots',\n selected: false,\n filter: (s) => !isAutoSnapshot(s),\n action: () => {\n this.snapshotFilters.All_Snapshots.selected = false\n this.snapshotFilters.User_Snapshots.selected = true\n this.snapshotFilters.Auto_Snapshots.selected = false\n this.snapshotFilter = this.snapshotFilters.User_Snapshots\n }\n },\n Auto_Snapshots: {\n name: 'Auto Snapshots',\n selected: false,\n filter: (s) => isAutoSnapshot(s),\n action: () => {\n this.snapshotFilters.All_Snapshots.selected = false\n this.snapshotFilters.User_Snapshots.selected = false\n this.snapshotFilters.Auto_Snapshots.selected = true\n this.snapshotFilter = this.snapshotFilters.Auto_Snapshots\n }\n }\n }\n }\n },\n computed: {\n ...mapState('account', ['team', 'features']),\n canCreateSnapshot () {\n if (!this.developerMode || this.busy) {\n return false\n }\n return this.isOwnedByAnInstance || this.isOwnedByAnApplication\n },\n columns () {\n const cols = [\n {\n label: 'Snapshot',\n class: ['w-56 sm:w-48'],\n component: {\n is: markRaw(SnapshotName),\n extraProps: {\n clippedDetails: true\n }\n }\n },\n {\n label: 'Source',\n class: ['w-56'],\n key: '_ownerSortKey',\n // sortable: !this.moreThanOnePage,\n component: {\n is: markRaw(SnapshotSource)\n }\n },\n {\n label: 'Node-RED version',\n class: ['w-56'],\n key: 'modules.node-red'\n },\n {\n label: 'Created By',\n class: ['w-48 hidden md:table-cell'],\n component: {\n is: markRaw(UserCell),\n map: {\n avatar: 'user.avatar',\n name: 'user.name',\n username: 'user.username'\n }\n }\n },\n {\n label: 'Date Created',\n class: ['w-48 hidden sm:table-cell'],\n component: { is: markRaw(DaysSince), map: { date: 'createdAt' } }\n }\n ]\n return cols\n },\n snapshotList () {\n return this.snapshots.map(s => {\n return {\n label: s.name,\n description: s.description || '',\n value: s.id\n }\n })\n },\n snapshotsFiltered () {\n if (this.snapshotFilter?.filter) {\n return this.snapshots.filter(this.snapshotFilter.filter)\n }\n return this.snapshots\n },\n snapshotFilterOptions () {\n return Object.values(this.snapshotFilters)\n },\n busy () {\n return this.busyMakingSnapshot || this.busyImportingSnapshot\n },\n developerMode () {\n return this.device?.mode === 'developer'\n },\n isOwnedByAnInstance () {\n return this.device?.ownerType === 'instance'\n },\n isOwnedByAnApplication () {\n return this.device?.ownerType === 'application'\n },\n isUnassigned () {\n return this.device?.ownerType === ''\n }\n },\n watch: {\n team: 'fetchData',\n device: 'fetchData',\n showDeviceSnapshotsOnly: 'fetchData',\n reloadHooks: {\n handler: 'fetchData',\n deep: true\n }\n },\n mounted () {\n this.fetchData()\n },\n methods: {\n ...mapActions('ux/drawers', ['openRightDrawer', 'closeRightDrawer']),\n fetchData: async function () {\n if (!this.features.deviceEditor || this.isOwnedByAnInstance || this.isUnassigned) {\n return\n }\n if (this.device.id && this.device.application) {\n this.loading = true\n const ssFilter = {\n deviceId: this.showDeviceSnapshotsOnly ? this.device.id : null\n }\n const data = await ApplicationApi.getSnapshots(this.device.application.id, null, null, ssFilter) // TODO Move devices snapshots?\n\n this.snapshots = data.snapshots.map(snapshot => {\n const ownerKey = this.getSortKeyForSnapshotSource(snapshot)\n return {\n ...snapshot,\n ...(ownerKey ? { _ownerSortKey: ownerKey } : { _ownerSortKey: undefined })\n }\n })\n this.snapshots = applySystemUserDetails(data.snapshots)\n this.loading = false\n }\n },\n getSortKeyForSnapshotSource (snapshot) {\n if (snapshot.ownerType === 'device') {\n return 'Device:' + snapshot.device?.name || 'No Name'\n }\n\n if (snapshot.ownerType === 'instance') {\n return 'Instance:' + snapshot.instance?.name || 'No Name'\n }\n\n return 'Unassigned'\n },\n // enable/disable snapshot actions\n canDeploy (_row) {\n return (!this.developerMode || this.supportsDevModeSnapshotRestore()) && this.hasPermission('device:edit', { application: this.device.application })\n },\n canDeployReason (snapshot) {\n if (!this.hasPermission('device:edit', { application: this.device.application })) {\n return 'You do not have permission to deploy snapshots to this Remote Instance'\n }\n if (this.developerMode && !this.supportsDevModeSnapshotRestore()) {\n return 'Snapshots deploys to Developer Mode Remote Instances requires Device Agent v3.8.0 or later'\n }\n return ''\n },\n supportsDevModeSnapshotRestore () {\n return this.device.agentVersion && SemVer.gte(this.device.agentVersion, '3.8.0')\n },\n onRowSelected (snapshot) {\n this.openRightDrawer({\n component: markRaw(SnapshotDetailsDrawer),\n props: {\n snapshot,\n snapshotList: this.snapshotList,\n instance: this.device,\n canSetDeviceTarget: false,\n canRestore: this.canDeploy(snapshot),\n canRestoreReason: this.canDeployReason(snapshot),\n isDevice: true,\n isDeviceDevMode: this.developerMode\n },\n on: {\n updatedSnapshot: () => this.fetchData(true),\n restoredSnapshot: () => {\n setTimeout(() => {\n this.$emit('device-updated')\n }, 100)\n this.fetchData(true)\n },\n deletedSnapshot: () => {\n this.closeRightDrawer()\n this.fetchData(true)\n }\n },\n overlay: true,\n wider: true\n })\n }\n }\n}\n</script>\n\n<style>\n\ntbody .ff-data-table--row > .ff-data-table--cell > .deploy-this-snapshot-button {\n display: none;\n}\n\ntbody tr.ff-data-table--row:hover .ff-data-table--cell .deploy-this-snapshot-button {\n display: flex;\n}\n\n</style>\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.graph {\n min-width: 64px;\n padding: 15px;\n position: relative;\n overflow: hidden;\n\n .icon-wrapper {\n min-width: 34px;\n min-height: 35px;\n border: 2px solid $ff-blue-800;\n border-radius: 50%;\n padding: 5px;\n background: #fff;\n position: relative;\n z-index: 10;\n color: $ff-blue-800;\n }\n\n .connector {\n border: 1px solid $ff-blue-800;\n position: absolute;\n left: 47%; // compensates for border width\n z-index: 5;\n\n &.top {\n top: -230px;\n height: 250px;\n\n &.snapshot {\n transform: rotate(45deg);\n top: -25%;\n left: 80%;\n height: 50px;\n border-style: dashed;\n border-color: $ff-grey-500;\n }\n }\n\n &.bottom {\n bottom: -200px;\n height: 230px;\n &.snapshot {\n transform: rotate(-45deg);\n top: 50%;\n left: 83%;\n height: 50px;\n border-style: dashed;\n border-color: $ff-grey-500;\n }\n }\n\n &.through {\n bottom: -100px;\n height: 230px;\n left: 30px;\n }\n }\n\n &.is-snapshot {\n padding-left: 45px;\n min-width: 94px;\n\n .connector {\n &.top, &.bottom {\n left: 65%;\n border-color: $ff-grey-500;\n border-style: dashed;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.event {\n\n .body {\n padding: 15px 0;\n overflow: hidden;\n\n .content {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .title {\n overflow: hidden;\n text-overflow: ellipsis;\n\n i {\n opacity: .5;\n }\n\n a {\n color: $ff-blue-600;\n }\n }\n\n .details {\n font-size: 70%;\n opacity: 0.8;\n }\n }\n\n .username {\n color: $ff-grey-600;\n }\n }\n\n .actions {\n padding: 15px 10px;\n min-width: 40px;\n }\n\n &.is-snapshot {\n background: $ff-grey-100;\n color: $ff-grey-500;\n }\n\n &.load-more {\n background: $ff-grey-200;\n color: $ff-blue-500;\n cursor: pointer;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#visual-timeline {\n .timeline {\n border: 1px solid $ff-grey-300;\n border-radius: 3px;\n overflow: auto;\n li:last-child {\n .connector.bottom {\n display: none;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.installation-method-selector {\n display: flex;\n gap: 50px;\n margin-bottom: 15px;\n position: relative;\n\n .ff-method-option {\n flex: 1;\n text-align: center;\n border-bottom: 2px solid $ff-color--border;\n padding-bottom: 5px;\n cursor: pointer;\n transition: ease-in-out .3s;\n\n &.active {\n border-color: $ff-indigo-500;\n }\n\n &:first-of-type:after {\n content: 'or';\n position: absolute;\n top: 5%;\n left: 49%;\n font-style: italic;\n font-size: $ff-funit-sm;\n color: $ff-grey-500;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.os-selector {\n .os-item {\n transition: ease-in-out .3s;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#assign-device-dialog {\n .ff-tile-selection {\n margin-top: 1rem;\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 1rem;\n }\n .ff-tile-selection-option {\n width: auto;\n margin: 0;\n }\n}\n","<template>\n <main v-if=\"device\" class=\"ff-with-status-header flex-1 flex flex-col overflow-auto\">\n <Teleport v-if=\"mounted\" to=\"#platform-banner\">\n <SubscriptionExpiredBanner :team=\"team\" />\n <TeamTrialBanner v-if=\"team.billing?.trial\" :team=\"team\" />\n </Teleport>\n <SectionNavigationHeader :tabs=\"navigation\">\n <template #breadcrumbs>\n <ff-nav-breadcrumb :to=\"{name: 'TeamDevices', params: {team_slug: team.slug}}\">Remote Instances</ff-nav-breadcrumb>\n <ff-nav-breadcrumb>{{ device.name }}</ff-nav-breadcrumb>\n </template>\n <template #status>\n <div class=\"flex flex-wrap gap-2\">\n <DeviceLastSeenBadge :last-seen-at=\"device.lastSeenAt\" :last-seen-ms=\"device.lastSeenMs\" :last-seen-since=\"device.lastSeenSince\" />\n <StatusBadge :status=\"device.status\" :instanceId=\"device.id\" instanceType=\"device\" />\n <DeviceModeBadge v-if=\"isDevModeAvailable \" :mode=\"device.mode\" />\n </div>\n </template>\n <template #context>\n <div v-if=\"device?.ownerType === 'application' && device.application\" data-el=\"device-assigned-application\">\n Application:\n <ff-team-link :to=\"{name: 'Application', params: {id: device.application?.id}}\" class=\"text-blue-600 cursor-pointer hover:text-blue-700 hover:underline\">{{ device.application?.name }}</ff-team-link>\n </div>\n <div v-else-if=\"device?.ownerType === 'instance' && device.instance\" data-el=\"device-assigned-instance\">\n Instance:\n <ff-team-link :to=\"{name: 'Instance', params: {id: device.instance.id}}\" class=\"text-blue-600 cursor-pointer hover:text-blue-700 hover:underline\">{{ device.instance.name }}</ff-team-link>\n </div>\n <div v-else data-el=\"device-assigned-none\">\n <span class=\"italic\">No Application or Instance Assigned</span> - <a class=\"ff-link\" data-action=\"assign-device\" @click=\"openAssignmentDialog\">Assign</a>\n </div>\n </template>\n <template #tools>\n <!--\n div style 34px is a workaround to prevent the Device Editor button growing taller than adjacent\n button (size difference is caused by odd padding in the toggle button, which though not visible\n is still there and affects the button height in this div group)\n -->\n <div class=\"flex gap-2 align-center\" style=\"height: 34px;\">\n <template v-if=\"isDevModeAvailable\">\n <template v-if=\"neverConnected\">\n <FinishSetupButton\n v-if=\"hasPermission('device:create', {application: device.application})\"\n :is-primary=\"neverConnected\"\n :device=\"device\"\n />\n </template>\n <template v-else>\n <DeveloperModeToggle\n data-el=\"device-devmode-toggle\"\n :device=\"device\"\n :disabled=\"disableModeToggle\"\n :disabledReason=\"disableModeToggleReason\"\n @mode-change=\"setDeviceMode\"\n />\n <device-editor-link\n :device=\"device\"\n :title=\"!editorAvailable ? 'You can edit flows directly when Developer Mode is enabled, and your Edge Instance is connected.' : 'Open Edge Instance Editor'\"\n :disabled=\"!editorAvailable\"\n :primary=\"editorAvailable\"\n data-action=\"open-editor\"\n @open-immersive-editor=\"openTunnel({launchEditor: true, event: $event, immersive: true})\"\n @open-editor=\"openTunnel({launchEditor: true, event: $event, immersive: false})\"\n />\n </template>\n </template>\n <DropdownMenu\n v-if=\"hasPermission('device:change-status', permissionContext) && actionsDropdownOptions.length\"\n data-el=\"device-actions-dropdown\"\n :buttonClass=\"`ff-btn ff-btn-icon ${ actionsButtonKind }`\"\n :options=\"actionsDropdownOptions\"\n >\n <CogIcon class=\"ff-btn--icon ff-btn--icon-left\" />\n Actions\n </DropdownMenu>\n </div>\n </template>\n </SectionNavigationHeader>\n <div class=\"mt-4 sm:mt-8 flex-1 flex flex-col overflow-auto\">\n <Teleport v-if=\"mounted && isVisitingAdmin\" to=\"#platform-banner\">\n <div class=\"ff-banner\" data-el=\"banner-device-as-admin\">You are viewing this device as an Administrator</div>\n </Teleport>\n <div class=\"px-3 pb-3 md:px-6 md:pb-6 flex-1 flex flex-col overflow-auto\">\n <router-view :instance=\"device.instance\" :closingTunnel=\"closingTunnel\" :openingTunnel=\"openingTunnel\" :device=\"device\" @device-updated=\"loadDevice\" @close-tunnel=\"closeTunnel\" @open-tunnel=\"openTunnel\" @device-refresh=\"deviceRefresh\" @assign-device=\"openAssignmentDialog\" />\n </div>\n </div>\n <!-- Dialogs -->\n <!-- device tunnel connecting -->\n <ff-dialog ref=\"dialog\" data-el=\"establish-device-tunnel-dialog\" header=\"Preparing the connection...\">\n <template #default>\n <div class=\"flex flex-col ml-6 mr-6\">\n <div class=\"mb-4\">\n <p>Connecting to the device</p>\n </div>\n <div class=\"flex justify-between items-center\">\n <div class=\"flex text-center\">\n <img class=\"h-16 w-16\" src=\"../../images/pictograms/cloud_teal.png\">\n </div>\n <div class=\"flex-grow m-4\">\n <div class=\"w-full\">\n <div class=\"h-1 w-full bg-teal-200 overflow-hidden\">\n <div kind=\"secondary\" class=\"progress w-full h-full bg-teal-800 left-right\" />\n </div>\n </div>\n </div>\n <div class=\"flex text-center\">\n <img class=\"h-16 w-16\" src=\"../../images/pictograms/devices_red.png\">\n </div>\n </div>\n </div>\n </template>\n <template #actions>\n <ff-button data-action=\"tunnel-connect-cancel\" kind=\"secondary\" class=\"ml-4\" @click=\"closeTunnel()\">Cancel</ff-button>\n </template>\n </ff-dialog>\n <AssignDeviceDialog\n v-if=\"notAssigned\"\n ref=\"assignment-dialog\"\n data-el=\"assignment-dialog\"\n @assign-option-selected=\"assignOptionSelected\"\n />\n <DeviceAssignInstanceDialog\n v-if=\"notAssigned\"\n ref=\"deviceAssignInstanceDialog\"\n data-el=\"assignment-dialog-instance\"\n @assign-device=\"assignDeviceToInstance\"\n />\n <DeviceAssignApplicationDialog\n v-if=\"notAssigned\"\n ref=\"deviceAssignApplicationDialog\"\n data-el=\"assignment-dialog-application\"\n @assign-device=\"assignDeviceToApplication\"\n />\n </main>\n</template>\n\n<script>\n\nimport { CogIcon } from '@heroicons/vue/solid/index.js'\nimport semver from 'semver'\nimport { mapState } from 'vuex'\n\nimport deviceApi from '../../api/devices.js'\nimport DropdownMenu from '../../components/DropdownMenu.vue'\nimport FinishSetupButton from '../../components/FinishSetup.vue'\nimport SectionNavigationHeader from '../../components/SectionNavigationHeader.vue'\nimport StatusBadge from '../../components/StatusBadge.vue'\nimport SubscriptionExpiredBanner from '../../components/banners/SubscriptionExpired.vue'\nimport TeamTrialBanner from '../../components/banners/TeamTrial.vue'\nimport { useNavigationHelper } from '../../composables/NavigationHelper.js'\nimport usePermissions from '../../composables/Permissions.js'\nimport deviceActionsMixin from '../../mixins/DeviceActions.js'\n\nimport Alerts from '../../services/alerts.js'\nimport Dialog from '../../services/dialog.js'\nimport { DeviceStateMutator } from '../../utils/DeviceStateMutator.js'\nimport { createPollTimer } from '../../utils/timers.js'\n\nimport DeviceAssignApplicationDialog from '../team/Devices/dialogs/DeviceAssignApplicationDialog.vue'\nimport DeviceAssignInstanceDialog from '../team/Devices/dialogs/DeviceAssignInstanceDialog.vue'\n\nimport AssignDeviceDialog from './components/AssignDeviceDialog.vue'\n\nimport DeveloperModeToggle from './components/DeveloperModeToggle.vue'\nimport DeviceEditorLink from './components/DeviceEditorLink.vue'\nimport DeviceLastSeenBadge from './components/DeviceLastSeenBadge.vue'\nimport DeviceModeBadge from './components/DeviceModeBadge.vue'\n\n// constants\nconst POLL_TIME = 5000\n\nconst deviceTransitionStates = [\n 'loading',\n 'installing',\n 'starting',\n 'stopping',\n 'restarting',\n 'suspending',\n 'importing'\n]\n\nexport default {\n name: 'DevicePage',\n components: {\n CogIcon,\n DeviceEditorLink,\n FinishSetupButton,\n DeveloperModeToggle,\n DeviceModeBadge,\n DeviceLastSeenBadge,\n DropdownMenu,\n SectionNavigationHeader,\n StatusBadge,\n SubscriptionExpiredBanner,\n TeamTrialBanner,\n AssignDeviceDialog,\n DeviceAssignApplicationDialog,\n DeviceAssignInstanceDialog\n },\n mixins: [deviceActionsMixin],\n setup () {\n const { hasPermission, isVisitingAdmin } = usePermissions()\n const { navigateTo, openInANewTab } = useNavigationHelper()\n\n return { hasPermission, isVisitingAdmin, navigateTo, openInANewTab }\n },\n data: function () {\n return {\n mounted: false,\n device: null,\n agentSupportsDeviceAccess: false,\n agentSupportsActions: false,\n openingTunnel: false,\n closingTunnel: false,\n /** @type {import('../../utils/timers.js').PollTimer} */\n pollTimer: null,\n /** @type {DeviceStateMutator} */\n deviceStateMutator: null\n }\n },\n computed: {\n ...mapState('account', ['teamMembership', 'team', 'features', 'settings']),\n actionsButtonKind () {\n switch (true) {\n case this.neverConnected:\n return 'ff-btn--secondary'\n case this.editorAvailable:\n return 'ff-btn--secondary'\n default:\n return 'ff-btn--primary'\n }\n },\n permissionContext () {\n if (this.device?.ownerType === 'application' || this.device?.ownerType === 'instance') {\n return { application: this.device.application }\n }\n return {}\n },\n isDevModeAvailable: function () {\n return !!this.features.deviceEditor\n },\n developerMode: function () {\n return this.device && this.agentSupportsDeviceAccess && this.device.mode === 'developer'\n },\n deviceRunning () {\n return this.device?.status === 'running'\n },\n disableModeToggle: function () {\n return !this.isDevModeAvailable ||\n !this.device ||\n !this.agentSupportsDeviceAccess ||\n !this.hasPermission('device:editor', this.permissionContext)\n },\n disableModeToggleReason: function () {\n if (!this.device) {\n return 'No Device selected'\n }\n if (!this.agentSupportsDeviceAccess) {\n return 'Device Agent V0.8 or greater is required'\n }\n if (!this.hasPermission('device:editor', this.permissionContext)) {\n return 'Only an Owner or Member can change the Device Mode'\n }\n return undefined\n },\n editorAvailable: function () {\n return this.isDevModeAvailable &&\n this.device &&\n this.agentSupportsDeviceAccess &&\n this.developerMode &&\n this.device.status === 'running'\n },\n deviceEditorURL: function () {\n return this.device.editor?.url || ''\n },\n neverConnected () {\n return !this.device.lastSeenAt\n },\n notAssigned () {\n const device = this.device\n const hasApplication = device?.ownerType === 'application' && device.application\n const hasInstance = device?.ownerType === 'instance' && device.instance\n return !hasApplication && !hasInstance\n },\n navigation () {\n return [\n {\n label: 'Overview',\n to: { name: 'device-overview' },\n tag: 'device-overview'\n },\n {\n label: 'Version History',\n to: {\n name: 'device-version-history',\n params: { id: this.$route.params.id }\n },\n tag: 'version-history'\n },\n {\n label: 'Audit Log',\n to: { name: 'device-audit-log' },\n tag: 'device-audit-log'\n },\n {\n label: 'Node-RED Logs',\n to: { name: 'device-logs' },\n tag: 'device-logs'\n // icon: TerminalIcon\n },\n {\n label: 'Performance',\n to: { name: 'device-performance' },\n tag: 'device-performance'\n },\n {\n label: 'Settings',\n to: { name: 'device-settings' },\n tag: 'device-settings'\n },\n {\n label: 'Developer Mode',\n to: { name: 'device-developer-mode' },\n tag: 'device-devmode',\n hidden: !(this.isDevModeAvailable && this.device.mode === 'developer')\n }\n ]\n },\n actionsDropdownOptions () {\n const flowActionsDisabled = !(this.device.status !== 'suspended')\n\n const deviceStateChanging = this.device.pendingStateChange || this.device.optimisticStateChange\n\n const result = [\n // Start and Suspend are disabled until resolution of the feature is complete\n // See comments in #3292\n // {\n // name: 'Start',\n // action: this.startDevice,\n // disabled: deviceStateChanging || this.deviceRunning\n // },\n // { name: 'Suspend', class: ['text-red-700'], action: this.showConfirmSuspendDialog, disabled: deviceStateChanging || flowActionsDisabled }\n ]\n\n if (!this.neverConnected) {\n // if we've never connected, we know we can't restart\n result.push({ name: 'Restart', action: this.restartDevice, disabled: deviceStateChanging || flowActionsDisabled })\n }\n\n if (this.hasPermission('device:delete', this.permissionContext)) {\n result.push(null)\n result.push({ name: 'Delete', class: ['text-red-700'], action: this.showConfirmDeleteDialog })\n }\n\n return result\n }\n },\n watch: {\n device: 'deviceChanged'\n },\n async mounted () {\n this.mounted = true\n await this.loadDevice()\n },\n unmounted () {\n this.pollTimer?.stop()\n clearTimeout(this.openTunnelTimeout)\n },\n methods: {\n pollTimerElapsed: async function () {\n // Only refresh device via the timer if we are on the overview page, developer mode page\n // the device status is empty or the device is in a transition state\n // This is to prevent settings pages from refreshing the device state while modifying settings\n // See `watch: { device: { handler () ... in pages/device/Settings/General.vue for why that happens\n const settingsPages = ['device-overview', 'device-developer-mode']\n try {\n if (settingsPages.includes(this.$route.name)) {\n await this.loadDevice()\n } else if (typeof this.device?.status === 'undefined') {\n await this.loadDevice()\n } else if (deviceTransitionStates.includes(this.device?.status)) {\n await this.loadDevice()\n }\n } catch (err) {\n if (err.response.status === 404) {\n this.pollTimer?.stop()\n }\n }\n },\n loadDevice: async function () {\n try {\n this.device = await deviceApi.getDevice(this.$route.params.id)\n } catch (err) {\n if (err.status === 403) {\n this.pollTimer?.stop()\n clearTimeout(this.openTunnelTimeout)\n return this.$router.push({ name: 'Home' })\n }\n }\n if (!this.pollTimer) {\n this.pollTimer = createPollTimer(this.pollTimerElapsed, POLL_TIME)\n }\n\n if (this.deviceStateMutator) {\n this.deviceStateMutator.clearState()\n }\n this.agentSupportsDeviceAccess = this.device.agentVersion && semver.gte(this.device.agentVersion, '0.8.0')\n this.agentSupportsActions = this.device.agentVersion && semver.gte(this.device.agentVersion, '2.3.0')\n this.$store.dispatch('account/setTeam', this.device.team.slug)\n },\n deviceRefresh: async function () {\n if (this.pollTimer.running) {\n // If the poll timer is running, we don't need to manually refresh the device\n return\n }\n this.loadDevice()\n },\n showOpenEditorDialog: async function () {\n this.$refs['open-editor-dialog'].show()\n },\n setDeviceMode: async function (newMode, callback) {\n try {\n if (newMode !== 'autonomous' && newMode !== 'developer') {\n throw new Error('Unsupported mode')\n }\n // call to close tunnel regardless of selected mode being set\n const disableResult = await deviceApi.disableEditorTunnel(this.device.id)\n // set the selected mode\n const setModeResult = await deviceApi.setMode(this.device.id, newMode)\n // update the device properties to reflect immediate status\n this.device.editor = {\n enabled: !!disableResult?.editor?.enabled,\n connected: !!disableResult?.editor?.connected,\n url: disableResult?.editor?.url\n }\n this.device.mode = setModeResult?.mode\n callback(null, setModeResult)\n } catch (error) {\n if (callback) {\n callback(error)\n } else {\n throw new Error('Unknown mode')\n }\n }\n },\n openAssignmentDialog () {\n this.$refs['assignment-dialog'].show()\n },\n assignOptionSelected (option) {\n if (option === 'instance') {\n this.$refs.deviceAssignInstanceDialog.show(this.device)\n } else if (option === 'application') {\n this.$refs.deviceAssignApplicationDialog.show(this.device)\n }\n },\n async assignDeviceToInstance (device, instanceId) {\n this.device = await deviceApi.updateDevice(device.id, { instance: instanceId })\n\n Alerts.emit('Device successfully assigned to instance.', 'confirmation')\n },\n\n async assignDeviceToApplication (device, applicationId) {\n this.device = await deviceApi.updateDevice(device.id, { application: applicationId, instance: null })\n\n Alerts.emit('Device successfully assigned to application.', 'confirmation')\n },\n openEditor ({ event = null, immersive = false } = {}) {\n this.$store.dispatch('ux/validateUserAction', 'hasOpenedDeviceEditor')\n if (!immersive) {\n this.openInANewTab(this.deviceEditorURL, `device-editor-${this.device.id}`)\n } else {\n this.navigateTo({ name: 'device-editor' }, event, { target: `device-editor-${this.device.id}` })\n }\n },\n async openTunnel ({\n event,\n immersive = true,\n launchEditor = false\n } = {}) {\n try {\n if (this.deviceRunning) {\n if (this.device.editor?.enabled && this.device.editor?.connected && this.device.editor?.local) {\n this.openEditor({ event, immersive })\n } else {\n this.openingTunnel = true\n this.$refs.dialog.show()\n\n // Polls the tunnel status until we see it connected to the\n // 'local' platform instance - will give up after 10 attempts\n const pollTunnelStatus = (done, attempt = 0, timeout = 500) => {\n if (attempt < 10) {\n this.openTunnelTimeout = setTimeout(async () => {\n await this.loadDevice()\n if (this.device.editor?.enabled && this.device.editor?.connected) {\n if (this.device.editor?.local) {\n if (launchEditor) {\n this.openEditor({ event, immersive })\n }\n } else {\n pollTunnelStatus(done, attempt + 1, 200)\n return\n }\n }\n done()\n }, timeout)\n }\n }\n\n try {\n if (!this.device.editor?.enabled || !this.device.editor?.connected) {\n // * Enable Device Editor (Step 1) - (browser->frontendApi) User clicks button to \"Enable Editor\"\n const result = await deviceApi.enableEditorTunnel(this.device.id)\n this.updateTunnelStatus(result)\n }\n pollTunnelStatus(() => {\n this.$refs.dialog.close()\n this.openingTunnel = false\n })\n } catch (err) {\n this.$refs.dialog?.close()\n this.openingTunnel = false\n\n const enhancedError = new Error(`Failed to enable device editor tunnel: ${err.message}`)\n enhancedError.originalError = err\n enhancedError.deviceId = this.device?.id\n enhancedError.deviceStatus = this.device?.status\n enhancedError.context = 'openTunnel'\n\n throw enhancedError\n }\n }\n } else {\n Alerts.emit('Unable to establish a connection to the device. Please check it is connected and running then try again', 'warning', 7500)\n }\n } catch (err) {\n console.warn('Error in openTunnel', err)\n if (Object.hasOwnProperty.call(err, 'context') && err.context === 'openTunnel') {\n throw err\n }\n }\n },\n async closeTunnel () {\n this.closingTunnel = true\n this.$refs.dialog.close()\n clearTimeout(this.openTunnelTimeout)\n try {\n const result = await deviceApi.disableEditorTunnel(this.device.id)\n this.updateTunnelStatus(result)\n this.loadDevice(this.loadDevice())\n } finally {\n this.closingTunnel = false\n }\n },\n updateTunnelStatus (status) {\n this.device.editor = this.device.editor || {}\n this.device.editor.url = status.url\n this.device.editor.enabled = !!status.enabled\n this.device.editor.connected = !!status.connected\n },\n deviceChanged () {\n this.deviceStateMutator = new DeviceStateMutator(this.device)\n },\n showConfirmDeleteDialog () {\n Dialog.show({\n header: 'Delete Device',\n kind: 'danger',\n text: 'Are you sure you want to delete this device? Once deleted, there is no going back.',\n confirmLabel: 'Delete'\n }, async () => {\n try {\n await deviceApi.deleteDevice(this.device.id)\n Alerts.emit('Successfully deleted the device', 'confirmation')\n // Trigger a refresh of team info to resync following device changes\n await this.$store.dispatch('account/refreshTeam')\n this.$router.push({ name: 'TeamDevices', params: { team_slug: this.team.slug } })\n } catch (err) {\n Alerts.emit('Failed to delete device: ' + err.toString(), 'warning', 7500)\n }\n })\n },\n /**\n * Checks agent version and shows warning if known old version is present. Returns true if the action can proceed\n * @param {string} [message] - optional message to show in confirmation dialog. If omitted, no confirmation is shown\n */\n preActionChecks (message) {\n if (this.device.agentVersion && !this.agentSupportsActions) {\n // if agent version is present but is less than required version, show warning and halt\n Alerts.emit('Device Agent V2.3 or greater is required to perform this action.', 'warning')\n return false\n }\n if (!message) {\n // no message means silent operation, no need to show confirmation\n return true\n }\n if (!this.device.agentVersion) {\n // if agent version is missing, be optimistic and give it a go, but show warning\n Alerts.emit(`${message}. NOTE: The device agent version is not known, the action may timeout`, 'warning')\n } else {\n Alerts.emit(message, 'confirmation')\n }\n return true\n },\n async startDevice () {\n const preCheckOk = this.preActionChecks('Starting device...')\n if (!preCheckOk) {\n return\n }\n this.deviceStateMutator.setStateOptimistically('starting')\n try {\n await deviceApi.startDevice(this.device)\n this.deviceStateMutator.setStateAsPendingFromServer()\n } catch (err) {\n let message = 'Device start request failed.'\n if (err.response?.data?.error) {\n message = err.response.data.error\n }\n console.warn(message, err)\n Alerts.emit(message, 'warning')\n this.deviceStateMutator.restoreState()\n }\n },\n async restartDevice () {\n const preCheckOk = this.preActionChecks('Restarting device...')\n if (!preCheckOk) {\n return\n }\n this.deviceStateMutator.setStateOptimistically('restarting')\n try {\n await deviceApi.restartDevice(this.device)\n this.deviceStateMutator.setStateAsPendingFromServer()\n } catch (err) {\n let message = 'Device restart request failed.'\n if (err.response?.data?.error) {\n message = err.response.data.error\n }\n console.warn(message, err)\n Alerts.emit(message, 'warning')\n }\n },\n showConfirmSuspendDialog () {\n const preCheckOk = this.preActionChecks() // silent check\n if (!preCheckOk) {\n return\n }\n Dialog.show({\n header: 'Suspend Device',\n text: 'Are you sure you want to suspend this device?',\n confirmLabel: 'Suspend',\n kind: 'danger'\n }, () => {\n this.deviceStateMutator.setStateOptimistically('suspending')\n deviceApi.suspendDevice(this.device).then(() => {\n this.deviceStateMutator.setStateAsPendingFromServer()\n Alerts.emit('Device suspend request succeeded.', 'confirmation')\n }).catch(err => {\n let message = 'Device suspend request failed.'\n if (err.response?.data?.error) {\n message = err.response.data.error\n }\n console.warn(message, err)\n Alerts.emit(message, 'warning')\n })\n })\n }\n }\n}\n</script>\n\n<style scoped>\n.progress {\n animation: progress 1s infinite linear;\n}\n\n.left-right {\n transform-origin: 0% 50%;\n}\n @keyframes progress {\n 0% {\n transform: translateX(0) scaleX(0);\n }\n 40% {\n transform: translateX(0) scaleX(0.4);\n }\n 100% {\n transform: translateX(100%) scaleX(0.5);\n }\n}\n</style>\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.resize-bar {\n position: absolute;\n right: 0;\n top: 0;\n width: 6px;\n height: 100%;\n border-right: 1px solid $ff-grey-400;\n background: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 15;\n\n &::before {\n content: '...';\n position: relative;\n left: 3px;\n writing-mode: vertical-rl;\n line-height: 0.5;\n letter-spacing: 4px;\n color: $ff-grey-500;\n }\n\n &:hover {\n cursor: ew-resize;\n\n &::before {\n color: $ff-grey-700;\n }\n }\n\n &.horizontal {\n width: 100%;\n height: 6px;\n\n &::before {\n writing-mode: horizontal-tb;\n }\n\n &:hover {\n cursor: ns-resize;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.drawer-trigger {\n display: flex;\n align-items: center;\n gap: 1px;\n position: fixed;\n top: 10px;\n left: 0;\n z-index: 100;\n padding: 8px 2px 8px 8px;\n\n /* Colors - matching original drawer trigger */\n color: $ff-grey-400;\n background: $ff-white;\n border: 1px solid $ff-grey-400;\n border-left: none;\n\n /* Reset button styles */\n font: inherit;\n\n /* Visual effects */\n box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.10);\n border-radius: 0 10px 10px 0;\n\n /* Animation */\n transform: translateX(0);\n transition: transform ease-in-out 0.3s;\n\n img {\n height: 20px;\n }\n\n .ff-btn--icon {\n color: $ff-grey-400;\n width: 20px;\n height: 20px;\n }\n\n &.hidden {\n // Move completely off-screen: own width (100%) + extra margin (20px)\n transform: translateX(calc(-100% - 20px));\n }\n\n &:hover {\n cursor: pointer;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.status-wrapper {\n display: flex;\n justify-content: center;\n}\n.status-wrapper .status-text {\n font-size: 1.5rem;\n font-weight: bold;\n display: block;\n text-align: center;\n padding: 24px;\n text-transform: capitalize;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff--immersive-editor-wrapper {\n &.remote-instance {\n .device-actions-dropdown {\n padding: 6px 9px;\n\n svg {\n margin: 0;\n }\n }\n }\n}\n",".ff-blueprint-groups {\n h4 {\n border-bottom: 1px solid $ff-grey-200;\n }\n}\n\n.ff-blueprint-tile {\n border: 2px solid $ff-grey-300;\n border-radius: $ff-unit-sm;\n display: flex;\n flex-direction: column;\n --tile-background: #{$ff-blue-100};\n --tile-foreground: #{$ff-blue-300};\n}\n\n.ff-blueprint-tile-sm {\n display: inline-flex;\n flex-direction: row;\n border: 1px solid $ff-grey-300;\n border-radius: $ff-unit-sm;\n --tile-background: #{$ff-blue-100};\n --tile-foreground: #{$ff-blue-300};\n}\n\n.ff-blueprint-tile--header {\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--tile-background);\n border-top-left-radius: 6px;\n border-top-right-radius: 6px;\n svg {\n stroke: var(--tile-foreground);\n path {\n stroke-width: 1px;\n }\n }\n}\n\n.ff-blueprint-tile .ff-blueprint-tile--header {\n overflow-y: hidden;\n svg {\n transform: scale(4);\n }\n}\n\n.ff-blueprint-tile-sm .ff-blueprint-tile--header {\n width: 32px;\n border-radius: 0px;\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n svg {\n transform: scale(1.5);\n }\n}\n\n.ff-blueprint-tile--info {\n padding: $ff-unit-md $ff-unit-xl $ff-unit-md $ff-unit-md;\n label {\n font-weight: 500;\n }\n}\n\n.ff-blueprint-tile .ff-blueprint-tile--info {\n padding: $ff-unit-md $ff-unit-sm;\n display: flex;\n flex-direction: column;\n gap: $ff-unit-sm;\n flex-grow: 1;\n label {\n font-size: 1.2rem;\n font-weight: 600;\n }\n}\n\n.ff-blueprint-tile--actions {\n width: 100%;\n display: flex;\n gap: 5px;\n padding: 0 $ff-unit-sm $ff-unit-md;\n align-items: center;\n}\n\n.ff-blueprint-group--general {\n --tile-background: #{$ff-blue-100};\n --tile-foreground: #{$ff-blue-300};\n}\n\n.ff-blueprint-group--manufacturing {\n --tile-background: #{$ff-teal-100};\n --tile-foreground: #{$ff-teal-400};\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n@import '../../../stylesheets/components/blueprint-selection.scss';\n.blueprint-group {\n display: flex;\n flex-wrap: wrap;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.blueprints-selector-dialog {\n margin: 0 !important;\n display: block;\n\n .ff-dialog-box {\n max-width: 90vw;\n max-height: 80vh;\n overflow: auto;\n\n .ff-dialog-content {\n display: flex;\n flex-direction: row;\n padding: 0;\n overflow: auto;\n\n .blueprints-container {\n padding: 10px 10px 0;\n overflow: auto;\n\n .header {\n padding: 0 0 10px;\n\n h3 {\n font-size: 30px;\n }\n\n p {\n line-height: 20px;\n padding-top: 10px;\n color : $ff-grey-500;\n }\n }\n\n .blueprint-selection-wrapper {\n overflow: auto;\n padding: 10px 0;\n }\n\n .ff-blueprint-groups {\n h4 {\n font-size: 25px;\n line-height: 1.5;\n margin-top: 10px;\n }\n\n .blueprint-group {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n\n .ff-blueprint-tile {\n width: auto;\n max-width: 250px;\n flex: 1 1 200px;\n }\n }\n }\n }\n\n .flow-viewer-container {\n overflow: hidden;\n\n .viewer {\n height: 100%;\n width: 100%;\n }\n }\n\n }\n\n .ff-dialog-actions {\n border-top: 1px solid $ff-grey-400;\n }\n }\n}\n\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.instance-name-confirmation {\n margin: 5px 0;\n display: flex;\n gap: 5px;\n color: $ff-green-600;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-date-picker {\n &.disabled {\n input {\n cursor: not-allowed !important;\n }\n }\n\n .dp__action_button {\n &.dp__action_select {\n background: $ff-indigo-700;\n\n &[disabled] {\n background: $ff-grey-300;\n }\n }\n }\n}\n\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.maintenance {\n .scheduled-upgrade {\n .days-selector {\n .day-selector {\n border: 1px solid $ff-indigo-200;\n background: $ff-indigo-50;\n padding: 5px 15px;\n border-radius: 4px;\n cursor: pointer;\n transition: ease-in-out .3s;\n flex: 1;\n position: relative;\n text-align: center;\n\n &:hover {\n background: $ff-indigo-200;\n }\n\n &.selected {\n background: $ff-indigo-400;\n color: white;\n\n span {\n font-weight: 600;\n }\n }\n\n &.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.page-fade-enter-active, .page-fade-leave-active {\n transition: opacity .2s ease-in-out;\n}\n\n.page-fade-enter, .page-fade-leave-to {\n opacity: 0;\n}\n\n// Viewport-based responsive behavior (matches Tailwind sm: breakpoint)\n// Hide button text on narrow viewports (< 640px)\n@media (max-width: 639px) {\n .upload-snapshot-text,\n .create-snapshot-text {\n display: none;\n }\n}\n\n// Show button text on wider viewports (>= 640px)\n@media (min-width: 640px) {\n .upload-snapshot-text,\n .create-snapshot-text {\n display: inline;\n }\n}\n\n// Container query for drawer context - responsive button behavior\n// Breakpoint matches DRAWER_MOBILE_BREAKPOINT constant in Editor/index.vue\n// These override viewport-based rules when inside the drawer\n@container drawer (max-width: 639px) {\n // Hide text when drawer is narrow - icon-only mode\n .upload-snapshot-text,\n .create-snapshot-text {\n display: none;\n }\n}\n\n@container drawer (min-width: 640px) {\n // Show text when drawer is wide enough\n .upload-snapshot-text,\n .create-snapshot-text {\n display: inline;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#visual-timeline {\n .timeline {\n border: 1px solid $ff-grey-300;\n border-radius: 3px;\n overflow: auto;\n\n li {\n\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.flex-break {\n flex-basis: 100%;\n height: 0;\n}\n.ff-file-upload {\n width: 100%;\n display: flex;\n gap: $ff-unit-sm;\n .ff-btn {\n flex-shrink: 0;\n }\n}\n.ff-file-upload--empty,\n.ff-file-upload--file {\n flex-grow: 1;\n border: 1px solid $ff-grey-300;\n padding: $ff-unit-sm $ff-unit-md;\n border-radius: $ff-unit-sm;\n display: flex;\n align-items: center;\n gap: $ff-unit-sm;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow-x: hidden;\n}\n.ff-file-upload--empty {\n color: $ff-grey-400;\n}\n.ff-file-upload--clear {\n cursor: pointer;\n &:hover {\n color: $ff-blue-600;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-row-file {\n position: relative;\n &:hover {\n color: $ff-blue-600;\n }\n}\n\n.not-available {\n opacity: .4;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-dropdown.visibility-selector {\n min-width: 130px;\n\n .ff-button {\n padding-left: 0;\n padding-right: 0;\n border: none;\n background: none !important;\n }\n\n .ff-options {\n border: 1px solid $ff-grey-200 !important;\n\n .ff-option {\n background: white !important;\n border: none !important;\n\n &[disabled=\"true\"] {\n color: $ff-grey-600;\n cursor: not-allowed;\n }\n\n &:hover {\n background-color: $ff-grey-200 !important;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.banner-wrapper > div {\n margin-top: 0;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-dialog-content .ff-devices-ul {\n list-style-type: disc;\n list-style-position: inside;\n columns: 2;\n}\n.ff-dialog-content .ff-devices-ul li {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n// Viewport-based responsive behavior (matches Tailwind sm: breakpoint)\n// Hide button text on narrow viewports (< 640px)\n@media (max-width: 639px) {\n .target-snapshot-text,\n .add-remote-instance-text,\n .bulk-actions-text {\n display: none;\n }\n}\n\n// Show button text on wider viewports (>= 640px)\n@media (min-width: 640px) {\n .target-snapshot-text,\n .add-remote-instance-text,\n .bulk-actions-text {\n display: inline;\n }\n}\n\n// Container query for drawer context - responsive button behavior\n// Breakpoint matches DRAWER_MOBILE_BREAKPOINT constant in Editor/index.vue\n// These override viewport-based rules when inside the drawer\n@container drawer (max-width: 639px) {\n // Hide text when drawer is narrow - icon-only mode\n .target-snapshot-text,\n .add-remote-instance-text,\n .bulk-actions-text {\n display: none;\n }\n\n // Adjust button padding for icon-only mode to prevent excessive spacing\n .ff-btn[data-action=\"change-target-snapshot\"],\n .ff-btn[data-action=\"register-device\"] {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n }\n}\n\n@container drawer (min-width: 640px) {\n // Show text when drawer is wide enough\n .target-snapshot-text,\n .add-remote-instance-text,\n .bulk-actions-text {\n display: inline;\n }\n}\n\n// Status bars layout - responsive to both viewport and container\n.devices-status-bars-container {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n// On wider viewports (>= 640px), show side-by-side\n@media (min-width: 640px) {\n .devices-status-bars-container {\n flex-direction: row;\n\n > * {\n flex: 1;\n }\n }\n}\n\n// Container query for drawer context\n// Breakpoint matches DRAWER_MOBILE_BREAKPOINT constant in Editor/index.vue\n@container drawer (max-width: 639px) {\n .devices-status-bars-container {\n flex-direction: column;\n\n > * {\n flex: none;\n }\n }\n}\n\n@container drawer (min-width: 640px) {\n .devices-status-bars-container {\n flex-direction: row;\n\n > * {\n flex: 1;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.step-slider {\n width: 100%;\n\n .wrapper {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n position: relative;\n max-width: 600px;\n margin: auto;\n min-height: 50px;\n\n .progress {\n position: absolute;\n left: 0;\n top: 15px;\n height: 4px;\n background: $ff-grey-300;\n transform: translateY(-50%);\n z-index: 1;\n display: flex;\n justify-content: space-between;\n overflow: hidden;\n\n &.multi-step {\n width: 99%;\n }\n &.single-step {\n width: 0;\n }\n\n .st {\n position: relative;\n\n span {\n width: 1000px;\n height: 4px;\n background: $ff-indigo-600;\n z-index: 3;\n display: block;\n right: 0;\n position: absolute;\n transform: translateX(-1000%);\n transition: transform .3s ease-in-out;\n }\n\n &.completed {\n span {\n transform: translateX(0);\n }\n }\n }\n }\n\n .steps {\n width: 100%;\n position: absolute;\n left: 0;\n top: 5px;\n display: flex;\n\n .step {\n position: relative;\n width: 20px;\n height: 20px;\n background-color: $ff-grey-400;\n border-radius: 50%;\n z-index: 2;\n transition: ease-in-out .3s;\n\n &.completed {\n background-color: $ff-indigo-600;\n }\n\n &.active {\n transform: scale(1.1);\n background-color: $ff-indigo-600;\n\n .label {\n color: $ff-indigo-700;\n }\n }\n\n &.disabled {\n cursor: default;\n }\n\n .label {\n position: absolute;\n left: 50%;\n transform: translate(-50%, 150%);\n font-weight: bold;\n color: $ff-grey-300;\n transition: ease-in-out .3s;\n }\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-multi-step-form {\n position: relative;\n max-height: 100%;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left:0;\n width: 100%;\n height: 100%;\n background: rgba(255,255,255, .6);\n z-index: 100;\n }\n\n .content {\n flex: 1;\n max-height: 100%;\n display: flex;\n flex-direction: column;\n overflow: auto;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-select-application-step {\n .app-tile {\n padding: 12px;\n border: 2px solid $ff-grey-300;\n width: 100%;\n border-radius: 6px;\n cursor: pointer;\n transition: ease-in-out .3s;\n\n &:hover {\n border-color: $ff-indigo-400;\n }\n\n &.selected {\n border-color: $ff-indigo-600;\n }\n\n .header {\n .title {\n\n }\n\n .counters {\n color: $ff-grey-400;\n font-size: $ff-funit-xs;\n }\n }\n\n .description {\n color: $ff-grey-400;\n font-size: $ff-funit-sm;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-duplication-step {\n .form-group {\n .title {\n margin-bottom: 5px;\n padding-bottom: 5px;\n border-bottom: 1px solid $ff-grey-200;\n display: flex;\n justify-content: space-between;\n\n label {\n\n font-weight: 500;\n }\n\n .actions {\n display: flex;\n gap: 5px;\n }\n }\n\n p {\n margin-top: 5px;\n\n &:nth-of-type(2) {\n color: $ff-grey-500;\n font-style: italic;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-instance-step {\n form {\n .ff-instance-name {\n .ff-input-wrapper {\n button {\n padding: 5px 10px;\n }\n }\n }\n }\n}\n","<template>\n <div id=\"instance-logs\" class=\"flex-1 flex flex-col overflow-auto\">\n <ff-loading v-if=\"loading\" message=\"Loading Logs...\" />\n <div v-if=\"showOfflineBanner\" class=\"ff-banner ff-banner-info my-2 rounded p-2 font-mono\">\n <span>\n <span>The Node-RED instance cannot be reached at this time. Please wait...</span>\n </span>\n </div>\n <div v-if=\"!instance.meta || instance.meta.state === 'suspended'\" class=\"flex text-gray-500 justify-center italic mb-4 p-8\">\n Logs unavailable\n </div>\n <div v-else :class=\"showOfflineBanner ? 'forge-log-offline-background' : ''\" class=\"w-full mx-auto text-xs border bg-gray-800 text-gray-200 rounded p-2 font-mono\">\n <div v-if=\"prevCursor\" class=\"flex\">\n <a class=\"text-center w-full hover:text-blue-400 cursor-pointer pb-1\" @click=\"loadPrevious\">Load earlier...</a>\n </div>\n <div v-if=\"filteredLogEntries.length > 0\">\n <span\n v-for=\"(item, itemIdx) in filteredLogEntries\"\n :key=\"itemIdx\"\n class=\"whitespace-pre-wrap\"\n :class=\"'forge-log-entry-level-' + item.level\"\n data-el=\"instance-log-row\"\n >\n <template v-if=\"instance.ha?.replicas !== undefined\">\n [{{ item.src }}]\n </template>\n <span>{{ item.date }}</span>\n <span>{{ \" \" }}</span>\n <span>{{ `[${item.level || ''}]`.padEnd(10, ' ') }}</span>\n <span class=\"flex-grow break-all whitespace-pre-wrap inline-flex\">{{ item.msg }}</span>\n <br v-if=\"itemIdx !== filteredLogEntries.length - 1\">\n </span>\n </div>\n </div>\n </div>\n</template>\n\n<script>\n\nimport InstanceApi from '../../../api/instances.js'\nimport Alerts from '../../../services/alerts.js'\nimport { createPollTimer } from '../../../utils/timers.js'\n\nconst POLL_TIME = 5000\n\nexport default {\n name: 'LogsShared',\n inheritAttrs: false,\n props: {\n instance: {\n type: Object,\n required: true\n },\n filter: {\n default: null,\n type: String,\n required: false\n }\n },\n emits: ['ha-instance-detected', 'new-range'],\n data () {\n return {\n doneInitialLoad: false,\n loading: true,\n logEntries: [],\n prevCursor: null,\n nextCursor: null,\n checkInterval: null,\n showOfflineBanner: false,\n /** @type {import('../../../utils/timers.js').PollTimer} */\n pollTimer: null\n }\n },\n computed: {\n filteredLogEntries: function () {\n if (this.filter && this.filter !== 'all') {\n return this.logEntries.filter(l => l.src === this.filter)\n } else {\n return this.logEntries\n }\n }\n },\n watch: {\n instance: 'fetchData'\n },\n async mounted () {\n if (!this.instance.meta || this.instance.meta.state === 'suspended') {\n this.loading = false\n }\n await this.fetchData()\n // since the fetchdata is async, we need to check if the current page is\n // still the log page before starting the poll timer\n if (this.shouldPoll()) {\n this.pollTimer = createPollTimer(this.pollTimerElapsed, POLL_TIME)\n }\n },\n unmounted () {\n this.stopPolling()\n },\n beforeUnmount () {\n this.stopPolling()\n },\n methods: {\n clear: function () {\n this.logEntries = []\n },\n shouldPoll: function () {\n return Object.hasOwnProperty.call(this.$route, 'meta') &&\n Object.hasOwnProperty.call(this.$route.meta, 'shouldPoll') &&\n this.$route.meta.shouldPoll\n },\n pollTimerElapsed: function () {\n if (this.instance.meta && this.instance.meta.state !== 'suspended') {\n this.loadNext()\n }\n },\n stopPolling: function () {\n if (this.pollTimer) {\n this.pollTimer.stop()\n this.pollTimer = null\n }\n },\n fetchData: async function () {\n if (this.instance.id) {\n if (this.instance.meta && this.instance.meta.state !== 'suspended') {\n await this.loadItems(this.instance.id)\n this.loading = false\n } else {\n this.logEntries = []\n this.prevCursor = null\n }\n }\n },\n loadPrevious: async function () {\n this.loadItems(this.instance.id, this.prevCursor)\n },\n loadNext: async function () {\n this.loadItems(this.instance.id, this.nextCursor)\n },\n loadItems: async function (instanceId, cursor) {\n // don't poll if the page is not the log page\n if (!this.shouldPoll()) {\n this.stopPolling()\n return\n }\n\n try {\n const entries = await InstanceApi.getInstanceLogs(instanceId, cursor, null, { showAlert: false })\n this.showOfflineBanner = false\n if (!cursor) {\n this.prevCursor = null\n this.logEntries = []\n }\n const toPrepend = []\n if (entries.log.length > 0) {\n entries.log.forEach(l => {\n const d = new Date(parseInt(l.ts.substring(0, l.ts.length - 4)))\n l.date = `${d.toLocaleDateString()} ${d.toLocaleTimeString()}`\n if (typeof l.msg === 'undefined') {\n l.msg = 'undefined'\n } else if (typeof l.msg !== 'string') {\n l.msg = JSON.stringify(l.msg)\n }\n l.msg = l.msg.replace(/^[\\n]*/, '')\n if (!cursor || cursor[0] !== '-') {\n this.logEntries.push(l)\n } else {\n toPrepend.push(l)\n }\n if (l.src) {\n this.$emit('ha-instance-detected', l.src)\n }\n })\n if (toPrepend.length > 0) {\n this.logEntries = toPrepend.concat(this.logEntries)\n }\n if (!cursor || cursor[0] === '-') {\n this.prevCursor = entries.meta.previous_cursor\n }\n if (!cursor || cursor[0] !== '-') {\n this.nextCursor = entries.meta.next_cursor\n }\n if (entries.meta.first_entry && entries.meta.last_entry) {\n this.$emit('new-range', {\n first: entries.meta.first_entry,\n last: entries.meta.last_entry\n })\n }\n }\n } catch (error) {\n // the page could have been switched while the async request was in progress, if so\n // stop the polling and return immediately to avoid unnecessary error alerts\n if (!this.shouldPoll()) {\n this.stopPolling()\n return\n }\n // log the error as warn for troubleshooting purposes\n console.warn('Unable to retrieve Node-RED instance logs:', error)\n\n // Error 503 is returned by the API when the launcher is offline.\n // Error 500 is handled (and surfaced) by the `client.interceptors` in `../../../api/client.js`\n // Error with data.code === 'project_suspended' is ignored - it is expected when the project is suspended\n if (error.response?.status === 503) {\n if (this.showOfflineBanner === true) {\n return // only show the alert once\n }\n this.showOfflineBanner = true // show the \"offline\" banner\n Alerts.emit('The Node-RED instance cannot be reached at this time', 'warning', (POLL_TIME - 500))\n } else if (error.response?.status !== 500 && error.response?.data?.code !== 'project_suspended') {\n // display an alert. Ensure it is visible for less time than\n // the polling interval to avoid multiple visible alerts\n const message = error.response?.data?.error || error.message\n Alerts.emit('Could not get Node-RED logs: ' + message, 'warning', (POLL_TIME - 500))\n }\n }\n }\n }\n}\n</script>\n\n<style scoped>\n.forge-log-offline-background {\n background: repeating-linear-gradient(\n -45deg,\n #363848,\n #363848 10px,\n rgba(31, 41, 55, var(--tw-bg-opacity)) 10px,\n rgba(31, 41, 55, var(--tw-bg-opacity)) 20px\n );\n}\n</style>\n",".ff-project-overview {\n .ff-accordion--content {\n transition: none;\n }\n}\n\n.ff-instance-info {\n margin-bottom: 12px;\n h1 {\n > div {\n display: flex;\n gap: 6px;\n }\n border-bottom: 0;\n svg {\n width: 20px;\n }\n }\n table {\n padding: 9px 12px;\n background-color: white;\n border-radius: 0.25rem;\n border-collapse: separate;\n border-width: 1px;\n border-color: $ff-grey-300;\n td {\n height: 36px;\n }\n tr:not(:last-child) {\n td {\n border-bottom: 1px solid $ff-grey-100;\n }\n }\n }\n .ff-accordion {\n margin-bottom: -1px;\n }\n .ff-accordion--content {\n background-color: white;\n }\n &:last-child {\n margin-bottom: 0;\n }\n}","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n@import \"../../stylesheets/pages/project.scss\";\n\n// Container query for drawer context\n// Breakpoint matches DRAWER_MOBILE_BREAKPOINT constant in Editor/index.vue\n@container drawer (min-width: 640px) {\n .ff-project-overview .grid {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n}\n\n// Ensure single column layout when container is smaller\n@container drawer (max-width: 639px) {\n .ff-project-overview .grid {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n}\n\n// Info row: content left, action button(s) pushed right\n.info-row {\n display: flex;\n align-items: center;\n\n &__content {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n &__action {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 4px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: $ff-color--action;\n transition: color 0.15s ease, background-color 0.15s ease;\n\n .ff-icon {\n width: 20px;\n height: 20px;\n\n &.ff-icon-sm {\n width: 16px;\n height: 16px;\n }\n }\n\n &:hover {\n background-color: $ff-color--highlight;\n color: $ff-white;\n }\n\n &:disabled {\n cursor: not-allowed;\n color: $ff-grey-300;\n\n &:hover {\n background-color: transparent;\n color: $ff-grey-300;\n }\n }\n }\n\n .url-copier {\n min-width: 0;\n\n .text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n }\n}\n\n// Type field - ellipse from LEFT to show stack name\n.ff-instance-info table tr td.flex .flex-grow {\n direction: rtl;\n text-align: left;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-socket-status {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.ff-socket-status-icon {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background-color: $ff-grey-500;\n}\n\n.ff-socket-status-icon-connected {\n background-color: $ff-green-500;\n}\n\n.ff-socket-status-icon-disconnected {\n background-color: $ff-red-500;\n}\n\n.ff-chart-section {\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.action-button {\n cursor: default;\n}\n\n// Container query for drawer context - responsive button behavior\n// Breakpoint matches DRAWER_MOBILE_BREAKPOINT constant in Editor/index.vue\n// When inside drawer, respond to drawer width instead of viewport\n@container drawer (min-width: 640px) {\n .actions-text-container {\n display: inline;\n }\n}\n\n@container drawer (max-width: 639px) {\n .actions-text-container {\n display: none;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n// Container query for drawer context - responsive button behavior\n// Breakpoint matches DRAWER_MOBILE_BREAKPOINT constant in Editor/index.vue\n// When inside drawer, respond to drawer width instead of viewport\n@container drawer (min-width: 640px) {\n .dashboard-link-text {\n display: inline;\n }\n}\n\n@container drawer (max-width: 639px) {\n .dashboard-link-text {\n display: none;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n// Split dropdown button: two halves styled as one cohesive element\n.editor-link-split {\n display: inline-flex;\n position: relative;\n}\n\n// Shared base styles for both halves (mirrors .ff-btn .ff-btn--secondary)\n.editor-link-split__action,\n.editor-link-split__toggle {\n display: flex;\n align-items: center;\n gap: $ff-unit-xs;\n font-size: $ff-funit-sm;\n font-weight: 600;\n line-height: 20px;\n background-color: $ff-white;\n color: $ff-color--action;\n border: 1px solid $ff-color--action;\n cursor: pointer;\n transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;\n\n &:hover:not(:disabled) {\n background-color: $ff-color--highlight;\n border-color: $ff-color--highlight;\n color: $ff-white;\n }\n\n &:disabled,\n &.editor-link-split--disabled {\n cursor: not-allowed;\n border-color: $ff-grey-300;\n color: $ff-grey-400;\n background-color: $ff-grey-50;\n }\n\n .ff-btn--icon {\n width: 20px;\n height: 20px;\n }\n}\n\n// Left half: main action button\n.editor-link-split__action {\n padding: $ff-unit-sm 12px $ff-unit-sm $ff-unit-sm;\n border-radius: $ff-unit-sm 0 0 $ff-unit-sm;\n border-right: none;\n white-space: nowrap;\n}\n\n// DropdownMenu wrapper: make all wrapper divs invisible to flex layout\n// so the MenuButton becomes a direct flex child of .editor-link-split\n.editor-link-split__dropdown,\n.editor-link-split__dropdown > div,\n.editor-link-split__dropdown > div > div {\n display: contents;\n}\n\n// Right half: chevron dropdown trigger (square)\n.editor-link-split__toggle {\n justify-content: center;\n padding: $ff-unit-sm;\n border-radius: 0 $ff-unit-sm $ff-unit-sm 0;\n border-left: 1px solid $ff-color--action;\n\n .ff-btn--icon {\n width: 20px;\n height: 20px;\n }\n\n &:hover:not(:disabled) {\n border-left-color: $ff-color--highlight;\n }\n\n &:disabled,\n &.editor-link-split--disabled {\n border-left-color: $ff-grey-300;\n }\n}\n\n// Primary variant: filled indigo background with white text\n.editor-link-split--primary {\n .editor-link-split__action,\n .editor-link-split__toggle {\n background-color: $ff-color--action;\n border-color: $ff-color--action;\n color: $ff-white;\n\n &:hover:not(:disabled) {\n background-color: $ff-color--highlight;\n border-color: $ff-color--highlight;\n }\n }\n\n .editor-link-split__toggle {\n border-left-color: rgba($ff-white, 0.3);\n\n &:hover:not(:disabled) {\n border-left-color: rgba($ff-white, 0.3);\n }\n }\n}\n\n// Icon-only minimal button: remove icon margins added by .ff-btn--icon-left\n.editor-link-minimal .ff-btn--icon-left {\n margin-left: 0;\n margin-right: 0;\n}\n\n// Override icon-right margin from DropdownMenu's ChevronDownIcon\n.editor-link-split__toggle .ff-btn--icon-right {\n margin-left: 0;\n margin-right: 0;\n}\n\n// Container query for drawer context - responsive button behavior\n// Breakpoint matches DRAWER_MOBILE_BREAKPOINT constant in Editor/index.vue\n// When inside drawer, respond to drawer width instead of viewport\n@container drawer (min-width: 640px) {\n .editor-link-text {\n display: inline;\n }\n}\n\n@container drawer (max-width: 639px) {\n .editor-link-text {\n display: none;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.blueprints-section {\n display: flex;\n flex-direction: column;\n overflow: auto;\n flex: 1;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.import-flows {\n overflow: auto;\n\n & > .wrapper {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n flex: 1;\n overflow: auto;\n min-height: 400px;\n\n @media (max-width: 768px) {\n flex-direction: column;\n gap: 15px;\n }\n\n .preview {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n max-height: 100%;\n\n @media (max-width: 768px) {\n max-width: 100%;\n max-height: 400px;\n order: 2;\n }\n }\n\n .add-flows {\n overflow: auto;\n min-width: 350px;\n max-width: 600px;\n height: 100%;\n flex: 1;\n\n .content {\n overflow: auto;\n flex: 1;\n\n .flow-input-wrapper {\n height: 100%;\n display: flex;\n\n textarea {\n background: none;\n border-color: $ff-grey-200;\n resize: none;\n min-height: 200px;\n transition: background-color ease-out .3s, border-color ease-out .3s;\n flex: 1;\n\n &:hover, &:focus {\n background: $ff-white;\n border-color: $ff-grey-300;\n resize: vertical;\n }\n\n &.has-content {\n border-color: $ff-grey-300;\n }\n\n @media (max-width: 768px) {\n max-height: 100%;\n min-height: 100px;\n background: $ff-white;\n border-color: $ff-grey-300;\n resize: none;\n }\n }\n }\n\n @media (max-width: 768px) {\n overflow: initial;\n gap: 0;\n }\n }\n\n @media (max-width: 768px) {\n width: 100%;\n min-width: 100%;\n max-width: fit-content;\n height: auto;\n flex: 0 0 auto;\n }\n }\n }\n\n .notice {\n display: flex;\n gap: 15px;\n align-items: baseline;\n font-size: 0.8rem;\n\n .notice-element {\n\n h3 {\n font-weight: bold\n }\n\n p {\n font-style: italic;\n margin-bottom: 5px;\n }\n }\n\n @media (max-width: 768px) {\n flex: 0 0 auto;\n align-items: flex-start;\n justify-content: initial;\n padding: 10px;\n flex-direction: column;\n overflow: auto;\n height: fit-content;\n max-height: 10vh;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-flows-step {\n height: 100%;\n\n .ff-blueprints {\n overflow: auto;\n min-width: 400px;\n padding-right: 15px;\n\n .ff-blueprint-tiles {\n .ff-blueprint-tile {\n max-width: 280px;\n width: 100%;\n height: 100%;\n }\n }\n }\n\n .ff-blueprint-categories {\n min-width: 300px;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n\n ul {\n flex: 1;\n height: 100%;\n overflow: auto;\n\n li:hover {\n cursor: pointer;\n color: $ff-blue-600;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.instance-item {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 15px;\n background: $ff-grey-50;\n border-bottom: 1px solid $ff-grey-300;\n justify-content: space-between;\n padding: 6px;\n align-items: center;\n\n .title {\n grid-column-start: 2;\n grid-column-end: 6;\n display: flex;\n gap: 15px;\n justify-content: space-between;\n\n h6 {\n display: flex;\n gap: 6px;\n }\n }\n\n .actions {\n grid-column-start: 6;\n display: flex;\n justify-content: flex-end;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.versions-list.ff-accordion {\n margin: 0;\n\n button {\n display: grid;\n grid-template-columns: repeat(12, 1fr);\n background: $ff-white;\n gap: 15px;\n border: none;\n border-bottom: 1px solid $ff-grey-300;\n\n .version {\n grid-column-start: 2;\n display: flex;\n justify-content: flex-start;\n span {\n color: $ff-black;\n font-weight: 500;\n }\n }\n\n .counter {\n grid-column-start: 3;\n grid-column-end: 6;\n display: flex;\n justify-content: flex-start;\n gap: 2px;\n }\n\n .toggle {\n grid-column-start: 12;\n display: flex;\n justify-content: flex-end;\n }\n }\n\n &:last-child button {\n border-bottom: none;\n }\n\n .instances-list {\n .ff-show-more {\n display: flex;\n gap: 15px;\n align-items: center;\n justify-content: center;\n color: $ff-grey-500;\n line-height: 30px;\n cursor: pointer;\n transition: ease-in-out .3s;\n\n &:hover {\n color: $ff-color--action\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.dependency-item {\n border: 1px solid $ff-grey-300;\n margin-bottom: 12px;\n\n .dependency-header {\n cursor: pointer;\n background: $ff-grey-100;\n display: flex;\n padding: 6px 9px;\n align-items: center;\n gap: 15px;\n\n .title {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 15px;\n\n h3, p {\n margin: 0;\n line-height: 1;\n }\n\n p {\n color: $ff-grey-500;\n font-weight: 400;\n font-size: 80%;\n }\n }\n\n .details {\n display: flex;\n flex-direction: column;\n text-align: right;\n font-size: 0.875rem;\n font-weight: 500;\n }\n\n .ff-toggle {\n transition: ease-in-out .3s;\n }\n\n &.open {\n border-bottom: 1px solid $ff-grey-300;\n\n .ff-toggle {\n transform: rotate(90deg);\n }\n }\n }\n\n &:last-of-type {\n .ff-accordion {\n button {\n border-bottom: none;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.device-group {\n .ff-target-snapshot-info{\n border: 1px solid $ff-grey-300;\n padding: 10px 15px;\n display: flex;\n gap: 20px;\n\n .ff-title {\n font-weight: 500;\n }\n }\n\n}\n",".ff-pipeline {\n width: 100%;\n border: 1px solid $ff-grey-300;\n border-radius: 6px;\n .ff-pipeline-banner {\n height: 46px;\n }\n .ff-pipeline-banner,\n .ff-pipeline-stage-banner {\n padding: 0px 18px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid $ff-grey-300;\n background-color: $ff-grey-100;\n border-top-left-radius: 6px;\n border-top-right-radius: 6px;\n gap: 48px;\n }\n .ff-pipeline-stage-banner {\n height: 54px;\n background-color: $ff-grey-50;\n label {\n font-weight: 500;\n }\n }\n .ff-pipelines-stage-banner-error {\n color: $ff-red-600;\n font-size: 0.725rem;\n font-weight: 500;\n display: flex;\n align-items: center;\n gap: 2px;\n }\n .ff-pipeline-actions {\n display: flex;\n gap: 6px;\n }\n .ff-pipeline-stages {\n padding: 24px;\n border-bottom-left-radius: 6px;\n border-bottom-right-radius: 6px;\n display: flex;\n align-items: stretch;\n gap: 16px;\n overflow-x: auto;\n }\n}\n\n.ff-pipeline-stage {\n border-radius: 6px;\n border: 1px solid $ff-grey-400;\n min-width: 275px;\n background-color: white;\n a:hover,\n a:hover .ff-icon {\n color: $ff-blue-600;\n }\n &.ff-pipeline-stage-ghost {\n border-style: dashed;\n padding: 48px 64px;\n gap: 6px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n color: $ff-grey-400;\n &:hover {\n border-style: solid;\n cursor: pointer;\n color: $ff-blue-600;\n border-color: $ff-blue-600;\n }\n }\n .ff-pipeline-stage-row {\n padding: 9px 18px;\n display: flex;\n justify-content: space-between;\n gap: 24px;\n font-size: 0.9rem; \n label {\n color: $ff-grey-500;\n }\n a.ff-link {\n text-overflow: ellipsis;\n overflow-x: hidden;\n }\n }\n .ff-pipeline-stage-type {\n padding: 9px 0px 0.75rem;\n margin: 0 18px 0.75rem;\n border-bottom: 1px solid $ff-grey-300;\n display: flex;\n align-items: flex-start;\n gap: 6px;\n font-size: 0.9rem; \n label {\n color: $ff-grey-500;\n font-size: 0.75em;\n line-height: 0.825em;\n }\n }\n}\n\n.ff-pipeline-stage--error {\n border-color: $ff-red-600;\n .ff-pipeline-stage-banner {\n background-color: $ff-red-50;\n border-bottom: 1px solid $ff-red-600;\n }\n}\n\n.animate-deploying {\n animation-name: left-to-right;\n animation-duration: 1s;\n animation-iteration-count: infinite;\n color: $ff-blue-600;\n}\n\n@keyframes left-to-right {\n 0% {\n transform: translate(-24px, 0);\n opacity: 0;\n }\n 40% {\n opacity: 1;\n }\n 75% {\n opacity: 0;\n }\n 100% {\n transform: translate(24px, 0);\n opacity: 0;\n }\n}","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.deployment-name__url {\n :deep(.ff-icon) {\n width: 14px;\n height: 14px;\n }\n :deep(.ff-icon-button) {\n background: transparent;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n\n .error-banner {\n padding: 9px;\n background-color: $ff-red-50;\n border: 1px solid $ff-red-300;\n border-radius: 3px;\n color: $ff-red-600;\n }\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.role-row-cell {\n display: flex;\n flex-direction: column;\n min-height: 40px;\n\n .actual-role {\n flex: 1;\n display: flex;\n justify-content: center;\n flex-direction: column;\n }\n\n .team-role {\n flex: 1;\n }\n .role {\n font-weight: bold;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n@import '../ui-components/stylesheets/ff-colors.scss';\n@import '../ui-components/stylesheets/ff-utility.scss';\n\n.ff-icon-link {\ndisplay: flex;\njustify-content: space-between;\nalign-items: center;\nposition: relative;\n\nborder-radius: $ff-unit-sm;\nborder: 1px solid $ff-grey-300;\n\nheight: 28px;\npadding: $ff-unit-sm 5px;\n\nfont-size: $ff-funit-sm;\nline-height: 20px;\n\nsvg {\n margin-right: 5px;\n}\n\n&:hover {\n cursor: pointer;\n border-color: $ff-blue-600;\n\n color: $ff-blue-600;;\n background-color: $ff-grey-50;\n\n .ff-icon {\n color: $ff-blue-600;\n }\n}\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n@import '../../../ui-components/stylesheets/ff-colors.scss';\n@import '../../../ui-components/stylesheets/ff-utility.scss';\n\n.ff-icon-link {\n display: flex;\n justify-content: space-between;\n align-items: center;\n position: relative;\n\n border-radius: $ff-unit-sm;\n border: 1px solid $ff-grey-300;\n\n height: 28px;\n padding: $ff-unit-sm 5px;\n\n font-size: $ff-funit-sm;\n line-height: 20px;\n\n svg {\n margin-right: 5px;\n }\n\n &:hover {\n cursor: pointer;\n border-color: $ff-blue-600;\n\n color: $ff-blue-600;;\n background-color: $ff-grey-50;\n\n .ff-icon {\n color: $ff-blue-600;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-counter {\n border: 1px solid transparent;\n transition: ease-in-out .15s;\n will-change: border-color;\n\n &.empty {\n opacity: .3;\n }\n\n &:hover {\n opacity: 1;\n\n &.green {\n border-color: $ff-green-500;\n }\n &.red {\n border-color: $ff-red-500;\n }\n &.gray {\n border-color: $ff-grey-500;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.application-wrapper {\n position: relative;\n\n .overlay {\n position: absolute;\n top:0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(255, 255, 255, 0.4) !important;\n border: none !important;\n }\n}\n",".ff-applications-list {\n display: flex;\n flex-direction: column;\n gap: 18px;\n > li {\n > *:not(.ff-dialog-container) {\n border-left: 1px solid $ff-grey-300;\n border-right: 1px solid $ff-grey-300;\n background-color: $ff-grey-50;\n }\n\n > section:last-of-type {\n border-bottom-left-radius: 6px;\n border-bottom-right-radius: 6px;\n border-bottom: 1px solid $ff-grey-300;\n }\n\n > :first-child {\n border-top-left-radius: 6px;\n border-top-right-radius: 6px;\n border-top: 1px solid $ff-grey-300;\n }\n\n > :last-child {\n border-bottom-left-radius: 6px;\n border-bottom-right-radius: 6px;\n border-bottom: 1px solid $ff-grey-300;\n }\n }\n .ff-application-list--app {\n background-color: white !important;\n display: flex;\n justify-content: space-between;\n padding: 12px;\n border: 1px solid $ff-grey-300;\n >span {\n display: flex;\n align-items: center;\n gap: 1rem;\n }\n &:hover {\n cursor: pointer;\n border-color: $ff-blue-600;\n\n .ff-application-list--icon,\n .ff-application-list--icon .ff-icon {\n color: $ff-blue-600;\n }\n }\n }\n .ff-applications-list--instance {\n display: flex;\n flex-direction: column;\n span {\n color: $ff-grey-400;\n font-size: 0.75rem;;\n }\n }\n .delimiter {\n font-size: 0.875rem;\n color: $ff-grey-500;\n display: flex;\n align-items: center;\n gap: 6px;\n\n &::after {\n content: '';\n height: 1px;\n flex-grow: 1;\n margin-left: 9px;\n background-color: $ff-grey-300;\n }\n }\n}\n\n.ff-applications-list-instances {\n padding: 12px;\n padding-top: 6px;\n display: flex;\n flex-direction: column;\n >label {\n font-size: 0.875rem;\n color: $ff-grey-500;\n display: flex;\n align-items: center;\n gap: 12px;\n &::after {\n content: '';\n height: 1px;\n flex-grow: 1;\n background-color: $ff-grey-300;\n }\n }\n > .items-wrapper {\n background-color: white;\n border-color: $ff-grey-300;\n border-width: 1px;\n border-style: solid;\n border-radius: 6px;\n padding: 12px;\n display: grid;\n align-items: center;\n grid-template-columns: 40px 1fr 100px minmax(auto, 220px) 350px;\n &:hover {\n cursor: pointer;\n border-color: $ff-blue-600;\n .ff-application-list--instance {\n color: $ff-blue-600;\n }\n .ff-icon {\n color: $ff-blue-600;\n }\n }\n }\n\n .actions {\n display: flex;\n justify-content: flex-end;\n gap: 9px;\n }\n}\n\n.ff-applications-list-instances {\n flex: 1;\n padding: 12px;\n padding-top: 6px;\n\n .items-wrapper {\n display: flex;\n flex: 1;\n background: none;\n border: none;\n padding: 0;\n gap: 5px;\n margin-top: 10px;\n\n .ff-counter {\n min-width: 125px;\n }\n }\n\n .empty-message {\n min-height: 75px;\n display: flex;\n text-align: center;\n align-items: center;\n justify-content: center;\n gap: 2px;\n color: $ff-grey-500;\n }\n}\n\n.ff-applications-list--details {\n color: $ff-grey-400;\n font-size: 0.875rem;\n padding-bottom: 12px;\n text-align: center;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n@import \"../../../stylesheets/components/applications-list\";\n\n.no-results {\n text-align: center;\n color: $ff-grey-400;\n}\n\n.fade-slide-enter-active,\n.fade-slide-leave-active,\n.fade-slide-move {\n transition: all 0.3s ease;\n}\n\n.fade-slide-enter-from {\n opacity: 0;\n transform: translateX(30px);\n}\n\n.fade-slide-enter-to {\n opacity: 1;\n transform: translateX(0);\n}\n\n.fade-slide-leave-from {\n opacity: 1;\n transform: translateX(0);\n}\n\n.fade-slide-leave-to {\n opacity: 0;\n transform: translateX(30px);\n}\n\n.fade-slide-move {\n transition: transform 0.3s ease;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-admin-audit .ff-accordion {\n margin-bottom: 12px;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.hosted-instances-usage {\n tr:last-of-type {\n td {\n border-bottom: none;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-medium-tile {\n position: relative;\n border-radius: 6px;\n border: 2px solid $ff-grey-300;\n background: white;\n box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.25);\n padding: 49px 24px 24px 24px;\n width: 100%;\n max-width: 300px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n\n .ff-ribbon {\n --ribbon-overlap: 8px;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 30px;\n left: calc(-1 * var(--ribbon-overlap));\n line-height: 1.3;\n width: calc(100% + 2 * var(--ribbon-overlap));\n margin: 0;\n position: absolute;\n top: 8px;\n color: white;\n border-top: 1px solid #363636;\n border-bottom: 1px solid #202020;\n border-radius: 2px 2px 0 0;\n box-shadow: 0 1px 2px rgba(0,0,0,0.3);\n\n &.red {\n background: $ff-red-500;\n &::before,\n &::after {\n border-color: $ff-red-900 transparent transparent transparent;\n }\n }\n\n &.blue {\n background: $ff-indigo-700;\n &::before,\n &::after {\n border-color: $ff-indigo-900 transparent transparent transparent;\n }\n }\n\n &::before,\n &::after {\n content: '';\n display: block;\n width: 0;\n height: 0;\n position: absolute;\n bottom: calc((-2 * var(--ribbon-overlap)) - 1px);\n z-index: -10;\n border: var(--ribbon-overlap) solid;\n }\n\n &::before {left: 0}\n &::after {right: 0}\n }\n\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-accordion.broker-client {\n margin-bottom: 0;\n\n button {\n border: none;\n background: none;\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 15px;\n padding: 0;\n\n .username {\n padding: 15px 10px;\n grid-column: span 2;\n overflow: hidden;\n\n .ff-text-copier {\n @include truncate;\n & > span {\n @include truncate;\n }\n .title-wrapper {\n @include truncate;\n }\n\n }\n\n .ff-icon {\n margin-left: 0;\n min-width: 20px;\n }\n }\n\n .rules {\n padding: 15px 10px;\n\n }\n\n .toggle {\n grid-column: span 3;\n text-align: right;\n padding-right: 10px;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n .edit, .delete {\n padding: 24px 15px;\n display: inline-block;\n position: relative;\n align-self: stretch;\n\n .ff-icon-sm {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n transition: ease-in-out .3s;\n }\n\n &:hover {\n .ff-icon-sm {\n width: 20px;\n height: 20px;\n }\n }\n }\n\n .edit:hover {\n color: $ff-grey-700;\n }\n .delete:hover {\n color: $ff-red-700;\n }\n }\n }\n\n .ff-accordion--content {\n background: $ff-grey-100;\n .acl-list {\n .acl-wrapper {\n border-bottom: 1px solid $ff-grey-200;\n padding: 15px 10px;\n gap: 10px;\n font-size: 80%;\n\n &:last-of-type {\n border: none;\n }\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#client-dialog {\n\n .headers {\n label:first-of-type {\n max-width: 200px;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n\n .clients-wrapper {\n border: 1px solid $ff-grey-300;\n border-radius: 5px;\n overflow: hidden;\n\n .header {\n background: $ff-grey-100;\n padding: 10px;\n border-bottom: 1px solid $ff-grey-300;\n\n span {\n &.username {\n grid-column: span 2;\n }\n }\n }\n\n .clients-list {\n background: $ff-white;\n\n .client {\n border-bottom: 1px solid $ff-grey-300;\n\n &:last-of-type {\n border-bottom: none;\n }\n }\n }\n }\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-topic-docs {\n .ff-accordion {\n margin: 0;\n\n .ff-accordion--button{\n font-weight: bold;\n border: 1px solid $ff-blue-300;\n background-color: $ff-blue-50;\n border-radius: 6px;\n padding: 12px;\n font-weight: bold;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n &:hover {\n cursor: pointer;\n background-color: $ff-blue-100;\n }\n }\n\n .ff-accordion--content {\n border: 1px solid $ff-blue-300;\n border-top: none;\n border-radius: 0 0 6px 6px;\n padding: 12px;\n\n .ff-topic-docs-row-meta {\n section {\n margin-bottom: 15px;\n\n label {\n display: block;\n font-weight: bold;\n margin-bottom: 3px;\n }\n .ff-empty-state {\n color: $ff-grey-400;\n background-color: $ff-grey-50;\n padding: 12px;\n margin-top: 6px;\n }\n }\n }\n }\n\n &.open {\n .ff-accordion--button {\n border-radius: 6px 6px 0 0;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-return-link {\n padding: 9px 12px;\n border-radius: 6px;\n border: 1px solid $ff-grey-200;\n transition: border-color 0.3s;\n display: inline-flex;\n align-items: center;\n gap: 9px;\n &:hover {\n border-color: $ff-indigo-500;\n color: $ff-indigo-500;\n cursor: pointer;\n }\n}\n.ff-schema-docs-hierarchy {\n margin: 24px 0;\n display: flex;\n gap: 12px;\n flex-direction: column;\n}\nh1 {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.segment-wrapper {\n .segment {\n position: relative;\n margin: 5px 0 0;\n transition: ease .15s;\n &:hover {\n color: $ff-indigo-700;\n\n cursor: pointer;\n }\n\n .diagram {\n .connector-elbow {\n border-left: 2px solid $ff-indigo-300;\n border-bottom: 2px solid $ff-indigo-300;\n border-bottom-left-radius: 7px;\n display: inline-block;\n position: absolute;\n height: 50px;\n width: 25px;\n left: -23px;\n top: -35px;\n }\n .connector-trunk {\n width: 1px;\n border-left: 2px solid $ff-indigo-300;\n display: inline-block;\n position: absolute;\n height: 5000px;\n left: -23px;\n top: -5000px;\n }\n }\n\n .content {\n padding: 5px;\n position: relative;\n\n .chevron {\n transition: ease .15s;\n }\n\n .title {\n align-items: center;\n display: flex;\n gap: 3px;\n\n .highlight {\n background-color: $ff-indigo-100;\n }\n }\n\n .ff-text-copier {\n display: none;\n height: 17px;\n }\n\n &:hover {\n .ff-text-copier {\n display: inline-block;\n color: $ff-grey-400;\n }\n }\n }\n }\n\n .children {\n overflow: hidden;\n }\n &.selected > {\n .segment {\n background: $ff-indigo-50;\n }\n }\n &.open > {\n .segment {\n .content {\n .title {\n color: $ff-indigo-700;\n }\n\n .chevron {\n transform: rotate(90deg)\n }\n }\n }\n }\n\n &.empty > {\n .segment {\n .content {\n .title {\n color: $ff-grey-600;\n font-size: 90%;\n font-weight: 300;\n\n .separator {\n color: $ff-black;\n font-weight: bold;\n }\n }\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.unified-namespace-hierarchy {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n overflow: auto;\n\n .topics {\n background: $ff-white;\n padding: 10px;\n border-radius: 6px;\n border: 1px solid $ff-grey-200;\n overflow: auto;\n height: 100%;\n }\n}\n@media screen and (max-width: $ff-screen-md) {\n .unified-namespace-hierarchy {\n min-width: 100%;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-topic-inspecting {\n background: $ff-white;\n padding: 10px;\n border-radius: 6px;\n border: 1px solid $ff-grey-200;\n}\n\n.ff-topic-path {\n display: flex;\n background-color: $ff-indigo-50;\n color: $ff-indigo-600;\n border-radius: 6px;\n border: 1px solid $ff-indigo-100;\n padding: 6px;\n font-weight: 600;\n & > span:first-child {\n flex-grow: 1\n }\n & > span:last-child {\n flex-grow: 0\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.topic-schema {\n background-color: $ff-indigo-50;\n color: $ff-indigo-600;\n border-radius: 6px;\n border: 1px solid $ff-indigo-100;\n padding: 10px 6px;\n font-size: 0.875rem;\n line-height: 1.25rem;\n overflow: auto;\n position: relative;\n\n .topic-schema-unknown {\n color: $ff-grey-500;\n text-align: center;\n font-style: italic;\n }\n\n .schema-container {\n .show-more {\n position: absolute;\n bottom: 0;\n left: 45%;\n }\n\n }\n\n &.collapsed {\n overflow: hidden;\n box-shadow: inset 0 -30px 20px -20px rgba(49, 46, 129, 0.2);\n padding-bottom: 35px;\n\n .schema-container {\n max-height: 400px;\n }\n\n .show-more {\n padding: 10px;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.suggestion {\n .content {\n .format {\n color: $ff-indigo-500;\n }\n }\n\n .actions {\n .preview {\n color: $ff-grey-500\n }\n .accept {\n color: $ff-green-500\n }\n .reject {\n color: $ff-red-500\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-topic-inspecting {\n display: flex;\n flex-direction: column;\n gap: 15px;\n background: $ff-white;\n padding: 10px;\n border-radius: 6px;\n border: 1px solid $ff-grey-200;\n overflow: auto;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-topic-inspector {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n transition: width 0.3s;\n overflow: auto;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-broker-hierarchy {\n display: flex;\n flex-direction: row;\n gap: 12px;\n overflow: auto;\n //height: 100%;\n}\n\n@media screen and (max-width: $ff-screen-md) {\n .ff-broker-hierarchy {\n flex-wrap: wrap;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.broker-form {\n .server, .credentials {\n .title {\n border-bottom: 1px solid $ff-grey-200;\n }\n }\n\n .server {\n &::after {\n content: ' ';\n width: 1px;\n height: 10px;\n background: red;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-box {\n border: 1px solid $ff-color--border;\n background: $ff-white;\n padding: 10px;\n display: flex;\n flex-direction: column;\n flex: 1;\n\n .ff-box-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 10px;\n\n .ff-box-title {\n margin: 0;\n padding: 0;\n font-size: 1.3rem;\n }\n }\n}\n","<template>\n <KebabMenu class=\"relative ff-kebab-menu\" as=\"div\" data-el=\"kebab-menu\">\n <MenuButton\n ref=\"trigger\"\n class=\"ff-btn ff-btn--tertiary ff-btn-icon transition-fade--color ff-kebab-menu__trigger\"\n :disabled=\"disabled\"\n @click=\"() => { $nextTick(() => { updateItemsPosition() } ) }\"\n @keydown.space=\"() => { $nextTick(() => { updateItemsPosition() } ) }\"\n >\n <DotsVerticalIcon class=\"ff-icon\" />\n </MenuButton>\n <teleport to=\"body\">\n <transition\n leave-active-class=\"transition duration-100 ease-in\"\n leave-from-class=\"opacity-100\"\n leave-to-class=\"opacity-0\"\n >\n <MenuItems\n ref=\"menu-items\"\n as=\"ul\"\n class=\"ff-kebab-options\"\n data-el=\"kebab-options\"\n :style=\"{\n position: 'fixed',\n top: position.top + 'px',\n left: position.left + 'px'\n }\"\n >\n <slot></slot>\n </MenuItems>\n </transition>\n </teleport>\n </KebabMenu>\n</template>\n\n<script>\nimport {\n Menu,\n MenuButton,\n MenuItems\n} from '@headlessui/vue'\nimport { DotsVerticalIcon } from '@heroicons/vue/solid'\n\nimport TeleportedMenuMixin from '../../../mixins/TeleportedMenuMixin.js'\n\nexport default {\n name: 'ff-kebab-menu',\n components: {\n DotsVerticalIcon,\n KebabMenu: Menu,\n MenuButton,\n MenuItems\n },\n mixins: [TeleportedMenuMixin],\n props: {\n disabled: {\n default: false,\n required: false,\n type: Boolean\n }\n }\n}\n</script>\n\n<style scoped>\n.ff-kebab-menu__trigger {\n border: 1px solid transparent;\n}\n</style>\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.minimal-status {\n display: block;\n height: 10px;\n width: 10px;\n border-radius: 50%;\n transition: ease-in-out .3s;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.recently-modified {\n & > p {\n border-bottom: 1px solid $ff-grey-100;\n margin-bottom: 10px;\n line-height: 2rem;\n }\n\n .device-wrapper {\n .device-tile {\n border: 1px solid $ff-grey-100;\n padding: 2px 10px;\n border-radius: 5px;\n display: flex;\n width: 100%;\n height: fit-content;\n min-height: 55px;\n justify-content: space-between;\n align-items: center;\n gap: 10px;\n will-change: border-color;\n transition: ease-in-out .3s;\n\n &.has-more {\n padding: 10px;\n }\n\n &:hover {\n border-color: $ff-grey-200;\n }\n\n .details {\n flex: 1;\n\n .detail-wrapper {\n &:last-of-type {\n font-size: $ff-funit-sm;\n color: $ff-grey-400;\n }\n }\n\n .name {\n &:hover {\n color: $ff-indigo-700;\n }\n }\n }\n\n .actions {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n }\n }\n\n .no-devices {\n min-height: 130px;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.recently-modified {\n display: flex;\n flex: 1;\n flex-direction: column;\n\n & > p {\n border-bottom: 1px solid $ff-grey-100;\n margin-bottom: 10px;\n line-height: 2rem;\n }\n\n .instance-wrapper {\n height: fit-content;\n\n .instance-tile {\n border: 1px solid $ff-grey-100;\n padding: 2px 4px 2px 10px;\n border-radius: 5px;\n display: flex;\n width: 100%;\n height: fit-content;\n min-height: 55px;\n justify-content: space-between;\n align-items: center;\n gap: 10px;\n will-change: border-color, background-color;\n transition: ease-in-out 0.3s;\n cursor: pointer;\n\n &.has-more {\n padding: 10px;\n }\n\n &:hover {\n border-color: $ff-grey-300;\n background-color: $ff-indigo-50;\n }\n\n .details {\n flex: 1;\n\n .detail-wrapper {\n .name {\n font-weight: 500;\n }\n\n &.detail {\n font-size: $ff-funit-sm;\n color: $ff-grey-400;\n }\n }\n }\n\n .actions {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 4px;\n\n .ff-kebab-menu .ff-btn {\n color: $ff-color--action;\n\n .ff-icon {\n width: 20px;\n height: 20px;\n }\n\n &:hover {\n background-color: $ff-color--highlight;\n color: $ff-white;\n }\n }\n }\n }\n }\n\n .no-instances {\n min-height: 130px;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-team-dashboard {\n height: 100%;\n display: flex;\n flex: 1;\n flex-direction: column;\n overflow: auto;\n container-type: inline-size;\n container-name: team-dashboard;\n}\n\n.instances-section {\n // Default: stacked (flex-wrap)\n // When container is 640px+ wide, display side-by-side\n @container team-dashboard (min-width: 640px) {\n flex-wrap: nowrap;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.flow-categories-wrapper {\n display: flex;\n flex-direction: column;\n flex-wrap: wrap;\n gap: 20px;\n\n .category {\n margin-bottom: 20px;\n\n .blueprint-tile {\n max-width: 250px;\n min-width: 200px;\n }\n\n .tiles-wrapper {\n display: flex;\n flex-wrap: wrap;\n gap: 15px;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-registry-entry {\n background-color: $ff-white;\n padding: 12px;\n border: 1px solid $ff-grey-200;\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-registry-list {\n display: grid;\n gap: 6px;\n}\n",".ff-code-previewer {\n background-color: white;\n border: 1px solid $ff-grey-300;\n border-radius: 6px;\n padding: 12px;\n code {\n border: none;\n padding: unset;\n }\n}","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-team-library .ff-breadcrumbs {\n margin-top: 12px;\n margin-bottom: 12px;\n}\n.breadcrumbs-wrapper {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\ntd {\n .content {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n transition: max-height 0.3s ease-in-out;\n height: fit-content;\n box-shadow: inset 0 2px 15px 0 rgba(0,0,0,0.1);\n overflow-y: auto;\n\n .application {\n line-height: 29px;\n display: grid;\n grid-template-columns: 55px repeat(10, 1fr) 56px;\n border-bottom: 1px solid $ff-grey-200;\n transition: ease-in-out .3s;\n\n .name {\n grid-column: span 8;\n }\n .role {\n padding-left: 15px;\n }\n\n .action {\n .ff-icon {\n transition: ease-in-out .2s;\n opacity: 0;\n }\n }\n\n &:hover {\n background: $ff-grey-100;\n .action {\n .ff-icon {\n opacity: 1;\n }\n }\n }\n\n &:last-of-type {\n border-bottom: none;\n }\n }\n\n }\n\n &.collapsed {\n .content {\n max-height: 0\n }\n }\n\n &.expanded {\n .content {\n max-height: 200px;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-cpu-bar {\n width: 100%;\n height: 100%;\n border-radius: 3px;\n padding: 3px;\n border: 1px solid;\n border-color: $ff-grey-300;\n}\n\n.ff-cpu-bar--fill {\n border-radius: 3px;\n height: 12px;\n}\n\n.ff-cpu-bar--fill.high {\n background-color: $ff-red-200;\n}\n\n.ff-cpu-bar--fill.medium {\n background-color: $ff-yellow-200;\n}\n\n.ff-cpu-bar--fill.low {\n background-color: $ff-green-200;\n}\n\n.ff-cpu-bar--label {\n width: 48px;\n text-align: right;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-pipeline-stage {\n border: 1px solid $ff-grey-300;\n border-radius: 6px;\n overflow: hidden;\n background: $ff-white;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-width: 225px;\n\n .ff-pipeline-target {\n display: flex;\n flex-direction: row;\n gap: 6px;\n font-size: 11px;\n align-items: center;\n border: 1px solid $ff-grey-300;\n padding: 6px;\n border-radius: 6px;\n transition: ease-in-out .3s;\n\n &:hover {\n color: $ff-indigo-700;\n border-color: $ff-indigo-700;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-pipeline {\n border: 1px solid $ff-grey-300;\n border-radius: 5px;\n overflow: hidden;\n\n & > .ff-pipeline-header {\n background: $ff-white;\n padding: 15px;\n border-bottom: 1px solid $ff-grey-300;\n transition: ease-in-out .3s;\n\n &:hover {\n color: $ff-white;\n background: $ff-indigo-700;\n .ff-pipeline-application-name {\n transition: ease-in-out .3s;\n color: $ff-grey-400;\n }\n }\n\n &:has(.ff-pipeline-application-name:hover) {\n color: $ff-grey-500;\n\n .ff-pipeline-application-name:hover {\n color: $ff-white;\n }\n }\n\n .ff-application-name {\n transition: ease-in-out .3s;\n color: $ff-grey-400;\n\n &:hover {\n color: $ff-indigo-700;\n }\n }\n\n .to {\n display: flex;\n flex: 1;\n justify-content: end;\n }\n }\n\n & > .ff-pipeline-content {\n padding: 15px;\n overflow: auto;\n\n .ff-pipeline-stages-list {\n display: flex;\n flex-direction: row;\n gap: 15px;\n\n li {\n display: flex;\n gap: 15px;\n align-items: center;\n\n &:last-child > .ff-icon {\n display: none;\n }\n }\n }\n\n .ff-empty-stages-message {\n text-align: center;\n color: $ff-grey-500;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#team-pipelines {\n\n .pipelines {\n .pipelines-list {\n display: flex;\n flex-direction: column;\n gap: 15px;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-team-properties-table {\n padding: 9px 12px;\n border-radius: 0.25rem;\n background-color: white;\n border-collapse: separate;\n border-width: 1px;\n border-color: $ff-grey-300;\n min-width: 400px;\n td {\n height: 36px;\n }\n tr:not(:last-child) {\n td,th {\n border-bottom: 1px solid $ff-grey-100;\n }\n }\n th {\n font-weight: 600;\n padding-right: 12px;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.rows-header {\n margin-bottom: 15px;\n padding-bottom: 15px;\n border-bottom: 1px solid $ff-color--border;\n\n .toggle-collapse, .refresh-table {\n border: 1px solid transparent;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.text-cell {\n overflow: auto;\n max-height: 3rem;\n\n .value {\n background: none;\n border: none;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#rows-list {\n height: 100%;\n width: 100%;\n overflow: auto;\n\n .header {\n border-bottom: 1px solid $ff-color--border;\n padding-bottom: 15px;\n margin-bottom: 15px;\n display: flex;\n align-items: center;\n height: 50px;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.column {\n .col-section {\n\n .ff-combobox, .ff-listbox {\n min-width: 10px; // resetting min-width\n max-width: 100%;\n width: 100%;\n }\n\n .ff-input {\n min-width: 10px;\n }\n\n .ff-checkbox {\n span {\n top: 8px;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n\n#create-table {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n background: $ff-grey-50;\n\n > .header {\n border-bottom: 1px solid $ff-grey-300;\n padding: 10px 0;\n width: 100%;\n background: $ff-white;\n\n .content {\n padding: 0 12px;\n display: flex;\n align-items: baseline;\n\n .title {\n margin: 0;\n color: $ff-grey-800;\n font-weight: bold;\n font-size: 1.25rem;\n line-height: 1.75rem;\n }\n }\n }\n\n .content-wrapper {\n flex: 1;\n width: 100%;\n background-color: $ff-grey-50;\n overflow: auto;\n\n .section {\n padding-bottom: 15px;\n margin-bottom: 15px;\n border-bottom: 1px solid $ff-grey-200;\n\n .header {\n .title {\n color: $ff-grey-600;\n font-size: 10px;\n }\n }\n\n .columns {\n margin-bottom: 20px;\n }\n }\n }\n\n .footer {\n padding: 10px 12px;\n border-top: 1px solid $ff-grey-300;\n background: $ff-white;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#table-schema {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n background: $ff-grey-50;\n\n > .header {\n border-bottom: 1px solid $ff-grey-300;\n padding: 10px 0;\n width: 100%;\n background: $ff-white;\n\n .content {\n padding: 0 12px;\n display: flex;\n align-items: baseline;\n\n .title {\n margin: 0;\n color: $ff-grey-800;\n font-weight: bold;\n font-size: 1.25rem;\n line-height: 1.75rem;\n }\n }\n }\n\n .content-wrapper {\n flex: 1;\n width: 100%;\n background-color: $ff-grey-50;\n overflow: auto;\n\n .header {\n .title {\n color: $ff-grey-600;\n font-size: 10px;\n }\n }\n }\n\n .footer {\n background: $ff-white;\n padding: 10px 12px;\n border-top: 1px solid $ff-grey-300;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#tables-list {\n display: flex;\n flex-direction: column;\n max-width: 20%;\n min-width: 250px;\n\n .header {\n border-bottom: 1px solid $ff-color--border;\n padding-bottom: 15px;\n margin-bottom: 15px;\n\n .ff-data-table--search {\n min-width: 10px;\n }\n }\n\n .list {\n .item {\n display: flex;\n gap: 5px;\n line-height: 2;\n align-items: center;\n transition: ease-in-out .3s;\n cursor: pointer;\n\n &:hover, &.active {\n color: $ff-indigo-500;\n background-color: $ff-grey-100;\n }\n\n &:hover {\n .icon-toggle {\n .ff-icon:first-child {\n display: none;\n }\n .ff-icon:last-child {\n display: inline-block;\n }\n }\n }\n\n .icon-toggle {\n width: 24px;\n .ff-icon:first-child {\n display: inline-block;\n }\n .ff-icon:last-child {\n display: none;\n }\n\n .edit {\n &:hover {\n transform: scale(1.4);\n }\n }\n }\n }\n }\n\n .empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n text-align: center;\n justify-content: center;\n color: $ff-grey-400;\n line-height: 1.6;\n\n .cta {\n cursor: pointer;\n color: $ff-indigo-500;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#table-explorer {\n display: flex;\n gap: 15px;\n height: 100%;\n width: 100%;\n overflow: auto;\n\n &.collapsed {\n gap: 0;\n #tables-list {\n max-width: 0;\n min-width: 0;\n overflow: hidden;\n padding: 0;\n border-right-color: transparent;\n }\n }\n\n #tables-list {\n border-right: 1px solid $ff-color--border;\n padding-right: 10px;\n transition: ease-in-out .3s, border-right-color ease-out .3s;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#table-credentials {\n .title {\n display: flex;\n gap: 5px;\n align-items: center;\n margin-bottom: 10px;\n\n h3 {\n margin: 0;\n padding: 0;\n }\n }\n\n .client-details,\n .database-details {\n padding: 10px;\n background: $ff-white;\n border: 1px solid $ff-color--border;\n border-radius: 5px;\n\n .item {\n display: flex;\n margin-bottom: 10px;\n\n dt {\n font-weight: 500;\n max-width: 30%;\n flex: 1\n }\n\n dd {\n flex: 1;\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#add-database {\n height: 100%;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.database-form {\n .database, .credentials {\n .title {\n border-bottom: 1px solid $ff-grey-200;\n }\n }\n dl {\n padding: 10px;\n max-width: 600px;\n\n dt, dd {\n margin: 0;\n }\n\n dt {\n font-weight: 600;\n }\n dd {\n text-indent: 10px;\n margin-bottom: 10px;\n }\n }\n\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-select-team-step {\n .team-tile {\n padding: 12px;\n border: 2px solid $ff-grey-300;\n width: 100%;\n border-radius: 6px;\n cursor: pointer;\n transition: ease-in-out .3s;\n\n &:hover {\n border-color: $ff-indigo-400;\n }\n\n &.selected {\n border-color: $ff-indigo-600;\n }\n\n .header {\n .title {\n\n }\n\n .counters {\n color: $ff-grey-400;\n font-size: $ff-funit-xs;\n }\n }\n\n .description {\n color: $ff-grey-400;\n font-size: $ff-funit-sm;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.capabilities-selector {\n .ff-listbox {\n min-width: auto;\n\n .ff-options {\n max-width: 320px;\n }\n\n button.ff-button {\n border: 1px solid #c7d2fe; // indigo-300 to match other buttons\n border-radius: 5px;\n padding: 0.25rem 0.50rem;\n background: $ff-white;\n color: #1f2937; // gray-800, explicit dark text\n font-size: 0.875rem;\n\n .icon {\n svg {\n color: inherit;\n width: 1.25rem;\n height: 1.25rem;\n }\n }\n\n &:hover:not(:disabled) {\n background-color: #f9fafb; // gray-50\n }\n\n &:focus,\n &.active {\n outline: none;\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n }\n\n &[data-headlessui-state=\"open\"] {\n button.ff-button,\n button.ff-button:hover {\n background: $ff-indigo-600;\n border-color: $ff-indigo-600;\n color: $ff-white;\n\n .icon {\n svg {\n color: $ff-white;\n }\n }\n }\n }\n }\n}\n\n.tool-count-badge {\n background-color: #e0e7ff; // indigo-100\n color: #4338ca; // indigo-700\n font-size: 0.75rem;\n font-weight: 500;\n padding: 0.125rem 0.5rem;\n border-radius: 9999px;\n min-width: 1.5rem;\n text-align: center;\n flex-shrink: 0;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.context-selector {\n .ff-listbox {\n min-width: auto;\n\n .ff-options {\n max-width: 320px;\n }\n\n button.ff-button {\n border: 1px solid #c7d2fe; // indigo-300 to match other buttons\n border-radius: 5px;\n padding: 0.25rem 0.50rem;\n background: $ff-white;\n color: #1f2937; // gray-800, explicit dark text\n font-size: 0.875rem;\n\n .icon {\n svg {\n color: inherit;\n width: 1.25rem;\n height: 1.25rem;\n }\n }\n\n &:hover:not(:disabled) {\n background-color: #f9fafb; // gray-50\n }\n\n &:focus:not(:disabled) {\n outline: none;\n background-color: #e0e7ff; // indigo-100\n color: #4338ca; // indigo-700\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n }\n\n &[data-headlessui-state=\"open\"] {\n button.ff-button,\n button.ff-button:hover {\n background: $ff-indigo-600;\n border-color: $ff-indigo-600;\n color: $ff-white;\n\n .icon {\n svg {\n color: $ff-white;\n }\n }\n }\n }\n }\n}\n\n.context-selector.active .relative button {\n background-color: #e0e7ff; // indigo-100\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.selection-button {\n border: 1px solid $ff-grey-200;\n border-radius: 5px;\n background: $ff-grey-50;\n display: flex;\n gap: 5px;\n align-items: center;\n cursor: pointer;\n transition: 0.3s ease-in-out;\n white-space: nowrap;\n\n &.active {\n background: $ff-indigo-100;\n border: 1px solid $ff-indigo-300;\n\n .separator {\n background: $ff-indigo-300;\n }\n }\n\n .icon-wrapper {\n display: flex;\n align-items: center;\n margin-right: 5px;\n }\n\n .separator {\n width: 1px;\n align-self: stretch;\n background: $ff-yellow-100;\n }\n\n .text {\n padding: 0.25rem 0.50rem 0.25rem 0.25rem;\n\n font-size: $ff-funit-sm;\n display: flex;\n gap: 2px;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.flow-selection-button {\n .text {\n .counter {\n color: $ff-grey-500;\n margin-left: 4px;\n font-size: $ff-funit-xs;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.flow-selection-button {\n .text {\n .counter {\n color: $ff-grey-500;\n margin-left: 4px;\n font-size: $ff-funit-xs;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-expert-input {\n display: flex;\n flex-direction: column;\n gap: 0;\n padding: 1rem; // p-4\n border-top: 1px solid #E5E7EB; // border-gray-200\n background: white;\n flex-shrink: 0; // Prevent input area from shrinking\n position: relative;\n min-height: 180px;\n max-height: 40vh;\n}\n\n.action-buttons {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n}\n\n.right-buttons {\n display: flex;\n gap: 0.5rem;\n}\n\nbutton {\n padding: 0.5rem 0.75rem; // py-2 px-3\n border-radius: 9999px; // rounded-full\n font-size: 0.875rem; // text-sm\n cursor: pointer;\n transition: colors 0.2s ease;\n border: 1px solid transparent;\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n.btn-start-over {\n background-color: white;\n color: inherit;\n border-color: #C7D2FE; // indigo-300\n padding: 0.25rem 0.50rem;\n border-radius: 5px;\n\n &:hover:not(:disabled) {\n background-color: #F9FAFB; // gray-50\n }\n}\n\n.btn-send {\n background-color: $ff-indigo-600;\n color: white;\n border-color: $ff-indigo-600;\n border-radius: 5px;\n padding: 0.25rem 0.50rem;\n\n &:hover:not(:disabled) {\n background-color: $ff-indigo-700;\n }\n}\n\n.btn-stop {\n background-color: white;\n color: inherit;\n border-color: #C7D2FE; // indigo-300\n display: flex;\n align-items: center;\n gap: 0.5rem;\n border-radius: 5px;\n padding: 0.25rem 0.50rem;\n\n &::before {\n content: '';\n width: 0.75rem; // w-3\n height: 0.75rem; // h-3\n background-color: #1F2937; // gray-800\n border-radius: 0.125rem; // rounded-sm\n }\n\n &:hover {\n background-color: #F9FAFB; // gray-50\n }\n}\n\n.input-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n border: 2px solid #D1D5DB; // border-2 border-gray-300\n border-radius: 0.5rem; // rounded-lg\n transition: border-color 0.2s ease;\n\n &.focused {\n border-color: $ff-indigo-500;\n }\n\n .chat-input {\n flex: 1;\n width: 100%;\n padding: 1rem; // p-4\n box-sizing: border-box;\n overflow-y: auto;\n border: none;\n outline: none;\n font-size: 0.875rem; // text-sm\n line-height: 1.5;\n color: #111827; // text-gray-900\n resize: none;\n font-family: inherit;\n background: white;\n\n &:focus {\n outline: none;\n }\n\n &:disabled {\n cursor: not-allowed;\n background-color: #F9FAFB; // bg-gray-50\n color: #6B7280; // text-gray-500\n }\n\n &::placeholder {\n color: #9CA3AF; // placeholder gray\n }\n }\n\n .actions {\n padding: .5rem;\n display: flex;\n justify-content: space-between;\n gap: 0.75rem;\n\n .left {\n display: flex;\n justify-content: flex-start;\n\n // scroll for overflow of selected chips\n overflow: auto;\n flex: 1;\n .context-items-container {\n flex: 1;\n overflow-x: auto;\n scrollbar-width: none;\n display: flex;\n gap: 0.5rem;\n }\n }\n\n .right {\n display: flex;\n justify-content: flex-end;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-expert-message {\n display: flex;\n width: 100%;\n margin-bottom: 1rem;\n\n &.message-human {\n justify-content: flex-end;\n\n .message-bubble {\n background-color: $ff-indigo-600;\n color: white;\n border-radius: 0.5rem;\n border-bottom-right-radius: 0.125rem;\n }\n }\n\n &.message-ai {\n justify-content: flex-start;\n\n .message-bubble {\n background-color: $ff-grey-100;\n color: #1F2937; // gray-800\n border-radius: 0.5rem;\n border-bottom-left-radius: 0.125rem;\n }\n\n .issues, .suggestions {\n margin-top: 1.25rem;\n h4 {\n font-weight: bold;\n display: flex;\n align-items: center;\n gap: 5px;\n color: $ff-grey-600;\n\n .ff-icon {\n color: $ff-grey-500;\n }\n }\n\n ul {\n list-style: disc;\n padding-left: 1.4rem;\n\n li {\n margin-top: .5rem;\n }\n }\n }\n }\n\n &.message-system {\n justify-content: center;\n\n .message-bubble {\n background-color: #FEF3C7; // amber-100\n color: #92400E; // amber-900\n border-radius: 0.5rem;\n text-align: left;\n max-width: 100%;\n width: 100%;\n }\n\n .message-text {\n font-size: 0.875rem;\n line-height: 1.5;\n }\n\n &.system-expired .message-bubble {\n background-color: #FEE2E2; // red-100\n color: #991B1B; // red-900\n }\n }\n\n}\n\n.message-bubble {\n max-width: 90%; // Always leave a gap on the side\n padding: 0.5rem 1rem; // py-2 px-4\n word-wrap: break-word;\n overflow-wrap: break-word;\n\n &.rich-guide-bubble {\n padding: 1rem; // py-4 px-4\n }\n}\n\n.message-text {\n font-size: 1rem;\n line-height: 1.5;\n\n :deep(p) {\n margin: 0 0 0.5rem 0;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n :deep(ul), :deep(ol) {\n margin: 0.5rem 0;\n padding-left: 1.5rem;\n list-style: square;\n }\n\n :deep(li) {\n margin: 0.25rem 0;\n }\n\n :deep(code) {\n background-color: rgba(0, 0, 0, 0.05);\n padding: 0.125rem 0.25rem;\n border-radius: 0.25rem;\n font-family: monospace;\n font-size: 0.875em;\n }\n\n :deep(pre) {\n background-color: rgba(0, 0, 0, 0.05);\n padding: 0.75rem;\n border-radius: 0.5rem;\n overflow-x: auto;\n margin: 0.5rem 0;\n\n code {\n background-color: transparent;\n padding: 0;\n }\n }\n\n :deep(a) {\n color: $ff-indigo-600;\n text-decoration: underline;\n\n &:hover {\n color: $ff-indigo-700;\n }\n }\n\n :deep(strong) {\n font-weight: 600;\n }\n\n :deep(em) {\n font-style: italic;\n }\n}\n\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-expert-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.75rem;\n padding: 1rem;\n}\n\n.loading-dots {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n}\n\n.loading-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: $ff-indigo-500;\n animation: bounce-dot 1.4s infinite ease-in-out both;\n\n &:nth-child(1) {\n animation-delay: -0.32s;\n }\n\n &:nth-child(2) {\n animation-delay: -0.16s;\n }\n}\n\n@keyframes bounce-dot {\n 0%, 80%, 100% {\n transform: scale(0.7);\n opacity: 0.5;\n }\n 40% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n.loading-message {\n font-size: 0.875rem;\n color: $ff-grey-600;\n font-style: italic;\n animation: fade-in 0.3s ease-in;\n}\n\n@keyframes fade-in {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.package-card {\n position: relative;\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n padding: 0.75rem;\n background-color: white;\n border: 1px solid $ff-grey-200;\n border-radius: 0.5rem;\n text-decoration: none;\n color: $ff-grey-900;\n transition: all 0.2s ease;\n\n &:hover {\n border-color: $ff-indigo-300;\n background-color: $ff-grey-50;\n }\n}\n\n.package-favicon {\n flex-shrink: 0;\n width: 1rem;\n height: 1rem;\n margin-top: 0.125rem;\n vertical-align: middle;\n margin-right: 0.5rem;\n}\n\n.package-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n.package-actions {\n position: absolute;\n top: 8px;\n right: 8px;\n}\n\n.package-name {\n padding-right: 3rem;\n font-size: 0.875rem;\n font-weight: 500;\n font-family: monospace;\n color: $ff-grey-900;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.package-url {\n font-size: 0.75rem;\n color: $ff-grey-500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin: 0;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.resource-card {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n padding: 0.75rem;\n background-color: white;\n border: 1px solid $ff-grey-200;\n border-radius: 0.5rem;\n text-decoration: none;\n color: $ff-grey-900;\n transition: all 0.2s ease;\n\n &:hover {\n border-color: $ff-indigo-300;\n background-color: $ff-grey-50;\n }\n}\n\n.resource-icon {\n flex-shrink: 0;\n width: 1rem;\n height: 1rem;\n margin-top: 0.125rem;\n object-fit: contain;\n}\n\n.resource-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n min-width: 0;\n}\n\n.resource-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: $ff-grey-900;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.resource-url {\n font-size: 0.75rem;\n color: $ff-grey-500;\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-expert-rich-guide {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n\n.guide-badge {\n display: inline-flex;\n align-self: flex-start;\n margin-bottom: 0.75rem; // mb-3\n\n span {\n display: inline-block;\n padding: 0.5rem 0.75rem; // py-2 px-3\n background-color: $ff-indigo-100;\n color: $ff-indigo-700;\n font-size: 0.875rem; // text-sm\n border-radius: 9999px; // rounded-full\n }\n}\n\n.guide-header {\n .guide-title {\n font-size: 1.125rem; // text-lg\n font-weight: 600; // font-semibold\n color: #111827; // text-gray-900\n margin: 0 0 0.5rem 0; // mb-2\n }\n\n .guide-summary {\n color: #374151; // text-gray-700\n margin: 0 0 1rem 0; // mb-4\n line-height: 1.625;\n }\n}\n\n.section-title {\n font-size: 1rem; // text-base\n font-weight: 500; // font-medium\n color: #111827; // text-gray-900\n margin: 0 0 0.75rem 0; // mb-3\n}\n\n.guide-steps {\n margin-bottom: 1rem; // mb-4\n\n .steps-list {\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 0.75rem; // space-y-3\n }\n\n .step-item {\n display: flex;\n align-items: flex-start;\n }\n\n .step-number {\n flex-shrink: 0;\n width: 1.5rem; // w-6\n height: 1.5rem; // h-6\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: $ff-indigo-600;\n color: white;\n font-size: 0.875rem; // text-sm\n border-radius: 50%; // rounded-full\n margin-right: 0.75rem; // mr-3\n margin-top: 0.125rem; // mt-0.5\n }\n\n .step-content {\n flex: 1;\n\n .step-title {\n font-size: 1rem;\n font-weight: 500;\n color: $ff-grey-900;\n margin: 0 0 0.25rem 0;\n }\n\n .step-detail {\n font-size: 0.875rem;\n color: $ff-grey-600;\n margin: 0.25rem 0 0 0;\n line-height: 1.5;\n }\n }\n}\n\n.guide-packages {\n .packages-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 0.5rem;\n }\n}\n\n.guide-resources {\n .resources-grid {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n}\n\n.guide-flows {\n .resources-grid {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-expert-rich-resources {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.resources-header {\n margin-bottom: 1rem;\n\n .resources-title {\n font-size: 1.125rem; // text-lg\n font-weight: 600; // font-semibold\n color: #111827; // text-gray-900\n margin: 0 0 0.5rem 0; // mb-2\n line-height: 1.3;\n }\n\n .resources-content {\n color: #374151; // text-gray-700\n margin: 0;\n line-height: 1.5;\n font-size: 1rem;\n }\n}\n\n.section-title {\n font-size: 1rem; // text-base\n font-weight: 500; // font-medium\n color: #111827; // text-gray-900\n margin: 0.5rem 0 0.75rem 0; // mt-2 mb-3\n}\n\n.resources-list {\n .resources-grid {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .resource-card {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n padding: 0.75rem;\n background-color: white;\n border: 1px solid $ff-grey-200;\n border-radius: 0.5rem;\n text-decoration: none;\n color: $ff-grey-900;\n transition: all 0.2s ease;\n\n &:hover {\n border-color: $ff-indigo-300;\n background-color: $ff-grey-50;\n }\n }\n\n .resource-icon {\n flex-shrink: 0;\n width: 1rem;\n height: 1rem;\n margin-top: 0.125rem;\n object-fit: contain;\n }\n\n .resource-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n min-width: 0;\n }\n\n .resource-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: $ff-grey-900;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .resource-url {\n font-size: 0.75rem;\n color: $ff-grey-500;\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n}\n","pre code.hljs {\n display: block;\n overflow-x: auto;\n padding: 1em\n}\ncode.hljs {\n padding: 3px 5px\n}\n/*!\n Theme: GitHub\n Description: Light theme as seen on github.com\n Author: github.com\n Maintainer: @Hirse\n Updated: 2021-05-15\n\n Outdated base version: https://github.com/primer/github-syntax-light\n Current colors taken from GitHub's CSS\n*/\n.hljs {\n color: #24292e;\n background: #ffffff\n}\n.hljs-doctag,\n.hljs-keyword,\n.hljs-meta .hljs-keyword,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-type,\n.hljs-variable.language_ {\n /* prettylights-syntax-keyword */\n color: #d73a49\n}\n.hljs-title,\n.hljs-title.class_,\n.hljs-title.class_.inherited__,\n.hljs-title.function_ {\n /* prettylights-syntax-entity */\n color: #6f42c1\n}\n.hljs-attr,\n.hljs-attribute,\n.hljs-literal,\n.hljs-meta,\n.hljs-number,\n.hljs-operator,\n.hljs-variable,\n.hljs-selector-attr,\n.hljs-selector-class,\n.hljs-selector-id {\n /* prettylights-syntax-constant */\n color: #005cc5\n}\n.hljs-regexp,\n.hljs-string,\n.hljs-meta .hljs-string {\n /* prettylights-syntax-string */\n color: #032f62\n}\n.hljs-built_in,\n.hljs-symbol {\n /* prettylights-syntax-variable */\n color: #e36209\n}\n.hljs-comment,\n.hljs-code,\n.hljs-formula {\n /* prettylights-syntax-comment */\n color: #6a737d\n}\n.hljs-name,\n.hljs-quote,\n.hljs-selector-tag,\n.hljs-selector-pseudo {\n /* prettylights-syntax-entity-tag */\n color: #22863a\n}\n.hljs-subst {\n /* prettylights-syntax-storage-modifier-import */\n color: #24292e\n}\n.hljs-section {\n /* prettylights-syntax-markup-heading */\n color: #005cc5;\n font-weight: bold\n}\n.hljs-bullet {\n /* prettylights-syntax-markup-list */\n color: #735c0f\n}\n.hljs-emphasis {\n /* prettylights-syntax-markup-italic */\n color: #24292e;\n font-style: italic\n}\n.hljs-strong {\n /* prettylights-syntax-markup-bold */\n color: #24292e;\n font-weight: bold\n}\n.hljs-addition {\n /* prettylights-syntax-markup-inserted */\n color: #22863a;\n background-color: #f0fff4\n}\n.hljs-deletion {\n /* prettylights-syntax-markup-deleted */\n color: #b31d28;\n background-color: #ffeef0\n}\n.hljs-char.escape_,\n.hljs-link,\n.hljs-params,\n.hljs-property,\n.hljs-punctuation,\n.hljs-tag {\n /* purposely ignored */\n \n}","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n@import 'highlight.js/styles/github.css';\n\n.ff-expert-tool-call {\n background-color: $ff-grey-50;\n border: 1px solid $ff-grey-200;\n border-radius: 0.5rem 0.5rem 0.5rem 0;\n overflow: hidden;\n max-width: 90%;\n}\n\n.ff-expert-tool-call--header {\n display: flex;\n align-items: center;\n padding: 0.75rem 1rem;\n gap: 0.5rem;\n background-color: white;\n cursor: pointer;\n user-select: none;\n\n &:hover {\n background-color: $ff-grey-50;\n }\n\n .ff-icon {\n width: 1rem;\n height: 1rem;\n color: $ff-grey-500;\n flex-shrink: 0;\n transition: transform 0.2s ease;\n\n &.rotated {\n transform: rotate(90deg);\n }\n }\n}\n\n.ff-expert-tool-call--count {\n font-size: 1rem;\n font-weight: 500;\n color: $ff-grey-800;\n flex: 1;\n}\n\n.ff-expert-tool-call--duration {\n font-size: 1rem;\n color: $ff-grey-500;\n}\n\n.ff-expert-tool-call--body {\n border-top: 1px solid $ff-grey-200;\n padding: 0.75rem 1rem;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.ff-expert-tool-call--item {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.ff-expert-tool-call--title {\n font-size: 0.875rem;\n font-weight: 600;\n color: $ff-grey-800;\n}\n\n.ff-expert-tool-call--name {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n font-size: 0.75rem;\n color: $ff-grey-500;\n font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;\n}\n\n.ff-expert-tool-call--badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 1.25rem;\n height: 1.125rem;\n padding: 0 0.25rem;\n font-size: 0.5625rem;\n font-weight: 700;\n color: $ff-grey-600;\n background-color: $ff-grey-200;\n border-radius: 0.1875rem;\n flex-shrink: 0;\n cursor: help;\n}\n\n.ff-expert-tool-call--details {\n margin-top: 0.5rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.ff-expert-tool-call--section {\n border: 1px solid $ff-grey-200;\n border-radius: 0.375rem;\n overflow: hidden;\n}\n\n.ff-expert-tool-call--section-header {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.5rem 0.75rem;\n background-color: white;\n cursor: pointer;\n user-select: none;\n font-size: 0.75rem;\n font-weight: 500;\n color: $ff-grey-600;\n\n &:hover {\n background-color: $ff-grey-50;\n }\n\n .ff-icon-small {\n width: 0.75rem;\n height: 0.75rem;\n color: $ff-grey-400;\n flex-shrink: 0;\n transition: transform 0.2s ease;\n\n &.rotated {\n transform: rotate(90deg);\n }\n }\n}\n\n.ff-expert-tool-call--section-label {\n flex: 1;\n}\n\n.ff-expert-tool-call--section-duration {\n color: $ff-grey-400;\n font-weight: 400;\n}\n\n.ff-expert-tool-call--code {\n pre {\n margin: 0;\n padding: 0.75rem;\n background-color: $ff-grey-100;\n border-radius: 0.375rem;\n overflow-x: auto;\n\n code {\n font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;\n font-size: 0.8125rem;\n color: $ff-grey-800;\n white-space: pre-wrap;\n word-break: break-word;\n border: none;\n background: transparent;\n padding: 0;\n }\n }\n\n // When inside a section, remove border-radius top and add border\n .ff-expert-tool-call--section & {\n border-top: 1px solid $ff-grey-200;\n\n pre {\n border-radius: 0;\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.update-banner {\n background-color: #eef2ff; // indigo-100\n margin-bottom: 0rem;\n border-radius: 0;\n padding: 0.5rem 1rem;\n border-top: 1px solid #E5E7EB;\n\n .update-banner-text {\n color: #4338ca; // indigo-700\n font-size: 0.875rem;\n margin: 0;\n line-height: 1.5;\n }\n\n .update-banner-header {\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .update-banner-body {\n max-height: 0;\n overflow: hidden;\n visibility: hidden;\n transition: max-height 0.6s ease-in-out, visibility 0.6s ease-in-out;\n transition-delay: 250ms; // avoid showing immediately (minimise false expansion on mousing around the chat)\n }\n\n .update-banner-badge {\n display: inline-block;\n background-color: #818cf8; // indigo-400\n color: white;\n font-weight: 600;\n border-radius: 0.25rem;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n cursor: default;\n vertical-align: text-top;\n padding: 0.125rem 0.5rem;\n font-size: 0.75rem;\n }\n\n &.warning {\n .update-banner-badge {\n background-color: $ff-red-700;\n color: $ff-grey-50;\n }\n }\n\n &:hover .update-banner-body,\n &:focus-within .update-banner-body,\n &:active .update-banner-body {\n max-height: 500px;\n visibility: visible;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-expert {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: white;\n overflow: hidden; // Prevent this container from scrolling\n position: relative;\n}\n\n.messages-container {\n flex: 1;\n overflow-y: auto;\n padding: 1rem; // p-4\n scroll-behavior: smooth;\n min-height: 0; // Important for flex child overflow\n\n // Custom scrollbar styling\n &::-webkit-scrollbar {\n width: 8px;\n }\n\n &::-webkit-scrollbar-track {\n background: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: $ff-grey-300;\n border-radius: 4px;\n\n &:hover {\n background-color: $ff-grey-400;\n }\n }\n}\n\n.info-banner {\n background-color: #eef2ff; // indigo-100\n border-radius: 0.5rem;\n margin-bottom: 1.5rem;\n padding: 0.75rem 1rem;\n\n .info-text {\n color: #4338ca; // indigo-700\n font-size: 0.875rem;\n margin: 0;\n line-height: 1.5;\n }\n\n .info-link {\n color: inherit;\n text-decoration: underline;\n\n &:hover {\n color: #3730a3; // indigo-800\n }\n }\n\n .beta-badge {\n display: inline-block;\n background-color: #818cf8; // indigo-400\n color: white;\n font-size: 0.625rem;\n font-weight: 600;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n cursor: help;\n vertical-align: text-top;\n }\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 2rem;\n color: $ff-grey-600;\n\n .empty-state-icon {\n width: 4rem;\n height: 4rem;\n margin-bottom: 1rem;\n color: $ff-indigo-400;\n\n svg {\n width: 100%;\n height: 100%;\n }\n }\n\n h3 {\n font-size: 1.5rem;\n font-weight: 600;\n color: $ff-grey-900;\n margin: 0 0 0.5rem 0;\n }\n\n p {\n font-size: 1rem;\n margin: 0;\n max-width: 400px;\n }\n}\n\n.message-wrapper {\n margin-bottom: 0.5rem;\n}\n\n.scroll-anchor {\n height: 1px;\n}\n\n.mode-switcher-floating {\n position: absolute;\n top: 1rem;\n left: 50%;\n transform: translateX(-50%);\n z-index: 1;\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n.messages-container.has-mode-switcher {\n padding-top: 4rem; // Extra padding to account for floating mode switcher\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-expert-drawer {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden; // Prevent drawer from scrolling\n\n &:focus {\n outline: none;\n }\n\n .header {\n padding: 1rem 1.5rem;\n background: linear-gradient(white, white) padding-box,\n linear-gradient(90deg, $ff-red-600, #5048e5, $ff-red-600, #5048e5, $ff-red-600) border-box;\n border: none;\n border-bottom: 1px solid transparent;\n background-size: 200% 100%;\n animation: gradient-flow-lr 4s linear infinite;\n flex-shrink: 0; // Prevent header from shrinking\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n // Logo + Expert title on left\n > .flex:first-child {\n flex: 1;\n justify-content: flex-start;\n }\n\n // Mode selector in center\n .agent-mode {\n flex: 0 0 auto;\n\n :deep(.ff-btn) {\n min-width: 5.5rem;\n justify-content: center;\n }\n }\n\n // Actions on right\n .header-actions {\n flex: 1;\n justify-content: flex-end;\n }\n\n .flex {\n display: flex;\n\n &.items-center {\n align-items: center;\n }\n\n &.gap-1 {\n gap: 0.25rem; // gap-1\n }\n }\n\n .title {\n font-size: 1rem;\n font-weight: 700; // font-bold\n line-height: 20px;\n color: #1f2937; // text-gray-800\n margin: 0;\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n\n .header-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n padding: 0;\n background: none;\n border: none;\n border-radius: 5px;\n cursor: pointer;\n color: inherit;\n font: inherit;\n transition: background-color 0.15s ease;\n\n &:hover {\n cursor: pointer;\n background: $ff-grey-100;\n }\n\n &:focus-visible {\n outline: 2px solid $ff-indigo-700;\n outline-offset: 1px;\n }\n\n &.pin-button.is-pinned {\n background: $ff-indigo-800;\n color: white;\n\n &:hover {\n background: $ff-indigo-900;\n }\n }\n }\n }\n }\n\n // Ensure ExpertPanel fills remaining space\n > * {\n &:not(.header) {\n flex: 1;\n min-height: 0; // Important for flex child overflow\n }\n }\n}\n\n@keyframes gradient-flow-lr {\n 0% {\n background-position: 0% 0%;\n }\n 100% {\n background-position: 100% 0%;\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n.shepherd-theme-ff {\n &.shepherd-has-title[data-popper-placement^=bottom]>.shepherd-arrow:before {\n background-color: $ff-grey-800;\n }\n .shepherd-content {\n .shepherd-header {\n background-color: $ff-grey-800;\n padding: 0.5rem 1rem;\n line-height: 2rem;\n }\n .shepherd-title {\n color: white;\n font-weight: 500;\n }\n .shepherd-cancel-icon {\n color: $ff-white;\n }\n .shepherd-text {\n padding: 1rem;\n p {\n margin-bottom: 0.75rem;\n }\n }\n }\n .shepherd-footer {\n display: flex;\n gap: 0;\n padding: 0;\n border-top: 1px solid $ff-grey-300;\n .shepherd-button {\n flex-grow: 1;\n border-radius: 0;\n background-color: white;\n font-weight: 500;\n padding: 0.5rem 1rem;\n line-height: 2rem;\n font-weight: bold;\n margin: 0;\n }\n .shepherd-button:last-child {\n background-color: $ff-blue-900;\n &:hover {\n background-color: $ff-indigo-800;\n }\n }\n }\n &.shepherd-hidden {\n display: none\n }\n}\n\n.shepherd-modal-overlay-container.shepherd-modal-is-visible path {\n transition: 0.3s all;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.notifications-button-wrapper {\n\n .notifications-button {\n color: $ff-grey-800;\n display: flex;\n align-items: center;\n flex: 1;\n justify-content: center;\n width: 100%;\n height: 100%;\n padding: 18px;\n position: relative;\n\n > * {\n pointer-events: none;\n }\n\n svg {\n flex: 1;\n width: 24px;\n height: 24px;\n transition: ease-in-out .1s;\n object-fit: contain;\n }\n\n &:hover {\n svg {\n will-change: transform ;\n color: $ff-indigo-600;\n transform: scale(1.25) translateZ(0); /* Using slight adjustments to whole values */\n backface-visibility: hidden;\n perspective: 1000px;\n stroke-width: 1.5px;\n shape-rendering: geometricPrecision;\n text-rendering: geometricPrecision;\n }\n }\n\n .ff-notification-pill {\n bottom: 10px;\n right: 5px;\n position: absolute;\n font-size: 0.65rem;\n padding: 0 7px;\n background-color: $ff-red-500;\n }\n }\n}\n"," .ff-dropdown-option-list {\n max-height: 200px;\n overflow-y: auto;\n}\n\n.ff-dropdown-option-list::-webkit-scrollbar {\n width: 8px;\n background-color: $ff-grey-600;\n}\n\n.ff-dropdown-option-list::-webkit-scrollbar-thumb {\n background-color: $ff-grey-300;\n}\n\n.ff-dropdown-option-list::-webkit-scrollbar-thumb:hover {\n background-color: $ff-grey-400;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n@import \"../stylesheets/components/team-list.scss\";\n\n.ff-team-selection {\n &.ff-listbox {\n button {\n border-radius: 0;\n border: none;\n background: none;\n\n button {\n padding: 0;\n\n }\n .icon {\n svg {\n color: $ff-grey-800;\n width: 80%;\n padding-left: 10px;\n }\n }\n }\n }\n}\n.ff-options .ff-team-selection-option {\n border-color: $ff-color--border;\n color: $ff-grey-800;\n border-bottom: 1px solid $ff-color--border;\n display: flex;\n align-items: center;\n\n .ff-option-content {\n padding: 12px 12px 12px 18px;\n display: flex;\n align-items: center;\n gap: 15px;\n width: 100%;\n\n &.selected {\n background: $ff-grey-200;\n }\n\n .ff-icon {\n width: 1.25rem;\n height: 1.25rem;\n }\n }\n}\n\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.section {\n margin-bottom: 15px;\n\n & > .title {\n position: relative;\n margin-bottom: 5px;\n display: flex;\n align-items: self-end;\n gap: 5px;\n\n .icon {\n color: $ff-indigo-700;\n }\n\n .counter {\n opacity: .6;\n font-size: 90%;\n }\n\n &:after {\n height: 2px;\n background: $ff-grey-200;\n content: '';\n flex: 1;\n align-self: center;\n }\n\n .text {\n &:focus {\n outline: 2px solid $ff-indigo-700;\n outline-offset: 2px;\n }\n }\n }\n\n .results {\n .result-wrapper {\n transition: ease-in-out .3s;\n padding: 2px 10px;\n border-radius: 5px;\n max-height: 90vh;\n overflow: auto;\n\n .result {\n display: flex;\n gap: 10px;\n align-items: center;\n line-height: 25px;\n\n .icon {}\n .title {}\n .details {\n flex: 1;\n opacity: .4;\n font-size: 90%;\n }\n .actions {\n display: flex;\n gap: 5px;\n }\n\n &:focus {\n background: $ff-indigo-50;\n border: none;\n outline: none;\n }\n }\n\n &:hover {\n background: $ff-indigo-50;\n }\n\n &.show-more {\n text-align: center;\n margin: 3px 0;\n\n a {\n padding: 5px 0;\n width: 100%;\n display: block;\n opacity: .6;\n\n &:focus {\n background: $ff-indigo-50;\n border: none;\n outline: none;\n }\n }\n }\n }\n }\n\n &:last-of-type {\n margin-bottom: 0;\n }\n}\n\n@media screen and (max-width: 480px) {\n .section {\n .results {\n .result-wrapper {\n .result {\n .actions {\n display: none;\n background: red;\n }\n }\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#global-search {\n .input-trigger {\n display: block;\n height: 34px;\n }\n .icon-trigger {\n display: none;\n cursor: pointer;\n padding: 5px;\n transition: ease-in-out .1s;\n object-fit: contain;\n }\n .ff-icon-sm.search {\n display: none;\n }\n\n &.focused {\n .input-trigger, .icon-trigger {\n display: none;\n }\n\n .ff-icon-sm.search {\n display: inline;\n }\n }\n\n}\n@media screen and (max-width: 1023px) {\n #global-search {\n .input-trigger {\n display: none;\n }\n .icon-trigger {\n display: inline-block;\n align-self: flex-end;\n\n &:hover {\n will-change: transform ;\n transform: scale(1.25) translateZ(0); /* Using slight adjustments to whole values */\n backface-visibility: hidden;\n perspective: 1000px;\n stroke-width: 1.5px;\n shape-rendering: geometricPrecision;\n text-rendering: geometricPrecision;\n color: $ff-indigo-500;\n }\n }\n }\n}\n\n//@media screen and (max-width: 639px) {\n// #global-search {\n// .content-wrapper {\n// .search-wrapper {\n// .input-wrapper {\n// flex-direction: row\n// }\n// }\n// }\n// }\n//}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#global-search {\n padding: 0;\n display: flex;\n flex: 1;\n justify-content: flex-end;\n max-width: 100%;\n\n .content-wrapper {\n position: relative;\n justify-content: flex-end;\n display: flex;\n flex-direction: column;\n gap: 10px;\n width: 100%;\n\n .search-wrapper {\n display: flex;\n gap: 5px;\n align-items: center;\n width: 100%;\n\n .mobile-search {\n display: none;\n cursor: pointer;\n color: $ff-white;\n min-width: 20px;\n min-height: 20px;\n }\n\n .close-button {\n display: none;\n }\n\n .input-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n position: relative;\n width: 100%;\n\n .ff-icon-sm.close,\n .ff-icon-sm.search {\n color: $ff-grey-400;\n position: absolute;\n z-index: 1;\n top: 8px;\n\n &.search {\n left: 7px;\n }\n\n &.close {\n right: 7px;\n }\n }\n\n input {\n color: transparent;\n padding: 6px 27px;\n background: $ff-grey-50;\n border-color: $ff-color--border;\n width: 100%;\n line-height: 20px;\n height: 34px;\n box-sizing: border-box;\n\n &.overlay-input {\n display: none;\n }\n }\n }\n }\n\n .results-wrapper {\n background: $ff-white;\n min-width: 100%;\n z-index: 120;\n padding: 5px 5px 15px 5px;\n\n .result-badge {\n padding: 0 5px;\n width: 50px;\n max-height: 25px;\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 5px;\n border: 1px solid $ff-indigo-700;\n color: $ff-indigo-700;\n border-radius: 5px;\n background: $ff-white;\n }\n }\n }\n\n &.focused {\n .content-wrapper {\n position: fixed;\n width: 60vw;\n background: white;\n top: 15px;\n left: 20vw;\n z-index: 120;\n border: none;\n border-radius: 5px;\n\n .search-wrapper {\n .input-wrapper {\n .ff-icon-sm.search,\n .ff-icon-sm.close {\n color: $ff-grey-500;\n }\n\n input {\n color: $ff-grey-500;\n flex: 1;\n background: white;\n display: none;\n width: 100%;\n\n &.overlay-input {\n display: block;\n transition: ease-in-out .3s;\n height: 34px;\n line-height: 20px;\n padding: 6px 27px;\n box-sizing: border-box;\n\n &.has-results {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n }\n }\n }\n\n .results-wrapper {\n overflow: auto;\n max-height: 90vh;\n\n .ff-icon-sm {\n min-width: 16px;\n }\n }\n }\n\n .overlay {\n position: absolute;\n width: 100vw;\n height: 100vh;\n background: rgba(0, 0, 0, .3);\n left: 0;\n top: 0;\n z-index: 110;\n }\n }\n\n}\n\n@media screen and (max-width: 1023px) {\n #global-search {\n padding: 0px;\n input.qwe {\n background: red !important;\n }\n &.focused {\n .content-wrapper {\n width: 100%;\n top: 0;\n left: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n\n .search-wrapper {\n margin: 5px;\n padding-right: 10px;\n .close-button {\n display: block;\n }\n\n }\n }\n }\n }\n}\n@media screen and (max-width: 639px) {\n #global-search {\n .content-wrapper {\n padding: 5px 0;\n\n .search-wrapper {\n .mobile-search {\n display: block;\n }\n\n .close,\n .search,\n input {\n display: none;\n }\n\n input {\n &.has-results {\n border-bottom-left-radius: 5px !important;\n border-bottom-right-radius: 5px !important;\n }\n }\n\n }\n }\n\n &.focused {\n .content-wrapper {\n padding: 10px;\n .mobile-search {\n display: none;\n }\n\n .search-wrapper {\n .close,\n .search,\n input {\n display: block;\n }\n }\n }\n }\n }\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity .1s ease-in;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n#right-drawer {\n position: fixed;\n border-left: 1px solid $ff-grey-300;\n background: $ff-grey-50;\n height: calc(100% - 60px);\n top: 60px;\n right: -1000px;\n z-index: 110;\n width: 100%;\n max-width: 0;\n min-width: 0;\n transition: right .3s ease-in-out, width .3s ease-in-out, max-width .3s ease-in-out, min-width .3s ease-in-out, box-shadow .3s ease-in-out, border-color .3s ease-in-out;\n box-shadow: -5px 4px 8px -4px rgba(0, 0, 0, 0.1);\n display: flex;\n flex-direction: column;\n overflow: hidden; // Changed from auto to hidden - let child components handle their own scrolling\n\n // Hide border when closed to prevent visible grey line\n &:not(.open) {\n border-left-color: transparent;\n }\n\n // Hide border on small viewports where drawer is full-width\n @media (max-width: 479px) {\n border-left: none;\n }\n\n .resize-bar {\n position: absolute;\n left: -4px; // Center on border (50% of 8px width)\n top: 0;\n bottom: 0;\n width: 8px;\n cursor: ew-resize;\n background: transparent;\n z-index: 1001;\n\n // Hide resize bar on small viewports where drawer is full-width\n @media (max-width: 479px) {\n display: none;\n }\n }\n\n .header {\n background: white;\n flex-shrink: 0;\n }\n\n &.open {\n right: 0;\n width: 100%;\n\n // On small viewports: use 100% width (no minimum)\n max-width: 100vw;\n min-width: 0;\n\n // On viewports 480-767px: use 480px minimum but no max-width constraint\n // (pinning is disabled, so let JS control the width)\n @media (min-width: 480px) and (max-width: 767px) {\n min-width: 480px;\n max-width: none;\n }\n\n // On viewports >= 768px: apply max-width constraints (pinning is enabled)\n @media (min-width: 768px) {\n max-width: 90vw;\n min-width: 480px;\n\n &.wider {\n max-width: 90vw;\n }\n }\n }\n\n &.fixed {\n position: relative; // Changed from initial to relative for resize bar positioning\n height: 100%;\n top: 0; // Reset top offset to prevent gap at top\n box-shadow: none; // Remove shadow when pinned\n flex-shrink: 0; // Prevent flex from shrinking the drawer below its set width\n min-width: unset; // Remove responsive min-width constraint\n max-width: none; // Remove responsive max-width constraint\n\n // Hide drawer when pinned but closed to prevent grey block\n &:not(.open) {\n width: 0 !important;\n min-width: 0 !important;\n max-width: 0 !important;\n overflow: hidden;\n opacity: 0;\n pointer-events: none;\n }\n }\n\n &.resizing {\n transition: none; // Disable transition while actively resizing for smooth dragging\n max-width: none !important; // Remove max-width constraint to allow free resizing\n min-width: unset !important; // Remove min-width constraint to allow free resizing\n }\n\n &.manually-resized {\n max-width: none !important; // Keep custom width after manual resize\n min-width: unset !important; // Keep custom width after manual resize\n }\n\n &.pinning {\n transition: none !important; // Disable all transitions while pinning to prevent visual jump\n }\n\n &.opening {\n // Only animate position during open, not width changes\n transition: right .3s ease-in-out, box-shadow .3s ease-in-out, border-color .3s ease-in-out !important;\n }\n\n &.closing {\n // Only animate position during close, not width changes\n transition: right .3s ease-in-out, box-shadow .3s ease-in-out, border-color .3s ease-in-out !important;\n\n // Maintain current width/max-width/min-width during slide-out to prevent shrinking animation\n // These will be overridden by inline styles from drawerStyle\n max-width: none !important;\n min-width: unset !important;\n }\n}\n",".ff-layout--box.ff-login {\n flex-direction: column;\n min-height: 660px;\n overflow: auto;\n\n .ff-layout--box--wrapper {\n max-width: 1048px;\n min-height: 660px;\n min-width: 400px;\n\n .ff-layout--box--right {\n padding: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n\n }\n .ff-layout--box--content {\n max-width: 380px;\n }\n }\n}\n","\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@import '../ui-components/stylesheets/ff-colors.scss';\n@import '../ui-components/stylesheets/ff-utility.scss';\n\n$sidenav_width: 250px;\n$transition_time: .15s;\n\n/*\n Layout - Box\n used in login/setup/signup screens\n*/\n\n$nav_height: 60px;\n\n.ff-layout--box {\n font-family: 'Heebo', system-ui, sans-serif;\n background-color: $ff-white;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n min-height: inherit;\n background-image: url(\"./images/ff-bg-flow.jpg\");\n background-size: cover;\n background-repeat: no-repeat;\n background-position-y: 0%;\n color: $ff-grey-700;\n .ff-error-inline {\n font-size: 0.875rem;;\n display: block;\n margin-top: 0.25rem;\n color: $ff-red-200;\n }\n\n &.ff--center-box {\n flex-direction: column;\n min-height: fit-content;\n overflow: auto;\n\n .ff-layout--box--wrapper {\n display: flex;\n width: 100%;\n max-height: fit-content;\n height: fit-content;\n\n .ff-layout--box--left,\n .ff-layout--box--right {\n width: 100%;\n }\n }\n }\n}\n\n.ff-layout--box--wrapper {\n width: calc(100% - 48px);\n height: 60%;\n display: grid;\n}\n.ff-layout--box--left {\n .ff-logo {\n max-width: 150px;\n margin-bottom: 16px;\n }\n}\n.ff-layout--box--right {\n .ff-logo {\n max-width: 200px;\n margin: auto;\n margin-bottom: 48px;\n }\n}\n\n.ff-layout--box--left,\n.ff-layout--box--right {\n height: 100%;\n justify-content: center;\n align-items: center;\n}\n\n.ff-layout--box--left {\n h1 {\n max-width: 420px;\n }\n h3 {\n font-size: 1.25rem;\n }\n p {\n font-weight: 300;\n line-height: 1.5rem;\n }\n}\n\n.ff-layout--box--content {\n width: 100%;\n}\n\n.ff-layout--box--right .ff-layout--box--content {\n min-height: 400px;\n padding: 64px 24px;\n @apply rounded-xl;\n color: $ff-grey-700;\n h2 {\n margin-top: -12px;\n margin-bottom: 24px;\n }\n h5 {\n font-weight: bold;\n margin-bottom: 0.75rem;\n }\n label {\n display: block;\n color: $ff-grey-700;\n margin-bottom: 4px;\n }\n .ff-radio-btn label {\n font-weight: normal;\n }\n p {\n margin-bottom: 1rem;\n }\n a {\n color: $ff-blue-600;\n }\n .ff-input:not(.ff-input--error) {\n border-color: $ff-grey-300;\n }\n .ff-input {\n border-width: 2px;\n &:focus-within {\n border-color: $ff-indigo-600;\n }\n }\n .ff-radio-btn {\n .checkbox {\n border: 1px solid $ff-grey-400;\n }\n }\n\n .ff-error-inline {\n margin-bottom: 12px;\n }\n\n .ff-actions {\n margin-top: 18px;\n }\n .ff-btn {\n text-transform: uppercase;\n width: 100%;\n margin-bottom: 6px;\n }\n .ff-btn.ff-btn--primary {\n background-color: $ff-indigo-600;\n color: white;\n &:hover {\n background-color: $ff-indigo-700;\n }\n &:disabled {\n background-color: $ff-grey-300;\n color: $ff-grey-400;\n }\n }\n .ff-btn.ff-btn--tertiary {\n color: $ff-indigo-500;\n font-weight: normal;\n border: 1px solid transparent;\n &:hover {\n background-color: transparent;\n border-color: $ff-indigo-600;\n }\n }\n}\n\n/*\n Layout - Platform / Plain\n used in all other pages\n*/\n\n.ff-layout--platform,\n.ff-layout--plain {\n min-height: inherit;\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n\n.ff-layout--platform--wrapper{\n padding-top: $nav_height;\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: row;\n\n .ff-view {\n display: flex;\n flex-direction: column;\n position: relative;\n overflow-y: auto;\n overflow-x: hidden;\n width: 100%;\n height: 100%;\n transition: ease-in-out margin-left .3s;\n }\n main {\n background-color: $ff-grey-50;\n }\n .ff-page-header {\n background-color: $ff-white;\n border-color: $ff-color--border;\n }\n}\n\n.ff-layout--plain--wrapper {\n height: 100%;\n display: flex;\n flex-direction: column;\n flex: 1;\n\n main {\n background-color: $ff-grey-50;\n flex: 1;\n }\n}\n\n.ff-notifications {\n position: absolute;\n right: 12px;\n top: $nav_height + 12px;\n z-index: 130;\n min-width: 350px;\n}\n\n.ff-notification-toast {\n min-height: $nav_height;\n margin-bottom: $ff-unit-md;\n}\n\n.notifications-list-move,\n.notifications-list-enter-active,\n.notifications-list-leave-active {\n transition: all 0.3s ease;\n}\n\n.notifications-list-enter-from,\n.notifications-list-leave-to {\n opacity: 0;\n transform: translateX(200px);\n}\n\n.notifications-list-leave-active {\n position: absolute;\n}\n\n.ff-team-selection {\n position: relative;\n display: flex;\n justify-content: space-between;\n min-width: $sidenav_width;\n .ff-dropdown-options {\n position: absolute;\n min-width: $sidenav_width;\n display: block;\n z-index: 10;\n border-bottom: 0;\n max-height: initial;\n &.active {\n display: block;\n }\n .ff-dropdown-option {\n padding: 0;\n border-bottom: none;\n }\n }\n}\n.ff-team-selection-name {\n margin-left: 10px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: flex-start;\n label {\n font-size: 0.7rem;\n line-height: 0.7rem;\n color: $ff-grey-500;\n margin-left: 0;\n }\n h5 {\n color: $ff-grey-800;\n white-space: nowrap;\n }\n}\n.ff-team-selection > div {\n flex-grow: 1;\n display: flex;\n align-items: center;\n cursor: pointer;\n}\n.ff-banner {\n background-color: $ff-grey-800;\n color: $ff-grey-300;\n padding: 8px;\n text-align: center;\n border-bottom: 2px solid $ff-red-500;\n\n &.ff-banner-info {\n background-color: $ff-blue-100;\n color: $ff-grey-700;\n text-align: left;\n border-bottom: none;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-left: 16px;\n padding-right: 16px;\n }\n\n &.ff-banner-warning {\n background-color: $ff-red-700;\n color: $ff-grey-50;\n text-align: left;\n border-bottom: 2px solid $ff-red-800;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-left: 16px;\n padding-right: 16px;\n }\n}\n.ff-header {\n z-index: 110;\n background-color: $ff-white;\n height: $nav_height;\n border-bottom: 1px solid $ff-color--border;\n display: flex;\n align-items: center;\n justify-content: space-between;\n position: fixed;\n width: 100%;\n .ff-logo-wrapper {\n display: flex;\n align-items: center;\n min-width: min-content;\n }\n img.ff-logo {\n padding-top: 18px;\n padding-bottom: 18px;\n height: $nav_height;\n width: auto;\n &:hover {\n cursor: pointer;\n }\n }\n .ff-header--mobile-toggle {\n padding: 16px;\n svg {\n fill: $ff-grey-800;\n min-width: 24px;\n }\n &.active {\n cursor: pointer;\n background-color: $ff-grey-700;\n }\n }\n .ff-header--mobile-usertoggle {\n padding: 16px;\n display: flex;\n align-items: center;\n img {\n padding: 0;\n min-width: 24px;\n }\n &.active {\n cursor: pointer;\n background-color: $ff-grey-100;\n }\n }\n .ff-navigation {\n position: absolute;\n display: flex;\n flex-direction: column;\n top: 100%;\n //margin-top: 2px;\n img {\n padding: 0;\n margin-right: 9px;\n }\n .ff-user {\n display: flex;\n align-items: center;\n margin-left: -2px;\n position: relative;\n transition: ease-in-out .1s;\n object-fit: contain;\n will-change: transform;\n .ff-notification-pill {\n font-size: 0.65rem;\n padding: 0px 6px;\n background-color: $ff-red-600;\n border: 1px solid $ff-grey-800;\n position: absolute;\n bottom: -9px;\n line-height: 0.85rem;\n right: 0;\n }\n &:hover {\n transform: scale(1.25) translateZ(0); /* Using slight adjustments to whole values */\n backface-visibility: hidden;\n perspective: 1000px;\n stroke-width: 1.5px;\n shape-rendering: geometricPrecision;\n text-rendering: geometricPrecision;\n }\n }\n }\n .ff-border-left {\n border-width: 0 0 0 1px;\n border-color: $ff-grey-500;\n }\n .ff-navigation-right {\n height: 100%;\n ul {\n background: $ff-white;\n border: 1px solid $ff-color--border;\n\n .ff-nav-item {\n transition: ease-in-out .3s;\n &:hover {\n background: $ff-grey-100;\n label, svg {\n color: $ff-indigo-700;\n fill: $ff-indigo-700;\n }\n }\n }\n }\n }\n .ff-desktop-navigation-right {\n & > * {\n position: relative;\n &:after {\n position: absolute;\n content: '';\n width: 1px;\n height: 15px;\n background: $ff-color--border;\n top: 40%;\n }\n }\n }\n .ff-mobile-navigation-right {\n img,\n button {\n cursor: pointer;\n }\n }\n\n@media screen and (max-width: 1023px) {\n .ff-mobile-navigation-right {\n .ff-header--mobile-teamtoggle {\n display: flex;\n align-items: center;\n .ff-avatar {\n border: 2px solid #1f2937;\n transition: ease-in-out .1s;\n }\n &:hover {\n .ff-avatar {\n will-change: transform;\n transform: scale(1.25) translateZ(0);\n backface-visibility: hidden;\n perspective: 1000px;\n border-color: $ff-indigo-600;\n }\n }\n }\n }\n}\n .ff-dropdown {\n color: white;\n min-width: $sidenav_width;\n position: relative;\n top: 0;\n margin-top: 0;\n .ff-dropdown-selected {\n background: none;\n padding: 16px 16px 16px 24px;\n display: flex;\n flex: 1;\n justify-content: space-between;\n align-items: center;\n border: none;\n border-radius: 0;\n }\n .ff-dropdown-options {\n width: 100%;\n border-color: $ff-color--border;\n border-right: 0;\n\n .ff-dropdown-option {\n &:hover {\n label, svg {\n color: $ff-indigo-700;\n fill: $ff-indigo-700;\n }\n }\n }\n }\n }\n .ff-user-options {\n width: auto;\n min-width: $nav_height;\n\n &.ff-navigation {\n left: auto;\n }\n .ff-dropdown-options {\n width: $sidenav_width;\n }\n }\n}\n\n.ff-user-options {\n .ff-dropdown-options {\n max-height: initial;\n .ff-dropdown-option {\n border-bottom: none;\n\n &.danger {\n label, svg {\n color: $ff-red-700;\n fill: $ff-red-700;\n }\n }\n }\n }\n}\n\n\n.ff-navigation,\n.ff-team-selection ul {\n .ff-nav-item {\n &:hover {\n cursor: pointer;\n }\n }\n}\n\n.ff-navigation .ff-nav-item {\n border-bottom: 1px solid $ff-grey-600;\n padding: 16px 16px 16px 24px;\n display: grid;\n grid-template-columns: 20px 1fr;\n svg {\n fill: $ff-grey-500;\n width: 20px;\n }\n svg.hollow {\n fill: none;\n stroke: $ff-white;\n }\n label {\n margin-left: 12px;\n color: $ff-grey-800;\n white-space: nowrap;\n pointer-events: none;\n }\n}\n\n.ff-team-selection ul .ff-nav-item {\n border-bottom: 1px solid $ff-grey-600;\n padding: 16px 16px 16px 22px;\n display: grid;\n align-items: center;\n grid-template-columns: 24px 1fr;\n height: $nav_height;\n svg {\n fill: $ff-white;\n width: 20px;\n }\n label {\n margin-left: 12px;\n color: $ff-white;\n white-space: nowrap;\n pointer-events: none;\n }\n}\n\n.ff-navigation {\n position: fixed;\n left: -$sidenav_width;\n z-index: 10;\n transition: 0.3s left, 0.3s right;\n -webkit-transition: 0.3s left, 0.3s right;\n width: $sidenav_width;\n // handle router-link active styling for primary options\n .ff-side-navigation--primary {\n width: 100%;\n transition: $transition_time width;\n -webkit-transition: $transition_time width;\n .router-link-active {\n li {\n label {\n color: $ff-teal-300;\n }\n svg {\n fill: $ff-teal-300;\n &.hollow {\n fill: none;\n stroke: $ff-teal-300;\n }\n }\n }\n }\n }\n // nested menu options, including router-link highlighting\n .ff-side-navigation--nested {\n width: 0;\n overflow: hidden;\n .ff-nested-title {\n color: $ff-teal-300;\n font-weight: bold;\n font-size: 1.1rem;\n padding: 12px 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .ff-nav-item {\n padding: 12px 16px;\n }\n .router-link-active {\n li {\n background-color: $ff-grey-600;\n }\n label {\n color: $ff-teal-300;\n }\n svg {\n fill: $ff-teal-300;\n &.hollow {\n fill: none;\n stroke: $ff-teal-300;\n }\n }\n }\n }\n // navigation-right = the admin/user settings\n &.ff-navigation-right {\n left: initial;\n right: -$sidenav_width;\n .ff-nav-item {\n &.danger {\n label, svg {\n color: $ff-red-700;\n fill: $ff-red-700;\n }\n }\n &.create {\n background: $ff-grey-100;\n border-bottom: none;\n }\n }\n\n &.without-divider {\n .ff-nav-item:last-child {\n border-top: unset;\n }\n }\n }\n &.open {\n left: 0;\n }\n &.closed {\n left: -$sidenav_width;\n }\n &.ff-navigation-right.open {\n left: initial;\n right: 0;\n }\n .ff-navigation-divider {\n background-color: $ff-grey-900;\n color: white;\n padding: 6px 12px;\n height: 32px;\n display: block;\n font-size: 0.85rem;\n border-bottom: 1px solid $ff-grey-600;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n }\n .ff-dropdown-options .ff-dropdown-option {\n padding: 0;\n }\n .ff-nav-item {\n display: flex;\n justify-content: space-between;\n border-bottom: 1px solid $ff-color--border;\n }\n .disabled {\n pointer-events: none;\n opacity: 0.5;\n }\n .ff-notification-pill {\n padding: 2px 12px;\n background-color: $ff-red-600;\n border: 1px solid $ff-red-700;\n }\n .ff-side-navigation--options-back {\n li {\n border-top: 1px solid $ff-grey-600;\n }\n }\n}\n\n/* MOBILE LAYOUT */\n@media screen and (min-width: $ff-screen-lg) {\n /* Box */\n .ff-layout--box--wrapper {\n width: 85%;\n }\n .ff-navigation {\n left: 0;\n position: relative;\n }\n .ff-header {\n .ff-header--mobile-toggle {\n display: none;\n }\n .ff-header--mobile-usertoggle,\n .ff-header--mobile-teamtoggle,\n .ff-header--mobile-notificationstoggle,\n .ff-header--mobile-experttoggle {\n display: none;\n }\n .ff-logo-wrapper {\n width: 250px;\n }\n img.ff-logo {\n padding: 18px;\n }\n }\n}\n\n#ff-app {\n #left-drawer {\n min-width: $sidenav_width;\n position: relative;\n transition: ease-in-out left .3s;\n height: 100%;\n z-index: 100;\n left: 0;\n background: $ff-color--context-menu;\n border-right: 1px solid $ff-color--border;\n overflow: auto;\n\n .ff-main-navigation {\n .ff-menu-groups {\n padding-top: 10px;\n\n .ff-menu-group {\n padding: 5px;\n\n .ff-group-title {\n margin: 10px 0 15px;\n padding: 0 10px;\n text-transform: uppercase;\n color: $ff-color--disabled;\n font-size: 11px;\n }\n\n .ff-menu-entries {\n\n .ff-menu-entry {\n margin: 0 10px 5px 10px;\n\n &:last-of-type {\n margin-bottom: 0;\n }\n\n .ff-nav-item {\n padding: 5px 10px;\n border-radius: 5px;\n .ff-tooltip-container {\n max-height: 20px;\n }\n\n & > div {\n gap: 5px;\n }\n\n &:hover {\n background: $ff-color--highlight--light;\n }\n }\n\n .router-link-active {\n .ff-nav-item {\n background: $ff-color--action;\n color: white;\n }\n }\n\n .disabled {\n .ff-nav-item {\n color: $ff-color--disabled;\n cursor: not-allowed;\n }\n }\n }\n }\n }\n }\n }\n }\n\n &.hidden-left-drawer {\n #left-drawer {\n left: -$sidenav_width;\n\n &.active {\n left: -$sidenav_width;\n }\n }\n .ff-view {\n margin-left: -$sidenav_width;\n }\n }\n}\n\n\n/* CSS Media Query for Mobile */\n@media screen and (max-width: 1023px) {\n #ff-app {\n #left-drawer {\n left: -$sidenav_width;\n transition: ease-in-out .3s;\n will-change: box-shadow;\n\n &.active {\n box-shadow: 6px 0 12px rgba(0, 0, 0, 0.2);\n left: 0;\n }\n }\n\n .ff-view {\n margin-left: -$sidenav_width;\n }\n }\n}\n",".fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.3s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n\n\n.mobile-menu-fade-enter-active,\n.mobile-menu-fade-leave-active {\n transition: opacity 0.1s ease-in;\n}\n\n.mobile-menu-fade-enter-from,\n.mobile-menu-fade-leave-to {\n opacity: 0;\n}\n\n\n.primary-fade-enter-active,\n.primary-fade-leave-active {\n transition: opacity 0.1s ease-in;\n}\n.primary-fade-enter-from,\n.primary-fade-leave-to {\n opacity: 0;\n}\n\n.page-fade-enter-active, .page-fade-leave-active {\n transition: opacity .2s ease-in-out;\n}\n\n.page-fade-enter, .page-fade-leave-to {\n opacity: 0;\n}\n",".jiggle {\n animation: jiggle 0.3s infinite;\n}\n@keyframes jiggle {\n 0%, 100% {\n transform: rotate(0deg);\n }\n 25% {\n transform: rotate(3deg);\n }\n 50% {\n transform: rotate(-3deg);\n }\n 75% {\n transform: rotate(3deg);\n }\n}\n\n.pulse-scale {\n animation: pulse-scale 1.5s infinite ease-in-out;\n}\n\n@keyframes pulse-scale {\n 0% {\n transform: scale(1);\n }\n 50% {\n transform: scale(1.5);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n.pulse {\n animation: pulse-animation 2s infinite;\n}\n@keyframes pulse-animation {\n 0% {\n box-shadow: 0 0 0 0px rgba(0, 0, 0, 0.2);\n }\n 100% {\n box-shadow: 0 0 0 20px rgba(0, 0, 0, 0);\n }\n}\n",".ff-chart {\n padding: 8px 18px;\n border: 1px solid $ff-grey-300;\n border-radius: 6px;\n background-color: white;\n h3 {\n margin: 0;\n }\n}\n\n.ff-chart-device-status {\n display: flex;\n gap: 4px;\n label {\n display: block;\n }\n .ff-chart-bar {\n text-align: right;\n border-right: 1px solid;\n border-color: var(--bar-border);\n color: var(--text-color);\n transition: 0.3s opacity;\n >div, >label {\n padding: 3px 6px;\n font-size: 0.875rem;\n font-weight: 600;\n }\n > div {\n border-width: 1px 0px 1px 1px;\n border-style: solid;\n background-color: var(--bar-bg);\n border-color: var(--bar-border);\n transition: 0.3s background-color, 0.3s color, 0.3s opacity;\n }\n &:hover {\n >div {\n background-color: var(--bar-border);\n }\n }\n label {\n text-transform: capitalize;\n }\n &:hover {\n cursor: pointer;\n }\n &--error {\n --bar-bg: #{$ff-red-200};\n --bar-border: #{$ff-red-300};\n --text-color: #{$ff-red-600};\n }\n &--never,\n &--stopped {\n --bar-bg: #{$ff-grey-200};\n --bar-border: #{$ff-grey-300};\n --text-color: #{$ff-grey-600};\n }\n &--offline {\n --bar-bg: #{$ff-grey-50};\n --bar-border: #{$ff-grey-300};\n --text-color: #{$ff-grey-600};\n }\n &--safe {\n --bar-bg: #{$ff-yellow-200};\n --bar-border: #{$ff-yellow-300};\n --text-color: #{$ff-yellow-600};\n }\n &--running {\n --bar-bg: #{$ff-green-200};\n --bar-border: #{$ff-green-300};\n --text-color: #{$ff-green-600};\n }\n &.ghost {\n opacity: 0.15;\n }\n }\n}\n","@import '../ui-components/stylesheets/ff-colors.scss';\n\n@import \"./layouts.scss\";\n@import \"./transitions.scss\";\n@import \"./animations.scss\";\n@import \"./components/charts.scss\";\n\n/* Define Font Family */\n/* latin */\n@font-face {\n font-family: 'Heebo';\n font-style: normal;\n font-weight: 400;\n src: url('./assets/fonts/Heebo-Regular.ttf') format('ttf');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n\n/* Define Global Styles */\n\nhtml, body, #app {\n height: 100%;\n display: flex;\n flex-direction: column;\n flex: 1;\n}\n\nh1, h2, h3 {\n font-weight: 500;\n}\n\n#ff-app {\n flex: 1;\n background-color: $ff-grey-300;\n}\n\n.ff-link {\n color: $ff-blue-700;\n &:hover {\n cursor: pointer;\n color: $ff-blue-900;\n text-decoration: underline;\n }\n}\n\n.ff-avatar {\n width: 24px;\n height: 24px;\n border-radius: 4px;\n}\n.ff-avatar-large {\n width: 48px;\n height: 48px;\n border-radius: 8px;\n}\n.ff-bg-dark {\n background-color: $ff-grey-800;\n .ff-btn.ff-btn--primary {\n background-color: $ff-teal-600;\n &:hover {\n background-color: $ff-teal-700;\n }\n }\n}\n\n.ff-loading {\n width: 100%;\n height: 100%;\n h4 {\n font-size: 1.5rem;\n margin-top: 1rem;\n font-weight: 600;\n }\n &.theme-light {\n color: $ff-grey-900;\n }\n &.theme-dark {\n color: white;\n }\n}\n\n.ff-icon.ff-clickable {\n cursor: pointer;\n path, circle, rect {\n transition: 0.3s color, 0.3s stroke, 0.3s fill;\n -webkit-transition: 0.3s color, 0.3s stroke, 0.3s fill;\n }\n &:hover {\n color: $ff-blue-600;\n }\n}\n\n.ff-icon-xl {\n width: 48px;\n height: 48px;\n stroke-width: 1px;\n}\n\n.ff-dialog-box a {\n color: $ff-blue-600;\n &:hover {\n color: $ff-blue-800;\n }\n}\n\n.ff-dialog-box--info {\n p {\n margin-bottom: 12px;\n }\n img {\n width: 150px;\n height: 150px;\n }\n}\n\n.ff-no-data {\n background-color: $ff-grey-100;\n color: $ff-grey-400;\n font-size: 0.875rem;\n border: $ff-grey-200 solid 1px;\n padding: 12px;\n text-align: center;\n\n &.ff-no-data-large {\n padding: 64px 12px;\n }\n\n &--boxed {\n @extend .ff-no-data;\n\n .message {\n display: block;\n text-align: center;\n margin: 10px 0 10px;\n padding: 10px 0 10px;\n border: 1px solid $ff-grey-300;\n }\n }\n}\n\nlabel {\n cursor: inherit;\n}\n\n::placeholder { /* Chrome, Firefox, Opera, Safari 10.1+ */\n color: $ff-grey-400 !important;\n opacity: 1; /* Firefox */\n}\n\n/* Ensure headlessui MenuItem pointer for active `menuitem` anchors */\n[role=\"menu\"] a[role=\"menuitem\"] {\n cursor: pointer\n}\n\n.ff-dialog-fixed-height .ff-dialog-content {\n overflow-y: visible;\n}\n\n.ff-breadcrumbs {\n display: flex;\n align-items: center;\n label {\n color: $ff-blue-600;\n cursor: pointer;\n &:hover {\n text-decoration: underline;\n }\n }\n span:last-child label {\n pointer-events: none;\n color: black;\n }\n}\n\n// Handle nested buttons in a data table\n\n.ff-data-table--cell a:not(.ff-btn):hover,\n.ff-data-table--cell a:hover svg.ff-icon {\n color: $ff-blue-600;\n}\n\n.ff-data-table--data .ff-data-table--row--nested .ff-data-table--cell {\n background-color: $ff-grey-50;\n &:first-child {\n padding-left: 36px;\n }\n}\n\n.ff-data-table--data .ff-data-table--row--nested.selectable:hover .ff-data-table--cell {\n background-color: $ff-grey-100;\n}\n\n.ff-page-banner {\n border-radius: 5px;\n background-color: $ff-blue-100;\n color: $ff-grey-600;\n text-align: left;\n border: 1px solid $ff-blue-300;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 16px;\n\n &.minimal {\n background: none;\n border: none;\n border-radius: 0;\n }\n}\n\n.clipped-overflow {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n\n // number of lines to clip to\n &--two-lines {\n -webkit-line-clamp: 2;\n }\n &--three-lines {\n -webkit-line-clamp: 3;\n }\n &--four-lines {\n -webkit-line-clamp: 4;\n }\n}\n","@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n /* .forge-block {\n @apply bg-white;\n @apply shadow;\n @apply rounded;\n @apply mx-2;\n @apply sm:mx-4;\n @apply py-6;\n @apply px-2;\n @apply sm:px-6;\n @apply lg:px-8;\n @apply mb-1;\n } */\n\n .forge-inner-block {\n @apply py-6;\n }\n\n .forge-link {\n @apply underline;\n @apply hover:cursor-pointer;\n @apply hover:text-blue-600;\n }\n\n .forge-button {\n @apply px-3;\n @apply py-1;\n @apply bg-blue-900;\n @apply border;\n @apply border-blue-900;\n @apply hover:bg-indigo-700;\n @apply text-white;\n @apply hover:text-gray-100;\n @apply focus:text-gray-300;\n @apply rounded-md;\n @apply inline-flex;\n @apply items-center;\n @apply text-sm;\n @apply focus:outline-none;\n @apply focus:ring-2;\n @apply focus:ring-offset-2;\n @apply focus:ring-offset-gray-600;\n @apply focus:ring-gray-400;\n\n @apply disabled:opacity-30;\n @apply disabled:cursor-not-allowed;\n }\n\n .forge-button-secondary {\n @apply forge-button;\n @apply bg-gray-100;\n @apply border-gray-300;\n @apply hover:bg-gray-300;\n @apply hover:border-gray-300;\n @apply text-gray-500;\n @apply hover:text-gray-600;\n @apply focus:text-gray-700;\n }\n\n .forge-button-tertiary {\n @apply forge-button-secondary;\n @apply bg-white;\n @apply hover:bg-gray-100;\n }\n\n .forge-button-inline {\n @apply forge-button-secondary;\n @apply border-transparent;\n @apply bg-white;\n @apply hover:bg-gray-100;\n }\n\n .forge-button-inline-inactive {\n @apply forge-button-inline;\n pointer-events: none;\n }\n\n .forge-button-danger {\n @apply forge-button;\n @apply bg-white;\n @apply border-red-700;\n @apply hover:bg-red-700;\n @apply text-red-700;\n @apply hover:text-white;\n @apply focus:text-white;\n @apply focus:bg-red-700;\n\n @apply disabled:border-gray-500;\n @apply disabled:text-gray-600;\n @apply disabled:bg-white;\n @apply disabled:cursor-not-allowed;\n }\n\n .forge-button-small {\n @apply px-2;\n @apply py-1;\n @apply text-xs;\n }\n\n\n .forge-button-set > :first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n border-right: none;\n }\n .forge-button-set > :last-child button {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n border-left: none;\n }\n\n .forge-nav-item {\n @apply flex items-center;\n @apply pb-3;\n @apply border-b-4 border-b-transparent;\n }\n .forge-nav-item:not(.forge-nav-item-active) {\n @apply text-sm;\n }\n .forge-nav-item:not(.forge-nav-item-active):hover {\n @apply text-blue-700;\n @apply border-b-4;\n @apply border-gray-400;\n }\n\n .forge-nav-item-active {\n @apply text-sm;\n @apply text-blue-700;\n @apply border-b-4;\n @apply border-blue-700;\n }\n .forge-badge {\n @apply border;\n @apply rounded-full;\n @apply text-xs;\n @apply px-2;\n @apply py-1;\n @apply inline-flex;\n @apply items-center;\n }\n .forge-status-error,\n .forge-status-crashed {\n @apply bg-red-100;\n @apply border-red-400;\n @apply text-red-600;\n }\n .forge-status-suspended {\n @apply bg-red-200;\n @apply border-red-400;\n @apply text-red-600;\n }\n .forge-status-stopped {\n @apply bg-gray-100;\n @apply border-gray-300;\n @apply border-dashed;\n @apply text-gray-700;\n }\n .forge-status-info {\n @apply bg-gray-100;\n @apply border-gray-300;\n @apply border-dashed;\n @apply text-gray-800;\n }\n .forge-status-starting {\n @apply bg-green-100;\n @apply border-green-300;\n @apply border-dashed;\n @apply text-green-700;\n }\n .forge-status-safe {\n @apply bg-yellow-200;\n @apply border-yellow-400;\n @apply text-yellow-600;\n }\n .forge-status-warning {\n @apply bg-yellow-400;\n @apply border-yellow-700;\n @apply text-yellow-900;\n }\n .forge-status-success,\n .forge-status-connected,\n .forge-status-running {\n @apply bg-green-200;\n @apply border-green-400;\n @apply text-green-700;\n }\n .forge-status-importing {\n @apply bg-green-100;\n @apply border-green-300;\n @apply border-dashed;\n @apply text-green-700;\n }\n\n .forge-minimal-status-error,\n .forge-minimal-status-crashed{\n @apply bg-red-600;\n }\n .forge-minimal-status-stopped,\n .forge-minimal-status-suspended,\n .forge-minimal-status-suspending,\n .forge-minimal-status-info,\n .forge-minimal-status-offline{\n @apply bg-gray-300;\n }\n .forge-minimal-status-success,\n .forge-minimal-status-connected,\n .forge-minimal-status-protected,\n .forge-minimal-status-running,\n .forge-minimal-status-importing,\n .forge-minimal-status-safe,\n .forge-minimal-status-warning,\n .forge-minimal-status-starting,\n .forge-minimal-status-info,\n .forge-minimal-status-pushing,\n .forge-minimal-status-pulling,\n .forge-minimal-status-loading,\n .forge-minimal-status-rollback,\n .forge-minimal-status-installing,\n .forge-minimal-status-updating,\n .forge-minimal-status-restarting{\n @apply bg-green-400;\n }\n\n .forge-badge-devmode {\n @apply bg-purple-100;\n @apply border-purple-600;\n @apply text-purple-700;\n }\n .forge-badge-fleetmode {\n @apply bg-teal-100;\n @apply border-teal-600;\n @apply text-teal-700;\n }\n\n th {\n @apply text-left;\n @apply font-medium;\n }\n\n input[type=\"text\"],\n input[type=\"password\"],\n input[type=\"radio\"],\n input[type=\"checkbox\"],\n select,\n textarea,\n .uneditable {\n @apply text-sm;\n @apply appearance-none;\n @apply rounded;\n @apply relative;\n @apply font-normal;\n @apply px-2;\n @apply py-1;\n @apply border;\n @apply border-gray-300;\n @apply placeholder-gray-500;\n @apply text-gray-600;\n }\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n @apply mr-2;\n @apply p-2;\n }\n .uneditable {\n @apply border-opacity-0;\n }\n\n input[type=\"text\"]:focus,\n input[type=\"password\"]:focus,\n input[type=\"radio\"]:focus,\n input[type=\"checkbox\"]:focus,\n select:focus,\n textarea:focus {\n @apply outline-none;\n @apply ring-0;\n @apply border-indigo-500;\n }\n input[type=\"text\"]:disabled,\n input[type=\"password\"]:disabled,\n input[type=\"radio\"]:disabled,\n input[type=\"checkbox\"]:disabled,\n select:disabled,\n textarea:disabled {\n @apply cursor-not-allowed;\n @apply opacity-60;\n }\n\n /* Make sure forge-log-entry-level-* all appear in tailwind.config.js safelist */\n .forge-log-entry-level-system {\n @apply text-blue-400;\n }\n .forge-log-entry-level-info {\n @apply text-gray-100;\n }\n .forge-log-entry-level-warn {\n @apply text-yellow-300;\n }\n .forge-log-entry-level-error {\n @apply text-red-400;\n }\n}\n\n@layer components {\n .ff-layout--box--left,\n .ff-layout--box--right {\n @apply p-0 md:p-12;\n }\n .ff-layout--box--right .ff-layout--box--content {\n @apply rounded-none md:rounded-xl m-auto;\n }\n}\n","/*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n/*\nDocument\n========\n*/\n\n/**\nUse a better box model (opinionated).\n*/\n\n*,\n::before,\n::after {\n\tbox-sizing: border-box;\n}\n\n/**\nUse a more readable tab size (opinionated).\n*/\n\nhtml {\n\t-moz-tab-size: 4;\n\ttab-size: 4;\n}\n\n/**\n1. Correct the line height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n*/\n\nhtml {\n\tline-height: 1.15; /* 1 */\n\t-webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/*\nSections\n========\n*/\n\n/**\nRemove the margin in all browsers.\n*/\n\nbody {\n\tmargin: 0;\n}\n\n/**\nImprove consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n*/\n\nbody {\n\tfont-family:\n\t\tsystem-ui,\n\t\t-apple-system, /* Firefox supports this but not yet `system-ui` */\n\t\t'Segoe UI',\n\t\tRoboto,\n\t\tHelvetica,\n\t\tArial,\n\t\tsans-serif,\n\t\t'Apple Color Emoji',\n\t\t'Segoe UI Emoji';\n}\n\n/*\nGrouping content\n================\n*/\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\nhr {\n\theight: 0; /* 1 */\n\tcolor: inherit; /* 2 */\n}\n\n/*\nText-level semantics\n====================\n*/\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr[title] {\n\ttext-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n\tfont-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n\tfont-family:\n\t\tui-monospace,\n\t\tSFMono-Regular,\n\t\tConsolas,\n\t\t'Liberation Mono',\n\t\tMenlo,\n\t\tmonospace; /* 1 */\n\tfont-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n\tfont-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n\tfont-size: 75%;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsub {\n\tbottom: -0.25em;\n}\n\nsup {\n\ttop: -0.5em;\n}\n\n/*\nTabular data\n============\n*/\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\ntable {\n\ttext-indent: 0; /* 1 */\n\tborder-color: inherit; /* 2 */\n}\n\n/*\nForms\n=====\n*/\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n\tfont-family: inherit; /* 1 */\n\tfont-size: 100%; /* 1 */\n\tline-height: 1.15; /* 1 */\n\tmargin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n1. Remove the inheritance of text transform in Firefox.\n*/\n\nbutton,\nselect { /* 1 */\n\ttext-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n\t-webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n::-moz-focus-inner {\n\tborder-style: none;\n\tpadding: 0;\n}\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n:-moz-focusring {\n\toutline: 1px dotted ButtonText;\n}\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n:-moz-ui-invalid {\n\tbox-shadow: none;\n}\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\nlegend {\n\tpadding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n\tvertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n\theight: auto;\n}\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n\t-webkit-appearance: textfield; /* 1 */\n\toutline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n::-webkit-file-upload-button {\n\t-webkit-appearance: button; /* 1 */\n\tfont: inherit; /* 2 */\n}\n\n/*\nInteractive\n===========\n*/\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n\tdisplay: list-item;\n}\n","/**\n * Manually forked from SUIT CSS Base: https://github.com/suitcss/base\n * A thin layer on top of normalize.css that provides a starting point more\n * suitable for web applications.\n */\n\n/**\n * Removes the default spacing and border for appropriate elements.\n */\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nbutton {\n background-color: transparent;\n background-image: none;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nol,\nul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/**\n * Tailwind custom reset styles\n */\n\n/**\n * 1. Use the user's configured `sans` font-family (with Tailwind's default\n * sans-serif font stack as a fallback) as a sane default.\n * 2. Use Tailwind's default \"normal\" line-height so the user isn't forced\n * to override it to ensure consistency even when using the default theme.\n */\n\nhtml {\n font-family: theme('fontFamily.sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"); /* 1 */\n line-height: 1.5; /* 2 */\n}\n\n\n/**\n * Inherit font-family and line-height from `html` so users can set them as\n * a class directly on the `html` element.\n */\n\nbody {\n font-family: inherit;\n line-height: inherit;\n}\n\n/**\n * 1. Prevent padding and border from affecting element width.\n *\n * We used to set this in the html element and inherit from\n * the parent element for everything else. This caused issues\n * in shadow-dom-enhanced elements like <details> where the content\n * is wrapped by a div with box-sizing set to `content-box`.\n *\n * https://github.com/mozdevs/cssremedy/issues/4\n *\n *\n * 2. Allow adding a border to an element by just adding a border-width.\n *\n * By default, the way the browser specifies that an element should have no\n * border is by setting it's border-style to `none` in the user-agent\n * stylesheet.\n *\n * In order to easily add borders to elements by just setting the `border-width`\n * property, we change the default border-style for all elements to `solid`, and\n * use border-width to hide them instead. This way our `border` utilities only\n * need to set the `border-width` property instead of the entire `border`\n * shorthand, making our border utilities much more straightforward to compose.\n *\n * https://github.com/tailwindcss/tailwindcss/pull/116\n */\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: currentColor; /* 2 */\n}\n\n/*\n * Ensure horizontal rules are visible by default\n */\n\nhr {\n border-top-width: 1px;\n}\n\n/**\n * Undo the `border-style: none` reset that Normalize applies to images so that\n * our `border-{width}` utilities have the expected effect.\n *\n * The Normalize reset is unnecessary for us since we default the border-width\n * to 0 on all elements.\n *\n * https://github.com/tailwindcss/tailwindcss/issues/362\n */\n\nimg {\n border-style: solid;\n}\n\ntextarea {\n resize: vertical;\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1;\n color: theme('colors.gray.400', #a1a1aa);\n}\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/**\n * Override legacy focus reset from Normalize with modern Firefox focus styles.\n *\n * This is actually an improvement over the new defaults in Firefox in our testing,\n * as it triggers the better focus styles even for links, which still use a dotted\n * outline in Firefox by default.\n */\n \n:-moz-focusring {\n\toutline: auto;\n}\n\ntable {\n border-collapse: collapse;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/**\n * Reset links to optimize for opt-in styling instead of\n * opt-out.\n */\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/**\n * Reset form element properties that are easy to forget to\n * style explicitly so you don't inadvertently introduce\n * styles that deviate from your design system. These styles\n * supplement a partial reset that is already applied by\n * normalize.css.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n padding: 0;\n line-height: inherit;\n color: inherit;\n}\n\n/**\n * Use the configured 'mono' font family for elements that\n * are expected to be rendered with a monospace font, falling\n * back to the system monospace stack if there is no configured\n * 'mono' font family.\n */\n\npre,\ncode,\nkbd,\nsamp {\n font-family: theme('fontFamily.mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);\n}\n\n/**\n * 1. Make replaced elements `display: block` by default as that's\n * the behavior you want almost all of the time. Inspired by\n * CSS Remedy, with `svg` added as well.\n *\n * https://github.com/mozdevs/cssremedy/issues/14\n * \n * 2. Add `vertical-align: middle` to align replaced elements more\n * sensibly by default when overriding `display` by adding a\n * utility like `inline`.\n *\n * This can trigger a poorly considered linting error in some\n * tools but is included by design.\n * \n * https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210\n */\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/**\n * Constrain images and videos to the parent width and preserve\n * their intrinsic aspect ratio.\n *\n * https://github.com/mozdevs/cssremedy/issues/14\n */\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/**\n * Ensure the default browser behavior of the `hidden` attribute.\n */\n\n[hidden] {\n display: none;\n}\n",null,"@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-divider {\n width: 100%;\n height: 1px;\n background-color: $ff-grey-200;\n margin-top: 12px;\n margin-bottom: 12px;\n}\n","@import \"@/ui-components/stylesheets/ff-colors.scss\";@import \"@/ui-components/stylesheets/ff-utility.scss\";\n\n.ff-combobox {\n min-width: 200px;\n\n &[data-headlessui-state=\"open\"] {\n input {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n\n .ff-combobox-input {\n padding: 5px 2.5rem 5px 10px;\n border: 1px solid $ff-grey-300;\n font-size: $ff-funit-md;\n line-height: 1.5;\n &:focus {\n border-color: $ff-grey-300;\n outline: none;\n }\n }\n\n .ff-options {\n background: $ff-grey-50;\n box-shadow: 0 6px 9px 0 #00000038;\n max-height: 14rem;\n z-index: 100;\n overflow-y: auto;\n padding: 0;\n border-left: 1px solid $ff-grey-200;\n border-right: 1px solid $ff-grey-200;\n border-bottom: 1px solid $ff-grey-200;\n }\n\n .ff-option {\n cursor: pointer;\n border-bottom: 1px solid $ff-grey-200;\n\n &:last-of-type {\n border-bottom: none;\n }\n\n .ff-option-content {\n padding: $ff-unit-sm $ff-unit-md;\n border: 1px solid transparent;\n\n &.selected {\n background-color: $ff-grey-200;\n }\n\n &.active {\n border: 1px solid $ff-indigo-300;\n }\n\n &.selected.active {\n border-color: transparent;\n }\n }\n\n &:hover {\n background-color: $ff-grey-200;\n .ff-option-content.active {\n border-color: transparent;\n }\n }\n }\n}\n"],"names":[],"sourceRoot":""}
|