diff --git a/module/Application/src/Service/PeriodeService.php b/module/Application/src/Service/PeriodeService.php
index 018e9e0f7b767af76e021437fa2dba981c90dc69..12969bca7655d6d789619c5d17d9a051e23fc1ba 100755
--- a/module/Application/src/Service/PeriodeService.php
+++ b/module/Application/src/Service/PeriodeService.php
@@ -10,7 +10,6 @@ use OffreFormation\Entity\Db\ElementPedagogique;
 use Paiement\Service\MiseEnPaiementIntervenantStructureServiceAwareTrait;
 use Paiement\Service\MiseEnPaiementServiceAwareTrait;
 
-
 /**
  * Description of Periode
  *
@@ -35,39 +34,36 @@ class PeriodeService extends AbstractEntityService
     private $cache;
 
 
-
     /**
      * retourne la classe des entités
      *
      * @return string
      * @throws RuntimeException
      */
-    public function getEntityClass()
+    public function getEntityClass ()
     {
         return Periode::class;
     }
 
 
-
     /**
      * Retourne l'alias d'entité courante
      *
      * @return string
      */
-    public function getAlias()
+    public function getAlias ()
     {
         return 'per';
     }
 
 
-
     /**
      *
      * @param string $code
      *
      * @return Periode
      */
