diff --git a/backups/backup_v2docker_20250621_174144_encrypted.sql.gz.enc b/backups/backup_v2docker_20250621_174144_encrypted.sql.gz.enc new file mode 100644 index 0000000..d1a7764 --- /dev/null +++ b/backups/backup_v2docker_20250621_174144_encrypted.sql.gz.enc @@ -0,0 +1 @@ +gAAAAABoVtK4i6VJCYK15iDhZOT9oqag5DMQgJO27TbQUFtzIBpDxC9bjFSrWDExaUeGl5FvQ9pxa9CgZIwPzdJ9n-Caozkj0YzfIjmSb02pWKibcOsORxtMEwKvsw32Yo1PrfDk6YGXUq0gbeNnRXH4ZcWwm-hYathWRm9YbNXfnA3q1JXurzY7V7bHlDSdBbtW-ZbryFZWgGWGEZr1Po6MTMnYVBW40M4D2nZGDVEfQwY05Mdl1dEdBv5jeSuywRzdSu7Cbn3xQk89D5Ts_J3QEpoiDCtNxc59hnNx7xBDHTKt9k5ZtSl7wP-F0bVGstFZdbusBWeKWyMOq_2LhddPzmwFAM-1hr5ZTui5-3TxHPaomnMAGlWHlUFFfyKTrVtoYgQvqlMZtn33ravyMIqvShrW2z7OH3CJDLEYG4QhEdp1kczZuSMFyGQKmZudD_pb5G73fIkmgW0OKnvOrz7m651B7xVYFku29pEiA3tGQ7m3g2by2CrtIoBp7g_1aWXYLrSOs9JPHcM9hlnpyctLga9pnv8CdFxDvwpXB8i4hNp1y0XOEDPvSfm3ZAw_v5gc35bi1mYs6GtkfllFVvBHU7g4IyoV5tRoxY-wm_n-Mh5vzGcWkAUm3vmfeKYJVzJ-7PQHz36-N63KOHiwh_uh7wDxPKi2oAo1Yu38xKoXn5dWsCmiRHKFwSL05NjblH6KT5o6oaTC9hr9dc9-Qbx2eWj_7zH0AaDIA8KjQijRdeeXFmxx8Ph7008VFMCYfQaZJE8JML4HGNMzifLaOunW_vgW_q-O-x2gsbriBle-gTdfrTM6oXaBQjFh8hEFC8pxqGvFeJGTuv9prlVrIwvbZuBglPwyNs1DiRN61hPnqYvpGrMlYpTHjp4Yje0dA24QCcjf08KAcYHSeSIsnS-5FSnmEliKYM13CI81aBDzxxBLKgrHsrJWrKnRQQko5eSaRMpUQW5gIedpwCdgpaQT_pE6S30V1mu_aH12wOPKbRLf3WrrMtrATBdWgshH3-vS8u2RupFbRKwAGiJieanJUzgqo2yk2PG6qNsl46ElLdg0_sAxAyUd5yMNSLYgoqhE7GQ8zmqBHjxOiq0cVhhLaL3uG6hyJfyhKfXaPtJ9Q55iBcA3B5DVFiXmmv3l7uVwgtjPaBNrns6eii4GauniIlkJukI4ciUu-GPynI4ezt_UmBsE2DVCPfL2s24V4W_824u3w-uejq3lhjkkiwozucecKMECdNNBQ6t84XnXWuqjf1ONV2F64Sy4ZuojYfkmtjvIQTb4aAdg7XEadJGiuxKhS_6Kp4BtUlDc62L2ixVE0YaAKX3O-k4Uh64sArGsGWvDaT0TLTzG7MGwR8f3CNl-xRHezvXDM7XeGx_tlLoM4bqsvx6ba6dL3P7eiaHysPn52aztSdVuYI8RjDpEAqty6LGmnbiPMPXFrACK6x1kmhDsfn6X2m9Mjo5TeHfcDoeA9-i7Ixw7IkxsNCbFq2cYoauaRk7zS7B99mHZAhhYQHjMqzuZZffwzi0iSelyY3xbZa-2n38QYCDzIL3-5asUZDY_OgTlKxHMNb6aK6ASognd2y6DHlD9PmE7I6rryWq2W0vShMM8Jn9parevMWFH-ZzAQntnW8XeigcFQzu9WHSEo9BaAbuu9r4nU2v1lAs2T840GQcDljPL9SUeGeDK8eDrvjOkKgdG-V6hV80rUCZgOQQmYndPXgiGrndsHAiNC-svs-X-F3Z5x6i-O_VXyCjEekVEBna6nShRFcwcdQ0coM1Oh5YvpeZ8nJDXKhn9gwpjNdC_HyZu4q8fwduWkiRd0sUS5V8gAt252sR66TUX_amy6_LAitY-dcgtezL_twOe9Ezh87C5IoUjTHO6ibFeVSXsOaxRDwX-dEATopgiY3e_lvtGO1T9vxf76eAJz1N2OAsc_PHeNWn2pN7gh58YaKg7Asar8O8BRoZve8Jn4Q-i5z6y7fzlSyJmoll_iBggfgtoBNtmSvHy9qF5TEpZSItJIXh0idoUTimxVXvA_lNXZEixMpZl6ehTNPU_EwDrXBO4G8f3_3ZnoIxODPljcQDRt0RyGU-muCT8A0GAKezAu5nmCEoiQn2D-48S7qJ6KODdmoX2fRPUrTu5044Xrq81cblCXTv4U3orKh0KlOVTt6229_PTxVzPX1c3XWEpVl0egaY3xbohCuGrlqyURsQrORQnHwSqeftZQBiTl35oCvy92TUuGn-6-i8s0Ke4tIwxA30pNc38n5MVQT0Q7fYl0YZjL6zPHMAvTwWjXLa20o-siXlTtxbN9Sza9opfn9fvpPF-UysAKO5ga6q18zln-z9xtfHESznccH8XXa_x68_cqMm3YHW8GfnbrvQL_OkBumxtRQbX-U04D-il8ohTIV51rNgdSCoKGGKX6VBNqhy2IAUsmNc6q5i1j0YR67FsvLW5uLRpaJrZF55N7P-jT_irRITCc1LoXM2fVrN5oxal1COP1WivG5v_-rmp0UQtw1l_NnYXXhJrVO2dW15uMIIbtzB4Qm0Yu9NvUUPKcZIRRNx6VqjgA8bPzvHMmacCUSNRSPtXTGURDVxr2tPQBdMJOGp9DWVADhGUClhOvwG5aHnoflmUtgpQIG7uOhOq1rCjeqrhssYezXuBDXJSRkAwyqT4fXvT30PDRsQvlslVKKfW1pm1d2dPdyeH_NesZxF-0APkPIf-WYXpO_6gSs-0rLJkA9Jh5418Xw7UGNNkzkkdWL6CS8OqwQm3-oFIfWOvBnYR9R9s69BNdAxyVyP7c3LAbFKKITSmzCGiKJhkwLhB4DfFRHtDQSc4-uQoqC6vaJEyXCiTY_KqTgIV5o4QsTs3K-NJJBIKtLdq79Sa9wvCAuLjcTnbZtkVtLfKKSzBwuO7-nYKNxwlWhgp9sz1vInxE6sgSPgjyemd6j_6HMXhKZ-I8hI5cCYXU4KOgjZVGoWjm6UyGlazzFnlAvt4s2V-80quVTkEWPc9KAe_nuMyUhBRjq98l1rynGDGz97saThdF955JaouJgXDqflmK8XUGy2vMbuS-72q10Lz8Fgx2Wh1dhmffYdl4PdjFG0ssnoZ4fEbXw8e-o61i15NgQIWKJcQWCUrBkPk7vOBK3anLQAT8HGOSmiH2ERme-6YT8OBwUMfmrX0Y3EUoB_tAGLL6lFLrSam438aV-txY9AoBDTQ3lv7m49Q5FPBZmOSBtQ13A5t0cQ7lDNS8igz0C_J3vsvBbxFFcTeG6CbIXtQKfrEXNpdqaqirk-xQS1C2oKeJcV3Z3QSQNQzy0AvNQwTvjAT3x249u7Vd2B5o-R5OElo0-gA4dhlTtS2DBuJArhu47ky32rx275iT1kbEcFPNCo1IuKczngOvw0m_kKSgY4CRwtAYRsRj4QTBs-uDJgN9cUwkrp6Eta_WN3Lj3IDh2f6IK9PR0I4va8YcidyGiNHCBy0oZ7XGWE-o3Ug9ptVJJ2cBtoSF_p7ALYgq5I62V_IvEn7AsQ09_mBs_84I1-GwKFqv_y7GCSMnPKyrOBTMryhraYPonFfR5MW8xp6IcvkdGeqQ9kVRpQelnhxQswJjUxbgInODDEPJBbSBLKCCquoR1Nr0H76x7KnEMtZd6sIUkVh9hXiFObCJFenziqzYE4jc0iyvT0SNeVlwiGkAUnZ5D2j2OI6_x4PSXth2-an99Gv9cSXJeuoqhCMpitSxduTI_Y8Mbw4UG7q-5LSXQUG_l2mLZ9A4XZ3V42EvoSf5c1x0ymtXk4IF_kVI4mDJqo2K7TVd9EgQFh-NPN4JcTp0TV3em7CYHFcVf27F_aX4-bl9TI_YtFzCa0-t1cDYvEcufbUkT3XiCvyO_aM-E3RjuZ-Pj-HnreqwL4zE8g_SGQmv8SskbIdnI5Og2KEiwmq9OJZC3q_Z9OwbYXArIvtaqB7RQMbI0u5kYDPEphXbrhsgxZUQdx1Zt3r8pbx3S4XWuwPlaRLvyqLyLMJ1f-1zc9VSMqPQb3GwynTaIP087bjWUNWw5pKSiXRTsEgvmoM3BjXBcdgG7SXt8R9ZirYgkV8WzDPAfsP-uWgDhujTd_UP0difTdDaDcvcf8aab-O8kHuXCoCMhvtk06rCW2Ad8RC-58yLQMD9Fg1dyCAGLDv7Ocy7e0D64vkZnd4AIzxpl0iuIhZDukZi_shd6GPkGTZTTQ9h1FOZVN567Xw9Czn2x7lzBnYIyK7hVaVuQ1roI69gyxXKjltk57GX1XJ-Cn6wEUq9r2V0EQLW3CffUafogkF83KsXjCqs5NB95wHrAKYhphoUlDZbU3c2nZvdVfa8mhmxlcB6UGw5ijZrpYnLfYAuCiG6cPPP5-HkUj6cL26QaHUxacStDBnCczFdg4frvIcHwYyghkJSNWM7DaSLGLJWtiLrAEM7xgC5M9KZUb5nmULo3ZggOcrQq_Xi5UIu_Ciu0z4XxiFZzOw9epq0_728e_ZWCWzu6GK8DMgKjrtabpD_ASOwaxZC9Iep2HlUyDi4BO80C4JS6_qQXj-P2xx02E07ft2pyeFdC7teSZh1_bCxGuJrgzy2kfZzS5U-FocrW2Mx6c6OktHIT_OC_vA3B8YiQtEy9YJZN9WOSns1V7IRda_4KCHCJVPd0lWgyekf9egRgYZKtXb7aAsN-R_d8gMvYj6vOddRMGmgzAXN4_NNoS-tXJ6Wd2fvYIPyLvR_hdSslGEFPnsX5RoUT6WEAjVURskszp-5P1JwnkwL3JOYBAk0ZXl7CXl7DXQhOpjlRpB4pWYO4Y3etBbcFB5w-oEG6L6VCc-h5lWT0d61FMxvCXXstMxnQJkMn9Q3AS8aXyE-RPT2GfcTvPRqB8nE55NurCjKtl5wNfVWF5pu72_TnMWip2Ug7F3ZvhUWL8tvjdUA5XV0PsUJW-h6HvxaaOgFkdBrEqcAiOs8kOHMDscUHeK8Q879HT8vRSe4mHL0Hvs9cLeSlap0BI1lnQUNd3TfltZeThJLUfN8FkXEkqinpVuVFzCb4nZ21qdXqIz6JoUKnBlgOcDb6T3mnt1eZBZ9kh-gj9H1V16VycB8zLuOz5-G3MImUSDByI1Oz5yANmnZh0lAKvH5xDhhW6ee-Ce2dvbxPRHUwSmTxbOP_xaDeq2-VTkmXel80Im8spxizk6bRWRedEvm1QHHeMXGY2Ku1i0GlAhhQmATgBMRWzGoYciV5pZGfQJxwRIF_ymcFXQMgZQqJYgrZxrbD5EV1c4fRpYya7jgAXkJIjZWJ0YqKVU8MIkA-J0BNwlrK6uQyR4acy2LENquGBJghoqYtQQvzp-4u-jV3iKuTLNlGdcshs7Y93_QYyybXMy8ntqeMYtvFdQCGWzyK2WgVEaONssur3DIfc2TjchnFCY9SlpBdItSEmmSmeHMEUNN7OV4m-eb0a9LEsnzKNF1HGjZpVokOarZrLcuZL5mNjl63xr4P22ZSMq7JdCPy0hIJH-e3MF-qpEBFfZL2ggBS6tZMyxJ5zKozw1rlzpIB3Fj6SKq-4hrRKgBbTcsQ-qULHHTSeN9JoXoY_JTHbHOtO9f9Jjt2XKEc0foLLmG-xOwbOoBCo48GxFvTOBq7JrJfM3Sxzs6hgxGkyoqK52kOm8Qj3926v-DW2FjCsjNRyx5KYgkXE6a06dK-W2GQp8MI2Wc7PHwP4S2yuKk_5LZCZ2qLUNdAoyEi-hzBa4xthEiJvHcnvN9loJ-hRl8pi8dFChq0C6o3_qo164YSwDIGEJNNhsf1Y-yYHAHlc5AqQQbwMvFGLSNgOX3mELSwlzZvBte9wCl_2ovp46aQNCAm9gt5uOjfBaSJr-fBB1f68GAqOsaE6nyesd2ZAE1uZT1F9tcb4TNJaEjOwZSsh_o5Iv60YDq-2DACvfpwBUWLXGOVQ-ZBOecrte3bbkngV5map-zIgfxXzsG0ljBaWBg2-jSjdJemxZ71_IeqVEQrPDehFQuPYP2zZgbLVx3P2v9PkX01er-hLymXL3MYCqXHAADuAhusLiBczyBB1oOYfWNte7t6HxGiIGZf6NiJk9EXUEsZw9KdiOzZL-o8x0LsPSS3AmVRWpwzvSzWOmD-3DAQoBi_6Qj-O_PvnkRSBU6O_SmztpYHhFN9FGpkZ-YR2oateyhUzNIqKWx4VoNDzW95nTn2CqE96B7EKYzikwBBASr6z7GfhitEw4iBA5Okj44XF0j-ZoCbMI3jDJeMStKhdu46eol5Zi1rRXVcZNJZfxTJ9zq_2w65T1_G1OjX_VfjQGH2Pmfv156cielWRPK6OJ7KAJLAAUO_IRhdB0mbG814pjedAGDEt4bJ6zjaa0RDBrH6gY0KN4KHc8yWwNjP1XcNO3p8kKihY4MYr-eFyuxC89h4gaELEPwzwLq4qPNkTCVJO27KC4MjnD8TZgA7KRJP-UCCAOKw8blasQBMhrMIrpgtV8nefs04siX6SLznFMv6tPpU3Z2o1Fndey1qNz6PIbYL4lr-QWUnq9tw6hReUfyU023sgcZxAZEhd0IxNk9JiwmmcEnwIUwq4SE-U2-4l0pnjmQ5eYUMOKI5WEcrFi6NGsOAFT6kagdjcGGlXF5Ry2qDvvJEO1-Q9X_pqZ_wJuHv6DGzgIsjBa7w2mBNV-yv03FuRGXdxm79rBlRd07iK8Pgrf89qYWqAOMW4wvRlU3pLTZHo8OKoPhC_ziOJWoUhvn7VXT40_c6UHdwUAPhyTa4yECCD0OBAuivEvyhu8T3Cv96-38S8lnsxtU68p3lNTOyjPWcSAEi1hpni_VGHiBoqJHjXq-HI0M08yYQprn-BcdQ_eIc2ROCR3JCNchO9YAjyNIIpwv42LEK8LHcQxw6onReJLKXObdTKjJfZepKxIb47WGuOmGBRXALowLL82K7HRBMqoQUmHxRa920ltiDUX8h5LOEpbMyYnHIDjfX1JWU909cAW5kIzUHbIdi4exTkqOW-AjTKtvoinn0kLI_XFm-hUThl7pbXisvsrc0W2tBn84TatAUsMCXSX7595vhm9KdaLz4tQ3SN37IWcCNRRNqTs601newY-mt6wfc25zmPkSYdYV6qjIRdpq7wcOvohnZYfQekoiO3uLUXcvJgLrTP4-YWijKd_NF5SRPEGIbTPKFIOPFNez8JUjuTDOAdDu4I3kd2QeONQ4jwv6jSGzHQEcr3yS4ydWYobK36KHP359WrxpclPQahy7tAg3Iy-DyNEOkV9pXICX9ymZclHWxCZJ9KStZqUcA331XqryoloEIGp3MOj1blui5rBF5nfJl7j8Vcng7LraSnzYb1MATaxDgNE0Rn0_5lVq8mOSyB0YJ3oCvdadIZ1VZipDXklj8DbOqmte9B7Vr0I1_vta3qfpmKomy2rAnNvPM1QNhVd4KEcteSDYhjryba_kUt7T3peDilsj69BhEW_mvQP8XaNOdr54I7H_4PNs27VudnIrnuonjDTYpgagG7ayOxOKEp29dhq4ZBROJbuO89cx4AOdT12xVI9tyTTSibA3VD3PhYYEqr82oQimtDpi8yt5LTvLBvg1BnXilU6itbXpR_rH2sHVSwfsjGUTFe4_ehD2wfCUdqEA8I26gHUPxxTDQ72_NGySL-2KfWa_PfFx-83rHCaNWBhE_MGfXbDnXUjRNqPUbwBEMhltzzE0kfPUs1wR1VSPof_g8oJwyF2f00A78d0eiQRIaWV0_UyLdNBEpUHexdvRx_lJRdRJ1BecI5c6sW7TRbqGq3pXDdbrHV_1ZMkIJmchK6pbpcLF0EKJ4vGeh2BoVSS_CcbmyLLLrEm4c2AeXm5jIaQfM5wmy-2ZLv2KxtAi_FYCIOkys5TXqKnwaEJ88jPxunluJk3L45jb_JGPPEg3QnFbvrAPJGiwcu_7p9BUihen2PPV_vPauU4WUNi_P6x5_rflXc-rJ_iHYIp-2eDMFc83ojySX1C6IfIjFbFYe1qxpFGkao11rYbWrjYE4dICB5IsSAoAmnYhvsA_E-ut_3-ND3LSeWAuIG8hobT8E_FuwKpIy3v-UoeBpCOogcf8DUlAIUpvBQC8wfsYFu80XCExiP-YUWjaFP318lx6R36B7OKqL9sVV9MbbZypOTvibDJKuZozX6KOhQ-Lv-J4Lo8bEPxgx7WkbhJ97Z9N3BaPsqKgDDbBeEokCdMOJ8KdQU4d7UtmdWDMJdfD6vpImrbKoX7F79TOfzaFURNn58zHBB7x4MAReRRy_7nAjAKYH0ZOzROSu02dVD3huiKz51bYPG73k43gX3kNs2NsBYvQPZkgXsBd0Tvr9Hlywpgbi1vjWpIzLg4gCn8-Hf9J-e3OUwGaYYJFbxpnZuC9yHdsg7XwC1D4d7xtUcicaweKoEadRaU04JzChK38CRgxPF7XCOXpa_NIMn01E4JjEQS_A66MufOpbpABeBg4e3BFi8iZCa7_pVmj820muEdgSLYGEAiQl6Uxw9GxuprD4r1AaqG_6QCk9OdN-2dJHP7xID2_44wkyj8JZj3sn2bjZrTrTRDufVrVxF6YoSXcwXDMXtmXI-XpR9_Ek5twJgdA2DOLmX50BMDkpOJFtDtztT469liWxCH1gPS4_eEG2GAG0dCqXbacjj8U9a1nnR6cuBjhN_PObvIFhQPdjZ0aCEuyQKi4-4GSnN3kPlcz7U5QvgIyhp4_jY_F0msnD9st5R5r07wGMv-y4Rawj0KXgabYeNxePut2qcxwubhLLi_B8gWzUuwFSdp1EwlKTKOPXPTZFax0OaaVcjSI6FyxpyQEXau125o5Sq1BtrOwW3ggq7UZ5Wh-f9ECVs8rZ63vr01qRyoCT8OV65z_zF3UgyWL1JraJ8tCVEF09vwiTIyEt-XB5d1IMs4hDzLkpWMNsSUdAsPVRGfGIKbNcQcFd5Rxo-m9zuRGzIx2WqhVyXThMAqrBPhm-62U-wpYnYDUvtwux5IdZEtJhYRHumc6Az7X_q0-v05_sOBOrOPX_WBWhIAQC5hjRW8wDDM5DnWokdE2gVxsW0FX_YojMjXRRIBZ0POkeE8MhupjNzcxk3YoUASYZ9M13yMz91eCoBQ_I91bx0IpZaqg3vSn05XGddkEyrPPdfh9UadhNN9MiQxKZ7vRptZVnFa2LW7l2nj2Y2bF3Zw-uXpF-LkeFAR3P2MlGmbRQ2s8R3Hj-tlRKOvkyerMvlUtTQwhh_pof4S6xdiLzHntji7RWVNKuzV2h06HGTbzVv7IaWrZM9H6SCq85L_g5-lKNme3w3BgiQ7BrZsVuMMOn40Vc8vghuZ3kln0TPVEfqRnJlVzzKPdtMc30R_9yN6vVRSHkt-A7mtHluorjrY6UFaQ-Qf25roH4AE0F9dmolEF9cKhYiGUlbJk7k58cBFnTIqIuWE25JaYl270j8xgtl6h2HR40mJpWnrNTUc2FnaNiQuoLmSHZXUxdnkpDP1mpctmdze5mwmwyG4yuKtAO-1sckdyHm5uvrV7-YISrMMJCCeiUD5lcWF-BaNJQgwmhDAYsj-b7yNcpdsbdeO93mNu_Ic_LV7eXKDOf4avlghm2Cacp2RgB9Cuy-Bqd8sfL8kfMyQQnOIguFJEKJJ_v03n9JuFwH1q8yTVgJ3lvhalCkePix3-iWhLhS-n1xnh3db_x7OpSwl7YzqTVxdvkMaSxbjsyHWV2h3bdy2fT_6ady5wyVQp19XGEM-rOx-PZ1befuS54v3pwuk2cAXYLUxv7CQImWofJNC5kbHBI0C0BaeaXRdCKsJoFjU4Fwq0m2zed4OMVIl6vIx57SPh6RvyUJ6v8jqoEqcVWLnTP6PEyGh98YrYTuTYF9tJL1YW8ZhiKIbaXgP_Q7fKDJyqqCAbmwVsp2n9IDCoyZx79KSZTf8WBbzYufrsr8LfApsdKMzabzK5Z9VB-o1FTBkMSjeDnutMd99I8-uDf-ay7cdEKqjmLOWIDl7iud1q0ikbfm2kq8eh2rihiCybKPd0lCdOJpUX3CYLfKxra7tVOlf8HUcb4mg4GT5uiu7XTmQ5hTY0UhzU5EDsU0NlfxNgEGblXs_rnI6RkJGJ5nU9WFSTwdb5zlo9aeCtFuW4SWBAIBVtps--RqYsyzht5LEAnX36NEL1cAt5Oy46UYiBypf_Ld9i9X8Kt1SmmtoYq7VaozOv7v_JULNn5Omboc3XO2NVdf8K7kizx7gf4j1sKacukeqrZ29sctLamNcT9Uy7z_1vBAXED_N1BLi8HQIhoZuxfjmoWzNdlfFDI1_CsdDfV1K8eexJF31CI2P7YixoF6oyXjTReLT7WAKVgW7EWG9dK0ofA5nergh6JxQcN8BKR6LO7rD7bejik4AJVtZ3yLLMLSONQtWGAZoxsofP3HEHpCfeAZXRUg42CAYyGXjsGzRbpQONAaMevH5_Ad_WzLPnlKxIA7rvQxfMMZoGdPLOP0ZOoTu2y2y1AEgTq5Y73mEIgVoP5jdYVQVPqKfiNDZQ5fjEa8xBAmAonIJqy-vHe4W1QWU_uREhLMKU3EwjWUlkTv7uU6k2LbFcATDElILAa1ZkTkqaKhsKj4orpK-FMaCteHbFA5wplJt-00tyieLpj92GrY8KEGEvLrYdo-wwPBAGJCycjEphddFmd0LpJgXCFJSlJCa2YcXN1DvMvuuZ6xk6bwSx3EQjWOrxKUcbIXvMI30BhahJQAk2X4uuaePe-bSHbu5nsiAPpfpL8JbeYNU0RZxVx5nqTDWntWb4FMgTPQalYGO1Cps101VkNsV9FQ_lSEw-NchHQyf1k6meLmUO7UkGpzsCYNcCLh4-PcuH4V1PlN9ADle03L_dvIuyhdHdgLb7JEH_ZDbObJXkpZBYokNe0ewW76Jyx6TUUPsnC8gYzHfeFlnl2AkqvngIHrHtuPv0KPvGBl2PUUsUY7cR7rQfnsS_12EnrxtytzadY4MnmaJJqdic-h7OSXdgwDW0OVAjcwZ5P_xBWCqiAD7eYcjUz0VY2V316hgD9Q4rzQzL2uD21ExRGKO-c7IqhVf11ZCegeWWFn9uj-X22izYMq7u37JZE-M_5LPPhknGF7bTjJeiGDvmQEfcODj30QKPwWqqYc9Re1ivWnj6uuazI0Em4x_yjsP-q2tRYj8vKUfAiERMddobsr1MffhZQgBW1fJY5w7iCYRzDaiOBzZs_o7e_1Zhyx9fG5Tqw8yvz7jrE2jF5cZhnl6JcfGXqsR2tDMBt6iPpMMD5Ax7Dz_uEQqSEUrChpIC-gzqCzj-Ba_1e1WHP3CQJO9Z0DAn28MkfKQAmyV_A4W-rwIEGVF-tlxK6VcDWZQnugbVaoHO9JsD3NchAYgY8TO7jlw1yO2NTybhDMwlk5Z359BXznCoBHWXLXg7dJiUWaBr0yl9KZrqwlnYXdYi2DIojRcXeFfayOGvLH6_rPZDHj4s-t9gFezfWr7f0iMoey2GHQ5mk-PeFcsRZsrlmqrt6MyfObCdckjhbeJob2fizioZ1tRFRxc9X8MohY5wVvBW5hBHMNUtzjc06JdBulGDojfCLZQcRQ9hf_KVK81RkOdHvZZW5IGuWQy9noCfdE61_j86yXweEO6qtYiBVy7Y3BxM3BAChJZ1aEkYf-usjRE2ycIOdJPj8mGTigbrDnJLyNNrA2xFA4FKOhqJMKn-2MVkdFvwAovOM_ND5tjyn0S525kCnX9ipdHU_5Aax52iXfMXEnxGKvo9pAvLHTLBZdbE6vJb3r-xrrSJbwyid4NkgsZuR9x-tkrT5-X4B-EwwpiS2Hy2W7PVAxoSTRfJ3KLeOsCQU7FtuP8c3cfcPYZ5X40YEn4zZt_A8VbkHRgSFaLEzLW6xnFIYBVPxcSHNCfgyYqqNoeo7_uThUpm797Fs5Lfr6LeRVZyHuWPLiAdL-Xx9RH5pfd3aAUYNBdR53K3G-pS2BjD4cEwOjj3fDwYZ5MpiTIl3iXPeAUYZELf18nHKRccqxthNwO4y9MKgY7MPNmAi4fAapO7Q-ZaR1079pI8Pg8UERvIjz6pm7QllgF6-Sg97iMYJx5VWcCd-XuhI1m6_Y3X9P4onJ6WLp9t6GPqU-oWKMFuZTyBCUyqRuZpvD-Fe_O879c0SjGxjFcIya4YG05Ts3mJYShEQqWQmkq2z6R5LFopreKuhBSVv944HjfIo0aovn4ifoO_mJ6vrSt7jmArqszFQ48WSU-yxyy-JtSjEQ62box--AkBxY_I8Dt36iANwlpshVVatFVqpb__TwuQWhdNuFAkruwz1PDxuDmDnT9Vykyi5AaQS9igxTQ7kxfVt_NVe6N6vtp5b_OtbtVrOVGQTlP_FRdPGniw_flNvvkbkBK33lIfaZFVvTVZBoN41SRwrH3sbdPMVVm42VFJ2McqVYkUDVefsCXzntp4cUQlliHn08HCMXWfP9JwCevcLlT98HelmgKvrFgVZ4Fofso06Y00A73B0asxfYlNOs5o6hhF6xTbz_z1mPzaYrUfm5fTa5WQNlCA4WZLjmK7y9YXof9LezzeHkxtS6n0_WLWuYIQuUZutwJZAW-dAFrwAnS5gNiKRJ3BXzgXTt76nUtEBzA0_XWCQIE1heLVdyccaiI6tKmk-kj4C709sxmqELinEHl9ysS3ibDh7SsIXJp0q-KwORSoKGbeyX6csHWpfkkSR8SXUq8pK6zYWDgxi5B_5mfmh51cmqpYMLEwo9RvTmbZboSzxfm6UHPKFsvcNK1OvG064CM_vpJFb8VE-mV-D2mZZzOC6JKSL9mPx9aGiCXJLtOKUM1sEEsvSXaNKmXI6u-z_TcYfU8lmA50y06jRo_bouC9Jg9saAsKblPIkfZHnYxKVdW-9-3S0wAwbbwboveZUJVGZ8x73YSVzHJgQad8RWrhRECuWMj5Jtuc7ZEi5NjyUgMU09Jx9oedAxy8Y6H6Rs2C1WFmR9kwGyuiznSnHkogcKhJgzSFHg6TaD590vLjqLNuGn6lh6c2VJHihqlag7PkghU1YvtoY1nTPDM0uu-X5sFCZgeOOafL8EE20vvIdFGlwuJkH245pjSYlk3NVCBJd-28sVQRsqMRt24BfX7LVWBsII7I6fPpJcaQFd6NZb6faN125QKAzeYm28t8KPVkhio2GJeMxpDzbJvPbgARI1tRSpkCQ3wzmm8GE2KedJGcYLKiuays6Rx2mTUt0WzougglC9nj5_IuQNDmILq0jAGtuGwZvSj97dYQLRoX8_UFuvnEkBE9DPsNQhbvNoV8FLQtU0OFIHYbYoNEILniJewIQ89QQEV2NjtnrbQdhF4r6IJT-y1v65RYWdbn4AiiiaE4ZDoDAEptJvTNpn2eLUqdo4VtimSLPdz03JIuxdGIQILmWuPPmWQZROmHi4ovCUWBN-iNxBBQPio4rJ2cdl1GWfpILvPfjsc0sapX0_NNQlqtLjafinBf2MvpL0YCqJJYYXoRwpeXKAQa1CfdGTih3PLx_H1IoxxnLNULzQRjR1Fq8wIT6GXjRAKIM-7-h3pwkcu-4lq0O3yOWKeW012DjwWkvwHda-pvhiXwBrAlLmQW5U_JThAYBB6Ogtf0vZpp0maEOTLWxnpydpYwz2fcdzt6aNgXFYmRyIdRk1jgNz1gytj_yk8PvEmu2y5bnxdwQ0VIRFj7NVjZZ6Kjfj7e8OehUt2eklXTRh45nhOCPe9c9gxXbs4z1XwBkzkNL6QpZpEGAFNV1eShzwNwRu6qwJp94DP4x10v4O7xsHwqzI0gCIT8E1ICJmwa9r3x42utZ4dGR1R9nOuzOtHmZ05td0DwUdvJ_XiuSIqEJrAhz77oCyL7QcnhYCVZ2cca6Fqp7nPq1GkjkUJxIWKkf3KpBKM2sq21yofRmDrkcJ3EZn4F1uI6PUP6QemkBtq32yOu0vqDaZlYKcL9gAkE5enb-TPp84Jl-jO4e5oVj2ULbgyi3YJsnIzQbLZJsO08VML8CwC7KuOUTns1qaIjjp9HHm2xHDz9bAzrvL3lWkYKHM0O6X2nlqy6JJ8gV1t_dR-L4d-bBpoT7rmdfvPmH2vig0SXmRvIpL-d0Wv_wD8_XRtbOYay5dj1PL9AX0LokBf88d8uLfRIGbjWx28nkSq77fCAtWKD6V9y-TB1I3rSnAw4sU2HtykH0S61E4jkyz94ibW5Im2uMAsFsqYtfrA0QMC2F6ecsl4GKk_mmQ0uDHyTxxlzSJtGpdUp1m7Wi3Gg4YQlBBaggk75kSDOUGEBN-dq9qurH1k_3pyo1zJ0lJUmjSJ1Az3UbtOgc-OPU8AOxuBClw7-e73k75LrcOkhohwMMDjzIDxLL17bOw6oQNej-v11rfx0TMpyJ3YEkZLPnEOvDSr3bDMdDwsdbhsG5egXiUa-YhtClRDMqfoEWzNeQsy-oo2yA9pz32hEcyjM_9iVyf9yOIRxEL2SK5qtKve0sbrlDdY9TnnkfUUBpbKNUePtnIKo3Rce1pI6nAyA1rLW2knWUExOHi71mpFaK6VhwVka19sGO9-nUpEK6gTGphoc1p_OTr0G3sNu7jYo1_8bEoy2MN2b6FOj2nJPALs9F4oDovn4Ipis-Dannls6SSGfIf7Yb5rhcHrVUvG39mIU88qu4hbrGr876sciKxcHEdXbq4yKnzOPpauc_pONWFxMdsW0X26sb_newpsu2iARcNTBkcP2L9oKYVulX5kMX1RwJRCBUpTUUIaSs_Fd2cGgXa840Ezcy0kzvRjbgfMLAUbwMHMjzsqMjXP7gle7HP4mhEQAGqikBG-a0bn5f15znIQ4mSjKT6JwLNR5LA22zL5w2jmBV0qYB-yH9LlwHIO_de6kZLJaaMDGp_0jPHFFqVkIUDTVohHYwxktjILBSeaKO9KetdOaj4ty3REdlSc9ZQGsK_y2koPx71oqJ1gyCdchtZtU8qs5fIKG0dgC0JtDqBX2o5XQ2sV1AKijqIrZyqIX0nQ2Iisar8ATTF390TwvB2JiVkR9SGpeXfBBGhLsSEROBgGzD0Xzhu4_6Ea9BANN9Y7VlNFDXI_roQKgnr3GuHZEYhcggMOJzU_ucexxBLYp8zk3UyXFx9MFptiWumkoj2RWE4CdH_Q0vf9x2JF1W6o8HZvRTW7G-PONa4hEZw7PUjcgQ54cAdGVkM-ueBc7eUN2kq7gB7LS5Nnm6o_8nWZp4Sfc9uo_jcTnMfxaeSAo9sykMn9By-UclmbbXZVBTaGDtqT2ViPft17_LD-X_A5h4fdknUwvjkOuxcittawU0Murkmg8ZY-t-6FPS2gC4hdz7jpeiMMnV6BzHyPgF5fXoLcLKDjZ4MjEHMBH1Tp_X_dxsbR4H9bu_xniISRk-e3pvhrpiaqlBwDVT3IIQC9s-9AONEnxWS9CnPs52zcwN4UBc13f5et_FkSjK66j9snmBs3wTfW8THpqKl6P5XPi3LFF2EzfSqxSoPU7CE-m_vo-QiQThJLgP8J4VzbL04bm2oCEvnRUlnGKoeFQHkjADLrCj1W279QGogydgLrecVrKY9CIPMIS4XMWkO-RyA-RZNw3j9mr8Otq_Xx_MQaPotvQGU-H4svkGDYBupdAR18KvpuLH7aqYLOpDrnCVjBtrJaaK1ycpaNY1eTeHNL5H5VlSCIqAB7_3tCewG03H-PDUBRHnE6hC_mfTXb_jClyVWDmuDZcxOB8vieRTYF1CkWw_TKfNzvcdtzSfpwJWMcthu1GRqJbYEYwKIWZ2yxUpnR84wCEagSytom_S75q-6vNmsmefXbgnAE5NZxXxlGnTW_FRyKGZtdgkrZQ1u9_QCbwKJ2hqxA1c9rPo-fosAptXRT_1xrhIjvxKENW0gWT7RSxC1yOCBaYc8f-GosSM-fIp0DDfmmxg1j2JT1uvA_pELE0WkFq9_gmeFaO39_d1Yudqe59QMNIj9R36D2dN6fJz8owowFvKJ0rlesNEN-KN0SfQXAcA_L4jLE65kC4CNA9S7KNW8sy3cyRPjNb5ULiEwSs9rYAnNZgd9Rrdk-X3_fcolBU0n-WGI5mBcuQIJ7Q9oenWxI8Uye0JdNOx2smqBNyO3cbRVHJkW84U0ag4-3RhL5FD7emnwIO7Fk9upC8ppX3-h8oA_MNiS8jorkAaDFzIChRcOn4EZQCa3k_3ebuen3dSPXHuzgzH8QnpDFSBk-0cviFJOt2c0KgMtwjgBoekyQbyEusCxxofiqAzOpImxPmkW2eYFVMy7cBSF6C09fffJF1o_JwndjEuDj7lsU3IzKd-O7fCibDvmmyoJbYGowOgwLdb94hkuTg4Hs7wnXN_yCg9-87yx_X0_kiWAnf5lxeAX1a6C4GlUldBKaQKXrNpWwjA6iLsB1FcilrHiHYsJUqXD6TrKVq3Sm14mZ0JZbV4itIdsPFlTDJvqrB_kzgn3Y3yBAJudjg0RFR3IVLgW9ehJ4udhzeKrCIJmK3nDa9jIWrpKwjRXabCvSFsrvbJoXC93Jz3eDc6QG4vpqP4jkmiYrxz7UaOorhqRg68w9KSt5OJZOX14sDyyDu-AWgJ-9tQjyF2sp7fdBlfTis_4pVpe9meemEAHG7TKlYeypHyBLIlvSoJK3uBcMNdvx-Nqe13-jzRKNZ_fBkKg6dWco4d2pktQBr_AtOzgByDv_XJK1U29RvzToHP_KJk3eEe0YjovI_NsunsodWbMk-VK0O1X1_vlqRyMhA3OA_7qr9mZFSs32nwED4BGCbjCLT4gB4rzZgk4OzO5L83TQWNVufiDCsKeCoaxenjo77TOJzm2anTUisWlHC2m-LQS52Pl3PklIEwZguXQSEVaI5YBnI-wT3LcMMTwT_xNBg3NVT_N55DuYvjr0Lmk5IcN5WbnKv6bzommEUu-0cDsbJW8nScu161NPQBY-KxpqEl04rm5yHcGklGkKwvJqRe41U2SLr5vYvJzgc7xan2sDHUJqcuBydTiaSv_7Wrcb295zjU6ZZugq7auRtVka2Jb3sOxA-Bc3VScP8VZUuu2z9LKC6NaGS5hk_0Jhnygupb9GpQK5qXlOy4CvyEdXieOTXbYJePJNg4KMWE1YAgiF_t-K-vdgnNCCGAx4dXVDVeKMTD3icKfdmYt7a25ez8ac91aWuMa0dIxmTfEBeEfGMm8MvhuudTk1HqmDEftagI_WITA6FrShwhyPzHo2xFBxABtRmdJia0FaU4Db16wwfGwyLc_Uus87_VA-5vtq4V_KInCoyQ0SYgJqewq4LjC6mizyhK9e8eeChCjw9frwSygx8YXzZ_NpdCqnvJDXbRYeEyOgS8-BelFyWbsCdmizs-x8s5XM0TTR6xUyEANAXZj3vAdNaUHib3RXIv2soDWaaXggrX7spYQCOqGt7OepCBFNUoY3TRDE35Nsey1ydovwJqAxmchEprMBq23Y_aaw2R3E4hRYX2Rs0FoXdlq9QUKT-ZM8rvpqco28SMeE8ZPohJVMRLwIvqn0gjcaH-Qn79PFO1z1M5XJ7svfr36t0Pw5Y1r7Q4kwDuCIbiYIsItNqJBs4j62OqdB9pM_l2889S91gU7kT5PF5jBf0y3tjy1IZE0fqhgXV-qp1trK9mXfsBbX2YaEHckvGrAG7Zix6jEAlTwMJjNF__tIoaohIsNTcBOC1nh77CgKbJNzbzFPrKj6zNtZyTPHvJ70gfJpDglFY3T11qv5sJbp2b3wn9_rQG5HalT8jxBbmOjy9frI2opyE_NeoSugD7dg_VEWH7DJEqXl-EUZk5NExgnY2faoWdHS9oMCp9NA9-WPkADRfOchC4f3bi5z8FQLJf195ABZDFOyqYtVuN2JSMYnnHBVMM6MiX0NFE9qTiVKfTeWsIKcJKm99kElgIMCWNq5liICeD4ckz50Nv4zO0DM1pGwFTyPPVWJbZ5hTWPQkZuP2gMJ8AkRjur0fgUvqUk6Hu6_rh_QEg1_Gjw00TTiSUvrjFJt6htQbSc91jAZYsDjP7QpGPqZpq38x_fclCeE8wxbvT_p7ZUhV5z4_8jnWPw43YQmNFBgQnjOmkkMwUBgR7vO98qsZrqVgVOkTXUmKTy3dBeTNS9V-x1GBNiSTG8rP9UBQPkm6KSrI5YGv6NkX-REcK0V7PmFzw5ZAN1ZkYKZkISZ189TE7BxWu6mEdg-i7uGYxyYnaF0LMj8iNT4WUPp_IcJepoIMSaiNKm_WG1n-YGndJs0447Diybh5yUPxTHryE2poKPbirj5H-UMEJ4u86PC1-cKZqnEUY2IdFEEuyfzobcP3Mb0IGIHBzJ4MFzq0zxgJyEGBcne6B5Ql8xJJxFF34ttljEiswKVfcW6_SSVBniyW8TW21DUXKByUb0x4bsr8PFu9U4cKq66WLQTzWPNyjXSM-jmL9Rnpjele8jbbJb-RaZEIZ5UFesrWKPfyoG_k0of8P7F7uNwNFVvG5VAVaHIaY1H3nimtIq9bvfTJvUz7MSupQN1NmdOaHvRCpxnOllZ-uNlYGWKRf0q6Ssh_UPpuPCgSRhFFMv-Ik0E6xwJmRRNJE6ZzpyvdncU9ib3kOV1IB5rO-s9xgFf-UXqE-0RsgZpQBac8-TPzszgwmG4f7i4TsGdPIsUlvfQpTFvGE8xNciqMOJF9j7HlsCP7kQ76Obd0tjOVoGeCBdp0hQGtidjk4kgxIen7sa9Gi8-siHMKNHoGTRL8GCfyL_Z4ol4HF_FyTntKaijYLrLpCM705Yffc7TBzHq4vXYWAjvQUXebFeBeT0DjDBzzB9EZxq_13BsludGkXMtR9WrP6xuPUlFzBJQNqnWL4FJR1U_XbwE0MSNCPxOIak8yt_IHxZ_H31RU5kCeg3_hL3isZyj1msJGs15scweF9NWc21rV8BwOqeF0potklFLvYOAehW3ACgtGOAnmbfM0Dusj88L7mY5hfMxgFq-5_X0W_teSG3IHbtMYdIBEzo9NPB6L5vnzXQ0tM73LDwydHwhmfWYyZHbxWfIpNfkXcrm9o-dw8RrxX-REK__RI53Tf4DqHv6MTElxJhZUTUTqYgwOjsjCpq0gTyxml1ntRdtDZz3KVyOgAswBHcPS-k2YW3RuaICB8DG_nOtcJN5O9tbiccV_2UtXGjTCirWmv7geYcnbgMShUYWdqqEX2m_TD_ip1Gkgsh5xf4d6gK5efDUGU5DUg9LrccsB-ps0RsoqGd-CDKoY6RT_mkQHEALNBfjlrJrUttNcIbHcB4KasyrhD-7EtECPbzFvLELIWxtEL6Ys3fJg3RbgSvVvwwydvlmnTDmpP2W5BPYRvrpYOk-ubscavoaMfBZhN6PdbRYzGnK2DHtoQ75vFn2XvSC-1GOrVDdgKZnHz3Ya4t_9HrT2w12FkJbyx-TrGVAoqlKJnZo5C3zPEMzlzCHGczQos6BFi8MCy4FnP_Wuo0TEYCTndsQ6e6DNrV0gV6KL8M8ICaFQRAzumoaAspdTHq88u1ONheWi03YoDkZHDvZJ98MVwDpSnWc2RWdTB-4P4jZStvKOrXOZM-ze7k6U_7_hmG-3ljJkJANVFUCmDDgo1ZhU1p-vnlqx1-FIlPx4M8RzoCFkCuSwHaUNLvVIKTOPvyszxQv9PtdWSjrt4er7cmNsDmAiO-_ZQ-FzFrNPRXJwxVgwJG4ulIUfTLwMRymGF2jQTTign8LMsHs8iP1gJCqDbAvoY99OoSAa8vYtP1MgPC_w8rF3qoJHOONVCgUMPfeCi-_fJdlGq-OGIQh8bzF4JVE1W--VD_biB8eetKgW-KEZkvK4ciy8hia66G-2K-4lO6migJtbpwa69p-ac2rlyeVi999rwgdF2c0UcgQSv7p9O4UF8EeJTQrr-WmGentr0mxyz1qKYHP3zpCKHyL4CCQnr0AGI7YL8r4XGtGkdO3E-RNQse_Qc489UBv8_lY6E47R0xVAP2b0gSgRs4i_c7HvCmS6iZpJ6V4k9kOd_3UXycUYupCWhi0IavYuQbkfOFp0Tt-TvdpK7U9iJrVMkDLILk-KpREI0qJHQ5snXzH3yfv7gOAP572SoWUO-s2P7Tk3eP1Cv0FaMfKT1-oOjOhotm-cOEGEbpDQUoHSwKdPfbgfYxAlxbdNpsZb51ayUf6sJwPQis2OEAUffRd42cGkJX_A2TLhnvuYBMZoSYm8ByK6bKB1bOR5nBOFhDE6Mthl-k70bFx8nW_Qls-D3jaZaicFtieRLzmN3FMQuf8I3t13i3_HECaeZcwBjaVklEJ8BrsGnmBwDPLT0Tige1_q6g-9WV2hqwm5ttXkFaXJ2CTSwQTP3piXVJXvr8InEk8wXx1yDQYUz50krmMJWvjazZ9OrH1UyRODcldHqB4nKt-nQZfgyzEImwXKtmafLfgmbzd0QjQ7NmlkxF5NnA28KAZP2ky4iCzK1x2641EsX41_AVDzmVRy7THZrSkhON1YYHiyL5Ep2d1q0PUqkZEPHE-CDvpkzY-C0nStzGNcj0sZWMvnGCfPe5BTUT3uUszoglLvgtunxEF-mZY_3T6HIBhNFnlEQ1-g2fNVhcVVcMiyntizf15AOdCT3rwCPffZgj1i2onofl2M5cYtiHK052bbvV11JCW5cjt7BzlHY0M5tPPnjfl3DsxjhWKgnOac7-FB1Gx57zjCVbMW_sRlM0wogccS2AK0pYPuuTS2QZ_7Lm6ZdnipdyTVwkC_nShV38DduBFZl7klRoNj4C_UgaYdIbfgGDt3ALJzzjHZNdUp-S_utRhfWnZoU4cm1Qhax_P1N7Lp3U-8bueaaYtWJwNBMpL5Ubh5ShXZp2i-dnJsVF5rYJYLy131dAUvSYCn-_8a3R5XST76GTrOqJpIi82jjKRI9XObMDEwkpSZ8i3PF_FNK_y_ExHn_JApcRGcRWGjOzGu4xeef3tNsBt4rBX2FlCC8bSi3s_RtaVSebbj7woKcssyVwe8p3BhiKC0w1eMvLHT4TlMBMXvqE0Bm0iIzu6Hv8NlaXjGi6ZjfQl19txnBoxrYhkNKo92IXhuAz4wpQpAGxC0SqkbDgM6sY6629uy4lDLoRNL6iJ3h_edtTLThtZgQ7wsOY1hQd_rGgtvKzGQ6-yHA1oZ1fi8eEUM5QlrtK2Bq6354KQpIF9qDHKtycZEQqOc_KKaCw5U8QT0YzFDIqxz_9gJXmBHfxfWgPJ-S7UkP5Q_hLhUxQcLTfgMdfqWXTE5_uc6slKqX1bvfTzk23U8Xm4dROYXMyMkk7fMw74v5WRvzhmIe5WWfsnHdhb_9ldU9kgJGwqqZg-1oLNHZDFhJbbNJnRjaeUd0ehuLczbgp4DA9gZEFT3Y-9f5Q-Ro-7bgLwcowOeWgT3zSNV6SprhC8PRgMmmdPn_d_DUtdUEDlMb3suDL9_b6radK34XAkgec5GcTs6Lanjd6NiQhHHQOmL2XXo2c24D-nDjd0eCFi6d9lpqX8BYOb-JdZY6n8U0bCB6vF2KgNLl1aYk_6pQZ2ZunDt3MIjIgrx-rumpcKTaMIJD7Tu8CAW6A0C6y81LOgAc9Q4VW9Q1GpU89pc8Mhlb4r_5ykjNj4X8XyW95op-wFZxCNG32o1vQ8r8k6vsRYWxefUXDSmmhfjvSbvoZtIZUyA1f9tKxwgdv2wuESKpn4NphCe_7vrMK_Y8yILHmqa5hyuOiJb6VrBzWxFsC4NHOvTX6zE6CNsplApx35lh--DTOICWmeBEZssP5PpL7uTYQ2MunFHf3RPSlv0HBQvFyxG1GE0SYSgY93Th-ERV0KbHqZG82tDRdNgRtkrYKwjc5TRXvIpSmJmVmcdV2RfjOMVUH6Ebed577UuNyPbzrv95ad6XpwgmKhEwNjjZ_fjxxmDjzuvXBAOvgbCvBW9mV5ei-pDAtbJigrc83e9Aq5qiWnKDxvMT83uSSJKNKHPxvQyD9fNZHFTnFy7GWzcUaiAO9JpahEvljyD31xUXbjs_7OdEK3CmiNJpXyMmCGDy0y-Iq82quAVfSOAJLENOEFEFAWixuYodbwdHYkuF4bBUSrZaECDPtgDF3P9FeJLDszNBkZar6Opg7eqlC2Ep2SX0wy8urBtqeKSYxH5n_XQa8976AvJ_QyWkHQx-17Ku4bzuJFTaFzql8V-Y4i_Mz5lHgvDZSf_7hEUQXGVagmcWaWRtE-2RY88PF6W3JiFKB2gbSkrxN2LmpXwfOqqJ7q1wW1orQKDK1b80bf2qTWMcEpbLDsEHjr7s1HWWR6j1koJVGlobWr06xcF0zISb1FE2wXQ6rpuaSYbDbhqwMGbWmAasA_hUCGa7hHYiZylh0bUV0Fdf5_zyCoFd6sZnBxvom333oVzLLI4-C9ibPJS8OhejgQENo9ED_wfJ-bJAoEyqALIT3c2A2BawmvIJxmyR5E6oafLtmkUiO_YkQIRm-pFcniXAWz_9Is_O3IhdcDYX9K8qxmHm9eXh_CeTSncwucGoOCFce5UIYoXaO3OIMv7-Cgj6ithFx7d302v-zIFVXR7cLizBilbJ23hTfd8449xJ7Q2Xdj5DzvvjBm1Pp7z65H7peBlkqA-dq48pScLhNtuC9Aiym0XGPtEIOcmSwuBterkav-pnPYZgVR_NrTlfFpxC8HhBmKqAgffX-iHZFkhvgQgkdcpoO4minpyNgZ8U7yuHzDDgHyMZYYTZnXBMJ122lC0HpJ_Mwoc6QCmUfAeODlweIWvzREQH4ip2MeVc7GwyQRpTqzj6LMkHbFu9lgQoAx_5ze1aiW6oxzrpRGHqNy6KR9Tpy0lUQDANtXzzeVudA-AilcUVvCFoRldromHQykrtY8Tv-n6yzUiOY8AI3EjptBF4exDvM1Bej6gdpYsCymN78b27DIhBxZ_LoNtDC6FaqnIPEoXAasbdkdj3PQaeH49sQPrcNWK1zq0wrBsXiF_I5an3BcOEjd9NcpuTZ2wAR45BiTlwn6tMRW_FWfNvC6CB0-xREmeq1QvewB8wTBhLtzxT3GRlwEEWl3knsh-33UEU-sqE6uS5WM_peBVXO3rsvHr6j6P63-LziIafxJd8x8J8W1lcq_lGBVRwHZSxaNwgxnjFa9ywfHc1nVWFxr947lWtm6lDYzsae5rf0A1UOLisjXOqy8BbZHfuj8D0qL2IEup6SweJg94V5a8SUTodviWCMA_OjZhlRx34HkfWZywQcuy0f99TwzBc54pT1QwO8oZKRdJjKKL3o_SSlLyNFDxlxOiiZNeDvj8AYHi6CSwJWY6nj67XnHQS3ET170vCUqWuVom5YsNjwwb0vPx3jwY6FQ0Ccw7KverXfaUwmOqvu50wLZlFK4H_PevIc55UGhB9kmU3AVnep1pAhqltJSQEnFGy5fP7sXPRmP703quAoF15uvr3B-0SK_PGPVnJosiM6CYoIKxQrBKj9Gy9pErrXJowFxliV1nGksxB80TsxXNHgcgxw5atvUz5OMmVsasZjA184dxjf4vDX0n54SUP7CVrk675WhBkR6wIJYXrce7-z6LjkmqymQPguz5OcJ27-TSokroce7lwjYjDaoTrPVZNb9oy29_wlYK2DTLYtNTLtlB1h9IlJ8KVdKKEsY6nxHDKR1x9o53EBvOA2ewxhrxD-9Scb-unju4G2B1LBMQWw3iQU_ms4l7VMwf5DBAZ5Wwc21Q_ZMI2iWiE1UQgPbbzYTEOD2Ecz07tRGdaMrH8WfGi-fkyvqp7isZ74gyQvQ52rZhbIkVBqLTE4tPt89AOn4kw5j_rQbzqYkaXUTeTzde3foPx0wAHBUsgVpNn_xAeSnFk1HtcS6cPBDle-sejEMWdWbN1ZOmYrS_sQTY7se3VsNFXoerKmLg5g_T5XeTPa6JGzBvxG6ZQYU9iASoeqdH2xiPo7hxw8IE13WE9Tnsc1vv0Gm6fFv7PXPwr24xEhqi1Es5crnuQmKwfxztL_QhrTCRn9nu09hdodYrSjDhqYJH73RiXHfWsfIbeNeO0oWC4MH5TiUpKclDxyZhY2lTSUOHclDWM4nptcoNs08wdK_lt1jdXY9fzMUVVcMHrHY1H2y2O4ZmoY8nLxAmWJBc3PDtNcdx_6LDAz_0EU2qBJ83BVR8k5mTwtuE2E30ccwOp7bovuvHxgKR6oOe-ZyTnJn2PeJ-wh1OOFHTrXDMba7S1twegEetwNdkz1sVc0x4F6_GvNfS7k0Db23rM-ngc0WnApzmdQG_gN6gyXVsiauDYmFsGHg21UCuYfSyDnli5BNV80PG8ZVaISjNXO4BZB1UD9VHbHAICfGH0UxlfoslTl76VufgJXiZ9klsVyt_d2zC0UjxiUOMErRTkmcfZB5sAzEeXefy4-NaFyyZL5DC91d2wdW2AqYgpy-qmgNV1qOjk2zv5X9mJznZYN3qED07WHX3qPG-5G_3zzayiketYqvSmtC3ufM-N8PWXeFizPiQFGVv2oNmfP9Vk3HUC_hWmLWJoqzsWdHwHLgMZ9b3qSKreqljE5ziiUVC6PkhRC11xRV7ElaAaiQ0qvauZgOTpq0aUufHfUCIDfKO7qwucvuneliSSCSZKtKSWFiPic9vh7fmNWs_IeAPjPDqwmrw8E9fKvTvuD5R9w6X8aOFGH3DAi72uQYZhQOmAZBSeIam8RAua5Xm6M5AXOrM00wTXAMW0ELlT4aTFWiVGBSqMeuZy-_CJF2sgbAbZNtfrqFbtpy-bVln1Q4kwomCEJentOfJ6VV2mjivR3XRUdIujDw4BwzCxelBbe8O7VYk2xcnGI7evFwTVyqkXolh7v9WNfSjS7OufOUdAdN9zit7EnRTlhKvItgQAgcmLiLJ_iBgBIDHhd4xvZbLiYtsKcMajY6pVgQ0rOBNyCe6-kbNt5l66JvlfapskxQf4aV9Y-W5yAkzBgUTSq35_nPDbTTDLx_FaxJxZ82LgI5blIwUeG7HSnXeUy-KNejJRhYo687rM1imKThWl2n-dMx5NxVhqPZ6XQL4k_NXfl0_oU4KSF1YH91rBlrqt93TNCzjxelBeCQJR9uB5IdumR5JS4o9w5D8HNnKA722CZgu6XTkNL_Hco5lPMNz0Vm-0lA_Kvw2veoZL3Y9gdSPh8CkVWzyH-oGmOwBTfWV5PZ65eAfbF6Q5KJuryDE7cXqhFky13YBw6tUwaHgBM0PnoH5LTutxVbbFfkEG9u4-smdUX8m19j0ZhqZCfiSnLcoc-TPs9EXXkeEiMz9-TdJcPFqgUB89h7JdMGMS6x8uwWEH6BVwpOTdX6AQ5lVteP21qOtVTAdM6W-nOxky8GtqW5G3BB-hKKAmdpwVodJa2onhB6mYfbaK-5InzeuzBnCNGvwEmPB14hw9m-XyoPv1PsQfetC8StO6wRwvSiY11bxhmfrBoQxToT0nQQzQ6iDjghuDMZXsEvLkoXiiTgZIMqmT7Qe_WPglC_eB2vgs0kgfAyGrUyBeBZW02cMJ5bakGRz4U1awnwGvsIZxxxwaCGJ0cbVzWqW0HUJc0JbcPZarrMTG121zGf0uvUk9ppIHT8U8ps5hv0w6EgKHNCoF7S8c8TDvN2bmmHuuPVDobeNpfVYHsFe6q5J7zwKSUoSAp0hqMelZx_T7YbqgMujQcTjQm3EzrSyz6zBabyEWKGCdJDgALE76kst6uuLC5Dnaf8n-U2RKf6nXdcTIsAN3lT1jAasZ0Gejp4HdQRebtgolrv1K8MpIFxH1m9GqODD5cwNNhbv2gMEiaukwVPrGd9-r2nvrts47-3Nsm1sviH4E6zYCTjVN-vNJMKa8bZ4EKBUbMW20lNeaNKjZgPYzusjWyJPajNQyjmnNSORhbgFPZGTaHN0NqC-kB4mN9PkMIk4JUaJ_buOEZjc4_e2LSgv4GnlD-4h0p_A5HlZiRa2f_dRWLawm_YDUQOFeCPC0i1IzbfjF9J6_2N-oDcOxqHmEpDZi4HbXGXSTddDT91qZKrO6NUJPMLvtHtS4gfdz4rG5YewOXO4w1D4luxS__T7Ov10JtfXbqFcL-omWLZePJUnqhZtFR_lKFrbe2CaHDJ46cl6mW9Dw-J-CEG4ibaAPng_gBKk2sjZB-bsIPFuXdQFe2stVC7pquikY8B3YtJCt77BkNBWa9q02Nw1EvqRrAQaoXM00CbJ_IL5dVqyWUP7WtuW6ihAONt_1HTUGv92M1JhAa98Q9OtffF4y8zFDOrRcM-GzqskGZ5I9O8pjeGvDeIoTIlXJLrjRH1a0SuPCis9purPH7npgg9B88D_J62R3xFKX8SA9dVRX1uoolsMATIis_O3n8fGz2U5W7ufshPuVuiq6J4vax5xCThhLbeuKVLtSwrrdeWHSMz3xoV6u9GoIyc9L0k6XLUTZUbWYNfzE4WwmdWGVFPQai51a2_YmEGGAFfk672YPMI0nG_fxMjjpo47MemnTFUTKw4fLPwpPwmWV2gKIPzV8iH4j5qN2q20qT28fE3P78WyluVfCdztS-BbUP-SAqo2UIzyHj0VRv78qUZAVrjVIfIX-XFxWrTQ3V3BBdk12SrWedvFBUwGRF8ZxSeEdZK6YAmYmyo_Myu01PhcGs_ahFRB5Y9rEIBD7YaVoeHvUcMwHTJc-C_XdMqo9kOaguPKjIYMHbRnyFyh9DvCA09t0Rl87zBsTl_Ik4D92Dm6KitxKs6yawlZC8utzC7lQTr39QLmQ_jJbxf_ZCY7WqMjz4cftM0mpuxwbFmfkLIH-KIbRWsKbKmbjm4610jCMwRXWcxQXV1Ca6kAuQbLS9KRRO2nq02mGn6NIAMjgzML-twYA7rguAcVGxX-JIx77slUUjnVkc0p11UoreYG0PjG64FZfXBkqmScjIVkVUNPlV6zM-LKxpJ6Qyl4u982pOCG5-iGjc0V_toUJ0yvHKkofuPpwKjmrdIH0W27qg2vnoYShOqbFwUnzfeTCHocL6nyhADPBufNnzS6wI7Dn78ZZAmVYD1ayNqR5RAT_BYw4gAuGsxoS2XbkAafMdzhQQRo9zyTSrjE4Teb9TD_t0-yOWhMFBwqF450Xxs1HnKMwCAew__CB5Yjy0WJ1q7g43rToBqgfZLLa8hzNFYqKXTAbUaVT_HREyqglXJJjGDuzlEOZHR3xSFSli1YhvzZbCfoZ_Utjpd58H0DRbiEEf0GoLt_jUF6_PZ46rrReJooDHR1jBctLIJvFx_Sur15M3T3kwDKhNHJjalXkIxBwOdjzlOS4TQ009YNnBh6PyR0xcjesVBS0j9HhoG806cxoAcyfbJ_ee6LEi26Dza4a5gp9HLOwtIoPly0zyiy-9UtvRLGRuNuSti6q5OEpZL8A_EjQX4e0lHYO0VGODw0ZFGYlKjMC5fe43iMmJZnCWcNtJ4CZS-EfWgYAloWw8Y9XzdMGv6X2cwRrT-M7uitQYK0mQHnz0WpShl7LUV9de5gvht6peYZ1te-LyR9RISOtoEudpmUz65fHrJEk-ew66K_roQR5eC1t2l8WexT-k5o0_eVcbZCSQu9P73gAMuSVU1SJeeMSjKEGsLLdjrcwxkpsgQ2i9ZhtYnt6YZTSJ1hZHBfaAuDSbtSVqoP6KDmUbDx-fxehsH5fSuZQL94X3HsMffxgI49Isk3KcxZbfzCibBCZzJcDcZnIefE1dbERiQXBrJqNwUqHmrGfCwF2xSKa-1oDtEmQra63apmfh-qVdhZg5wFfeM1n81aEp5shTjyi-5NND0MbAKobtCKSecdfcD6pxdGTYttvOkgN1HXDyXBG4NG_uS9XN4bqQI7gkjBZ7Hk_65UB99weu85C4kMYslfUiPbC-XPZv5uAo9yUPSUpMZ-vxWJv9JCCIFcrt75jyFFsIrxnAfU8ctmfC_Fk0VGvfraH5LwvYW-ZMGxH3DPdfSYuJU0spsiYhDieqNBlOdOLljw-gPu8w2jqFlQYHeogpNW49WllosWEM0JXMc3S9j-D7So6BBBEJTUj7PYv6EjsJSUYUe6RKWldQH2LTOItcTg2i_MzV1-jzkAIz9hqZ2xIgO-36FPTWKeFfbmY67RGeFWbwBU2MZHOP35U4agZUZdgKir1j3AmDbFn5HB0yd91k1tO-4BWkm5Op7QdwLGhRK_xt4rSVCAhagjpah6B0ATMQAKeIda1tHrdyc1HGuNh4gyJ15fixzVZTEO32tpi-BK3Zy2JkES1mKsYWUiJL3QJCIJZZ0yD_XYGsLihS-oEPRrzmA3a_Y2Hn-vGavalmvsFNMwOna3cmcNud9a0xWwTcifG9RxbxD7hk2wZSBasHlYFEeHJbTQfsBCPCcReYYamAdQ6jM4gA5oL7kpaO--sVV9lv9FUar2hnOdlhXneSN1kBFytSTuy_4Fk7yxAf108dzoSVbrUErkjjel9XiH2Lv-TbQjmnwgPwdGVBCFzUMp1GvxVRQ-nWITiu1NF5RLURcIawEXXkKs3XUFf9R-GkzEzT5cfkXWf7wqiloT0mW464zs5FMA2jX50J8CJRT0GS_DNGk4w0LpGpOGp41_UZSvFvH0Wsb-JIX_mXt-qP1B-4Oj6QBg5IXGmtzzNrIyiUzzkiqUuYjk9uQt4chWuHWngTPlj5jrGFOkF5SLWQlo43SJiT82vK4K7JHEQ7DN8JTWJoJ9rg1QBXRfmAZB8U9oDvlQOEzb09cblgT8nC2GBRvydXVCVyJJecclbHUHgOO4yLteTPPOMYA7YvDScZIB8UVgyzQ1caEU9uMzTXSBmwkFIAt2w538i-CqLM2jePX8BSukfVuilPJgxW-Oh2MK-wU0xhT1mOBM--Mk4wY30XLpqa2oxglqpICraDQRo0UwuAw4g7o5K5rhg4UfS06Zn94CQJNwIfVPZ386v8oNlmK2g55OfxEHekyPLdpH8wxXhSRXR_zmLHAXX6IWEEmXIzYccISmNbot-F7YLih30uX9f_ENJjJNXFLzkDEhdSPUPkfuikJ2q-B5YjKwyEw5hap-emMi8IabxDI6JWihhTsbtR1EkbaB_QX1skWPdy1yV-Wlc7GY3rknThC2IC4AdOTRSMNDlGmQpWXM26msKMKrkkfITzD9ht3NzfqaMDs659WQO_HUcB3RJJV9dhFz7Rsr-W5AxN6vgeWDDqPEsJwuj_BtTY_0Khsu6mqY9e1SHi2E5ucmrur7Wbcz-tyIGMcDdRAtgZWvnlB2h0PWG-8wCdKehYSySsqF2yFrjXYGnXDdUHYqh8hTsas6RBPQaTSVecqlZaFUEXIeYz8jzicPem_PqFzK2-xTmcEu9iZvvjIE4GWdWQqkzL3YF1xGUCPcaevUGmCW-sgHju0VNV1x-0jS5y8LWV9poZrZ9aIDzALs5xWnwfAE6Sj7jWpWoRgFQQnIGa_HG5IHr1W_mQBn5bDqPJ9IAkEGIU0bjNs6emysy1Sm32vdDYGV-oAaMYwlxtFGn4STLvrIzmXnsqKi6gZ8mqMGJbqrDWvhIqR6xW4rmXXgAV6MXvHY85NIKJLf5lKV6uOIfvxO3fKjXu_8vR263BTkufqSep_2dLsEFclb2W8qaTX24i8fLL7BU-L5ep4IwIbyVf4ZzbmfkJunHJfVYHra9Df9pUIkB00sTcZ05kGqYz7g6ZaOXH1YqGKOZfIrB_CPaCWDhoeOYla5EamNzhGlJek2zEaD_vW3Gfx9cAJ59CyfOuimJohn9qS_5iARAEfMmD9Rq-BEoD3aDmfSuWX7OYLl0VCH7c62EmZqPEXOkbpti7hxFy39w3IqaVWEyhCH5tSrnVPRwSmuYSt8f7sDjXqFy1sKWx6p4YYujE7FUEAtyWyCALhFwAHuWPoV8eH5w3DTr6GvQSwiR2ik4yO6pQ9mx0Z-4FbX1TzLeqtufPnZBHpjybb8_G3vn4_CX6xXbHeUEVDQBDaEMdGCyaZ6ZGe0LrmBStaucL4ZygZI6BMag1GUwv1mikYBlTSt1OurpqjA3KhuSy82Vnq2Q-V19O0VqZsOPqbdBDexHRD79Vm8-SeLRvm9ctT9AYkaBOfisvgQzRr3JMPELCXBaeDCNjL9w58STHr0_-NW7ksKyPqEAoN1Zq7A-pLW89wB_Cu5tdBlN6MHlM5-vwF2C0FrC08WlwDEyhwmgkPE3RyrWLlM1sID5-pZgI8n49bXDeTplwzrUdjWQsl4XuSWtWWpUwqQ8PyvkVVqstpDkH-zqqNMa6mPvpPP6KsB0wKw5xQjy_zkpyz5TE8rQggrQLCGGhd8Dyg8ULgqk3Kgh7PHI89anyhcna_dH9nVzzQBE9TsPOShthE_u7KttWCFFVvB3ACyfkAmNRhSqOyvwOquI5lAEkWKiUj9phaqZwrW04lM166t66vMavn031_lurVuy_m7Jx_VFuStYCVINCyN9QrzhMi008pS6Lllh7TV6fWBoaVhTnJpZM1a2aiwUrMejcSu6zsbQ_yAMWIKcmqBG4qoTk5FSPFja9OX5xrBVouTsriE5MuUkyQfNxfMk9qllA3dKsSwMFCTLA7nykpOeP7t2SsQTbfi349WXjZcKwk2N2OOxqi759PNsSpsptoMDZ6RR_76JNutgZ7IxFckogDRiJPB-gmFGT2si1R1CJyVzDnPcnpQ9cTp61WKzGzo8OhhJXOsjRmktlperUaNkG9bydz6BvTI87fgbxNDkBEH6TLwgBir1dWb19Om0W0CBr8Y73iTQXI84Q82ilMbNmhvvLisTmcgf5ByF4GdurncF1msDPGk7uSB-_vvkdjVYJ1kzrccARDHrbxOffNQVyalJIa6gGdelw3S7-8MpS7yCu5LAFh4Oh9FgjjoG7kiboHj_Os6jeY06ziuuhujtOCOOftoVic9TOivsh9fwmwXu5DdAIcj7aLj3W1XFxtJvMT6_tioecRZrFeLhcxrBRAhJO_fVgc8uFybLSz7xFCXBGZ0eRXClqxKRfUB4AvrlawmVbK35SiUumqX1n48zuxRMU-D_jzpnlKZIiPlHeYH2ZjK2grsbI5CQG5ajWDOJ1D2Nj_4laCpGe_WV9oGqddCYampnoB0xTfQsrgwssVd7rzyhhvnBwFDGpOMv4sKEfsc6n6GsFJtTgzew-0TR-nLs1LDngaDEcWUPZ_CO4ZsoWu74tRn9J3NzVXC7CiIRXvSNnP8BRQOFSdasKnRv85w11xb2WVZLkH3q_hQzhCTJuc7Y4PSPuvH83bAoA6CWJJpNp1NhM_he6LKKtyRnQCcAWRxmcqOTK2A8l-SvTPjz1MsrfrEuuKMM_YJekGS6ZbKvW_l3ScjuTD8IZyLhh-iuMqPx80qTqwSiXMEjbdemgG-hUEFdWK_6pbUjZuj6AfkpQn_8OG0UvRGJ_205ygFCrhbct9W_5HmfazBbRYkPw90_uu4Z2yaQpNyYLLgiHV4T2OQ1LYSzgY9CF8Foql4vy0PwLUWi4SUxlmLD_HlqgyIv8X66X6rlU4RXEudpHKFIuyt5Tgs1XMVFGIgeenXd9-HPWj9s9hOnW-tN4zjelAPbYvpC2L_YxBJgaD3ZDguWqLFxQxpCyVx7cBXIA60Kju3yeYvflzIUcfFSGKx2zT7ucajhXQXg5w9B7JTJweuNNMLCwFc4xbuvrI9WRuFckp5Y7-yF5Bp6WwlHe_OlIuWHT9NUlWBEEdAzgMOE-pch_tjhfwizsTWWfAFX9ixwiiuo-kSCRz7O7OMb_zW48Wvqbn4BpQSFHtPCw1MD1QN6fMTHfe_atpKiutbf9TbxZhJpn9RvTQ4MM87bAMu_cOD4IRPH78TgaUlNRtydGmY6BCYa7ogMrETbx_vlM6744ITy3ZpKj5HQmOZE_cOblVuF3uzsv_2RlAFjh_duGPVpPIQbG_PFswksGnFFS86GViwjyj3IGIqIJC63_e2PGpH8DO-05I20tmVYEY6FeVKZST9Wcdh0p5TiOOQIvb5LxeaMQugtG-9eBIBvgZJKPsWSPoAvu8ZkFtA7lEgsoWO89LgI5_jiLe51Yq1INnpHuLSwPxpfDI1O-t3gV4AQlKVX2ZU-m7g8q9HlfkETXtuav7BMpBrSpngQKt98xWZ4w1SBK6ymJlMwlLqhqOlWJFIsfmKs7gxkpKH3nxRFdO62B5ZINmXz3wExu1Zv5bt2dZ_GuFVFP_5syJRZRuv3a79xTzMXP4tK8o8vnHq2jaD1vlX8zDrOhlQWZpQmH9epWmc2NLgmxzzxGtgXsYxadP_CeREXJjK-wxRrgkkMfWvKIjAeznzA7WYsjO4omW3JcPnWQnOIGUBSg8Y9Bo1NuNGC3RJNIKsadkxXhHhQeZFDr8emyxGr8pd7hyAzz-YkzGpZCvW98JZl3nET7TRmJKLaLJuH7Gfx1WlcdRnjLIFHVjulYrPYpYsLCiSemhHlXsVZXtoE65vxw3Q24tiH2Yrt3KrdPqGW6LS2K4vz1tTn6I2rVNMYdzXML1riDk8sVavFGkrqyul45rvsNf_KVJmaRTjdmFxaJQWIozvWX-ixaV7s63qBxVwLKoel-UH3kPqwIJMON-_eoQfgYLbfqL6dp7yx9XQK4cvEK-6yvcLSQkRYQSiruyDazx6wZgzJ4rMFmNPinOyn8CHNNWU4JV-EXYXRSUUojYjC3sqCQzNrEfViIQTQ4tI8c7DPn84elkOMHu1uhTVBmQ-RaScKBs6JAPO58GaXl5EDzd8fdbyaDRzyCM69GXFXWfh8hy-ZLD4h3Ey2nfmHwjcU18vMo6eWS7TzU5K6n-kTdw7pLvbgiyJ5W1khHipY1q06vgzDwX0DI984B9qWHGkna6EsUjnH6w8Gh02qN-dZk7WHk31YpDm6f0SEt1iAD4VwRpGeY8sk-IMs7bLySApyiqfiWRdEdLGsljy7htvv4hwG4F0xAEaIRrkl1KSn2IvQ8OJVUERpg6oBW1Z_DHmYQGi6_2o83OYPuF8R-OA2hgYw0miYe8YGQMEIg4boeCNhe1OYE5vMXCsGvC6PzgP-PfUBImfhszV0OKvZLJIKeRWBHnDaf9zQWL3uoK0VgG91hrce2WJEJnq9YUzkRmHn7afcl9YRpxDyAcP9JUCTwvQbXF1DQhjH2q_lkdUZqsCfedaSdi6OcYDkPkFxgrAeuHqMiTm7fqmPpFtq7jjMOnvBuKwUFknc2HR3iuhOEWUI-M9DHA9B9hqLgyPACuLynlPn0OI8l_Yud9_S3TXXQQHCMHxYtQE2B6dopokNOiFc6eNh1GfxOXCZto82V21Joc19O1MobVmp2m_ZYcBbtu7hDfH7g_f-z1Oizt_Zwnj-d38JulbnOCpBKvrCXCYBzhqSPJXLxGHQ1BvwKb635PnLgKNwEmufBuInx-ZlEzUpJ4T1Fv3jCqFrZu8si2CAo0tqq8IKNhRAOaUH3a1CWsFXuihkJ0KgX_FW5PC0OgZW9Q3BFEgZMQ27qycGT_qUofp5aOnZ1Dhhub8tnhm8z40bu3A1Pj2SUHgS17gkrOtZ5y90-wb89El35LwZPsayxBROtNiqLIgUD0gxY1ye68PlI0Z0c9ijLutHWQnOoZqS37zdfivDUGaStSZsXlqAoo2AMmBBCwAafpEthlXSbefLlGEIMIpYFEWXt3tK-Ru0brKSOZftRKXK2jOlubWg4_i8W4EDhMk-O8SW1eah7m8p_EBCGboZz5PBYQytg0QRHpbOXTmC8XmtutENajJDrj_Yn2O8nE66T7OP_2v_E54VkGutkO5L9Xj2ppa3ERBm7jeCssz3feeiTxAKxBa4XS6SQ7peSidwaQ_NplZqnhjcbbv8qSCDFI4nS3w_HWonKwr_lc9YXXoLK9Df5b-1-LH6hCSgjaPScVOGVpmrlKLJmiQ0fZ0kahic_WlsZM2UvhJGzMGUloZ9xzuUbhJyaVtLQ47IA_IPq6mmnnx49nECYbB3FTlZ3s5scyF019WgeAHU2WPo6bEpAqw8hGChOYnXbphaQTlgqUhZAdC-S4Zj9kBArTaYgP-9UzOlUD-DEjhI-ul_W-1LR1LMhvfzR4N_5aZEPHNGEFIzIVgWbNXqBHgivCNYFRWiCySJRh8Lbhw83Cv-Lvozou3zoTd-4tC36I1Ib67NcyJLn0ebHsVU3aKj1HNZmwaZIbc6NxRiB8LmmVVmin-lmw--X0CQfWL7SVPYfRzTMDqeQbm6XfwFDwKyCRtGRKi1g58v8bCPIXC_2J0Mnb3OcmLNE9zF6ANwPhmeHmOe-jf700oh7QEpLEhRP7E2rNhq5rtoJwoHfIwxC8e4woWHR_uelOijud12YhAKIDrtlrqPYZHfKaZ5CMafqBiIQW7eSCNdHnoBURY4cBaTVBYgHf1D5j7N5nD85LMp7O_Fg-SkxRBuCT3YqUBlKbemtlamkWqanK_TIuKIhtSgfE5O9_YMxa-G_cjajmlPrDPz-PKx8yJQgdNjJoER7avGVCEqh9Ch83_5MpDOFavGe5McXdMBmTGXnMSxHXXrhzjBTIU3vIT6y2urZdQnLF2QZN1-P6JjgvnhJ_E9acNqK1dFxs-YL0qyq7iklp9nyQgjRYSu65TPwzM2ST6cmG2HmkHw8eCMc303rpUjI0Z3UBoP7qUitC7TOiZjH8JZ8Uuh8W-8Gyq3h4WpmZ7kbLsn3WvXVofas_osyyp5LQoKKLfJoxtYg2Qd4v1DN3st0BTCNnaOvAHlsChwcFZPCzM2mtYf16rEXwdjlGyIhHM1mMESTxNTEgtgsfqtAOGwfvkiQnrWhY6tbeEbH0A4Y17lYfzZzq81zsgU9T0t2xGQgZF8PeyDQKVEzYbP0Oy-Ksl4ddMn-5TF1uZoxe0UCLhsTB9PegdsrR1FQftmKYMSEUPVuzc5CagJnr_fTtbAnY7ZTruvq6MM6OfULY06pIcVRHuT1_vTDwVHMjFK7mdI2PgPJY9Hc-t04AXj7Q9ZekcSO9d6aOB6dly4KDGaJGVBTfku1A4xXLKOJfl6xuMWrH0U9J2iGZmJVaMIOSkVRxgzOOGn8WHKP7ziwfCTYvg-nN7hRlMY_if6C3DP4jegTRIh-vBl69zzkUFjMHKrn0T5aHm1eBCkNz5psWAAvhf6VLzUcKy_FZozlE3EzTnQcnTydFspJwlwERhABp4cm2inwM5AZlm29B0M91b-Jw4dhuKjj8p7N9QEUtqFr2QVVg6WiE9ak1KcLG85C45ilL1XdN5uhVIa38CSGZXQpYwJrlOz8C4OYCkJwioUiMga1PTsoYZYgdLpJXheSxG8X_lPI8DT84R2p693nuYBiwqxsFRUqiDyK0BTNE589pVTGnSNCgTYOHXR9wJ8nXhpplvuA_ETBcO0Zr77XjAD262kl0a4D8dC5g9Dnwqg6ct-d-_wAKRYQZoZViiZj6ccy6GxQOO1BbM2mqPR5OfV8t83YsncT56h_aPkOSI7FhUiDs3N6ICzpEvI7Yv3BYF6tcZATqwlFbsLmHE5VpnWH1Zyw8Swwk0v9E4mBt3t_DFBV9thfXo8Gnk7S35L52-ApN0hNwvvpRNhVLHbBH01HkWJ7QTeEaMeEqouMjs1N9MCcrKiYF6N82GbbkvZDdGO1CtF-MLdySBgf2P3UHLzcPSUd-cE6tpYDluv7St0e1xrG2m7qhHBMqx8GzwL89XObtN4fw2A0fqXf8o8KLXV0D-fVclnbhxqXXFjj18VeBRXbF57s1O2BrnuMxtejOlL-W5XuFYXBLWmMQ8JLBj7eF8nL-S_Ef5BWFrWA8-FjuYU5xdrHPkEwamU9mNSQ13mk4YVtvbowLJb3fEnhX3T_moDWZFatr04lgQ1CYwZyR7iyetWKytC6q4sWtXXalbsqOLtToJXBUXde5Qd0iYnj4VKeDO31WEEClDzCl73qIv7vZEL1EcvZkmKsZRhIIJGRfSCK7J0mlm6Oy_3g84I8ydDoPIvn5fbuZaqUItK3iCo7AqQzJfZ47g3byb8s_sCmyYg_wXalSvhjhY4-V2zSGtccDHBXguBc5QgHTugmES2dEQKgSgcGIcS0B_uP6XGdudl_uXzK_hGGFQAleLDgN4QuD4QsjZOgOlr52p31UM9aNnpsdo9ke2BZlx24gDlPYVIwJeAyUCPHAGa4CQPYp9_siK1d9ROaG29S9IRX08DXC6_g7X6i-fHJGe6bltkD-QhDPkDgSA9ZDv8pVJuE_S3alTJGd0qSmQMIELcwg2llD3KOdvJ8S4aHg-MEJ4FAAqE4cXvilWBKtG-UUFruLLTtfm4RcwEjuA62dKX_5TwIxrool9upPf4A5pb51soWpfBApqOzzFsXljYXaciXN8UeO9ojwTpS25nPPrUdUBxTW-MhWibBMGDglj0i5_zEIIS3Mrh0iDOpKB_EKwRBJumvKl1vlKnoz3odlWPcgc0JGNuYrdD4f2hMD2HCc1_ALchcX8YrZE5jOsbHQpJAbq6jIQRfMQC6NXg3HqzlrkBdVy3NrQ6GRkRhhzkFAFfRSxGvWNVeXcMflXnay16acVXb6tK4RDYzNmvv70uDkVPYVV9fGjh8Pw8S7lpJuIRe-3409ZaoSWF_0nqvX2FxC8_eDitdRlQyk8CAijU8uOSCf9lH3RhpdUjzEgWKKe1XEiuzMCJ_oznmXoUTOjcNWAtVKdjAP2OD0j04BySHiXTmrW8ql8lbYDjenAZX1dwakFcc9-PI79AGEWYotodCHLZP4wPtik6wcVn8EhHNJwG8ZADaEzj5tsQjnwmLxT_myA3xroVA9I4jxJyexyC1k4YYhsNFy1RFCDyVc403rgzVttvK2DmAli6YDg7iMN-fLcP0oXlozTzLxAWisfl5PaM6xqssIx4OBAQ2OJy1lTVi5fsBAMr6lfBN1icxYmJOG_P0_b-KIvu_oOcfYbthKhdmAVavy1P0Ip0p101fMfQ5LK6L-Bc334p7BDdBsnWI9KagREhCxcfy_LnTCQR43umUIMF_1wWYLFR1zhtJP-ZrKH8Z1Ikn0vXYT7PcREGER67Ff-2i31LT2vcHP9O_N1txMwB8-DI83EOMkJ5lGGUjSsboIWAVxbSS-EIGVS8EjEnITIOL4ZoNGNwLr6S9_T6jTNUtkT72bTDDqyWyLHmMZybXcqDxOZK9TdU4GQ6DsjjmftqN_cWOkrcQLAYFylmGaruUh1usbzu7jgfHoFsctC4A8pvoIWbWnMi29cUj19w7AsTCTjaEDcFw4IsndBmJ7xciDgfIYgmpKdWbfPhq-VAz70SU3_o9a1gowVRXT0nOWoltiOohaR0gqsjTJYQyA-KE9ZQIxESkU13CMckGs3B-5mrLEBtS3lw43-QyscO1R2j9WIfe4AUfUq-2LHWazP3WEyEpA4jr1AgCRqE7QMNpF5BYO2RWpn2K-2zvVScgCWh1N0-8O7TTe7IKp0RTi9iBGMHhZckt8FVUz9JsMtkeguu6quH-f3ws9hyPG6NkiDCBtPLapelqtgC6esK3YwZAeeHfy7m3jzV0i-KkunRIt0poScf4JuQk3dgRZikoTn7ncbq7_vhc3hDUGa7c02G6B4ma60GtQUa3hLbl8MUUTl52_JVzeBA07dcTbmgrzpN4VTNIY-iDn7fFCThV4c55oBQoXLk7vBTfh1Sy1FV-TnPbGby4g1QXyBvFPiSHDm1fCxBaWiRoGwiaA8bkjR8bu5inP6iJKeGZWVd2QdYIJwZsuvQHu7GdYFI39-Z9lGXQqUZYDF6H4U8WBougHQdg82q4fnyd9F27aZU9pZHEYfEl7F1uRFe41-sMxuKFwNzIUE9s-ojLYw_w7GK6Wfknhd3GxHvjr19YDJDg1gwSWQwQ0Ki20OFpbyNZ7U5FrAlTNeafjzCuLXCDrFwQdsd1cQw7XrZKNtFASsuhpM6Mv06hQQS0iiG65Nky4pytp44UsrC6QqmvOYqw87KzIpn97LjfvnknDHIKi6jS1oE7JnOTN2Y9rU1Ey6s6W_D6wenlSXbOqHQ36urYx40aMJS6-HKYHXlz8M8KwoUTiGUSPUoyt_F18RD3VNc7kTgNBqsKgQ-46CHjCB3WgakIj36-uGf9p2kQmSSjzDxbhOjlGeE6ayYLKdGB0E5crfKBjs9rTE1dQUKRbcjITMdsyAnX59T-uQBQCFXMZCO4icAZ9sXVJyC_CaGzVP6keF0IhmoKOqVM0Wbqu9_jZGLg5oJ1VkL0WdTgbWN5Oh8zABaVrWjLKNpGX3xR2c7QjsMC8NO9Viy31CW5myOwLxWGq8BqdgOyx7PYkS7572T1ZBzUr6XU= \ No newline at end of file diff --git a/monitoring/alertmanager/Dockerfile b/monitoring/alertmanager/Dockerfile deleted file mode 100644 index 24ebd04..0000000 --- a/monitoring/alertmanager/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM prom/alertmanager:v0.25.0 - -# Copy configuration -COPY alertmanager.yml /etc/alertmanager/alertmanager.yml - -# Create templates directory -USER root -RUN mkdir -p /etc/alertmanager/templates && \ - chown -R nobody:nobody /etc/alertmanager - -USER nobody - -# Expose Alertmanager port -EXPOSE 9093 - -# Start Alertmanager -CMD ["--config.file=/etc/alertmanager/alertmanager.yml", \ - "--storage.path=/alertmanager", \ - "--web.external-url=http://localhost:9093"] \ No newline at end of file diff --git a/monitoring/alertmanager/alertmanager.yml b/monitoring/alertmanager/alertmanager.yml deleted file mode 100644 index 65835a0..0000000 --- a/monitoring/alertmanager/alertmanager.yml +++ /dev/null @@ -1,94 +0,0 @@ -global: - resolve_timeout: 5m - smtp_from: 'alerts@v2-docker.com' - smtp_smarthost: 'smtp.gmail.com:587' - smtp_auth_username: '${SMTP_USERNAME}' - smtp_auth_password: '${SMTP_PASSWORD}' - smtp_require_tls: true - -# Templates for notifications -templates: - - '/etc/alertmanager/templates/*.tmpl' - -# Route tree -route: - group_by: ['alertname', 'cluster', 'service'] - group_wait: 10s - group_interval: 10s - repeat_interval: 12h - receiver: 'default' - - routes: - # Critical alerts - - match: - severity: critical - receiver: 'critical' - continue: true - - # License abuse alerts - - match: - alertname: PossibleLicenseAbuse - receiver: 'security' - repeat_interval: 1h - - # Database alerts - - match: - service: postgres - receiver: 'database' - - # Infrastructure alerts - - match_re: - alertname: ^(HighCPUUsage|HighMemoryUsage|LowDiskSpace)$ - receiver: 'infrastructure' - -# Receivers -receivers: - - name: 'default' - email_configs: - - to: 'admin@v2-docker.com' - headers: - Subject: '[{{ .Status | toUpper }}] {{ .GroupLabels.alertname }}' - html: | -

