diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..12a4ecd --- /dev/null +++ b/404.html @@ -0,0 +1,251 @@ + + + + + + + + + + + Geonovum tooling + + + + + + + + + + + +
+
+ +
+
+

404

+

Page not found

+
+
+ + +
+
+ + + + + + + + + + + + diff --git a/EA-toepassing-standaarddatatypen/index.html b/EA-toepassing-standaarddatatypen/index.html new file mode 100644 index 0000000..dfa0783 --- /dev/null +++ b/EA-toepassing-standaarddatatypen/index.html @@ -0,0 +1,371 @@ + + + + + + + + + + + standaarddatatypen - Geonovum tooling + + + + + + + + + + + +
+
+ +
+ +

EA - Gebruik standaarddatatypes (intern)

+
+

Note > @Gerard: screenshots toevoegen

+
+

Bij Geonovum gebruiken we een aantal voorgedefineerde datatypes. Deze zijn +opgedeeld in drie categorieën:

+
    +
  1. MIM11 -- Dit package bevat de datatypes die voorgedefinieerd zijn in het + MIM
  2. +
  3. Geonovum geometrie -- Dit package bevat de geometrietypes uit + ISO19107. Deze zijn in een + los package gestopt zodat andere partijen die alleen geometrie willen + gebruik deze types kunnen gebruiken,
  4. +
  5. Geonovum algemeen -- In dit package zitten alle overige datatypes die in + Geonovum UML packages gebruikt worden. Merk op dat in dit package ook wat + geometrie types zitten; dit zijn types die niet uit ISO-19107 komen. Bij + voorkeur worden deze niet in de modellering gebruikt.
  6. +
+

In: svn.geostandaarden.nl/Datatypes zijn drie collecties met primitieve types +opgenomen die alle primitieve types bevat die in Geonovum UML modellen gebruikt

+

Deze packages zijn in beheer bij @wilkoquak. Het is de bedoeling dat er in +[Imvertor] een mapping komt die precies overeenkomt het deze drie collecties +types

+

Geometrie datatypes

+

In dit package zitten de geometrische datatypes zoals genoemd in +ISO19107:2003.

+

Geometrie

+

MIM datatypes

+

In dit package zitten de geometrische datatypes zoals genoemd in +MIM.

+

MIM

+

Geonovum datatypes

+

In dit package zitten datatypes die niet in de twee eerdergenoemde packages +vallen maar wel ergens gebruikt zijn bij Geonovum.

+

Geonovum datatypes

+
+

Note > @Wilko wil jij een korte toelichting geven op de driedeling. Wat +vind je waar en waarom?

+
+

Alle basic datatypes binnen UML zouden in één van deze packages moeten staan. +Als dat niet zo is neem dan contact op met @Wilko.

+

Je vindt ze op SVN: svn://svn.geostandaarden.nl/Datatypes:

+
+

Warning Onderstaande naamgeving klopt niet meer. Dit is door Wilko in +overleg aangepast. @Gerard: graag updaten!

+
+
    +
  1. MIM11.xml
  2. +
  3. Geonovum-algemeen.xml
  4. +
  5. Geonovum-geometrie.xml
  6. +
+
+

Note Er is nu nog een Datatyps.xml waarin alle datatypes zitten deze +gaat binnenkort verdwijnen.

+
+

Datatypes importeren voor gebruik in EA

+

Lees hoe je deze types als packages importeert in de handleiding +SVN - importeren bestaand project.

+

Gebruik packages in EA

+

Deze packages zijn bedoeld voor toepassing binnen een informatiemodel. Het is +niet de bedoeling om de packages in of uit te checken; er hoeven immers geen +wijzigingen in aangebracht te worden.

+
+

Note > @Wilko en @Paul: Eigenlijk zou je hier een beperkt aantal +mensen schrijfrechten willen geven en de rest alleen lees-rechten. Ik heb +zoiets nog niet kunnen vinden. @Gerart: je kunt dat instellen door in +configuratiebestandjes op svn.geostandaarden.nl, maar dan moet je daar wel bij +kunnen.

+
+

Verwijzen naar een datatype

+
+

Note > @Gerard: In deze paragraaf een uitleg opnemen hoe je vanuit +Enterprise Architect een voorgedefineerd datatype opneemt bij een +«Attribuutsoort». |

+
+
+
+ + + + + + + + + + + + diff --git a/EA/index.html b/EA/index.html new file mode 100644 index 0000000..ec8853c --- /dev/null +++ b/EA/index.html @@ -0,0 +1,302 @@ + + + + + + + + + + + Overzicht - Geonovum tooling + + + + + + + + + + + +
+
+
+
+ +

Enterprise Architect

+

Instructie voor het gebruik van Enterprise Architect binnen Geonovum:

+
    +
  • Installatie van de software.
  • +
  • Gebruik van de MIM Toolbox.
  • +
+

Installatie

+ +

De MIM toolbox

+

Importeer de MIM toolbox:

+

Zie: MIM toolbox importeren

+

Externe links:

+
+
+
+ + + + + + + + + + + + diff --git a/GML/index.html b/GML/index.html new file mode 100644 index 0000000..f5c65e5 --- /dev/null +++ b/GML/index.html @@ -0,0 +1,386 @@ + + + + + + + + + + + GML - Geonovum tooling + + + + + + + + + + + +
+
+
+
+ +

GML en XSD

+

Een algemene handleiding voor het opslaag van Geometrie in GML bestanden is te vinden in: Geometrie in model en GML

+

XSD en Namespaces

+

Bij een XML applicatie schema (dus ook voor GML schema's) wordt vaak een namespace gebruikt. Deze namespace hoort vaak bij een domein en het is de bedoel dat de combinatie van de namespace en het element uniek is. Dit kan alleen als de namespace, die de vorm van een URI heeft uniek is. Door een URI te kiezen die bij jou onder beheer is weet je zeker dat de combinatie uniek is. In de volgende paragraaf zie je een lijste gebruikte namespaces. Hieronder wat richtlijnen.

+
    +
  • Voor de basis wordt: http://www.geostandaarden.nl gebruikt. Het is nog even de vraag of we niet op https moeten overstappen. Dat doen we niet want niemand anders doet deze overstap.
  • +
  • Daarna volgt een identificatie van de standaard.
  • +
  • Een versienummer volgens semver X.Y. Een Z-versie is niet nodig omdat alle Z-versies backwards compatible zijn en je dus nooit meer dan 1 versie gebruikt.
  • +
+

De volgende model onderdelen wordt gebruikt bij het maken construeren van schemas:

+
    +
  • Een schema heeft een [X.Y.Z] versienummer
  • +
  • Een schema hoort bij een standaard met een [standaard]
  • +
  • Een schema heeft een onderdeel [onderdeel]
  • +
+

Samen wordt dit:

+
    +
  • namespace van schema: http://www.geostandaarden.nl/[standaard]/[onderdeel]/x.y
  • +
  • locatie van schema: https://register.geostanadaarden.nl/xmlschema/[standaard]/[x.y.z]/[onderdeel].xsd
  • +
  • vesion in het schema: [x.y.z]
  • +
+

Bij een standaard zonder onderdelen wordt de bestandsnaam als onderdeelnaam gebruikt bij locatie.

+

Namespaces in door Geonovum beheerde schema's

+

GML applicatieschema's zijn te vinden op: https://register.geostandaarden.nl/gmlapplicatieschema/

+

Een korte inventarisatie levert:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
standaardversienamespace
basisgeometrie1.0.0http://www.geostandaarden.nl/basisgeometrie/1.0
basisgeometriev20190901http://www.geostandaarden.nl/basisgeometrie/v20190901
brt-algemeen1.2.0http://register.geostandaarden.nl/gmlapplicatieschema/brt-algemeen/1.2.0
imaer5.1.1http://imaer.aerius.nl/5.1
img3.0.0http://www.geluidgegevens.nl/IMGeluid/3.0
imgeo (simple)2.1.1http://www.geostandaarden.nl/imgeo/2.1/simple/gml31
imgeo2.1.1http://www.geostandaarden.nl/imgeo/2.1
imkl (wibon)2.0.0http://www.geostandaarden.nl/imkl/wibon
imkl (wibonbr)2.0.0http://www.geostandaarden.nl/imkl/wibonbr
imkl2015 (wionbr)1.2http://www.geostandaarden.nl/imkl/2015/wionbr/1.2
imkl2015 (wionbr)1.2.1http://www.geostandaarden.nl/imkl/2015/wionbr/1.2
top10nl1.1.1http://www.kadaster.nl/schemas/top10nl/v20120116
top10nl1.2.0http://register.geostandaarden.nl/gmlapplicatieschema/top10nl/1.2.0
+
+
+ + + + + + + + + + + + diff --git a/GitHub-Inleiding/index.html b/GitHub-Inleiding/index.html new file mode 100644 index 0000000..c8b1761 --- /dev/null +++ b/GitHub-Inleiding/index.html @@ -0,0 +1,372 @@ + + + + + + + + + + + GitHub Intro - Geonovum tooling + + + + + + + + + + + +
+
+ +
+ +

Inleiding Github

+

Bij Geonovum worden documenten (standaarden, onderzoeken, rapporten, enz) web-based gepubliceerd. Ook worden de documenten vaak in een werkgroep gemaakt, waarbij ieder werkgroeplid meeschrijft aan het document. Om dit te kunnen gebruiken we een aantal tools: GitHub, Respec en Markdown.

+

Deze introductie gaat over Github.

+

Waarschijnlijk wil je weten wat GitHub is, anders was je nu niet deze handleiding aan het lezen. Je gaat hier meer over GitHub lezen en waarom het handig is. Er zijn een aantal GitHub termen die alvast handig zijn om te weten. Tot slot lees je hoe je zelf aan de slag kan gaan met GitHub.

+

Meer over Github

+

Veel programmeurs wereldwijd maken gebruik van de website GitHub. Zelf zal je er misschien ook wel van gehoord hebben. Als programmeur is het handig om te weten wat GitHub is en hoe je er gebruik van maakt.

+

GitHub bestaat uit twee woorden, namelijk Git + Hub. Laten we beginnen met Git. *Git is een open source versiebeheersysteem. De website GitHub is gemaakt op basis van het versiebeheersysteem Git. Met GitHub heb je alle mogelijkheden van Git + extra features.

+

In een versiebeheersysteem kunnen programmeurs projecten beheren met code. Het is mogelijk om verschillende versies te beheren en eventueel terug te vallen op een oude versie, mocht er iets misgaan.

+

Stel dat je met een team een app wilt programmeren. Dan is het handig als iedereen bij het project kan met daarin alle code van de app. Ook is het handig dat iedereen de laatste code wijzigingen ziet van teamleden en daar eventueel op kan reageren en/of het aanpassen.

+

Bij Geonovum gebruiken we Github op een andere manier. Namelijk voor het voor werken aan documentatie voor geostandaarden. Per project is een repository aangemaakt. Een Repository is eenvoudig gezegd een werkmap/projectomgeving.

+

Andere mogelijkheden van Github

+

Je weet nu dat het mogelijk is om in een team projecten (Waarin code staat) te beheren op GitHub. Het is natuurlijk ook mogelijk om je eigen projecten op GitHub te beheren. Zo heb je een goed overzicht van de aanpassingen en verschillende versies.

+

Daarnaast staat je project online. Als je een belangrijk project bijvoorbeeld alleen lokaal op je eigen computer opslaat en je computer houdt ermee op, dan ben je zwaar de pineut. Op GitHub kan je er gewoon altijd bij.

+

Maar welke mogelijkheden heeft GitHub nog meer? Hier staan een aantal belangrijke mogelijkheden op een rijtje:

+
    +
  • Een project maken gebaseerd op een project dat al bestaat
  • +
  • Discussie starten over een project
  • +
  • Code reviewen
  • +
  • Aparte branches maken, waarin je bijvoorbeeld code aanpassingen doet om te testen, die niet gelijk in de “productieversie” komen
  • +
  • Code van branch samenvoegen met andere branch
  • +
  • Tags meegeven aan verschillende versies, zoals V1.0 en V2.0
  • +
  • Kwetsbaarheden in de code makkelijker ontdekken, GitHub stuurt ook een mail als het kwetsbaarheden ontdekt
  • +
  • Een website hosten
  • +
+

Voordelen van GitHub

+

GitHub zorgt ervoor dat een individueel of een project in teamverband erg overzichtelijk is. Je hebt een goed overzicht van de laatste aanpassingen en welke persoon dat heeft gedaan.

+

Je kan eenvoudig meerdere versies maken en eenvoudig terugvallen op een vorige versie, mocht het misgaan. Door de verschillende branches loop je geen enkel risico bij het aanpassen en testen van nieuwe code. Meer over branches in “Betekenissen van GitHub termen”.

+

Voor programmeurs maakt GitHub het werken een stuk makkelijker en leuker. Stel dat je als programmeur niet aan versiebeheer zou doen of dat zou doen met een slecht versiebeheersysteem, dan ga je vroeg of laat in de problemen komen.

+

GitHub is een centrale plek waar heel veel programmeurs en teams hun projecten beheren. Veel projecten zijn open source en kunnen door iedereen worden ingezien en aangepast.

+

Het is erg leerzaam om naar projecten van anderen te kijken. Als je wat meer ervaring hebt, kan je misschien wel verbeteringen voorstellen en meedoen aan gave projecten!

+

Met GitHub gaat er als programmeur een wereld voor je open. Het is goed om projecten te beheren en je kan er ook heel veel leren.

+

Betekenis van Github termen?

+

Op GitHub zijn er een aantal termen die handig zijn om alvast te weten. Als je meer gebruik gaat maken van GitHub, dan leer je de betekenis van deze termen vanzelf kennen.

+

Hieronder staan belangrijke GitHub termen en de betekenis ervan:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GitHub termBetekenis
RepositoryEen repository kan je zien als de hoofdmap van je project. Hierin staan alle bestanden van je project en de historie van wijzigingen die je hebt gedaan.
BranchAparte plek binnen je repository, waar je bijvoorbeeld nieuwe code kan testen, zonder dat te hoeven doen op de 'productversie'.
MasterDit is de hoofdbranch, oftewel de “productversie” van je project. Nieuwe code die is getest en goedgekeurd, wordt samengevoegd met de Master branch.
ForkEen fork is een kopie van een repository. Hierdoor kan je werken aan een project van iemand anders, zonder het origineel aan te passen.
CommitGit commando dat veranderingen toevoegt aan je lokale repository.
PushGit commando om aanpassingen naar je (remote) repository te sturen, die staat op GitHub.
PullGit commando om aanpassingen van je (remote) repository naar je lokale bestanden te sturen.
MergeGit commando om aanpassingen van een branch samen te voegen met een andere branch. Bijvoorbeeld aanpassingen die getest en goedgekeurd zijn in de “Develop” branch samenvoegen met de “Master” branch.
CheckoutDeze Git commando wordt vaak gebruikt om te switchen tussen branches. Je checkt als het ware uit bij een branch en gaat aan de slag in een andere branch.
+

Zelf aan de slag met Github

+

Hopelijk heb je een beter beeld over wat GitHub is. Ben je een gebruiker of wil je programmeur worden en werk je nog niet met een (goed) versiebeheersysteem? Dan is het zeker aan te raden om te beginnen met GitHub.

+

Als je een account hebt aangemaakt kun je zelf een repository aanmaken. Zie hiervoor: Aanmaken GitHub Account

+

Stuur een mail naar account@geonovum.nl om toegevoegd te worden aan deze repository. Je moet dan wel eerst een account aangemaakt hebben op github

+
+
+ + + + + + + + + + + + diff --git a/GitHub/index.html b/GitHub/index.html new file mode 100644 index 0000000..df4d0eb --- /dev/null +++ b/GitHub/index.html @@ -0,0 +1,405 @@ + + + + + + + + + + + Manual - Geonovum tooling + + + + + + + + + + + +
+
+ +
+ +

GitHub

+

In dit hoofdstuk komen zowel GitHub als GitHub desktop client aan de orde. Geonovum heeft op github een eigen ‘onderkomen’ op: https://github.com/Geonovum. In dit hoofdstuk staat beschreven wat je moet doen om “up-and-running” te komen voor het uitvoeren van je beheertaken op GitHub. Hoe je een account aanmaakt, en hoe je de benodigde software installeert.

+

Installatie en inrichting

+

Aanmaken GitHub account

+

Als je nog geen GitHub account hebt, of als je een apart GitHub account wil maken voor je Geonovum werkzaamheden, ga naar: https://github.com/join/get-started .

+

Dan zie je het scherm dat hiernaast staat. Maak in dat scherm een usernaam aan waarmee je op GitHub gaat werken.

+

Tip: als je met meerdere accounts gaat werken, zorg er dan voor dat aan de accountnaam kan zien waarvoor die dan gebruikt moet worden. (Bijvoorbeeld door die naam te eindigen op –GNM). Verplicht is dit niet.

+

Vul in het veld username je nieuwe GitHub naam in.

+

Vul in het veld email adress je geonovum mailadres in

+

media/image3.png

+

Klik vervolgens op “Create Account” en dan wordt je account aangemaakt.

+

Kies in dit scherm je persoonlijke plan. Bij Geonovum gebruiken we de gratis versie, dus selecteer die.

+

media/image4.png

+

Installeren GitHub desktop

+

Ga in je internet browser naar https://desktop.github.com/

+

Klik daar op download for Windows (64bit).

+

Nu wordt de installer gedownload, en dat zie je linksonder in je browser zoals in het plaatje rechts:

+

media/image6.png +media/image7.png

+

Na starten van de installer verschijnt het scherm hiernaast

+

Het volgende scherm zal nu openen

+

we hebben in de vorige stap al een account aangemaakt dus klik op Sign Into Github.com

+

media/image8.png

+

Na Klikken op Sign into Github.com, verschijnt dit scherm. Hier hoeft verder niks ingevuld te worden, dus klik op continue.

+

In dit scherm kan je desgewenst het vinkje bij het versturen van anonieme data uitzetten. Daarna klikken op Finish.

+

GitHub Desktop is nu geïnstalleerd.

+

media/image9.png

+

Opties voor GitHub desktop

+

media/image10.png

+

GitHub Desktop kan worden aangepast aan persoonlijke voorkeuren. Dat doe je door in het hoofdscherm van de GitHub Desktop op het menu “File” te klikken en vervolgens voor “Opties” te kiezen.

+

media/image11.png +In het Accounts scherm staat hoe je bent ingelogd bij GitHub. Hier kan je uitloggen en opnieuw inloggen als je meerdere GitHub Accounts hebt.

+

media/image12.png +In het tabblad “Git” kan je je Github Naam eventueel aanpassen. De GitHub Email is de email die intern binnen Github wordt gebruikt. Die hoeft niet gewijzigd te worden.

+

media/image13.png +In het tabblad “Appearance” kan je ervoor kiezen om in Light of Dark modus te werken. Hiermee verander je alleen de achtergrondkleur van de GitHub Desktop omgeving.

+

media/image14.png

+

In dit scherm kan je de voorkeurs editor instellen. Default wordt gekeken naar de reeds aanwezige tekst editors. Omdat GitHub van nature een samenwerkomgeving is voor het ontwikkelen van programmatuur, gaat het hier om “platte tekst” editors.

+

Werkwijze Geonovum

+

De Geonovum GitHub pagina

+

Geonovum heeft een eigen GitHub Bedrijfspagina: https://github.com/Geonovum .

+

Voor alle projecten die een product maken of beheren wordt een repository aangemaakt.

+

Het aanmaken van een repository staat beschreven in paragraaf 2.3.1.

+

Mappenstructuur in de respository

+

media/image16.png +In de Repository maak je indien nodig submappen aan. Submappen zijn handig als er in je Repository meer dan één ReSpec document komt te staan. Over ReSpec meer in hoofdstuk 3.

+

Hiernaast een afbeelding van de GitHub Repository voor MIM. Twee mappen omdat MIM twee documenten bevat.

+

Ook maakt GitHub standaard een readme.md aan. De readme staat in het “Markdown” formaat, waarover in de volgende paragraaf meer.

+

Readme.md

+

In de readme.md file staat nog eens beschreven Wat de inhoud van de Repository is. Neem ook de link naar de webversie van de documenten hier op, dan is het voor bezoekers gemakkelijker om het document te openen in een browser.

+

Neem altijd een link naar https://docs.geostandaarden.nl/ op, en in het geval het technische documenten betreft zoals UML’s, XSD’s, GML’s, XML’s een link naar http://register.geostandaarden.nl/ in het Readme bestand op.

+

media/image17.png

+

Aan de slag met GitHub

+

In deze paragraaf een beschrijving van hoe je in GitHub een nieuwe repository aanmaakt, en hoe je die synchroniseert met je lokale GitHub client.

+

Het maken van een nieuwe repository

+

Een nieuwe repository maak je aan in de Centrale GitHub omgeving.

+

Klik in de banner bovenaan de pagina, naast je profielfoto op “+” en kies “Create Repository”

+

Nadat je op “+” hebt geklikt, verschijnt het scherm hieronder.

+

media/image19.png

+

Vul hier de naam van de repository in. Gebruik een naam die kort en bondig is. Zie ook verderop in dit document voor de naamgevingsconventies.

+

Vul ook de beschrijving in van het project.

+

Geef als local path de naam van de GitHub map op. GitHub zal dan de naam van de standaard als mapnaam aanmaken onder de lokale GitHub map.

+

Het is wel zo netjes om een readme file aan te maken, hierin zet je een korte omschrijving van de repository. Klik vervolgens op “Create Repository”

+

GitHub Clone: eerste keer ophalen van de centrale repository

+

media/image20.png

+

Start de GitHub Client, en kies in het menu File voor Clone Repository. En kies de Repository die je wil clonen (in dit geval Geonovum/MIM). Als Local Path kies je een logische plek op je PC/Laptop. (Tip: het is handig om één plek voor je Github Repositories te maken, bijvoorbeeld C:. Na het aanklikken van de knop clone wordt een lokale kopie gemaakt. Github weet welke versie je hebt opgehaald, en zal de wijzingen die je maakt netjes voor je bijhouden.

+

In de map die je als local path hebt opgegeven komt de mappen structuur te staan zoals hierboven beschreven.

+

GitHub Pull origin: ophalen van wijzigingen

+

Een pull commando werkt de lokale versie van je GitHub Repository bij. Wijzigingen die zijn gedaan in de centrale repository (dus op Github.com) worden ook doorgevoerd in je lokale kopie. Het uitvoeren van een pull doe je door in het menu Repository op pull te klikken.

+

NB: Voer dit commando regelmatig uit als er meerdere mensen in de repository werken, om conflicterende wijzigingen te voorkomen.

+

GitHub Commit to Master: wijzigingen opslaan

+

Met de knop Commit to master zet je de wijzigingen die je hebt gedaan klaar om te uploaden naar de Centrale GitHub Repository. GitHub maakt daartoe een versie aan,

+

die je verplicht voorziet van een summary en optioneel van een Description Let op: met

+

het committen heb je dus nog niks ge-upload.

+

GitHub Push origin of Pull request: wijzigingen uploaden

+

Nadat je de wijzigingen hebt gecommit, moeten ze richting de centrale repository. Nu zijn er twee mogelijkheden. Ofwel je hebt schrijfrechten op de Centrale Repository, of je hebt ze niet. In het eerste geval kan je een Push Origin uitvoeren, dan worden de wijzigingen meteen in de Centrale GitHub Repository verwerkt. In het tweede geval doe je een Pull request bij de eigenaar van de Repository om de wijzigingen door te voeren. Github maakt dan een eigen versie voor je aan (dat heet een fork) en vraagt aan de eigenaar van de Repository om die fork te verwerken in de Centrale Repository.

+

Enkele regels over GitHub binnen Geonovum

+
    +
  • Geonovum heeft binnen github een team: https://github.com/Geonovum.
  • +
+

Github beheer

+
    +
  • Github teamleden met beheerders rechten zijn te vinden via: https://github.com/orgs/Geonovum/people?query=role%3Aowner
  • +
  • Daarnaast zijn er nog drie inhoudelijk beheerders vanuit Geonovum: Arnoud de Boer, Frank Terpstra en Linda vd Brink.
  • +
+

Github gebruikers

+
    +
  • Een overzicht van de gebruikers is te vinden op: https://github.com/orgs/Geonovum/people.
  • +
  • In principe geldt de regels: als je lid bent van Geonovum Teams dan hoor je ook bij de Geonovum GitHub organisatie. De inhoudelijk beheerders kunnen besluiten daar van af te wijken.
  • +
  • Er is geen bezwaar tegen het gebruiken van een privé account binnen de github omgeving.
  • +
  • Bij vertrek wordt je omgezet naar 'External Collaborator'.
  • +
+

GitHub teams

+
    +
  • Er is een aantal teams gemaakt binnen Geonovum. Deze zijn te vinden op: https://github.com/orgs/Geonovum/teams.
  • +
  • Ieder repository moet aan een team worden toegekend. Het team is aanspreekpunt voor het repository.
  • +
  • Team namen eindigen op ' team'. Bijvoorbeeld 'DSO team'.
  • +
+

GitHub repositories

+
    +
  • Dit zijn de Geonovum repositories: https://github.com/orgs/Geonovum/repositories.
  • +
  • Er is ook een dashboard met een overzicht van publieke git repositories: DashboardGit.
  • +
  • Richtlijnen voor het inrichten van repositories zijn er nog niet. Wel is er een template voor respec documenten: NL-ReSpec-GN-template
  • +
+

Naamgevingsconventies GitHub

+
    +
  • Voor repositories met een ReSpec document zijn aparte naamgevingsconventies.
  • +
  • Kies korte betekenisvolle namen die in lijn zijn met bestaande repositories.
  • +
  • Veelgebruikte prefixes zijn:
      +
    • dso- digitale ondersteuning omgevingswet.
    • +
    • ow- omgevingswet. Dit lijkt wel een duplicaat. Laten opgaan in dso-?
    • +
    • KP-APIs- kennisplatform API's.
    • +
    • xml_ Dit was een prefix voor dso repositories maar wordt voor nieuwe repositories niet meer gebruikt.
    • +
    • disgeo- DisGeo
    • +
    +
  • +
+
+
+ + + + + + + + + + + + diff --git a/Handleiding-ontologie-maken-en-publiceren/index.html b/Handleiding-ontologie-maken-en-publiceren/index.html new file mode 100644 index 0000000..1943a6e --- /dev/null +++ b/Handleiding-ontologie-maken-en-publiceren/index.html @@ -0,0 +1,405 @@ + + + + + + + + + + + Ontologie - Geonovum tooling + + + + + + + + + + + +
+
+ +
+ +

Handleiding ontologie maken en publiceren

+

Inleiding

+

Naast UML-informatiemodellen en begrippenkaders maakt Geonovum wellicht in de toekomst ook meer ontologieën. Momenteel is er één ontologie gepubliceerd: die van NEN 3610. Hier is gedocumenteerd hoe dat is gedaan.

+

Ontologie genereren

+

De ontologie is gegenereerd uit het NEN3610-informatiemodel op basis van de regels in MIM.

+
    +
  • Input: MIM UML-model
  • +
  • Output: Ontologie in Turtle (.ttl) syntax en documentatie van de ontologie in Markdown (.md) syntax (op te nemen in ReSpec-document)
  • +
+

In je UML-project is daarvoor nodig:
+ - tagged value baseURI op packageniveau

+

De ontologie is gegenereerd met scripts van Marco Brattinga.
+ - Scripts staan in de repository NEN3610-werkomgeving
+ - Het script dat je moet runnen is: convert.sh. Dit kun je lokaal doen (onder Windows moet je dit aanroepen in een batch-bestand) of we kunnen dit in een git workflow zetten zodat het script elke keer wordt uitgevoerd als je een EAP-bestand of MIM-XML-bestand pusht. Jesse Bakker heeft dit laatste binnen IMX-Geo gedaan. + - Het script genereert met een aantal tussenstappen de uiteindelijke ontologie (RDF-bestand, .ttl) en een markdown-bestand (.md) met documentatie, dat je in een ReSpec-document kunt opnemen.

+

Naast Marco Brattinga hebben Linda, Pano, en Jesse Bakker (Kadaster) kennis van deze scripts.

+

Regels voor de URI

+

De URI (in EA: baseURI) is de identifier URL van de ontologie. Het is belangrijk dat deze lange tijd stabiel blijft (dus geen projectnaam, organisatienaam, versieinformatie etc. erin opnemen). Samengevat gelden hiervoor de volgende regels:

+
    +
  • Moet beginnen met http://modellen.geostandaarden.nl/def/
  • +
  • Na /def/ volgt een korte naam
  • +
  • Na de korte naam volgt een #
  • +
  • Geen versie-aanduiding in de URI
  • +
+

Voorbeeld: http://modellen.geostandaarden.nl/def/nen3610#

+
+

Note +Waarom geen versie

+

Hierover is veel discussie geweest. In de LinkedData-wereld is het de gewoonte om geen versie in de URL te zetten. De belangrijkste reden hiervoor is dat de URI een identificatie is. Als deze per versie zou wijzigen, zou dat eigenlijk betekenen dat het een nieuwe ontologie is en dat alles dat erin staat een nieuwe betekenis heeft. Dit is bijna nooit echt wat je wilt.

+

De klasse Gebouw uit NEN3610:2011 is in essentie nog steeds dezelfde als de klasse Gebouw uit NEN3610:2022. Mogelijk is de definitie en daarmee populatie een enigszins veranderd. Dat wil zeggen: misschien zit er tussen beide definities een verschil tussen wat je als een gebouw beschouwt. Maar in essentie bedoel je nog steeds hetzelfde, dus verander je dan niet de identificatie.

+

Een andere reden om geen versie in de URI op te nemen is dat dit voorkomt dat je alle data die de ontologie gebruikt, moet updaten als de URI gewijzigd is vanwege een nieuwe versie van de ontologie.

+
+

Kwaliteitscontrole

+

Controleer het gegenereerde .ttl-bestand op correcte syntax met behulp van een online validator.

+

Publiceren

+

De ontologie is gepubliceerd op http://modellen.geostandaarden.nl +Beheerders, oa Linda en Pano hebben de FTP-toegang hiervan.
+De ontologie is gepubliceerd in vier bestandsformaten: + - HTML (.html) + - Turtle (.ttl) + - RDF/XML (.rdf) + - JSON-LD (.json)

+

Het .ttl-bestand is automatisch geconverteerd naar RDF/XML en JSON-LD met behulp van een online conversietool.

+

Folderstructuur en rootfolder

+

De folderstructuur op de webserver is als volgt:

+
/ 
+ index.html 
+ .htaccess 
+ /def 
+   /nen3610 
+   /nen36102022 
+
+

In de root / staat een bestand index.html dat de content bevat die je ziet in je browser als je naar http://modellen.geostandaarden.nl gaat. Dit bestand wordt handmatig beheerd. Het moet worden aangepast als er meer ontologieën bij komen.

+

In de root / staat verder een .htaccess-bestand. Dat is een webserverscript dat ervoor zorgt dat een verzoek om de ontologie, afhankelijk van de client, de webserver het juiste bestandsformaat laat teruggeven. Als een gebruiker met een webbrowser om http://modellen.geostandaarden.nl/def/nen3610# vraagt, geeft de webserver een html-bestand terug dat de browser kan tonen en de gebruiker kan lezen. Als een gebruiker met een ontologie-editor vraagt om dezelfde URL, geeft de webserver bijvoorbeeld het .ttl-bestand terug.

+

Het .htaccess-bestand is gemaakt door Linda en Pano en wordt beheerd in github.

+

Ontologie-bestanden op de webserver

+

De ontologie-bestanden .ttl, .rdf en .json staan in /def. De ontologie is zowel als bestand met versieloze bestandsnaam en als bestand met versieaanduiding opgeslagen. NEN3610 gebruikt een jaartal, maar semantic versioning is ook toegestaan.

+
  /def 
+    nen3610.ttl 
+    nen3610.rdf 
+    nen3610.json 
+    nen3610-2022.ttl 
+    nen3610-2022.rdf 
+    nen3610-2022.json 
+
+

HTML-bestanden op de webserver

+

De .html-bestanden staan in twee subfolders, eentje met versieaanduiding en eentje zonder. De versieloze folder bevat altijd dezelfde inhoud als de nieuwste versie.

+
    /nen3610 
+     index.html 
+    /nen36102022 
+     index.html 
+
+

Opname in vocabulary catalogus

+

En pagina over de NEN3610-ontologie is daarnaast ook op Linked Open Vocabularies (LOV) gepubliceerd, een online catalogus van ontologieën. Dit is aangevraagd via een email naar de beheerders via de contactlink. De beheerders controleren de ontologie en geven tips ter verbetering. NEN3610 staat hier.

+

FAIR ontologie

+

Om te zorgen dat de ontologie vindbaar en bruikbaar is, zijn er aanvullende regels. Deze zijn gebaseerd op de regels voor FAIR-ontologieën van Linked Open Vocabularies, de vindplaats van ontologieën waar NEN3610 ook in is opgenomen. Hun regels zijn ook beschreven in een goed leesbare paper. De manier waarop de NEN3610-ontologie is gepubliceerd is hierop gebaseerd.

+

Metadata

+

De volgende metadata dient te worden opgenomen in de ontologie:

+
    +
  • Versie-informatie: owl:versionIRI en owl:versionInfo
  • +
  • license (CC-BY)
  • +
  • creator, eventueel contributor, creationDate en (als die bestaat) previousVersion
  • +
  • prefix, title and description
  • +
  • source: verwijzing naar informatiemodel waar de ontologie op gebaseerd is
  • +
  • publisher: verwijzing naar Geonovum
  • +
+

Vertaling naar het Engels

+

Het wordt aangeraden om de ontologie te vertalen naar het Engels (dit kan in hetzelfde bestand, door verschillende talige labels aan de klassen en eigenschappen te geven). Voor NEN3610 wordt dit overwogen.

+

Relatie met andere ontologieën

+

Het is good practice om de ontologie te relateren aan andere ontologieën, met name aan NEN3610, GeoSPARQL, OWL Time, de Semantic Sensor Network Ontology (SSN), NEN 2660 etc. Voor NEN3610 is dit nog niet gedaan. Hiervoor zijn een aantal standaardrelaties beschikbaar, zoals; + - equivalentClass + - equivalentProperty + - subClassOf + - subPropertyOf

+

Relatie met andere ontologieën in Enterprise Architect

+

In Enterprise Architect is het mogelijk om deze relaties aan te geven. De ontologie-generator zet ze dan ook in de ontologie, maar het mechanisme is nog niet gestandaardiseerd in MIM. De Generatie MIM-ontologie is ontwikkeld in het WaU als onderdeel van het IMX-Geo-project. Om aan te geven dat iets uit je model precies hetzelfde is als iets uit een ander model: Tagged value uri bij klassen, attributen en relaties; gevuld met de URI van de ontologie plus de identifier van de klasse of eigenschap in de ontologie (de MIM naam). Dit wordt vertaald naar equivalentClass of equivalentProperty. Om aan te geven dat iets een subklasse of -eigenschap is van een klasse of eigenschap uit een ander model, is er nu nog geen methode.

+

Voorbeeld relatie met andere ontologie IMX-Geo en NEN3610

+

Voorbeeld relatie naar NEN3610-ontologie vanuit IMX-Geo

+

De attributen domein en identificatie komen uit NEN3610.

+

domein heeft Tagged value:

+
uri = http: http://modellen.geostandaarden.nl/def/nen3610-2022#domein 
+
+

identificatie heeft Tagged value:

+
uri = http://modellen.geostandaarden.nl/def/nen3610-2022#identificatie  
+
+
+
+ + + + + + + + + + + + diff --git a/Imvertor/index.html b/Imvertor/index.html new file mode 100644 index 0000000..913ba0d --- /dev/null +++ b/Imvertor/index.html @@ -0,0 +1,320 @@ + + + + + + + + + + + Imvertor - Geonovum tooling + + + + + + + + + + + +
+
+
+
+ +

Imvertor

+
+

TODO: invullen vanuit de volgende documenten +

+
+

Imvertor wordt veel gebruikt binnen Geonovum voor het transformeren van UML modellen naar bijvoorbeeld xml-schema’s of feature catalogues. De instructies van hoe er mee om te gaan zijn overal verspreid. Op deze pagina probeer ik alles te verzamelen….

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
onderwerpverwijzing
Imvertor-propertiesUitleg verschillende properties
AlgemeenVerzamelde handleiding van organisaties
AlgemeenRepository coördinatie Imvertor gebruik Geonovum
WerkinstructieIMGeluid werkinstructie
Imvertor meldingenMeldingen
Uitleg schema mappingHier
+

Denk hier aan

+
    +
  • Een Imvertor run levert een flink aantal UML diagrammen op in de data folder. Niet meer gebruikt diagrammen worden nooit verwijderd uit deze folder waardoor er vaak veel niet gebruikt diagrammen in staan. Tip: gooi voor het draaien van Imvertor de data map een keer leeg.
  • +
+
+
+ + + + + + + + + + + + diff --git a/MIM-toolbox-genereren-extensie/index.html b/MIM-toolbox-genereren-extensie/index.html new file mode 100644 index 0000000..13026c2 --- /dev/null +++ b/MIM-toolbox-genereren-extensie/index.html @@ -0,0 +1,522 @@ + + + + + + + + + + + Toolbox genereren extensie - Geonovum tooling + + + + + + + + + + + +
+
+ +
+ +

Handleiding - Extensie maken op MIM-toolbox

+ + + + + + + + + + + + + + + + + + + + + +
Software/StandaardVersie
MIM-standaard1.1.1
MIM-toolbox1.1.1
Enterprise Architect (EA)15.2
+

Inhoud

+
    +
  1. Beschrijving
  2. +
  3. Importeer de MIM-toolbox in de EA-omgeving
  4. +
  5. Maak de package-structuur aan voor de extensie
  6. +
  7. Modelleer de toolbox-extensie
  8. +
  9. Modelleer het toolbox-menu
  10. +
  11. Modelleer het diagram
  12. +
  13. Genereer MDG Technology
  14. +
  15. Werken met de toolbox
  16. +
+

Beschrijving

+

Deze handleiding beschrijft hoe je in Enterprise Architect een extensie maakt op de MIM-toolbox. Dit is van toepassing als er extra metamodelconstructies nodig zijn voor het maken van een informatiemodel. Meer informatie en spelregels hiervoor vind je in de MIM-standaard. Een extensie op de MIM-toolbox is ook bedoeld voor het maken van aanvullende constructies die alleen spelen op het niveau van implementatie, of op het niveau van afgeleide technsiche modellen ten behoeve van specifieke interfaces.

+

Met een extensie breidt je MIM-toolbox uit. Dit is handig wanneer je extra informatie aan modelonderdelen (bijv. objecttypen) wilt toevoegen. Bijvoorbeeld voor: + - het uitbreiden van de set met metagegevens voor modelonderdelen van een specifiek sector-/domeinmodel (extra tagged values); + - het uitbreiden van de set met metagegevens voor specifieke toepassingen van het model, zoals bijvoorbeeld in Imvertor of voor een UML-JSON-encodings; + - het het toevoegen van extra stereotypen.

+

Deze handleiding neemt het maken van een DiSGeo-extensie op MIM als voorbeeld. Voor het informatiemodel DiSGeo zijn voor de MIM-stereotypen «Objecttype» en «Attribuutsoort» meta-informatie nodig in de vorm van extra tagged values. Voor Objecttype gaat dat om het toevoegen van Actualiteit en Inwinning verplicht. Voor Attribuutsoort zijn dat: Inwinningsregels en Positionele juistheid.

+

Voorbereiding

+

Zorg dat je de volgende twee zaken bij de hand hebt: + 1. Enterprise Architect: Het is handig om de volgende venster te openen + - Browser + - Toolbox + - Properties + - Features + 1. De MIM-toolbox waarop je een extensie wilt bouwen, in de vorm van een MDG Technology (.xml). Hier vind je de meest actuele versie van de toolbox

+

Stap 1: Importeer de MIM-toolbox in de EA-omgeving

+
    +
  • Open de project browser.
  • +
  • Klik op de tab Resources.
  • +
  • Klik op de map MDG Technologies.
  • +
  • Klik met de rechtermuisknop op Model Technologies en selecteer Import Technology.
  • +
  • Open de MDG Technology (dit bestand heeft een .xml-extensie) van de MIM-toolbox.
  • +
  • Klik Openen.
  • +
  • Selecteer daar linksonderin het diagloogvenster Import To Model en klik vervolgens op OK.
  • +
+

Indien je geen foutmelding krijgt, heb je de MIM-toolbox succesvol geïmporteerd.

+

Stap 2: Maak de package-structuur aan voor de extensie

+
    +
  • Klik in de project browser linksbovenin op de map met het gele sterretje, of druk Ctrl+Shift+M.
  • +
  • Hierdoor open de Model Wizard.
  • +
  • Selecteer het tabblad Model Patterns.
  • +
  • Klik daaronder op Model Technologies Perspective.
  • +
  • Ga naar Management en selecter vervolgens: MDG Technology Builder.
  • +
  • In het venster verschijnen nu verschillende Model Patterns. Dit zijn templates voor het maken van modellen.
  • +
  • Kies nu onder MDG Technology Builder voor Basic Template en klik linksonderin op Create Pattern(s).
  • +
  • Geef in het dialoogvenster dat nu verschijnt de naam van de extensie op die je gaat maken (bijvoorbeeld 'DISGEO') en klik op OK.
  • +
+

In de project browser zie dat er nu een nieuwe package DiSGeo is toegevoegd. Dat package bevat een + - diagram; + - een «profile»; + - een «diagram profile»; + - en een «toolbox profile».

+

Je hebt nu succesvol de package structuur aangemaakt.

+

Stap 3: Modelleer de toolbox-extensie

+
    +
  • Vouw het package «profile»DISGEO uit
  • +
  • Dubbelklik op het diagram
  • +
  • Hierdoor opent het diagram en verschijnt de bijbehorende toolbox: UML::Profile
  • +
  • Ga in het toolboxmenu naar Metaclass en sleep dit element in het diagram.
  • +
  • Er verschijnt nu een venster Extend Metaclass.
  • +
  • Klik in de linkerkolom op Stereotypes. Hierdoor verschijnen aan de rechterkant alle stereotypen die MIM kent.
  • +
+
+

Let op: deze zijn alleen beschikbaarbaar nadat je de MIM-toolbox hebt geïmporteerd (zie: stap: 1).

+
+
    +
  • Zoek in de lijst aan de rechterkant «Objecttype» en «Attribuutsoort» op, selecteer deze en klik op OK.
  • +
  • Deze worden nu toegevoegd aan het diagram.
  • +
  • Zoek nu in het toolboxmenu Add Stereotype op (onder Profile Helpers) en sleep dit element op het diagram.
  • +
  • Er verschijnt nu een venster Add Stereotype.
  • +
  • We gaan nu een stereotype maken dat dient als extensie op het MIM-stereotype «Attribuutsoort».
  • +
  • Geef een naam op voor het stereotype. In het geval van dit voorbeeld is gekozen voor Attribuutsoort, maar dit kan elke andere willekeurige naam zijn.
  • +
  • Klik vervogens op de button Add Metaclass.
  • +
  • Hier geef je de UML-metaklasse uit EA op waarop je extensie plaatsvindt. Als je niet weet van welke UML-metaklasse je stereotype wordt afgeleid, zoek dit dan op in het MIM-profiel.
  • +
+
+

Info: In hoofdstuk 3 van de MIM-standaard staat beschreven van welke UML-metaklasse elk MIM-stereotype is afgeleid. Omdat je een extensie maakt op MIM, is de nieuwe extensie automatisch óók een extensie op een UML-type. Desondanks moet je dit in Enterprise Architect expliciet benoemen.

+
+
    +
  • Laat de overige instellingen staan en klik op Volgende.
  • +
  • In dit venster, Define Tagged Values, kun je de extra metadata-elementen opvoeren.
  • +
  • Klik met de rechtermuisknop in de kolom Property
  • +
  • Kies uit het menu Add Tagged Value.
  • +
  • Voer een naam op voor de tagged value. In het geval van dit voorbeeld Actualiteit.
  • +
  • In de linkerkolom kun je nog een standaardwaarde opvoeren, maar dat is niet verplicht.
  • +
  • In dit voorbeeld blijft dit veld leeg.
  • +
  • Herhaal deze stap voor alle tagged values die je aan dit element wilt toevoegen.
  • +
  • Als je klaar bent, kun je bovenstaande stappen herhalen voor «Objecttype».
  • +
  • Klik daarna op Voltooien
  • +
+

Je ziet nu het nieuwe stereotype met de tagged values. Daarnaast heeft het nu een relatie met de UML-metaklasse «Attribute». Als laatste onderdeel van deze stap moet nu de relatie gelegd worden tussen het nieuwe stereotype en het MIM-stereotype. Dit gaat als volgt:

+
    +
  • Klik nu op het element Attribuutsoort.
  • +
  • Er verschijnen nu rechts van het element een aantal iconen.
  • +
  • Klik op de witte pijl (QuickLinker) met de muisknop ingedrukt en sleep dit naar het bijbehorende MIM-type (het bovenste icoon)
  • +
  • Kies uit het menu dat nu verschijnt voor Generalization.
  • +
  • Je extensie-type heeft nu een relatie met MIM::Attribuutsoort én UML::Attribute.
  • +
  • Herhaal deze stappen voor «Objecttype».
  • +
+

Als laatste stap is het handig om het kleurenschema van het modelelement gelijk te maken aan dat van MIM. Dat gaat als volgt:

+
    +
  • Klik met de rechtermuisknop op het nieuwe element Objecttype.
  • +
  • Navigeer naar Appearance en klik op Default Appearance.
  • +
  • Nu opent een venster met dezelfde naam.
  • +
  • Klik op Background Color.
  • +
  • Klik op More Colors.
  • +
  • Selecteer het tabblad Custom.
  • +
  • En vul vervolgens onderstaande waarden in:
  • +
+
   Hue:   128
+   Sat:   245
+   Lum:   230
+   Red:   206
+   Green: 253
+   Blue:  254
+
+
    +
  • Klik op OK.
  • +
  • Zet Border Color en Font Color op zwart.
  • +
  • Klik op OK.
  • +
  • Herhaal deze stap voor de andere modelelementen, in dit geval Attribuutsoort.
  • +
+

Je hebt nu succesvol het profiel van je extensie aangemaakt.

+

Stap 4: Modelleer het toolbox-menu

+

In deze stap maak je de menupagina van de toolbox. Hiermee bepaal je hoe en welke stereotypes zichtbaar zijn in het menu. Het doel van de DiSGeo-extensie is om bestaande MIM-stereotypen uitbreiden met extra tagged values. Daarvoor introduceerden we in EA onder de moterkap weliswaar twee nieuwe stereotypen («Objectype» en «Attribuutsoort»), maar die willen we niet expliciet terugzien in de toolbox. In de toolbox willen we «Objecttype» en «Attribuutsoort» aanbieden.

+
    +
  • Open het lege diagram uit het package «toolbox profile»DISGEO.
  • +
  • Sleep uit de toolbox die bij dit diagram hoort de Profile Helper Add Toolbox Page op het diagram.
  • +
  • Het venster Add Toolbox Page opent nu.
  • +
  • Vul de naam in van de toolboxpagina die je wilt maken. In dit geval maken we een kopie van de MIM-toolbox, dus noemen we deze (eerste) pagina: MIM: Objecten en attributen.
  • +
  • Klik vervolgens op de Add-button en selecteer de optie Add Stereotype.
  • +
  • Het venster Select A Profile Element opent nu.
  • +
  • Navigeer naar het package «profile»DISGEO en selecter «stereotype»Objecttype en klik op OK.
  • +
  • In de eerste rij van de tabel in het venster Add Toolbox Page, is nu dit stereotype toegevoegd.
  • +
  • Voor de leesbaarheid is het fijn om het type een alias mee te geven (anders heet het toolbox-item DISGEO::Objectype(UML::Class). Vanwege het eerder genoemde uitgangspunt, krijgt dit stereotype het alias 'Objecttype'.
  • +
  • Voeg nu op dezelfde manier 'Attribuutsoort' toe en klik nog niet op OK!.
  • +
  • Je hebt nu de twee nieuwe stereotypes toegevoeg aan de toolboxpagina:
  • +
+
+ DISGEO::Objecttype(UML::Class)
++ DISGEO::Attribuutsoort(UML::Attribute)
+
+

In de MIM-toolbox heeft deze pagina nog drie andere stereotypes. Deze kun je uit het package MIM-UML halen. Deze beschrijving gaat ervan uit dat je hierover beschikt.

+
    +
  • Klik nogmaals op de Add-button en navigeer nu naar het package «MIM-UMLprofile» en voeg de volgende elementen toe:
  • +
+
DISGEO::Objecttype(UML::Class)
+DISGEO::Attribuutsoort(UML::Attribute)
++ MIM::Gegevensgroep(UML::Attribute)
++ MIM::Gegevensgroeptype(UML::Class)
++ MIM_Keuzeattribuut::Keuze(UML::Attribute)
+
+
    +
  • Geef ze de bijbehorende aliassen uit het MIM-profiel
  • +
  • Klik nu op OK.
  • +
  • Voeg de toolboxpage toe voor MIM-Relaties, MIM-Datatypen, MIM-Waardelijsten en MIM-Packages.
  • +
  • Herhaal hiervoor de voorgaande stappen.
  • +
+

Je hebt nu met succes het toolboxmenu gemaakt. Het is in alle gevallen mogelijk om de namen van de stereotypen met de hand op te voeren. De schrijfwijze luistert heel nauw, dus heeft het de voorkeur gebruik te maken van Add Stereotype.

+

Stap 5: Modelleer het diagram

+
    +
  • Open het lege diagram uit het package «Diagram Profile»DISGEO.
  • +
  • Sleept uit de toolbox die bij dit diagram hoort de Profile Helper Add Diagram Extention op het diagram.
  • +
  • Het venster Add Diagram Extention opent nu.
  • +
  • Geef een naam op voor het diagram en kies bij Extention Type voor Class.
  • +
  • Geef bij Description eventueel een beschrijving op voor de toepassing van dit diagram. Het is handig om hier te vermelden dat je dit diagram nodig hebt om voor de MIM-toolbox inclusief extensie!
  • +
  • Vouw onder Properties de lijst met General uit.
  • +
  • Kies bij Toolbox Profile uit de lijst met namen, de naam van het profiel, in dit geval: DISGEO en klik op OK.
  • +
  • Klik nu op het modelelement «metaclass» Diagram Logical en voeg bij Features een nieuw attribuut toe met de naam: toolboxPage. + Vul bij Initial Value de het volgende in:
  • +
+

MIM: Objecten en attributen=1;MIM: Relaties=1;MIM: Datatypen=1;MIM: Waardelijsten=1;MIM: Packages=1;UML: Connectors=0;

+
    +
  • Dit geeft aan welke onderdelen van de het toolbox menu uit- (waarde: 1) of ingevouwen (waarde: 0) zijn.
  • +
+

Je hebt nu succesvol een Diagram Profile aangemaakt.

+

Stap 6: Genereer MDG Technology

+

Je hebt nu succesvol de volgende drie profielen gemaakt: + - «profile»DISGEO + - «diagram profile»DISGEO + - «toolbox profile»DISGEO

+

In de volgende stap lees je hoe je de profielen publiceert +Volg deze link voor een beschrijving.

+

Nadat je elk profiel gepubliceert hebt, 'bundel' je ze in een MDG Technology. +Hoe je dat doet, lees je hier

+

Stap 7: Werken met de toolbox

+

Bekijk de meest actuele handleiding voor het gebruik van toolboxen in EA.

+
+
+ + + + + + + + + + + + diff --git a/MIM-toolbox-genereren/index.html b/MIM-toolbox-genereren/index.html new file mode 100644 index 0000000..40cd3ae --- /dev/null +++ b/MIM-toolbox-genereren/index.html @@ -0,0 +1,597 @@ + + + + + + + + + + + Toolbox genereren - Geonovum tooling + + + + + + + + + + + +
+
+ +
+ +

Handleiding - MIM-Profiel, -Toolbox & -MDG Genereren

+ + + + + + + + + + + + + + + + + + + + + +
Software/StandaardVersie
MIM-standaard1.1.1
Enterprise Architect15.2
Subversion (SVN)1.14.1
+

Inhoud

+
    +
  1. Voorbereiding
  2. +
  3. Profiel publiceren
  4. +
  5. Genereer MDG Technologie
  6. +
  7. Test de Toolbox
  8. +
  9. Quicklinker
  10. +
  11. Aandachtspunten
  12. +
  13. MIM MDG
  14. +
  15. Regels
  16. +
+

Beschrijving

+

Deze handleiding beschrijft het proces voor het genereren van een customized toolbox voor modelleren met Enterprise Architect. Het gaat specifiek in op het maken van de MIM-toolbox. Maar ook voor het genereren customized toolboxen in het algemeen, biedt deze beschrijving een handig overzicht van de benodigde stappen. Een inhoudelijke beschrijving voor het maken van de benodigde profielen, vind je hier (linkOpnemen). De meest actuele versie van MIM kun je hier (linkOpnemen) raadplegen.

+ + +

1 Voorbereiding

+

Controleer voordat je (MIM-)profielen gaat genereren eerst de volgende zaken:

+ +

1.1 Benodigde bestanden

+

Controleer of je beschikt over alle benodigde bestanden:

+ +

Het MTS- en CSV-bestand vind je hier (zie ook: onderstaande afbeelding).

+

+

1.2 Benodigde profielen

+

Controleer of je beschikt over alle benodigde profielen:

+
    +
  • Open met Enterprise Architect het project met de MIM-profielen.
  • +
  • Ga in de project browser naar het package MIM-UMLprofiel.
  • +
  • Controleer of daarin de benodigde profile packages aanwezig zijn:
  • +
+

+
    +
  • Controleer of in het package «profile» MIM het element «document» QuickLinker aanwezig is.
  • +
+

+
+

NOTE: Het CSV-bestand van de QuickLinker is een kopie van de informatie die in dit element is opgeslagen. Als je wijzigingen wilt aanbrengen in de QuickLinker, of als er in het model wijzingen zijn doorgevoerd die van invloed zijn op de QuickLinker, kun je die met behulp van het CSV-bestand aanpassen (hier linkOpnemenNaarQuickLinkerMakenOfBewerken lees je hoe dat moet).

+
+

Indien de profielen al in XML-formaat beschikbaar zijn (zie: (linkOpnemenNaarPackagePublicerenAlsProfiel), klik dan hier (linkOpnemenGenererenToolbox) om de volgende stap over te slaan en direct te beginnen met het genereren van de toolbox.

+

1.3 Versienummer Toolbox

+

Het is handig om een toolbox een versienummer mee te geven. Hiervoor zijn verschillende manieren. Bovendien is het mogelijk om te kiezen hoever je deze nummering doorvoert. Hieronder wordt uitgelegd op welke manier de MIM-toolbox van een versienummer wordt voorzien. Het belangrijkste uitgangspunt is dat het versienummer van de MIM-toolbox correspondeert met het versienummer van de MIM-dataspecificatie.

+

Format: MIM<spatie>#.#.#

+

Voor de MIM-toolbox is besloten om het versienummer op verschillende plekken mee te geven:

+ +

1.3.1 Versienummer MDG Technology (Toolbox)

+

Dit is het officiële versienummer. Als een gebruiker de toolbox importeert, kan dit teruggevonden worden onder Specialize > Manage Tech. In het venster dat dan verschijnt zoek je MIM op in de kolom Technology. In het subvenster rechtsboven vind je het versienummer terug.

+

1.3.2 Versienummer profile

+

De toolbox wordt gegenereerd uit profielen. Deze hebben ook een versienummer. Dit nummer is o.a. terug te vinden in XML-bestand. Omdat er in de loop van de tijd meerdere profielen gemaakt zullen worden, is het verstandig om dit in te vullen. Door dit bij te houden kun je in het XML-bestand van het profiel terugvinden welk profiel aan een bepaalde toolbox ten grondslag ligt.

+

1.3.3 Versienummer package

+

Door in het veld Alias van elk package het versienummer mee te geven kan een gebruiker van de toolbox in één oogopslag in het properties-venster zien met welke versie van de toolbox een modelelement is gemaakt. Dit is vooral handig in het dagelijks gebruik van de toolbox. Ook als je twee (versies van) MIM-modellen wilt vergelijken, geeft dit snel inzicht in de gebruikte MIM-versie.

+

+

1.3.4 Versienummer toolbox pages

+

De toolbox pages krijgen eveneens een versienummer. Hiervoor vouw je het package met het stereotype toolbox profile uit. Voor elke toolbox page is een element met het stereotype: stereotype.

+

+

Controleer of bij elk element het versienummer klopt.

+

+

Hierdoor ziet de gebruiker van de toolbox in één oogopslag met welke versie er gewerkt wordt.

+

+

1.3.5 Versienummer diagram

+

In MIM heeft het diagram geen versienummer. De MIM-dataspecificatie zegt daarom ook niets over een diagram; het is immers een hulpmiddel.

+
+

LET OP: Indien je ervoor kiest om de naam van het diagram toch aan te passen, dient de nieuwe diagramnaam ook worden doorgevoerd in het Quick Linker-element (kolom E: Diagram Filter) (lees hier hoe dat werkt).

+
+

2 Profiel publiceren

+

2.1 Publiceer package als UML-profiel

+
+

NOTE: Tussenkoppen toevoegen

+
+
    +
  • Navigeer naar het package MIM-UMLprofiel.
  • +
  • Selecteer vervolgens één van de bovengenoemde profielen (bijv. «profile» MIM).
  • +
  • Ga naar: Specialize.
  • +
  • Kies Publish Package as UML Profile.
  • +
  • En klik op: Publish Pack As UML profile.
  • +
  • Er verschijnt nu een nieuw venster.
  • +
+

+
    +
  • Voer profile name in: MIM.
  • +
  • Kies de locatie waar je het profiel wilt opslaan en geef het bestand een herkenbare naam
  • +
  • Voer het versienummer van de corresponderende MIM-dataspecificatie in (bijv.:1.1.1).
  • +
+

+

Let op er zijn twee belangrijke voorwaarden: +1. De profile name moet overeenkomenm met de naam van het package. +2. De namen van de packages met de stereotypen «profile», «profile diagram» en «profile toolbox» moeten exact hetzelfde zijn. +3. De naam van een package moet overeenkomen met de prefix van een toolbox-element (zie: afbeelding).

+
+

Opmerking: Dat er daarnaast packages zijn met een andere naam, maakt niet uit, zoals bijv. MIM_Keuzebasis, zo lang de drie voorgenoemde packages maar hetzelfde zijn.

+
+

+
+

Opmerking: Een toolbox-element verwijst naar de het package met het bijbehorende profiel. Als je de packagenaam van een profiel aanpast, verandert de naam van het toolbox-element niet automatisch mee. In de uiteindelijke toolbox zul je dit element dan niet kunnen gebruiken.

+
+
    +
  • Controleer of aan deze voorwaarden voldaan wordt.
  • +
  • Klik: 'Save'
  • +
  • Herhaal deze stappen voor alle profielen
  • +
  • Ga daarna door na de volgende stap om op basis van de profielen een toolbox te genereren.
  • +
+

3 Genereer MDG Technologie

+

Doorloop voor het genereren van een toolbox de volgende stappen in de Generate MDG Technology Wizard.

+

3.1 Selecteer package

+
    +
  • Selecteer het package waaronder alle subpackages vallen, in dit geval: MIM-UMLprofiel.
  • +
+

+

3.2 Open wizard

+
    +
  • Klik op 'Specialize' in de ribbon.
  • +
  • Kies: 'Publish Package'.
  • +
  • Kies: 'Generate MDG Technology'.
  • +
+

+

3.3 Selecteer MTS-bestand

+
    +
  • Kies 'Volgende'.
  • +
  • Kies 'Open an existing MTS file'.
  • +
  • Negeer de melding.
  • +
+
+

Opm: Het MTS-bestand vult een aantal standaard configuraties vooraf in, maar je kunt deze tijdens het proces nog aanpassen. Dit is een handig bestand. Het kan voorkomen dat je na het genereren van de toolbox aanpassingen wilt maken. Als je na het aanpassen van de gegevens opnieuw de toolbox wilt genereren, is het fijn als je deze gegevens niet opnieuw hoeft in te vullen.

+
+

3.4 Controleer gegevens

+

Vanuit het MTS-bestand wordt het volgende venster al ingevuld + - Technology: MIM + - Filename: (kies een naam en locatie) + - ID: build + build number (bijv.: build03) + - Version: 1.1.1

+

+
+

Toelichting +1. Icon en logo: deze velden blijven vooralsnog leeg. +1. URL: link naar corresponderende MIM-documentatie op GitHub/ReSpec. +1. Support: link naar website Geonovum. +1. Notes: Vul in het notes veld kort in wat is er in deze versie nieuw is.

+
+
    +
  • Klik 'Volgende'.
  • +
+

3.5 Controleer instellingen

+
    +
  • Controleer of Profiles, Diagram Types en Toolboxes zijn geselecteerd
  • +
  • Wijzig indien nodig de instellingen
  • +
  • Klik op 'Ok'
  • +
+

+

3.6 Selecteer profiles

+
    +
  • Alle configuraties kun je laden vanuit de MTF file.
  • +
  • Voor de eerste keer kun je ook een MTS-bestand genereren.
  • +
  • Select: 'Files To Be Included As Profiles'.
  • +
  • Kies hier alle XML-bestanden, behalve de toolboxprofile.
  • +
  • Klik 'Volgende'.
  • +
+

+

3.7 Selecteer diagrams

+
    +
  • Select: 'Files To Be Included As Diagram definitions'
  • +
  • Kies hier het diagramprofiel
  • +
  • Klik 'Volgende'.
  • +
+

+

3.8 Selecteer Toolboxes

+
    +
  • Select: 'Files To Be Included As Toolbox Definitions'
  • +
  • Kies hier het toolboxprofiel
  • +
  • +

    Klik 'Volgende'.

    +
  • +
  • +

    In de volgende stap selecteer je tot slot het toolbox profiel.

    +
  • +
+

+

3.9 Controleer gegevens en voltooi proces

+
    +
  • Klik 'Volgende'.
  • +
  • Check de box 'Save to MTS' en klik op 'Voltooien'
  • +
  • Indien je wijzigingen in de configuratie hebt aangebracht:
  • +
  • Kies checkbox 'Save To MTS'
  • +
+

+
    +
  • Klik: 'Voltooien'
  • +
+

4 Test de Toolbox

+
    +
  • Laad het MIM-profiel via "Resources"
  • +
  • maar er is een EAP-testf file
  • +
  • Verschillende manieren om de nieuwe toolbox te testen
  • +
  • Een model bouwen met alle MIM-mogelijkheden erin
  • +
  • Of: een nieuwe toolbox laden en update van het bestaande model uitvoeren
  • +
  • En dat kan door MIM metaklassen te slepen
  • +
  • Of door gebruik te maken va "Sync Tagged Values And Constraints"
  • +
  • Deze laatste optie vind je terug in het "Resources" menu
  • +
+

5 Quicklinker

+
+

NOTE: verder uitwerken

+
+

In ieder geval beschrijven: + - CSV-bestand nodig + - In Nederlandse versies van OS, is scheidingsteken een puntkomma: ; + - Voor Enterprise heb je een komma (,) nodig als scheidingsteken. + - Ook iets zeggen over werken in Excel, kan ook in EAP, maar werkt onoverzichtelijk. + - Overigens schijnt er ook een alternatieve (lees:eenvoudigere) methode te zijn vanaf een bepaalde EA-versie (nog uitzoeken!)

+

Afbeeldingen

+

+

+

+

+

+

6 Aandachtspunten

+
+

NOTE: verder uitwerken

+
+
    +
  • Tekstveld voor toelichting, niet initial value, maar notes field als datatype
  • +
  • Uitgebreide toelichting wordt afgekapt vanwege maximale lengte.
  • +
  • Profiel niet elke keer opnieuw moeten laden door het kopppelen aan een (std.) diagram
  • +
  • MIM 1.1 build 1
  • +
  • Vorige versie had ook zo'n naam, dit kun je op website of github terugvinden. gaat om de naam van de het XML
  • +
+

7 MIM MDG

+
+

NOTE: verder uitwerken

+
+
    +
  • profile helpers, model wizard: https://sparxsystems.com/enterprise_architect_user_guide/15.2/modeling/using_the_profile_helpers.html
  • +
  • Create Diagram Profiles using the Profile Helpers:https://sparxsystems.com/enterprise_architect_user_guide/15.2/modeling/create_diagram_profiles_using_.html
  • +
  • Morgen weer verder!
  • +
+

8 Regels

+
+

NOTE: verder uitwerken

+
+
    +
  • «profile», «diagram profile» en «toolbox profile» moeten dezelfde naam dragen
  • +
  • Bij het genereren van een profiel, moet profile name gelijk zijn aan de naam die het profiel draagt
  • +
  • Binnen een package mogen elementen niet dezelfde naam hebben, maar MIM kent verschillende elementen met de naam 'Keuze'. Om dit mogelijk te maken in de toolbox, zijn voor de keuze-elementen aparte aanvullende packages gemaakt. Vandaar dat er meerdere packages «profile» zijn.
  • +
+
+
+ + + + + + + + + + + + diff --git a/MIM-toolbox-importeren/index.html b/MIM-toolbox-importeren/index.html new file mode 100644 index 0000000..4d06736 --- /dev/null +++ b/MIM-toolbox-importeren/index.html @@ -0,0 +1,625 @@ + + + + + + + + + + + Toolbox importeren - Geonovum tooling + + + + + + + + + + + +
+
+ +
+ +

Handleiding - Importeren en toepassen MIM-toolbox in Enterprise Architect

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Software/StandaardVersie
MIM-standaard1.1.1
MIM-toolbox1.1.1, build 5
Enterprise Architect15.2
Subversion (SVN)1.14.1
+

Inhoud

+
    +
  1. Importeren MIM-toolbox
  2. +
  3. Toepassen MIM-diagram
  4. +
  5. Toepassen Quick Linker
  6. +
  7. Toepassen toolbox-item 'Relatierol'
  8. +
  9. Updaten MIM-versie in bestaand informatiemodel
  10. +
  11. Verwijderen oudere toolbox
  12. +
  13. Toolboxen beheren
  14. +
  15. Workspaces gebruiken
  16. +
+

1: Importeren MIM-toolbox

+
    +
  • Download het XML-bestand van de MIM-toolbox: MDG_MIM_Toolbox_v1.1.1_build05.xml.
  • +
  • Verwijder eventueel eerst de oudere versie van de toolbox als je die niet meer nodig hebt (Toolbox verwijderen).
  • +
  • Open Enterprise Architect
  • +
  • Open 'Resources'
      +
    • Kies rechts in beeld op 'Portals', of direct op het gelijknamige tablad in de 'Project Browser'
    • +
    • Selecteer in het dropdown-menu 'Windows'
    • +
    • Kies 'Resources' (onder 'Explore')
    • +
    +
  • +
+

+
    +
  • Klik op 'MDG Technologies'
  • +
+

+
+

Note
+Hier moet je de keuze maken of je de toolbox op model- of gebruikersniveau importeert. Beide hebben voor- en nadelen: + - Model: alleen te gebruiken binnen één EA-project. Voor elke project moet je apart de toolbox importeren. Indien je dit project met een andere gebruiker deelt, beschikt deze gebruiker ook over de toolbox. Dit is de aanbevolen optie. Dit geeft de minste kans op conflicten. + - User: Je hoeft de toolbox slechts éénmalig te importeren. Vervolgens is de toolbox automatisch beschikbaar voor alle EA-projecten waar je als gebruiker aan werkt. Het nadeel is dat bij het delen van projecten de toolbox niet mee komt. Bovendien kunnen er conflicten tussen toolboxen ontstaan (zie: volgende informatiekader).

+

Warning
+Indien binnen jouw EA-omgeving ook een toolbox van een extensie op het MIM aanwezig is (bijvoorbeeld voor de BRO), dan is het raadzaam om de toolboxen alleen op model-niveau te importeren. Indien tenminste één van de twee op user-niveau is geïmporteerd, kan dit bij het toewijzen van stereotypen verwarring opleveren. Veel stereotypen hebben exact dezelfde naam en voor EA is het dan onduidelijk welke MDG Technology het moet kiezen. De bovenstaande aanpak houdt de werkwijze zuiverder.

+
+
    +
  • Klik met de rechtermuisknop op 'Model Technologies' of 'User Technologies'.
  • +
+

+
    +
  • Selecteer 'Import technology'.
  • +
  • Zoek het gedownloade XML-bestand van de MIM-toolbox op en kies 'Openen'.
      +
    • Overigens kun je ook in dit venster nog kiezen tussen 'model' of 'user'.
    • +
    • Op welke plek je de keuze maakt voor 'model' of 'user', maakt geen verschil.
    • +
    +
  • +
  • De velden 'Technology', 'Version' en 'Notes' worden nu automatisch ingevuld met de juiste informatie.
  • +
  • Controleer het versienummer: Version: 1.1.1.
  • +
+

+
    +
  • Klik 'Ok'
  • +
  • Navigeer in het 'Resources' naar 'MDG Technologies' > 'Model Technologies'.
  • +
  • Controleer of hier nu een map met de naam 'MIM' staat.
  • +
  • Controleer ook of het MIM-versienummer klopt bij 'UML Profiles', 'Diagram Types' en 'Toolboxes'.
  • +
+

+ +
+

Warning
+De MIM-toolbox heeft een versienummer. Deze staat niet in de naam. Indien je besloten hebt om oudere versies van de MIM-toolbox niet te verwijderen, komt de naam 'MIM' mogelijk meerdere malen voor. Het beheren van toolboxen in Enterprise Architect doe je op deze manier.

+
+

2: Toepassen MIM-diagram

+

In voorgaande versies werd de MIM-toolbox toegepast op een standaard UML diagram (UML::Class). Dat kan nog steeds. Dit heeft echter één nadelige eigenschap. Als je in je project met meerdere diagrammen werkt, kan het voorkomen dat bij het wisselen tussen diagrammen de toolbox terugspringt op de standaard UML-toolbox. Hierdoor moet je de MIM-toolbox opnieuw opzoeken.

+

Dit probleem wordt veroorzaakt doordat een diagram en een toolbox aan elkaar gekoppeld zijn. Daarom is in versie 1.1.1 van de MIM-toolbox een speciaal MIM-diagram aangemaakt waaraan de toolbox gekoppeld is. Dit diagram is een directe afgeleide van het standaard 'UML Class diagram'. Hieronder staat uitgelegd hoe je dit kunt toepassen.

+
    +
  • Ga in de 'Project Browser' naar 'Project'.
  • +
  • Selecteer een package.
  • +
  • Klik op het diagramlogo om een nieuw diagram aan te maken.
  • +
+

+
+

Warning
+Dit kan alleen als je onder model in de Project browser al een package hebt aangemaakt. Als je dat nog niet hebt, maak dan eerst een (nieuw) package aan.

+
+
    +
  • Er opent nu een venster.
  • +
  • Geef het diagram een naam.
  • +
  • Klik op het dropdown-menu bij 'Type'.
  • +
  • Selecteer 'Specialized' > 'User Technologies' of 'Model Technologies' (afhankelijk van de manier waarop je de toolbox geimporteerd hebt).
  • +
+

+
    +
  • Klik in het deelvenster 'Select From' op 'MIM 1.1.1'.
  • +
+

+
    +
  • Nu verschijnt in het deelvenster 'Diagram Types' het 'MIM Diagram'.
  • +
  • Selecteer het diagram en klik op 'Ok'.
  • +
+
+

Note
+Het is belangrijk dat je het diagram daadwerkelijk selecteert. Je kunt herkennen of dit gelukt is, doordat in het onderste deelvenster een toelichtende tekst op het diagram verschijnt (anders staat er alleen 'MIM').

+
+

+
    +
  • De MIM-toolbox verschijnt nu in het toolbox-menu.
  • +
+

+
    +
  • Dubbelklik in de 'Project browser' op het nieuwe diagram.
  • +
  • In het venster 'Properties' zie je dat het diagram van het type 'MIM' is.
  • +
+

+

Het MIM-versienummer komt nu ook terug het veld Stereotype in het venster 'Properties' van het object. + - Maak een objecttype "A" aan. + - Controleer vervolgens in de het venster 'Properties' of in de naam van het stereotype het betreffende MIM-versienummer verschijnt. + - Tevens verschijnt er in dit venster een deelmenu met de titel '«Objecttype» ( from MIM 1.1.1 - Basiselementen )' + - Als dit klopt, is de toolbox correct geïmporteerd.

+

+

3: Toepassen Quick Linker

+

De Quick Linker is een hulpmiddel om snel en eenvoudig relaties te kunnen leggen tussen verschillende elementen. Het voordeel hiervan is dat het de gebruiker inzicht geeft in de volgens MIM toegestane relaties. De Quick Linker is beschikbaar via een icoontje dat rechtsboven een diagramelement verschijnt op het moment dat je het selecteert.

+

+

Je kunt de Quick Linker op drie manieren inzetten, namelijk voor het:

+ +

Hieronder beschrijven we elke methode afzonderlijk.

+

3.1 Verbinden bestaande modelelementen

+
    +
  • Klik met de muis op het icoon.
  • +
  • Houd de muisknop ingedrukt en trek een lijn naar het object waarmee je het wilt verbinden.
  • +
  • Er verschijnt een stippellijn en een menu.
  • +
+

+
    +
  • Selecteer het gewenste type MIM-relatie (bijvoorbeeld: «Generalisatie».
  • +
+

+

3.2 Nieuw modelelement

+

Je kunt ook vanuit een bestaand element een nieuw modelelement creëren. Dat gaat als volgt:

+
    +
  • Klik met de muis op het icoon.
  • +
  • Houd de muisknop ingedrukt en trek een lijn naar een lege plek in het diagram.
  • +
  • Er verschijnt een stippellijn en een menu.
  • +
+

+
    +
  • Dit menu ziet er anders uit dan bij het verbinden van twee bestaande elementen.
  • +
  • Navigeer naar 'MIM' en selecteer het gewenste type MIM-relatie (bijvoorbeeld: «Generalisatie»)
  • +
+

+

3.3 Meerdere nieuwe modelelementen

+

Ook is het mogelijk om vanuit een bestaand element meerdere én verschillende soorten modelelementen in één keer te creëren. Dat gaat als volgt:

+
    +
  • Klik met de muis op het icoon.
  • +
  • Houd de muisknop ingedrukt en trek een lijn naar een lege plek in het diagram.
  • +
  • Er verschijnt een stippellijn en een menu.
  • +
+

+
    +
  • Navigeer naar 'Create Multiple Elements'.
  • +
  • Er verschijnt een nieuw venster.
  • +
+

+
    +
  • Defineer in dit venster de elementen in de eerste kolom ('Name') en selecteer het gewenste type relatie in de derde kolom ('Type').
  • +
  • Klik op 'Ok' als je klaar bent.
  • +
+

+

4: Toepassen toolbox-item 'Relatierol'

+

Net als alle andere modelelementen uit de MIM-toolbox, kun je ook de «Relatierol» in het diagram slepen. Je doet dit door een «Relatierol» naar uiteinde van een reeds bestaande «Relatiesoort» te slepen. Wanneer je in EA het stereotype «Relatierol» toewijst aan een relatie, worden de bijbehorende 'Tagged Values' automatisch meegenomen.

+
+

Note
+In eerdere versies van de MIM1.1.1-toolbox ontbraken de Tagged Values bij de «Relatierol» na toewijzing. Dit is opgelost in build 5: MDG_MIM_Toolbox_v1.1.1_build05.

+
+
    +
  • Indien je twee modelelementen met elkaar verbindt door middel van een «Relatiesoort», kun je de «Relatierol» aan de target end (of de source end) toevoegen door middel van het toolbox-item «Relatierol».
  • +
  • Klik op het toolbox-item «Relatierol» en sleep het item met de muisknop ingedrukt naar de target end van de associatie en laat hier de muisknop weer los.
  • +
  • Er verschijnt een popup-venster.
  • +
+

+
    +
  • Vul bij 'Enter value' de naam van de «Relatierol» in en klik op 'Ok'.
  • +
  • Klik vervolgens in het 'Properties' venster op het 'Target' tabblad.
  • +
  • Vervolgens zie je de bijbehorende Tagged Values voor alternatief 1 of alternatief 2.
  • +
+

5: Updaten MIM-versie in bestaand informatiemodel

+

Er zijn verschillende situaties denkbaar waarin je één of meerdere type modelelementen van een informatiemodel wilt updaten. Bijvoorbeeld omdat er een bug-fix is geweest. Zoals hierboven beschreven, kreeg een «Relatierol» in de eerste versies van de MIM1.1.1-toolbox (build01-build04) geen Tagged Values mee. Maar het kan ook zijn dat je alle modelelementen in een model naar de nieuwste versie van toolbox wilt updaten. Hiervoor moet je het stereotype (het modelelement) synchroniseren. De volgende stappen beschrijven hoe dat werkt.

+

Verwijder de oude toolbox eerst en importeer vervolgens de nieuwe versie. Doorloop daarna de volgende stappen. Hieronder gebruiken we het updaten van «Relatierol» als voorbeeld, maar je kunt dit voor elk gewenst modelelement uit de toolbox toepassen.

+

+
    +
  • Ga naar het toolbox-item Relatierol en klik hier met de rechtermuisknop op.
  • +
+

+
    +
  • Klik op 'Synchronize Stereotype'.
  • +
  • Er opent een nieuw venster
  • +
  • Hierin staat in het veld 'stereotype' Relatierol al geselecteerd.
  • +
  • Klik op 'Ok'.
  • +
+

+
    +
  • Er verschijnt een popup-venster dat vraagt: 'Save latest changes?', klik 'Ja'.
  • +
  • De tagged values zijn nu gesynchroniseerd.
  • +
+

+

Herhaal bovenstaande stappen als je ook andere modelelementen wilt updaten.

+

6: Verwijderen oudere toolbox

+

Deze instructie is bedoeld voor het verwijderen van toolboxen die je niet meer wilt gebruiken. Bijvoorbeeld oudere versies van de MIM-toolbox.

+
    +
  • Open Enterprise Architect
  • +
  • Open 'Resources'
  • +
  • Kies rechts in beeld op 'Portals'
  • +
  • Selecteer in het dropdown-menu 'Windows'
  • +
  • Kies 'Resources' (onder 'Explore')
  • +
  • Klik op 'MDG Technologies'
  • +
+

Controleer nu of er onder 'Model Technologies' en/of 'User Technologies' toolboxen staan die je niet meer wilt gebruiken.

+
    +
  • Verwijderen 'Model Technologies'
      +
    • Klik met de rechtermuisknop op de toolbox en selecteer 'Remove technology'
    • +
    • Start hierna voor de zekerheid EA opnieuw op.
    • +
    +
  • +
  • Verwijderen 'User Technologies'
      +
    • Klik met de rechtermuisknop op de toolbox en selecteer 'Locate Technology'.
    • +
    • Verwijder het XML-bestand van de toolbox op deze locatie
    • +
    • Start hierna voor de zekerheid EA opnieuw op.
    • +
    • Ga verder met het importeren van de MIM-toolbox.
    • +
    +
  • +
+

7: Toolboxen beheren

+
    +
  • Ga naar de menubalk boven in beeld en selecteer 'Specialize' > 'Manage-Tech'
  • +
  • Hier vind je een overzicht van alle aanwezige MDG-technologies.
  • +
  • Scroll naar beneden en zoek 'MIM' op.
  • +
  • Indien je meerdere versies van de toolbox geïmporteerd hebt, vind je die hier terug.
  • +
  • Klik op één van de versies voor meer informatie.
  • +
  • In het informatievenster rechtsboven zie je welke versie het betreft. Tevens vind je hier terug of de toolbox op model- of gebruikersniveau is geïmporteerd.
  • +
  • Met het checkbox in de kolom 'Enabled' kun je ervoor kiezen om bepaalde bepaalde toolboxen uit te zetten. Dit doe je door het vinkje te verwijderen.
  • +
  • Ga verder met de laatste stappen van het importeren van de MIM-toolbox.
  • +
+
+

Warning
+Indien je toolboxen gebruikt met gelijknamige modelelementen, bijvoorbeeld oudere MIM-toolboxen of NEN3610 BRO Grouping-NL (dat een extensie is op MIM), dan kan dit leiden tot een verwijzing naar het 'verkeerde' profiel. Enterprise Architect doet dit automatisch. Hierdoor beschikt het stereotype bijvoorbeeld niet over de gewenste tagged values.

+
+

8: Workspaces gebruiken

+
+

Note
+Onderstaande tekst is nog in concept

+

Warning
+Dit onderwerp hoort niet in deze handleiding thuis, maar in handleiding over EA. Het kan wel handig zijn om vanuit deze handleiding ernaar te verwijzen.

+
+

8.1 Overzicht handige vensters bij het modelleren

+
    +
  • Project Browser
  • +
  • Resources
  • +
  • Notes
  • +
  • Tagged Values
  • +
  • Features
  • +
  • Pan & Zoom
  • +
  • Relationships
  • +
  • Relationship Matrix
  • +
  • Toolbox
  • +
+

8.2 Waar je ze vindt

+

Ga allereerst naar +Klik rechtsboven op Portals en selecteer Windows.

+

De meeste vensters uit 8.1 vind je terug in de volgende deelmenu's:

+

Explore + - Project Browser + - Resources

+

Properties + - Properties + - Notes + - Tagged Values + - Features

+

Diagram + - Pan & Zoom

+

Trace + - Relationships + - Relationship Matrix

+

Het venster Toolbox vind je in de taakbalk bovenin. Ga naar:

+

Design > Diagram > Toolbox (Ctrl+Shift+3)

+

8.3 En hoe je een workspace maakt en waarom dat handig kan zijn

+
+

Note +To do: tekst schrijven

+
+
+
+ + + + + + + + + + + + diff --git a/Markdown/index.html b/Markdown/index.html new file mode 100644 index 0000000..4b9b9d8 --- /dev/null +++ b/Markdown/index.html @@ -0,0 +1,393 @@ + + + + + + + + + + + Markdown - Geonovum tooling + + + + + + + + + + + +
+
+
+
+ +

Markdown

+

Voor het extern publiceren van documenten en standaarden gebruiken we +ReSpec. Deze tool ondersteunt naast HTML en Javascript ook Markdown

+

Markdown is een lichtgewicht +opmaaktaal op basis van platte tekst die zodanig ontworpen is dat het +gemakkelijk valt te converteren naar HTML en andere. Markdown wordt vaak +gebruikt voor de opmaak van project documentatie (README-bestanden), eenvoudige +CMS-systemen en berichten in online fora. Je kunt Markdown in iedere simpele +teksteditor bewerken.

+

Het ontwerpdoel van de taal is leesbaarheid. Teksten geschreven met behulp van +Markdown worden geacht al leesbaar te zijn voordat opmaak is toegepast op de +tekst. Opmaakinstructies en tags zijn dan ook niet te vinden in pure Markdown.

+

Lokale markdown in je browser

+

Sommige browsers weigeren het openen van lokale bestanden, of negeren links naar +locale bestanden. Dit kun je in de configuratie aanpassen:

+

Chrome

+

Je moet twee dingen instellen:

+
    +
  • Local access: Toestaan dat je local files toont in Chrome, dat is een opstart + argument. Kan je doen vanuit een cmd-prompt + `%localappdata%\google\chrome\application\chrome + --allow-file-access-from-files
  • +
  • CORS Toestaan : zelfde soort oplossing: --disable-web-security
  • +
+

Dit kan je ook in een snelkoppeling zetten als icoon op de desktop.

+

Firefox

+

In Firefox kan je dat instellen via de parameters.

+
    +
  • Kies:
  • +
  • Vertel firefox dat je weet waar je mee bezig bent.
  • +
  • security.fileuri.strict_origin_policy = false (dus op false zetten)
  • +
+

Tools voor Markdown

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
toolomschrijving
Markdown TutorialHandleiding Markdown
Markdown ReferenceNaslag Markdown
Visual Studio CodeFijne teksteditor die ook goed integreert met Github Desktop
PowerToysGeeft preview van Markdown rechtstreeks in Windows Explorer (en nog heeel veel andere tooltjes)
Tables GeneratorHelpt met het maken van tabellen in MarkDown
Markdown TableVSCode plugin voor het editen van Markdown tabellen.
PrettierEen code formatter die automatisch zorgt dat je markdown aan de regels voldoet.
markdownlintEen style checker form markdown bestanden. Geeft meldingen voor verkeerde markdown
Live ServerVSCode plugin. Klik rechtsonder op "Go Live" en je ReSpec doc wordt in live browser geopend.
+

Regels voor Markdown

+

Styling regels vastleggen voor Markdown zorgt ervoor dat wijzigingen in de markdown ook +altijd inhoudelijke wijzigingen zijn. Suggesties hiervoor

+
    +
  • Regellengte vastleggen.
  • +
  • Hoeveel springen we in?
  • +
  • Gebruiken unix end-of-line of windows
  • +
+

Deze afspraken kunnen we ook vastleggen. Zie hieronder twee voorbeelden. Het lijkt +erop dat de veschillende tools op verschillende manier formatteren. Niet alles +gaat goed samen.

+

Voorbeeld van '.prettierrc' gebruikt in dit project:

+
{
+  "printWidth": 80,
+  "tabWidth": 2,
+  "useTabs": false,
+  "singleQuote": true,
+  "endOfLine": "lf",
+  "proseWrap": "always"
+}
+
+

Voorbeeld van .markdownlinkt.json:

+
{
+    "default": true,
+    "MD003": { "style": "atx" },
+    "MD007": { "indent": 4 },
+    "MD013": { "line_length": 80, "code_blocks": false, "heading_line_length": 200, "tables": false},
+    "no-hard-tabs": false
+}
+
+
+
+ + + + + + + + + + + + diff --git a/ReSpec-code-toepassen/index.html b/ReSpec-code-toepassen/index.html new file mode 100644 index 0000000..91a902e --- /dev/null +++ b/ReSpec-code-toepassen/index.html @@ -0,0 +1,385 @@ + + + + + + + + + + + Code toepassen - Geonovum tooling + + + + + + + + + + + +
+
+
+
+ +

ReSpec - richtlijn code in tekst

+

Veel documenten die we bij Geonovum publiceren zijn datatspecificaties. In de tekst gebruik je daarom regelmatig stukken code. Het kan gaan om bepaalde termen of gegevens, waarover je iets in de lopende tekst wilt zeggen (inline code), of over langere stukken code (code block). +Deze handleiding is specifiek bedoeld voor de toepassing van code in documentantatie over informatiemodellen. Voor andere type code staat het je vrij hoe je dit toepast.

+

Inline code

+

Wanneer je in een lopende tekst een term of gegeven wilt markeren als code, pas je inline code toe. Door een term of gegeven als code te markeren, maak je duidelijk dat het woord een specifieke technische betekenis heeft. Inline code pas je toe door tekst tussen backticks (`) te plaatsen. De standaardopmaak voor inline code is sober: ReSpec zet het lettertype enkel om in een monospace font. Voor een duidelijkere opmaak van inline code, is daarom een css-bestand beschikbaar. De schrijfwijze van metaklassenamen, modelelementnamen of gegevens volgt de naamgevingsconventies van het MIM. Wees hierop alert als je inline code toepast in handgeschreven teksten.

+

Metaklassenaam

+

Pas deze notatie toe als je een modelelement (in UML: stereotype) uit een metamodel opneemt in de lopende tekst. Geonovum past het metamodel informatiemodellering (MIM) toe, maar de onderstaande richtlijn kan ook toegepast worden op modelelementen uit een ander metamodel. Enkele voorbeelden van modelelementen uit het MIM zijn:

+
    +
  • «Objecttype»
  • +
  • «Attribuutsoort»
  • +
  • «Relatiesoort»
  • +
+

Plaats voor deze notatiewijze naam van de metaklasse tussen twee dubbele guillemets «, ». Je vindt ze met de volgende toetsencombinaties:

+
    +
  • « = "alt" + "["
  • +
  • » = "alt" + "]"
  • +
+

In het markdown-bestand neem je een metaklassenaam als volgt op: +`«metaklassenaam»`.

+

Modelelementnaam

+

Pas deze notatie toe als je de naam van een modelelement van een informatiemodel opneemt in de lopende tekst. Het gaat dan bijvoorbeeld om de naam van een «Objecttype» of «Attribuutsoort» in een specifiek domeinmodel, zoals bijvoorbeeld:

+
    +
  • Pand («Objecttype»)
  • +
  • Persoon («Objecttype»)
  • +
  • naam («Attribuutsoort»)
  • +
  • geboortedatum («Attribuutsoort»)
  • +
  • geometrie («Attribuutsoort»)
  • +
  • VlakOfMultivlak («Keuze»)
  • +
+

In het markdown-bestand neem je een metaklassenaam als volgt op: +`modelelementnaam`.

+

Gegeven

+

Pas deze notitie toe als je een feitelijk of fictief gegeven opneemt in de lopende tekst. Het gaat om concrete waarden zoals die in een registratie (kunnen) voorkomen, zoals:

+
    +
  • "Jan"
  • +
  • "01-01-1970"
  • +
  • "234.5"
  • +
  • "[125.6, 10.1]"
  • +
+

Specifiek in de context van het MIM, gaat het om waarden die ingevuld (kunnen) worden bij de volgende modelelementen:

+
    +
  • «Attribuutsoort»
  • +
  • «Gegevensgroeptype»
  • +
  • «Relatiesoort»
  • +
  • «Relatieklasse»
  • +
  • «Data-element»
  • +
  • «Referentie-element»
  • +
  • «Enumeratie-waarde»
  • +
+

In het markdown-bestand neem je een metaklassenaam als volgt op: +`"gegeven"`.

+

Voorbeeld: gecombineerde inlinecodetypen

+

Stel je wilt in een tekst de volgende zin opnemen:

+
+

Het model bevat een objecttype persoon met een attribuutsoort naam met het gegeven: Jan én een attribuutsoort geboortedatum met het gegeven: "01-01-1970".

+
+

Dan ziet die zin er, na toepassing van bovenstaande richtlijnen er als volgt uit:

+
+

Het model bevat een «Objecttype» Persoon met een «Attribuutsoort» naam met het gegeven:"Jan" én een «Attribuutsoort» geboortedatum met het gegeven:"01-01-1970".

+
+

Uitgeplitst naar inlinecodetype, levert dat het volgende overzicht op:

+
Metaklassenaam
+
    +
  • «Objecttype»
  • +
  • «Attribuutsoort»
  • +
+
Modelelementnaam
+
    +
  • Persoon
  • +
  • naam
  • +
  • geboortedatum
  • +
+
Gegeven
+
    +
  • "Jan"
  • +
  • "01-01-1970"
  • +
+

Code block

+

Als je een stuk code hebt dat uit meerdere regels bestaat, kun je dit in een code block plaatsen. Hiermee scheidt je de code van de lopende tekst in een apart tekstblok. In het markdown-bestand neem je een stuk code dat uit meerdere regels bestaat als volgt op. Plaats de code tussen drie backticks (```). Geef optioneel direct achter de eerste drie backticks de (programmeer-)taal op voor syntax highlighting, zoals in het volgende voorbeeld.

+
input
+
```json
+{
+  "type": "Feature",
+  "geometry": {
+    "type": "Point",
+    "coordinates": [125.6, 10.1]
+  },
+  "properties": {
+    "name": "Dinagat Islands"
+  }
+}
+```
+ +
rendered output
+
{
+  "type": "Feature",
+  "geometry": {
+    "type": "Point",
+    "coordinates": [125.6, 10.1]
+  },
+  "properties": {
+    "name": "Dinagat Islands"
+  }
+}
+
+
+
+ + + + + + + + + + + + diff --git a/ReSpec-definitielijst-maken/index.html b/ReSpec-definitielijst-maken/index.html new file mode 100644 index 0000000..d29fef1 --- /dev/null +++ b/ReSpec-definitielijst-maken/index.html @@ -0,0 +1,350 @@ + + + + + + + + + + + Definitielijst maken - Geonovum tooling + + + + + + + + + + + +
+
+ +
+ +

Definities in ReSpec

+
+

Note +In dit stuk afbeeldingen opnemen waarin je het resultaat in ReSpec kunt zien. Daarvoor graag NL-ReSpec-GN-template aanvullen.

+
+

Intro

+

Een belangrijk onderdeel van een dataspecificatie is de definitie van begrippen. Steeds vaker leggen we bij Geonovum begrippen vast in een begrippenkader. Idealiter zouden we voor de definitie van een begrip altijd daarnaar willen verwijzen. Op dit moment is dat om meerdere redenen nog niet mogelijk. Op deze plek leggen we uit hoe we nu een definitie opnemen.

+

Definitie van een begrip opnemen in specificatie

+

De meeste begrippen in een dataspecificatie worden gedefinieerd in het hoofdstuk Gegevensdefinitie. Imvertor genereert dit hoofdstuk automatisch op basis van het model in EA. Deze beschrijving richt zich alleen op de hoofdstukken die met de hand geschreven worden.

+

De beschrijving in de handleiding van ReSpec is heel summier. Hierdoor pas je het snel en eenvoudig toe, maar het leidt niet vanzelfsprekend tot éénduidig gebruik. Er zijn namelijk verschillende manieren waarop je als gebruiker een begrip met definitie kunt opnemen:

+
    +
  1. inline
  2. +
  3. losse regel
  4. +
  5. lijst
  6. +
+

Binnen Geonovum willen we dit meer kaderen. Daarnaast hebben we aanvullende eisen ten aanzien van de weergave.

+
+

Warning +Blokweergave en 'normale' weergave niet door elkaar gebruiken. Als je het script gebruikt gaat dat niet goed. Dat kan aangepast worden, maar het is bovenal niet wenselijk om verschillende stijlen in één document toe te passen.

+
+

Weergave

+

ReSpec toont een gedefinieerd begrip door de term schuin en dikgedrukt weer te geven. Deze styling is niet voor elk doeleinde geschikt. Voor inline- en lijstweergave werkt dit prima, maar als losse regel weer niet. Daar mist styling. Toch is dat soms wenselijk, zoals in het MIM-document. Hiervoor is een aanvulling gemaakt op ReSpec, die je kunt gebruikern door [nog invullen].

+

Volgens ReSpec

+
<dfn>boek</dfn>een samengebonden of genaaid aantal bedrukte bladen.
+
+
Resultaat
+

Voorbeeld van definitie in ReSpec

+
Gebruik van definitie
+

Wil je naar een gedefinineerd begrip verwijzen gaat dat zo: <a>boek</a>`` of[=boek-]`

+

Aanvullende styling

+

wrap een definitie in een aside met attribute class="definition"

+
<aside class="definition">
+    <dfn>papier</dfn>stof om te beschrijven of bedrukken, uit vezelachtige
+    stoffen, hout, lompen, stro enz. vervaardigd
+</aside>
+
+
Resultaat
+

[afbeelding opnemen]

+ + +
+

Warning +Een begrip mag maar één keer voorkomen; je kunt een term niet op twee verschillende manieren definiëren.

+
+ + +
+

Warning +Hier graag zoveel mogelijk één lijn in trekken. Graag voorbeelden van hoe dat in huidige documenten zit.

+
+

Verwijzing maken naar gedefinieerd begrip

+

Als je op andere plekken in je document wilt verwijzen naar een gedefinieerd begrip, dan kan dat eenvoudig door het begrip tussen <a></a> te zetten, bijv: <a>boek</a>. Houd als richtlijn dat je alleen de eerste keer dat een term in een alinea voorkomt een verwijzing maakt. Dit voorkomt een overdaad aan verwijzingen in de tekst. Een verwijzing naar een term werkt in alle gevallen hetzelfde.

+
+
+
+ + + + + + + + + + + + diff --git a/ReSpec/index.html b/ReSpec/index.html new file mode 100644 index 0000000..5689353 --- /dev/null +++ b/ReSpec/index.html @@ -0,0 +1,1280 @@ + + + + + + + + + + + Manual - Geonovum tooling + + + + + + + + + + + +
+
+ +
+ +

Inleiding ReSpec

+

Binnen Geonovum gebruiken we ReSpec voor het maken van standaarden. ReSpec maakt +gebruik van input bestanden om HTML te genereren. Deze inputbestanden (de +content) wordt gemaakt in het Markdown formaat. Deze Markdown bestanden kunnen +worden aangemaakt met text editor. GitHub wordt gebruikt als de 'repository' +waarin alle bestanden die bij een standaard horen, beheerd worden.

+

Deze handleiding beschrijft hoe je een GitHub Account maakt, hoe je GitHub +Desktop Client installeert en gebruikt, hoe je een Respec mappenstructuur +opbouwt, welke bestanden er nodig zijn voor een standaard, en hoe je de +verschillende versies van een standaard genereert. Ook wordt uitgelegd hoe je de +Markdown plugin in Microsoft Word installeert en gebruikt.

+

ReSpec is een tool van W3C die het schrijven van specifications makkelijker +maakt. ReSpec zorgt voor een uniforme styling in het document, onderhoudt +referenties en verwijzingen naar andere documentatie, verzorgt de inhoudsopgave, +zorgt voor links naar vorige en meest recente versies, en heeft een integratie +met Github issues.

+

Geonovum gebruikt een fork van ReSpec die door Logius beheerd wordt. Dit +document bevat een globale instructie over hoe snel aan de start te gaan. Meer +documentatie is op andere plaatsen te vinden:

+
    +
  • Er is een gedetailleerde (Engelstalige) + gebruikershandleiding + beschikbaar.
  • +
  • Er is ook een + ontwikkelaarshandleiding + te vinden.
  • +
  • De Geonovum wiki over ReSpec is + een fork van de w3c ReSpec met aanpassingen voor Geonovum. Deze is + achterhaald omdat we nu van de Logius Respec gebruik maken. (TODO aanpassen)
  • +
+

Een nieuwe document maken

+

ReSpec documenten worden beheerd in een GitHub repository. Als je een +nieuw ReSpec document wilt maken gebruik dan de +Geonovum ReSpec template +als startpunt en druk op de 'Use this template' knop om een nieuw repository aan +te maken.

+

Zoek in dit repository op de tekst 'TODO' om de plaatsen te vinden waar +aanpassen van de template vereist is.

+

De URL van een publicatie op docs.geonovum.nl

+

ReSpec documenten worden gepubliceerd op +docs.geostandaarden.nl. Iedere gepubliceerde +versie van een document heeft een eigen URL. Voor de laatst gepubliceerde versie +is een aparte URL.

+

De URL van iedere publicatie wordt als volgt bepaald:

+
https://docs.geostandaarden.nl/[pubdomain]/[specStatus]-[spectype]-[shortName]-[publishDate]/
+
+

De laatst gepubliceerde versie is OOK te vinden op:

+
https://docs.geostandaarden.nl/[pubdomain]/[shortName]/
+
+

De namen van de variabelen staan verderop uitgelegd.

+

De mapindeling van een ReSpec repository

+

Dit levert een nieuw repository op met de onderstaande mappenstructuur.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
hoofdmapmapfileomschrijving
Hoofdmapnaam van de hoofdmap
mediaMap met mediabestanden
Style.cssFile met vaste naam, bevat de styling van het document
*.pngAfbeeldingsbestanden
index.htmlFile met de vaste naam Index.html
js
config.jsFile met de vaste naam config.js
*mdTekstbestanden (Markdown) die de content bevatten
+

Hieronder staat een voorbeeld van zo’n mappenstructuur.

+

media/image22.png

+

Het bestand 'index.html'

+

Het bestand index.html zorgt ervoor dat het ReSpec document automatisch wordt +geladen in de browser. Bij het laden wordt ook automatisch de +geonovum-ReSpec-code geladen en uitgevoerd. Deze code zorgt ervoor dat het +document zijn standaard layout krijgt.

+

Het bestand 'index.html' heeft een vaste indeling. Hieronder de structuur uit de +template:

+
<!DOCTYPE html>
+<html lang="nl">
+    <head>
+        <meta content="text/html; charset=utf-8" http-equiv="content-type" />
+        <meta
+            name="viewport"
+            content="width=device-width, initial-scale=1, shrink-to-fit=no"
+        />
+        <script
+            src="https://cdn.jsdelivr.net/gh/digitalbazaar/respec-mermaid@1.0.1/dist/main.js"
+            class="remove"
+        ></script>
+        <script
+            src="https://tools.geostandaarden.nl/respec/config/geonovum-config.js"
+            class="remove"
+        ></script>
+        <script src="js/config.js" class="remove"></script>
+        <script class="remove">
+            respecConfig = { ...organisationConfig, ...respecConfig };
+        </script>
+        <script>
+            document.title = respecConfig.title;
+        </script>
+        <title>TODO: Vul hier de titel in</title>
+        <link
+            rel="shortcut icon"
+            type="image/x-icon"
+            href="https://tools.geostandaarden.nl/respec/style/logos/Geonovum.ico"
+        />
+        <script
+            src="https://gitdocumentatie.logius.nl/publicatie/respec/builds/respec-nlgov.js"
+            class="remove"
+            async
+        ></script>
+    </head>
+
+    <body>
+        <section
+            id="abstract"
+            data-include-format="markdown"
+            data-include="abstract.md"
+        ></section>
+        <section id="sotd"></section>
+        <!-- Wordt automatisch gevuld -->
+
+        <!-- TODO: voeg hier je eigen hoofdstukken toe -->
+        <section
+            data-include-format="markdown"
+            data-include="ch01.md"
+            class="informative"
+        ></section>
+        <section
+            data-include-format="markdown"
+            data-include="ch02.md"
+        ></section>
+        <section
+            data-include-format="markdown"
+            data-include="mermaid.md"
+        ></section>
+
+        <section id="conformance"></section>
+        <section id="tof"></section>
+        <section id="index"></section>
+    </body>
+</html>
+
+

In de HTML-header wordt de js-ReSpec bibliotheek geladen. Het enige dat in de +header mag worden aangepast is de title (tussen \<title> en \</title>. Andere +aanpassingen die nodig zijn in de header mogen alleen worden gedaan in overleg +met de ReSpec beheerders. Een overzicht van de ReSpec beheerders staat in +Hoofdstuk 6

+

In de HTML-Body geldt vrijheid in gebondenheid De <div> en/of <section> +regels mogen worden gekopieerd en toegevoegd. Wel belangrijk om de structuur +over te nemen, dus als volgt:

+
<div id='H00' data-format='Markdown' data-include="ToCoVo.md"></div>
+
+<section id='H01' data-format='Markdown' data-include="H1-Inleiding.md"\>\<h2\>Inleiding\</h2\>\</section\>
+
+

Een <div> is een sectie plus bijbehorend document, dat niet in de +inhoudsopgave terechtkomt. Deze gebruik je bijvoorbeeld voor een Toelichting, +een Colofon of een Voorwoord.

+

Een <section> komt wél in de inhoudsopgave terecht. Deze heeft daarom behalve +de data-include van het document, ook (verplicht!) een <h2> tag. De tekst +tussen <h2> en </h2> komt in de inhoudsopgave te staan.

+

Het bestand 'config.js'

+

In config.js wordt een stuurvariabele voor ReSpec gevuld. De waarden in deze +variabele worden door ReSpec gebruikt om de layout te bepalen, en bevatten een +aantal document-eigenschappen.

+

SpecStatus

+

De SpecStatus in de configuratie geeft de keuze uit 4 waarden, deze waarden zijn +vastgesteld, en mogen niet zomaar uitgebreid of aangepast worden. Elke status +hoort bij een formele fase van een ReSpec document. Zie ook de Geonovum ReSpec +wiki.

+
    +
  • GN-WV, Werkversie: Dit is de versie van het document waaraan wordt + gewerkt. Deze versie is continu 'under-construction'.
  • +
  • GN-CV, Consultatieversie: Dit is een 'snapshot' van de versie die 'in + consultatie' wordt gezet. Aan deze versie wordt niks meer gedaan totdat de + consultatie is afgelopen. Daarna worden alle op en aanmerkingen uit de + consultatieronde verwerkt.
  • +
  • GN-VV, Vaststellingsversie: Dit is een 'snapshot' van de versie na het + verwerken van de op en aanmerkingen uit de consultatieronde is ontstaan. + Deze versie wordt aangeboden aan de programma-raad van Geonovum, om te + wordern 'vastgesteld'.
  • +
  • GN-DEF, Definitieve versie: Dit is de definitieve versie van het document, + zoals vastgesteld door de programma-raad. Van deze versie wordt opnieuw een + 'snapshot' gemaakt in ReSpec. Het resultaat van die snapshot wordt op + http://docs.geonovum.nl + neergezet.
  • +
+

SpecType

+

Het SpecType in de configuratie is een vaste lijst met waarden, deze waarden +zijn vastgesteld, en mogen niet zonder overleg met de Technische ReSpec +beheerders uitgebreid of aangepast worden.

+

Onderstaande beschrijvingen komen uit het generiek +beheerplan[5] Zie: +https://www.geonovum.nl/uploads/documents/Geonovum%20GENERIEK%20Beheerplan%20geo-standaarden%20v1.1.pdf +
.

+
    +
  • +

    NO Norm: Een norm is bij een officieel standaardisatie instituut + ondergebracht en bevat bindende afspraken. Naast het gebruik van normen is + NEN 3610 de enige norm waar Geonovum een inhoudelijke verantwoordelijkheid + heeft. Het formele beheer en beslissingen worden genomen in de NEN + normcommissie 351 240 waar Geonovum de voorzitter van is.

    +
  • +
  • +

    ST Standaard: Een document met (bindende) afspraken.

    +
  • +
  • +

    IM Informatiemodel: Een standaard waarbij door de term informatiemodel + te hanteren wordt aangegeven dat het een abstractie (het model) vormt van de + werkelijkheid zoals beschreven binnen een bepaalde sector/domein. + Informatiemodellen zijn een semantische invulling van normen voor sectoren + zoals ruimtelijke ordening, kabels en leidingen, water, etc..

    +
  • +
  • +

    PR Praktijkrichtlijn: Praktijkrichtlijnen zijn producten die informatie + geven, vaak met een technisch karakter, die nodig is voor het toepassen van + standaarden. Een praktijkrichtlijn hoort altijd bij een standaard/norm.

    +
  • +
  • +

    HR Handreiking: Op zichzelf staande documentatie dat als doel heeft een + hulpmiddel te zijn, niet verplichtend maar ondersteunend.

    +
  • +
  • +

    WA Werkafspraak: Legt uit hoe wetgeving moet worden toegepast bij + onduidelijkheden, discrepanties of fouten in de standaarden.

    +
  • +
  • +

    BD Beheerdocumentatie: Documentatie met betrekking tot het beheerproces + van de standaard. Deze documentatie betreft niet een standaard of onderdeel + daarvan, zoals een handreiking of werkafspraak.

    +
  • +
  • +

    AL Algemeen: Op zichzelf staande algemene documentatie over standaarden. + De documentatie betreft niet een specifieke standaard of onderdeel daarvan, + het is ook geen beheerdocumentatie van een specifieke standaard.

    +
  • +
+

pubDomain

+

pubDomain bepaalt bij publicatie een deel van de URL waarop het document wordt +gepubliceerd. Het zorgt voor een groepering van de documenten op +docs.geostandaarden.nl Omdat je de URL van gepubliceerde documenten niet wilt +veranderen is moet je hier goed over nadenken en alleen in overleg nieuwe +toevoegen.

+

De actuele lijst van pubDomains staat in de tabel hieronder. De herkomst van +deze lijst is als volgt:

+
    +
  1. Lijst op github : + respec-utils.
  2. +
  3. docs.geostandaarden.nl.
  4. +
  5. register.geostandaarden.nl.
  6. +
+

Naamgevinsregels voor pubDomain:

+
    +
  • Lowercase
  • +
  • Geen spaties
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PubdomainOmschrijvingHerkomststatusGitHub TeamBeslissing
3dbv3D basisvoorzieningdocs.geostandaarden.nlinactief (gemigreerd)mag niet meer gebruikt worden
apiKennisplatform APIsrespec utilsAPI teamOK
basisgeometrieInformatiemodel Basisgeometrieregister.geostandaarden.nlzit op docs bij nen3610niet gebruiken eigenlijk xsd redirecten
bgtBasisregistratie grootschalige topografiedocs.geostandaarden.nlBGT teamArnoud vragen
brtInformatiemodellen Basisregistratie Topografieregister.geostandaarden.nlBRT teamOK
crsCoördinaatreferentiesystemendocs.geostandaarden.nlCRS teamOK
cvggInformatiemodel Geluiddocs.geostandaarden.nlduplicaat van imgOK
disgeoDisGeorespec utilsOK
dsgoDigitaal Stelsel Gebouwde Omgevingdocs.geostandaarden.nlOK (rare uri)
dsoDigitaal Stelsel Omgevingswetrespec utilsduplicaten: tpod imow owDSO teamOK
eudocs.geostandaarden.nlEU teamOK (rare uri en werkversie weg)
g4wdocs.geostandaarden.nlgroeperen?
gbddocs.geostandaarden.nlgroeperen?
geobagdocs.geostandaarden.nlOK
gswdocs.geostandaarden.nlgroeperen?
imaerInformatiemodel AERIUSregister.geostandaarden.nlOK
imevInformatiemodel Externe Veiligheiddocs.geostandaarden.nlIMEV teamOK
imgInformatiemodel Geluidrespec utilsduplicaat: cvggIMG teamredirecten naar cvgg
imgeoInformatiemodel Grootschalige Geografiedocs.geostandaarden.nlArnoud vragen
imkaInformatiemodel Klimaatadaptatiedocs.geostandaarden.nlOK
imkadInformatiemodel Kadasterregister.geostandaarden.nlIMKA teamOK
imklInformatiemodel Kabels en Leidingenregister.geostandaarden.nlduplicaat: klIMKL teamZou kl moeten worden
imledocs.geostandaarden.nlOK (niet netjes gepubliceerd)
imroInformatiemodel Ruimtelijke Ordeningregister.geostandaarden.nlduplicaat: roliefst naar RO
imowInformatiemodel Omgevingswetregister.geostandaarden.nlduplicaten: tpod ow dsoliefst weg
klIMKLrespec utilsduplicaat: imklOK
mdMetadatarespec utilsduplicaat: metadataOK
mimMetamodel Informatie Modellering (MIMrespec utilsOK
metadataNederlandse metadata profielen voor datasets en servicesregister.geostandaarden.nlduplicaat: mdverplaatsen naar md??
nen3610NEN3610-Linkeddatarespec utilsOK
ngiidocs.geostandaarden.nlOK
oovdocs.geostandaarden.nlOK
owStandaarden omgevingswetrespec utilsduplicaten: tpod imow dsoOK
roRO Standaardenrespec utilsduplicaat: imroOK
rwgsRaamwerk van Geo-standaardenrespec utilsgroeperen?
servServicesrespec utilsgroeperen?
tpodToepassingsprofiel omgevingsdocumentenrespec utilsduplicaten: ow imow dsoOK
vgInformatiemodel Vastgoedgebruikrespec utilsOK
visuVisualisatierespec utilsgroeperen?
vtmdocs.geostandaarden.nlis eigenlijk metadataverhuizen naar MD
wpWhitepaper Geostandaardenrespec utilsook een raar pubdomainverhuizen naar ngii
+

LocalBiblio

+

In de localBiblio variabele worden Referenties naar andere documenten gezet. +Voordat je hier citaten toevoegt, loont het de moeite om eerst in de +https://www.specref.org/ van ReSpec zelf te kijken. Pas als je een +verwijzing niet vindt in SpecRef voeg je hem hier toe!

+

Verwijzen naar een bibliografieelement gebeurt als volgt [[ID]]. De dubbele +haakjes zorgen ervoor dat er blokhaken om de verwijzing staan in de tekst. Je +kunt ook aangeven dat een verwijzing normatief is door er een uitroepteken voor +te zetten [[!ID]]

+

Voorbeeld config.js

+
let respecConfig = {
+  useLogo: true,
+  useLabel: true,
+  // title is verplicht! Neem hier de titel van het document op ----------------------
+  title: "[Neem titel op in config.js]",
+  //-- specStatus is verplicht! (activeer 1 van de volgende) --------------------------
+  specStatus: "wv",                   // Werkversie
+
+  //-- specType is verplicht bij alle andere dan BASIS ---------------------------------
+  specType: "HR",                     // HandReiking
+
+  //-- pubDomain is verplicht! (komt in de URL) -------------------------------------
+  pubDomain: "TODO",
+  //-- license: voor de geldende gebruiksvoorwaarden. Default is cc-by.
+  //licence: "cc-by-nd",            // bronvermelding, geen afgeleide werken (default)
+  //licence: "cc0",                 // Public Domain Dedication
+  licence: "cc-by",                 // Attribution, met bronvermelding
+  //-- shortName is verplicht! (komt in de URL: kies logische afkorting)--------------
+  shortName: "NL-ReSpec-GN-template",
+  //-- publishDate is verplicht -------------------------------------------------------
+  //-- NB: in de werkversie uitzetten, want dan pakt Respec de pushdate ---------------
+  //publishDate: "2023-03-28",
+  //eventueel is het mogelijk een versienummer mee te geven, maar bij Geonovum werken we gewoonlijk alleen met datum als onderdeel van de permanente URI.
+  //publishVersion: "0.0.2",
+  //previousVersion: "0.0.1",
+  //-- Voor dit blok geldt: alleen als er eerdere versies zijn en altijd beiden aan/uit!
+  //previousPublishDate: "2014-05-01",
+  //previousMaturity: "CV",
+  //-- de namen van de Editor(s) / Redacteur(en)---------------------------------------
+  //-- vul in: per Editor: name:, company:, companyURL: -------------------------------
+  editors:
+    [
+      {
+        name: "voornaam achternaam",
+        company: "Geonovum",
+        companyURL: "https://www.geonovum.nl",
+      }
+    ],
+  //-- de namen van de auteur(s) ------------------------------------------------------
+  //-- vul in: per auteur: name:, company:, companyURL: -------------------------------
+  authors:
+    [
+      {
+        name: "voornaam achternaam",
+        company: "Geonovum",
+        companyURL: "https://www.geonovum.nl",
+      }
+    ],
+  //neem hier de URL van de github repository op waar het respec document in staat
+  github: "https://github.com/Geonovum/NL-ReSpec-GN-template",
+  // Create PDF and link to file in header (optional):
+  alternateFormats: [
+      {
+          label: "pdf",
+          uri: "template.pdf",
+      },
+  ],
+};
+
+

De file config.js is een stukje javascript (JSON) code, het bevat alle mogelijke +waarden voor de verschillende versies die wij hanteren bij Geonovum. In de file +zelf staat aangegeven welke waarden verplicht zijn, en uit welke waarden te +kiezen is. In bovenstaand voorbeeld gaat het om een 'Werkversie van een +standaard'.

+

Content: bestanden '*.md'

+

De 'echte' content wordt gemaakt in het formaat 'Markdown'. Er is een aantal +editors beschikbaar die dat formaat ondersteunen. Zie hiervoor +Hoofdstuk 3. Het is handig om voor elk hoofdstuk +een aparte Markdown file te maken, want dan blijven de bestanden beperkt in +grootte, en zijn er gemakkelijker werkafspraken te maken over wie wanneer in +welke file aan het editen is.

+

Content: Afbeeldingen '*.png'

+

Afbeeldingen worden als '.png' of '.svg' bestand neergezet in de map 'media'. In +je Markdown document neem je gewoon een plaatje op zoals je in Word gewend bent. +Writage en ReSpec zorgen ervoor dat de plaatjes worden getoond.

+

ReSpec Frontend

+

De knop 'ReSpec'

+

De knop 'ReSpec' rechtsboven in de frontend van ReSpec, bevat een aantal handige +functies. Als je klikt op de knop, verschijnt het vervolgscherm met een viertal +functies.

+

Elk van de functies wordt hieronder uitgelegd.

+

media/image25.png

+

Bewaar snapshot

+

media/image26.png

+

Doorzoek SpecRef

+

media/image27.png media/image28.png

+

De gevonden zoekresultaten kunnen worden overgenomen in het ReSpec document.

+

Lijst van definities

+

Zie: definitielijst maken

+

HTML ingebed in ReSpec

+

Omdat wij ervoor hebben gekozen om documenten te schrijven in Markdown, +gebruiken wij niet alle ReSpec functionaliteit. In dit hoofdstuk worden de +speciale ReSpec functies beschreven die als HTML code in het Markdown document +kunnen wordnen opgenomen, of die in de door respec gegenereerde HTML file kunnen +worden neergezet. Het gebruik van deze functionaliteit vereist dus wel HTML +kennis.

+

HTML voor Afbeeldingen

+

Een lijst van afbeeldingen kan door ReSpec automatisch worden gegenereerd, maar +dan moet er wel aan een aantal ReSpec specifieke voorwaarden worden voldaan:

+

In Index.html komt ergens te staan:

+
<figure id="flowchart">
+   <img src="flowchart.svg" alt="">
+   <figcaption>The water flows from bucket A to bucket B.</figcaption>
+</figure>
+
+

In de documenten worden de afbeeldingen op de volgende manier neergezet:

+
<figure id="flowchart">
+   <img src="flowchart.svg" alt="">
+   <figcaption>The water flows from bucket A to bucket B.</figcaption>
+</figure>
+
+

NB: <figure> inclusief uniek ID en een ge-embedde <figcaption> zijn +verplicht!

+

Eventuele referenties naar plaatjes doe je op e volgende manier:

+
<p>The flowchart shown in <a href="#flowchart"></a> is quite impressive.</p>
+</section>
+
+

Referentie naar GitHub issues

+

ReSpec ondersteunt ook een koppeling naar issues die zijn gemeld op GitHub. Jek +kan referenties opnemen naar individuele issues. Ook is het mogelijk om een +lijst met alle issues op te nemen in je document.

+

Om GitHub issues op te nemen moet je in 'config.js' een referentie opnemen naar +de GitHub repository.

+
issueBase: "https://github.com/Geonovum/MIM-Werkomgeving/issues/"
+
+

Een referentie naar een issue neem je als volgt op:

+
<div class="issue" data-number="363"></div>
+
+

Waarbij data-number het issuenummer is.

+

Een lijst met issues kan je toevoegen met de volgende HTML code:

+
<section class="appendix" id="issue-summary">
+  <!-- Issues will magically be listed here! -->
+</section>
+
+
+

Foutmeldingen en waarschuwingen

+

media/image29.png media/image30.png

+

In dit geval is er een tikfout gemaakt bij de naam van de Markdownfile die +ge-include wordt. Het moet natuurlijk H2-Testcases.md zijn.

+

media/image31.png

+

Een voorbeeld van een waarschuwing. Klikken hierop geeft je je de waarschuwing.

+

In het onderstaande voorbeeld meldt ReSpec dat er een <h2> header ontbreekt in +het Markdown document.

+

media/image32.png

+

Publiceren in ReSpec

+

In dit hoofdstuk staan checklists die je kan gebruiken als je vanuit GitHub en +ReSpec “Versies” gaat aanmaken. Bijvoorbeeld hoe maak je een nieuwe GitHub +repository aan, of hoe maak je vanuit een werkversie een consultatieversie aan,

+

Controles voor publicatie

+

Controleer de volgende onderwerpen voor iedere publicatie:

+
    +
  • Controleer op WCAG regels. Bij het pushen van een ReSpec document naar + GitHub wordt automatisch een WCAG rapport geschreven. Dit is te vinden onder + 'Actions'. Kies hier de commit die je gedaan hebt en je ziet daar + 'Check/WCAG').
  • +
  • Controleer op Broken links. Bij het pushen van een ReSpec document naar + GitHub wordt automatisch op broken links gechecked. Dit is te vinden onder + 'Actions'. Kies hier de commit die je gedaan hebt en je ziet daar + 'Check/Links').
  • +
  • Je kunt oook het HTML controleren: maak een snapshot aan en biedt het aan + aan de W3C validator
  • +
+

Consultatie versie (CV) maken

+
    +
  1. Edit en controleer config.js - configureer alles goed voor een + consultatieversie
      +
    • specStatus:"GN-CV"
    • +
    • publishDate: moet ingevuld zijn met de datum van publicatie van de + consultatieversie. "jjjj-mm-dd",
    • +
    • Shortname: moet ingevuld zijn met korte naam voor het document. Dit + wordt onderdeel van de URL. Moet uniek zijn binnen pubdomain (afgezien van + versies).
        +
      • Als er al eerder een versie gepubliceerd is (stabiele versie, dus + afgezien van de werkversie in github), kan Respec bovenin een document + de navigatie naar vorige versie goed genereren. Daarvoor moet je ook + invullen:
      • +
      • Previousmaturity: wat de status toen was.
      • +
      • Previousmaturity: wat de status toen was.
      • +
      +
    • +
    +
  2. +
  3. Maak een snapshot (met de knop “Bewaar Snapshot” vanuit Respec)
  4. +
  5. Kies “HTML” en noem dit bestand “snapshot.html”
  6. +
  7. Commit het en push het naar dezelfde folder als waar index.html staat in je + Github-repository
  8. +
+

Consultatieversie maken met behulp van webhook

+

Klik hier voor een beschrijving over hoe je een webhook eenmalig +configureert voor een repository. over het toepassen van de webhook.

+
    +
  1. Maak een release tag conform de naamgevingsconventie: + \{specStatus\}-\{specType\}-\{shortName\}-\{publishDate\}
  2. +
  3. Het script kopieert nu automatisch (NB: dit moet wel eenmalig geconfigureerd + zijn als ‘webhook’ in de github repository!) het snapshot.html en de + bijbehorende afbeeldingen naar + [docs.geostandaarden.nl]http://docs.geostandaarden.nl).
  4. +
  5. Na succesvolle publicatie:
      +
    • zet de specStatus in config.js terug op "GN-WV"
    • +
    • Vul previousMaturity in met "GN-CV"
    • +
    • Vul previousPublishDate in met de datum van de zojuist gepubliceerde + consultatieversie
    • +
    +
  6. +
+

Consultatieverise met behulp van webhook

+
+

Note: uitwerken

+
+

Vaststellingsversie (VV) maken

+
    +
  1. Edit en controleer config.js - configureer alles goed voor een + vaststellingsversie
      +
    • specStatus: "GN-VV"
    • +
    • publishDate: moet ingevuld zijn met de datum van publicatie van de + consultatieversie. "jjjj-mm-dd",
    • +
    • Shortname: moet ingevuld zijn met korte naam voor het document. Dit wordt + onderdeel van de URL. Moet uniek zijn binnen pubdomain (afgezien van + versies).
        +
      • Als er al eerder een versie gepubliceerd is (stabiele versie, dus + afgezien van de werkversie in github), kan Respec bovenin een document + de navigatie naar vorige versie goed genereren. Daarvoor moet je ook + invullen:
      • +
      • Previousmaturity: wat de status toen was.
      • +
      • Previousmaturity: wat de status toen was.
      • +
      +
    • +
    +
  2. +
  3. Maak een snapshot (met de knop “Bewaar Snapshot” vanuit Respec)
  4. +
  5. Kies “HTML” en noem dit bestand “snapshot.html”
  6. +
  7. Commit het en push het naar dezelfde folder als waar index.html staat in je + Github repository
  8. +
  9. Maak een release tag conform de naamgevingsconventie: + {specStatus}-{specType}-{shortName}-{publishDate}
  10. +
  11. Het script kopieert nu automatisch (NB: dit moet wel eenmalig geconfigureerd + zijn als ‘webhook’ in de github repository!) het snapshot.html en de + bijbehorende afbeeldingen naar http://docs.geonovum.nl
  12. +
  13. Na succesvolle publicatie:
      +
    • zet de specStatus in config.js terug op GN-WV
    • +
    • Vul previousMaturity in met GN-CV
    • +
    • Vul previousPublishDate in met de datum van de zojuist gepubliceerde + consultatieversie
    • +
    +
  14. +
+

Definitieve versie (DEF) maken

+
    +
  1. Edit en controleer config.js - configureer alles goed voor een definitieve + versie
      +
    • specStatus: "GN-DEF",
    • +
    • publishDate: moet ingevuld zijn met de datum van publicatie van de + definitieve versie. "jjjj-mm-dd",
    • +
    • Shortname: moet ingevuld zijn met korte naam voor het document. Dit wordt + onderdeel van de URL. Moet uniek zijn binnen pubdomain (afgezien van + versies).
    • +
    • Als er al eerder een versie gepubliceerd is (stabiele versie, dus afgezien + van de werkversie in github), kan Respec bovenin een document de navigatie + naar vorige versie goed genereren. Daarvoor moet je ook invullen:
        +
      • Previousmaturity: wat de status toen was.
      • +
      • previousPublishDate: vorige publicatiedatum (jjjj-mm-dd)
      • +
      +
    • +
    +
  2. +
  3. Maak een snapshot (met de knop “Bewaar Snapshot” vanuit Respec)
  4. +
  5. Kies “HTML” en noem dit bestand “snapshot.html”
  6. +
  7. Commit het en push het naar dezelfde folder als waar index.html staat in je + Github repository
  8. +
  9. Maak een release tag conform de naamgevingsconventie: + {specStatus}-{specType}-{shortName}-{publishDate}
  10. +
  11. Het script kopieert nu automatisch (NB: dit moet wel eenmalig geconfigureerd + zijn als ‘webhook’ in de github repository!) het snapshot.html en de + bijbehorende afbeeldingen naar http://docs.geostandaarden.nl Hoe dit werkt + is beschreven in: https://github.com/Geonovum/technisch-register-2019
  12. +
  13. Na succesvolle publicatie:
      +
    • zet de specStatus in config.js terug op GN-WV
    • +
    • Vul previousMaturity in met GN-DEF
    • +
    • Vul previousPublishDate in met de datum van de zojuist gepubliceerde + definitieve versie
    • +
    +
  14. +
+
+
+ + + + + + + + + + + + diff --git a/SVN-importeren-bestaand-project/index.html b/SVN-importeren-bestaand-project/index.html new file mode 100644 index 0000000..6545e34 --- /dev/null +++ b/SVN-importeren-bestaand-project/index.html @@ -0,0 +1,377 @@ + + + + + + + + + + + SVN importeren bestaand project - Geonovum tooling + + + + + + + + + + + +
+
+
+
+ +

SVN - Importeren van een bestaand project in EA

+

Enterprise Architect versie: 15.2

+

Tortoise SVN Subversion versie: 1.14.1

+

Inleiding

+

Deze handleiding beschrijft hoe je in Enterprise Architect de packages van een bestaand project kunt importeren vanuit Subversion . Het stappenplan laat zien hoe je aan de hand van een EAP-bestand van het IMDiSGeo (IMSOR-XMI) een bestaand package toevoegt. In dit voorbeeld wordt het package met standaarddatatypes toegevoegd. Je kunt ook bestaande packages importeren in een nieuw (leeg) EAP-bestand. De methode is vrijwel identiek. De handleiding licht beide opties toe.

+

Inhoud

+

Dit document bevat de volgende onderdelen:

+ +

Voorbereiding

+

MIM-toolbox importeren

+

Importeer de MIM-toolbox (instructie). Dit is met name relevant als het bestaande project ontwikkeld is met de MIM-toolbox. Door de toolbox vooraf te importeren, maakt EA automatisch een koppeling met de MIM-modelelementen in de packages die je gaat importeren.

+

Lokale folder aanmaken en koppelen

+

Zie hiervoor stap 2 en stap 3 uit de handleiding SVN - installeren voor EAP.

+

Packages importeren

+

Stap 1: Configureer de VC-settings

+

Configueer de version control settings van het bestaande project

+
    +
  • Ga naar Configure > Project-VC.
  • +
  • Er verschijn nu een venster met de naam Version Control Settings.
  • +
  • Bij een nieuw EAP-bestand is dit venster leeg, maar bij een bestaand EAP-bestand met packages onder versiebeheer moet je eerst op New klikken (zie onderstaande afbeelding).
  • +
  • Doorloop daarna de onderdelen onder de afbeelding.
  • +
+

+

1.1 Model Settings:

+
    +
  • Check: "Save nested version" [...]
  • +
+

1.2 Configuration Details

+
    +
  • Check: "Subversion"
  • +
  • Unique ID: Zelf gekozen unieke aanduiding voor de package onder version control. Suggestie: Geonovum-{naam van het package}, bijvoorbeeld; Geonovum-datatypes, of: Geonovum-imkl.
  • +
  • Selecteer het Working Copy Path dat je gebruikt voor Subversion. Dit is de folder waar de lokale SVN-gegevens worden weggeschreven (zie: stap 2 bij lokale folder aanmaken en koppelen).
  • +
+

1.3 Workstation Settings

+
    +
  • Selecteer het Subversion Exe Path (de locatie van het bestand: svn.exe), als dat nog niet is ingevuld.
  • +
  • Klik Save
  • +
+

1.4 Defined Configurations

+
    +
  • Controleer de Defined Configuration. Dit veld heeft nu één (nieuwe) ingevulde regel (zie afbeelding) met de Unique ID die je in onderdeel 1.2 hebt opgegeven.
  • +
  • Klik Close
  • +
+

+

Stap 2: Haal het package op

+
    +
  • Klik met rechtermuisknop op Model en ga naar Package Control > Get Package.
  • +
  • Selecteer bij Select a Version Control Configuration in: Geonovum-datatypes.
  • +
  • Selecteer bij Select A Shared File For Inclusion: Geonovum-algemeen.xml.
  • +
+

+
+

Note: Kies indien van toepassing het 'hoogtste' package in de hiërarchie van de package-structuur van het te importeren bestand. Op deze manier haal je ook in één keer alle subpackages op.

+

Note: Het niveau in de package-structuur van de project browser waar je klikt, bepaalt de plek waar het geimporteerde package terecht komt. Het komt daaronder. kies je model, dan komt het op het 'hoogste' niveau. Dit is soms relevant. Als iets wel, of juist niet onderdeel van het model moet zijn. Ook voor Imvertor is/was dit relevant... (controleren)

+
+

+

In de Project Browser verschijnt nu het package Geonovum-algemeen en indien aanwezig inclusief de subpackages. Het kan zijn dat de packages in dit stadium nog leeg zijn. Dat lossen we in de volgende stap op.

+

Stap 3: Haal de inhoud van het package op

+
+

Note: Via onderstaande stappen haal je de meest actuele versie op van de packages die onder versiebeheer staan. Als je met verschillende modelleurs aan een package werkt, is het verstandig om deze stappen tussentijds regelmatig uit te voeren.

+
+
    +
  • Klik met de rechtermuisknop op een package, bijv. Geonovum-geometrie.
  • +
  • Klik op Ok
  • +
  • Klik met de rechtermuisknop op het package Geonovum-geometrie > Package Control > Get All Latest.
  • +
+

+

Er verschijnt een venster Get All Latest + - Selecteer Import Changed Files Only (recommended) + - Klik Ok.

+

+

Het package en de subpackages zijn succesvol geïmporteerd. Indien je meerdere basismodellen (of andere typen packages) wilt importeren, doorloop je stap 1 t/m 3 opnieuw.

+
+

Note: Het kan zijn dat de packages toch niet goed geïmporteerd worden. Doorloop dan onderstaande stappen.

+
+
    +
  • Klik met de rechtermuisknop op het package «Geonovum-geometrie».
  • +
  • Klik op Ok
  • +
  • Klik met de rechtermuisknop op het package Basismodel > Package Control > Get Latest.
  • +
+

Er verschijnt een venster Import Package + - Selecteer Force reload from XMI + - Klik Ok.

+

+
+
+ + + + + + + + + + + + diff --git a/SVN-installeren-voor-EAP/index.html b/SVN-installeren-voor-EAP/index.html new file mode 100644 index 0000000..4019f0f --- /dev/null +++ b/SVN-installeren-voor-EAP/index.html @@ -0,0 +1,392 @@ + + + + + + + + + + + SVN installeren voor EAP - Geonovum tooling + + + + + + + + + + + +
+
+ +
+ +

Handleiding voor het installeren van SVN (Subversion) voor een EAP bestand.

+

UML modellen worden beheerd in Subversion (SVN) op 'svn.geostandaarden.nl'. Dit is een versiebeheertool die kan samenwerken met 'Enterprise Architect' en wordt daarom voor UML modellen gebruik.. Deze handleiding beschrijft hoe je een informatiemodel in de versiebeheeromgeving zet.

+

Dit document bevat de volgende onderdelen:

+
    +
  1. Voorbereiding: Installeer SVN Tortoise vraag een account aan.
  2. +
  3. Folder aanmaken op SVN-server.
  4. +
  5. Lokale folder aanmaken.
  6. +
  7. Lokale folder koppelen aan folder op SVN-server.
  8. +
  9. Breng EAP-bestand(packages) onder SVN.
  10. +
  11. Breng package onder version control.
  12. +
  13. Check package in of uit.
  14. +
  15. Meer informatie.
  16. +
+

Voorbereiding: Installeer SVN Tortoise en vraag account aan

+

Als je SVN Tortoise nog niet hebt, installeer deze van +https://tortoisesvn.net/.

+
+

Note +Installeer ook de Command Line Client Tools mee. Dit heb je nodig bij stap 4: Breng EAP-bestand (packages) onder SVN. Het is een extra optie en valt niet onder de standaardinstallatie, dus je moet hier zelf alert op zijn. Het is ook mogelijk om dit achteraf te doen. Hoe je dit doet, staat beschreven in stap 4.

+
+

Vraag een account aan voor svn.geostandaarden.nl bij de beheerder

+

Stap 1: Folder aanmaken op SVN-server

+
    +
  • Maak een folder op de SVN-server (svn.geostandaarden.nl) aan met de naam van het model.
  • +
  • Een voor de hand liggende naam van de folder: imxx met op de plaats van de xx de (afkorting van de) naam van het model. Bijvoorbeeld imka (informatiemodel klimaatadaptatie)
  • +
+

Stap 2: Lokale folder aanmaken

+
    +
  • Maak in een lokale map op je werk-pc een folder aan waar de SVN bestanden naar toe worden geschreven.
  • +
  • svn.geostandaarden.nl/imxx synchroniseert met deze folder.
  • +
  • Een naam voor deze folder is bijvoorbeeld svn met als subfolder imxx.
  • +
  • De folder waarmee gesynchroniseerd gaat worden is dan dus svn/imxx
  • +
+

Stap 3: Lokale folder koppelen aan folder op SVN-server

+
    +
  • Klik met rechtermuis op de leegte in de lokale net-aangemaakte svn/imxx folder.
  • +
  • Select SVN checkout….
  • +
  • Kopieer de URL van de online svn folder (svn://svn.geostandaarden.nl/imxx) en checkout directory.
  • +
  • De checkout directory is de folder gemaakt in stap 2.
  • +
+

SVN Checkout

+

Stap 4: Breng EAP-bestand (packages) onder SVN

+

Het EAP bestand wordt op het niveau van packages onder SVN gebracht.

+
    +
  • Zet het EAP bestand op een locale folder op je PC.
  • +
  • Open het EAP bestand
  • +
  • Instellen version control settings.
  • +
  • Kies het package dat onder SVN moet en klik met rechtermuisknop.
  • +
  • Kies Package Control en Version Control Settings.
  • +
  • Vul de volgende velden in:
  • +
  • Unique ID: Zelf gekozen unieke aanduiding voor de package onder version control. Suggestie: Geonovum-{naam van het package}, bijv. Geonovum-imkl.
  • +
  • Type: Subversion
  • +
  • Working Copy Path: Selecteer de folder waar de lokale SVN-gegevens worden weggeschreven. Dit is de folder uit stap 2.
  • +
  • Subversion Exe Path: Navigeer naar C:\Program Files\TortoiseSVN\bin\ en selecteer svn.exe (dit is een éénmalige stap).
  • +
  • Klik op Save en Close
  • +
+
+

Note +Je kunt een melding krijgen dat er geen svn.exe aanwezig is. Installeer dan de command line interface (CLI) mee volgens deze instructie. Je hoeft SVN hiervoor niet opnieuw te installeren; deze stap breidt de installatie alleen uit. Hierna staat svn.exe gewoon netjes in de bedoelde map. Je hoeft dus verder niet met de CLI aan de slag. Een andere optie is om SLIKSVN te installeren.

+
+

Version Control Settings

+

Wanneer een UML model in subversion beheerd is dan kun je deze als volgt op je eigen computer gebruiken.

+
    +
  • Installeer een svn client zie hier
  • +
  • Zorg voor een Geonovum svn account. Dit kun je aanvragen bij Wilko Quak of als hij niet beschikbaar is rechtstreeks bij Rob Kaesehagen die de server beheert.
  • +
  • Voor projectX die gebruik maakt van de subversion map svn.geostandaarden.nl/ProjectX:
  • +
  • Maak een folder op je lokale systeem: WerkmapProjectX
  • +
  • Maak een subfolder svn.
  • +
  • Maak een nieuw EA project ProjectX.eapx in je werkmap.
  • +
  • Klik met je rechtermuistoets op deze folder en kies SVN Checkout
  • +
  • Er verschijnt een Checkout dialoog. Vul als URL in svn://svn.geostandaarden.nl/IMGeluid en als output directory de folder die je net hebt aangemaakt. Kies de settings zoals hieronder weergegeven:
  • +
+

svncheckout

+

Stap 5: Breng package onder version control

+
    +
  • Selecteer in Enterprise Architect het package dat je onder version control wilt brengen.
  • +
  • Navigeer naar Configure > Package VC.
  • +
  • Selecteer in het venster dat nu verschijnt de checkbox linksboven, genaamd: Control Package.
  • +
  • Selecteer in het dropdown menu bij Version Control het path naar de folder waar de lokale SVN-gegevens worden weggeschreven (zie onder Working Copy Path in stap 4).
  • +
  • Vul bij XMI Filename de naam in van het package dat je onder Version Control wilt brengen.
  • +
  • Laat de overige velden ongewijzigd.
  • +
  • Klik op 'Ok'.
  • +
  • Klik op het dialoogvenster dat hierna verschijnt eveneens op 'Ok'. Als je niet meteen met het package aan de slag gaat, kun je er in dit venster eventueel ook voor kiezen om de checkbox 'Keep checked out' uit te zetten (zie ook: stap 6).
  • +
+

Package Control Options

+

Configureer version control in EA - Kies uit het menu (de ribbon bovenin EA) Configure > Settings. Het Version Control Settings dialoogvenster verschijnt. Vul dit zoals hieronder in en klik dan op Save.

+

version control settings

+
    +
  • Breng nu elk van de packages, op het niveau waarop je ze wilt kunnen in- en uitchecken, onder versiebeheer.
  • +
  • Selecteer het tabblad Configure (bovenin) en klik op Package Configuration)
  • +
  • Vul het Package Control Options dialoog in zoals hieronder (XMI Filename kan anders zijn, afhankelijk van hoe de packages zijn ingedeeld) en klik OK.
      +
    • Selecteer bij Version Control het voorgestelde path
    • +
    • Kies ‘Include sub-packages’ als je wilt dat alle sub-packages in hetzelfde XMI bestand beheerd worden en dus geen eigen slotje krijgen.
    • +
    +
  • +
+

package control options

+

Stap 6: Check package in of uit

+

Elk van de packages die in SVN zijn ondergebracht, hebben nu in EA een slotje. Je kunt de inhoud van het model dat in zo'n package staat niet zomaar meer wijzigen.

+

package overview

+
    +
  • Om aan een package te werken, check je het eerst uit. Klik met de rechtermuistoets op het package, kies Package Control > Check Out… (gebruik NIET "check out branch", dat is om met parallelle versies te werken, doen wij niet). Subversion haalt nu de laatste versie van het package voor je op en haalt het slotje voor je eraf. Een ander persoon kan niet tegelijkertijd aan dit package werken, maar het wel bekijken.
  • +
  • Als je klaar bent met je werk, of je stopt er voor vandaag mee, check je het package weer in. Klik met de rechtermuistoets op het package, kies Package Control > Check In… (gebruik NIET "check in branch", dat is om met parallelle versies te werken, doen wij niet).
  • +
  • Andere handige commando's:
  • +
  • Put Latest > Tussentijds wijzigingen naar de SVN server sturen
  • +
  • +

    Get Latest > Laatste wijzigingen van de SVN server ophalen zodat je ze kan zien, zonder te willen uitchecken.

    +
  • +
  • +

    Klik met de rechtermuisknop op het package in de Project Browser van Enterprise Architect.

    +
  • +
  • Selecteer Package Control.
  • +
  • Kies Check out als je aan de package gaat werken.
  • +
  • Kies Check in als je klaar bent.
  • +
+
+

Note: Let op: we werken niet met Check in branch en Check out branch!

+
+

Meer informatie

+

Kijk voor meer informatie ook op de website van Sparx Systems

+
+
+ + + + + + + + + + + + diff --git a/SuggestiesHandleiding/index.html b/SuggestiesHandleiding/index.html new file mode 100644 index 0000000..5709fb3 --- /dev/null +++ b/SuggestiesHandleiding/index.html @@ -0,0 +1,401 @@ + + + + + + + + + + + SuggestiesHandleiding - Geonovum tooling + + + + + + + + + + + +
+
+ +
+ +

Workflow Modelleur Tips&Tricks

+

Hieronder volgt een ruwe opsomming van suggesties voor het maken van nieuwe, dan wel uitbreiden van bestaande handleidingen.

+
+

Note: Hoe omgaan met onderdelen die regelmatig wijzigen?

+

Note: Op Confluence staan ook al verschillende documenten.

+
+

ENTERPRISE ARCHITECT (EA)

+

Meest gebruikte windows

+
    +
  • Project browser
  • +
  • Properties
  • +
  • Notes
  • +
  • Zoom/pan
  • +
  • Resources
  • +
  • Features
  • +
  • Tagged values
  • +
  • Relationships
  • +
  • Imvertor
  • +
+
+

Note: Waar kun je deze windows vinden?

+

Note: Creëer workspaces

+
+

Creëer workspace(s)

+
    +
  • Hoe maak je een workspace?
  • +
+

Handige tips

+
    +
  • Find -in project browser of -in all diagrams
  • +
  • View as feature matrix
  • +
  • View as relation matrix
  • +
  • View as specification view...
  • +
  • Relationship matrix
  • +
+

Verwijderen relaties

+
    +
  • Gebruik (rel. matr./relationships)
  • +
  • Verwijderen uit diagram is niet model
  • +
+

Package as Namespace

+
    +
  • Set package as namespace root: https://sparxsystems.com/enterprise_architect_user_guide/15.2/model_domains/namespaces.html
  • +
  • Is dit nodig? En waarom? Voor je XML/GML-schema generatie o.i.d.?
  • +
+

Installatie MIM-toolbox

+
    +
  • Voor project vs. user
  • +
  • Hoe kun je toolbox project/user verwijderen?
  • +
+

Tagged values invullen packages/MIM

+
    +
  • Beschrijving toevoegen
  • +
+

EA-bestand voor oplevering

+
    +
  • Uit VC (SVN) halen
  • +
  • SVN Checkout folder niet leegmaken
  • +
  • Dat doe je bijvoorbeeld wel als je een package opnieuw of definitief uit Version Control wilt halen.
  • +
  • Dus aan je checkout folder verander je niks
  • +
  • Je maakt alleen een EA-bestand dat VC-vrij is.
  • +
+

SUBVERSION (SVN) - VERSION CONTROL (VC)

+
    +
  • Verwijderen packages
  • +
  • Suggestie structuur
  • +
  • Werkwijze put/get latest
  • +
  • Inchecken forceren: voor- en nadelen
  • +
  • Gebruik repo browser (kijken, geen bewerkingen)
  • +
  • URL repo browser
  • +
  • Credentials
  • +
  • Delete --> commit (als je lokaal wijzigingen aanbrengt)
  • +
  • Verander niet zomaar iets in of aan checkout folder
  • +
+

Herstel package control

+
    +
  • Check out
  • +
  • Package VC
  • +
  • Untick 'Control package'
  • +
  • Verwijder .xml van het package dat je uit VC hebt gehaald uit checkout repo.
  • +
  • Rechtermuis op repo
  • +
  • Kies 'SVN Commit...'
  • +
  • Selecter de .xml-bestanden van de verwijderde package(s)
  • +
  • Klik op 'ok'.
  • +
  • Nu kun je opnieuw het package onder VC brengen
  • +
+

Versiestructuur

+
    +
  • Handleiding voor SVN versioning maken
  • +
  • De mogelijkheid om hoofd- subpackages apart in- en uit te kunnen checken
  • +
  • Eerst de domeinen erin hijsen
  • +
  • Dan pas hogere packages,
  • +
  • Met andere woorden: van onder naar boven of van laag naar hoog
  • +
  • Versienr tags in het versieveld
  • +
  • Mappenstructuur
  • +
  • (plaatje pano overnemen of linken/samenvoegen)
  • +
  • Propertiesfile weer terugzetten in cm vanuit imsor notitiemap
  • +
  • XML's prefix van package stereotype meegeven dus view_<naam> of domein_<naam>
  • +
  • Version packages is van tags
  • +
  • Maar moet overeenkomen met versiemapnaam\
  • +
  • Dus versie in EA moet overeenkomen met versiemapnaam SVN
  • +
  • Waarschijnlijk leidt dit ertoe dat je voor elke versie op nieuw alle domeinen in en uit SVN moet halen
  • +
  • ...
  • +
+

IMVERTOR

+
    +
  • Handleiding Armatiek
  • +
  • Zoekfunctie Armatiek
  • +
  • Propertiesfile (standaard settings?)
  • +
  • GitHub publicatie
  • +
  • Batch Tagged Values?
  • +
  • XML-/GML-schema's
  • +
  • Diagrammen vinkje in settings + -overzicht in diagramnaam EA, properties?
  • +
+
+

Note: op properties staan 2x beschreven. De lijst met CLI-properties is compleet/uitgebreider

+
+
+
+ + + + + + + + + + + + diff --git a/WordConversies/index.html b/WordConversies/index.html new file mode 100644 index 0000000..4dd5d7b --- /dev/null +++ b/WordConversies/index.html @@ -0,0 +1,275 @@ + + + + + + + + + + + WordConversies - Geonovum tooling + + + + + + + + + + + +
+
+
+
+ +

MsWord conversies

+

Er zijn tools om MsWord documenten om te zetten naar Mardown: +- Word2Werkversie.

+
+
+ + + + + + + + + + + + diff --git a/css/base.css b/css/base.css new file mode 100644 index 0000000..2610341 --- /dev/null +++ b/css/base.css @@ -0,0 +1,325 @@ +html { + /* csslint ignore:start */ + /* The nav header is 3.5rem high, plus 20px for the margin-top of the + main container. */ + scroll-padding-top: calc(3.5rem + 20px); + /* csslint ignore:end */ +} + +/* Replacement for `body { background-attachment: fixed; }`, which has + performance issues when scrolling on large displays. See #1394. */ +body::before { + content: ' '; + position: fixed; + width: 100%; + height: 100%; + top: 0; + left: 0; + background-color: #f8f8f8; + background: url(../img/grid.png) repeat-x; + will-change: transform; + z-index: -1; +} + +body > .container { + margin-top: 20px; + min-height: 400px; +} + +.navbar.fixed-top { /* csslint allow: adjoining-classes */ + /* csslint ignore:start */ + position: -webkit-sticky; + position: sticky; + /* csslint ignore:end */ +} + +.source-links { + float: right; +} + +.col-md-9 img { + max-width: 100%; + display: inline-block; + padding: 4px; + line-height: 1.428571429; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + margin: 20px auto 30px auto; +} + +h1 { + color: #444; + font-weight: 400; + font-size: 42px; +} + +h2, h3, h4, h5, h6 { + color: #444; + font-weight: 300; +} + +hr { + border-top: 1px solid #aaa; +} + +pre, .rst-content tt { + max-width: 100%; + background: #fff; + border: solid 1px #e1e4e5; + color: #333; + overflow-x: auto; +} + +code.code-large, .rst-content tt.code-large { + font-size: 90%; +} + +code { + padding: 2px 5px; + background: #fff; + border: solid 1px #e1e4e5; + color: #333; + white-space: pre-wrap; + word-wrap: break-word; +} + +pre code { + display: block; + background: transparent; + border: none; + white-space: pre; + word-wrap: normal; + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 12px; +} + +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); + box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); +} + +a code { + color: #2FA4E7; +} + +a:hover code, a:focus code { + color: #157AB5; +} + +footer { + margin-top: 30px; + margin-bottom: 10px; + text-align: center; + font-weight: 200; +} + +.modal-dialog { + margin-top: 60px; +} + +/* + * Side navigation + * + * Scrollspy and affixed enhanced navigation to highlight sections and secondary + * sections of docs content. + */ + +.bs-sidebar.affix { /* csslint allow: adjoining-classes */ + /* csslint ignore:start */ + position: -webkit-sticky; + position: sticky; + /* csslint ignore:end */ + /* The nav header is 3.5rem high, plus 20px for the margin-top of the + main container. */ + top: calc(3.5rem + 20px); +} + +.bs-sidebar.card { /* csslint allow: adjoining-classes */ + padding: 0; + max-height: 90%; + overflow-y: auto; +} + +/* Toggle (vertically flip) sidebar collapse icon */ +.bs-sidebar .navbar-toggler span { + -moz-transform: scale(1, -1); + -webkit-transform: scale(1, -1); + -o-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} + +.bs-sidebar .navbar-toggler.collapsed span { /* csslint allow: adjoining-classes */ + -moz-transform: scale(1, 1); + -webkit-transform: scale(1, 1); + -o-transform: scale(1, 1); + -ms-transform: scale(1, 1); + transform: scale(1, 1); +} + +/* First level of nav */ +.bs-sidebar > .navbar-collapse > .nav { + padding-top: 10px; + padding-bottom: 10px; + border-radius: 5px; + width: 100%; +} + +/* All levels of nav */ +.bs-sidebar .nav > li > a { + display: block; + padding: 5px 20px; + z-index: 1; +} +.bs-sidebar .nav > li > a:hover, +.bs-sidebar .nav > li > a:focus { + text-decoration: none; + border-right: 1px solid; +} +.bs-sidebar .nav > li > a.active, +.bs-sidebar .nav > li > a.active:hover, +.bs-sidebar .nav > li > a.active:focus { + font-weight: bold; + background-color: transparent; + border-right: 1px solid; +} + +.bs-sidebar .nav .nav .nav { + margin-left: 1em; +} + +.bs-sidebar .nav > li > a { + font-weight: bold; +} + +.bs-sidebar .nav .nav > li > a { + font-weight: normal; +} + +.headerlink { + font-family: FontAwesome; + font-size: 14px; + display: none; + padding-left: .5em; +} + +h1:hover .headerlink, h2:hover .headerlink, h3:hover .headerlink, h4:hover .headerlink, h5:hover .headerlink, h6:hover .headerlink { + display:inline-block; +} + +blockquote { + padding-left: 10px; + border-left: 4px solid #e6e6e6; +} + +.admonition, details { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; + text-align: left; +} + +.admonition.note, details.note { /* csslint allow: adjoining-classes */ + color: #2e6b89; + background-color: #e2f0f7; + border-color: #bce8f1; +} + +.admonition.warning, details.warning { /* csslint allow: adjoining-classes */ + color: #7a6032; + background-color: #fffae5; + border-color: #fbeed5; +} + +.admonition.danger, details.danger { /* csslint allow: adjoining-classes */ + color: #7f3130; + background-color: #fde3e3; + border-color: #eed3d7; +} + +.admonition-title, summary { + font-weight: bold; + text-align: left; +} + +.admonition>p:last-child, details>p:last-child { + margin-bottom: 0; +} + +@media (max-width: 991.98px) { + .navbar-collapse.show { /* csslint allow: adjoining-classes */ + overflow-y: auto; + max-height: calc(100vh - 3.5rem); + } +} + +.dropdown-item.open { /* csslint allow: adjoining-classes */ + color: #fff; + background-color: #2FA4E7; +} + +.dropdown-submenu > .dropdown-menu { + margin: 0 0 0 1.5rem; + padding: 0; + border-width: 0; +} + +.dropdown-submenu > a::after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: #ccc; + margin-top: 5px; + margin-right: -10px; +} + +.dropdown-submenu:hover > a::after { + border-left-color: #fff; +} + +@media (min-width: 992px) { + .dropdown-menu { + overflow-y: auto; + max-height: calc(100vh - 3.5rem); + } + + .dropdown-submenu { + position: relative; + } + + .dropdown-submenu > .dropdown-menu { + /* csslint ignore:start */ + position: fixed !important; + /* csslint ignore:end */ + margin-top: -9px; + margin-left: -2px; + border-width: 1px; + padding: 0.5rem 0; + } + + .dropdown-submenu.pull-left { /* csslint allow: adjoining-classes */ + float: none; + } + + .dropdown-submenu.pull-left > .dropdown-menu { /* csslint allow: adjoining-classes */ + left: -100%; + margin-left: 10px; + } +} + +@media print { + /* Remove sidebar when print */ + .col-md-3 { display: none; } +} diff --git a/css/bootstrap.min.css b/css/bootstrap.min.css new file mode 100644 index 0000000..4ce503d --- /dev/null +++ b/css/bootstrap.min.css @@ -0,0 +1,12 @@ +/*! + * Bootswatch v4.1.3 + * Homepage: https://bootswatch.com + * Copyright 2012-2018 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*//*! + * Bootstrap v4.1.3 (https://getbootstrap.com/) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#033C73;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#C71C22;--orange:#fd7e14;--yellow:#DD5600;--green:#73A839;--teal:#20c997;--cyan:#2FA4E7;--white:#fff;--gray:#868e96;--gray-dark:#343a40;--primary:#2FA4E7;--secondary:#e9ecef;--success:#73A839;--info:#033C73;--warning:#DD5600;--danger:#C71C22;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-family-monospace:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*,*::before,*::after{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0 !important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:0.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#2FA4E7;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#157ab5;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):hover,a:not([href]):not([tabindex]):focus{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre,code,kbd,samp{font-family:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:0.75rem;padding-bottom:0.75rem;color:#868e96;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:0.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{padding:0;border-style:none}input[type="radio"],input[type="checkbox"]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:none}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:0.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:#2FA4E7}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,0.1)}small,.small{font-size:80%;font-weight:400}mark,.mark{padding:0.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:0.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#868e96}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:0.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:0.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:0.5rem;line-height:1}.figure-caption{font-size:90%;color:#868e96}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:0.2rem 0.4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:0.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container{max-width:540px}}@media (min-width: 768px){.container{max-width:720px}}@media (min-width: 992px){.container{max-width:960px}}@media (min-width: 1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*="col-"]{padding-right:0;padding-left:0}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media (min-width: 576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media (min-width: 768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media (min-width: 992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media (min-width: 1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.table{width:100%;margin-bottom:1rem;background-color:transparent}.table th,.table td{padding:0.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm th,.table-sm td{padding:0.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered th,.table-bordered td{border:1px solid #dee2e6}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,0.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,0.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#c5e6f8}.table-hover .table-primary:hover{background-color:#aedcf5}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#aedcf5}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#f9fafb}.table-hover .table-secondary:hover{background-color:#eaedf1}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#eaedf1}.table-success,.table-success>th,.table-success>td{background-color:#d8e7c8}.table-hover .table-success:hover{background-color:#cbdfb6}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#cbdfb6}.table-info,.table-info>th,.table-info>td{background-color:#b8c8d8}.table-hover .table-info:hover{background-color:#a8bbcf}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#a8bbcf}.table-warning,.table-warning>th,.table-warning>td{background-color:#f5d0b8}.table-hover .table-warning:hover{background-color:#f2c1a2}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#f2c1a2}.table-danger,.table-danger>th,.table-danger>td{background-color:#efbfc1}.table-hover .table-danger:hover{background-color:#eaabad}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#eaabad}.table-light,.table-light>th,.table-light>td{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>th,.table-dark>td{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,0.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark th,.table-dark td,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,0.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,0.075)}@media (max-width: 575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width: 767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width: 991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width: 1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(2.25rem + 2px);padding:0.375rem 0.75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:0.25rem;-webkit-transition:border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media screen and (prefers-reduced-motion: reduce){.form-control{-webkit-transition:none;transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#a1d6f4;outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(47,164,231,0.25);box-shadow:0 0 0 0.2rem rgba(47,164,231,0.25)}.form-control::-webkit-input-placeholder{color:#868e96;opacity:1}.form-control:-ms-input-placeholder{color:#868e96;opacity:1}.form-control::-ms-input-placeholder{color:#868e96;opacity:1}.form-control::placeholder{color:#868e96;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:0.375rem;padding-bottom:0.375rem;margin-bottom:0;line-height:1.5;color:#495057;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.8125rem + 2px);padding:0.25rem 0.5rem;font-size:0.875rem;line-height:1.5;border-radius:0.2rem}.form-control-lg{height:calc(2.875rem + 2px);padding:0.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:0.3rem}select.form-control[size],select.form-control[multiple]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:0.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*="col-"]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:0.3rem;margin-left:-1.25rem}.form-check-input:disabled ~ .form-check-label{color:#868e96}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:0.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:0.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:0.25rem;font-size:80%;color:#73A839}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:0.25rem 0.5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.5;color:#fff;background-color:rgba(115,168,57,0.9);border-radius:0.25rem}.was-validated .form-control:valid,.form-control.is-valid,.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#73A839}.was-validated .form-control:valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#73A839;-webkit-box-shadow:0 0 0 0.2rem rgba(115,168,57,0.25);box-shadow:0 0 0 0.2rem rgba(115,168,57,0.25)}.was-validated .form-control:valid ~ .valid-feedback,.was-validated .form-control:valid ~ .valid-tooltip,.form-control.is-valid ~ .valid-feedback,.form-control.is-valid ~ .valid-tooltip,.was-validated .custom-select:valid ~ .valid-feedback,.was-validated .custom-select:valid ~ .valid-tooltip,.custom-select.is-valid ~ .valid-feedback,.custom-select.is-valid ~ .valid-tooltip{display:block}.was-validated .form-control-file:valid ~ .valid-feedback,.was-validated .form-control-file:valid ~ .valid-tooltip,.form-control-file.is-valid ~ .valid-feedback,.form-control-file.is-valid ~ .valid-tooltip{display:block}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:#73A839}.was-validated .form-check-input:valid ~ .valid-feedback,.was-validated .form-check-input:valid ~ .valid-tooltip,.form-check-input.is-valid ~ .valid-feedback,.form-check-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid ~ .custom-control-label,.custom-control-input.is-valid ~ .custom-control-label{color:#73A839}.was-validated .custom-control-input:valid ~ .custom-control-label::before,.custom-control-input.is-valid ~ .custom-control-label::before{background-color:#b2d789}.was-validated .custom-control-input:valid ~ .valid-feedback,.was-validated .custom-control-input:valid ~ .valid-tooltip,.custom-control-input.is-valid ~ .valid-feedback,.custom-control-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before,.custom-control-input.is-valid:checked ~ .custom-control-label::before{background-color:#8dc450}.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before,.custom-control-input.is-valid:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(115,168,57,0.25);box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(115,168,57,0.25)}.was-validated .custom-file-input:valid ~ .custom-file-label,.custom-file-input.is-valid ~ .custom-file-label{border-color:#73A839}.was-validated .custom-file-input:valid ~ .custom-file-label::after,.custom-file-input.is-valid ~ .custom-file-label::after{border-color:inherit}.was-validated .custom-file-input:valid ~ .valid-feedback,.was-validated .custom-file-input:valid ~ .valid-tooltip,.custom-file-input.is-valid ~ .valid-feedback,.custom-file-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-file-input:valid:focus ~ .custom-file-label,.custom-file-input.is-valid:focus ~ .custom-file-label{-webkit-box-shadow:0 0 0 0.2rem rgba(115,168,57,0.25);box-shadow:0 0 0 0.2rem rgba(115,168,57,0.25)}.invalid-feedback{display:none;width:100%;margin-top:0.25rem;font-size:80%;color:#C71C22}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:0.25rem 0.5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.5;color:#fff;background-color:rgba(199,28,34,0.9);border-radius:0.25rem}.was-validated .form-control:invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#C71C22}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#C71C22;-webkit-box-shadow:0 0 0 0.2rem rgba(199,28,34,0.25);box-shadow:0 0 0 0.2rem rgba(199,28,34,0.25)}.was-validated .form-control:invalid ~ .invalid-feedback,.was-validated .form-control:invalid ~ .invalid-tooltip,.form-control.is-invalid ~ .invalid-feedback,.form-control.is-invalid ~ .invalid-tooltip,.was-validated .custom-select:invalid ~ .invalid-feedback,.was-validated .custom-select:invalid ~ .invalid-tooltip,.custom-select.is-invalid ~ .invalid-feedback,.custom-select.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-control-file:invalid ~ .invalid-feedback,.was-validated .form-control-file:invalid ~ .invalid-tooltip,.form-control-file.is-invalid ~ .invalid-feedback,.form-control-file.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:#C71C22}.was-validated .form-check-input:invalid ~ .invalid-feedback,.was-validated .form-check-input:invalid ~ .invalid-tooltip,.form-check-input.is-invalid ~ .invalid-feedback,.form-check-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid ~ .custom-control-label,.custom-control-input.is-invalid ~ .custom-control-label{color:#C71C22}.was-validated .custom-control-input:invalid ~ .custom-control-label::before,.custom-control-input.is-invalid ~ .custom-control-label::before{background-color:#ec777b}.was-validated .custom-control-input:invalid ~ .invalid-feedback,.was-validated .custom-control-input:invalid ~ .invalid-tooltip,.custom-control-input.is-invalid ~ .invalid-feedback,.custom-control-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before,.custom-control-input.is-invalid:checked ~ .custom-control-label::before{background-color:#e2343a}.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before,.custom-control-input.is-invalid:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(199,28,34,0.25);box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(199,28,34,0.25)}.was-validated .custom-file-input:invalid ~ .custom-file-label,.custom-file-input.is-invalid ~ .custom-file-label{border-color:#C71C22}.was-validated .custom-file-input:invalid ~ .custom-file-label::after,.custom-file-input.is-invalid ~ .custom-file-label::after{border-color:inherit}.was-validated .custom-file-input:invalid ~ .invalid-feedback,.was-validated .custom-file-input:invalid ~ .invalid-tooltip,.custom-file-input.is-invalid ~ .invalid-feedback,.custom-file-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-file-input:invalid:focus ~ .custom-file-label,.custom-file-input.is-invalid:focus ~ .custom-file-label{-webkit-box-shadow:0 0 0 0.2rem rgba(199,28,34,0.25);box-shadow:0 0 0 0.2rem rgba(199,28,34,0.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width: 576px){.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:0.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:0.375rem 0.75rem;font-size:1rem;line-height:1.5;border-radius:0.25rem;-webkit-transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media screen and (prefers-reduced-motion: reduce){.btn{-webkit-transition:none;transition:none}}.btn:hover,.btn:focus{text-decoration:none}.btn:focus,.btn.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(47,164,231,0.25);box-shadow:0 0 0 0.2rem rgba(47,164,231,0.25)}.btn.disabled,.btn:disabled{opacity:0.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#2FA4E7;border-color:#2FA4E7}.btn-primary:hover{color:#fff;background-color:#1992d7;border-color:#178acc}.btn-primary:focus,.btn-primary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(47,164,231,0.5);box-shadow:0 0 0 0.2rem rgba(47,164,231,0.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#2FA4E7;border-color:#2FA4E7}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#178acc;border-color:#1682c0}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(47,164,231,0.5);box-shadow:0 0 0 0.2rem rgba(47,164,231,0.5)}.btn-secondary{color:#212529;background-color:#e9ecef;border-color:#e9ecef}.btn-secondary:hover{color:#212529;background-color:#d3d9df;border-color:#cbd3da}.btn-secondary:focus,.btn-secondary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(233,236,239,0.5);box-shadow:0 0 0 0.2rem rgba(233,236,239,0.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#212529;background-color:#e9ecef;border-color:#e9ecef}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#212529;background-color:#cbd3da;border-color:#c4ccd4}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(233,236,239,0.5);box-shadow:0 0 0 0.2rem rgba(233,236,239,0.5)}.btn-success{color:#fff;background-color:#73A839;border-color:#73A839}.btn-success:hover{color:#fff;background-color:#5f8b2f;border-color:#59822c}.btn-success:focus,.btn-success.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(115,168,57,0.5);box-shadow:0 0 0 0.2rem rgba(115,168,57,0.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#73A839;border-color:#73A839}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#59822c;border-color:#527829}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(115,168,57,0.5);box-shadow:0 0 0 0.2rem rgba(115,168,57,0.5)}.btn-info{color:#fff;background-color:#033C73;border-color:#033C73}.btn-info:hover{color:#fff;background-color:#02294e;border-color:#022241}.btn-info:focus,.btn-info.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(3,60,115,0.5);box-shadow:0 0 0 0.2rem rgba(3,60,115,0.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#033C73;border-color:#033C73}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#022241;border-color:#011c35}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(3,60,115,0.5);box-shadow:0 0 0 0.2rem rgba(3,60,115,0.5)}.btn-warning{color:#fff;background-color:#DD5600;border-color:#DD5600}.btn-warning:hover{color:#fff;background-color:#b74700;border-color:#aa4200}.btn-warning:focus,.btn-warning.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(221,86,0,0.5);box-shadow:0 0 0 0.2rem rgba(221,86,0,0.5)}.btn-warning.disabled,.btn-warning:disabled{color:#fff;background-color:#DD5600;border-color:#DD5600}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#aa4200;border-color:#9d3d00}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(221,86,0,0.5);box-shadow:0 0 0 0.2rem rgba(221,86,0,0.5)}.btn-danger{color:#fff;background-color:#C71C22;border-color:#C71C22}.btn-danger:hover{color:#fff;background-color:#a5171c;border-color:#9a161a}.btn-danger:focus,.btn-danger.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(199,28,34,0.5);box-shadow:0 0 0 0.2rem rgba(199,28,34,0.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#C71C22;border-color:#C71C22}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#9a161a;border-color:#8f1418}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(199,28,34,0.5);box-shadow:0 0 0 0.2rem rgba(199,28,34,0.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light:focus,.btn-light.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5);box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5);box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark:focus,.btn-dark.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(52,58,64,0.5);box-shadow:0 0 0 0.2rem rgba(52,58,64,0.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(52,58,64,0.5);box-shadow:0 0 0 0.2rem rgba(52,58,64,0.5)}.btn-outline-primary{color:#2FA4E7;background-color:transparent;background-image:none;border-color:#2FA4E7}.btn-outline-primary:hover{color:#fff;background-color:#2FA4E7;border-color:#2FA4E7}.btn-outline-primary:focus,.btn-outline-primary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(47,164,231,0.5);box-shadow:0 0 0 0.2rem rgba(47,164,231,0.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#2FA4E7;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#2FA4E7;border-color:#2FA4E7}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(47,164,231,0.5);box-shadow:0 0 0 0.2rem rgba(47,164,231,0.5)}.btn-outline-secondary{color:#e9ecef;background-color:transparent;background-image:none;border-color:#e9ecef}.btn-outline-secondary:hover{color:#212529;background-color:#e9ecef;border-color:#e9ecef}.btn-outline-secondary:focus,.btn-outline-secondary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(233,236,239,0.5);box-shadow:0 0 0 0.2rem rgba(233,236,239,0.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#e9ecef;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#212529;background-color:#e9ecef;border-color:#e9ecef}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(233,236,239,0.5);box-shadow:0 0 0 0.2rem rgba(233,236,239,0.5)}.btn-outline-success{color:#73A839;background-color:transparent;background-image:none;border-color:#73A839}.btn-outline-success:hover{color:#fff;background-color:#73A839;border-color:#73A839}.btn-outline-success:focus,.btn-outline-success.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(115,168,57,0.5);box-shadow:0 0 0 0.2rem rgba(115,168,57,0.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#73A839;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#73A839;border-color:#73A839}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(115,168,57,0.5);box-shadow:0 0 0 0.2rem rgba(115,168,57,0.5)}.btn-outline-info{color:#033C73;background-color:transparent;background-image:none;border-color:#033C73}.btn-outline-info:hover{color:#fff;background-color:#033C73;border-color:#033C73}.btn-outline-info:focus,.btn-outline-info.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(3,60,115,0.5);box-shadow:0 0 0 0.2rem rgba(3,60,115,0.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#033C73;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#033C73;border-color:#033C73}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(3,60,115,0.5);box-shadow:0 0 0 0.2rem rgba(3,60,115,0.5)}.btn-outline-warning{color:#DD5600;background-color:transparent;background-image:none;border-color:#DD5600}.btn-outline-warning:hover{color:#fff;background-color:#DD5600;border-color:#DD5600}.btn-outline-warning:focus,.btn-outline-warning.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(221,86,0,0.5);box-shadow:0 0 0 0.2rem rgba(221,86,0,0.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#DD5600;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#DD5600;border-color:#DD5600}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(221,86,0,0.5);box-shadow:0 0 0 0.2rem rgba(221,86,0,0.5)}.btn-outline-danger{color:#C71C22;background-color:transparent;background-image:none;border-color:#C71C22}.btn-outline-danger:hover{color:#fff;background-color:#C71C22;border-color:#C71C22}.btn-outline-danger:focus,.btn-outline-danger.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(199,28,34,0.5);box-shadow:0 0 0 0.2rem rgba(199,28,34,0.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#C71C22;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#C71C22;border-color:#C71C22}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(199,28,34,0.5);box-shadow:0 0 0 0.2rem rgba(199,28,34,0.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:focus,.btn-outline-light.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5);box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5);box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:focus,.btn-outline-dark.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(52,58,64,0.5);box-shadow:0 0 0 0.2rem rgba(52,58,64,0.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(52,58,64,0.5);box-shadow:0 0 0 0.2rem rgba(52,58,64,0.5)}.btn-link{font-weight:400;color:#2FA4E7;background-color:transparent}.btn-link:hover{color:#157ab5;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link:focus,.btn-link.focus{text-decoration:underline;border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link:disabled,.btn-link.disabled{color:#868e96;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:0.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:0.3rem}.btn-sm,.btn-group-sm>.btn{padding:0.25rem 0.5rem;font-size:0.875rem;line-height:1.5;border-radius:0.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:0.5rem}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{-webkit-transition:opacity 0.15s linear;transition:opacity 0.15s linear}@media screen and (prefers-reduced-motion: reduce){.fade{-webkit-transition:none;transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;transition:height 0.35s ease}@media screen and (prefers-reduced-motion: reduce){.collapsing{-webkit-transition:none;transition:none}}.dropup,.dropright,.dropdown,.dropleft{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid;border-right:0.3em solid transparent;border-bottom:0;border-left:0.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:0.5rem 0;margin:0.125rem 0 0;font-size:1rem;color:#495057;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.15);border-radius:0.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:0.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0;border-right:0.3em solid transparent;border-bottom:0.3em solid;border-left:0.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:0.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid transparent;border-right:0;border-bottom:0.3em solid transparent;border-left:0.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:0.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:0.255em;vertical-align:0.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid transparent;border-right:0.3em solid;border-bottom:0.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^="top"],.dropdown-menu[x-placement^="right"],.dropdown-menu[x-placement^="bottom"],.dropdown-menu[x-placement^="left"]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:0.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:0.25rem 1.5rem;clear:both;font-weight:400;color:#495057;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#fff;text-decoration:none;background-color:#2FA4E7}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#2FA4E7}.dropdown-item.disabled,.dropdown-item:disabled{color:#868e96;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:0.5rem 1.5rem;margin-bottom:0;font-size:0.875rem;color:#868e96;white-space:nowrap}.dropdown-item-text{display:block;padding:0.25rem 1.5rem;color:#495057}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:0.5625rem;padding-left:0.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:0.375rem;padding-left:0.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:0.75rem;padding-left:0.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type="radio"],.btn-group-toggle>.btn input[type="checkbox"],.btn-group-toggle>.btn-group>.btn input[type="radio"],.btn-group-toggle>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.custom-select,.input-group>.custom-file{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-1px}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file .custom-file-input:focus ~ .custom-file-label{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.form-control:not(:last-child),.input-group>.custom-select:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-prepend,.input-group-append{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0.375rem 0.75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:0.25rem}.input-group-text input[type="radio"],.input-group-text input[type="checkbox"]{margin-top:0}.input-group-lg>.form-control,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{height:calc(2.875rem + 2px);padding:0.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:0.3rem}.input-group-sm>.form-control,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{height:calc(1.8125rem + 2px);padding:0.25rem 0.5rem;font-size:0.875rem;line-height:1.5;border-radius:0.2rem}.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked ~ .custom-control-label::before{color:#fff;background-color:#2FA4E7}.custom-control-input:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(47,164,231,0.25);box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(47,164,231,0.25)}.custom-control-input:active ~ .custom-control-label::before{color:#fff;background-color:#cfeaf9}.custom-control-input:disabled ~ .custom-control-label{color:#868e96}.custom-control-input:disabled ~ .custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label::before{position:absolute;top:0.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:0.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:0.25rem}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before{background-color:#2FA4E7}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{background-color:#2FA4E7}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(47,164,231,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(47,164,231,0.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked ~ .custom-control-label::before{background-color:#2FA4E7}.custom-radio .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(47,164,231,0.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:0.375rem 1.75rem 0.375rem 0.75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:0.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#a1d6f4;outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(161,214,244,0.5);box-shadow:0 0 0 0.2rem rgba(161,214,244,0.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:0.75rem;background-image:none}.custom-select:disabled{color:#868e96;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:0.375rem;padding-bottom:0.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:0.375rem;padding-bottom:0.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-label{border-color:#a1d6f4;-webkit-box-shadow:0 0 0 0.2rem rgba(47,164,231,0.25);box-shadow:0 0 0 0.2rem rgba(47,164,231,0.25)}.custom-file-input:focus ~ .custom-file-label::after{border-color:#a1d6f4}.custom-file-input:disabled ~ .custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en) ~ .custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:0.375rem 0.75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:0.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:0.375rem 0.75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 0.25rem 0.25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:none}.custom-range:focus::-webkit-slider-thumb{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(47,164,231,0.25);box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(47,164,231,0.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(47,164,231,0.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(47,164,231,0.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;background-color:#2FA4E7;border:0;border-radius:1rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;-webkit-appearance:none;appearance:none}@media screen and (prefers-reduced-motion: reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#cfeaf9}.custom-range::-webkit-slider-runnable-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#2FA4E7;border:0;border-radius:1rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;-moz-appearance:none;appearance:none}@media screen and (prefers-reduced-motion: reduce){.custom-range::-moz-range-thumb{-webkit-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#cfeaf9}.custom-range::-moz-range-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:0.2rem;margin-left:0.2rem;background-color:#2FA4E7;border:0;border-radius:1rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion: reduce){.custom-range::-ms-thumb{-webkit-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#cfeaf9}.custom-range::-ms-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:0.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-control-label::before,.custom-file-label,.custom-select{-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media screen and (prefers-reduced-motion: reduce){.custom-control-label::before,.custom-file-label,.custom-select{-webkit-transition:none;transition:none}}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:0.5rem 1rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#868e96}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#868e96;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:0.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#2FA4E7}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:0.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:0.3125rem;padding-bottom:0.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:0.5rem;padding-bottom:0.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:0.25rem 0.75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:0.25rem}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width: 767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width: 991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width: 1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.5);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,0.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,0.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,0.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,0.8)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:#fff}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,0.8);border-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.8)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,0.8)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,0.125);border-radius:0.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:0.25rem;border-bottom-left-radius:0.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:0.75rem}.card-subtitle{margin-top:-0.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:0.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,0.03);border-bottom:1px solid rgba(0,0,0,0.125)}.card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:0.75rem 1.25rem;background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125)}.card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.card-header-tabs{margin-right:-0.625rem;margin-bottom:-0.75rem;margin-left:-0.625rem;border-bottom:0}.card-header-pills{margin-right:-0.625rem;margin-left:-0.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(0.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(0.25rem - 1px);border-bottom-left-radius:calc(0.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width: 576px){.card-deck{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width: 576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-img-top,.card-group>.card:first-child .card-header{border-top-right-radius:0}.card-group>.card:first-child .card-img-bottom,.card-group>.card:first-child .card-footer{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-img-top,.card-group>.card:last-child .card-header{border-top-left-radius:0}.card-group>.card:last-child .card-img-bottom,.card-group>.card:last-child .card-footer{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:0.25rem}.card-group>.card:only-child .card-img-top,.card-group>.card:only-child .card-header{border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.card-group>.card:only-child .card-img-bottom,.card-group>.card:only-child .card-footer{border-bottom-right-radius:0.25rem;border-bottom-left-radius:0.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer{border-radius:0}}.card-columns .card{margin-bottom:0.75rem}@media (min-width: 576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:0.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:0.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:0.5rem;color:#868e96;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#868e96}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:0.25rem}.page-link{position:relative;display:block;padding:0.5rem 0.75rem;margin-left:-1px;line-height:1.25;color:#2FA4E7;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#157ab5;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(47,164,231,0.25);box-shadow:0 0 0 0.2rem rgba(47,164,231,0.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:0.25rem;border-bottom-left-radius:0.25rem}.page-item:last-child .page-link{border-top-right-radius:0.25rem;border-bottom-right-radius:0.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#2FA4E7;border-color:#2FA4E7}.page-item.disabled .page-link{color:#868e96;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:0.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:0.3rem;border-bottom-left-radius:0.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:0.3rem;border-bottom-right-radius:0.3rem}.pagination-sm .page-link{padding:0.25rem 0.5rem;font-size:0.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:0.2rem;border-bottom-left-radius:0.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:0.2rem;border-bottom-right-radius:0.2rem}.badge{display:inline-block;padding:0.25em 0.4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:0.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:0.6em;padding-left:0.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#2FA4E7}.badge-primary[href]:hover,.badge-primary[href]:focus{color:#fff;text-decoration:none;background-color:#178acc}.badge-secondary{color:#212529;background-color:#e9ecef}.badge-secondary[href]:hover,.badge-secondary[href]:focus{color:#212529;text-decoration:none;background-color:#cbd3da}.badge-success{color:#fff;background-color:#73A839}.badge-success[href]:hover,.badge-success[href]:focus{color:#fff;text-decoration:none;background-color:#59822c}.badge-info{color:#fff;background-color:#033C73}.badge-info[href]:hover,.badge-info[href]:focus{color:#fff;text-decoration:none;background-color:#022241}.badge-warning{color:#fff;background-color:#DD5600}.badge-warning[href]:hover,.badge-warning[href]:focus{color:#fff;text-decoration:none;background-color:#aa4200}.badge-danger{color:#fff;background-color:#C71C22}.badge-danger[href]:hover,.badge-danger[href]:focus{color:#fff;text-decoration:none;background-color:#9a161a}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:hover,.badge-light[href]:focus{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:hover,.badge-dark[href]:focus{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:0.3rem}@media (min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:0.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:0.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:0.75rem 1.25rem;color:inherit}.alert-primary{color:#185578;background-color:#d5edfa;border-color:#c5e6f8}.alert-primary hr{border-top-color:#aedcf5}.alert-primary .alert-link{color:#10374e}.alert-secondary{color:#797b7c;background-color:#fbfbfc;border-color:#f9fafb}.alert-secondary hr{border-top-color:#eaedf1}.alert-secondary .alert-link{color:#606162}.alert-success{color:#3c571e;background-color:#e3eed7;border-color:#d8e7c8}.alert-success hr{border-top-color:#cbdfb6}.alert-success .alert-link{color:#223111}.alert-info{color:#021f3c;background-color:#cdd8e3;border-color:#b8c8d8}.alert-info hr{border-top-color:#a8bbcf}.alert-info .alert-link{color:#00060b}.alert-warning{color:#732d00;background-color:#f8ddcc;border-color:#f5d0b8}.alert-warning hr{border-top-color:#f2c1a2}.alert-warning .alert-link{color:#401900}.alert-danger{color:#670f12;background-color:#f4d2d3;border-color:#efbfc1}.alert-danger hr{border-top-color:#eaabad}.alert-danger .alert-link{color:#3a090a}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:0.75rem;background-color:#e9ecef;border-radius:0.25rem}.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#2FA4E7;-webkit-transition:width 0.6s ease;transition:width 0.6s ease}@media screen and (prefers-reduced-motion: reduce){.progress-bar{-webkit-transition:none;transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#495057;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:0.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.list-group-item:first-child{border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0.25rem;border-bottom-left-radius:0.25rem}.list-group-item:hover,.list-group-item:focus{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#868e96;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#2FA4E7;border-color:#2FA4E7}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#185578;background-color:#c5e6f8}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#185578;background-color:#aedcf5}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#185578;border-color:#185578}.list-group-item-secondary{color:#797b7c;background-color:#f9fafb}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#797b7c;background-color:#eaedf1}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#797b7c;border-color:#797b7c}.list-group-item-success{color:#3c571e;background-color:#d8e7c8}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#3c571e;background-color:#cbdfb6}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#3c571e;border-color:#3c571e}.list-group-item-info{color:#021f3c;background-color:#b8c8d8}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#021f3c;background-color:#a8bbcf}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#021f3c;border-color:#021f3c}.list-group-item-warning{color:#732d00;background-color:#f5d0b8}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#732d00;background-color:#f2c1a2}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#732d00;border-color:#732d00}.list-group-item-danger{color:#670f12;background-color:#efbfc1}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#670f12;background-color:#eaabad}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#670f12;border-color:#670f12}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):hover,.close:not(:disabled):not(.disabled):focus{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:0.5rem;pointer-events:none}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform 0.3s ease-out;transition:-webkit-transform 0.3s ease-out;transition:transform 0.3s ease-out;transition:transform 0.3s ease-out, -webkit-transform 0.3s ease-out;-webkit-transform:translate(0, -25%);transform:translate(0, -25%)}@media screen and (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{-webkit-transition:none;transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0, 0);transform:translate(0, 0)}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - (0.5rem * 2))}.modal-dialog-centered::before{display:block;height:calc(100vh - (0.5rem * 2));content:""}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:0.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:0.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:0.3rem;border-top-right-radius:0.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-dialog-centered::before{height:calc(100vh - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:0.9}.tooltip .arrow{position:absolute;display:block;width:0.8rem;height:0.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^="top"]{padding:0.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^="top"] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^="top"] .arrow::before{top:0;border-width:0.4rem 0.4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^="right"]{padding:0 0.4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^="right"] .arrow{left:0;width:0.4rem;height:0.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^="right"] .arrow::before{right:0;border-width:0.4rem 0.4rem 0.4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^="bottom"]{padding:0.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^="bottom"] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^="bottom"] .arrow::before{bottom:0;border-width:0 0.4rem 0.4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^="left"]{padding:0 0.4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^="left"] .arrow{right:0;width:0.4rem;height:0.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^="left"] .arrow::before{left:0;border-width:0.4rem 0 0.4rem 0.4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:0.25rem 0.5rem;color:#fff;text-align:center;background-color:#000;border-radius:0.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:0.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:0.5rem;margin:0 0.3rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^="top"]{margin-bottom:0.5rem}.bs-popover-top .arrow,.bs-popover-auto[x-placement^="top"] .arrow{bottom:calc((0.5rem + 1px) * -1)}.bs-popover-top .arrow::before,.bs-popover-auto[x-placement^="top"] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-auto[x-placement^="top"] .arrow::after{border-width:0.5rem 0.5rem 0}.bs-popover-top .arrow::before,.bs-popover-auto[x-placement^="top"] .arrow::before{bottom:0;border-top-color:rgba(0,0,0,0.25)}.bs-popover-top .arrow::after,.bs-popover-auto[x-placement^="top"] .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^="right"]{margin-left:0.5rem}.bs-popover-right .arrow,.bs-popover-auto[x-placement^="right"] .arrow{left:calc((0.5rem + 1px) * -1);width:0.5rem;height:1rem;margin:0.3rem 0}.bs-popover-right .arrow::before,.bs-popover-auto[x-placement^="right"] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-auto[x-placement^="right"] .arrow::after{border-width:0.5rem 0.5rem 0.5rem 0}.bs-popover-right .arrow::before,.bs-popover-auto[x-placement^="right"] .arrow::before{left:0;border-right-color:rgba(0,0,0,0.25)}.bs-popover-right .arrow::after,.bs-popover-auto[x-placement^="right"] .arrow::after{left:1px;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^="bottom"]{margin-top:0.5rem}.bs-popover-bottom .arrow,.bs-popover-auto[x-placement^="bottom"] .arrow{top:calc((0.5rem + 1px) * -1)}.bs-popover-bottom .arrow::before,.bs-popover-auto[x-placement^="bottom"] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-auto[x-placement^="bottom"] .arrow::after{border-width:0 0.5rem 0.5rem 0.5rem}.bs-popover-bottom .arrow::before,.bs-popover-auto[x-placement^="bottom"] .arrow::before{top:0;border-bottom-color:rgba(0,0,0,0.25)}.bs-popover-bottom .arrow::after,.bs-popover-auto[x-placement^="bottom"] .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-0.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^="left"]{margin-right:0.5rem}.bs-popover-left .arrow,.bs-popover-auto[x-placement^="left"] .arrow{right:calc((0.5rem + 1px) * -1);width:0.5rem;height:1rem;margin:0.3rem 0}.bs-popover-left .arrow::before,.bs-popover-auto[x-placement^="left"] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-auto[x-placement^="left"] .arrow::after{border-width:0.5rem 0 0.5rem 0.5rem}.bs-popover-left .arrow::before,.bs-popover-auto[x-placement^="left"] .arrow::before{right:0;border-left-color:rgba(0,0,0,0.25)}.bs-popover-left .arrow::after,.bs-popover-auto[x-placement^="left"] .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:0.5rem 0.75rem;margin-bottom:0;font-size:1rem;color:#2FA4E7;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:0.5rem 0.75rem;color:#495057}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block;-webkit-transition:-webkit-transform 0.6s ease;transition:-webkit-transform 0.6s ease;transition:transform 0.6s ease;transition:transform 0.6s ease, -webkit-transform 0.6s ease}@media screen and (prefers-reduced-motion: reduce){.carousel-item.active,.carousel-item-next,.carousel-item-prev{-webkit-transition:none;transition:none}}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports (-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}}.carousel-item-next,.active.carousel-item-right{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports (-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d){.carousel-item-next,.active.carousel-item-right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0)}}.carousel-item-prev,.active.carousel-item-left{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports (-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d){.carousel-item-prev,.active.carousel-item-left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0)}}.carousel-fade .carousel-item{opacity:0;-webkit-transition-duration:.6s;transition-duration:.6s;-webkit-transition-property:opacity;transition-property:opacity}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active,.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev{-webkit-transform:translateX(0);transform:translateX(0)}@supports (-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d){.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active,.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:0.5}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,0.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#2FA4E7 !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#178acc !important}.bg-secondary{background-color:#e9ecef !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#cbd3da !important}.bg-success{background-color:#73A839 !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#59822c !important}.bg-info{background-color:#033C73 !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#022241 !important}.bg-warning{background-color:#DD5600 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#aa4200 !important}.bg-danger{background-color:#C71C22 !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#9a161a !important}.bg-light{background-color:#f8f9fa !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#dae0e5 !important}.bg-dark{background-color:#343a40 !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#1d2124 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:transparent !important}.border{border:1px solid #dee2e6 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-right{border-right:1px solid #dee2e6 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-left{border-left:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#2FA4E7 !important}.border-secondary{border-color:#e9ecef !important}.border-success{border-color:#73A839 !important}.border-info{border-color:#033C73 !important}.border-warning{border-color:#DD5600 !important}.border-danger{border-color:#C71C22 !important}.border-light{border-color:#f8f9fa !important}.border-dark{border-color:#343a40 !important}.border-white{border-color:#fff !important}.rounded{border-radius:0.25rem !important}.rounded-top{border-top-left-radius:0.25rem !important;border-top-right-radius:0.25rem !important}.rounded-right{border-top-right-radius:0.25rem !important;border-bottom-right-radius:0.25rem !important}.rounded-bottom{border-bottom-right-radius:0.25rem !important;border-bottom-left-radius:0.25rem !important}.rounded-left{border-top-left-radius:0.25rem !important;border-bottom-left-radius:0.25rem !important}.rounded-circle{border-radius:50% !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}@media (min-width: 576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-sm-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-md-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-lg-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-xl-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-print-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.8571428571%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}@media (min-width: 576px){.flex-sm-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-sm-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-sm-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-sm-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-sm-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-sm-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-sm-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-sm-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-sm-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-sm-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-sm-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-sm-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-sm-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-sm-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-sm-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-sm-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-sm-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-sm-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-sm-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-sm-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-sm-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-sm-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-sm-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-sm-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-sm-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-sm-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-sm-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-sm-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-sm-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-sm-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-sm-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-sm-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-sm-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 768px){.flex-md-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-md-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-md-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-md-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-md-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-md-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-md-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-md-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-md-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-md-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-md-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-md-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-md-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-md-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-md-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-md-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-md-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-md-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-md-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-md-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-md-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-md-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-md-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-md-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-md-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-md-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-md-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-md-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-md-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-md-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-md-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-md-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-md-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 992px){.flex-lg-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-lg-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-lg-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-lg-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-lg-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-lg-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-lg-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-lg-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-lg-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-lg-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-lg-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-lg-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-lg-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-lg-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-lg-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-lg-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-lg-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-lg-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-lg-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-lg-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-lg-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-lg-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-lg-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-lg-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-lg-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-lg-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-lg-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-lg-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-lg-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-lg-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-lg-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-lg-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-lg-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 1200px){.flex-xl-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-xl-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-xl-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-xl-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-xl-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-xl-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-xl-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-xl-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-xl-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-xl-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-xl-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-xl-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-xl-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-xl-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-xl-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-xl-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-xl-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-xl-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-xl-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-xl-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-xl-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-xl-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-xl-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-xl-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-xl-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-xl-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-xl-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-xl-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-xl-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-xl-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-xl-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-xl-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-xl-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media (min-width: 576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media (min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media (min-width: 992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media (min-width: 1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:-webkit-sticky !important;position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports (position: -webkit-sticky) or (position: sticky){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{-webkit-box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important;box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important}.shadow{-webkit-box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important;box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.shadow-lg{-webkit-box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important;box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important}.shadow-none{-webkit-box-shadow:none !important;box-shadow:none !important}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:0.25rem !important}.mt-1,.my-1{margin-top:0.25rem !important}.mr-1,.mx-1{margin-right:0.25rem !important}.mb-1,.my-1{margin-bottom:0.25rem !important}.ml-1,.mx-1{margin-left:0.25rem !important}.m-2{margin:0.5rem !important}.mt-2,.my-2{margin-top:0.5rem !important}.mr-2,.mx-2{margin-right:0.5rem !important}.mb-2,.my-2{margin-bottom:0.5rem !important}.ml-2,.mx-2{margin-left:0.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:0.25rem !important}.pt-1,.py-1{padding-top:0.25rem !important}.pr-1,.px-1{padding-right:0.25rem !important}.pb-1,.py-1{padding-bottom:0.25rem !important}.pl-1,.px-1{padding-left:0.25rem !important}.p-2{padding:0.5rem !important}.pt-2,.py-2{padding-top:0.5rem !important}.pr-2,.px-2{padding-right:0.5rem !important}.pb-2,.py-2{padding-bottom:0.5rem !important}.pl-2,.px-2{padding-left:0.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media (min-width: 576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:0.25rem !important}.mt-sm-1,.my-sm-1{margin-top:0.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:0.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:0.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:0.25rem !important}.m-sm-2{margin:0.5rem !important}.mt-sm-2,.my-sm-2{margin-top:0.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:0.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:0.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:0.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:0.25rem !important}.pt-sm-1,.py-sm-1{padding-top:0.25rem !important}.pr-sm-1,.px-sm-1{padding-right:0.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:0.25rem !important}.pl-sm-1,.px-sm-1{padding-left:0.25rem !important}.p-sm-2{padding:0.5rem !important}.pt-sm-2,.py-sm-2{padding-top:0.5rem !important}.pr-sm-2,.px-sm-2{padding-right:0.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:0.5rem !important}.pl-sm-2,.px-sm-2{padding-left:0.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media (min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:0.25rem !important}.mt-md-1,.my-md-1{margin-top:0.25rem !important}.mr-md-1,.mx-md-1{margin-right:0.25rem !important}.mb-md-1,.my-md-1{margin-bottom:0.25rem !important}.ml-md-1,.mx-md-1{margin-left:0.25rem !important}.m-md-2{margin:0.5rem !important}.mt-md-2,.my-md-2{margin-top:0.5rem !important}.mr-md-2,.mx-md-2{margin-right:0.5rem !important}.mb-md-2,.my-md-2{margin-bottom:0.5rem !important}.ml-md-2,.mx-md-2{margin-left:0.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:0.25rem !important}.pt-md-1,.py-md-1{padding-top:0.25rem !important}.pr-md-1,.px-md-1{padding-right:0.25rem !important}.pb-md-1,.py-md-1{padding-bottom:0.25rem !important}.pl-md-1,.px-md-1{padding-left:0.25rem !important}.p-md-2{padding:0.5rem !important}.pt-md-2,.py-md-2{padding-top:0.5rem !important}.pr-md-2,.px-md-2{padding-right:0.5rem !important}.pb-md-2,.py-md-2{padding-bottom:0.5rem !important}.pl-md-2,.px-md-2{padding-left:0.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media (min-width: 992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:0.25rem !important}.mt-lg-1,.my-lg-1{margin-top:0.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:0.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:0.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:0.25rem !important}.m-lg-2{margin:0.5rem !important}.mt-lg-2,.my-lg-2{margin-top:0.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:0.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:0.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:0.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:0.25rem !important}.pt-lg-1,.py-lg-1{padding-top:0.25rem !important}.pr-lg-1,.px-lg-1{padding-right:0.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:0.25rem !important}.pl-lg-1,.px-lg-1{padding-left:0.25rem !important}.p-lg-2{padding:0.5rem !important}.pt-lg-2,.py-lg-2{padding-top:0.5rem !important}.pr-lg-2,.px-lg-2{padding-right:0.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:0.5rem !important}.pl-lg-2,.px-lg-2{padding-left:0.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media (min-width: 1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:0.25rem !important}.mt-xl-1,.my-xl-1{margin-top:0.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:0.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:0.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:0.25rem !important}.m-xl-2{margin:0.5rem !important}.mt-xl-2,.my-xl-2{margin-top:0.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:0.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:0.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:0.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:0.25rem !important}.pt-xl-1,.py-xl-1{padding-top:0.25rem !important}.pr-xl-1,.px-xl-1{padding-right:0.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:0.25rem !important}.pl-xl-1,.px-xl-1{padding-left:0.25rem !important}.p-xl-2{padding:0.5rem !important}.pt-xl-2,.py-xl-2{padding-top:0.5rem !important}.pr-xl-2,.px-xl-2{padding-right:0.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:0.5rem !important}.pl-xl-2,.px-xl-2{padding-left:0.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.text-monospace{font-family:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}.text-justify{text-align:justify !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media (min-width: 576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media (min-width: 992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media (min-width: 1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#2FA4E7 !important}a.text-primary:hover,a.text-primary:focus{color:#178acc !important}.text-secondary{color:#e9ecef !important}a.text-secondary:hover,a.text-secondary:focus{color:#cbd3da !important}.text-success{color:#73A839 !important}a.text-success:hover,a.text-success:focus{color:#59822c !important}.text-info{color:#033C73 !important}a.text-info:hover,a.text-info:focus{color:#022241 !important}.text-warning{color:#DD5600 !important}a.text-warning:hover,a.text-warning:focus{color:#aa4200 !important}.text-danger{color:#C71C22 !important}a.text-danger:hover,a.text-danger:focus{color:#9a161a !important}.text-light{color:#f8f9fa !important}a.text-light:hover,a.text-light:focus{color:#dae0e5 !important}.text-dark{color:#343a40 !important}a.text-dark:hover,a.text-dark:focus{color:#1d2124 !important}.text-body{color:#495057 !important}.text-muted{color:#868e96 !important}.text-black-50{color:rgba(0,0,0,0.5) !important}.text-white-50{color:rgba(255,255,255,0.5) !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media print{*,*::before,*::after{text-shadow:none !important;-webkit-box-shadow:none !important;box-shadow:none !important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px !important}.container{min-width:992px !important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #dee2e6 !important}.table-dark{color:inherit}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}.bg-primary{background-image:-webkit-gradient(linear, left top, left bottom, from(#54b4eb), color-stop(60%, #2FA4E7), to(#1d9ce5));background-image:linear-gradient(#54b4eb, #2FA4E7 60%, #1d9ce5);background-repeat:no-repeat}.bg-dark{background-image:-webkit-gradient(linear, left top, left bottom, from(#04519b), color-stop(60%, #033C73), to(#02325f));background-image:linear-gradient(#04519b, #033C73 60%, #02325f);background-repeat:no-repeat}.bg-light{background-image:-webkit-gradient(linear, left top, left bottom, from(white), color-stop(60%, #e9ecef), to(#e3e7eb));background-image:linear-gradient(white, #e9ecef 60%, #e3e7eb);background-repeat:no-repeat}.navbar-brand,.nav-link{text-shadow:0 1px 0 rgba(0,0,0,0.05)}.btn{text-shadow:0 1px 0 rgba(0,0,0,0.05)}.btn-primary{background-image:-webkit-gradient(linear, left top, left bottom, from(#54b4eb), color-stop(60%, #2FA4E7), to(#1d9ce5));background-image:linear-gradient(#54b4eb, #2FA4E7 60%, #1d9ce5);background-repeat:no-repeat}.btn-secondary{background-image:-webkit-gradient(linear, left top, left bottom, from(white), color-stop(60%, #e9ecef), to(#dde2e6));background-image:linear-gradient(white, #e9ecef 60%, #dde2e6);background-repeat:no-repeat;color:#495057}.btn-success{background-image:-webkit-gradient(linear, left top, left bottom, from(#88c149), color-stop(60%, #73A839), to(#699934));background-image:linear-gradient(#88c149, #73A839 60%, #699934);background-repeat:no-repeat}.btn-info{background-image:-webkit-gradient(linear, left top, left bottom, from(#04519b), color-stop(60%, #033C73), to(#02325f));background-image:linear-gradient(#04519b, #033C73 60%, #02325f);background-repeat:no-repeat}.btn-warning{background-image:-webkit-gradient(linear, left top, left bottom, from(#ff6707), color-stop(60%, #DD5600), to(#c94e00));background-image:linear-gradient(#ff6707, #DD5600 60%, #c94e00);background-repeat:no-repeat}.btn-danger{background-image:-webkit-gradient(linear, left top, left bottom, from(#e12b31), color-stop(60%, #C71C22), to(#b5191f));background-image:linear-gradient(#e12b31, #C71C22 60%, #b5191f);background-repeat:no-repeat}.btn-light{background-image:-webkit-gradient(linear, left top, left bottom, from(white), color-stop(60%, #f8f9fa), to(#eceff2));background-image:linear-gradient(white, #f8f9fa 60%, #eceff2);background-repeat:no-repeat}.btn-dark{background-image:-webkit-gradient(linear, left top, left bottom, from(#464e57), color-stop(60%, #343a40), to(#2b3035));background-image:linear-gradient(#464e57, #343a40 60%, #2b3035);background-repeat:no-repeat}.bg-primary h1,.bg-primary h2,.bg-primary h3,.bg-primary h4,.bg-primary h5,.bg-primary h6,.bg-success h1,.bg-success h2,.bg-success h3,.bg-success h4,.bg-success h5,.bg-success h6,.bg-info h1,.bg-info h2,.bg-info h3,.bg-info h4,.bg-info h5,.bg-info h6,.bg-warning h1,.bg-warning h2,.bg-warning h3,.bg-warning h4,.bg-warning h5,.bg-warning h6,.bg-danger h1,.bg-danger h2,.bg-danger h3,.bg-danger h4,.bg-danger h5,.bg-danger h6,.bg-dark h1,.bg-dark h2,.bg-dark h3,.bg-dark h4,.bg-dark h5,.bg-dark h6{color:#fff}.dropdown-menu .dropdown-header{color:#868e96} diff --git a/css/font-awesome.min.css b/css/font-awesome.min.css new file mode 100644 index 0000000..540440c --- /dev/null +++ b/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/fonts/fontawesome-webfont.eot b/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/fonts/fontawesome-webfont.eot differ diff --git a/fonts/fontawesome-webfont.svg b/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fonts/fontawesome-webfont.ttf b/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/fonts/fontawesome-webfont.ttf differ diff --git a/fonts/fontawesome-webfont.woff b/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/fonts/fontawesome-webfont.woff differ diff --git a/fonts/fontawesome-webfont.woff2 b/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/fonts/fontawesome-webfont.woff2 differ diff --git a/geonovum-werkwijze-modelleren/index.html b/geonovum-werkwijze-modelleren/index.html new file mode 100644 index 0000000..70c32e0 --- /dev/null +++ b/geonovum-werkwijze-modelleren/index.html @@ -0,0 +1,388 @@ + + + + + + + + + + + Geonovum Werkwijze Modelleren - Geonovum tooling + + + + + + + + + + + +
+
+ +
+ +

Overzicht beschikbare documenten

+

De onderstaande tabbelen geven een overzicht van reeds beschikbare handleidingen en andere documenten die voor een modelleur bij Geonovum relevant zijn.

+
+

Note +Nog verwerken

+
+
    +
  1. Handboek beheer standaarden
  2. +
  3. Handleiding toepassing standaarddatatypes
  4. +
  5. Document JvG, beheerinformatie GitHub, ReSpec, etc.
  6. +
  7. Handleiding Logius Respec (door Linda)
  8. +
  9. Handleiding GitHub ReSpec Markdwon v1.1 (org:Handleiding GitHub ReSpec Markdown v1.1.docx)
  10. +
  11. Handleiding introductie GitHub (org:Handleiding introductie GitHub.docx)
  12. +
+
+

Note +Wilko heeft twee bestaande documenten samengevoegd, maar daarin zit ook overlap met het document van Linda over Logius ReSpec. Bovendien bevat het document secties waarvan het fijn is om er apart naar te kunnen verwijzen. M.a.w.: tabellen kunnen aangevuld worden, maar goed kijken welke documenten (zie ook: rij 16 en 22 in de tabel met het overzicht van beschikbare documentatie m.b.t. werkomgeving. ). Intranet luistert iets nauwer: daar misschien specifiekere verwijzingen maken.

+
+

Suggestie voor de langetermijn

+
+

Note +Voorbeeld samenhang processen, data, inten/extern van aquo-standaarden

+
+

De volgende lijst bevat een aantal suggesties om documentatie (van o.a. werkwijze en -omgeving) beter en efficienter op orde te krijgen. Voor documentatie zouden we eens kunnen kijken naar DITA, een standaard uit de uitgeverswereld. Op Wikipedia wordt het als volgt uitgelegd: "Uitgangspunt van de architectuur is het verdelen van tekst in bouwstenen of 'topics' ten behoeve van hergebruik en specialisatie en het bundelen van bouwstenen via zogenaamde DITA Maps."

+
    +
  • Dit zou heel aantrekkelijk kunnen zijn voor onze documentatie, zoals handleidingen en instructies, maar ook modellen.
  • +
  • Imvertor maakt nu van UML een catalogus.
  • +
  • Maar zou het niet mooier zijn om van datamodel naar database met objecten, definities en diagrammen te gaan
  • +
  • En van daaruit kun je dat (bijvoorbeeld) een catalogus genereren?
  • +
  • Informatie die op meerdere plekken terugkeert kan zo éénmalig opgeslagen en beheerd worden
  • +
  • Op dit moment is verwijzen tussen standaarden onderling lastig, een dergelijke structuur zou een oplossing kunnen zijn.,
  • +
  • NEN3610 is topmodel voor veel modellen, daar wil je naar kunnen verwijzen; m.a.w. echt mee kunnen verbinden
  • +
  • Wat is ervoor nodig?
  • +
  • Welke stappen kunnen we nu al nemen zonder onszelf in de toekomst klem te zetten?
  • +
  • Informatie in database zou applicatie-onafhankelijk moeten zijn (m.a.w. niet afhankelijk van EA of Imvertor)
  • +
  • De huidige werkwijze van het publiceren van modellen en standaarden is te veel verzuild; ieder model is een zuil.
  • +
  • Gerard W. heeft affiniteit met de uitgeverswereld en weet hierover meer.
  • +
  • Een ander deel van de workflow zou kunnen zijn om documenten via MS Word aan te leveren voor de database.
  • +
  • Maar misschien wil je aan de aanleverkant meerdere formaten kunnen toestaan.
  • +
  • Arjan Loeffen heeft hier vanuit andere invalshoek ook ideeën over: datamodel van heel NL
  • +
  • Dan moet je ook kunnen verbinden en standaardistaie ook verder doorvoeren (bijv. lay-out)
  • +
+ + +

Inventarisatie inhoud documenten

+

Deze paragraaf geeft per document een korte analyse van de inhoud. Op basis hiervan wordt een koppeling gemaakt met de lijst met personen die op dit moment verantwoordelijk zijn voor bepaalde onderdelen binnen Geonovum. Dit wordt voorlopig alleen toegepast op wat relevant is voor de Geonovumwerkomgeving (m.u.v. HIM). Op die manier wordt duidelijk welke onderdelen afgedekt zijn en welke niet, maar ook wie er mogelijk verantwoordelijk voor is.

+

HIM

+
    +
  • Past misschien beter bij Geonovumwerkwijze (i.p.v. ~omgeving)
  • +
  • Handreiking voor informatiemodellering
  • +
  • Voor informatieproduten uitwisselen in context DSO
  • +
  • Objectgeoriënteerd
  • +
  • Heeft update nodig
  • +
  • Hoofdstuk 2-5 zijn met name relevant
  • +
  • Zouden we naast 'bijlage offerte' (Arnoud) moeten leggen.
  • +
  • Waarom blijven liggen? Nuttig document toch!?
  • +
  • Veel DSO-taal, hoewel idee toch voor alle informatiemodellen geldt?
  • +
+

Geonovum Technisch register (2019)

+
    +
  • Bevat Drie Documenten
  • +
  • Niet allemaal even compleet
  • +
  • Heel inhoudelijk van aard, weinig extra uitleg
  • +
  • Missschien ook prima
  • +
  • Deels in Nederlands, deels in Engels
  • +
+

Publiceren van het IMGeluid EAP-bestand

+
    +
  • Heel nuttig!
  • +
  • Verwijst naar wijzigingsprotocol IMGeluid (ook breed nuttig)
  • +
  • Herinnert mij aan doc. Pano: versionering
  • +
  • Noemt 'beheerhandboek' (BOMOS?), is ook relevant voor modelleur. Grensgeval scope?
  • +
  • Bevat ook SVN, bestaat ook GitHub handleiding van
  • +
  • Handmatig XSD bewerken: o.a. imvertor ns verwijderen, hoorde ik ook bij BRO. Terugkoppelen naar Arjan?
  • +
  • Worden ook tools genoemd:
      +
    • XML editor voor validatie
    • +
    • W3C Markup Validation Service
    • +
    +
  • +
+

Installatie SVN

+
    +
  • Actueel
  • +
  • Volledig
  • +
+

Importeren van een bestaand SVN-project in EA

+
    +
  • Actueel
  • +
  • Volledig
  • +
+
+

Note +Overzicht verder aanvullen

+

Note +Relevante passages uit Model Driven Design documentatie VNG-realisatie. In het algemeen heel mooi dat alles netjes bij elkaar staat: begrippen, werkomgeving en werkwijze:

+
+
    +
  • Sectie 1: EA Toolpack installeren
  • +
  • Sectie 5: Gebruik van datatypes
  • +
  • Sectie 5: Technieken en handigheidjes
  • +
  • Sectie 5: Naamgevingsconventies (het hebben hiervan!)
  • +
  • Sectie 8: Veel voorkomende fouten (het hebben hiervan!)
  • +
+
+
+ + + + + + + + + + + + diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 0000000..e85006a Binary files /dev/null and b/img/favicon.ico differ diff --git a/img/grid.png b/img/grid.png new file mode 100644 index 0000000..878c3ed Binary files /dev/null and b/img/grid.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..a96c4ec --- /dev/null +++ b/index.html @@ -0,0 +1,389 @@ + + + + + + + + + + + Welkom - Geonovum tooling + + + + + + + + + + + +
+
+
+
+ +

Welkom

+

Welkom bij de beschrijving van de Geonovum Werkwijze. Deze helpfiles beschrijven +welke tools we gebruiken voor het maken en beheren van de standaarden van +Geonovum. Deze tools staan in onderstaand overzicht. Daaronder staat de +publicatieomgeving van Geonovum beschreven.

+

Geonovum tooling

+ +

Voor licenties of de interne beheerder van de tooling kun je terecht op +intranet

+

Documentatie elders

+

De documentatie van de werkwijze is niet alleen hier vastgelegd. Links naar +andere documenten:

+ +

Geonovum publicatieomgeving

+

Verschillende onderdelen van standaarden worden op verschillende plaatsen +gepubliceerd. De publicatieomgeving ziet er als volgt uit

+

Architectuurplaatje

+

Documenten (docs.geostandaarden.nl)

+

Standaarden en technische documentatie. Voor een nette lijst van pubdomains op +docs.geostandaarden.nl moet de de volgende lijst up-to-date zijn: +pubDomainList.json

+

Het Technisch Register (register.geostandaarden.nl)

+

Technische onderdelen van de standaard worden op: +register.geostandaarden.nl gezet. Hoe je +dit met een webhook kan doen staat beschreven in: +technisch-register-2019

+

Ontologieën (begrippen.geostandaarden.nl)

+

Conceptenbibliotheek (definities.geostandaarden.nl)

+

MkDocs voor deze handleiding

+

De handleiding wordt beheerd in MkDocs. Dit is een +lichtgewicht tool die een collectie Markdown handleidingen omzet in een +navigeerbare handleiding. De handleiding staat op +github pages. De +bronbestanden staan in: +handleiding-tooling.

+

Je kunt mkdocs ook lokaal installeren. Dan kun je live je edits volgen in je +browser: http://127.0.0.1:8000/ met het commando:

+
mkdocs serve
+
+
+
+ + + + + + + + + + + + diff --git a/js/base.js b/js/base.js new file mode 100644 index 0000000..b0f4726 --- /dev/null +++ b/js/base.js @@ -0,0 +1,283 @@ +function getSearchTerm() { + var sPageURL = window.location.search.substring(1); + var sURLVariables = sPageURL.split('&'); + for (var i = 0; i < sURLVariables.length; i++) { + var sParameterName = sURLVariables[i].split('='); + if (sParameterName[0] == 'q') { + return sParameterName[1]; + } + } +} + +function applyTopPadding() { + // Update various absolute positions to match where the main container + // starts. This is necessary for handling multi-line nav headers, since + // that pushes the main container down. + var offset = $('body > .container').offset(); + $('html').css('scroll-padding-top', offset.top + 'px'); + $('.bs-sidebar.affix').css('top', offset.top + 'px'); +} + +$(document).ready(function() { + + applyTopPadding(); + + var search_term = getSearchTerm(), + $search_modal = $('#mkdocs_search_modal'), + $keyboard_modal = $('#mkdocs_keyboard_modal'); + + if (search_term) { + $search_modal.modal(); + } + + // make sure search input gets autofocus every time modal opens. + $search_modal.on('shown.bs.modal', function() { + $search_modal.find('#mkdocs-search-query').focus(); + }); + + // Close search modal when result is selected + // The links get added later so listen to parent + $('#mkdocs-search-results').click(function(e) { + if ($(e.target).is('a')) { + $search_modal.modal('hide'); + } + }); + + // Populate keyboard modal with proper Keys + $keyboard_modal.find('.help.shortcut kbd')[0].innerHTML = keyCodes[shortcuts.help]; + $keyboard_modal.find('.prev.shortcut kbd')[0].innerHTML = keyCodes[shortcuts.previous]; + $keyboard_modal.find('.next.shortcut kbd')[0].innerHTML = keyCodes[shortcuts.next]; + $keyboard_modal.find('.search.shortcut kbd')[0].innerHTML = keyCodes[shortcuts.search]; + + // Keyboard navigation + document.addEventListener("keydown", function(e) { + if ($(e.target).is(':input')) return true; + var key = e.which || e.keyCode || window.event && window.event.keyCode; + var page; + switch (key) { + case shortcuts.next: + page = $('.navbar a[rel="next"]:first').prop('href'); + break; + case shortcuts.previous: + page = $('.navbar a[rel="prev"]:first').prop('href'); + break; + case shortcuts.search: + e.preventDefault(); + $keyboard_modal.modal('hide'); + $search_modal.modal('show'); + $search_modal.find('#mkdocs-search-query').focus(); + break; + case shortcuts.help: + $search_modal.modal('hide'); + $keyboard_modal.modal('show'); + break; + default: break; + } + if (page) { + $keyboard_modal.modal('hide'); + window.location.href = page; + } + }); + + $('table').addClass('table table-striped table-hover'); + + // Improve the scrollspy behaviour when users click on a TOC item. + $(".bs-sidenav a").on("click", function() { + var clicked = this; + setTimeout(function() { + var active = $('.nav li.active a'); + active = active[active.length - 1]; + if (clicked !== active) { + $(active).parent().removeClass("active"); + $(clicked).parent().addClass("active"); + } + }, 50); + }); + + function showInnerDropdown(item) { + var popup = $(item).next('.dropdown-menu'); + popup.addClass('show'); + $(item).addClass('open'); + + // First, close any sibling dropdowns. + var container = $(item).parent().parent(); + container.find('> .dropdown-submenu > a').each(function(i, el) { + if (el !== item) { + hideInnerDropdown(el); + } + }); + + var popupMargin = 10; + var maxBottom = $(window).height() - popupMargin; + var bounds = item.getBoundingClientRect(); + + popup.css('left', bounds.right + 'px'); + if (bounds.top + popup.height() > maxBottom && + bounds.top > $(window).height() / 2) { + popup.css({ + 'top': (bounds.bottom - popup.height()) + 'px', + 'max-height': (bounds.bottom - popupMargin) + 'px', + }); + } else { + popup.css({ + 'top': bounds.top + 'px', + 'max-height': (maxBottom - bounds.top) + 'px', + }); + } + } + + function hideInnerDropdown(item) { + var popup = $(item).next('.dropdown-menu'); + popup.removeClass('show'); + $(item).removeClass('open'); + + popup.scrollTop(0); + popup.find('.dropdown-menu').scrollTop(0).removeClass('show'); + popup.find('.dropdown-submenu > a').removeClass('open'); + } + + $('.dropdown-submenu > a').on('click', function(e) { + if ($(this).next('.dropdown-menu').hasClass('show')) { + hideInnerDropdown(this); + } else { + showInnerDropdown(this); + } + + e.stopPropagation(); + e.preventDefault(); + }); + + $('.dropdown-menu').parent().on('hide.bs.dropdown', function(e) { + $(this).find('.dropdown-menu').scrollTop(0); + $(this).find('.dropdown-submenu > a').removeClass('open'); + $(this).find('.dropdown-menu .dropdown-menu').removeClass('show'); + }); +}); + +$(window).on('resize', applyTopPadding); + +$('body').scrollspy({ + target: '.bs-sidebar', + offset: 100 +}); + +/* Prevent disabled links from causing a page reload */ +$("li.disabled a").click(function() { + event.preventDefault(); +}); + +// See https://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes +// We only list common keys below. Obscure keys are omitted and their use is discouraged. +var keyCodes = { + 8: 'backspace', + 9: 'tab', + 13: 'enter', + 16: 'shift', + 17: 'ctrl', + 18: 'alt', + 19: 'pause/break', + 20: 'caps lock', + 27: 'escape', + 32: 'spacebar', + 33: 'page up', + 34: 'page down', + 35: 'end', + 36: 'home', + 37: '←', + 38: '↑', + 39: '→', + 40: '↓', + 45: 'insert', + 46: 'delete', + 48: '0', + 49: '1', + 50: '2', + 51: '3', + 52: '4', + 53: '5', + 54: '6', + 55: '7', + 56: '8', + 57: '9', + 65: 'a', + 66: 'b', + 67: 'c', + 68: 'd', + 69: 'e', + 70: 'f', + 71: 'g', + 72: 'h', + 73: 'i', + 74: 'j', + 75: 'k', + 76: 'l', + 77: 'm', + 78: 'n', + 79: 'o', + 80: 'p', + 81: 'q', + 82: 'r', + 83: 's', + 84: 't', + 85: 'u', + 86: 'v', + 87: 'w', + 88: 'x', + 89: 'y', + 90: 'z', + 91: 'Left Windows Key / Left ⌘', + 92: 'Right Windows Key', + 93: 'Windows Menu / Right ⌘', + 96: 'numpad 0', + 97: 'numpad 1', + 98: 'numpad 2', + 99: 'numpad 3', + 100: 'numpad 4', + 101: 'numpad 5', + 102: 'numpad 6', + 103: 'numpad 7', + 104: 'numpad 8', + 105: 'numpad 9', + 106: 'multiply', + 107: 'add', + 109: 'subtract', + 110: 'decimal point', + 111: 'divide', + 112: 'f1', + 113: 'f2', + 114: 'f3', + 115: 'f4', + 116: 'f5', + 117: 'f6', + 118: 'f7', + 119: 'f8', + 120: 'f9', + 121: 'f10', + 122: 'f11', + 123: 'f12', + 124: 'f13', + 125: 'f14', + 126: 'f15', + 127: 'f16', + 128: 'f17', + 129: 'f18', + 130: 'f19', + 131: 'f20', + 132: 'f21', + 133: 'f22', + 134: 'f23', + 135: 'f24', + 144: 'num lock', + 145: 'scroll lock', + 186: ';', + 187: '=', + 188: ',', + 189: '‐', + 190: '.', + 191: '?', + 192: '`', + 219: '[', + 220: '\', + 221: ']', + 222: ''', +}; diff --git a/js/bootstrap.min.js b/js/bootstrap.min.js new file mode 100644 index 0000000..ca013b7 --- /dev/null +++ b/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:''}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 + +
Creatie / Ontwikkeling
Creatie / Ontwikkeling
Adoptie
Adoptie
Introductiefase
Introductiefase
Implementatie / groei
Implementatie / groei
Volwaardige
 toepassing
[Not supported by viewer]
Uitfaseren
Uitfaseren
Tijd
Tijd
\ No newline at end of file diff --git a/media/GML-geometrie.png b/media/GML-geometrie.png new file mode 100644 index 0000000..b986757 Binary files /dev/null and b/media/GML-geometrie.png differ diff --git a/media/Geonovum-algemeen.png b/media/Geonovum-algemeen.png new file mode 100644 index 0000000..32c15f7 Binary files /dev/null and b/media/Geonovum-algemeen.png differ diff --git a/media/MIM-toolbox.png b/media/MIM-toolbox.png new file mode 100644 index 0000000..a52e929 Binary files /dev/null and b/media/MIM-toolbox.png differ diff --git a/media/MIM11.png b/media/MIM11.png new file mode 100644 index 0000000..9530687 Binary files /dev/null and b/media/MIM11.png differ diff --git a/media/PackageControlOptions.png b/media/PackageControlOptions.png new file mode 100644 index 0000000..3e852bd Binary files /dev/null and b/media/PackageControlOptions.png differ diff --git a/media/PackageOverview.png b/media/PackageOverview.png new file mode 100644 index 0000000..92baa19 Binary files /dev/null and b/media/PackageOverview.png differ diff --git a/media/ReSpec-definitie.png b/media/ReSpec-definitie.png new file mode 100644 index 0000000..395daf1 Binary files /dev/null and b/media/ReSpec-definitie.png differ diff --git a/media/VersionControlSettings.png b/media/VersionControlSettings.png new file mode 100644 index 0000000..c7b043a Binary files /dev/null and b/media/VersionControlSettings.png differ diff --git a/media/image1.jpeg b/media/image1.jpeg new file mode 100644 index 0000000..3ff06ec Binary files /dev/null and b/media/image1.jpeg differ diff --git a/media/image10.png b/media/image10.png new file mode 100644 index 0000000..d2e31c7 Binary files /dev/null and b/media/image10.png differ diff --git a/media/image11.png b/media/image11.png new file mode 100644 index 0000000..9e1970e Binary files /dev/null and b/media/image11.png differ diff --git a/media/image12.png b/media/image12.png new file mode 100644 index 0000000..4fb65b2 Binary files /dev/null and b/media/image12.png differ diff --git a/media/image13.png b/media/image13.png new file mode 100644 index 0000000..04bedcb Binary files /dev/null and b/media/image13.png differ diff --git a/media/image14.png b/media/image14.png new file mode 100644 index 0000000..de9ff73 Binary files /dev/null and b/media/image14.png differ diff --git a/media/image15.png b/media/image15.png new file mode 100644 index 0000000..20dda2c Binary files /dev/null and b/media/image15.png differ diff --git a/media/image16.png b/media/image16.png new file mode 100644 index 0000000..277867d Binary files /dev/null and b/media/image16.png differ diff --git a/media/image17.png b/media/image17.png new file mode 100644 index 0000000..30054b0 Binary files /dev/null and b/media/image17.png differ diff --git a/media/image18.png b/media/image18.png new file mode 100644 index 0000000..4e23708 Binary files /dev/null and b/media/image18.png differ diff --git a/media/image19.png b/media/image19.png new file mode 100644 index 0000000..821e7d2 Binary files /dev/null and b/media/image19.png differ diff --git a/media/image2.png b/media/image2.png new file mode 100644 index 0000000..6570578 Binary files /dev/null and b/media/image2.png differ diff --git a/media/image20.png b/media/image20.png new file mode 100644 index 0000000..32192f9 Binary files /dev/null and b/media/image20.png differ diff --git a/media/image22.png b/media/image22.png new file mode 100644 index 0000000..05792c9 Binary files /dev/null and b/media/image22.png differ diff --git a/media/image23.png b/media/image23.png new file mode 100644 index 0000000..17df6b6 Binary files /dev/null and b/media/image23.png differ diff --git a/media/image24.png b/media/image24.png new file mode 100644 index 0000000..a555b4c Binary files /dev/null and b/media/image24.png differ diff --git a/media/image25.png b/media/image25.png new file mode 100644 index 0000000..1cc8c0e Binary files /dev/null and b/media/image25.png differ diff --git a/media/image26.png b/media/image26.png new file mode 100644 index 0000000..c602f6f Binary files /dev/null and b/media/image26.png differ diff --git a/media/image27.png b/media/image27.png new file mode 100644 index 0000000..cf350b9 Binary files /dev/null and b/media/image27.png differ diff --git a/media/image28.png b/media/image28.png new file mode 100644 index 0000000..1fad71c Binary files /dev/null and b/media/image28.png differ diff --git a/media/image29.png b/media/image29.png new file mode 100644 index 0000000..538ffa0 Binary files /dev/null and b/media/image29.png differ diff --git a/media/image3.png b/media/image3.png new file mode 100644 index 0000000..8bd11d5 Binary files /dev/null and b/media/image3.png differ diff --git a/media/image30.png b/media/image30.png new file mode 100644 index 0000000..5b2f0ef Binary files /dev/null and b/media/image30.png differ diff --git a/media/image31.png b/media/image31.png new file mode 100644 index 0000000..7fe4787 Binary files /dev/null and b/media/image31.png differ diff --git a/media/image32.png b/media/image32.png new file mode 100644 index 0000000..c9b4204 Binary files /dev/null and b/media/image32.png differ diff --git a/media/image33.png b/media/image33.png new file mode 100644 index 0000000..2afd454 Binary files /dev/null and b/media/image33.png differ diff --git a/media/image34.jpeg b/media/image34.jpeg new file mode 100644 index 0000000..7d74a52 Binary files /dev/null and b/media/image34.jpeg differ diff --git a/media/image4.png b/media/image4.png new file mode 100644 index 0000000..81bfb27 Binary files /dev/null and b/media/image4.png differ diff --git a/media/image5.png b/media/image5.png new file mode 100644 index 0000000..f9feb12 Binary files /dev/null and b/media/image5.png differ diff --git a/media/image6.png b/media/image6.png new file mode 100644 index 0000000..5f9221c Binary files /dev/null and b/media/image6.png differ diff --git a/media/image7.png b/media/image7.png new file mode 100644 index 0000000..9a66b59 Binary files /dev/null and b/media/image7.png differ diff --git a/media/image8.png b/media/image8.png new file mode 100644 index 0000000..2b74713 Binary files /dev/null and b/media/image8.png differ diff --git a/media/image9.png b/media/image9.png new file mode 100644 index 0000000..3824bba Binary files /dev/null and b/media/image9.png differ diff --git a/media/mim_create_diagram_profiel.jpg b/media/mim_create_diagram_profiel.jpg new file mode 100644 index 0000000..1dc8411 Binary files /dev/null and b/media/mim_create_diagram_profiel.jpg differ diff --git a/media/mim_create_diagram_profiel_model.jpg b/media/mim_create_diagram_profiel_model.jpg new file mode 100644 index 0000000..09cbccc Binary files /dev/null and b/media/mim_create_diagram_profiel_model.jpg differ diff --git a/media/mim_diagram_create.jpg b/media/mim_diagram_create.jpg new file mode 100644 index 0000000..a006b6f Binary files /dev/null and b/media/mim_diagram_create.jpg differ diff --git a/media/mim_diagram_final_check.jpg b/media/mim_diagram_final_check.jpg new file mode 100644 index 0000000..ddcac2b Binary files /dev/null and b/media/mim_diagram_final_check.jpg differ diff --git a/media/mim_diagram_find_mim.jpg b/media/mim_diagram_find_mim.jpg new file mode 100644 index 0000000..dbba9e5 Binary files /dev/null and b/media/mim_diagram_find_mim.jpg differ diff --git a/media/mim_diagram_select_diagram.jpg b/media/mim_diagram_select_diagram.jpg new file mode 100644 index 0000000..1f872e1 Binary files /dev/null and b/media/mim_diagram_select_diagram.jpg differ diff --git a/media/mim_diagram_select_tech.jpg b/media/mim_diagram_select_tech.jpg new file mode 100644 index 0000000..59e4eba Binary files /dev/null and b/media/mim_diagram_select_tech.jpg differ diff --git a/media/mim_diagram_toolbox_menu.jpg b/media/mim_diagram_toolbox_menu.jpg new file mode 100644 index 0000000..75b61a9 Binary files /dev/null and b/media/mim_diagram_toolbox_menu.jpg differ diff --git a/media/mim_import_choose_type.jpg b/media/mim_import_choose_type.jpg new file mode 100644 index 0000000..f598085 Binary files /dev/null and b/media/mim_import_choose_type.jpg differ diff --git a/media/mim_import_find_mdg_tech.jpg b/media/mim_import_find_mdg_tech.jpg new file mode 100644 index 0000000..46452da Binary files /dev/null and b/media/mim_import_find_mdg_tech.jpg differ diff --git a/media/mim_import_find_resources.jpg b/media/mim_import_find_resources.jpg new file mode 100644 index 0000000..9966fbf Binary files /dev/null and b/media/mim_import_find_resources.jpg differ diff --git a/media/mim_import_to_model.jpg b/media/mim_import_to_model.jpg new file mode 100644 index 0000000..f209119 Binary files /dev/null and b/media/mim_import_to_model.jpg differ diff --git a/media/mim_import_to_model_succesful.jpg b/media/mim_import_to_model_succesful.jpg new file mode 100644 index 0000000..dca1840 Binary files /dev/null and b/media/mim_import_to_model_succesful.jpg differ diff --git a/media/mim_mdg_gen_tech.jpg b/media/mim_mdg_gen_tech.jpg new file mode 100644 index 0000000..74099b1 Binary files /dev/null and b/media/mim_mdg_gen_tech.jpg differ diff --git a/media/mim_mdg_select_package.jpg b/media/mim_mdg_select_package.jpg new file mode 100644 index 0000000..303e619 Binary files /dev/null and b/media/mim_mdg_select_package.jpg differ diff --git a/media/mim_mdg_tech_1.jpg b/media/mim_mdg_tech_1.jpg new file mode 100644 index 0000000..146c4bf Binary files /dev/null and b/media/mim_mdg_tech_1.jpg differ diff --git a/media/mim_mdg_tech_2.jpg b/media/mim_mdg_tech_2.jpg new file mode 100644 index 0000000..d2ac232 Binary files /dev/null and b/media/mim_mdg_tech_2.jpg differ diff --git a/media/mim_mdg_tech_3.jpg b/media/mim_mdg_tech_3.jpg new file mode 100644 index 0000000..d2cc656 Binary files /dev/null and b/media/mim_mdg_tech_3.jpg differ diff --git a/media/mim_mdg_tech_4.jpg b/media/mim_mdg_tech_4.jpg new file mode 100644 index 0000000..b9c8f51 Binary files /dev/null and b/media/mim_mdg_tech_4.jpg differ diff --git a/media/mim_mdg_tech_5.jpg b/media/mim_mdg_tech_5.jpg new file mode 100644 index 0000000..2114dea Binary files /dev/null and b/media/mim_mdg_tech_5.jpg differ diff --git a/media/mim_mdg_tech_6.jpg b/media/mim_mdg_tech_6.jpg new file mode 100644 index 0000000..6fabae1 Binary files /dev/null and b/media/mim_mdg_tech_6.jpg differ diff --git a/media/mim_modelelement_versienummer.jpg b/media/mim_modelelement_versienummer.jpg new file mode 100644 index 0000000..063b8d8 Binary files /dev/null and b/media/mim_modelelement_versienummer.jpg differ diff --git a/media/mim_profile_benodigde_profielen.jpg b/media/mim_profile_benodigde_profielen.jpg new file mode 100644 index 0000000..eabc314 Binary files /dev/null and b/media/mim_profile_benodigde_profielen.jpg differ diff --git a/media/mim_profile_mts_and_csv_file_location.jpg b/media/mim_profile_mts_and_csv_file_location.jpg new file mode 100644 index 0000000..3e03e6c Binary files /dev/null and b/media/mim_profile_mts_and_csv_file_location.jpg differ diff --git a/media/mim_profile_prefix_check.jpg b/media/mim_profile_prefix_check.jpg new file mode 100644 index 0000000..05e26f3 Binary files /dev/null and b/media/mim_profile_prefix_check.jpg differ diff --git a/media/mim_profile_publish_as_uml_settings.jpg b/media/mim_profile_publish_as_uml_settings.jpg new file mode 100644 index 0000000..39fb20e Binary files /dev/null and b/media/mim_profile_publish_as_uml_settings.jpg differ diff --git a/media/mim_profile_quick_linker_location.jpg b/media/mim_profile_quick_linker_location.jpg new file mode 100644 index 0000000..16529b6 Binary files /dev/null and b/media/mim_profile_quick_linker_location.jpg differ diff --git a/media/mim_publish_as_UML_or_MDG.jpg b/media/mim_publish_as_UML_or_MDG.jpg new file mode 100644 index 0000000..a8ed7b7 Binary files /dev/null and b/media/mim_publish_as_UML_or_MDG.jpg differ diff --git a/media/mim_ql_column_e.jpg b/media/mim_ql_column_e.jpg new file mode 100644 index 0000000..c4c7b4d Binary files /dev/null and b/media/mim_ql_column_e.jpg differ diff --git a/media/mim_ql_connect_elements.jpg b/media/mim_ql_connect_elements.jpg new file mode 100644 index 0000000..4d3f467 Binary files /dev/null and b/media/mim_ql_connect_elements.jpg differ diff --git a/media/mim_ql_create_multiple.jpg b/media/mim_ql_create_multiple.jpg new file mode 100644 index 0000000..3481c01 Binary files /dev/null and b/media/mim_ql_create_multiple.jpg differ diff --git a/media/mim_ql_define_multiple.jpg b/media/mim_ql_define_multiple.jpg new file mode 100644 index 0000000..ef33b20 Binary files /dev/null and b/media/mim_ql_define_multiple.jpg differ diff --git a/media/mim_ql_draw_relation.jpg b/media/mim_ql_draw_relation.jpg new file mode 100644 index 0000000..1bcd157 Binary files /dev/null and b/media/mim_ql_draw_relation.jpg differ diff --git a/media/mim_ql_generalization.jpg b/media/mim_ql_generalization.jpg new file mode 100644 index 0000000..3bf4d73 Binary files /dev/null and b/media/mim_ql_generalization.jpg differ diff --git a/media/mim_ql_icon.jpg b/media/mim_ql_icon.jpg new file mode 100644 index 0000000..dc55025 Binary files /dev/null and b/media/mim_ql_icon.jpg differ diff --git a/media/mim_ql_in_browser.jpg b/media/mim_ql_in_browser.jpg new file mode 100644 index 0000000..dd8415e Binary files /dev/null and b/media/mim_ql_in_browser.jpg differ diff --git a/media/mim_ql_linked_doc.jpg b/media/mim_ql_linked_doc.jpg new file mode 100644 index 0000000..6651316 Binary files /dev/null and b/media/mim_ql_linked_doc.jpg differ diff --git a/media/mim_ql_result_multiple.jpg b/media/mim_ql_result_multiple.jpg new file mode 100644 index 0000000..68ce581 Binary files /dev/null and b/media/mim_ql_result_multiple.jpg differ diff --git a/media/mim_relatierol_name.jpg b/media/mim_relatierol_name.jpg new file mode 100644 index 0000000..22f3b9c Binary files /dev/null and b/media/mim_relatierol_name.jpg differ diff --git a/media/mim_relatierol_sync_menu.jpg b/media/mim_relatierol_sync_menu.jpg new file mode 100644 index 0000000..21da943 Binary files /dev/null and b/media/mim_relatierol_sync_menu.jpg differ diff --git a/media/mim_relatierol_sync_saved.jpg b/media/mim_relatierol_sync_saved.jpg new file mode 100644 index 0000000..2422db3 Binary files /dev/null and b/media/mim_relatierol_sync_saved.jpg differ diff --git a/media/mim_relatierol_sync_select.jpg b/media/mim_relatierol_sync_select.jpg new file mode 100644 index 0000000..d1b6fe4 Binary files /dev/null and b/media/mim_relatierol_sync_select.jpg differ diff --git a/media/mim_relatierol_target_menu.jpg b/media/mim_relatierol_target_menu.jpg new file mode 100644 index 0000000..f8e57d0 Binary files /dev/null and b/media/mim_relatierol_target_menu.jpg differ diff --git a/media/mim_versionnr_elements_result.jpg b/media/mim_versionnr_elements_result.jpg new file mode 100644 index 0000000..c6c7c30 Binary files /dev/null and b/media/mim_versionnr_elements_result.jpg differ diff --git a/media/mim_versionnr_toolbox_stereo_types.jpg b/media/mim_versionnr_toolbox_stereo_types.jpg new file mode 100644 index 0000000..bbfd356 Binary files /dev/null and b/media/mim_versionnr_toolbox_stereo_types.jpg differ diff --git a/media/mim_versionnr_toolbox_stereo_types_check.jpg b/media/mim_versionnr_toolbox_stereo_types_check.jpg new file mode 100644 index 0000000..d9532cc Binary files /dev/null and b/media/mim_versionnr_toolbox_stereo_types_check.jpg differ diff --git a/media/mim_versionnr_toolbox_stereo_types_result.jpg b/media/mim_versionnr_toolbox_stereo_types_result.jpg new file mode 100644 index 0000000..346780b Binary files /dev/null and b/media/mim_versionnr_toolbox_stereo_types_result.jpg differ diff --git a/media/ontologie_voorbeeld_imxgeo_bouwerk.png b/media/ontologie_voorbeeld_imxgeo_bouwerk.png new file mode 100644 index 0000000..79c2afd Binary files /dev/null and b/media/ontologie_voorbeeld_imxgeo_bouwerk.png differ diff --git a/media/svn_checkout.png b/media/svn_checkout.png new file mode 100644 index 0000000..3073c4d Binary files /dev/null and b/media/svn_checkout.png differ diff --git a/media/svn_configure_project_vc.jpg b/media/svn_configure_project_vc.jpg new file mode 100644 index 0000000..1a182a1 Binary files /dev/null and b/media/svn_configure_project_vc.jpg differ diff --git a/media/svn_get_all_latest.png b/media/svn_get_all_latest.png new file mode 100644 index 0000000..a18afd5 Binary files /dev/null and b/media/svn_get_all_latest.png differ diff --git a/media/svn_get_all_latest_window.png b/media/svn_get_all_latest_window.png new file mode 100644 index 0000000..d066cba Binary files /dev/null and b/media/svn_get_all_latest_window.png differ diff --git a/media/svn_get_latest_force_reload.png b/media/svn_get_latest_force_reload.png new file mode 100644 index 0000000..d5851f6 Binary files /dev/null and b/media/svn_get_latest_force_reload.png differ diff --git a/media/svn_get_package.png b/media/svn_get_package.png new file mode 100644 index 0000000..aaade98 Binary files /dev/null and b/media/svn_get_package.png differ diff --git a/media/svn_get_shared_file.png b/media/svn_get_shared_file.png new file mode 100644 index 0000000..b8ebc2a Binary files /dev/null and b/media/svn_get_shared_file.png differ diff --git a/media/svn_packagecontrol.jpg b/media/svn_packagecontrol.jpg new file mode 100644 index 0000000..9f9d14c Binary files /dev/null and b/media/svn_packagecontrol.jpg differ diff --git a/media/svn_pcsettings_create_new.png b/media/svn_pcsettings_create_new.png new file mode 100644 index 0000000..c6ab0f2 Binary files /dev/null and b/media/svn_pcsettings_create_new.png differ diff --git a/media/svn_vcsettings.png b/media/svn_vcsettings.png new file mode 100644 index 0000000..d489a5f Binary files /dev/null and b/media/svn_vcsettings.png differ diff --git a/media/svncheckout.png b/media/svncheckout.png new file mode 100644 index 0000000..e53d549 Binary files /dev/null and b/media/svncheckout.png differ diff --git a/search/lunr.js b/search/lunr.js new file mode 100644 index 0000000..aca0a16 --- /dev/null +++ b/search/lunr.js @@ -0,0 +1,3475 @@ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + */ + +;(function(){ + +/** + * A convenience function for configuring and constructing + * a new lunr Index. + * + * A lunr.Builder instance is created and the pipeline setup + * with a trimmer, stop word filter and stemmer. + * + * This builder object is yielded to the configuration function + * that is passed as a parameter, allowing the list of fields + * and other builder parameters to be customised. + * + * All documents _must_ be added within the passed config function. + * + * @example + * var idx = lunr(function () { + * this.field('title') + * this.field('body') + * this.ref('id') + * + * documents.forEach(function (doc) { + * this.add(doc) + * }, this) + * }) + * + * @see {@link lunr.Builder} + * @see {@link lunr.Pipeline} + * @see {@link lunr.trimmer} + * @see {@link lunr.stopWordFilter} + * @see {@link lunr.stemmer} + * @namespace {function} lunr + */ +var lunr = function (config) { + var builder = new lunr.Builder + + builder.pipeline.add( + lunr.trimmer, + lunr.stopWordFilter, + lunr.stemmer + ) + + builder.searchPipeline.add( + lunr.stemmer + ) + + config.call(builder, builder) + return builder.build() +} + +lunr.version = "2.3.9" +/*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A namespace containing utils for the rest of the lunr library + * @namespace lunr.utils + */ +lunr.utils = {} + +/** + * Print a warning message to the console. + * + * @param {String} message The message to be printed. + * @memberOf lunr.utils + * @function + */ +lunr.utils.warn = (function (global) { + /* eslint-disable no-console */ + return function (message) { + if (global.console && console.warn) { + console.warn(message) + } + } + /* eslint-enable no-console */ +})(this) + +/** + * Convert an object to a string. + * + * In the case of `null` and `undefined` the function returns + * the empty string, in all other cases the result of calling + * `toString` on the passed object is returned. + * + * @param {Any} obj The object to convert to a string. + * @return {String} string representation of the passed object. + * @memberOf lunr.utils + */ +lunr.utils.asString = function (obj) { + if (obj === void 0 || obj === null) { + return "" + } else { + return obj.toString() + } +} + +/** + * Clones an object. + * + * Will create a copy of an existing object such that any mutations + * on the copy cannot affect the original. + * + * Only shallow objects are supported, passing a nested object to this + * function will cause a TypeError. + * + * Objects with primitives, and arrays of primitives are supported. + * + * @param {Object} obj The object to clone. + * @return {Object} a clone of the passed object. + * @throws {TypeError} when a nested object is passed. + * @memberOf Utils + */ +lunr.utils.clone = function (obj) { + if (obj === null || obj === undefined) { + return obj + } + + var clone = Object.create(null), + keys = Object.keys(obj) + + for (var i = 0; i < keys.length; i++) { + var key = keys[i], + val = obj[key] + + if (Array.isArray(val)) { + clone[key] = val.slice() + continue + } + + if (typeof val === 'string' || + typeof val === 'number' || + typeof val === 'boolean') { + clone[key] = val + continue + } + + throw new TypeError("clone is not deep and does not support nested objects") + } + + return clone +} +lunr.FieldRef = function (docRef, fieldName, stringValue) { + this.docRef = docRef + this.fieldName = fieldName + this._stringValue = stringValue +} + +lunr.FieldRef.joiner = "/" + +lunr.FieldRef.fromString = function (s) { + var n = s.indexOf(lunr.FieldRef.joiner) + + if (n === -1) { + throw "malformed field ref string" + } + + var fieldRef = s.slice(0, n), + docRef = s.slice(n + 1) + + return new lunr.FieldRef (docRef, fieldRef, s) +} + +lunr.FieldRef.prototype.toString = function () { + if (this._stringValue == undefined) { + this._stringValue = this.fieldName + lunr.FieldRef.joiner + this.docRef + } + + return this._stringValue +} +/*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A lunr set. + * + * @constructor + */ +lunr.Set = function (elements) { + this.elements = Object.create(null) + + if (elements) { + this.length = elements.length + + for (var i = 0; i < this.length; i++) { + this.elements[elements[i]] = true + } + } else { + this.length = 0 + } +} + +/** + * A complete set that contains all elements. + * + * @static + * @readonly + * @type {lunr.Set} + */ +lunr.Set.complete = { + intersect: function (other) { + return other + }, + + union: function () { + return this + }, + + contains: function () { + return true + } +} + +/** + * An empty set that contains no elements. + * + * @static + * @readonly + * @type {lunr.Set} + */ +lunr.Set.empty = { + intersect: function () { + return this + }, + + union: function (other) { + return other + }, + + contains: function () { + return false + } +} + +/** + * Returns true if this set contains the specified object. + * + * @param {object} object - Object whose presence in this set is to be tested. + * @returns {boolean} - True if this set contains the specified object. + */ +lunr.Set.prototype.contains = function (object) { + return !!this.elements[object] +} + +/** + * Returns a new set containing only the elements that are present in both + * this set and the specified set. + * + * @param {lunr.Set} other - set to intersect with this set. + * @returns {lunr.Set} a new set that is the intersection of this and the specified set. + */ + +lunr.Set.prototype.intersect = function (other) { + var a, b, elements, intersection = [] + + if (other === lunr.Set.complete) { + return this + } + + if (other === lunr.Set.empty) { + return other + } + + if (this.length < other.length) { + a = this + b = other + } else { + a = other + b = this + } + + elements = Object.keys(a.elements) + + for (var i = 0; i < elements.length; i++) { + var element = elements[i] + if (element in b.elements) { + intersection.push(element) + } + } + + return new lunr.Set (intersection) +} + +/** + * Returns a new set combining the elements of this and the specified set. + * + * @param {lunr.Set} other - set to union with this set. + * @return {lunr.Set} a new set that is the union of this and the specified set. + */ + +lunr.Set.prototype.union = function (other) { + if (other === lunr.Set.complete) { + return lunr.Set.complete + } + + if (other === lunr.Set.empty) { + return this + } + + return new lunr.Set(Object.keys(this.elements).concat(Object.keys(other.elements))) +} +/** + * A function to calculate the inverse document frequency for + * a posting. This is shared between the builder and the index + * + * @private + * @param {object} posting - The posting for a given term + * @param {number} documentCount - The total number of documents. + */ +lunr.idf = function (posting, documentCount) { + var documentsWithTerm = 0 + + for (var fieldName in posting) { + if (fieldName == '_index') continue // Ignore the term index, its not a field + documentsWithTerm += Object.keys(posting[fieldName]).length + } + + var x = (documentCount - documentsWithTerm + 0.5) / (documentsWithTerm + 0.5) + + return Math.log(1 + Math.abs(x)) +} + +/** + * A token wraps a string representation of a token + * as it is passed through the text processing pipeline. + * + * @constructor + * @param {string} [str=''] - The string token being wrapped. + * @param {object} [metadata={}] - Metadata associated with this token. + */ +lunr.Token = function (str, metadata) { + this.str = str || "" + this.metadata = metadata || {} +} + +/** + * Returns the token string that is being wrapped by this object. + * + * @returns {string} + */ +lunr.Token.prototype.toString = function () { + return this.str +} + +/** + * A token update function is used when updating or optionally + * when cloning a token. + * + * @callback lunr.Token~updateFunction + * @param {string} str - The string representation of the token. + * @param {Object} metadata - All metadata associated with this token. + */ + +/** + * Applies the given function to the wrapped string token. + * + * @example + * token.update(function (str, metadata) { + * return str.toUpperCase() + * }) + * + * @param {lunr.Token~updateFunction} fn - A function to apply to the token string. + * @returns {lunr.Token} + */ +lunr.Token.prototype.update = function (fn) { + this.str = fn(this.str, this.metadata) + return this +} + +/** + * Creates a clone of this token. Optionally a function can be + * applied to the cloned token. + * + * @param {lunr.Token~updateFunction} [fn] - An optional function to apply to the cloned token. + * @returns {lunr.Token} + */ +lunr.Token.prototype.clone = function (fn) { + fn = fn || function (s) { return s } + return new lunr.Token (fn(this.str, this.metadata), this.metadata) +} +/*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A function for splitting a string into tokens ready to be inserted into + * the search index. Uses `lunr.tokenizer.separator` to split strings, change + * the value of this property to change how strings are split into tokens. + * + * This tokenizer will convert its parameter to a string by calling `toString` and + * then will split this string on the character in `lunr.tokenizer.separator`. + * Arrays will have their elements converted to strings and wrapped in a lunr.Token. + * + * Optional metadata can be passed to the tokenizer, this metadata will be cloned and + * added as metadata to every token that is created from the object to be tokenized. + * + * @static + * @param {?(string|object|object[])} obj - The object to convert into tokens + * @param {?object} metadata - Optional metadata to associate with every token + * @returns {lunr.Token[]} + * @see {@link lunr.Pipeline} + */ +lunr.tokenizer = function (obj, metadata) { + if (obj == null || obj == undefined) { + return [] + } + + if (Array.isArray(obj)) { + return obj.map(function (t) { + return new lunr.Token( + lunr.utils.asString(t).toLowerCase(), + lunr.utils.clone(metadata) + ) + }) + } + + var str = obj.toString().toLowerCase(), + len = str.length, + tokens = [] + + for (var sliceEnd = 0, sliceStart = 0; sliceEnd <= len; sliceEnd++) { + var char = str.charAt(sliceEnd), + sliceLength = sliceEnd - sliceStart + + if ((char.match(lunr.tokenizer.separator) || sliceEnd == len)) { + + if (sliceLength > 0) { + var tokenMetadata = lunr.utils.clone(metadata) || {} + tokenMetadata["position"] = [sliceStart, sliceLength] + tokenMetadata["index"] = tokens.length + + tokens.push( + new lunr.Token ( + str.slice(sliceStart, sliceEnd), + tokenMetadata + ) + ) + } + + sliceStart = sliceEnd + 1 + } + + } + + return tokens +} + +/** + * The separator used to split a string into tokens. Override this property to change the behaviour of + * `lunr.tokenizer` behaviour when tokenizing strings. By default this splits on whitespace and hyphens. + * + * @static + * @see lunr.tokenizer + */ +lunr.tokenizer.separator = /[\s\-]+/ +/*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * lunr.Pipelines maintain an ordered list of functions to be applied to all + * tokens in documents entering the search index and queries being ran against + * the index. + * + * An instance of lunr.Index created with the lunr shortcut will contain a + * pipeline with a stop word filter and an English language stemmer. Extra + * functions can be added before or after either of these functions or these + * default functions can be removed. + * + * When run the pipeline will call each function in turn, passing a token, the + * index of that token in the original list of all tokens and finally a list of + * all the original tokens. + * + * The output of functions in the pipeline will be passed to the next function + * in the pipeline. To exclude a token from entering the index the function + * should return undefined, the rest of the pipeline will not be called with + * this token. + * + * For serialisation of pipelines to work, all functions used in an instance of + * a pipeline should be registered with lunr.Pipeline. Registered functions can + * then be loaded. If trying to load a serialised pipeline that uses functions + * that are not registered an error will be thrown. + * + * If not planning on serialising the pipeline then registering pipeline functions + * is not necessary. + * + * @constructor + */ +lunr.Pipeline = function () { + this._stack = [] +} + +lunr.Pipeline.registeredFunctions = Object.create(null) + +/** + * A pipeline function maps lunr.Token to lunr.Token. A lunr.Token contains the token + * string as well as all known metadata. A pipeline function can mutate the token string + * or mutate (or add) metadata for a given token. + * + * A pipeline function can indicate that the passed token should be discarded by returning + * null, undefined or an empty string. This token will not be passed to any downstream pipeline + * functions and will not be added to the index. + * + * Multiple tokens can be returned by returning an array of tokens. Each token will be passed + * to any downstream pipeline functions and all will returned tokens will be added to the index. + * + * Any number of pipeline functions may be chained together using a lunr.Pipeline. + * + * @interface lunr.PipelineFunction + * @param {lunr.Token} token - A token from the document being processed. + * @param {number} i - The index of this token in the complete list of tokens for this document/field. + * @param {lunr.Token[]} tokens - All tokens for this document/field. + * @returns {(?lunr.Token|lunr.Token[])} + */ + +/** + * Register a function with the pipeline. + * + * Functions that are used in the pipeline should be registered if the pipeline + * needs to be serialised, or a serialised pipeline needs to be loaded. + * + * Registering a function does not add it to a pipeline, functions must still be + * added to instances of the pipeline for them to be used when running a pipeline. + * + * @param {lunr.PipelineFunction} fn - The function to check for. + * @param {String} label - The label to register this function with + */ +lunr.Pipeline.registerFunction = function (fn, label) { + if (label in this.registeredFunctions) { + lunr.utils.warn('Overwriting existing registered function: ' + label) + } + + fn.label = label + lunr.Pipeline.registeredFunctions[fn.label] = fn +} + +/** + * Warns if the function is not registered as a Pipeline function. + * + * @param {lunr.PipelineFunction} fn - The function to check for. + * @private + */ +lunr.Pipeline.warnIfFunctionNotRegistered = function (fn) { + var isRegistered = fn.label && (fn.label in this.registeredFunctions) + + if (!isRegistered) { + lunr.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\n', fn) + } +} + +/** + * Loads a previously serialised pipeline. + * + * All functions to be loaded must already be registered with lunr.Pipeline. + * If any function from the serialised data has not been registered then an + * error will be thrown. + * + * @param {Object} serialised - The serialised pipeline to load. + * @returns {lunr.Pipeline} + */ +lunr.Pipeline.load = function (serialised) { + var pipeline = new lunr.Pipeline + + serialised.forEach(function (fnName) { + var fn = lunr.Pipeline.registeredFunctions[fnName] + + if (fn) { + pipeline.add(fn) + } else { + throw new Error('Cannot load unregistered function: ' + fnName) + } + }) + + return pipeline +} + +/** + * Adds new functions to the end of the pipeline. + * + * Logs a warning if the function has not been registered. + * + * @param {lunr.PipelineFunction[]} functions - Any number of functions to add to the pipeline. + */ +lunr.Pipeline.prototype.add = function () { + var fns = Array.prototype.slice.call(arguments) + + fns.forEach(function (fn) { + lunr.Pipeline.warnIfFunctionNotRegistered(fn) + this._stack.push(fn) + }, this) +} + +/** + * Adds a single function after a function that already exists in the + * pipeline. + * + * Logs a warning if the function has not been registered. + * + * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline. + * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline. + */ +lunr.Pipeline.prototype.after = function (existingFn, newFn) { + lunr.Pipeline.warnIfFunctionNotRegistered(newFn) + + var pos = this._stack.indexOf(existingFn) + if (pos == -1) { + throw new Error('Cannot find existingFn') + } + + pos = pos + 1 + this._stack.splice(pos, 0, newFn) +} + +/** + * Adds a single function before a function that already exists in the + * pipeline. + * + * Logs a warning if the function has not been registered. + * + * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline. + * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline. + */ +lunr.Pipeline.prototype.before = function (existingFn, newFn) { + lunr.Pipeline.warnIfFunctionNotRegistered(newFn) + + var pos = this._stack.indexOf(existingFn) + if (pos == -1) { + throw new Error('Cannot find existingFn') + } + + this._stack.splice(pos, 0, newFn) +} + +/** + * Removes a function from the pipeline. + * + * @param {lunr.PipelineFunction} fn The function to remove from the pipeline. + */ +lunr.Pipeline.prototype.remove = function (fn) { + var pos = this._stack.indexOf(fn) + if (pos == -1) { + return + } + + this._stack.splice(pos, 1) +} + +/** + * Runs the current list of functions that make up the pipeline against the + * passed tokens. + * + * @param {Array} tokens The tokens to run through the pipeline. + * @returns {Array} + */ +lunr.Pipeline.prototype.run = function (tokens) { + var stackLength = this._stack.length + + for (var i = 0; i < stackLength; i++) { + var fn = this._stack[i] + var memo = [] + + for (var j = 0; j < tokens.length; j++) { + var result = fn(tokens[j], j, tokens) + + if (result === null || result === void 0 || result === '') continue + + if (Array.isArray(result)) { + for (var k = 0; k < result.length; k++) { + memo.push(result[k]) + } + } else { + memo.push(result) + } + } + + tokens = memo + } + + return tokens +} + +/** + * Convenience method for passing a string through a pipeline and getting + * strings out. This method takes care of wrapping the passed string in a + * token and mapping the resulting tokens back to strings. + * + * @param {string} str - The string to pass through the pipeline. + * @param {?object} metadata - Optional metadata to associate with the token + * passed to the pipeline. + * @returns {string[]} + */ +lunr.Pipeline.prototype.runString = function (str, metadata) { + var token = new lunr.Token (str, metadata) + + return this.run([token]).map(function (t) { + return t.toString() + }) +} + +/** + * Resets the pipeline by removing any existing processors. + * + */ +lunr.Pipeline.prototype.reset = function () { + this._stack = [] +} + +/** + * Returns a representation of the pipeline ready for serialisation. + * + * Logs a warning if the function has not been registered. + * + * @returns {Array} + */ +lunr.Pipeline.prototype.toJSON = function () { + return this._stack.map(function (fn) { + lunr.Pipeline.warnIfFunctionNotRegistered(fn) + + return fn.label + }) +} +/*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A vector is used to construct the vector space of documents and queries. These + * vectors support operations to determine the similarity between two documents or + * a document and a query. + * + * Normally no parameters are required for initializing a vector, but in the case of + * loading a previously dumped vector the raw elements can be provided to the constructor. + * + * For performance reasons vectors are implemented with a flat array, where an elements + * index is immediately followed by its value. E.g. [index, value, index, value]. This + * allows the underlying array to be as sparse as possible and still offer decent + * performance when being used for vector calculations. + * + * @constructor + * @param {Number[]} [elements] - The flat list of element index and element value pairs. + */ +lunr.Vector = function (elements) { + this._magnitude = 0 + this.elements = elements || [] +} + + +/** + * Calculates the position within the vector to insert a given index. + * + * This is used internally by insert and upsert. If there are duplicate indexes then + * the position is returned as if the value for that index were to be updated, but it + * is the callers responsibility to check whether there is a duplicate at that index + * + * @param {Number} insertIdx - The index at which the element should be inserted. + * @returns {Number} + */ +lunr.Vector.prototype.positionForIndex = function (index) { + // For an empty vector the tuple can be inserted at the beginning + if (this.elements.length == 0) { + return 0 + } + + var start = 0, + end = this.elements.length / 2, + sliceLength = end - start, + pivotPoint = Math.floor(sliceLength / 2), + pivotIndex = this.elements[pivotPoint * 2] + + while (sliceLength > 1) { + if (pivotIndex < index) { + start = pivotPoint + } + + if (pivotIndex > index) { + end = pivotPoint + } + + if (pivotIndex == index) { + break + } + + sliceLength = end - start + pivotPoint = start + Math.floor(sliceLength / 2) + pivotIndex = this.elements[pivotPoint * 2] + } + + if (pivotIndex == index) { + return pivotPoint * 2 + } + + if (pivotIndex > index) { + return pivotPoint * 2 + } + + if (pivotIndex < index) { + return (pivotPoint + 1) * 2 + } +} + +/** + * Inserts an element at an index within the vector. + * + * Does not allow duplicates, will throw an error if there is already an entry + * for this index. + * + * @param {Number} insertIdx - The index at which the element should be inserted. + * @param {Number} val - The value to be inserted into the vector. + */ +lunr.Vector.prototype.insert = function (insertIdx, val) { + this.upsert(insertIdx, val, function () { + throw "duplicate index" + }) +} + +/** + * Inserts or updates an existing index within the vector. + * + * @param {Number} insertIdx - The index at which the element should be inserted. + * @param {Number} val - The value to be inserted into the vector. + * @param {function} fn - A function that is called for updates, the existing value and the + * requested value are passed as arguments + */ +lunr.Vector.prototype.upsert = function (insertIdx, val, fn) { + this._magnitude = 0 + var position = this.positionForIndex(insertIdx) + + if (this.elements[position] == insertIdx) { + this.elements[position + 1] = fn(this.elements[position + 1], val) + } else { + this.elements.splice(position, 0, insertIdx, val) + } +} + +/** + * Calculates the magnitude of this vector. + * + * @returns {Number} + */ +lunr.Vector.prototype.magnitude = function () { + if (this._magnitude) return this._magnitude + + var sumOfSquares = 0, + elementsLength = this.elements.length + + for (var i = 1; i < elementsLength; i += 2) { + var val = this.elements[i] + sumOfSquares += val * val + } + + return this._magnitude = Math.sqrt(sumOfSquares) +} + +/** + * Calculates the dot product of this vector and another vector. + * + * @param {lunr.Vector} otherVector - The vector to compute the dot product with. + * @returns {Number} + */ +lunr.Vector.prototype.dot = function (otherVector) { + var dotProduct = 0, + a = this.elements, b = otherVector.elements, + aLen = a.length, bLen = b.length, + aVal = 0, bVal = 0, + i = 0, j = 0 + + while (i < aLen && j < bLen) { + aVal = a[i], bVal = b[j] + if (aVal < bVal) { + i += 2 + } else if (aVal > bVal) { + j += 2 + } else if (aVal == bVal) { + dotProduct += a[i + 1] * b[j + 1] + i += 2 + j += 2 + } + } + + return dotProduct +} + +/** + * Calculates the similarity between this vector and another vector. + * + * @param {lunr.Vector} otherVector - The other vector to calculate the + * similarity with. + * @returns {Number} + */ +lunr.Vector.prototype.similarity = function (otherVector) { + return this.dot(otherVector) / this.magnitude() || 0 +} + +/** + * Converts the vector to an array of the elements within the vector. + * + * @returns {Number[]} + */ +lunr.Vector.prototype.toArray = function () { + var output = new Array (this.elements.length / 2) + + for (var i = 1, j = 0; i < this.elements.length; i += 2, j++) { + output[j] = this.elements[i] + } + + return output +} + +/** + * A JSON serializable representation of the vector. + * + * @returns {Number[]} + */ +lunr.Vector.prototype.toJSON = function () { + return this.elements +} +/* eslint-disable */ +/*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + */ + +/** + * lunr.stemmer is an english language stemmer, this is a JavaScript + * implementation of the PorterStemmer taken from http://tartarus.org/~martin + * + * @static + * @implements {lunr.PipelineFunction} + * @param {lunr.Token} token - The string to stem + * @returns {lunr.Token} + * @see {@link lunr.Pipeline} + * @function + */ +lunr.stemmer = (function(){ + var step2list = { + "ational" : "ate", + "tional" : "tion", + "enci" : "ence", + "anci" : "ance", + "izer" : "ize", + "bli" : "ble", + "alli" : "al", + "entli" : "ent", + "eli" : "e", + "ousli" : "ous", + "ization" : "ize", + "ation" : "ate", + "ator" : "ate", + "alism" : "al", + "iveness" : "ive", + "fulness" : "ful", + "ousness" : "ous", + "aliti" : "al", + "iviti" : "ive", + "biliti" : "ble", + "logi" : "log" + }, + + step3list = { + "icate" : "ic", + "ative" : "", + "alize" : "al", + "iciti" : "ic", + "ical" : "ic", + "ful" : "", + "ness" : "" + }, + + c = "[^aeiou]", // consonant + v = "[aeiouy]", // vowel + C = c + "[^aeiouy]*", // consonant sequence + V = v + "[aeiou]*", // vowel sequence + + mgr0 = "^(" + C + ")?" + V + C, // [C]VC... is m>0 + meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$", // [C]VC[V] is m=1 + mgr1 = "^(" + C + ")?" + V + C + V + C, // [C]VCVC... is m>1 + s_v = "^(" + C + ")?" + v; // vowel in stem + + var re_mgr0 = new RegExp(mgr0); + var re_mgr1 = new RegExp(mgr1); + var re_meq1 = new RegExp(meq1); + var re_s_v = new RegExp(s_v); + + var re_1a = /^(.+?)(ss|i)es$/; + var re2_1a = /^(.+?)([^s])s$/; + var re_1b = /^(.+?)eed$/; + var re2_1b = /^(.+?)(ed|ing)$/; + var re_1b_2 = /.$/; + var re2_1b_2 = /(at|bl|iz)$/; + var re3_1b_2 = new RegExp("([^aeiouylsz])\\1$"); + var re4_1b_2 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + + var re_1c = /^(.+?[^aeiou])y$/; + var re_2 = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + + var re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + + var re_4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + var re2_4 = /^(.+?)(s|t)(ion)$/; + + var re_5 = /^(.+?)e$/; + var re_5_1 = /ll$/; + var re3_5 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + + var porterStemmer = function porterStemmer(w) { + var stem, + suffix, + firstch, + re, + re2, + re3, + re4; + + if (w.length < 3) { return w; } + + firstch = w.substr(0,1); + if (firstch == "y") { + w = firstch.toUpperCase() + w.substr(1); + } + + // Step 1a + re = re_1a + re2 = re2_1a; + + if (re.test(w)) { w = w.replace(re,"$1$2"); } + else if (re2.test(w)) { w = w.replace(re2,"$1$2"); } + + // Step 1b + re = re_1b; + re2 = re2_1b; + if (re.test(w)) { + var fp = re.exec(w); + re = re_mgr0; + if (re.test(fp[1])) { + re = re_1b_2; + w = w.replace(re,""); + } + } else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = re_s_v; + if (re2.test(stem)) { + w = stem; + re2 = re2_1b_2; + re3 = re3_1b_2; + re4 = re4_1b_2; + if (re2.test(w)) { w = w + "e"; } + else if (re3.test(w)) { re = re_1b_2; w = w.replace(re,""); } + else if (re4.test(w)) { w = w + "e"; } + } + } + + // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say) + re = re_1c; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem + "i"; + } + + // Step 2 + re = re_2; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = re_mgr0; + if (re.test(stem)) { + w = stem + step2list[suffix]; + } + } + + // Step 3 + re = re_3; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = re_mgr0; + if (re.test(stem)) { + w = stem + step3list[suffix]; + } + } + + // Step 4 + re = re_4; + re2 = re2_4; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = re_mgr1; + if (re.test(stem)) { + w = stem; + } + } else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = re_mgr1; + if (re2.test(stem)) { + w = stem; + } + } + + // Step 5 + re = re_5; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = re_mgr1; + re2 = re_meq1; + re3 = re3_5; + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) { + w = stem; + } + } + + re = re_5_1; + re2 = re_mgr1; + if (re.test(w) && re2.test(w)) { + re = re_1b_2; + w = w.replace(re,""); + } + + // and turn initial Y back to y + + if (firstch == "y") { + w = firstch.toLowerCase() + w.substr(1); + } + + return w; + }; + + return function (token) { + return token.update(porterStemmer); + } +})(); + +lunr.Pipeline.registerFunction(lunr.stemmer, 'stemmer') +/*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * lunr.generateStopWordFilter builds a stopWordFilter function from the provided + * list of stop words. + * + * The built in lunr.stopWordFilter is built using this generator and can be used + * to generate custom stopWordFilters for applications or non English languages. + * + * @function + * @param {Array} token The token to pass through the filter + * @returns {lunr.PipelineFunction} + * @see lunr.Pipeline + * @see lunr.stopWordFilter + */ +lunr.generateStopWordFilter = function (stopWords) { + var words = stopWords.reduce(function (memo, stopWord) { + memo[stopWord] = stopWord + return memo + }, {}) + + return function (token) { + if (token && words[token.toString()] !== token.toString()) return token + } +} + +/** + * lunr.stopWordFilter is an English language stop word list filter, any words + * contained in the list will not be passed through the filter. + * + * This is intended to be used in the Pipeline. If the token does not pass the + * filter then undefined will be returned. + * + * @function + * @implements {lunr.PipelineFunction} + * @params {lunr.Token} token - A token to check for being a stop word. + * @returns {lunr.Token} + * @see {@link lunr.Pipeline} + */ +lunr.stopWordFilter = lunr.generateStopWordFilter([ + 'a', + 'able', + 'about', + 'across', + 'after', + 'all', + 'almost', + 'also', + 'am', + 'among', + 'an', + 'and', + 'any', + 'are', + 'as', + 'at', + 'be', + 'because', + 'been', + 'but', + 'by', + 'can', + 'cannot', + 'could', + 'dear', + 'did', + 'do', + 'does', + 'either', + 'else', + 'ever', + 'every', + 'for', + 'from', + 'get', + 'got', + 'had', + 'has', + 'have', + 'he', + 'her', + 'hers', + 'him', + 'his', + 'how', + 'however', + 'i', + 'if', + 'in', + 'into', + 'is', + 'it', + 'its', + 'just', + 'least', + 'let', + 'like', + 'likely', + 'may', + 'me', + 'might', + 'most', + 'must', + 'my', + 'neither', + 'no', + 'nor', + 'not', + 'of', + 'off', + 'often', + 'on', + 'only', + 'or', + 'other', + 'our', + 'own', + 'rather', + 'said', + 'say', + 'says', + 'she', + 'should', + 'since', + 'so', + 'some', + 'than', + 'that', + 'the', + 'their', + 'them', + 'then', + 'there', + 'these', + 'they', + 'this', + 'tis', + 'to', + 'too', + 'twas', + 'us', + 'wants', + 'was', + 'we', + 'were', + 'what', + 'when', + 'where', + 'which', + 'while', + 'who', + 'whom', + 'why', + 'will', + 'with', + 'would', + 'yet', + 'you', + 'your' +]) + +lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'stopWordFilter') +/*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * lunr.trimmer is a pipeline function for trimming non word + * characters from the beginning and end of tokens before they + * enter the index. + * + * This implementation may not work correctly for non latin + * characters and should either be removed or adapted for use + * with languages with non-latin characters. + * + * @static + * @implements {lunr.PipelineFunction} + * @param {lunr.Token} token The token to pass through the filter + * @returns {lunr.Token} + * @see lunr.Pipeline + */ +lunr.trimmer = function (token) { + return token.update(function (s) { + return s.replace(/^\W+/, '').replace(/\W+$/, '') + }) +} + +lunr.Pipeline.registerFunction(lunr.trimmer, 'trimmer') +/*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A token set is used to store the unique list of all tokens + * within an index. Token sets are also used to represent an + * incoming query to the index, this query token set and index + * token set are then intersected to find which tokens to look + * up in the inverted index. + * + * A token set can hold multiple tokens, as in the case of the + * index token set, or it can hold a single token as in the + * case of a simple query token set. + * + * Additionally token sets are used to perform wildcard matching. + * Leading, contained and trailing wildcards are supported, and + * from this edit distance matching can also be provided. + * + * Token sets are implemented as a minimal finite state automata, + * where both common prefixes and suffixes are shared between tokens. + * This helps to reduce the space used for storing the token set. + * + * @constructor + */ +lunr.TokenSet = function () { + this.final = false + this.edges = {} + this.id = lunr.TokenSet._nextId + lunr.TokenSet._nextId += 1 +} + +/** + * Keeps track of the next, auto increment, identifier to assign + * to a new tokenSet. + * + * TokenSets require a unique identifier to be correctly minimised. + * + * @private + */ +lunr.TokenSet._nextId = 1 + +/** + * Creates a TokenSet instance from the given sorted array of words. + * + * @param {String[]} arr - A sorted array of strings to create the set from. + * @returns {lunr.TokenSet} + * @throws Will throw an error if the input array is not sorted. + */ +lunr.TokenSet.fromArray = function (arr) { + var builder = new lunr.TokenSet.Builder + + for (var i = 0, len = arr.length; i < len; i++) { + builder.insert(arr[i]) + } + + builder.finish() + return builder.root +} + +/** + * Creates a token set from a query clause. + * + * @private + * @param {Object} clause - A single clause from lunr.Query. + * @param {string} clause.term - The query clause term. + * @param {number} [clause.editDistance] - The optional edit distance for the term. + * @returns {lunr.TokenSet} + */ +lunr.TokenSet.fromClause = function (clause) { + if ('editDistance' in clause) { + return lunr.TokenSet.fromFuzzyString(clause.term, clause.editDistance) + } else { + return lunr.TokenSet.fromString(clause.term) + } +} + +/** + * Creates a token set representing a single string with a specified + * edit distance. + * + * Insertions, deletions, substitutions and transpositions are each + * treated as an edit distance of 1. + * + * Increasing the allowed edit distance will have a dramatic impact + * on the performance of both creating and intersecting these TokenSets. + * It is advised to keep the edit distance less than 3. + * + * @param {string} str - The string to create the token set from. + * @param {number} editDistance - The allowed edit distance to match. + * @returns {lunr.Vector} + */ +lunr.TokenSet.fromFuzzyString = function (str, editDistance) { + var root = new lunr.TokenSet + + var stack = [{ + node: root, + editsRemaining: editDistance, + str: str + }] + + while (stack.length) { + var frame = stack.pop() + + // no edit + if (frame.str.length > 0) { + var char = frame.str.charAt(0), + noEditNode + + if (char in frame.node.edges) { + noEditNode = frame.node.edges[char] + } else { + noEditNode = new lunr.TokenSet + frame.node.edges[char] = noEditNode + } + + if (frame.str.length == 1) { + noEditNode.final = true + } + + stack.push({ + node: noEditNode, + editsRemaining: frame.editsRemaining, + str: frame.str.slice(1) + }) + } + + if (frame.editsRemaining == 0) { + continue + } + + // insertion + if ("*" in frame.node.edges) { + var insertionNode = frame.node.edges["*"] + } else { + var insertionNode = new lunr.TokenSet + frame.node.edges["*"] = insertionNode + } + + if (frame.str.length == 0) { + insertionNode.final = true + } + + stack.push({ + node: insertionNode, + editsRemaining: frame.editsRemaining - 1, + str: frame.str + }) + + // deletion + // can only do a deletion if we have enough edits remaining + // and if there are characters left to delete in the string + if (frame.str.length > 1) { + stack.push({ + node: frame.node, + editsRemaining: frame.editsRemaining - 1, + str: frame.str.slice(1) + }) + } + + // deletion + // just removing the last character from the str + if (frame.str.length == 1) { + frame.node.final = true + } + + // substitution + // can only do a substitution if we have enough edits remaining + // and if there are characters left to substitute + if (frame.str.length >= 1) { + if ("*" in frame.node.edges) { + var substitutionNode = frame.node.edges["*"] + } else { + var substitutionNode = new lunr.TokenSet + frame.node.edges["*"] = substitutionNode + } + + if (frame.str.length == 1) { + substitutionNode.final = true + } + + stack.push({ + node: substitutionNode, + editsRemaining: frame.editsRemaining - 1, + str: frame.str.slice(1) + }) + } + + // transposition + // can only do a transposition if there are edits remaining + // and there are enough characters to transpose + if (frame.str.length > 1) { + var charA = frame.str.charAt(0), + charB = frame.str.charAt(1), + transposeNode + + if (charB in frame.node.edges) { + transposeNode = frame.node.edges[charB] + } else { + transposeNode = new lunr.TokenSet + frame.node.edges[charB] = transposeNode + } + + if (frame.str.length == 1) { + transposeNode.final = true + } + + stack.push({ + node: transposeNode, + editsRemaining: frame.editsRemaining - 1, + str: charA + frame.str.slice(2) + }) + } + } + + return root +} + +/** + * Creates a TokenSet from a string. + * + * The string may contain one or more wildcard characters (*) + * that will allow wildcard matching when intersecting with + * another TokenSet. + * + * @param {string} str - The string to create a TokenSet from. + * @returns {lunr.TokenSet} + */ +lunr.TokenSet.fromString = function (str) { + var node = new lunr.TokenSet, + root = node + + /* + * Iterates through all characters within the passed string + * appending a node for each character. + * + * When a wildcard character is found then a self + * referencing edge is introduced to continually match + * any number of any characters. + */ + for (var i = 0, len = str.length; i < len; i++) { + var char = str[i], + final = (i == len - 1) + + if (char == "*") { + node.edges[char] = node + node.final = final + + } else { + var next = new lunr.TokenSet + next.final = final + + node.edges[char] = next + node = next + } + } + + return root +} + +/** + * Converts this TokenSet into an array of strings + * contained within the TokenSet. + * + * This is not intended to be used on a TokenSet that + * contains wildcards, in these cases the results are + * undefined and are likely to cause an infinite loop. + * + * @returns {string[]} + */ +lunr.TokenSet.prototype.toArray = function () { + var words = [] + + var stack = [{ + prefix: "", + node: this + }] + + while (stack.length) { + var frame = stack.pop(), + edges = Object.keys(frame.node.edges), + len = edges.length + + if (frame.node.final) { + /* In Safari, at this point the prefix is sometimes corrupted, see: + * https://github.com/olivernn/lunr.js/issues/279 Calling any + * String.prototype method forces Safari to "cast" this string to what + * it's supposed to be, fixing the bug. */ + frame.prefix.charAt(0) + words.push(frame.prefix) + } + + for (var i = 0; i < len; i++) { + var edge = edges[i] + + stack.push({ + prefix: frame.prefix.concat(edge), + node: frame.node.edges[edge] + }) + } + } + + return words +} + +/** + * Generates a string representation of a TokenSet. + * + * This is intended to allow TokenSets to be used as keys + * in objects, largely to aid the construction and minimisation + * of a TokenSet. As such it is not designed to be a human + * friendly representation of the TokenSet. + * + * @returns {string} + */ +lunr.TokenSet.prototype.toString = function () { + // NOTE: Using Object.keys here as this.edges is very likely + // to enter 'hash-mode' with many keys being added + // + // avoiding a for-in loop here as it leads to the function + // being de-optimised (at least in V8). From some simple + // benchmarks the performance is comparable, but allowing + // V8 to optimize may mean easy performance wins in the future. + + if (this._str) { + return this._str + } + + var str = this.final ? '1' : '0', + labels = Object.keys(this.edges).sort(), + len = labels.length + + for (var i = 0; i < len; i++) { + var label = labels[i], + node = this.edges[label] + + str = str + label + node.id + } + + return str +} + +/** + * Returns a new TokenSet that is the intersection of + * this TokenSet and the passed TokenSet. + * + * This intersection will take into account any wildcards + * contained within the TokenSet. + * + * @param {lunr.TokenSet} b - An other TokenSet to intersect with. + * @returns {lunr.TokenSet} + */ +lunr.TokenSet.prototype.intersect = function (b) { + var output = new lunr.TokenSet, + frame = undefined + + var stack = [{ + qNode: b, + output: output, + node: this + }] + + while (stack.length) { + frame = stack.pop() + + // NOTE: As with the #toString method, we are using + // Object.keys and a for loop instead of a for-in loop + // as both of these objects enter 'hash' mode, causing + // the function to be de-optimised in V8 + var qEdges = Object.keys(frame.qNode.edges), + qLen = qEdges.length, + nEdges = Object.keys(frame.node.edges), + nLen = nEdges.length + + for (var q = 0; q < qLen; q++) { + var qEdge = qEdges[q] + + for (var n = 0; n < nLen; n++) { + var nEdge = nEdges[n] + + if (nEdge == qEdge || qEdge == '*') { + var node = frame.node.edges[nEdge], + qNode = frame.qNode.edges[qEdge], + final = node.final && qNode.final, + next = undefined + + if (nEdge in frame.output.edges) { + // an edge already exists for this character + // no need to create a new node, just set the finality + // bit unless this node is already final + next = frame.output.edges[nEdge] + next.final = next.final || final + + } else { + // no edge exists yet, must create one + // set the finality bit and insert it + // into the output + next = new lunr.TokenSet + next.final = final + frame.output.edges[nEdge] = next + } + + stack.push({ + qNode: qNode, + output: next, + node: node + }) + } + } + } + } + + return output +} +lunr.TokenSet.Builder = function () { + this.previousWord = "" + this.root = new lunr.TokenSet + this.uncheckedNodes = [] + this.minimizedNodes = {} +} + +lunr.TokenSet.Builder.prototype.insert = function (word) { + var node, + commonPrefix = 0 + + if (word < this.previousWord) { + throw new Error ("Out of order word insertion") + } + + for (var i = 0; i < word.length && i < this.previousWord.length; i++) { + if (word[i] != this.previousWord[i]) break + commonPrefix++ + } + + this.minimize(commonPrefix) + + if (this.uncheckedNodes.length == 0) { + node = this.root + } else { + node = this.uncheckedNodes[this.uncheckedNodes.length - 1].child + } + + for (var i = commonPrefix; i < word.length; i++) { + var nextNode = new lunr.TokenSet, + char = word[i] + + node.edges[char] = nextNode + + this.uncheckedNodes.push({ + parent: node, + char: char, + child: nextNode + }) + + node = nextNode + } + + node.final = true + this.previousWord = word +} + +lunr.TokenSet.Builder.prototype.finish = function () { + this.minimize(0) +} + +lunr.TokenSet.Builder.prototype.minimize = function (downTo) { + for (var i = this.uncheckedNodes.length - 1; i >= downTo; i--) { + var node = this.uncheckedNodes[i], + childKey = node.child.toString() + + if (childKey in this.minimizedNodes) { + node.parent.edges[node.char] = this.minimizedNodes[childKey] + } else { + // Cache the key for this node since + // we know it can't change anymore + node.child._str = childKey + + this.minimizedNodes[childKey] = node.child + } + + this.uncheckedNodes.pop() + } +} +/*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * An index contains the built index of all documents and provides a query interface + * to the index. + * + * Usually instances of lunr.Index will not be created using this constructor, instead + * lunr.Builder should be used to construct new indexes, or lunr.Index.load should be + * used to load previously built and serialized indexes. + * + * @constructor + * @param {Object} attrs - The attributes of the built search index. + * @param {Object} attrs.invertedIndex - An index of term/field to document reference. + * @param {Object} attrs.fieldVectors - Field vectors + * @param {lunr.TokenSet} attrs.tokenSet - An set of all corpus tokens. + * @param {string[]} attrs.fields - The names of indexed document fields. + * @param {lunr.Pipeline} attrs.pipeline - The pipeline to use for search terms. + */ +lunr.Index = function (attrs) { + this.invertedIndex = attrs.invertedIndex + this.fieldVectors = attrs.fieldVectors + this.tokenSet = attrs.tokenSet + this.fields = attrs.fields + this.pipeline = attrs.pipeline +} + +/** + * A result contains details of a document matching a search query. + * @typedef {Object} lunr.Index~Result + * @property {string} ref - The reference of the document this result represents. + * @property {number} score - A number between 0 and 1 representing how similar this document is to the query. + * @property {lunr.MatchData} matchData - Contains metadata about this match including which term(s) caused the match. + */ + +/** + * Although lunr provides the ability to create queries using lunr.Query, it also provides a simple + * query language which itself is parsed into an instance of lunr.Query. + * + * For programmatically building queries it is advised to directly use lunr.Query, the query language + * is best used for human entered text rather than program generated text. + * + * At its simplest queries can just be a single term, e.g. `hello`, multiple terms are also supported + * and will be combined with OR, e.g `hello world` will match documents that contain either 'hello' + * or 'world', though those that contain both will rank higher in the results. + * + * Wildcards can be included in terms to match one or more unspecified characters, these wildcards can + * be inserted anywhere within the term, and more than one wildcard can exist in a single term. Adding + * wildcards will increase the number of documents that will be found but can also have a negative + * impact on query performance, especially with wildcards at the beginning of a term. + * + * Terms can be restricted to specific fields, e.g. `title:hello`, only documents with the term + * hello in the title field will match this query. Using a field not present in the index will lead + * to an error being thrown. + * + * Modifiers can also be added to terms, lunr supports edit distance and boost modifiers on terms. A term + * boost will make documents matching that term score higher, e.g. `foo^5`. Edit distance is also supported + * to provide fuzzy matching, e.g. 'hello~2' will match documents with hello with an edit distance of 2. + * Avoid large values for edit distance to improve query performance. + * + * Each term also supports a presence modifier. By default a term's presence in document is optional, however + * this can be changed to either required or prohibited. For a term's presence to be required in a document the + * term should be prefixed with a '+', e.g. `+foo bar` is a search for documents that must contain 'foo' and + * optionally contain 'bar'. Conversely a leading '-' sets the terms presence to prohibited, i.e. it must not + * appear in a document, e.g. `-foo bar` is a search for documents that do not contain 'foo' but may contain 'bar'. + * + * To escape special characters the backslash character '\' can be used, this allows searches to include + * characters that would normally be considered modifiers, e.g. `foo\~2` will search for a term "foo~2" instead + * of attempting to apply a boost of 2 to the search term "foo". + * + * @typedef {string} lunr.Index~QueryString + * @example Simple single term query + * hello + * @example Multiple term query + * hello world + * @example term scoped to a field + * title:hello + * @example term with a boost of 10 + * hello^10 + * @example term with an edit distance of 2 + * hello~2 + * @example terms with presence modifiers + * -foo +bar baz + */ + +/** + * Performs a search against the index using lunr query syntax. + * + * Results will be returned sorted by their score, the most relevant results + * will be returned first. For details on how the score is calculated, please see + * the {@link https://lunrjs.com/guides/searching.html#scoring|guide}. + * + * For more programmatic querying use lunr.Index#query. + * + * @param {lunr.Index~QueryString} queryString - A string containing a lunr query. + * @throws {lunr.QueryParseError} If the passed query string cannot be parsed. + * @returns {lunr.Index~Result[]} + */ +lunr.Index.prototype.search = function (queryString) { + return this.query(function (query) { + var parser = new lunr.QueryParser(queryString, query) + parser.parse() + }) +} + +/** + * A query builder callback provides a query object to be used to express + * the query to perform on the index. + * + * @callback lunr.Index~queryBuilder + * @param {lunr.Query} query - The query object to build up. + * @this lunr.Query + */ + +/** + * Performs a query against the index using the yielded lunr.Query object. + * + * If performing programmatic queries against the index, this method is preferred + * over lunr.Index#search so as to avoid the additional query parsing overhead. + * + * A query object is yielded to the supplied function which should be used to + * express the query to be run against the index. + * + * Note that although this function takes a callback parameter it is _not_ an + * asynchronous operation, the callback is just yielded a query object to be + * customized. + * + * @param {lunr.Index~queryBuilder} fn - A function that is used to build the query. + * @returns {lunr.Index~Result[]} + */ +lunr.Index.prototype.query = function (fn) { + // for each query clause + // * process terms + // * expand terms from token set + // * find matching documents and metadata + // * get document vectors + // * score documents + + var query = new lunr.Query(this.fields), + matchingFields = Object.create(null), + queryVectors = Object.create(null), + termFieldCache = Object.create(null), + requiredMatches = Object.create(null), + prohibitedMatches = Object.create(null) + + /* + * To support field level boosts a query vector is created per + * field. An empty vector is eagerly created to support negated + * queries. + */ + for (var i = 0; i < this.fields.length; i++) { + queryVectors[this.fields[i]] = new lunr.Vector + } + + fn.call(query, query) + + for (var i = 0; i < query.clauses.length; i++) { + /* + * Unless the pipeline has been disabled for this term, which is + * the case for terms with wildcards, we need to pass the clause + * term through the search pipeline. A pipeline returns an array + * of processed terms. Pipeline functions may expand the passed + * term, which means we may end up performing multiple index lookups + * for a single query term. + */ + var clause = query.clauses[i], + terms = null, + clauseMatches = lunr.Set.empty + + if (clause.usePipeline) { + terms = this.pipeline.runString(clause.term, { + fields: clause.fields + }) + } else { + terms = [clause.term] + } + + for (var m = 0; m < terms.length; m++) { + var term = terms[m] + + /* + * Each term returned from the pipeline needs to use the same query + * clause object, e.g. the same boost and or edit distance. The + * simplest way to do this is to re-use the clause object but mutate + * its term property. + */ + clause.term = term + + /* + * From the term in the clause we create a token set which will then + * be used to intersect the indexes token set to get a list of terms + * to lookup in the inverted index + */ + var termTokenSet = lunr.TokenSet.fromClause(clause), + expandedTerms = this.tokenSet.intersect(termTokenSet).toArray() + + /* + * If a term marked as required does not exist in the tokenSet it is + * impossible for the search to return any matches. We set all the field + * scoped required matches set to empty and stop examining any further + * clauses. + */ + if (expandedTerms.length === 0 && clause.presence === lunr.Query.presence.REQUIRED) { + for (var k = 0; k < clause.fields.length; k++) { + var field = clause.fields[k] + requiredMatches[field] = lunr.Set.empty + } + + break + } + + for (var j = 0; j < expandedTerms.length; j++) { + /* + * For each term get the posting and termIndex, this is required for + * building the query vector. + */ + var expandedTerm = expandedTerms[j], + posting = this.invertedIndex[expandedTerm], + termIndex = posting._index + + for (var k = 0; k < clause.fields.length; k++) { + /* + * For each field that this query term is scoped by (by default + * all fields are in scope) we need to get all the document refs + * that have this term in that field. + * + * The posting is the entry in the invertedIndex for the matching + * term from above. + */ + var field = clause.fields[k], + fieldPosting = posting[field], + matchingDocumentRefs = Object.keys(fieldPosting), + termField = expandedTerm + "/" + field, + matchingDocumentsSet = new lunr.Set(matchingDocumentRefs) + + /* + * if the presence of this term is required ensure that the matching + * documents are added to the set of required matches for this clause. + * + */ + if (clause.presence == lunr.Query.presence.REQUIRED) { + clauseMatches = clauseMatches.union(matchingDocumentsSet) + + if (requiredMatches[field] === undefined) { + requiredMatches[field] = lunr.Set.complete + } + } + + /* + * if the presence of this term is prohibited ensure that the matching + * documents are added to the set of prohibited matches for this field, + * creating that set if it does not yet exist. + */ + if (clause.presence == lunr.Query.presence.PROHIBITED) { + if (prohibitedMatches[field] === undefined) { + prohibitedMatches[field] = lunr.Set.empty + } + + prohibitedMatches[field] = prohibitedMatches[field].union(matchingDocumentsSet) + + /* + * Prohibited matches should not be part of the query vector used for + * similarity scoring and no metadata should be extracted so we continue + * to the next field + */ + continue + } + + /* + * The query field vector is populated using the termIndex found for + * the term and a unit value with the appropriate boost applied. + * Using upsert because there could already be an entry in the vector + * for the term we are working with. In that case we just add the scores + * together. + */ + queryVectors[field].upsert(termIndex, clause.boost, function (a, b) { return a + b }) + + /** + * If we've already seen this term, field combo then we've already collected + * the matching documents and metadata, no need to go through all that again + */ + if (termFieldCache[termField]) { + continue + } + + for (var l = 0; l < matchingDocumentRefs.length; l++) { + /* + * All metadata for this term/field/document triple + * are then extracted and collected into an instance + * of lunr.MatchData ready to be returned in the query + * results + */ + var matchingDocumentRef = matchingDocumentRefs[l], + matchingFieldRef = new lunr.FieldRef (matchingDocumentRef, field), + metadata = fieldPosting[matchingDocumentRef], + fieldMatch + + if ((fieldMatch = matchingFields[matchingFieldRef]) === undefined) { + matchingFields[matchingFieldRef] = new lunr.MatchData (expandedTerm, field, metadata) + } else { + fieldMatch.add(expandedTerm, field, metadata) + } + + } + + termFieldCache[termField] = true + } + } + } + + /** + * If the presence was required we need to update the requiredMatches field sets. + * We do this after all fields for the term have collected their matches because + * the clause terms presence is required in _any_ of the fields not _all_ of the + * fields. + */ + if (clause.presence === lunr.Query.presence.REQUIRED) { + for (var k = 0; k < clause.fields.length; k++) { + var field = clause.fields[k] + requiredMatches[field] = requiredMatches[field].intersect(clauseMatches) + } + } + } + + /** + * Need to combine the field scoped required and prohibited + * matching documents into a global set of required and prohibited + * matches + */ + var allRequiredMatches = lunr.Set.complete, + allProhibitedMatches = lunr.Set.empty + + for (var i = 0; i < this.fields.length; i++) { + var field = this.fields[i] + + if (requiredMatches[field]) { + allRequiredMatches = allRequiredMatches.intersect(requiredMatches[field]) + } + + if (prohibitedMatches[field]) { + allProhibitedMatches = allProhibitedMatches.union(prohibitedMatches[field]) + } + } + + var matchingFieldRefs = Object.keys(matchingFields), + results = [], + matches = Object.create(null) + + /* + * If the query is negated (contains only prohibited terms) + * we need to get _all_ fieldRefs currently existing in the + * index. This is only done when we know that the query is + * entirely prohibited terms to avoid any cost of getting all + * fieldRefs unnecessarily. + * + * Additionally, blank MatchData must be created to correctly + * populate the results. + */ + if (query.isNegated()) { + matchingFieldRefs = Object.keys(this.fieldVectors) + + for (var i = 0; i < matchingFieldRefs.length; i++) { + var matchingFieldRef = matchingFieldRefs[i] + var fieldRef = lunr.FieldRef.fromString(matchingFieldRef) + matchingFields[matchingFieldRef] = new lunr.MatchData + } + } + + for (var i = 0; i < matchingFieldRefs.length; i++) { + /* + * Currently we have document fields that match the query, but we + * need to return documents. The matchData and scores are combined + * from multiple fields belonging to the same document. + * + * Scores are calculated by field, using the query vectors created + * above, and combined into a final document score using addition. + */ + var fieldRef = lunr.FieldRef.fromString(matchingFieldRefs[i]), + docRef = fieldRef.docRef + + if (!allRequiredMatches.contains(docRef)) { + continue + } + + if (allProhibitedMatches.contains(docRef)) { + continue + } + + var fieldVector = this.fieldVectors[fieldRef], + score = queryVectors[fieldRef.fieldName].similarity(fieldVector), + docMatch + + if ((docMatch = matches[docRef]) !== undefined) { + docMatch.score += score + docMatch.matchData.combine(matchingFields[fieldRef]) + } else { + var match = { + ref: docRef, + score: score, + matchData: matchingFields[fieldRef] + } + matches[docRef] = match + results.push(match) + } + } + + /* + * Sort the results objects by score, highest first. + */ + return results.sort(function (a, b) { + return b.score - a.score + }) +} + +/** + * Prepares the index for JSON serialization. + * + * The schema for this JSON blob will be described in a + * separate JSON schema file. + * + * @returns {Object} + */ +lunr.Index.prototype.toJSON = function () { + var invertedIndex = Object.keys(this.invertedIndex) + .sort() + .map(function (term) { + return [term, this.invertedIndex[term]] + }, this) + + var fieldVectors = Object.keys(this.fieldVectors) + .map(function (ref) { + return [ref, this.fieldVectors[ref].toJSON()] + }, this) + + return { + version: lunr.version, + fields: this.fields, + fieldVectors: fieldVectors, + invertedIndex: invertedIndex, + pipeline: this.pipeline.toJSON() + } +} + +/** + * Loads a previously serialized lunr.Index + * + * @param {Object} serializedIndex - A previously serialized lunr.Index + * @returns {lunr.Index} + */ +lunr.Index.load = function (serializedIndex) { + var attrs = {}, + fieldVectors = {}, + serializedVectors = serializedIndex.fieldVectors, + invertedIndex = Object.create(null), + serializedInvertedIndex = serializedIndex.invertedIndex, + tokenSetBuilder = new lunr.TokenSet.Builder, + pipeline = lunr.Pipeline.load(serializedIndex.pipeline) + + if (serializedIndex.version != lunr.version) { + lunr.utils.warn("Version mismatch when loading serialised index. Current version of lunr '" + lunr.version + "' does not match serialized index '" + serializedIndex.version + "'") + } + + for (var i = 0; i < serializedVectors.length; i++) { + var tuple = serializedVectors[i], + ref = tuple[0], + elements = tuple[1] + + fieldVectors[ref] = new lunr.Vector(elements) + } + + for (var i = 0; i < serializedInvertedIndex.length; i++) { + var tuple = serializedInvertedIndex[i], + term = tuple[0], + posting = tuple[1] + + tokenSetBuilder.insert(term) + invertedIndex[term] = posting + } + + tokenSetBuilder.finish() + + attrs.fields = serializedIndex.fields + + attrs.fieldVectors = fieldVectors + attrs.invertedIndex = invertedIndex + attrs.tokenSet = tokenSetBuilder.root + attrs.pipeline = pipeline + + return new lunr.Index(attrs) +} +/*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * lunr.Builder performs indexing on a set of documents and + * returns instances of lunr.Index ready for querying. + * + * All configuration of the index is done via the builder, the + * fields to index, the document reference, the text processing + * pipeline and document scoring parameters are all set on the + * builder before indexing. + * + * @constructor + * @property {string} _ref - Internal reference to the document reference field. + * @property {string[]} _fields - Internal reference to the document fields to index. + * @property {object} invertedIndex - The inverted index maps terms to document fields. + * @property {object} documentTermFrequencies - Keeps track of document term frequencies. + * @property {object} documentLengths - Keeps track of the length of documents added to the index. + * @property {lunr.tokenizer} tokenizer - Function for splitting strings into tokens for indexing. + * @property {lunr.Pipeline} pipeline - The pipeline performs text processing on tokens before indexing. + * @property {lunr.Pipeline} searchPipeline - A pipeline for processing search terms before querying the index. + * @property {number} documentCount - Keeps track of the total number of documents indexed. + * @property {number} _b - A parameter to control field length normalization, setting this to 0 disabled normalization, 1 fully normalizes field lengths, the default value is 0.75. + * @property {number} _k1 - A parameter to control how quickly an increase in term frequency results in term frequency saturation, the default value is 1.2. + * @property {number} termIndex - A counter incremented for each unique term, used to identify a terms position in the vector space. + * @property {array} metadataWhitelist - A list of metadata keys that have been whitelisted for entry in the index. + */ +lunr.Builder = function () { + this._ref = "id" + this._fields = Object.create(null) + this._documents = Object.create(null) + this.invertedIndex = Object.create(null) + this.fieldTermFrequencies = {} + this.fieldLengths = {} + this.tokenizer = lunr.tokenizer + this.pipeline = new lunr.Pipeline + this.searchPipeline = new lunr.Pipeline + this.documentCount = 0 + this._b = 0.75 + this._k1 = 1.2 + this.termIndex = 0 + this.metadataWhitelist = [] +} + +/** + * Sets the document field used as the document reference. Every document must have this field. + * The type of this field in the document should be a string, if it is not a string it will be + * coerced into a string by calling toString. + * + * The default ref is 'id'. + * + * The ref should _not_ be changed during indexing, it should be set before any documents are + * added to the index. Changing it during indexing can lead to inconsistent results. + * + * @param {string} ref - The name of the reference field in the document. + */ +lunr.Builder.prototype.ref = function (ref) { + this._ref = ref +} + +/** + * A function that is used to extract a field from a document. + * + * Lunr expects a field to be at the top level of a document, if however the field + * is deeply nested within a document an extractor function can be used to extract + * the right field for indexing. + * + * @callback fieldExtractor + * @param {object} doc - The document being added to the index. + * @returns {?(string|object|object[])} obj - The object that will be indexed for this field. + * @example Extracting a nested field + * function (doc) { return doc.nested.field } + */ + +/** + * Adds a field to the list of document fields that will be indexed. Every document being + * indexed should have this field. Null values for this field in indexed documents will + * not cause errors but will limit the chance of that document being retrieved by searches. + * + * All fields should be added before adding documents to the index. Adding fields after + * a document has been indexed will have no effect on already indexed documents. + * + * Fields can be boosted at build time. This allows terms within that field to have more + * importance when ranking search results. Use a field boost to specify that matches within + * one field are more important than other fields. + * + * @param {string} fieldName - The name of a field to index in all documents. + * @param {object} attributes - Optional attributes associated with this field. + * @param {number} [attributes.boost=1] - Boost applied to all terms within this field. + * @param {fieldExtractor} [attributes.extractor] - Function to extract a field from a document. + * @throws {RangeError} fieldName cannot contain unsupported characters '/' + */ +lunr.Builder.prototype.field = function (fieldName, attributes) { + if (/\//.test(fieldName)) { + throw new RangeError ("Field '" + fieldName + "' contains illegal character '/'") + } + + this._fields[fieldName] = attributes || {} +} + +/** + * A parameter to tune the amount of field length normalisation that is applied when + * calculating relevance scores. A value of 0 will completely disable any normalisation + * and a value of 1 will fully normalise field lengths. The default is 0.75. Values of b + * will be clamped to the range 0 - 1. + * + * @param {number} number - The value to set for this tuning parameter. + */ +lunr.Builder.prototype.b = function (number) { + if (number < 0) { + this._b = 0 + } else if (number > 1) { + this._b = 1 + } else { + this._b = number + } +} + +/** + * A parameter that controls the speed at which a rise in term frequency results in term + * frequency saturation. The default value is 1.2. Setting this to a higher value will give + * slower saturation levels, a lower value will result in quicker saturation. + * + * @param {number} number - The value to set for this tuning parameter. + */ +lunr.Builder.prototype.k1 = function (number) { + this._k1 = number +} + +/** + * Adds a document to the index. + * + * Before adding fields to the index the index should have been fully setup, with the document + * ref and all fields to index already having been specified. + * + * The document must have a field name as specified by the ref (by default this is 'id') and + * it should have all fields defined for indexing, though null or undefined values will not + * cause errors. + * + * Entire documents can be boosted at build time. Applying a boost to a document indicates that + * this document should rank higher in search results than other documents. + * + * @param {object} doc - The document to add to the index. + * @param {object} attributes - Optional attributes associated with this document. + * @param {number} [attributes.boost=1] - Boost applied to all terms within this document. + */ +lunr.Builder.prototype.add = function (doc, attributes) { + var docRef = doc[this._ref], + fields = Object.keys(this._fields) + + this._documents[docRef] = attributes || {} + this.documentCount += 1 + + for (var i = 0; i < fields.length; i++) { + var fieldName = fields[i], + extractor = this._fields[fieldName].extractor, + field = extractor ? extractor(doc) : doc[fieldName], + tokens = this.tokenizer(field, { + fields: [fieldName] + }), + terms = this.pipeline.run(tokens), + fieldRef = new lunr.FieldRef (docRef, fieldName), + fieldTerms = Object.create(null) + + this.fieldTermFrequencies[fieldRef] = fieldTerms + this.fieldLengths[fieldRef] = 0 + + // store the length of this field for this document + this.fieldLengths[fieldRef] += terms.length + + // calculate term frequencies for this field + for (var j = 0; j < terms.length; j++) { + var term = terms[j] + + if (fieldTerms[term] == undefined) { + fieldTerms[term] = 0 + } + + fieldTerms[term] += 1 + + // add to inverted index + // create an initial posting if one doesn't exist + if (this.invertedIndex[term] == undefined) { + var posting = Object.create(null) + posting["_index"] = this.termIndex + this.termIndex += 1 + + for (var k = 0; k < fields.length; k++) { + posting[fields[k]] = Object.create(null) + } + + this.invertedIndex[term] = posting + } + + // add an entry for this term/fieldName/docRef to the invertedIndex + if (this.invertedIndex[term][fieldName][docRef] == undefined) { + this.invertedIndex[term][fieldName][docRef] = Object.create(null) + } + + // store all whitelisted metadata about this token in the + // inverted index + for (var l = 0; l < this.metadataWhitelist.length; l++) { + var metadataKey = this.metadataWhitelist[l], + metadata = term.metadata[metadataKey] + + if (this.invertedIndex[term][fieldName][docRef][metadataKey] == undefined) { + this.invertedIndex[term][fieldName][docRef][metadataKey] = [] + } + + this.invertedIndex[term][fieldName][docRef][metadataKey].push(metadata) + } + } + + } +} + +/** + * Calculates the average document length for this index + * + * @private + */ +lunr.Builder.prototype.calculateAverageFieldLengths = function () { + + var fieldRefs = Object.keys(this.fieldLengths), + numberOfFields = fieldRefs.length, + accumulator = {}, + documentsWithField = {} + + for (var i = 0; i < numberOfFields; i++) { + var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]), + field = fieldRef.fieldName + + documentsWithField[field] || (documentsWithField[field] = 0) + documentsWithField[field] += 1 + + accumulator[field] || (accumulator[field] = 0) + accumulator[field] += this.fieldLengths[fieldRef] + } + + var fields = Object.keys(this._fields) + + for (var i = 0; i < fields.length; i++) { + var fieldName = fields[i] + accumulator[fieldName] = accumulator[fieldName] / documentsWithField[fieldName] + } + + this.averageFieldLength = accumulator +} + +/** + * Builds a vector space model of every document using lunr.Vector + * + * @private + */ +lunr.Builder.prototype.createFieldVectors = function () { + var fieldVectors = {}, + fieldRefs = Object.keys(this.fieldTermFrequencies), + fieldRefsLength = fieldRefs.length, + termIdfCache = Object.create(null) + + for (var i = 0; i < fieldRefsLength; i++) { + var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]), + fieldName = fieldRef.fieldName, + fieldLength = this.fieldLengths[fieldRef], + fieldVector = new lunr.Vector, + termFrequencies = this.fieldTermFrequencies[fieldRef], + terms = Object.keys(termFrequencies), + termsLength = terms.length + + + var fieldBoost = this._fields[fieldName].boost || 1, + docBoost = this._documents[fieldRef.docRef].boost || 1 + + for (var j = 0; j < termsLength; j++) { + var term = terms[j], + tf = termFrequencies[term], + termIndex = this.invertedIndex[term]._index, + idf, score, scoreWithPrecision + + if (termIdfCache[term] === undefined) { + idf = lunr.idf(this.invertedIndex[term], this.documentCount) + termIdfCache[term] = idf + } else { + idf = termIdfCache[term] + } + + score = idf * ((this._k1 + 1) * tf) / (this._k1 * (1 - this._b + this._b * (fieldLength / this.averageFieldLength[fieldName])) + tf) + score *= fieldBoost + score *= docBoost + scoreWithPrecision = Math.round(score * 1000) / 1000 + // Converts 1.23456789 to 1.234. + // Reducing the precision so that the vectors take up less + // space when serialised. Doing it now so that they behave + // the same before and after serialisation. Also, this is + // the fastest approach to reducing a number's precision in + // JavaScript. + + fieldVector.insert(termIndex, scoreWithPrecision) + } + + fieldVectors[fieldRef] = fieldVector + } + + this.fieldVectors = fieldVectors +} + +/** + * Creates a token set of all tokens in the index using lunr.TokenSet + * + * @private + */ +lunr.Builder.prototype.createTokenSet = function () { + this.tokenSet = lunr.TokenSet.fromArray( + Object.keys(this.invertedIndex).sort() + ) +} + +/** + * Builds the index, creating an instance of lunr.Index. + * + * This completes the indexing process and should only be called + * once all documents have been added to the index. + * + * @returns {lunr.Index} + */ +lunr.Builder.prototype.build = function () { + this.calculateAverageFieldLengths() + this.createFieldVectors() + this.createTokenSet() + + return new lunr.Index({ + invertedIndex: this.invertedIndex, + fieldVectors: this.fieldVectors, + tokenSet: this.tokenSet, + fields: Object.keys(this._fields), + pipeline: this.searchPipeline + }) +} + +/** + * Applies a plugin to the index builder. + * + * A plugin is a function that is called with the index builder as its context. + * Plugins can be used to customise or extend the behaviour of the index + * in some way. A plugin is just a function, that encapsulated the custom + * behaviour that should be applied when building the index. + * + * The plugin function will be called with the index builder as its argument, additional + * arguments can also be passed when calling use. The function will be called + * with the index builder as its context. + * + * @param {Function} plugin The plugin to apply. + */ +lunr.Builder.prototype.use = function (fn) { + var args = Array.prototype.slice.call(arguments, 1) + args.unshift(this) + fn.apply(this, args) +} +/** + * Contains and collects metadata about a matching document. + * A single instance of lunr.MatchData is returned as part of every + * lunr.Index~Result. + * + * @constructor + * @param {string} term - The term this match data is associated with + * @param {string} field - The field in which the term was found + * @param {object} metadata - The metadata recorded about this term in this field + * @property {object} metadata - A cloned collection of metadata associated with this document. + * @see {@link lunr.Index~Result} + */ +lunr.MatchData = function (term, field, metadata) { + var clonedMetadata = Object.create(null), + metadataKeys = Object.keys(metadata || {}) + + // Cloning the metadata to prevent the original + // being mutated during match data combination. + // Metadata is kept in an array within the inverted + // index so cloning the data can be done with + // Array#slice + for (var i = 0; i < metadataKeys.length; i++) { + var key = metadataKeys[i] + clonedMetadata[key] = metadata[key].slice() + } + + this.metadata = Object.create(null) + + if (term !== undefined) { + this.metadata[term] = Object.create(null) + this.metadata[term][field] = clonedMetadata + } +} + +/** + * An instance of lunr.MatchData will be created for every term that matches a + * document. However only one instance is required in a lunr.Index~Result. This + * method combines metadata from another instance of lunr.MatchData with this + * objects metadata. + * + * @param {lunr.MatchData} otherMatchData - Another instance of match data to merge with this one. + * @see {@link lunr.Index~Result} + */ +lunr.MatchData.prototype.combine = function (otherMatchData) { + var terms = Object.keys(otherMatchData.metadata) + + for (var i = 0; i < terms.length; i++) { + var term = terms[i], + fields = Object.keys(otherMatchData.metadata[term]) + + if (this.metadata[term] == undefined) { + this.metadata[term] = Object.create(null) + } + + for (var j = 0; j < fields.length; j++) { + var field = fields[j], + keys = Object.keys(otherMatchData.metadata[term][field]) + + if (this.metadata[term][field] == undefined) { + this.metadata[term][field] = Object.create(null) + } + + for (var k = 0; k < keys.length; k++) { + var key = keys[k] + + if (this.metadata[term][field][key] == undefined) { + this.metadata[term][field][key] = otherMatchData.metadata[term][field][key] + } else { + this.metadata[term][field][key] = this.metadata[term][field][key].concat(otherMatchData.metadata[term][field][key]) + } + + } + } + } +} + +/** + * Add metadata for a term/field pair to this instance of match data. + * + * @param {string} term - The term this match data is associated with + * @param {string} field - The field in which the term was found + * @param {object} metadata - The metadata recorded about this term in this field + */ +lunr.MatchData.prototype.add = function (term, field, metadata) { + if (!(term in this.metadata)) { + this.metadata[term] = Object.create(null) + this.metadata[term][field] = metadata + return + } + + if (!(field in this.metadata[term])) { + this.metadata[term][field] = metadata + return + } + + var metadataKeys = Object.keys(metadata) + + for (var i = 0; i < metadataKeys.length; i++) { + var key = metadataKeys[i] + + if (key in this.metadata[term][field]) { + this.metadata[term][field][key] = this.metadata[term][field][key].concat(metadata[key]) + } else { + this.metadata[term][field][key] = metadata[key] + } + } +} +/** + * A lunr.Query provides a programmatic way of defining queries to be performed + * against a {@link lunr.Index}. + * + * Prefer constructing a lunr.Query using the {@link lunr.Index#query} method + * so the query object is pre-initialized with the right index fields. + * + * @constructor + * @property {lunr.Query~Clause[]} clauses - An array of query clauses. + * @property {string[]} allFields - An array of all available fields in a lunr.Index. + */ +lunr.Query = function (allFields) { + this.clauses = [] + this.allFields = allFields +} + +/** + * Constants for indicating what kind of automatic wildcard insertion will be used when constructing a query clause. + * + * This allows wildcards to be added to the beginning and end of a term without having to manually do any string + * concatenation. + * + * The wildcard constants can be bitwise combined to select both leading and trailing wildcards. + * + * @constant + * @default + * @property {number} wildcard.NONE - The term will have no wildcards inserted, this is the default behaviour + * @property {number} wildcard.LEADING - Prepend the term with a wildcard, unless a leading wildcard already exists + * @property {number} wildcard.TRAILING - Append a wildcard to the term, unless a trailing wildcard already exists + * @see lunr.Query~Clause + * @see lunr.Query#clause + * @see lunr.Query#term + * @example query term with trailing wildcard + * query.term('foo', { wildcard: lunr.Query.wildcard.TRAILING }) + * @example query term with leading and trailing wildcard + * query.term('foo', { + * wildcard: lunr.Query.wildcard.LEADING | lunr.Query.wildcard.TRAILING + * }) + */ + +lunr.Query.wildcard = new String ("*") +lunr.Query.wildcard.NONE = 0 +lunr.Query.wildcard.LEADING = 1 +lunr.Query.wildcard.TRAILING = 2 + +/** + * Constants for indicating what kind of presence a term must have in matching documents. + * + * @constant + * @enum {number} + * @see lunr.Query~Clause + * @see lunr.Query#clause + * @see lunr.Query#term + * @example query term with required presence + * query.term('foo', { presence: lunr.Query.presence.REQUIRED }) + */ +lunr.Query.presence = { + /** + * Term's presence in a document is optional, this is the default value. + */ + OPTIONAL: 1, + + /** + * Term's presence in a document is required, documents that do not contain + * this term will not be returned. + */ + REQUIRED: 2, + + /** + * Term's presence in a document is prohibited, documents that do contain + * this term will not be returned. + */ + PROHIBITED: 3 +} + +/** + * A single clause in a {@link lunr.Query} contains a term and details on how to + * match that term against a {@link lunr.Index}. + * + * @typedef {Object} lunr.Query~Clause + * @property {string[]} fields - The fields in an index this clause should be matched against. + * @property {number} [boost=1] - Any boost that should be applied when matching this clause. + * @property {number} [editDistance] - Whether the term should have fuzzy matching applied, and how fuzzy the match should be. + * @property {boolean} [usePipeline] - Whether the term should be passed through the search pipeline. + * @property {number} [wildcard=lunr.Query.wildcard.NONE] - Whether the term should have wildcards appended or prepended. + * @property {number} [presence=lunr.Query.presence.OPTIONAL] - The terms presence in any matching documents. + */ + +/** + * Adds a {@link lunr.Query~Clause} to this query. + * + * Unless the clause contains the fields to be matched all fields will be matched. In addition + * a default boost of 1 is applied to the clause. + * + * @param {lunr.Query~Clause} clause - The clause to add to this query. + * @see lunr.Query~Clause + * @returns {lunr.Query} + */ +lunr.Query.prototype.clause = function (clause) { + if (!('fields' in clause)) { + clause.fields = this.allFields + } + + if (!('boost' in clause)) { + clause.boost = 1 + } + + if (!('usePipeline' in clause)) { + clause.usePipeline = true + } + + if (!('wildcard' in clause)) { + clause.wildcard = lunr.Query.wildcard.NONE + } + + if ((clause.wildcard & lunr.Query.wildcard.LEADING) && (clause.term.charAt(0) != lunr.Query.wildcard)) { + clause.term = "*" + clause.term + } + + if ((clause.wildcard & lunr.Query.wildcard.TRAILING) && (clause.term.slice(-1) != lunr.Query.wildcard)) { + clause.term = "" + clause.term + "*" + } + + if (!('presence' in clause)) { + clause.presence = lunr.Query.presence.OPTIONAL + } + + this.clauses.push(clause) + + return this +} + +/** + * A negated query is one in which every clause has a presence of + * prohibited. These queries require some special processing to return + * the expected results. + * + * @returns boolean + */ +lunr.Query.prototype.isNegated = function () { + for (var i = 0; i < this.clauses.length; i++) { + if (this.clauses[i].presence != lunr.Query.presence.PROHIBITED) { + return false + } + } + + return true +} + +/** + * Adds a term to the current query, under the covers this will create a {@link lunr.Query~Clause} + * to the list of clauses that make up this query. + * + * The term is used as is, i.e. no tokenization will be performed by this method. Instead conversion + * to a token or token-like string should be done before calling this method. + * + * The term will be converted to a string by calling `toString`. Multiple terms can be passed as an + * array, each term in the array will share the same options. + * + * @param {object|object[]} term - The term(s) to add to the query. + * @param {object} [options] - Any additional properties to add to the query clause. + * @returns {lunr.Query} + * @see lunr.Query#clause + * @see lunr.Query~Clause + * @example adding a single term to a query + * query.term("foo") + * @example adding a single term to a query and specifying search fields, term boost and automatic trailing wildcard + * query.term("foo", { + * fields: ["title"], + * boost: 10, + * wildcard: lunr.Query.wildcard.TRAILING + * }) + * @example using lunr.tokenizer to convert a string to tokens before using them as terms + * query.term(lunr.tokenizer("foo bar")) + */ +lunr.Query.prototype.term = function (term, options) { + if (Array.isArray(term)) { + term.forEach(function (t) { this.term(t, lunr.utils.clone(options)) }, this) + return this + } + + var clause = options || {} + clause.term = term.toString() + + this.clause(clause) + + return this +} +lunr.QueryParseError = function (message, start, end) { + this.name = "QueryParseError" + this.message = message + this.start = start + this.end = end +} + +lunr.QueryParseError.prototype = new Error +lunr.QueryLexer = function (str) { + this.lexemes = [] + this.str = str + this.length = str.length + this.pos = 0 + this.start = 0 + this.escapeCharPositions = [] +} + +lunr.QueryLexer.prototype.run = function () { + var state = lunr.QueryLexer.lexText + + while (state) { + state = state(this) + } +} + +lunr.QueryLexer.prototype.sliceString = function () { + var subSlices = [], + sliceStart = this.start, + sliceEnd = this.pos + + for (var i = 0; i < this.escapeCharPositions.length; i++) { + sliceEnd = this.escapeCharPositions[i] + subSlices.push(this.str.slice(sliceStart, sliceEnd)) + sliceStart = sliceEnd + 1 + } + + subSlices.push(this.str.slice(sliceStart, this.pos)) + this.escapeCharPositions.length = 0 + + return subSlices.join('') +} + +lunr.QueryLexer.prototype.emit = function (type) { + this.lexemes.push({ + type: type, + str: this.sliceString(), + start: this.start, + end: this.pos + }) + + this.start = this.pos +} + +lunr.QueryLexer.prototype.escapeCharacter = function () { + this.escapeCharPositions.push(this.pos - 1) + this.pos += 1 +} + +lunr.QueryLexer.prototype.next = function () { + if (this.pos >= this.length) { + return lunr.QueryLexer.EOS + } + + var char = this.str.charAt(this.pos) + this.pos += 1 + return char +} + +lunr.QueryLexer.prototype.width = function () { + return this.pos - this.start +} + +lunr.QueryLexer.prototype.ignore = function () { + if (this.start == this.pos) { + this.pos += 1 + } + + this.start = this.pos +} + +lunr.QueryLexer.prototype.backup = function () { + this.pos -= 1 +} + +lunr.QueryLexer.prototype.acceptDigitRun = function () { + var char, charCode + + do { + char = this.next() + charCode = char.charCodeAt(0) + } while (charCode > 47 && charCode < 58) + + if (char != lunr.QueryLexer.EOS) { + this.backup() + } +} + +lunr.QueryLexer.prototype.more = function () { + return this.pos < this.length +} + +lunr.QueryLexer.EOS = 'EOS' +lunr.QueryLexer.FIELD = 'FIELD' +lunr.QueryLexer.TERM = 'TERM' +lunr.QueryLexer.EDIT_DISTANCE = 'EDIT_DISTANCE' +lunr.QueryLexer.BOOST = 'BOOST' +lunr.QueryLexer.PRESENCE = 'PRESENCE' + +lunr.QueryLexer.lexField = function (lexer) { + lexer.backup() + lexer.emit(lunr.QueryLexer.FIELD) + lexer.ignore() + return lunr.QueryLexer.lexText +} + +lunr.QueryLexer.lexTerm = function (lexer) { + if (lexer.width() > 1) { + lexer.backup() + lexer.emit(lunr.QueryLexer.TERM) + } + + lexer.ignore() + + if (lexer.more()) { + return lunr.QueryLexer.lexText + } +} + +lunr.QueryLexer.lexEditDistance = function (lexer) { + lexer.ignore() + lexer.acceptDigitRun() + lexer.emit(lunr.QueryLexer.EDIT_DISTANCE) + return lunr.QueryLexer.lexText +} + +lunr.QueryLexer.lexBoost = function (lexer) { + lexer.ignore() + lexer.acceptDigitRun() + lexer.emit(lunr.QueryLexer.BOOST) + return lunr.QueryLexer.lexText +} + +lunr.QueryLexer.lexEOS = function (lexer) { + if (lexer.width() > 0) { + lexer.emit(lunr.QueryLexer.TERM) + } +} + +// This matches the separator used when tokenising fields +// within a document. These should match otherwise it is +// not possible to search for some tokens within a document. +// +// It is possible for the user to change the separator on the +// tokenizer so it _might_ clash with any other of the special +// characters already used within the search string, e.g. :. +// +// This means that it is possible to change the separator in +// such a way that makes some words unsearchable using a search +// string. +lunr.QueryLexer.termSeparator = lunr.tokenizer.separator + +lunr.QueryLexer.lexText = function (lexer) { + while (true) { + var char = lexer.next() + + if (char == lunr.QueryLexer.EOS) { + return lunr.QueryLexer.lexEOS + } + + // Escape character is '\' + if (char.charCodeAt(0) == 92) { + lexer.escapeCharacter() + continue + } + + if (char == ":") { + return lunr.QueryLexer.lexField + } + + if (char == "~") { + lexer.backup() + if (lexer.width() > 0) { + lexer.emit(lunr.QueryLexer.TERM) + } + return lunr.QueryLexer.lexEditDistance + } + + if (char == "^") { + lexer.backup() + if (lexer.width() > 0) { + lexer.emit(lunr.QueryLexer.TERM) + } + return lunr.QueryLexer.lexBoost + } + + // "+" indicates term presence is required + // checking for length to ensure that only + // leading "+" are considered + if (char == "+" && lexer.width() === 1) { + lexer.emit(lunr.QueryLexer.PRESENCE) + return lunr.QueryLexer.lexText + } + + // "-" indicates term presence is prohibited + // checking for length to ensure that only + // leading "-" are considered + if (char == "-" && lexer.width() === 1) { + lexer.emit(lunr.QueryLexer.PRESENCE) + return lunr.QueryLexer.lexText + } + + if (char.match(lunr.QueryLexer.termSeparator)) { + return lunr.QueryLexer.lexTerm + } + } +} + +lunr.QueryParser = function (str, query) { + this.lexer = new lunr.QueryLexer (str) + this.query = query + this.currentClause = {} + this.lexemeIdx = 0 +} + +lunr.QueryParser.prototype.parse = function () { + this.lexer.run() + this.lexemes = this.lexer.lexemes + + var state = lunr.QueryParser.parseClause + + while (state) { + state = state(this) + } + + return this.query +} + +lunr.QueryParser.prototype.peekLexeme = function () { + return this.lexemes[this.lexemeIdx] +} + +lunr.QueryParser.prototype.consumeLexeme = function () { + var lexeme = this.peekLexeme() + this.lexemeIdx += 1 + return lexeme +} + +lunr.QueryParser.prototype.nextClause = function () { + var completedClause = this.currentClause + this.query.clause(completedClause) + this.currentClause = {} +} + +lunr.QueryParser.parseClause = function (parser) { + var lexeme = parser.peekLexeme() + + if (lexeme == undefined) { + return + } + + switch (lexeme.type) { + case lunr.QueryLexer.PRESENCE: + return lunr.QueryParser.parsePresence + case lunr.QueryLexer.FIELD: + return lunr.QueryParser.parseField + case lunr.QueryLexer.TERM: + return lunr.QueryParser.parseTerm + default: + var errorMessage = "expected either a field or a term, found " + lexeme.type + + if (lexeme.str.length >= 1) { + errorMessage += " with value '" + lexeme.str + "'" + } + + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } +} + +lunr.QueryParser.parsePresence = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + switch (lexeme.str) { + case "-": + parser.currentClause.presence = lunr.Query.presence.PROHIBITED + break + case "+": + parser.currentClause.presence = lunr.Query.presence.REQUIRED + break + default: + var errorMessage = "unrecognised presence operator'" + lexeme.str + "'" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + var errorMessage = "expecting term or field, found nothing" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.FIELD: + return lunr.QueryParser.parseField + case lunr.QueryLexer.TERM: + return lunr.QueryParser.parseTerm + default: + var errorMessage = "expecting term or field, found '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + +lunr.QueryParser.parseField = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + if (parser.query.allFields.indexOf(lexeme.str) == -1) { + var possibleFields = parser.query.allFields.map(function (f) { return "'" + f + "'" }).join(', '), + errorMessage = "unrecognised field '" + lexeme.str + "', possible fields: " + possibleFields + + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + parser.currentClause.fields = [lexeme.str] + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + var errorMessage = "expecting term, found nothing" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.TERM: + return lunr.QueryParser.parseTerm + default: + var errorMessage = "expecting term, found '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + +lunr.QueryParser.parseTerm = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + parser.currentClause.term = lexeme.str.toLowerCase() + + if (lexeme.str.indexOf("*") != -1) { + parser.currentClause.usePipeline = false + } + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + parser.nextClause() + return + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.TERM: + parser.nextClause() + return lunr.QueryParser.parseTerm + case lunr.QueryLexer.FIELD: + parser.nextClause() + return lunr.QueryParser.parseField + case lunr.QueryLexer.EDIT_DISTANCE: + return lunr.QueryParser.parseEditDistance + case lunr.QueryLexer.BOOST: + return lunr.QueryParser.parseBoost + case lunr.QueryLexer.PRESENCE: + parser.nextClause() + return lunr.QueryParser.parsePresence + default: + var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + +lunr.QueryParser.parseEditDistance = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + var editDistance = parseInt(lexeme.str, 10) + + if (isNaN(editDistance)) { + var errorMessage = "edit distance must be numeric" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + parser.currentClause.editDistance = editDistance + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + parser.nextClause() + return + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.TERM: + parser.nextClause() + return lunr.QueryParser.parseTerm + case lunr.QueryLexer.FIELD: + parser.nextClause() + return lunr.QueryParser.parseField + case lunr.QueryLexer.EDIT_DISTANCE: + return lunr.QueryParser.parseEditDistance + case lunr.QueryLexer.BOOST: + return lunr.QueryParser.parseBoost + case lunr.QueryLexer.PRESENCE: + parser.nextClause() + return lunr.QueryParser.parsePresence + default: + var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + +lunr.QueryParser.parseBoost = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + var boost = parseInt(lexeme.str, 10) + + if (isNaN(boost)) { + var errorMessage = "boost must be numeric" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + parser.currentClause.boost = boost + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + parser.nextClause() + return + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.TERM: + parser.nextClause() + return lunr.QueryParser.parseTerm + case lunr.QueryLexer.FIELD: + parser.nextClause() + return lunr.QueryParser.parseField + case lunr.QueryLexer.EDIT_DISTANCE: + return lunr.QueryParser.parseEditDistance + case lunr.QueryLexer.BOOST: + return lunr.QueryParser.parseBoost + case lunr.QueryLexer.PRESENCE: + parser.nextClause() + return lunr.QueryParser.parsePresence + default: + var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + + /** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ + ;(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + root.lunr = factory() + } + }(this, function () { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return lunr + })) +})(); diff --git a/search/main.js b/search/main.js new file mode 100644 index 0000000..a5e469d --- /dev/null +++ b/search/main.js @@ -0,0 +1,109 @@ +function getSearchTermFromLocation() { + var sPageURL = window.location.search.substring(1); + var sURLVariables = sPageURL.split('&'); + for (var i = 0; i < sURLVariables.length; i++) { + var sParameterName = sURLVariables[i].split('='); + if (sParameterName[0] == 'q') { + return decodeURIComponent(sParameterName[1].replace(/\+/g, '%20')); + } + } +} + +function joinUrl (base, path) { + if (path.substring(0, 1) === "/") { + // path starts with `/`. Thus it is absolute. + return path; + } + if (base.substring(base.length-1) === "/") { + // base ends with `/` + return base + path; + } + return base + "/" + path; +} + +function escapeHtml (value) { + return value.replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>'); +} + +function formatResult (location, title, summary) { + return ''; +} + +function displayResults (results) { + var search_results = document.getElementById("mkdocs-search-results"); + while (search_results.firstChild) { + search_results.removeChild(search_results.firstChild); + } + if (results.length > 0){ + for (var i=0; i < results.length; i++){ + var result = results[i]; + var html = formatResult(result.location, result.title, result.summary); + search_results.insertAdjacentHTML('beforeend', html); + } + } else { + var noResultsText = search_results.getAttribute('data-no-results-text'); + if (!noResultsText) { + noResultsText = "No results found"; + } + search_results.insertAdjacentHTML('beforeend', '

' + noResultsText + '

'); + } +} + +function doSearch () { + var query = document.getElementById('mkdocs-search-query').value; + if (query.length > min_search_length) { + if (!window.Worker) { + displayResults(search(query)); + } else { + searchWorker.postMessage({query: query}); + } + } else { + // Clear results for short queries + displayResults([]); + } +} + +function initSearch () { + var search_input = document.getElementById('mkdocs-search-query'); + if (search_input) { + search_input.addEventListener("keyup", doSearch); + } + var term = getSearchTermFromLocation(); + if (term) { + search_input.value = term; + doSearch(); + } +} + +function onWorkerMessage (e) { + if (e.data.allowSearch) { + initSearch(); + } else if (e.data.results) { + var results = e.data.results; + displayResults(results); + } else if (e.data.config) { + min_search_length = e.data.config.min_search_length-1; + } +} + +if (!window.Worker) { + console.log('Web Worker API not supported'); + // load index in main thread + $.getScript(joinUrl(base_url, "search/worker.js")).done(function () { + console.log('Loaded worker'); + init(); + window.postMessage = function (msg) { + onWorkerMessage({data: msg}); + }; + }).fail(function (jqxhr, settings, exception) { + console.error('Could not load worker.js'); + }); +} else { + // Wrap search in a web worker + var searchWorker = new Worker(joinUrl(base_url, "search/worker.js")); + searchWorker.postMessage({init: true}); + searchWorker.onmessage = onWorkerMessage; +} diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 0000000..43a48c3 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Welkom Welkom bij de beschrijving van de Geonovum Werkwijze. Deze helpfiles beschrijven welke tools we gebruiken voor het maken en beheren van de standaarden van Geonovum. Deze tools staan in onderstaand overzicht. Daaronder staat de publicatieomgeving van Geonovum beschreven. Geonovum tooling Enterprise Architect Overzicht Primitieve datatypes : Handleiding en toelichting op het toepassen van standaarddatatypes in modelleeromgeving Geonovum. GitHub : GitHub werkwijze : algemene inleiding over GitHub. GitHub handleiding : Hoe maak je een account aan en hoe doe je beheertaken. Imvertor Imvertor : Verwijzingen naar verschillende onderwerpen met betrekking tot Imvertor. Markdown Markdown handleiding : Handleiding werken met Markdown voor ReSpec-documentatie. ReSpec Respec handleiding : Algemene handleiding. Respec code toepassen : Richtlijnen voor het toepassen van code in documentatie. Respec definitielijst maken : Handleiding voor het maken van een definitielijst in ReSpec-documentatie. MIM Toolbox importeren : Handleiding voor het importeren van de MIM-toolbox in EA. Toolbox genereren : Handleiding voor het maken van een EA-toolbox. Toolbox genereren extensie : Handleiding voor het maken van een extensie op de MIM-toolbox. Subversion (SVN) Subversion installeren voor EA : Installatie SVN en informatiemodel in versiebeheer zetten. Subversion importeren bestaand project : Packages importeren vanuit SVN in EA. GML GML : Toelichting GML, XSD en Namespaces. Ontologie Ontologie : Handleiding voor het maken en publiceren van een ontologie. Word Conversies Word2werkversie Voor licenties of de interne beheerder van de tooling kun je terecht op intranet Documentatie elders De documentatie van de werkwijze is niet alleen hier vastgelegd. Links naar andere documenten: werkomgeving modelleren . werkwijze modelleren . geonovum werkwijze modelleren Geonovum publicatieomgeving Verschillende onderdelen van standaarden worden op verschillende plaatsen gepubliceerd. De publicatieomgeving ziet er als volgt uit Documenten (docs.geostandaarden.nl) Standaarden en technische documentatie. Voor een nette lijst van pubdomains op docs.geostandaarden.nl moet de de volgende lijst up-to-date zijn: pubDomainList.json Het Technisch Register (register.geostandaarden.nl) Technische onderdelen van de standaard worden op: register.geostandaarden.nl gezet. Hoe je dit met een webhook kan doen staat beschreven in: technisch-register-2019 Ontologie\u00ebn (begrippen.geostandaarden.nl) Conceptenbibliotheek (definities.geostandaarden.nl) MkDocs voor deze handleiding De handleiding wordt beheerd in MkDocs . Dit is een lichtgewicht tool die een collectie Markdown handleidingen omzet in een navigeerbare handleiding. De handleiding staat op github pages . De bronbestanden staan in: handleiding-tooling . Je kunt mkdocs ook lokaal installeren. Dan kun je live je edits volgen in je browser: http://127.0.0.1:8000/ met het commando: mkdocs serve","title":"Welkom"},{"location":"#welkom","text":"Welkom bij de beschrijving van de Geonovum Werkwijze. Deze helpfiles beschrijven welke tools we gebruiken voor het maken en beheren van de standaarden van Geonovum. Deze tools staan in onderstaand overzicht. Daaronder staat de publicatieomgeving van Geonovum beschreven.","title":"Welkom"},{"location":"#geonovum-tooling","text":"Enterprise Architect Overzicht Primitieve datatypes : Handleiding en toelichting op het toepassen van standaarddatatypes in modelleeromgeving Geonovum. GitHub : GitHub werkwijze : algemene inleiding over GitHub. GitHub handleiding : Hoe maak je een account aan en hoe doe je beheertaken. Imvertor Imvertor : Verwijzingen naar verschillende onderwerpen met betrekking tot Imvertor. Markdown Markdown handleiding : Handleiding werken met Markdown voor ReSpec-documentatie. ReSpec Respec handleiding : Algemene handleiding. Respec code toepassen : Richtlijnen voor het toepassen van code in documentatie. Respec definitielijst maken : Handleiding voor het maken van een definitielijst in ReSpec-documentatie. MIM Toolbox importeren : Handleiding voor het importeren van de MIM-toolbox in EA. Toolbox genereren : Handleiding voor het maken van een EA-toolbox. Toolbox genereren extensie : Handleiding voor het maken van een extensie op de MIM-toolbox. Subversion (SVN) Subversion installeren voor EA : Installatie SVN en informatiemodel in versiebeheer zetten. Subversion importeren bestaand project : Packages importeren vanuit SVN in EA. GML GML : Toelichting GML, XSD en Namespaces. Ontologie Ontologie : Handleiding voor het maken en publiceren van een ontologie. Word Conversies Word2werkversie Voor licenties of de interne beheerder van de tooling kun je terecht op intranet","title":"Geonovum tooling"},{"location":"#documentatie-elders","text":"De documentatie van de werkwijze is niet alleen hier vastgelegd. Links naar andere documenten: werkomgeving modelleren . werkwijze modelleren . geonovum werkwijze modelleren","title":"Documentatie elders"},{"location":"#geonovum-publicatieomgeving","text":"Verschillende onderdelen van standaarden worden op verschillende plaatsen gepubliceerd. De publicatieomgeving ziet er als volgt uit","title":"Geonovum publicatieomgeving"},{"location":"#documenten-docsgeostandaardennl","text":"Standaarden en technische documentatie. Voor een nette lijst van pubdomains op docs.geostandaarden.nl moet de de volgende lijst up-to-date zijn: pubDomainList.json","title":"Documenten (docs.geostandaarden.nl)"},{"location":"#het-technisch-register-registergeostandaardennl","text":"Technische onderdelen van de standaard worden op: register.geostandaarden.nl gezet. Hoe je dit met een webhook kan doen staat beschreven in: technisch-register-2019","title":"Het Technisch Register (register.geostandaarden.nl)"},{"location":"#ontologieen-begrippengeostandaardennl","text":"","title":"Ontologie\u00ebn (begrippen.geostandaarden.nl)"},{"location":"#conceptenbibliotheek-definitiesgeostandaardennl","text":"","title":"Conceptenbibliotheek (definities.geostandaarden.nl)"},{"location":"#mkdocs-voor-deze-handleiding","text":"De handleiding wordt beheerd in MkDocs . Dit is een lichtgewicht tool die een collectie Markdown handleidingen omzet in een navigeerbare handleiding. De handleiding staat op github pages . De bronbestanden staan in: handleiding-tooling . Je kunt mkdocs ook lokaal installeren. Dan kun je live je edits volgen in je browser: http://127.0.0.1:8000/ met het commando: mkdocs serve","title":"MkDocs voor deze handleiding"},{"location":"EA-toepassing-standaarddatatypen/","text":"EA - Gebruik standaarddatatypes (intern) Note > @Gerard : screenshots toevoegen Bij Geonovum gebruiken we een aantal voorgedefineerde datatypes. Deze zijn opgedeeld in drie categorie\u00ebn: MIM11 -- Dit package bevat de datatypes die voorgedefinieerd zijn in het MIM Geonovum geometrie -- Dit package bevat de geometrietypes uit ISO19107 . Deze zijn in een los package gestopt zodat andere partijen die alleen geometrie willen gebruik deze types kunnen gebruiken, Geonovum algemeen -- In dit package zitten alle overige datatypes die in Geonovum UML packages gebruikt worden. Merk op dat in dit package ook wat geometrie types zitten; dit zijn types die niet uit ISO-19107 komen. Bij voorkeur worden deze niet in de modellering gebruikt. In: svn.geostandaarden.nl/Datatypes zijn drie collecties met primitieve types opgenomen die alle primitieve types bevat die in Geonovum UML modellen gebruikt Deze packages zijn in beheer bij @wilkoquak. Het is de bedoeling dat er in [Imvertor] een mapping komt die precies overeenkomt het deze drie collecties types Geometrie datatypes In dit package zitten de geometrische datatypes zoals genoemd in ISO19107:2003 . MIM datatypes In dit package zitten de geometrische datatypes zoals genoemd in MIM . Geonovum datatypes In dit package zitten datatypes die niet in de twee eerdergenoemde packages vallen maar wel ergens gebruikt zijn bij Geonovum. Note > @Wilko wil jij een korte toelichting geven op de driedeling. Wat vind je waar en waarom? Alle basic datatypes binnen UML zouden in \u00e9\u00e9n van deze packages moeten staan. Als dat niet zo is neem dan contact op met @Wilko . Je vindt ze op SVN: svn://svn.geostandaarden.nl/Datatypes : Warning Onderstaande naamgeving klopt niet meer. Dit is door Wilko in overleg aangepast. @Gerard : graag updaten! MIM11.xml Geonovum-algemeen.xml Geonovum-geometrie.xml Note Er is nu nog een Datatyps.xml waarin alle datatypes zitten deze gaat binnenkort verdwijnen. Datatypes importeren voor gebruik in EA Lees hoe je deze types als packages importeert in de handleiding SVN - importeren bestaand project . Gebruik packages in EA Deze packages zijn bedoeld voor toepassing binnen een informatiemodel. Het is niet de bedoeling om de packages in of uit te checken; er hoeven immers geen wijzigingen in aangebracht te worden. Note > @Wilko en @Paul : Eigenlijk zou je hier een beperkt aantal mensen schrijfrechten willen geven en de rest alleen lees-rechten. Ik heb zoiets nog niet kunnen vinden. @Gerart : je kunt dat instellen door in configuratiebestandjes op svn.geostandaarden.nl, maar dan moet je daar wel bij kunnen. Verwijzen naar een datatype Note > @Gerard : In deze paragraaf een uitleg opnemen hoe je vanuit Enterprise Architect een voorgedefineerd datatype opneemt bij een \u00abAttribuutsoort\u00bb . |","title":"standaarddatatypen"},{"location":"EA-toepassing-standaarddatatypen/#ea-gebruik-standaarddatatypes-intern","text":"Note > @Gerard : screenshots toevoegen Bij Geonovum gebruiken we een aantal voorgedefineerde datatypes. Deze zijn opgedeeld in drie categorie\u00ebn: MIM11 -- Dit package bevat de datatypes die voorgedefinieerd zijn in het MIM Geonovum geometrie -- Dit package bevat de geometrietypes uit ISO19107 . Deze zijn in een los package gestopt zodat andere partijen die alleen geometrie willen gebruik deze types kunnen gebruiken, Geonovum algemeen -- In dit package zitten alle overige datatypes die in Geonovum UML packages gebruikt worden. Merk op dat in dit package ook wat geometrie types zitten; dit zijn types die niet uit ISO-19107 komen. Bij voorkeur worden deze niet in de modellering gebruikt. In: svn.geostandaarden.nl/Datatypes zijn drie collecties met primitieve types opgenomen die alle primitieve types bevat die in Geonovum UML modellen gebruikt Deze packages zijn in beheer bij @wilkoquak. Het is de bedoeling dat er in [Imvertor] een mapping komt die precies overeenkomt het deze drie collecties types","title":"EA - Gebruik standaarddatatypes (intern)"},{"location":"EA-toepassing-standaarddatatypen/#geometrie-datatypes","text":"In dit package zitten de geometrische datatypes zoals genoemd in ISO19107:2003 .","title":"Geometrie datatypes"},{"location":"EA-toepassing-standaarddatatypen/#mim-datatypes","text":"In dit package zitten de geometrische datatypes zoals genoemd in MIM .","title":"MIM datatypes"},{"location":"EA-toepassing-standaarddatatypen/#geonovum-datatypes","text":"In dit package zitten datatypes die niet in de twee eerdergenoemde packages vallen maar wel ergens gebruikt zijn bij Geonovum. Note > @Wilko wil jij een korte toelichting geven op de driedeling. Wat vind je waar en waarom? Alle basic datatypes binnen UML zouden in \u00e9\u00e9n van deze packages moeten staan. Als dat niet zo is neem dan contact op met @Wilko . Je vindt ze op SVN: svn://svn.geostandaarden.nl/Datatypes : Warning Onderstaande naamgeving klopt niet meer. Dit is door Wilko in overleg aangepast. @Gerard : graag updaten! MIM11.xml Geonovum-algemeen.xml Geonovum-geometrie.xml Note Er is nu nog een Datatyps.xml waarin alle datatypes zitten deze gaat binnenkort verdwijnen.","title":"Geonovum datatypes"},{"location":"EA-toepassing-standaarddatatypen/#datatypes-importeren-voor-gebruik-in-ea","text":"Lees hoe je deze types als packages importeert in de handleiding SVN - importeren bestaand project .","title":"Datatypes importeren voor gebruik in EA"},{"location":"EA-toepassing-standaarddatatypen/#gebruik-packages-in-ea","text":"Deze packages zijn bedoeld voor toepassing binnen een informatiemodel. Het is niet de bedoeling om de packages in of uit te checken; er hoeven immers geen wijzigingen in aangebracht te worden. Note > @Wilko en @Paul : Eigenlijk zou je hier een beperkt aantal mensen schrijfrechten willen geven en de rest alleen lees-rechten. Ik heb zoiets nog niet kunnen vinden. @Gerart : je kunt dat instellen door in configuratiebestandjes op svn.geostandaarden.nl, maar dan moet je daar wel bij kunnen.","title":"Gebruik packages in EA"},{"location":"EA-toepassing-standaarddatatypen/#verwijzen-naar-een-datatype","text":"Note > @Gerard : In deze paragraaf een uitleg opnemen hoe je vanuit Enterprise Architect een voorgedefineerd datatype opneemt bij een \u00abAttribuutsoort\u00bb . |","title":"Verwijzen naar een datatype"},{"location":"EA/","text":"Enterprise Architect Instructie voor het gebruik van Enterprise Architect binnen Geonovum: Installatie van de software. Gebruik van de MIM Toolbox. Installatie Op de website is een proefversie van Enterprise Architect te downloaden. Neem voor een licentie contact op met de beheerder De MIM toolbox Importeer de MIM toolbox: Zie: MIM toolbox importeren Externe links: Handleiding gebruik MIM-toolbox Handleiding genereren MIM-profiel Handleiding genereren Extensie MIM-toolbox","title":"Overzicht"},{"location":"EA/#enterprise-architect","text":"Instructie voor het gebruik van Enterprise Architect binnen Geonovum: Installatie van de software. Gebruik van de MIM Toolbox.","title":"Enterprise Architect"},{"location":"EA/#installatie","text":"Op de website is een proefversie van Enterprise Architect te downloaden. Neem voor een licentie contact op met de beheerder","title":"Installatie"},{"location":"EA/#de-mim-toolbox","text":"Importeer de MIM toolbox: Zie: MIM toolbox importeren Externe links: Handleiding gebruik MIM-toolbox Handleiding genereren MIM-profiel Handleiding genereren Extensie MIM-toolbox","title":"De MIM toolbox"},{"location":"GML/","text":"GML en XSD Een algemene handleiding voor het opslaag van Geometrie in GML bestanden is te vinden in: Geometrie in model en GML XSD en Namespaces Bij een XML applicatie schema (dus ook voor GML schema's) wordt vaak een namespace gebruikt. Deze namespace hoort vaak bij een domein en het is de bedoel dat de combinatie van de namespace en het element uniek is. Dit kan alleen als de namespace, die de vorm van een URI heeft uniek is. Door een URI te kiezen die bij jou onder beheer is weet je zeker dat de combinatie uniek is. In de volgende paragraaf zie je een lijste gebruikte namespaces. Hieronder wat richtlijnen. Voor de basis wordt: http://www.geostandaarden.nl gebruikt. Het is nog even de vraag of we niet op https moeten overstappen. Dat doen we niet want niemand anders doet deze overstap. Daarna volgt een identificatie van de standaard. Een versienummer volgens semver X.Y. Een Z-versie is niet nodig omdat alle Z-versies backwards compatible zijn en je dus nooit meer dan 1 versie gebruikt. De volgende model onderdelen wordt gebruikt bij het maken construeren van schemas: Een schema heeft een [X.Y.Z] versienummer Een schema hoort bij een standaard met een [standaard] Een schema heeft een onderdeel [onderdeel] Samen wordt dit: namespace van schema: http://www.geostandaarden.nl/[standaard]/[onderdeel]/x.y locatie van schema: https://register.geostanadaarden.nl/xmlschema/[standaard]/[x.y.z]/[onderdeel].xsd vesion in het schema: [x.y.z] Bij een standaard zonder onderdelen wordt de bestandsnaam als onderdeelnaam gebruikt bij locatie. Namespaces in door Geonovum beheerde schema's GML applicatieschema's zijn te vinden op: https://register.geostandaarden.nl/gmlapplicatieschema/ Een korte inventarisatie levert: standaard versie namespace basisgeometrie 1.0.0 http://www.geostandaarden.nl/basisgeometrie/1.0 basisgeometrie v20190901 http://www.geostandaarden.nl/basisgeometrie/v20190901 brt-algemeen 1.2.0 http://register.geostandaarden.nl/gmlapplicatieschema/brt-algemeen/1.2.0 imaer 5.1.1 http://imaer.aerius.nl/5.1 img 3.0.0 http://www.geluidgegevens.nl/IMGeluid/3.0 imgeo (simple) 2.1.1 http://www.geostandaarden.nl/imgeo/2.1/simple/gml31 imgeo 2.1.1 http://www.geostandaarden.nl/imgeo/2.1 imkl (wibon) 2.0.0 http://www.geostandaarden.nl/imkl/wibon imkl (wibonbr) 2.0.0 http://www.geostandaarden.nl/imkl/wibonbr imkl2015 (wionbr) 1.2 http://www.geostandaarden.nl/imkl/2015/wionbr/1.2 imkl2015 (wionbr) 1.2.1 http://www.geostandaarden.nl/imkl/2015/wionbr/1.2 top10nl 1.1.1 http://www.kadaster.nl/schemas/top10nl/v20120116 top10nl 1.2.0 http://register.geostandaarden.nl/gmlapplicatieschema/top10nl/1.2.0","title":"GML"},{"location":"GML/#gml-en-xsd","text":"Een algemene handleiding voor het opslaag van Geometrie in GML bestanden is te vinden in: Geometrie in model en GML","title":"GML en XSD"},{"location":"GML/#xsd-en-namespaces","text":"Bij een XML applicatie schema (dus ook voor GML schema's) wordt vaak een namespace gebruikt. Deze namespace hoort vaak bij een domein en het is de bedoel dat de combinatie van de namespace en het element uniek is. Dit kan alleen als de namespace, die de vorm van een URI heeft uniek is. Door een URI te kiezen die bij jou onder beheer is weet je zeker dat de combinatie uniek is. In de volgende paragraaf zie je een lijste gebruikte namespaces. Hieronder wat richtlijnen. Voor de basis wordt: http://www.geostandaarden.nl gebruikt. Het is nog even de vraag of we niet op https moeten overstappen. Dat doen we niet want niemand anders doet deze overstap. Daarna volgt een identificatie van de standaard. Een versienummer volgens semver X.Y. Een Z-versie is niet nodig omdat alle Z-versies backwards compatible zijn en je dus nooit meer dan 1 versie gebruikt. De volgende model onderdelen wordt gebruikt bij het maken construeren van schemas: Een schema heeft een [X.Y.Z] versienummer Een schema hoort bij een standaard met een [standaard] Een schema heeft een onderdeel [onderdeel] Samen wordt dit: namespace van schema: http://www.geostandaarden.nl/[standaard]/[onderdeel]/x.y locatie van schema: https://register.geostanadaarden.nl/xmlschema/[standaard]/[x.y.z]/[onderdeel].xsd vesion in het schema: [x.y.z] Bij een standaard zonder onderdelen wordt de bestandsnaam als onderdeelnaam gebruikt bij locatie.","title":"XSD en Namespaces"},{"location":"GML/#namespaces-in-door-geonovum-beheerde-schemas","text":"GML applicatieschema's zijn te vinden op: https://register.geostandaarden.nl/gmlapplicatieschema/ Een korte inventarisatie levert: standaard versie namespace basisgeometrie 1.0.0 http://www.geostandaarden.nl/basisgeometrie/1.0 basisgeometrie v20190901 http://www.geostandaarden.nl/basisgeometrie/v20190901 brt-algemeen 1.2.0 http://register.geostandaarden.nl/gmlapplicatieschema/brt-algemeen/1.2.0 imaer 5.1.1 http://imaer.aerius.nl/5.1 img 3.0.0 http://www.geluidgegevens.nl/IMGeluid/3.0 imgeo (simple) 2.1.1 http://www.geostandaarden.nl/imgeo/2.1/simple/gml31 imgeo 2.1.1 http://www.geostandaarden.nl/imgeo/2.1 imkl (wibon) 2.0.0 http://www.geostandaarden.nl/imkl/wibon imkl (wibonbr) 2.0.0 http://www.geostandaarden.nl/imkl/wibonbr imkl2015 (wionbr) 1.2 http://www.geostandaarden.nl/imkl/2015/wionbr/1.2 imkl2015 (wionbr) 1.2.1 http://www.geostandaarden.nl/imkl/2015/wionbr/1.2 top10nl 1.1.1 http://www.kadaster.nl/schemas/top10nl/v20120116 top10nl 1.2.0 http://register.geostandaarden.nl/gmlapplicatieschema/top10nl/1.2.0","title":"Namespaces in door Geonovum beheerde schema's"},{"location":"GitHub-Inleiding/","text":"Inleiding Github Bij Geonovum worden documenten (standaarden, onderzoeken, rapporten, enz) web-based gepubliceerd. Ook worden de documenten vaak in een werkgroep gemaakt, waarbij ieder werkgroeplid meeschrijft aan het document. Om dit te kunnen gebruiken we een aantal tools: GitHub, Respec en Markdown. Deze introductie gaat over Github. Waarschijnlijk wil je weten wat GitHub is, anders was je nu niet deze handleiding aan het lezen. Je gaat hier meer over GitHub lezen en waarom het handig is. Er zijn een aantal GitHub termen die alvast handig zijn om te weten. Tot slot lees je hoe je zelf aan de slag kan gaan met GitHub. Meer over Github Veel programmeurs wereldwijd maken gebruik van de website GitHub. Zelf zal je er misschien ook wel van gehoord hebben. Als programmeur is het handig om te weten wat GitHub is en hoe je er gebruik van maakt. GitHub bestaat uit twee woorden, namelijk Git + Hub. Laten we beginnen met Git. *Git is een open source versiebeheersysteem. De website GitHub is gemaakt op basis van het versiebeheersysteem Git. Met GitHub heb je alle mogelijkheden van Git + extra features. In een versiebeheersysteem kunnen programmeurs projecten beheren met code. Het is mogelijk om verschillende versies te beheren en eventueel terug te vallen op een oude versie, mocht er iets misgaan. Stel dat je met een team een app wilt programmeren. Dan is het handig als iedereen bij het project kan met daarin alle code van de app. Ook is het handig dat iedereen de laatste code wijzigingen ziet van teamleden en daar eventueel op kan reageren en/of het aanpassen. Bij Geonovum gebruiken we Github op een andere manier. Namelijk voor het voor werken aan documentatie voor geostandaarden. Per project is een repository aangemaakt. Een Repository is eenvoudig gezegd een werkmap/projectomgeving. Andere mogelijkheden van Github Je weet nu dat het mogelijk is om in een team projecten (Waarin code staat) te beheren op GitHub. Het is natuurlijk ook mogelijk om je eigen projecten op GitHub te beheren. Zo heb je een goed overzicht van de aanpassingen en verschillende versies. Daarnaast staat je project online. Als je een belangrijk project bijvoorbeeld alleen lokaal op je eigen computer opslaat en je computer houdt ermee op, dan ben je zwaar de pineut. Op GitHub kan je er gewoon altijd bij. Maar welke mogelijkheden heeft GitHub nog meer? Hier staan een aantal belangrijke mogelijkheden op een rijtje: Een project maken gebaseerd op een project dat al bestaat Discussie starten over een project Code reviewen Aparte branches maken, waarin je bijvoorbeeld code aanpassingen doet om te testen, die niet gelijk in de \u201cproductieversie\u201d komen Code van branch samenvoegen met andere branch Tags meegeven aan verschillende versies, zoals V1.0 en V2.0 Kwetsbaarheden in de code makkelijker ontdekken, GitHub stuurt ook een mail als het kwetsbaarheden ontdekt Een website hosten Voordelen van GitHub GitHub zorgt ervoor dat een individueel of een project in teamverband erg overzichtelijk is. Je hebt een goed overzicht van de laatste aanpassingen en welke persoon dat heeft gedaan. Je kan eenvoudig meerdere versies maken en eenvoudig terugvallen op een vorige versie, mocht het misgaan. Door de verschillende branches loop je geen enkel risico bij het aanpassen en testen van nieuwe code. Meer over branches in \u201cBetekenissen van GitHub termen\u201d . Voor programmeurs maakt GitHub het werken een stuk makkelijker en leuker. Stel dat je als programmeur niet aan versiebeheer zou doen of dat zou doen met een slecht versiebeheersysteem, dan ga je vroeg of laat in de problemen komen. GitHub is een centrale plek waar heel veel programmeurs en teams hun projecten beheren. Veel projecten zijn open source en kunnen door iedereen worden ingezien en aangepast. Het is erg leerzaam om naar projecten van anderen te kijken. Als je wat meer ervaring hebt, kan je misschien wel verbeteringen voorstellen en meedoen aan gave projecten! Met GitHub gaat er als programmeur een wereld voor je open. Het is goed om projecten te beheren en je kan er ook heel veel leren. Betekenis van Github termen? Op GitHub zijn er een aantal termen die handig zijn om alvast te weten. Als je meer gebruik gaat maken van GitHub, dan leer je de betekenis van deze termen vanzelf kennen. Hieronder staan belangrijke GitHub termen en de betekenis ervan: GitHub term Betekenis Repository Een repository kan je zien als de hoofdmap van je project. Hierin staan alle bestanden van je project en de historie van wijzigingen die je hebt gedaan. Branch Aparte plek binnen je repository, waar je bijvoorbeeld nieuwe code kan testen, zonder dat te hoeven doen op de 'productversie'. Master Dit is de hoofdbranch, oftewel de \u201cproductversie\u201d van je project. Nieuwe code die is getest en goedgekeurd, wordt samengevoegd met de Master branch. Fork Een fork is een kopie van een repository. Hierdoor kan je werken aan een project van iemand anders, zonder het origineel aan te passen. Commit Git commando dat veranderingen toevoegt aan je lokale repository. Push Git commando om aanpassingen naar je (remote) repository te sturen, die staat op GitHub. Pull Git commando om aanpassingen van je (remote) repository naar je lokale bestanden te sturen. Merge Git commando om aanpassingen van een branch samen te voegen met een andere branch. Bijvoorbeeld aanpassingen die getest en goedgekeurd zijn in de \u201cDevelop\u201d branch samenvoegen met de \u201cMaster\u201d branch. Checkout Deze Git commando wordt vaak gebruikt om te switchen tussen branches. Je checkt als het ware uit bij een branch en gaat aan de slag in een andere branch. Zelf aan de slag met Github Hopelijk heb je een beter beeld over wat GitHub is. Ben je een gebruiker of wil je programmeur worden en werk je nog niet met een (goed) versiebeheersysteem? Dan is het zeker aan te raden om te beginnen met GitHub. Als je een account hebt aangemaakt kun je zelf een repository aanmaken. Zie hiervoor: Aanmaken GitHub Account Stuur een mail naar account@geonovum.nl om toegevoegd te worden aan deze repository. Je moet dan wel eerst een account aangemaakt hebben op github","title":"GitHub Intro"},{"location":"GitHub-Inleiding/#inleiding-github","text":"Bij Geonovum worden documenten (standaarden, onderzoeken, rapporten, enz) web-based gepubliceerd. Ook worden de documenten vaak in een werkgroep gemaakt, waarbij ieder werkgroeplid meeschrijft aan het document. Om dit te kunnen gebruiken we een aantal tools: GitHub, Respec en Markdown. Deze introductie gaat over Github. Waarschijnlijk wil je weten wat GitHub is, anders was je nu niet deze handleiding aan het lezen. Je gaat hier meer over GitHub lezen en waarom het handig is. Er zijn een aantal GitHub termen die alvast handig zijn om te weten. Tot slot lees je hoe je zelf aan de slag kan gaan met GitHub.","title":"Inleiding Github"},{"location":"GitHub-Inleiding/#meer-over-github","text":"Veel programmeurs wereldwijd maken gebruik van de website GitHub. Zelf zal je er misschien ook wel van gehoord hebben. Als programmeur is het handig om te weten wat GitHub is en hoe je er gebruik van maakt. GitHub bestaat uit twee woorden, namelijk Git + Hub. Laten we beginnen met Git. *Git is een open source versiebeheersysteem. De website GitHub is gemaakt op basis van het versiebeheersysteem Git. Met GitHub heb je alle mogelijkheden van Git + extra features. In een versiebeheersysteem kunnen programmeurs projecten beheren met code. Het is mogelijk om verschillende versies te beheren en eventueel terug te vallen op een oude versie, mocht er iets misgaan. Stel dat je met een team een app wilt programmeren. Dan is het handig als iedereen bij het project kan met daarin alle code van de app. Ook is het handig dat iedereen de laatste code wijzigingen ziet van teamleden en daar eventueel op kan reageren en/of het aanpassen. Bij Geonovum gebruiken we Github op een andere manier. Namelijk voor het voor werken aan documentatie voor geostandaarden. Per project is een repository aangemaakt. Een Repository is eenvoudig gezegd een werkmap/projectomgeving.","title":"Meer over Github"},{"location":"GitHub-Inleiding/#andere-mogelijkheden-van-github","text":"Je weet nu dat het mogelijk is om in een team projecten (Waarin code staat) te beheren op GitHub. Het is natuurlijk ook mogelijk om je eigen projecten op GitHub te beheren. Zo heb je een goed overzicht van de aanpassingen en verschillende versies. Daarnaast staat je project online. Als je een belangrijk project bijvoorbeeld alleen lokaal op je eigen computer opslaat en je computer houdt ermee op, dan ben je zwaar de pineut. Op GitHub kan je er gewoon altijd bij. Maar welke mogelijkheden heeft GitHub nog meer? Hier staan een aantal belangrijke mogelijkheden op een rijtje: Een project maken gebaseerd op een project dat al bestaat Discussie starten over een project Code reviewen Aparte branches maken, waarin je bijvoorbeeld code aanpassingen doet om te testen, die niet gelijk in de \u201cproductieversie\u201d komen Code van branch samenvoegen met andere branch Tags meegeven aan verschillende versies, zoals V1.0 en V2.0 Kwetsbaarheden in de code makkelijker ontdekken, GitHub stuurt ook een mail als het kwetsbaarheden ontdekt Een website hosten","title":"Andere mogelijkheden van Github"},{"location":"GitHub-Inleiding/#voordelen-van-github","text":"GitHub zorgt ervoor dat een individueel of een project in teamverband erg overzichtelijk is. Je hebt een goed overzicht van de laatste aanpassingen en welke persoon dat heeft gedaan. Je kan eenvoudig meerdere versies maken en eenvoudig terugvallen op een vorige versie, mocht het misgaan. Door de verschillende branches loop je geen enkel risico bij het aanpassen en testen van nieuwe code. Meer over branches in \u201cBetekenissen van GitHub termen\u201d . Voor programmeurs maakt GitHub het werken een stuk makkelijker en leuker. Stel dat je als programmeur niet aan versiebeheer zou doen of dat zou doen met een slecht versiebeheersysteem, dan ga je vroeg of laat in de problemen komen. GitHub is een centrale plek waar heel veel programmeurs en teams hun projecten beheren. Veel projecten zijn open source en kunnen door iedereen worden ingezien en aangepast. Het is erg leerzaam om naar projecten van anderen te kijken. Als je wat meer ervaring hebt, kan je misschien wel verbeteringen voorstellen en meedoen aan gave projecten! Met GitHub gaat er als programmeur een wereld voor je open. Het is goed om projecten te beheren en je kan er ook heel veel leren. Betekenis van Github termen? Op GitHub zijn er een aantal termen die handig zijn om alvast te weten. Als je meer gebruik gaat maken van GitHub, dan leer je de betekenis van deze termen vanzelf kennen. Hieronder staan belangrijke GitHub termen en de betekenis ervan: GitHub term Betekenis Repository Een repository kan je zien als de hoofdmap van je project. Hierin staan alle bestanden van je project en de historie van wijzigingen die je hebt gedaan. Branch Aparte plek binnen je repository, waar je bijvoorbeeld nieuwe code kan testen, zonder dat te hoeven doen op de 'productversie'. Master Dit is de hoofdbranch, oftewel de \u201cproductversie\u201d van je project. Nieuwe code die is getest en goedgekeurd, wordt samengevoegd met de Master branch. Fork Een fork is een kopie van een repository. Hierdoor kan je werken aan een project van iemand anders, zonder het origineel aan te passen. Commit Git commando dat veranderingen toevoegt aan je lokale repository. Push Git commando om aanpassingen naar je (remote) repository te sturen, die staat op GitHub. Pull Git commando om aanpassingen van je (remote) repository naar je lokale bestanden te sturen. Merge Git commando om aanpassingen van een branch samen te voegen met een andere branch. Bijvoorbeeld aanpassingen die getest en goedgekeurd zijn in de \u201cDevelop\u201d branch samenvoegen met de \u201cMaster\u201d branch. Checkout Deze Git commando wordt vaak gebruikt om te switchen tussen branches. Je checkt als het ware uit bij een branch en gaat aan de slag in een andere branch.","title":"Voordelen van GitHub"},{"location":"GitHub-Inleiding/#zelf-aan-de-slag-met-github","text":"Hopelijk heb je een beter beeld over wat GitHub is. Ben je een gebruiker of wil je programmeur worden en werk je nog niet met een (goed) versiebeheersysteem? Dan is het zeker aan te raden om te beginnen met GitHub. Als je een account hebt aangemaakt kun je zelf een repository aanmaken. Zie hiervoor: Aanmaken GitHub Account Stuur een mail naar account@geonovum.nl om toegevoegd te worden aan deze repository. Je moet dan wel eerst een account aangemaakt hebben op github","title":"Zelf aan de slag met Github"},{"location":"GitHub/","text":"GitHub In dit hoofdstuk komen zowel GitHub als GitHub desktop client aan de orde. Geonovum heeft op github een eigen \u2018onderkomen\u2019 op: https://github.com/Geonovum . In dit hoofdstuk staat beschreven wat je moet doen om \u201cup-and-running\u201d te komen voor het uitvoeren van je beheertaken op GitHub. Hoe je een account aanmaakt, en hoe je de benodigde software installeert. Installatie en inrichting Aanmaken GitHub account Als je nog geen GitHub account hebt, of als je een apart GitHub account wil maken voor je Geonovum werkzaamheden, ga naar: https://github.com/join/get-started . Dan zie je het scherm dat hiernaast staat. Maak in dat scherm een usernaam aan waarmee je op GitHub gaat werken. Tip : als je met meerdere accounts gaat werken, zorg er dan voor dat aan de accountnaam kan zien waarvoor die dan gebruikt moet worden. (Bijvoorbeeld door die naam te eindigen op \u2013GNM). Verplicht is dit niet. Vul in het veld username je nieuwe GitHub naam in. Vul in het veld email adress je geonovum mailadres in Klik vervolgens op \u201cCreate Account\u201d en dan wordt je account aangemaakt. Kies in dit scherm je persoonlijke plan. Bij Geonovum gebruiken we de gratis versie, dus selecteer die. Installeren GitHub desktop Ga in je internet browser naar https://desktop.github.com/ Klik daar op download for Windows (64bit). Nu wordt de installer gedownload, en dat zie je linksonder in je browser zoals in het plaatje rechts: Na starten van de installer verschijnt het scherm hiernaast Het volgende scherm zal nu openen we hebben in de vorige stap al een account aangemaakt dus klik op Sign Into Github.com Na Klikken op Sign into Github.com, verschijnt dit scherm. Hier hoeft verder niks ingevuld te worden, dus klik op continue. In dit scherm kan je desgewenst het vinkje bij het versturen van anonieme data uitzetten. Daarna klikken op Finish. GitHub Desktop is nu ge\u00efnstalleerd. Opties voor GitHub desktop GitHub Desktop kan worden aangepast aan persoonlijke voorkeuren. Dat doe je door in het hoofdscherm van de GitHub Desktop op het menu \u201cFile\u201d te klikken en vervolgens voor \u201cOpties\u201d te kiezen. In het Accounts scherm staat hoe je bent ingelogd bij GitHub. Hier kan je uitloggen en opnieuw inloggen als je meerdere GitHub Accounts hebt. In het tabblad \u201cGit\u201d kan je je Github Naam eventueel aanpassen. De GitHub Email is de email die intern binnen Github wordt gebruikt. Die hoeft niet gewijzigd te worden. In het tabblad \u201cAppearance\u201d kan je ervoor kiezen om in Light of Dark modus te werken. Hiermee verander je alleen de achtergrondkleur van de GitHub Desktop omgeving. In dit scherm kan je de voorkeurs editor instellen. Default wordt gekeken naar de reeds aanwezige tekst editors. Omdat GitHub van nature een samenwerkomgeving is voor het ontwikkelen van programmatuur, gaat het hier om \u201cplatte tekst\u201d editors. Werkwijze Geonovum De Geonovum GitHub pagina Geonovum heeft een eigen GitHub Bedrijfspagina: https://github.com/Geonovum . Voor alle projecten die een product maken of beheren wordt een repository aangemaakt. Het aanmaken van een repository staat beschreven in paragraaf 2.3.1 . Mappenstructuur in de respository In de Repository maak je indien nodig submappen aan. Submappen zijn handig als er in je Repository meer dan \u00e9\u00e9n ReSpec document komt te staan. Over ReSpec meer in hoofdstuk 3. Hiernaast een afbeelding van de GitHub Repository voor MIM. Twee mappen omdat MIM twee documenten bevat. Ook maakt GitHub standaard een readme.md aan. De readme staat in het \u201cMarkdown\u201d formaat, waarover in de volgende paragraaf meer. Readme.md In de readme.md file staat nog eens beschreven Wat de inhoud van de Repository is. Neem ook de link naar de webversie van de documenten hier op, dan is het voor bezoekers gemakkelijker om het document te openen in een browser. Neem altijd een link naar https://docs.geostandaarden.nl/ op, en in het geval het technische documenten betreft zoals UML\u2019s, XSD\u2019s, GML\u2019s, XML\u2019s een link naar http://register.geostandaarden.nl/ in het Readme bestand op. Aan de slag met GitHub In deze paragraaf een beschrijving van hoe je in GitHub een nieuwe repository aanmaakt, en hoe je die synchroniseert met je lokale GitHub client. Het maken van een nieuwe repository Een nieuwe repository maak je aan in de Centrale GitHub omgeving. Klik in de banner bovenaan de pagina, naast je profielfoto op \u201c+\u201d en kies \u201cCreate Repository\u201d Nadat je op \u201c+\u201d hebt geklikt, verschijnt het scherm hieronder. Vul hier de naam van de repository in. Gebruik een naam die kort en bondig is. Zie ook verderop in dit document voor de naamgevingsconventies. Vul ook de beschrijving in van het project. Geef als local path de naam van de GitHub map op. GitHub zal dan de naam van de standaard als mapnaam aanmaken onder de lokale GitHub map. Het is wel zo netjes om een readme file aan te maken, hierin zet je een korte omschrijving van de repository. Klik vervolgens op \u201cCreate Repository\u201d GitHub Clone: eerste keer ophalen van de centrale repository Start de GitHub Client, en kies in het menu File voor Clone Repository. En kies de Repository die je wil clonen (in dit geval Geonovum/MIM). Als Local Path kies je een logische plek op je PC/Laptop. (Tip: het is handig om \u00e9\u00e9n plek voor je Github Repositories te maken, bijvoorbeeld C:. Na het aanklikken van de knop clone wordt een lokale kopie gemaakt. Github weet welke versie je hebt opgehaald, en zal de wijzingen die je maakt netjes voor je bijhouden. In de map die je als local path hebt opgegeven komt de mappen structuur te staan zoals hierboven beschreven. GitHub Pull origin: ophalen van wijzigingen Een pull commando werkt de lokale versie van je GitHub Repository bij. Wijzigingen die zijn gedaan in de centrale repository (dus op Github.com) worden ook doorgevoerd in je lokale kopie. Het uitvoeren van een pull doe je door in het menu Repository op pull te klikken. NB: Voer dit commando regelmatig uit als er meerdere mensen in de repository werken, om conflicterende wijzigingen te voorkomen. GitHub Commit to Master: wijzigingen opslaan Met de knop Commit to master zet je de wijzigingen die je hebt gedaan klaar om te uploaden naar de Centrale GitHub Repository. GitHub maakt daartoe een versie aan, die je verplicht voorziet van een summary en optioneel van een Description Let op: met het committen heb je dus nog niks ge-upload. GitHub Push origin of Pull request: wijzigingen uploaden Nadat je de wijzigingen hebt gecommit, moeten ze richting de centrale repository. Nu zijn er twee mogelijkheden. Ofwel je hebt schrijfrechten op de Centrale Repository, of je hebt ze niet. In het eerste geval kan je een Push Origin uitvoeren, dan worden de wijzigingen meteen in de Centrale GitHub Repository verwerkt. In het tweede geval doe je een Pull request bij de eigenaar van de Repository om de wijzigingen door te voeren. Github maakt dan een eigen versie voor je aan (dat heet een fork) en vraagt aan de eigenaar van de Repository om die fork te verwerken in de Centrale Repository. Enkele regels over GitHub binnen Geonovum Geonovum heeft binnen github een team: https://github.com/Geonovum. Github beheer Github teamleden met beheerders rechten zijn te vinden via: https://github.com/orgs/Geonovum/people?query=role%3Aowner Daarnaast zijn er nog drie inhoudelijk beheerders vanuit Geonovum: Arnoud de Boer, Frank Terpstra en Linda vd Brink. Github gebruikers Een overzicht van de gebruikers is te vinden op: https://github.com/orgs/Geonovum/people. In principe geldt de regels: als je lid bent van Geonovum Teams dan hoor je ook bij de Geonovum GitHub organisatie. De inhoudelijk beheerders kunnen besluiten daar van af te wijken. Er is geen bezwaar tegen het gebruiken van een priv\u00e9 account binnen de github omgeving. Bij vertrek wordt je omgezet naar 'External Collaborator'. GitHub teams Er is een aantal teams gemaakt binnen Geonovum. Deze zijn te vinden op: https://github.com/orgs/Geonovum/teams. Ieder repository moet aan een team worden toegekend. Het team is aanspreekpunt voor het repository. Team namen eindigen op ' team'. Bijvoorbeeld 'DSO team'. GitHub repositories Dit zijn de Geonovum repositories: https://github.com/orgs/Geonovum/repositories. Er is ook een dashboard met een overzicht van publieke git repositories: DashboardGit . Richtlijnen voor het inrichten van repositories zijn er nog niet. Wel is er een template voor respec documenten: NL-ReSpec-GN-template Naamgevingsconventies GitHub Voor repositories met een ReSpec document zijn aparte naamgevingsconventies. Kies korte betekenisvolle namen die in lijn zijn met bestaande repositories. Veelgebruikte prefixes zijn: dso- digitale ondersteuning omgevingswet. ow- omgevingswet. Dit lijkt wel een duplicaat. Laten opgaan in dso-? KP-APIs- kennisplatform API's. xml_ Dit was een prefix voor dso repositories maar wordt voor nieuwe repositories niet meer gebruikt. disgeo- DisGeo","title":"Manual"},{"location":"GitHub/#github","text":"In dit hoofdstuk komen zowel GitHub als GitHub desktop client aan de orde. Geonovum heeft op github een eigen \u2018onderkomen\u2019 op: https://github.com/Geonovum . In dit hoofdstuk staat beschreven wat je moet doen om \u201cup-and-running\u201d te komen voor het uitvoeren van je beheertaken op GitHub. Hoe je een account aanmaakt, en hoe je de benodigde software installeert.","title":"GitHub"},{"location":"GitHub/#installatie-en-inrichting","text":"","title":"Installatie en inrichting"},{"location":"GitHub/#aanmaken-github-account","text":"Als je nog geen GitHub account hebt, of als je een apart GitHub account wil maken voor je Geonovum werkzaamheden, ga naar: https://github.com/join/get-started . Dan zie je het scherm dat hiernaast staat. Maak in dat scherm een usernaam aan waarmee je op GitHub gaat werken. Tip : als je met meerdere accounts gaat werken, zorg er dan voor dat aan de accountnaam kan zien waarvoor die dan gebruikt moet worden. (Bijvoorbeeld door die naam te eindigen op \u2013GNM). Verplicht is dit niet. Vul in het veld username je nieuwe GitHub naam in. Vul in het veld email adress je geonovum mailadres in Klik vervolgens op \u201cCreate Account\u201d en dan wordt je account aangemaakt. Kies in dit scherm je persoonlijke plan. Bij Geonovum gebruiken we de gratis versie, dus selecteer die.","title":"Aanmaken GitHub account"},{"location":"GitHub/#installeren-github-desktop","text":"Ga in je internet browser naar https://desktop.github.com/ Klik daar op download for Windows (64bit). Nu wordt de installer gedownload, en dat zie je linksonder in je browser zoals in het plaatje rechts: Na starten van de installer verschijnt het scherm hiernaast Het volgende scherm zal nu openen we hebben in de vorige stap al een account aangemaakt dus klik op Sign Into Github.com Na Klikken op Sign into Github.com, verschijnt dit scherm. Hier hoeft verder niks ingevuld te worden, dus klik op continue. In dit scherm kan je desgewenst het vinkje bij het versturen van anonieme data uitzetten. Daarna klikken op Finish. GitHub Desktop is nu ge\u00efnstalleerd.","title":"Installeren GitHub desktop"},{"location":"GitHub/#opties-voor-github-desktop","text":"GitHub Desktop kan worden aangepast aan persoonlijke voorkeuren. Dat doe je door in het hoofdscherm van de GitHub Desktop op het menu \u201cFile\u201d te klikken en vervolgens voor \u201cOpties\u201d te kiezen. In het Accounts scherm staat hoe je bent ingelogd bij GitHub. Hier kan je uitloggen en opnieuw inloggen als je meerdere GitHub Accounts hebt. In het tabblad \u201cGit\u201d kan je je Github Naam eventueel aanpassen. De GitHub Email is de email die intern binnen Github wordt gebruikt. Die hoeft niet gewijzigd te worden. In het tabblad \u201cAppearance\u201d kan je ervoor kiezen om in Light of Dark modus te werken. Hiermee verander je alleen de achtergrondkleur van de GitHub Desktop omgeving. In dit scherm kan je de voorkeurs editor instellen. Default wordt gekeken naar de reeds aanwezige tekst editors. Omdat GitHub van nature een samenwerkomgeving is voor het ontwikkelen van programmatuur, gaat het hier om \u201cplatte tekst\u201d editors.","title":"Opties voor GitHub desktop"},{"location":"GitHub/#werkwijze-geonovum","text":"","title":"Werkwijze Geonovum"},{"location":"GitHub/#de-geonovum-github-pagina","text":"Geonovum heeft een eigen GitHub Bedrijfspagina: https://github.com/Geonovum . Voor alle projecten die een product maken of beheren wordt een repository aangemaakt. Het aanmaken van een repository staat beschreven in paragraaf 2.3.1 .","title":"De Geonovum GitHub pagina"},{"location":"GitHub/#mappenstructuur-in-de-respository","text":"In de Repository maak je indien nodig submappen aan. Submappen zijn handig als er in je Repository meer dan \u00e9\u00e9n ReSpec document komt te staan. Over ReSpec meer in hoofdstuk 3. Hiernaast een afbeelding van de GitHub Repository voor MIM. Twee mappen omdat MIM twee documenten bevat. Ook maakt GitHub standaard een readme.md aan. De readme staat in het \u201cMarkdown\u201d formaat, waarover in de volgende paragraaf meer.","title":"Mappenstructuur in de respository"},{"location":"GitHub/#readmemd","text":"In de readme.md file staat nog eens beschreven Wat de inhoud van de Repository is. Neem ook de link naar de webversie van de documenten hier op, dan is het voor bezoekers gemakkelijker om het document te openen in een browser. Neem altijd een link naar https://docs.geostandaarden.nl/ op, en in het geval het technische documenten betreft zoals UML\u2019s, XSD\u2019s, GML\u2019s, XML\u2019s een link naar http://register.geostandaarden.nl/ in het Readme bestand op.","title":"Readme.md"},{"location":"GitHub/#aan-de-slag-met-github","text":"In deze paragraaf een beschrijving van hoe je in GitHub een nieuwe repository aanmaakt, en hoe je die synchroniseert met je lokale GitHub client.","title":"Aan de slag met GitHub"},{"location":"GitHub/#het-maken-van-een-nieuwe-repository","text":"Een nieuwe repository maak je aan in de Centrale GitHub omgeving. Klik in de banner bovenaan de pagina, naast je profielfoto op \u201c+\u201d en kies \u201cCreate Repository\u201d Nadat je op \u201c+\u201d hebt geklikt, verschijnt het scherm hieronder. Vul hier de naam van de repository in. Gebruik een naam die kort en bondig is. Zie ook verderop in dit document voor de naamgevingsconventies. Vul ook de beschrijving in van het project. Geef als local path de naam van de GitHub map op. GitHub zal dan de naam van de standaard als mapnaam aanmaken onder de lokale GitHub map. Het is wel zo netjes om een readme file aan te maken, hierin zet je een korte omschrijving van de repository. Klik vervolgens op \u201cCreate Repository\u201d","title":"Het maken van een nieuwe repository"},{"location":"GitHub/#github-clone-eerste-keer-ophalen-van-de-centrale-repository","text":"Start de GitHub Client, en kies in het menu File voor Clone Repository. En kies de Repository die je wil clonen (in dit geval Geonovum/MIM). Als Local Path kies je een logische plek op je PC/Laptop. (Tip: het is handig om \u00e9\u00e9n plek voor je Github Repositories te maken, bijvoorbeeld C:. Na het aanklikken van de knop clone wordt een lokale kopie gemaakt. Github weet welke versie je hebt opgehaald, en zal de wijzingen die je maakt netjes voor je bijhouden. In de map die je als local path hebt opgegeven komt de mappen structuur te staan zoals hierboven beschreven.","title":"GitHub Clone: eerste keer ophalen van de centrale repository"},{"location":"GitHub/#github-pull-origin-ophalen-van-wijzigingen","text":"Een pull commando werkt de lokale versie van je GitHub Repository bij. Wijzigingen die zijn gedaan in de centrale repository (dus op Github.com) worden ook doorgevoerd in je lokale kopie. Het uitvoeren van een pull doe je door in het menu Repository op pull te klikken. NB: Voer dit commando regelmatig uit als er meerdere mensen in de repository werken, om conflicterende wijzigingen te voorkomen.","title":"GitHub Pull origin: ophalen van wijzigingen"},{"location":"GitHub/#github-commit-to-master-wijzigingen-opslaan","text":"Met de knop Commit to master zet je de wijzigingen die je hebt gedaan klaar om te uploaden naar de Centrale GitHub Repository. GitHub maakt daartoe een versie aan, die je verplicht voorziet van een summary en optioneel van een Description Let op: met het committen heb je dus nog niks ge-upload.","title":"GitHub Commit to Master: wijzigingen opslaan"},{"location":"GitHub/#github-push-origin-of-pull-request-wijzigingen-uploaden","text":"Nadat je de wijzigingen hebt gecommit, moeten ze richting de centrale repository. Nu zijn er twee mogelijkheden. Ofwel je hebt schrijfrechten op de Centrale Repository, of je hebt ze niet. In het eerste geval kan je een Push Origin uitvoeren, dan worden de wijzigingen meteen in de Centrale GitHub Repository verwerkt. In het tweede geval doe je een Pull request bij de eigenaar van de Repository om de wijzigingen door te voeren. Github maakt dan een eigen versie voor je aan (dat heet een fork) en vraagt aan de eigenaar van de Repository om die fork te verwerken in de Centrale Repository.","title":"GitHub Push origin of Pull request: wijzigingen uploaden"},{"location":"GitHub/#enkele-regels-over-github-binnen-geonovum","text":"Geonovum heeft binnen github een team: https://github.com/Geonovum.","title":"Enkele regels over GitHub binnen Geonovum"},{"location":"GitHub/#github-beheer","text":"Github teamleden met beheerders rechten zijn te vinden via: https://github.com/orgs/Geonovum/people?query=role%3Aowner Daarnaast zijn er nog drie inhoudelijk beheerders vanuit Geonovum: Arnoud de Boer, Frank Terpstra en Linda vd Brink.","title":"Github beheer"},{"location":"GitHub/#github-gebruikers","text":"Een overzicht van de gebruikers is te vinden op: https://github.com/orgs/Geonovum/people. In principe geldt de regels: als je lid bent van Geonovum Teams dan hoor je ook bij de Geonovum GitHub organisatie. De inhoudelijk beheerders kunnen besluiten daar van af te wijken. Er is geen bezwaar tegen het gebruiken van een priv\u00e9 account binnen de github omgeving. Bij vertrek wordt je omgezet naar 'External Collaborator'.","title":"Github gebruikers"},{"location":"GitHub/#github-teams","text":"Er is een aantal teams gemaakt binnen Geonovum. Deze zijn te vinden op: https://github.com/orgs/Geonovum/teams. Ieder repository moet aan een team worden toegekend. Het team is aanspreekpunt voor het repository. Team namen eindigen op ' team'. Bijvoorbeeld 'DSO team'.","title":"GitHub teams"},{"location":"GitHub/#github-repositories","text":"Dit zijn de Geonovum repositories: https://github.com/orgs/Geonovum/repositories. Er is ook een dashboard met een overzicht van publieke git repositories: DashboardGit . Richtlijnen voor het inrichten van repositories zijn er nog niet. Wel is er een template voor respec documenten: NL-ReSpec-GN-template","title":"GitHub repositories"},{"location":"GitHub/#naamgevingsconventies-github","text":"Voor repositories met een ReSpec document zijn aparte naamgevingsconventies. Kies korte betekenisvolle namen die in lijn zijn met bestaande repositories. Veelgebruikte prefixes zijn: dso- digitale ondersteuning omgevingswet. ow- omgevingswet. Dit lijkt wel een duplicaat. Laten opgaan in dso-? KP-APIs- kennisplatform API's. xml_ Dit was een prefix voor dso repositories maar wordt voor nieuwe repositories niet meer gebruikt. disgeo- DisGeo","title":"Naamgevingsconventies GitHub"},{"location":"Handleiding-ontologie-maken-en-publiceren/","text":"Handleiding ontologie maken en publiceren Inleiding Naast UML-informatiemodellen en begrippenkaders maakt Geonovum wellicht in de toekomst ook meer ontologie\u00ebn. Momenteel is er \u00e9\u00e9n ontologie gepubliceerd: die van NEN 3610. Hier is gedocumenteerd hoe dat is gedaan. Ontologie genereren De ontologie is gegenereerd uit het NEN3610-informatiemodel op basis van de regels in MIM. Input : MIM UML-model Output : Ontologie in Turtle ( .ttl ) syntax en documentatie van de ontologie in Markdown ( .md ) syntax (op te nemen in ReSpec-document) In je UML-project is daarvoor nodig: - tagged value baseURI op packageniveau De ontologie is gegenereerd met scripts van Marco Brattinga. - Scripts staan in de repository NEN3610-werkomgeving - Het script dat je moet runnen is: convert.sh . Dit kun je lokaal doen (onder Windows moet je dit aanroepen in een batch-bestand) of we kunnen dit in een git workflow zetten zodat het script elke keer wordt uitgevoerd als je een EAP-bestand of MIM-XML-bestand pusht. Jesse Bakker heeft dit laatste binnen IMX-Geo gedaan. - Het script genereert met een aantal tussenstappen de uiteindelijke ontologie (RDF-bestand, .ttl ) en een markdown-bestand ( .md ) met documentatie, dat je in een ReSpec-document kunt opnemen. Naast Marco Brattinga hebben Linda, Pano, en Jesse Bakker (Kadaster) kennis van deze scripts. Regels voor de URI De URI (in EA: baseURI ) is de identifier URL van de ontologie. Het is belangrijk dat deze lange tijd stabiel blijft (dus geen projectnaam , organisatienaam , versieinformatie etc. erin opnemen). Samengevat gelden hiervoor de volgende regels: Moet beginnen met http://modellen.geostandaarden.nl/def/ Na /def/ volgt een korte naam Na de korte naam volgt een # Geen versie-aanduiding in de URI Voorbeeld: http://modellen.geostandaarden.nl/def/nen3610# Note Waarom geen versie Hierover is veel discussie geweest. In de LinkedData-wereld is het de gewoonte om geen versie in de URL te zetten. De belangrijkste reden hiervoor is dat de URI een identificatie is. Als deze per versie zou wijzigen, zou dat eigenlijk betekenen dat het een nieuwe ontologie is en dat alles dat erin staat een nieuwe betekenis heeft. Dit is bijna nooit echt wat je wilt. De klasse Gebouw uit NEN3610:2011 is in essentie nog steeds dezelfde als de klasse Gebouw uit NEN3610:2022. Mogelijk is de definitie en daarmee populatie een enigszins veranderd. Dat wil zeggen: misschien zit er tussen beide definities een verschil tussen wat je als een gebouw beschouwt. Maar in essentie bedoel je nog steeds hetzelfde, dus verander je dan niet de identificatie. Een andere reden om geen versie in de URI op te nemen is dat dit voorkomt dat je alle data die de ontologie gebruikt, moet updaten als de URI gewijzigd is vanwege een nieuwe versie van de ontologie. Kwaliteitscontrole Controleer het gegenereerde .ttl-bestand op correcte syntax met behulp van een online validator . Publiceren De ontologie is gepubliceerd op http://modellen.geostandaarden.nl Beheerders, oa Linda en Pano hebben de FTP-toegang hiervan. De ontologie is gepubliceerd in vier bestandsformaten: - HTML ( .html ) - Turtle ( .ttl ) - RDF/XML ( .rdf ) - JSON-LD ( .json ) Het .ttl -bestand is automatisch geconverteerd naar RDF/XML en JSON-LD met behulp van een online conversietool . Folderstructuur en rootfolder De folderstructuur op de webserver is als volgt: / index.html .htaccess /def /nen3610 /nen36102022 In de root / staat een bestand index.html dat de content bevat die je ziet in je browser als je naar http://modellen.geostandaarden.nl gaat. Dit bestand wordt handmatig beheerd . Het moet worden aangepast als er meer ontologie\u00ebn bij komen. In de root / staat verder een .htaccess -bestand. Dat is een webserverscript dat ervoor zorgt dat een verzoek om de ontologie, afhankelijk van de client, de webserver het juiste bestandsformaat laat teruggeven. Als een gebruiker met een webbrowser om http://modellen.geostandaarden.nl/def/nen3610# vraagt, geeft de webserver een html -bestand terug dat de browser kan tonen en de gebruiker kan lezen. Als een gebruiker met een ontologie-editor vraagt om dezelfde URL, geeft de webserver bijvoorbeeld het .ttl -bestand terug. Het .htaccess -bestand is gemaakt door Linda en Pano en wordt beheerd in github. Ontologie-bestanden op de webserver De ontologie-bestanden .ttl , .rdf en .json staan in /def . De ontologie is zowel als bestand met versieloze bestandsnaam en als bestand met versieaanduiding opgeslagen. NEN3610 gebruikt een jaartal , maar semantic versioning is ook toegestaan. /def nen3610.ttl nen3610.rdf nen3610.json nen3610-2022.ttl nen3610-2022.rdf nen3610-2022.json HTML-bestanden op de webserver De .html -bestanden staan in twee subfolders, eentje met versieaanduiding en eentje zonder . De versieloze folder bevat altijd dezelfde inhoud als de nieuwste versie. /nen3610 index.html /nen36102022 index.html Opname in vocabulary catalogus En pagina over de NEN3610-ontologie is daarnaast ook op Linked Open Vocabularies (LOV) gepubliceerd, een online catalogus van ontologie\u00ebn. Dit is aangevraagd via een email naar de beheerders via de contactlink. De beheerders controleren de ontologie en geven tips ter verbetering. NEN3610 staat hier . FAIR ontologie Om te zorgen dat de ontologie vindbaar en bruikbaar is, zijn er aanvullende regels. Deze zijn gebaseerd op de regels voor FAIR-ontologie\u00ebn van Linked Open Vocabularies , de vindplaats van ontologie\u00ebn waar NEN3610 ook in is opgenomen. Hun regels zijn ook beschreven in een goed leesbare paper. De manier waarop de NEN3610-ontologie is gepubliceerd is hierop gebaseerd. Metadata De volgende metadata dient te worden opgenomen in de ontologie: Versie-informatie: owl:versionIRI en owl:versionInfo license (CC-BY) creator , eventueel contributor , creationDate en (als die bestaat) previousVersion prefix , title and description source : verwijzing naar informatiemodel waar de ontologie op gebaseerd is publisher : verwijzing naar Geonovum Vertaling naar het Engels Het wordt aangeraden om de ontologie te vertalen naar het Engels (dit kan in hetzelfde bestand, door verschillende talige labels aan de klassen en eigenschappen te geven). Voor NEN3610 wordt dit overwogen. Relatie met andere ontologie\u00ebn Het is good practice om de ontologie te relateren aan andere ontologie\u00ebn, met name aan NEN3610, GeoSPARQL, OWL Time, de Semantic Sensor Network Ontology (SSN), NEN 2660 etc. Voor NEN3610 is dit nog niet gedaan. Hiervoor zijn een aantal standaardrelaties beschikbaar, zoals; - equivalentClass - equivalentProperty - subClassOf - subPropertyOf Relatie met andere ontologie\u00ebn in Enterprise Architect In Enterprise Architect is het mogelijk om deze relaties aan te geven. De ontologie-generator zet ze dan ook in de ontologie, maar het mechanisme is nog niet gestandaardiseerd in MIM. De Generatie MIM-ontologie is ontwikkeld in het WaU als onderdeel van het IMX-Geo-project. Om aan te geven dat iets uit je model precies hetzelfde is als iets uit een ander model: Tagged value uri bij klassen , attributen en relaties ; gevuld met de URI van de ontologie plus de identifier van de klasse of eigenschap in de ontologie (de MIM naam). Dit wordt vertaald naar equivalentClass of equivalentProperty . Om aan te geven dat iets een subklasse of -eigenschap is van een klasse of eigenschap uit een ander model, is er nu nog geen methode. Voorbeeld relatie met andere ontologie IMX-Geo en NEN3610 De attributen domein en identificatie komen uit NEN3610. domein heeft Tagged value: uri = http: http://modellen.geostandaarden.nl/def/nen3610-2022#domein identificatie heeft Tagged value: uri = http://modellen.geostandaarden.nl/def/nen3610-2022#identificatie","title":"Ontologie"},{"location":"Handleiding-ontologie-maken-en-publiceren/#handleiding-ontologie-maken-en-publiceren","text":"","title":"Handleiding ontologie maken en publiceren"},{"location":"Handleiding-ontologie-maken-en-publiceren/#inleiding","text":"Naast UML-informatiemodellen en begrippenkaders maakt Geonovum wellicht in de toekomst ook meer ontologie\u00ebn. Momenteel is er \u00e9\u00e9n ontologie gepubliceerd: die van NEN 3610. Hier is gedocumenteerd hoe dat is gedaan.","title":"Inleiding"},{"location":"Handleiding-ontologie-maken-en-publiceren/#ontologie-genereren","text":"De ontologie is gegenereerd uit het NEN3610-informatiemodel op basis van de regels in MIM. Input : MIM UML-model Output : Ontologie in Turtle ( .ttl ) syntax en documentatie van de ontologie in Markdown ( .md ) syntax (op te nemen in ReSpec-document) In je UML-project is daarvoor nodig: - tagged value baseURI op packageniveau De ontologie is gegenereerd met scripts van Marco Brattinga. - Scripts staan in de repository NEN3610-werkomgeving - Het script dat je moet runnen is: convert.sh . Dit kun je lokaal doen (onder Windows moet je dit aanroepen in een batch-bestand) of we kunnen dit in een git workflow zetten zodat het script elke keer wordt uitgevoerd als je een EAP-bestand of MIM-XML-bestand pusht. Jesse Bakker heeft dit laatste binnen IMX-Geo gedaan. - Het script genereert met een aantal tussenstappen de uiteindelijke ontologie (RDF-bestand, .ttl ) en een markdown-bestand ( .md ) met documentatie, dat je in een ReSpec-document kunt opnemen. Naast Marco Brattinga hebben Linda, Pano, en Jesse Bakker (Kadaster) kennis van deze scripts.","title":"Ontologie genereren"},{"location":"Handleiding-ontologie-maken-en-publiceren/#regels-voor-de-uri","text":"De URI (in EA: baseURI ) is de identifier URL van de ontologie. Het is belangrijk dat deze lange tijd stabiel blijft (dus geen projectnaam , organisatienaam , versieinformatie etc. erin opnemen). Samengevat gelden hiervoor de volgende regels: Moet beginnen met http://modellen.geostandaarden.nl/def/ Na /def/ volgt een korte naam Na de korte naam volgt een # Geen versie-aanduiding in de URI Voorbeeld: http://modellen.geostandaarden.nl/def/nen3610# Note Waarom geen versie Hierover is veel discussie geweest. In de LinkedData-wereld is het de gewoonte om geen versie in de URL te zetten. De belangrijkste reden hiervoor is dat de URI een identificatie is. Als deze per versie zou wijzigen, zou dat eigenlijk betekenen dat het een nieuwe ontologie is en dat alles dat erin staat een nieuwe betekenis heeft. Dit is bijna nooit echt wat je wilt. De klasse Gebouw uit NEN3610:2011 is in essentie nog steeds dezelfde als de klasse Gebouw uit NEN3610:2022. Mogelijk is de definitie en daarmee populatie een enigszins veranderd. Dat wil zeggen: misschien zit er tussen beide definities een verschil tussen wat je als een gebouw beschouwt. Maar in essentie bedoel je nog steeds hetzelfde, dus verander je dan niet de identificatie. Een andere reden om geen versie in de URI op te nemen is dat dit voorkomt dat je alle data die de ontologie gebruikt, moet updaten als de URI gewijzigd is vanwege een nieuwe versie van de ontologie.","title":"Regels voor de URI"},{"location":"Handleiding-ontologie-maken-en-publiceren/#kwaliteitscontrole","text":"Controleer het gegenereerde .ttl-bestand op correcte syntax met behulp van een online validator .","title":"Kwaliteitscontrole"},{"location":"Handleiding-ontologie-maken-en-publiceren/#publiceren","text":"De ontologie is gepubliceerd op http://modellen.geostandaarden.nl Beheerders, oa Linda en Pano hebben de FTP-toegang hiervan. De ontologie is gepubliceerd in vier bestandsformaten: - HTML ( .html ) - Turtle ( .ttl ) - RDF/XML ( .rdf ) - JSON-LD ( .json ) Het .ttl -bestand is automatisch geconverteerd naar RDF/XML en JSON-LD met behulp van een online conversietool .","title":"Publiceren"},{"location":"Handleiding-ontologie-maken-en-publiceren/#folderstructuur-en-rootfolder","text":"De folderstructuur op de webserver is als volgt: / index.html .htaccess /def /nen3610 /nen36102022 In de root / staat een bestand index.html dat de content bevat die je ziet in je browser als je naar http://modellen.geostandaarden.nl gaat. Dit bestand wordt handmatig beheerd . Het moet worden aangepast als er meer ontologie\u00ebn bij komen. In de root / staat verder een .htaccess -bestand. Dat is een webserverscript dat ervoor zorgt dat een verzoek om de ontologie, afhankelijk van de client, de webserver het juiste bestandsformaat laat teruggeven. Als een gebruiker met een webbrowser om http://modellen.geostandaarden.nl/def/nen3610# vraagt, geeft de webserver een html -bestand terug dat de browser kan tonen en de gebruiker kan lezen. Als een gebruiker met een ontologie-editor vraagt om dezelfde URL, geeft de webserver bijvoorbeeld het .ttl -bestand terug. Het .htaccess -bestand is gemaakt door Linda en Pano en wordt beheerd in github.","title":"Folderstructuur en rootfolder"},{"location":"Handleiding-ontologie-maken-en-publiceren/#ontologie-bestanden-op-de-webserver","text":"De ontologie-bestanden .ttl , .rdf en .json staan in /def . De ontologie is zowel als bestand met versieloze bestandsnaam en als bestand met versieaanduiding opgeslagen. NEN3610 gebruikt een jaartal , maar semantic versioning is ook toegestaan. /def nen3610.ttl nen3610.rdf nen3610.json nen3610-2022.ttl nen3610-2022.rdf nen3610-2022.json","title":"Ontologie-bestanden op de webserver"},{"location":"Handleiding-ontologie-maken-en-publiceren/#html-bestanden-op-de-webserver","text":"De .html -bestanden staan in twee subfolders, eentje met versieaanduiding en eentje zonder . De versieloze folder bevat altijd dezelfde inhoud als de nieuwste versie. /nen3610 index.html /nen36102022 index.html","title":"HTML-bestanden op de webserver"},{"location":"Handleiding-ontologie-maken-en-publiceren/#opname-in-vocabulary-catalogus","text":"En pagina over de NEN3610-ontologie is daarnaast ook op Linked Open Vocabularies (LOV) gepubliceerd, een online catalogus van ontologie\u00ebn. Dit is aangevraagd via een email naar de beheerders via de contactlink. De beheerders controleren de ontologie en geven tips ter verbetering. NEN3610 staat hier .","title":"Opname in vocabulary catalogus"},{"location":"Handleiding-ontologie-maken-en-publiceren/#fair-ontologie","text":"Om te zorgen dat de ontologie vindbaar en bruikbaar is, zijn er aanvullende regels. Deze zijn gebaseerd op de regels voor FAIR-ontologie\u00ebn van Linked Open Vocabularies , de vindplaats van ontologie\u00ebn waar NEN3610 ook in is opgenomen. Hun regels zijn ook beschreven in een goed leesbare paper. De manier waarop de NEN3610-ontologie is gepubliceerd is hierop gebaseerd.","title":"FAIR ontologie"},{"location":"Handleiding-ontologie-maken-en-publiceren/#metadata","text":"De volgende metadata dient te worden opgenomen in de ontologie: Versie-informatie: owl:versionIRI en owl:versionInfo license (CC-BY) creator , eventueel contributor , creationDate en (als die bestaat) previousVersion prefix , title and description source : verwijzing naar informatiemodel waar de ontologie op gebaseerd is publisher : verwijzing naar Geonovum","title":"Metadata"},{"location":"Handleiding-ontologie-maken-en-publiceren/#vertaling-naar-het-engels","text":"Het wordt aangeraden om de ontologie te vertalen naar het Engels (dit kan in hetzelfde bestand, door verschillende talige labels aan de klassen en eigenschappen te geven). Voor NEN3610 wordt dit overwogen.","title":"Vertaling naar het Engels"},{"location":"Handleiding-ontologie-maken-en-publiceren/#relatie-met-andere-ontologieen","text":"Het is good practice om de ontologie te relateren aan andere ontologie\u00ebn, met name aan NEN3610, GeoSPARQL, OWL Time, de Semantic Sensor Network Ontology (SSN), NEN 2660 etc. Voor NEN3610 is dit nog niet gedaan. Hiervoor zijn een aantal standaardrelaties beschikbaar, zoals; - equivalentClass - equivalentProperty - subClassOf - subPropertyOf","title":"Relatie met andere ontologie\u00ebn"},{"location":"Handleiding-ontologie-maken-en-publiceren/#relatie-met-andere-ontologieen-in-enterprise-architect","text":"In Enterprise Architect is het mogelijk om deze relaties aan te geven. De ontologie-generator zet ze dan ook in de ontologie, maar het mechanisme is nog niet gestandaardiseerd in MIM. De Generatie MIM-ontologie is ontwikkeld in het WaU als onderdeel van het IMX-Geo-project. Om aan te geven dat iets uit je model precies hetzelfde is als iets uit een ander model: Tagged value uri bij klassen , attributen en relaties ; gevuld met de URI van de ontologie plus de identifier van de klasse of eigenschap in de ontologie (de MIM naam). Dit wordt vertaald naar equivalentClass of equivalentProperty . Om aan te geven dat iets een subklasse of -eigenschap is van een klasse of eigenschap uit een ander model, is er nu nog geen methode.","title":"Relatie met andere ontologie\u00ebn in Enterprise Architect"},{"location":"Handleiding-ontologie-maken-en-publiceren/#voorbeeld-relatie-met-andere-ontologie-imx-geo-en-nen3610","text":"De attributen domein en identificatie komen uit NEN3610. domein heeft Tagged value: uri = http: http://modellen.geostandaarden.nl/def/nen3610-2022#domein identificatie heeft Tagged value: uri = http://modellen.geostandaarden.nl/def/nen3610-2022#identificatie","title":"Voorbeeld relatie met andere ontologie IMX-Geo en NEN3610"},{"location":"Imvertor/","text":"Imvertor TODO: invullen vanuit de volgende documenten Imvertor wordt veel gebruikt binnen Geonovum voor het transformeren van UML modellen naar bijvoorbeeld xml-schema\u2019s of feature catalogues. De instructies van hoe er mee om te gaan zijn overal verspreid. Op deze pagina probeer ik alles te verzamelen\u2026. onderwerp verwijzing Imvertor-properties Uitleg verschillende properties Algemeen Verzamelde handleiding van organisaties Algemeen Repository co\u00f6rdinatie Imvertor gebruik Geonovum Werkinstructie IMGeluid werkinstructie Imvertor meldingen Meldingen Uitleg schema mapping Hier Denk hier aan Een Imvertor run levert een flink aantal UML diagrammen op in de data folder. Niet meer gebruikt diagrammen worden nooit verwijderd uit deze folder waardoor er vaak veel niet gebruikt diagrammen in staan. Tip: gooi voor het draaien van Imvertor de data map een keer leeg.","title":"Imvertor"},{"location":"Imvertor/#imvertor","text":"TODO: invullen vanuit de volgende documenten Imvertor wordt veel gebruikt binnen Geonovum voor het transformeren van UML modellen naar bijvoorbeeld xml-schema\u2019s of feature catalogues. De instructies van hoe er mee om te gaan zijn overal verspreid. Op deze pagina probeer ik alles te verzamelen\u2026. onderwerp verwijzing Imvertor-properties Uitleg verschillende properties Algemeen Verzamelde handleiding van organisaties Algemeen Repository co\u00f6rdinatie Imvertor gebruik Geonovum Werkinstructie IMGeluid werkinstructie Imvertor meldingen Meldingen Uitleg schema mapping Hier","title":"Imvertor"},{"location":"Imvertor/#denk-hier-aan","text":"Een Imvertor run levert een flink aantal UML diagrammen op in de data folder. Niet meer gebruikt diagrammen worden nooit verwijderd uit deze folder waardoor er vaak veel niet gebruikt diagrammen in staan. Tip: gooi voor het draaien van Imvertor de data map een keer leeg.","title":"Denk hier aan"},{"location":"MIM-toolbox-genereren-extensie/","text":"Handleiding - Extensie maken op MIM-toolbox Software/Standaard Versie MIM-standaard 1.1.1 MIM-toolbox 1.1.1 Enterprise Architect (EA) 15.2 Inhoud Beschrijving Importeer de MIM-toolbox in de EA-omgeving Maak de package-structuur aan voor de extensie Modelleer de toolbox-extensie Modelleer het toolbox-menu Modelleer het diagram Genereer MDG Technology Werken met de toolbox Beschrijving Deze handleiding beschrijft hoe je in Enterprise Architect een extensie maakt op de MIM-toolbox . Dit is van toepassing als er extra metamodelconstructies nodig zijn voor het maken van een informatiemodel. Meer informatie en spelregels hiervoor vind je in de MIM-standaard . Een extensie op de MIM-toolbox is ook bedoeld voor het maken van aanvullende constructies die alleen spelen op het niveau van implementatie, of op het niveau van afgeleide technsiche modellen ten behoeve van specifieke interfaces. Met een extensie breidt je MIM-toolbox uit. Dit is handig wanneer je extra informatie aan modelonderdelen (bijv. objecttypen) wilt toevoegen. Bijvoorbeeld voor: - het uitbreiden van de set met metagegevens voor modelonderdelen van een specifiek sector-/domeinmodel (extra tagged values); - het uitbreiden van de set met metagegevens voor specifieke toepassingen van het model, zoals bijvoorbeeld in Imvertor of voor een UML-JSON-encodings; - het het toevoegen van extra stereotypen. Deze handleiding neemt het maken van een DiSGeo-extensie op MIM als voorbeeld . Voor het informatiemodel DiSGeo zijn voor de MIM-stereotypen \u00abObjecttype\u00bb en \u00abAttribuutsoort\u00bb meta-informatie nodig in de vorm van extra tagged values . Voor Objecttype gaat dat om het toevoegen van Actualiteit en Inwinning verplicht . Voor Attribuutsoort zijn dat: Inwinningsregels en Positionele juistheid . Voorbereiding Zorg dat je de volgende twee zaken bij de hand hebt: 1. Enterprise Architect: Het is handig om de volgende venster te openen - Browser - Toolbox - Properties - Features 1. De MIM-toolbox waarop je een extensie wilt bouwen, in de vorm van een MDG Technology (.xml). Hier vind je de meest actuele versie van de toolbox Stap 1: Importeer de MIM-toolbox in de EA-omgeving Open de project browser . Klik op de tab Resources . Klik op de map MDG Technologies . Klik met de rechtermuisknop op Model Technologies en selecteer Import Technology . Open de MDG Technology (dit bestand heeft een .xml -extensie) van de MIM-toolbox. Klik Openen . Selecteer daar linksonderin het diagloogvenster Import To Model en klik vervolgens op OK . Indien je geen foutmelding krijgt, heb je de MIM-toolbox succesvol ge\u00efmporteerd. Stap 2: Maak de package-structuur aan voor de extensie Klik in de project browser linksbovenin op de map met het gele sterretje , of druk Ctrl+Shift+M . Hierdoor open de Model Wizard . Selecteer het tabblad Model Patterns . Klik daaronder op Model Technologies Perspective . Ga naar Management en selecter vervolgens: MDG Technology Builder . In het venster verschijnen nu verschillende Model Patterns . Dit zijn templates voor het maken van modellen. Kies nu onder MDG Technology Builder voor Basic Template en klik linksonderin op Create Pattern(s) . Geef in het dialoogvenster dat nu verschijnt de naam van de extensie op die je gaat maken (bijvoorbeeld 'DISGEO') en klik op OK . In de project browser zie dat er nu een nieuwe package DiSGeo is toegevoegd. Dat package bevat een - diagram ; - een \u00abprofile\u00bb ; - een \u00abdiagram profile\u00bb ; - en een \u00abtoolbox profile\u00bb . Je hebt nu succesvol de package structuur aangemaakt. Stap 3: Modelleer de toolbox-extensie Vouw het package \u00abprofile\u00bbDISGEO uit Dubbelklik op het diagram Hierdoor opent het diagram en verschijnt de bijbehorende toolbox: UML::Profile Ga in het toolboxmenu naar Metaclass en sleep dit element in het diagram. Er verschijnt nu een venster Extend Metaclass . Klik in de linkerkolom op Stereotypes . Hierdoor verschijnen aan de rechterkant alle stereotypen die MIM kent. Let op : deze zijn alleen beschikbaarbaar nadat je de MIM-toolbox hebt ge\u00efmporteerd (zie: stap: 1 ). Zoek in de lijst aan de rechterkant \u00abObjecttype\u00bb en \u00abAttribuutsoort\u00bb op, selecteer deze en klik op OK . Deze worden nu toegevoegd aan het diagram. Zoek nu in het toolboxmenu Add Stereotype op (onder Profile Helpers ) en sleep dit element op het diagram. Er verschijnt nu een venster Add Stereotype . We gaan nu een stereotype maken dat dient als extensie op het MIM-stereotype \u00abAttribuutsoort\u00bb . Geef een naam op voor het stereotype. In het geval van dit voorbeeld is gekozen voor Attribuutsoort , maar dit kan elke andere willekeurige naam zijn. Klik vervogens op de button Add Metaclass . Hier geef je de UML-metaklasse uit EA op waarop je extensie plaatsvindt. Als je niet weet van welke UML-metaklasse je stereotype wordt afgeleid, zoek dit dan op in het MIM-profiel. Info : In hoofdstuk 3 van de MIM-standaard staat beschreven van welke UML-metaklasse elk MIM-stereotype is afgeleid. Omdat je een extensie maakt op MIM, is de nieuwe extensie automatisch \u00f3\u00f3k een extensie op een UML-type. Desondanks moet je dit in Enterprise Architect expliciet benoemen. Laat de overige instellingen staan en klik op Volgende . In dit venster, Define Tagged Values , kun je de extra metadata-elementen opvoeren. Klik met de rechtermuisknop in de kolom Property Kies uit het menu Add Tagged Value . Voer een naam op voor de tagged value. In het geval van dit voorbeeld Actualiteit . In de linkerkolom kun je nog een standaardwaarde opvoeren, maar dat is niet verplicht. In dit voorbeeld blijft dit veld leeg. Herhaal deze stap voor alle tagged values die je aan dit element wilt toevoegen. Als je klaar bent, kun je bovenstaande stappen herhalen voor \u00abObjecttype\u00bb . Klik daarna op Voltooien Je ziet nu het nieuwe stereotype met de tagged values. Daarnaast heeft het nu een relatie met de UML-metaklasse \u00abAttribute\u00bb . Als laatste onderdeel van deze stap moet nu de relatie gelegd worden tussen het nieuwe stereotype en het MIM-stereotype. Dit gaat als volgt: Klik nu op het element Attribuutsoort . Er verschijnen nu rechts van het element een aantal iconen. Klik op de witte pijl ( QuickLinker ) met de muisknop ingedrukt en sleep dit naar het bijbehorende MIM-type (het bovenste icoon) Kies uit het menu dat nu verschijnt voor Generalization . Je extensie-type heeft nu een relatie met MIM::Attribuutsoort \u00e9n UML::Attribute . Herhaal deze stappen voor \u00abObjecttype\u00bb . Als laatste stap is het handig om het kleurenschema van het modelelement gelijk te maken aan dat van MIM. Dat gaat als volgt: Klik met de rechtermuisknop op het nieuwe element Objecttype . Navigeer naar Appearance en klik op Default Appearance . Nu opent een venster met dezelfde naam. Klik op Background Color . Klik op More Colors . Selecteer het tabblad Custom . En vul vervolgens onderstaande waarden in: Hue: 128 Sat: 245 Lum: 230 Red: 206 Green: 253 Blue: 254 Klik op OK . Zet Border Color en Font Color op zwart . Klik op OK . Herhaal deze stap voor de andere modelelementen, in dit geval Attribuutsoort . Je hebt nu succesvol het profiel van je extensie aangemaakt. Stap 4: Modelleer het toolbox-menu In deze stap maak je de menupagina van de toolbox. Hiermee bepaal je hoe en welke stereotypes zichtbaar zijn in het menu. Het doel van de DiSGeo-extensie is om bestaande MIM-stereotypen uitbreiden met extra tagged values . Daarvoor introduceerden we in EA onder de moterkap weliswaar twee nieuwe stereotypen ( \u00abObjectype\u00bb en \u00abAttribuutsoort\u00bb ), maar die willen we niet expliciet terugzien in de toolbox. In de toolbox willen we \u00abObjecttype\u00bb en \u00abAttribuutsoort\u00bb aanbieden. Open het lege diagram uit het package \u00abtoolbox profile\u00bbDISGEO . Sleep uit de toolbox die bij dit diagram hoort de Profile Helper Add Toolbox Page op het diagram. Het venster Add Toolbox Page opent nu. Vul de naam in van de toolboxpagina die je wilt maken. In dit geval maken we een kopie van de MIM-toolbox, dus noemen we deze (eerste) pagina: MIM: Objecten en attributen . Klik vervolgens op de Add-button en selecteer de optie Add Stereotype . Het venster Select A Profile Element opent nu. Navigeer naar het package \u00abprofile\u00bb DISGEO en selecter \u00abstereotype\u00bbObjecttype en klik op OK . In de eerste rij van de tabel in het venster Add Toolbox Page , is nu dit stereotype toegevoegd. Voor de leesbaarheid is het fijn om het type een alias mee te geven (anders heet het toolbox-item DISGEO::Objectype(UML::Class) . Vanwege het eerder genoemde uitgangspunt, krijgt dit stereotype het alias 'Objecttype' . Voeg nu op dezelfde manier 'Attribuutsoort' toe en klik nog niet op OK! . Je hebt nu de twee nieuwe stereotypes toegevoeg aan de toolboxpagina: + DISGEO::Objecttype(UML::Class) + DISGEO::Attribuutsoort(UML::Attribute) In de MIM-toolbox heeft deze pagina nog drie andere stereotypes. Deze kun je uit het package MIM-UML halen. Deze beschrijving gaat ervan uit dat je hierover beschikt. Klik nogmaals op de Add-button en navigeer nu naar het package \u00abMIM-UMLprofile\u00bb en voeg de volgende elementen toe: DISGEO::Objecttype(UML::Class) DISGEO::Attribuutsoort(UML::Attribute) + MIM::Gegevensgroep(UML::Attribute) + MIM::Gegevensgroeptype(UML::Class) + MIM_Keuzeattribuut::Keuze(UML::Attribute) Geef ze de bijbehorende aliassen uit het MIM-profiel Klik nu op OK . Voeg de toolboxpage toe voor MIM-Relaties , MIM-Datatypen , MIM-Waardelijsten en MIM-Packages . Herhaal hiervoor de voorgaande stappen . Je hebt nu met succes het toolboxmenu gemaakt. Het is in alle gevallen mogelijk om de namen van de stereotypen met de hand op te voeren. De schrijfwijze luistert heel nauw, dus heeft het de voorkeur gebruik te maken van Add Stereotype . Stap 5: Modelleer het diagram Open het lege diagram uit het package \u00abDiagram Profile\u00bbDISGEO . Sleept uit de toolbox die bij dit diagram hoort de Profile Helper Add Diagram Extention op het diagram. Het venster Add Diagram Extention opent nu. Geef een naam op voor het diagram en kies bij Extention Type voor Class . Geef bij Description eventueel een beschrijving op voor de toepassing van dit diagram. Het is handig om hier te vermelden dat je dit diagram nodig hebt om voor de MIM-toolbox inclusief extensie! Vouw onder Properties de lijst met General uit. Kies bij Toolbox Profile uit de lijst met namen, de naam van het profiel, in dit geval: DISGEO en klik op OK . Klik nu op het modelelement \u00abmetaclass\u00bb Diagram Logical en voeg bij Features een nieuw attribuut toe met de naam: toolboxPage . Vul bij Initial Value de het volgende in: MIM: Objecten en attributen=1;MIM: Relaties=1;MIM: Datatypen=1;MIM: Waardelijsten=1;MIM: Packages=1;UML: Connectors=0; Dit geeft aan welke onderdelen van de het toolbox menu uit- (waarde: 1 ) of ingevouwen (waarde: 0 ) zijn. Je hebt nu succesvol een Diagram Profile aangemaakt. Stap 6: Genereer MDG Technology Je hebt nu succesvol de volgende drie profielen gemaakt: - \u00abprofile\u00bbDISGEO - \u00abdiagram profile\u00bbDISGEO - \u00abtoolbox profile\u00bbDISGEO In de volgende stap lees je hoe je de profielen publiceert Volg deze link voor een beschrijving. Nadat je elk profiel gepubliceert hebt, 'bundel' je ze in een MDG Technology. Hoe je dat doet, lees je hier Stap 7: Werken met de toolbox Bekijk de meest actuele handleiding voor het gebruik van toolboxen in EA.","title":"Toolbox genereren extensie"},{"location":"MIM-toolbox-genereren-extensie/#handleiding-extensie-maken-op-mim-toolbox","text":"Software/Standaard Versie MIM-standaard 1.1.1 MIM-toolbox 1.1.1 Enterprise Architect (EA) 15.2","title":"Handleiding - Extensie maken op MIM-toolbox"},{"location":"MIM-toolbox-genereren-extensie/#inhoud","text":"Beschrijving Importeer de MIM-toolbox in de EA-omgeving Maak de package-structuur aan voor de extensie Modelleer de toolbox-extensie Modelleer het toolbox-menu Modelleer het diagram Genereer MDG Technology Werken met de toolbox","title":"Inhoud"},{"location":"MIM-toolbox-genereren-extensie/#beschrijving","text":"Deze handleiding beschrijft hoe je in Enterprise Architect een extensie maakt op de MIM-toolbox . Dit is van toepassing als er extra metamodelconstructies nodig zijn voor het maken van een informatiemodel. Meer informatie en spelregels hiervoor vind je in de MIM-standaard . Een extensie op de MIM-toolbox is ook bedoeld voor het maken van aanvullende constructies die alleen spelen op het niveau van implementatie, of op het niveau van afgeleide technsiche modellen ten behoeve van specifieke interfaces. Met een extensie breidt je MIM-toolbox uit. Dit is handig wanneer je extra informatie aan modelonderdelen (bijv. objecttypen) wilt toevoegen. Bijvoorbeeld voor: - het uitbreiden van de set met metagegevens voor modelonderdelen van een specifiek sector-/domeinmodel (extra tagged values); - het uitbreiden van de set met metagegevens voor specifieke toepassingen van het model, zoals bijvoorbeeld in Imvertor of voor een UML-JSON-encodings; - het het toevoegen van extra stereotypen. Deze handleiding neemt het maken van een DiSGeo-extensie op MIM als voorbeeld . Voor het informatiemodel DiSGeo zijn voor de MIM-stereotypen \u00abObjecttype\u00bb en \u00abAttribuutsoort\u00bb meta-informatie nodig in de vorm van extra tagged values . Voor Objecttype gaat dat om het toevoegen van Actualiteit en Inwinning verplicht . Voor Attribuutsoort zijn dat: Inwinningsregels en Positionele juistheid .","title":"Beschrijving"},{"location":"MIM-toolbox-genereren-extensie/#voorbereiding","text":"Zorg dat je de volgende twee zaken bij de hand hebt: 1. Enterprise Architect: Het is handig om de volgende venster te openen - Browser - Toolbox - Properties - Features 1. De MIM-toolbox waarop je een extensie wilt bouwen, in de vorm van een MDG Technology (.xml). Hier vind je de meest actuele versie van de toolbox","title":"Voorbereiding"},{"location":"MIM-toolbox-genereren-extensie/#stap-1-importeer-de-mim-toolbox-in-de-ea-omgeving","text":"Open de project browser . Klik op de tab Resources . Klik op de map MDG Technologies . Klik met de rechtermuisknop op Model Technologies en selecteer Import Technology . Open de MDG Technology (dit bestand heeft een .xml -extensie) van de MIM-toolbox. Klik Openen . Selecteer daar linksonderin het diagloogvenster Import To Model en klik vervolgens op OK . Indien je geen foutmelding krijgt, heb je de MIM-toolbox succesvol ge\u00efmporteerd.","title":"Stap 1: Importeer de MIM-toolbox in de EA-omgeving"},{"location":"MIM-toolbox-genereren-extensie/#stap-2-maak-de-package-structuur-aan-voor-de-extensie","text":"Klik in de project browser linksbovenin op de map met het gele sterretje , of druk Ctrl+Shift+M . Hierdoor open de Model Wizard . Selecteer het tabblad Model Patterns . Klik daaronder op Model Technologies Perspective . Ga naar Management en selecter vervolgens: MDG Technology Builder . In het venster verschijnen nu verschillende Model Patterns . Dit zijn templates voor het maken van modellen. Kies nu onder MDG Technology Builder voor Basic Template en klik linksonderin op Create Pattern(s) . Geef in het dialoogvenster dat nu verschijnt de naam van de extensie op die je gaat maken (bijvoorbeeld 'DISGEO') en klik op OK . In de project browser zie dat er nu een nieuwe package DiSGeo is toegevoegd. Dat package bevat een - diagram ; - een \u00abprofile\u00bb ; - een \u00abdiagram profile\u00bb ; - en een \u00abtoolbox profile\u00bb . Je hebt nu succesvol de package structuur aangemaakt.","title":"Stap 2: Maak de package-structuur aan voor de extensie"},{"location":"MIM-toolbox-genereren-extensie/#stap-3-modelleer-de-toolbox-extensie","text":"Vouw het package \u00abprofile\u00bbDISGEO uit Dubbelklik op het diagram Hierdoor opent het diagram en verschijnt de bijbehorende toolbox: UML::Profile Ga in het toolboxmenu naar Metaclass en sleep dit element in het diagram. Er verschijnt nu een venster Extend Metaclass . Klik in de linkerkolom op Stereotypes . Hierdoor verschijnen aan de rechterkant alle stereotypen die MIM kent. Let op : deze zijn alleen beschikbaarbaar nadat je de MIM-toolbox hebt ge\u00efmporteerd (zie: stap: 1 ). Zoek in de lijst aan de rechterkant \u00abObjecttype\u00bb en \u00abAttribuutsoort\u00bb op, selecteer deze en klik op OK . Deze worden nu toegevoegd aan het diagram. Zoek nu in het toolboxmenu Add Stereotype op (onder Profile Helpers ) en sleep dit element op het diagram. Er verschijnt nu een venster Add Stereotype . We gaan nu een stereotype maken dat dient als extensie op het MIM-stereotype \u00abAttribuutsoort\u00bb . Geef een naam op voor het stereotype. In het geval van dit voorbeeld is gekozen voor Attribuutsoort , maar dit kan elke andere willekeurige naam zijn. Klik vervogens op de button Add Metaclass . Hier geef je de UML-metaklasse uit EA op waarop je extensie plaatsvindt. Als je niet weet van welke UML-metaklasse je stereotype wordt afgeleid, zoek dit dan op in het MIM-profiel. Info : In hoofdstuk 3 van de MIM-standaard staat beschreven van welke UML-metaklasse elk MIM-stereotype is afgeleid. Omdat je een extensie maakt op MIM, is de nieuwe extensie automatisch \u00f3\u00f3k een extensie op een UML-type. Desondanks moet je dit in Enterprise Architect expliciet benoemen. Laat de overige instellingen staan en klik op Volgende . In dit venster, Define Tagged Values , kun je de extra metadata-elementen opvoeren. Klik met de rechtermuisknop in de kolom Property Kies uit het menu Add Tagged Value . Voer een naam op voor de tagged value. In het geval van dit voorbeeld Actualiteit . In de linkerkolom kun je nog een standaardwaarde opvoeren, maar dat is niet verplicht. In dit voorbeeld blijft dit veld leeg. Herhaal deze stap voor alle tagged values die je aan dit element wilt toevoegen. Als je klaar bent, kun je bovenstaande stappen herhalen voor \u00abObjecttype\u00bb . Klik daarna op Voltooien Je ziet nu het nieuwe stereotype met de tagged values. Daarnaast heeft het nu een relatie met de UML-metaklasse \u00abAttribute\u00bb . Als laatste onderdeel van deze stap moet nu de relatie gelegd worden tussen het nieuwe stereotype en het MIM-stereotype. Dit gaat als volgt: Klik nu op het element Attribuutsoort . Er verschijnen nu rechts van het element een aantal iconen. Klik op de witte pijl ( QuickLinker ) met de muisknop ingedrukt en sleep dit naar het bijbehorende MIM-type (het bovenste icoon) Kies uit het menu dat nu verschijnt voor Generalization . Je extensie-type heeft nu een relatie met MIM::Attribuutsoort \u00e9n UML::Attribute . Herhaal deze stappen voor \u00abObjecttype\u00bb . Als laatste stap is het handig om het kleurenschema van het modelelement gelijk te maken aan dat van MIM. Dat gaat als volgt: Klik met de rechtermuisknop op het nieuwe element Objecttype . Navigeer naar Appearance en klik op Default Appearance . Nu opent een venster met dezelfde naam. Klik op Background Color . Klik op More Colors . Selecteer het tabblad Custom . En vul vervolgens onderstaande waarden in: Hue: 128 Sat: 245 Lum: 230 Red: 206 Green: 253 Blue: 254 Klik op OK . Zet Border Color en Font Color op zwart . Klik op OK . Herhaal deze stap voor de andere modelelementen, in dit geval Attribuutsoort . Je hebt nu succesvol het profiel van je extensie aangemaakt.","title":"Stap 3: Modelleer de toolbox-extensie"},{"location":"MIM-toolbox-genereren-extensie/#stap-4-modelleer-het-toolbox-menu","text":"In deze stap maak je de menupagina van de toolbox. Hiermee bepaal je hoe en welke stereotypes zichtbaar zijn in het menu. Het doel van de DiSGeo-extensie is om bestaande MIM-stereotypen uitbreiden met extra tagged values . Daarvoor introduceerden we in EA onder de moterkap weliswaar twee nieuwe stereotypen ( \u00abObjectype\u00bb en \u00abAttribuutsoort\u00bb ), maar die willen we niet expliciet terugzien in de toolbox. In de toolbox willen we \u00abObjecttype\u00bb en \u00abAttribuutsoort\u00bb aanbieden. Open het lege diagram uit het package \u00abtoolbox profile\u00bbDISGEO . Sleep uit de toolbox die bij dit diagram hoort de Profile Helper Add Toolbox Page op het diagram. Het venster Add Toolbox Page opent nu. Vul de naam in van de toolboxpagina die je wilt maken. In dit geval maken we een kopie van de MIM-toolbox, dus noemen we deze (eerste) pagina: MIM: Objecten en attributen . Klik vervolgens op de Add-button en selecteer de optie Add Stereotype . Het venster Select A Profile Element opent nu. Navigeer naar het package \u00abprofile\u00bb DISGEO en selecter \u00abstereotype\u00bbObjecttype en klik op OK . In de eerste rij van de tabel in het venster Add Toolbox Page , is nu dit stereotype toegevoegd. Voor de leesbaarheid is het fijn om het type een alias mee te geven (anders heet het toolbox-item DISGEO::Objectype(UML::Class) . Vanwege het eerder genoemde uitgangspunt, krijgt dit stereotype het alias 'Objecttype' . Voeg nu op dezelfde manier 'Attribuutsoort' toe en klik nog niet op OK! . Je hebt nu de twee nieuwe stereotypes toegevoeg aan de toolboxpagina: + DISGEO::Objecttype(UML::Class) + DISGEO::Attribuutsoort(UML::Attribute) In de MIM-toolbox heeft deze pagina nog drie andere stereotypes. Deze kun je uit het package MIM-UML halen. Deze beschrijving gaat ervan uit dat je hierover beschikt. Klik nogmaals op de Add-button en navigeer nu naar het package \u00abMIM-UMLprofile\u00bb en voeg de volgende elementen toe: DISGEO::Objecttype(UML::Class) DISGEO::Attribuutsoort(UML::Attribute) + MIM::Gegevensgroep(UML::Attribute) + MIM::Gegevensgroeptype(UML::Class) + MIM_Keuzeattribuut::Keuze(UML::Attribute) Geef ze de bijbehorende aliassen uit het MIM-profiel Klik nu op OK . Voeg de toolboxpage toe voor MIM-Relaties , MIM-Datatypen , MIM-Waardelijsten en MIM-Packages . Herhaal hiervoor de voorgaande stappen . Je hebt nu met succes het toolboxmenu gemaakt. Het is in alle gevallen mogelijk om de namen van de stereotypen met de hand op te voeren. De schrijfwijze luistert heel nauw, dus heeft het de voorkeur gebruik te maken van Add Stereotype .","title":"Stap 4: Modelleer het toolbox-menu"},{"location":"MIM-toolbox-genereren-extensie/#stap-5-modelleer-het-diagram","text":"Open het lege diagram uit het package \u00abDiagram Profile\u00bbDISGEO . Sleept uit de toolbox die bij dit diagram hoort de Profile Helper Add Diagram Extention op het diagram. Het venster Add Diagram Extention opent nu. Geef een naam op voor het diagram en kies bij Extention Type voor Class . Geef bij Description eventueel een beschrijving op voor de toepassing van dit diagram. Het is handig om hier te vermelden dat je dit diagram nodig hebt om voor de MIM-toolbox inclusief extensie! Vouw onder Properties de lijst met General uit. Kies bij Toolbox Profile uit de lijst met namen, de naam van het profiel, in dit geval: DISGEO en klik op OK . Klik nu op het modelelement \u00abmetaclass\u00bb Diagram Logical en voeg bij Features een nieuw attribuut toe met de naam: toolboxPage . Vul bij Initial Value de het volgende in: MIM: Objecten en attributen=1;MIM: Relaties=1;MIM: Datatypen=1;MIM: Waardelijsten=1;MIM: Packages=1;UML: Connectors=0; Dit geeft aan welke onderdelen van de het toolbox menu uit- (waarde: 1 ) of ingevouwen (waarde: 0 ) zijn. Je hebt nu succesvol een Diagram Profile aangemaakt.","title":"Stap 5: Modelleer het diagram"},{"location":"MIM-toolbox-genereren-extensie/#stap-6-genereer-mdg-technology","text":"Je hebt nu succesvol de volgende drie profielen gemaakt: - \u00abprofile\u00bbDISGEO - \u00abdiagram profile\u00bbDISGEO - \u00abtoolbox profile\u00bbDISGEO In de volgende stap lees je hoe je de profielen publiceert Volg deze link voor een beschrijving. Nadat je elk profiel gepubliceert hebt, 'bundel' je ze in een MDG Technology. Hoe je dat doet, lees je hier","title":"Stap 6: Genereer MDG Technology"},{"location":"MIM-toolbox-genereren-extensie/#stap-7-werken-met-de-toolbox","text":"Bekijk de meest actuele handleiding voor het gebruik van toolboxen in EA.","title":"Stap 7: Werken met de toolbox"},{"location":"MIM-toolbox-genereren/","text":"Handleiding - MIM-Profiel, -Toolbox & -MDG Genereren Software/Standaard Versie MIM-standaard 1.1.1 Enterprise Architect 15.2 Subversion (SVN) 1.14.1 Inhoud Voorbereiding Profiel publiceren Genereer MDG Technologie Test de Toolbox Quicklinker Aandachtspunten MIM MDG Regels Beschrijving Deze handleiding beschrijft het proces voor het genereren van een customized toolbox voor modelleren met Enterprise Architect. Het gaat specifiek in op het maken van de MIM-toolbox . Maar ook voor het genereren customized toolboxen in het algemeen, biedt deze beschrijving een handig overzicht van de benodigde stappen. Een inhoudelijke beschrijving voor het maken van de benodigde profielen, vind je hier ( linkOpnemen ). De meest actuele versie van MIM kun je hier ( linkOpnemen ) raadplegen. 1 Voorbereiding Controleer voordat je (MIM-)profielen gaat genereren eerst de volgende zaken: Beschik je over de benodigde bestanden ? Zijn de benodigde profielen aanwezig? Is het versienummer correct ingevuld ? 1.1 Benodigde bestanden Controleer of je beschikt over alle benodigde bestanden: EA-bestand met MIM profile packages voor het genereren van de profiles en mdg technology ( Create MDG Technology File ), hiertoe behoort ten minste \u00e9\u00e9n package per stereotype: \u00abprofile\u00bb , \u00abdiagram profile\u00bb en \u00abtoolbox profile\u00bb (zie voor meer informatie over ... ( linkOpnemenNaarWelkePackagesPubliceren ). MTS-bestand met MIM properties voor het genereren van MDG Technology ( Working with MTS Files ) CSV-bestand met definities van de quick linkers ( Quick Linker Definition Format ) Het MTS- en CSV-bestand vind je hier (zie ook: onderstaande afbeelding). 1.2 Benodigde profielen Controleer of je beschikt over alle benodigde profielen: Open met Enterprise Architect het project met de MIM-profielen. Ga in de project browser naar het package MIM-UMLprofiel . Controleer of daarin de benodigde profile packages aanwezig zijn: Controleer of in het package \u00abprofile\u00bb MIM het element \u00abdocument\u00bb QuickLinker aanwezig is. NOTE : Het CSV-bestand van de QuickLinker is een kopie van de informatie die in dit element is opgeslagen. Als je wijzigingen wilt aanbrengen in de QuickLinker, of als er in het model wijzingen zijn doorgevoerd die van invloed zijn op de QuickLinker, kun je die met behulp van het CSV-bestand aanpassen (hier linkOpnemenNaarQuickLinkerMakenOfBewerken lees je hoe dat moet). Indien de profielen al in XML-formaat beschikbaar zijn (zie: ( linkOpnemenNaarPackagePublicerenAlsProfiel ), klik dan hier ( linkOpnemenGenererenToolbox ) om de volgende stap over te slaan en direct te beginnen met het genereren van de toolbox. 1.3 Versienummer Toolbox Het is handig om een toolbox een versienummer mee te geven. Hiervoor zijn verschillende manieren. Bovendien is het mogelijk om te kiezen hoever je deze nummering doorvoert. Hieronder wordt uitgelegd op welke manier de MIM-toolbox van een versienummer wordt voorzien. Het belangrijkste uitgangspunt is dat het versienummer van de MIM-toolbox correspondeert met het versienummer van de MIM-dataspecificatie. Format : MIM#.#.# Voor de MIM-toolbox is besloten om het versienummer op verschillende plekken mee te geven: bij het genereren van de toolbox bij het genereren van het profile als alias van het package als alias van de toolbox pages optioneel : stereotype in diagram . Let op: als je dit veranderd, moet je ook het csv-bestand van de Quick Linker aanpassen ( linkOpnemenNaarQuickLinkerMakenOfBewerken ). 1.3.1 Versienummer MDG Technology (Toolbox) Dit is het offici\u00eble versienummer. Als een gebruiker de toolbox importeert, kan dit teruggevonden worden onder Specialize > Manage Tech . In het venster dat dan verschijnt zoek je MIM op in de kolom Technology . In het subvenster rechtsboven vind je het versienummer terug. 1.3.2 Versienummer profile De toolbox wordt gegenereerd uit profielen. Deze hebben ook een versienummer. Dit nummer is o.a. terug te vinden in XML-bestand. Omdat er in de loop van de tijd meerdere profielen gemaakt zullen worden, is het verstandig om dit in te vullen. Door dit bij te houden kun je in het XML-bestand van het profiel terugvinden welk profiel aan een bepaalde toolbox ten grondslag ligt. 1.3.3 Versienummer package Door in het veld Alias van elk package het versienummer mee te geven kan een gebruiker van de toolbox in \u00e9\u00e9n oogopslag in het properties-venster zien met welke versie van de toolbox een modelelement is gemaakt. Dit is vooral handig in het dagelijks gebruik van de toolbox. Ook als je twee (versies van) MIM-modellen wilt vergelijken, geeft dit snel inzicht in de gebruikte MIM-versie. 1.3.4 Versienummer toolbox pages De toolbox pages krijgen eveneens een versienummer. Hiervoor vouw je het package met het stereotype toolbox profile uit. Voor elke toolbox page is een element met het stereotype: stereotype . Controleer of bij elk element het versienummer klopt. Hierdoor ziet de gebruiker van de toolbox in \u00e9\u00e9n oogopslag met welke versie er gewerkt wordt. 1.3.5 Versienummer diagram In MIM heeft het diagram geen versienummer. De MIM-dataspecificatie zegt daarom ook niets over een diagram; het is immers een hulpmiddel. LET OP : Indien je ervoor kiest om de naam van het diagram toch aan te passen, dient de nieuwe diagramnaam ook worden doorgevoerd in het Quick Linker -element ( kolom E : Diagram Filter ) (lees hier hoe dat werkt). 2 Profiel publiceren 2.1 Publiceer package als UML-profiel NOTE : Tussenkoppen toevoegen Navigeer naar het package MIM-UMLprofiel . Selecteer vervolgens \u00e9\u00e9n van de bovengenoemde profielen (bijv. \u00abprofile\u00bb MIM ). Ga naar: Specialize . Kies Publish Package as UML Profile . En klik op: Publish Pack As UML profile . Er verschijnt nu een nieuw venster. Voer profile name in: MIM . Kies de locatie waar je het profiel wilt opslaan en geef het bestand een herkenbare naam Voer het versienummer van de corresponderende MIM-dataspecificatie in (bijv.: 1.1.1 ). Let op er zijn twee belangrijke voorwaarden: 1. De profile name moet overeenkomenm met de naam van het package . 2. De namen van de packages met de stereotypen \u00abprofile\u00bb , \u00abprofile diagram\u00bb en \u00abprofile toolbox\u00bb moeten exact hetzelfde zijn. 3. De naam van een package moet overeenkomen met de prefix van een toolbox-element (zie: afbeelding). Opmerking : Dat er daarnaast packages zijn met een andere naam, maakt niet uit, zoals bijv. MIM_Keuzebasis , zo lang de drie voorgenoemde packages maar hetzelfde zijn. Opmerking : Een toolbox-element verwijst naar de het package met het bijbehorende profiel. Als je de packagenaam van een profiel aanpast, verandert de naam van het toolbox-element niet automatisch mee. In de uiteindelijke toolbox zul je dit element dan niet kunnen gebruiken. Controleer of aan deze voorwaarden voldaan wordt. Klik: 'Save' Herhaal deze stappen voor alle profielen Ga daarna door na de volgende stap om op basis van de profielen een toolbox te genereren. 3 Genereer MDG Technologie Doorloop voor het genereren van een toolbox de volgende stappen in de Generate MDG Technology Wizard . 3.1 Selecteer package Selecteer het package waaronder alle subpackages vallen, in dit geval: MIM-UMLprofiel . 3.2 Open wizard Klik op 'Specialize' in de ribbon . Kies: 'Publish Package'. Kies: 'Generate MDG Technology'. 3.3 Selecteer MTS-bestand Kies 'Volgende'. Kies 'Open an existing MTS file'. Negeer de melding. Opm : Het MTS-bestand vult een aantal standaard configuraties vooraf in, maar je kunt deze tijdens het proces nog aanpassen. Dit is een handig bestand. Het kan voorkomen dat je na het genereren van de toolbox aanpassingen wilt maken. Als je na het aanpassen van de gegevens opnieuw de toolbox wilt genereren, is het fijn als je deze gegevens niet opnieuw hoeft in te vullen. 3.4 Controleer gegevens Vanuit het MTS-bestand wordt het volgende venster al ingevuld - Technology: MIM - Filename: (kies een naam en locatie) - ID: build + build number (bijv.: build03 ) - Version: 1.1.1 Toelichting 1. Icon en logo: deze velden blijven vooralsnog leeg. 1. URL: link naar corresponderende MIM-documentatie op GitHub/ReSpec. 1. Support: link naar website Geonovum. 1. Notes: Vul in het notes veld kort in wat is er in deze versie nieuw is. Klik 'Volgende'. 3.5 Controleer instellingen Controleer of Profiles , Diagram Types en Toolboxes zijn geselecteerd Wijzig indien nodig de instellingen Klik op 'Ok' 3.6 Selecteer profiles Alle configuraties kun je laden vanuit de MTF file. Voor de eerste keer kun je ook een MTS-bestand genereren. Select: 'Files To Be Included As Profiles '. Kies hier alle XML-bestanden, behalve de toolboxprofile. Klik 'Volgende'. 3.7 Selecteer diagrams Select: 'Files To Be Included As Diagram definitions ' Kies hier het diagramprofiel Klik 'Volgende'. 3.8 Selecteer Toolboxes Select: 'Files To Be Included As Toolbox Definitions ' Kies hier het toolboxprofiel Klik 'Volgende'. In de volgende stap selecteer je tot slot het toolbox profiel. 3.9 Controleer gegevens en voltooi proces Klik 'Volgende'. Check de box 'Save to MTS' en klik op 'Voltooien' Indien je wijzigingen in de configuratie hebt aangebracht: Kies checkbox 'Save To MTS' Klik: 'Voltooien' 4 Test de Toolbox Laad het MIM-profiel via \"Resources\" maar er is een EAP-testf file Verschillende manieren om de nieuwe toolbox te testen Een model bouwen met alle MIM-mogelijkheden erin Of: een nieuwe toolbox laden en update van het bestaande model uitvoeren En dat kan door MIM metaklassen te slepen Of door gebruik te maken va \"Sync Tagged Values And Constraints\" Deze laatste optie vind je terug in het \"Resources\" menu 5 Quicklinker NOTE : verder uitwerken In ieder geval beschrijven: - CSV-bestand nodig - In Nederlandse versies van OS, is scheidingsteken een puntkomma: ; - Voor Enterprise heb je een komma ( , ) nodig als scheidingsteken. - Ook iets zeggen over werken in Excel, kan ook in EAP, maar werkt onoverzichtelijk . - Overigens schijnt er ook een alternatieve (lees:eenvoudigere) methode te zijn vanaf een bepaalde EA-versie ( nog uitzoeken! ) Afbeeldingen 6 Aandachtspunten NOTE : verder uitwerken Tekstveld voor toelichting, niet initial value , maar notes field als datatype Uitgebreide toelichting wordt afgekapt vanwege maximale lengte. Profiel niet elke keer opnieuw moeten laden door het kopppelen aan een (std.) diagram MIM 1.1 build 1 Vorige versie had ook zo'n naam, dit kun je op website of github terugvinden. gaat om de naam van de het XML 7 MIM MDG NOTE : verder uitwerken profile helpers, model wizard: https://sparxsystems.com/enterprise_architect_user_guide/15.2/modeling/using_the_profile_helpers.html Create Diagram Profiles using the Profile Helpers:https://sparxsystems.com/enterprise_architect_user_guide/15.2/modeling/create_diagram_profiles_using_.html Morgen weer verder! 8 Regels NOTE : verder uitwerken \u00abprofile\u00bb , \u00abdiagram profile\u00bb en \u00abtoolbox profile\u00bb moeten dezelfde naam dragen Bij het genereren van een profiel, moet profile name gelijk zijn aan de naam die het profiel draagt Binnen een package mogen elementen niet dezelfde naam hebben, maar MIM kent verschillende elementen met de naam ' Keuze '. Om dit mogelijk te maken in de toolbox, zijn voor de keuze-elementen aparte aanvullende packages gemaakt. Vandaar dat er meerdere packages \u00abprofile\u00bb zijn.","title":"Toolbox genereren"},{"location":"MIM-toolbox-genereren/#handleiding-mim-profiel-toolbox-mdg-genereren","text":"Software/Standaard Versie MIM-standaard 1.1.1 Enterprise Architect 15.2 Subversion (SVN) 1.14.1","title":"Handleiding - MIM-Profiel, -Toolbox & -MDG Genereren"},{"location":"MIM-toolbox-genereren/#inhoud","text":"Voorbereiding Profiel publiceren Genereer MDG Technologie Test de Toolbox Quicklinker Aandachtspunten MIM MDG Regels","title":"Inhoud"},{"location":"MIM-toolbox-genereren/#beschrijving","text":"Deze handleiding beschrijft het proces voor het genereren van een customized toolbox voor modelleren met Enterprise Architect. Het gaat specifiek in op het maken van de MIM-toolbox . Maar ook voor het genereren customized toolboxen in het algemeen, biedt deze beschrijving een handig overzicht van de benodigde stappen. Een inhoudelijke beschrijving voor het maken van de benodigde profielen, vind je hier ( linkOpnemen ). De meest actuele versie van MIM kun je hier ( linkOpnemen ) raadplegen.","title":"Beschrijving"},{"location":"MIM-toolbox-genereren/#1-voorbereiding","text":"Controleer voordat je (MIM-)profielen gaat genereren eerst de volgende zaken: Beschik je over de benodigde bestanden ? Zijn de benodigde profielen aanwezig? Is het versienummer correct ingevuld ?","title":"1 Voorbereiding"},{"location":"MIM-toolbox-genereren/#11-benodigde-bestanden","text":"Controleer of je beschikt over alle benodigde bestanden: EA-bestand met MIM profile packages voor het genereren van de profiles en mdg technology ( Create MDG Technology File ), hiertoe behoort ten minste \u00e9\u00e9n package per stereotype: \u00abprofile\u00bb , \u00abdiagram profile\u00bb en \u00abtoolbox profile\u00bb (zie voor meer informatie over ... ( linkOpnemenNaarWelkePackagesPubliceren ). MTS-bestand met MIM properties voor het genereren van MDG Technology ( Working with MTS Files ) CSV-bestand met definities van de quick linkers ( Quick Linker Definition Format ) Het MTS- en CSV-bestand vind je hier (zie ook: onderstaande afbeelding).","title":"1.1 Benodigde bestanden"},{"location":"MIM-toolbox-genereren/#12-benodigde-profielen","text":"Controleer of je beschikt over alle benodigde profielen: Open met Enterprise Architect het project met de MIM-profielen. Ga in de project browser naar het package MIM-UMLprofiel . Controleer of daarin de benodigde profile packages aanwezig zijn: Controleer of in het package \u00abprofile\u00bb MIM het element \u00abdocument\u00bb QuickLinker aanwezig is. NOTE : Het CSV-bestand van de QuickLinker is een kopie van de informatie die in dit element is opgeslagen. Als je wijzigingen wilt aanbrengen in de QuickLinker, of als er in het model wijzingen zijn doorgevoerd die van invloed zijn op de QuickLinker, kun je die met behulp van het CSV-bestand aanpassen (hier linkOpnemenNaarQuickLinkerMakenOfBewerken lees je hoe dat moet). Indien de profielen al in XML-formaat beschikbaar zijn (zie: ( linkOpnemenNaarPackagePublicerenAlsProfiel ), klik dan hier ( linkOpnemenGenererenToolbox ) om de volgende stap over te slaan en direct te beginnen met het genereren van de toolbox.","title":"1.2 Benodigde profielen"},{"location":"MIM-toolbox-genereren/#13-versienummer-toolbox","text":"Het is handig om een toolbox een versienummer mee te geven. Hiervoor zijn verschillende manieren. Bovendien is het mogelijk om te kiezen hoever je deze nummering doorvoert. Hieronder wordt uitgelegd op welke manier de MIM-toolbox van een versienummer wordt voorzien. Het belangrijkste uitgangspunt is dat het versienummer van de MIM-toolbox correspondeert met het versienummer van de MIM-dataspecificatie. Format : MIM#.#.# Voor de MIM-toolbox is besloten om het versienummer op verschillende plekken mee te geven: bij het genereren van de toolbox bij het genereren van het profile als alias van het package als alias van de toolbox pages optioneel : stereotype in diagram . Let op: als je dit veranderd, moet je ook het csv-bestand van de Quick Linker aanpassen ( linkOpnemenNaarQuickLinkerMakenOfBewerken ).","title":"1.3 Versienummer Toolbox"},{"location":"MIM-toolbox-genereren/#131-versienummer-mdg-technology-toolbox","text":"Dit is het offici\u00eble versienummer. Als een gebruiker de toolbox importeert, kan dit teruggevonden worden onder Specialize > Manage Tech . In het venster dat dan verschijnt zoek je MIM op in de kolom Technology . In het subvenster rechtsboven vind je het versienummer terug.","title":"1.3.1 Versienummer MDG Technology (Toolbox)"},{"location":"MIM-toolbox-genereren/#132-versienummer-profile","text":"De toolbox wordt gegenereerd uit profielen. Deze hebben ook een versienummer. Dit nummer is o.a. terug te vinden in XML-bestand. Omdat er in de loop van de tijd meerdere profielen gemaakt zullen worden, is het verstandig om dit in te vullen. Door dit bij te houden kun je in het XML-bestand van het profiel terugvinden welk profiel aan een bepaalde toolbox ten grondslag ligt.","title":"1.3.2 Versienummer profile"},{"location":"MIM-toolbox-genereren/#133-versienummer-package","text":"Door in het veld Alias van elk package het versienummer mee te geven kan een gebruiker van de toolbox in \u00e9\u00e9n oogopslag in het properties-venster zien met welke versie van de toolbox een modelelement is gemaakt. Dit is vooral handig in het dagelijks gebruik van de toolbox. Ook als je twee (versies van) MIM-modellen wilt vergelijken, geeft dit snel inzicht in de gebruikte MIM-versie.","title":"1.3.3 Versienummer package"},{"location":"MIM-toolbox-genereren/#134-versienummer-toolbox-pages","text":"De toolbox pages krijgen eveneens een versienummer. Hiervoor vouw je het package met het stereotype toolbox profile uit. Voor elke toolbox page is een element met het stereotype: stereotype . Controleer of bij elk element het versienummer klopt. Hierdoor ziet de gebruiker van de toolbox in \u00e9\u00e9n oogopslag met welke versie er gewerkt wordt.","title":"1.3.4 Versienummer toolbox pages"},{"location":"MIM-toolbox-genereren/#135-versienummer-diagram","text":"In MIM heeft het diagram geen versienummer. De MIM-dataspecificatie zegt daarom ook niets over een diagram; het is immers een hulpmiddel. LET OP : Indien je ervoor kiest om de naam van het diagram toch aan te passen, dient de nieuwe diagramnaam ook worden doorgevoerd in het Quick Linker -element ( kolom E : Diagram Filter ) (lees hier hoe dat werkt).","title":"1.3.5 Versienummer diagram"},{"location":"MIM-toolbox-genereren/#2-profiel-publiceren","text":"","title":"2 Profiel publiceren"},{"location":"MIM-toolbox-genereren/#21-publiceer-package-als-uml-profiel","text":"NOTE : Tussenkoppen toevoegen Navigeer naar het package MIM-UMLprofiel . Selecteer vervolgens \u00e9\u00e9n van de bovengenoemde profielen (bijv. \u00abprofile\u00bb MIM ). Ga naar: Specialize . Kies Publish Package as UML Profile . En klik op: Publish Pack As UML profile . Er verschijnt nu een nieuw venster. Voer profile name in: MIM . Kies de locatie waar je het profiel wilt opslaan en geef het bestand een herkenbare naam Voer het versienummer van de corresponderende MIM-dataspecificatie in (bijv.: 1.1.1 ). Let op er zijn twee belangrijke voorwaarden: 1. De profile name moet overeenkomenm met de naam van het package . 2. De namen van de packages met de stereotypen \u00abprofile\u00bb , \u00abprofile diagram\u00bb en \u00abprofile toolbox\u00bb moeten exact hetzelfde zijn. 3. De naam van een package moet overeenkomen met de prefix van een toolbox-element (zie: afbeelding). Opmerking : Dat er daarnaast packages zijn met een andere naam, maakt niet uit, zoals bijv. MIM_Keuzebasis , zo lang de drie voorgenoemde packages maar hetzelfde zijn. Opmerking : Een toolbox-element verwijst naar de het package met het bijbehorende profiel. Als je de packagenaam van een profiel aanpast, verandert de naam van het toolbox-element niet automatisch mee. In de uiteindelijke toolbox zul je dit element dan niet kunnen gebruiken. Controleer of aan deze voorwaarden voldaan wordt. Klik: 'Save' Herhaal deze stappen voor alle profielen Ga daarna door na de volgende stap om op basis van de profielen een toolbox te genereren.","title":"2.1 Publiceer package als UML-profiel"},{"location":"MIM-toolbox-genereren/#3-genereer-mdg-technologie","text":"Doorloop voor het genereren van een toolbox de volgende stappen in de Generate MDG Technology Wizard .","title":"3 Genereer MDG Technologie"},{"location":"MIM-toolbox-genereren/#31-selecteer-package","text":"Selecteer het package waaronder alle subpackages vallen, in dit geval: MIM-UMLprofiel .","title":"3.1 Selecteer package"},{"location":"MIM-toolbox-genereren/#32-open-wizard","text":"Klik op 'Specialize' in de ribbon . Kies: 'Publish Package'. Kies: 'Generate MDG Technology'.","title":"3.2 Open wizard"},{"location":"MIM-toolbox-genereren/#33-selecteer-mts-bestand","text":"Kies 'Volgende'. Kies 'Open an existing MTS file'. Negeer de melding. Opm : Het MTS-bestand vult een aantal standaard configuraties vooraf in, maar je kunt deze tijdens het proces nog aanpassen. Dit is een handig bestand. Het kan voorkomen dat je na het genereren van de toolbox aanpassingen wilt maken. Als je na het aanpassen van de gegevens opnieuw de toolbox wilt genereren, is het fijn als je deze gegevens niet opnieuw hoeft in te vullen.","title":"3.3 Selecteer MTS-bestand"},{"location":"MIM-toolbox-genereren/#34-controleer-gegevens","text":"Vanuit het MTS-bestand wordt het volgende venster al ingevuld - Technology: MIM - Filename: (kies een naam en locatie) - ID: build + build number (bijv.: build03 ) - Version: 1.1.1 Toelichting 1. Icon en logo: deze velden blijven vooralsnog leeg. 1. URL: link naar corresponderende MIM-documentatie op GitHub/ReSpec. 1. Support: link naar website Geonovum. 1. Notes: Vul in het notes veld kort in wat is er in deze versie nieuw is. Klik 'Volgende'.","title":"3.4 Controleer gegevens"},{"location":"MIM-toolbox-genereren/#35-controleer-instellingen","text":"Controleer of Profiles , Diagram Types en Toolboxes zijn geselecteerd Wijzig indien nodig de instellingen Klik op 'Ok'","title":"3.5 Controleer instellingen"},{"location":"MIM-toolbox-genereren/#36-selecteer-profiles","text":"Alle configuraties kun je laden vanuit de MTF file. Voor de eerste keer kun je ook een MTS-bestand genereren. Select: 'Files To Be Included As Profiles '. Kies hier alle XML-bestanden, behalve de toolboxprofile. Klik 'Volgende'.","title":"3.6 Selecteer profiles"},{"location":"MIM-toolbox-genereren/#37-selecteer-diagrams","text":"Select: 'Files To Be Included As Diagram definitions ' Kies hier het diagramprofiel Klik 'Volgende'.","title":"3.7 Selecteer diagrams"},{"location":"MIM-toolbox-genereren/#38-selecteer-toolboxes","text":"Select: 'Files To Be Included As Toolbox Definitions ' Kies hier het toolboxprofiel Klik 'Volgende'. In de volgende stap selecteer je tot slot het toolbox profiel.","title":"3.8 Selecteer Toolboxes"},{"location":"MIM-toolbox-genereren/#39-controleer-gegevens-en-voltooi-proces","text":"Klik 'Volgende'. Check de box 'Save to MTS' en klik op 'Voltooien' Indien je wijzigingen in de configuratie hebt aangebracht: Kies checkbox 'Save To MTS' Klik: 'Voltooien'","title":"3.9 Controleer gegevens en voltooi proces"},{"location":"MIM-toolbox-genereren/#4-test-de-toolbox","text":"Laad het MIM-profiel via \"Resources\" maar er is een EAP-testf file Verschillende manieren om de nieuwe toolbox te testen Een model bouwen met alle MIM-mogelijkheden erin Of: een nieuwe toolbox laden en update van het bestaande model uitvoeren En dat kan door MIM metaklassen te slepen Of door gebruik te maken va \"Sync Tagged Values And Constraints\" Deze laatste optie vind je terug in het \"Resources\" menu","title":"4 Test de Toolbox"},{"location":"MIM-toolbox-genereren/#5-quicklinker","text":"NOTE : verder uitwerken In ieder geval beschrijven: - CSV-bestand nodig - In Nederlandse versies van OS, is scheidingsteken een puntkomma: ; - Voor Enterprise heb je een komma ( , ) nodig als scheidingsteken. - Ook iets zeggen over werken in Excel, kan ook in EAP, maar werkt onoverzichtelijk . - Overigens schijnt er ook een alternatieve (lees:eenvoudigere) methode te zijn vanaf een bepaalde EA-versie ( nog uitzoeken! )","title":"5 Quicklinker"},{"location":"MIM-toolbox-genereren/#afbeeldingen","text":"","title":"Afbeeldingen"},{"location":"MIM-toolbox-genereren/#6-aandachtspunten","text":"NOTE : verder uitwerken Tekstveld voor toelichting, niet initial value , maar notes field als datatype Uitgebreide toelichting wordt afgekapt vanwege maximale lengte. Profiel niet elke keer opnieuw moeten laden door het kopppelen aan een (std.) diagram MIM 1.1 build 1 Vorige versie had ook zo'n naam, dit kun je op website of github terugvinden. gaat om de naam van de het XML","title":"6 Aandachtspunten"},{"location":"MIM-toolbox-genereren/#7-mim-mdg","text":"NOTE : verder uitwerken profile helpers, model wizard: https://sparxsystems.com/enterprise_architect_user_guide/15.2/modeling/using_the_profile_helpers.html Create Diagram Profiles using the Profile Helpers:https://sparxsystems.com/enterprise_architect_user_guide/15.2/modeling/create_diagram_profiles_using_.html Morgen weer verder!","title":"7 MIM MDG"},{"location":"MIM-toolbox-genereren/#8-regels","text":"NOTE : verder uitwerken \u00abprofile\u00bb , \u00abdiagram profile\u00bb en \u00abtoolbox profile\u00bb moeten dezelfde naam dragen Bij het genereren van een profiel, moet profile name gelijk zijn aan de naam die het profiel draagt Binnen een package mogen elementen niet dezelfde naam hebben, maar MIM kent verschillende elementen met de naam ' Keuze '. Om dit mogelijk te maken in de toolbox, zijn voor de keuze-elementen aparte aanvullende packages gemaakt. Vandaar dat er meerdere packages \u00abprofile\u00bb zijn.","title":"8 Regels"},{"location":"MIM-toolbox-importeren/","text":"Handleiding - Importeren en toepassen MIM-toolbox in Enterprise Architect Software/Standaard Versie MIM-standaard 1.1.1 MIM-toolbox 1.1.1, build 5 Enterprise Architect 15.2 Subversion (SVN) 1.14.1 Inhoud Importeren MIM-toolbox Toepassen MIM-diagram Toepassen Quick Linker Toepassen toolbox-item 'Relatierol' Updaten MIM-versie in bestaand informatiemodel Verwijderen oudere toolbox Toolboxen beheren Workspaces gebruiken 1: Importeren MIM-toolbox Download het XML-bestand van de MIM-toolbox: MDG_MIM_Toolbox_v1.1.1_build05.xml . Verwijder eventueel eerst de oudere versie van de toolbox als je die niet meer nodig hebt ( Toolbox verwijderen ). Open Enterprise Architect Open ' Resources ' Kies rechts in beeld op ' Portals ', of direct op het gelijknamige tablad in de ' Project Browser ' Selecteer in het dropdown-menu ' Windows ' Kies ' Resources ' (onder ' Explore ') Klik op ' MDG Technologies ' Note Hier moet je de keuze maken of je de toolbox op model- of gebruikersniveau importeert. Beide hebben voor- en nadelen: - Model : alleen te gebruiken binnen \u00e9\u00e9n EA-project. Voor elke project moet je apart de toolbox importeren. Indien je dit project met een andere gebruiker deelt, beschikt deze gebruiker ook over de toolbox. Dit is de aanbevolen optie . Dit geeft de minste kans op conflicten. - User : Je hoeft de toolbox slechts \u00e9\u00e9nmalig te importeren. Vervolgens is de toolbox automatisch beschikbaar voor alle EA-projecten waar je als gebruiker aan werkt. Het nadeel is dat bij het delen van projecten de toolbox niet mee komt. Bovendien kunnen er conflicten tussen toolboxen ontstaan (zie: volgende informatiekader). Warning Indien binnen jouw EA-omgeving ook een toolbox van een extensie op het MIM aanwezig is (bijvoorbeeld voor de BRO), dan is het raadzaam om de toolboxen alleen op model-niveau te importeren. Indien tenminste \u00e9\u00e9n van de twee op user-niveau is ge\u00efmporteerd, kan dit bij het toewijzen van stereotypen verwarring opleveren. Veel stereotypen hebben exact dezelfde naam en voor EA is het dan onduidelijk welke MDG Technology het moet kiezen. De bovenstaande aanpak houdt de werkwijze zuiverder. Klik met de rechtermuisknop op ' Model Technologies ' of ' User Technologies '. Selecteer ' Import technology '. Zoek het gedownloade XML-bestand van de MIM-toolbox op en kies ' Openen '. Overigens kun je ook in dit venster nog kiezen tussen ' model ' of ' user '. Op welke plek je de keuze maakt voor ' model ' of ' user ', maakt geen verschil. De velden ' Technology ', ' Version ' en ' Notes ' worden nu automatisch ingevuld met de juiste informatie. Controleer het versienummer: Version: 1.1.1 . Klik ' Ok ' Navigeer in het ' Resources ' naar ' MDG Technologies ' > ' Model Technologies '. Controleer of hier nu een map met de naam ' MIM ' staat. Controleer ook of het MIM-versienummer klopt bij ' UML Profiles ', ' Diagram Types ' en ' Toolboxes '. Bij een user import zal er nog een venster verschijnen met de tekst ' Copy succesfull '. De MIM-toolbox is nu beschikbaar voor gebruik, maar het is raadzaam om eerst de volgende instructies door te nemen: Instructie voor het gebruik van het MIM-diagram . Instructie voor het gebruik van de Quick Linker . Instructie voor het gebruik van toolbox-item \u00abRelatierol\u00bb . Warning De MIM-toolbox heeft een versienummer. Deze staat niet in de naam. Indien je besloten hebt om oudere versies van de MIM-toolbox niet te verwijderen, komt de naam 'MIM' mogelijk meerdere malen voor. Het beheren van toolboxen in Enterprise Architect doe je op deze manier. 2: Toepassen MIM-diagram In voorgaande versies werd de MIM-toolbox toegepast op een standaard UML diagram ( UML::Class ). Dat kan nog steeds. Dit heeft echter \u00e9\u00e9n nadelige eigenschap. Als je in je project met meerdere diagrammen werkt, kan het voorkomen dat bij het wisselen tussen diagrammen de toolbox terugspringt op de standaard UML-toolbox. Hierdoor moet je de MIM-toolbox opnieuw opzoeken. Dit probleem wordt veroorzaakt doordat een diagram en een toolbox aan elkaar gekoppeld zijn. Daarom is in versie 1.1.1 van de MIM-toolbox een speciaal MIM-diagram aangemaakt waaraan de toolbox gekoppeld is. Dit diagram is een directe afgeleide van het standaard ' UML Class diagram '. Hieronder staat uitgelegd hoe je dit kunt toepassen. Ga in de ' Project Browser ' naar ' Project '. Selecteer een package. Klik op het diagramlogo om een nieuw diagram aan te maken. Warning Dit kan alleen als je onder model in de Project browser al een package hebt aangemaakt. Als je dat nog niet hebt, maak dan eerst een (nieuw) package aan. Er opent nu een venster. Geef het diagram een naam. Klik op het dropdown-menu bij ' Type '. Selecteer ' Specialized ' > ' User Technologies ' of ' Model Technologies ' (afhankelijk van de manier waarop je de toolbox geimporteerd hebt). Klik in het deelvenster ' Select From ' op ' MIM 1.1.1 '. Nu verschijnt in het deelvenster ' Diagram Types ' het ' MIM Diagram '. Selecteer het diagram en klik op ' Ok '. Note Het is belangrijk dat je het diagram daadwerkelijk selecteert. Je kunt herkennen of dit gelukt is, doordat in het onderste deelvenster een toelichtende tekst op het diagram verschijnt (anders staat er alleen 'MIM'). De MIM-toolbox verschijnt nu in het toolbox-menu. Dubbelklik in de ' Project browser ' op het nieuwe diagram. In het venster ' Properties ' zie je dat het diagram van het type ' MIM ' is. Het MIM-versienummer komt nu ook terug het veld Stereotype in het venster ' Properties ' van het object. - Maak een objecttype \"A\" aan. - Controleer vervolgens in de het venster ' Properties ' of in de naam van het stereotype het betreffende MIM-versienummer verschijnt. - Tevens verschijnt er in dit venster een deelmenu met de titel ' \u00abObjecttype\u00bb ( from MIM 1.1.1 - Basiselementen ) ' - Als dit klopt, is de toolbox correct ge\u00efmporteerd. 3: Toepassen Quick Linker De Quick Linker is een hulpmiddel om snel en eenvoudig relaties te kunnen leggen tussen verschillende elementen. Het voordeel hiervan is dat het de gebruiker inzicht geeft in de volgens MIM toegestane relaties. De Quick Linker is beschikbaar via een icoontje dat rechtsboven een diagramelement verschijnt op het moment dat je het selecteert. Je kunt de Quick Linker op drie manieren inzetten, namelijk voor het: Verbinden van twee bestaande modelelementen Cre\u00ebren van nieuwe modelelementen Cre\u00ebren van meerdere modelelemten tegelijk Hieronder beschrijven we elke methode afzonderlijk. 3.1 Verbinden bestaande modelelementen Klik met de muis op het icoon. Houd de muisknop ingedrukt en trek een lijn naar het object waarmee je het wilt verbinden. Er verschijnt een stippellijn en een menu. Selecteer het gewenste type MIM-relatie (bijvoorbeeld: \u00abGeneralisatie\u00bb . 3.2 Nieuw modelelement Je kunt ook vanuit een bestaand element een nieuw modelelement cre\u00ebren. Dat gaat als volgt: Klik met de muis op het icoon. Houd de muisknop ingedrukt en trek een lijn naar een lege plek in het diagram. Er verschijnt een stippellijn en een menu. Dit menu ziet er anders uit dan bij het verbinden van twee bestaande elementen. Navigeer naar ' MIM ' en selecteer het gewenste type MIM-relatie (bijvoorbeeld: \u00abGeneralisatie\u00bb ) 3.3 Meerdere nieuwe modelelementen Ook is het mogelijk om vanuit een bestaand element meerdere \u00e9n verschillende soorten modelelementen in \u00e9\u00e9n keer te cre\u00ebren. Dat gaat als volgt: Klik met de muis op het icoon. Houd de muisknop ingedrukt en trek een lijn naar een lege plek in het diagram. Er verschijnt een stippellijn en een menu. Navigeer naar ' Create Multiple Elements '. Er verschijnt een nieuw venster. Defineer in dit venster de elementen in de eerste kolom (' Name ') en selecteer het gewenste type relatie in de derde kolom (' Type '). Klik op ' Ok ' als je klaar bent. 4: Toepassen toolbox-item 'Relatierol' Net als alle andere modelelementen uit de MIM-toolbox, kun je ook de \u00abRelatierol\u00bb in het diagram slepen. Je doet dit door een \u00abRelatierol\u00bb naar uiteinde van een reeds bestaande \u00abRelatiesoort\u00bb te slepen. Wanneer je in EA het stereotype \u00abRelatierol\u00bb toewijst aan een relatie, worden de bijbehorende ' Tagged Values ' automatisch meegenomen. Note In eerdere versies van de MIM1.1.1-toolbox ontbraken de Tagged Values bij de \u00abRelatierol\u00bb na toewijzing. Dit is opgelost in build 5: MDG_MIM_Toolbox_v1.1.1_build05 . Indien je twee modelelementen met elkaar verbindt door middel van een \u00abRelatiesoort\u00bb , kun je de \u00abRelatierol\u00bb aan de target end (of de source end ) toevoegen door middel van het toolbox-item \u00abRelatierol\u00bb . Klik op het toolbox-item \u00abRelatierol\u00bb en sleep het item met de muisknop ingedrukt naar de target end van de associatie en laat hier de muisknop weer los. Er verschijnt een popup-venster. Vul bij ' Enter value ' de naam van de \u00abRelatierol\u00bb in en klik op ' Ok '. Klik vervolgens in het ' Properties ' venster op het ' Target ' tabblad. Vervolgens zie je de bijbehorende Tagged Values voor alternatief 1 of alternatief 2 . 5: Updaten MIM-versie in bestaand informatiemodel Er zijn verschillende situaties denkbaar waarin je \u00e9\u00e9n of meerdere type modelelementen van een informatiemodel wilt updaten. Bijvoorbeeld omdat er een bug-fix is geweest. Zoals hierboven beschreven, kreeg een \u00abRelatierol\u00bb in de eerste versies van de MIM1.1.1-toolbox (build01-build04) geen Tagged Values mee. Maar het kan ook zijn dat je alle modelelementen in een model naar de nieuwste versie van toolbox wilt updaten. Hiervoor moet je het stereotype (het modelelement) synchroniseren. De volgende stappen beschrijven hoe dat werkt. Verwijder de oude toolbox eerst en importeer vervolgens de nieuwe versie . Doorloop daarna de volgende stappen. Hieronder gebruiken we het updaten van \u00abRelatierol\u00bb als voorbeeld, maar je kunt dit voor elk gewenst modelelement uit de toolbox toepassen. Ga naar het toolbox-item Relatierol en klik hier met de rechtermuisknop op. Klik op ' Synchronize Stereotype '. Er opent een nieuw venster Hierin staat in het veld ' stereotype ' Relatierol al geselecteerd. Klik op ' Ok '. Er verschijnt een popup-venster dat vraagt: ' Save latest changes? ', klik ' Ja '. De tagged values zijn nu gesynchroniseerd. Herhaal bovenstaande stappen als je ook andere modelelementen wilt updaten. 6: Verwijderen oudere toolbox Deze instructie is bedoeld voor het verwijderen van toolboxen die je niet meer wilt gebruiken. Bijvoorbeeld oudere versies van de MIM-toolbox. Open Enterprise Architect Open ' Resources ' Kies rechts in beeld op ' Portals ' Selecteer in het dropdown-menu ' Windows ' Kies ' Resources ' (onder ' Explore ') Klik op ' MDG Technologies ' Controleer nu of er onder ' Model Technologies ' en/of ' User Technologies ' toolboxen staan die je niet meer wilt gebruiken. Verwijderen ' Model Technologies ' Klik met de rechtermuisknop op de toolbox en selecteer ' Remove technology ' Start hierna voor de zekerheid EA opnieuw op. Verwijderen ' User Technologies ' Klik met de rechtermuisknop op de toolbox en selecteer ' Locate Technology '. Verwijder het XML-bestand van de toolbox op deze locatie Start hierna voor de zekerheid EA opnieuw op. Ga verder met het importeren van de MIM-toolbox . 7: Toolboxen beheren Ga naar de menubalk boven in beeld en selecteer ' Specialize ' > ' Manage-Tech ' Hier vind je een overzicht van alle aanwezige MDG-technologies. Scroll naar beneden en zoek ' MIM ' op. Indien je meerdere versies van de toolbox ge\u00efmporteerd hebt, vind je die hier terug. Klik op \u00e9\u00e9n van de versies voor meer informatie. In het informatievenster rechtsboven zie je welke versie het betreft. Tevens vind je hier terug of de toolbox op model- of gebruikersniveau is ge\u00efmporteerd. Met het checkbox in de kolom ' Enabled ' kun je ervoor kiezen om bepaalde bepaalde toolboxen uit te zetten. Dit doe je door het vinkje te verwijderen. Ga verder met de laatste stappen van het importeren van de MIM-toolbox . Warning Indien je toolboxen gebruikt met gelijknamige modelelementen, bijvoorbeeld oudere MIM-toolboxen of NEN3610 BRO Grouping-NL (dat een extensie is op MIM), dan kan dit leiden tot een verwijzing naar het 'verkeerde' profiel. Enterprise Architect doet dit automatisch. Hierdoor beschikt het stereotype bijvoorbeeld niet over de gewenste tagged values. 8: Workspaces gebruiken Note Onderstaande tekst is nog in concept Warning Dit onderwerp hoort niet in deze handleiding thuis, maar in handleiding over EA. Het kan wel handig zijn om vanuit deze handleiding ernaar te verwijzen. 8.1 Overzicht handige vensters bij het modelleren Project Browser Resources Notes Tagged Values Features Pan & Zoom Relationships Relationship Matrix Toolbox 8.2 Waar je ze vindt Ga allereerst naar Klik rechtsboven op Portals en selecteer Windows . De meeste vensters uit 8.1 vind je terug in de volgende deelmenu's: Explore - Project Browser - Resources Properties - Properties - Notes - Tagged Values - Features Diagram - Pan & Zoom Trace - Relationships - Relationship Matrix Het venster Toolbox vind je in de taakbalk bovenin. Ga naar: Design > Diagram > Toolbox ( Ctrl + Shift + 3 ) 8.3 En hoe je een workspace maakt en waarom dat handig kan zijn Note To do: tekst schrijven","title":"Toolbox importeren"},{"location":"MIM-toolbox-importeren/#handleiding-importeren-en-toepassen-mim-toolbox-in-enterprise-architect","text":"Software/Standaard Versie MIM-standaard 1.1.1 MIM-toolbox 1.1.1, build 5 Enterprise Architect 15.2 Subversion (SVN) 1.14.1","title":"Handleiding - Importeren en toepassen MIM-toolbox in Enterprise Architect"},{"location":"MIM-toolbox-importeren/#inhoud","text":"Importeren MIM-toolbox Toepassen MIM-diagram Toepassen Quick Linker Toepassen toolbox-item 'Relatierol' Updaten MIM-versie in bestaand informatiemodel Verwijderen oudere toolbox Toolboxen beheren Workspaces gebruiken","title":"Inhoud"},{"location":"MIM-toolbox-importeren/#1-importeren-mim-toolbox","text":"Download het XML-bestand van de MIM-toolbox: MDG_MIM_Toolbox_v1.1.1_build05.xml . Verwijder eventueel eerst de oudere versie van de toolbox als je die niet meer nodig hebt ( Toolbox verwijderen ). Open Enterprise Architect Open ' Resources ' Kies rechts in beeld op ' Portals ', of direct op het gelijknamige tablad in de ' Project Browser ' Selecteer in het dropdown-menu ' Windows ' Kies ' Resources ' (onder ' Explore ') Klik op ' MDG Technologies ' Note Hier moet je de keuze maken of je de toolbox op model- of gebruikersniveau importeert. Beide hebben voor- en nadelen: - Model : alleen te gebruiken binnen \u00e9\u00e9n EA-project. Voor elke project moet je apart de toolbox importeren. Indien je dit project met een andere gebruiker deelt, beschikt deze gebruiker ook over de toolbox. Dit is de aanbevolen optie . Dit geeft de minste kans op conflicten. - User : Je hoeft de toolbox slechts \u00e9\u00e9nmalig te importeren. Vervolgens is de toolbox automatisch beschikbaar voor alle EA-projecten waar je als gebruiker aan werkt. Het nadeel is dat bij het delen van projecten de toolbox niet mee komt. Bovendien kunnen er conflicten tussen toolboxen ontstaan (zie: volgende informatiekader). Warning Indien binnen jouw EA-omgeving ook een toolbox van een extensie op het MIM aanwezig is (bijvoorbeeld voor de BRO), dan is het raadzaam om de toolboxen alleen op model-niveau te importeren. Indien tenminste \u00e9\u00e9n van de twee op user-niveau is ge\u00efmporteerd, kan dit bij het toewijzen van stereotypen verwarring opleveren. Veel stereotypen hebben exact dezelfde naam en voor EA is het dan onduidelijk welke MDG Technology het moet kiezen. De bovenstaande aanpak houdt de werkwijze zuiverder. Klik met de rechtermuisknop op ' Model Technologies ' of ' User Technologies '. Selecteer ' Import technology '. Zoek het gedownloade XML-bestand van de MIM-toolbox op en kies ' Openen '. Overigens kun je ook in dit venster nog kiezen tussen ' model ' of ' user '. Op welke plek je de keuze maakt voor ' model ' of ' user ', maakt geen verschil. De velden ' Technology ', ' Version ' en ' Notes ' worden nu automatisch ingevuld met de juiste informatie. Controleer het versienummer: Version: 1.1.1 . Klik ' Ok ' Navigeer in het ' Resources ' naar ' MDG Technologies ' > ' Model Technologies '. Controleer of hier nu een map met de naam ' MIM ' staat. Controleer ook of het MIM-versienummer klopt bij ' UML Profiles ', ' Diagram Types ' en ' Toolboxes '. Bij een user import zal er nog een venster verschijnen met de tekst ' Copy succesfull '. De MIM-toolbox is nu beschikbaar voor gebruik, maar het is raadzaam om eerst de volgende instructies door te nemen: Instructie voor het gebruik van het MIM-diagram . Instructie voor het gebruik van de Quick Linker . Instructie voor het gebruik van toolbox-item \u00abRelatierol\u00bb . Warning De MIM-toolbox heeft een versienummer. Deze staat niet in de naam. Indien je besloten hebt om oudere versies van de MIM-toolbox niet te verwijderen, komt de naam 'MIM' mogelijk meerdere malen voor. Het beheren van toolboxen in Enterprise Architect doe je op deze manier.","title":"1: Importeren MIM-toolbox"},{"location":"MIM-toolbox-importeren/#2-toepassen-mim-diagram","text":"In voorgaande versies werd de MIM-toolbox toegepast op een standaard UML diagram ( UML::Class ). Dat kan nog steeds. Dit heeft echter \u00e9\u00e9n nadelige eigenschap. Als je in je project met meerdere diagrammen werkt, kan het voorkomen dat bij het wisselen tussen diagrammen de toolbox terugspringt op de standaard UML-toolbox. Hierdoor moet je de MIM-toolbox opnieuw opzoeken. Dit probleem wordt veroorzaakt doordat een diagram en een toolbox aan elkaar gekoppeld zijn. Daarom is in versie 1.1.1 van de MIM-toolbox een speciaal MIM-diagram aangemaakt waaraan de toolbox gekoppeld is. Dit diagram is een directe afgeleide van het standaard ' UML Class diagram '. Hieronder staat uitgelegd hoe je dit kunt toepassen. Ga in de ' Project Browser ' naar ' Project '. Selecteer een package. Klik op het diagramlogo om een nieuw diagram aan te maken. Warning Dit kan alleen als je onder model in de Project browser al een package hebt aangemaakt. Als je dat nog niet hebt, maak dan eerst een (nieuw) package aan. Er opent nu een venster. Geef het diagram een naam. Klik op het dropdown-menu bij ' Type '. Selecteer ' Specialized ' > ' User Technologies ' of ' Model Technologies ' (afhankelijk van de manier waarop je de toolbox geimporteerd hebt). Klik in het deelvenster ' Select From ' op ' MIM 1.1.1 '. Nu verschijnt in het deelvenster ' Diagram Types ' het ' MIM Diagram '. Selecteer het diagram en klik op ' Ok '. Note Het is belangrijk dat je het diagram daadwerkelijk selecteert. Je kunt herkennen of dit gelukt is, doordat in het onderste deelvenster een toelichtende tekst op het diagram verschijnt (anders staat er alleen 'MIM'). De MIM-toolbox verschijnt nu in het toolbox-menu. Dubbelklik in de ' Project browser ' op het nieuwe diagram. In het venster ' Properties ' zie je dat het diagram van het type ' MIM ' is. Het MIM-versienummer komt nu ook terug het veld Stereotype in het venster ' Properties ' van het object. - Maak een objecttype \"A\" aan. - Controleer vervolgens in de het venster ' Properties ' of in de naam van het stereotype het betreffende MIM-versienummer verschijnt. - Tevens verschijnt er in dit venster een deelmenu met de titel ' \u00abObjecttype\u00bb ( from MIM 1.1.1 - Basiselementen ) ' - Als dit klopt, is de toolbox correct ge\u00efmporteerd.","title":"2: Toepassen MIM-diagram"},{"location":"MIM-toolbox-importeren/#3-toepassen-quick-linker","text":"De Quick Linker is een hulpmiddel om snel en eenvoudig relaties te kunnen leggen tussen verschillende elementen. Het voordeel hiervan is dat het de gebruiker inzicht geeft in de volgens MIM toegestane relaties. De Quick Linker is beschikbaar via een icoontje dat rechtsboven een diagramelement verschijnt op het moment dat je het selecteert. Je kunt de Quick Linker op drie manieren inzetten, namelijk voor het: Verbinden van twee bestaande modelelementen Cre\u00ebren van nieuwe modelelementen Cre\u00ebren van meerdere modelelemten tegelijk Hieronder beschrijven we elke methode afzonderlijk.","title":"3: Toepassen Quick Linker"},{"location":"MIM-toolbox-importeren/#31-verbinden-bestaande-modelelementen","text":"Klik met de muis op het icoon. Houd de muisknop ingedrukt en trek een lijn naar het object waarmee je het wilt verbinden. Er verschijnt een stippellijn en een menu. Selecteer het gewenste type MIM-relatie (bijvoorbeeld: \u00abGeneralisatie\u00bb .","title":"3.1 Verbinden bestaande modelelementen"},{"location":"MIM-toolbox-importeren/#32-nieuw-modelelement","text":"Je kunt ook vanuit een bestaand element een nieuw modelelement cre\u00ebren. Dat gaat als volgt: Klik met de muis op het icoon. Houd de muisknop ingedrukt en trek een lijn naar een lege plek in het diagram. Er verschijnt een stippellijn en een menu. Dit menu ziet er anders uit dan bij het verbinden van twee bestaande elementen. Navigeer naar ' MIM ' en selecteer het gewenste type MIM-relatie (bijvoorbeeld: \u00abGeneralisatie\u00bb )","title":"3.2 Nieuw modelelement"},{"location":"MIM-toolbox-importeren/#33-meerdere-nieuwe-modelelementen","text":"Ook is het mogelijk om vanuit een bestaand element meerdere \u00e9n verschillende soorten modelelementen in \u00e9\u00e9n keer te cre\u00ebren. Dat gaat als volgt: Klik met de muis op het icoon. Houd de muisknop ingedrukt en trek een lijn naar een lege plek in het diagram. Er verschijnt een stippellijn en een menu. Navigeer naar ' Create Multiple Elements '. Er verschijnt een nieuw venster. Defineer in dit venster de elementen in de eerste kolom (' Name ') en selecteer het gewenste type relatie in de derde kolom (' Type '). Klik op ' Ok ' als je klaar bent.","title":"3.3 Meerdere nieuwe modelelementen"},{"location":"MIM-toolbox-importeren/#4-toepassen-toolbox-item-relatierol","text":"Net als alle andere modelelementen uit de MIM-toolbox, kun je ook de \u00abRelatierol\u00bb in het diagram slepen. Je doet dit door een \u00abRelatierol\u00bb naar uiteinde van een reeds bestaande \u00abRelatiesoort\u00bb te slepen. Wanneer je in EA het stereotype \u00abRelatierol\u00bb toewijst aan een relatie, worden de bijbehorende ' Tagged Values ' automatisch meegenomen. Note In eerdere versies van de MIM1.1.1-toolbox ontbraken de Tagged Values bij de \u00abRelatierol\u00bb na toewijzing. Dit is opgelost in build 5: MDG_MIM_Toolbox_v1.1.1_build05 . Indien je twee modelelementen met elkaar verbindt door middel van een \u00abRelatiesoort\u00bb , kun je de \u00abRelatierol\u00bb aan de target end (of de source end ) toevoegen door middel van het toolbox-item \u00abRelatierol\u00bb . Klik op het toolbox-item \u00abRelatierol\u00bb en sleep het item met de muisknop ingedrukt naar de target end van de associatie en laat hier de muisknop weer los. Er verschijnt een popup-venster. Vul bij ' Enter value ' de naam van de \u00abRelatierol\u00bb in en klik op ' Ok '. Klik vervolgens in het ' Properties ' venster op het ' Target ' tabblad. Vervolgens zie je de bijbehorende Tagged Values voor alternatief 1 of alternatief 2 .","title":"4: Toepassen toolbox-item 'Relatierol'"},{"location":"MIM-toolbox-importeren/#5-updaten-mim-versie-in-bestaand-informatiemodel","text":"Er zijn verschillende situaties denkbaar waarin je \u00e9\u00e9n of meerdere type modelelementen van een informatiemodel wilt updaten. Bijvoorbeeld omdat er een bug-fix is geweest. Zoals hierboven beschreven, kreeg een \u00abRelatierol\u00bb in de eerste versies van de MIM1.1.1-toolbox (build01-build04) geen Tagged Values mee. Maar het kan ook zijn dat je alle modelelementen in een model naar de nieuwste versie van toolbox wilt updaten. Hiervoor moet je het stereotype (het modelelement) synchroniseren. De volgende stappen beschrijven hoe dat werkt. Verwijder de oude toolbox eerst en importeer vervolgens de nieuwe versie . Doorloop daarna de volgende stappen. Hieronder gebruiken we het updaten van \u00abRelatierol\u00bb als voorbeeld, maar je kunt dit voor elk gewenst modelelement uit de toolbox toepassen. Ga naar het toolbox-item Relatierol en klik hier met de rechtermuisknop op. Klik op ' Synchronize Stereotype '. Er opent een nieuw venster Hierin staat in het veld ' stereotype ' Relatierol al geselecteerd. Klik op ' Ok '. Er verschijnt een popup-venster dat vraagt: ' Save latest changes? ', klik ' Ja '. De tagged values zijn nu gesynchroniseerd. Herhaal bovenstaande stappen als je ook andere modelelementen wilt updaten.","title":"5: Updaten MIM-versie in bestaand informatiemodel"},{"location":"MIM-toolbox-importeren/#6-verwijderen-oudere-toolbox","text":"Deze instructie is bedoeld voor het verwijderen van toolboxen die je niet meer wilt gebruiken. Bijvoorbeeld oudere versies van de MIM-toolbox. Open Enterprise Architect Open ' Resources ' Kies rechts in beeld op ' Portals ' Selecteer in het dropdown-menu ' Windows ' Kies ' Resources ' (onder ' Explore ') Klik op ' MDG Technologies ' Controleer nu of er onder ' Model Technologies ' en/of ' User Technologies ' toolboxen staan die je niet meer wilt gebruiken. Verwijderen ' Model Technologies ' Klik met de rechtermuisknop op de toolbox en selecteer ' Remove technology ' Start hierna voor de zekerheid EA opnieuw op. Verwijderen ' User Technologies ' Klik met de rechtermuisknop op de toolbox en selecteer ' Locate Technology '. Verwijder het XML-bestand van de toolbox op deze locatie Start hierna voor de zekerheid EA opnieuw op. Ga verder met het importeren van de MIM-toolbox .","title":"6: Verwijderen oudere toolbox"},{"location":"MIM-toolbox-importeren/#7-toolboxen-beheren","text":"Ga naar de menubalk boven in beeld en selecteer ' Specialize ' > ' Manage-Tech ' Hier vind je een overzicht van alle aanwezige MDG-technologies. Scroll naar beneden en zoek ' MIM ' op. Indien je meerdere versies van de toolbox ge\u00efmporteerd hebt, vind je die hier terug. Klik op \u00e9\u00e9n van de versies voor meer informatie. In het informatievenster rechtsboven zie je welke versie het betreft. Tevens vind je hier terug of de toolbox op model- of gebruikersniveau is ge\u00efmporteerd. Met het checkbox in de kolom ' Enabled ' kun je ervoor kiezen om bepaalde bepaalde toolboxen uit te zetten. Dit doe je door het vinkje te verwijderen. Ga verder met de laatste stappen van het importeren van de MIM-toolbox . Warning Indien je toolboxen gebruikt met gelijknamige modelelementen, bijvoorbeeld oudere MIM-toolboxen of NEN3610 BRO Grouping-NL (dat een extensie is op MIM), dan kan dit leiden tot een verwijzing naar het 'verkeerde' profiel. Enterprise Architect doet dit automatisch. Hierdoor beschikt het stereotype bijvoorbeeld niet over de gewenste tagged values.","title":"7: Toolboxen beheren"},{"location":"MIM-toolbox-importeren/#8-workspaces-gebruiken","text":"Note Onderstaande tekst is nog in concept Warning Dit onderwerp hoort niet in deze handleiding thuis, maar in handleiding over EA. Het kan wel handig zijn om vanuit deze handleiding ernaar te verwijzen.","title":"8: Workspaces gebruiken"},{"location":"MIM-toolbox-importeren/#81-overzicht-handige-vensters-bij-het-modelleren","text":"Project Browser Resources Notes Tagged Values Features Pan & Zoom Relationships Relationship Matrix Toolbox","title":"8.1 Overzicht handige vensters bij het modelleren"},{"location":"MIM-toolbox-importeren/#82-waar-je-ze-vindt","text":"Ga allereerst naar Klik rechtsboven op Portals en selecteer Windows . De meeste vensters uit 8.1 vind je terug in de volgende deelmenu's: Explore - Project Browser - Resources Properties - Properties - Notes - Tagged Values - Features Diagram - Pan & Zoom Trace - Relationships - Relationship Matrix Het venster Toolbox vind je in de taakbalk bovenin. Ga naar: Design > Diagram > Toolbox ( Ctrl + Shift + 3 )","title":"8.2 Waar je ze vindt"},{"location":"MIM-toolbox-importeren/#83-en-hoe-je-een-workspace-maakt-en-waarom-dat-handig-kan-zijn","text":"Note To do: tekst schrijven","title":"8.3 En hoe je een workspace maakt en waarom dat handig kan zijn"},{"location":"Markdown/","text":"Markdown Voor het extern publiceren van documenten en standaarden gebruiken we ReSpec . Deze tool ondersteunt naast HTML en Javascript ook Markdown Markdown is een lichtgewicht opmaaktaal op basis van platte tekst die zodanig ontworpen is dat het gemakkelijk valt te converteren naar HTML en andere. Markdown wordt vaak gebruikt voor de opmaak van project documentatie (README-bestanden), eenvoudige CMS-systemen en berichten in online fora. Je kunt Markdown in iedere simpele teksteditor bewerken. Het ontwerpdoel van de taal is leesbaarheid. Teksten geschreven met behulp van Markdown worden geacht al leesbaar te zijn voordat opmaak is toegepast op de tekst. Opmaakinstructies en tags zijn dan ook niet te vinden in pure Markdown. Lokale markdown in je browser Sommige browsers weigeren het openen van lokale bestanden, of negeren links naar locale bestanden. Dit kun je in de configuratie aanpassen: Chrome Je moet twee dingen instellen: Local access: Toestaan dat je local files toont in Chrome, dat is een opstart argument. Kan je doen vanuit een cmd-prompt `%localappdata%\\google\\chrome\\application\\chrome --allow-file-access-from-files CORS Toestaan : zelfde soort oplossing: --disable-web-security Dit kan je ook in een snelkoppeling zetten als icoon op de desktop. Firefox In Firefox kan je dat instellen via de parameters. Kies: Vertel firefox dat je weet waar je mee bezig bent. security.fileuri.strict_origin_policy = false (dus op false zetten) Tools voor Markdown tool omschrijving Markdown Tutorial Handleiding Markdown Markdown Reference Naslag Markdown Visual Studio Code Fijne teksteditor die ook goed integreert met Github Desktop PowerToys Geeft preview van Markdown rechtstreeks in Windows Explorer (en nog heeel veel andere tooltjes) Tables Generator Helpt met het maken van tabellen in MarkDown Markdown Table VSCode plugin voor het editen van Markdown tabellen. Prettier Een code formatter die automatisch zorgt dat je markdown aan de regels voldoet. markdownlint Een style checker form markdown bestanden. Geeft meldingen voor verkeerde markdown Live Server VSCode plugin. Klik rechtsonder op \"Go Live\" en je ReSpec doc wordt in live browser geopend. Regels voor Markdown Styling regels vastleggen voor Markdown zorgt ervoor dat wijzigingen in de markdown ook altijd inhoudelijke wijzigingen zijn. Suggesties hiervoor Regellengte vastleggen. Hoeveel springen we in? Gebruiken unix end-of-line of windows Deze afspraken kunnen we ook vastleggen. Zie hieronder twee voorbeelden. Het lijkt erop dat de veschillende tools op verschillende manier formatteren. Niet alles gaat goed samen. Voorbeeld van '.prettierrc' gebruikt in dit project: { \"printWidth\": 80, \"tabWidth\": 2, \"useTabs\": false, \"singleQuote\": true, \"endOfLine\": \"lf\", \"proseWrap\": \"always\" } Voorbeeld van .markdownlinkt.json : { \"default\": true, \"MD003\": { \"style\": \"atx\" }, \"MD007\": { \"indent\": 4 }, \"MD013\": { \"line_length\": 80, \"code_blocks\": false, \"heading_line_length\": 200, \"tables\": false}, \"no-hard-tabs\": false }","title":"Markdown"},{"location":"Markdown/#markdown","text":"Voor het extern publiceren van documenten en standaarden gebruiken we ReSpec . Deze tool ondersteunt naast HTML en Javascript ook Markdown Markdown is een lichtgewicht opmaaktaal op basis van platte tekst die zodanig ontworpen is dat het gemakkelijk valt te converteren naar HTML en andere. Markdown wordt vaak gebruikt voor de opmaak van project documentatie (README-bestanden), eenvoudige CMS-systemen en berichten in online fora. Je kunt Markdown in iedere simpele teksteditor bewerken. Het ontwerpdoel van de taal is leesbaarheid. Teksten geschreven met behulp van Markdown worden geacht al leesbaar te zijn voordat opmaak is toegepast op de tekst. Opmaakinstructies en tags zijn dan ook niet te vinden in pure Markdown.","title":"Markdown"},{"location":"Markdown/#lokale-markdown-in-je-browser","text":"Sommige browsers weigeren het openen van lokale bestanden, of negeren links naar locale bestanden. Dit kun je in de configuratie aanpassen:","title":"Lokale markdown in je browser"},{"location":"Markdown/#chrome","text":"Je moet twee dingen instellen: Local access: Toestaan dat je local files toont in Chrome, dat is een opstart argument. Kan je doen vanuit een cmd-prompt `%localappdata%\\google\\chrome\\application\\chrome --allow-file-access-from-files CORS Toestaan : zelfde soort oplossing: --disable-web-security Dit kan je ook in een snelkoppeling zetten als icoon op de desktop.","title":"Chrome"},{"location":"Markdown/#firefox","text":"In Firefox kan je dat instellen via de parameters. Kies: Vertel firefox dat je weet waar je mee bezig bent. security.fileuri.strict_origin_policy = false (dus op false zetten)","title":"Firefox"},{"location":"Markdown/#tools-voor-markdown","text":"tool omschrijving Markdown Tutorial Handleiding Markdown Markdown Reference Naslag Markdown Visual Studio Code Fijne teksteditor die ook goed integreert met Github Desktop PowerToys Geeft preview van Markdown rechtstreeks in Windows Explorer (en nog heeel veel andere tooltjes) Tables Generator Helpt met het maken van tabellen in MarkDown Markdown Table VSCode plugin voor het editen van Markdown tabellen. Prettier Een code formatter die automatisch zorgt dat je markdown aan de regels voldoet. markdownlint Een style checker form markdown bestanden. Geeft meldingen voor verkeerde markdown Live Server VSCode plugin. Klik rechtsonder op \"Go Live\" en je ReSpec doc wordt in live browser geopend.","title":"Tools voor Markdown"},{"location":"Markdown/#regels-voor-markdown","text":"Styling regels vastleggen voor Markdown zorgt ervoor dat wijzigingen in de markdown ook altijd inhoudelijke wijzigingen zijn. Suggesties hiervoor Regellengte vastleggen. Hoeveel springen we in? Gebruiken unix end-of-line of windows Deze afspraken kunnen we ook vastleggen. Zie hieronder twee voorbeelden. Het lijkt erop dat de veschillende tools op verschillende manier formatteren. Niet alles gaat goed samen. Voorbeeld van '.prettierrc' gebruikt in dit project: { \"printWidth\": 80, \"tabWidth\": 2, \"useTabs\": false, \"singleQuote\": true, \"endOfLine\": \"lf\", \"proseWrap\": \"always\" } Voorbeeld van .markdownlinkt.json : { \"default\": true, \"MD003\": { \"style\": \"atx\" }, \"MD007\": { \"indent\": 4 }, \"MD013\": { \"line_length\": 80, \"code_blocks\": false, \"heading_line_length\": 200, \"tables\": false}, \"no-hard-tabs\": false }","title":"Regels voor Markdown"},{"location":"ReSpec-code-toepassen/","text":"ReSpec - richtlijn code in tekst Veel documenten die we bij Geonovum publiceren zijn datatspecificaties. In de tekst gebruik je daarom regelmatig stukken code. Het kan gaan om bepaalde termen of gegevens, waarover je iets in de lopende tekst wilt zeggen ( inline code ), of over langere stukken code ( code block ). Deze handleiding is specifiek bedoeld voor de toepassing van code in documentantatie over informatiemodellen. Voor andere type code staat het je vrij hoe je dit toepast. Inline code Wanneer je in een lopende tekst een term of gegeven wilt markeren als code, pas je inline code toe. Door een term of gegeven als code te markeren, maak je duidelijk dat het woord een specifieke technische betekenis heeft. Inline code pas je toe door tekst tussen backticks ( ` ) te plaatsen. De standaardopmaak voor inline code is sober: ReSpec zet het lettertype enkel om in een monospace font . Voor een duidelijkere opmaak van inline code , is daarom een css-bestand beschikbaar . De schrijfwijze van metaklassenamen, modelelementnamen of gegevens volgt de naamgevingsconventies van het MIM . Wees hierop alert als je inline code toepast in handgeschreven teksten. Metaklassenaam Pas deze notatie toe als je een modelelement (in UML: stereotype) uit een metamodel opneemt in de lopende tekst. Geonovum past het metamodel informatiemodellering (MIM) toe, maar de onderstaande richtlijn kan ook toegepast worden op modelelementen uit een ander metamodel. Enkele voorbeelden van modelelementen uit het MIM zijn: \u00abObjecttype\u00bb \u00abAttribuutsoort\u00bb \u00abRelatiesoort\u00bb Plaats voor deze notatiewijze naam van de metaklasse tussen twee dubbele guillemets \u00ab , \u00bb . Je vindt ze met de volgende toetsencombinaties: \u00ab = \"alt\" + \"[\" \u00bb = \"alt\" + \"]\" In het markdown-bestand neem je een metaklassenaam als volgt op: `\u00abmetaklassenaam\u00bb` . Modelelementnaam Pas deze notatie toe als je de naam van een modelelement van een informatiemodel opneemt in de lopende tekst. Het gaat dan bijvoorbeeld om de naam van een \u00abObjecttype\u00bb of \u00abAttribuutsoort\u00bb in een specifiek domeinmodel, zoals bijvoorbeeld: Pand ( \u00abObjecttype\u00bb ) Persoon ( \u00abObjecttype\u00bb ) naam ( \u00abAttribuutsoort\u00bb ) geboortedatum ( \u00abAttribuutsoort\u00bb ) geometrie ( \u00abAttribuutsoort\u00bb ) VlakOfMultivlak ( \u00abKeuze\u00bb ) In het markdown-bestand neem je een metaklassenaam als volgt op: `modelelementnaam` . Gegeven Pas deze notitie toe als je een feitelijk of fictief gegeven opneemt in de lopende tekst. Het gaat om concrete waarden zoals die in een registratie (kunnen) voorkomen, zoals: \"Jan\" \"01-01-1970\" \"234.5\" \"[125.6, 10.1]\" Specifiek in de context van het MIM, gaat het om waarden die ingevuld (kunnen) worden bij de volgende modelelementen: \u00abAttribuutsoort\u00bb \u00abGegevensgroeptype\u00bb \u00abRelatiesoort\u00bb \u00abRelatieklasse\u00bb \u00abData-element\u00bb \u00abReferentie-element\u00bb \u00abEnumeratie-waarde\u00bb In het markdown-bestand neem je een metaklassenaam als volgt op: `\"gegeven\"` . Voorbeeld: gecombineerde inlinecodetypen Stel je wilt in een tekst de volgende zin opnemen: Het model bevat een objecttype persoon met een attribuutsoort naam met het gegeven: Jan \u00e9n een attribuutsoort geboortedatum met het gegeven: \"01-01-1970\". Dan ziet die zin er, na toepassing van bovenstaande richtlijnen er als volgt uit: Het model bevat een \u00abObjecttype\u00bb Persoon met een \u00abAttribuutsoort\u00bb naam met het gegeven: \"Jan\" \u00e9n een \u00abAttribuutsoort\u00bb geboortedatum met het gegeven: \"01-01-1970\" . Uitgeplitst naar inlinecodetype, levert dat het volgende overzicht op: Metaklassenaam \u00abObjecttype\u00bb \u00abAttribuutsoort\u00bb Modelelementnaam Persoon naam geboortedatum Gegeven \"Jan\" \"01-01-1970\" Code block Als je een stuk code hebt dat uit meerdere regels bestaat, kun je dit in een code block plaatsen. Hiermee scheidt je de code van de lopende tekst in een apart tekstblok. In het markdown-bestand neem je een stuk code dat uit meerdere regels bestaat als volgt op. Plaats de code tussen drie backticks ( ``` ). Geef optioneel direct achter de eerste drie backticks de (programmeer-)taal op voor syntax highlighting , zoals in het volgende voorbeeld. input ```json { \"type\": \"Feature\", \"geometry\": { \"type\": \"Point\", \"coordinates\": [125.6, 10.1] }, \"properties\": { \"name\": \"Dinagat Islands\" } } ``` rendered output { \"type\": \"Feature\", \"geometry\": { \"type\": \"Point\", \"coordinates\": [125.6, 10.1] }, \"properties\": { \"name\": \"Dinagat Islands\" } }","title":"Code toepassen"},{"location":"ReSpec-code-toepassen/#respec-richtlijn-code-in-tekst","text":"Veel documenten die we bij Geonovum publiceren zijn datatspecificaties. In de tekst gebruik je daarom regelmatig stukken code. Het kan gaan om bepaalde termen of gegevens, waarover je iets in de lopende tekst wilt zeggen ( inline code ), of over langere stukken code ( code block ). Deze handleiding is specifiek bedoeld voor de toepassing van code in documentantatie over informatiemodellen. Voor andere type code staat het je vrij hoe je dit toepast.","title":"ReSpec - richtlijn code in tekst"},{"location":"ReSpec-code-toepassen/#inline-code","text":"Wanneer je in een lopende tekst een term of gegeven wilt markeren als code, pas je inline code toe. Door een term of gegeven als code te markeren, maak je duidelijk dat het woord een specifieke technische betekenis heeft. Inline code pas je toe door tekst tussen backticks ( ` ) te plaatsen. De standaardopmaak voor inline code is sober: ReSpec zet het lettertype enkel om in een monospace font . Voor een duidelijkere opmaak van inline code , is daarom een css-bestand beschikbaar . De schrijfwijze van metaklassenamen, modelelementnamen of gegevens volgt de naamgevingsconventies van het MIM . Wees hierop alert als je inline code toepast in handgeschreven teksten.","title":"Inline code"},{"location":"ReSpec-code-toepassen/#metaklassenaam","text":"Pas deze notatie toe als je een modelelement (in UML: stereotype) uit een metamodel opneemt in de lopende tekst. Geonovum past het metamodel informatiemodellering (MIM) toe, maar de onderstaande richtlijn kan ook toegepast worden op modelelementen uit een ander metamodel. Enkele voorbeelden van modelelementen uit het MIM zijn: \u00abObjecttype\u00bb \u00abAttribuutsoort\u00bb \u00abRelatiesoort\u00bb Plaats voor deze notatiewijze naam van de metaklasse tussen twee dubbele guillemets \u00ab , \u00bb . Je vindt ze met de volgende toetsencombinaties: \u00ab = \"alt\" + \"[\" \u00bb = \"alt\" + \"]\" In het markdown-bestand neem je een metaklassenaam als volgt op: `\u00abmetaklassenaam\u00bb` .","title":"Metaklassenaam"},{"location":"ReSpec-code-toepassen/#modelelementnaam","text":"Pas deze notatie toe als je de naam van een modelelement van een informatiemodel opneemt in de lopende tekst. Het gaat dan bijvoorbeeld om de naam van een \u00abObjecttype\u00bb of \u00abAttribuutsoort\u00bb in een specifiek domeinmodel, zoals bijvoorbeeld: Pand ( \u00abObjecttype\u00bb ) Persoon ( \u00abObjecttype\u00bb ) naam ( \u00abAttribuutsoort\u00bb ) geboortedatum ( \u00abAttribuutsoort\u00bb ) geometrie ( \u00abAttribuutsoort\u00bb ) VlakOfMultivlak ( \u00abKeuze\u00bb ) In het markdown-bestand neem je een metaklassenaam als volgt op: `modelelementnaam` .","title":"Modelelementnaam"},{"location":"ReSpec-code-toepassen/#gegeven","text":"Pas deze notitie toe als je een feitelijk of fictief gegeven opneemt in de lopende tekst. Het gaat om concrete waarden zoals die in een registratie (kunnen) voorkomen, zoals: \"Jan\" \"01-01-1970\" \"234.5\" \"[125.6, 10.1]\" Specifiek in de context van het MIM, gaat het om waarden die ingevuld (kunnen) worden bij de volgende modelelementen: \u00abAttribuutsoort\u00bb \u00abGegevensgroeptype\u00bb \u00abRelatiesoort\u00bb \u00abRelatieklasse\u00bb \u00abData-element\u00bb \u00abReferentie-element\u00bb \u00abEnumeratie-waarde\u00bb In het markdown-bestand neem je een metaklassenaam als volgt op: `\"gegeven\"` .","title":"Gegeven"},{"location":"ReSpec-code-toepassen/#voorbeeld-gecombineerde-inlinecodetypen","text":"Stel je wilt in een tekst de volgende zin opnemen: Het model bevat een objecttype persoon met een attribuutsoort naam met het gegeven: Jan \u00e9n een attribuutsoort geboortedatum met het gegeven: \"01-01-1970\". Dan ziet die zin er, na toepassing van bovenstaande richtlijnen er als volgt uit: Het model bevat een \u00abObjecttype\u00bb Persoon met een \u00abAttribuutsoort\u00bb naam met het gegeven: \"Jan\" \u00e9n een \u00abAttribuutsoort\u00bb geboortedatum met het gegeven: \"01-01-1970\" . Uitgeplitst naar inlinecodetype, levert dat het volgende overzicht op:","title":"Voorbeeld: gecombineerde inlinecodetypen"},{"location":"ReSpec-code-toepassen/#metaklassenaam_1","text":"\u00abObjecttype\u00bb \u00abAttribuutsoort\u00bb","title":"Metaklassenaam"},{"location":"ReSpec-code-toepassen/#modelelementnaam_1","text":"Persoon naam geboortedatum","title":"Modelelementnaam"},{"location":"ReSpec-code-toepassen/#gegeven_1","text":"\"Jan\" \"01-01-1970\"","title":"Gegeven"},{"location":"ReSpec-code-toepassen/#code-block","text":"Als je een stuk code hebt dat uit meerdere regels bestaat, kun je dit in een code block plaatsen. Hiermee scheidt je de code van de lopende tekst in een apart tekstblok. In het markdown-bestand neem je een stuk code dat uit meerdere regels bestaat als volgt op. Plaats de code tussen drie backticks ( ``` ). Geef optioneel direct achter de eerste drie backticks de (programmeer-)taal op voor syntax highlighting , zoals in het volgende voorbeeld.","title":"Code block"},{"location":"ReSpec-code-toepassen/#input","text":"```json { \"type\": \"Feature\", \"geometry\": { \"type\": \"Point\", \"coordinates\": [125.6, 10.1] }, \"properties\": { \"name\": \"Dinagat Islands\" } } ```","title":"input"},{"location":"ReSpec-code-toepassen/#rendered-output","text":"{ \"type\": \"Feature\", \"geometry\": { \"type\": \"Point\", \"coordinates\": [125.6, 10.1] }, \"properties\": { \"name\": \"Dinagat Islands\" } }","title":"rendered output"},{"location":"ReSpec-definitielijst-maken/","text":"Definities in ReSpec Note In dit stuk afbeeldingen opnemen waarin je het resultaat in ReSpec kunt zien. Daarvoor graag NL-ReSpec-GN-template aanvullen. Intro Een belangrijk onderdeel van een dataspecificatie is de definitie van begrippen. Steeds vaker leggen we bij Geonovum begrippen vast in een begrippenkader . Idealiter zouden we voor de definitie van een begrip altijd daarnaar willen verwijzen. Op dit moment is dat om meerdere redenen nog niet mogelijk. Op deze plek leggen we uit hoe we nu een definitie opnemen. Definitie van een begrip opnemen in specificatie De meeste begrippen in een dataspecificatie worden gedefinieerd in het hoofdstuk Gegevensdefinitie . Imvertor genereert dit hoofdstuk automatisch op basis van het model in EA. Deze beschrijving richt zich alleen op de hoofdstukken die met de hand geschreven worden. De beschrijving in de handleiding van ReSpec is heel summier. Hierdoor pas je het snel en eenvoudig toe, maar het leidt niet vanzelfsprekend tot \u00e9\u00e9nduidig gebruik. Er zijn namelijk verschillende manieren waarop je als gebruiker een begrip met definitie kunt opnemen: inline losse regel lijst Binnen Geonovum willen we dit meer kaderen. Daarnaast hebben we aanvullende eisen ten aanzien van de weergave. Warning Blokweergave en 'normale' weergave niet door elkaar gebruiken. Als je het script gebruikt gaat dat niet goed. Dat kan aangepast worden, maar het is bovenal niet wenselijk om verschillende stijlen in \u00e9\u00e9n document toe te passen. Weergave ReSpec toont een gedefinieerd begrip door de term schuin en dikgedrukt weer te geven. Deze styling is niet voor elk doeleinde geschikt. Voor inline- en lijstweergave werkt dit prima, maar als losse regel weer niet. Daar mist styling. Toch is dat soms wenselijk, zoals in het MIM-document. Hiervoor is een aanvulling gemaakt op ReSpec, die je kunt gebruikern door [ nog invullen ]. Volgens ReSpec boekeen samengebonden of genaaid aantal bedrukte bladen. Resultaat Gebruik van definitie Wil je naar een gedefinineerd begrip verwijzen gaat dat zo: boek`` of [=boek-]` Aanvullende styling wrap een definitie in een aside met attribute class=\"definition\" Resultaat [ afbeelding opnemen ] Warning Een begrip mag maar \u00e9\u00e9n keer voorkomen; je kunt een term niet op twee verschillende manieren defini\u00ebren. Warning Hier graag zoveel mogelijk \u00e9\u00e9n lijn in trekken. Graag voorbeelden van hoe dat in huidige documenten zit. Verwijzing maken naar gedefinieerd begrip Als je op andere plekken in je document wilt verwijzen naar een gedefinieerd begrip, dan kan dat eenvoudig door het begrip tussen te zetten, bijv: boek . Houd als richtlijn dat je alleen de eerste keer dat een term in een alinea voorkomt een verwijzing maakt. Dit voorkomt een overdaad aan verwijzingen in de tekst. Een verwijzing naar een term werkt in alle gevallen hetzelfde.","title":"Definitielijst maken"},{"location":"ReSpec-definitielijst-maken/#definities-in-respec","text":"Note In dit stuk afbeeldingen opnemen waarin je het resultaat in ReSpec kunt zien. Daarvoor graag NL-ReSpec-GN-template aanvullen.","title":"Definities in ReSpec"},{"location":"ReSpec-definitielijst-maken/#intro","text":"Een belangrijk onderdeel van een dataspecificatie is de definitie van begrippen. Steeds vaker leggen we bij Geonovum begrippen vast in een begrippenkader . Idealiter zouden we voor de definitie van een begrip altijd daarnaar willen verwijzen. Op dit moment is dat om meerdere redenen nog niet mogelijk. Op deze plek leggen we uit hoe we nu een definitie opnemen.","title":"Intro"},{"location":"ReSpec-definitielijst-maken/#definitie-van-een-begrip-opnemen-in-specificatie","text":"De meeste begrippen in een dataspecificatie worden gedefinieerd in het hoofdstuk Gegevensdefinitie . Imvertor genereert dit hoofdstuk automatisch op basis van het model in EA. Deze beschrijving richt zich alleen op de hoofdstukken die met de hand geschreven worden. De beschrijving in de handleiding van ReSpec is heel summier. Hierdoor pas je het snel en eenvoudig toe, maar het leidt niet vanzelfsprekend tot \u00e9\u00e9nduidig gebruik. Er zijn namelijk verschillende manieren waarop je als gebruiker een begrip met definitie kunt opnemen: inline losse regel lijst Binnen Geonovum willen we dit meer kaderen. Daarnaast hebben we aanvullende eisen ten aanzien van de weergave. Warning Blokweergave en 'normale' weergave niet door elkaar gebruiken. Als je het script gebruikt gaat dat niet goed. Dat kan aangepast worden, maar het is bovenal niet wenselijk om verschillende stijlen in \u00e9\u00e9n document toe te passen.","title":"Definitie van een begrip opnemen in specificatie"},{"location":"ReSpec-definitielijst-maken/#weergave","text":"ReSpec toont een gedefinieerd begrip door de term schuin en dikgedrukt weer te geven. Deze styling is niet voor elk doeleinde geschikt. Voor inline- en lijstweergave werkt dit prima, maar als losse regel weer niet. Daar mist styling. Toch is dat soms wenselijk, zoals in het MIM-document. Hiervoor is een aanvulling gemaakt op ReSpec, die je kunt gebruikern door [ nog invullen ].","title":"Weergave"},{"location":"ReSpec-definitielijst-maken/#volgens-respec","text":"boekeen samengebonden of genaaid aantal bedrukte bladen.","title":"Volgens ReSpec"},{"location":"ReSpec-definitielijst-maken/#resultaat","text":"","title":"Resultaat"},{"location":"ReSpec-definitielijst-maken/#gebruik-van-definitie","text":"Wil je naar een gedefinineerd begrip verwijzen gaat dat zo: boek`` of [=boek-]`","title":"Gebruik van definitie"},{"location":"ReSpec-definitielijst-maken/#aanvullende-styling","text":"wrap een definitie in een aside met attribute class=\"definition\" ","title":"Aanvullende styling"},{"location":"ReSpec-definitielijst-maken/#resultaat_1","text":"[ afbeelding opnemen ] Warning Een begrip mag maar \u00e9\u00e9n keer voorkomen; je kunt een term niet op twee verschillende manieren defini\u00ebren. Warning Hier graag zoveel mogelijk \u00e9\u00e9n lijn in trekken. Graag voorbeelden van hoe dat in huidige documenten zit.","title":"Resultaat"},{"location":"ReSpec-definitielijst-maken/#verwijzing-maken-naar-gedefinieerd-begrip","text":"Als je op andere plekken in je document wilt verwijzen naar een gedefinieerd begrip, dan kan dat eenvoudig door het begrip tussen te zetten, bijv: boek . Houd als richtlijn dat je alleen de eerste keer dat een term in een alinea voorkomt een verwijzing maakt. Dit voorkomt een overdaad aan verwijzingen in de tekst. Een verwijzing naar een term werkt in alle gevallen hetzelfde.","title":"Verwijzing maken naar gedefinieerd begrip"},{"location":"ReSpec/","text":"Inleiding ReSpec Binnen Geonovum gebruiken we ReSpec voor het maken van standaarden. ReSpec maakt gebruik van input bestanden om HTML te genereren. Deze inputbestanden (de content) wordt gemaakt in het Markdown formaat. Deze Markdown bestanden kunnen worden aangemaakt met text editor. GitHub wordt gebruikt als de 'repository' waarin alle bestanden die bij een standaard horen, beheerd worden. Deze handleiding beschrijft hoe je een GitHub Account maakt, hoe je GitHub Desktop Client installeert en gebruikt, hoe je een Respec mappenstructuur opbouwt, welke bestanden er nodig zijn voor een standaard, en hoe je de verschillende versies van een standaard genereert. Ook wordt uitgelegd hoe je de Markdown plugin in Microsoft Word installeert en gebruikt. ReSpec is een tool van W3C die het schrijven van specifications makkelijker maakt. ReSpec zorgt voor een uniforme styling in het document, onderhoudt referenties en verwijzingen naar andere documentatie, verzorgt de inhoudsopgave, zorgt voor links naar vorige en meest recente versies, en heeft een integratie met Github issues. Geonovum gebruikt een fork van ReSpec die door Logius beheerd wordt. Dit document bevat een globale instructie over hoe snel aan de start te gaan. Meer documentatie is op andere plaatsen te vinden: Er is een gedetailleerde (Engelstalige) gebruikershandleiding beschikbaar. Er is ook een ontwikkelaarshandleiding te vinden. De Geonovum wiki over ReSpec is een fork van de w3c ReSpec met aanpassingen voor Geonovum. Deze is achterhaald omdat we nu van de Logius Respec gebruik maken. (TODO aanpassen) Een nieuwe document maken ReSpec documenten worden beheerd in een GitHub repository. Als je een nieuw ReSpec document wilt maken gebruik dan de Geonovum ReSpec template als startpunt en druk op de 'Use this template' knop om een nieuw repository aan te maken. Zoek in dit repository op de tekst 'TODO' om de plaatsen te vinden waar aanpassen van de template vereist is. De URL van een publicatie op docs.geonovum.nl ReSpec documenten worden gepubliceerd op docs.geostandaarden.nl . Iedere gepubliceerde versie van een document heeft een eigen URL. Voor de laatst gepubliceerde versie is een aparte URL. De URL van iedere publicatie wordt als volgt bepaald: https://docs.geostandaarden.nl/[pubdomain]/[specStatus]-[spectype]-[shortName]-[publishDate]/ De laatst gepubliceerde versie is OOK te vinden op: https://docs.geostandaarden.nl/[pubdomain]/[shortName]/ De namen van de variabelen staan verderop uitgelegd. De mapindeling van een ReSpec repository Dit levert een nieuw repository op met de onderstaande mappenstructuur. hoofdmap map file omschrijving Hoofdmap naam van de hoofdmap media Map met mediabestanden Style.css File met vaste naam, bevat de styling van het document *.png Afbeeldingsbestanden index.html File met de vaste naam Index.html js config.js File met de vaste naam config.js *md Tekstbestanden (Markdown) die de content bevatten Hieronder staat een voorbeeld van zo\u2019n mappenstructuur. Het bestand 'index.html' Het bestand index.html zorgt ervoor dat het ReSpec document automatisch wordt geladen in de browser. Bij het laden wordt ook automatisch de geonovum-ReSpec-code geladen en uitgevoerd. Deze code zorgt ervoor dat het document zijn standaard layout krijgt. Het bestand 'index.html' heeft een vaste indeling. Hieronder de structuur uit de template: TODO: Vul hier de titel in
In de HTML-header wordt de js-ReSpec bibliotheek geladen. Het enige dat in de header mag worden aangepast is de title (tussen \\ en \\. Andere aanpassingen die nodig zijn in de header mogen alleen worden gedaan in overleg met de ReSpec beheerders. Een overzicht van de ReSpec beheerders staat in Hoofdstuk 6 In de HTML-Body geldt vrijheid in gebondenheid De
en/of
regels mogen worden gekopieerd en toegevoegd. Wel belangrijk om de structuur over te nemen, dus als volgt:
\\Inleiding\\\\ Een
is een sectie plus bijbehorend document, dat niet in de inhoudsopgave terechtkomt. Deze gebruik je bijvoorbeeld voor een Toelichting, een Colofon of een Voorwoord. Een
komt w\u00e9l in de inhoudsopgave terecht. Deze heeft daarom behalve de data-include van het document, ook (verplicht!) een

tag. De tekst tussen

en

komt in de inhoudsopgave te staan. Het bestand 'config.js' In config.js wordt een stuurvariabele voor ReSpec gevuld. De waarden in deze variabele worden door ReSpec gebruikt om de layout te bepalen, en bevatten een aantal document-eigenschappen. SpecStatus De SpecStatus in de configuratie geeft de keuze uit 4 waarden, deze waarden zijn vastgesteld, en mogen niet zomaar uitgebreid of aangepast worden. Elke status hoort bij een formele fase van een ReSpec document. Zie ook de Geonovum ReSpec wiki . GN-WV, Werkversie : Dit is de versie van het document waaraan wordt gewerkt. Deze versie is continu 'under-construction'. GN-CV, Consultatieversie : Dit is een 'snapshot' van de versie die 'in consultatie' wordt gezet. Aan deze versie wordt niks meer gedaan totdat de consultatie is afgelopen. Daarna worden alle op en aanmerkingen uit de consultatieronde verwerkt. GN-VV, Vaststellingsversie : Dit is een 'snapshot' van de versie na het verwerken van de op en aanmerkingen uit de consultatieronde is ontstaan. Deze versie wordt aangeboden aan de programma-raad van Geonovum, om te wordern 'vastgesteld'. GN-DEF, Definitieve versie : Dit is de definitieve versie van het document, zoals vastgesteld door de programma-raad. Van deze versie wordt opnieuw een 'snapshot' gemaakt in ReSpec. Het resultaat van die snapshot wordt op http://docs.geonovum.nl neergezet. SpecType Het SpecType in de configuratie is een vaste lijst met waarden, deze waarden zijn vastgesteld, en mogen niet zonder overleg met de Technische ReSpec beheerders uitgebreid of aangepast worden. Onderstaande beschrijvingen komen uit het generiek beheerplan [5] Zie: https://www.geonovum.nl/uploads/documents/Geonovum%20GENERIEK%20Beheerplan%20geo-standaarden%20v1.1.pdf . NO Norm: Een norm is bij een officieel standaardisatie instituut ondergebracht en bevat bindende afspraken. Naast het gebruik van normen is NEN 3610 de enige norm waar Geonovum een inhoudelijke verantwoordelijkheid heeft. Het formele beheer en beslissingen worden genomen in de NEN normcommissie 351 240 waar Geonovum de voorzitter van is. ST Standaard: Een document met (bindende) afspraken. IM Informatiemodel: Een standaard waarbij door de term informatiemodel te hanteren wordt aangegeven dat het een abstractie (het model) vormt van de werkelijkheid zoals beschreven binnen een bepaalde sector/domein. Informatiemodellen zijn een semantische invulling van normen voor sectoren zoals ruimtelijke ordening, kabels en leidingen, water, etc.. PR Praktijkrichtlijn: Praktijkrichtlijnen zijn producten die informatie geven, vaak met een technisch karakter, die nodig is voor het toepassen van standaarden. Een praktijkrichtlijn hoort altijd bij een standaard/norm. HR Handreiking: Op zichzelf staande documentatie dat als doel heeft een hulpmiddel te zijn, niet verplichtend maar ondersteunend. WA Werkafspraak: Legt uit hoe wetgeving moet worden toegepast bij onduidelijkheden, discrepanties of fouten in de standaarden. BD Beheerdocumentatie: Documentatie met betrekking tot het beheerproces van de standaard. Deze documentatie betreft niet een standaard of onderdeel daarvan, zoals een handreiking of werkafspraak. AL Algemeen: Op zichzelf staande algemene documentatie over standaarden. De documentatie betreft niet een specifieke standaard of onderdeel daarvan, het is ook geen beheerdocumentatie van een specifieke standaard. pubDomain pubDomain bepaalt bij publicatie een deel van de URL waarop het document wordt gepubliceerd. Het zorgt voor een groepering van de documenten op docs.geostandaarden.nl Omdat je de URL van gepubliceerde documenten niet wilt veranderen is moet je hier goed over nadenken en alleen in overleg nieuwe toevoegen. De actuele lijst van pubDomains staat in de tabel hieronder. De herkomst van deze lijst is als volgt: Lijst op github : respec-utils . docs.geostandaarden.nl. register.geostandaarden.nl. Naamgevinsregels voor pubDomain: Lowercase Geen spaties Pubdomain Omschrijving Herkomst status GitHub Team Beslissing 3dbv 3D basisvoorziening docs.geostandaarden.nl inactief (gemigreerd) mag niet meer gebruikt worden api Kennisplatform APIs respec utils API team OK basisgeometrie Informatiemodel Basisgeometrie register.geostandaarden.nl zit op docs bij nen3610 niet gebruiken eigenlijk xsd redirecten bgt Basisregistratie grootschalige topografie docs.geostandaarden.nl BGT team Arnoud vragen brt Informatiemodellen Basisregistratie Topografie register.geostandaarden.nl BRT team OK crs Co\u00f6rdinaatreferentiesystemen docs.geostandaarden.nl CRS team OK cvgg Informatiemodel Geluid docs.geostandaarden.nl duplicaat van img OK disgeo DisGeo respec utils OK dsgo Digitaal Stelsel Gebouwde Omgeving docs.geostandaarden.nl OK (rare uri) dso Digitaal Stelsel Omgevingswet respec utils duplicaten: tpod imow ow DSO team OK eu docs.geostandaarden.nl EU team OK (rare uri en werkversie weg) g4w docs.geostandaarden.nl groeperen? gbd docs.geostandaarden.nl groeperen? geobag docs.geostandaarden.nl OK gsw docs.geostandaarden.nl groeperen? imaer Informatiemodel AERIUS register.geostandaarden.nl OK imev Informatiemodel Externe Veiligheid docs.geostandaarden.nl IMEV team OK img Informatiemodel Geluid respec utils duplicaat: cvgg IMG team redirecten naar cvgg imgeo Informatiemodel Grootschalige Geografie docs.geostandaarden.nl Arnoud vragen imka Informatiemodel Klimaatadaptatie docs.geostandaarden.nl OK imkad Informatiemodel Kadaster register.geostandaarden.nl IMKA team OK imkl Informatiemodel Kabels en Leidingen register.geostandaarden.nl duplicaat: kl IMKL team Zou kl moeten worden imle docs.geostandaarden.nl OK (niet netjes gepubliceerd) imro Informatiemodel Ruimtelijke Ordening register.geostandaarden.nl duplicaat: ro liefst naar RO imow Informatiemodel Omgevingswet register.geostandaarden.nl duplicaten: tpod ow dso liefst weg kl IMKL respec utils duplicaat: imkl OK md Metadata respec utils duplicaat: metadata OK mim Metamodel Informatie Modellering (MIM respec utils OK metadata Nederlandse metadata profielen voor datasets en services register.geostandaarden.nl duplicaat: md verplaatsen naar md?? nen3610 NEN3610-Linkeddata respec utils OK ngii docs.geostandaarden.nl OK oov docs.geostandaarden.nl OK ow Standaarden omgevingswet respec utils duplicaten: tpod imow dso OK ro RO Standaarden respec utils duplicaat: imro OK rwgs Raamwerk van Geo-standaarden respec utils groeperen? serv Services respec utils groeperen? tpod Toepassingsprofiel omgevingsdocumenten respec utils duplicaten: ow imow dso OK vg Informatiemodel Vastgoedgebruik respec utils OK visu Visualisatie respec utils groeperen? vtm docs.geostandaarden.nl is eigenlijk metadata verhuizen naar MD wp Whitepaper Geostandaarden respec utils ook een raar pubdomain verhuizen naar ngii LocalBiblio In de localBiblio variabele worden Referenties naar andere documenten gezet. Voordat je hier citaten toevoegt, loont het de moeite om eerst in de https://www.specref.org/ van ReSpec zelf te kijken. Pas als je een verwijzing niet vindt in SpecRef voeg je hem hier toe! Verwijzen naar een bibliografieelement gebeurt als volgt [[ID]] . De dubbele haakjes zorgen ervoor dat er blokhaken om de verwijzing staan in de tekst. Je kunt ook aangeven dat een verwijzing normatief is door er een uitroepteken voor te zetten [[!ID]] Voorbeeld config.js let respecConfig = { useLogo: true, useLabel: true, // title is verplicht! Neem hier de titel van het document op ---------------------- title: \"[Neem titel op in config.js]\", //-- specStatus is verplicht! (activeer 1 van de volgende) -------------------------- specStatus: \"wv\", // Werkversie //-- specType is verplicht bij alle andere dan BASIS --------------------------------- specType: \"HR\", // HandReiking //-- pubDomain is verplicht! (komt in de URL) ------------------------------------- pubDomain: \"TODO\", //-- license: voor de geldende gebruiksvoorwaarden. Default is cc-by. //licence: \"cc-by-nd\", // bronvermelding, geen afgeleide werken (default) //licence: \"cc0\", // Public Domain Dedication licence: \"cc-by\", // Attribution, met bronvermelding //-- shortName is verplicht! (komt in de URL: kies logische afkorting)-------------- shortName: \"NL-ReSpec-GN-template\", //-- publishDate is verplicht ------------------------------------------------------- //-- NB: in de werkversie uitzetten, want dan pakt Respec de pushdate --------------- //publishDate: \"2023-03-28\", //eventueel is het mogelijk een versienummer mee te geven, maar bij Geonovum werken we gewoonlijk alleen met datum als onderdeel van de permanente URI. //publishVersion: \"0.0.2\", //previousVersion: \"0.0.1\", //-- Voor dit blok geldt: alleen als er eerdere versies zijn en altijd beiden aan/uit! //previousPublishDate: \"2014-05-01\", //previousMaturity: \"CV\", //-- de namen van de Editor(s) / Redacteur(en)--------------------------------------- //-- vul in: per Editor: name:, company:, companyURL: ------------------------------- editors: [ { name: \"voornaam achternaam\", company: \"Geonovum\", companyURL: \"https://www.geonovum.nl\", } ], //-- de namen van de auteur(s) ------------------------------------------------------ //-- vul in: per auteur: name:, company:, companyURL: ------------------------------- authors: [ { name: \"voornaam achternaam\", company: \"Geonovum\", companyURL: \"https://www.geonovum.nl\", } ], //neem hier de URL van de github repository op waar het respec document in staat github: \"https://github.com/Geonovum/NL-ReSpec-GN-template\", // Create PDF and link to file in header (optional): alternateFormats: [ { label: \"pdf\", uri: \"template.pdf\", }, ], }; De file config.js is een stukje javascript (JSON) code, het bevat alle mogelijke waarden voor de verschillende versies die wij hanteren bij Geonovum. In de file zelf staat aangegeven welke waarden verplicht zijn, en uit welke waarden te kiezen is. In bovenstaand voorbeeld gaat het om een 'Werkversie van een standaard'. Content: bestanden '*.md' De 'echte' content wordt gemaakt in het formaat 'Markdown'. Er is een aantal editors beschikbaar die dat formaat ondersteunen. Zie hiervoor Hoofdstuk 3 . Het is handig om voor elk hoofdstuk een aparte Markdown file te maken, want dan blijven de bestanden beperkt in grootte, en zijn er gemakkelijker werkafspraken te maken over wie wanneer in welke file aan het editen is. Content: Afbeeldingen '*.png' Afbeeldingen worden als '.png' of '.svg' bestand neergezet in de map 'media'. In je Markdown document neem je gewoon een plaatje op zoals je in Word gewend bent. Writage en ReSpec zorgen ervoor dat de plaatjes worden getoond. ReSpec Frontend De knop 'ReSpec' De knop 'ReSpec' rechtsboven in de frontend van ReSpec, bevat een aantal handige functies. Als je klikt op de knop, verschijnt het vervolgscherm met een viertal functies. Elk van de functies wordt hieronder uitgelegd. Bewaar snapshot Doorzoek SpecRef De gevonden zoekresultaten kunnen worden overgenomen in het ReSpec document. Lijst van definities Zie: definitielijst maken HTML ingebed in ReSpec Omdat wij ervoor hebben gekozen om documenten te schrijven in Markdown, gebruiken wij niet alle ReSpec functionaliteit. In dit hoofdstuk worden de speciale ReSpec functies beschreven die als HTML code in het Markdown document kunnen wordnen opgenomen, of die in de door respec gegenereerde HTML file kunnen worden neergezet. Het gebruik van deze functionaliteit vereist dus wel HTML kennis. HTML voor Afbeeldingen Een lijst van afbeeldingen kan door ReSpec automatisch worden gegenereerd, maar dan moet er wel aan een aantal ReSpec specifieke voorwaarden worden voldaan: In Index.html komt ergens te staan:
\"\"
The water flows from bucket A to bucket B.
In de documenten worden de afbeeldingen op de volgende manier neergezet:
\"\"
The water flows from bucket A to bucket B.
NB:
inclusief uniek ID en een ge-embedde
zijn verplicht! Eventuele referenties naar plaatjes doe je op e volgende manier:

The flowchart shown in is quite impressive.

Referentie naar GitHub issues ReSpec ondersteunt ook een koppeling naar issues die zijn gemeld op GitHub. Jek kan referenties opnemen naar individuele issues. Ook is het mogelijk om een lijst met alle issues op te nemen in je document. Om GitHub issues op te nemen moet je in 'config.js' een referentie opnemen naar de GitHub repository. issueBase: \"https://github.com/Geonovum/MIM-Werkomgeving/issues/\" Een referentie naar een issue neem je als volgt op:
Waarbij data-number het issuenummer is. Een lijst met issues kan je toevoegen met de volgende HTML code:
Foutmeldingen en waarschuwingen In dit geval is er een tikfout gemaakt bij de naam van de Markdownfile die ge-include wordt. Het moet natuurlijk H2-Testcases.md zijn. Een voorbeeld van een waarschuwing. Klikken hierop geeft je je de waarschuwing. In het onderstaande voorbeeld meldt ReSpec dat er een

header ontbreekt in het Markdown document. Publiceren in ReSpec In dit hoofdstuk staan checklists die je kan gebruiken als je vanuit GitHub en ReSpec \u201cVersies\u201d gaat aanmaken. Bijvoorbeeld hoe maak je een nieuwe GitHub repository aan, of hoe maak je vanuit een werkversie een consultatieversie aan, Controles voor publicatie Controleer de volgende onderwerpen voor iedere publicatie: Controleer op WCAG regels. Bij het pushen van een ReSpec document naar GitHub wordt automatisch een WCAG rapport geschreven. Dit is te vinden onder 'Actions'. Kies hier de commit die je gedaan hebt en je ziet daar 'Check/WCAG'). Controleer op Broken links. Bij het pushen van een ReSpec document naar GitHub wordt automatisch op broken links gechecked. Dit is te vinden onder 'Actions'. Kies hier de commit die je gedaan hebt en je ziet daar 'Check/Links'). Je kunt oook het HTML controleren: maak een snapshot aan en biedt het aan aan de W3C validator Consultatie versie (CV) maken Edit en controleer config.js - configureer alles goed voor een consultatieversie specStatus : \"GN-CV\" publishDate : moet ingevuld zijn met de datum van publicatie van de consultatieversie. \"jjjj-mm-dd\" , Shortname : moet ingevuld zijn met korte naam voor het document. Dit wordt onderdeel van de URL. Moet uniek zijn binnen pubdomain (afgezien van versies). Als er al eerder een versie gepubliceerd is (stabiele versie, dus afgezien van de werkversie in github), kan Respec bovenin een document de navigatie naar vorige versie goed genereren. Daarvoor moet je ook invullen: Previousmaturity : wat de status toen was. Previousmaturity : wat de status toen was. Maak een snapshot (met de knop \u201cBewaar Snapshot\u201d vanuit Respec) Kies \u201cHTML\u201d en noem dit bestand \u201csnapshot.html\u201d Commit het en push het naar dezelfde folder als waar index.html staat in je Github-repository Consultatieversie maken met behulp van webhook Klik hier voor een beschrijving over hoe je een webhook eenmalig configureert voor een repository. over het toepassen van de webhook. Maak een release tag conform de naamgevingsconventie: \\{specStatus\\}-\\{specType\\}-\\{shortName\\}-\\{publishDate\\} Het script kopieert nu automatisch (NB: dit moet wel eenmalig geconfigureerd zijn als \u2018webhook\u2019 in de github repository!) het snapshot.html en de bijbehorende afbeeldingen naar [docs.geostandaarden.nl] http://docs.geostandaarden.nl ). Na succesvolle publicatie: zet de specStatus in config.js terug op \"GN-WV\" Vul previousMaturity in met \"GN-CV\" Vul previousPublishDate in met de datum van de zojuist gepubliceerde consultatieversie Consultatieverise met behulp van webhook Note : uitwerken Vaststellingsversie (VV) maken Edit en controleer config.js - configureer alles goed voor een vaststellingsversie specStatus: \"GN-VV\" publishDate: moet ingevuld zijn met de datum van publicatie van de consultatieversie. \"jjjj-mm-dd\", Shortname: moet ingevuld zijn met korte naam voor het document. Dit wordt onderdeel van de URL. Moet uniek zijn binnen pubdomain (afgezien van versies). Als er al eerder een versie gepubliceerd is (stabiele versie, dus afgezien van de werkversie in github), kan Respec bovenin een document de navigatie naar vorige versie goed genereren. Daarvoor moet je ook invullen: Previousmaturity: wat de status toen was. Previousmaturity: wat de status toen was. Maak een snapshot (met de knop \u201cBewaar Snapshot\u201d vanuit Respec) Kies \u201cHTML\u201d en noem dit bestand \u201csnapshot.html\u201d Commit het en push het naar dezelfde folder als waar index.html staat in je Github repository Maak een release tag conform de naamgevingsconventie: {specStatus}-{specType}-{shortName}-{publishDate} Het script kopieert nu automatisch (NB: dit moet wel eenmalig geconfigureerd zijn als \u2018webhook\u2019 in de github repository!) het snapshot.html en de bijbehorende afbeeldingen naar http://docs.geonovum.nl Na succesvolle publicatie: zet de specStatus in config.js terug op GN-WV Vul previousMaturity in met GN-CV Vul previousPublishDate in met de datum van de zojuist gepubliceerde consultatieversie Definitieve versie (DEF) maken Edit en controleer config.js - configureer alles goed voor een definitieve versie specStatus: \"GN-DEF\", publishDate: moet ingevuld zijn met de datum van publicatie van de definitieve versie. \"jjjj-mm-dd\", Shortname: moet ingevuld zijn met korte naam voor het document. Dit wordt onderdeel van de URL. Moet uniek zijn binnen pubdomain (afgezien van versies). Als er al eerder een versie gepubliceerd is (stabiele versie, dus afgezien van de werkversie in github), kan Respec bovenin een document de navigatie naar vorige versie goed genereren. Daarvoor moet je ook invullen: Previousmaturity: wat de status toen was. previousPublishDate: vorige publicatiedatum (jjjj-mm-dd) Maak een snapshot (met de knop \u201cBewaar Snapshot\u201d vanuit Respec) Kies \u201cHTML\u201d en noem dit bestand \u201csnapshot.html\u201d Commit het en push het naar dezelfde folder als waar index.html staat in je Github repository Maak een release tag conform de naamgevingsconventie: {specStatus}-{specType}-{shortName}-{publishDate} Het script kopieert nu automatisch (NB: dit moet wel eenmalig geconfigureerd zijn als \u2018webhook\u2019 in de github repository!) het snapshot.html en de bijbehorende afbeeldingen naar http://docs.geostandaarden.nl Hoe dit werkt is beschreven in: https://github.com/Geonovum/technisch-register-2019 Na succesvolle publicatie: zet de specStatus in config.js terug op GN-WV Vul previousMaturity in met GN-DEF Vul previousPublishDate in met de datum van de zojuist gepubliceerde definitieve versie","title":"Manual"},{"location":"ReSpec/#inleiding-respec","text":"Binnen Geonovum gebruiken we ReSpec voor het maken van standaarden. ReSpec maakt gebruik van input bestanden om HTML te genereren. Deze inputbestanden (de content) wordt gemaakt in het Markdown formaat. Deze Markdown bestanden kunnen worden aangemaakt met text editor. GitHub wordt gebruikt als de 'repository' waarin alle bestanden die bij een standaard horen, beheerd worden. Deze handleiding beschrijft hoe je een GitHub Account maakt, hoe je GitHub Desktop Client installeert en gebruikt, hoe je een Respec mappenstructuur opbouwt, welke bestanden er nodig zijn voor een standaard, en hoe je de verschillende versies van een standaard genereert. Ook wordt uitgelegd hoe je de Markdown plugin in Microsoft Word installeert en gebruikt. ReSpec is een tool van W3C die het schrijven van specifications makkelijker maakt. ReSpec zorgt voor een uniforme styling in het document, onderhoudt referenties en verwijzingen naar andere documentatie, verzorgt de inhoudsopgave, zorgt voor links naar vorige en meest recente versies, en heeft een integratie met Github issues. Geonovum gebruikt een fork van ReSpec die door Logius beheerd wordt. Dit document bevat een globale instructie over hoe snel aan de start te gaan. Meer documentatie is op andere plaatsen te vinden: Er is een gedetailleerde (Engelstalige) gebruikershandleiding beschikbaar. Er is ook een ontwikkelaarshandleiding te vinden. De Geonovum wiki over ReSpec is een fork van de w3c ReSpec met aanpassingen voor Geonovum. Deze is achterhaald omdat we nu van de Logius Respec gebruik maken. (TODO aanpassen)","title":"Inleiding ReSpec"},{"location":"ReSpec/#een-nieuwe-document-maken","text":"ReSpec documenten worden beheerd in een GitHub repository. Als je een nieuw ReSpec document wilt maken gebruik dan de Geonovum ReSpec template als startpunt en druk op de 'Use this template' knop om een nieuw repository aan te maken. Zoek in dit repository op de tekst 'TODO' om de plaatsen te vinden waar aanpassen van de template vereist is.","title":"Een nieuwe document maken"},{"location":"ReSpec/#de-url-van-een-publicatie-op-docsgeonovumnl","text":"ReSpec documenten worden gepubliceerd op docs.geostandaarden.nl . Iedere gepubliceerde versie van een document heeft een eigen URL. Voor de laatst gepubliceerde versie is een aparte URL. De URL van iedere publicatie wordt als volgt bepaald: https://docs.geostandaarden.nl/[pubdomain]/[specStatus]-[spectype]-[shortName]-[publishDate]/ De laatst gepubliceerde versie is OOK te vinden op: https://docs.geostandaarden.nl/[pubdomain]/[shortName]/ De namen van de variabelen staan verderop uitgelegd.","title":"De URL van een publicatie op docs.geonovum.nl"},{"location":"ReSpec/#de-mapindeling-van-een-respec-repository","text":"Dit levert een nieuw repository op met de onderstaande mappenstructuur. hoofdmap map file omschrijving Hoofdmap naam van de hoofdmap media Map met mediabestanden Style.css File met vaste naam, bevat de styling van het document *.png Afbeeldingsbestanden index.html File met de vaste naam Index.html js config.js File met de vaste naam config.js *md Tekstbestanden (Markdown) die de content bevatten Hieronder staat een voorbeeld van zo\u2019n mappenstructuur.","title":"De mapindeling van een ReSpec repository"},{"location":"ReSpec/#het-bestand-indexhtml","text":"Het bestand index.html zorgt ervoor dat het ReSpec document automatisch wordt geladen in de browser. Bij het laden wordt ook automatisch de geonovum-ReSpec-code geladen en uitgevoerd. Deze code zorgt ervoor dat het document zijn standaard layout krijgt. Het bestand 'index.html' heeft een vaste indeling. Hieronder de structuur uit de template: TODO: Vul hier de titel in
In de HTML-header wordt de js-ReSpec bibliotheek geladen. Het enige dat in de header mag worden aangepast is de title (tussen \\ en \\. Andere aanpassingen die nodig zijn in de header mogen alleen worden gedaan in overleg met de ReSpec beheerders. Een overzicht van de ReSpec beheerders staat in Hoofdstuk 6 In de HTML-Body geldt vrijheid in gebondenheid De
en/of
regels mogen worden gekopieerd en toegevoegd. Wel belangrijk om de structuur over te nemen, dus als volgt:
\\Inleiding\\\\ Een
is een sectie plus bijbehorend document, dat niet in de inhoudsopgave terechtkomt. Deze gebruik je bijvoorbeeld voor een Toelichting, een Colofon of een Voorwoord. Een
komt w\u00e9l in de inhoudsopgave terecht. Deze heeft daarom behalve de data-include van het document, ook (verplicht!) een

tag. De tekst tussen

en

komt in de inhoudsopgave te staan.","title":"Het bestand 'index.html'"},{"location":"ReSpec/#het-bestand-configjs","text":"In config.js wordt een stuurvariabele voor ReSpec gevuld. De waarden in deze variabele worden door ReSpec gebruikt om de layout te bepalen, en bevatten een aantal document-eigenschappen.","title":"Het bestand 'config.js'"},{"location":"ReSpec/#specstatus","text":"De SpecStatus in de configuratie geeft de keuze uit 4 waarden, deze waarden zijn vastgesteld, en mogen niet zomaar uitgebreid of aangepast worden. Elke status hoort bij een formele fase van een ReSpec document. Zie ook de Geonovum ReSpec wiki . GN-WV, Werkversie : Dit is de versie van het document waaraan wordt gewerkt. Deze versie is continu 'under-construction'. GN-CV, Consultatieversie : Dit is een 'snapshot' van de versie die 'in consultatie' wordt gezet. Aan deze versie wordt niks meer gedaan totdat de consultatie is afgelopen. Daarna worden alle op en aanmerkingen uit de consultatieronde verwerkt. GN-VV, Vaststellingsversie : Dit is een 'snapshot' van de versie na het verwerken van de op en aanmerkingen uit de consultatieronde is ontstaan. Deze versie wordt aangeboden aan de programma-raad van Geonovum, om te wordern 'vastgesteld'. GN-DEF, Definitieve versie : Dit is de definitieve versie van het document, zoals vastgesteld door de programma-raad. Van deze versie wordt opnieuw een 'snapshot' gemaakt in ReSpec. Het resultaat van die snapshot wordt op http://docs.geonovum.nl neergezet.","title":"SpecStatus"},{"location":"ReSpec/#spectype","text":"Het SpecType in de configuratie is een vaste lijst met waarden, deze waarden zijn vastgesteld, en mogen niet zonder overleg met de Technische ReSpec beheerders uitgebreid of aangepast worden. Onderstaande beschrijvingen komen uit het generiek beheerplan [5] Zie: https://www.geonovum.nl/uploads/documents/Geonovum%20GENERIEK%20Beheerplan%20geo-standaarden%20v1.1.pdf . NO Norm: Een norm is bij een officieel standaardisatie instituut ondergebracht en bevat bindende afspraken. Naast het gebruik van normen is NEN 3610 de enige norm waar Geonovum een inhoudelijke verantwoordelijkheid heeft. Het formele beheer en beslissingen worden genomen in de NEN normcommissie 351 240 waar Geonovum de voorzitter van is. ST Standaard: Een document met (bindende) afspraken. IM Informatiemodel: Een standaard waarbij door de term informatiemodel te hanteren wordt aangegeven dat het een abstractie (het model) vormt van de werkelijkheid zoals beschreven binnen een bepaalde sector/domein. Informatiemodellen zijn een semantische invulling van normen voor sectoren zoals ruimtelijke ordening, kabels en leidingen, water, etc.. PR Praktijkrichtlijn: Praktijkrichtlijnen zijn producten die informatie geven, vaak met een technisch karakter, die nodig is voor het toepassen van standaarden. Een praktijkrichtlijn hoort altijd bij een standaard/norm. HR Handreiking: Op zichzelf staande documentatie dat als doel heeft een hulpmiddel te zijn, niet verplichtend maar ondersteunend. WA Werkafspraak: Legt uit hoe wetgeving moet worden toegepast bij onduidelijkheden, discrepanties of fouten in de standaarden. BD Beheerdocumentatie: Documentatie met betrekking tot het beheerproces van de standaard. Deze documentatie betreft niet een standaard of onderdeel daarvan, zoals een handreiking of werkafspraak. AL Algemeen: Op zichzelf staande algemene documentatie over standaarden. De documentatie betreft niet een specifieke standaard of onderdeel daarvan, het is ook geen beheerdocumentatie van een specifieke standaard.","title":"SpecType"},{"location":"ReSpec/#pubdomain","text":"pubDomain bepaalt bij publicatie een deel van de URL waarop het document wordt gepubliceerd. Het zorgt voor een groepering van de documenten op docs.geostandaarden.nl Omdat je de URL van gepubliceerde documenten niet wilt veranderen is moet je hier goed over nadenken en alleen in overleg nieuwe toevoegen. De actuele lijst van pubDomains staat in de tabel hieronder. De herkomst van deze lijst is als volgt: Lijst op github : respec-utils . docs.geostandaarden.nl. register.geostandaarden.nl. Naamgevinsregels voor pubDomain: Lowercase Geen spaties Pubdomain Omschrijving Herkomst status GitHub Team Beslissing 3dbv 3D basisvoorziening docs.geostandaarden.nl inactief (gemigreerd) mag niet meer gebruikt worden api Kennisplatform APIs respec utils API team OK basisgeometrie Informatiemodel Basisgeometrie register.geostandaarden.nl zit op docs bij nen3610 niet gebruiken eigenlijk xsd redirecten bgt Basisregistratie grootschalige topografie docs.geostandaarden.nl BGT team Arnoud vragen brt Informatiemodellen Basisregistratie Topografie register.geostandaarden.nl BRT team OK crs Co\u00f6rdinaatreferentiesystemen docs.geostandaarden.nl CRS team OK cvgg Informatiemodel Geluid docs.geostandaarden.nl duplicaat van img OK disgeo DisGeo respec utils OK dsgo Digitaal Stelsel Gebouwde Omgeving docs.geostandaarden.nl OK (rare uri) dso Digitaal Stelsel Omgevingswet respec utils duplicaten: tpod imow ow DSO team OK eu docs.geostandaarden.nl EU team OK (rare uri en werkversie weg) g4w docs.geostandaarden.nl groeperen? gbd docs.geostandaarden.nl groeperen? geobag docs.geostandaarden.nl OK gsw docs.geostandaarden.nl groeperen? imaer Informatiemodel AERIUS register.geostandaarden.nl OK imev Informatiemodel Externe Veiligheid docs.geostandaarden.nl IMEV team OK img Informatiemodel Geluid respec utils duplicaat: cvgg IMG team redirecten naar cvgg imgeo Informatiemodel Grootschalige Geografie docs.geostandaarden.nl Arnoud vragen imka Informatiemodel Klimaatadaptatie docs.geostandaarden.nl OK imkad Informatiemodel Kadaster register.geostandaarden.nl IMKA team OK imkl Informatiemodel Kabels en Leidingen register.geostandaarden.nl duplicaat: kl IMKL team Zou kl moeten worden imle docs.geostandaarden.nl OK (niet netjes gepubliceerd) imro Informatiemodel Ruimtelijke Ordening register.geostandaarden.nl duplicaat: ro liefst naar RO imow Informatiemodel Omgevingswet register.geostandaarden.nl duplicaten: tpod ow dso liefst weg kl IMKL respec utils duplicaat: imkl OK md Metadata respec utils duplicaat: metadata OK mim Metamodel Informatie Modellering (MIM respec utils OK metadata Nederlandse metadata profielen voor datasets en services register.geostandaarden.nl duplicaat: md verplaatsen naar md?? nen3610 NEN3610-Linkeddata respec utils OK ngii docs.geostandaarden.nl OK oov docs.geostandaarden.nl OK ow Standaarden omgevingswet respec utils duplicaten: tpod imow dso OK ro RO Standaarden respec utils duplicaat: imro OK rwgs Raamwerk van Geo-standaarden respec utils groeperen? serv Services respec utils groeperen? tpod Toepassingsprofiel omgevingsdocumenten respec utils duplicaten: ow imow dso OK vg Informatiemodel Vastgoedgebruik respec utils OK visu Visualisatie respec utils groeperen? vtm docs.geostandaarden.nl is eigenlijk metadata verhuizen naar MD wp Whitepaper Geostandaarden respec utils ook een raar pubdomain verhuizen naar ngii","title":"pubDomain"},{"location":"ReSpec/#localbiblio","text":"In de localBiblio variabele worden Referenties naar andere documenten gezet. Voordat je hier citaten toevoegt, loont het de moeite om eerst in de https://www.specref.org/ van ReSpec zelf te kijken. Pas als je een verwijzing niet vindt in SpecRef voeg je hem hier toe! Verwijzen naar een bibliografieelement gebeurt als volgt [[ID]] . De dubbele haakjes zorgen ervoor dat er blokhaken om de verwijzing staan in de tekst. Je kunt ook aangeven dat een verwijzing normatief is door er een uitroepteken voor te zetten [[!ID]]","title":"LocalBiblio"},{"location":"ReSpec/#voorbeeld-configjs","text":"let respecConfig = { useLogo: true, useLabel: true, // title is verplicht! Neem hier de titel van het document op ---------------------- title: \"[Neem titel op in config.js]\", //-- specStatus is verplicht! (activeer 1 van de volgende) -------------------------- specStatus: \"wv\", // Werkversie //-- specType is verplicht bij alle andere dan BASIS --------------------------------- specType: \"HR\", // HandReiking //-- pubDomain is verplicht! (komt in de URL) ------------------------------------- pubDomain: \"TODO\", //-- license: voor de geldende gebruiksvoorwaarden. Default is cc-by. //licence: \"cc-by-nd\", // bronvermelding, geen afgeleide werken (default) //licence: \"cc0\", // Public Domain Dedication licence: \"cc-by\", // Attribution, met bronvermelding //-- shortName is verplicht! (komt in de URL: kies logische afkorting)-------------- shortName: \"NL-ReSpec-GN-template\", //-- publishDate is verplicht ------------------------------------------------------- //-- NB: in de werkversie uitzetten, want dan pakt Respec de pushdate --------------- //publishDate: \"2023-03-28\", //eventueel is het mogelijk een versienummer mee te geven, maar bij Geonovum werken we gewoonlijk alleen met datum als onderdeel van de permanente URI. //publishVersion: \"0.0.2\", //previousVersion: \"0.0.1\", //-- Voor dit blok geldt: alleen als er eerdere versies zijn en altijd beiden aan/uit! //previousPublishDate: \"2014-05-01\", //previousMaturity: \"CV\", //-- de namen van de Editor(s) / Redacteur(en)--------------------------------------- //-- vul in: per Editor: name:, company:, companyURL: ------------------------------- editors: [ { name: \"voornaam achternaam\", company: \"Geonovum\", companyURL: \"https://www.geonovum.nl\", } ], //-- de namen van de auteur(s) ------------------------------------------------------ //-- vul in: per auteur: name:, company:, companyURL: ------------------------------- authors: [ { name: \"voornaam achternaam\", company: \"Geonovum\", companyURL: \"https://www.geonovum.nl\", } ], //neem hier de URL van de github repository op waar het respec document in staat github: \"https://github.com/Geonovum/NL-ReSpec-GN-template\", // Create PDF and link to file in header (optional): alternateFormats: [ { label: \"pdf\", uri: \"template.pdf\", }, ], }; De file config.js is een stukje javascript (JSON) code, het bevat alle mogelijke waarden voor de verschillende versies die wij hanteren bij Geonovum. In de file zelf staat aangegeven welke waarden verplicht zijn, en uit welke waarden te kiezen is. In bovenstaand voorbeeld gaat het om een 'Werkversie van een standaard'.","title":"Voorbeeld config.js"},{"location":"ReSpec/#content-bestanden-md","text":"De 'echte' content wordt gemaakt in het formaat 'Markdown'. Er is een aantal editors beschikbaar die dat formaat ondersteunen. Zie hiervoor Hoofdstuk 3 . Het is handig om voor elk hoofdstuk een aparte Markdown file te maken, want dan blijven de bestanden beperkt in grootte, en zijn er gemakkelijker werkafspraken te maken over wie wanneer in welke file aan het editen is.","title":"Content: bestanden '*.md'"},{"location":"ReSpec/#content-afbeeldingen-png","text":"Afbeeldingen worden als '.png' of '.svg' bestand neergezet in de map 'media'. In je Markdown document neem je gewoon een plaatje op zoals je in Word gewend bent. Writage en ReSpec zorgen ervoor dat de plaatjes worden getoond.","title":"Content: Afbeeldingen '*.png'"},{"location":"ReSpec/#respec-frontend","text":"","title":"ReSpec Frontend"},{"location":"ReSpec/#de-knop-respec","text":"De knop 'ReSpec' rechtsboven in de frontend van ReSpec, bevat een aantal handige functies. Als je klikt op de knop, verschijnt het vervolgscherm met een viertal functies. Elk van de functies wordt hieronder uitgelegd.","title":"De knop 'ReSpec'"},{"location":"ReSpec/#bewaar-snapshot","text":"","title":"Bewaar snapshot"},{"location":"ReSpec/#doorzoek-specref","text":"De gevonden zoekresultaten kunnen worden overgenomen in het ReSpec document.","title":"Doorzoek SpecRef"},{"location":"ReSpec/#lijst-van-definities","text":"Zie: definitielijst maken","title":"Lijst van definities"},{"location":"ReSpec/#html-ingebed-in-respec","text":"Omdat wij ervoor hebben gekozen om documenten te schrijven in Markdown, gebruiken wij niet alle ReSpec functionaliteit. In dit hoofdstuk worden de speciale ReSpec functies beschreven die als HTML code in het Markdown document kunnen wordnen opgenomen, of die in de door respec gegenereerde HTML file kunnen worden neergezet. Het gebruik van deze functionaliteit vereist dus wel HTML kennis.","title":"HTML ingebed in ReSpec"},{"location":"ReSpec/#html-voor-afbeeldingen","text":"Een lijst van afbeeldingen kan door ReSpec automatisch worden gegenereerd, maar dan moet er wel aan een aantal ReSpec specifieke voorwaarden worden voldaan: In Index.html komt ergens te staan:
\"\"
The water flows from bucket A to bucket B.
In de documenten worden de afbeeldingen op de volgende manier neergezet:
\"\"
The water flows from bucket A to bucket B.
NB:
inclusief uniek ID en een ge-embedde
zijn verplicht! Eventuele referenties naar plaatjes doe je op e volgende manier:

The flowchart shown in is quite impressive.

","title":"HTML voor Afbeeldingen"},{"location":"ReSpec/#referentie-naar-github-issues","text":"ReSpec ondersteunt ook een koppeling naar issues die zijn gemeld op GitHub. Jek kan referenties opnemen naar individuele issues. Ook is het mogelijk om een lijst met alle issues op te nemen in je document. Om GitHub issues op te nemen moet je in 'config.js' een referentie opnemen naar de GitHub repository. issueBase: \"https://github.com/Geonovum/MIM-Werkomgeving/issues/\" Een referentie naar een issue neem je als volgt op:
Waarbij data-number het issuenummer is. Een lijst met issues kan je toevoegen met de volgende HTML code:
","title":"Referentie naar GitHub issues"},{"location":"ReSpec/#foutmeldingen-en-waarschuwingen","text":"In dit geval is er een tikfout gemaakt bij de naam van de Markdownfile die ge-include wordt. Het moet natuurlijk H2-Testcases.md zijn. Een voorbeeld van een waarschuwing. Klikken hierop geeft je je de waarschuwing. In het onderstaande voorbeeld meldt ReSpec dat er een

header ontbreekt in het Markdown document.","title":"Foutmeldingen en waarschuwingen"},{"location":"ReSpec/#publiceren-in-respec","text":"In dit hoofdstuk staan checklists die je kan gebruiken als je vanuit GitHub en ReSpec \u201cVersies\u201d gaat aanmaken. Bijvoorbeeld hoe maak je een nieuwe GitHub repository aan, of hoe maak je vanuit een werkversie een consultatieversie aan,","title":"Publiceren in ReSpec"},{"location":"ReSpec/#controles-voor-publicatie","text":"Controleer de volgende onderwerpen voor iedere publicatie: Controleer op WCAG regels. Bij het pushen van een ReSpec document naar GitHub wordt automatisch een WCAG rapport geschreven. Dit is te vinden onder 'Actions'. Kies hier de commit die je gedaan hebt en je ziet daar 'Check/WCAG'). Controleer op Broken links. Bij het pushen van een ReSpec document naar GitHub wordt automatisch op broken links gechecked. Dit is te vinden onder 'Actions'. Kies hier de commit die je gedaan hebt en je ziet daar 'Check/Links'). Je kunt oook het HTML controleren: maak een snapshot aan en biedt het aan aan de W3C validator","title":"Controles voor publicatie"},{"location":"ReSpec/#consultatie-versie-cv-maken","text":"Edit en controleer config.js - configureer alles goed voor een consultatieversie specStatus : \"GN-CV\" publishDate : moet ingevuld zijn met de datum van publicatie van de consultatieversie. \"jjjj-mm-dd\" , Shortname : moet ingevuld zijn met korte naam voor het document. Dit wordt onderdeel van de URL. Moet uniek zijn binnen pubdomain (afgezien van versies). Als er al eerder een versie gepubliceerd is (stabiele versie, dus afgezien van de werkversie in github), kan Respec bovenin een document de navigatie naar vorige versie goed genereren. Daarvoor moet je ook invullen: Previousmaturity : wat de status toen was. Previousmaturity : wat de status toen was. Maak een snapshot (met de knop \u201cBewaar Snapshot\u201d vanuit Respec) Kies \u201cHTML\u201d en noem dit bestand \u201csnapshot.html\u201d Commit het en push het naar dezelfde folder als waar index.html staat in je Github-repository","title":"Consultatie versie (CV) maken"},{"location":"ReSpec/#consultatieversie-maken-met-behulp-van-webhook","text":"Klik hier voor een beschrijving over hoe je een webhook eenmalig configureert voor een repository. over het toepassen van de webhook. Maak een release tag conform de naamgevingsconventie: \\{specStatus\\}-\\{specType\\}-\\{shortName\\}-\\{publishDate\\} Het script kopieert nu automatisch (NB: dit moet wel eenmalig geconfigureerd zijn als \u2018webhook\u2019 in de github repository!) het snapshot.html en de bijbehorende afbeeldingen naar [docs.geostandaarden.nl] http://docs.geostandaarden.nl ). Na succesvolle publicatie: zet de specStatus in config.js terug op \"GN-WV\" Vul previousMaturity in met \"GN-CV\" Vul previousPublishDate in met de datum van de zojuist gepubliceerde consultatieversie","title":"Consultatieversie maken met behulp van webhook"},{"location":"ReSpec/#consultatieverise-met-behulp-van-webhook","text":"Note : uitwerken","title":"Consultatieverise met behulp van webhook"},{"location":"ReSpec/#vaststellingsversie-vv-maken","text":"Edit en controleer config.js - configureer alles goed voor een vaststellingsversie specStatus: \"GN-VV\" publishDate: moet ingevuld zijn met de datum van publicatie van de consultatieversie. \"jjjj-mm-dd\", Shortname: moet ingevuld zijn met korte naam voor het document. Dit wordt onderdeel van de URL. Moet uniek zijn binnen pubdomain (afgezien van versies). Als er al eerder een versie gepubliceerd is (stabiele versie, dus afgezien van de werkversie in github), kan Respec bovenin een document de navigatie naar vorige versie goed genereren. Daarvoor moet je ook invullen: Previousmaturity: wat de status toen was. Previousmaturity: wat de status toen was. Maak een snapshot (met de knop \u201cBewaar Snapshot\u201d vanuit Respec) Kies \u201cHTML\u201d en noem dit bestand \u201csnapshot.html\u201d Commit het en push het naar dezelfde folder als waar index.html staat in je Github repository Maak een release tag conform de naamgevingsconventie: {specStatus}-{specType}-{shortName}-{publishDate} Het script kopieert nu automatisch (NB: dit moet wel eenmalig geconfigureerd zijn als \u2018webhook\u2019 in de github repository!) het snapshot.html en de bijbehorende afbeeldingen naar http://docs.geonovum.nl Na succesvolle publicatie: zet de specStatus in config.js terug op GN-WV Vul previousMaturity in met GN-CV Vul previousPublishDate in met de datum van de zojuist gepubliceerde consultatieversie","title":"Vaststellingsversie (VV) maken"},{"location":"ReSpec/#definitieve-versie-def-maken","text":"Edit en controleer config.js - configureer alles goed voor een definitieve versie specStatus: \"GN-DEF\", publishDate: moet ingevuld zijn met de datum van publicatie van de definitieve versie. \"jjjj-mm-dd\", Shortname: moet ingevuld zijn met korte naam voor het document. Dit wordt onderdeel van de URL. Moet uniek zijn binnen pubdomain (afgezien van versies). Als er al eerder een versie gepubliceerd is (stabiele versie, dus afgezien van de werkversie in github), kan Respec bovenin een document de navigatie naar vorige versie goed genereren. Daarvoor moet je ook invullen: Previousmaturity: wat de status toen was. previousPublishDate: vorige publicatiedatum (jjjj-mm-dd) Maak een snapshot (met de knop \u201cBewaar Snapshot\u201d vanuit Respec) Kies \u201cHTML\u201d en noem dit bestand \u201csnapshot.html\u201d Commit het en push het naar dezelfde folder als waar index.html staat in je Github repository Maak een release tag conform de naamgevingsconventie: {specStatus}-{specType}-{shortName}-{publishDate} Het script kopieert nu automatisch (NB: dit moet wel eenmalig geconfigureerd zijn als \u2018webhook\u2019 in de github repository!) het snapshot.html en de bijbehorende afbeeldingen naar http://docs.geostandaarden.nl Hoe dit werkt is beschreven in: https://github.com/Geonovum/technisch-register-2019 Na succesvolle publicatie: zet de specStatus in config.js terug op GN-WV Vul previousMaturity in met GN-DEF Vul previousPublishDate in met de datum van de zojuist gepubliceerde definitieve versie","title":"Definitieve versie (DEF) maken"},{"location":"SVN-importeren-bestaand-project/","text":"SVN - Importeren van een bestaand project in EA Enterprise Architect versie: 15.2 Tortoise SVN Subversion versie: 1.14.1 Inleiding Deze handleiding beschrijft hoe je in Enterprise Architect de packages van een bestaand project kunt importeren vanuit Subversion . Het stappenplan laat zien hoe je aan de hand van een EAP-bestand van het IMDiSGeo ( IMSOR-XMI ) een bestaand package toevoegt. In dit voorbeeld wordt het package met standaarddatatypes toegevoegd. Je kunt ook bestaande packages importeren in een nieuw (leeg) EAP-bestand. De methode is vrijwel identiek. De handleiding licht beide opties toe. Inhoud Dit document bevat de volgende onderdelen: Voorbereiding Stap 1: Configureer de VC-settings Stap 2: Haal het package op Stap 3: Haal de inhoud van het package op Voorbereiding MIM-toolbox importeren Importeer de MIM-toolbox ( instructie ). Dit is met name relevant als het bestaande project ontwikkeld is met de MIM-toolbox. Door de toolbox vooraf te importeren, maakt EA automatisch een koppeling met de MIM-modelelementen in de packages die je gaat importeren. Lokale folder aanmaken en koppelen Zie hiervoor stap 2 en stap 3 uit de handleiding SVN - installeren voor EAP . Packages importeren Stap 1: Configureer de VC-settings Configueer de version control settings van het bestaande project Ga naar Configure > Project-VC . Er verschijn nu een venster met de naam Version Control Settings . Bij een nieuw EAP-bestand is dit venster leeg, maar bij een bestaand EAP-bestand met packages onder versiebeheer moet je eerst op New klikken (zie onderstaande afbeelding). Doorloop daarna de onderdelen onder de afbeelding. 1.1 Model Settings: Check: \" Save nested version \" [...] 1.2 Configuration Details Check: \" Subversion \" Unique ID: Zelf gekozen unieke aanduiding voor de package onder version control. Suggestie : Geonovum-{naam van het package} , bijvoorbeeld; Geonovum-datatypes , of: Geonovum-imkl . Selecteer het Working Copy Path dat je gebruikt voor Subversion. Dit is de folder waar de lokale SVN-gegevens worden weggeschreven (zie: stap 2 bij lokale folder aanmaken en koppelen ). 1.3 Workstation Settings Selecteer het Subversion Exe Path (de locatie van het bestand: svn.exe ), als dat nog niet is ingevuld. Klik Save 1.4 Defined Configurations Controleer de Defined Configuration. Dit veld heeft nu \u00e9\u00e9n (nieuwe) ingevulde regel (zie afbeelding) met de Unique ID die je in onderdeel 1.2 hebt opgegeven. Klik Close Stap 2: Haal het package op Klik met rechtermuisknop op Model en ga naar Package Control > Get Package . Selecteer bij Select a Version Control Configuration in: Geonovum-datatypes . Selecteer bij Select A Shared File For Inclusion : Geonovum-algemeen.xml . Note : Kies indien van toepassing het 'hoogtste' package in de hi\u00ebrarchie van de package -structuur van het te importeren bestand. Op deze manier haal je ook in \u00e9\u00e9n keer alle subpackages op. Note : Het niveau in de package-structuur van de project browser waar je klikt, bepaalt de plek waar het geimporteerde package terecht komt. Het komt daaronder. kies je model, dan komt het op het 'hoogste' niveau. Dit is soms relevant. Als iets wel, of juist niet onderdeel van het model moet zijn. Ook voor Imvertor is/was dit relevant... (controleren) In de Project Browser verschijnt nu het package Geonovum-algemeen en indien aanwezig inclusief de subpackages. Het kan zijn dat de packages in dit stadium nog leeg zijn. Dat lossen we in de volgende stap op. Stap 3: Haal de inhoud van het package op Note : Via onderstaande stappen haal je de meest actuele versie op van de packages die onder versiebeheer staan. Als je met verschillende modelleurs aan een package werkt, is het verstandig om deze stappen tussentijds regelmatig uit te voeren. Klik met de rechtermuisknop op een package , bijv. Geonovum-geometrie . Klik op Ok Klik met de rechtermuisknop op het package Geonovum-geometrie > Package Control > Get All Latest . Er verschijnt een venster Get All Latest - Selecteer Import Changed Files Only (recommended) - Klik Ok . Het package en de subpackages zijn succesvol ge\u00efmporteerd. Indien je meerdere basismodellen (of andere typen packages ) wilt importeren, doorloop je stap 1 t/m 3 opnieuw. Note : Het kan zijn dat de packages toch niet goed ge\u00efmporteerd worden. Doorloop dan onderstaande stappen. Klik met de rechtermuisknop op het package \u00abGeonovum-geometrie\u00bb . Klik op Ok Klik met de rechtermuisknop op het package Basismodel > Package Control > Get Latest . Er verschijnt een venster Import Package - Selecteer Force reload from XMI - Klik Ok .","title":"SVN importeren bestaand project"},{"location":"SVN-importeren-bestaand-project/#svn-importeren-van-een-bestaand-project-in-ea","text":"Enterprise Architect versie: 15.2 Tortoise SVN Subversion versie: 1.14.1","title":"SVN - Importeren van een bestaand project in EA"},{"location":"SVN-importeren-bestaand-project/#inleiding","text":"Deze handleiding beschrijft hoe je in Enterprise Architect de packages van een bestaand project kunt importeren vanuit Subversion . Het stappenplan laat zien hoe je aan de hand van een EAP-bestand van het IMDiSGeo ( IMSOR-XMI ) een bestaand package toevoegt. In dit voorbeeld wordt het package met standaarddatatypes toegevoegd. Je kunt ook bestaande packages importeren in een nieuw (leeg) EAP-bestand. De methode is vrijwel identiek. De handleiding licht beide opties toe.","title":"Inleiding"},{"location":"SVN-importeren-bestaand-project/#inhoud","text":"Dit document bevat de volgende onderdelen: Voorbereiding Stap 1: Configureer de VC-settings Stap 2: Haal het package op Stap 3: Haal de inhoud van het package op","title":"Inhoud"},{"location":"SVN-importeren-bestaand-project/#voorbereiding","text":"","title":"Voorbereiding"},{"location":"SVN-importeren-bestaand-project/#mim-toolbox-importeren","text":"Importeer de MIM-toolbox ( instructie ). Dit is met name relevant als het bestaande project ontwikkeld is met de MIM-toolbox. Door de toolbox vooraf te importeren, maakt EA automatisch een koppeling met de MIM-modelelementen in de packages die je gaat importeren.","title":"MIM-toolbox importeren"},{"location":"SVN-importeren-bestaand-project/#lokale-folder-aanmaken-en-koppelen","text":"Zie hiervoor stap 2 en stap 3 uit de handleiding SVN - installeren voor EAP .","title":"Lokale folder aanmaken en koppelen"},{"location":"SVN-importeren-bestaand-project/#packages-importeren","text":"","title":"Packages importeren"},{"location":"SVN-importeren-bestaand-project/#stap-1-configureer-de-vc-settings","text":"Configueer de version control settings van het bestaande project Ga naar Configure > Project-VC . Er verschijn nu een venster met de naam Version Control Settings . Bij een nieuw EAP-bestand is dit venster leeg, maar bij een bestaand EAP-bestand met packages onder versiebeheer moet je eerst op New klikken (zie onderstaande afbeelding). Doorloop daarna de onderdelen onder de afbeelding.","title":"Stap 1: Configureer de VC-settings"},{"location":"SVN-importeren-bestaand-project/#11-model-settings","text":"Check: \" Save nested version \" [...]","title":"1.1 Model Settings:"},{"location":"SVN-importeren-bestaand-project/#12-configuration-details","text":"Check: \" Subversion \" Unique ID: Zelf gekozen unieke aanduiding voor de package onder version control. Suggestie : Geonovum-{naam van het package} , bijvoorbeeld; Geonovum-datatypes , of: Geonovum-imkl . Selecteer het Working Copy Path dat je gebruikt voor Subversion. Dit is de folder waar de lokale SVN-gegevens worden weggeschreven (zie: stap 2 bij lokale folder aanmaken en koppelen ).","title":"1.2 Configuration Details"},{"location":"SVN-importeren-bestaand-project/#13-workstation-settings","text":"Selecteer het Subversion Exe Path (de locatie van het bestand: svn.exe ), als dat nog niet is ingevuld. Klik Save","title":"1.3 Workstation Settings"},{"location":"SVN-importeren-bestaand-project/#14-defined-configurations","text":"Controleer de Defined Configuration. Dit veld heeft nu \u00e9\u00e9n (nieuwe) ingevulde regel (zie afbeelding) met de Unique ID die je in onderdeel 1.2 hebt opgegeven. Klik Close","title":"1.4 Defined Configurations"},{"location":"SVN-importeren-bestaand-project/#stap-2-haal-het-package-op","text":"Klik met rechtermuisknop op Model en ga naar Package Control > Get Package . Selecteer bij Select a Version Control Configuration in: Geonovum-datatypes . Selecteer bij Select A Shared File For Inclusion : Geonovum-algemeen.xml . Note : Kies indien van toepassing het 'hoogtste' package in de hi\u00ebrarchie van de package -structuur van het te importeren bestand. Op deze manier haal je ook in \u00e9\u00e9n keer alle subpackages op. Note : Het niveau in de package-structuur van de project browser waar je klikt, bepaalt de plek waar het geimporteerde package terecht komt. Het komt daaronder. kies je model, dan komt het op het 'hoogste' niveau. Dit is soms relevant. Als iets wel, of juist niet onderdeel van het model moet zijn. Ook voor Imvertor is/was dit relevant... (controleren) In de Project Browser verschijnt nu het package Geonovum-algemeen en indien aanwezig inclusief de subpackages. Het kan zijn dat de packages in dit stadium nog leeg zijn. Dat lossen we in de volgende stap op.","title":"Stap 2: Haal het package op"},{"location":"SVN-importeren-bestaand-project/#stap-3-haal-de-inhoud-van-het-package-op","text":"Note : Via onderstaande stappen haal je de meest actuele versie op van de packages die onder versiebeheer staan. Als je met verschillende modelleurs aan een package werkt, is het verstandig om deze stappen tussentijds regelmatig uit te voeren. Klik met de rechtermuisknop op een package , bijv. Geonovum-geometrie . Klik op Ok Klik met de rechtermuisknop op het package Geonovum-geometrie > Package Control > Get All Latest . Er verschijnt een venster Get All Latest - Selecteer Import Changed Files Only (recommended) - Klik Ok . Het package en de subpackages zijn succesvol ge\u00efmporteerd. Indien je meerdere basismodellen (of andere typen packages ) wilt importeren, doorloop je stap 1 t/m 3 opnieuw. Note : Het kan zijn dat de packages toch niet goed ge\u00efmporteerd worden. Doorloop dan onderstaande stappen. Klik met de rechtermuisknop op het package \u00abGeonovum-geometrie\u00bb . Klik op Ok Klik met de rechtermuisknop op het package Basismodel > Package Control > Get Latest . Er verschijnt een venster Import Package - Selecteer Force reload from XMI - Klik Ok .","title":"Stap 3: Haal de inhoud van het package op"},{"location":"SVN-installeren-voor-EAP/","text":"Handleiding voor het installeren van SVN (Subversion) voor een EAP bestand. UML modellen worden beheerd in Subversion (SVN) op 'svn.geostandaarden.nl'. Dit is een versiebeheertool die kan samenwerken met 'Enterprise Architect' en wordt daarom voor UML modellen gebruik.. Deze handleiding beschrijft hoe je een informatiemodel in de versiebeheeromgeving zet. Dit document bevat de volgende onderdelen: Voorbereiding: Installeer SVN Tortoise vraag een account aan. Folder aanmaken op SVN-server. Lokale folder aanmaken. Lokale folder koppelen aan folder op SVN-server. Breng EAP-bestand(packages) onder SVN. Breng package onder version control. Check package in of uit. Meer informatie. Voorbereiding: Installeer SVN Tortoise en vraag account aan Als je SVN Tortoise nog niet hebt, installeer deze van https://tortoisesvn.net/ . Note Installeer ook de Command Line Client Tools mee. Dit heb je nodig bij stap 4: Breng EAP-bestand (packages) onder SVN . Het is een extra optie en valt niet onder de standaardinstallatie, dus je moet hier zelf alert op zijn. Het is ook mogelijk om dit achteraf te doen. Hoe je dit doet, staat beschreven in stap 4. Vraag een account aan voor svn.geostandaarden.nl bij de beheerder Stap 1: Folder aanmaken op SVN-server Maak een folder op de SVN-server ( svn.geostandaarden.nl ) aan met de naam van het model. Een voor de hand liggende naam van de folder: imxx met op de plaats van de xx de (afkorting van de) naam van het model. Bijvoorbeeld imka ( informatiemodel klimaatadaptatie ) Stap 2: Lokale folder aanmaken Maak in een lokale map op je werk-pc een folder aan waar de SVN bestanden naar toe worden geschreven. svn.geostandaarden.nl/imxx synchroniseert met deze folder. Een naam voor deze folder is bijvoorbeeld svn met als subfolder imxx . De folder waarmee gesynchroniseerd gaat worden is dan dus svn/imxx Stap 3: Lokale folder koppelen aan folder op SVN-server Klik met rechtermuis op de leegte in de lokale net-aangemaakte svn/imxx folder. Select SVN checkout\u2026 . Kopieer de URL van de online svn folder ( svn://svn.geostandaarden.nl/imxx ) en checkout directory . De checkout directory is de folder gemaakt in stap 2 . Stap 4: Breng EAP-bestand (packages) onder SVN Het EAP bestand wordt op het niveau van packages onder SVN gebracht. Zet het EAP bestand op een locale folder op je PC. Open het EAP bestand Instellen version control settings. Kies het package dat onder SVN moet en klik met rechtermuisknop. Kies Package Control en Version Control Settings . Vul de volgende velden in: Unique ID : Zelf gekozen unieke aanduiding voor de package onder version control. Suggestie : Geonovum-{naam van het package} , bijv. Geonovum-imkl . Type : Subversion Working Copy Path : Selecteer de folder waar de lokale SVN-gegevens worden weggeschreven. Dit is de folder uit stap 2 . Subversion Exe Path : Navigeer naar C:\\Program Files\\TortoiseSVN\\bin\\ en selecteer svn.exe (dit is een \u00e9\u00e9nmalige stap ). Klik op Save en Close Note Je kunt een melding krijgen dat er geen svn.exe aanwezig is. Installeer dan de command line interface (CLI) mee volgens deze instructie . Je hoeft SVN hiervoor niet opnieuw te installeren; deze stap breidt de installatie alleen uit. Hierna staat svn.exe gewoon netjes in de bedoelde map. Je hoeft dus verder niet met de CLI aan de slag. Een andere optie is om SLIKSVN te installeren. Wanneer een UML model in subversion beheerd is dan kun je deze als volgt op je eigen computer gebruiken. Installeer een svn client zie hier Zorg voor een Geonovum svn account. Dit kun je aanvragen bij Wilko Quak of als hij niet beschikbaar is rechtstreeks bij Rob Kaesehagen die de server beheert. Voor projectX die gebruik maakt van de subversion map svn.geostandaarden.nl/ProjectX: Maak een folder op je lokale systeem: WerkmapProjectX Maak een subfolder svn. Maak een nieuw EA project ProjectX.eapx in je werkmap. Klik met je rechtermuistoets op deze folder en kies SVN Checkout Er verschijnt een Checkout dialoog. Vul als URL in svn://svn.geostandaarden.nl/IMGeluid en als output directory de folder die je net hebt aangemaakt. Kies de settings zoals hieronder weergegeven: Stap 5: Breng package onder version control Selecteer in Enterprise Architect het package dat je onder version control wilt brengen. Navigeer naar Configure > Package VC . Selecteer in het venster dat nu verschijnt de checkbox linksboven, genaamd: Control Package . Selecteer in het dropdown menu bij Version Control het path naar de folder waar de lokale SVN-gegevens worden weggeschreven (zie onder Working Copy Path in stap 4). Vul bij XMI Filename de naam in van het package dat je onder Version Control wilt brengen. Laat de overige velden ongewijzigd. Klik op 'Ok'. Klik op het dialoogvenster dat hierna verschijnt eveneens op 'Ok'. Als je niet meteen met het package aan de slag gaat, kun je er in dit venster eventueel ook voor kiezen om de checkbox ' Keep checked out ' uit te zetten (zie ook: stap 6). Configureer version control in EA - Kies uit het menu (de ribbon bovenin EA) Configure > Settings. Het Version Control Settings dialoogvenster verschijnt. Vul dit zoals hieronder in en klik dan op Save. Breng nu elk van de packages, op het niveau waarop je ze wilt kunnen in- en uitchecken, onder versiebeheer. Selecteer het tabblad Configure (bovenin) en klik op Package Configuration) Vul het Package Control Options dialoog in zoals hieronder (XMI Filename kan anders zijn, afhankelijk van hoe de packages zijn ingedeeld) en klik OK. Selecteer bij Version Control het voorgestelde path Kies \u2018Include sub-packages\u2019 als je wilt dat alle sub-packages in hetzelfde XMI bestand beheerd worden en dus geen eigen slotje krijgen. Stap 6: Check package in of uit Elk van de packages die in SVN zijn ondergebracht, hebben nu in EA een slotje. Je kunt de inhoud van het model dat in zo'n package staat niet zomaar meer wijzigen. Om aan een package te werken, check je het eerst uit. Klik met de rechtermuistoets op het package, kies Package Control > Check Out\u2026 (gebruik NIET \"check out branch\", dat is om met parallelle versies te werken, doen wij niet). Subversion haalt nu de laatste versie van het package voor je op en haalt het slotje voor je eraf. Een ander persoon kan niet tegelijkertijd aan dit package werken, maar het wel bekijken. Als je klaar bent met je werk, of je stopt er voor vandaag mee, check je het package weer in. Klik met de rechtermuistoets op het package, kies Package Control > Check In\u2026 (gebruik NIET \"check in branch\", dat is om met parallelle versies te werken, doen wij niet). Andere handige commando's: Put Latest > Tussentijds wijzigingen naar de SVN server sturen Get Latest > Laatste wijzigingen van de SVN server ophalen zodat je ze kan zien, zonder te willen uitchecken. Klik met de rechtermuisknop op het package in de Project Browser van Enterprise Architect. Selecteer Package Control . Kies Check out als je aan de package gaat werken. Kies Check in als je klaar bent. Note : Let op: we werken niet met Check in branch en Check out branch ! Meer informatie Kijk voor meer informatie ook op de website van Sparx Systems","title":"SVN installeren voor EAP"},{"location":"SVN-installeren-voor-EAP/#handleiding-voor-het-installeren-van-svn-subversion-voor-een-eap-bestand","text":"UML modellen worden beheerd in Subversion (SVN) op 'svn.geostandaarden.nl'. Dit is een versiebeheertool die kan samenwerken met 'Enterprise Architect' en wordt daarom voor UML modellen gebruik.. Deze handleiding beschrijft hoe je een informatiemodel in de versiebeheeromgeving zet. Dit document bevat de volgende onderdelen: Voorbereiding: Installeer SVN Tortoise vraag een account aan. Folder aanmaken op SVN-server. Lokale folder aanmaken. Lokale folder koppelen aan folder op SVN-server. Breng EAP-bestand(packages) onder SVN. Breng package onder version control. Check package in of uit. Meer informatie.","title":"Handleiding voor het installeren van SVN (Subversion) voor een EAP bestand."},{"location":"SVN-installeren-voor-EAP/#voorbereiding-installeer-svn-tortoise-en-vraag-account-aan","text":"Als je SVN Tortoise nog niet hebt, installeer deze van https://tortoisesvn.net/ . Note Installeer ook de Command Line Client Tools mee. Dit heb je nodig bij stap 4: Breng EAP-bestand (packages) onder SVN . Het is een extra optie en valt niet onder de standaardinstallatie, dus je moet hier zelf alert op zijn. Het is ook mogelijk om dit achteraf te doen. Hoe je dit doet, staat beschreven in stap 4. Vraag een account aan voor svn.geostandaarden.nl bij de beheerder","title":"Voorbereiding: Installeer SVN Tortoise en vraag account aan"},{"location":"SVN-installeren-voor-EAP/#stap-1-folder-aanmaken-op-svn-server","text":"Maak een folder op de SVN-server ( svn.geostandaarden.nl ) aan met de naam van het model. Een voor de hand liggende naam van de folder: imxx met op de plaats van de xx de (afkorting van de) naam van het model. Bijvoorbeeld imka ( informatiemodel klimaatadaptatie )","title":"Stap 1: Folder aanmaken op SVN-server"},{"location":"SVN-installeren-voor-EAP/#stap-2-lokale-folder-aanmaken","text":"Maak in een lokale map op je werk-pc een folder aan waar de SVN bestanden naar toe worden geschreven. svn.geostandaarden.nl/imxx synchroniseert met deze folder. Een naam voor deze folder is bijvoorbeeld svn met als subfolder imxx . De folder waarmee gesynchroniseerd gaat worden is dan dus svn/imxx","title":"Stap 2: Lokale folder aanmaken"},{"location":"SVN-installeren-voor-EAP/#stap-3-lokale-folder-koppelen-aan-folder-op-svn-server","text":"Klik met rechtermuis op de leegte in de lokale net-aangemaakte svn/imxx folder. Select SVN checkout\u2026 . Kopieer de URL van de online svn folder ( svn://svn.geostandaarden.nl/imxx ) en checkout directory . De checkout directory is de folder gemaakt in stap 2 .","title":"Stap 3: Lokale folder koppelen aan folder op SVN-server"},{"location":"SVN-installeren-voor-EAP/#stap-4-breng-eap-bestand-packages-onder-svn","text":"Het EAP bestand wordt op het niveau van packages onder SVN gebracht. Zet het EAP bestand op een locale folder op je PC. Open het EAP bestand Instellen version control settings. Kies het package dat onder SVN moet en klik met rechtermuisknop. Kies Package Control en Version Control Settings . Vul de volgende velden in: Unique ID : Zelf gekozen unieke aanduiding voor de package onder version control. Suggestie : Geonovum-{naam van het package} , bijv. Geonovum-imkl . Type : Subversion Working Copy Path : Selecteer de folder waar de lokale SVN-gegevens worden weggeschreven. Dit is de folder uit stap 2 . Subversion Exe Path : Navigeer naar C:\\Program Files\\TortoiseSVN\\bin\\ en selecteer svn.exe (dit is een \u00e9\u00e9nmalige stap ). Klik op Save en Close Note Je kunt een melding krijgen dat er geen svn.exe aanwezig is. Installeer dan de command line interface (CLI) mee volgens deze instructie . Je hoeft SVN hiervoor niet opnieuw te installeren; deze stap breidt de installatie alleen uit. Hierna staat svn.exe gewoon netjes in de bedoelde map. Je hoeft dus verder niet met de CLI aan de slag. Een andere optie is om SLIKSVN te installeren. Wanneer een UML model in subversion beheerd is dan kun je deze als volgt op je eigen computer gebruiken. Installeer een svn client zie hier Zorg voor een Geonovum svn account. Dit kun je aanvragen bij Wilko Quak of als hij niet beschikbaar is rechtstreeks bij Rob Kaesehagen die de server beheert. Voor projectX die gebruik maakt van de subversion map svn.geostandaarden.nl/ProjectX: Maak een folder op je lokale systeem: WerkmapProjectX Maak een subfolder svn. Maak een nieuw EA project ProjectX.eapx in je werkmap. Klik met je rechtermuistoets op deze folder en kies SVN Checkout Er verschijnt een Checkout dialoog. Vul als URL in svn://svn.geostandaarden.nl/IMGeluid en als output directory de folder die je net hebt aangemaakt. Kies de settings zoals hieronder weergegeven:","title":"Stap 4: Breng EAP-bestand (packages) onder SVN"},{"location":"SVN-installeren-voor-EAP/#stap-5-breng-package-onder-version-control","text":"Selecteer in Enterprise Architect het package dat je onder version control wilt brengen. Navigeer naar Configure > Package VC . Selecteer in het venster dat nu verschijnt de checkbox linksboven, genaamd: Control Package . Selecteer in het dropdown menu bij Version Control het path naar de folder waar de lokale SVN-gegevens worden weggeschreven (zie onder Working Copy Path in stap 4). Vul bij XMI Filename de naam in van het package dat je onder Version Control wilt brengen. Laat de overige velden ongewijzigd. Klik op 'Ok'. Klik op het dialoogvenster dat hierna verschijnt eveneens op 'Ok'. Als je niet meteen met het package aan de slag gaat, kun je er in dit venster eventueel ook voor kiezen om de checkbox ' Keep checked out ' uit te zetten (zie ook: stap 6). Configureer version control in EA - Kies uit het menu (de ribbon bovenin EA) Configure > Settings. Het Version Control Settings dialoogvenster verschijnt. Vul dit zoals hieronder in en klik dan op Save. Breng nu elk van de packages, op het niveau waarop je ze wilt kunnen in- en uitchecken, onder versiebeheer. Selecteer het tabblad Configure (bovenin) en klik op Package Configuration) Vul het Package Control Options dialoog in zoals hieronder (XMI Filename kan anders zijn, afhankelijk van hoe de packages zijn ingedeeld) en klik OK. Selecteer bij Version Control het voorgestelde path Kies \u2018Include sub-packages\u2019 als je wilt dat alle sub-packages in hetzelfde XMI bestand beheerd worden en dus geen eigen slotje krijgen.","title":"Stap 5: Breng package onder version control"},{"location":"SVN-installeren-voor-EAP/#stap-6-check-package-in-of-uit","text":"Elk van de packages die in SVN zijn ondergebracht, hebben nu in EA een slotje. Je kunt de inhoud van het model dat in zo'n package staat niet zomaar meer wijzigen. Om aan een package te werken, check je het eerst uit. Klik met de rechtermuistoets op het package, kies Package Control > Check Out\u2026 (gebruik NIET \"check out branch\", dat is om met parallelle versies te werken, doen wij niet). Subversion haalt nu de laatste versie van het package voor je op en haalt het slotje voor je eraf. Een ander persoon kan niet tegelijkertijd aan dit package werken, maar het wel bekijken. Als je klaar bent met je werk, of je stopt er voor vandaag mee, check je het package weer in. Klik met de rechtermuistoets op het package, kies Package Control > Check In\u2026 (gebruik NIET \"check in branch\", dat is om met parallelle versies te werken, doen wij niet). Andere handige commando's: Put Latest > Tussentijds wijzigingen naar de SVN server sturen Get Latest > Laatste wijzigingen van de SVN server ophalen zodat je ze kan zien, zonder te willen uitchecken. Klik met de rechtermuisknop op het package in de Project Browser van Enterprise Architect. Selecteer Package Control . Kies Check out als je aan de package gaat werken. Kies Check in als je klaar bent. Note : Let op: we werken niet met Check in branch en Check out branch !","title":"Stap 6: Check package in of uit"},{"location":"SVN-installeren-voor-EAP/#meer-informatie","text":"Kijk voor meer informatie ook op de website van Sparx Systems","title":"Meer informatie"},{"location":"SuggestiesHandleiding/","text":"Workflow Modelleur Tips&Tricks Hieronder volgt een ruwe opsomming van suggesties voor het maken van nieuwe, dan wel uitbreiden van bestaande handleidingen. Note : Hoe omgaan met onderdelen die regelmatig wijzigen? Note : Op Confluence staan ook al verschillende documenten. ENTERPRISE ARCHITECT (EA) Meest gebruikte windows Project browser Properties Notes Zoom/pan Resources Features Tagged values Relationships Imvertor Note : Waar kun je deze windows vinden? Note : Cre\u00eber workspaces Cre\u00eber workspace(s) Hoe maak je een workspace? Handige tips Find -in project browser of -in all diagrams View as feature matrix View as relation matrix View as specification view... Relationship matrix Verwijderen relaties Gebruik (rel. matr./relationships) Verwijderen uit diagram is niet model Package as Namespace Set package as namespace root: https://sparxsystems.com/enterprise_architect_user_guide/15.2/model_domains/namespaces.html Is dit nodig? En waarom? Voor je XML/GML-schema generatie o.i.d.? Installatie MIM-toolbox Voor project vs. user Hoe kun je toolbox project / user verwijderen? Tagged values invullen packages/MIM Beschrijving toevoegen EA-bestand voor oplevering Uit VC (SVN) halen SVN Checkout folder niet leegmaken Dat doe je bijvoorbeeld wel als je een package opnieuw of definitief uit Version Control wilt halen. Dus aan je checkout folder verander je niks Je maakt alleen een EA-bestand dat VC-vrij is. SUBVERSION (SVN) - VERSION CONTROL (VC) Verwijderen packages Suggestie structuur Werkwijze put/get latest Inchecken forceren: voor- en nadelen Gebruik repo browser (kijken, geen bewerkingen) URL repo browser Credentials Delete --> commit (als je lokaal wijzigingen aanbrengt) Verander niet zomaar iets in of aan checkout folder Herstel package control Check out Package VC Untick 'Control package' Verwijder .xml van het package dat je uit VC hebt gehaald uit checkout repo. Rechtermuis op repo Kies 'SVN Commit...' Selecter de .xml -bestanden van de verwijderde package(s) Klik op 'ok'. Nu kun je opnieuw het package onder VC brengen Versiestructuur Handleiding voor SVN versioning maken De mogelijkheid om hoofd- subpackages apart in- en uit te kunnen checken Eerst de domeinen erin hijsen Dan pas hogere packages, Met andere woorden: van onder naar boven of van laag naar hoog Versienr tags in het versieveld Mappenstructuur (plaatje pano overnemen of linken/samenvoegen) Propertiesfile weer terugzetten in cm vanuit imsor notitiemap XML's prefix van package stereotype meegeven dus view_ of domein_ Version packages is van tags Maar moet overeenkomen met versiemapnaam\\ Dus versie in EA moet overeenkomen met versiemapnaam SVN Waarschijnlijk leidt dit ertoe dat je voor elke versie op nieuw alle domeinen in en uit SVN moet halen ... IMVERTOR Handleiding Armatiek Zoekfunctie Armatiek Propertiesfile (standaard settings?) GitHub publicatie Batch Tagged Values? XML-/GML-schema's Diagrammen vinkje in settings + -overzicht in diagramnaam EA, properties? Note : op properties staan 2x beschreven. De lijst met CLI-properties is compleet/uitgebreider","title":"SuggestiesHandleiding"},{"location":"SuggestiesHandleiding/#workflow-modelleur-tipstricks","text":"Hieronder volgt een ruwe opsomming van suggesties voor het maken van nieuwe, dan wel uitbreiden van bestaande handleidingen. Note : Hoe omgaan met onderdelen die regelmatig wijzigen? Note : Op Confluence staan ook al verschillende documenten.","title":"Workflow Modelleur Tips&Tricks"},{"location":"SuggestiesHandleiding/#enterprise-architect-ea","text":"","title":"ENTERPRISE ARCHITECT (EA)"},{"location":"SuggestiesHandleiding/#meest-gebruikte-windows","text":"Project browser Properties Notes Zoom/pan Resources Features Tagged values Relationships Imvertor Note : Waar kun je deze windows vinden? Note : Cre\u00eber workspaces","title":"Meest gebruikte windows"},{"location":"SuggestiesHandleiding/#creeer-workspaces","text":"Hoe maak je een workspace?","title":"Cre\u00eber workspace(s)"},{"location":"SuggestiesHandleiding/#handige-tips","text":"Find -in project browser of -in all diagrams View as feature matrix View as relation matrix View as specification view... Relationship matrix","title":"Handige tips"},{"location":"SuggestiesHandleiding/#verwijderen-relaties","text":"Gebruik (rel. matr./relationships) Verwijderen uit diagram is niet model","title":"Verwijderen relaties"},{"location":"SuggestiesHandleiding/#package-as-namespace","text":"Set package as namespace root: https://sparxsystems.com/enterprise_architect_user_guide/15.2/model_domains/namespaces.html Is dit nodig? En waarom? Voor je XML/GML-schema generatie o.i.d.?","title":"Package as Namespace"},{"location":"SuggestiesHandleiding/#installatie-mim-toolbox","text":"Voor project vs. user Hoe kun je toolbox project / user verwijderen?","title":"Installatie MIM-toolbox"},{"location":"SuggestiesHandleiding/#tagged-values-invullen-packagesmim","text":"Beschrijving toevoegen","title":"Tagged values invullen packages/MIM"},{"location":"SuggestiesHandleiding/#ea-bestand-voor-oplevering","text":"Uit VC (SVN) halen SVN Checkout folder niet leegmaken Dat doe je bijvoorbeeld wel als je een package opnieuw of definitief uit Version Control wilt halen. Dus aan je checkout folder verander je niks Je maakt alleen een EA-bestand dat VC-vrij is.","title":"EA-bestand voor oplevering"},{"location":"SuggestiesHandleiding/#subversion-svn-version-control-vc","text":"Verwijderen packages Suggestie structuur Werkwijze put/get latest Inchecken forceren: voor- en nadelen Gebruik repo browser (kijken, geen bewerkingen) URL repo browser Credentials Delete --> commit (als je lokaal wijzigingen aanbrengt) Verander niet zomaar iets in of aan checkout folder","title":"SUBVERSION (SVN) - VERSION CONTROL (VC)"},{"location":"SuggestiesHandleiding/#herstel-package-control","text":"Check out Package VC Untick 'Control package' Verwijder .xml van het package dat je uit VC hebt gehaald uit checkout repo. Rechtermuis op repo Kies 'SVN Commit...' Selecter de .xml -bestanden van de verwijderde package(s) Klik op 'ok'. Nu kun je opnieuw het package onder VC brengen","title":"Herstel package control"},{"location":"SuggestiesHandleiding/#versiestructuur","text":"Handleiding voor SVN versioning maken De mogelijkheid om hoofd- subpackages apart in- en uit te kunnen checken Eerst de domeinen erin hijsen Dan pas hogere packages, Met andere woorden: van onder naar boven of van laag naar hoog Versienr tags in het versieveld Mappenstructuur (plaatje pano overnemen of linken/samenvoegen) Propertiesfile weer terugzetten in cm vanuit imsor notitiemap XML's prefix van package stereotype meegeven dus view_ of domein_ Version packages is van tags Maar moet overeenkomen met versiemapnaam\\ Dus versie in EA moet overeenkomen met versiemapnaam SVN Waarschijnlijk leidt dit ertoe dat je voor elke versie op nieuw alle domeinen in en uit SVN moet halen ...","title":"Versiestructuur"},{"location":"SuggestiesHandleiding/#imvertor","text":"Handleiding Armatiek Zoekfunctie Armatiek Propertiesfile (standaard settings?) GitHub publicatie Batch Tagged Values? XML-/GML-schema's Diagrammen vinkje in settings + -overzicht in diagramnaam EA, properties? Note : op properties staan 2x beschreven. De lijst met CLI-properties is compleet/uitgebreider","title":"IMVERTOR"},{"location":"WordConversies/","text":"MsWord conversies Er zijn tools om MsWord documenten om te zetten naar Mardown: - Word2Werkversie .","title":"WordConversies"},{"location":"WordConversies/#msword-conversies","text":"Er zijn tools om MsWord documenten om te zetten naar Mardown: - Word2Werkversie .","title":"MsWord conversies"},{"location":"geonovum-werkwijze-modelleren/","text":"Overzicht beschikbare documenten De onderstaande tabbelen geven een overzicht van reeds beschikbare handleidingen en andere documenten die voor een modelleur bij Geonovum relevant zijn. Note Nog verwerken Handboek beheer standaarden Handleiding toepassing standaarddatatypes Document JvG, beheerinformatie GitHub, ReSpec, etc. Handleiding Logius Respec (door Linda) Handleiding GitHub ReSpec Markdwon v1.1 (org: Handleiding GitHub ReSpec Markdown v1.1.docx ) Handleiding introductie GitHub (org: Handleiding introductie GitHub.docx ) Note Wilko heeft twee bestaande documenten samengevoegd , maar daarin zit ook overlap met het document van Linda over Logius ReSpec. Bovendien bevat het document secties waarvan het fijn is om er apart naar te kunnen verwijzen. M.a.w.: tabellen kunnen aangevuld worden, maar goed kijken welke documenten (zie ook: rij 16 en 22 in de tabel met het overzicht van beschikbare documentatie m.b.t. werkomgeving . ). Intranet luistert iets nauwer: daar misschien specifiekere verwijzingen maken. Suggestie voor de langetermijn Note Voorbeeld samenhang processen, data, inten/extern van aquo-standaarden De volgende lijst bevat een aantal suggesties om documentatie (van o.a. werkwijze en -omgeving) beter en efficienter op orde te krijgen. Voor documentatie zouden we eens kunnen kijken naar DITA, een standaard uit de uitgeverswereld. Op Wikipedia wordt het als volgt uitgelegd: \" Uitgangspunt van de architectuur is het verdelen van tekst in bouwstenen of 'topics' ten behoeve van hergebruik en specialisatie en het bundelen van bouwstenen via zogenaamde DITA Maps. \" Dit zou heel aantrekkelijk kunnen zijn voor onze documentatie, zoals handleidingen en instructies, maar ook modellen. Imvertor maakt nu van UML een catalogus. Maar zou het niet mooier zijn om van datamodel naar database met objecten, definities en diagrammen te gaan En van daaruit kun je dat (bijvoorbeeld) een catalogus genereren? Informatie die op meerdere plekken terugkeert kan zo \u00e9\u00e9nmalig opgeslagen en beheerd worden Op dit moment is verwijzen tussen standaarden onderling lastig, een dergelijke structuur zou een oplossing kunnen zijn., NEN3610 is topmodel voor veel modellen, daar wil je naar kunnen verwijzen; m.a.w. echt mee kunnen verbinden Wat is ervoor nodig? Welke stappen kunnen we nu al nemen zonder onszelf in de toekomst klem te zetten? Informatie in database zou applicatie-onafhankelijk moeten zijn (m.a.w. niet afhankelijk van EA of Imvertor) De huidige werkwijze van het publiceren van modellen en standaarden is te veel verzuild; ieder model is een zuil. Gerard W. heeft affiniteit met de uitgeverswereld en weet hierover meer. Een ander deel van de workflow zou kunnen zijn om documenten via MS Word aan te leveren voor de database. Maar misschien wil je aan de aanleverkant meerdere formaten kunnen toestaan. Arjan Loeffen heeft hier vanuit andere invalshoek ook idee\u00ebn over: datamodel van heel NL Dan moet je ook kunnen verbinden en standaardistaie ook verder doorvoeren (bijv. lay-out) Links naar informatie over DITA Uitleg op Wikipedia Artikel op XML.com Inventarisatie inhoud documenten Deze paragraaf geeft per document een korte analyse van de inhoud. Op basis hiervan wordt een koppeling gemaakt met de lijst met personen die op dit moment verantwoordelijk zijn voor bepaalde onderdelen binnen Geonovum. Dit wordt voorlopig alleen toegepast op wat relevant is voor de Geonovumwerkomgeving (m.u.v. HIM ). Op die manier wordt duidelijk welke onderdelen afgedekt zijn en welke niet, maar ook wie er mogelijk verantwoordelijk voor is. HIM Past misschien beter bij Geonovumwerkwijze (i.p.v. ~ omgeving ) Handreiking voor informatiemodellering Voor informatieproduten uitwisselen in context DSO Objectgeori\u00ebnteerd Heeft update nodig Hoofdstuk 2-5 zijn met name relevant Zouden we naast 'bijlage offerte' (Arnoud) moeten leggen. Waarom blijven liggen? Nuttig document toch!? Veel DSO-taal, hoewel idee toch voor alle informatiemodellen geldt? Geonovum Technisch register (2019) Bevat Drie Documenten Niet allemaal even compleet Heel inhoudelijk van aard, weinig extra uitleg Missschien ook prima Deels in Nederlands, deels in Engels Publiceren van het IMGeluid EAP-bestand Heel nuttig! Verwijst naar wijzigingsprotocol IMGeluid (ook breed nuttig) Herinnert mij aan doc. Pano: versionering Noemt 'beheerhandboek' (BOMOS?), is ook relevant voor modelleur. Grensgeval scope? Bevat ook SVN, bestaat ook GitHub handleiding van Handmatig XSD bewerken: o.a. imvertor ns verwijderen, hoorde ik ook bij BRO. Terugkoppelen naar Arjan? Worden ook tools genoemd: XML editor voor validatie W3C Markup Validation Service Installatie SVN Actueel Volledig Importeren van een bestaand SVN-project in EA Actueel Volledig Note Overzicht verder aanvullen Note Relevante passages uit Model Driven Design documentatie VNG-realisatie. In het algemeen heel mooi dat alles netjes bij elkaar staat: begrippen, werkomgeving en werkwijze: Sectie 1: EA Toolpack installeren Sectie 5: Gebruik van datatypes Sectie 5: Technieken en handigheidjes Sectie 5: Naamgevingsconventies (het hebben hiervan!) Sectie 8: Veel voorkomende fouten (het hebben hiervan!)","title":"Geonovum Werkwijze Modelleren"},{"location":"geonovum-werkwijze-modelleren/#overzicht-beschikbare-documenten","text":"De onderstaande tabbelen geven een overzicht van reeds beschikbare handleidingen en andere documenten die voor een modelleur bij Geonovum relevant zijn. Note Nog verwerken Handboek beheer standaarden Handleiding toepassing standaarddatatypes Document JvG, beheerinformatie GitHub, ReSpec, etc. Handleiding Logius Respec (door Linda) Handleiding GitHub ReSpec Markdwon v1.1 (org: Handleiding GitHub ReSpec Markdown v1.1.docx ) Handleiding introductie GitHub (org: Handleiding introductie GitHub.docx ) Note Wilko heeft twee bestaande documenten samengevoegd , maar daarin zit ook overlap met het document van Linda over Logius ReSpec. Bovendien bevat het document secties waarvan het fijn is om er apart naar te kunnen verwijzen. M.a.w.: tabellen kunnen aangevuld worden, maar goed kijken welke documenten (zie ook: rij 16 en 22 in de tabel met het overzicht van beschikbare documentatie m.b.t. werkomgeving . ). Intranet luistert iets nauwer: daar misschien specifiekere verwijzingen maken.","title":"Overzicht beschikbare documenten"},{"location":"geonovum-werkwijze-modelleren/#suggestie-voor-de-langetermijn","text":"Note Voorbeeld samenhang processen, data, inten/extern van aquo-standaarden De volgende lijst bevat een aantal suggesties om documentatie (van o.a. werkwijze en -omgeving) beter en efficienter op orde te krijgen. Voor documentatie zouden we eens kunnen kijken naar DITA, een standaard uit de uitgeverswereld. Op Wikipedia wordt het als volgt uitgelegd: \" Uitgangspunt van de architectuur is het verdelen van tekst in bouwstenen of 'topics' ten behoeve van hergebruik en specialisatie en het bundelen van bouwstenen via zogenaamde DITA Maps. \" Dit zou heel aantrekkelijk kunnen zijn voor onze documentatie, zoals handleidingen en instructies, maar ook modellen. Imvertor maakt nu van UML een catalogus. Maar zou het niet mooier zijn om van datamodel naar database met objecten, definities en diagrammen te gaan En van daaruit kun je dat (bijvoorbeeld) een catalogus genereren? Informatie die op meerdere plekken terugkeert kan zo \u00e9\u00e9nmalig opgeslagen en beheerd worden Op dit moment is verwijzen tussen standaarden onderling lastig, een dergelijke structuur zou een oplossing kunnen zijn., NEN3610 is topmodel voor veel modellen, daar wil je naar kunnen verwijzen; m.a.w. echt mee kunnen verbinden Wat is ervoor nodig? Welke stappen kunnen we nu al nemen zonder onszelf in de toekomst klem te zetten? Informatie in database zou applicatie-onafhankelijk moeten zijn (m.a.w. niet afhankelijk van EA of Imvertor) De huidige werkwijze van het publiceren van modellen en standaarden is te veel verzuild; ieder model is een zuil. Gerard W. heeft affiniteit met de uitgeverswereld en weet hierover meer. Een ander deel van de workflow zou kunnen zijn om documenten via MS Word aan te leveren voor de database. Maar misschien wil je aan de aanleverkant meerdere formaten kunnen toestaan. Arjan Loeffen heeft hier vanuit andere invalshoek ook idee\u00ebn over: datamodel van heel NL Dan moet je ook kunnen verbinden en standaardistaie ook verder doorvoeren (bijv. lay-out)","title":"Suggestie voor de langetermijn"},{"location":"geonovum-werkwijze-modelleren/#links-naar-informatie-over-dita","text":"Uitleg op Wikipedia Artikel op XML.com","title":"Links naar informatie over DITA"},{"location":"geonovum-werkwijze-modelleren/#inventarisatie-inhoud-documenten","text":"Deze paragraaf geeft per document een korte analyse van de inhoud. Op basis hiervan wordt een koppeling gemaakt met de lijst met personen die op dit moment verantwoordelijk zijn voor bepaalde onderdelen binnen Geonovum. Dit wordt voorlopig alleen toegepast op wat relevant is voor de Geonovumwerkomgeving (m.u.v. HIM ). Op die manier wordt duidelijk welke onderdelen afgedekt zijn en welke niet, maar ook wie er mogelijk verantwoordelijk voor is.","title":"Inventarisatie inhoud documenten"},{"location":"geonovum-werkwijze-modelleren/#him","text":"Past misschien beter bij Geonovumwerkwijze (i.p.v. ~ omgeving ) Handreiking voor informatiemodellering Voor informatieproduten uitwisselen in context DSO Objectgeori\u00ebnteerd Heeft update nodig Hoofdstuk 2-5 zijn met name relevant Zouden we naast 'bijlage offerte' (Arnoud) moeten leggen. Waarom blijven liggen? Nuttig document toch!? Veel DSO-taal, hoewel idee toch voor alle informatiemodellen geldt?","title":"HIM"},{"location":"geonovum-werkwijze-modelleren/#geonovum-technisch-register-2019","text":"Bevat Drie Documenten Niet allemaal even compleet Heel inhoudelijk van aard, weinig extra uitleg Missschien ook prima Deels in Nederlands, deels in Engels","title":"Geonovum Technisch register (2019)"},{"location":"geonovum-werkwijze-modelleren/#publiceren-van-het-imgeluid-eap-bestand","text":"Heel nuttig! Verwijst naar wijzigingsprotocol IMGeluid (ook breed nuttig) Herinnert mij aan doc. Pano: versionering Noemt 'beheerhandboek' (BOMOS?), is ook relevant voor modelleur. Grensgeval scope? Bevat ook SVN, bestaat ook GitHub handleiding van Handmatig XSD bewerken: o.a. imvertor ns verwijderen, hoorde ik ook bij BRO. Terugkoppelen naar Arjan? Worden ook tools genoemd: XML editor voor validatie W3C Markup Validation Service","title":"Publiceren van het IMGeluid EAP-bestand"},{"location":"geonovum-werkwijze-modelleren/#installatie-svn","text":"Actueel Volledig","title":"Installatie SVN"},{"location":"geonovum-werkwijze-modelleren/#importeren-van-een-bestaand-svn-project-in-ea","text":"Actueel Volledig Note Overzicht verder aanvullen Note Relevante passages uit Model Driven Design documentatie VNG-realisatie. In het algemeen heel mooi dat alles netjes bij elkaar staat: begrippen, werkomgeving en werkwijze: Sectie 1: EA Toolpack installeren Sectie 5: Gebruik van datatypes Sectie 5: Technieken en handigheidjes Sectie 5: Naamgevingsconventies (het hebben hiervan!) Sectie 8: Veel voorkomende fouten (het hebben hiervan!)","title":"Importeren van een bestaand SVN-project in EA"},{"location":"werkomgeving-modelleren/","text":"Werkomgeving Informatiemodelleren Overzicht van onderwerpen en repositories die mogelijk betrekking hebben op de tooling die bij Geonovum gebruikt wordt. Note Een link naar dit document opnemen op intranet voor degenen die liever documentatie aan de hand van een tabel opzoeken. Note docs.geostandaarden.nl en register.geostandaarden.nl nog opnemen? Applicatie Naam document Korte omschrijving Laatst bijgewerkt Locatie Gebruik 1 EA Handleiding gebruik MIM-toolbox Deze handleiding beschrijft hoe je de MIM toolbox kunt importeren en toepassen 2023 GitHub Openbaar 2 EA Handleiding genereren MIM-profiel Deze handleiding beschrijft het proces voor het genereren van een customized toolbox voor modelleren met Enterprise Architect. 2023 GitHub Openbaar 3 EA Handleiding genereren Extensie MIM-toolbox Deze handleiding beschrijft hoe je in Enterprise Architect een extensie maakt op de MIM-toolbox. 2023 Github Openbaar 4 EA, Imvertor Imvertor installeren Instructies voor de installatie en configuratie van Imvertor voor Enterprise Architect 2022 GitHub Openbaar 5 EA, SVN Strategie Semantic Versioning DiSGeo Beschrijft de implementatie van Semantic Versioning voor DiSGeo 2022 GitHub Openbaar 6 Metadata kwaliteitsmonitor (MKM) Tool voor Validatie metadatakwaliteit De metadata kwaliteits monitor (MKM) maakt automatisch rapportages over de kwaliteit van metadata uit een Catalogue Servcie for the Web (CSW). 2019 GitHub Openbaar 7 Imvertor, EA, SVN Handleiding tooling van VNG Deze Wiki is een inventarisatie van informatie over de Model Driven Design aanpak van VNG Realisatie. ---- GitHub Openbaar 8 EA, SVN Installatie SVN Deze handleiding beschrijft hoe je SVN installeert en je een EA-project onder versiebeheer brengt 2023 GitHub Intern 9 EA, SVN Importeren van een bestaand SVN-project in EA Deze handleiding beschrijft hoe je vanuit een nieuw project in Enterprise Architect, de packages van een bestaand project in Subversion, kunt importeren. 2022 GitHub Intern 10 EA, Imvertor, Respec Het publiceren van het IMGeluid EAP bestand Een werkinstructie voor IMGeluid maar zeker toepasbaar voor alle standaarden 2023 Confluence Intern 11 Imvertor Documentatie over Imvertor Lijstje links naar handige Imvertor dingetjes 2021 Confluence Intern 12 EA Enterprise Architect, profielen en toolboxen Instructie voor het gebruik van profielen en toolboxen. Gekregen van de BRO (kan waarschijnlijk weg) 2021 Confluence Intern 13 SVN Gebruik van subversion in EA Handleiding van hoe EA en subversion samenwerken 2022 Github Intern 14 GitHub, Markdown, ReSpec Beheer GitHub/ Markdown/ ReSpec Handleiding van genoemde tooling 2022 Onedrive Intern 15 VocBench Handleiding VocBench Een simpele snelstartgids voor het voor het ontwikkelen van begrippenmodellen in VocBench als Linked data. 2022 Onedrive Intern 16 GitHub GitHub introductie Waarom github handig is en hoe je aan de slag kunt 2023 Onedrive Intern 17 Overzicht Overzicht tooling team Standaardisatie handig overzicht 2023 Onedrive Intern 18 Technisch register Geonovum technisch register 2019 Instructies hoe je een Respec document automatisch publiceert op docs.geostandaarden.nl 2020 GitHub Intern 19 Technisch register Handleiding voor beheerders informatiemodellen In dit document worden de stappen beschreven voor het publiceren van de technische bestanden van een informatiemodel in het Technisch register van Geonovum. 2019 GitHub Intern 20 Technisch register Handleiding voor beheerders technisch register In dit document worden de stappen beschreven voor het opzetten van een systeem voor het volgen van versies van een nieuw informatiemodel in het Technisch register van Geonovum. 2022 GitHub Intern 21 EA, Imvertor, SVN Suggesties voor aanvullende handleidingen Dit document is op zichzelf geen handleiding , maar geeft een overzicht van mogelijke relevante onderwerpen om nog een handleiding voor te schrijven 2022 GitHub Intern 22 ReSpec ReSpec Utilities ReSpec Utilities voor Geonovum 2019 GitHub Intern 23 Word, Git, ReSpec word2werkversie/~markdown/~publicatie Beschrijving van ingerichte workflow waarmee je Word-bestanden om kunt zetten naar een ReSpec-werkversies. 2023 Github Intern","title":"Werkomgeving Modelleren"},{"location":"werkomgeving-modelleren/#werkomgeving-informatiemodelleren","text":"Overzicht van onderwerpen en repositories die mogelijk betrekking hebben op de tooling die bij Geonovum gebruikt wordt. Note Een link naar dit document opnemen op intranet voor degenen die liever documentatie aan de hand van een tabel opzoeken. Note docs.geostandaarden.nl en register.geostandaarden.nl nog opnemen? Applicatie Naam document Korte omschrijving Laatst bijgewerkt Locatie Gebruik 1 EA Handleiding gebruik MIM-toolbox Deze handleiding beschrijft hoe je de MIM toolbox kunt importeren en toepassen 2023 GitHub Openbaar 2 EA Handleiding genereren MIM-profiel Deze handleiding beschrijft het proces voor het genereren van een customized toolbox voor modelleren met Enterprise Architect. 2023 GitHub Openbaar 3 EA Handleiding genereren Extensie MIM-toolbox Deze handleiding beschrijft hoe je in Enterprise Architect een extensie maakt op de MIM-toolbox. 2023 Github Openbaar 4 EA, Imvertor Imvertor installeren Instructies voor de installatie en configuratie van Imvertor voor Enterprise Architect 2022 GitHub Openbaar 5 EA, SVN Strategie Semantic Versioning DiSGeo Beschrijft de implementatie van Semantic Versioning voor DiSGeo 2022 GitHub Openbaar 6 Metadata kwaliteitsmonitor (MKM) Tool voor Validatie metadatakwaliteit De metadata kwaliteits monitor (MKM) maakt automatisch rapportages over de kwaliteit van metadata uit een Catalogue Servcie for the Web (CSW). 2019 GitHub Openbaar 7 Imvertor, EA, SVN Handleiding tooling van VNG Deze Wiki is een inventarisatie van informatie over de Model Driven Design aanpak van VNG Realisatie. ---- GitHub Openbaar 8 EA, SVN Installatie SVN Deze handleiding beschrijft hoe je SVN installeert en je een EA-project onder versiebeheer brengt 2023 GitHub Intern 9 EA, SVN Importeren van een bestaand SVN-project in EA Deze handleiding beschrijft hoe je vanuit een nieuw project in Enterprise Architect, de packages van een bestaand project in Subversion, kunt importeren. 2022 GitHub Intern 10 EA, Imvertor, Respec Het publiceren van het IMGeluid EAP bestand Een werkinstructie voor IMGeluid maar zeker toepasbaar voor alle standaarden 2023 Confluence Intern 11 Imvertor Documentatie over Imvertor Lijstje links naar handige Imvertor dingetjes 2021 Confluence Intern 12 EA Enterprise Architect, profielen en toolboxen Instructie voor het gebruik van profielen en toolboxen. Gekregen van de BRO (kan waarschijnlijk weg) 2021 Confluence Intern 13 SVN Gebruik van subversion in EA Handleiding van hoe EA en subversion samenwerken 2022 Github Intern 14 GitHub, Markdown, ReSpec Beheer GitHub/ Markdown/ ReSpec Handleiding van genoemde tooling 2022 Onedrive Intern 15 VocBench Handleiding VocBench Een simpele snelstartgids voor het voor het ontwikkelen van begrippenmodellen in VocBench als Linked data. 2022 Onedrive Intern 16 GitHub GitHub introductie Waarom github handig is en hoe je aan de slag kunt 2023 Onedrive Intern 17 Overzicht Overzicht tooling team Standaardisatie handig overzicht 2023 Onedrive Intern 18 Technisch register Geonovum technisch register 2019 Instructies hoe je een Respec document automatisch publiceert op docs.geostandaarden.nl 2020 GitHub Intern 19 Technisch register Handleiding voor beheerders informatiemodellen In dit document worden de stappen beschreven voor het publiceren van de technische bestanden van een informatiemodel in het Technisch register van Geonovum. 2019 GitHub Intern 20 Technisch register Handleiding voor beheerders technisch register In dit document worden de stappen beschreven voor het opzetten van een systeem voor het volgen van versies van een nieuw informatiemodel in het Technisch register van Geonovum. 2022 GitHub Intern 21 EA, Imvertor, SVN Suggesties voor aanvullende handleidingen Dit document is op zichzelf geen handleiding , maar geeft een overzicht van mogelijke relevante onderwerpen om nog een handleiding voor te schrijven 2022 GitHub Intern 22 ReSpec ReSpec Utilities ReSpec Utilities voor Geonovum 2019 GitHub Intern 23 Word, Git, ReSpec word2werkversie/~markdown/~publicatie Beschrijving van ingerichte workflow waarmee je Word-bestanden om kunt zetten naar een ReSpec-werkversies. 2023 Github Intern","title":"Werkomgeving Informatiemodelleren"},{"location":"werkwijze-modelleren/","text":"Werkwijze Informatiemodelleren Note Een link naar dit document opnemen op intranet voor degenen die liever documentatie aan de hand van een tabel opzoeken. Note Todo geonovumwerkwijze voor informatiemodelleurs Afstemmen met document dat Arnoud schrijft als bijlage voor offertes Overzicht onderwerpen/repo's mogelijk betrekking hebben op de geonovumwerkwijze Onderscheid tussen werkwijze en werkomgeving goed controleren bij toevoeging aan tabellen Handleiding voor het maken begrippenkader en ontologie en de toepassing/noodzaak ervan. Relatie met BOMOS Je zou naast Geometrie in Model en GML ook Geometrie in Model en JSON moeten hebben Note Optioneel Nog kolom beheer toevoegen: [\"Geonovum\", \"Armatiek\", \"W3C\", \"Logius\"] . Nog Kolom ReSpec toevoegen: [\"Ja\", \"Nee\"] . Is het document in ReSpec-formaat beschikbaar? Toelichting bij kolomnamen maken: een document kan bijvoorbeeld in werkversie op GitHub staan en als geconsulteerde (definitieve) versie op docs.geostandaarden. In deze tabel hanteren we locatie van het brondocument; het document op docs.geostandaarden.nl is een snapshot. Op GitHub vind je de actueelste informatie. Bovendien kun vanuit dat document altijd naar de laatst gepubliceerde versie komen. Een andere mogelijk is om een extra kolom toe te voegen met gepubliceerde versie , of formele status . Onderwerp Naam document Korte omschrijving Laatst bijgewerkt Locatie Gebruik 1 Opstellen van model HIM - Handreiking Informatie Modelleren Handleiding voor het opstellen van een informatiemodel of dataproductspecificatie. Beschrijft rol, proces en basismethodiek 2019 Github Openbaar 2 Geometrie in model GIMEG Beschrijving van de toepassing van geometrie in informatiemodellering en de implementatie daarvan in GML. 2021 GitHub Openbaar 3 Geometrie in uitwisselingsformaten Geometrie in uitwisselingsformaten Handreiking over het uitwisselen van geometrie, met o.a. een overzicht van de verschillende bestandsformaten, handvatten voor het kiezen van het juiste formaat en gedetaileerde informatie over het uitwisselen van geometrie in HTML, GML, JSON, GeoPackage en RDF. 2022 GitHub Openbaar 4 CRS in uitwisselingsformaten Handreiking gebruik co\u00f6rdinaatreferentiesystemen bij uitwisseling en visualisatie van geo-informatie Bundeling van bestaande adviezen van het NSGI over geodetisch correcte gebruik van de in Nederland gebruikte CRS-en. 2022 GitHub Openbaar 5 Lange lijnenadvies Eenduidige transformatie van grenzen tussen ETRS89 en RD Advies voor het waarborgen van de nauwkeurigheid van lange lijnstukken van grenzen. 2018 Geoforum Openbaar 6 Keuzehulp standaarden Raamwerk Geostandaarden 4.0 Het Raamwerk van geo-standaarden helpt bij de opzet en ontwikkeling van een geo-informatie infrastructuur om de juiste set standaarden te kiezen. 2023 GitHub Openbaar 7 Beschrijving MIM MIM - Metamodel Informatie Modellering Beschrijving van een metamodel waar informatiemodellen mee gemaakt worden. Het informeert over de metaklassen, metastructuur en metagegevens als grondslag voor een informatiemodel. 2022 GitHub Openbaar 8 Toepassing NEN3610 Basismodel geo-informatie - toelichting Handreiking voor het toepassen van het Basismodel geo-informatie (NEN 3610:2022), bedoeld als service-informatie om te ondersteunen bij het toepassen van het model in sectorale informatiemodellen. 2023 GitHub Openbaar 9 Toepassing NEN3610 in LD NEN 3610 - Linked Data Combinatie van een technisch rapport , een handboek en een standaard voor NEN3610 in Linked Data. 2021 GitHub Openbaar 10 Doel en Toepassing Model Basisgeometrie Basisgeometrie Specificatie van het model basisgeometrie voor geo-informatiemodellen die een externe geometriereferentie nodig hebben. 2020 GitHub Openbaar 11 Toepassing ReSpec ReSpec Wiki Engelstalige wiki voor de configuratie en het gebruik van ReSpec 2021 GitHub Openbaar 12 Wijzigingen in model Wijzigingsprotocol geo-standaarden Sturende principes achter het generieke wijzigingsproces van de basisset geo-standaarden. 2021 GitHub Openbaar 13 Beheer standaarden Beheer basis geo-standaarden Beschrijving van verschillende beheeraspecten, zoals o.a. implementatieondersteuning , wijzigingsproces , governance , etc. 2021 GitHub Openbaar 14 Object-identificatie UOI Ontwerp Ontwerp voor een Unieke Objectidentificator (UOI) om gegevens op verantwoorde en betrouwbare wijze domein-overstijgend te kunnen registreren, uitwisselen (delen) en koppelen aan andere gegevens. 2022 GitHub Openbaar 15 Wijzigingen in model Wijzigingsprotocol Informatiemodel Geluid Dit document beschrijft de sturende principes achter het wijzigingsproces voor IMG. 2023 GitHub Intern 16 Geostandaarden ISO ISO 19xxx Bestandsmap met bij Geonovum aanwezige documentatie van standaarden. Dit zijn niet altijd de meest actuele of formele versies. 2022 Teams Intern 17 Bestaande modellen n.v.t. Verschillende bestandsmappen (en archief?) met (documentatie van) verschillende door Geonovum ontwikkelde (sectorale) standaarden n.v.t. Teams Intern","title":"Werkwijze Modelleren"},{"location":"werkwijze-modelleren/#werkwijze-informatiemodelleren","text":"Note Een link naar dit document opnemen op intranet voor degenen die liever documentatie aan de hand van een tabel opzoeken. Note Todo geonovumwerkwijze voor informatiemodelleurs Afstemmen met document dat Arnoud schrijft als bijlage voor offertes Overzicht onderwerpen/repo's mogelijk betrekking hebben op de geonovumwerkwijze Onderscheid tussen werkwijze en werkomgeving goed controleren bij toevoeging aan tabellen Handleiding voor het maken begrippenkader en ontologie en de toepassing/noodzaak ervan. Relatie met BOMOS Je zou naast Geometrie in Model en GML ook Geometrie in Model en JSON moeten hebben Note Optioneel Nog kolom beheer toevoegen: [\"Geonovum\", \"Armatiek\", \"W3C\", \"Logius\"] . Nog Kolom ReSpec toevoegen: [\"Ja\", \"Nee\"] . Is het document in ReSpec-formaat beschikbaar? Toelichting bij kolomnamen maken: een document kan bijvoorbeeld in werkversie op GitHub staan en als geconsulteerde (definitieve) versie op docs.geostandaarden. In deze tabel hanteren we locatie van het brondocument; het document op docs.geostandaarden.nl is een snapshot. Op GitHub vind je de actueelste informatie. Bovendien kun vanuit dat document altijd naar de laatst gepubliceerde versie komen. Een andere mogelijk is om een extra kolom toe te voegen met gepubliceerde versie , of formele status . Onderwerp Naam document Korte omschrijving Laatst bijgewerkt Locatie Gebruik 1 Opstellen van model HIM - Handreiking Informatie Modelleren Handleiding voor het opstellen van een informatiemodel of dataproductspecificatie. Beschrijft rol, proces en basismethodiek 2019 Github Openbaar 2 Geometrie in model GIMEG Beschrijving van de toepassing van geometrie in informatiemodellering en de implementatie daarvan in GML. 2021 GitHub Openbaar 3 Geometrie in uitwisselingsformaten Geometrie in uitwisselingsformaten Handreiking over het uitwisselen van geometrie, met o.a. een overzicht van de verschillende bestandsformaten, handvatten voor het kiezen van het juiste formaat en gedetaileerde informatie over het uitwisselen van geometrie in HTML, GML, JSON, GeoPackage en RDF. 2022 GitHub Openbaar 4 CRS in uitwisselingsformaten Handreiking gebruik co\u00f6rdinaatreferentiesystemen bij uitwisseling en visualisatie van geo-informatie Bundeling van bestaande adviezen van het NSGI over geodetisch correcte gebruik van de in Nederland gebruikte CRS-en. 2022 GitHub Openbaar 5 Lange lijnenadvies Eenduidige transformatie van grenzen tussen ETRS89 en RD Advies voor het waarborgen van de nauwkeurigheid van lange lijnstukken van grenzen. 2018 Geoforum Openbaar 6 Keuzehulp standaarden Raamwerk Geostandaarden 4.0 Het Raamwerk van geo-standaarden helpt bij de opzet en ontwikkeling van een geo-informatie infrastructuur om de juiste set standaarden te kiezen. 2023 GitHub Openbaar 7 Beschrijving MIM MIM - Metamodel Informatie Modellering Beschrijving van een metamodel waar informatiemodellen mee gemaakt worden. Het informeert over de metaklassen, metastructuur en metagegevens als grondslag voor een informatiemodel. 2022 GitHub Openbaar 8 Toepassing NEN3610 Basismodel geo-informatie - toelichting Handreiking voor het toepassen van het Basismodel geo-informatie (NEN 3610:2022), bedoeld als service-informatie om te ondersteunen bij het toepassen van het model in sectorale informatiemodellen. 2023 GitHub Openbaar 9 Toepassing NEN3610 in LD NEN 3610 - Linked Data Combinatie van een technisch rapport , een handboek en een standaard voor NEN3610 in Linked Data. 2021 GitHub Openbaar 10 Doel en Toepassing Model Basisgeometrie Basisgeometrie Specificatie van het model basisgeometrie voor geo-informatiemodellen die een externe geometriereferentie nodig hebben. 2020 GitHub Openbaar 11 Toepassing ReSpec ReSpec Wiki Engelstalige wiki voor de configuratie en het gebruik van ReSpec 2021 GitHub Openbaar 12 Wijzigingen in model Wijzigingsprotocol geo-standaarden Sturende principes achter het generieke wijzigingsproces van de basisset geo-standaarden. 2021 GitHub Openbaar 13 Beheer standaarden Beheer basis geo-standaarden Beschrijving van verschillende beheeraspecten, zoals o.a. implementatieondersteuning , wijzigingsproces , governance , etc. 2021 GitHub Openbaar 14 Object-identificatie UOI Ontwerp Ontwerp voor een Unieke Objectidentificator (UOI) om gegevens op verantwoorde en betrouwbare wijze domein-overstijgend te kunnen registreren, uitwisselen (delen) en koppelen aan andere gegevens. 2022 GitHub Openbaar 15 Wijzigingen in model Wijzigingsprotocol Informatiemodel Geluid Dit document beschrijft de sturende principes achter het wijzigingsproces voor IMG. 2023 GitHub Intern 16 Geostandaarden ISO ISO 19xxx Bestandsmap met bij Geonovum aanwezige documentatie van standaarden. Dit zijn niet altijd de meest actuele of formele versies. 2022 Teams Intern 17 Bestaande modellen n.v.t. Verschillende bestandsmappen (en archief?) met (documentatie van) verschillende door Geonovum ontwikkelde (sectorale) standaarden n.v.t. Teams Intern","title":"Werkwijze Informatiemodelleren"}]} \ No newline at end of file diff --git a/search/worker.js b/search/worker.js new file mode 100644 index 0000000..8628dbc --- /dev/null +++ b/search/worker.js @@ -0,0 +1,133 @@ +var base_path = 'function' === typeof importScripts ? '.' : '/search/'; +var allowSearch = false; +var index; +var documents = {}; +var lang = ['en']; +var data; + +function getScript(script, callback) { + console.log('Loading script: ' + script); + $.getScript(base_path + script).done(function () { + callback(); + }).fail(function (jqxhr, settings, exception) { + console.log('Error: ' + exception); + }); +} + +function getScriptsInOrder(scripts, callback) { + if (scripts.length === 0) { + callback(); + return; + } + getScript(scripts[0], function() { + getScriptsInOrder(scripts.slice(1), callback); + }); +} + +function loadScripts(urls, callback) { + if( 'function' === typeof importScripts ) { + importScripts.apply(null, urls); + callback(); + } else { + getScriptsInOrder(urls, callback); + } +} + +function onJSONLoaded () { + data = JSON.parse(this.responseText); + var scriptsToLoad = ['lunr.js']; + if (data.config && data.config.lang && data.config.lang.length) { + lang = data.config.lang; + } + if (lang.length > 1 || lang[0] !== "en") { + scriptsToLoad.push('lunr.stemmer.support.js'); + if (lang.length > 1) { + scriptsToLoad.push('lunr.multi.js'); + } + if (lang.includes("ja") || lang.includes("jp")) { + scriptsToLoad.push('tinyseg.js'); + } + for (var i=0; i < lang.length; i++) { + if (lang[i] != 'en') { + scriptsToLoad.push(['lunr', lang[i], 'js'].join('.')); + } + } + } + loadScripts(scriptsToLoad, onScriptsLoaded); +} + +function onScriptsLoaded () { + console.log('All search scripts loaded, building Lunr index...'); + if (data.config && data.config.separator && data.config.separator.length) { + lunr.tokenizer.separator = new RegExp(data.config.separator); + } + + if (data.index) { + index = lunr.Index.load(data.index); + data.docs.forEach(function (doc) { + documents[doc.location] = doc; + }); + console.log('Lunr pre-built index loaded, search ready'); + } else { + index = lunr(function () { + if (lang.length === 1 && lang[0] !== "en" && lunr[lang[0]]) { + this.use(lunr[lang[0]]); + } else if (lang.length > 1) { + this.use(lunr.multiLanguage.apply(null, lang)); // spread operator not supported in all browsers: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator#Browser_compatibility + } + this.field('title'); + this.field('text'); + this.ref('location'); + + for (var i=0; i < data.docs.length; i++) { + var doc = data.docs[i]; + this.add(doc); + documents[doc.location] = doc; + } + }); + console.log('Lunr index built, search ready'); + } + allowSearch = true; + postMessage({config: data.config}); + postMessage({allowSearch: allowSearch}); +} + +function init () { + var oReq = new XMLHttpRequest(); + oReq.addEventListener("load", onJSONLoaded); + var index_path = base_path + '/search_index.json'; + if( 'function' === typeof importScripts ){ + index_path = 'search_index.json'; + } + oReq.open("GET", index_path); + oReq.send(); +} + +function search (query) { + if (!allowSearch) { + console.error('Assets for search still loading'); + return; + } + + var resultDocuments = []; + var results = index.search(query); + for (var i=0; i < results.length; i++){ + var result = results[i]; + doc = documents[result.ref]; + doc.summary = doc.text.substring(0, 200); + resultDocuments.push(doc); + } + return resultDocuments; +} + +if( 'function' === typeof importScripts ) { + onmessage = function (e) { + if (e.data.init) { + init(); + } else if (e.data.query) { + postMessage({ results: search(e.data.query) }); + } else { + console.error("Worker - Unrecognized message: " + e); + } + }; +} diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..0f8724e --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000..dbc36ef Binary files /dev/null and b/sitemap.xml.gz differ diff --git a/werkomgeving-modelleren/index.html b/werkomgeving-modelleren/index.html new file mode 100644 index 0000000..544cd2a --- /dev/null +++ b/werkomgeving-modelleren/index.html @@ -0,0 +1,502 @@ + + + + + + + + + + + Werkomgeving Modelleren - Geonovum tooling + + + + + + + + + + + +
+
+
+
+ +

Werkomgeving Informatiemodelleren

+

Overzicht van onderwerpen en repositories die mogelijk betrekking hebben op de tooling die bij Geonovum gebruikt wordt.

+
+

Note +Een link naar dit document opnemen op intranet voor degenen die liever documentatie aan de hand van een tabel opzoeken.

+

Note +docs.geostandaarden.nl en register.geostandaarden.nl nog opnemen?

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ApplicatieNaam documentKorte omschrijvingLaatst bijgewerktLocatieGebruik
1EAHandleiding gebruik MIM-toolboxDeze handleiding beschrijft hoe je de MIM toolbox kunt importeren en toepassen2023GitHubOpenbaar
2EAHandleiding genereren MIM-profielDeze handleiding beschrijft het proces voor het genereren van een customized toolbox voor modelleren met Enterprise Architect.2023GitHubOpenbaar
3EAHandleiding genereren Extensie MIM-toolboxDeze handleiding beschrijft hoe je in Enterprise Architect een extensie maakt op de MIM-toolbox.2023GithubOpenbaar
4EA, ImvertorImvertor installerenInstructies voor de installatie en configuratie van Imvertor voor Enterprise Architect2022GitHubOpenbaar
5EA, SVNStrategie Semantic Versioning DiSGeoBeschrijft de implementatie van Semantic Versioning voor DiSGeo2022GitHubOpenbaar
6Metadata kwaliteitsmonitor (MKM)Tool voor Validatie metadatakwaliteitDe metadata kwaliteits monitor (MKM) maakt automatisch rapportages over de kwaliteit van metadata uit een Catalogue Servcie for the Web (CSW).2019GitHubOpenbaar
7Imvertor, EA, SVNHandleiding tooling van VNGDeze Wiki is een inventarisatie van informatie over de Model Driven Design aanpak van VNG Realisatie.----GitHubOpenbaar
8EA, SVNInstallatie SVNDeze handleiding beschrijft hoe je SVN installeert en je een EA-project onder versiebeheer brengt2023GitHubIntern
9EA, SVNImporteren van een bestaand SVN-project in EADeze handleiding beschrijft hoe je vanuit een nieuw project in Enterprise Architect, de packages van een bestaand project in Subversion, kunt importeren.2022GitHubIntern
10EA, Imvertor, RespecHet publiceren van het IMGeluid EAP bestandEen werkinstructie voor IMGeluid maar zeker toepasbaar voor alle standaarden2023ConfluenceIntern
11ImvertorDocumentatie over ImvertorLijstje links naar handige Imvertor dingetjes2021ConfluenceIntern
12EAEnterprise Architect, profielen en toolboxenInstructie voor het gebruik van profielen en toolboxen. Gekregen van de BRO (kan waarschijnlijk weg)2021ConfluenceIntern
13SVNGebruik van subversion in EAHandleiding van hoe EA en subversion samenwerken2022GithubIntern
14GitHub, Markdown, ReSpecBeheer GitHub/ Markdown/ ReSpecHandleiding van genoemde tooling2022OnedriveIntern
15VocBenchHandleiding VocBenchEen simpele snelstartgids voor het voor het ontwikkelen van begrippenmodellen in VocBench als Linked data.2022OnedriveIntern
16GitHubGitHub introductieWaarom github handig is en hoe je aan de slag kunt2023OnedriveIntern
17OverzichtOverzicht tooling team Standaardisatiehandig overzicht2023OnedriveIntern
18Technisch registerGeonovum technisch register 2019Instructies hoe je een Respec document automatisch publiceert op docs.geostandaarden.nl2020GitHubIntern
19Technisch registerHandleiding voor beheerders informatiemodellenIn dit document worden de stappen beschreven voor het publiceren van de technische bestanden van een informatiemodel in het Technisch register van Geonovum.2019GitHubIntern
20Technisch registerHandleiding voor beheerders technisch registerIn dit document worden de stappen beschreven voor het opzetten van een systeem voor het volgen van versies van een nieuw informatiemodel in het Technisch register van Geonovum.2022GitHubIntern
21EA, Imvertor, SVNSuggesties voor aanvullende handleidingenDit document is op zichzelf geen handleiding, maar geeft een overzicht van mogelijke relevante onderwerpen om nog een handleiding voor te schrijven2022GitHubIntern
22ReSpecReSpec UtilitiesReSpec Utilities voor Geonovum2019GitHubIntern
23Word, Git, ReSpecword2werkversie/~markdown/~publicatieBeschrijving van ingerichte workflow waarmee je Word-bestanden om kunt zetten naar een ReSpec-werkversies.2023GithubIntern
+
+
+ +
+
+

Documentation built with MkDocs.

+
+ + + + + + + + + + diff --git a/werkwijze-modelleren/index.html b/werkwijze-modelleren/index.html new file mode 100644 index 0000000..1e43917 --- /dev/null +++ b/werkwijze-modelleren/index.html @@ -0,0 +1,479 @@ + + + + + + + + + + + Werkwijze Modelleren - Geonovum tooling + + + + + + + + + + + +
+
+
+
+ +

Werkwijze Informatiemodelleren

+
+

Note +Een link naar dit document opnemen op intranet voor degenen die liever documentatie aan de hand van een tabel opzoeken.

+

Note +Todo geonovumwerkwijze voor informatiemodelleurs

+
+
    +
  1. Afstemmen met document dat Arnoud schrijft als bijlage voor offertes
  2. +
  3. Overzicht onderwerpen/repo's mogelijk betrekking hebben op de geonovumwerkwijze
  4. +
  5. Onderscheid tussen werkwijze en werkomgeving goed controleren bij toevoeging aan tabellen
  6. +
  7. Handleiding voor het maken begrippenkader en ontologie en de toepassing/noodzaak ervan.
  8. +
  9. Relatie met BOMOS
  10. +
  11. Je zou naast Geometrie in Model en GML ook Geometrie in Model en JSON moeten hebben
  12. +
+
+

Note +Optioneel

+
+
    +
  1. Nog kolom beheer toevoegen: ["Geonovum", "Armatiek", "W3C", "Logius"].
  2. +
  3. Nog Kolom ReSpec toevoegen: ["Ja", "Nee"]. Is het document in ReSpec-formaat beschikbaar?
  4. +
  5. Toelichting bij kolomnamen maken: een document kan bijvoorbeeld in werkversie op GitHub staan en als geconsulteerde (definitieve) versie op docs.geostandaarden. In deze tabel hanteren we locatie van het brondocument; het document op docs.geostandaarden.nl is een snapshot. Op GitHub vind je de actueelste informatie. Bovendien kun vanuit dat document altijd naar de laatst gepubliceerde versie komen.
  6. +
  7. Een andere mogelijk is om een extra kolom toe te voegen met gepubliceerde versie, of formele status.
  8. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OnderwerpNaam documentKorte omschrijvingLaatst bijgewerktLocatieGebruik
1Opstellen van modelHIM - Handreiking Informatie ModellerenHandleiding voor het opstellen van een informatiemodel of dataproductspecificatie. Beschrijft rol, proces en basismethodiek2019GithubOpenbaar
2Geometrie in modelGIMEGBeschrijving van de toepassing van geometrie in informatiemodellering en de implementatie daarvan in GML.2021GitHubOpenbaar
3Geometrie in uitwisselingsformatenGeometrie in uitwisselingsformatenHandreiking over het uitwisselen van geometrie, met o.a. een overzicht van de verschillende bestandsformaten, handvatten voor het kiezen van het juiste formaat en gedetaileerde informatie over het uitwisselen van geometrie in HTML, GML, JSON, GeoPackage en RDF.2022GitHubOpenbaar
4CRS in uitwisselingsformatenHandreiking gebruik coördinaatreferentiesystemen bij uitwisseling en visualisatie van geo-informatieBundeling van bestaande adviezen van het NSGI over geodetisch correcte gebruik van de in Nederland gebruikte CRS-en.2022GitHubOpenbaar
5Lange lijnenadviesEenduidige transformatie van grenzen tussen ETRS89 en RDAdvies voor het waarborgen van de nauwkeurigheid van lange lijnstukken van grenzen.2018GeoforumOpenbaar
6Keuzehulp standaardenRaamwerk Geostandaarden 4.0Het Raamwerk van geo-standaarden helpt bij de opzet en ontwikkeling van een geo-informatie infrastructuur om de juiste set standaarden te kiezen.2023GitHubOpenbaar
7Beschrijving MIMMIM - Metamodel Informatie ModelleringBeschrijving van een metamodel waar informatiemodellen mee gemaakt worden. Het informeert over de metaklassen, metastructuur en metagegevens als grondslag voor een informatiemodel.2022GitHubOpenbaar
8Toepassing NEN3610Basismodel geo-informatie - toelichtingHandreiking voor het toepassen van het Basismodel geo-informatie (NEN 3610:2022), bedoeld als service-informatie om te ondersteunen bij het toepassen van het model in sectorale informatiemodellen.2023GitHubOpenbaar
9Toepassing NEN3610 in LDNEN 3610 - Linked DataCombinatie van een technisch rapport, een handboek en een standaard voor NEN3610 in Linked Data.2021GitHubOpenbaar
10Doel en Toepassing Model BasisgeometrieBasisgeometrieSpecificatie van het model basisgeometrie voor geo-informatiemodellen die een externe geometriereferentie nodig hebben.2020GitHubOpenbaar
11Toepassing ReSpecReSpec WikiEngelstalige wiki voor de configuratie en het gebruik van ReSpec2021GitHubOpenbaar
12Wijzigingen in modelWijzigingsprotocol geo-standaardenSturende principes achter het generieke wijzigingsproces van de basisset geo-standaarden.2021GitHubOpenbaar
13Beheer standaardenBeheer basis geo-standaardenBeschrijving van verschillende beheeraspecten, zoals o.a. implementatieondersteuning, wijzigingsproces, governance, etc.2021GitHubOpenbaar
14Object-identificatieUOI OntwerpOntwerp voor een Unieke Objectidentificator (UOI) om gegevens op verantwoorde en betrouwbare wijze domein-overstijgend te kunnen registreren, uitwisselen (delen) en koppelen aan andere gegevens.2022GitHubOpenbaar
15Wijzigingen in modelWijzigingsprotocol Informatiemodel GeluidDit document beschrijft de sturende principes achter het wijzigingsproces voor IMG.2023GitHubIntern
16Geostandaarden ISOISO 19xxxBestandsmap met bij Geonovum aanwezige documentatie van standaarden. Dit zijn niet altijd de meest actuele of formele versies.2022TeamsIntern
17Bestaande modellenn.v.t.Verschillende bestandsmappen (en archief?) met (documentatie van) verschillende door Geonovum ontwikkelde (sectorale) standaardenn.v.t.TeamsIntern
+
+
+
+ +
+
+

Documentation built with MkDocs.

+
+ + + + + + + + + +