-    public function getByCode($code)
+    public function getByCode ($code)
     {
         if (!isset($this->cache[$code])) {
             $this->cache[$code] = $this->getRepo()->findOneBy(['code' => $code]);
@@ -77,14 +73,13 @@ class PeriodeService extends AbstractEntityService
     }
 
 
-
     /**
      *
      * @param \DateTime $date
      *
      * @return Periode
      */
-    public function getPeriodePaiement(\DateTime $date = null)
+    public function getPeriodePaiement (\DateTime $date = null)
     {
         $anneeDateDebut = $this->getServiceContext()->getAnnee()->getDateDebut();
         $aY             = (int)$anneeDateDebut->format('Y');
@@ -100,7 +95,6 @@ class PeriodeService extends AbstractEntityService
     }
 
 
-
     /**
      * Retourne la liste des périodes d'enseignement
      *
@@ -108,7 +102,7 @@ class PeriodeService extends AbstractEntityService
      *
      * @return QueryBuilder
      */
-    public function finderByEnseignement(QueryBuilder $qb = null, $alias = null)
+    public function finderByEnseignement (QueryBuilder $qb = null, $alias = null)
     {
         [$qb, $alias] = $this->initQuery($qb, $alias);
         $qb->andWhere("$alias.enseignement = 1");
@@ -134,8 +128,7 @@ class PeriodeService extends AbstractEntityService
     }
 
 
-
-    public function finderByMiseEnPaiement(Structure $structure = null, QueryBuilder $qb = null, $alias = null)
+    public function finderByMiseEnPaiement (Structure $structure = null, QueryBuilder $qb = null, $alias = null)
     {
         $serviceMIS = $this->getServiceMiseEnPaiementIntervenantStructure();
 
@@ -155,13 +148,12 @@ class PeriodeService extends AbstractEntityService
     }
 
 
-
     /**
      *
      * @param QueryBuilder|null $qb
      * @param string|null       $alias
      */
-    public function orderBy(QueryBuilder $qb = null, $alias = null)
+    public function orderBy (QueryBuilder $qb = null, $alias = null)
     {
         [$qb, $alias] = $this->initQuery($qb, $alias);
 
@@ -171,13 +163,12 @@ class PeriodeService extends AbstractEntityService
     }
 
 
-
     /**
      * Retourne la liste des périodes d'enseignement
      *
      * @return Periode[]
      */
-    public function getEnseignement()
+    public function getEnseignement ()
     {
         if (!$this->enseignement) {
             $this->enseignement = $this->getList($this->finderByEnseignement());
@@ -187,49 +178,61 @@ class PeriodeService extends AbstractEntityService
     }
 
 
+    /**
+     * Retourne la liste des périodes de paiement
+     *
+     * @return Periode[]
+     */
+    public function getPaiement ()
+    {
+
+        [$qb, $alias] = $this->initQuery();
+        $qb->andWhere("$alias.paiement = 1");
+        $qb->andWhere("$alias.ordre < 13");
+
+        return $this->getList($qb);
+    }
+
 
     /**
      * Retourne le semestre 1
      *
      * @return Periode
      */
-    public function getSemestre1()
+    public function getSemestre1 ()
     {
         return $this->getRepo()->findOneBy(['code' => Periode::SEMESTRE_1]);
     }
 
 
-
     /**
      * Retourne le semestre 2
      *
      * @return Periode
      */
-    public function getSemestre2()
+    public function getSemestre2 ()
     {
         return $this->getRepo()->findOneBy(['code' => Periode::SEMESTRE_2]);
     }
 
 
-
     /**
      * Retourne le paiement tardif
      *
      * @return Periode|null
      */
-    public function getPaiementTardif(): ?Periode
+    public function getPaiementTardif (): ?Periode
     {
         return $this->getRepo()->findOneBy(['code' => Periode::PAIEMENT_TARDIF]);
     }
 
 
-
     /**
      * Sauvegarde la periode
      *
      * @param Periode $entity
      */
-    public function save($entity)
+    public function save ($entity)
     {
         if (empty($entity->getOrdre())) {
             $ordre = (int)$this->getEntityManager()->getConnection()->fetchOne("SELECT MAX(ORDRE) M FROM PERIODE P");
diff --git a/module/Mission/src/Service/CandidatureService.php b/module/Mission/src/Service/CandidatureService.php
index fc908108a60da0ddfca85ed5958ec9d547a9deb8..15fd62de4d369434df4f75f723f12cada096c678 100755
--- a/module/Mission/src/Service/CandidatureService.php
+++ b/module/Mission/src/Service/CandidatureService.php
@@ -140,7 +140,9 @@ class CandidatureService extends AbstractEntityService
             $vIntervenant = $intervenant->getNomUsuel();
         }
         $vUtilisateur = $this->getServiceContext()->getUtilisateur()->getDisplayName();
-        $html         = str_replace([':intervenant', ':utilisateur'], [$vIntervenant, $vUtilisateur], $html);
+        $offre    = $candidature->getOffre();
+        $vMission = $offre->getTitre() . ' (' . $offre->getTypeMission()->getLibelle() . ') prévue du ' . $offre->getDateDebut()->format('d-m-Y') . ' au ' . $offre->getDateFin()->format('d-m-Y');
+        $html     = str_replace([':intervenant', ':utilisateur', ':mission'], [$vIntervenant, $vUtilisateur, $vMission], $html);
         $subject      = $this->getServiceParametres()->get($sujet);
         $subject      = str_replace(':intervenant', $vIntervenant, $subject);
         $to           = (!empty($intervenant->getEmailPerso())) ? $intervenant->getEmailPerso() : $intervenant->getEmailPro();
diff --git a/module/Paiement/config/paiement.config.php b/module/Paiement/config/paiement.config.php
index 91b1ec0701479991efc4e4083e57ed7638d50b54..b1458dbfaa858d53ecca8c3fb3595372c34356d6 100755
--- a/module/Paiement/config/paiement.config.php
+++ b/module/Paiement/config/paiement.config.php
@@ -51,6 +51,11 @@ return [
                     'controller' => Controller\PaiementController::class,
                     'action'     => 'extractionPaie',
                 ],
+                'extraction-paie-prime' => [
+                    'route'      => '/extraction-paie-prime[/:type][/:periode]',
+                    'controller' => Controller\PaiementController::class,
+                    'action'     => 'extractionPaiePrime',
+                ],
                 'imputation-siham'      => [
                     'route'      => '/imputation-siham',
                     'controller' => Controller\PaiementController::class,
@@ -141,6 +146,12 @@ return [
                             'route'    => 'paiement/extraction-paie',
                             'resource' => Privileges::getResourceId(Privileges::MISE_EN_PAIEMENT_EXPORT_PAIE),
                         ],
+                        'extraction-paie-prime' => [
+                            'label'    => "Extraction des primes étudiantes",
+                            'title'    => "Export des données pour payer les primes étudiantes",
+                            'route'    => 'paiement/extraction-paie-prime',
+                            'resource' => Privileges::getResourceId(Privileges::MISSION_PRIME_GESTION),
+                        ],
 
                         'imputation-siham' => [
                             'label'    => "Imputation budgétaire SIHAM",
@@ -206,6 +217,11 @@ return [
             'action'     => ['extractionPaie', 'imputationSiham'],
             'privileges' => [Privileges::MISE_EN_PAIEMENT_EXPORT_PAIE],
         ],
+        [
+            'controller' => Controller\PaiementController::class,
+            'action'     => ['extractionPaiePrime'],
+            'privileges' => [Privileges::MISSION_PRIME_GESTION],
+        ],
     ],
 
     'rules' => [
diff --git a/module/Paiement/src/Assertion/PaiementAssertion.php b/module/Paiement/src/Assertion/PaiementAssertion.php
index a62676ce628addd33cf37aadf18fb7915435b05d..aab6f3e292c90bbac946e9b7a43b9d5c41cccfcd 100755
--- a/module/Paiement/src/Assertion/PaiementAssertion.php
+++ b/module/Paiement/src/Assertion/PaiementAssertion.php
@@ -30,22 +30,20 @@ class PaiementAssertion extends AbstractAssertion
     use TypeVolumeHoraireServiceAwareTrait;
     use WorkflowServiceAwareTrait;
 
-
     /* ---- Routage général ---- */
-    public function __invoke(array $page) // gestion des visibilités de menus
+    public function __invoke (array $page) // gestion des visibilités de menus
     {
         return $this->assertPage($page);
     }
 
 
-
     /**
      * @param ResourceInterface $entity
      * @param string            $privilege
      *
      * @return boolean
      */
-    protected function assertEntity(ResourceInterface $entity, $privilege = null)
+    protected function assertEntity (ResourceInterface $entity, $privilege = null)
     {
         $role = $this->getRole();
 
@@ -74,7 +72,6 @@ class PaiementAssertion extends AbstractAssertion
     }
 
 
-
     /**
      * @param string $controller
      * @param string $action
@@ -82,7 +79,7 @@ class PaiementAssertion extends AbstractAssertion
      *
      * @return boolean
      */
-    protected function assertController($controller, $action = null, $privilege = null)
+    protected function assertController ($controller, $action = null, $privilege = null)
     {
         $role = $this->getRole();
 
@@ -108,6 +105,9 @@ class PaiementAssertion extends AbstractAssertion
             case 'etatpaiement':
                 if ($role->getIntervenant()) return false; // pas pour les intervenants
             break;
+            case 'extractionpaieprime':
+                return $this->assertEtapeAtteignable(WfEtape::CODE_MISSION_PRIME, $intervenant);
+            break;
             case  'miseenpaiement':
 
             break;
@@ -117,8 +117,7 @@ class PaiementAssertion extends AbstractAssertion
     }
 
 
-
-    protected function assertPage(array $page)
+    protected function assertPage (array $page)
     {
         if (isset($page['workflow-etape-code'])) {
             $etape       = $page['workflow-etape-code'];
@@ -133,8 +132,7 @@ class PaiementAssertion extends AbstractAssertion
     }
 
 
-
-    protected function assertMiseEnPaiementDemande(Role $role, MiseEnPaiement $miseEnPaiement)
+    protected function assertMiseEnPaiementDemande (Role $role, MiseEnPaiement $miseEnPaiement)
     {
         if (!$this->asserts([
             !$miseEnPaiement->getValidation(),
@@ -150,8 +148,7 @@ class PaiementAssertion extends AbstractAssertion
     }
 
 
-
-    protected function assertServiceAPayerDemande(Role $role, ServiceAPayerInterface $serviceAPayer)
+    protected function assertServiceAPayerDemande (Role $role, ServiceAPayerInterface $serviceAPayer)
     {
         $oriStructure  = $role->getStructure();
         $destStructure = $serviceAPayer->getStructure();
@@ -163,8 +160,7 @@ class PaiementAssertion extends AbstractAssertion
     }
 
 
-
-    protected function assertEtapeAtteignable($etape, Intervenant $intervenant = null, Structure $structure = null)
+    protected function assertEtapeAtteignable ($etape, Intervenant $intervenant = null, Structure $structure = null)
     {
         if ($intervenant) {
             $workflowEtape = $this->getServiceWorkflow()->getEtape($etape, $intervenant, $structure);
diff --git a/module/Paiement/src/Controller/PaiementController.php b/module/Paiement/src/Controller/PaiementController.php
index 23bad0459f6f10d398e5ee8009909e76169c6f6a..78ea0c68bb0476bcf06ce076dff53a3d5a552a8b 100755
--- a/module/Paiement/src/Controller/PaiementController.php
+++ b/module/Paiement/src/Controller/PaiementController.php
@@ -51,14 +51,13 @@ class PaiementController extends AbstractController
     use WorkflowServiceAwareTrait;
     use EtatSortieServiceAwareTrait;
 
-
     /**
      * Initialisation des filtres Doctrine pour les historique.
      * Objectif : laisser passer les enregistrements passés en historique pour mettre en évidence ensuite les erreurs
      * éventuelles
      * (services sur des enseignements fermés, etc.)
      */
-    protected function initFilters()
+    protected function initFilters ()
     {
         $this->em()->getFilters()->enable('historique')->init([
             MiseEnPaiement::class,
@@ -71,18 +70,16 @@ class PaiementController extends AbstractController
     }
 
 
-
-    public function indexAction()
+    public function indexAction ()
     {
         return [];
     }
 
 
-
     /**
      * @return int
      */
-    protected function getChangeIndex()
+    protected function getChangeIndex ()
     {
         $session = $this->getSessionContainer();
         if (!isset($session->cgtIndex)) $session->cgtIndex = 0;
@@ -93,8 +90,7 @@ class PaiementController extends AbstractController
     }
 
 
-
-    protected function isChangeIndexSaved($changeIndex)
+    protected function isChangeIndexSaved ($changeIndex)
     {
         $session = $this->getSessionContainer();
         if (!isset($session->cht)) $session->cht = [];
@@ -103,8 +99,7 @@ class PaiementController extends AbstractController
     }
 
 
-
-    protected function setChangeIndexSaved($changeIndex)
+    protected function setChangeIndexSaved ($changeIndex)
     {
         $session = $this->getSessionContainer();
         if (!isset($session->cht)) $session->cht = [];
@@ -114,8 +109,7 @@ class PaiementController extends AbstractController
     }
 
 
-
-    public function demandeMiseEnPaiementAction()
+    public function demandeMiseEnPaiementAction ()
     {
         $role = $this->getServiceContext()->getSelectedIdentityRole();
         $this->initFilters();
@@ -166,7 +160,6 @@ class PaiementController extends AbstractController
             }
         }
 
-
         $dateDerniereModif   = null;
         $dernierModificateur = null;
 
@@ -211,8 +204,7 @@ class PaiementController extends AbstractController
     }
 
 
-
-    public function visualisationMiseEnPaiementAction()
+    public function visualisationMiseEnPaiementAction ()
     {
         $intervenant = $this->getEvent()->getParam('intervenant');
         /* @var $intervenant Intervenant */
@@ -235,8 +227,7 @@ class PaiementController extends AbstractController
     }
 
 
-
-    public function editionMiseEnPaiementAction()
+    public function editionMiseEnPaiementAction ()
     {
         $intervenant = $this->getEvent()->getParam('intervenant');
         /* @var $intervenant Intervenant */
@@ -290,7 +281,6 @@ class PaiementController extends AbstractController
         $res       = $this->em()->createQuery($dql)->setParameter('intervenant', $intervenant);
         $paiements = array_merge($paiements, $res->getResult());
 
-
         foreach ($paiements as $index => $paiement) {
             if (isset($mep[$paiement->getId()]) && $mep[$paiement->getId()] == "1") {
                 if ($paiement->getPeriodePaiement()) {
@@ -310,8 +300,7 @@ class PaiementController extends AbstractController
     }
 
 
-
-    public function etatPaiementAction()
+    public function etatPaiementAction ()
     {
         $this->initFilters();
 
@@ -409,8 +398,7 @@ class PaiementController extends AbstractController
     }
 
 
-
-    private function makeFilenameFromRecherche(MiseEnPaiementRecherche $recherche)
+    private function makeFilenameFromRecherche (MiseEnPaiementRecherche $recherche)
     {
         if ($recherche->getEtat() == MiseEnPaiement::A_METTRE_EN_PAIEMENT) {
             $filename = 'demande_mise_en_paiement';
@@ -426,8 +414,7 @@ class PaiementController extends AbstractController
     }
 
 
-
-    public function misesEnPaiementCsvAction()
+    public function misesEnPaiementCsvAction ()
     {
         $this->initFilters();
         $role = $this->getServiceContext()->getSelectedIdentityRole();
@@ -447,26 +434,17 @@ class PaiementController extends AbstractController
     }
 
 
-
-    public function extractionPaieAction()
+    public function extractionPaieAction ()
     {
         $this->initFilters();
         $periode = $this->params()->fromRoute('periode');
         $periode = $this->getServicePeriode()->getRepo()->findOneBy(['code' => $periode]);
 
-        $type = $this->params()->fromRoute('type');
-        $type = $this->getServiceTypeIntervenant()->getRepo()->findOneBy(['code' => $type]);
-
         $annee = $this->getServiceContext()->getAnnee();
         $role  = $this->getServiceContext()->getSelectedIdentityRole();
 
-        if (empty($type)) {
-            $types = $this->getServiceTypeIntervenant()->getList();
-
-            return compact('types');
-        } elseif (empty($periode)) {
-            $qb = $this->getServicePeriode()->finderByMiseEnPaiement();
-            $this->getServiceMiseEnPaiement()->finderByEtat(MiseEnPaiement::MIS_EN_PAIEMENT, $qb);
+        if (empty($periode)) {
+            $qb       = $this->getServicePeriode()->getPeriodePaiement();
             $periodes = $this->getServicePeriode()->getList($qb);
 
             return compact('type', 'periodes', 'annee');
@@ -487,8 +465,19 @@ class PaiementController extends AbstractController
     }
 
 
+    public function extractionPaiePrimeAction ()
+    {
+        $this->initFilters();
+        $periode = $this->params()->fromRoute('periode');
+        $annee   = $this->getServiceContext()->getAnnee();
+
+        $periodes = $this->getServicePeriode()->getPaiement();
+
+        return compact('periodes', 'annee');
+    }
+
 
-    public function imputationSihamAction()
+    public function imputationSihamAction ()
     {
         $title = 'Export des données pour le chargement en masse des imputations budgétaires dans SIHAM';
         $this->initFilters();
@@ -506,7 +495,6 @@ class PaiementController extends AbstractController
         $rechercheForm = $this->getFormPaiementMiseEnPaiementRecherche();
         $rechercheForm->bind($recherche);
 
-
         $qb = $this->getServicePeriode()->finderByMiseEnPaiement();
         $this->getServiceMiseEnPaiement()->finderByTypeIntervenant($recherche->getTypeIntervenant(), $qb);
         $this->getServiceMiseEnPaiement()->finderByEtat($recherche->getEtat(), $qb);
@@ -529,7 +517,6 @@ class PaiementController extends AbstractController
         $rechercheForm->populateIntervenants($intervenants);
         $noData = count($intervenants) == 0;
 
-
         $request = $this->getRequest();
         if ($request->isPost()) {
             $rechercheForm->setData($request->getPost());
@@ -538,7 +525,6 @@ class PaiementController extends AbstractController
 
         $etatSortie = $this->getServiceEtatSortie()->getRepo()->findOneBy(['code' => 'imputation-budgetaire']);
 
-
         if ($this->params()->fromPost('exporter-csv-imputation') !== null && $this->isAllowed(Privileges::getResourceId(Privileges::MISE_EN_PAIEMENT_EXPORT_CSV))) {
             $csvModel = $this->getServiceEtatSortie()->genererCsv($etatSortie, $recherche->getFilters());
             if ($recherche->getPeriode() != null) {
@@ -557,8 +543,7 @@ class PaiementController extends AbstractController
     }
 
 
-
-    public function miseEnPaiementAction()
+    public function miseEnPaiementAction ()
     {
         $this->initFilters();
         $title        = 'Mise en paiement';
@@ -598,11 +583,10 @@ class PaiementController extends AbstractController
     }
 
 
-
     /**
      * @param Intervenant $intervenant
      */
-    private function updateTableauxBord($intervenant)
+    private function updateTableauxBord ($intervenant)
     {
         $this->getServiceWorkflow()->calculerTableauxBord([
             'paiement',
diff --git a/module/Paiement/view/paiement/paiement/extraction-paie-prime.phtml b/module/Paiement/view/paiement/paiement/extraction-paie-prime.phtml
new file mode 100755
index 0000000000000000000000000000000000000000..93b627ecdeec51dd0853e17b41ad9b55f9456df6
--- /dev/null
+++ b/module/Paiement/view/paiement/paiement/extraction-paie-prime.phtml
@@ -0,0 +1,22 @@
+<?php
+/* @var $periodes \Application\Entity\Db\Periode[] */
+/* @var $annee \Application\Entity\Db\Annee */
+
+?>
+
+    <h1>Extraction paie des indemnités de fin de contrat</h1>
+
+
+<?php if (isset($periodes)): ?>
+    <div class="alert alert-info" role="alert">Veuillez cliquer sur la période de paiement désirée.</div>
+
+    <ul>
+        <?php
+        foreach ($periodes as $periode) {
+            $url   = '';//$this->url('paiement/extraction-paie', ['type' => $type->getCode(), 'periode' => $periode->getCode()]);
+            $title = $periode->getLibelleAnnuel($annee);
+            echo '<li><a href="' . $url . '">' . $title . '</a></li>';
+        }
+        ?>
+    </ul>
+<?php endif; ?>
\ No newline at end of file
diff --git a/module/Paiement/view/paiement/paiement/visualisation-mise-en-paiement.phtml b/module/Paiement/view/paiement/paiement/visualisation-mise-en-paiement.phtml
index 0d042c86b413219eba6c1a0a4642a2f0f282bb0f..ee3f8ba2af69b77b4cddbbae6f57c5d986d12a0c 100755
--- a/module/Paiement/view/paiement/paiement/visualisation-mise-en-paiement.phtml
+++ b/module/Paiement/view/paiement/paiement/visualisation-mise-en-paiement.phtml
@@ -8,9 +8,9 @@
 
 $this->intervenant($intervenant)->renderTitle("Mises en paiement");
 
-$data     = [];
+$data = [];
 $periodes = [];
-$total    = [
+$total = [
     'heures-a-payer'   => 0,
     'heures-demandees' => 0,
     'heures-payees'    => ['total' => 0],
@@ -19,53 +19,74 @@ $total    = [
 foreach ($paiements as $paiement) {
     $sap = $paiement->getServiceAPayer();
 
+
     if ($sap instanceof \Application\Entity\Db\FormuleResultatService) {
-        $sid = 'service-' . $sap->getService()->getId();
-    } else {
-        /* @var $sap \Application\Entity\Db\FormuleResultatServiceReferentiel */
-        $sid = 'referentiel-' . $sap->getServiceReferentiel()->getId();
+        $sapType = 'service';
+        $sid = $sapType . '-' . $sap->getService()->getId();
+    } elseif ($sap instanceof \Application\Entity\Db\FormuleResultatServiceReferentiel) {
+        $sapType = 'referentiel';
+        $sid = $sapType . '-' . $sap->getServiceReferentiel()->getId();
+    } elseif ($sap instanceof \Mission\Entity\Db\Mission) {
+        $sapType = 'mission';
+        $sid = $sapType . '-' . $sap->getId();
     }
 
 
     if (!isset($data[$sid])) {
-        if ($sap instanceof \Application\Entity\Db\FormuleResultatService) {
+        if ('service' == $sapType) {
 
             $d = [];
 
             $service = $sap->getService();
             if ($service->getElementPedagogique()) {
                 $d['structure'] = (string)$this->structure($service->getElementPedagogique()->getStructure())->renderLink();
-                $d['etape']     = (string)$this->etape($service->getElementPedagogique()->getEtape())->renderLink();
-                $d['element']   = (string)$this->elementPedagogique($service->getElementPedagogique())->renderLink();
+                $d['service'] = [
+                    'Formation'    => (string)$this->etape($service->getElementPedagogique()->getEtape())->renderLink(),
+                    'Enseignement' => (string)$this->elementPedagogique($service->getElementPedagogique())->renderLink(),
+                ];
             } else {
-                $d['structure']     = (string)$this->structure($service->getIntervenant()->getStructure())->renderLink();
-                $d['etablissement'] = $this->etablissement($service->getEtablissement())->renderLink();
-                $d['description']   = $service->getDescription();
+                $d['structure'] = (string)$this->structure($service->getIntervenant()->getStructure())->renderLink();
+                $d['service'] = [
+                    'Établissement' => $this->etablissement($service->getEtablissement())->renderLink(),
+                    'Description'   => $service->getDescription(),
+                ];
             }
-        } else {
+        } elseif ('referentiel' == $sapType) {
             $d = [];
 
             /* @var $sap \Application\Entity\Db\FormuleResultatServiceReferentiel */
             $serviceReferentiel = $sap->getServiceReferentiel();
-            $d['structure']     = (string)$this->structure($serviceReferentiel->getStructure())->renderLink();
-            $d['fonction']      = (string)$this->fonctionReferentiel($serviceReferentiel->getFonctionReferentiel())->renderLink();
-            $d['description']   = $serviceReferentiel->getCommentaires();
+            $d['structure'] = (string)$this->structure($serviceReferentiel->getStructure())->renderLink();
+            $d['service'] = [
+                'Fonction' => (string)$this->fonctionReferentiel($serviceReferentiel->getFonctionReferentiel())->renderLink(),
+                ''         => $serviceReferentiel->getCommentaires(),
+            ];
+        } elseif ('mission' == $sapType) {
+            $d = [];
+
+            /* @var $mission \Mission\Entity\Db\Mission */
+            $mission = $sap;
+            $d['structure'] = (string)$this->structure($mission->getStructure())->renderLink();
+            $d['service'] = [
+                'Type de mission' => (string)$mission->getTypeMission()->getLibelle(),
+                ''                => $mission->getLibelle(),
+            ];
         }
-        $d['heures-a-payer']     = $paiement->getHeuresAPayer();
+        $d['heures-a-payer'] = $paiement->getHeuresAPayer();
         $total['heures-a-payer'] += $paiement->getHeuresAPayer();
-        $d['heures-demandees']   = 0;
-        $d['heures-payees']      = ['total' => 0];
-        $data[$sid]              = $d;
+        $d['heures-demandees'] = 0;
+        $d['heures-payees'] = ['total' => 0];
+        $data[$sid] = $d;
     }
 
     // addition des heures demandées
     $data[$sid]['heures-demandees'] += $paiement->getHeuresDemandees();
-    $total['heures-demandees']      += $paiement->getHeuresDemandees();
+    $total['heures-demandees'] += $paiement->getHeuresDemandees();
 
     // addition des heures payées
     if ($hp = $paiement->getHeuresPayees()) {
         $data[$sid]['heures-payees']['total'] += $paiement->getHeuresPayees();
-        $total['heures-payees']['total']      += $paiement->getHeuresPayees();
+        $total['heures-payees']['total'] += $paiement->getHeuresPayees();
 
         $ppId = $paiement->getPeriodePaiement()->getId();
         if (!isset($periodes[$ppId])) {
@@ -96,8 +117,7 @@ foreach ($periodes as $id => $periode) {
 <table class="table table-bordered table-sm">
     <tr>
         <th style="width:10%">Composante</th>
-        <th style="width:25%">Formation</th>
-        <th style="width:25%">Enseignement</th>
+        <th style="width:50%">Service</th>
         <th style="width:10%">À payer <abbr title="Heures équivalent TD">(HETD)</abbr></th>
         <th style="width:10%"><abbr title="Demandes émanant de la composante">Demandes de paiement</abbr> <abbr
                     title="Heures équivalent TD">(HETD)</abbr></th>
@@ -109,22 +129,15 @@ foreach ($periodes as $id => $periode) {
             $d['heures-restantes'] = $d['heures-a-payer'] - $d['heures-payees']['total'];
 
             echo '<tr>';
-            if (isset($d['element'])) {
-                // enseignement normal
-                echo '<td>' . $d['structure'] . '</td>';
-                echo '<td>' . $d['etape'] . '</td>';
-                echo '<td>' . $d['element'] . '</td>';
-            } elseif (isset($d['etablissement'])) {
-                // enseignement extérieur
-                echo '<td colspan="2">' . $d['etablissement'] . '</td>';
-                echo '<td>' . $d['description'] . '</td>';
-            } elseif (isset($d['fonction'])) {
-                // référentiel
-                echo '<td>' . $d['structure'] . '</td>';
-                echo '<td>' . $d['fonction'] . ' <small>(Référentiel)</small></td>';
-                echo '<td>' . $d['description'] . '</td>';
+            echo '<td>' . $d['structure'] . '</td>';
+            echo '<td>';
+            foreach ($d['service'] as $k => $v) {
+                if ($k) {
+                    echo "<b>$k</b> : ";
+                }
+                echo "$v<br />";
             }
-
+            echo '</td>';
             echo '<td>' . \UnicaenApp\Util::formattedNumber($d['heures-a-payer']) . '</td>';
             echo '<td>' . \UnicaenApp\Util::formattedNumber($d['heures-demandees']) . '</td>';
             echo '<td><table class="table table-bordered table-xs" style="margin-bottom: 0px">';
@@ -153,12 +166,15 @@ foreach ($periodes as $id => $periode) {
         <td colspan="2" style="text-align:right"><?= \UnicaenApp\Util::formattedNumber($total['heures-a-payer']) ?></td>
     </tr>
     <tr>
-        <th><abbr title="Demandes émanant de la composante">Demandes de paiement</abbr> <abbr title="Heures équivalent TD">(HETD)</abbr>
+        <th><abbr title="Demandes émanant de la composante">Demandes de paiement</abbr> <abbr
+                    title="Heures équivalent TD">(HETD)</abbr>
         </th>
-        <td colspan="2" style="text-align:right"><?= \UnicaenApp\Util::formattedNumber($total['heures-demandees']) ?></td>
+        <td colspan="2"
+            style="text-align:right"><?= \UnicaenApp\Util::formattedNumber($total['heures-demandees']) ?></td>
     </tr>
     <tr>
-        <th rowspan="<?= count($total['heures-payees']) ?>">Mises en paiement <abbr title="Heures équivalent TD">(HETD)</abbr>
+        <th rowspan="<?= count($total['heures-payees']) ?>">Mises en paiement <abbr
+                    title="Heures équivalent TD">(HETD)</abbr>
         </th>
     </tr>
     <?php foreach ($periodes as $pid => $periode): if (isset($total['heures-payees'][$pid])): ?>
diff --git a/package-lock.json b/package-lock.json
index 1598f648a6e2d895f4dd07ebf8a5e7331801a6fd..dcb037700cf648994a386e08d33e59143f115412 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,6 +17,8 @@
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
       "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@jridgewell/gen-mapping": "^0.3.0",
         "@jridgewell/trace-mapping": "^0.3.9"
@@ -37,6 +39,8 @@
       "version": "7.21.4",
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz",
       "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@babel/highlight": "^7.18.6"
       },
@@ -48,6 +52,8 @@
       "version": "7.21.7",
       "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz",
       "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -56,6 +62,8 @@
       "version": "7.21.5",
       "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.5.tgz",
       "integrity": "sha512-9M398B/QH5DlfCOTKDZT1ozXr0x8uBEeFd+dJraGUZGiaNpGCDVGCc14hZexsMblw3XxltJ+6kSvogp9J+5a9g==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
         "@babel/code-frame": "^7.21.4",
@@ -85,6 +93,8 @@
       "version": "6.3.0",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
       "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "optional": true,
+      "peer": true,
       "bin": {
         "semver": "bin/semver.js"
       }
@@ -93,6 +103,8 @@
       "version": "7.21.5",
       "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz",
       "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@babel/types": "^7.21.5",
         "@jridgewell/gen-mapping": "^0.3.2",
@@ -107,6 +119,8 @@
       "version": "7.21.5",
       "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz",
       "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@babel/compat-data": "^7.21.5",
         "@babel/helper-validator-option": "^7.21.0",
@@ -125,6 +139,8 @@
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
       "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "yallist": "^3.0.2"
       }
@@ -133,6 +149,8 @@
       "version": "6.3.0",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
       "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "optional": true,
+      "peer": true,
       "bin": {
         "semver": "bin/semver.js"
       }
@@ -140,12 +158,16 @@
     "node_modules/@babel/helper-compilation-targets/node_modules/yallist": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/@babel/helper-environment-visitor": {
       "version": "7.21.5",
       "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz",
       "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -154,6 +176,8 @@
       "version": "7.21.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
       "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@babel/template": "^7.20.7",
         "@babel/types": "^7.21.0"
@@ -166,6 +190,8 @@
       "version": "7.18.6",
       "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
       "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@babel/types": "^7.18.6"
       },
@@ -177,6 +203,8 @@
       "version": "7.21.4",
       "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz",
       "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@babel/types": "^7.21.4"
       },
@@ -188,6 +216,8 @@
       "version": "7.21.5",
       "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz",
       "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@babel/helper-environment-visitor": "^7.21.5",
         "@babel/helper-module-imports": "^7.21.4",
@@ -206,6 +236,8 @@
       "version": "7.21.5",
       "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz",
       "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@babel/types": "^7.21.5"
       },
@@ -217,6 +249,8 @@
       "version": "7.18.6",
       "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
       "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@babel/types": "^7.18.6"
       },
@@ -228,6 +262,8 @@
       "version": "7.21.5",
       "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz",
       "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -236,6 +272,8 @@
       "version": "7.19.1",
       "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
       "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -244,6 +282,8 @@
       "version": "7.21.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
       "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -252,6 +292,8 @@
       "version": "7.21.5",
       "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz",
       "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@babel/template": "^7.20.7",
         "@babel/traverse": "^7.21.5",
@@ -265,6 +307,8 @@
       "version": "7.18.6",
       "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
       "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@babel/helper-validator-identifier": "^7.18.6",
         "chalk": "^2.0.0",
@@ -289,6 +333,8 @@
       "version": "7.21.7",
       "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.21.7.tgz",
       "integrity": "sha512-0SINMPlXMqJVZuJmookfaNr5NQiW5+vkHJfnEf+5+2vSf5PxuFAwnjOnRGgLcW9wVv4xUBQvKeKBtYv/lqC/xA==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -297,6 +343,8 @@
       "version": "7.20.7",
       "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
       "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@babel/code-frame": "^7.18.6",
         "@babel/parser": "^7.20.7",
@@ -310,6 +358,8 @@
       "version": "7.21.5",
       "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz",
       "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@babel/code-frame": "^7.21.4",
         "@babel/generator": "^7.21.5",
@@ -330,6 +380,8 @@
       "version": "7.21.5",
       "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz",
       "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@babel/helper-string-parser": "^7.21.5",
         "@babel/helper-validator-identifier": "^7.19.1",
@@ -673,6 +725,8 @@
       "version": "0.3.3",
       "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
       "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@jridgewell/set-array": "^1.0.1",
         "@jridgewell/sourcemap-codec": "^1.4.10",
@@ -686,6 +740,8 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
       "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=6.0.0"
       }
@@ -694,6 +750,8 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
       "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=6.0.0"
       }
@@ -707,6 +765,8 @@
       "version": "0.3.18",
       "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
       "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@jridgewell/resolve-uri": "3.1.0",
         "@jridgewell/sourcemap-codec": "1.4.14"
@@ -715,7 +775,9 @@
     "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": {
       "version": "1.4.14",
       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
-      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
+      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
@@ -800,16 +862,6 @@
         "node": "^14.18.0 || >=16.10.0"
       }
     },
-    "node_modules/@popperjs/core": {
-      "version": "2.11.7",
-      "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz",
-      "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==",
-      "peer": true,
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/popperjs"
-      }
-    },
     "node_modules/@rollup/pluginutils": {
       "version": "5.0.2",
       "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
@@ -836,11 +888,6 @@
       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz",
       "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA=="
     },
-    "node_modules/@types/web-bluetooth": {
-      "version": "0.0.16",
-      "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
-      "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
-    },
     "node_modules/@vitejs/plugin-vue": {
       "version": "4.2.1",
       "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.1.tgz",
@@ -955,89 +1002,6 @@
       "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz",
       "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ=="
     },
-    "node_modules/@vueuse/core": {
-      "version": "9.13.0",
-      "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz",
-      "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
-      "dependencies": {
-        "@types/web-bluetooth": "^0.0.16",
-        "@vueuse/metadata": "9.13.0",
-        "@vueuse/shared": "9.13.0",
-        "vue-demi": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@vueuse/core/node_modules/vue-demi": {
-      "version": "0.14.0",
-      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.0.tgz",
-      "integrity": "sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==",
-      "hasInstallScript": true,
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@vueuse/metadata": {
-      "version": "9.13.0",
-      "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz",
-      "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==",
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@vueuse/shared": {
-      "version": "9.13.0",
-      "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz",
-      "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
-      "dependencies": {
-        "vue-demi": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@vueuse/shared/node_modules/vue-demi": {
-      "version": "0.14.0",
-      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.0.tgz",
-      "integrity": "sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==",
-      "hasInstallScript": true,
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/acorn": {
       "version": "8.8.2",
       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
@@ -1053,6 +1017,8 @@
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
       "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "debug": "4"
       },
@@ -1064,6 +1030,8 @@
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
       "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "color-convert": "^1.9.0"
       },
@@ -1111,123 +1079,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/bootstrap": {
-      "version": "5.2.3",
-      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz",
-      "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/twbs"
-        },
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/bootstrap"
-        }
-      ],
-      "peer": true,
-      "peerDependencies": {
-        "@popperjs/core": "^2.11.6"
-      }
-    },
-    "node_modules/bootstrap-vue-next": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/bootstrap-vue-next/-/bootstrap-vue-next-0.7.3.tgz",
-      "integrity": "sha512-YHlqH6dCWZsCwQTBUOrhER3f/G/vN/aC34zAaFxnewXNkWJIdNWSdF0cipJqDti9aSC7iuprNu7Q0Ajeg/jElA==",
-      "dependencies": {
-        "@nuxt/kit": "3.0.0",
-        "@vueuse/core": "^9.11.1"
-      },
-      "peerDependencies": {
-        "@popperjs/core": "^2.11.6",
-        "bootstrap": "^5.2.3",
-        "vue": "^3.2.45"
-      }
-    },
-    "node_modules/bootstrap-vue-next/node_modules/@nuxt/kit": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.0.0.tgz",
-      "integrity": "sha512-7ZsOLt5s9a0ZleAIzmoD70JwkZf5ti6bDdxl6f8ew7Huxz+ni/oRfTPTX9TrORXsgW5CvDt6Q9M7IJNPkAN/Iw==",
-      "dependencies": {
-        "@nuxt/schema": "3.0.0",
-        "c12": "^1.0.1",
-        "consola": "^2.15.3",
-        "defu": "^6.1.1",
-        "globby": "^13.1.2",
-        "hash-sum": "^2.0.0",
-        "ignore": "^5.2.0",
-        "jiti": "^1.16.0",
-        "knitwork": "^1.0.0",
-        "lodash.template": "^4.5.0",
-        "mlly": "^1.0.0",
-        "pathe": "^1.0.0",
-        "pkg-types": "^1.0.1",
-        "scule": "^1.0.0",
-        "semver": "^7.3.8",
-        "unctx": "^2.1.0",
-        "unimport": "^1.0.1",
-        "untyped": "^1.0.0"
-      },
-      "engines": {
-        "node": "^14.16.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
-      }
-    },
-    "node_modules/bootstrap-vue-next/node_modules/@nuxt/schema": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.0.0.tgz",
-      "integrity": "sha512-5fwsidhs5NjFzR8sIzHMXO0WFGkI3tCH3ViANn2W4N5qCwoYZ0n1sZBkQ9Esn1VoEed6RsIlTpWrPZPVtqNkGQ==",
-      "dependencies": {
-        "c12": "^1.0.1",
-        "create-require": "^1.1.1",
-        "defu": "^6.1.1",
-        "jiti": "^1.16.0",
-        "pathe": "^1.0.0",
-        "pkg-types": "^1.0.1",
-        "postcss-import-resolver": "^2.0.0",
-        "scule": "^1.0.0",
-        "std-env": "^3.3.1",
-        "ufo": "^1.0.0",
-        "unimport": "^1.0.1",
-        "untyped": "^1.0.0"
-      },
-      "engines": {
-        "node": "^14.16.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
-      }
-    },
-    "node_modules/bootstrap-vue-next/node_modules/consola": {
-      "version": "2.15.3",
-      "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz",
-      "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw=="
-    },
-    "node_modules/bootstrap-vue-next/node_modules/magic-string": {
-      "version": "0.27.0",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
-      "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
-      "dependencies": {
-        "@jridgewell/sourcemap-codec": "^1.4.13"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/bootstrap-vue-next/node_modules/unimport": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/unimport/-/unimport-1.3.0.tgz",
-      "integrity": "sha512-fOkrdxglsHd428yegH0wPH/6IfaSdDeMXtdRGn6en/ccyzc2aaoxiUTMrJyc6Bu+xoa18RJRPMfLUHEzjz8atw==",
-      "dependencies": {
-        "@rollup/pluginutils": "^5.0.2",
-        "escape-string-regexp": "^5.0.0",
-        "fast-glob": "^3.2.12",
-        "local-pkg": "^0.4.3",
-        "magic-string": "^0.27.0",
-        "mlly": "^1.1.0",
-        "pathe": "^1.0.0",
-        "pkg-types": "^1.0.1",
-        "scule": "^1.0.0",
-        "strip-literal": "^1.0.0",
-        "unplugin": "^1.0.1"
-      }
-    },
     "node_modules/brace-expansion": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
@@ -1261,6 +1112,8 @@
           "url": "https://tidelift.com/funding/github/npm/browserslist"
         }
       ],
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "caniuse-lite": "^1.0.30001449",
         "electron-to-chromium": "^1.4.284",
@@ -1278,6 +1131,8 @@
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/c12/-/c12-1.4.1.tgz",
       "integrity": "sha512-0x7pWfLZpZsgtyotXtuepJc0rZYE0Aw8PwNAXs0jSG9zq6Sl5xmbWnFqfmRY01ieZLHNbvneSFm9/x88CvzAuw==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "chokidar": "^3.5.3",
         "defu": "^6.1.2",
@@ -1309,12 +1164,16 @@
           "type": "github",
           "url": "https://github.com/sponsors/ai"
         }
-      ]
+      ],
+      "optional": true,
+      "peer": true
     },
     "node_modules/chalk": {
       "version": "2.4.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
       "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "ansi-styles": "^3.2.1",
         "escape-string-regexp": "^1.0.5",
@@ -1328,6 +1187,8 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
       "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=0.8.0"
       }
@@ -1362,6 +1223,8 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
       "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=10"
       }
@@ -1370,6 +1233,8 @@
       "version": "1.9.3",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
       "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "color-name": "1.1.3"
       }
@@ -1377,12 +1242,16 @@
     "node_modules/color-name": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/colorette": {
       "version": "2.0.20",
       "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
-      "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="
+      "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/combined-stream": {
       "version": "1.0.8",
@@ -1405,17 +1274,16 @@
     "node_modules/convert-source-map": {
       "version": "1.9.0",
       "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
-      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
+      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/core-util-is": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
-      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
-    },
-    "node_modules/create-require": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
-      "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="
+      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/csstype": {
       "version": "2.6.21",
@@ -1441,7 +1309,9 @@
     "node_modules/defu": {
       "version": "6.1.2",
       "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.2.tgz",
-      "integrity": "sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ=="
+      "integrity": "sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/delayed-stream": {
       "version": "1.0.0",
@@ -1454,12 +1324,16 @@
     "node_modules/destr": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/destr/-/destr-1.2.2.tgz",
-      "integrity": "sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA=="
+      "integrity": "sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/dir-glob": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
       "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "path-type": "^4.0.0"
       },
@@ -1471,6 +1345,8 @@
       "version": "16.0.3",
       "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
       "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=12"
       }
@@ -1478,12 +1354,16 @@
     "node_modules/electron-to-chromium": {
       "version": "1.4.379",
       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.379.tgz",
-      "integrity": "sha512-eRMq6Cf4PhjB14R9U6QcXM/VRQ54Gc3OL9LKnFugUIh2AXm3KJlOizlSfVIgjH76bII4zHGK4t0PVTE5qq8dZg=="
+      "integrity": "sha512-eRMq6Cf4PhjB14R9U6QcXM/VRQ54Gc3OL9LKnFugUIh2AXm3KJlOizlSfVIgjH76bII4zHGK4t0PVTE5qq8dZg==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/enhanced-resolve": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
       "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "graceful-fs": "^4.1.2",
         "memory-fs": "^0.5.0",
@@ -1497,6 +1377,8 @@
       "version": "0.1.8",
       "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
       "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "prr": "~1.0.1"
       },
@@ -1544,6 +1426,8 @@
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
       "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=6"
       }
@@ -1552,6 +1436,8 @@
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
       "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=12"
       },
@@ -1602,6 +1488,8 @@
       "version": "5.0.2",
       "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
       "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+      "optional": true,
+      "peer": true,
       "bin": {
         "flat": "cli.js"
       }
@@ -1642,6 +1530,8 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
       "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "minipass": "^3.0.0"
       },
@@ -1653,6 +1543,8 @@
       "version": "3.3.6",
       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "yallist": "^4.0.0"
       },
@@ -1682,6 +1574,8 @@
       "version": "1.0.0-beta.2",
       "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
       "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -1690,6 +1584,8 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/giget/-/giget-1.1.2.tgz",
       "integrity": "sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "colorette": "^2.0.19",
         "defu": "^6.1.2",
@@ -1718,6 +1614,8 @@
       "version": "11.12.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
       "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=4"
       }
@@ -1726,6 +1624,8 @@
       "version": "13.1.4",
       "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz",
       "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "dir-glob": "^3.0.1",
         "fast-glob": "^3.2.11",
@@ -1743,7 +1643,9 @@
     "node_modules/graceful-fs": {
       "version": "4.2.11",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
-      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/has": {
       "version": "1.0.3",
@@ -1760,6 +1662,8 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
       "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=4"
       }
@@ -1767,7 +1671,9 @@
     "node_modules/hash-sum": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz",
-      "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg=="
+      "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/hookable": {
       "version": "5.5.3",
@@ -1780,6 +1686,8 @@
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
       "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "agent-base": "6",
         "debug": "4"
@@ -1792,6 +1700,8 @@
       "version": "5.2.4",
       "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
       "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">= 4"
       }
@@ -1804,7 +1714,9 @@
     "node_modules/inherits": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/is-binary-path": {
       "version": "2.1.0",
@@ -1858,12 +1770,16 @@
     "node_modules/isarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/jiti": {
       "version": "1.18.2",
       "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz",
       "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==",
+      "optional": true,
+      "peer": true,
       "bin": {
         "jiti": "bin/jiti.js"
       }
@@ -1871,12 +1787,16 @@
     "node_modules/js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/jsesc": {
       "version": "2.5.2",
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
       "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "optional": true,
+      "peer": true,
       "bin": {
         "jsesc": "bin/jsesc"
       },
@@ -1888,6 +1808,8 @@
       "version": "2.2.3",
       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
       "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "optional": true,
+      "peer": true,
       "bin": {
         "json5": "lib/cli.js"
       },
@@ -1898,12 +1820,16 @@
     "node_modules/jsonc-parser": {
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
-      "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w=="
+      "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/knitwork": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.0.0.tgz",
-      "integrity": "sha512-dWl0Dbjm6Xm+kDxhPQJsCBTxrJzuGl0aP9rhr+TG8D3l+GL90N8O8lYUi7dTSAN2uuDqCtNgb6aEuQH5wsiV8Q=="
+      "integrity": "sha512-dWl0Dbjm6Xm+kDxhPQJsCBTxrJzuGl0aP9rhr+TG8D3l+GL90N8O8lYUi7dTSAN2uuDqCtNgb6aEuQH5wsiV8Q==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/local-pkg": {
       "version": "0.4.3",
@@ -1919,12 +1845,16 @@
     "node_modules/lodash._reinterpolate": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
-      "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA=="
+      "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/lodash.template": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
       "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "lodash._reinterpolate": "^3.0.0",
         "lodash.templatesettings": "^4.0.0"
@@ -1934,6 +1864,8 @@
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
       "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "lodash._reinterpolate": "^3.0.0"
       }
@@ -1942,6 +1874,8 @@
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
       "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "yallist": "^4.0.0"
       },
@@ -1961,6 +1895,8 @@
       "version": "0.5.0",
       "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
       "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "errno": "^0.1.3",
         "readable-stream": "^2.0.1"
@@ -2026,6 +1962,8 @@
       "version": "4.2.8",
       "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz",
       "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=8"
       }
@@ -2034,6 +1972,8 @@
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
       "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "minipass": "^3.0.0",
         "yallist": "^4.0.0"
@@ -2046,6 +1986,8 @@
       "version": "3.3.6",
       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "yallist": "^4.0.0"
       },
@@ -2057,6 +1999,8 @@
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
       "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "optional": true,
+      "peer": true,
       "bin": {
         "mkdirp": "bin/cmd.js"
       },
@@ -2068,6 +2012,8 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.2.0.tgz",
       "integrity": "sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "acorn": "^8.8.2",
         "pathe": "^1.1.0",
@@ -2079,6 +2025,8 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
       "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=4"
       }
@@ -2108,12 +2056,16 @@
     "node_modules/node-fetch-native": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.1.0.tgz",
-      "integrity": "sha512-nl5goFCig93JZ9FIV8GHT9xpNqXbxQUzkOmKIMKmncsBH9jhg7qKex8hirpymkBFmNQ114chEEG5lS4wgK2I+Q=="
+      "integrity": "sha512-nl5goFCig93JZ9FIV8GHT9xpNqXbxQUzkOmKIMKmncsBH9jhg7qKex8hirpymkBFmNQ114chEEG5lS4wgK2I+Q==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/node-releases": {
       "version": "2.0.10",
       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
-      "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w=="
+      "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/normalize-path": {
       "version": "3.0.0",
@@ -2126,7 +2078,9 @@
     "node_modules/ohash": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.2.tgz",
-      "integrity": "sha512-9CIOSq5945rI045GFtcO3uudyOkYVY1nyfFxVQp+9BRgslr8jPNiSSrsFGg/BNTUFOLqx0P5tng6G32brIPw0w=="
+      "integrity": "sha512-9CIOSq5945rI045GFtcO3uudyOkYVY1nyfFxVQp+9BRgslr8jPNiSSrsFGg/BNTUFOLqx0P5tng6G32brIPw0w==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/path-parse": {
       "version": "1.0.7",
@@ -2137,6 +2091,8 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
       "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=8"
       }
@@ -2144,12 +2100,16 @@
     "node_modules/pathe": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz",
-      "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w=="
+      "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/perfect-debounce": {
       "version": "0.1.3",
       "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-0.1.3.tgz",
-      "integrity": "sha512-NOT9AcKiDGpnV/HBhI22Str++XWcErO/bALvHCuhv33owZW/CjH8KAFLZDCmu3727sihe0wTxpDhyGc6M8qacQ=="
+      "integrity": "sha512-NOT9AcKiDGpnV/HBhI22Str++XWcErO/bALvHCuhv33owZW/CjH8KAFLZDCmu3727sihe0wTxpDhyGc6M8qacQ==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/picocolors": {
       "version": "1.0.0",
@@ -2171,6 +2131,8 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz",
       "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "jsonc-parser": "^3.2.0",
         "mlly": "^1.1.1",
@@ -2208,6 +2170,8 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/postcss-import-resolver/-/postcss-import-resolver-2.0.0.tgz",
       "integrity": "sha512-y001XYgGvVwgxyxw9J1a5kqM/vtmIQGzx34g0A0Oy44MFcy/ZboZw1hu/iN3VYFjSTRzbvd7zZJJz0Kh0AGkTw==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "enhanced-resolve": "^4.1.1"
       }
@@ -2215,7 +2179,9 @@
     "node_modules/process-nextick-args": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/proxy-from-env": {
       "version": "1.1.0",
@@ -2225,7 +2191,9 @@
     "node_modules/prr": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
-      "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw=="
+      "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/queue-microtask": {
       "version": "1.2.3",
@@ -2250,6 +2218,8 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.0.tgz",
       "integrity": "sha512-ROO9bv8PPqngWKoiUZU3JDQ4sugpdRs9DfwHnzDSxK25XtQn6BEHL6EOd/OtKuDT2qodrtNR+0WkPT6l0jxH5Q==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "defu": "^6.1.2",
         "destr": "^1.2.2",
@@ -2260,6 +2230,8 @@
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
       "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "core-util-is": "~1.0.0",
         "inherits": "~2.0.3",
@@ -2346,7 +2318,9 @@
     "node_modules/safe-buffer": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/sass": {
       "version": "1.62.1",
@@ -2367,12 +2341,16 @@
     "node_modules/scule": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/scule/-/scule-1.0.0.tgz",
-      "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ=="
+      "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/semver": {
       "version": "7.5.0",
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz",
       "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "lru-cache": "^6.0.0"
       },
@@ -2387,6 +2365,8 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
       "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=12"
       },
@@ -2419,12 +2399,16 @@
     "node_modules/std-env": {
       "version": "3.3.2",
       "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz",
-      "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA=="
+      "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/string_decoder": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
       "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "safe-buffer": "~5.1.0"
       }
@@ -2433,6 +2417,8 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz",
       "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "acorn": "^8.8.2"
       },
@@ -2444,6 +2430,8 @@
       "version": "5.5.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
       "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "has-flag": "^3.0.0"
       },
@@ -2466,6 +2454,8 @@
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
       "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=6"
       }
@@ -2474,6 +2464,8 @@
       "version": "6.1.13",
       "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
       "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "chownr": "^2.0.0",
         "fs-minipass": "^2.0.0",
@@ -2490,6 +2482,8 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
       "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+      "optional": true,
+      "peer": true,
       "engines": {
         "node": ">=4"
       }
@@ -2508,12 +2502,16 @@
     "node_modules/ufo": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.1.tgz",
-      "integrity": "sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg=="
+      "integrity": "sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/unctx": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.3.0.tgz",
       "integrity": "sha512-xs79V1T5JEQ/5aQ3j4ipbQEaReMosMz/ktOdsZMEtKv1PfbdRrKY/PaU0CxdspkX3zEink2keQU4nRzAXgui1A==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "acorn": "^8.8.2",
         "estree-walker": "^3.0.3",
@@ -2525,6 +2523,8 @@
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
       "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@types/estree": "^1.0.0"
       }
@@ -2533,6 +2533,8 @@
       "version": "0.30.0",
       "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz",
       "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@jridgewell/sourcemap-codec": "^1.4.13"
       },
@@ -2639,6 +2641,8 @@
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.3.2.tgz",
       "integrity": "sha512-z219Z65rOGD6jXIvIhpZFfwWdqQckB8sdZec2NO+TkcH1Bph7gL0hwLzRJs1KsOo4Jz4mF9guBXhsEnyEBGVfw==",
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "@babel/core": "^7.21.3",
         "@babel/standalone": "^7.21.3",
@@ -2670,6 +2674,8 @@
           "url": "https://github.com/sponsors/ai"
         }
       ],
+      "optional": true,
+      "peer": true,
       "dependencies": {
         "escalade": "^3.1.1",
         "picocolors": "^1.0.0"
@@ -2684,7 +2690,9 @@
     "node_modules/util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+      "optional": true,
+      "peer": true
     },
     "node_modules/vite": {
       "version": "4.3.4",
@@ -2770,16 +2778,18 @@
     "node_modules/yallist": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "optional": true,
+      "peer": true
     },
     "vendor/unicaen/vue": {
+      "name": "unicaen-vue",
       "version": "1.0.0",
       "license": "ISC",
       "dependencies": {
         "@vitejs/plugin-vue": "^4.0.0",
         "@vue/compiler-sfc": "^3.2.45",
         "axios": "^1.3.4",
-        "bootstrap-vue-next": "^0.7.3",
         "unplugin-vue-components": "^0.24.1",
         "vite": "^4.0.0",
         "vite-plugin-live-reload": "^3.0.1",