Alert: {{ .GroupLabels.alertname }}

-

Status: {{ .Status }}

- {{ range .Alerts }} -
-

Summary: {{ .Annotations.summary }}

-

Description: {{ .Annotations.description }}

-

Labels:

- - {{ end }} - - - name: 'critical' - email_configs: - - to: 'critical-alerts@v2-docker.com' - send_resolved: true - webhook_configs: - - url: '${WEBHOOK_CRITICAL}' - send_resolved: true - - - name: 'security' - email_configs: - - to: 'security@v2-docker.com' - webhook_configs: - - url: '${WEBHOOK_SECURITY}' - - - name: 'database' - email_configs: - - to: 'dba@v2-docker.com' - - - name: 'infrastructure' - email_configs: - - to: 'ops@v2-docker.com' - -# Inhibition rules -inhibit_rules: - - source_match: - severity: 'critical' - target_match: - severity: 'warning' - equal: ['alertname', 'instance'] \ No newline at end of file diff --git a/monitoring/docker-compose.monitoring.yml b/monitoring/docker-compose.monitoring.yml deleted file mode 100644 index 860c8d8..0000000 --- a/monitoring/docker-compose.monitoring.yml +++ /dev/null @@ -1,149 +0,0 @@ -version: '3.8' - -services: - prometheus: - image: prom/prometheus:latest - container_name: prometheus - restart: unless-stopped - volumes: - - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - - ./prometheus/rules:/etc/prometheus/rules - - prometheus_data:/prometheus - command: - - '--config.file=/etc/prometheus/prometheus.yml' - - '--storage.tsdb.path=/prometheus' - - '--web.console.libraries=/etc/prometheus/console_libraries' - - '--web.console.templates=/etc/prometheus/consoles' - - '--storage.tsdb.retention.time=30d' - - '--web.enable-lifecycle' - networks: - - v2_internal_net - ports: - - "9090:9090" - deploy: - resources: - limits: - cpus: '1' - memory: 2g - - grafana: - image: grafana/grafana:latest - container_name: grafana - restart: unless-stopped - environment: - - GF_SECURITY_ADMIN_USER=${GRAFANA_USER:-admin} - - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-admin} - - GF_USERS_ALLOW_SIGN_UP=false - - GF_SERVER_ROOT_URL=https://monitoring.v2-docker.com - - GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource,grafana-piechart-panel - volumes: - - grafana_data:/var/lib/grafana - - ./grafana/provisioning:/etc/grafana/provisioning - - ./grafana/dashboards:/var/lib/grafana/dashboards - networks: - - v2_internal_net - ports: - - "3000:3000" - depends_on: - - prometheus - deploy: - resources: - limits: - cpus: '0.5' - memory: 512m - - alertmanager: - image: prom/alertmanager:latest - container_name: alertmanager - restart: unless-stopped - volumes: - - ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml - - alertmanager_data:/alertmanager - command: - - '--config.file=/etc/alertmanager/alertmanager.yml' - - '--storage.path=/alertmanager' - networks: - - v2_internal_net - ports: - - "9093:9093" - deploy: - resources: - limits: - cpus: '0.5' - memory: 256m - - # PostgreSQL Exporter - postgres-exporter: - image: prometheuscommunity/postgres-exporter:latest - container_name: postgres-exporter - restart: unless-stopped - environment: - DATA_SOURCE_NAME: "postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/v2_adminpanel?sslmode=disable" - networks: - - v2_internal_net - deploy: - resources: - limits: - cpus: '0.25' - memory: 128m - - # Redis Exporter - redis-exporter: - image: oliver006/redis_exporter:latest - container_name: redis-exporter - restart: unless-stopped - environment: - REDIS_ADDR: "redis://redis:6379" - networks: - - v2_internal_net - deploy: - resources: - limits: - cpus: '0.25' - memory: 128m - - # Node Exporter (for host metrics) - node-exporter: - image: prom/node-exporter:latest - container_name: node-exporter - restart: unless-stopped - volumes: - - /proc:/host/proc:ro - - /sys:/host/sys:ro - - /:/rootfs:ro - command: - - '--path.procfs=/host/proc' - - '--path.rootfs=/rootfs' - - '--path.sysfs=/host/sys' - - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)' - networks: - - v2_internal_net - deploy: - resources: - limits: - cpus: '0.25' - memory: 128m - - # Nginx Exporter - nginx-exporter: - image: nginx/nginx-prometheus-exporter:latest - container_name: nginx-exporter - restart: unless-stopped - command: - - '-nginx.scrape-uri=http://nginx-proxy:8080/nginx_status' - networks: - - v2_internal_net - deploy: - resources: - limits: - cpus: '0.25' - memory: 128m - -networks: - v2_internal_net: - external: true - -volumes: - prometheus_data: - grafana_data: - alertmanager_data: \ No newline at end of file diff --git a/monitoring/grafana/Dockerfile b/monitoring/grafana/Dockerfile deleted file mode 100644 index d5f0e5f..0000000 --- a/monitoring/grafana/Dockerfile +++ /dev/null @@ -1,28 +0,0 @@ -FROM grafana/grafana:10.0.0 - -# Environment variables -ENV GF_SECURITY_ADMIN_USER=admin -ENV GF_SECURITY_ADMIN_PASSWORD=admin -ENV GF_USERS_ALLOW_SIGN_UP=false -ENV GF_SERVER_ROOT_URL=http://localhost:3000 -ENV GF_ANALYTICS_REPORTING_ENABLED=false -ENV GF_ANALYTICS_CHECK_FOR_UPDATES=false - -# Copy provisioning configuration -COPY provisioning/ /etc/grafana/provisioning/ - -# Copy dashboards -COPY dashboards/ /var/lib/grafana/dashboards/ - -# Install plugins -RUN grafana-cli plugins install grafana-piechart-panel && \ - grafana-cli plugins install grafana-worldmap-panel - -# Set permissions (Grafana runs as UID 472) -USER root -RUN chown -R 472:0 /var/lib/grafana/dashboards && \ - chmod -R 755 /var/lib/grafana/dashboards -USER 472 - -# Expose Grafana port -EXPOSE 3000 \ No newline at end of file diff --git a/monitoring/grafana/dashboards/license-server-dashboard.json b/monitoring/grafana/dashboards/license-server-dashboard.json deleted file mode 100644 index ae21f2a..0000000 --- a/monitoring/grafana/dashboards/license-server-dashboard.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 1, - "id": null, - "links": [], - "panels": [ - { - "datasource": "Prometheus", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "short" - } - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": ["lastNotNull"], - "fields": "", - "values": false - }, - "text": {}, - "textMode": "auto" - }, - "pluginVersion": "8.0.0", - "targets": [ - { - "expr": "sum(active_licenses_total)", - "refId": "A" - } - ], - "title": "Active Licenses", - "type": "stat" - }, - { - "datasource": "Prometheus", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "ops" - } - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 0 - }, - "id": 2, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": ["lastNotNull"], - "fields": "", - "values": false - }, - "text": {}, - "textMode": "auto" - }, - "pluginVersion": "8.0.0", - "targets": [ - { - "expr": "sum(rate(license_validation_total[5m]))", - "refId": "A" - } - ], - "title": "Validations/sec", - "type": "stat" - }, - { - "datasource": "Prometheus", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 0.01 - }, - { - "color": "red", - "value": 0.05 - } - ] - }, - "unit": "percentunit" - } - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 0 - }, - "id": 3, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": ["lastNotNull"], - "fields": "", - "values": false - }, - "text": {}, - "textMode": "auto" - }, - "pluginVersion": "8.0.0", - "targets": [ - { - "expr": "sum(rate(license_validation_errors_total[5m])) / sum(rate(license_validation_total[5m]))", - "refId": "A" - } - ], - "title": "Error Rate", - "type": "stat" - }, - { - "datasource": "Prometheus", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 200 - }, - { - "color": "red", - "value": 500 - } - ] - }, - "unit": "ms" - } - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 18, - "y": 0 - }, - "id": 4, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": ["lastNotNull"], - "fields": "", - "values": false - }, - "text": {}, - "textMode": "auto" - }, - "pluginVersion": "8.0.0", - "targets": [ - { - "expr": "histogram_quantile(0.95, sum(rate(license_validation_duration_seconds_bucket[5m])) by (le)) * 1000", - "refId": "A" - } - ], - "title": "95th Percentile Latency", - "type": "stat" - }, - { - "datasource": "Prometheus", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "tooltip": false, - "viz": false, - "legend": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "reqps" - } - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 4 - }, - "id": 5, - "options": { - "tooltip": { - "mode": "single" - }, - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - } - }, - "pluginVersion": "8.0.0", - "targets": [ - { - "expr": "sum(rate(license_validation_total{result=\"success\"}[5m]))", - "legendFormat": "Success", - "refId": "A" - }, - { - "expr": "sum(rate(license_validation_total{result=\"invalid\"}[5m]))", - "legendFormat": "Invalid", - "refId": "B" - }, - { - "expr": "sum(rate(license_validation_total{result=\"expired\"}[5m]))", - "legendFormat": "Expired", - "refId": "C" - } - ], - "title": "License Validation Rate", - "type": "timeseries" - }, - { - "datasource": "Prometheus", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "tooltip": false, - "viz": false, - "legend": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "ms" - } - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 4 - }, - "id": 6, - "options": { - "tooltip": { - "mode": "single" - }, - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - } - }, - "pluginVersion": "8.0.0", - "targets": [ - { - "expr": "histogram_quantile(0.50, sum(rate(license_validation_duration_seconds_bucket[5m])) by (le)) * 1000", - "legendFormat": "50th percentile", - "refId": "A" - }, - { - "expr": "histogram_quantile(0.95, sum(rate(license_validation_duration_seconds_bucket[5m])) by (le)) * 1000", - "legendFormat": "95th percentile", - "refId": "B" - }, - { - "expr": "histogram_quantile(0.99, sum(rate(license_validation_duration_seconds_bucket[5m])) by (le)) * 1000", - "legendFormat": "99th percentile", - "refId": "C" - } - ], - "title": "Response Time Percentiles", - "type": "timeseries" - }, - { - "datasource": "Prometheus", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "tooltip": false, - "viz": false, - "legend": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "short" - } - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 12 - }, - "id": 7, - "options": { - "tooltip": { - "mode": "single" - }, - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - } - }, - "pluginVersion": "8.0.0", - "targets": [ - { - "expr": "sum(rate(anomaly_detections_total{severity=\"low\"}[5m]))", - "legendFormat": "Low", - "refId": "A" - }, - { - "expr": "sum(rate(anomaly_detections_total{severity=\"medium\"}[5m]))", - "legendFormat": "Medium", - "refId": "B" - }, - { - "expr": "sum(rate(anomaly_detections_total{severity=\"high\"}[5m]))", - "legendFormat": "High", - "refId": "C" - }, - { - "expr": "sum(rate(anomaly_detections_total{severity=\"critical\"}[5m]))", - "legendFormat": "Critical", - "refId": "D" - } - ], - "title": "Anomaly Detection Rate by Severity", - "type": "timeseries" - }, - { - "datasource": "Prometheus", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "align": "auto", - "displayMode": "auto" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - } - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 12 - }, - "id": 8, - "options": { - "showHeader": true - }, - "pluginVersion": "8.0.0", - "targets": [ - { - "expr": "topk(10, sum by (license_id) (rate(license_validation_total[1h])))", - "format": "table", - "instant": true, - "refId": "A" - } - ], - "title": "Top 10 Most Active Licenses (Last Hour)", - "type": "table" - } - ], - "refresh": "10s", - "schemaVersion": 27, - "style": "dark", - "tags": ["license-server", "monitoring"], - "templating": { - "list": [] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "License Server Overview", - "uid": "license-server-overview", - "version": 0 -} \ No newline at end of file diff --git a/monitoring/grafana/dashboards/license-server-overview.json b/monitoring/grafana/dashboards/license-server-overview.json deleted file mode 100644 index 7b94965..0000000 --- a/monitoring/grafana/dashboards/license-server-overview.json +++ /dev/null @@ -1,486 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": null, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "tooltip": false, - "viz": false, - "legend": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "reqps" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "legend": { - "calcs": ["lastNotNull", "mean"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "10.0.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "rate(license_validations_total[5m])", - "legendFormat": "Total Validations", - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "rate(license_validations_success_total[5m])", - "legendFormat": "Successful", - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "rate(license_validations_failed_total[5m])", - "legendFormat": "Failed", - "refId": "C" - } - ], - "title": "License Validation Rate", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 1 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 6, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "values": false, - "calcs": ["lastNotNull"], - "fields": "" - }, - "text": {}, - "textMode": "auto" - }, - "pluginVersion": "10.0.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "active_licenses_total", - "refId": "A" - } - ], - "title": "Active Licenses", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 10 - }, - { - "color": "red", - "value": 50 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 6, - "x": 18, - "y": 0 - }, - "id": 3, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "values": false, - "calcs": ["lastNotNull"], - "fields": "" - }, - "text": {}, - "textMode": "auto" - }, - "pluginVersion": "10.0.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "anomalies_unresolved_total", - "refId": "A" - } - ], - "title": "Unresolved Anomalies", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "tooltip": false, - "viz": false, - "legend": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "calcs": ["lastNotNull", "mean", "max"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "10.0.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "histogram_quantile(0.50, rate(http_request_duration_seconds_bucket{service=\"license-server\"}[5m]))", - "legendFormat": "p50", - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "histogram_quantile(0.95, rate(http_request_duration_seconds_bucket{service=\"license-server\"}[5m]))", - "legendFormat": "p95", - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "histogram_quantile(0.99, rate(http_request_duration_seconds_bucket{service=\"license-server\"}[5m]))", - "legendFormat": "p99", - "refId": "C" - } - ], - "title": "API Response Time Percentiles", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "tooltip": false, - "viz": false, - "legend": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 5, - "options": { - "legend": { - "calcs": ["lastNotNull", "mean"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "10.0.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "rate(anomalies_detected_total[5m]) by (anomaly_type)", - "legendFormat": "{{ anomaly_type }}", - "refId": "A" - } - ], - "title": "Anomaly Detection Rate by Type", - "type": "timeseries" - } - ], - "refresh": "10s", - "schemaVersion": 38, - "style": "dark", - "tags": ["license-server", "monitoring"], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "License Server Overview", - "uid": "license-server-overview", - "version": 1, - "weekStart": "" -} \ No newline at end of file diff --git a/monitoring/grafana/dashboards/system-overview.json b/monitoring/grafana/dashboards/system-overview.json deleted file mode 100644 index 213040f..0000000 --- a/monitoring/grafana/dashboards/system-overview.json +++ /dev/null @@ -1,522 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": null, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "tooltip": false, - "viz": false, - "legend": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 70 - }, - { - "color": "red", - "value": 85 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "legend": { - "calcs": ["lastNotNull", "mean"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "10.0.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "100 - (avg by (instance) (irate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)", - "legendFormat": "CPU Usage %", - "refId": "A" - } - ], - "title": "System CPU Usage", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "tooltip": false, - "viz": false, - "legend": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "calcs": ["lastNotNull", "mean"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "10.0.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes", - "legendFormat": "Used Memory", - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "node_memory_MemAvailable_bytes", - "legendFormat": "Available Memory", - "refId": "B" - } - ], - "title": "System Memory Usage", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "0": { - "color": "red", - "index": 1, - "text": "Down" - }, - "1": { - "color": "green", - "index": 0, - "text": "Up" - } - }, - "type": "value" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "red", - "value": null - }, - { - "color": "green", - "value": 1 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "values": false, - "calcs": ["lastNotNull"], - "fields": "" - }, - "text": {}, - "textMode": "auto" - }, - "pluginVersion": "10.0.0", - "repeat": "service", - "repeatDirection": "h", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "up{job=~\"license-server|admin-panel|auth-service|analytics-service|admin-api-service|postgres|redis|rabbitmq|nginx\"}", - "format": "time_series", - "instant": true, - "legendFormat": "{{ job }}", - "refId": "A" - } - ], - "title": "Service Status", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "tooltip": false, - "viz": false, - "legend": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 4, - "options": { - "legend": { - "calcs": ["lastNotNull", "mean"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "10.0.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "100 - ((node_filesystem_avail_bytes{mountpoint=\"/\"} * 100) / node_filesystem_size_bytes{mountpoint=\"/\"})", - "legendFormat": "Disk Usage %", - "refId": "A" - } - ], - "title": "Disk Usage", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "tooltip": false, - "viz": false, - "legend": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "binBps" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "calcs": ["lastNotNull", "mean"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "10.0.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "rate(node_network_receive_bytes_total[5m])", - "legendFormat": "Receive", - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "expr": "rate(node_network_transmit_bytes_total[5m])", - "legendFormat": "Transmit", - "refId": "B" - } - ], - "title": "Network Traffic", - "type": "timeseries" - } - ], - "refresh": "10s", - "schemaVersion": 38, - "style": "dark", - "tags": ["system", "overview"], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "System Overview", - "uid": "system-overview", - "version": 1, - "weekStart": "" -} \ No newline at end of file diff --git a/monitoring/grafana/provisioning/dashboards/dashboards.yml b/monitoring/grafana/provisioning/dashboards/dashboards.yml deleted file mode 100644 index a64800e..0000000 --- a/monitoring/grafana/provisioning/dashboards/dashboards.yml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: 1 - -providers: - - name: 'V2 Docker Dashboards' - orgId: 1 - folder: '' - type: file - disableDeletion: false - updateIntervalSeconds: 10 - allowUiUpdates: true - options: - path: /var/lib/grafana/dashboards \ No newline at end of file diff --git a/monitoring/grafana/provisioning/datasources/prometheus.yml b/monitoring/grafana/provisioning/datasources/prometheus.yml deleted file mode 100644 index a308c4c..0000000 --- a/monitoring/grafana/provisioning/datasources/prometheus.yml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: 1 - -datasources: - - name: Prometheus - type: prometheus - access: proxy - url: http://prometheus:9090 - isDefault: true - editable: true - jsonData: - timeInterval: 15s - queryTimeout: 60s - httpMethod: POST \ No newline at end of file diff --git a/monitoring/prometheus/Dockerfile b/monitoring/prometheus/Dockerfile deleted file mode 100644 index 289f9d1..0000000 --- a/monitoring/prometheus/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM prom/prometheus:v2.45.0 - -# Copy configuration files -COPY prometheus.yml /etc/prometheus/prometheus.yml -COPY alert_rules.yml /etc/prometheus/rules/alert_rules.yml - -# Create directories for rules -USER root -RUN mkdir -p /etc/prometheus/rules && \ - chown -R nobody:nobody /etc/prometheus - -USER nobody - -# Expose Prometheus port -EXPOSE 9090 - -# Start Prometheus with configuration -CMD ["--config.file=/etc/prometheus/prometheus.yml", \ - "--storage.tsdb.path=/prometheus", \ - "--web.console.libraries=/usr/share/prometheus/console_libraries", \ - "--web.console.templates=/usr/share/prometheus/consoles", \ - "--web.enable-lifecycle", \ - "--storage.tsdb.retention.time=30d"] \ No newline at end of file diff --git a/monitoring/prometheus/alert_rules.yml b/monitoring/prometheus/alert_rules.yml deleted file mode 100644 index 664087e..0000000 --- a/monitoring/prometheus/alert_rules.yml +++ /dev/null @@ -1,208 +0,0 @@ -groups: - - name: service_alerts - interval: 30s - rules: - # Service Down Alerts - - alert: ServiceDown - expr: up == 0 - for: 2m - labels: - severity: critical - component: "{{ $labels.service }}" - annotations: - summary: "Service {{ $labels.service }} is down" - description: "{{ $labels.service }} has been down for more than 2 minutes." - - # High CPU Usage - - alert: HighCPUUsage - expr: rate(process_cpu_seconds_total[5m]) * 100 > 80 - for: 5m - labels: - severity: warning - annotations: - summary: "High CPU usage on {{ $labels.service }}" - description: "CPU usage is above 80% for more than 5 minutes on {{ $labels.service }}." - - # High Memory Usage - - alert: HighMemoryUsage - expr: (process_resident_memory_bytes / 1024 / 1024) > 1000 - for: 5m - labels: - severity: warning - annotations: - summary: "High memory usage on {{ $labels.service }}" - description: "Memory usage is above 1GB for more than 5 minutes on {{ $labels.service }}." - - - name: license_alerts - interval: 30s - rules: - # High License Validation Failure Rate - - alert: HighLicenseValidationFailureRate - expr: rate(license_validations_failed_total[5m]) / rate(license_validations_total[5m]) > 0.1 - for: 5m - labels: - severity: warning - service: license-server - annotations: - summary: "High license validation failure rate" - description: "More than 10% of license validations are failing." - - # No License Validations - - alert: NoLicenseValidations - expr: rate(license_validations_total[10m]) == 0 - for: 10m - labels: - severity: warning - service: license-server - annotations: - summary: "No license validations occurring" - description: "No license validations have been processed in the last 10 minutes." - - # High Anomaly Detection Rate - - alert: HighAnomalyRate - expr: rate(anomalies_detected_total[5m]) > 10 - for: 5m - labels: - severity: critical - service: license-server - annotations: - summary: "High anomaly detection rate" - description: "More than 10 anomalies detected per minute." - - - name: database_alerts - interval: 30s - rules: - # PostgreSQL Down - - alert: PostgreSQLDown - expr: pg_up == 0 - for: 1m - labels: - severity: critical - service: postgres - annotations: - summary: "PostgreSQL is down" - description: "PostgreSQL has been down for more than 1 minute." - - # High Database Connections - - alert: HighDatabaseConnections - expr: pg_stat_database_numbackends{datname="v2_adminpanel"} > 80 - for: 5m - labels: - severity: warning - service: postgres - annotations: - summary: "High number of database connections" - description: "More than 80 active connections to v2_adminpanel database." - - # Slow Queries - - alert: SlowQueries - expr: rate(pg_stat_statements_mean_time_seconds[5m]) > 1 - for: 5m - labels: - severity: warning - service: postgres - annotations: - summary: "Slow database queries detected" - description: "Average query time is above 1 second." - - - name: redis_alerts - interval: 30s - rules: - # Redis Down - - alert: RedisDown - expr: redis_up == 0 - for: 1m - labels: - severity: critical - service: redis - annotations: - summary: "Redis is down" - description: "Redis has been down for more than 1 minute." - - # High Redis Memory Usage - - alert: HighRedisMemory - expr: redis_memory_used_bytes / redis_memory_max_bytes > 0.9 - for: 5m - labels: - severity: warning - service: redis - annotations: - summary: "High Redis memory usage" - description: "Redis memory usage is above 90% of max memory." - - # Low Cache Hit Rate - - alert: LowCacheHitRate - expr: redis_keyspace_hits_total / (redis_keyspace_hits_total + redis_keyspace_misses_total) < 0.8 - for: 10m - labels: - severity: warning - service: redis - annotations: - summary: "Low Redis cache hit rate" - description: "Redis cache hit rate is below 80%." - - - name: api_alerts - interval: 30s - rules: - # High API Response Time - - alert: HighAPIResponseTime - expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 2 - for: 5m - labels: - severity: warning - annotations: - summary: "High API response time on {{ $labels.service }}" - description: "95th percentile response time is above 2 seconds on {{ $labels.service }}." - - # High Error Rate - - alert: HighErrorRate - expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.05 - for: 5m - labels: - severity: critical - annotations: - summary: "High error rate on {{ $labels.service }}" - description: "Error rate is above 5% on {{ $labels.service }}." - - # Rate Limit Exceeded - - alert: RateLimitExceeded - expr: rate(rate_limit_exceeded_total[5m]) > 10 - for: 5m - labels: - severity: warning - annotations: - summary: "Rate limits being exceeded frequently" - description: "Rate limits are being exceeded more than 10 times per minute." - - - name: infrastructure_alerts - interval: 30s - rules: - # High Disk Usage - - alert: HighDiskUsage - expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 20 - for: 5m - labels: - severity: warning - annotations: - summary: "Low disk space" - description: "Disk space is below 20% on root filesystem." - - # High Load Average - - alert: HighLoadAverage - expr: node_load5 > 4 - for: 5m - labels: - severity: warning - annotations: - summary: "High system load" - description: "5-minute load average is above 4." - - # Certificate Expiry - - alert: CertificateExpiringSoon - expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 7 - for: 1h - labels: - severity: warning - annotations: - summary: "SSL certificate expiring soon" - description: "SSL certificate will expire in less than 7 days." \ No newline at end of file diff --git a/monitoring/prometheus/prometheus.yml b/monitoring/prometheus/prometheus.yml deleted file mode 100644 index e6a105a..0000000 --- a/monitoring/prometheus/prometheus.yml +++ /dev/null @@ -1,111 +0,0 @@ -global: - scrape_interval: 15s - evaluation_interval: 15s - external_labels: - monitor: 'v2-docker-monitor' - environment: 'production' - -# Alertmanager configuration -alerting: - alertmanagers: - - static_configs: - - targets: - - alertmanager:9093 - -# Load rules once and periodically evaluate them -rule_files: - - '/etc/prometheus/rules/*.yml' - -# Scrape configurations -scrape_configs: - # Prometheus itself - - job_name: 'prometheus' - static_configs: - - targets: ['localhost:9090'] - labels: - service: 'prometheus' - - # License Server metrics - - job_name: 'license-server' - metrics_path: '/metrics' - static_configs: - - targets: ['license-server:8443'] - labels: - service: 'license-server' - component: 'api' - - # Auth Service metrics - - job_name: 'auth-service' - metrics_path: '/metrics' - static_configs: - - targets: ['auth-service:5001'] - labels: - service: 'auth-service' - component: 'authentication' - - # Analytics Service metrics - - job_name: 'analytics-service' - metrics_path: '/metrics' - static_configs: - - targets: ['analytics-service:5003'] - labels: - service: 'analytics-service' - component: 'analytics' - - # Admin API Service metrics - - job_name: 'admin-api-service' - metrics_path: '/metrics' - static_configs: - - targets: ['admin-api-service:5004'] - labels: - service: 'admin-api-service' - component: 'admin' - - # Admin Panel metrics - - job_name: 'admin-panel' - metrics_path: '/metrics' - static_configs: - - targets: ['admin-panel:5000'] - labels: - service: 'admin-panel' - component: 'ui' - - # PostgreSQL Exporter - - job_name: 'postgres' - static_configs: - - targets: ['postgres-exporter:9187'] - labels: - service: 'postgres' - component: 'database' - - # Redis Exporter - - job_name: 'redis' - static_configs: - - targets: ['redis-exporter:9121'] - labels: - service: 'redis' - component: 'cache' - - # RabbitMQ metrics - - job_name: 'rabbitmq' - static_configs: - - targets: ['rabbitmq:15692'] - labels: - service: 'rabbitmq' - component: 'messaging' - - # Node Exporter for host metrics - - job_name: 'node' - static_configs: - - targets: ['node-exporter:9100'] - labels: - service: 'node-exporter' - component: 'infrastructure' - - # Nginx metrics - - job_name: 'nginx' - static_configs: - - targets: ['nginx-exporter:9113'] - labels: - service: 'nginx' - component: 'proxy' \ No newline at end of file diff --git a/monitoring/prometheus/rules/license-server-alerts.yml b/monitoring/prometheus/rules/license-server-alerts.yml deleted file mode 100644 index a2996d1..0000000 --- a/monitoring/prometheus/rules/license-server-alerts.yml +++ /dev/null @@ -1,174 +0,0 @@ -groups: - - name: license_server_alerts - interval: 30s - rules: - # High error rate - - alert: HighLicenseValidationErrorRate - expr: | - ( - sum(rate(license_validation_errors_total[5m])) - / - sum(rate(license_validation_total[5m])) - ) > 0.05 - for: 5m - labels: - severity: warning - service: license-server - annotations: - summary: "High license validation error rate ({{ $value | humanizePercentage }})" - description: "License validation error rate is above 5% for the last 5 minutes" - - # License abuse detection - - alert: PossibleLicenseAbuse - expr: | - rate(license_validation_total{result="multiple_ips"}[5m]) > 0.1 - for: 10m - labels: - severity: critical - service: license-server - annotations: - summary: "Possible license abuse detected" - description: "High rate of validations from multiple IPs for same license" - - # Service down - - alert: LicenseServerDown - expr: up{job="license-server"} == 0 - for: 2m - labels: - severity: critical - service: license-server - annotations: - summary: "License server is down" - description: "License server has been down for more than 2 minutes" - - # High response time - - alert: HighLicenseValidationLatency - expr: | - histogram_quantile(0.95, - sum(rate(license_validation_duration_seconds_bucket[5m])) by (le) - ) > 0.5 - for: 5m - labels: - severity: warning - service: license-server - annotations: - summary: "High license validation latency" - description: "95th percentile latency is above 500ms" - - # Anomaly detection - - alert: HighAnomalyDetectionRate - expr: | - sum(rate(anomaly_detections_total{severity=~"high|critical"}[5m])) > 0.5 - for: 5m - labels: - severity: critical - service: license-server - annotations: - summary: "High rate of critical anomalies detected" - description: "More than 0.5 critical anomalies per second detected" - - - name: database_alerts - interval: 30s - rules: - # Database connection pool exhaustion - - alert: DatabaseConnectionPoolExhausted - expr: | - ( - pg_stat_database_numbackends{datname="v2_adminpanel"} - / - pg_settings_max_connections - ) > 0.9 - for: 5m - labels: - severity: critical - service: postgres - annotations: - summary: "Database connection pool nearly exhausted" - description: "PostgreSQL connection usage is above 90%" - - # Database replication lag - - alert: DatabaseReplicationLag - expr: | - pg_replication_lag_seconds > 10 - for: 5m - labels: - severity: warning - service: postgres - annotations: - summary: "Database replication lag detected" - description: "Replication lag is {{ $value }} seconds" - - - name: infrastructure_alerts - interval: 30s - rules: - # High CPU usage - - alert: HighCPUUsage - expr: | - ( - 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) - ) > 80 - for: 10m - labels: - severity: warning - annotations: - summary: "High CPU usage on {{ $labels.instance }}" - description: "CPU usage is above 80% for 10 minutes" - - # High memory usage - - alert: HighMemoryUsage - expr: | - ( - 1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) - ) > 0.9 - for: 5m - labels: - severity: warning - annotations: - summary: "High memory usage on {{ $labels.instance }}" - description: "Memory usage is above 90%" - - # Disk space - - alert: LowDiskSpace - expr: | - ( - node_filesystem_avail_bytes{mountpoint="/"} - / - node_filesystem_size_bytes{mountpoint="/"} - ) < 0.1 - for: 5m - labels: - severity: critical - annotations: - summary: "Low disk space on {{ $labels.instance }}" - description: "Less than 10% disk space remaining" - - - name: cache_alerts - interval: 30s - rules: - # Redis connection errors - - alert: RedisConnectionErrors - expr: | - rate(redis_connection_errors_total[5m]) > 0.1 - for: 5m - labels: - severity: warning - service: redis - annotations: - summary: "Redis connection errors detected" - description: "Redis connection error rate is {{ $value }} per second" - - # Cache hit rate - - alert: LowCacheHitRate - expr: | - ( - redis_keyspace_hits_total - / - (redis_keyspace_hits_total + redis_keyspace_misses_total) - ) < 0.7 - for: 10m - labels: - severity: warning - service: redis - annotations: - summary: "Low Redis cache hit rate" - description: "Cache hit rate is below 70%" \ No newline at end of file